Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
1

Чтение 3ds файла

27.11.2014, 18:08. Показов 1028. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в общем я пытаюсь написать парсер 3ds файлов... вот для начала хотя бы массив вершин, там есть чанк CHUNK_VERTLIST в котором я сначала читаю число вершин, потом массив вершин представленных вектором (структура, не стд) 3х флоатов, я хочу заюзать для этих целей вектор (уже стд, чтоб не париться с памятью), вот я читаю:
C++
1
2
3
4
5
6
case 0x4110:
{
    fread(&n, sizeof(word), 1, stream);
    vertices.reserve(n);
    fread(&vertices[0], sizeof(vector), n, stream);
}
и тут бах ни с того ни с счего "out of range"... так вот к чему бы это?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2014, 18:08
Ответы с готовыми решениями:

загрузка *.3ds файла
Сам код делает нормально, но он загружает только 1 объект из 3ds файла, который находится последним...

Загрузка 3ds-файла
Подскажите, пожалуйста, как можно загрузить 3ds файл в delphi, но только его внешнюю оболочку(без...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, "ing") в текстовом документе. в...

15
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 18:10 2
Dark Byte, reserve выделяет память, изменяя емкость вектора (capacity), но не меняет размер. См resize.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 18:11  [ТС] 3
0x10, как это выделяет память, но не меняет размер? и потом resize я тоже пробовал и тоже "out of range"
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 18:17 4
Так, стоп, что за фигня?
Где логика в использовании sizeof?
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 18:21  [ТС] 5
Цитата Сообщение от 0x10 Посмотреть сообщение
Где логика в использовании sizeof?
я же говорю там вектор - структура из 3х флоатов... ну вот такая:
C++
1
2
3
4
struct vector
{
    float x = 0.0, z = 0.0, y = 0.0;
};
Добавлено через 1 минуту
з.ы. но они точно не пересекаются потому что нигде нет "using namespace std", т.е. стандартный вектор везде употребляю через std::vector, а этот структура вообще член моего класса
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 18:27 6
Уф, мой моск.
Резюмируя. Хочется увидеть откуда конкретно летит out_of_range.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 18:36  [ТС] 7
Цитата Сообщение от 0x10 Посмотреть сообщение
Хочется увидеть откуда конкретно летит out_of_range.
C++
1
fread(&vertices[0], sizeof(vector), n, stream);
Добавлено через 7 минут
есть только одно такое маленькое предположение-опасение: там считывает что n равно 17168 (в отладчике глянул), это как бы не слишком много для вектора?))) вдруг он памяти столько не может выделить)))
0
0x10
27.11.2014, 18:43
  #8

Не по теме:

В общем, я перестаю понимать что происходит.
Хотя бы потому, что не понимаю какой out_of_range вылетает, ибо ни оператор[], ни fread исключений бросать не могут.
Про reserve-resize сказал. Возможно, в реализации вектора в операторе[] стоит assert с соответствующим сообщением об ошибке.
Сваливаю на отдых, передаю эстафету кому-нибудь более отдохнувшему и терпеливому.

0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 18:53  [ТС] 9
Цитата Сообщение от 0x10 Посмотреть сообщение
какой out_of_range вылетает, ибо ни оператор[], ни fread исключений бросать не могут.
1. оператор [] может бросать исключения если index >= size, следовательно я предполагаю нехватку памяти... хотя не понятно с чего бы...
2. кстати странно, я посмотрел в отладчике при вызове resize capacity становится равно переданному значению... разве оно не должно выделять с запасом? в std::string точно выделяет с запасом смотрел, а тут почему то нет этого о_О
3. 0x10, возвращайся ты самый лучший хелпер на этом форуме
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 18:58 10
Цитата Сообщение от Dark Byte Посмотреть сообщение
1. оператор [] может бросать исключения если index >= size
Во-первых, оператор[] не бросает исключений и вообще не проверяет границы. Все это делает метод at.
http://en.cppreference.com/w/c... perator_at
http://en.cppreference.com/w/c... /vector/at
Во-вторых, я уже сказал, что reserve не меняет размера вектора, т.е. если в конструкторе не был передан размер, если не было вызовов push_back/emplace_back, то после reserve(n) у ветора size == 0, capacity == n.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 19:02  [ТС] 11
Цитата Сообщение от 0x10 Посмотреть сообщение
Во-первых, оператор[] не бросает исключений и вообще не проверяет границы. Все это делает метод at.
скрин ниже, я же не просто так говорю...
Цитата Сообщение от 0x10 Посмотреть сообщение
Во-вторых, я уже сказал, что reserve не меняет размера вектора, т.е. если в конструкторе не был передан размер, если не было вызовов push_back/emplace_back, то после reserve(n) у ветора size == 0, capacity == n.
я сказал про resize ок да...
Миниатюры
Чтение 3ds файла  
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 19:07 12
Цитата Сообщение от Dark Byte Посмотреть сообщение
скрин ниже, я же не просто так говорю...
Dark Byte, ну это же прекрасно - Debug assertation. Значит, там, как я говорил, тупо вызов assert.
В релизной сборке этой проверки нет, т.е. программа просто упадет.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 19:09  [ТС] 13
Цитата Сообщение от 0x10 Посмотреть сообщение
Dark Byte, ну это же прекрасно - Debug assertation. Значит, там, как я говорил, тупо вызов assert.
В релизной сборке этой проверки нет, т.е. программа просто упадет.
ну таки я был прав разве нет? и потом assert там или еще что мне до лампочки... почему у меня при загрузке оно вываливается???
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 19:12 14
Цитата Сообщение от Dark Byte Посмотреть сообщение
ну таки я был прав разве нет?
См выше - в релизной сборке проверки нет, это только для отладки.
Цитата Сообщение от Dark Byte Посмотреть сообщение
почему у меня при загрузке оно вываливается
Обращение к нулевому элементу вектора с размером 0.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
27.11.2014, 19:15  [ТС] 15
Цитата Сообщение от 0x10 Посмотреть сообщение
Обращение к нулевому элементу вектора с размером 0.
я же сказал с resize ошибка тоже вываливается

Добавлено через 2 минуты
хотя стоп... мистика какая то, прошла ошибка отвечаю с resize тоже была, а теперь вдруг раз и нету...
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2014, 19:17 16
Цитата Сообщение от Dark Byte Посмотреть сообщение
я же сказал с resize ошибка тоже вываливается
Ну я предупредил, что не очень воспринимаю информацию сейчас.
Если речь о примере из 11 поста, то там тоже все понятно: обращение к 10 элементу вектора с размером 10, когда последний индекс - 9.

Если где-то в другом месте - нужно смотреть колстек. На обращении к какому элементу срабатывает ассерт, какой при этом фактический размер вектора. Перемещаться по стекфреймам в студии можно нажав "повтор" на появившемся от ассерта окне.
0
27.11.2014, 19:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2014, 19:17
Помогаю со студенческими работами здесь

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -> Vehicles -> Firetruck_0 В этой папке лежит...

Чтение заголовка PCX файла и чтение растровых данных PCX файла
Привет форумчане! Столкнулся с такой проблемой. Нужно считать заголовок PCX файла и растровые...

Чтение файла CSV и чтение из Table View
Здравствуйте, задача считать столбцы и строки excel в TextEdit. Прошу помощи в реализиции. ...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru