Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Инициализация массива.   Найти похожие ветки 

 
Б   (2010-05-01 23:23) [0]

Здрасти!

Имеется массив, нужно его при инициализцаии заполнить специфическими константами, не хочется прописывать
типа:


 Arr[1]:= 1;         // Для наглядности взяты числа.
 Arr[2]:= 2;
 Arr[3]:= 3;
 ...........


Вопрос в том, что массив получается глобальным, а надо его запихнуть в XProc, но там проинициализировать в ручную массив нельзя.


Var
 Arr: array [0..2] of LongWord = (1, 2, 3);  // На самом деле, массив гораздо
                                             // больше.
Procedure XProc;
begin
 Arr[1]:= 72;
End;


 
Демо ©   (2010-05-01 23:39) [1]


> Б   (01.05.10 23:23) 


Программно сформировать файл с кодом для заполнения массива, хатем воспользоваться {$INCLUDE <FileName>}


 
Германн ©   (2010-05-02 02:34) [2]


>
> Вопрос в том, что массив получается глобальным, а надо его
> запихнуть в XProc, но там проинициализировать в ручную массив
> нельзя.

Так в чём проблема? Или я чего-то не понимаю?


 
Vitalts   (2010-05-02 10:55) [3]


> Так в чём проблема? Или я чего-то не понимаю?

Видимо незнание автора топика о существовании циклов


 
Vitalts   (2010-05-02 10:59) [4]

Б,
http://yandex.ru/yandsearch?text=delphi+%D1%86%D0%B8%D0%BA%D0%BB%D1%8B&clid=14585&lr=179


 
Демо ©   (2010-05-02 12:50) [5]


> Vitalts   (02.05.10 10:55) [3]
> > Так в чём проблема? Или я чего-то не понимаю?Видимо незнание
> автора топика о существовании циклов


Не надо предполагать то, чего не знаешь.
Циклы имеют ограниченное применение.


 
Anatoly Podgoretsky ©   (2010-05-02 13:38) [6]

Ну и в чем же ограниченность применения в данном случае?


 
Б   (2010-05-02 14:29) [7]


> Германн ©   (02.05.10 02:34) [2]


Дык, инициализировать при объявления массивы в подпрограммах нельзя.


> Vitalts   (02.05.10 10:55) [3]


Так ведь массив заполняется спец. константами, самых разных значений,
 которые нельзя найти прогрессией в цикле. Об этом сказано в комментарии:

Arr[1]:= 1;         // Для наглядности взяты числа.


 
Демо ©   (2010-05-02 14:37) [8]


> Anatoly Podgoretsky ©   (02.05.10 13:38) [6]
> Ну и в чем же ограниченность применения в данном случае?
>



> Так ведь массив заполняется спец. константами, самых разных
> значений,  которые нельзя найти прогрессией в цикле. Об
> этом сказано в комментарии:


О чём и было сказано.

Блин, столько любителей не по сути вопроса советовать, а то, что они об этом думают.


 
sniknik ©   (2010-05-02 15:01) [9]

> Блин, столько любителей не по сути вопроса советовать, а то, что они об этом думают.
а сам уверен что ответил "по сути"? это вопросы так задают не то что нужно а то о чем думают нужно.

вариант
procedure TForm1.Button1Click(Sender: TObject);

 {$J+}
 procedure XProc;
 const
   Arr: array [0..2] of LongWord = (1, 2, 3); // На самом деле, массив гораздо
                                              // больше.
 begin
   Arr[1]:= 72;
 end;
 {$J-}

begin
 XProc;
end;


 
Б   (2010-05-02 15:08) [10]


> sniknik ©   (02.05.10 15:01) [9]


Спасибо!
Хотя сейчас только вспомнил, что константы могут вести себя как переменные.


 
sniknik ©   (2010-05-02 15:45) [11]

> Вопрос в том, что массив получается глобальным
...
> Спасибо!
не смущает, что массив по сути так и остался глобальным?


 
Б   (2010-05-02 19:20) [12]


> sniknik ©   (02.05.10 15:45) [11]


Да вроде бы нет:


Procedure XProc;
{$J+}
Const
 Arr: array [0..2] of LongWord = (1, 2, 3);
{$J-}
begin
 Arr[1]:= 72;
End;


 
sniknik ©   (2010-05-02 20:13) [13]

> Да вроде бы нет:
что нет? не смущает?


 
Б   (2010-05-02 20:22) [14]

Почему массив становится глобальным? Вроде бы нет.


 
sniknik ©   (2010-05-02 22:20) [15]

точно да. в хелпе так написано...


 
Игорь Шевченко ©   (2010-05-02 23:45) [16]


> Почему массив становится глобальным? Вроде бы нет.


потому что слово const.

потому что все изменения, сделанные в нем при первом вызове подпрограмы, будут видны при следующих вызовах.
Можешь проверить, это несложно.


 
Германн ©   (2010-05-03 01:42) [17]

Я уже и не помню с какой версии Борланд стал предупреждать о том, что типизированные константы могут более не поддерживаться и их не стоит использовать в новых проектах.


> Б   (02.05.10 19:20) [12]
>
>
> > sniknik ©   (02.05.10 15:45) [11]
>
>
> Да вроде бы нет:
>

Проверь Игорь Шевченко ©   (02.05.10 23:45) [16]

Ответ Демо ©   (01.05.10 23:39) [1] может помочь, если выкинуть из него бред. :)


 
Германн ©   (2010-05-03 02:08) [18]

Хотя фиг его знает, что может помочь ОРД.
Задача X озвучена. Задача Y вроде понятна. А вот задача Z...


 
Германн ©   (2010-05-03 02:20) [19]

Но инициализировать заново массив при входе в процедуру всё равно придётся делать ручками.


 
sniknik ©   (2010-05-03 09:58) [20]

> Задача X озвучена. Задача Y вроде понятна. А вот задача Z...
вот вот. всегда озвучивают то что они делают, проблемы на этом пути, а вот чего пытаются этим добиться, реальную задачу...

> Но инициализировать заново массив при входе в процедуру всё равно придётся делать ручками.
сложность прям неимоверная... ага
procedure TForm1.Button1Click(Sender: TObject);

 procedure XProc;
 type
   TArr = array [0..2] of LongWord;
 const
   MArr: TArr = (1, 2, 3);
 var
   Arr: TArr;
 begin
   Arr:= MArr;

   Arr[1]:= Arr[1] + 72;
 end;

begin
 XProc;
end;


 
Anatoly Podgoretsky ©   (2010-05-03 10:28) [21]

> sniknik  (03.05.2010 09:58:20)  [20]

А раз нужно инициализировать, то нафиг нужен константный массив.


 
sniknik ©   (2010-05-03 10:34) [22]

> то нафиг нужен константный массив.
для упрощения записи только, чтобы не писать кучу
 Arr[1]:= 1;
 Arr[2]:= 2;
 Arr[3]:= 3;
 ...

чего он не хочет. хотя, конечно, не проблема вынести эту инициализацию в отдельную процедуру, например, и писать будет один вызов процедуры...

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


 
Anatoly Podgoretsky ©   (2010-05-03 10:53) [23]

Это фобия


 
Демо ©   (2010-05-03 16:21) [24]


> Anatoly Podgoretsky ©   (03.05.10 10:53) [23]
> Это фоби


Да лень скорее.


 
Б   (2010-05-03 17:47) [25]

Удалено модератором
Примечание: Выражения выбираем, не в пивной


 
sniknik ©   (2010-05-03 18:05) [26]

> FSAA. Там нужно передавать большой заполненный константами массив аттрибутов.
тогда зачем изменять его в процедуре? константами значит константами, тут вообще проблем нет, заполняется в инициализации он легко, и неважно глобальный или локальный.


 
Б   (2010-05-03 18:23) [27]


> sniknik ©   (03.05.10 18:05) [26]


Про константы сказано в самом вопросе.
Массив нужно запихать в процедуру FSAA,  он только там и используется.  Чтобы глаза не мозолил.

> заполняется в инициализации он легко
Иниц. внутри процедуры как const, т.е. локально? Ну так это сделано.


 
Германн ©   (2010-05-04 01:45) [28]


> Иниц. внутри процедуры как const, т.е. локально? Ну так
> это сделано.

Теперь уже и задача X не понятна. Да и Y тоже :(


 
Б   (2010-05-04 14:22) [29]


> Германн ©   (04.05.10 01:45) [28]
>
> > Иниц. внутри процедуры как const, т.е. локально? Ну так
>
> > это сделано.
>
> Теперь уже и задача X не понятна. Да и Y тоже :(


Да я уже и не сомневался. ;D


 
Sha ©   (2010-05-04 14:55) [30]

> Б
> ...нужно его при инициализцаии заполнить специфическими константами...
> ...но там проинициализировать в ручную массив нельзя...

Что есть инициализация массива?


 
Anatoly Podgoretsky ©   (2010-05-04 15:12) [31]

> Sha  (04.05.2010 14:55:30)  [30]

И почему нельзя руками, ладно допустим, тогда пусть не руками инициализирует, а программно.
Темнит он что то и про задачу не хочет рассказывать


 
Б   (2010-05-04 17:26) [32]


> Sha ©   (04.05.10 14:55) [30]


> Что есть инициализация массива?


Заполнение массива НЕ в begin..end.  Т.е. в разделе var, но получается только для глобального массива, посоветовали либо в разделе const с директивой {$J+-} - всё получилось.


> Anatoly Podgoretsky ©   (04.05.10 15:12) [31]


> И почему нельзя руками, ладно допустим, тогда пусть не руками
> инициализирует, а программно.


Заполнение массива циклом не прогрессия. Об этом я уже сказал.

> Темнит он что то и про задачу не хочет рассказывать

Для FSAA - её ма ё, сказано же было уже.


 
Sha ©   (2010-05-04 18:08) [33]

>> Что есть инициализация массива?
> Заполнение массива НЕ в begin..end.

Ясно. Однако имей в виду, что не все могут так считать.

> в разделе var, но получается только для глобального массива,
> посоветовали либо в разделе const с директивой {$J+-} - всё получилось

Если ты думаешь, что при каждом входе в твою процедуру с {$J+-}
элементам массива будут присваиваться указанные значения,
то ты ошибаешься.

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

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


 
Б   (2010-05-04 18:24) [34]


> Sha ©   (04.05.10 18:08) [33]


Об этом уже предупредили:
Игорь Шевченко ©   (02.05.10 23:45) [16]
Но т.к. процедура вызывается всего 1 раз, то не страшно. ;)


 
Anatoly Podgoretsky ©   (2010-05-04 19:49) [35]

> Б  (04.05.2010 17:26:32)  [32]

А не надо прогрессии, так почему все таки нельзя

a[1] :=17
a[2] :=30

Я уже не говорю об других методах.

a[i] := b[i]


 
Б   (2010-05-04 22:15) [36]


> Anatoly Podgoretsky ©   (04.05.10 19:49) [35]


> А не надо прогрессии, так почему все таки нельзя
>
> a[1] :=17
> a[2] :=30


Опять 25...
В этом-то и заключается вопрос. Сократить код, чтобы в глаза не бросалось тупое заполнение массива на весь модуль...
Не правда ли лучше это сделать 1-2 строками, вылезающими за поле видимости редактора кода, конечно?


 
Anatoly Podgoretsky ©   (2010-05-04 22:36) [37]

Так тебе шашечки.


 
Amoeba_   (2010-05-04 23:49) [38]


> Сократить код, чтобы в глаза не бросалось тупое заполнение
> массива на весь модуль...

Я плакалЪ!

P.S. Вынеси объявление этого массива и код его заполнения в отдельный модуль и болльше его никогда не открывай в редакторе. И тогда "тупое заполнение массива на весь модуль" не будет бросаться в глаза.


 
Германн ©   (2010-05-05 02:01) [39]


> Не правда ли лучше это сделать 1-2 строками, вылезающими
> за поле видимости редактора кода, конечно?

a[1]:=17;a[2]:=30;a[3]:=45; ...

Можно и в одну строчку вместить раз тебя не пугает вылезание за "поле видимости редактора".
Лишь бы ограничение Дельфи на длину литерала не мешала.


 
Германн ©   (2010-05-05 02:36) [40]

Кстати. Даже если ты не знаешь термина "литерал", не пугайся.



Страницы: 1 2 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.053 c
15-1273579414
ixen
2010-05-11 16:03
2010.08.27
ExeCryptor и Firebird


15-1274300990
Юрий
2010-05-20 00:29
2010.08.27
С днем рождения ! 20 мая 2010 четверг


2-1267350234
Pavia
2010-02-28 12:43
2010.08.27
Отоброзить TStringList на экране.


11-1208152039
Barloggg
2008-04-14 09:47
2010.08.27
String + KOL не так прост как кажется?


2-1268726485
Boortwint
2010-03-16 11:01
2010.08.27
Нахождение "особого" элемента в массиве.