Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2015, 16:00   #11
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Откуда отладчик должен знать, валидный у вас адрес, или нет? Это рантайм ошибки.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 13.07.2015, 16:38   #12
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Наверно неправильно написал. Я имел в виду, что программа, запущенная под отладчиком, при возникновении любого исключения должна остановиться на месте этого исключения, и показать какое произошло исключение. Или я ошибаюсь?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 13.07.2015, 16:42   #13
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Если среда умеет брякаться на ассемблерном коде, то да. И то, она покажет именно то место, где произошла запись/чтение в/из адреса, а вовсе не то, где адрес перестал быть валидным. Мало того, к тому времени, как среда брякнется, того объекта, который должен быть на этом месте, уже в природе может не существовать. Тут важно понимать, что исключение произошло не там, где вы накосячили в коде а там, где вылезли последствия этого косяка. По стектрейсу иногда можно что-то понять, но опять же, только иногда. Самый муторный в отладке тип ошибок.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 13.07.2015 в 16:54.
crazy horse вне форума Ответить с цитированием
Старый 13.07.2015, 19:55   #14
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Если среда умеет брякаться на ассемблерном коде
Не обязательно на ассемблерном, у меня Qt Creator может показывать как в коде проекта, так и в ассемблерном коде, если не может показать в коде из-за использования каких-либо библиотек.

Но зная место, где происходит исключение, уже можно будет хоть что-то понять.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 14.07.2015, 17:10   #15
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Вы указатель приравниваете в NULL и следом пытаетесь его разыменовывать и докучи изменить его содержимое... в релизе это приведёт к вылету....

P.S: не советую использовать рекурсию при обработки столь много полигональной модели, переполнение стека влечёт к вылету, а размер стека на каждой машине разный.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 14.07.2015 в 17:12.
Perchik71 вне форума Ответить с цитированием
Старый 14.07.2015, 20:37   #16
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Цитата:
P.S: не советую использовать рекурсию при обработки столь много полигональной модели, переполнение стека влечёт к вылету, а размер стека на каждой машине разный.
Загружаю модели в цикле.

Читал что выход за пределы стека может происходить из-за большого числа вложенных функций.

Опишу количество вложенных функций у меня (незнаю правильно ли я понял что такое вложенные функции).

Есть главный класс, он загружает другой класс(класс который управляет моделями), потом загружается класс самой 3д модели, далее загружается ещё один класс с дополнительными 3д моделями (на этом последнем классе и вылетает).

Когда я говорю загружает это значит запускается функция загрузки. То есть вложенных функций получается 4. Вроде бы не очень много, а от чего-то вылетает.

Влияет ли количество кода в функциях на стек или на стек влияет только количество переменных? Ато кода в этих функциях у меня много. Уже и не знаю где ещё искать.
gunsoy вне форума Ответить с цитированием
Старый 14.07.2015, 21:03   #17
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

это всё хрень...

загрузка данных одного типа можно достичь путём рекурсии

Код:
void rload(.....)
{
    // чё-то делаем
    
    if(... условие, что ещё не всё загружено ...)
       rload(....)
}
это рекурсия, вложений может быть немерено...

P.S:
рекурсия это вызов функции внутри себя, накапливается стек переменных, что отправляете... потом цепочкой все отгружается

P.S.S:
приведите Ваше решение сюда
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 14.07.2015 в 21:06.
Perchik71 вне форума Ответить с цитированием
Старый 14.07.2015, 21:49   #18
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
далее загружается ещё один класс с дополнительными 3д моделями (на этом последнем классе и вылетает).
При загрузке взаимодействует ли этот класс с еще чем-то до завершения загрузки? Рекомендую посмотреть, где именно происходит вылет, а там может понятно уже будет.
Цитата:
Сообщение от gunsoy Посмотреть сообщение
Влияет ли количество кода в функциях на стек или на стек влияет только количество переменных? Ато кода в этих функциях у меня много. Уже и не знаю где ещё искать.
Количество кода в функциях на стек не влияет. На стек влияет количество объявленных переменных в коде и вызовы функций, но только после захода в них. Например:
Код:
void func2(char *str, unsigned long num){
    //  при заходе в эту функцию заберет 4 или 8 байт(зависит от программы, 32/64 бит) на адрес возврата с функции
    //  и в зависимости от типа вызова может забрать еще:
    //  4 или 8 байт(зависит от программы, 32/64 бит) под аргумент char *str
    //  4 байта под unsigned long num
    ...
}

void func1(){
    char tempStr[10];  //  заберет 10 байт стека
    unsigned long num;  //  заберет 4 байта стека
    func2(tempStr, num);
}
Но что происходит со стеком, когда у нас рекурсия, я не в курсе, но скорее всего, на каждый вызов уходит 4/8 байт и еще на параметры функции (зависит от их типа).

Да и я не уверен, что проблема именно в переполнении стека.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 14.07.2015 в 21:53.
Krasiosoft вне форума Ответить с цитированием
Старый 15.07.2015, 05:13   #19
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Вот так загружаю дополнительные модели.
Код:
    Weapon = new Snaryajenie[wstr.size()];
    for(int i = 0; i < wstr.size(); i++)
    {
        int BoolWeapon = -1;
        for(int e = 0; e < i; e++)
        {
            int swtype = Weapon[e].GetSnaryajenieType();
            if(swtype == wstr[i].wtype)
            {
                BoolWeapon = e;
                break;
            }
        }
        if(BoolWeapon == -1)
        {
            Weapon[i].Init(wstr[i], perstype);
        }
        else
        {
            SnaryajenieStruct SS;
            Weapon[BoolWeapon].GetSnaryajenieId(&SS);
            Weapon[i].Init2(SS);
        }
    }
Когда моделей много, выкидывает на этом месте. То есть когда я записваю индексы в файл.
Код:
os.write((char *) &newindeces[i].ind.front(), sizeof(int) * newindeces[i].ind.size());
Если я избавляюсь от этого кода, выкидвает в другом месте, немного ниже, когда я работаю со строками std::string
CurStr = persplus + CurStr;

Ещё когда много 3д моделей, у меня вылетает на одной из четырёх анимаций, то есть один тип анимации не работает. Тут вылетает
time2 = fabs((anbone[i].time[0] * 500) - timeArr[AnimationShagFrame]);

Ну и когда я что-то поменял, не помню уже что вылетало как я указал в посте №3. То есть если я изменяю код, удаляю те места где происходил вылет, вылетает уже в другом месте.
gunsoy вне форума Ответить с цитированием
Старый 15.07.2015, 09:00   #20
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Т.е. вы показали нам как выделяете массив Weapon а потом жалуетесь, что валится при работе с массивом newindeces и от нас требуется догадаться в чем проблема?

Подсказка - наличие typecast свидетельствует о проблеме.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Памяти VladimirAvakov Общие вопросы C/C++ 0 28.05.2014 23:01
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Программа для тестирования памяти, тестирование ячеек памяти Hunter557 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 30.01.2011 19:20
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16