小编Mas*_*ler的帖子

如何清理字符串以用作文件名?

我有一个例程,可以将文件转换为不同的格式并保存.原始数据文件已编号,但我的例程根据原始文件中的内部名称为输出提供文件名.

我试图在一个完整的目录上批量运行它,它工作正常,直到我点击一个内部名称中有斜杠的文件.哎呀!如果它在这里,它可以很容易地在其他文件上.是否存在RTL(或WinAPI)例程,它将清理字符串并删除无效符号,以便可以安全地用作文件名?

delphi validation filenames sanitization

26
推荐指数
6
解决办法
2万
查看次数

是否有用于转义HTML的Delphi标准函数?

我有一个报告,它应该采用网格控件并生成HTML输出.网格中的一列可以显示任意数量的值,或<Any>.当它输出到HTML时,它当然是空白的.

我可能会编写一些例程来使用StringReplace来将其转换为&lt;Any&gt;正确显示这个特定情况,但我认为RTL中可能有一个已经过测试并且正确的情况.谁知道我能在哪里找到它?

html delphi escaping

26
推荐指数
2
解决办法
2万
查看次数

如何在一条线上找到所有网格方块?

我正在尝试在二维网格上实现视线算法.我知道它在概念上需要如何工作,但我想不出如何将其作为算法实现.

基本想法很简单.在伪代码中:

function LineOfSight(point1, point2): boolean
  squares = GetListOfSquaresOnLine(point1, point2)
  for each square in squares
    if square.IsOpaque then return false
  return true
Run Code Online (Sandbox Code Playgroud)

GetListOfSquaresOnLine将(概念上)从点1处的网格正方形的中心到点2处的网格正方形的中心绘制一条直线,并返回该线经过的所有正方形的列表.但那是我不知道如何实施的部分.有人知道怎么做吗?Delphi或C示例首选,但不是必需的.

algorithm geometry

26
推荐指数
3
解决办法
1万
查看次数

Delphi:使用TClientDataset作为内存数据集

根据此页面,可以将其TClientDataset用作内存数据集,完全独立于任何实际数据库或文件.它描述了如何设置数据集的表结构以及如何在运行时将数据加载到其中.但是当我试图遵循D2009中的指示时,步骤4(table.Open)引发了异常.它说它没有指定提供者.

该页面上示例的整个要点是构建不需要提供程序的数据集.页面是错误的,它是否过时,或者我在某个地方错过了一步?如果页面错误,我需要使用什么来创建一个完全独立的内存数据集?我一直在使用TJvMemoryData,但如果可能的话,我想减少我的数据集添加到项目中的额外依赖项的数量.

delphi dataset

21
推荐指数
5
解决办法
6万
查看次数

有没有反编译Delphi的程序?

有人刚给我发了一个程序的反编译到C.这是一个非常好的反编译,产生了很好的,主要是可读的C代码(如果你忽略了没有变量或函数都有一个人类可读的名字的事实),大多看起来像它实际上会编译.

但是有一个大问题.我碰巧知道他反编译的程序是用Delphi编写的,其中充满了难以转化为C的概念.但我对反编译器的输出印象深刻,这让我很奇怪.德尔福有什么可以做到的吗?

我见过Delphi的最好的反编译工具是DeDe.它可以做很多事情,但它甚至不会尝试生成Object Pascal代码作为其输出,并且自Delphi 6以来它还没有更新.那里有什么更好的东西吗?

delphi decompiling reverse-engineering

21
推荐指数
3
解决办法
8万
查看次数

外部异常C0000006

我在Delphi中编写了一些程序,当我从密钥上的磁盘运行它时.在某些时候,我需要在应用程序运行时拔掉密钥上的磁盘.如果我在一台至少有1GB内存的计算机上这样做,一切都还可以.当我在512mb的机器上执行此操作时,我得到一个外部异常C0000006.如果我没有弄错,这是因为操作系统正在尝试读取下一行代码,但无法找到它的资源(意思是,应用程序没有加载到ram),这是荒谬的,因为它是一个500kb的应用程序.

我怎么解决这个问题?或者至少以更优雅的方式处理这个例外?(因为我不能抓住它,因为它是一个外部异常).

哦,我的Delphi应用程序是windows xp下的控制台应用程序.

delphi error-handling windows-xp exception

21
推荐指数
2
解决办法
6万
查看次数

"Lisp可以自己编写吗?"是什么意思?

Paul Graham写道:"关于Lisp的不寻常之处 - 事实上,Lisp的定义质量 - 就是它可以自己编写." 但这对我来说似乎没有什么不寻常或明确的.

ISTM,编程语言由两个东西定义:它的编译器或解释器,它通过fiat定义语言的语法和语义,以及它的标准库,它在很大程度上定义了熟练用户将使用的习语和技术.用语言编写代码.

除了一些特定的例外(例如,.NET系列的非C#成员),大多数语言的标准库都是用这种语言编写的,原因有两个:因为它将共享同一组语法定义,函数调用约定,以及语言的一般"外观和感觉",并且因为可能为编程语言编写标准库的人是其用户,特别是其设计者.所以那里没什么特别的; 这是非常标准的.

再一次,语言编译器本身就没有什么独特或不寻常的东西.C编译器用C语言编写.Pascal编译器用Pascal编写.Mono的C#编译器是用C#编写的.哎呀,即使是一些脚本语言也有"自己编写"的实现.

那么Lisp在编写本身时是不寻常的意味着什么呢?

lisp programming-languages

21
推荐指数
5
解决办法
5596
查看次数

字符串实习真的很有用吗?

我不久前正在谈论字符串和各种语言,并且出现了字符串实习的主题.显然,Java和.NET框架会自动执行所有字符串以及多种脚本语言.从理论上讲,因为你不相同的字符串的多个副本,最终可以节省内存,这样可以节省时间,因为字符串相等比较是一个简单的指针比较,而不是一个O(N)通过串的每个字符运行.

但是我越是想到它,我越是怀疑这个概念的好处.在我看来,优势主要是理论上的:

  • 首先,要使用自动字符串实习,所有字符串必须是不可变的,这使得许多字符串处理任务比它们需要的更难.(是的,我听说过所有关于不变性的论点.这不是重点.)
  • 每次创建新字符串时,都必须根据字符串实习表检查它,这至少是O(N)操作.(编辑:.其中N是字符串的大小,表的不是大小,因为这是令人困惑的人)所以,除非字符串相等比较,新的字符串创建的比例是相当高的,这是不可能的,节省的净时间正值.
  • 如果字符串相等表使用强引用,那么当不再需要字符串时,它们将永远不会被垃圾收集,从而浪费内存.另一方面,如果表使用弱引用,则字符串类需要某种终结器来从表中删除字符串,从而减慢GC进程的速度.(这可能是相当显著,取决于字符串实习生表是如何实现的.最坏的情况下,删除从哈希表中的项目可能需要的O(N)的重建在某些情况下整个表的.)

这只是我思考实现细节的结果.有没有我错过的东西?在一般情况下,字符串实习是否实际上提供了任何显着的好处?

编辑2:好吧,显然我是在错误的前提下操作的.我正在谈话的人从未指出字符串实习对于新创建的字符串是可选的,事实上给人的印象是相反的情况是正确的.感谢Jon直接解决问题.另一个接受他的答案.

.net ruby python java string-interning

21
推荐指数
2
解决办法
3354
查看次数

为什么字符串称为"字符串"?

可能重复:
"字符串"定义背后的历史......

关于我所见过的每种编程语言唯一能够达成共识的是,引用文本块的变量称为"字符串".为什么?这个名字来自哪里,它在一般的编程中是如何成为惯用语的?

string history

20
推荐指数
1
解决办法
5389
查看次数

如何防止DEP杀死我的JITted异常处理程序?

我正在开发一个似乎工作正常的JIT编译器,除了一个问题:当代码引发异常并且异常处理程序在JITted例程中时,操作系统会立即终止进程.当我关闭DEP时不会发生这种情况,所以我认为它与DEP有关.

当DEP关闭时,异常处理程序正确运行,我确保调用VirtualProtect保护值为的JITted例程PAGE_EXECUTE_READ,然后验证它VirtualQuery.

在调试器下对此进行测试会报告致命错误发生在引发异常的位置,而不是稍后,我认为这意味着发生了类似的事情:

  • 提出例外
  • SEH查找最近的异常处理程序
  • SEH看到最近的异常处理程序是在JITted代码中并立即吓坏了
  • Windows杀死了这个任务

有没有人知道我可能做错了什么,以及如何让DEP接受我的异常处理程序?执行JITted代码本身没有任何问题.

编辑:这是生成存根的Delphi代码.它分配内存,加载基本代码,修复跳转修复和尝试块,然后将内存标记为可执行文件.这是DWS项目中外部函数JIT正在进行的工作的一部分.

function MakeExecutable(const value: TBytes; const calls: TFunctionCallArray; call: pointer;
   const tryFrame: TTryFrame): pointer;
var
   oldprotect: cardinal;
   lCall, lOffset: nativeInt;
   ptr: pointer;
   fixup: TFunctionCall;
   info: _MEMORY_BASIC_INFORMATION;
begin
   result := VirtualAlloc(nil, length(value), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
   system.Move(value[0], result^, length(value));
   for fixup in calls do
   begin
      ptr := @PByte(result)[fixup.offset];
      if fixup.call = 0 then
         lCall := nativeInt(call)
      else lCall := fixup.call;
      lOffset := (lCall - …
Run Code Online (Sandbox Code Playgroud)

windows delphi compiler-construction jit exception-handling

19
推荐指数
1
解决办法
744
查看次数