小编Ast*_*oth的帖子

为什么在多个标准头文件中声明了特定的C数据类型?

例如,C11规定size_t应在以下头文件中声明:

  • STDDEF.H
  • stdio.h中
  • stdlib.h中
  • string.h中
  • time.h中
  • uchar.h
  • wchar.h

在阅读C11时,我发现在多个标准头文件中声明了许多其他数据类型.

问题

  1. 让我们说的是size_t.为什么不只是stddef.h为了简单?
  2. 假设C编译器size_t在那些头文件中实现.它们是否保证在这些头文件中具有相同的定义?

c dry

25
推荐指数
4
解决办法
1066
查看次数

为什么Delphi和Free Pascal通常更喜欢有符号整数数据类型到无符号整数?

我不是Pascal新手,但直到现在我仍然不知道为什么DelphiFree Pascal通常声明参数并将值返回为有符号整数,而我看到它们应该始终是正数.例如:

  • Pos()返回Integer的类型.有可能成为负面的吗?
  • SetLength()NewLength参数声明为Integer的类型.字符串是否有负长度?
  • System.THandle宣称为Longint.手柄有负数吗?

有许多决定,如Delphi和Free Pascal.这背后有什么考虑因素?

delphi pascal freepascal

17
推荐指数
4
解决办法
2077
查看次数

为什么在这个C代码中使用的IEEE-754指数偏差是126.94269504而不是127?

以下C函数来自fastapprox项目.

static inline float 
fasterlog2 (float x)
{
  union { float f; uint32_t i; } vx = { x };
  float y = vx.i;
  y *= 1.1920928955078125e-7f;
  return y - 126.94269504f;
}
Run Code Online (Sandbox Code Playgroud)

有些专家可以解释一下为什么上面代码中使用的指数偏差是126.94269504而不是127?是否更准确的偏差值?

c math floating-point ieee-754

14
推荐指数
1
解决办法
279
查看次数

钻头检查数字是否在特定范围内

我在"source\common\unicode\utf.h"ICU库(International Components for Unicode)的文件中发现了一个有趣的小问题.钻头用于检查数字是否在特定范围内.

// Is a code point in a range of U+d800..U+dbff?
#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
Run Code Online (Sandbox Code Playgroud)

我已经想出了幻数(0xfffffc00)来自:

MagicNumber = 0xffffffff - (HighBound - LowBound)
Run Code Online (Sandbox Code Playgroud)

但是,我还发现该公式不适用于每个任意范围.这里有人知道公式在什么情况下有效吗?

还有另外一点是为了检查一个数字是否在特定范围内吗?

c c++ algorithm bit-manipulation

11
推荐指数
1
解决办法
1809
查看次数

如何将C联合翻译成Delphi?

typedef struct _FILE_OBJECTID_INFORMATION {
    LONGLONG FileReference;
    UCHAR ObjectId[16];
    union {
        struct {
            UCHAR BirthVolumeId[16];
            UCHAR BirthObjectId[16];
            UCHAR DomainId[16];
        } DUMMYSTRUCTNAME;
        UCHAR ExtendedInfo[48];
    } DUMMYUNIONNAME;
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
Run Code Online (Sandbox Code Playgroud)

如何将这样的联盟翻译成Delphi?

delphi

10
推荐指数
2
解决办法
5807
查看次数

尝试编译此代码会导致IDE终止或编译器无法运行,这是一个错误吗?

注意Exit内联函数中的命令用法!我一直在这里使用Delphi XE3.

症状

在某些情况下,当呼叫到包含一个内联函数取得Exit命令,并返回值的内联函数的用于直接WriteLn(),编译器报告的错误消息,

"dcc"退出代码1.

甚至最糟糕的是,Delphi IDE在没有任何确认的情况下终止.

function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber = 0 then begin
    Result := False;
    Exit;
  end;
  // some code here ...
  Result := True;
end;

procedure Test;
begin
  writeln( ProcessNumber(0) );
end;

begin
  Test;
  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

但是,如果内联函数的返回值存储在变量中,然后使用该变量WriteLn(),则不会发生该问题.

procedure Test;
var
  b: Boolean;
begin
  b := ProcessNumber(0);
  writeln(b);
end;
Run Code Online (Sandbox Code Playgroud)

问题

  1. 这是编译器错误吗?
  2. 如果这是一个错误,是否有解决方法安全退出内联函数?

delphi delphi-xe3

10
推荐指数
1
解决办法
370
查看次数

Delphi:是否有一个工具可以删除特定条件符号的条件指令?

我有许多单元包含许多条件指令块,例如:

{$IFDEF DELPHI6ANDLOWER}
  *Do something 1*
{$ELSE}
  *Do something 2*
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

现在,我决定放弃对Delphi 6(VER140)和更低版本的支持.

有没有可以发挥魔力的工具?希望上面的代码变成:

  *Do something 2*
Run Code Online (Sandbox Code Playgroud)

我测试过ModelMaker,CnPack,GExperts,但是没有一个能够做到这一点.

delphi

9
推荐指数
1
解决办法
303
查看次数

Delphi:使用System.New()而不是局部变量有什么好处,除了节省少量内存?

让我们回到基础.坦率地说,我之前从未使用NewDispose运作过.但是,在我阅读Embarcadero技术网站上的New()文档和包含的示例以及New()Delphi Basics解释之后,它在我脑海中留下了一些问题:

System.New()除了节省少量内存之外,使用而不是局部变量有什么好处?

常用代码示例New()或多或少如下:

  var
      pCustRec : ^TCustomer;
  begin
      New(pCustRec);
      pCustRec^.Name := 'Her indoors';
      pCustRec^.Age  := 55;
      Dispose(pCustRec);
  end;
Run Code Online (Sandbox Code Playgroud)

在什么情况下上面的代码比下面的代码更合适?

  var
      CustRec : TCustomer;
  begin
      CustRec.Name := 'Her indoors';
      CustRec.Age  := 55;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi pascal fpc

9
推荐指数
3
解决办法
2182
查看次数

LARGE_INTEGER或TLargeInteger?

Windows.pas,有:

  LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;

  TLargeInteger = Int64;
Run Code Online (Sandbox Code Playgroud)

我看到几个Windows函数和结构成员最初声明为LARGE_INTEGER已被翻译为TLargeInteger如下:

  function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL;
      stdcall;
Run Code Online (Sandbox Code Playgroud)

另一个例子是:

  WIN32_STREAM_ID = record
    dwStreamId        : DWORD;
    dwStreamAttributes: DWORD;
    Size              : TLargeInteger;
    dwStreamNameSize  : DWORD;
    cStreamName       : array[0..0] of WCHAR;
  end;
Run Code Online (Sandbox Code Playgroud)

可以TLargeInteger作为LARGE_INTEGERWindows头文件中找到的每个函数参数和结构成员的替代吗?

delphi

6
推荐指数
1
解决办法
2005
查看次数

Delphi:在PChar指向的字符串变量发生变化后,临时PChar是否保证具有相同的值?

以下代码在我的系统中按预期运行,但我不确定P变量是否保证MyArray[0]更改为新值后具有相同的值.

procedure Test;
var
  MyArray: array of string;
  P : PChar;

begin
  SetLength(MyArray, 2);
  MyArray[0] := 'ABCD';
  MyArray[1] := '1234';

  // Is P guaranteed to have the same value all the time?
  P := PChar(MyArray[0]);

  MyArray[0] := MyArray[1];
  MyArray[1] := P;

  WriteLn(MyArray[0]);
  WriteLn(MyArray[1]);
end;
Run Code Online (Sandbox Code Playgroud)

delphi freepascal

6
推荐指数
1
解决办法
287
查看次数