有没有办法确定指针的类型?

时间:2019-01-21 13:37:07

标签: delphi

假设我具有以下类型和变量:

type

TMyStruct1 = record
  Int1        : Integer;
  Int2        : Integer;
  Str1        : String;
  Str2        : String;
end;
PMyStruct1 = ^TMyStruct1;

TMyStruct2 = record
  Int1        : Integer;
  Int2        : Integer;
  Str1        : String;
  Str2        : String;
end;
PMyStruct2 = ^TMyStruct2;

var

P1: PMyStruct1;
P2: PMyStruct2; 

我有一个接受Pointer作为参数的函数。有没有办法确定该函数是用P1还是P2变量调用的?

类似的东西:

function DoSomething(P: Pointer);
begin
 //if  ??? Type(P) = PMyStruct1 ??? then ....

3 个答案:

答案 0 :(得分:4)

  

是否可以确定是使用P1变量还是P2变量调用函数?

不,没有。

答案 1 :(得分:3)

您可以通过在结构中添加“标准标头”来实现。对于您而言,只需一个简单的字段即可表明您的结构类型。

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/operator/mergeMap'; 

@Injectable()
export class HttpProvider {

  constructor(public http: HttpClient,
              public dataProvider: DataProvider,
              public locStor: LocalStorageProvider) {
    console.log('Hello HttpProvider Provider');
  }

  public doGetRequest(url: string) {
    return Observable.fromPromise(this.getHeaders()).flatMap((headers) => {
      this.http.get(url, headers);
    });
  }

  public doPostRequest(url: string, params: any) {
    return this.http.post(url, params);
  }

  public getHeaders() {
    return getToken()
      .then((token) => ({
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json',
          'Authorization': 'Bearer test',
          'token': token,
        },
        params: new HttpParams()
      });
  }

  private getToken() {
    this.locStor.getValue(Constants.LS_KEY_USER_TOKEN)
  }

}

无论谁调用您的函数,都有责任正确地填充const STRUCT_1 = 1; STRUCT_2 = 2; type TMyStruct1 = record StructType : Integer Int1 : Integer; Int2 : Integer; Str1 : String; Str2 : String; end; PMyStruct1 = ^TMyStruct1; TMyStruct2 = record StructType : Integer Int1 : Integer; Int2 : Integer; Str1 : String; Str2 : String; end; PMyStruct2 = ^TMyStruct2; var P1: PMyStruct1; P2: PMyStruct2; function DoSomething(P: Pointer); begin case PInteger(P)^ of //points to StructType STRUCT_1 : ; STRUCT_2 : ; end; end; 字段。

作为向前兼容性的一种措施,如果最终需要每个结构的多个版本,则还可以添加“ StructSize”字段。

这种类型检查是“弱”的,在某种意义上说,不能保证指针的类型正确,它仅检查指向的前4个字节是否包含STRUCT_1或STRUCT_2。

现在,如果您不控制这些记录的定义,那么您就不走运了。

答案 2 :(得分:0)

指针是一种变量,可以存储内存地址或特殊的nil值。

它可以指向任何东西,有效或无效的,已经破坏的对象,变量,字符串中的第三个字符或另一个指针。

但是它只存储内存地址,仅此而已。无法从内存地址知道类型。如果您需要类型或其他信息,则应该多加注意。

对于同类结构,一种方法是将其类型或版本存储在结构的第一个字节中,然后像Ken的回答一样,在指针地址上指向匹配的PStructureX。