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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать длину многомерного динамического массива, все внутри 
:(
    Опции темы
Norfonzor
Дата 9.4.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



объявил глобальный динамический массив в делфи, в процедуре 1 задал длину,      
 
setlength(mout1,n1,n2,n3); n1,n2,n3 могут быть любыми [от 1 до... )
во второй процедуре необходимо узнать n1 n2 n3, выводить их как глобальные переменные как-то туповато, инетересно понять как можно узнать длины через массив. это делается както чез length, High и Low. дак вот как??
n1=length(mout1[0])?
n2=length(mout1[1])?
n3=length(mout1[2])?
 smile 

Это сообщение отредактировал(а) Norfonzor - 9.4.2009, 08:39
PM MAIL   Вверх
bems
Дата 9.4.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Код

n1 := length(mout1);
n2 := length(mout1[0]);
n3 := length(mout1[0, 0]);



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Norfonzor
Дата 10.4.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



подскажите пожалуйста!

происходит следующее в процессе заполнения:
Код


setlength(mout1,1,1,1);
setlength(mout1,1,1,2);

setlength(mout1,1,2,1); // при этом стирается значение в (mout1,1,1,2) почему так происходит????
setlength(mout1,1,3,1);
setlength(mout1,1,3,2);
setlength(mout1,1,3,3);
setlength(mout1,1,3,4);

setlength(mout1,1,2,1);
setlength(mout1,1,2,2);
setlength(mout1,1,2,3);
setlength(mout1,1,3,1);

setlength(mout1,2,1,1);
setlength(mout1,2,1,2);
setlength(mout1,2,1,3);
...


Код


procedure TForm1.Button1Click(Sender: TObject);
var st:string;
konmass:ast1000;
RnomSt,Rfun,i:integer;
mas1,m1,m2:ast20;
Rbool:boolean;
n1f,n2f,n3f:integer;


begin

st:=edit1.Text;
Bstroka(st,konmass);

n1f:=1;
//repeat
while konmass[n1f]<>'' do
begin

 for i:=1 to 20 do mas1[i]:='';
 pravst(konmass[n1f],mas1);      
 n2f:=1;
 while mas1[n2f]<>'' do
 begin                          
  for i:=1 to 20 do
  begin
  m1[i]:='';
  m2[i]:='';
  end;
  vinos(mas1[n2f],m1,m2);

  n3f:=1;                      
  while m2[n3f]<>'' do
  begin
     showMessage('длина массива: ('+inttostr(n1f)+'|'+inttostr(n2f)+'|'+inttostr(n3f)+')');
     setlength(mout1,n1f,n2f,n3f);
     setlength(mout2,n1f,n2f,n3f);
     setlength(mout3,n1f,n2f,n3f);
     setlength(mout4,n1f,n2f,n3f);
     setlength(mout5,n1f,n2f,n3f);

     showMessage('m1['+inttostr(n3f)+']='+m1[n3f]+'');
     showMessage('m2['+inttostr(n3f)+']='+m2[n3f]+'');

   ////////////////////////
   //ПРИСВАИВАНИЕ знаков
     if m1[n3f]='*' then mout1[n1f-1,n2f-1,n3f-1]:=1 else
     if m1[n3f]='/' then mout1[n1f-1,n2f-1,n3f-1]:=2 else
     if m1[n3f]='+' then mout1[n1f-1,n2f-1,n3f-1]:=3 else
     if m1[n3f]='-' then mout1[n1f-1,n2f-1,n3f-1]:=4 else
     begin
     BBogFok:=false;
     showmessage('Ошика ввода error#3')
     end;
    //ПРИСВАИВАНИЕ остального

    razdelFun(m2[n3f],Rfun,Rbool,RnomSt);

     //showMessage('ЗАПИСЬ В МАССИВЫ!');

    mout3[n1f-1,n2f-1,n3f-1]:=rfun;
    mout4[n1f-1,n2f-1,n3f-1]:=rbool; if rbool then
    mout5[n1f-1,n2f-1,n3f-1]:=rnomst;
    
    n3f:=n3f+1;
  end;
 n2f:=n2f+1;
 end;
 n1f:=n1f+1;
end;


showMessage('END');
end;

function BBog_xy(x:real; y:real):real;
var p1,p2,p3,i,k,z:integer;
znach1,znach2,znach3:real;
FINsk:array[1..500]of real;

begin

for p1:=length(mout1) downto 1 do
begin
 for p2:=1 to length(mout1[p1-1]) do
 begin
  for p3:=1 to length(mout1[p1-1,p2-1]) do
  begin
   showMessage('('+inttostr(p1)+'/'+inttostr(p2)+'/'+inttostr(p3)+')');
 //не видит эл-ты массива больше p3>1, выводит (1,1,1) и сразу перескакивает на (1,2,1), хотя там есть эл-т (1,1,2), его запись происходит выше, это показывает showMessage('длина массива: что нужная  длина массива установлена
  end;//p3
 end;//p2
end;//p1

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

Код

procedure TForm1.Button1Click(Sender: TObject);
var
n1f,n2f,n3f:integer;
begin

n1f:=0;
repeat
 n1f:=n1f+1;
 n2f:=0;
 repeat
  n2f:=n2f+1;
  n3f:=0;
  repeat
  n3f:=n3f+1;
  setlength(mout1,n1f,n2f,n3f);
  mout1[n1f-1,n2f-1,n3f-1]:=1;
  showMessage('('+inttostr(n1f)+'/'+inttostr(n2f)+'/'+inttostr(n3f)+')'+#13+'m1='+inttostr(mout1[n1f-1,n2f-1,n3f-1])+'');
  until n3f=4;
 until n2f=3;
until n1f=2;

end;

procedure TForm1.Button2Click(Sender: TObject);
var n1f,n2f,n3f:integer;


begin

for n1f:=length(mout1) downto 1 do
begin
 for n2f:=1 to length(mout1[n1f-1]) do
 begin
  for n3f:=1 to length(mout1[n1f-1,n2f-1]) do
  begin
   showMessage('('+inttostr(n1f)+'/'+inttostr(n2f)+'/'+inttostr(n3f)+')'+#13+'m1='+inttostr(mout1[n1f-1,n2f-1,n3f-1])+'');
  end;//n3f;
 end;//n2f
end;//n1f
end;


мне нужна иерархическая структура массива, кол-во элементов добавляется в цикле, тк я первоначально не знаю сколько их будет, а делать массив [1.1000, 1..1000, 1..1000] не вариант, причем совсем не вариант 
ПОЖАЛУЙСТА ПОМОГИТЕ!!



Это сообщение отредактировал(а) Norfonzor - 10.4.2009, 17:03

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  _________2______.jpg 42,71 Kb
PM MAIL   Вверх
bems
Дата 10.4.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Norfonzor @  10.4.2009,  17:01 Найти цитируемый пост)
setlength(mout1,1,2,1); // при этом стирается значение в (mout1,1,1,2) почему так происходит????
этой строкой ты обрезаешь массив mount1[0, 0] до длины 1 (было 2) , и добавляешь к mount1[0] еще один элемент (у которого тоже длина 1)

Если тебе нужно просто добавить еще один элемент к mout1[1], то делай так:
Код

SetLength(mount1, 1, 2);
SetLength(mount1[0, 1], 1)


ну и еще почитай на форуме почему вредно много раз увеличивать длину массива малыми порциями. Нужно выделять с запасом, чтобы операции установки длины случались пореже


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Norfonzor
Дата 11.4.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



млин я не могу понять :(
ты можешь подсказать как в цикле будет это?
Код

n1f:=0;
repeat
while konmass[n1f]<>'' do
begin    
 n2f:=1;
 while mas1[n2f]<>'' do
 begin                          
   n3f:=1;                      
   while m2[n3f]<>'' do
   begin
     setlength(mout1,n1f,n2f,n3f);
     n3f:=n3f+1;
   end;
  n2f:=n2f+1;
 end;
 n1f:=n1f+1;
end;



PM MAIL   Вверх
bems
Дата 11.4.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



я не могу понять что ты хочешь


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Norfonzor
Дата 12.4.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ммм я разобрался с размерами, сделал вот так:
setlength(mout1,n1f);
setlength(mout1[n1f-1],n2f);
setlength(mout1[n1f-1,n2f-1],n3f);
не получалось из за минус единички )

тут еще один странный косяк не знаю в чем его сущность, вобщем забиваю массив mas1[i] (=array[1..20]of string;) забиваю его числами, буквами и когда в массив заношу "10" и проверяю в процедуре в процессе ее работы те значения которые она обрабатывает из масива mas1 через showMessage('mas1['+inttostr(n2f)+']='+mas1[n2f]+''); то "10" выводится в шоу меседж и нормально проходит обработку, когда я коментю шоу меседж //showMessage('mas1['+inttostr(n2f)+']='+mas1[n2f]+''); то "10" пропадает сама по себе из массива, и глюк случается только с числами кончающимися на "0":  10, 20, 110, 1010,  итд .....
 ПОЧЕМУ ТАК МОЖЕТ ПРОИСХОДИТЬ??  

ищу решение  smile 
        ищу решение  smile 
                 ищу решение  smile 

Это сообщение отредактировал(а) Norfonzor - 12.4.2009, 10:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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