Wegfindung in Delphi und C++



  • Ich muss in einem Programm einen Weg finden. Gegeben sind:

    const Anzahl = 5; // Fünf Punkte, jeder könnte mit jedem verbunden sein
    BOOL Relation[6][6];  // Existiert eine Verbindung?
    Relation[1][3] = TRUE;  // Es gibt einen Weg von 1 nach 3
    Relation[3][5] = TRUE;  // Es gibt einen Weg von 3 nach 5
    

    Es geht nicht darum, den kürzesten Weg zu finden, sondern die zu schreibende Funktion soll lediglich herausfinden, ob ein Weg existiert. Meine Funktion sieht so aus:

    BOOL __fastcall TfrmFormular::Weg(INT Start, INT Ziel)
    {
      BOOL Kontrolliert[99], Verbindung[99], b;
    
      Verbindung[Start] = TRUE;
      Kontrolliert[Ziel] = TRUE;
    
      for (INT i=0; i<= Anzahl; i++)
      {
      	for (INT j=0; j<= Anzahl; j++)
        {
          if ((Verbindung[j]) && (!Kontrolliert[j]))
          {
          	Kontrolliert[j] = TRUE;
            for (INT k=0; k<= Anzahl; k++)
            {
            	if (Relation[j][k])
              {
              	Verbindung[k] = TRUE;
                if (k == Ziel)
                  b = TRUE;
              }
            }
          }
        }
      }
      return b;
    }
    

    Die Funktion funktioniert nicht, ich habe keine Ahnung warum. Der gleiche Quelltext in Delphi:

    function Weg(Start,Ziel:integer):boolean;
    var
      Kontrolliert, Verbindung: array[0..99] of boolean;
      b:boolean;
      i,j,k:integer;
    begin
      Verbindung[Start] := TRUE;
      Kontrolliert[Ziel] := TRUE;
    
      for i:=1 to Anzahl do
      begin
        for j:=1 to Anzahl do
        begin
          if ((Verbindung[j]) and ( not Kontrolliert[j])) then
          begin
            Kontrolliert[j] := TRUE;
            for k:=1 to Anzahl do
            begin
              if (Relation[j][k]) then
              begin
                Verbindung[k] := TRUE;
                if (k = Ziel) then
                begin
                  b := TRUE;
                end
              end;
            end;
          end;
        end;
      end;
      Weg := b;
    end;
    

    Diese Funktion funktioniert. Warum nur 😕 😕 😕



  • Du hast also eine lauffähige version in pascal, und in C++ läuft die nicht..

    Der teufel steckt im Detail...



  • Aber es ist doch alles genau gleich!
    Ich hatte erst die c++ version. Weil die nicht richtig funktioniert hat, habe ich sie in delphi übersetzt. Dort gab es keine Schwierigkeiten.

    Oder findet doch wer nen unterschied? 😕



  • Die Schleifenvariablen i und j fangen in Delphi bei 1 an, in C habt ihr sie bei 0 beginnen lassen. Vielleicht mal darüber nachdenken 🙄



  • Ich hab es rausgefunden. Der Fehler liegt in dieser Zeile:

    BOOL Kontrolliert[99], Verbindung[99], b;
    

    In b steht nicht, wie ich erwartet hätte, ein FALSE, sondern irgend eine Zahl. So funktioniert es:

    BOOL Kontrolliert[99], Verbindung[99], b = FALSE;
    

    🕶


Anmelden zum Antworten