假设我具有以下类型和变量:
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 ....
答案 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。