Delphi-PRAXiS
Seite 3 von 7     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Zeigern (https://www.delphipraxis.net/109409-problem-mit-zeigern.html)

praesident 29. Feb 2008 20:21

Re: Problem mit Zeigern
 
Zitat:

Zitat von DeddyH
Wenn Du nil an die Funktion übergibst, kommt der Fehler eben an der besagten Stelle.

bitte entschuldigt, aber ich habe das auch nur von meinem lehrer vorgesetzt bekommen...und nun macht mal

hab das erst seit einer woche und wir hatten vorher nur mit pascal gearbeitet...

könntet ihr also für einen totalen delphi anfänger den fehler noch einmal zusammenfassen? und wenn es nicht allzu viel umstände macht noch einen kleinen programmcode als verbesserung?

wäre echt meine rettung, da mir das mit den zeigern in delphi nicht genauer erläutert wurde


danke

SirThornberry 29. Feb 2008 20:30

Re: Problem mit Zeigern
 
beim aufruf deiner Funktion "push" hat zkopf den Wert nil
das heißt er zeigt auf keinen Speicher. Dementsprechend kracht es immer sobald du auf Untereigenschaften davon zugreifen willst. Wie bereits erwähnt empfehle ich dir das Video Pointerfun damit du ein Gespür für Pointer bekommst.

DeddyH 29. Feb 2008 20:32

Re: Problem mit Zeigern
 
Ungetestet:
Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf, zneu:tzeiger;
BEGIN
  //erstes Element soll angelegt werden
  if zkopf = nil then
    begin
      new(zhilf);
      zhilf^.inhalt := inhalt;
      zhilf^.next := nil;
    end
  //eine weiteres Element soll angehängt werden
  else
    begin
      zhilf:=zkopf;
      while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
      new(zneu);
      zneu^.inhalt:=inhalt;
      zneu^.next:=NIL;
      zhilf^.next:=zneu;
    end;
  zkopf := zhilf;
END;

praesident 29. Feb 2008 20:36

Re: Problem mit Zeigern
 
Zitat:

Zitat von DeddyH
Ungetestet:
Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf, zneu:tzeiger;
BEGIN
  //erstes Element soll angelegt werden
  if zkopf = nil then
    begin
      new(zhilf);
      zhilf^.inhalt := inhalt;
      zhilf^.next := nil;
    end
  //eine weiteres Element soll angehängt werden
  else
    begin
      zhilf:=zkopf;
      while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
      new(zneu);
      zneu^.inhalt:=inhalt;
      zneu^.next:=NIL;
      zhilf^.next:=zneu;
    end;
  zkopf := zhilf;
END;

super danke...schon mal kein fehler

werd mir das mal genauer anschauen, damit ich verstehe, warum bei mir immer der Fehler erzeugt wurde...

danke nochmal für eue hilfe

Macci 29. Feb 2008 20:40

Re: Problem mit Zeigern
 
Stimmt, daran dass zkopf schon mit nil übergeben wird, habe ich gar nicht gedacht ;-)

@DeddyH:

Hier
Delphi-Quellcode:
 while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
ist die erste Abfrage (zhilf<>nil) unnötig ;-)
zhilf kann ja nie nil werden.

DeddyH 29. Feb 2008 20:42

Re: Problem mit Zeigern
 
Stimmt, war noch vom C&P übrig geblieben (schadet aber auch nicht) :zwinker:

praesident 29. Feb 2008 20:43

Re: Problem mit Zeigern
 
aber müsste nicht das:

Delphi-Quellcode:
  zkopf := zhilf;
ganz vor, als letzte zeile der ersten fallunterscheidung?

sonst könnte ich ja nie mehr auf das erste element zugreifen!?

DeddyH 29. Feb 2008 20:45

Re: Problem mit Zeigern
 
Durch diese Zuweisung hast Du immer das letzte Element der Liste in zkopf stehen. Soll das nicht so sein?

praesident 29. Feb 2008 20:48

Re: Problem mit Zeigern
 
Zitat:

Zitat von DeddyH
Durch diese Zuweisung hast Du immer das letzte Element der Liste in zkopf stehen. Soll das nicht so sein?

nein, eigentlich sollte es immer das erste sein...aber das ist ja eigentlich kein aufwand, oder?

DeddyH 29. Feb 2008 20:52

Re: Problem mit Zeigern
 
Nö, ist kein Aufwand, dann mach es so, wie Du selbst schon gesagt hast:
Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf, zneu:tzeiger;
BEGIN
  //erstes Element soll angelegt werden
  if zkopf = nil then
    begin
      new(zhilf);
      zhilf^.inhalt := inhalt;
      zhilf^.next := nil;
      zkopf := zhilf;
    end
  //eine weiteres Element soll angehängt werden
  else
    begin
      zhilf:=zkopf;
      while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
      new(zneu);
      zneu^.inhalt:=inhalt;
      zneu^.next:=NIL;
      zhilf^.next:=zneu;
    end;
END;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
Seite 3 von 7     123 45     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz