Error: Identifier redeclared

Portál: amos.ukf.sk
Kurz: Programovanie 1
Kniha: Error: Identifier redeclared
Vytlačil(a): Guest user
Dátum: piatok, 4 októbra 2024, 06:12

1. Identifier redeclared: 'i'

Pôvodný zdrojový kód

unit Unit1;

interface

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

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

var
Form1: TForm1;
ret: string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, male, velke: integer;
ret: string;
i: integer;
begin
ret:= Edit1.Text;
male:= 0;
velke:= 0;

for i:= 1 to length(ret) do
if (ret[i]>='a') and (ret[i]<='z') then inc(male)
else if (ret[i]>='A') and (ret[i]<='Z') then inc(velke);

Label1.Caption:= 'Pocet malych pismen: ' + IntToStr(male);
Label2.Caption:= 'Pocet malych pismen: ' + IntToStr(velke);
end;

{

[Error] Unit1.pas(33): Identifier redeclared: 'i'
--------------------------------------------------------------------------------

Viacnásobná deklarácia identifikátoru i.

PREČO?

Premennú i sme deklarovali dvakrát.

RIEŠENIE

Jednu z deklarácií odstránime.

POZNÁMKA

Premenná ret je tiež deklarovaná dva razy. Raz ako globálna, raz ako lokálna
premenná. V procedúre lokálna premenná prekrýva globálnu s rovnakým menom.
V tomto prípade o chybu nejde (ak, tak logickú, ktorú prekladač neodhalí).

Upravený zdrojový kód

--------------------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var i, male, velke: integer;
ret: string;
begin
ret:= Edit1.Text;
male:= 0;
velke:= 0;

for i:= 1 to length(ret) do
if (ret[i]>='a') and (ret[i]<='z') then inc(male)
else if (ret[i]>='A') and (ret[i]<='Z') then inc(velke);

Label1.Caption:= 'Pocet malych pismen: ' + IntToStr(male);
Label2.Caption:= 'Pocet malych pismen: ' + IntToStr(velke);
end;

--------------------------------------------------------------------------------

}

end.

Stiahnuť vzorový príklad (zdrojové kódy v Delphi)

2. Identifier redeclared: 'fakt'

Pôvodný zdrojový kód

unit fakt;

interface

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

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

var
Form1: TForm1;
fakt: integer;

implementation

{$R *.dfm}

function faktorial(n: integer): integer;
var f, i: integer;
begin
f:= 1;
for i:= 1 to n do f:= f*i;
faktorial:= f;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n: integer;

begin
n:= StrToInt(Edit1.Text);
fakt:= faktorial(n);
Label1.Caption:= Edit1.Text + '! = ' + IntToStr(fakt);
end;

{

[Error] fakt.pas(23): Identifier redeclared: 'fakt'
--------------------------------------------------------------------------------

Viacnásobná deklarácia identifikátora fakt.

PREČO?

Súbor so zdrojovým kódom sme pomenovali rovnako ako globálnu premennú.

RIEŠENIE

Premennú fakt deklarujeme ako lokálnu premennú v procedúre, kde ju používame.

alebo

Zmeníme meno premennej alebo meno unitu, tak, aby boli rôzne.

Upravený zdrojový kód

--------------------------------------------------------------------------------

var
Form1: TForm1;

implementation

function faktorial(n: integer): integer;
var f, i: integer;
begin
f:= 1;
for i:= 1 to n do f:= f*i;
faktorial:= f;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n, fakt: integer;

begin
n:= StrToInt(Edit1.Text);
fakt:= faktorial(n);
Label1.Caption:= Edit1.Text + '! = ' + IntToStr(fakt);
end;

--------------------------------------------------------------------------------

}

end.


Stiahnuť vzorový príklad (zdrojové kódy v Delphi)

3. Identifier redeclared: 'x'

Pôvodný zdrojový kód

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Shape1: TShape;

procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ret: string;

implementation

{$R *.dfm}

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

var x, y: integer;
begin
x:= random(Form1.Width-Shape1.Width);
y:= random(Form1.Height-Shape1.Height);

Shape1.Left:= x;
Shape1.Top:= y;

end;

{

[Error] Unit1.pas(33): Identifier redeclared: 'x'
--------------------------------------------------------------------------------

Viacnásobná deklarácia identifikátoru x.

PREČO?

Formálne parametre a lokálne premenné procedúry majú rovnaké mená.

RIEŠENIE

Lokálnu premennú premenujeme.

alebo

Pokiaľ lokálna premenná nie je potrebná, tak ako v tomto príklade, nepoužijeme ju.

Upravený zdrojový kód

--------------------------------------------------------------------------------

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

begin

Shape1.Left:= random(Form1.Width-Shape1.Width);
Shape1.Top:= random(Form1.Height-Shape1.Height);

end;

--------------------------------------------------------------------------------

}

 

end.

Stiahnuť vzorový príklad (zdrojové kódy v Delphi)