Вверх ↑
Этот топик читают: Гость
Ответов: 3889
Рейтинг: 362
#61: 2011-10-08 13:40:38 ЛС | профиль | цитата
... (пытаюсь воспроизвести)
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#62: 2011-10-08 13:59:14 ЛС | профиль | цитата
Похожая ситуация.
Анекдот писал(а):
Звонок в автосервис:
- Здравствуйте, меня зовут Света, и у меня розовый "ниссан". Мне что-то надо отремонтировать!
- Что именно?
- (Удивленно) Как ?! - Вы не знаете, что ремонтируют в розовом "ниссане" ?!?

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1429
Рейтинг: 50
#63: 2011-10-08 14:00:53 ЛС | профиль | цитата
Tad, извините, вот:

FTCG
code_25411.txt

Delphi
code_25412.txt

Ошибок компиляции нет, и программа работает, но данных нет на выходе точки.
карма: 0

0
файлы: 2code_25411.txt [772B] [195], code_25412.txt [2.4KB] [133]
Ответов: 3889
Рейтинг: 362
#64: 2011-10-08 18:58:04 ЛС | профиль | цитата
login писал(а):
Ошибок компиляции нет, и программа работает, но данных нет на выходе точки.

Пришлось немного изучить FTCG, создать пару новых компонент, воспроизвести Вашу ситуацию и выявить, что Вы у себя объявили переменную a не указав кодогенератору (не путать с компилятором) явно её тип. Если сделать второй строчкой вашего компонента
lang(a:int)
, то кодогенератор поймёт, каким способом сформировать событие с заведомо известным ему типом аргумента и подставит имя переменной без проблем:
  _hi_onEvent(THIFTCG_Tools(FParent).Events[0], a1);
.
карма: 1

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#65: 2011-10-08 21:28:42 ЛС | профиль | цитата
1nd1g0 писал(а):
Пришлось немного изучить FTCG, создать пару новых компонент, воспроизвести Вашу ситуацию и выявить
Спасибо.

Кодогенератор мне часто ругается "неопределенный идентификатор int", когда я ставлю тип переменной, он меня этим остал, и я стал невсегда ставить типы переменных.


карма: 0

0
Ответов: 3889
Рейтинг: 362
#66: 2011-10-08 22:23:01 ЛС | профиль | цитата
login писал(а):
"неопределенный идентификатор int"

Именно на объявления через lang()
карма: 1

0
Ответов: 1429
Рейтинг: 50
#67: 2011-10-08 23:08:06 ЛС | профиль | цитата
1nd1g0, нет, именно на другие, внутренние, а на lang как раз и небыло.
------------ Дoбавленo в 23.08:
[offtop]Вложенность массива, для моей проги вышла, приличная
Уровни массива, в квадратных скобках, array[0,0,0,...n] такие:
1. проэкт
2. номер свойства
3. Трек
4. номер свойства
5. Item
6. номер свойства
7. нота
8. номер свойства

[/offtop]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#68: 2011-10-08 23:40:16 ЛС | профиль | цитата
login писал(а):
на lang как раз и небыло.

А на lang как раз тип объявлять жизненно важно, т.к. по нему и только по нему кодогенератор решает, какой код создавать для конкретно этой переменной при выдаче её "наружу" (личные наблюдения). Иногда даже ставит конвертацию типов сам. Если не укажете, либо укажете неправильно, начинают вылезать проблемы вроде Вашей. Ещё я заметил, что, похоже, тип можно динамически менять и про это ни слова в документации. Документация вообще больное место.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#69: 2011-10-09 01:13:53 ЛС | профиль | цитата
[offtop]
1nd1g0 писал(а):
тип можно динамически менять
любопытно.
1nd1g0 писал(а):
Документация
, да, уж.
Я создал html страницу, на которую скопировал всю информацию по FTCG какая у меня есть. И ищу поиском по странице, очень удобно.[/offtop]
------------ Дoбавленo в 01.13:
Коллеги, я случайно онаружил причину, по которой не работало в IC: ar2 := ar1 под делфи и глючило под FPC.

Вот нерабочая:


Add(MainForm,15367882,119,98)
{
Width=308
}
Add(InlineCode,490725,280,98)
{
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|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;|4:var |33: ar1: array of array of integer;|33: ar2: array of array of integer;|5:begin|32:// An array of 4 by 4 elements: |23: SetLength(ar1, 4, 4);|19: // Use the array:|16: ar1[0,0] := 5;|16: ar1[0,1] := 7;|18: ar1[2,0] := 200;|17: // and so on...|28:_hi_OnEvent(out1, ar1[0,0]);|28:_hi_OnEvent(out1, ar1[0,1]);|28:_hi_OnEvent(out1, ar1[2,0]);|0:|0:|12:ar2 := ar1; |28:_hi_OnEvent(out1, ar2[0,0]);|0:|4:end;|0:|4:end.|0:|0:|0:|0:|
link(out1,15938406:doAdd,[])
}
Add(Button,4071366,224,98)
{
Left=15
Top=30
Width=75
Height=185
Data=String(я строка из кнопки)
link(onClick,490725:in1,[])
}
Add(ListBox,15938406,336,98)
{
Left=105
Top=5
Width=190
Height=250
}



Вот рабочая в обоих компиляторах:

Add(MainForm,15367882,119,98)
{
Width=308
}
Add(InlineCode,490725,280,98)
{
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|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; |4:var |11: ar1: arr;|12: ar2: arr; |5:begin|32:// An array of 4 by 4 elements: |23: SetLength(ar1, 4, 4);|19: // Use the array:|16: ar1[0,0] := 5;|16: ar1[0,1] := 7;|18: ar1[2,0] := 200;|17: // and so on...|28:_hi_OnEvent(out1, ar1[0,0]);|28:_hi_OnEvent(out1, ar1[0,1]);|28:_hi_OnEvent(out1, ar1[2,0]);|0:|0:|12:ar2 := ar1; |28:_hi_OnEvent(out1, ar2[0,0]);|0:|4:end;|0:|4:end.|0:|0:|0:|0:|
link(out1,15938406:doAdd,[])
}
Add(Button,4071366,224,98)
{
Left=15
Top=30
Width=75
Height=185
Data=String(я строка из кнопки)
link(onClick,490725:in1,[])
}
Add(ListBox,15938406,336,98)
{
Left=105
Top=5
Width=190
Height=250
}


Причина была в том, что надо было обьявлять тип переменной один на двоих(как сделал Tad). Хотя я не понимаю почему это так критично.

А у Tad не работал его универсальный вариант, потому, что под FPC не работает функция Copy(ar1, 0, Length(ar1)) При этом ar2 := ar1 - работает.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#70: 2011-10-09 01:30:40 ЛС | профиль | цитата
login писал(а):
тип переменной один на двоих

Вероятно, после такого объявления и компиляции используются одни и те же процедуры инициализации и обработки. При раздельном объявлении они считаются разными, потенциально взаимно не совместимыми типами.
------------ Дoбавленo в 01.30:
login писал(а):
ar2 := ar1

А Вы попробуйте теперь начать изменять первый массив, если второй тоже начнёт меняться, хотя в него ничего не копировали, значит у Вас просто сравнялись указатели(а не сами массивы) и придётся попробовать приписать ^ к именам массивов при операциях.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#71: 2011-10-09 01:36:11 ЛС | профиль | цитата
1nd1g0, Да, меняется и второй. А как делать чтобы не менялось?

Add(MainForm,16348082,133,98)
{
Width=308
}
Add(InlineCode,490725,252,98)
{
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|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;|49:type arr = array of array of array of integer; |0:|4:var |11: ar1: arr;|12: ar2: arr; |5:begin|32:// An array of 4 by 3 elements: |26: SetLength(ar1, 4, 3, 5);|19: // Use the array:|18: ar1[0,0,0] := 5;|18: ar1[0,1,0] := 7;|20: ar1[2,0,0] := 200;|21: ar1[3,2,0] := 1000;|17: // and so on...|0:|23:ar2 := ar1; // копируем|0:|30:_hi_OnEvent(out1, ar2[0,0,0]);|0:|24:ar1[0,0,0] := 555555555;|0:|30:_hi_OnEvent(out1, ar2[0,0,0]);|0:|0:|4:end;|0:|4:end.|0:|
link(out1,15938406:doAdd,[])
}
Add(Button,4071366,196,98)
{
Left=15
Top=30
Width=75
Height=185
Data=String(я строка из кнопки)
link(onClick,490725:in1,[])
}
Add(ListBox,15938406,308,98)
{
Left=105
Top=5
Width=190
Height=250
}


к чему бы я не приписывал ^, не компилируется.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#72: 2011-10-09 01:51:01 ЛС | профиль | цитата
login писал(а):
как делать чтобы не менялось?

Да похоже, что в этой версии компилятора без Copy не обойтись. По крайней мере, разыменование ^ нам тут не помогает. Если бы я не сомневался, что тут массивы занимают непрерывные области памяти, я бы поступил как в машинных кодах - выяснил указатели на массивы, их границы, и скопировал блок памяти. Но тут массивы реализованы в объектной модели и могут содержать всевозможные типы, а потому с ними желательно работать средствами самой среды.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#73: 2011-10-09 01:55:25 ЛС | профиль | цитата
[flood]
1nd1g0 писал(а):
При раздельном объявлении они считаются разными, потенциально взаимно не совместимыми типами.
Штаб-квартира Borland
[/flood]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#74: 2011-10-09 02:10:45 ЛС | профиль | цитата
login, с запретом прямого присвоения массивов их можно понять: не известно какой размерности будут (динамические!) один и второй массив на момент копирования, даже если объявлены похоже. Каждый подмассив, в свою очередь, тоже может менять размерность. Легко такое не скопируешь, это же компилируемый язык, а не интерпретируемый скрипт, ситуации неопределённости возлагаются на плечи программиста. А вот на кой ляд разрешать взаимное присвоение указателей при работе с массивами - действительно тайна великая есть(видать, массивы тут расцениваются как типизированные указатели). Самое интересное, после "потери" адреса своего старого содержимого, если его никуда не сохранили, массиву прежние значения будет, похоже, не вернуть. И это ещё большой вопрос, очищается ли область памяти после такого присвоения, или так и остаётся "висеть", неучтённая. Можно интереса ради попробовать поиграться с указателями, по идее.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#75: 2011-10-09 02:20:46 ЛС | профиль | цитата
1nd1g0, согласен.
Во флуде я написал именно про разницу в интерфейсе присвоения одинакового типа группой, или каждой переменной отдельно. Это на мой взгляд колумбийский косяк.

[flood]А к стати, по этой модели пишется музыка http://ru.wikipedia.org/wiki/RUP[/flood]
карма: 0

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