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


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

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

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

А ещё неожиданностью для меня вот что стало
    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) 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 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


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

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

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




Репутация:   34  


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


Ну а что может быть проще:
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.12.2025, 2:18