Загрузка констант из файла.

  • Автор темы Myc0n
  • Дата начала
M

Myc0n

#1
Народ, скажите, можно ли как нибудь загружать константы из файла?
И вообще, можно ли менять константы в уже откомпилированном файле?
 

VahaC

Well-known member
10.01.2007
116
0
#2
На то они и константы чтоб их значения никогда не изменялись
 
M

Myc0n

#3
Код:
const
b = 123
c = 456
d = 100500
e = 321
var aray: array[1..b] of integer;
Чет типа того, только там всего больше и все более запутано. Можно, конечно, переделать массив "aray" в динамический, а константы в переменные но там у меня гемора будет...
 
M

Myc0n

#4
Мне надо все значения, идущие после слова const сохранить в файл и чтобы при запуске программы они оттуда выгружались и становились на саое место.
 

sinkopa

Well-known member
17.06.2009
344
4
#5
Код:
const
b = 123
c = 456
d = 100500
e = 321
var aray: array[1..b] of integer;
Чет типа того, только там всего больше и все более запутано. Можно, конечно, переделать массив "aray" в динамический, а константы в переменные но там у меня гемора будет...
А никто легкой жизни не обещал... гемор - профессиональная болезнь программистов... ;)
Да, Delphi разрешает позволяет изменять значения констант... но только для констант типизированных (и ни в коем случае для истинных).
Код:
const
{$WRITEABLECONST ON} // Директива компилятора разрешает изменение значений констант (синоним {$J+})
b: Integer = 123; // Типизированная константа, значение можно поменять в коде программы 
{$WRITEABLECONST OFF} // Директива запрещает изменение значений для констант ниже
c: Integer = 456; // Типизированная константа, значение нельзя поменять в коде программы 
d = 100500; // Не типизированная (истинная константа). В коде доступна только для чтения.
Изменить значение типизированной константы ( b ) можно например так
Код:
//...
var
constCheck: Integer;
//...
implementation

uses IniFiles;

//...
initialization
if FileExists('c:\consts.ini') then
begin
with TIniFile.Create('c:\consts.ini') do
begin
constCheck := ReadInteger('consts','b',-1);
if (constCheck > 1) then b := constCheck;
Free;
end;
end;

end.
К сожалению изменить таким образом длину массива объявленного как статический
Код:
var aray: array[1..b] of integer;
не удастся... :( Потому как для статических массивов выделяемая память определяется на этапе компиляции.
Поэтому только через "гемор" как Вы выразились...
Вариант первый:
Код:
var aray: array of integer; // Объявляем массив как динамический
// после изменения константы ( b ) выставляем длину массива
SetLength(aray,b);
// Тогда в коде программы юзаем массив таким образом
for i := Low(aray) to High(aray) do
begin
// aray[i] bla bla что то делаем с элементом массива
end;
Вариант второй:
Код:
var aray: array[1..High(Word)] of Integer; // Объявляем массив как статический с заведомо большей (чем будет использоваться в коде) длиной
// Тогда после изменения константы ( b ) в коде программы юзаем массив таким образом
for i := 1 to b do
begin
// aray[i] bla bla что то делаем с элементом массива
end;
Ну... или жесткий вариант типа такого... ;)
Код:
// Пишем класс, который будет вести себя статический массив :-)
type
TtipaStaticArray = class
private
FLowInd: Integer;
FHighInd: Integer;
FData: array of Integer;
function Get(Index: Integer): Integer;
procedure Put(Index: Integer; const Value: Integer);
public
constructor Create(LowInd, HighInd:Integer);
destructor Destroy; override;
property Items[Index: Integer]: Integer read Get write Put; default;
property Low_: Integer read FLowInd;
property High_: Integer read FHighInd;
end;
//...
implementation

{ TtipaStaticArray }

constructor TtipaStaticArray.Create(LowInd, HighInd: Integer);
var
i: Integer;
begin
FLowInd := LowInd;
FHighInd := HighInd;
SetLength(FData,FHighInd-FLowInd+1);
for i := Low(FData) to High(FData) do
FData[i] := 0;
end;

destructor TtipaStaticArray.Destroy;
begin
SetLength(FData,0);
inherited;
end;

function TtipaStaticArray.Get(Index: Integer): Integer;
begin
Result := FData[Index-FLowInd];
end;

procedure TtipaStaticArray.Put(Index: Integer; const Value: Integer);
begin
FData[Index-FLowInd] := Value;
end;
Создаем экземпляр
Код:
 var
aray: TtipaStaticArray;
//...
aray := TtipaStaticArray.Create(1,b);
Юзаем
Код:
 for i := aray.Low_ to aray.High_ do
begin
// aray[i] bla bla что то делаем с элементом "типамассива"
end;

for i := 1 to b do
begin
// aray[i] bla bla что то делаем с элементом "типамассива"
end;
Можно и еще вариантов напридумывать... была бы фантазия и... гемороусидчивость :)
 
M

Myc0n

#6
Большое вам спасибо!
Похоже, гемороусидчивость мне сейчас понадобится. :)