Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 20 из 87<  1 ... 17  18  19  20  21  22  23 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Билли Бонс писал(а):
Юзай вектор или, на крайняк, так:
Помоему так просто не соберется :) Уж лучше использовать вектор.

_________________
Ку ку



Партнер
 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Daemon писал(а):
Помоему так просто не соберется
А я проверил. :D


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс писал(а):
Но так лучше не делать. Юзай вектор или, на крайняк, так:
Код:
float (*grid)[MAX_X];
grid = new float[MAX_Y][MAX_X];
grid[2][5] = 1.0f;
delete[] grid;

А почему на первом месте [MAX_Y] а потом [MAX_X]?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman писал(а):
А почему на первом месте [MAX_Y] а потом [MAX_X]?
Дык назови их по-другому, яжели не нравится. :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
Дело в том что ты используешь в первой строке
float (*grid)[MAX_X];
MAX_X
а во второй строке на первом месте MAX_Y. Так и должно быть?
Добавлено спустя 2 минуты, 31 секунду
И вообще, не компилируется это у меня..


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman писал(а):
Дело в том что ты используешь в первой строке float (*grid)[MAX_X]; MAX_X а во второй строке на первом месте MAX_Y. Так и должно быть?
Всё путём. :) Размерность MAX_Y (первая) задаётся динамически (при new), а все остальные должны быть известны при компиляции. Дело в том, что выделяется один кусок памяти, и при записи grid[2][5] реальный адрес вычисляется как 2*MAX_X+5, поэтому MAX_X и задаётся в определении типа, а MAX_Y для этого вычисления не нужен и может быть любым, поэтому он задаётся динамически.

kexman писал(а):
И вообще, не компилируется это у меня..
Руки кривые. :) Шютка. Чем компилируешь?


 

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 секунды
И еще вопрос, с точки зрения эффективности может лучше использовать одномерный массив + индексацию, чем плодить массив указателей на массивы? Или может быть вектор лучше?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman а ты экземляр CGrid случайно не засовуешь в какой-нибудь контейнер или не присваиваешь? :)
kexman писал(а):
Или может быть вектор лучше?
Во-во, вся эта арифметика указателей - это С стаил, а у нас тут С++.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Daemon писал(а):
kexman а ты экземляр CGrid случайно не засовуешь в какой-нибудь контейнер или не присваиваешь? :)
Да-да, kexman, "огласите весь список, пжалста" (c). :) Чё ты там делаешь с этим классом, какие у него члены, есть ли конструктор копирования и оператор присваивания и т.д...

Daemon писал(а):
вся эта арифметика указателей - это С стаил, а у нас тут С++.
Ага. valarray, slice, slice_array в руки и вперёд, заре навстречу. :)

kexman писал(а):
И еще вопрос, с точки зрения эффективности может лучше использовать одномерный массив + индексацию, чем плодить массив указателей на массивы? Или может быть вектор лучше?
Конечно, один массив будет эффективней. Чем меньше динамических выделений памяти, тем лучше.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Вот объявление класса:
Код:
class CGrid   
{
public:
   //====== Конструктор экспорта
   CGrid (LPCTSTR fileName);
   //====== Конструктор для расчета
   CGrid (int b1, int b2);
   //Деструктор
   ~CGrid();

   float **grid;
   double minX, minY, xSize, ySize, minZ, maxZ;
   long numX, numY;

   float getX(int i) const;
   float getY(int j) const;
   void calculate(vector<CPoint3D> data, int approx, float n);

   float* CGrid::operator [] (int i)
   {
      assert (i >= 0 && i <= numX);
      return grid[i];
   }
private:
   float calc(float src, float a, int approx, float n);
   float distance(float x1, float y1, float x2, float y2);
   int   lags,
      num_close_wells;

};

Вот реализация конструкторов и деструктора:
Код:
CGrid::CGrid (int b1, int b2)
{
   lags=14;
   numX=b1;
   numY=b2;
   num_close_wells=10;
   grid=new float*[numX];
   for (int i=0; i<numX; i++)
      grid[i]=new float[numY];
}
CGrid::CGrid (LPCTSTR fileName)
{
   FILE *f;
   f = fopen(fileName, "rb");

   fseek(f, 5*4, SEEK_SET);
   fread(&numY, sizeof(long), 1, f);
   fread(&numX, sizeof(long), 1, f);
   fread(&minX, sizeof(double), 1, f);
   fread(&minY, sizeof(double), 1, f);
   fread(&xSize, sizeof(double), 1, f);
   fread(&ySize, sizeof(double), 1, f);
   fread(&minZ, sizeof(double), 1, f);
   fread(&maxZ, sizeof(double), 1, f);
   fseek(f, 24, SEEK_CUR);

   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 на одномерный, как мне тогда перегружать оператор [][] - такого я не нашел..


 

Member
Статус: Не в сети
Регистрация: 24.07.2005
Откуда: Moscow
Какие книги посоветуете по языку Си ? Желательно, чтобы было побольше примеров с подробным разъяснением :)

Бумажные или электронные - особого значения не имеет :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Алканаффт
С или С++?
Если с++, то мне Либерти очень понравился, отличнно для новичков все разъяснено.


 

Member
Статус: Не в сети
Регистрация: 28.03.2006
Алканаффт
Керниган и Ричи

_________________
Первый огонь был получен людьми из-за перегрева.
Пессимист отличается от оптимиста датой наступления конца света.


 

Member
Статус: Не в сети
Регистрация: 31.08.2005
Откуда: Мир
Так что, мне никто не поможет с подключением к БД через С++ ? :(

_________________
Loading...


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
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
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
pretorian используй QT :D Пошерсти по гуглю, он даст ответ.
Билли Бонс писал(а):
И вообще так никто не делает, используй автоматический массив для временной переменной, а не динамический.
Угу, лучше используй вектора :D, сериализацию и прочее, а то С с классами получается :)

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.07.2005
Откуда: Moscow
kexman нет, Си, без ++

Aside Кернигана и Ричи уже купил.


смотел сегодня в озоне, там много книжек по Си, не знаю, что выбрать.


 

Member
Статус: Не в сети
Регистрация: 18.08.2005
Откуда: Новороссийск
Алканаффт зачем тебе Си, юзай C++


 

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...
Если убрать из деструктора удаление динамического массива, то все нормально..


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Автоматический значит стековый, простое объявление float tmp[размер]. Хотя у тебя размер неизвестен, так что так не выйдет. Скорее всего память портится в функции fread, правда мне сейчас лень разбираться. А вектор-то религия мешает использовать? :)


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 20 из 87<  1 ... 17  18  19  20  21  22  23 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan