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

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

В ЧЕМ ОШИБКА???


zzz0001 ©   (2007-09-09 13:56:00) 

function getmail(st:string) : string;

var
numst : integer;
numbegin : integer;
numend : integer;
getmails : string;
getmailsn : integer;

begin

if Pos('@',st) > 0 then
begin

numst := Pos('@',st);

while st[numst] <> ' ' do
begin
dec(numst);
end;

numbegin := numst;

numst := Pos('@',st);

while st[numst] <> ' ' do
begin
inc(numst);
end;

numend := numst;
getmailsn := 0;

for numst := numbegin to numend do
begin
showmessage(inttostr(numst));
getmails[getmailsn] := st[numst];
inc(getmailsn);
end;

getmail := getmails;

end;

****
Вылетает на getmails[getmailsn] := st[numst];


DrPass   (2007-09-09 17:34:00) [1]


> ProgRAMmer Dimonych ©   (09.09.07 17:28) [6]
> Так, я не поленился на этот раз вникнуть в чужой код.

Смотри, Ктулху уже подбирается к твоему моску


ProgRAMmer Dimonych   (2007-09-09 17:28:00) [2]

Так, я не поленился на этот раз вникнуть в чужой код.

Начну с того, что судя по всему эта функция предназначена для выполнения каких-то действий с адресами электронной почты...

Недостающий end в конце я добавил...

> function getmail(st:string) : string;
> var
>  numst : integer;
>  numbegin : integer;
>  numend : integer;
>  getmails : string;
>  getmailsn : integer;

Здесь всё понятно: По E-Mail'у генерируем серийный номер. :)

Возьмём, скажем, str=' aaa@bbb.ccc '...

> begin
>  if Pos('@',st) > 0 then
>  begin
>   numst := Pos('@',st);

>   while st[numst] <> ' ' do
>   begin
>    dec(numst);
>   end;

Интересный способ убрать лишние пробелы в начале строки...

>   numbegin := numst;

NumBegin теперь указывает на последний пробел перед '@'.

>   numst := Pos('@',st);
>   while st[numst] <> ' ' do
>   begin
>    inc(numst);
>   end;
>   numend := numst;

Не менее интересный способ удаления пробелов из конца строки. NumEnd указывает на первый пробел в адресе электронной почты.

>   getmailsn := 0;
>   for numst := numbegin to numend do
>   begin
>    showmessage(inttostr(numst));
>    getmails[getmailsn] := st[numst];
>    inc(getmailsn);
>   end;

Хм, а GetMails:=Copy(St,NumBegin,NumEnd-NumBegin+1) не катит? И, кстати, GetMails ранее нигде не используется и не инициализируется, так что в лучшем случае - обращение к символу номер 0, который... Чего-то у меня всю жизнь нумерация с 1 начинается...

>   getmail := getmails;
>  end;
> end;

Теперь если убрать пробелы в начале и конце входной строки - работа алгоритма становится непредсказуемой. Инициализация переменных - придумана не мной и не мной должна быть реализована.

Устраняем ошибки, думаем, а я ещё загляну и, если возникнут вопросы, помогу.


Palladin   (2007-09-09 17:07:00) [3]

ну как нету если пишет


zzz0001   (2007-09-09 17:06:00) [4]

я же сказал - превышения нету
почему ошибку дает?


Anatoly Podgoretsky   (2007-09-09 14:14:00) [5]

> zzz0001  (09.09.2007 13:56:00)  [0]

Еще один партизан сегодня.
И просто удивительно если подобный код будет работать.
Не единой проверки на допустимость.


zzz0001   (2007-09-09 14:06:00) [6]

на ошибку оут оф ранж
хотя первый символ на 18 позиции последний на 31
куда там вылетать не ясно


Palladin   (2007-09-09 14:03:00) [7]

куда вылетает? в астрал?

границы массива/списка или чего у тебя там проверь


Наверх

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