Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти при работе с дин. массивами, Выделение памяти при работе с дин. масси 
:(
    Опции темы
buian
Дата 9.10.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.2.2005

Репутация: нет
Всего: нет



Проблема собственно в следующем, я читаю из файла отчки вершин, заранее не знаю сколько их, их может быть как 100 так и 1000. Так вот отвел для хранения дин. массив. Теперь не могу понять как резервировать память при каждом поступлении данных, я делаю так:

Код

procedure AddToArray(x,y,z: GLFloat; n: integer);
begin
  GetMem(vertexes,n*sizeof(GLFloat));
  vertexes^[n-1][0]:=x;
  vertexes^[n-1][0]:=y;
  vertexes^[n-1][0]:=z;
  FreeMem(vertexes,n*sizeof(GLFloat));
end;


т.е. поступают в процедуру координаты и какая по счету точка. [n-1] потому что как я понял дин. массивы номеруются с нуля. Ед. я не уверен насчет надо ли FreeMem, но без нее тоже косяк. А именно при запуске приложение вылетает. Помогите кто нить?
PM MAIL   Вверх
Yanis
Дата 9.10.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



buian
Могу предложить использовать динамичские массивы поддерживаемы в языке Delphi. Т.е. использовать стандартные конструкции:
Код

var a: array of GLFloat; 
...

SetLength(array, n);
...
 

Помоему так понятнее и вероятность ошибиться меньше.

Добавлено @ 19:39 
Цитата(buian @  9.10.2006,  20:29 Найти цитируемый пост)
FreeMem(vertexes,n*sizeof(GLFloat));

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

Это сообщение отредактировал(а) Yanis - 9.10.2006, 19:39


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 9.10.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(buian @  9.10.2006,  19:29 Найти цитируемый пост)
А именно при запуске приложение вылетает. Помогите кто нить? 

Скорее всего производится выход из диапазона выделеной памяти и обращение к защищеному блоку, запись в который запрещена.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 9.10.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(buian @  9.10.2006,  18:29 Найти цитируемый пост)
vertexes

а кто это ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fedia
Дата 10.10.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



buian, странная реализация функции AddToArray. Выделение памяти, ее очищение, поочередное занесение трех значений в одну ячейку массива…
Цитата(buian @  9.10.2006,  19:29 Найти цитируемый пост)
Теперь не могу понять как резервировать память при каждом поступлении данных

Могу предложить пример использования динамического массива с порционным выделением памяти. Данный метод отличается от метода выделения памяти под каждый элемент массива большей производительностью, за счет выделения памяти сразу под n-е количество элементов массива (n равняется предыдущей длине массива). У меня были кое-какие наработки в этой области, поэтому, слегка модифицировав свой класс предлагаю:
1. Подключить к своему проекту модуль GLFloat
Код

unit GLFloat;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls;

type

  TGLFloat = record
    x, y, z: Double;
  end;

  TArGLFloat = array of TGLFloat;

  TClArGLFloat = class
  private
    FArGLFloat: TArGLFloat;
    FCapacity: integer;  //размерность массива
    //увеличение размерности массива
    procedure Grow;
    //получение элемента массива с индексом Index
    function GetValue(const Index: integer): TGLFloat;
  public
    Count: integer;     //количество заполненных элементов массива
    //добавление элемента к массиву со значениями x, y, z
    procedure AddXYZ(x, y, z: Double);
    //добавление элемента к массиву
    procedure AddElement(value: TGLFloat);
    //удаление из мессива элемента с индексом ItemIndex
    procedure DeleteItem(ItemIndex: integer);
    //обнуление массива FArGLFloat
    procedure Clear;
    //элемент массива FArGLFloat
    property Values[const Index: integer]: TGLFloat read GetValue;
  end;

implementation

{ TClArInteger }

procedure TClArGLFloat.AddElement(value: TGLFloat);
begin
  if Count = FCapacity then
  grow;
  FArGLFloat[count]:=value;
  inc(count);
end;

procedure TClArGLFloat.AddXYZ(x, y, z: Double);
begin
  if Count = FCapacity then
  grow;
  FArGLFloat[count].x:=x;
  FArGLFloat[count].y:=y;
  FArGLFloat[count].z:=z;
  inc(count);
end;

procedure TClArGLFloat.Clear;
begin
  FArGLFloat:=nil;
  FCapacity:=0;
  Count:=0;
end;

procedure TClArGLFloat.DeleteItem(ItemIndex: integer);
var
  i: integer;
begin
  if (Count = 0) or (ItemIndex>=Count) then
  exit;

  for i:=ItemIndex + 1 to Count - 1 do
  FArGLFloat[i - 1]:=FArGLFloat[i];
  dec(Count);
end;

function TClArGLFloat.GetValue(const Index: integer): TGLFloat;
begin
  if Index<Count then
  Result:=FArGLFloat[Index] else
  raise Exception.Create('Выход за пределы массива в процедуре TClArGLFloat.GetValue');
end;

procedure TClArGLFloat.Grow;
begin
  if FCapacity = 0 then
  FCapacity:=8 else
  FCapacity:=Count + FCapacity;
  SetLength(FArGLFloat, FCapacity);
end;

end.

2. Использовать его следующим образом:
Код

var
  ClArGLFloat: TClArGLFloat;
  i: Integer;
  GlFloat: TGLFloat;
begin
  ClArGLFloat:=TClArGLFloat.Create;
  for i:=0 to 100 do
  begin
    //первый способ добавление элемента
    ClArGLFloat.AddXYZ(i, i+1, i+2);
    //второй способ добавление элемента
    GlFloat.x:=i*2;
    GlFloat.y:=i*3;
    GlFloat.z:=i*4;
    ClArGLFloat.AddElement(GlFloat);
  end;
  //удаляем 99-й элемент массива
  ClArGLFloat.DeleteItem(99);
  //выводим на экран значение 100-го элемента
  ShowMessage(FormatFloat('x = 0.0', ClArGLFloat.Values[100].x) + #10#13 +
    FormatFloat('y = 0.0', ClArGLFloat.Values[100].y) + #10#13 +
    FormatFloat('z = 0.0', ClArGLFloat.Values[100].z));
  //пробегаем по всем элементам массива
  for i:=0 to ClArGLFloat.Count - 1 do
  ListBox1.Items.Add(FormatFloat('x = 0.0', ClArGLFloat.Values[i].x) + '; ' +
    FormatFloat('y = 0.0', ClArGLFloat.Values[i].y) + '; ' +
    FormatFloat('z = 0.0', ClArGLFloat.Values[i].z));
  //очищаем массив
  ClArGLFloat.Clear;
  //освобождаем память
  FreeAndNil(ClArGLFloat);
end;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.