Название: Ошибка Отправлено: demaker от Декабрь 13, 2012, 13:08 Добрый день
Компилятор выдает ошибку: Код: ASSERT: "i >= 0 && i < size()" in file d:\QtSDK\Desktop\Qt\4.7.3\mingw\include/QtCore/qbytearray.h, line 396 Подскажите как от нее избавиться? Спасибо. Название: Re: Ошибка Отправлено: Пантер от Декабрь 13, 2012, 13:09 Компилятор? Уверен?
Название: Re: Ошибка Отправлено: demaker от Декабрь 13, 2012, 13:11 ??? А кто
396 строчка qbytearray.h, line 396 Код: { Q_ASSERT(i >= 0 && i < size()); return d->data[i]; } и еще пишет в консоле Код: sotrvu.exe завершился с кодом 3 Название: Re: Ошибка Отправлено: QtCoder от Декабрь 13, 2012, 13:16 ??? А кто 396 строчка qbytearray.h, line 396 Код: { Q_ASSERT(i >= 0 && i < size()); return d->data[i]; } и еще пишет в консоле Код: sotrvu.exe завершился с кодом 3 Ошибка времени исполнения - индекс вышел за пределы массива. Название: Re: Ошибка Отправлено: demaker от Декабрь 13, 2012, 13:19 Понятно, :(
Название: Re: Ошибка Отправлено: ssoft от Декабрь 13, 2012, 13:20 Программа (а не компилятор) на этапе выполнения выдает ошибку, избавится от которой можно только, передавая корректный индекс в метод at().
А это предупреждение, что индекс должен быть в пределах от 0 до размера контейнера ( 0 <= i < size ), не включая сам размер. Название: Re: Ошибка Отправлено: Igors от Декабрь 13, 2012, 14:42 Компилятор выдает ошибку: Ну прям как колхозник в первый раз увидевший "ПК". За время проведенное на форуме (и написание 277 сообщений) вполне можно было чего-то набраться - пусть не самого хорошего, но чтобы в таких-то азах уж не плавать :'( Название: Re: Ошибка Отправлено: kambala от Декабрь 13, 2012, 18:16 Компилятор выдает ошибку: Ну прям как колхозник в первый раз увидевший "ПК". За время проведенное на форуме (и написание 277 сообщений) вполне можно было чего-то набраться - пусть не самого хорошего, но чтобы в таких-то азах уж не плавать :'( Название: Re: Ошибка Отправлено: Bepec от Декабрь 13, 2012, 18:38 Счастлив тот программист, который никогда не видел ассертов :D
Ну да придёт знание, да и опыт приобретётся. Если б я с бустом не работал, тоже бы наверно об ассертах незнал :D Название: Re: Ошибка Отправлено: kambala от Декабрь 13, 2012, 19:01 assert() — это вообще сишная функция изначально
Название: Re: Ошибка Отправлено: GreatSnake от Декабрь 13, 2012, 19:27 assert() — это вообще сишная функция изначально Это вообще макрос)Название: Re: Ошибка Отправлено: Bepec от Декабрь 13, 2012, 19:45 Ухаха :D
А вообще это проверка некоего условия на true/false :) (не в укор, не в спор, а просто к сведению незнающим) Название: Re: Ошибка Отправлено: kambala от Декабрь 13, 2012, 20:20 assert() — это вообще сишная функция изначально Это вообще макрос)Ухаха :D не просто ж проверка, а убийство программы в случае фолсА вообще это проверка некоего условия на true/false :) (не в укор, не в спор, а просто к сведению незнающим) Название: Re: Ошибка Отправлено: Bepec от Декабрь 13, 2012, 20:27 В совокупности Assert это:
Изначально сишный макрос, производящий проверку некоего условия на равенство true и производящий остановку программы при получении false. Название: Re: Ошибка Отправлено: Igors от Декабрь 14, 2012, 13:21 В совокупности Assert это: Вместо этих словесных переливаний интересно было бы (по ходу дела) узнать а почему assert не ловится через catch (..)Изначально сишный макрос, производящий проверку некоего условия на равенство true и производящий остановку программы при получении false. Название: Re: Ошибка Отправлено: GreatSnake от Декабрь 14, 2012, 13:27 Вместо этих словесных переливаний интересно было бы (по ходу дела) узнать а почему assert не ловится через catch (..) Дык коли он С-шный и вызывает abort() (SIGABRT(6)), какие уж здесь кетчеры?Остаётся вешать signal handler. Название: Re: Ошибка Отправлено: kambala от Декабрь 14, 2012, 14:37 исключений же нету в С. но можно пробовать ловить сигналы в юниксах (про винду не знаю, но думаю там тоже есть возможность задать коллбэк).
добавлено: ой, не заметил, что уже есть ответ на новой странице :) Название: Re: Ошибка Отправлено: Igors от Декабрь 14, 2012, 14:58 исключений же нету в С. Хмм... не уверен. Синтаксиса try/catch нет, это да. Но почему С-шная библиотечная ф-ция не может испустить исключение? (возможно даже и не ++ исключение)Да, на nix OC дело сводится у abort(), это хорошо видно в отладчике. Но что на Вындоуз - хз. Выгоднее считать "делом реализации" :) Название: Re: Ошибка Отправлено: kambala от Декабрь 14, 2012, 15:27 как тогда будет выглядеть пускание исключения в С? там же всё завязано на кодах ошибок, возвращаемых из функций. разве можно «провалиться» в стеке дальше, чем на 1 шаг, как в случае с исключениями в С++?
Название: Re: Ошибка Отправлено: Igors от Декабрь 14, 2012, 15:44 как тогда будет выглядеть пускание исключения в С? там же всё завязано на кодах ошибок, возвращаемых из функций. разве можно «провалиться» в стеке дальше, чем на 1 шаг, как в случае с исключениями в С++? Можно через longjmp, правда без всяких авто-откатов деструкторов. Но я говорю не об исключениях вообще - как бы с точки зрения процессора, а не С++. Название: Re: Ошибка Отправлено: kambala от Декабрь 14, 2012, 15:52 с ассемблером дел никогда не имел, но насколько я понимаю, для использования longjmp нужно знать куда (в какую функция) «прыгать». как же может сторонняя библиотека знать об этом — получать указатель на «коллбэк»-функцию, в которую осуществлять «прыжок»? или я всё в корне неправильно понимаю? :)
да, и можно примерчик, чтобы посмотреть как это работает? Название: Re: Ошибка Отправлено: Igors от Декабрь 14, 2012, 16:21 с ассемблером дел никогда не имел, но насколько я понимаю, для использования longjmp нужно знать куда (в какую функция) «прыгать». как же может сторонняя библиотека знать об этом — получать указатель на «коллбэк»-функцию, в которую осуществлять «прыжок»? или я всё в корне неправильно понимаю? :) Можно глянуть в С++ reference (хороший справочник). А есть и в Qt, т.к. используется libJPG а там longjmp (в примечаниях тролли неоднократно ноют об отсутствии авто-деструкторов :))да, и можно примерчик, чтобы посмотреть как это работает? Сам "прыжок" - дело нехитрое. Есть глобальные переменные (сохраненные при вызове setjmp). Это - адрес самого кода (точки на которую спрыгнуть), получить просто LEA - значение регистра стека Просто установили стек да передали управление "длинным jump'ом". Как бы "зачеркнуть всю жизнь да сначала начать". Ну а что там произошло "в старой жизни" - память распределили, файлы открыли и.т.п. - то уже разбирайтесь сами как это все зачистить. Конечно, exception куда приятнее, но мне кажется оно не дает того понимания как работает машина, и это важно. Хотя возможно все это лишь ностальгия старого пердуна :) Название: Re: Ошибка Отправлено: GreatSnake от Декабрь 14, 2012, 16:25 Помнится в ранних версиях g++ исключения именно через longjmp() и делались.
|