如何改变已定义的常量的值(100分)

  • 主题发起人 主题发起人 sunriverscj
  • 开始时间 开始时间
S

sunriverscj

Unregistered / Unconfirmed
GUEST, unregistred user!
如何改变已定义的常量的值。
我定义了一个整型常量,请问如何改变它的值。
 
不能把它定义成变量吗?
 
你在哪里定义的就在哪里修改啊!这也要问啊?
 
如果在程序要修改的值就定义成变量,然后赋初值,常量的值是不能改的。
 
常量存在的意义就是不能被改变
如果你想改变,定义全局变量吧
 
我只知道字符常量可以修改,整型常量不知道怎么改。

主要是为了定义一个动态数组类型。
const
a = 0;
b = 9;
type
TDD = a..b;
C = Array[TDD] of String;

如果在程序中可以修改整型变量,就可以改变数组了,
Delphi 中是可以改变常量值的,这不是空虚来风的行为,
你们不知道就不要乱说,在网上查一下,不论是C/C++还是Delphi
都可以用特殊的方法来改变常量的值,只不过他们提供的方法有点问题而已。
 
Delphi 中是可以改变常量值的,这不是空虚来风的行为------

就算可以,那也绝对不是值得借鉴的东西,更不是好的设计,坚持那么说的人都去死吧

你只是为了定义数据上下标方便就想到了修改常量的问题,路线就错了一半

为什么不这么写呢:

C = Array of String;

var
C_Array : C;

需要的时候就给它 SetLengh,下标最小值为0,最大值为High(C_Array)
 
你说的方法我知道,但是
我是为了能让函数的返回值可以返回一个动态数组。
const
a = 0;
b = 9;
type
TDD = a..b;
C = Array[TDD] of String;



function abc:C;
begin

end;
 
{修改数字常量}
procedure TForm2.Button1Click(Sender: TObject);
label T;
const
A=$1000;
var
S:String;
D:PDWORD;
NewValue:DWORD;
R:DWORD;
begin
NewValue := $2000;
S := IntTohex(A,4);
{
上一行编译后形式如下
.....
Mov eax,$10000
call IntTohex
数字常量编译后是立即数.也就是直接把数字填写到该处.只能通过修改运行代码的方式修改
}
T:
asm
mov D, offset T  //取T的地址给D
end;
D := PDWORD(DWORD(D)-5)
//向前到call IntTohex的地址
Dec(D)
//再向前到$1000立即数的地址
//开始修改代码段内存,下次运行代码的时候就会变了
WriteProcessMemory(GetCurrentProcess(),
D,
@NewValue,
SizeOf(DWORD),
R);

ShowMessage(S);
end;


{修改字符串常量的例子}
procedure TForm2.Button2Click(Sender: TObject);
const
A = 'AAAAAAAAAA!';
var
P:Pchar;
NewValue:String;
R:DWORD;
begin
//
//字符串常量是跟在函数体后面代码段里面,Delphi编译器特有的
NewValue := 'BBBBBBBBBB?';
P := A
//取到A的地址
//写内存
WriteProcessMemory(GetCurrentProcess(),
P,
Pchar(NewValue),
Length(NewValue),
R);
{这里不能用A,否则将再在函数后面生成一个新的常量把地址给ShowMessage}
ShowMessage(P);
end;
 
不能编译
mov D, offset T  //取T的地址给D
这里报错
 
运行此代码是可以出现ShowMessage 2000, 但是并不是真正意义上的改变常量的值,
如果直接ShowMessage(IntTohex(A,4)),结果还是1000
 
function MyFunc(const ResultSav: C): Boolean;
procedure MyProc(const ResultSav: C);
 
多值返回一般不再使用原来的方式,一般在参数里
 
Delphi语言可以将常量的地址赋给指针。我们可以对指针所指向的地址进行修改操作以达
到修改内存中的常量的目的。

const
A:Integer=100
//整数常量

procedure TForm1.Button1Click(Sender: TObject);
var
P:PInteger;
begin
Caption:=IntToStr(A);
P:=@A;
P^:=P^+36
//利用指针进行间接修改
Button1.Caption:=IntToStr(A);
end;

不过,我并不建议这样做——如果常量都变成变量了,整个程序可能会天下大乱。
 
多人接受答案了。
 
不好意思,分错了
 
受之有匮啊!
 
后退
顶部