-
Guten Tag zusammen!
Ich habe vorhin beim Debuggen meines Programms einen Segmentation Fault bekommen. Ich weiss zwar inzwischen ungefähr, was das ist, jedoch tritt dieser Fehler anscheinend immer aus anderen Gründen auf :S
Bei mir kam der Fehler bei diesem Code:
Code :1 2 3 4 5 6 7
for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { karte[ii][i] = werte_umkehren(karte[ii][i]); } }
...auf der fünften Zeile!
Da wird folgende Funktion aufgerufen:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int werte_umkehren(int karte) { int karte_neu; if (karte == 1) { karte_neu = 0; } else { karte_neu = 1; } return karte_neu; }
Kann mir vielleicht jemand kurz erklären, was daran falsch sein sollte? Das programm funktioniert nämlich , wie es sollte. Bloss kann ich die EXE nicht ausführen und beim Debuggen kommt eben diese Meldung...
Danke im Voraus!
MfG flogy
-
Hallo,
wie ist "karte[][]" deklariert (Größe) und welche Werte haben "breite" und "hoehe"? Vermutlich schießt du irgendwo über die Arraygrenzen hinaus.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
-
Hallo,
falsche Array-Indizes fallen erst zur Laufzeit auf; da kommt keine Fehlermeldung vom Compiler.
Der Code schaut allerdings korrekt aus. Kommt der Fehler bei jedem Schleifendurchgang? Tritt der Fehler innerhalb von "werte_umkehren" auf oder erst bei der Zuweisung des Ergebnisses?
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Erst bei der Zuweisung des Wertes. Jedenfalls wird vom Debugger diese Zeile markiert!
EDIT: Oder doch nicht, wenn ich nämlich die Funktion rausnehme und gleich direkt den Code ausführe, funktioniert es!
EDIT 2: ==> Neuer Fehler:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { if (karte[ii][i] == 1) { karte[ii][i] = 0; //<-- hier kommt der Fehler! } else { karte[ii][i] = 1; } } }
Warum sollte das so nicht gehen? Es ist schliesslich ein int-Array...Geändert von flogy92 (27.01.09 um 13:25 Uhr)
-
Einen wunderschönen guten Tag,
Eine Verletzung der Grenzen des Arrays treten somit nicht auf.
Der Zugriff auf ein Array mit:
Code c:1
karte[ii][i] = ...;
ist vollkommen legitim. Da kann der Kompiler keinen Fehler finden. Der Kompilier kann auch nicht zur Kompilierzeit wissen, welche Werte die Variablen ii und i annehmen.
Ich habe das Programm mit deinen Angaben mal bei mir kompiliert. Bei mir lässt sich kein Fehler finden. Das Programm läuft sonst auch tadellos. Hier das erstellte Programm:
Code c:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#include <stdio.h> #include <stdlib.h> int werte_umkehren(int karte) { int karte_neu; if (karte == 1) { karte_neu = 0; } else { karte_neu = 1; } return karte_neu; } int main(int argc, char *argv[]) { int ii; int i; int hoehe = 29; int breite = 41; int karte[99][99]; for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { karte[ii][i] = 0; } } for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { printf("%d\t", karte[ii][i]); } printf("\t"); } for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { karte[ii][i] = werte_umkehren(karte[ii][i]); } } for (i = 0; i < hoehe; i ++) { for (ii = 0; ii < breite; ii ++) { printf("%d\t", karte[ii][i]); } printf("\t"); } }
Allerdings glaube ich, dass du dies programmieren wolltest. Dein Programm ist womöglich umfangreicher. Der Fehler liegt eventuell an einer anderen Stelle.
Gruss
MiziGeändert von Mizi Mace (27.01.09 um 15:53 Uhr)
-
Viele Dank für die Hilfe!
Es ist zwar möglich, dass der Fehler an einer anderen Stelle auftritt, jedoch markiert mir der Debugger exakt diese Stelle (siehe Abbildung):
http://img185.imageshack.us/img185/7...kierungvc8.png
und hier noch die Fehlermeldung:
http://img149.imageshack.us/img149/6298/meldungil8.png
-
27.01.09 13:51 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Wie erfolgt denn der Zugriff auf das Array? Ist es global deklariert oder übergibst du es als Parameter? Wenn letzeres solltest du dir mal dieses Thema anschauen: http://www.tutorials.de/forum/c-c/33...parameter.html
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
-
27.01.09 14:03 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Die Funktion ist auch nicht das Thema. Die Frage ist: Wo ist das Array deklariert und wo wird es benutzt? Ist es derselbe Gültigkeitsbereich (z.B. innerhalb einer Funktion) ?
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Der ist etwas lange würde ich sagen... Die wichtigen Stellen, wo der Fehler auftritt, habe ich euch ja bereits gezeigt. Der restliche Code sollte auch stimmen.
Es muss doch irgendeinen Grund geben, warum dieser Fehler überhaupt auftritt, oder? Kann man nicht anhand von diesem Grund den Fehler finden?
Ich meine, ich kann den Code problemlos kompilieren und der macht dann auch die richtige Ausgabe! Also muss doch was anderes zu dieser Meldung führen, nicht?
Ohne die Funktion ist jetzt alles zusammen im Hauptcode (main)!Die Funktion ist auch nicht das Thema. Die Frage ist: Wo ist das Array deklariert und wo wird es benutzt? Ist es derselbe Gültigkeitsbereich (z.B. innerhalb einer Funktion) ?
MfG flogy
-
27.01.09 14:13 #13
Hallo zusammen,
beim wie vielten Schleifendurchlauf passiert es denn?
Ich würde auch eher auf eine Index-Verletzung tippen!
Wenn ich das richtig sehe, umfasst KARTE jeweils 99 Werte in beiden Dimensionen (also jeweils von 0 - 98)!int hoehe = 100;
int breite = 100;
int karte[99][99];
for (i = 0; i < hoehe; i ++)
{
for (ii = 0; ii < breite; ii ++)
{
karte[ii][i] = 0;
}
}
Deine Schleifen werden aber von '0' bis '99' (<100), also 100-mal durchlaufen, oder?
Lass Dir doch mal i und ii (interessante Variablennamen übrigens
) ausgeben resp. im Debugger anzeigen!
Gruß
KlausGeändert von vfl_freak (27.01.09 um 14:14 Uhr) Grund: Tippfehler
Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!
Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
-------------------------------------------------------------------------------------------------
Ich beantworte keine Fragen per PN !!
Stellt Eure Fragen im Forum - dann haben alle etwas davon !!
-
27.01.09 14:19 #14
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Das, was du da hast, ist nicht mein Code. Meine Werte bei der hoehe und breite sind beide unter 50!
Okay, hier mal der ganze Code:
http://nopaste.info/1d57c3242e.html
Ich denke jedoch, dass der wenig bringen wird, aber ich lasse mich mal überraschen... Das Input-File muss folgendermassen aussehen:
http://nopaste.info/8d798377b7.html
Die Ausgabe sollte dann 120 sein!
(Es misst eigentlich den Umfang dieses Objekts ohne die Löcher in der Mitte)
Anfangs hatte ich das auch noch in Funktionen verteilt. Seit diesem Fehler habe ich nun mal alles zusammengefasst...Das werden doch dann aber nicht mehrere hundert Zeilen Code sein, oder? Zeig den Code.Geändert von flogy92 (27.01.09 um 14:23 Uhr)
Ähnliche Themen
-
Segmentation fault
Von Vippis im Forum C/C++Antworten: 21Letzter Beitrag: 05.12.10, 22:56 -
Segmentation Fault
Von Schnoogle im Forum C/C++Antworten: 1Letzter Beitrag: 10.02.10, 12:25 -
Segmentation fault
Von stain im Forum Linux & UnixAntworten: 0Letzter Beitrag: 28.04.08, 18:34 -
C: Segmentation fault
Von Westbär im Forum C/C++Antworten: 3Letzter Beitrag: 05.07.07, 10:46 -
MC-Fehler Segmentation Fault?
Von piti66 im Forum Linux & UnixAntworten: 0Letzter Beitrag: 06.07.05, 21:06



1Danke

Zitieren
Login






