Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив, Что за прикол ? 
:(
    Опции темы
Sheff
Дата 4.11.2002, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Есть функция:
Код

struct CamPath
{
float (*path)[9];
int count,step;
int moveto,movefrom;
float steppos[3],stepeye[3],stepup[3];
};

BOOL CAutoCamera::AddWay(CamPath &path, float posx, float posy, float posz, float eyex, float eyey, float eyez, float upx, float upy, float upz)
{
if (path.path==NULL)
{
path.path=(float (*)[9])malloc(9*sizeof(float));
if (path.path==NULL) return FALSE;
path.count=0;
}
else
{
path.path=(float (*)[9])realloc(path.path,_msize(path.path)+9*sizeof(float));
if (path.path==NULL) return FALSE;
++path.count;
}
path.path[path.count][0]=posx;
path.path[path.count][1]=posy;
path.path[path.count][2]=posz;

path.path[path.count][3]=eyex;
path.path[path.count][4]=eyey;
path.path[path.count][5]=eyez;

path.path[path.count][6]=upx;
path.path[path.count][7]=upy;
path.path[path.count][8]=upz;

return TRUE;
};

По идее, когда эта функция вызывается в первый раз, выделяется 9 float'ов на 1 элемент массива. Затем, при последующих вызовах, размер массива увеличивается на 1 и туда пишутся элементы. Но вот в чём дело, вызвав эту функцию 3 раза по идее в массиве path.path будет 9*3=27 элементов, но если после этих вызовов я пишу path.path[5][0]=1.0f, то ошибки не происходит, но почему, ведь я вызвал функцию только 3 раза по идее 5 элемента не может существовать ! Так почему же не генерируется ошибка ? (Компилю под debug)


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
neutrino
Дата 4.11.2002, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 1
Всего: 62



Код

path.path=(float (*)[9])malloc(9*sizeof(float));

Это, случайно, не массив 9 указателей на float?

Вот здесь (FAQ C++) есть примеры создания динамических массивов (автор: Fantasist), вероятно поможет:
http://www.forum.vingrad.ru/cgi-bin....284;st=




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Sheff
Дата 4.11.2002, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Цитата(neutrino @ 04.11.2002, 09:33)
Код

path.path=(float (*)[9])malloc(9*sizeof(float));

Это, случайно, не массив 9 указателей на float?

Вот здесь (FAQ C++) есть примеры создания динамических массивов (автор: Fantasist), вероятно поможет:
http://www.forum.vingrad.ru/cgi-bin....284;st=

Прочитал, всё это мне не подходит, не хочу я писать эти классы, а кстати, мой код правильный, т.к я подобный пример в MSDN'е нашёл.


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 5.11.2002, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Sheff @ 03.11.2002, 18:57)

Почему бы не облегчить жизнь себе и другим?

Код

typedef float t_path[9];

struct CamPath
{
t_path *path;
int count,step;
int moveto,movefrom;
float steppos[3],stepeye[3],stepup[3];
};

BOOL CAutoCamera::AddWay(CamPath &path, float posx, float posy, float posz, float eyex, float eyey, float eyez, float upx, float upy, float upz)
{
if (path.path==NULL)
{
path.path=(t_path*)malloc(sizeof(t_path));
if (path.path==NULL) return FALSE;
path.count=0;
}
else
{
path.path=(t_path)realloc(path.path,(path.count+1)*sizeof(t_path));
if (path.path==NULL) return FALSE;
++path.count;
}


...
...

return TRUE;
};


Гораздо понятнее и гибче, на мой взгляд. Зачем гадать почему нету ошибки? Так не скажешь. Просто не делай ее, если знаешь что она есть - может ты просто что-то перезаписываешь не катострофичное.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
MuToGeN
Дата 5.11.2002, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: нет
Всего: 32



Цитата(Sheff @ 04.11.2002, 12:38)
Это, случайно, не массив 9 указателей на float?

имя массива без индекса и есть указатель на массив. а пока не применили new, то это будет обычным пустым указателем. удобная вещь для создания динамических массивов

Код
int i=10;
// см. дальше
int *array;
// создаем пустой указатель
array = new int[i];
// создаем массив из 10 элементов,
// при этом array уже не NULL,
// а конкретный адрес, по которому
// лежит сам массив.
// далее в программе - array[3] - это
// элемент массива типа int, а array -
// указатель на массив типа int*



--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Sheff
Дата 6.11.2002, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Цитата(Fantasist @ 05.11.2002, 02:44)
[quote=Sheff,03.11.2002,18:57][/quote]
Почему бы не облегчить жизнь себе и другим?

Код

typedef float t_path[9];

struct CamPath
{
t_path *path;
int count,step;
int moveto,movefrom;
float steppos[3],stepeye[3],stepup[3];
};

BOOL CAutoCamera::AddWay(CamPath &path, float posx, float posy, float posz, float eyex, float eyey, float eyez, float upx, float upy, float upz)
{
if (path.path==NULL)
{
path.path=(t_path*)malloc(sizeof(t_path));
if (path.path==NULL) return FALSE;
path.count=0;
}
else
{
path.path=(t_path)realloc(path.path,(path.count+1)*sizeof(t_path));
if (path.path==NULL) return FALSE;
++path.count;
}


...
...

return TRUE;
};


Гораздо понятнее и гибче, на мой взгляд. Зачем гадать почему нету ошибки? Так не скажешь. Просто не делай ее, если знаешь что она есть - может ты просто что-то перезаписываешь не катострофичное.

Да, ты прав, так легче, но раз уж я уже начал всё через float (path*)[9] делать, то так и закончу. Кстати, я понял, почему path[5][0] ошибку не выдаёт, потому что это аналогично path[0][5], а допустим path[9][0](10+0=10) в моём случае аналогично path[1][0](9*1+1=10), т.е 2 мерный массив по идее храниться как большой одномерный(как я понял).


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 6.11.2002, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Sheff @ 05.11.2002, 19:50)
Да, ты прав, так легче, но раз уж я уже начал всё через float (path*)[9] делать, то так и закончу. Кстати, я понял, почему path[5][0] ошибку не выдаёт, потому что это аналогично path[0][5], а допустим path[9][0](10+0=10) в моём случае аналогично path[1][0](9*1+1=10), т.е 2 мерный массив по идее храниться как большой одномерный(как я понял).

Это маловероятно и было бы не правильно.
Посмотри на то, что я привел с typedef. Это идентично без typedef - то есть твоя переменная path - есть указатель на float[9]. Когда ты пишишь path[3] - ты вполне справедливо ожидаешь, что это будет смещение 3*sizeof(float[9]). Иначе нельзя - указатель всегда должен смещатся на количество байт кратное типу, на который этот указатель указывает. Иначе получится полная ерунда.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Alex101
Дата 6.11.2002, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Еще имейте в виду, что в C нет проверки на выход за границу массива, ответственность за это лежит на программисте.
Программа с таким кодом запросто откомпилируется и запустится, может и не вызвать никакой ошибки, но это будет все равно неправильная программа:
Код

int array[2];
for (int i=0;i<10;i++)
array[i]=i;



--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Lobsang
Дата 6.11.2002, 16:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Fantasist: Когда ты пишишь path[3] - ты вполне справедливо ожидаешь, что это  
          будет смещение 3*sizeof(float[9]). Иначе нельзя - указатель всегда
          должен смещатся на количество байт кратное типу, на который этот
          указатель указывает.

Слушай, а почему нельзя просто увеличить указатель на единицу без всякого sizeof? Как раз это - точно работает.
  Вверх
Fantasist
Дата 7.11.2002, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Guest @ 06.11.2002, 08:39)
Слушай, а почему нельзя просто увеличить указатель на единицу без всякого sizeof? Как раз это - точно работает.

Еще раз - указатель типа T* всегда смещается на количество байт кратное sizeof(T). То есть если у тебя есть char *s; то при выполнении s+=3 - указатель сместиться ровно на три байта вперед от предыдущего положения. Если это int16)=2.

Выражение: int i = p[3] (p - указатель на int) эквивалентно
int i=*(p+3);


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.