【问题标题】:Why this C to Pascal conversion crash?为什么这个 C 到 Pascal 转换崩溃?
【发布时间】:2018-02-23 17:59:49
【问题描述】:

我有这个 C 代码:

/*
  WARNING:  The order of this table must also match the order of a table
  located in AcquireResizeFilter() in "resize.c" otherwise the users filter
  will not match the actual filter that is setup.
*/
typedef enum
{
  UndefinedFilter,
  PointFilter,
  BoxFilter,
  TriangleFilter,
  HermiteFilter,
  HannFilter,
  HammingFilter,
  BlackmanFilter,
  GaussianFilter,
  QuadraticFilter,
  CubicFilter,
  CatromFilter,
  MitchellFilter,
  JincFilter,
  SincFilter,
  SincFastFilter,
  KaiserFilter,
  WelchFilter,
  ParzenFilter,
  BohmanFilter,
  BartlettFilter,
  LagrangeFilter,
  LanczosFilter,
  LanczosSharpFilter,
  Lanczos2Filter,
  Lanczos2SharpFilter,
  RobidouxFilter,
  RobidouxSharpFilter,
  CosineFilter,
  SplineFilter,
  LanczosRadiusFilter,
  CubicSplineFilter,
  SentinelFilter  /* a count of all the filters, not a real filter */
} FilterType;

和

WandExport MagickBooleanType MagickResizeImage(MagickWand *wand,
  const size_t columns,const size_t rows,const FilterType filter)

我像这样将它转换为 Pascal:

type
  FilterType =(
    UndefinedFilter,
    PointFilter,
    BoxFilter,
    TriangleFilter,
    HermiteFilter,
    HannFilter,
    HammingFilter,
    BlackmanFilter,
    GaussianFilter,
    QuadraticFilter,
    CubicFilter,
    CatromFilter,
    MitchellFilter,
    JincFilter,
    SincFilter,
    SincFastFilter,
    KaiserFilter,
    WelchFilter,
    ParzenFilter,
    BohmanFilter,
    BartlettFilter,
    LagrangeFilter,
    LanczosFilter,
    LanczosSharpFilter,
    Lanczos2Filter,
    Lanczos2SharpFilter,
    RobidouxFilter,
    RobidouxSharpFilter,
    CosineFilter,
    SplineFilter,
    LanczosRadiusFilter,
    CubicSplineFilter,
    SentinelFilter);  // a count of all the filters, not a real filter

和

function MagickResizeImage(wand: PMagickWand; const columns: size_t; rows: size_t; const filter: FilterType): MagickBooleanType; cdecl; external MagickWandDLL;

当我拨打MagickResizeImage() 时,我收到了访问冲突:(

如果我将const filter: FilterType 更改为const filter: integer,它会起作用。

知道我做错了什么吗?

【问题讨论】:

标签: delphi pascal freepascal


【解决方案1】:

在 Windows 上的 C 中,枚举是 int,因此大小为 4 个字节。在 Delphi 中,默认情况下是一个字节,如果值超过 256 个则为两个字节,以此类推。

您需要确保您的 Delphi 类型与 C 类型的大小相同。例如使用MINENUMSIZE 指令。

{$MINENUMSIZE 4}

在定义枚举类型之前放置它。

【讨论】:

  • 实际上,在 C 中,枚举的大小是由实现定义的(例如 stackoverflow.com/a/366026/95954)。但是 Windows 上大多数与 Visual-C++ 兼容的 C 和 C++ 编译器确实会为枚举使用 32 位值,因此 Delphi 代码也应该这样做。
  • @rudy 我应该在 Windows 上说 C。在 Windows C 编译器必须使用 4 字节枚举来遵守 ABI。
  • 是的就是这个,添加 {$MINENUMSIZE 4} 让一切正常:)
  • Btw CONST 在 Borland-likes 中通常与 C const 不同,但是 afaik FPC 在 cdecl 过程中坚持更多的 C 类似 CONST。
  • @Marco:与问题或答案完全无关,但 FPC 没有做它实际应该做的事情,用 const 吗? cdecl 有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多