关于指针,急!(100大分)(100分)

  • 主题发起人 主题发起人 beta
  • 开始时间 开始时间
B

beta

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我写的一个关于指针的函数.目的是用指针模拟动态数组.
例如:setp(2,9,p);相当于:p[2]:=9;
编译通过,可是,除了1以外,以后全部都没有赋值(输出随机数):
...
type
point = ^nod;
nod = record
d:integer;
next:point;
end;
...
var
p:point;
...
procedure TForm1.setp(sn,sd:integer;var sp:point);
var
tsn:integer;
begin
tsn := sn;
if tsn = 1 then
begin
new(sp);
sp^.d := sd;
end
else
begin
dec(tsn);
setp(tsn,sd,sp^.next);
end;
end;

各位大虾请快点! mophy@188.net
 
仔细看看,你写的嵌套有问题
 
先指出这个毛病, Pointer是Delphi里预先定义的数据类型。最好不要重新
定义。可以这样: type PNod=^Nod;


 
hehe 真粗心 :-)
if tsn = 1 then
begin
new(sp);
sp^.d := sd;
end
难道不是1就不用New了吗?那链表怎么形成?
不知我说的对不对?
 
这句话挺危险的: setp(tsn,sd,sp^.next);

指针变量在new之前就被引用其某个域, 不出错算是走运。
 
这个问题我已经自己解决了,原来问题出再读取函数上,setp本身没有问题.
to starlyq
我写的潜逃哪里有问题?
to cheka
看清楚:我定义的是point不是pointer
to Crane
你看错了,我不是有一句dec(tsn)吗?就是说最终都会到达tsn=1

既然问题已经被我自己解决了,那,分?...
这样吧,换一个问题:

请各位句几个简单的例子,用于在windows内存中寻找指定的数值(integer),
找出内存地址即可.
 
>>请各位句几个简单的例子,用于在windows内存中寻找指定的数值(integer),

RreadProcessMemory
 
嘿嘿,我觉得这个嵌套也是有问题的,除非,你的sp的链表
是预先建好的,否则,sp可以为nil吧,你再用到你的程序中
看看。
 
to DreamTiger:
真的没有问题,我已经调试通过了,而且运行毫无问题.
因为我用了dec(tsn);因此tsn一定能够到达1,而只要tsn为1,
那么就一定有new(sp);和sp^.d := sd;即是说sp一定能够被
建立和赋值.就是这样!(这个问题现在我已经解决了,请关注我
后面所提出的问题,谢谢)

to cAkk:
我知道是用这个函数,我所要的是一个简单的<font color=red>例子</font>!
请继续讨论我的第二个问题:
<font color=red>简单的例子,用于在windows内存中寻找指定的数值(integer).</font>


beta(mophy@188.net)
 
都说到这个地步了, 例子你自己想吧,有什么问题再提问.
 
我还真就不信了。看看下面的例子,运行就出错。
Dec有什么用?
setp(tsn,sd,sp^.next);这里的sp=nil!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
point = ^nod;
nod = record
d:integer;
next:point;
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure setp(sn,sd:integer;var sp:point);
{ Private declarations }
public
{ Public declarations }
end;

var
p:point;
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
setp(9,1,p);
end;

procedure TForm1.setp(sn,sd:integer;var sp:point);
var
tsn:integer;
begin
tsn := sn;
if tsn = 1 then
begin
new(sp);
sp^.d := sd;
end
else
begin
dec(tsn);
setp(tsn,sd,sp^.next);
end;
end;

end.
 
to cAkk:
帮个忙吧,帮助文件上面有,可是参数一大堆,头都大了.

to DreamTiger:
你可真粗心,看看:
>type
> point = ^nod;
> nod = record
> d:integer;
> next:point;
> end;
看看你的next是定义的什么?point?你明明是用的nod!
改了试试.
 
呵呵,如果全部从你的文字中拷贝也错了的话,我真的是无话可说了。
type定义是拷贝你的;
setp函数是拷贝你的;
我写的只有一行:
setp(9,1,p);
拜托你自己好好比较一下我的程序跟你写的有什么不一样。
 
写递归程序很危险的一点是要注意结束的条件, 以及调用时的数据的合法性,
或者说多次调用后输入的数据是否还是预期的.

我把你的代码稍微改了一下, 修改的地方我加了>>:


procedure TForm1.setp(sn,sd:integer;var sp:point);
var
tsn:integer;
>> tempsp:point;
begin
>> if sp=nil then
>> exit;
>> tsn := sn;
>> if tsn = 1 then
if tn<=1 then
begin
>> {new(sp);}
sp^.d := sd;
end
else
begin
>> {dec(tsn);}
>> new(tempsp);
>> tempsp^.next:=nil;
>> {setp(tsn,sd,sp^.next)
}
>> setp(tsn-1, sd, tempsp);
>> sp^.next:=tempsp;
end;
end;


没具体测试过.

 
to DreamTiger:
Sorry,是我看错了.

你编译时之所以会出错,是因为用的不对,应该这样用:
for i := 1 to size do setp(i,i,p);
你还没有定义前8个值(前8个指针都没有建立),就定义第9个值,当然会出错.
因为我用的时候只会依次使用,因此就像这样定义的,没有考虑你那种用法.
(当然,稍做修改就可以那样用).

无论如何,指针的问题我已经自己解决了,请关注我的后一个问题,谢谢参与!

to all:
怎么没有人回答我的问题(后面一个),我可以加分.
 
The ReadProcessMemory function reads memory in a specified process. The entire area to be read must be accessible, or the operation fails.

BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process whose memory is read
LPCVOID lpBaseAddress,
// address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead
// address of number of bytes read
);

Parameters
hProcess
Handle to the process whose memory is being read. The handle must have PROCESS_VM_READ access to the process.
lpBaseAddress
Pointer to the base address in the specified process to be read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access. If this is the case, the function proceeds
otherwise, the function fails.
lpBuffer
Pointer to a buffer that receives the contents from the address space of the specified process.
nSize
Specifies the requested number of bytes to read from the specified process.
lpNumberOfBytesRead
Pointer to the actual number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored.
Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

The function fails if the requested read operation crosses into an area of the process that is inaccessible.

Remarks
ReadProcessMemory copies the data in the specified address range from the address space of the specified process into the specified buffer of the current process. Any process that has a handle with PROCESS_VM_READ access can call the function. The process whose address space is read is typically, but not necessarily, being debugged.

The entire area to be read must be accessible. If it is not, the function fails as noted previously.

有什么不明白的吗?
Mail to wrench@263.net

 
又:beta
上次我去重庆想和你联系,但未遂

下个月有点小事,想请你帮个忙,可以吗?
分好商量的说。

如有意,请Mail to wrench@263.net
 
wrench,谢谢你的帮助.
 
wrench,谢谢你的帮助.
能给一个具体的例子吗,一个语句就行(参数太多,头都大了)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
多人接受答案了。
 

Similar threads

后退
顶部