![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Есть функция:
По идее, когда эта функция вызывается в первый раз, выделяется 9 float'ов на 1 элемент массива. Затем, при последующих вызовах, размер массива увеличивается на 1 и туда пишутся элементы. Но вот в чём дело, вызвав эту функцию 3 раза по идее в массиве path.path будет 9*3=27 элементов, но если после этих вызовов я пишу path.path[5][0]=1.0f, то ошибки не происходит, но почему, ведь я вызвал функцию только 3 раза по идее 5 элемента не может существовать ! Так почему же не генерируется ошибка ? (Компилю под debug) -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 1 Всего: 62 |
Это, случайно, не массив 9 указателей на float? Вот здесь (FAQ C++) есть примеры создания динамических массивов (автор: Fantasist), вероятно поможет: http://www.forum.vingrad.ru/cgi-bin....284;st= -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| Sheff |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Прочитал, всё это мне не подходит, не хочу я писать эти классы, а кстати, мой код правильный, т.к я подобный пример в MSDN'е нашёл. -------------------- -------------------------- Шеф всегда прав :) |
||||
|
|||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Почему бы не облегчить жизнь себе и другим?
Гораздо понятнее и гибче, на мой взгляд. Зачем гадать почему нету ошибки? Так не скажешь. Просто не делай ее, если знаешь что она есть - может ты просто что-то перезаписываешь не катострофичное. -------------------- Волны гасят ветер... |
||||
|
|||||
| MuToGeN |
|
||||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
имя массива без индекса и есть указатель на массив. а пока не применили new, то это будет обычным пустым указателем. удобная вещь для создания динамических массивов
-------------------- 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! |
||||
|
|||||
| Sheff |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Да, ты прав, так легче, но раз уж я уже начал всё через float (path*)[9] делать, то так и закончу. Кстати, я понял, почему path[5][0] ошибку не выдаёт, потому что это аналогично path[0][5], а допустим path[9][0](10+0=10) в моём случае аналогично path[1][0](9*1+1=10), т.е 2 мерный массив по идее храниться как большой одномерный(как я понял). -------------------- -------------------------- Шеф всегда прав :) |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это маловероятно и было бы не правильно. Посмотри на то, что я привел с typedef. Это идентично без typedef - то есть твоя переменная path - есть указатель на float[9]. Когда ты пишишь path[3] - ты вполне справедливо ожидаешь, что это будет смещение 3*sizeof(float[9]). Иначе нельзя - указатель всегда должен смещатся на количество байт кратное типу, на который этот указатель указывает. Иначе получится полная ерунда. -------------------- Волны гасят ветер... |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
Еще имейте в виду, что в C нет проверки на выход за границу массива, ответственность за это лежит на программисте.
Программа с таким кодом запросто откомпилируется и запустится, может и не вызвать никакой ошибки, но это будет все равно неправильная программа:
-------------------- С уважением, А. Фролов. |
|||
|
||||
| Lobsang |
|
|||
|
Unregistered |
Fantasist: Когда ты пишишь path[3] - ты вполне справедливо ожидаешь, что это
будет смещение 3*sizeof(float[9]). Иначе нельзя - указатель всегда должен смещатся на количество байт кратное типу, на который этот указатель указывает. Слушай, а почему нельзя просто увеличить указатель на единицу без всякого sizeof? Как раз это - точно работает. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Еще раз - указатель типа T* всегда смещается на количество байт кратное sizeof(T). То есть если у тебя есть char *s; то при выполнении s+=3 - указатель сместиться ровно на три байта вперед от предыдущего положения. Если это int16)=2. Выражение: int i = p[3] (p - указатель на int) эквивалентно int i=*(p+3); -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |