Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
PunX |
4.5.2010, 11:59
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 56 Регистрация: 12.4.2009 Из: Димитровград Пользователь №: 676 Спасибо сказали: 0 раз(а) Репутация: 0
|
Заполняю двумерный массив x[n][m] и xt[m][n] (xt по идее после заполнения будет являться транспонированной матрицей) слудующим образом:
может конечно это и как-то не правильный метод, но всё же если я далее хочу просмотреть что же у меня там лежит в x[1][2] c помощью: и при запуске приложения оно вываливается с ошибкой ("завершился с кодом -1073741819") не совсем понимаю что не так, подскажите пожалуйста. |
|
|
|
|
Iron Bug |
4.5.2010, 16:07
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
ты на си вообще программировал хоть раз в жизни? почему у тебя индексация с единицы? понятное дело, что в массиве размерностью 3 нет элемента с индексом 3.
|
|
|
|
|
wolf.diesel |
10.7.2010, 10:03
Сообщение
#3
|
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 10.7.2010 Пользователь №: 1874 Спасибо сказали: 0 раз(а) Репутация: 0
|
Айрон прав.
Эта ошибка классифицируется как Out of Range - За границами выделенной памяти. Непонятно, правда, почему компилятор выдал такое число, да еше и отрицательное, но суть проблемы, думаю, ясна? Вся индексация в СИ и СИ++ начинается с 0. К примеру, если массив объявлен как То первый элемент будет звучать так: следовательно, последний элемент будет звучать как: если написать так: то в дебаг-режиме это вызовет ошибку выхода за границы памяти. В релизе это может вызвать что угодно, включая то, что Вы заквотили. |
|
|
|
|
Алексей1153 |
10.7.2010, 17:40
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Первый раз программировать на чём-либо - это не позор, что ж вы так сразу накинулись
Лучше надо было написать, как C/C++ работает с оператором [] доступа к элементу массива, а именно: выражение name[N]; эквивалентно следующему *(name+N); --------------- выражение name[N][M]; эквивалентно следующему *(*(name+N)+M); --------------- из этого всего сразу видно, почему индекс начинается с 0, а следующий за массивом элемент (чаще всего - не валидный) лежит по индексу, равному размеру массива Цитата(wolf.diesel @ 10.7.2010, 13:03) Link Непонятно, правда, почему компилятор выдал такое число, да еше и отрицательное Неизвестно, что именно "подправлено" неверной записью - ругаться мог любой объект ))) А ещё неожиданностью для меня вот что стало то есть, что Qt позволяет использовать в объявлении статического массива не константы. В C/C++ такого нет ) То есть, насколько понимаю, массив создаётся даже не на стеке, а динамически? Сообщение отредактировал Алексей1153 - 10.7.2010, 17:41 |
|
|
|
|
Litkevich Yuriy |
10.7.2010, 19:43
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(Алексей1153 @ 10.7.2010, 21:40) Link что Qt позволяет использовать в объявлении статического массива не константы. В C/C++ такого нет ) ну Qt здесь, точно не причём. А вот компилятор GCC, видимо, позволяет
|
|
|
|
|
Алексей1153 |
11.7.2010, 6:08
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Litkevich Yuriy, ну, я в эти тонкости ещё не вник )) Для меня оно всё Qt ещё пока
|
|
|
|
|
Iron Bug |
11.7.2010, 10:07
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
Цитата(Алексей1153 @ 10.7.2010, 20:40) Link А ещё неожиданностью для меня вот что стало int n = 4; int m = 3; double x[n][m]; это странно. я просто не вгляделась в детали. начала копать, нашла вот что: Цитата C99 standard supports variable sized arrays on the stack (Link) так что это новый стандарт, который, однако, ещё не все компиляторы поддерживают. кстати, на стеке создаётся! icc (версия 11.1) это тоже жрёт - только что проверила. но, в общем, такое в кроссплатформенности лучше не юзать, ибо плюшки могут быть реализованы не везде. Сообщение отредактировал Iron Bug - 11.7.2010, 10:08 |
|
|
|
|
Алексей1153 |
11.7.2010, 10:19
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Iron Bug @ 11.7.2010, 13:07) Link такое в кроссплатформенности лучше не юзать Вообще такое лучше никогда не юзать, это противоестественно как-то. Ежели хочется статический массив - ну так енумки нужно, да и всё. Зачем заставлять компиляторы догадываться, чего хотел сказать программист? Кстати, студия тоже хавает, но в таком виде: а лично для меня const TYPE и TYPE - это одно и то же, ибо const TYPE t=7; ((TYPE&)t)=3; или *((TYPE*)&t)=3; то есть const - лишь напоминалка компилятору, чтобы тот напомнил программисту о "неправильном" присваивании Сообщение отредактировал Алексей1153 - 11.7.2010, 10:19 |
|
|
|
|
Iron Bug |
11.7.2010, 13:36
Сообщение
#9
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
ну, иногда это может быть удобно, в плане простоты написания кода. но надо понимать, что при этом последующее изменение переменных не изменит размера массива. а вот надеяться на поддержку этой фичи на всех платформах нельзя.
а что насчёт модификатора const - он даёт реальные отличия поведения компилятора при генерации кода. часто такие переменные размещаются в коде, передаются ссылками, регистрами и вообще с точки зрения оптимизации кода лучше юзать const там, где только возможно его юзать. оптимизация работы с константами очень эффективна для приложений, для которых время выполнения кода критично. Сообщение отредактировал Iron Bug - 11.7.2010, 13:40 |
|
|
|
|
Алексей1153 |
11.7.2010, 16:00
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Iron Bug @ 11.7.2010, 16:36) Link ну, иногда это может быть удобно, в плане простоты написания кода Ну а что может быть проще: А насчёт участия const в оптимизации - что-то сильно сомневаюсь. Компиляторы сейчас и без const могут тааак заоптимизировать )) То есть они и так увидят, что переменная не меняется в коде Сообщение отредактировал Алексей1153 - 11.7.2010, 16:08 |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 23.12.2025, 2:18 |