Delphi - запрос ADO и FillChar генерирует ошибки - PullRequest
0 голосов
/ 09 мая 2011

У меня есть следующий код:

var wqry:TAdoQuery;
...
  FillChar(wSpaces,cSpacesAfter,' ');
  try
    wqry := TADOQuery.Create(nil);//here the error
    wqry.Connection:=...

cSpacesAfter является константой и имеет значение 1035. wSpaces является локальной строковой переменной. Проблема в том, что я получаю следующую ошибку при создании TAdoQuery

enter image description here

даже на французском, я думаю, у вас есть идея .....

Если я прокомментирую код FillChar, все работает нормально. У меня есть обычные директивы компилятора, ничего особенного. Я использую Delphi 7.

Может кто-нибудь сказать мне, что не так с этим кодом?

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Проблемный код, скорее всего, этот

FillChar(wSpaces,cSpacesAfter,' ');

Я предполагаю, что wSpaces имеет строковый тип.Строковая переменная на самом деле является не чем иным, как указателем на структуру данных, которая содержит строку.Вам не нужно использовать синтаксис указателя, потому что компилятор позаботится об этом за вас.

Итак, этот код перезаписывает переменную, содержащую этот указатель, с 4 пробелами, а затем записывает на 1031 пробел сверху.всего, что следует за переменной.Короче говоря, вы полностью испортите свою память.Это объясняет, почему FillChar работает, но следующая строка кода умирает мучительной и драматической смертью.

Если в вашей строке действительно есть место для 1035 символов, вы можете вместо этого написать:

FillChar(wSpaces[1], cSpacesAfter, ' ');

Впрочем, если идиоматичнее написать:

wSpaces := StringOfChar(' ', cSpacesAfter);
1 голос
/ 09 мая 2011

FillChar процедура заполняет раздел памяти Буфер с тем же байтом или символом FillValue FillCount раз.

Он в основном используется для инициализации массивов чисел. Его можно использовать для инициализации записей и строк, но следует соблюдать осторожность, чтобы избежать перезаписи полей длины. StringOfChar лучше всего подходит для заполнения строк одним и тем же символом.

Вы уверены, что wSpaces имеет размер, достаточный для размещения всех cSpaces? После того, как вы в него напишите?

...