Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 19:04   #1
SkrudjMakdak
Форумчанин
 
Регистрация: 14.04.2010
Сообщений: 145
По умолчанию массив и указатели

Нужно выделить память под массив, у которого размер заранее не известен. как это сделать?
var
i:^word;
begin
GetMem(i, n*sizeof(word));
end;
где n - любое число

не работает
SkrudjMakdak вне форума Ответить с цитированием
Старый 23.09.2010, 19:10   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Так ведь вроде так:
Код:
var
i:^word;
begin
GetMem(i, n*sizeof(i));
end;
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.09.2010, 19:31   #3
SkrudjMakdak
Форумчанин
 
Регистрация: 14.04.2010
Сообщений: 145
По умолчанию

что sizeof(word), что sizeof(i) - одно и тоже
пишу так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:^word;
begin
GetMem(i, 5*sizeof(i));
i[4]:=2;
dispose(i);
end;
пишет ошибку - Array type required

пишу так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:array of ^word;
begin
GetMem(i, 5*sizeof(i));
i[4]:=2;
dispose(i);
end;
ошибки:
Incompatible types: "Integer' and 'Pointer'
Dispose not supported (nor necessary) for dynamic arrays

From Stilet: Неужели так сложно оформить пост красиво и читабельно?

Последний раз редактировалось Stilet; 24.09.2010 в 08:07.
SkrudjMakdak вне форума Ответить с цитированием
Старый 23.09.2010, 20:42   #4
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

все правильно. ты хочешь отпустить с миром указатель, а не кусок памяти. FreeMem(i,5*sizeof(word)) тебе поможет

А вообще не вижу смысла. Динамический массив делается через SetLength(i,5); и можно забыть об указателях.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 23.09.2010, 22:16   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Через одно место (а в TurboPascal'е по другому и никак вроде бы)
Код:
procedure TForm1.Button1Click(Sender: TObject);
type
  TWordArray = array [0..$80000000 div 2 - 3] of Word;
  PWordArray = ^TWordArray;
var
  i: PWordArray;
begin
  GetMem(i, 5 * sizeof(Word));
  i^[4] := 2;
  FreeMem(i, 5 * sizeof(Word));
end;
По хорошему
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: array of Word;
begin
  SetLength(i, 5 * sizeof(Word));
  i[4] := 2;
  Finalize(i);
end;
Somebody вне форума Ответить с цитированием
Старый 24.09.2010, 01:52   #6
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Код:
SetLength(i, 5 * sizeof(Word));
зачем - sizeof(Word) ?
Это получится
Код:
SetLength(i, 5 * 2);
тоесть выделения масива из десяти елементов.
финализировать динамический массив не имеет смысла ибо он делфя его самостоятельно финализирует, как только закончится функция (исключения является глобальный массив).

Код:
 TWordArray = array [0..$80000000 div 2 - 3] of Word;
  PWordArray = ^TWordArray;
В делфи уже есть стандартный набор подобных типов.

Код:
var
i:^word;
begin
GetMem(i, 5*sizeof(i));
i[4]:=2;
компилятор правильно тут ругается так как ты создал не массив, а ссылку на область тамяти. (и sizeof(i) в этом случае даст 4, а не 2 как предполагается. ибо тут I является Pointer)
для того что бы в данном случае внести значение можно воспользоватся такими способами:
1)
Код:
Inc(I, 4); // тут 4 означает не то что он здвинет поинтер на 4, а то что он сдвинет поинтер 4 раза по дворду (тоесть 4 раза по два байта)
i^ := 2;
2)
Код:
PWordArray(I)^[4] := 2;// PWordArray если кто помнит это стандартный тип.
Код:
var
i:array of ^word;
begin
GetMem(i, 5*sizeof(i));
Такое делфя даже не собирет. но если бы собрала то тут две логические ошибки.
1) ты получиш набор поинтеров а не массив двордов.
2) любая динам. строка/масив имеют в памяти два дворда (левее ссылки на сам масив) в одном она хранит счетчик ссылок, а во втором размер массива.
ViktorXP вне форума Ответить с цитированием
Старый 24.09.2010, 09:10   #7
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Ребят, вы уж определитесь. Или Delphi или Pascal. И будет однозначное решение.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 24.09.2010, 12:29   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от ViktorXP Посмотреть сообщение
зачем - sizeof(Word) ?
Это получится
Код:
SetLength(i, 5 * 2);
тоесть выделения масива из десяти елементов.
Ну, да, ошибся.
Цитата:
Сообщение от ViktorXP Посмотреть сообщение
В делфи уже есть стандартный набор подобных типов.
Есть, но этот TWordArray только [0..16383], что по современным меркам может быть маловато. Если память под массив больших размеров выделить динамически, то надо использовать $R-, при этом всё равно для слишком большого константного индекса может быть out of range при компиляции.

Последний раз редактировалось Somebody; 24.09.2010 в 12:31.
Somebody вне форума Ответить с цитированием
Старый 24.09.2010, 12:35   #9
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Зачем больше? Это что такое нужно считать что бы массив под два гига понадобился? (по умолчанию винда все равно больше не отдаст. при желании макс 3.2 гига выделить. а дальше только 64 битный компилятор поможет.)
ViktorXP вне форума Ответить с цитированием
Старый 24.09.2010, 13:46   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Учите мат-часть, что-ли.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Указатели KLOP Помощь студентам 4 06.03.2010 20:27
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели JOFRIF Общие вопросы C/C++ 2 31.08.2008 18:34