标签: pascal

德尔福内存管理

我无法找到几个Delphi内存管理问题的答案.我可以测试不同的场景(我做了什么来找出破坏FreeAndNil方法的东西),但它需要太长时间而且很难!但说真的,我还想知道你们(Delphi开发人员)如何处理这些内存管理问题.

我的问题(随意提出自己的问题,我确信他们的答案对我也有帮助):

  1. FreeAndNil是否适用于COM对象?我的想法是我不需要它,但是如果我需要做的就是将它设置为nil,而不是为什么不在我的finally块中保持一致并使用FreeAndNil来做所有事情?

  2. 什么是清理静态数组的正确方法(myArr:TObject的数组[0..5]).我不能FreeAndNil它,所以将它设置为nil是否足够好(在FreeAnNil'd每个对象之后我需要这样做吗?)?

多谢你们!

delphi pascal memory-management

4
推荐指数
1
解决办法
2684
查看次数

Divide(DIVS)没有在jack crenshaw上工作让我们构建一个编译器

我正在关注Jack Crenshaw在http://compilers.iecc.com/crenshaw上发表的优秀的Let's Build a Compiler教程.我正在使用Easy68k http://www.easy68k.com/ 68000编辑器/汇编器/模拟器测试生成的68k组件.我已经进入了第2部分http://compilers.iecc.com/crenshaw/tutor2.txt但是Divide程序对我来说不能正常工作.

...
{ Recognize and Translate a Divide }
procedure Divide;
begin
  Match('/');
  Factor;
  EmitLn('MOVE (SP)+,D1');
  EmitLn('DIVS D1,D0');
end;
...
Run Code Online (Sandbox Code Playgroud)

如果我输入"8/2"作为测试,则编译器生成以下代码:

MOVE #8,D0
MOVE D0,-(SP)
MOVE #2,D0
MOVE (SP)+,D1
DIVS D1,D0
Run Code Online (Sandbox Code Playgroud)

在我看来它实际上是在计算2/8(即它是错误的回合方式),因为之后D0中剩下的值是00020000.我可以通过将最后一行重写为DIVS D0,D1来解决这个问题,但是这会导致结果根据其他惯例,D1而不是D0,这样的开创性工作似乎不太可能.我搜索过互联网,但我看不到其他人遇到过这个问题.所以这意味着:1)我做错了 - 可能2)杰克做错了 - 不太可能3)Easy68k模拟器做错了 - 不太可能然而我只是看不出我做错了什么.请帮忙.

assembly pascal 68000

4
推荐指数
1
解决办法
497
查看次数

退出循环退出函数

我今天下午一直在Inno Setup编写代码,然后我阅读了一些Pascal文档,其中说exit用于退出循环.我尝试在我的代码中使用它,而是退出该函数.例如,在此函数中,永远不会显示消息框:

function NextButtonClick(CurPageID: Integer): Boolean;
var i: Integer;
begin
    Result := True;

    for i := 0 to 4 do
    begin
        exit
    end;

    MsgBox('test',mbInformation,MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)

我做了一些谷歌搜索,Pascal也有break关键字,所以我使用它,它工作正常.难道exit真的要被用来退出该功能?我记得今天下午读到的Pascal没有相当于C风格的返回语句.

我真的需要一些关于Inno Setup正在使用的Pascal版本的文档.我已经阅读了Inno帮助页面,但它们没有涵盖这样的内容.谢谢

pascal inno-setup

4
推荐指数
1
解决办法
4934
查看次数

任何扫描代码并给出调用给定函数的函数列表的工具

这是我的问题,我正在整理一些我多年来修改过的旧代码并删除了redundent函数,

我可以用缓慢的方式来做它并将其注释掉,看看编译器是否会抛出错误.但我只是想知道是否有任何工具可以扫描代码并给出调用给定函数的函数列表.

我曾经看过ge-experts和icarus,但他们只在单位和类别的水平上执行此操作而不是功能.

欢迎任何建议,非常感谢,Brian

delphi pascal

4
推荐指数
2
解决办法
1199
查看次数

使用FPC编写Scheme解释器:分配和指针

作为一名历史学家,在FPC中编写一个Scheme解释器已经在第一阶段转向对我来说是一项严肃的任务.:)我正在关注Peter Michaux的博客,他在C中展示了如何做到这一点(还有一个Ada的翻译,可能对Pascal有帮助).

从Michaux的工作中考虑C中的这两个函数(v 0.1):

object *alloc_object(void) {
    object *obj;

    obj = malloc(sizeof(object));
    if (obj == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    return obj;
}

object *make_fixnum(long value) {
    object *obj;

    obj = alloc_object();
    obj->type = FIXNUM;
    obj->data.fixnum.value = value;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

据我所知(只是C中的基本阅读知识),构造函数make_fixnum返回一个指向struct的指针(类型为fixnum的标记数据); 对于构造的对象,必须分配内存(感谢@David Heffernan 昨天的观点).

这是我到目前为止对FPC的翻译,它编译时没有任何错误:

program scheme;

type
   TTag = (ScmFixnum);
   PScmObject = ^TScmObject;
   TScmObject = record
      case ScmObjectTag: TTag of
         ScmFixnum: (ScmObjectFixnum: integer); …
Run Code Online (Sandbox Code Playgroud)

delphi scheme pascal freepascal sicp

4
推荐指数
1
解决办法
243
查看次数

将字符串变量写入剪贴板

我马上就承认,至少可以说,我是帕斯卡尔缺乏经验的.所以,我能得到的任何帮助将不胜感激.:)

作为更大程序的一部分,我需要将一个字符串变量写入剪贴板.我在Lazarus(版本1.0.12)中创建了一个新项目,所以我可以尝试弄清楚如何在没有由额外的,不必要的代码引起的复杂性的情况下这样做,我在下面包含了这些:

program varToClipboard;

uses Clipbrd;

var
    textToCopy:string;

begin
    textToCopy := 'Test text from Pascal';

    Clipboard.AsText := textToCopy;
end.  
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,以及所需的LCLBase依赖项,我在运行编译的EXE时在CMD中收到以下错误:

An unhandled exception occurred at $000000000043D45E :
EAccessViolation : Access violation
  $000000000043D45E  CLIPBOARDREGISTERFORMAT,  line 98 of ./include/lclintf.inc
  $000000000043C35B  PREDEFINEDCLIPBOARDFORMAT,  line 185 of lclintf.pas
  $0000000000415B0C  TCLIPBOARD__SETASTEXT,  line 452 of ./include/clipbrd.inc
  $0000000000401802  main,  line 12 of varToClipboard.lpr
Run Code Online (Sandbox Code Playgroud)

根据文档,我似乎做得很对.尽管如此,我发现文档缺乏时间.

 

另外,我必须做什么才能运行已编译的EXE(只生成并将字符串写入剪贴板)而不会弹出控制台窗口?

clipboard pascal freepascal lazarus

4
推荐指数
1
解决办法
1246
查看次数

如何在Inno Setup中捕获OleObject异常?

所以我尝试使用下一个修改过的代码发出没有互联网连接的帖子请求:

      WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
      WinHttpReq.Open('POST', '<your_web_server>', false);
      WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      try
        WinHttpReq.Send('data');
      except
           bla:= 'e';
      finally
           bla := 'f';
      end;
Run Code Online (Sandbox Code Playgroud)

然而异常并没有被抓住,我对下一张图片的设置应用程序感到迷恋:

在此输入图像描述

如何在Inno Setup中处理OleObject异常?

winapi pascal ole inno-setup exception

4
推荐指数
1
解决办法
983
查看次数

Innosetup中的字符串数组

我试图在一行中的InnoSetup中的子字符串后得到一个特定的整数.有Trim,TrimLeft,TrimRight函数但没有子串提取函数.

示例:

line string:    2345
line another string:     3456
Run Code Online (Sandbox Code Playgroud)

我想提取"2345"和"3456".

我正在加载数组中的文件内容,但无法通过array [count] [char_count]取消引用它.

pascal inno-setup

4
推荐指数
1
解决办法
6663
查看次数

在Delphi中将枚举值转换为整数

是否可以在Delphi中将枚举值转换/转换为Integer?

如果是,那怎么样?

delphi pascal integer enumeration

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

代码编辑器中的这句话{$ R*.dfm}是什么?

{$R *.dfm}代码编辑器中的这个短语是什么?

我试过这个:

//{$R *.dfm}
Run Code Online (Sandbox Code Playgroud)

delphi pascal

4
推荐指数
1
解决办法
129
查看次数