Главная страница
    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.042 c
8-1127057492
maVladimir
2005-09-18 19:31
2006.02.26
Коррекция цвета в Windows


1-1138092905
son_g
2006-01-24 11:55
2006.02.26
По поводу одновременного доступа к файлам


4-1133898889
Svit
2005-12-06 22:54
2006.02.26
Имитация нажатия мыши в флеш приложение


2-1139175957
makvell
2006-02-06 00:45
2006.02.26
Ярлыки


15-1139235705
default
2006-02-06 17:21
2006.02.26
Есть смысл накладывать XP на XP?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский