pascal 相关问题

Pascal是1969年创建的Wirthian家族的必修语言。它在20世纪70年代和80年代被广泛用于工程和教学。它以Free Pascal和Delphi的编译器为生。

Pascal 中的运行时错误 216。指向二维字符数组的指针

我创建一个指向二维字符数组的指针,用网格填充它,将其输出到控制台并为指针释放内存。如果我使用 dispose(),则会弹出运行时错误 216。如果我不使用di...

回答 1 投票 0

Pascal 没有布尔类型怎么可能有条件呢?

基于正式的 Pascal EBNF 定义(第 69-75 页),我发现 Pascal 仅支持 3 种基本类型:Integer、Real 和 String。 在 C 中,任何不同于 0 的值都可以解释为 t...

回答 2 投票 0

Pascal 中的“#”符号是什么?

例如: x := #123; 我尝试在谷歌上搜索,但我根本不知道这意味着什么。

回答 6 投票 0

这么大的数字如何计算?

我现在自学 Pascal 一个月了,我遇到了一个我似乎无法解决的问题。基本上我有 2 个数字,N 和 M,其中 N 小于 10100 000,M 小于 108,bot...

回答 1 投票 0

为什么我的 FreePascal 程序没有运行?

信用卡计划类型; 瓦尔 AppliName:字符串数组[1..99]; SSnum:整数数组[1..99]; GSal: 整数数组[1..99]; TSalD:整数数组[1..99]; 姓名,抄送:Stri...

回答 1 投票 0

如何在Delphi中停止线程?

我有一个按钮1和一个标签1。单击按钮 1 时,标签 1 开始在其自己的线程上计数。 问题是当单击“button2”时我无法停止线程。 这里'...

回答 1 投票 0

如何在 Delphi Object Pascal 中停止线程

我有一个按钮1和一个标签1。单击按钮 1 时,标签 1 开始在其自己的线程上计数。 问题是当单击“button2”时我无法停止线程。 这里...

回答 1 投票 0

编译器命令 $M 在 Turbo Pascal 中导致文件操作出现问题

我在文件操作方面遇到问题,当我使用 $M 编译器命令时,文件操作“有时”不起作用。他们什么也不做。 当我删除 $M 命令时,EXEC 不会执行任何操作...

回答 1 投票 0

为什么我只告诉它写 15,输出却是 16 位?

再次向大家问好, 我需要用 Pascal 编写一段代码,将十进制数转换为二进制数,并将其保存到数组中,然后将其从 MSD 写入 LSD。 我有大部分...

回答 1 投票 0

这是什么原因造成的?错误:不兼容的类型:得到“Boolean”,期望“LongInt”

我正在为作业编写代码,但是,编译器总是为我提供以下过程错误。老实说,我不知道它出了什么问题,我找不到错误。我不知道...

回答 1 投票 0

是什么导致了这个问题(Pascal)?

我正在编写作业代码,但是编译器总是给我这个过程错误。老实说,我不知道它出了什么问题,我找不到错误。我不知道为什么会这样

回答 1 投票 0

将 Turbo Pascal 内联代码转换为 Object Pascal

在将旧的 Turbo Pascal 单位转换为现代的 Object Pascal 时,我遇到了以下问题: 函数 Less (var a, b; 关系:指针) : 布尔值; 内联($5B/$59/$0E/$E8/$00/$00/$58/$05/$08/$00...

回答 4 投票 0

比较 Virtual Pascal 中的指针

我必须在 Virtual Pascal 中转换一些使用内联 asm 代码的程序,但不知道如何在 Virtual Pascal 中比较指针? 这是导致操作数类型与歌剧不匹配的示例...

回答 1 投票 0

lazarus 中带有参数的匿名线程

我无法通过lazarus中的匿名步骤传递参数 我使用了 delphi 示例,但它们不起作用 过程 hi(i:整数); 开始 form1.caption:=inttostr(i); 结尾; 程序 TForm1.Button1...

回答 1 投票 0

Delphi:过滤 DBGrid 时不执行 SQL 查询

我正在尝试过滤从数据库加载到 DBGrid 中的产品。当我尝试过滤时,无法执行查询。它返回给我一个空白的 sql.Text。我不知道为什么会出现这种情况?

回答 1 投票 0

在服务器上运行的Pascal编译器

你有什么想法,如何在服务器上编译pascal文件(*.pas)吗?谢谢你。

回答 2 投票 0

用于将枚举转换为字符串以及返回的通用函数

我正在尝试编写将枚举转换为字符串并再次转换回来的函数。 IE: TConversions = 类 严格的私人 民众 类函数 StringToEnumeration 我正在尝试编写将枚举转换为字符串并再次转换回来的函数。 即: TConversions = class strict private public class function StringToEnumeration<T:class>(x:String):T; class function EnumerationToString<T:class>(x:T):String; end; 在实施部分我有 uses System.TypInfo ; class function TConversions.StringToEnumeration<T>(x:String):T; begin Result := T(GetEnumValue(TypeInfo(T), x)); end; class function TConversions.EnumerationToString<T>(x:T):String; begin Result := GetEnumName(TypeInfo(T), integer(x)); end; 问题是,枚举不是 pascal 中的 T:class 类型。我也无法使用T:record。 这可以在帕斯卡中做到吗? 你需要稍微摆弄一下。枚举没有泛型,因此我们通过使用 Byte、Word 和 Cardinal 在枚举之间进行转换来绕过它。 program Project6; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.TypInfo; type TConversions<T> = record class function StringToEnumeration(x: String): T; static; class function EnumerationToString(x: T): String; static; end; class function TConversions<T>.StringToEnumeration(x: String): T; begin case Sizeof(T) of 1: PByte(@Result)^ := GetEnumValue(TypeInfo(T), x); 2: PWord(@Result)^ := GetEnumValue(TypeInfo(T), x); 4: PCardinal(@Result)^ := GetEnumValue(TypeInfo(T), x); end; end; class function TConversions<T>.EnumerationToString(x: T): String; begin case Sizeof(T) of 1: Result := GetEnumName(TypeInfo(T), PByte(@x)^); 2: Result := GetEnumName(TypeInfo(T), PWord(@x)^); 4: Result := GetEnumName(TypeInfo(T), PCardinal(@x)^); end; end; type TMyEnum = (me_One, me_Two, me_Three); TMyEnum2 = (m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20, m21,m22,m23,m24,m25,m26,m27,m28,m29,m30,m31,m32,m33,m34,m35,m36,m37,m38,m39,m40, m41,m42,m43,m44,m45,m46,m47,m48,m49,m50,m51,m52,m53,m54,m55,m56,m57,m58,m59,m60, ma1,ma2,ma3,ma4,ma5,ma6,ma7,ma8,ma9,ma10,ma11,ma12,ma13,ma14,ma15,ma16,ma17,ma18,ma19,ma20, ma21,ma22,ma23,ma24,ma25,ma26,ma27,ma28,ma29,ma30,ma31,ma32,ma33,ma34,ma35,ma36,ma37,ma38,ma39, ma40,ma41,ma42,ma43,ma44,ma45,ma46,ma47,ma48,ma49,ma50,ma51,ma52,ma53,ma54,ma55,ma56,ma57,ma58,ma59,ma60, mb1,mb2,mb3,mb4,mb5,mb6,mb7,mb8,mb9,mb10,mb11,mb12,mb13,mb14,mb15,mb16,mb17,mb18,mb19, mb20,mb21,mb22,mb23,mb24,mb25,mb26,mb27,mb28,mb29,mb30,mb31,mb32,mb33,mb34,mb35,mb36,mb37,mb38,mb39, mb40,mb41,mb42,mb43,mb44,mb45,mb46,mb47,mb48,mb49,mb50,mb51,mb52,mb53,mb54,mb55,mb56,mb57,mb58,mb59,mb60, mc1,mc2,mc3,mc4,mc5,mc6,mc7,mc8,mc9,mc10,mc11,mc12,mc13,mc14,mc15,mc16,mc17,mc18,mc19, mc20,mc21,mc22,mc23,mc24,mc25,mc26,mc27,mc28,mc29,mc30,mc31,mc32,mc33,mc34,mc35,mc36,mc37,mc38,mc39, mc40,mc41,mc42,mc43,mc44,mc45,mc46,mc47,mc48,mc49,mc50,mc51,mc52,mc53,mc54,mc55,mc56,mc57,mc58,mc59,mc60, md1,md2,md3,md4,md5,md6,md7,md8,md9,md10,md11,md12,md13,md14,md15,md16,md17,md18,md19, md20,md21,md22,md23,md24,md25,md26,md27,md28,md29,md30,md31,md32,md33,md34,md35,md36,md37,md38,md39, md40,md41,md42,md43,md44,md45,md46,md47,md48,md49,md50,md51,md52,md53,md54,md55,md56,md57,md58,md59,md60, me1,me2,me3,me4,me5,me6,me7,me8,me9,me10,me11,me12,me13,me14,me15,me16,me17,me18,me19, me20,me21,me22,me23,me24,me25,me26,me27,me28,me29,me30,me31,me32,me33,me34,me35,me36,me37,me38,me39, me40,me41,me42,me43,me44,me45,me46,me47,me48,me49,me50,me51,me52,me53,me54,me55,me56,me57,me58,me59,me60, mf1,mf2,mf3,mf4,mf5,mf6,mf7,mf8,mf9,mf10,mf11,mf12,mf13,mf14,mf15,mf16,mf17,mf18,mf19, mf20,mf21,mf22,mf23,mf24,mf25,mf26,mf27,mf28,mf29,mf30,mf31,mf32,mf33,mf34,mf35,mf36,mf37,mf38,mf39, mf40,mf41,mf42,mf43,mf44,mf45,mf46,mf47,mf48,mf49,mf50,mf51,mf52,mf53,mf54,mf55,mf56,mf57,mf58,mf59,mf60); var enum: TMyEnum; enum2: TMyEnum2; begin enum := me_Two; WriteLn(TConversions<TMyEnum>.EnumerationToString(enum)); enum := me_One; WriteLn(TConversions<TMyEnum>.EnumerationToString(enum)); enum := TConversions<TMyEnum>.StringToEnumeration('me_Three'); WriteLn(TConversions<TMyEnum>.EnumerationToString(enum)); enum2 := m17; WriteLn(TConversions<TMyEnum2>.EnumerationToString(enum2)); ReadLn; end. 不知何故,这个关键信息作为答案丢失了: 在最近的 Delphi 版本中,不需要编写任何通用帮助程序来将枚举转换为字符串并返回,因为它已经存在于 System.Rtti 中,事实上它的实现与此处的现有答案非常相似。 class function TRttiEnumerationType.GetName<T{: enum}>(AValue: T): string; class function TRttiEnumerationType.GetValue<T{: enum}>(const AName: string): T; 用法非常简短: S:= TRttiEnumerationType.GetName(myEnum); 似乎没有T:enum泛型类型约束,所以我认为你能做的最好的事情就是在运行时检查类型,如下所示: 编辑:根据 David 的评论,我添加了 T: record 约束,可用于约束值类型(并排除类类型)。 type TConversions = class public class function StringToEnumeration<T: record>(const S: string): T; class function EnumerationToString<T: record>(Value: T): string; end; class function TConversions.EnumerationToString<T>(Value: T): string; var P: PTypeInfo; begin P := PTypeInfo(TypeInfo(T)); case P^.Kind of tkEnumeration: case GetTypeData(P)^.OrdType of otSByte, otUByte: Result := GetEnumName(P, PByte(@Value)^); otSWord, otUWord: Result := GetEnumName(P, PWord(@Value)^); otSLong, otULong: Result := GetEnumName(P, PCardinal(@Value)^); end; else raise EArgumentException.CreateFmt('Type %s is not enumeration', [P^.Name]); end; end; class function TConversions.StringToEnumeration<T>(const S: string): T; var P: PTypeInfo; begin P := PTypeInfo(TypeInfo(T)); case P^.Kind of tkEnumeration: case GetTypeData(P)^.OrdType of otSByte, otUByte: PByte(@Result)^ := GetEnumValue(P, S); otSWord, otUWord: PWord(@Result)^ := GetEnumValue(P, S); otSLong, otULong: PCardinal(@Result)^ := GetEnumValue(P, S); end; else raise EArgumentException.CreateFmt('Type %s is not enumeration', [P^.Name]); end; end; 我将提供以下变体,这是我对类似问题的回答的代码的简单扩展:如何使用通用枚举类型调用 GetEnumName? type TEnumeration<T: record> = class strict private class function TypeInfo: PTypeInfo; inline; static; class function TypeData: PTypeData; inline; static; public class function IsEnumeration: Boolean; static; class function ToOrdinal(Enum: T): Integer; inline; static; class function FromOrdinal(Value: Integer): T; inline; static; class function ToString(Enum: T): string; inline; static; class function FromString(const S: string): T; inline; static; class function MinValue: Integer; inline; static; class function MaxValue: Integer; inline; static; class function InRange(Value: Integer): Boolean; inline; static; class function EnsureRange(Value: Integer): Integer; inline; static; end; { TEnumeration<T> } class function TEnumeration<T>.TypeInfo: PTypeInfo; begin Result := System.TypeInfo(T); end; class function TEnumeration<T>.TypeData: PTypeData; begin Result := TypInfo.GetTypeData(TypeInfo); end; class function TEnumeration<T>.IsEnumeration: Boolean; begin Result := TypeInfo.Kind=tkEnumeration; end; class function TEnumeration<T>.ToOrdinal(Enum: T): Integer; begin Assert(IsEnumeration); Assert(SizeOf(Enum)<=SizeOf(Result)); Result := 0; // needed when SizeOf(Enum) < SizeOf(Result) Move(Enum, Result, SizeOf(Enum)); Assert(InRange(Result)); end; class function TEnumeration<T>.FromOrdinal(Value: Integer): T; begin Assert(IsEnumeration); Assert(InRange(Value)); Assert(SizeOf(Result)<=SizeOf(Value)); Move(Value, Result, SizeOf(Result)); end; class function TEnumeration<T>.ToString(Enum: T): string; begin Result := GetEnumName(TypeInfo, ToOrdinal(Enum)); end; class function TEnumeration<T>.FromString(const S: string): T; begin Result := FromOrdinal(GetEnumValue(TypeInfo, S)); end; class function TEnumeration<T>.MinValue: Integer; begin Assert(IsEnumeration); Result := TypeData.MinValue; end; class function TEnumeration<T>.MaxValue: Integer; begin Assert(IsEnumeration); Result := TypeData.MaxValue; end; class function TEnumeration<T>.InRange(Value: Integer): Boolean; var ptd: PTypeData; begin Assert(IsEnumeration); ptd := TypeData; Result := Math.InRange(Value, ptd.MinValue, ptd.MaxValue); end; class function TEnumeration<T>.EnsureRange(Value: Integer): Integer; var ptd: PTypeData; begin Assert(IsEnumeration); ptd := TypeData; Result := Math.EnsureRange(Value, ptd.MinValue, ptd.MaxValue); end; 我在手机上输入了它,因此可能需要进行编译。它提供您所要求的以及更多。 此变体所做的一个关键事情是将枚举和序数之间的转换分离为可重用的方法。 就我而言,我认为使用泛型类来实现枚举并不是一个好主意,因为有两种枚举: 没有显式序数值的经典/真枚举,或者值从 0 开始并且每个后继等于前驱+1(“TMyEnum = 一、二、三;”),这将正确工作 其他/假枚举,其显式序数值不从 0 开始,或者后继者不等于前驱者+1(“TMyOtherEnum = one = 1,two = 2, Three = 3;”),这将不起作用,因为这些类型不起作用t 提供 RTTI 信息(作为指针或不带 RTTI 类/接口)。 您不能在这些类型上调用 TypeInfo,因为代码无法编译,除非是泛型,在这种情况下 TypeInfo 可以返回 nil,因为 Delphi 无法在编译时检查类型是否具有 RTTI 信息。 在您的实现中,您甚至会遇到访问冲突,因为您没有检查“TypeInfo”<> nil。 您当然可以检查它并检查“TypeInfo.Kind = tkEnumeration”并在必要时引发断言,但我认为在编译时检测错误比在运行时检测错误要好得多。为此,您需要在每个方法中添加一个额外的“typeinfo”参数,最后泛型不会带来很多... 如果您从不在代码中使用“其他/假枚举”,您当然可以忽略所有这些;-) 我们不需要这样的功能,它已经有了。 Enum 可以使用 Ord 函数实现。 可以使用函数 GetEnumName 来获取字符串。 检查此代码,只需在表单上放置一个标签和一个按钮即可。 procedure TForm1.Button1Click(Sender: TObject); var Ord_CurrentState : Integer; begin // current state Ord_CurrentState := ord(WindowState); Label1.Caption := GetEnumName(TypeInfo(TWindowState), (Ord_CurrentState)); end; 单击按钮,标签将显示“wsNormal”。现在最大化表单,然后单击按钮。标签将更改为“wsMaximized”。 我们应该在GetEnumName函数中提供一个类型,在本例中,它是TWindowState。

回答 6 投票 0

记录字段作为Delphi程序的形式参数

我想创建一个程序,对变量记录类型进行一些操作。在全球范围内,我有一系列记录。我想对数组进行排序,但是按记录的字段排序。我想通过该字段作为

回答 1 投票 0

如何从 Windows 命令行以“fpc”执行 FreePascal

我注意到在一个地方,他们能够从 Windows 命令行将 FreePascal 编译器调用为“fpc”,如下所示: fpc my_program_source.pas 如何实现这一目标?是不是有什么命令...

回答 1 投票 0

如何在数组中使用变量?

我正在使用 PASCAL 来完成我正在做的课程,但我在分配时遇到了麻烦,在我的程序中,我使用 2 个数组,它们使用用户输入中的变量,但是当我去运行程序时它来了...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.