【发布时间】:2015-06-07 06:40:18
【问题描述】:
type
TS = record
FN, RN: String;
end;
var
Sy: array of TS;
S: ^String;
...
SetLength(Sy,2);
begin
Sy[0].FN:='123';
Sy[0].RN:='bad';
Sy[1].FN:='345';
Sy[1].RN:='000';
end;
...
S := @(Sy [i].FN);
如何在C语言中模仿Pascal逻辑? 下一个代码不起作用:
typedef struct
{
char FN[256];//char FN[] /*isn't allowed by compiler*/
char RN[256];//char RN[] /*isn't allowed by compiler*/
} TS;
TS Sy[];
main()
{
Sy=malloc(2*sizeof(TS));
strcpy(Sy[1].FN,"1234");
}
问题 1
我收到编译器错误error C2106: '=' : left operand must be l-value。在SetLength的情况下我应该如何模仿Pascal逻辑?
问题 2
如何指定一个未知大小的字符串(Ansistrings 是 Pascal)。当我设置 char FN[]; 我得到错误 error C2229: struct '<unnamed-tag>' has an illegal zero-sized array 。在Ansistring的情况下我应该如何模仿Pascal逻辑?
【问题讨论】:
-
必须是纯 C,而不是例如C++? C++ 至少有 std::string。
-
它必须是 ANSI C。不是 C++。
-
正如我在调试器中看到的,Pascal 的 SetLength(Sy,2) 将分配 6 个 dwords 的内存:01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。第一个 dword 始终是 $00000001(小端序)(我不知道它的用途)。第 2 个 dword 是减 1 的元素数。第 3 个是 Sy[0].FN 地址(字符串上的指针,将被压入 FN)。第 4 个是 Sy[0].RN 地址。第 5 个是 Sy[1].FN 地址。第 6 位是 Sy[1].RN 地址。而 Pascal 的 Length(Sy) 只会接收分配的 6 个 dword 的地址作为参数,将其增加 4(因此它是第 2 个 dword),提取值,将其增加 1。
-
所以要模仿 Pascal 逻辑,我必须将数组的长度推送到元素 [-1](以 dword 表示法)。
-
可以通过下一个C语言代码来完成: Sy=calloc(sizeof(TS) * nuu + sizeof(unsigned long int),1); Sy=&((unsigned long int*)Sy)[1]; ((unsigned long int*)Sy)[-1] = nuu;
标签: arrays size pascal ansistring