S sunriverscj Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #1 如何改变已定义的常量的值。 我定义了一个整型常量,请问如何改变它的值。
N nicai_wgl Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #4 如果在程序要修改的值就定义成变量,然后赋初值,常量的值是不能改的。
F foxphone2003 Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #5 常量存在的意义就是不能被改变 如果你想改变,定义全局变量吧
S sunriverscj Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #6 我只知道字符常量可以修改,整型常量不知道怎么改。 主要是为了定义一个动态数组类型。 const a = 0; b = 9; type TDD = a..b; C = Array[TDD] of String; 如果在程序中可以修改整型变量,就可以改变数组了, Delphi 中是可以改变常量值的,这不是空虚来风的行为, 你们不知道就不要乱说,在网上查一下,不论是C/C++还是Delphi 都可以用特殊的方法来改变常量的值,只不过他们提供的方法有点问题而已。
我只知道字符常量可以修改,整型常量不知道怎么改。 主要是为了定义一个动态数组类型。 const a = 0; b = 9; type TDD = a..b; C = Array[TDD] of String; 如果在程序中可以修改整型变量,就可以改变数组了, Delphi 中是可以改变常量值的,这不是空虚来风的行为, 你们不知道就不要乱说,在网上查一下,不论是C/C++还是Delphi 都可以用特殊的方法来改变常量的值,只不过他们提供的方法有点问题而已。
I icc Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #7 Delphi 中是可以改变常量值的,这不是空虚来风的行为------ 就算可以,那也绝对不是值得借鉴的东西,更不是好的设计,坚持那么说的人都去死吧 你只是为了定义数据上下标方便就想到了修改常量的问题,路线就错了一半 为什么不这么写呢: C = Array of String; var C_Array : C; 需要的时候就给它 SetLengh,下标最小值为0,最大值为High(C_Array)
Delphi 中是可以改变常量值的,这不是空虚来风的行为------ 就算可以,那也绝对不是值得借鉴的东西,更不是好的设计,坚持那么说的人都去死吧 你只是为了定义数据上下标方便就想到了修改常量的问题,路线就错了一半 为什么不这么写呢: C = Array of String; var C_Array : C; 需要的时候就给它 SetLengh,下标最小值为0,最大值为High(C_Array)
S sunriverscj Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #8 你说的方法我知道,但是 我是为了能让函数的返回值可以返回一个动态数组。 const a = 0; b = 9; type TDD = a..b; C = Array[TDD] of String; function abc:C; begin end;
你说的方法我知道,但是 我是为了能让函数的返回值可以返回一个动态数组。 const a = 0; b = 9; type TDD = a..b; C = Array[TDD] of String; function abc:C; begin end;
W wr960204 Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-25 #9 {修改数字常量} procedure TForm2.Button1Click(Sender: TObject); label T; const A=$1000; var S:String; DDWORD; NewValueWORD; RWORD; 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 Pchar; NewValue:String; RWORD; begin // //字符串常量是跟在函数体后面代码段里面,Delphi编译器特有的 NewValue := 'BBBBBBBBBB?'; P := A //取到A的地址 //写内存 WriteProcessMemory(GetCurrentProcess(), P, Pchar(NewValue), Length(NewValue), R); {这里不能用A,否则将再在函数后面生成一个新的常量把地址给ShowMessage} ShowMessage(P); end;
{修改数字常量} procedure TForm2.Button1Click(Sender: TObject); label T; const A=$1000; var S:String; DDWORD; NewValueWORD; RWORD; 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 Pchar; NewValue:String; RWORD; begin // //字符串常量是跟在函数体后面代码段里面,Delphi编译器特有的 NewValue := 'BBBBBBBBBB?'; P := A //取到A的地址 //写内存 WriteProcessMemory(GetCurrentProcess(), P, Pchar(NewValue), Length(NewValue), R); {这里不能用A,否则将再在函数后面生成一个新的常量把地址给ShowMessage} ShowMessage(P); end;
S sunriverscj Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-26 #10 不能编译 mov D, offset T //取T的地址给D 这里报错
S sunriverscj Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-26 #11 运行此代码是可以出现ShowMessage 2000, 但是并不是真正意义上的改变常量的值, 如果直接ShowMessage(IntTohex(A,4)),结果还是1000
I icc Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-28 #13 function MyFunc(const ResultSav: C): Boolean; procedure MyProc(const ResultSav: C);
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2006-08-28 #15 Delphi语言可以将常量的地址赋给指针。我们可以对指针所指向的地址进行修改操作以达 到修改内存中的常量的目的。 const A:Integer=100 //整数常量 procedure TForm1.Button1Click(Sender: TObject); var PInteger; begin Caption:=IntToStr(A); P:=@A; P^:=P^+36 //利用指针进行间接修改 Button1.Caption:=IntToStr(A); end; 不过,我并不建议这样做——如果常量都变成变量了,整个程序可能会天下大乱。
Delphi语言可以将常量的地址赋给指针。我们可以对指针所指向的地址进行修改操作以达 到修改内存中的常量的目的。 const A:Integer=100 //整数常量 procedure TForm1.Button1Click(Sender: TObject); var PInteger; begin Caption:=IntToStr(A); P:=@A; P^:=P^+36 //利用指针进行间接修改 Button1.Caption:=IntToStr(A); end; 不过,我并不建议这样做——如果常量都变成变量了,整个程序可能会天下大乱。