我想在Delphi中声明一个包含与C中相同布局的记录.
对于那些感兴趣的人:此记录是Windows操作系统的LDT_ENTRY记录中的联合的一部分.(我需要在Delphi中使用此记录,因为我正在使用Delphi中的Xbox模拟器 - 请参阅sourceforge上的项目Dxbx).
无论如何,有问题的记录定义为:
struct
{
DWORD BaseMid : 8;
DWORD Type : 5;
DWORD Dpl : 2;
DWORD Pres : 1;
DWORD LimitHi : 4;
DWORD Sys : 1;
DWORD Reserved_0 : 1;
DWORD Default_Big : 1;
DWORD Granularity : 1;
DWORD BaseHi : 8;
}
Bits;
Run Code Online (Sandbox Code Playgroud)
据我所知,Delphi中没有可用的位域.我试过这个:
Bits = record
BaseMid: Byte; // 8 bits
_Type: 0..31; // 5 bits
Dpl: 0..3; // 2 bits
Pres: Boolean; // 1 bit
LimitHi: 0..15; // 4 bits
Sys: Boolean; …Run Code Online (Sandbox Code Playgroud) 我一直认为在F#中我们需要rec为每个递归函数使用关键字,例如:
let rec factorial = function
| 0 -> 1
| k when k > 0 -> k * (factorial (k - 1))
| failwith "oops!"
Run Code Online (Sandbox Code Playgroud)
今天我正在玩F#,我想出了类似如下的代码:
let MyRecordType =
{ Something : float;
SomethingElse : int }
with
static member factorial = function
| 0 -> 1
| k when k > 0 -> k * (MyRecordType.factorial (k - 1))
| failwith "oops!"
Run Code Online (Sandbox Code Playgroud)
如你所见,我刚刚定义了一个递归函数,但我最初看起来像是一个错误:我忘了通过关键字将函数声明为递归函数rec.
但令我惊讶的是它汇编了!还有更多:如果你添加rec关键字,那么这是一个语法错误!
type MyRecordType =
{ …Run Code Online (Sandbox Code Playgroud) 我所说的是无法定义:
data A = A {name :: String}
data B = B {name :: String}
Run Code Online (Sandbox Code Playgroud)
我知道GHC只是将其解释为普通函数,解决这个问题的惯用方法是:
data A = A {aName :: String}
data B = B {bName :: String}
class Name a where
name :: a -> String
instance Name A where
name = aName
instance Name B where
name = bName
Run Code Online (Sandbox Code Playgroud)
写完这篇文章之后,我不太喜欢它......难道这个类型化不能成为荒谬过程的一部分吗?
当我写一些Aeson JSON解析时,我想到了这个想法.如果只是为每种数据类型派生FromJSON实例都太容易了,我必须手工编写所有内容(目前> 1k行和计数).拥有像name或简单地value在数据记录中的名称并不常见.
http://www.haskell.org/haskellwiki/Performance/Overloading提到函数重载会引入一些运行时开销.但实际上我不明白为什么编译器无法在编译时解析它并在内部给它们不同的名称.
这个来自2012年的SO问题或多或少地说明了历史原因并指出了2006年的邮件主题.最近有什么变化吗?
即使存在一些运行时开销,大多数人也不会介意,因为大多数代码几乎不是性能关键.
是否有一些隐藏的语言扩展实际允许这个?我不确定......但我认为伊德里斯实际上是这样做的?
假设我想创建一个表示可接受的最小/最大边界的记录类型:
type Bounds = { Min: float; Max: float }
Run Code Online (Sandbox Code Playgroud)
有没有办法强制执行Min <Max?编写validateBounds函数很容易,我只是想知道是否有更好的方法来执行此操作.
编辑:我意识到,对于这个具体的例子,我可能会放弃暴露两个属性并重新排序参数,所以让我们说我们试图做
type Person = { Name: string }
Run Code Online (Sandbox Code Playgroud)
和名称需要至少有一个字符.
据我了解,记录实际上是类,它们以您的对象是值驱动而不是引用驱动的方式实现自己的相等性检查。
简而言之,对于record Foo像这样实现的 : var foo = new Foo { Value = "foo" }and ,即使它们有不同的引用 ( ) var bar = new Foo { Value = "foo" },foo == bar表达式也会导致。TrueReferenceEquals(foo, bar) // False
现在有了记录,即使在 .Net 博客上发表的文章中,它说:
如果您不喜欢生成的 Equals 覆盖的默认逐字段比较行为,您可以编写自己的。
当我尝试放置public override bool Equals, or public override int GetHashCode, orpublic static bool operator ==等时,我遇到了Member with the same signature is already declared错误,所以我认为这是一种受限制的行为,而struct对象并非如此。
失败的例子: …
是否可以从同一活动中记录当前运行活动的屏幕视频?
我知道如何截取当前活动的截图,但对屏幕视频记录没有任何想法.我该如何开始呢?我不知道如何开始它.
我需要能够同时拥有AVCaptureVideoDataOutput和AVCaptureMovieFileOutput工作.以下代码有效,但视频录制没有.在didFinishRecordingToOutputFileAtURL直接后调用委托startRecordingToOutputFileURL被调用.现在,如果我AVCaptureVideoDataOutput从
AVCaptureSession简单的评论中删除该行:
[captureSession addOutput:captureDataOutput];
视频录制工作,但然后不调用SampleBufferDelegate(我需要).
我怎样才能兼顾AVCaptureVideoDataOutput并AVCaptureMovieFileOutput同时工作.
- (void)initCapture {
AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:NULL];
captureDataOutput = [[AVCaptureVideoDataOutput alloc] init];
[captureDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
m_captureFileOutput = [[AVCaptureMovieFileOutput alloc] init];
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
[captureDataOutput setVideoSettings:videoSettings];
captureSession = [[AVCaptureSession alloc] init];
[captureSession addInput:captureInput];
[captureSession addOutput:m_captureFileOutput];
[captureSession addOutput:captureDataOutput];
[captureSession beginConfiguration];
[captureSession setSessionPreset:AVCaptureSessionPresetLow];
[captureSession commitConfiguration];
[self performSelector:@selector(startRecording) …Run Code Online (Sandbox Code Playgroud) 在尝试复杂的例子之前,我试图弄清楚F#的基础知识.我正在学习的材料引入了Discriminate Unions和Record类型.我已经审查了两者的材料,但我仍然不清楚为什么我们会使用一个而不是另一个.
我创建的大多数玩具示例似乎都可以在两者中实现.记录似乎与我认为的C#中的对象非常接近,但我试图避免依赖映射到c#作为理解F#的方法
所以...
是否有明确的理由使用一个而不是另一个?
是否存在适用的某些规范案例?
是否有某些功能可用于一个,而不是另一个?
我最近发现了 Java记录,了解它们的存在和用途真是太神奇了。
然而,我开始怀疑它们是否本质上只是幕后的类。
这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的 getter 的显式类?
我试图弄清楚是否可以使用Delphi中的"隐式"类运算符初始化包含动态数组的记录(柏林10.1 upd 1)
附加的程序产生以下输出:
ci iA r1 r2 r3
1 1 1 1 49694764491115752
2 2 2 2 11570520
3 3 3 3 0
4 4 4 4 0
5 5 5 5 0
Run Code Online (Sandbox Code Playgroud)
从输出中可以看出,前两个赋值(r1,r2),使用常量按预期工作.第三个赋值r3 := iArray被编译器接受,但结果被破坏了.调试器显示vin 的值TRec.Implicit已经错误.
这里出了什么问题?这有可能吗?
program Project5;
{$APPTYPE CONSOLE}
{$R *.res}
type
TRec = record
iArray: array of UInt64;
class operator Implicit(const v: array of UInt64): TRec;
end;
{ TRec }
class …Run Code Online (Sandbox Code Playgroud)