Форум «Всё о Паскале» _ Делфи _ Array Of Array Of Array Of Char
Автор: arhimag 9.04.2006 0:16
Помогите, мне нужны парочка процедур, использующих стандартные дингамические массивы мне нужен трехмерный массив. и процедуры 1 Очищает весь массив и задает его размеры как кубика: Х:У:Z подается нап вход процедуры и сам массив 2. вывоит элемент из этого массива с координатами XYZ 3. Меня ет значение снизу не получившиеся попытка.
Стандартных динамических массивов в Паскале НЕТ. Запомни уже это.
Автор: klem4 9.04.2006 0:27
Во первых, зачем ты запихнул в архив экзешник весом в полмега ? Во вторых раздел ДЕЛФИ в другом месте, еще раз повторится, тему удалю.
Переношу в Delphi.
Автор: arhimag 9.04.2006 1:02
Извините, просто думал что в паскале все аналогично. А экзешник вынуть забыл. А кто-нибудь нашел здешь ошибку а то он мне пишет что обрашение к пустому разделу памяти
Автор: volvo 9.04.2006 1:13
Цитата(arhimag @ 8.04.2006 21:02)
он мне пишет что обрашение к пустому разделу памяти
Правильно пишет... Вот так делай:
procedure initmap(x,y,z:integer; map:Tmap); var i,j:integer; begin map:=nil; setlength(map,x);
for i:= 0 to x-1 do setlength(map[i],y);
for i:= 0 to x-1 do for j:= 0 to y-1 do setlength(map[i][j],z); end;
Автор: arhimag 9.04.2006 1:19
щас попробую , спасибо, а если присваивать, то тоже нужно map[1][2][3]:='1'; например?
Автор: hardcase 9.04.2006 13:13
Зачем писать циклы?
type TMap = array of array of array of char;
var M: TMap;
begin SetLength(M, Xwidth, Ywidth, Zwidth); end;
Автор: arhimag 9.04.2006 18:21
так с этим разобрался, а теперь в том проекте если исправить процедуру Initmap и нажать на кнопку О то он опять говорит что обращение к пустому разделу памяти помогите
Автор: volvo 9.04.2006 18:51
Значит, что бы сделал я: у тебя все равно массив map описан глобально, и он один... Так зачем ты его тягаешь из функции в функцию как параметр? Попробуй описАть вот так:
procedure initmap(x,y,z:integer); var i,j:integer; begin map:=nil; setlength(map, x, y, z); // Работа с глобальным массивом end; procedure Reflesh(activelayer:integer); begin ... end;
procedure TForm1.ButtonRefleshClick(Sender: TObject); begin Reflesh(1); end;
procedure TForm1.FormCreate(Sender: TObject); begin initmap(10,10,3); end;
Но в твоей программе есть еще несколько камней:
procedure Reflesh(activelayer:integer); begin ... // Y + 9 = 10, а индексы могут быть с 0 до 9 Form1.Buttonmap210.caption:= map[x+1,y+9,activelayer]; ... end;
то же самое - с X-ами ... Исправляй
Автор: Гость 9.04.2006 22:07
мучался, мучался все равно пишет что обращение к пустой памяти. Вольво можешь выложить работающий?
Автор: arhimag 9.04.2006 22:09
Это был я, просто войти забыл. И вот еще забыл сказать можно ли сделать что-то вроде: for i:= 1 to 10 do Form1.buttoni.caption:='1'? или нет
Type TDlina= array of char; TPloskost = array of Tdlina; Tmap = array of TPloskost;
var Form1: TForm1; map:Tmap; implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm} procedure initmap(x,y,z:integer; map:Tmap); var i,j,k:integer; begin map:=nil; Setlength(map,x,y,z); for I:= 1 to x-1 do for j:= 1 to y-1 do for k:= 1 to z-1 do map[i, k, j]:='1';
procedure TForm1.N4Click(Sender: TObject); begin Form2.showmodal; end;
procedure TForm1.N5Click(Sender: TObject); begin Form3.showmodal; end;
procedure TForm1.N6Click(Sender: TObject); begin form4.showmodal; end;
procedure TForm1.N7Click(Sender: TObject); begin Halt; end;
procedure TForm1.N9Click(Sender: TObject); begin form5.showmodal; end;
procedure TForm1.ButtonRefleshClick(Sender: TObject); begin reflesh(map,1); end;
procedure TForm1.FormCreate(Sender: TObject); begin initmap(13,13,3,map); end;
end.
проект тот же но опять не работает
Эскизы прикрепленных изображений
Автор: hardcase 11.04.2006 21:27
Ничё-се скока кнопок! Как в тебя стока влезает-то! А если их всех в рантайме создать и потом Refresh немного упростить, т.е. прогнать всё в цикле. Подозреваю, у тебя глюки именно из-за такого нереального количества кнопок.
позже добавлено: вот и ошибочка - массив-то нада по ссылке передавать!
procedure initmap(x,y,z:integer; var map:Tmap); var i,j,k:integer; begin map:=nil; Setlength(map,x,y,z); for I:= 1 to x-1 do for j:= 1 to y-1 do for k:= 1 to z-1 do map[i, k, j]:='1';
end;
кроме того, у тебя при обновлении кнопок проиходит обращение к map[x+N,y+M,...] элементу. а если всего было 10 элементов, а x = 8, и N = 3? вот и обращение по индексу 11 - а его нету...
Автор: arhimag 12.04.2006 3:02
ой мерси, не заметил а у меня числа больше 100 будут так что енто не важно!
Автор: hardcase 12.04.2006 21:32
кроме того, 100 кнопок в дизайне создавать - это мрак. вот код, который добавляет 100 кнопок в рантайме:
type Tform1 = class(Tform) private button: array[1..10,1..10] of TButton; public procedure InitButtons(dLeft, dTop: integer); end; ... procedure TForm1.InitButtons(dLeft, dTop: integer); const BUTTON_SIZE = 25; DELTA = BUTTON_SIZE + 3; var i,j: integer; l,t: integer; begin l:=dLeft; for i:=1 to 10 do begin t:=dTop; for j:=1 to 10 do begin button[i,j]:=TButton.Create(Self); with button[i,j] do begin Left:=l; Top:=t; Width:=BUTTON_SIZE; Height:=BUTTON_SIZE; Caption:=''; Tag:=(word(i) shr 32) or j; // в верхнее слово пишем i, в нижнее - j Parent:=Self; //OnClick:=тыры-пыры end; inc(t,DELTA); end; inc(l,DELTA); end; end;
Автор: Digitalator 16.04.2006 21:29
Цитата
Tag:=(word(i) shr 32) or j; // в верхнее слово пишем i, в нижнее - j
слово 16 бит, и верхнее слово слева.
Tag := (i shl 16) or j; или для полного щастья Tag := (i shl 16) or (j and $0000FFFF);
Автор: hardcase 17.04.2006 0:15
Цитата(Digitalator @ 16.04.2006 17:29)
Tag := (i shl 16) or j; или для полного щастья Tag := (i shl 16) or (j and $0000FFFF);
Конечо. Я просто опечатался. А 32 бит - это у меня тут была запарка с интами 64 бита.