crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Заполнение массива
PunX
  опции профиля:
сообщение 4.5.2010, 11:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 12.4.2009
Из: Димитровград
Пользователь №: 676

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заполняю двумерный массив x[n][m] и xt[m][n] (xt по идее после заполнения будет являться транспонированной матрицей) слудующим образом:
QSqlQuery qx;
    QString str = "SELECT c.x, c.y "
                  "FROM fe_coord c, \"Z\" z "
                  "WHERE c.fe_number = z.fe_number;";
    if(!qx.exec(str)){
        QMessageBox::warning(0,"warning","error of query!");
    }
    QSqlRecord recx = qx.record();

    int n = qx.size();
    int m = 3;
    int i=1;
    double x[n][m];
    double xt[m][n];
    while(qx.next()){
        double x2 = qx.value(recx.indexOf("x")).toDouble();
        double x3 = qx.value(recx.indexOf("y")).toDouble();

        x[i][1]=1;
        x[i][2]=x2;
        x[i][3]=x3;

        xt[1][i]=1;
        xt[2][i]=x2;
        xt[3][i]=x3;

        i++;
    }

может конечно это и как-то не правильный метод, но всё же если я далее хочу просмотреть что же у меня там лежит в x[1][2] c помощью:
QString xi = QString("%1").arg(x[1][2]);
    QMessageBox::information(0,"t",xi);

и при запуске приложения оно вываливается с ошибкой ("завершился с кодом -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.

К примеру, если массив объявлен как
int x[500];

То первый элемент будет звучать так:
int c;
c = x[0];

следовательно, последний элемент будет звучать как:
с = x[499];

если написать так:
с = x[500];


то в дебаг-режиме это вызовет ошибку выхода за границы памяти.
В релизе это может вызвать что угодно, включая то, что Вы заквотили.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.7.2010, 17:40
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 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) *
Непонятно, правда, почему компилятор выдал такое число, да еше и отрицательное

Неизвестно, что именно "подправлено" неверной записью - ругаться мог любой объект )))

А ещё неожиданностью для меня вот что стало
    int n = 4;
    int m = 3;
    double x[n][m];

то есть, что 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) *
что Qt позволяет использовать в объявлении статического массива не константы. В C/C++ такого нет )
ну Qt здесь, точно не причём. А вот компилятор GCC, видимо, позволяет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.7.2010, 6:08
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 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) *
А ещё неожиданностью для меня вот что стало

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
  опции профиля:
сообщение 11.7.2010, 10:19
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Iron Bug @ 11.7.2010, 13:07) *
такое в кроссплатформенности лучше не юзать

Вообще такое лучше никогда не юзать, это противоестественно как-то. Ежели хочется статический массив - ну так енумки нужно, да и всё. Зачем заставлять компиляторы догадываться, чего хотел сказать программист?

Кстати, студия тоже хавает, но в таком виде:
const int n = 4;
const int m = 3;
double x[n][m];


а лично для меня 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


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Iron Bug @ 11.7.2010, 16:36) *
ну, иногда это может быть удобно, в плане простоты написания кода


Ну а что может быть проще:
enum
{
   n = 4,
   m = 3,
};

double x[n][m];


А насчёт участия const в оптимизации - что-то сильно сомневаюсь. Компиляторы сейчас и без const могут тааак заоптимизировать )) То есть они и так увидят, что переменная не меняется в коде

Сообщение отредактировал Алексей1153 - 11.7.2010, 16:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.4.2024, 12:40