这似乎是世界上最简单的东西,我已经准备好把头发拉过来了.
我有一个看起来像这样的单位;
Unit myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;
const
//bunch of constants
var
//bunch of vars including
myCounter:integer;
Implementation
Uses //(all my uses)
// All of my procedures including
Procedure myProcedure;
try
// load items from file to TListBox - this all works
except
on EReadError do begin
// handle exception
end;
end; //try
myCounter:=0; // <-- ACCESS VIOLATION HERE
while myCounter //...etc
Run Code Online (Sandbox Code Playgroud)
这是一个变量的简单分配,我不知道它为什么这样做.我已经尝试将该变量本地的变量声明到整个过程 - 无论我在哪里尝试这样做,我都不能在这个过程中向任何地方声明的整数赋值为0,而不会抛出访问权限违反.我完全难过了.
我从同一个单元内的按钮OnClick处理程序中调用该过程,但无论我从哪里调用它都会引发异常.疯狂的是,我在整个程序中的十几个其他地方做同样的事情没有问题.为什么在这?我完全失去了.
The following code generates an exception (c0000005 ACCESS_VIOLATION) in Delphi 10.3.1 only when compiled to 64-bit.
However, the same code does not generate an exception in Delphi 10.3.1 when compiled to 32 bits. Also, it does not fail in Delphi 10.2.3 when compiled to either 32 bits or 64 bits.
program CrashOn64;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TMyBaseClass = class
protected
procedure Setup(aParams: array of const); virtual;
public
end;
type
TMyWorkClass = class(TMyBaseClass)
protected
procedure DoSetup; virtual;
public …Run Code Online (Sandbox Code Playgroud) Windows 中的这段简单代码会导致gethostbyname.
#include <stdio.h>
#include <winsock.h>
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
hostent* he = gethostbyname("www.stackoverflow.com");
char* ip = inet_ntoa(*(struct in_addr*)he->h_addr_list[0]);
printf(ip);
}
Run Code Online (Sandbox Code Playgroud)
它说:
onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!00007FFCFC1FC759: (caller: 00007FFD2856388E) LogHr(1) tid(6e14) 8007277C No such service is known. The service cannot be found in the specified name space.
Run Code Online (Sandbox Code Playgroud)
我在 Windows 上。使用 Visual Studio 2019。我怎么能忽略它呢?目前,我正在调试,因为我的日志完全充满了此消息,所以很难找到所需的日志。
我有跟踪扫描文档,上面有徽标,我有另一张黑白图像,标识和样式相同(下面以黑白色显示).
如何确保此图像上是否存在徽标?

通常我会有很多扫描文件,OCR会拾取MTNL,但有时这些徽标只是由OCR无法识别的符号组成.
徽标的大小和位置发生变化,它们不会多次修复.它们可以放在文档的任何位置.
我想根据存在的徽标和符号组织和编目扫描图像.大多数文件可能是也可能不是英文,可能包含也可能不包含任何条形码,在这种情况下,徽标匹配会有所帮助.
我见过Aforge.NET库,但我不太确定要将哪些方法组合起来进行搜索.如果源目标具有不同的大小,则像素搜索非常慢并且失败.
我听说YouTube会进行某种直方图或热门签名匹配,以查看该视频是否包含任何受版权保护的内容.如果有人能在这种情况下指导我,我会很有帮助.
我理想的选择是C#和Aforge.NET,否则一些命令行工具将不胜感激.
c# pattern-recognition image-processing pattern-matching aforge
我已设法将此问题减少到此:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Threading;
procedure Foo(AString: string);
var
LTask : ITask;
capturedString : string;
procedure Nested;
begin
try
WriteLn('Nested : ' + capturedString); { ! EIntOverflow (Win32) here }
except on E : Exception do
WriteLn(E.Message);
end;
end;
begin
capturedString := AString;
WriteLn('Local : ' + capturedString);
Nested;
LTask := TTask.Create(
procedure
procedure AnonNested;
begin
WriteLn(capturedString); { Removing this eliminates the problem }
end;
begin
end);
end;
begin
Foo('foo');
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
capturedString从嵌套方法中访问变量时,变量会被破坏.一个Win32编译加薪EIntOverflow,一个Win64的编译写出一个(腐败)空字符串-无论是构建可以挑起到AV或其他异常的一些操作,但是在所有情况下,参照本地变量进入时被破坏Nested …
经过很长一段时间的C工作后,我回到Delphi,发现Delphi中有一些新东西.一个是NativeInt.
令我惊讶的是,我发现Delphi和C处理x86-64不同的"原生整数" 1种类型.Delphi NativeInt似乎表现得像C void*和Delphi Pointer,这与我对名称的期望相反.
在Delphi中,NativeInt的大小为64位.代码中表示:
SizeOf(NativeInt) = SizeOf(Pointer) = SizeOf(Int64) = 8
Run Code Online (Sandbox Code Playgroud)
C只有64位指针.int仍然是32位.代码2中表示:
sizeof(int) == 4 != sizeof(void *) == 8
Run Code Online (Sandbox Code Playgroud)
甚至Free Pascal编译器3也同意NativeInt的大小.
为什么Delphi NativeInt选择64位,C int选择32位?
当然,根据语言文档/规范,两者都是有效的.但是,"语言允许它"并不是一个真正有用的答案.
我想这与执行速度有关,因为这是今天C的主要卖点.维基百科和其他消息来源都说x86-64确实有64位操作数寄存器.但是,它们还声明默认操作数大小为32位.因此,与32位操作数相比,64位操作数的操作可能更慢?或者64位寄存器可以同时执行2个32位操作?这是一个原因吗?
编译器的创建者是否确实选择了这些尺寸?
这再现了问题:
program Project1;
{$APPTYPE CONSOLE}
uses
Generics.Collections;
type
TStringRec = record
s1 : string;
s2 : string;
end;
TGetHash<TKey,TValue> = class(TEnumerable<TPair<TKey,TValue>>)
public
type
TItem = record
HashCode: Integer;
Key: TKey;
Value: TValue;
end;
TItemArray = array of TItem;
public
FItems: TItemArray;
end;
var
LCrossRef : TDictionary<TStringRec, integer>;
LRec : TStringRec;
i : integer;
begin
LCrossRef := TDictionary<TStringRec, integer>.Create();
LRec.s1 := 'test1';
LRec.s2 := 'test2';
LCrossRef.Add(LRec, 1);
LRec.s1 := 'test1';
LRec.s2 := 'test2';
if LCrossRef.TryGetValue(LRec, i) then begin
writeln('ok');
end else …Run Code Online (Sandbox Code Playgroud) 在Delphi中,您可以执行以下操作:
TArray = array[1..3] of byte;
Run Code Online (Sandbox Code Playgroud)
然后你可以在哪里申报
T2Array = array[1..3] of TArray
Run Code Online (Sandbox Code Playgroud)
ad nauseum ...
.NET中是否存在类似的内容?(vb,c#,无论如何)
我目前正在做这样的事情
Private LotsOfData As ObservableCollection(Of ObservableCollection(Of myClass))
Run Code Online (Sandbox Code Playgroud)
但是想做
Private LotsOfData As ObservableCollection(Of myType)
Run Code Online (Sandbox Code Playgroud)
哪里
myType --> ObservableCollection(Of myClass)
Run Code Online (Sandbox Code Playgroud)
我知道你可以用结构做到这一点,即:
Public Structure MyType
Public myOc as ObservableCollection(Of MyClass)
End Structure
Dim LotsOfData as ObservableCollection(of MyType)
Run Code Online (Sandbox Code Playgroud)
但是你必须引用它(例如)
LotsOfData.Last.myOc(i)
Run Code Online (Sandbox Code Playgroud)
代替
LotsOfData.Last(i)
Run Code Online (Sandbox Code Playgroud)
这看起来很笨拙.这看起来也很笨拙:
For Each Data as ObservableCollection(of myClass) in LotsOfData
DoSomething(Data)
Next
Run Code Online (Sandbox Code Playgroud)
同样如此
For Each Data as MyType in LotsOfData
DoSomething(Data.myOc)
Next
Run Code Online (Sandbox Code Playgroud)
什么时候可能
For Each Data as …Run Code Online (Sandbox Code Playgroud) 我有一个以这行开头的UTF-8文本文件:
<HEAD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>
Run Code Online (Sandbox Code Playgroud)
当我TFile.ReadAllText使用TEncoding.UTF8 读取此文件时:
MyStr := TFile.ReadAllText(ThisFileNamePath, TEncoding.UTF8);
Run Code Online (Sandbox Code Playgroud)
然后省略文本文件的前3个字符,因此MyStr导致:
'AD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>...'
Run Code Online (Sandbox Code Playgroud)
但是,当我在TFile.ReadAllText没有TEncoding.UTF8的情况下读取此文件时:
MyStr := TFile.ReadAllText(ThisFileNamePath);
Run Code Online (Sandbox Code Playgroud)
然后完整正确地读取文件:
<HEAD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>...
Run Code Online (Sandbox Code Playgroud)
是否TFile.ReadAllText有缺陷?
当动态加载DLL时,DoSomething我们可以做一个方法类型变量
DoSomething:= GetProcAddress(MyDLLHandle ,'DoSomething');
Run Code Online (Sandbox Code Playgroud)
要么
@DoSomething:= GetProcAddress(MyDLLHandle ,'DoSomething');
Run Code Online (Sandbox Code Playgroud)
在现代版本的Delphi中,这两者似乎表现相同.我的问题是 - @操作员是否总是可选的,如果没有,Delphi的版本是否可选?
该文档指出@,当与例程(函数/过程)类型一起使用时,返回具有类型的函数的入口点Pointer.当直接使用变量时,它自然具有声明的任何特定类型,但也返回该方法的入口点. GetProcAddress返回一个Pointer所以我假设@加载DLL时包含的习惯来自这些不匹配类型不兼容的时间.是这样的吗?
是否有任何合理的论据可以选择这些风格?