标签: record

如何在Delphi记录中模拟位域?

我想在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)

delphi record bit-fields

25
推荐指数
3
解决办法
1万
查看次数

记录类型的递归成员函数和"rec"关键字

我一直认为在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)

recursion f# record

25
推荐指数
2
解决办法
3071
查看次数

为什么GHC Haskell不支持重载记录参数名称?

我所说的是无法定义:

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年的邮件主题.最近有什么变化吗?

即使存在一些运行时开销,大多数人也不会介意,因为大多数代码几乎不是性能关键.

是否有一些隐藏的语言扩展实际允许这个?我不确定......但我认为伊德里斯实际上是这样做的?

haskell overloading record aeson idris

25
推荐指数
1
解决办法
1174
查看次数

是否可以强制记录尊重某些不变量?

假设我想创建一个表示可接受的最小/最大边界的记录类型:

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)

和名称需要至少有一个字符.

f# record refinement-type

24
推荐指数
2
解决办法
1539
查看次数

C# 9 记录的自定义相等检查

据我了解,记录实际上是类,它们以您的对象是值驱动而不是引用驱动的方式实现自己的相等性检查。

简而言之,对于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对象并非如此。

失败的例子: …

c# equality record c#-9.0

24
推荐指数
1
解决办法
4664
查看次数

Android当前活动的屏幕视频记录

是否可以从同一活动中记录当前运行活动的屏幕视频?
我知道如何截取当前活动的截图,但对屏幕视频记录没有任何想法.我该如何开始呢?我不知道如何开始它.

java android screen record

23
推荐指数
4
解决办法
3万
查看次数

同时AVCaptureVideoDataOutput和AVCaptureMovieFileOutput

我需要能够同时拥有AVCaptureVideoDataOutputAVCaptureMovieFileOutput工作.以下代码有效,但视频录制没有.在didFinishRecordingToOutputFileAtURL直接后调用委托startRecordingToOutputFileURL被调用.现在,如果我AVCaptureVideoDataOutputAVCaptureSession简单的评论中删除该行:

[captureSession addOutput:captureDataOutput];

视频录制工作,但然后不调用SampleBufferDelegate(我需要).

我怎样才能兼顾AVCaptureVideoDataOutputAVCaptureMovieFileOutput同时工作.

- (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)

iphone camera record video-capture ios

22
推荐指数
1
解决办法
1万
查看次数

何时在F#中使用判别联盟vs记录类型

在尝试复杂的例子之前,我试图弄清楚F#的基础知识.我正在学习的材料引入了Discriminate Unions和Record类型.我已经审查了两者的材料,但我仍然不清楚为什么我们会使用一个而不是另一个.

我创建的大多数玩具示例似乎都可以在两者中实现.记录似乎与我认为的C#中的对象非常接近,但我试图避免依赖映射到c#作为理解F#的方法

所以...

  • 是否有明确的理由使用一个而不是另一个?

  • 是否存在适用的某些规范案例?

  • 是否有某些功能可用于一个,而不是另一个?

f# record discriminated-union

22
推荐指数
3
解决办法
3563
查看次数

记录是类的语法糖吗?

我最近发现了 Java记录,了解它们的存在和用途真是太神奇了。

然而,我开始怀疑它们是否本质上只是幕后的类。

这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的 getter 的显式类?

java record java-record

22
推荐指数
1
解决办法
2268
查看次数

包含带有"隐式"类运算符的动态数组的Delphi记录的初始化

我试图弄清楚是否可以使用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)
  • TRec是包含我想要初始化的动态数组的记录类型.
  • ci是一个常数的整数数组.
  • ia是一个动态的整数数组.
  • r1,r2,r3是TRec类型的记录,它们以不同的方式初始化.

从输出中可以看出,前两个赋值(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)

arrays delphi initialization record dynamic

21
推荐指数
1
解决办法
916
查看次数