Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2009, 16:52   #1
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию Почему при исключении showmessage() их цикла появляется ошибка? (Delphi)

Уже несколько дней не могу понять отчего так.
Эта программа вычисляет результат сложения и вычитания из строки символов.

Всё нормально работает, но если убрать из цикла активирущуюся showmessage(a), то выскакивает сообщение об ошибке (и то не всегда) "access violation at address 00454E9A in module 'Project1.exe'. Read of address 00B68000". Причем showmessage(a) можно переместить в любое место цикла и ошибки тоже не будет.
С чем это связанно? И как этого избежать?

Спасибо.

Код:
var i,j:integer; a,b,c,sk:string; aa,bb,cc:currency;  pm,znak:char;
begin

sk:=edit1.text;
j:=1;

  while j>0 do
  begin
      a:=sk;

      i:=1;
      repeat
        inc(i);
        znak:=a[i];
      until (znak='+') or (znak='-');

      setlength(a,i-1);

      try aa:=strtofloat(a)
      except showmessage('недопустимые знаки в строке: '+a)
      end;
      

      b:= copy(sk, i+1, length(sk));
      i:=0;
      repeat
            inc(i);
            pm:=b[i];
      until (pm='+') or (pm='-');
      b:=copy(b,1,i-1);

      try bb:=strtofloat(b)                                                                 
      except showmessage('недопустимые знаки в строке: '+b)
      end;

      case znak of
      '+': cc:=aa+bb;
      '-': cc:=aa-bb
      end;

      c:=a+znak+b;
      i:=ansipos(c,sk);
      delete(sk,i,length(c));
      insert(floattostr(cc),sk,i);

      try cc:= strtofloat(sk);j:=0 
      except  showmessage(sk+'     '+(inttostr(j))) //при скрытии этой процедуры появляется ошибка
      end;
      memo1.lines.Add(a+'   '+znak+'    '+b+' = '+floattostr(cc));

end;
end;
marina15056 вне форума Ответить с цитированием
Старый 24.06.2009, 17:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: ты уверена что именно на ShowMessage вылетает?
Если да то скорее всего strtofloat не может преобразовать строку в нее поданую по причинам отсутствия там правильного вида числа (например вместо . там стоит ,)

Во-вторых: Для полного анализа нужно видеть весь код
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2009, 17:24   #3
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Во-первых: ты уверена что именно на ShowMessage вылетает?
Если да то скорее всего strtofloat не может преобразовать строку в нее поданую по причинам отсутствия там правильного вида числа (например вместо . там стоит ,)

Во-вторых: Для полного анализа нужно видеть весь код
Вылетает вот это сообщение: access violation at address 00454E9A in module 'Project1.exe'. Read of address 00B68000
если я удалю скрою или удалю ShowMessage (а или sk)

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer; a,b,c,sk:string; aa,bb,cc:currency;  pm,znak:char;
begin

sk:=edit1.text;
j:=1;

  while j>0 do
  begin
      a:=sk;

      i:=1;
      repeat
        inc(i);
        znak:=a[i];
      until (znak='+') or (znak='-');

      setlength(a,i-1);

      try aa:=strtofloat(a)
      except showmessage('недопустимые знаки в строке: '+a)
      end;
      

      b:= copy(sk, i+1, length(sk));
      i:=0;
      repeat
            inc(i);
            pm:=b[i];
      until (pm='+') or (pm='-');
      b:=copy(b,1,i-1);

      try bb:=strtofloat(b)                                                                 
      except showmessage('недопустимые знаки в строке: '+b)
      end;

      case znak of
      '+': cc:=aa+bb;
      '-': cc:=aa-bb
      end;

      c:=a+znak+b;
      i:=ansipos(c,sk);
      delete(sk,i,length(c));
      insert(floattostr(cc),sk,i);

      try cc:= strtofloat(sk);j:=0 
      except  showmessage(sk+'     '+(inttostr(j)))
      end;
      memo1.lines.Add(a+'   '+znak+'    '+b+' = '+floattostr(cc));

end;
end;

end.
вот и весь код, правда есть еще одна часть, она предварительно умножает и делит, но в ней ошибки нет, поэтому я оставила только эту часть, глючную.
Вложения
Тип файла: rar Project2.rar (169.4 Кб, 8 просмотров)
marina15056 вне форума Ответить с цитированием
Старый 24.06.2009, 17:28   #4
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию

а вот этот файл с ошибкой

наконец-то разобралась,
заменила эту часть кода
Код:
      b:= copy(sk, i+1, length(sk));
      i:=0;
      repeat
            inc(i);
            pm:=b[i];
      until (pm='+') or (pm='-');
      b:=copy(b,1,i-1);

      try bb:=strtofloat(b)                                                                 
      except showmessage('недопустимые знаки в строке: '+b)
      end;
на эту
Код:
      b:= sk;
      delete(b,1,length(a)+1);
      if (ansipos('+',b)>0) then  setlength(b,ansipos('+',b)-1);
      if (ansipos('-',b)>0) then  setlength(b,ansipos('-',b)-1);
      try bb:=strtofloat(b)                                                                 
      except showmessage('недопустимые знаки в строке: '+b)
      end;
но мне всё равно не понятно, почему, когда я вставляла в код в произвольном месте команду showmessage с отображением переменных sk или a, так, что бы каждый раз при пересчете она вызывалась, то ошибка пропадала. Это-то меня сильно и запутало.
Вложения
Тип файла: rar Project2error.rar (169.3 Кб, 7 просмотров)

Последний раз редактировалось Stilet; 25.06.2009 в 14:26.
marina15056 вне форума Ответить с цитированием
Старый 25.06.2009, 14:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но мне всё равно не понятно
Судя по всему ошибка у тебя вылетала из-за того что Делфи ее перехватывала, и вне зависимости от твоего обработчика ошибок вызывала свой собственный. Впрочем эт олечится в настройках, но думаю это просто неверная стратегия...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При подключение к сети появляется ошибка svchost.exe Bayram_662 Windows 7 08.05.2009 21:46
Почему ошибка при копировании? valerij Microsoft Office Excel 8 02.05.2009 01:49
Почему появляется цикл? valerij Microsoft Office Excel 11 11.02.2009 00:20
При подключении к нету появляется мессаг.Как сделать??? Teen4jump Работа с сетью в Delphi 8 26.06.2007 17:37
странная ошибка с ShowMessage UMmi Общие вопросы Delphi 3 22.11.2006 06:20