Форум: "WinAPI";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизОшибка при получинии первых восьми символов строки Найти похожие ветки
← →
Volf_555 (2005-12-10 01:17) [0]Необходимо получить первые 8 символов строки. Делаю это так:
scur:=memo1.Lines.Strings[a];
sres:=scur[1]+scur[2]+scur[3]+scur[4]+scur[5]+scur[6]+scur[7]
+scur[8];
Но этот код вызывает ошибку:
"Access violation at address 0045E545 in module "Change.exe". Read of address 00000000"
Что у меня не так написано и как это исправить?
← →
Volf_555 (2005-12-10 01:21) [1]Следующий код вызывает ту же ошибку (практически написано тоже самое):
scur:=memo1.Lines.Strings[a];
for a:=1 to 8 do
sres:=sres+scur[a];
← →
Alexander Panov © (2005-12-10 01:27) [2]Volf_555 (10.12.05 1:21) [1]
Скажи словами, что ты делаешь в строкеscur:=memo1.Lines.Strings[a];
?
Потому что этот код непонятен.
← →
Ihor Osov'yak © (2005-12-10 02:07) [3]попробуй так
sres := "";
if a < memo1.Lines.Count then
if memo1.Lines.Count > 0 then
if a >= 0 then
sres := Copy(memo1.Lines[a], 1, 8);
> Что у меня не так написано
Все.
> и как это исправить?
В частном случае я дал вариант решения. В общем - читать книги (не Архангельского) и думать.
← →
gdaujk © (2005-12-10 04:37) [4]На выбор:
function gdaGetIChar1(Str: string; I: Integer): string;
var
P: PChar;
begin
Result := "";
P := PChar(Str);
if lstrlen(P) >= I then
begin
Inc(P, I);
P^ := #0;
Dec(P, I);
Result := P;
end;
end;
function gdaGetIChar2(Str: string; I: Integer): string;
begin
SetLength(Result, I);
if Length(Str) >= I
then lStrCpyn(PChar(Result), PChar(Str), I + 1);
end;
Вызывать так:
sres := gdaGetICharX(Memo1.Lines[НОМЕР_СТРОКИ], ЧИСЛО_СИМВОЛОВ);
← →
Ihor Osov'yak © (2005-12-10 10:59) [5]2 gdaujk © (10.12.05 04:37) [4]
Хм.. На си недавно писали? И кто Вам сказал, что работа со строками в сишнем стиле есть более эффективной, чем работа в паскалевском стиле?. Особенно в том варианте, что привели Вы..
а, еще.. о птичках.. Для случая i < length(str) реализации интересны тем, что будут возвращать разные значения, причем вторая реализация характерна тем, что результат ее немного непредсказуемый (для упомянутого случая)..
← →
gdaujk © (2005-12-10 12:10) [6]На си недавно писали? ... работа...есть более эффективной
На Си воообще не писал, только читать приходится постоянно. А на счёт эффеткивности не знаю, реализацию Copy не видел, но думаю, что сильного отличия нет.
Кстати, функции работы со строками из SysUtils, например UpperCase, реализованы примерно также как gdaGetIChar1.
реализации... будут возвращать разные значения
А чё заведомо ложные сведенья передовать ? :-) А если серьёзно, то вот исправленный вариант:
function gdaGetIChar2(Str: string; I: Integer): string;
begin
Result := "";
if Length(Str) >= I then
begin
SetLength(Result, I);
lStrCpyn(PChar(Result), PChar(Str), I + 1);
end;
end;
но мне gdaGetIChar1 больше нравится, хотя в ней можно попробовать заменить lStrLen yf Length, что лучше, не заню.
← →
Ihor Osov'yak © (2005-12-10 13:46) [7]> Кстати, функции работы со строками из SysUtils, например UpperCase, реализованы примерно также как gdaGetIChar1.
Да неужели? Вы уверены?
Посмотрите на декларации для начала, постарайтесь заметить разницу в наличии хотя бы одного ключегово слова, ну и заодно подумайте, на что влияет факт наличия/отсутствия этого ключевого слова.
Еще. В вашей реализации gdaGetIChar1 как минимум присутствет одна лишняя операция копирования и преобразования типа (о UpperCase этого не скажешь).
> lStrLen yf Length, что лучше, не заню.
во-во, читать книжки, и до того времени, пока не будет понятно принципиальное отличие между lStrLen и Length.. Для начала разберитесь с форматами PChar и AnsiString, после этого многое должно стать понятным.
← →
Piero © (2005-12-10 14:50) [8]а так не пробовал:
scur:=memo1.Lines.Strings[a];
for a:=0 to 7 do
sres:=sres+scur[a];
← →
Ihor Osov'yak © (2005-12-10 15:37) [9]2 Piero ©
А сами то не пробовали? Извините за мой хранцузкий, но зачем фигню писать?
← →
Piero © (2005-12-10 15:49) [10]Если у человека 8 символов в 1й строке Memo1, при чтении scur[8] - будет исключение
← →
app © (2005-12-10 15:50) [11]Ты все вопросы будешь задавать в WinAPI?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c