Dobrý den. V příloze je obrázek chyby, kterou mi hází Delphi. Situace je taková, že mám hlavní formulář na kterém mám několik objektů(Edit, Label, Memo, ...), když v tuhle chvíli program spustím tak vše funguje tak jak má. Ale když si na formulář přidám další objekt, tak při spuštění programu vytvořím objekt k-cestný strom, zatím je vše v pořádku, ale jakmile vytvořím objekt prvek stromu, tak celý program na chvíli zamrzne a potom vyhodí hlášku, viz.obr. Mluvil jsem s učitelem na cvičení příslušného předmětu a i s garantem celého předmětu a ani jeden mi nebyl schopen říct čím to je. Jediný co mi řekli, tak že si myslí, že by to mohlo být tím, že někde alokuji paměť na špatnou velikost a když vložím další prvek na formulář, tak ho Delphi vloží na místo v paměti vedle alokovaného místa pro prvek stromu a já tam pak na to alok. místo vložím prvek, který je větší než alok. velikost a dojde k překrytí. Tak mi řekli ať se podívám jestli alokuji správnou velikost. Tudíž jsem se podíval, ale nezdá se mi, že by v tom byla chyba. Ke každému prvku volám příslušný konstruktor. Chtěl jsem se zeptat, jestli nemáte podobnou zkušenost s touto chybou? Předem děkuji za odpověď
Fórum › Delphi
Problém s pamětí
To michi : Zde Vám ještě zasílám obsloužení buttonu Přidat:
procedure TfrmMain.btnPridatZamClick(Sender: TObject);
var
zam: TZamestnanec;
pocet,cislo:integer;
begin
pocet:=StrToInt(edtPocetSynu.Text);
cislo:=StrToInt(edtCisloZam.Text);
zam:=TZamestnanec.Create(pocet,edtJmenoZam.Text,cislo);
if SeznamZamestnancu.JePrazdny then SeznamZamestnancu.VlozKoren(zam)
else SeznamZamestnancu.VlozList(zam);
end;
Zajímá mě předevsím zvýrazněná část. Chtěl bych se zeptat zda je správně vytvořen objekt zam? Objekt Seznam zaměstnanců byl vytvořen již dříve a je to globální proměnná.
Vlož kořen:
procedure TAbstrKTree.VlozKoren(_prvek:TAbsPrvekStrom);
begin
if JePrazdny then begin
koren:=_prvek;
aktualni:=_prvek;
end;
end;
TZamestnanec:
unit zamest;
interface
uses AbsPrvek, seznamhov, hov;
type TZamestnanec=class(TAbsPrvekStrom)
private
jmeno:string;
cislo:integer;
hovory:TSeznamHovoru;
public
constructor Create(N:integer; _jmeno:string; _cislo:integer);
procedure Akce(); overload; override;
procedure Akce(s: string); overload; override;
function Akce(porovnej: TAbsPrvekStrom):TAbsPrvekStrom; overload; override;
procedure PridejHovor(_datum:string;_delka:integer);
function VratJmeno:string;
function VratCislo:integer;
end;
implementation
uses Unit1;
function TZamestnanec.VratJmeno:string;
begin
VratJmeno:=jmeno;
end;
function TZamestnanec.VratCislo:integer;
begin
VratCislo:=cislo;
end;
function TZamestnanec.Akce(porovnej: TAbsPrvekStrom):TAbsPrvekStrom;
var
pom:TZamestnanec;
begin
pom:=porovnej as TZamestnanec;
if (jmeno=pom.VratJmeno) and (cislo=pom.VratCislo) then Akce:=pom
else Akce:=NIL;
end;
constructor TZamestnanec.Create(N:integer; _jmeno:string; _cislo:integer);
var
i: integer;
begin
SetLength(syn, N);
pocetSynu:=N;
jmeno:=_jmeno;
cislo:=_cislo;
for i:=1 to N do syn[i]:=NIL;
hovory:=TSeznamHovoru.Create;
end;
procedure TZamestnanec.Akce();
var
pom1, pom2:string;
begin
str(cislo,pom2);
pom1:= jmeno+' ('+pom2+') ';
frmMain.memoVypis.Lines.Add(pom1);
hovory.Prohlidka('');
end;
procedure TZamestnanec.Akce(s: string);
var
pom1, pom2:string;
begin
str(cislo,pom2);
pom1:= jmeno+' ('+pom2+') '+'prdel';
frmMain.memoVypis.Lines.Add(pom1);
hovory.Prohlidka('');
end;
procedure TZamestnanec.PridejHovor(_datum:string;_delka:integer);
var
_hovor:THovor;
begin
_hovor:=THovor.Create(_datum,_delka);
hovory.VlozPosledni(_hovor);
hovory.setCelkovaDelka(_delka);
end;
end.
me tak napada... kdyz neco nastavis pomoci setlength .. necisluje se od nuly?
SetLength(syn, N);
pocetSynu:=N;
jmeno:=_jmeno;
cislo:=_cislo;
for i:=0 to N-1 do syn[i]:=NIL;
hovory:=TSeznamHovoru.Create;
To michi :
no to sice ano, ale koukni se na konstruktor:
constructor TZamestnanec.Create(N:integer; _jmeno:string; _cislo:integer);
var
i: integer;
begin
SetLength(syn, N);
pocetSynu:=N;
jmeno:=_jmeno;
cislo:=_cislo;
for i:=1 to N do syn[i]:=NIL;
hovory:=TSeznamHovoru.Create;
end;
kdyz zadas N=2 tak si jen projdi tucne zvyraznenej radek:
i=1 -> syn[1] = NIL
i=2 -> syn[2] = NIL
zaprve nenastavujes na NIL prvek s indexem 0 a za druhe nastavujes prvek za polem na nil
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Problem se zapsanim do pameti — založil Franceq
Problém s neoprávněným přístupem do paměti — založil Sefiros
Problém s uvolněním paměti po neúspěšné alokaci — založil S.Salomon
C++ VS.NET problém s přístupem do paměti naalokovaných komponent — založil kubees
C+ - Operace s pamětí — založil Matherz