![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid pointer operation... [D7]
istok20 © (2009-12-07 23:16:00)В данном коде иногда возникает Invalid pointer operation, проблема в том, что я не знаю, при каком параметре AStr это происходит. Другие параметры проблемы обозначены ниже:
...
FUrl: array[1..255] of Char;
...
procedure StrToArray(var arStr: array of Char; AStr: string);
var
len: integer;
begin
FillCHar(arStr, Length(arStr), 0);
len := length(AStr);
if len >= Length(arStr) then len := Length(arStr) -1;
if len = 0 then exit;
Move(AStr[1], arStr, len);//<-- Invalid pointer operation
end;
...
StrToArray(FUrl, MyString) //вызов процедуры, значение MyString неизвестно..
Возможно, сможете сходу сказать в чем ошибка и как пофиксить.. Я думал что возникает при AStr='', т.к. идет обращение к AStr[1], но это исключение при этом условии пока не воспроизводится..
Спасибо.
Palladin (2009-12-08 19:07:00) [1]
> Юрий Зотов © (08.12.09 00:02) [6]
Просто не все читают учебники, но все с метлой бросаются в бой.
icWasya (2009-12-08 17:52:00) [2]FillCHar(arStr [0], Length(arStr), 0);
Move(AStr[1], arStr [0], len);
Германн (2009-12-08 02:45:00) [3]
> Move(AStr[1], arStr, len);
Всегда стараюсь избегать в таких функциях давать в качестве параметра имя массива (arStr). Предпочитаю всегда давать "адрес начала массива" arStr[].
Anatoly Podgoretsky (2009-12-08 00:04:00) [4]> Юрий Зотов (08.12.2009 00:02:06) [6]
Учебное задание
Юрий Зотов (2009-12-08 00:02:00) [5]А зачем вообще строку пребразовывать в массив символов, если она сама по себе уже и есть готовый массив символов?
KilkennyCat (2009-12-07 23:39:00) [6]а какой тип должен быть у операндов move?
Eraser (2009-12-07 23:37:00) [7]> [0] istok20 © (07.12.09 23:16)
вообще код опасный это первое, во-вторых, не совместим с юникодом.
> Move(AStr[1], arStr, len);//<-- Invalid pointer operation
var
A: TCharArray;
S: string;
begin
S := 'Test';
SetLength(A, Length(S));
Move(Pointer(S)^, A[0], Length(S) * SizeOf(Char));
istok20 (2009-12-07 23:36:00) [8]массив специально с 1, чтоб также как и string было..
KilkennyCat (2009-12-07 23:34:00) [9]массив точно с 1 должен начинаться? или все-таки с 0?
istok20 (2009-12-07 23:27:00) [10]ой, т.е. при AStr='' оно не то что не воспроизводится, а срабатывает if len = 0 then exit;