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? Следующий код не работает:c язык. SetLength, массив структур
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?
ВОПРОС 2
Как указать строку неизвестного размера (AnsiStrings является Паскаль). Когда я установил char FN[];
, я получаю ошибку error C2229: struct '<unnamed-tag>' has an illegal zero-sized array
. Что я должен сделать, чтобы подражать логике Паскаля в случае Ансистринга?
Должно быть, это просто C, а не, например. C++? C++ по крайней мере имеет std :: string. –
Это должен быть ANSI C. ** Не C++. ** – testnameC04
Как я вижу в отладчике, SetLength (Sy, 2) Паскаля выделяет память из 6 слов: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00. 1-й dword всегда $ 00000001 (мало-Endian порядка) (я не знаю, для чего он предназначен). 2nd dword - количество элементов, уменьшенных на 1. 3rd - это Sy [0] .FN адрес (указатель на строку, которая будет нажата в FN). Четвертый - адрес Sy [0] .RN. 5-й адрес Sy [1] .FN. 6-й - адрес Sy [1] .RN. И длина Паскаля (Sy) будет просто получать адрес выделенного 6 слов в качестве параметра, увеличить его на 4 (так что это второй dword), извлечь значение, увеличить его на 1. – testnameC04