Метки label ...

Forsaken3

Вот код моей программы:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg, TeEngine, Series, TeeProcs, Chart;
 
type
  TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioButton6: TRadioButton;
    Label1: TLabel;
    Memo2: TMemo;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Chart1: TChart;
    Series1: TFastLineSeries;
 
    {procedure Label1Click(Sender: TObject); }
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
a,b,C,C1,C2,C3,d,d1,d2,d3,e0,e1,esp:real; s:string; i:boolean;
 
implementation
 
{$R *.dfm}
label m,k,n;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
i:=Radiobutton1.Checked;
if i=true then
  begin a:=0.002; b:=0.005; e1:=4.1; C:=10; end;
i:=RadioButton2.Checked;
if i=True then
  begin a:=0.004; b:=0.007; e1:=10; C:=2; end;
i:=RadioButton3.Checked;
if i=true then
  begin a:=0.004; b:=0.006; e1:=3.7; C:=6.5; end;
i:=RadioButton4.Checked;
if i=true then
  begin a:=0.02; b:=0.01; e1:=7; C:=10; end;
i:=RadioButton5.Checked;
if i=true then
  begin a:=0.015; b:=0.008; e1:=9.6; C:=15; end;
i:=RadioButton6.Checked;
if i=true then
  begin a:=0.009; b:=0.012; e1:=5.1; C:=9; end;
 
Memo2.text:='a='+Floattostr(a)+';         b='+FloatToStr(b)+';              e1='+Floattostr(e1)+';       c='+FloatToStr(C);
 
 
e0:=8.85; esp:=0.01*C;
If a<b then d1:=a else d1:=b;
C1:=((e1*e0*a*b)/d1)*(1+(d1/(pi*a))*(1+ln((2*pi*a)/d1)))*(1+(d1/(pi*b))*(1+ln((2*pi*b)/d1)));
If abs(C1-C)<=esp then d:=d1
else m: begin d2:=d1/2;
C2:=((e1*e0*a*b)/d2)*(1+(d2/(pi*a))*(1+ln((2*pi*a)/d2)))*(1+(d2/(pi*b))*(1+ln((2*pi*b)/d2)));
If abs(C2-C)<=esp then d:=d2
else
begin
if C1>C2 then
begin
if C>C2 then
k: begin
d3:=(d1+d2)/2;
C3:=((e1*e0*a*b)/d3)*(1+(d3/(pi*a))*(1+ln((2*pi*a)/d3)))*(1+(d3/(pi*b))*(1+ln((2*pi*b)/d3)));
if abs(C3-C)<=esp then d:=d3
else begin
If C>C3 then begin  d2:=d3; C2:=C3; goto k; end
else begin  d1:=d3; C1:=C3; goto k; end;
end;end;
if C<C2 then begin  d1:=d2; C1:=C2; end;
goto m;
end;
If C1<C2 then begin
if C>C2 then begin d1:=d2; C1:=C2; goto m; end
else n: begin
d3:=(d1+d2)/2;
C3:=((e1*e0*a*b)/d3)*(1+(d3/(pi*a))*(1+ln((2*pi*a)/d3)))*(1+(d3/(pi*b))*(1+ln((2*pi*b)/d3)));
if abs(C3-C)<=esp then d:=d3
else begin
If C>C3 then begin d1:=d3; C1:=C3; goto n; end
else begin d2:=d3; C2:=C3; goto n; end;
end;end;end;end;end;
s:=FloatToStr(d);
Form1.Label1.Caption:=' d= '+s+' Г¬.';
end.
Столкнулся со следующей ошибкой: Метки k,m,n не объявлены в данной процедуре. Объявить те самые метки получается только сразу после строки implementation, более она нигде их не признает. Пытался заключить в отдельный (вывести из процедуры) цикл(begin...end) код нахождения переменной (73-105 строки), выдаёт error в процессе компиляции на строке 75 invalid floating point operation, в конце компиляции error 216. код на 100% работает в pascal, где я его и писал, т.к. с дельфи практически не знаком. Помогите кто-чем сможет, завтра на защиту
12 ответов

Forsaken3

Forsaken3, не надо писать вот так
i:=Radiobutton1.Checked;
if i=true then
Достаточно вот так
if Radiobutton1.Checked then
на строке 75 invalid floating point operation,
Видимо, неверный аргумент функции логарифма...


Forsaken3

Forsaken3, не надо писать вот так
i:=Radiobutton1.Checked;
if i=true then
Достаточно вот так
if Radiobutton1.Checked then
Спасибо, учту, а есть ли соображения по основной проблеме?
Видимо, неверный аргумент функции логарифма...
Это врядли, уравнение задано мне условием, да и в паскале всё прекрасно работало.


Forsaken3

См. пост #2...


Forsaken3

подскажите кто-нибудь, как объявить метку в процедуре?


Forsaken3

попробуй переписать код избавившись от меток вообще (не зря оператор goto считается устаревшим) А тебе обязательно писать графическое приложение, просто есть мысл что в консоли всё заработает... PS щя порылся в нете на тему меток, вообще ничего не нашел, кроме того что это зарезервированое слово...


Forsaken3

попробуй переписать код избавившись от меток вообще (не зря оператор goto считается устаревшим) А тебе обязательно писать графическое приложение, просто есть мысл что в консоли всё заработает... PS щя порылся в нете на тему меток, вообще ничего не нашел, кроме того что это зарезервированое слово...
Какими операторами можно обойти goto? Я не представляю как можно зациклить по другому. Графическое приложение обязательно, но я в такие дали пока не заглядываю.


Forsaken3

Я не представляю как можно зациклить по другому.
вы сами ответили на свой вопрос... циклом МОЖНО зациклить!для вас подойдут:
while <true-условие> do
begin
  ...
end;
repeat
  ...
until <false-условие>;


Forsaken3

Forsaken3, оператор goto никто не отменял, а в некоторых случаях он вообще необходим, так что просто научитесь правильно им пользоваться.
procedure TForm1.Button2Click(Sender: TObject);
var
a,b,C,C1,C2,C3,d,d1,d2,d3,e0,e1,esp: real;
s: string;
i: boolean;
label m,k,n;
begin
...
Переменные и лейблы объявляются внутри процедуры (т.е. локальными), так как нигде за её пределами не используются. Делать их глобальными совершенно незачем. И не ставьте метки перед операторами begin. Метка ставится непосредственно перед исполняемым оператором.Mawrat:
...оператор goto никто не отменял, а в некоторых случаях он вообще необходим, так что просто научитесь правильно им пользоваться...
Верно.


Forsaken3

i8085, любое использование goto можно заменить другим кодом. ) Это доказано )


Forsaken3

i8085, использование оператора goto - это дурное наследие бэйсика... В Паскале и Делфи (да и в других языках) можно обойтись без него.


Forsaken3

Поддерживаю ))) я пишу на Delphi не первый год, писал много программ со сложными алгоритмами и не разу ни где не использовал Goto. Да и в других языках уверен что именно так. Думаю вам надо обойтись без него, в любом случае использование Goto не является хорошим программным кодом.


Forsaken3

и не разу ни где не использовал Goto.
Не хочу сказать, что я опытный программист. Но тогда подскажите, как сделать вход внутрь цикла, без меток?типа такого:
начало кода i:=0; goto n; m:1-ый оператор; n: 2-ой оператор; i:=i+1; if i