2012-03-28 11 views
0

Ich versuche, ein Problem zu lösen. Dieses Programm enthält alle Kanten in einem Diagramm. Der kürzeste Weg von der Quelle zum Ziel ist herauszufinden. Ich habe Funktion namens Dotest wie folgt.System.ArgumentOutOfRangeException: Das Argument liegt außerhalb des zulässigen Bereichs. Fehler in einem Algorithmus für den kürzesten Weg

public void dotest() 
    { 
     List<edge> tlist; 
     Int32 x; 
     setall(); 
     Int32 ind; 
     foreach (edge e1 in alltest) 
     { 
      tlist = new List<edge>(alledge); 

      ind = 0; 
      foreach (edge e2 in tlist) 
      { 
       if (e2.s == e1.s && e2.d == e1.d) 
       { 
        break; 
       } 
       ind++; 


      } 
      tlist.RemoveAt(ind); 



      x=shortpath(tlist, start, destination); 
      if (x != -1) 
       Console.WriteLine("{0}", x); 
      else 
       Console.WriteLine("Infinity"); 

     } 


    } 

Beschreibung des obigen Codes. Der Code enthält bereits eine Liste der Rechte (alle Kanten oder Pfade). Ich habe eine Reihe von Eingaben, die eine Liste von zu schneidenden Kanten enthält, und ich muss den kürzesten Pfad der neuen aktualisierten Kantenliste finden. Ich habe meinen Testfall zusammengestellt und ein Teil des Testfalls funktioniert. Aber für einen Testfall gibt es eine Fehlermeldung als.

Nicht behandelte Ausnahme: System.ArgumentOutOfRangeException: Argument liegt außerhalb des Bereichs. Parametername: Index bei System.Collections.Generic.List 1[ch_2_3_27.Solution+edge].RemoveAt (Int32 index) [0x00000] in :0 at ch_2_3_27.Solution.dotest() [0x00000] in :0 at ch_2_3_27.Solution.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Argument is out of range. Parameter name: index at System.Collections.Generic.List 1 [ch_2_3_27.Lösung + Kante] .RemoveAt (Int32-Index) [0x00000] in: 0 bei ch_2_3_27.Solution.dotest() [0x00000] in: 0 bei ch_2_3_27.Solution.Main (System.String [] args) [0x00000] in: 0

ich kann wirklich nicht finden Fehler und ich denke, alle anderen Teile funktioniert. Kann mir jemand helfen ??

und EDGE (Kante) oben ist ein struct mit Mitgliedern s, d, w (Quelle, Ziel, Gewicht aller 32 Int)

Antwort

1

Der Fehler eigentlich ziemlich klar. Sie versuchen, einen Artikel aus tlist zu einem bestimmten Index zu entfernen. Dieser Index hat jedoch keinen Wert.

Wenn ich raten, würde ich sagen, dass dies nur geschieht, wenn nichts in Ihrem tlist Matches wenn (e2.s == e1.s && e2.d == e1.d), so dass Sie mit einem +1 über den aktuellen Index der tlist Array enden.

weiter zu erarbeiten, wollen wir der Einfachheit halber annehmen, dass tlist 1 Punkt hat, dann den Index dieses Element verwenden 0 sein Wenn Ihr, wenn nicht funktioniert, dann werden Sie ind++ gesetzt, so ind zu 1. Wenn Sie Einstellung versuchen, aus dem Index bei 1 zu entfernen, dann bekommen Sie Ihre Fehler, weil es nur ein Objekt in dem 0-Index, und nichts in dem 1 Index

ich ändern würde, um den Code zu etwas mehr wie diese

 ind = -1; 
     foreach (edge e2 in tlist) 
     { 
      ind++; 
      if (e2.s == e1.s && e2.d == e1.d) 
      { 
       break; 
      } 
     } 
     if(ind != -1) 
      tlist.RemoveAt(ind); 
ist

Ich würde sagen, nur die RemoveAt innerhalb der If, aber das wird re sult in einer modifizierten Sammelausnahme, so glaube ich, dass dies die beste Lösung ist.

+0

Aber im obigen Code habe ich den bestimmten Index auf der Suche von tlist gefunden. Wie kommt es, dass es keinen Wert hat? – progrrammer

+0

@ErBnAcharya Ich aktualisierte die Antwort mit extra Ausarbeitung und was wird den Code reparieren. –

+0

Der Fehler wurde behoben, aber mein Algorithmus hat einen Fehler (ich denke), also ist die Antwort falsch. – progrrammer

0

Ich würde vorschlagen, eine neue Liste von Kantentypen zu erstellen und hinzufügen, die Sie in Ihren Berechnungen entfernen möchten. Dann, wenn Sie fertig sind - iterieren Sie über Ihre "Löschen" -Liste und entfernen Sie sie aus der Basisliste. Stellen Sie außerdem sicher, dass Sie IComparable haben, damit Sie die Objekte vergleichen und das richtige entfernen können.

+0

Ich habe die Löschliste schon ... es ist im Alltest. – progrrammer

Verwandte Themen