Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Декабрь 13, 2012, 13:08



Название: Ошибка
Отправлено: 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
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

Подскажите как от нее избавиться?
Спасибо.



Название: 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 это:

Изначально сишный макрос, производящий проверку некоего условия на равенство true и производящий остановку программы при получении false.
Вместо этих словесных переливаний интересно было бы (по ходу дела) узнать а почему assert не ловится через catch (..)


Название: 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() и делались.