Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#91: 2011-10-10 02:11:40 ЛС | профиль | цитата
еще не попробовал код nesco, но еше нашел вот такой, интересный, код.


#pas
type
TElementArray = array of array of Integer;
TPointerArray = array of array of Pointer; // Или array of array of PInteger

const
Nx = ...;
Ny = ...;
var
I, J: Integer;
Z: TElementArray;
ZL: TPointerArray;
begin
SetLength(Z, Nx, Ny);
... // Заполнение массива TElementArray
// Теперь устанавливаем длину массива указателей равной длине массива элементов...
SetLength(ZL, Nx, Ny);
// ...и присваиваем каждому элементу этого массива нужное значение --
// -- адрес соответствующего элемента в массиве Z
for I := 0 to Nx - 1 do
for J := 0 to Ny - 1 do
ZL[I, J] := @Z[I, J];
... // Массив ZL заполнен: теперь каждый его элемент представляет собой
... // указатель на соответствующий элемент массива Z
end.
(не, это не то)

------------ Дoбавленo в 01.03:
nesco, Похоже, что SetLength не работает с указателями.


#pas
unit HiAsmUnit;

interface

uses kol,Share,Debug;

type
THiAsmClass = class(TDebug)
private

public
out1:THI_Event;
procedure in1(var dt:TData;Index:Word);
end;

implementation

procedure THiAsmClass.in1;
type
arr1 = array of integer;
parr = ^arr1;
arr2 = array of arr1;
parr2 = ^arr2;
arr3 = array of arr2;
parr3 = ^arr3;
var
ar1: parr;
ar2: parr2;
ar3: parr3;
begin
// An array of 4 by 3 elements:
SetLength(ar1, 4);
// Use the array:
// ar1[0,0,0] := 5;
// ar1[0,1,0] := 7;
// ar1[2,0,0] := 200;
// ar1[3,2,0] := 1000;
// and so on...

//ar2 := ar1; // êîïèðóåì

//_hi_OnEvent(out1, ar1[3,2,0]);


end;

end.
------------ Дoбавленo в 01.47:
Так тоже не работает:

#pas
unit HiAsmUnit;

interface

uses kol,Share,Debug,windows;

type
THiAsmClass = class(TDebug)
private

public
out1:THI_Event;
procedure in1(var dt:TData;Index:Word);
end;

implementation

procedure THiAsmClass.in1;

var PData: PInteger;
DimMass: array of integer;

begin

SetLength(DimMass, 196);
PData:= @DimMass;


SetLength(PData^, 4);


end;

end.
Приядется 20 копий функций создавать.
Теперь буду проверять работает-ли Copy с указателями.
------------ Дoбавленo в 02.11:
login писал(а):
работает-ли Copy с указателями.
- работает.

Add(MainForm,16348082,98,98)
{
Width=308
}
Add(InlineCode,490725,217,98)
{
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|18: out1:THI_Event;|42: procedure in1(var dt:TData;Index:Word);|5: end;|0:|14:implementation|0:|26:procedure THiAsmClass.in1;|40:type arr = array of array of integer; |0:|4:var |11: ar1: arr;|11: ar2: arr;|14: i : integer;|18: parr: ^integer; |5:begin|32:// An array of 4 by 3 elements: |23: SetLength(ar1, 4, 3);|19: // Use the array:|16: ar1[0,0] := 5;|16: ar1[0,1] := 7;|18: ar1[2,0] := 200;|19: ar1[3,2] := 1000;|17: // and so on...|0:|45://_hi_OnEvent(out1, Length(ar1)); // длина|51://_hi_OnEvent(out1, Length(ar1[0])); // размерность|0:|110:SetLength(ar2, Length(ar1),Length(ar1[0])); // устанавливаем длину и размерность второго массива как у первого|0:|20:i := Length(ar1[0]);|11:parr := @i;|39:ar2 := Copy(ar1, 0, parr^); // копируем|0:|28:_hi_OnEvent(out1, ar2[0,0]);|0:|0:|4:end;|0:|4:end.|0:|0:|
link(out1,15938406:doAdd,[])
}
Add(Button,4071366,161,98)
{
Left=15
Top=30
Width=75
Height=185
Data=String(я строка из кнопки)
link(onClick,490725:in1,[])
}
Add(ListBox,15938406,273,98)
{
Left=105
Top=5
Width=190
Height=250
}

Но для Copy они не нужны, она и так с переменными работает
Вроде разобрался.
карма: 0

0
Ответов: 1429
Рейтинг: 50
#92: 2011-10-11 16:09:46 ЛС | профиль | цитата
Я радовался, что всё понял про массивы, не долго:


#hws
lang(arr:array)
lng.decl_priv_var(arr, 'array of array of array of array of array of integer')

println(result1, ':= Length(',Array,');') //- работает!
println(result1, ':= Length(',Array,'[0]);') //- работает!
println(result1, ':= Length(',Array,'[0,0]);') //- работает! (но при этом первые два затирает!!)
println(result1, ':= Length(',Array,'[0,0,0]);') //- работает! (но затирает первые три!!!)

Я как-то не правильно пишу эту функцию?

Код всего элемента:

#hws
func init()
lang (result1:int)
lng.decl_priv_var(result1,'integer')
end



func doWrite()
println('SetLength(', Array , ',',Project,',',Track,',',Item,',',Note,',7);')
end


func ProjectSize()
println(result1, ':= Length(',Array,');')
return(result1)
end

func TrackSize()
println(result1, ':= Length(',Array,'[0]);')
return(result1)
end

func ItemSize()
println(result1, ':= Length(',Array,'[0,0]);')
return(result1)
end

func NoteSize()
println(result1, ':= Length(',Array,'[0,0,0]);')
return(result1)
end


(этот элемент берет данные из нижних точек(NoteSize), и подставляет в верхние в функцию doWrite кабелем, это надо чтобы изменять размеры группами, допустим, были размеры 1,5,6,4, а стали 2,6,2,5)

Еще в Length(',Array,'[0,0,0]);') почему именно нули? Что будет если менять эти цифры. По работе массива я не смог это понять, "чехорда" какая-то.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#93: 2011-10-11 18:54:55 ЛС | профиль | цитата
login писал(а):
почему именно нули? Что будет если менять эти цифры

В смысле - почему? Вы указываете относительные координаты элемента в иерархии массивов. То есть "Отступая ноль от первого элемента основного массива выбрать этот элемент (подмассив с номером (1+0=1)), внутри него, отступая ноль от первого элемента (подподмассива), выбрать его, внутри отступить ноль от первого элемента (подподподмассива) и выдать его как результат выражения". Этот результат анализируется Lenghth() и она, в свою очередь, выдаёт длину проанализированного.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#94: 2011-10-12 07:52:47 ЛС | профиль | цитата
[offtop]вопрос снят.
по причине: надо было кешировать в memo.[/offtop]
------------ Дoбавленo в 07.52:
Подскажите. Я регистрирую переменную в первом элементе:

#hws
lang (result1:int)
lng.decl_priv_var(result1,'integer')
В Delphi она появляется так:

#pas
private
result17:integer;
Как я могу ее использовать в другом элементе? Если я указываю ее имя, то увеличивается индекс 17-18:

#pas
result18 := 1;
Как сделать чтобы индекс не увеличивался? Или чтобы можно было узнать первоначальный индекс 17?

Мне это нужно потому, что если на листе несколько одинаковых элементов, то получается вот такая куча одинаковых, бессмысленных, перемнных:

#pas
private
res5:real;
result16:integer;
result26:integer;
result36:integer;
result46:integer;
arr7:array of array of array of array of array of integer;
res11:real;
result112:integer;
result212:integer;
result312:integer;
result412:integer;
res16:real;
result117:integer;
result217:integer;
result317:integer;
result417:integer;
res21:real;
result122:integer;
result222:integer;
result322:integer;
result422:integer;
result124:integer;
result224:integer;
result324:integer;
result424:integer;
res29:real;
result130:integer;
result230:integer;
result330:integer;
result430:integer;
res35:real;
result136:integer;
result236:integer;
result336:integer;
result436:integer;
res41:real;
result142:integer;
result242:integer;
result342:integer;
result442:integer;
res47:real;
result148:integer;
result248:integer;
result348:integer;
result448:integer;
карма: 0

0
Ответов: 4664
Рейтинг: 767
#95: 2011-10-12 12:03:06 ЛС | профиль | цитата
Это не индекс увеличивается, а к "result1" присоединяется порядковый номер данного экземпляра компонента.
Согласно правилам, описанным в последнем абзаце Логические операторы
------------ Дoбавленo в 12.03:
В коде компонента этот индекс "7" хранится во встроенной переменной _id_, то-есть, "result17" - это 'result1'&_id_.
карма: 26

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#96: 2011-10-12 13:18:22 ЛС | профиль | цитата
Netspirit, спасибо.

Я создаю глобальную переменную gvar(ids)
Записываю в нее _id_.

В другом элементе вывожу так:

#hws
println('result1',ids,':= Length(',Array,');')

Cкажите, как вывести _id_ в код, без кавычек?

#pas
result1'7':= Length(arr7);



карма: 0

0
Ответов: 4664
Рейтинг: 767
#97: 2011-10-12 13:29:52 ЛС | профиль | цитата

#hws
ids = code(_id_)
карма: 26

0
Ответов: 1429
Рейтинг: 50
#98: 2011-10-12 13:51:59 ЛС | профиль | цитата
Netspirit, работает, но только первый раз в коде появляется это:

#pas
result1ids6:= Length(arr7);

А ниже, в коде, идут уже нормальные версии:

#pas
result17:= Length(arr7);

Может порядок инициализвции элементов не тот? Или могут быть другие причины?
карма: 0

0
Ответов: 4664
Рейтинг: 767
#99: 2011-10-12 13:55:13 ЛС | профиль | цитата
Да. На момент исполнения команды, выводящей первый фрагмент, ещё не было вызова gvar(ids).
карма: 26

0
Ответов: 1429
Рейтинг: 50
#100: 2011-10-12 13:58:28 ЛС | профиль | цитата
Netspirit, перенес инициализацию переменной в другой элемент - заработало!

Теперь надо понять как получить данные этой переменной как событие на точке, поскольку

#hws
func ProjectSize()
println('result1',ids,':= Length(',Array,');')
return(result1)
end
где return(result1) уже не возможен.
карма: 0

0
Ответов: 4664
Рейтинг: 767
#101: 2011-10-12 14:02:32 ЛС | профиль | цитата
Так?

#hws
return(code('result1'&ids))
карма: 26

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#102: 2011-10-12 14:05:59 ЛС | профиль | цитата
Netspirit, Работает !! Спасибо!!
карма: 0

0
102
Сообщение
...
Прикрепленные файлы
(файлы не залиты)