Массивы и метки в C++
| |
Kornival | Дата: Вторник, 30 Августа 2011, 19:32 | Сообщение # 41 |
The Witcher
Сейчас нет на сайте
| мой код увеличивает значение первого элемента в массиве а на единицу. Твой код из последнего поста присваивает указателю b адресс второго элемемта из массива а.
Сообщение отредактировал Kornival - Вторник, 30 Августа 2011, 20:55 |
|
| |
05142 | Дата: Вторник, 30 Августа 2011, 19:36 | Сообщение # 42 |
постоянный участник
Сейчас нет на сайте
| мой код какбы работающая версия a = a +1; извращение правда.
mecinvader
|
|
| |
froex | Дата: Вторник, 30 Августа 2011, 23:54 | Сообщение # 43 |
Руководитель Froexilize team
Сейчас нет на сайте
| Да поймите вы. Если объявлен указатель на некий тип данных, то увеличение этого указателя на единицу изменяет адрес, хранящийся в этом указателе на размер в байтах типа указателя. Пример 1: int *a; // указатель на целое число. a+1 даст нам адрес "a" плюс 4 байта. Пример 2: char *c; // указатель на символ. c+1 даст нам адрес "c" плюс 1 байт.
Могу ещё привести пример. Допустим, что изобретём велосипед и напишем свою функцию копирования строки. Тут и массивы используются, и разыменования, и приращение адресов. Чтобы после приращения адресов нам не терять начало выделенной области памяти, мы сохраняем значение указателя в ещё одной переменной. Code #include <iostream> #include <string.h> #include <stdlib.h>
char *string_copy(char *src, char* dst) { char *res = dst; while(*dst++=*src++); *dst=0; return res; }
int main() { char *string1 = "temp string"; char *string2; std::cout << string1 << std::endl; string2 = (char*)malloc(sizeof(char)*(unsigned)strlen(string1)); std::cout << string_copy(string1, string2) << std::endl; return 0; } Добавлено (30.08.2011, 23:54) --------------------------------------------- Я уже показывал, что такое массив. Не спрашивайте меня, где он тут в коде - должно быть и так ясно.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Вторник, 30 Августа 2011, 23:53 |
|
| |
noTformaT | Дата: Среда, 31 Августа 2011, 00:00 | Сообщение # 44 |
Ukrainian independent game developer
Сейчас нет на сайте
| froex, я (и тот парень который написал статью на гд.ру) привел доказательство того что массив - это никакой не указатель, ведь если бы он был указателем, то int a[10]; a = a + 1; Спокойно бы скомпилировалось и выполнилось, но как известно - оно не скомпилировалось, про выполнение молчу. Работает только вот такой способ: int a[10]; //массив из 10 элементов int *p = a; //неявное преобразование массива к указателю на его первый элемент. p = p + 1; //такое с массивом не проканает, а = а + 1 не канает
Тут кто то говорил мне что массив (его имя) является указателем, кто? мне влом искать, но смотря на примеры выше - уже понятно что массив а - не указатель.
@noTformaT
|
|
| |
froex | Дата: Среда, 31 Августа 2011, 00:04 | Сообщение # 45 |
Руководитель Froexilize team
Сейчас нет на сайте
| Массив - это структура данных всего-лишь. Я не знаю, кто говорил, что это указатель.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
Coment | Дата: Среда, 31 Августа 2011, 00:13 | Сообщение # 46 |
почетный гость
Сейчас нет на сайте
| Вроде писали что имя массива - это указатель на первую его ячейку. А так интересный спор. Слежу с удовольствием
|
|
| |
froex | Дата: Среда, 31 Августа 2011, 00:18 | Сообщение # 47 |
Руководитель Froexilize team
Сейчас нет на сайте
| Quote (noTformaT) int a[10]; a = a + 1; Ну конечно не компилируется. Надо осознавать разницу между именующими и значащими выражениями: lvalue = rvalue. Иначе присвоения никак не может быть.
Добавлено (31.08.2011, 00:18) --------------------------------------------- Если не ошибаюсь, то по значащим и именующим выражениям можно почитать справочник Рей Лишнера по С++, страницы 80-90. Помню только, что до сотой :Р
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Среда, 31 Августа 2011, 00:18 |
|
| |
noTformaT | Дата: Среда, 31 Августа 2011, 00:24 | Сообщение # 48 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (Coment) Вроде писали что имя массива - это указатель на первую его ячейку. используя имя массива компилятор неявно приводит его к указателю на первую ячейку, это в том случае если имя массива передают указателю. Что то типа: int a[10]; int *b = a; //тут передаем имя массива указателю,
или
int a[10]; void MyFunc( int *arr ) {}; MyFunc(a); //тут тоже передаем имя указателю.
В обеих примерах кажется что массив а - указатель, но это не так. Если бы он был указателем, то над ним можно было что то сделать, но ничего нельзя сделать.
Quote (froex) Ну конечно не компилируется. Надо осознавать разницу между именующими и значащими выражениями: lvalue = rvalue. Иначе присвоения никак не может быть. Вот это не понял. я говорил про массив == указатель, что на самом деле равно фалсе Причем тут значащие и именующие я как то не понял. Ведь если а - указатель на первую ячейку массива, то почему мы не можем ничего сделать с этим указателем?
@noTformaT
|
|
| |
froex | Дата: Среда, 31 Августа 2011, 00:38 | Сообщение # 49 |
Руководитель Froexilize team
Сейчас нет на сайте
| noTformaT, ладно, я относительно недавно приехал домой, поэтому не в состоянии сильно задумываться. Можно продолжить разговор в следующий раз. Я обговорю ещё эту тему со своим руководителем. Потом сообщу результаты разборов. Спасибо за интересную беседу.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
FenMix | Дата: Среда, 31 Августа 2011, 00:47 | Сообщение # 50 |
Независимый игровой журналист
Сейчас нет на сайте
| Кстати, насчет goto В бейсике и то лучше юзать подпрограммы. FunctionName() и вуаля!
|
|
| |
froex | Дата: Среда, 31 Августа 2011, 01:01 | Сообщение # 51 |
Руководитель Froexilize team
Сейчас нет на сайте
| Я как-то рассматривал задачи поиска дефектов кубических и многопространственных объектов. При нахождении дефекта выход из поиска очень сложно осуществить посредством break-операторов. Без goto я мог обойтись только с трудом. goto облегчило алгоритм.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
nilrem | Дата: Среда, 31 Августа 2011, 01:19 | Сообщение # 52 |
Просветленный разум
Сейчас нет на сайте
| noTformaT, с именем массива нельзя ничего сделать потому, что он не простой указатель, а константный.
Windmill 2
WindMill 2D Game Engine
|
|
| |
noTformaT | Дата: Среда, 31 Августа 2011, 10:44 | Сообщение # 53 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (nilrem) с именем массива нельзя ничего сделать потому, что он не простой указатель, а константный. Я хз, но когда я определил константный указатель, и попытался с ним что то сделать, то ошибка уже была другая. Не такая как в примере выше.
@noTformaT
|
|
| |
Kornival | Дата: Среда, 31 Августа 2011, 15:23 | Сообщение # 54 |
The Witcher
Сейчас нет на сайте
| Насчет массивов froex абсолютно прав, тем кто с ним не согласен будет достаточно посмотреть дизассемлированный листинг любого из приведенных выше примеров. Мне уже не удобно если честно, но все равно спрошу еще раз: где там используется динамичесая память? Или ты понял что ошибся? Или решил меня игнорировать?
|
|
| |
noTformaT | Дата: Среда, 31 Августа 2011, 15:26 | Сообщение # 55 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (Kornival) достаточно посмотреть дизассемлированный листинг любого из приведенных выше примеров. ммм, нет дазасемблера под рукой, расскажи в двух словах
@noTformaT
|
|
| |
Kornival | Дата: Среда, 31 Августа 2011, 16:06 | Сообщение # 56 |
The Witcher
Сейчас нет на сайте
| Quote (noTformaT) ммм, нет дазасемблера под рукой, расскажи в двух словах Code int main() { int i = 12; int aray[4]; array[0] = 1; array[1] = 2; array[2] = 3; *(array+2) = 4; } array является указателем на область памяти где находится первый эелемент нашего массива, адреса остальных элементов вычисляются относительно него. Точный код не дам, но если убрать шелуху получится что-то вроде Code mov ebp, esp ;сохранение регистра стека sub esp, 18 ;выделяем в стеке 24 байт для массива и переменной i mov [ebp], 0x0000000c ;ebp указывает на адресс первого байта который мы выделили для переменных функции main mov [ebp-4],1 ;а это фактическа указатель array mov [ebp-8],2 ;дальше все по смещению относительно array mov [ebp-c],3 mov [ebp-e],4
Сообщение отредактировал Kornival - Среда, 31 Августа 2011, 16:07 |
|
| |
froex | Дата: Среда, 31 Августа 2011, 17:41 | Сообщение # 57 |
Руководитель Froexilize team
Сейчас нет на сайте
| Kornival, динамической памяти нет. Есть динамическое выделение. И попробуй использовать более старые компиляторы для проверки. Да, я игнорирую твой вопрос, т.к. не знаю, как сформулировать. Смысл в том, что старые компиляторы могут не ухватить цикла и не сохранять значения регистров перед безусловным переходом. Также они могут снова выделить память под массив. Память будет выделена по новому адресу тогда, т.к. старый занят. Я проверил на gcc 4.5.2 - он нормально пашет. Другого компилятора под рукой нет. Мой руководитель тоже считает то объявление проблемным местом и посоветовал объявить его как static.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
Kornival | Дата: Среда, 31 Августа 2011, 18:03 | Сообщение # 58 |
The Witcher
Сейчас нет на сайте
| Quote (froex) Kornival, динамической памяти нет. Есть в адрессном пространстве процесса сегмент "куча"(heap), когда нужно выделить или освободить память динамически она выделяется или освобождается именно в этом сегменте. В нашем случае память выделяется в стеке(инфа 100%), а такая память наз-ся "статической". И вообще, забьем на это
Сообщение отредактировал Kornival - Среда, 31 Августа 2011, 18:06 |
|
| |
froex | Дата: Среда, 31 Августа 2011, 18:26 | Сообщение # 59 |
Руководитель Froexilize team
Сейчас нет на сайте
| Кстааааати. Насчёт goto. Осмелюсь привести цитату из книги.
"Ученые - это мальчики и девочки, которые считают себя последователями Бэббиджа и Тьюринга. Никогда в жизни они не вставят в код инструкцию GoTo. Отодвигая художественную составляющую программирования на второй план, они делают все в соответствии с фундаментальными принципами компьютерных наук. И как раз в этом обычно и заключается проблема. В то время как они одержимы безупречностью своих трудов, ваша главная забота как руководителя состоит в том, чтобы разработать доброкачественный продукт и сдать его к установленному сроку. Программисты такого типа на самом деле очень полезны, и когда речь заходит об особо трудных задачах кодирования, их идеям нет цены. Вы просто долны следить за тем, чтобы их педантичность не перевесила практические соображения. У инженеров и ученых есть одна общая черта - те и другие очень любят все усложнять. Иногда даже кажется, что они все поклоняются богу сложности (и даже приносят ему жертвы!). Отдавая должную оценку глубочайшим познаниям ученых и по мере необходимости обращаясь к ним, руководитель не должен допускать их полновластия в вопросах написания кода - иначе они сделают его слишком сложным." (с) Дж. Ханк Рейнвотер "Как пасти котов".
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Среда, 31 Августа 2011, 18:27 |
|
| |
BOOM | Дата: Понедельник, 03 Октября 2011, 15:19 | Сообщение # 60 |
I am the creator of ADE
Сейчас нет на сайте
| Quote (4aBo) Привет, сейчас мы рассмотрим массивы и метки, массивы - это своеобразные стопки в одной переменной, массивы в языке С++ задаются так, сначала вызывается обычная переменная, только со скобками [], внутри которых нужно прописать количество значений в стопке, например, можно написать: В C++'е не существуют переменные. Каждый объект (а именно так "переменная называется") при начале функции (процедуры) создаётся, а при завершении процедуры этот объект удаляется. О массивах: массив - это множество ссылок на объект, либо множество объектов.
4aBo, goto - оператор прошлого. Он, хотя и остаётся в поддержке стандартов C++'а, но во многих компиляторах его реализация выполнена скверно, либо вообще отсутствует. Я не советую в проектах на C++ использовать оператор goto.
______________________________ Я вернулся, и это чудо. ______________________________
|
|
| |
|