Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при получинии первых восьми символов строки [D6, WinXP]


Volf_555 ©   (2005-12-10 01:17:00) 

Необходимо получить первые 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"

Что у меня не так написано и как это исправить?


app   (2005-12-10 15:50:00) [1]

Ты все вопросы будешь задавать в WinAPI?


Piero   (2005-12-10 15:49:00) [2]

Если у человека 8 символов в 1й строке Memo1, при чтении scur[8] - будет исключение


Ihor Osov'yak   (2005-12-10 15:37:00) [3]

2 Piero ©

А сами то не пробовали? Извините за мой хранцузкий, но зачем фигню писать?


Piero   (2005-12-10 14:50:00) [4]

а так не пробовал:
scur:=memo1.Lines.Strings[a];
for a:=0 to 7 do
sres:=sres+scur[a];


Ihor Osov'yak   (2005-12-10 13:46:00) [5]

> Кстати, функции работы со строками из SysUtils, например UpperCase, реализованы примерно также как gdaGetIChar1.

Да неужели? Вы уверены?
Посмотрите на декларации для начала, постарайтесь заметить разницу в наличии хотя бы одного ключегово слова, ну и заодно подумайте, на что влияет факт наличия/отсутствия этого ключевого слова.
Еще. В вашей реализации gdaGetIChar1 как минимум присутствет одна лишняя операция копирования и преобразования типа (о UpperCase этого не скажешь).

>  lStrLen yf Length, что лучше, не заню.

во-во, читать книжки, и до того времени, пока не будет понятно принципиальное отличие между lStrLen и Length.. Для начала разберитесь с форматами PChar и AnsiString, после этого многое должно стать понятным.


gdaujk   (2005-12-10 12:10:00) [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 10:59:00) [7]

2 gdaujk ©   (10.12.05 04:37) [4]

Хм.. На си недавно писали? И кто Вам сказал, что работа со строками в сишнем стиле есть более эффективной, чем работа в паскалевском стиле?. Особенно в том варианте, что привели Вы..

а, еще.. о птичках.. Для случая i < length(str) реализации интересны тем, что будут возвращать разные значения, причем вторая реализация характерна тем, что результат ее немного непредсказуемый (для упомянутого случая)..


gdaujk   (2005-12-10 04:37:00) [8]

На выбор:

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 02:07:00) [9]

попробуй так

sres := '';
if a < memo1.Lines.Count then
 if memo1.Lines.Count > 0 then
   if a >= 0 then
     sres := Copy(memo1.Lines[a], 1, 8);

> Что у меня не так написано
Все.

> и как это исправить?
В частном случае я дал вариант решения. В общем - читать книги (не Архангельского) и думать.


Alexander Panov   (2005-12-10 01:27:00) [10]

Volf_555   (10.12.05 1:21) [1]

Скажи словами, что ты делаешь в строке scur:=memo1.Lines.Strings[a];?

Потому что этот код непонятен.


Volf_555   (2005-12-10 01:21:00) [11]

Следующий код вызывает ту же ошибку (практически написано тоже самое):

scur:=memo1.Lines.Strings[a];
for a:=1 to 8 do
sres:=sres+scur[a];


Наверх

Титульная страница Поиск, карта сайта Написать письмо