Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Билли Бонс Дело в том что ты используешь в первой строке
float (*grid)[MAX_X];
MAX_X
а во второй строке на первом месте MAX_Y. Так и должно быть? Добавлено спустя 2 минуты, 31 секунду И вообще, не компилируется это у меня..
Дело в том что ты используешь в первой строке float (*grid)[MAX_X]; MAX_X а во второй строке на первом месте MAX_Y. Так и должно быть?
Всё путём. Размерность MAX_Y (первая) задаётся динамически (при new), а все остальные должны быть известны при компиляции. Дело в том, что выделяется один кусок памяти, и при записи grid[2][5] реальный адрес вычисляется как 2*MAX_X+5, поэтому MAX_X и задаётся в определении типа, а MAX_Y для этого вычисления не нужен и может быть любым, поэтому он задаётся динамически.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Билли Бонс
Билли Бонс писал(а):
а все остальные должны быть известны при компиляции.
Ну понятно тогда, почему не компилируется))) Мне же нужен полностью динамический массив.
Откачусь тогда к тому варианту, что у меня был, но у меня с ним проблемы.
У меня есть класс, CGrid, есть член этого класса:
Код:
float **grid;
Для которого в конструкторе выделяестя память:
Код:
CGrid::CGrid (int numX, int numY) { grid=new float*[numX]; for (int i=0; i<numX; i++) grid[i]=new float[numY]; }
Сделал деструктор класса:
Код:
CGrid::~CGrid() { for ( int i = 0; i < numX; ++i ) delete[] grid[i]; delete[] grid; }
Так вот, при выполнении этого деструктора, программа аварийно завершается с ошибкой Windows has triggered a breakpoint in OG.exe. This may be due to a corruption of the heap, and indicates the bug in OG.exe or any of the DLLs it has loaded... Если убрать деструктор из класса, то все нормально.
Среда разработки MS Visual Studio 2005. Добавлено спустя 1 минуту, 44 секунды И еще вопрос, с точки зрения эффективности может лучше использовать одномерный массив + индексацию, чем плодить массив указателей на массивы? Или может быть вектор лучше?
kexman а ты экземляр CGrid случайно не засовуешь в какой-нибудь контейнер или не присваиваешь?
Да-да, kexman, "огласите весь список, пжалста" (c). Чё ты там делаешь с этим классом, какие у него члены, есть ли конструктор копирования и оператор присваивания и т.д...
Daemon писал(а):
вся эта арифметика указателей - это С стаил, а у нас тут С++.
Ага. valarray, slice, slice_array в руки и вперёд, заре навстречу.
kexman писал(а):
И еще вопрос, с точки зрения эффективности может лучше использовать одномерный массив + индексацию, чем плодить массив указателей на массивы? Или может быть вектор лучше?
Конечно, один массив будет эффективней. Чем меньше динамических выделений памяти, тем лучше.
grid=new float*[numX]; for (int i=0; i<numX; i++) grid[i]=new float[numY];
double *tmp = new double[numX*numY]; fread(tmp, sizeof(double), numX*numY, f); int k=0; for(int j=0; j<numY; j++) for(int i=0; i<numX; i++,k++) grid[i][j]=tmp[k]; delete tmp; fclose(f); } CGrid::~CGrid() { for ( int i = 0; i < numX; ++i ) delete[] grid[i]; delete[] grid; }
CGrid никуда не засовываю, он у меня в одном экземпляре.
И еще, гляньте на то, как я перегрузил оператор [][]: перегрузил [] и возвратил указатель на одномерный массив(grid же у меня двухмерный). А если я заменю grid на одномерный, как мне тогда перегружать оператор [][] - такого я не нашел..
kexman В конструкторе delete tmp не верно, внимательнее нужно. Правильно будет delete[] tmp, иначе куча будет испорчена, и дальше уже глюки при работе с ней непредсказуемы. И вообще так никто не делает, используй автоматический массив для временной переменной, а не динамический. Добавлено спустя 8 минут, 29 секунд З.Ы. Класс у тебя дикий. Юзай одномерный массив:
Код:
class CGrid { private: float *grid_; public: CGrid() { /*...*/ grid_ = new float[numX*numY]; } float *operator[] ( size_t i ) { return &grid_[i*numY]; } };
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Билли Бонс Что-то я нигде не найду, что такое автоматический массив.. И почему он лучше такого?
Заменил delеte tmp на delete[] tmp, не помогает, все равно ошибка вылазит из-за деструктора:
Windows has triggered a breakpoint in OG.exe. This may be due to a corruption of the heap, and indicates the bug in OG.exe or any of the DLLs it has loaded... Если убрать из деструктора удаление динамического массива, то все нормально..
Автоматический значит стековый, простое объявление float tmp[размер]. Хотя у тебя размер неизвестен, так что так не выйдет. Скорее всего память портится в функции fread, правда мне сейчас лень разбираться. А вектор-то религия мешает использовать?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения