Поясню на всякий случай – мы тут размер не знаем ни на этапе компиляции, ни на этапе исполнения. Если после вызова функции нам оно скажет что "нишмогла, не поместилась в буфер даденого размера", то стратегия проста – удваиваем размер буфера и пробуем снова. Для удваивания буфера, как я заметил выше, массивы с размером неизвестным на этапе компиляции не нужны.
В принципе я знаю, как решается эта проблема, но насколько это решение будет красивым. Например, в какую-нибудь внешнюю функцию нужно передать указатель на непрерывный кусок памяти, допустим от 256 байт до 1 Гб.
Тогда это можно сделать следующим способом:
TYPE
r1 = RECORD a1: ARRAY 256 OF CHAR END;
p1 = POINTER TO r1;
r2 = RECORD (r1) a2: ARRAY 256 OF CHAR END;
p2 = POINTER TO r2;
r3 = RECORD (r2) a3: ARRAY 512 OF CHAR END;
p3 = POINTER TO r3;
r4 = RECORD (r3) a4: ARRAY 1024 OF CHAR END;
p4 = POINTER TO r4;
r5 = RECORD (r4) a5: ARRAY 2048 OF CHAR END;
p5 = POINTER TO p5;
p6 = RECORD (p5) a6: ARRAY 4096 OF CHAR END;
p6 = POINTER TO r6;
r7 = RECORD (r6) a7: ARRAY 8192 OF CHAR END;
p7 = POINTER TO r7;
r8 = RECORD (r7) a8: ARRAY 16384 OF CHAR END;
p8 = POINTER TO r8;
r9 = RECORD (r8) a9: ARRAY 32768 OF CHAR END;
p9 = POINTER TO r9;
r10 = RECORD (r9) a10: ARRAY 65536 OF CHAR END;
p10 = POINTER TO r10;
r11 = RECORD (r10) a11: ARRAY 131072 OF CHAR END;
p11 = POINTER TO r11;
r12 = RECORD (r11) a12: ARRAY 262144 OF CHAR END;
p12 = POINTER TO r12;
r13 = RECORD (r12) a13: ARRAY 524288 OF CHAR END;
p13 = POINTER TO r13;
r14 = RECORD (r13) a14: ARRAY 1048576 OF CHAR END;
p14 = POINTER TO r14;
r15 = RECORD (r14) a15: ARRAY 2097152 OF CHAR END;
p15 = POINTER TO r15;
r16 = RECORD (r15) a16: ARRAY 4194304 OF CHAR END;
p16 = POINTER TO r16;
r17 = RECORD (r16) a17: ARRAY 8388608 OF CHAR END;
p17 = POINTER TO r17;
r18 = RECORD (r17) a18: ARRAY 16777216 OF CHAR END;
p18 = POINTER TO r18;
r19 = RECORD (r18) a19: ARRAY 33554432 OF CHAR END;
p19 = POINTER TO r19;
r20 = RECORD (r19) a20: ARRAY 67108864 OF CHAR END;
p20 = POINTER TO r20;
r21 = RECORD (r20) a21: ARRAY 134217728 OF CHAR END;
p21 = POINTER TO r21;
r22 = RECORD (r21) a22: ARRAY 268435456 OF CHAR END;
p22 = POINTER TO r22;
r23 = RECORD (r22) a23: ARRAY 536870912 OF CHAR END;
p23 = POINTER TO r23;
(* Должна вернуть указатель на данные *)
PROCEDURE GetAnswer(VAR p: p1);
VAR t1: p1; t2: p2; t3: p3; t4: p4; t5: p5; t6: p6; t7: p7; t8: p8; t9: p9;
t10: p10; t11: p11; t12: p12; t13: p13; t14: p14; t15: p15; t16: p16; t17: p17; t18: p18; t19: p19;
t20: p20; t21: p21; t22: p22; t23: p23; t24: p24;
size: INTEGER;
BEGIN
size := GetSize; (* Получаем размер данных *)
IF size <= 256 THEN NEW(t1); p := t1
ELSIF size <= 512 THEN NEW(t2); p := t2;
ELSIF size <= 1024 THEN NEW(t3); p := t3;
ELSIF size <= 2048 THEN NEW(t4); p := t4;
ELSIF size <= 4096 THEN NEW(t5); p := t5;
ELSIF size <= 8192 THEN NEW(t6); p := t6;
ELSIF size <= 16384 THEN NEW(t7); p := t7;
ELSIF size <= 32768 THEN NEW(t8); p := t8;
ELSIF size <= 65536 THEN NEW(t9); p := t9;
ELSIF size <= 131072 THEN NEW(t10); p := t10;
ELSIF size <= 262144 THEN NEW(t11); p := t11;
ELSIF size <= 524288 THEN NEW(t12); p := t12;
ELSIF size <= 1048576 THEN NEW(t13); p := t13;
ELSIF size <= 2097152 THEN NEW(t14); p := t14;
ELSIF size <= 4194304 THEN NEW(t15); p := t15;
ELSIF size <= 8388608 THEN NEW(t16); p := t16;
ELSIF size <= 16777216 THEN NEW(t17); p := t17;
ELSIF size <= 33554432 THEN NEW(t18); p := t18;
ELSIF size <= 67108864 THEN NEW(t19); p := t19;
ELSIF size <= 134217728 THEN NEW(t20); p := t20;
ELSIF size <= 268435456 THEN NEW(t21); p := t21;
ELSIF size <= 536870912 THEN NEW(t22); p := t22;
ELSE NEW(t23); p := t23;
END;
(* Передаем выделенную память во внешнюю систему *)
Answer(p^);
END GetAnswer;
(* Программу не компилировал, а просто написал, для примера *)