Sql/Docu/DB писал(а):
PROCEDURE (t: Table) Read (row: INTEGER; VAR data: ANYREC)
NEW, ABSTRACT
Reads the row'th row of the result table into the interactor data.
... Pointers must not be NIL with the exception of POINTER TO ARRAY OF CHAR. If such a pointer is NIL or the bound array is too small to receive the corresponding string, a new array of suitable length is allocated automatically...
Говорится, что новый литерный массив создаётся автоматически если исходный либо NIL, либо неподходяще малого размера.
Однако, абстрактный интерфейс SqlDrivers таков, что массивы будут создаваться всегда
Цитата:
DEFINITION SqlDrivers;
...
String = POINTER TO ARRAY OF CHAR;
Table = POINTER TO ABSTRACT RECORD
...
(t: Table) ReadVarString (row, column: INTEGER; OUT str: String), NEW, ABSTRACT
END;
В SqlOdbc3.Table.ReadVarString есть замечание:
Цитата:
IF str = NIL THEN NEW(str, 1) END; (* allow recycling of string by making parameter a VAR again? *)
Т.е. так было сделано специально. Есть мысли, почему?