2016-09-25 7 views
0

Ich arbeite an der Implementierung eines Divide-and-Conquer-Algorithmus, der die beiden am nächsten zueinander liegenden Punkte und den Abstand zwischen ihnen ermittelt. Meine endgültige Lösung findet die richtige Antwort (verglichen mit der Verwendung von Brute Force), aber etwa 1/3 der Zeit würde einen Segmentierungsfehlerfehler zurückgeben. Ich arbeite seit ein paar Tagen daran, dieses Problem zu beheben, indem ich hier und da Druckanweisungen hinzufüge, aber das Problem nicht finden konnte. Ich würde es begrüßen, wenn sich jemand meinen Code ansehen würde.Rekursive Funktion gibt gelegentlich einen Segmentierungsfehler zurück

+0

Wo setzt Ihr Debugger den Segmentierungsfehler? – Cedric

+0

Immer dieselben Eingabedaten oder verschiedene Daten verwenden? Wenn die Funktion rekursiv ist, könnte der Stapelspeicher knapp werden. Versuchen Sie, den Stapel zu erhöhen, der auf den Daten erneut ausgeführt wird, die das Programm abstürzen. – iksemyonov

+0

@Cedric hat gerade einen Debugger ausprobiert und er sagt, dass der Segmentierungsfehler bei 'for (j = i + 1; j Novice

Antwort

2

Ihre "divide" -Schleife geht davon aus, dass X und Y die gleiche Anzahl von Elementen haben. Wenn Y weniger als X hat, werden Sie auf undefiniertes Verhalten stoßen, was lustige Ergebnisse oder einen Absturz sein könnte.

+0

Eine Lösung vielleicht vorschlagen? nur ein paar Zeilen ersetzt werden, ihre kommentierte Ersatz (warum notwendig) –

+0

Das macht Sinn. Ich habe versucht, die Schleife in zwei zu teilen: eine für "Y" mit der Bedingung "i Novice

0

Versuchen Sie, Ihre Zugriffsmethode für die Vektoren zu ändern. Der Vektor-Subscript-Operator scheint in einigen Compilern/Plattformen (zumindest aus meiner Sicht) ein gegenständliches Verhalten zu haben. Ich denke, das Problem kommt davon, dass es eine verkettete Liste ist, die dazu führt, dass sie im Speicher nicht zusammenhängend ist, aber das ist nur eine Vermutung. (EDIT: std :: vector im Speicher zusammenhängend ist, ist das Problem etwas anderes) Versuchen Sie Iteratoren statt (easy-peasy mit auto Schlüsselwort), wie zum Beispiel mit:

for (auto iter = Yprime.begin(); iter != Yprime.end(); iter++) { 
    // Your code here 
} 

Hoffnung das funktioniert für Ihren Fall!

+0

Habe gerade meinen Post darüber bearbeitet, deinen Kommentar danach gesehen. Das tut mir leid. Obwohl ich ausdrücklich gesagt habe ** "aber das ist nur eine Vermutung" **. Du irrst also ein bisschen, dass ich total falsch liege. Probieren Sie es einfach aus, auf LLVM bekomme ich einen Segmentierungsfehler für den Subscript-Operator. – Cedric

+0

Danke für den Vorschlag. Ich brauchte eine Weile, um meinen Code auf diese Weise neu zu implementieren. Ich habe immer noch den gleichen Fehler ... – Novice

+0

Sorry das zu hören ... Ich hatte einmal ein ähnliches Problem und es hat es gelöst ... Ansonsten ist das einzige andere was ich sehe, dass die Aussage 'abs (Y [i ] .x - mid.x) Cedric

Verwandte Themen