![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
2мерный стринговый массив
margel © (2004-11-07 22:20:00)Здравствуйте мастера!
Подскажите пожалуйста такой вопрос, как сделать такую вещь, создать 2х мерный массив, и наполнить его любыми стринговыми символами, а потом вернуть любой символ 2го столбца, относительно первого. Сколько не делаю, все ошибка в блоке таком то .. :(
Т.е.
function return_mass(a:integer): string;
var
i: integer;
mass: array of array of string;
begin
SetLength(mass, 2, 200);
for i:=1 to 200 do
begin
mass[1,i]:=IntToStr(i);
mass[2,i]:=IntToStr(Random(100))
end;
Result:=mass[2,a];
end;
procedure Tfm.Button1Click(Sender: TObject);
begin
Showmessage(return_mass(15));
end;
И еще, вопрос, из первого, как наполнить массив не в цикле, а в ручную, в теле этой же ф-и, т.е.
1 - 5455
2 - 9998
3 - 4566
4 - 6878
....
Тоже с этим разобраться не могу, в PHP это элементарно реализуется, а тут прямо, с 5 вечера сижу, 5й час :(
Заранее всем спасибо.
KilkennyCat (2004-11-08 11:41:00) [1]
> margel (08.11.04 11:35) [9]
конечно, можно. Просто объявить его глобально, а не в функции. Если же он вообще очень редко меняется, то имеет смысл его забить в файл данных или ресурс, а в программе предусмотреть только возможность изменения.
margel (2004-11-08 11:35:00) [2]KilkennyCat © (08.11.04 11:17)
Да, спасибо, но тут слова для теста, реально, слова другие и совсем без цифр. А вот вопрос, можно ли в функции отсавить только поиск в массиве, а сам массив вынести в др. место? Я бы вынес в OnCreate формы, но сам этот модуль реализован в отдельном юните, и OnCreate нет...
Сейчас получается, при каждом обр. к ф-и я определяю весь массив заново, хотя его достаточно вбить 1 раз, при загрузке приложения и все...
KilkennyCat (2004-11-08 11:17:00) [3]mass[1,1]:='ee1'; mass[2,1]:='rr1';
mass[1,2]:='ee2'; mass[2,2]:='rr2';
mass[1,3]:='ee3'; mass[2,3]:='rr3';
mass[1,100]:='ee100'; mass[2,100]:='rr100';
mass[1,177]:='ee177'; mass[2,177]:='rr177';
я бы это заменил на
for i := 1 to 1000 do begin
mass[1,i] := 'ee'+inttostr(i);
mass[2,i] := 'rr'+inttostr(i);
end;
margel (2004-11-08 11:10:00) [4]Спасибо за ответы!
Хочу сделать ф-ю, возвращающую одно значение, относительно другого. Т.е. есть "таблица", в 2 колонки. Строк до 1000 и чуть более.
Сейчас, с вашей помощью сделал так, и все работает, но реализация, конечно, оставляет желать лучшего :)
function return_mass(a:string): string;
var
i: integer;
mass: array[1..2,1..200] of string;
begin
mass[1,1]:='ee1'; mass[2,1]:='rr1';
mass[1,2]:='ee2'; mass[2,2]:='rr2';
mass[1,3]:='ee3'; mass[2,3]:='rr3';
mass[1,100]:='ee100'; mass[2,100]:='rr100';
mass[1,177]:='ee177'; mass[2,177]:='rr177'; //и так может до 1000 строк :(
for i:=1 to 200 do
if a=mass[1,i]
then
begin
Result:=mass[2,i];
break;
end
else
Result:='No return';
end;
procedure Tfm.Button1Click(Sender: TObject);
begin
Showmessage(return_mass('ee177')); //вернет "rr177"
end;
KilkennyCat (2004-11-07 22:37:00) [5]ну вот, опять опередили...
KilkennyCat (2004-11-07 22:36:00) [6]я бы не так делал.
1) если данные - цифры, пусть массив и будет integer, преобразование делать при уже дальнейшем использовании.
2) mass[1,i]:=IntToStr(i); - возможно, лишнее, если потом не подрезумевается перетасовка элементов массива, с сохранением информации о порядковом номере.
а ошибка простая - SetLength(mass, 2, 200) делает массив [0..1, 0..199]
GuAV (2004-11-07 22:33:00) [7]margel (07.11.04 22:20)
for i:=1 to 200 do
begin
mass[1,i]:=IntToStr(i);
mass[2,i]:=IntToStr(Random(100))
У дин массивов первый элемент 0.
Т.е.
0 to 1999
а лучше
Low(mass) to High(mass)
YurikGL (2004-11-07 22:27:00) [8]Кстати, у меня такое чувство, что TStringList тебе больше подойдет...
Какая задача стоит то?
YurikGL (2004-11-07 22:24:00) [9]
> margel (07.11.04 22:20)
Не проще
> mass: array of array of string;-> mass array[1..2,1..200] of string?
margel (2004-11-07 22:21:00) [10]Скажу ещё, массив обыкновенный, 2 столбика, и 200 строчек. (в данном примере)