GVKun编程网logo

在Delphi 64位项目中使用in运算符

11

如果您对在Delphi64位项目中使用in运算符感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解在Delphi64位项目中使用in运算符的各种细节,此外还有关于Delphi-基础(运算符)、de

如果您对在Delphi 64位项目中使用in运算符感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解在Delphi 64位项目中使用in运算符的各种细节,此外还有关于Delphi - 基础 (运算符)、delphi 64位MD5算法、Delphi 64位?、Delphi XE2:通过64位应用程序调试一个64位的dll的实用技巧。

本文目录一览:

在Delphi 64位项目中使用in运算符

在Delphi 64位项目中使用in运算符

我正在将Delphi项目移植到64位,我遇到了一行有IN运算符的代码问题.

编译器引发此错误

E2010 Incompatible types: ‘Integer’ and ‘Int64’

我写了这个示例应用程序来复制问题.

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;


Var
 I : Integer;
 L : Array of string;
begin
  try
     if I in [0,High(L)] then


  except
    on E: Exception do
      Writeln(E.ClassName,': ',E.Message);
  end;
  readln;
end.

这段代码工作正常32位,但为什么不用Delphi XE2 64位编译?我该如何解决这个问题?

*更新*

似乎我的帖子引起了很多混淆(对不起),只是为了解释我移植的原始代码更复杂,我只是将这段代码作为样本来说明问题.原始代码使用in运算符来检查一个值(小于255)是否属于一组值(所有次要或等于255),如此

i in [0,1,3,50,60,70,80,127,High(LArray)]

解决方法

此代码无法编译,因为 High函数返回的是一个8字节值,这不是一个序数值.并且In运算符只能在具有序数值的集合中使用.

仅供参考,High函数返回的结果大小因参数传递的参数而异.

检查此样本

Writeln(SizeOf(High(Byte)));
 Writeln(SizeOf(High(Char)));
 Writeln(SizeOf(High(Word)));
 Writeln(SizeOf(High(Integer)));
 Writeln(SizeOf(High(NativeInt)));
 Writeln(SizeOf(High(TBytes)));

最后,您可以修复代码,将High函数的结果转换为整数.

if I in [0,Integer(High(L))] then

UPDATE

检查David提供的其他信息,并记住在使用in运算符检查变量值集合中的值的成员资格时要非常小心. in运算符仅检查每个元素的最低有效字节(以delphi 32位为单位).

检查此样本

i:=257;
  Writeln( 1 in [i]);

返回true,因为257的低字节为1.

在Delphi 64位中,大于255的值被删除.所以这段代码

i:=257;
  Writeln( 1 in [i]);

将返回false,因为相当于

Writeln( 1 in []);

Delphi - 基础 (运算符)

Delphi - 基础 (运算符)

一、运算符
  1、变量
  2、运算符 **
  3、表达式

 

1、变量

 变量解释:编程中最小的存储单元(空间),它的空间大小由它在声明时的数据类型决定。

1.1、声明:定义一个变量,告诉 Delphi 一个名字的存储空间

1 var 变量名:数据类型;

1.2、变量初始化(给变量的第一次赋值)

1 {赋值: 变量名:=变量的值;}
1 //变量进行声明
2 var
3   Age:Integer;

1.3、初始化一个变量

 1 var
 2   Name:string=''小黑'';
 3   Age := 0;
 4 
 5   //写出(写出的控制台)指定的内容
 6 
 7   Writeln(6 / 4);
 8   Writeln(6 div 2);
 9   Writeln(6 mod 4);
10 
11 //从控制台读入一行内容,它现在的主要的就是暂停,等我们按下回车键。
12   Readln;

 

2、运算符

  算数运算符: + - * /(不会整除) div (整除) mod (求模、求余数)

  布尔运算符:

  关系运算符:<>(不等于)

2.1、布尔运算符示例

1   Writeln(1 <> 2);
2   Writeln(not(1 <> 2));
3   Writeln((1<2) and (2<3));
4   Writeln((1<2) or (2<3));

2.2、xor (异或): 判断条件中相同为 False,不同为 True

1   Writeln((1<2) xor (2<3));
2   Writeln((1<2) xor (2>3));

 

3、表达式

  3.1、表达式:由运算符和合法的标识符组成的序列

   划分:根据运算结果的类型 1 < 2 1 +1

  3.2、语句:主要有关键字和操作指令组成

   划分:选择语句

      if

      case

      循环语句

 

3.3、语句格式

 1 begin
 2   if 1<2 then
 3   begin
 4     //当判断条件成立时,执行的代码
 5     //向控制台写出一段内容
 6     Writeln(''hello Delphi'');
 7   end;
 8 
 9   //从控制台读入一行文本,止到遇到回车(换行符)
10   Readln;
11 end.

3.4、简写方式:前提是只需要执行一行代码

1 begin
2   if 1 < 2 then
3     Writeln(''hello'');  //简写时省去写begin end;
4 end;

3.5、如果否则

 1 if 1<2 then
 2   begin
 3     Writeln(''hello Delphi'');
 4   end
 5   else
 6   begin
 7     Writeln(''hello,test'');
 8   end;
 9   //从控制台读入一行文本,止到遇到回车(换行符)
10   Readln;
11 end.

3.6、case 语句

 1 begin
 2 //case 语句的标准写法
 3   i := 3;
 4   case i of
 5     1:  //标准写法
 6       begin
 7         Writeln(''test1,hello'');
 8       end;
 9     2:  //简写
10       Writeln(''林心如'');
11   else
12     begin
13       Writeln(''林志玲'');
14     end;
15   end;
16   Readln;
17 end.

 3.7、定义各一个过程

3.7.1、学生成绩判断

 1 //声明一个过程
 2 procedure ComparingScore();
 3 //过程的具体实现
 4 var
 5    Score:Integer;
 6 begin
 7   //对学生成绩大于60分的,输出合格,低于60分,输出不合格。
 8   Writeln(''请输入分数:'');
 9   Readln(Score); //Readln可以接受一个变量,将接受Writeln(''请输入分数:'')中数字传给变量Score
10   if Score > 60  then
11     begin
12       Writeln(''合格'');
13     end
14   else
15     begin
16       Writeln(''不合格'');
17     end;
18 end;
19 begin
20   //调用
21   ComparingScore();
22   Readln;
23 end.
View Code

3.7.2、根据用于指定月份 ,打印该月份所属的季节。

  1 {*------------------------------------------------------------------------------
  2 根据用于指定月份 ,打印该月份所属的季节。
  3 3,4,5 春季 6,7,8 夏季  9,10,11 秋季 12,1,2 冬季
  4   @param Month    需要判断月份
  5 -------------------------------------------------------------------------------}
  6 procedure  JudgmentIn(Month:Integer);
  7 begin
  8   if not ((Month > 0) and (Month < 13)) then
  9   begin
 10     Writeln(''月份无法判断'');
 11     Exit;
 12   end;
 13 
 14   if ((Month >= 3) and (Month <= 5 )) then
 15   begin
 16     Writeln(''春季'');
 17     Exit;
 18   end;
 19 
 20   if (Month >= 6) and (Month <= 8) then
 21   begin
 22     Writeln(''夏季'');
 23     Exit;
 24   end;
 25 
 26   if (Month >= 9) and (Month <= 11) then
 27   begin
 28     Writeln(''秋季'');
 29     Exit;
 30   end;
 31 
 32   if (Month = 12) or ((Month > 0) and (Month < 3)) then
 33   begin
 34     Writeln(''冬季'');
 35   end;
 36 
 37 end;
 38 procedure  JudgmentIn2(Month:Integer);
 39 begin
 40   case Month of
 41     3:
 42       begin
 43         Writeln(''春季'');
 44       end;
 45     4:
 46       begin
 47         Writeln(''春季'');
 48       end;
 49     5:
 50       begin
 51         Writeln(''春季'');
 52       end;
 53     6:
 54       begin
 55         Writeln(''夏季'');
 56       end;
 57     7:
 58       begin
 59         Writeln(''夏季'');
 60       end;
 61     8:
 62       begin
 63         Writeln(''夏季'');
 64       end;
 65     9:
 66       begin
 67         Writeln(''秋季'');
 68       end;
 69     10:
 70       begin
 71         Writeln(''春季'');
 72       end;
 73     11:
 74       begin
 75         Writeln(''秋季'');
 76       end;
 77     12:
 78       begin
 79         Writeln(''冬季'');
 80       end;
 81     1:
 82       begin
 83         Writeln(''冬季'');
 84       end;
 85     2:
 86       begin
 87         Writeln(''冬季'');
 88       end;
 89 
 90 
 91 else
 92   begin
 93     Writeln(''月份无法判断'');
 94   end;
 95 
 96 end;
 97 end;
 98 begin
 99   //调用
100   //ComparingScore();
101 //  JudgmentIn(13);
102   JudgmentIn2(12);
103   Readln;
104 end.
View Code

3.7.3、判断是否是高富帅

 1 {*------------------------------------------------------------------------------
 2   @param Height   身高
 3   @param Money     
 4   @param Handsome  
 5 -------------------------------------------------------------------------------}
 6 procedure MaleFemaleMarriage(Height: Integer;Money:Integer;Handsome:Boolean);
 7 begin
 8   if (Height>180) and (Money >= 10000000) and Handsome then
 9   begin
10     Writeln(''我一定要嫁给她'');
11     Exit;
12   end;
13 
14   if (Height>180) and (Money>= 10000000) or Handsome then
15   begin
16     Writeln(''嫁吧,比上不足比下有余'');
17     Exit;
18   end;
19 
20   if not((Height>180) and (Money>= 10000000) and Handsome) then
21   begin
22     Writeln(''不嫁'');
23     Exit;
24   end;
25 
26 end;
27 begin
28   //调用
29   MaleFemaleMarriage(170,1000000,True);
30   Readln;
31 end.
View Code

 

 

delphi 64位MD5算法

delphi 64位MD5算法

总结

以上是小编为你收集整理的delphi 64位MD5算法全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi 64位?

Delphi 64位?

正如大家都知道的那样Delphi 64位(至少每个delphi程序员)。除了代码集关于64位Delphi应用程序(以及代码设备没有多说)的好处之外,我还能从64位Delphi应用程序中获益吗?一旦codegear发布它,将我的应用程序移植到64位真的是一个好主意吗?

编辑:

我只是问它,因为我想要所有的意见。现在,我可以说我真的需要更多可用于我的应用程序的内存,因为它消耗了大量资源。如果可能的话,我真的可以使用更快的速度。我不需要shell扩展插件。

我的客户也问我关于我的应用程序的x64版本,但我真的不明白为什么他们要求它,因为他们实际上是不知道什么是64位应用程序的律师。

编辑

我实际上并没有直接参与应用程序开发。我是技术团队的一员,我创建了我工作的公司中的其他开发人员用来真正开发最终应用程序的东西。所以,我的工作是做技术工作,将应用程序移植到x64是我做的事情,但我需要解释为什么我这样做对我的上级。

解决方法

与针对32位(x86)编译的程序相比,64位程序具有以下优点:

>更多寄存器。 64位x86芯片有several more registers,理论上(如果编译器利用),这可以在某些情况下产生更快的代码。
>更多记忆。对于32位程序,如果使用/ LARGEADDRESSAWARE进行编译,则通常限制为2GB地址空间或总共4GB地址空间,由于Windows内核/用户空间分割,实际上大约为3.5GB。 64位进程可以解决更多问题。这只有在您的应用需要大量内存时才有用。
>能够为资源管理器等64位程序构建插件。除非你使用COM作为数据编组的插件,否则你不能在Windows的一个进程中混合使用32位和64位代码,例如加载32位DLL的64位EXE。例如,如果你想编写一个Explorer插件,你就无法使用64位版本的旧版本Delphi。您将能够使用64位版本。
> Delphi特定:the compiler will use SSE/SSE2浮点计算指令,其中当前的32位编译器仅使用x87 FPU指令(我认为。)这应该可以提高浮点数学的速度。你可能甚至都不会注意到,除非你的应用程序高度依赖FP(游戏,或许是数据处理应用程序,这类事情。)

您的问题的答案“我将从64位Delphi应用程序中受益吗?”高度依赖于您的具体应用。一般来说,除了速度增加之外,不太可能有很多好处。不要依赖64位加速缓慢的应用程序:您仍然需要为大幅度提升进行算法更改。 64位不是一个神奇的子弹。除此之外,如果你已经遇到了32位限制之一,你只需要改变 – 我怀疑你没有,或者你不会问这个问题。

如果您决定转换,您可能会发现this thread非常有用。

但另一件事:即使您不需要更改,您也可能希望,特别是如果您的应用是个人项目。您可能会学习东西,当您修复32/64位问题时,您的代码质量会更高,而像这样的项目可能很有趣。毕竟你是程序员:)

编辑:我看到你已经更新了你的问题“我可以说我真的需要更多可用于我的应用程序的内存,因为它消耗了大量资源。如果可能的话,我真的可以使用更快的速度。”

>什么资源?记忆? 64位将为您提供更大的可寻址地址空间,就是这样。如果算作资源,它不会给你更多的GDI句柄等。但是,如果你确实需要更多内存,那么64位将值得转换为。>“更快的速度”,如果你想要一个很大的差异,通过算法或线程的变化比通过64位编译器更有可能实现。>“我的客户也问我关于我的应用程序的x64版本,但我真的不明白他们为什么要求它,因为他们实际上是不知道什么是64位应用程序的律师。”有可能他们听说64位更好或更快。在理想的世界中,客户会有基于现实的要求,但情况并非总是如此。实际上,如果客户想要这样的东西,可能值得转换只是因为它让他们感到高兴:快乐的顾客是好的,他们可能会为你支付新版本,它可能有助于你公司的口碑声誉。

Delphi XE2:通过64位应用程序调试一个64位的dll

Delphi XE2:通过64位应用程序调试一个64位的dll

有谁有成功调试64位DLL通过运行/附加到64位应用程序?我有Delphi应用程序和dll代码。我可以在32位和64位调试应用程序。我也可以调试32位dll通过使用运行 – >用于选择应用程序的32位版本的参数。

但是,我不能出现通过运行64位应用程序调试我的64位DLL,有人有这个工作吗?

解决方法

根据@ evdkraan的答案

“Steve,在使用转换的dproj文件时,XE2有一个64位调试错误,参见http://qc.embarcadero.com/wc/qcmain.aspx?d=100309.这应该在Update 2中修复,但还没有测试它”

“我不知道这是否在更新2中固定,但它现在工作在更新3”

今天关于在Delphi 64位项目中使用in运算符的介绍到此结束,谢谢您的阅读,有关Delphi - 基础 (运算符)、delphi 64位MD5算法、Delphi 64位?、Delphi XE2:通过64位应用程序调试一个64位的dll等更多相关知识的信息可以在本站进行查询。

本文标签: