首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向PChar数组的^Pchar指针

指向PChar数组的^Pchar指针
EN

Stack Overflow用户
提问于 2019-03-27 12:32:20
回答 1查看 591关注 0票数 1

当我从Delphi 6迁移到Delphi10.2东京时,当我尝试将^PChar的指针转换为PChar的数组时,会出现错误

代码语言:javascript
复制
type
  PServEnt = ^TServEnt;
  TServEnt = packed record
    s_name: PChar;                 // official service name
    s_aliases: ^PChar;             // alias list
    s_port: Smallint;              // protocol to use
    s_proto: PChar;                // port #
  end;

function TIdStackWindows.WSGetServByPort(
  const APortNumber: Integer): TIdStrings;
var
  ps: PServEnt;
  i: integer;
  p: array of PChar;
begin
  Result := TIdStringList.Create;
  p := nil;
  try
    ps := GetServByPort(HToNs(APortNumber), nil);
    if ps <> nil then
    begin
      Result.Add(ps^.s_name);
      i := 0;
      p := Pointer(ps^.s_aliases); // get error Incompatible types: 'Dynamic array' and 'Pointer' 
      while p[i] <> nil do
      begin
        Result.Add(PChar(p[i]));
        inc(i);
      end;
    end;
  except
    Result.Free;
  end;
end;

此代码在Delphi 2010中运行良好,如何在Delphi10.2东京使其正确

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 13:00:39

错误消息是正确的,如果在早期版本的Delphi中编译的代码是正确的,那是因为编译器的早期版本存在缺陷。

动态数组不仅仅是指向第一个元素的指针。它还封装存储数组长度和引用计数的元数据。因此,你的演员阵容无效。由于您没有尝试访问这个元数据,所以您没有使用这个无效的代码,但这是偶然的,也是通过意图实现的。

不要尝试转换为动态数组。相反,使用指针算法。例如:

代码语言:javascript
复制
function TIdStackWindows.WSGetServByPort(
  const APortNumber: Integer): TIdStrings;
var
  ps: PServEnt;
  p: PPChar;
begin
  Result := TIdStringList.Create;
  try
    ps := GetServByPort(HToNs(APortNumber), nil);
    if ps <> nil then
    begin
      Result.Add(ps^.s_name);
      p := PPChar(ps^.s_aliases); // cast needed due to Indy record type's use of un-nameable type
      while p^ <> nil do
      begin
        Result.Add(p^);
        inc(p);
      end;
    end;
  except
    Result.Free;
    raise;
  end;
end;

我将别名列表的类型声明更改为PPChar,以便在分配给该类型的局部变量时避免不兼容的类型错误。

还请注意,我已经更正了您的异常处理,它之前吞并异常并返回无效的对象引用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55377291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档