Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit einer Stringlist und Pointern (https://www.delphipraxis.net/84088-problem-mit-einer-stringlist-und-pointern.html)

sirius 11. Jan 2007 14:53

Re: Problem mit einer Stringlist und Pointern
 
ok anders,

folgender Code:

Delphi-Quellcode:
procedure dummy(var x:integer);
begin
  x:=5;
end;

procedure testdummy;
var p:integer;
begin
  p:=3;
  dummy(p);
  //Na? Welchen Wert hat p an dieser Stelle?
end;
p ist an der Stelle 5. Das liegt an diesem "var" vor dem x in der Prozedurendeklaration.

Soweit klar?

Tormentor32 11. Jan 2007 14:57

Re: Problem mit einer Stringlist und Pointern
 
Zitat:

Zitat von Tormentor32
Aber warum ändert sich P, wenn ich nur MyResult ändere? Das will mir irgendwie nicht in den Kopf gehen... :wall:
Delphi-Quellcode:
procedure TBauteilListe.GetPBauteil(ID: string);

  procedure Rekursiv(p: PBauteil;const Search: string; var MyResult: PBauteil);
  var i: integer;
  begin
    if p <> nil
      then
        if p^.ID = Search
          then
            MyResult := p
          else
        if length(p^.Next) > 0
          then
            for i := low(p^.next) to high(p^.next) do
              Rekursiv(p^.next[i],Search,p);
  end;

begin
  Rekursiv(FRoot,ID,FPBauteil); // FPBauteil ist das Ergebnis, ein Pointer, der Auf das gefundene bauteil zeigt, Private Variable Meiner Klasse, die Klasse sieht so aus:
end;
Ich blick da einfach nicht durch, warum das mit P so ist, und weiß nicht wie ich es anders machen kann, sitzt da jetzt seit nen paar stunden dran, es wäre nett, wenn du mir das umschreiben könntest...

Aber bei P steht KEIN var davor! Wie das mit dem var funktioniert ist mir klar, aber ich verstehe nicht, warum P (ich meine nicht MyResult) geändert wird, wenn ich sage MyResult := P!

sirius 11. Jan 2007 15:14

Re: Problem mit einer Stringlist und Pointern
 
Doch, doch, doch, doch! :duck: :spin:

p ist der dritte parameter. Also wird er zu MyResult im zweiten aufruf. In diesem zweiten Aufruf wird myresult geändert, damit wird p geändert, wenn die Funktion aus Rekursiv (2. Ebene) wieder zurückspringt nach Rekursiv1

geh nochmal gedanklich, dass durch, was ich dir in Post #19 geschrieben habe.

Tormentor32 11. Jan 2007 15:18

Re: Problem mit einer Stringlist und Pointern
 
OOHHH MANNNN ICH BIN SOO BLÖÖÖÖÖDDDDD!!!!!!!

Da muss natürlich MyResult hin! Jetzt klappt das schonmal mit dem Suchen und so! Mannometer ich könnte :wall: ich sitz stunden da dran und dann hab ich nur die Falsche Variable übergeben :kotz:

DANKE DANKE DANKE :love: :love: :love:

sirius 11. Jan 2007 15:24

Re: Problem mit einer Stringlist und Pointern
 
Und ich hab einfach nicht kapiert, was du mit dieser funktion willst. Aber jetzt sieht es schon etwas klarer aus.

Tormentor32 11. Jan 2007 15:29

Re: Problem mit einer Stringlist und Pointern
 
Dadurch, dass MyResult da nicht drinstand, war natürlich Chaos vorprogrammiert...

Jedenfalls nochmal vielen Dank, ich dachte, du wolltest mir die ganze Zeit sagen, dass durch


MyResult := P

Sich P verändert...

Tormentor32 12. Jan 2007 08:10

Re: Problem mit einer Stringlist und Pointern
 
Schon wieder diese Pointer...

Aaaaalso

Ich habe die Einträge in meiner Liste jetzt so arrangiert:
Delphi-Quellcode:
  TBauteil = Record
    ID: string; // Der einzigartige name jedes Bauteils
    Typ: TBauteilTyp; // Der Typ des Bauteils (im moment noch unwichtig)
    Ebene: integer; // Die Ebene des Bauteils, also Root Ebene = 0 Nachfolger Ebene = 1 usw
    Parent,Next: Array of PBauteil // Die direkten nachfolgenden und vorherigen Elemente
  end;
Da ich mit meiner Liste einen Stromkreis darstellen möchte, habe ich mir Überlegt, dass sich Parallel und Reihenschaltungen ja auch verschachteln können z.B:
Code:

[root] ---> [root_child1] ---> [root_child1_child1] ---> [root_child1_child1_child1]
                          \--> [root_child1_child2] --/
In diesem Fall wird aber durchs rekursive Auflisten (logischerweise, ergeht ja alle einträge durch, folgendes Angezeigt
Zitat:

Zitat von Listbox
root_child1_child1_child1
root_child1_child1
root_child1_child1_child1
root_child1_child2
root_child1
root

Ist ja auch klar, denn durch die Rekursive Suche wird root_child1_child1_child1 zweimal gefunden

Wie kann ich das umgehen?
Die Zweite Sache ist, wenn ich den Speicherplatz beim beenden rekursiv freigebe, dann kommts auch zu einem Problem, denn:
Code:
[s][root] ---> [root_child1] ---> [root_child1_child1] ---> [root_child1_child1_child1][/s]
[s]                         \--> [root_child1_child2] --/[/s]

[s][root] ---> [root_child1] ---> [root_child1_child1] ---> nil[/s]
[s]                         \--> [root_child1_child2] [color=#ff0000][b]--/[/b][/color] // der Zeigt dahin, wo nichts ist und es kracht, wenn er versucht auf dieses Element zuzugreifen, er weiß ja nicht, das es das Element nicht mehr gibt [/s]
Wie kann ich das verhindern?

Und nochwas? Wäre es sinnvoller, statt Parent: Array of string; lieber Parent: Array of PBauteil; zu nehmen? EDIT: hat sich erldedigt, nur noch das Erste

Vielen Dank schonmal für die Hilfe!

Richard

sirius 12. Jan 2007 09:21

Re: Problem mit einer Stringlist und Pointern
 
:warn: Man sollte halt immer vor dem Programmieren über das Konzept nachdenken. Aber ich programmiere auch häufig nur drauf los. Grade, wenn man nur etwas üben oder lernen möchte. Und wenn man eben nur lernt, sich vorher ein vollständiges Konzept zu erarbeiten. :coder2: :roteyes:

Mit deinem Programmaufbau fällt mir auf Anhieb nicht viel ein. Du könntest einfach im nachhinein Duplikate löschen. Weis nicht ob das dir ausreicht.

Oder du machst es so wie in PSpice (und wahrscheinlich an allen anderen Netzberechnungsprogrammen auch):
Da hat jedes Element 4 ( oder 3) Kenngrößen:
1. Was ist es (Widerstand, Quelle, Spule)
2. welche Größe hat es (10V, 2ohm); wobei die Einheit anhand der Art des Elementes zu erkennen ist
3.1. Wo beginnt es
3.2. Wo endet es

zu3) Dabei beziehst du dich immer auf Netzknotenpunkte, die du einfach durchnummerierst

Ich hab irgendwo (noch in Turbo Pascal 6.0) ein Programm geschrieben, was einfache Pspice-Dateien einlesen konnte und berechnen konnte. Die Dateien hatten etwa folgenden Inhalt:
  • R 10 0 1 //Widerstand 10ohm von Knoten 0 zu Knoten 1
  • I 5 0 1 //Stromquelle 5A von Knoten 0 zu Knoten 1
  • R 2 1 2 //Widerstand 2ohm von Knoten 1 zu Knoten 2
usw.
Das konnte man dann ganz einfach in die Netzberechnungsgleichungen (bzw. Matrix) schreiben.

Tormentor32 12. Jan 2007 09:39

Re: Problem mit einer Stringlist und Pointern
 
Ich hab das Problem schon gelöst: Beim Suchen wird geschaut, ob der Erste Vorgänger des Nachfolgers das momentane Element ist, und nur dann wird rekursiv wieder aufgerufen.
Zitat:

Zitat von sirius
Man sollte halt immer vor dem Programmieren über das Konzept nachdenken. Aber ich programmiere auch häufig nur drauf los. Grade, wenn man nur etwas üben oder lernen möchte. Und wenn man eben nur lernt, sich vorher ein vollständiges Konzept zu erarbeiten.

Ja da hast du wohl recht, doch wenn ich jetzt das Konzept ändere, dann war ja alles für die Katz, außerdem finde ich die Idee, wie ich das gemacht habe gar nicht so schlecht... (hast du auch nicht gesagt) :roteyes:

naja jedenfalls Danke für die (nicht) Hilfe (diesmal habichs allein hingekriegt! :bounce2: )

Richard

sirius 12. Jan 2007 09:44

Re: Problem mit einer Stringlist und Pointern
 
:gruebel: Bist du sicher, dass das klappt. Was ist, wenn das Netz hinter [root_child1_child2] nicht gleich wieder zusammengeht, sondern erst noch ein paar andere Elemnte kommen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Seite 3 von 4     123 4      

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