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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2010, 19:46   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Создать массив в функции, через указатель. Как?

Пробовал так:
Код:
  type
    TIntAr = array of integer;
    PIntAr = ^TIntAr;

implementation

{$R *.dfm}
procedure CreateArr(a: PIntAr);
var
  b: TIntAr;
begin
  Pointer(b):=a;
  SetLength(b, 1);
  b[0]:=13;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  a: TIntAr;
begin
  CreateArr(@a);
  ShowMessage(IntToStr(a[0]));
end;
Компилится, но не работает)
TwiX вне форума Ответить с цитированием
Старый 31.03.2010, 21:27   #2
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Зачем указатель на динамический массив? Он сам по себе указатель...

SetLength() - ещё и возвращает новый указатель на массив после манипуляции. Получается что новый адрес пропадает в процедуре CreateArr().
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 31.03.2010 в 21:41.
notHaker вне форума Ответить с цитированием
Старый 31.03.2010, 21:29   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Указатель на указатель 0_0
Levsha100 вне форума Ответить с цитированием
Старый 01.04.2010, 05:11   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Просто я и без указателя пробовал. Вот код:
Код:
 type
    TIntAr = array of integer;
    PIntAr = TIntAr;

implementation

{$R *.dfm}
procedure CreateArr(a: PIntAr);
var
  b: TIntAr;
begin
  //b:=a;
  SetLength(a, 1);
  a[0]:=13;
  //b[0]:=13;
  //a:=b;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  a: TIntAr;
begin
  CreateArr(a);
  ShowMessage(IntToStr(a[0]));
end;
Levsha100, такой пост, будто вы слышите о двойном указателе впервые. Теже самые двумерные массивы...
TwiX вне форума Ответить с цитированием
Старый 01.04.2010, 09:04   #5
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Код:
procedure CreateArr(a: PIntAr);
var
  b: TIntAr;
begin
  //b:=a;
  SetLength(a^, 1);
  a^[0]:=13;
  //b[0]:=13;
  //a:=b;
end;
Наверн так...
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 01.04.2010, 09:51   #6
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Код:
Const
  Max=9;
Var
  i,j:integer;
  PArr:array[0..Max,0..Max] of ^real;

begin
  for i:=0 to  Max do  {выделение памяти под массив}
    for j:=0 to Max do
      new(PArr[i,j]);
  .......................  
  PArr[i,j]^:=X; {присвоение значения элементу массива}
end;
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 01.04.2010, 10:51   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

notHaker, что значит ^? Разве не значение по указателю?
Ругается на SetLength - говорит мол указатель нужен.

Grag, массив указателей это слишком) Нужно через SetLength. Да и всё-равно ошибка:
Код:
type
    TIntAr = array of ^integer;

implementation

{$R *.dfm}

procedure CreateArr(a: TIntAr);
var
  b: TIntAr;
begin
  new(a[0]);
  a[0]^:=13;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  a: TIntAr;
begin
  CreateArr(a);
  ShowMessage(IntToStr(a[0]^));
end;
TwiX вне форума Ответить с цитированием
Старый 01.04.2010, 10:53   #8
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
notHaker, что значит ^? Разве не значение по указателю?
Хоспд...

Код:
type
    TIntAr = array of integer;
    PIntAr = ^TIntAr;

implementation

{$R *.dfm}
procedure CreateArr(a: PIntAr);
begin
  SetLength(a^, 1);
  a^[0]:=13;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  a: TIntAr;
begin
  CreateArr(@a);
  ShowMessage(IntToStr(a[0]));
end;
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 01.04.2010, 11:01   #9
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Если в первом посте изменить две строки:
Код:
procedure CreateArr(a: PIntAr);
var
  b: PIntAr;
begin
  b:=a;
  SetLength(b^, 1);
  b^[0]:=13;
end;
То получится рабочий код. Всё-таки я был близок к решению, которое вы не признали)
Но всё-равно спасибо)
TwiX вне форума Ответить с цитированием
Старый 01.04.2010, 11:33   #10
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
var
b: PIntAr;
begin
b:=a;
SetLength(b^, 1);
b^[0]:=13;
end;[/CODE]
И где же тут МАССИВ, т.е. массив то есть, но из одного элемента... Это все равно что создать переменную и ссылаться на нее по указателю
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как скопировать ucInData(указатель) в массив iInput AlexVI Общие вопросы C/C++ 3 14.02.2010 16:26
Значение через указатель. Alex Cones Общие вопросы Delphi 8 24.01.2010 18:15
Запуск процедуры через указатель. Alex Cones Общие вопросы Delphi 4 16.11.2009 11:39
Работа с TStringList через указатель. Mixasik Общие вопросы Delphi 2 08.01.2009 12:51