san*_*ego 0 delphi exception access-violation delphi-xe2
我得到这个错误将调试一个项目,以前在Delphi 7中我已经升级到Delphi XE2,同样的错误发生在几种方法中.
First chance exception at $006DC660. Exception class $C0000005 with message 'access violation at 0x006dc660 read of address 0xffffffff'
Run Code Online (Sandbox Code Playgroud)
这是方法之一:
PFI = ^TFI;
TFI = record
Id : TToken;
Name : TName;
Parameters : string;
end;
function TListFI.IsIn(S: PChar): PFI;
function SearchName2(Item: PFI):Boolean;
var N1, N2: PChar;
begin
N1:= StrNew(Item^.Name);
N2:= StrNew(S); //Here is the issue
SearchName2:= (StrComp(StrUpper(N1), StrUpper(N2)) = 0);
StrDispose(N1);
StrDispose(N2);
end;
begin
IsIn:= PFI(FirstThat(@SearchName2));
end;
Run Code Online (Sandbox Code Playgroud)
我用google搜索,我发现有人描述了类似的问题,并且他确认当增量链接器被禁用时它可以工作,有人可以告诉我它是什么,在哪里或提供一些建议来解决这种情况.
[编辑]
删除@ now会在IsIn中给出以下错误:= PFI(FirstThat(SearchName2));
E2010 Incompatible types: 'TObject' and 'PFI'
Run Code Online (Sandbox Code Playgroud)
我正在添加FirstThat过程以查看它是否有帮助.
TFuncionColeccion = function (Elemento: TObject): Boolean;
function TColeccion.FirstThat (Rutina: TFuncionColeccion): TObject;
var
i: Integer;
begin
For i:=0 to Count-1 do
if Rutina(Items[i]) then
begin
FirstThat:=Items[i];
exit;
end;
FirstThat:=nil;
end;
Run Code Online (Sandbox Code Playgroud)
通过指针调用本地(嵌套)过程是(并且一直是)一个错误,这显然是你的FirstThat
函数所做的.编译器必须对堆栈执行特殊操作以调用本地函数并允许它们访问父作用域的变量(S
在代码中),但编译器只能在直接调用本地函数时知道这些特殊的东西.编译器无法知道参数FirstThat
将是一个本地函数,因此在FirstThat
调用指向函数时它不包含特殊代码.
底线是函数内部的堆栈没有按照预期的方式设置,这意味着可能出现任何数量的奇怪症状.你将不得不使用其他方式.也许make SearchName2
是一个双参数函数,然后写入FirstThat
接受S
作为一个参数,它可以转发到函数参数.
@
在构造函数指针时,您不需要使用运算符.当你这样做时,编译器倾向于跳过类型检查,这是允许你首先传递本地函数指针的原因FirstThat
.当你传递的函数真正匹配所需的原型时,编译器将允许你在没有@
运算符的情况下传递它.
归档时间: |
|
查看次数: |
7757 次 |
最近记录: |