Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Б   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.062 c
2-1267530370
Fr
2010-03-02 14:46
2010.08.27
компоненты в run-time


2-1271933283
rail
2010-04-22 14:48
2010.08.27
Запускной файл


11-1212343554
Сашик
2008-06-01 22:05
2010.08.27
OleVariant и OleObject в KOL Delphi 4


11-1221682651
siealex
2008-09-18 00:17
2010.08.27
KOL и Windows Mobile


2-1274513044
timekiller
2010-05-22 11:24
2010.08.27
TWebBrowser, Просмотр кода, Access Violation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский