- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Delphi 中使用包含文件制作半通用容器有一个古老的技巧。
见 http://www.delphikingdom.com/asp/viewitem.asp?catalogid=453&mode=print并从 3d 列表开始以掌握这个想法。
然而,在单元的 interface
中有两个相互依赖的 INC 文件和 implementation
部分导致麻烦:似乎XE2将那些包含文件编译为独立单元,并且实现找不到接口(interface)中声明的函数。它不会每次都发生,但我未能确定条件,因此未能解决问题。
试图在 Delphi 泛型单元中以尽可能少的变化重新制定它(我不得不将巨大的遗留项目移至 XE2 并且“工作”应该是第一个,稍后进行优化和重构),我陷入了以下坑:
TemplateList<_DATA_TYPE_> = class
public
const MaxListSize = Maxint div (sizeof(Integer)*sizeof(_DATA_TYPE_));
type
TIntList = array[0..MaxListSize - 1] of _DATA_TYPE_;
PIntList = ^TIntList;
private
FList: PIntList;
FCount: Integer;
TIntList
的下限错误。高于上限。我认为这意味着
const MaxListSize
被评估为零,但
TIntType
尝试立即评估,而不是在实际实例化类型时。
TList
或
TList<integer\>
反而...
TIntList = array[0..Maxint div (sizeof(Integer)*sizeof(_DATA_TYPE_)) - 1] of _DATA_TYPE_;
最佳答案
编译器的问题似乎是在编译的通用阶段,sizeof(_DATA_TYPE_)
不知道。因此编译器似乎使用了 0
的占位符值。 .当您实例化泛型类型时,sizeof(_DATA_TYPE_)
被真实值替换。但为时已晚。数组类型边界检查在编译的通用阶段执行,此时 sizeof(_DATA_TYPE_)
是 0
所以编译器的噱头。
可以通过以下代码看出这种情况:
type
TemplateList<_DATA_TYPE_> = class
public
const
SizeOfDataType = sizeof(_DATA_TYPE_);
MaxListSize = Maxint div (sizeof(Integer)*SizeOfDataType);
end;
[dcc32 Error]: E2098 Division by zero
But, if you try this variant:
{$APPTYPE CONSOLE}
type
TemplateList<_DATA_TYPE_> = class
public
const
SizeOfDataType = sizeof(_DATA_TYPE_);
end;
begin
Writeln(TemplateList<Integer>.SizeOfDataType);
Writeln(TemplateList<Double>.SizeOfDataType);
Readln;
end.
48
This shows that your constant declaration has a place holder value for the array type bounds checking, but has a true value once the generic has been instantiated. So, if the compiler postponed array type bounds checking until instantiation, then all would be well in terms of the compiler warning. But even then, the code would not do what you expect and desire. This program:
{$APPTYPE CONSOLE}
type
TemplateList<_DATA_TYPE_> = class
public
const
SizeOfDataType = sizeof(_DATA_TYPE_);
type
TMyArray = array [0..SizeOfDataType] of _DATA_TYPE_;
end;
begin
Writeln(high(TemplateList<Integer>.TMyArray));
Writeln(high(TemplateList<Double>.TMyArray));
Readln;
end.
00
So it seems that not only are the array bounds checked at the generic phase of compilation, but the array bounds are fixed at that phase, and fixed using the place holder value of the type parameter size. What this means is that you cannot hope to achieve array bounds that vary based on the size of the data type.
The same behaviour is present in XE3, and I don't have XE4 at hand to check there.
I personally feel that this is a design flaw in the compiler that warrants a QC report.
In my opinion, the only viable way to resolve this is to give up trying to specify array bounds. I would declare it like this:
type
TemplateList<_DATA_TYPE_> = class
public
type
TIntList = array[0..0] of _DATA_TYPE_;
PIntList = ^TIntList;
private
FList: PIntList;
FCount: Integer;
end;
关于delphi - 泛型类中的内部 const 似乎不是由编译器计算的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525874/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!