Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.054 c
2-1139738996
asd
2006-02-12 13:09
2006.02.26
Удаение программой самой себя и всей папки, в которой находится п


15-1139398052
RaZor
2006-02-08 14:27
2006.02.26
Олимпиадная задачка


15-1138727472
suharew
2006-01-31 20:11
2006.02.26
Распаковка скомпилированных exe файлов


15-1138779063
yaroslav
2006-02-01 10:31
2006.02.26
обращайтесь, новички


2-1139053543
Василь
2006-02-04 14:45
2006.02.26
Помогите с IB Expert ....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский