Вверх ↑
Этот топик читают: Гость
Ответов: 3889
Рейтинг: 362
#76: 2011-10-09 10:58:52 ЛС | профиль | цитата
Ещё раз обращаю внимание:
login писал(а):
под FPC не работает функция Copy(ar1, 0, Length(ar1))
1nd1g0 писал(а):
нумерация в динамических массивах относительная, то есть начинается с нуля.
1nd1g0 писал(а):
кое-кто объявляет массив размерностью по каждому измерению 4, а индексы указывает с 0 по 4 , то есть 5 элементов вместо 4-х.
1nd1g0 писал(а):
Copy(массив,0,High(массив))
То есть для динамического массива High = (Length - 1). Оно и не должно нормально работать.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#77: 2011-10-09 12:03:59 ЛС | профиль | цитата
Да, но не работает у Tad.
И я проверил отняв еденичку, всеравно слетает.

#pas
ar2 := Copy(ar1, 0, (Length(ar1)-1)); //Так?
------------ Дoбавленo в 12.03:
Подскажите, пожалуйста. Надо изменять длину и размер массива в FTCG:

#hws
func doSetLength(_data)
println('SetLength(', Array , ',',index1,');')
end

Но я не могу придумать как, динамически, получить, к примеру, такое:

#hws
println('SetLength(', Array , ',',index1,',',index2,');')
в результате:

#pas
SetLength(ar2, 0,0);

И такое:

#pas
SetLength(ar2[0,0], 0);

как подставлять дополнительные нули в квадратные скобки к массиву, и в функцию?
(нулей может быть до 20 штук.)
карма: 0

0
Ответов: 3889
Рейтинг: 362
#78: 2011-10-09 12:30:13 ЛС | профиль | цитата
login писал(а):
динамически, получить

Вероятно, как-то так (пока не могу проверить):

println('SetLength(', Array)
for(i = 1; i <= 20; i++)
print(',0')
end
print(');')
карма: 1

0
Ответов: 1429
Рейтинг: 50
#79: 2011-10-09 12:38:29 ЛС | профиль | цитата
1nd1g0, нет, возможно вы меня не поняли. Допустим в целевом коде Delphi есть функция

#pas
SetLength(ar2[6,30], 0);
И тут мне понадобилось, во время работы exe программы, поменять размер другому подмассиву (на другом уровне вложенности):

#pas
SetLength(ar2[6,30,7,8], 0);

Как это делается?


------------ Дoбавленo в 12.38:
Хотя, если честно, я не пойму как это сделать даже просто в IC.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#80: 2011-10-09 12:40:40 ЛС | профиль | цитата
login писал(а):
Как это делается?

Я подозреваю, что, в силу скомпилированности в машинный код, число операндов жёстко фиксированно и придётся предусматривать все варианты и делать ветвления, или читать дальше. Ещё есть идея попробовать работать с указателями, то есть передавать в SetLength некую переменную, в которую будем подставлять указатель на конкретный подмассив. Но на практике проверить не могу, допускает ли Delphi получение указателей на подмассивы. По идее - должен. Вы, кстати, подобную операцию уже провернули своим "ar2 := ar1" выше. Вот и шанс попробовать подставить в жёстко фиксированный SetLength (подставной_массив,переменная_размерности) "теневой" массив, полученный присвоением от целевого подмассива, и переменную размерности.

Надеюсь, я понятно объяснил идею. Сам на практике не могу пока проверить, пардон, но по самой сути указателей, должно, пожалуй, сработать. Правда, под FPC большой вопрос, так ли работают указатели на массивы и получается ли такой же "теневой" массив.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#81: 2011-10-09 12:45:45 ЛС | профиль | цитата
1nd1g0, спасибо, идею понял, но врядли справлюсь.
Про указатели почитаю.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#82: 2011-10-09 12:54:28 ЛС | профиль | цитата
login писал(а):
Про указатели почитаю
Это целесообразнее всего: похоже, "теневые" массивы получаются лишь при совпадении типов, иначе не даст присвоить, для Ваших целей оптимальнее всего попробовать, работает ли SetLength через указатели. Если работает, то и остальные функции вполне могут работать, а это позволить работать, например, с разными паттернами нотными листами одним и тем же участком кода. Правда, тут будет к месту сказать, что мы всё дальше уходим от HiAsm (И даже от ObjectPascal, всё ближе к нулевому уровню абстракции данных)
карма: 1

0
Ответов: 1429
Рейтинг: 50
#83: 2011-10-09 13:01:20 ЛС | профиль | цитата
[offtop]
1nd1g0 писал(а):
мы всё дальше уходим от HiAsm
этот большой мульти-массив - фундамент программы. "В коде" такие программы, пишут коллективом в 15 человек - по 6-7 лет. ) HiAsm это новое изобретение, оно просто еще не показало свою скорость разработки на больших проэктах, поскольку еще не все элементы есть, и не вся архитектура на FTCG.

[flood]в конце этой темы, будет что-то в роде

#pas

procedure asm_cycle;
label
lb;
var
d: integer;
begin
asm
mov ebx,0
mov d,0
lb:
add d,1
inc ebx
cmp ebx,10
jnz lb
mov ebx,0
end;
Writeln(d);
end;
[/flood]

[/offtop]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#84: 2011-10-09 13:37:41 ЛС | профиль | цитата
login писал(а):
большой мульти-массив - фундамент программы

Вам стоит задуматься о собственной структуре данных прямо в памяти. Такое впечатление, что массивы в этой версии компилятора плохо оптимизированы под Ваши задачи, особенно заметно это проявляется в нерегулируемости уровней их вложенности динамически. Самым целесообразным будет использование массива с заведомо избыточной размерностью, и тут может оказаться, что работа с большим фрагментом памяти и вычислением смещения внутри по формуле условного деления на секции, драматически обгонит массив по скорости работы и оперируемости.

login писал(а):
"В коде" такие программы, пишут коллективом в 15 человек - по 6-7 лет.

Не я ли это говорил Вам ранее? А чтобы HiAsm идеально подходил для целей написания таких программ Вам одному потребуется (15*7=105) вся жизнь. Другими словами, не был он рассчитан на создание приложений, ворочающих массивы данных в реальном времени с синхронизационной точностью до микросекунд.
[offtop]
login писал(а):
HiAsm это новое изобретение

Да ему уже лет 8, вроде. За эти годы сама жизнь чётко показала, какую нишу (утилит и скоростных прототипов приложений) занимает эта среда. При правильном планировании серьёзные приложения можно делать почти на чём угодно. Например, на моём новом ПК все ваши циклы прекрасно укладываются в 500 мкс с огромным запасом. Но объективной универсальности Вы не добьётесь. Как помню, там, где у меня 15% времени ЦП, у Вас - 99%. Хороший прототип, плохой финальный продукт.[/offtop]
карма: 1

0
Ответов: 1429
Рейтинг: 50
#85: 2011-10-09 13:55:09 ЛС | профиль | цитата
1nd1g0 писал(а):
вычислением смещения внутри по формуле условного деления на секции, драматически обгонит массив по скорости работы и оперируемости.
- проэкту смерть прийдет. Я, всетаки музыкант, а не инженер.

Может есть новые компиляторы delphi, где
1nd1g0 писал(а):
нерегулируемость уровней их вложенности
решена?


[offtop]
1nd1g0 писал(а):
сама жизнь чётко показала, какую нишу
- жизнь ошиблась Я не вижу никаких принципиальных ограничений у среды, относительно "в коде". Просто группа разработчиков изначально нацелилась на массовый рынок, и сделала акцент на, медленном, стандартном пакете. При других обстоятельствах могла бы нацелиться на профессиональный рынок и создать мощный пакет FTCG. Но сам принцип - новое изобретение.[/offtop]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#86: 2011-10-09 14:07:23 ЛС | профиль | цитата
[offtop]
login писал(а):
Я, всетаки музыкант, а не инженер.

А я, по-Вашему, кто
login писал(а):
Может есть новые компиляторы delphi

Если даже так, опять же, это уже не HiAsm
login писал(а):
группа разработчиков изначально нацелилась на массовый рынок, и сделала акцент на, медленном, стандартном пакете

Вы на собственном опыте не обратили внимания, что на FTCG применительно к ObjectPascal требуется заметно больше человеко-часов? А теперь представьте, что "группа разработчиков" - по сути, полтора человека, и, как я понимаю, FTCG появился уже после создания основной массы компонентов.
login писал(а):
Но сам принцип - новое изобретение.

Да нет, принцип старый как мир, просто удачное сочетание факторов, выходящих за рамки нашего обсуждения.[/offtop]
карма: 1

0
Ответов: 1429
Рейтинг: 50
#87: 2011-10-09 14:11:58 ЛС | профиль | цитата
1nd1g0 писал(а):
Если даже так, опять же, это уже не HiAsm
а разве можно не любой компилятор делфи к hiasm прикрутить?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#88: 2011-10-09 14:15:14 ЛС | профиль | цитата
login писал(а):
а разве можно не любой компилятор делфи к hiasm прикрутить?

Прикрутить можно, можно даже библиотеки новые к нему подкинуть, только потом Вам придётся в одиночку над этим всем Франкенасмом колдовать.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#89: 2011-10-09 14:20:08 ЛС | профиль | цитата
1nd1g0, я думал, компилятор это просто. Обновил и забыл.

Wiki писал(а):
Динамический массив объявляется без задания фиксированной длины. Такое объявление создает лишь указатель. Даже многомерный динамический массив создается в виде одного неинициализированного указателя.


остается понять как получить указатель на подмассив.
карма: 0

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#90: 2011-10-09 14:29:12 ЛС | профиль | цитата
login писал(а):
остается понять как получить указатель на подмассив

Используй типы, к примеру так

type
arr1 = array of integer;
parr = ^arr1;
arr2 = array of arr1;
parr2 = ^arr2;
arr3 = array of arr2;
parr3 = ^arr3;
Откуда у нас получается: arr1 -- одноуровневый массив, arr2 -- двухуровневый массив, arr3 - трехуровневый массив
карма: 22

1
Голосовали:login
Сообщение
...
Прикрепленные файлы
(файлы не залиты)