Problém s pamětí – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s pamětí – Delphi – Fórum – Programujte.comProblém s pamětí – Delphi – Fórum – Programujte.com

 

michi
~ Anonymní uživatel
14 příspěvků
17. 4. 2009   #1
-
0
-

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ěď

Nahlásit jako SPAM
IP: 213.250.224.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
17. 4. 2009   #2
-
0
-

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á.

Nahlásit jako SPAM
IP: 213.250.224.–
KIIV
~ Moderátor
+43
God of flame
17. 4. 2009   #3
-
0
-

a jak vypada ten objekt TZamestnanec ??

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
o-lox0
Super člen
17. 4. 2009   #4
-
0
-

To KIIV : no to já se chtěl zeptat jak vypadá VlozKoren ?? :D

Nahlásit jako SPAM
IP: 85.71.152.–
michi
~ Anonymní uživatel
14 příspěvků
17. 4. 2009   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 213.250.224.–
KIIV
~ Moderátor
+43
God of flame
17. 4. 2009   #6
-
0
-

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;

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
michi
~ Anonymní uživatel
14 příspěvků
17. 4. 2009   #7
-
0
-

Pokud zadám aby to pole bylo velikosti 2, tak mi to vytvori pole, ktere ma prvky "0","1"

Nahlásit jako SPAM
IP: 213.250.224.–
michi
~ Anonymní uživatel
14 příspěvků
17. 4. 2009   #8
-
0
-

Hej dik moc, vypada to ze to byla ta zasita chybka :) fakt dik

Nahlásit jako SPAM
IP: 213.250.224.–
KIIV
~ Moderátor
+43
God of flame
17. 4. 2009   #9
-
0
-

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

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
michi
~ Anonymní uživatel
14 příspěvků
17. 4. 2009   #10
-
0
-

diky

Nahlásit jako SPAM
IP: 213.250.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý