Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > setlength проблема в процедуре


Автор: СЭНСЭЙ 18.3.2013, 21:35
Почем то в таком коде:
Код

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

begin

setlength(a,id);

end;


выдает ошибку - incompatible types;
причем ругается именно на массив a
в чем проблема?

Автор: Illusion Dolphin 18.3.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 . 

Автор: БелАмор 19.3.2013, 00:09
Небольшое дополнение:

Цитата(Illusion Dolphin @  18.3.2013,  22:46 Найти цитируемый пост)
type
  T = array of integer;

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

Код

type
  TIntegerDynArray      = array of Integer;


Автор: northener 19.3.2013, 00:51
Цитата(БелАмор @  19.3.2013,  00:09 Найти цитируемый пост)
Для большинства простых типов в модуле Types объявлены типы указателей и динамических массивов.
Логичнее пользоваться ими, а не объявлять каждый раз свои типы.
В частности, есть такой:

Модуль несколько больше, чем таблица умножения smile
Запомнить все те типы, которые объявлены в нём сложновато. Да и имхо незачем. Объявить свой тип гораздо лучше во многих случаях. Своему типу можно дать символическое имя, которое может многое рассказать о том, что это за тип и для чего он нужен. Ну а компилятору (как вы сами понимаете) разницы никакой.

Автор: bems 19.3.2013, 01:10
можно же юзать TArray<T>, зачем что-то запоминать или объявлять?

Автор: northener 19.3.2013, 01:21
Цитата(bems @  19.3.2013,  01:10 Найти цитируемый пост)
можно же юзать TArray<T>, зачем что-то запоминать или объявлять? 

Да. Но не все используют версии Дельфи, в которые введены дженерики. 

Автор: northener 19.3.2013, 01:46
Ну и вдобавок. 
Насколько я вижу И-нет вовсе не кишит примерами использования дженериков в поздних версиях Дельфи.

Автор: bems 19.3.2013, 04:58
Это результат падения популярности дельфи, к сожалению. Старые примеры со временем тиражируются, а новых появляется все меньше. Лично я после начального ковыряния в этой новой фиче определился с тем как ее использовать: я использую стандартные дженериковые типы и методы везде где это только возможно, и почти никогда не пишу своих дженериков.
Что касается того что многие используют старые версии дельфи, ну так есть и парни предпочитающие спать с семидесятилетними старухами, но не брать же с них пример smile

Автор: СЭНСЭЙ 19.3.2013, 14:13
короче мне принять как факт - что динамические массивы как параметры процедуры или функции нельзя передавать в виде описания типа
а передавать уже переменные типа.
Просто мне лично непонятно почему разработчики не заложили такую возможность, ибо нелогично получается.
Вот так не делай, а делай немного через задницу.

Добавлено через 7 минут и 21 секунду
Спасибо всем.
Незнаю как там насчет 70летней бабки,
но если я пишу прогу на 7м делфи то она работает на win 95/98/2000/XP/Vista/2007
и будет ли работать программа на всех версиях операционок МС написанная на новых версиях делфи - не уверен.
Не раз сталкивался что новые версии компиляторов неоправданно более требовательны к ресурсам.

Автор: northener 19.3.2013, 14:34
Цитата(СЭНСЭЙ @  19.3.2013,  14:13 Найти цитируемый пост)
Просто мне лично непонятно почему разработчики не заложили такую возможность, ибо нелогично получается.

Потому что эта ниша уже давно была занята открытыми массивами.

Автор: bems 20.3.2013, 00:40
Цитата(СЭНСЭЙ @  19.3.2013,  14:13 Найти цитируемый пост)
но если я пишу прогу на 7м делфи то она работает на win 95/98/2000/XP/Vista/2007
а что такое win2007?

Автор: northener 20.3.2013, 00:52
Цитата(СЭНСЭЙ @  19.3.2013,  14:13 Найти цитируемый пост)
и будет ли работать программа на всех версиях операционок МС написанная на новых версиях делфи - не уверен.

Будет. За очень редкими и ОЧЕНЬ маловероятными исключениями в виде Win95 в первоначальном варианте и ещё более ранних версий Windows.
И ещё за гораздо менее редкими искслючениями на Vista и старше (если программа, по вине её автора, не учитывает особенности этих ОС).

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

Автор: northener 20.3.2013, 01:12
Цитата(bems @  20.3.2013,  00:55 Найти цитируемый пост)
тут бы я не стал так уверенно говорить, помнится в 2010 в rtl уже где-то используются api-вызовы, не существующие в 95, 98 и даже (кажется) в 2k

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

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

Юмор понял и оценил. smile

Автор: DYUMON 20.3.2013, 06:43
делал софтину на delphi xe 2  она без проблемм работает на win 98

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)