标签: pascal

Delphi 在 C# 中的子范围类型?

在 Delphi(或任何 Pascal)中,您可以声明子范围类型,因此如果您尝试从允许的范围之外分配值,则会出现编译器错误。

var
    i: 1..8;
begin
    i := 8; // i := 9 would not work
Run Code Online (Sandbox Code Playgroud)

这可以在 C# 中完成吗?我可以想象创建自定义结构,例如SubrangeType<byte>但我正在寻找内置的东西。

编辑: xanatos 和 DavidHeffernan 的评论让我对更具体的问题有了想法。Delphi 中的子范围检查在运行时和编译时都可用。使用自定义结构在 C# 中可以在运行时实现它,但是是否可以在 C# 中实现对编译时的检查?

.net c# delphi clr pascal

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

在 Pascal 中计算数组中的素数

我在 PAscal 中遇到了问题。我想计算素数但没有结果:我的代码是:

Program arrayToFunction;
const
 size = 5;
type
  a = array [1..size] of integer;
var
 aNumbers:  a = (1, 7, 3, 4, 5);
 iCountNumbers: integer;
function countPrimeNumbers( var arr: a) : integer;
  var
   i :0..size;
   sum,j,count: integer;
  begin
  sum := 0;count:=0;
  for i := 0 to size do
  begin
      for j := 2 to arr[i] do
          begin
               if(arr[i] mod j = 0) then sum:=1;
          end;
      if(sum=0) then count:=count+1;

  end;
 countPrimeNumbers := count;
end;
begin
 iCountNumbers := countPrimeNumbers( aNumbers …
Run Code Online (Sandbox Code Playgroud)

pascal freepascal pascalscript turbo-pascal

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

如何编写指数函数(e^x)?

我希望能够将整数值传递给函数 - e^x 并返回结果。基于 e^x 的递归关系。有人可以帮我弄这个吗?

提前致谢。

pascal exponential turbo-pascal

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

从 Pascal 过程中完全退出程序

我的 Pascal 程序在 begin语句和 4 个程序中有一个菜单。在每个程序中,我都会向用户确认他们是否要返回菜单,否则程序将退出,但是每次程序要退出时,它都会再次返回菜单。

procedure quit;
begin
  writeln('<Enter> to quit...');
  readln;
end

procedure error;
begin
  writeln('Error. Try Again...');
  readln;
end;

procedure option1;
begin
  clrscr;
  writeln('this is option 1');
  writeln('would you like to continue? (y/n)');
  readln(confirm);
  if confirm = 'y' then
  begin 
    writeln('something will happen...');
  end;

  if confirm = 'n' then
    begin
      writeln('Return to main menu ? (y/n)');
      readln(option);
      if option = 'y' then
        exit
      else
        quit;
    end;  
end;

procedure option2;
begin
  clrscr; 
  writeln('this is option2');
  writeln('would …
Run Code Online (Sandbox Code Playgroud)

pascal freepascal lazarus

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

“Pascal Case”这个词是怎么来的?

一般来说,有四种常见的大小写样式

  1. 骆驼香烟盒

  2. 帕斯卡案例

  3. 蛇案例

  4. 烤肉串

第一种、第三种和第四种风格的词源是微不足道的。但是第二个(即 PascalCase)呢?


根据维基百科

词源

参考Pascal 编程语言

链接只说

Pascal 源代码中忽略字母大小写。


根据自由帕斯卡维基

标识符规则:

  • 必须以英文字母表中的字母或下划线 (_) 开头。
  • 后面可以跟字母数字字符(字母字符和数字)或下划线 (_)。
  • 不能包含特殊字符,例如:~!@#...

(剪辑)

帕斯卡不区分大小写!MyProgram, MYPROGRAM, 和mYpRoGrAm是等价的。但出于可读性的目的,使用有意义的大写是个好主意!

您可以选择两种可能的方法应用于您的标识符:CamelCase 和下划线作为空格。CamelCase,正如它所显示的那样,意味着标识符中的单独单词是大写的,因此您可以使用newPersonNewPerson代替newperson。使用下划线作为空格意味着你用下划线分隔标识符中的单词,这样你就可以new_person代替newperson. 或者您可以将两者结合起来,这样您就可以使用new_PersonorNew_Person代替newperson.

,这意味着不需要使用驼峰式标识符,例如StackOverflowRedHatLinux


那么,“camel case”这个词是怎么来的呢?pascal 程序员是否首先开始使用 PascalCase 风格?

pascal naming naming-conventions

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

在另一个过程中调用一个过程,在它之前声明

我有一个情况:

procedure Compile();
begin
  //stuff
  CompileBatch();
end;

procedure CompileBatch();
begin
  //stuff
end;
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用,因为在 Compile 中还没有找到标识符“CompileBatch”。是否有任何解决方法,或者我是否必须在 Compile 中重写所有 CompileBatch 代码?我正在使用 Free Pascal。

pascal freepascal procedure declaration lazarus

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

你如何检查记录指针在 Object Pascal / Delphi 中是否没有值?

我正在尝试在 Delphi 中创建一个链表实现,但无法创建节点,因为我需要检查头指针是否为空。我现在使用的代码如下所示:

procedure LinkedList.addNode(newNode: Node);
var lastNode: Node;
begin
if pHead = nil then
  pHead := @newNode
else
   lastNode := peekLastNode(pHead^);
   lastNode.pNext := @newNode;
end;
Run Code Online (Sandbox Code Playgroud)

程序在添加一个元素后就冻结了,所以 nil 部分是无限期的问题。

这是整个程序:

program LinkedListImplementation;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;
type
  Node = record
    data: string;
    pNext: ^Node;
  end;
type
  LinkedList = class
    pHead: ^Node;
    function peekLastNode (currentNode: Node) : Node;
    function listToString(currentNode: Node) : String;
    procedure addNode (newNode: Node);
  end;

//the initial parameter for this function is LinkedList.pHead^
function LinkedList.peekLastNode (currentNode: …
Run Code Online (Sandbox Code Playgroud)

delphi pascal pointers

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

在 Delphi 5 中,是否总是通过引用传递 TList 参数?

我正在将一些代码从 Delphi 5 迁移到现代平台。目前我有编译后的代码(在我的环境中工作)和源代码(在我的环境中无法编译)。这意味着我无法通过更改或插入断点或转储值来真正试验代码。在查看一段特定的代码时,我看到一个过程 (ProcedureA) 正在调用另一个过程 (ProcedureB) 并传入必须通过引用的参数,否则 ProcedureB 将不起作用。我的理解是必须在过程的参数列表中的参数中添加 var 前缀,以便它们通过引用传递,但这里没有这样做。但是,其中一个参数是 TList 类型,我知道它本质上是一个指针数组。我的问题是:

这是代码:

Procedure ProcedureB(PartyHeaderInformationPtr : PartyHeaderInformationPointer;
                                                PartyHeaderTable : TTable;
                                                _PrisonCode : String;
                                                _FineType : TFineTypes;
                                                PartyHeaderInformationList : TList);

begin
  with PartyHeaderInformationPtr^, PartyHeaderTable do
    begin
      AssessmentYear := FieldByName('TaxRollYr').Text;
      PartyType := FieldByName('PartyType').Text;
      PartyNumber := FieldByName('PartyNo').AsInteger;
      PrisonCode := _PrisonCode;
      FineType := _FineType;

    end;  {with PartyHeaderInformationPtr^ ...}

  PartyHeaderInformationList.Add(PartyHeaderInformationPtr);

end;  {AddPartyHeaderPointerInformation}

{=================================================================}
Procedure ProcedureA(PartyHeaderTable : TTable;
                                              PartyDetailTable : TTable;
                                              PartyHeaderInformationList : TList);

var
  Done, FirstTimeThrough : Boolean;
  PrisonPartyFound, JunglePartyFound : Boolean;
  PrisonPartyYear, …
Run Code Online (Sandbox Code Playgroud)

delphi pascal pointers

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

如何访问 Sender 参数引用的组件的属性(触发事件的组件)

我是 delphi 和 pascal 的新手,想知道是否有办法获取/访问发送者在过程中引用的组件的属性。

更具体地说,我想制作一个更改标签的标题属性的过程,该标签是Sender引用的组件。我想象这个过程看起来像:

procedure TForm1.LabelEdit(Sender: TObject);
begin
    Sender.caption := 'Sample Text';
end;
Run Code Online (Sandbox Code Playgroud)

自然这行不通,但可以做类似或类似的事情吗?

delphi pascal

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

程序 NEW 导致分段错误

所以我试图在 fpc 中实现一个 C 风格的堆栈结构,
主要原则是:每个元素都有一个值和一个指向下一个元素的指针,堆栈本身只包含一个指向它最后一个元素的指针

type stackNode = class
public
    val: integer;
    next: ^stackNode;
end;

type stack = class
private
    top: ^stackNode;
public
    constructor Create();
    procedure push(v: integer);
    procedure clear();
    function pop():integer;
    function back():integer;
    destructor Destroy();
end;

Run Code Online (Sandbox Code Playgroud)

这是我push在 C++ 中的实现方式:

void push(_t _v) {
    top = new stackNode<_t>(_v, top);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在 pascal 中实现基本相同的代码时

procedure stack.push(v: integer);
var
    temp: ^stackNode;
begin
    temp := top;
    new(top);
    top^.next := temp;
    top^.val := v;
end;
Run Code Online (Sandbox Code Playgroud)

new()当我尝试将第二个元素推入堆栈时,它在调用后给我一个分段错误。
有些东西告诉我 pascalnew()并没有 …

delphi pascal freepascal dynamic

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