Главная страница
    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]

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


 
Anatoly Podgoretsky ©   (2010-05-05 08:56) [41]


> Лишь бы ограничение Дельфи на длину литерала не мешала.

Не мешает тем, кто слышал про знак плюс.


 
Lyonux ©   (2010-05-05 12:49) [42]

Простите, что вмешиваюсь в ваших интеллектуальный спор, но не вижу почвы для оного) Самый первый и, я считаю, самый замечательный коментарий:

> Демо ©   (01.05.10 23:39) [1]
> > Б   (01.05.10 23:23) Программно сформировать файл с кодом
> для заполнения массива, хатем воспользоваться {$INCLUDE
> <FileName>}


И сделать на OnCreate процедурку:

var i:byte;
begin
AssignFile(File,"FileName");
reset(File);
i:=1;
While not eof do
begin
read(File,x);
arr[i]:=x;
inc(i);
end;
CloseFile(File);
end;

где arr - массив, который вы заполняете специфическими символами из файла, который можно создать вручную или в  наскоро собранной программке)
Ура?


 
oldman ©   (2010-05-05 12:53) [43]


> Lyonux ©   (05.05.10 12:49) [42]


Чем формирование файла отличается от инициализации внутри кода, чего не хочет автор?
Ну лень ему потратить день на долбежку по клавушке...


 
brother ©   (2010-05-05 12:54) [44]

> Ну лень ему потратить день на долбежку по клавушке...

а придется, если только исходные данные уже не в файле ;)


 
Lyonux ©   (2010-05-05 13:00) [45]

какой, простите, чудной автор) Надо ему секретаршу заводить, для объявления "стапиццот" переменных вручную)


 
Б   (2010-05-07 13:17) [46]


> Германн ©   (05.05.10 02:01) [39]
>
> > Не правда ли лучше это сделать 1-2 строками, вылезающими
>
> > за поле видимости редактора кода, конечно?
>
> a[1]:=17;a[2]:=30;a[3]:=45; ...


Какой способ удобнее? ;D


Procedure XProc_1;
{$J+}
Const
 Arr: array [1..?] of LongWord = (X_CONST1, X_CONST2, X_CONST3, X_CONT4, X_CONT5,
 X_CONST6, X_CONST7, X_CONST8, X_CONT9, X_CONT10, ... // и т.д.
 )
{$J-}
begin
 Arr[32]:= 72;
End;

Procedure XProc_2;
Const
 Arr: array [1..?] of LongWord;
begin
 Arr[1]:= X_CONST1; Arr[2]:= X_CONST2; Arr[3]:= X_CONST3; Arr[4]:= X_CONT4; Arr[5] := X_CONT5;
 Arr[6]:= X_CONST6; Arr[7]:= X_CONST7; Arr[8]:= X_CONST8; Arr[9]:= X_CONT9; Arr[10]:= X_CONT10; //... и т.д.

 Arr[32]:= 72;
End;


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

А с чего это должно пугать? ;)


 
Б   (2010-05-07 13:18) [47]

> Procedure XProc_2;

Не const, а var.


 
Б   (2010-05-07 13:23) [48]


> Amoeba_   (04.05.10 23:49) [38]
> код его заполнения в отдельный модуль


См. выше.
Мозолит? ;D


> Lyonux ©   (05.05.10 12:49) [42]
> И сделать на OnCreate процедурку:


Нафига?
Если можно в коде прописать.


 
Sha ©   (2010-05-07 13:26) [49]

> Б   (07.05.10 13:17) [46]
> Какой способ удобнее?

удобнее

var
  Arr: array [1..?] of LongWord =

и не надо лохматить бабушку


 
Б   (2010-05-07 13:28) [50]


> oldman ©   (05.05.10 12:53) [43]
> Ну лень ему потратить день на долбежку по клавушке...


> Lyonux ©   (05.05.10 13:00) [45]
> какой, простите, чудной автор) Надо ему секретаршу заводить, для
> объявления "стапиццот" переменных вручную)

А причём тут сложность в заполнении массива?
Я такого не говорил.

> brother ©   (05.05.10 12:54) [44]
> а придется, если только исходные данные уже не в файле ;)

А в файл, по-твоему мнению, не нужно заполнять перед этим? ;)
Да и ещё писать загрузчик.


 
Б   (2010-05-07 13:32) [51]


> Sha ©   (07.05.10 13:26) [49]
> > Б   (07.05.10 13:17) [46]
> > Какой способ удобнее?
>
> удобнее


Почему?


 
Б   (2010-05-07 13:43) [52]


> Б   (07.05.10 13:28) [50]

> Да и ещё писать загрузчик.

И таскать лишний хлам.


 
Sha ©   (2010-05-07 13:59) [53]

> Б   (07.05.10 13:32) [51]
> Почему?

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


 
Омлет ©   (2010-05-07 14:19) [54]

Открываем glut.pas для OpenGL и видим, что там чайник прописан в виде массива координат:

 TeaData :
   Array[0..126, 0..2] of GLfloat =
   ( (   0.2,       0,     2.7),
     (   0.2,  -0.112,     2.7),
     ( 0.112,    -0.2,     2.7),
     (     0,    -0.2,     2.7),
     (1.3375,       0, 2.53125),
     (1.3375,  -0.749, 2.53125),
     ( 0.749, -1.3375, 2.53125),
     .....
     .....


 
Б   (2010-05-07 14:29) [55]


> Sha ©   (07.05.10 13:59) [53]


В D7 есть  и ладно.

> и говорит правду, никого не обманывая.

В чём обман?


 
Sha ©   (2010-05-07 14:38) [56]

В слове const и локальном расположении.
Это костыль для старых версий Delphi.


 
Б   (2010-05-07 14:50) [57]


> Sha ©   (07.05.10 14:38) [56]


Ну и что?
Массив используется однократно.
При этом не разносит код глоб. объявлениями - сгруппировывает.

P.S.
{$J+-}
Оч. удобная штука, кстати. ;)
Можно иногда сохранять прежние данные без лишних переменных.


 
Leonid Troyanovsky ©   (2010-05-07 15:44) [58]


> Б   (07.05.10 14:50) [57]

> {$J+-}
> Оч. удобная штука, кстати. ;)

Уподоблю оную конституции.

--
Regards, LVT.


 
Б   (2010-05-07 16:11) [59]


> Leonid Troyanovsky ©   (07.05.10 15:44) [58]


>
> Уподоблю оную конституции.


Не понял.


 
Anatoly Podgoretsky ©   (2010-05-07 16:32) [60]

> Б  (07.05.2010 16:11:59)  [59]

БЛЮ


 
Leonid Troyanovsky ©   (2010-05-07 16:49) [61]


> Б   (07.05.10 16:11) [59]

> Не понял.

С творчеством К. Пруткова знаком?

> Anatoly Podgoretsky ©   (07.05.10 16:32) [60]

> БЛЮ

Ммм...да, наверное :)

--
Regards, LVT.


 
Б   (2010-05-07 17:52) [62]


> Anatoly Podgoretsky ©   (07.05.10 16:32) [60]
> > Б  (07.05.2010 16:11:59)  [59]
>
> БЛЮ


Ты о чем?



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.067 c
2-1269287735
Сергей
2010-03-22 22:55
2010.08.27
Вращение объектов (шара вокруг своей оси)


2-1269192497
Мевилл
2010-03-21 20:28
2010.08.27
Индексы в delphi 2009


2-1273134658
noob_one
2010-05-06 12:30
2010.08.27
Какой функцией можно перевести "код" в #1050#1086#1076.


15-1274041793
Юрий
2010-05-17 00:29
2010.08.27
С днем рождения ! 17 мая 2010 понедельник


15-1264145710
Дмитрий С
2010-01-22 10:35
2010.08.27
Атмосфера увеличивается?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский