Форум: "Начинающим";
Текущий архив: 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