在 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# 中实现对编译时的检查?
我在 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) 我希望能够将整数值传递给函数 - e^x 并返回结果。基于 e^x 的递归关系。有人可以帮我弄这个吗?
提前致谢。
我的 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) 一般来说,有四种常见的大小写样式。
骆驼香烟盒
帕斯卡案例
蛇案例
烤肉串
第一种、第三种和第四种风格的词源是微不足道的。但是第二个(即 PascalCase)呢?
根据维基百科,
词源
参考Pascal 编程语言。
链接只说
Pascal 源代码中忽略字母大小写。
根据自由帕斯卡维基,
标识符规则:
- 必须以英文字母表中的字母或下划线 (_) 开头。
- 后面可以跟字母数字字符(字母字符和数字)或下划线 (_)。
- 不能包含特殊字符,例如:~!@#...
(剪辑)
帕斯卡不区分大小写!
MyProgram,MYPROGRAM, 和mYpRoGrAm是等价的。但出于可读性的目的,使用有意义的大写是个好主意!您可以选择两种可能的方法应用于您的标识符:CamelCase 和下划线作为空格。CamelCase,正如它所显示的那样,意味着标识符中的单独单词是大写的,因此您可以使用
newPerson或NewPerson代替newperson。使用下划线作为空格意味着你用下划线分隔标识符中的单词,这样你就可以new_person代替newperson. 或者您可以将两者结合起来,这样您就可以使用new_PersonorNew_Person代替newperson.
,这意味着不需要使用驼峰式标识符,例如StackOverflow或RedHatLinux。
那么,“camel case”这个词是怎么来的呢?pascal 程序员是否首先开始使用 PascalCase 风格?
我有一个情况:
procedure Compile();
begin
//stuff
CompileBatch();
end;
procedure CompileBatch();
begin
//stuff
end;
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用,因为在 Compile 中还没有找到标识符“CompileBatch”。是否有任何解决方法,或者我是否必须在 Compile 中重写所有 CompileBatch 代码?我正在使用 Free Pascal。
我正在尝试在 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 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 的新手,想知道是否有办法获取/访问发送者在过程中引用的组件的属性。
更具体地说,我想制作一个更改标签的标题属性的过程,该标签是Sender引用的组件。我想象这个过程看起来像:
procedure TForm1.LabelEdit(Sender: TObject);
begin
Sender.caption := 'Sample Text';
end;
Run Code Online (Sandbox Code Playgroud)
自然这行不通,但可以做类似或类似的事情吗?
所以我试图在 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()并没有 …
pascal ×10
delphi ×5
freepascal ×4
lazarus ×2
pointers ×2
turbo-pascal ×2
.net ×1
c# ×1
clr ×1
declaration ×1
dynamic ×1
exponential ×1
naming ×1
pascalscript ×1
procedure ×1