setlength проблема в процедуре

 
0
 
Delphi, Kylix & Pascal
ava
СЭНСЭЙ | 18.03.2013, 22:35
Почем то в таком коде:

procedure setlength_of_array(id:integer;var a:array of integer);

begin

setlength(a,id);

end;


выдает ошибку - incompatible types;
причем ругается именно на массив a
в чем проблема?
Kommentare (14)
ava
Illusion Dolphin | 18.03.2013, 21:46 #
Вот так будет работать:

type
  T = array of integer;
procedure setlength_of_array(id:integer;var a:T);
begin
setlength(a,id);
end;



В том виде, как есть, это вроде типа "Open array parameters" http://rvelthuis.de/articles/articles-openarr.html . 
ava
БелАмор | 19.03.2013, 00:09 #
Небольшое дополнение:

Цитата (Illusion Dolphin @  18.3.2013,  22:46 findReferencedText)
type
   T = array of integer;

Для большинства простых типов в модуле Types объявлены типы указателей и динамических массивов.
Логичнее пользоваться ими, а не объявлять каждый раз свои типы.
В частности, есть такой:


type
  TIntegerDynArray      = array of Integer;

ava
northener | 19.03.2013, 00:51 #
Цитата (БелАмор @  19.3.2013,  00:09 findReferencedText)
Для большинства простых типов в модуле Types объявлены типы указателей и динамических массивов.

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

В частности, есть такой:

Модуль несколько больше, чем таблица умножения smile
Запомнить все те типы, которые объявлены в нём сложновато. Да и имхо незачем. Объявить свой массив гораздо лучше во многих случаях. Своему массиву можно дать символическое имя, которое может многое рассказать о том, что это за массив и для чего он нужен. Ну а компилятору (как вы сами понимаете) разницы никакой.
ava
bems | 19.03.2013, 01:10 #
можно же юзать TArray<T>, зачем что-то запоминать или объявлять?
ava
northener | 19.03.2013, 01:21 #
Цитата (bems @  19.3.2013,  01:10 findReferencedText)
можно же юзать TArray<T>, зачем что-то запоминать или объявлять? 

Да. Но все используют версии Дельфи, в которые введены дженерики. 
ava
northener | 19.03.2013, 01:46 #
Ну и вдобавок.
Насколько я вижу И-нет вовсе не кишит примерами использования дженериков в поздних версиях Дельфи.
ava
bems | 19.03.2013, 04:58 #
Это результат падения популярности дельфи, к сожалению. Старые примеры со временем тиражируются, а новых появляется все меньше. Лично я после начального ковыряния в этой новой фиче определился с тем как ее использовать: я использую стандартные дженериковые типы и методы везде где это только возможно, и почти никогда не пишу своих дженериков.
Что касается того что многие используют старые версии дельфи, ну так есть и парни предпочитающие спать с семидесятилетними старухами, но не брать же с них пример smile
ava
СЭНСЭЙ | 19.03.2013, 14:13 #
короче мне принять как факт - что динамические массивы как параметры процедуры или функции нельзя передавать в виде описания типа
а передавать уже переменные типа.
Просто мне лично непонятно почему разработчики не заложили такую возможность, ибо нелогично получается.
Вот так не делай, а делай немного через задницу.
ava
northener | 19.03.2013, 14:34 #
Цитата (СЭНСЭЙ @  19.3.2013,  14:13 findReferencedText)
Просто мне лично непонятно почему разработчики не заложили такую возможность, ибо нелогично получается.

Потому что эта ниша уже давно была занята открытыми массивами.
ava
bems | 20.03.2013, 00:40 #
Цитата (СЭНСЭЙ @  19.3.2013,  14:13 findReferencedText)
но если я пишу прогу на 7м делфи то она работает на win 95/98/2000/XP/Vista/2007
а что такое win2007?
ava
northener | 20.03.2013, 00:52 #
Цитата (СЭНСЭЙ @  19.3.2013,  14:13 findReferencedText)
и будет ли работать программа на всех версиях операционок МС написанная на новых версиях делфи - не уверен.

Будет. За очень редкими и ОЧЕНЬ маловероятными исключениями в виде Win95 в первоначальном варианте и ещё более ранних версий Windows.
И ещё за гораздо менее редкими искслючениями на Vista и старше (если программа, по вине её автора, не учитывает особенности этих ОС).
ava
bems | 20.03.2013, 00:55 #
Цитата (northener @  20.3.2013,  00:52 findReferencedText)
Будет. За очень редкими и ОЧЕНЬ маловероятными исключениями в виде Win95 в первоначальном варианте и ещё более ранних версий Windows.
тут бы я не стал так уверенно говорить, помнится в 2010 в rtl уже где-то используются api-вызовы, не существующие в 95, 98 и даже (кажется) в 2k
но это же "спать со старухой чтобы иметь возможность спать с другими старухами" smile
ava
northener | 20.03.2013, 01:12 #
Цитата (bems @  20.3.2013,  00:55 findReferencedText)
тут бы я не стал так уверенно говорить, помнится в 2010 в rtl уже где-то используются api-вызовы, не существующие в 95, 98 и даже (кажется) в 2k

Возможно. Я не знаком с Д2009+.

Цитата (bems @  20.3.2013,  00:55 findReferencedText)
но это же "спать со старухой чтобы иметь возможность спать с другими старухами" smile

Юмор понял и оценил. smile
ava
DYUMON | 20.03.2013, 06:43 #
делал софтину на delphi xe 2  она без проблемм работает на win 98
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
advanced
Absenden