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