Segmentation Fault

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
 
Dann zeig deinen Code. Mit Raten kommen wir nicht weiter.

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?

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) ?
Ohne die Funktion ist jetzt alles zusammen im Hauptcode (main)!


MfG flogy
 
Hallo zusammen,

beim wie vielten Schleifendurchlauf passiert es denn?
Ich würde auch eher auf eine Index-Verletzung tippen!

Code:
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;
   }
}

Wenn ich das richtig sehe, umfasst KARTE jeweils 99 Werte in beiden Dimensionen (also jeweils von 0 - 98)!
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ß
Klaus
 
Zuletzt bearbeitet:
Hi.
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?
Nein. Du hast irgendwo einen Fehler gemacht. Diese Stelle hast du nicht gezeigt.
Ohne die Funktion ist jetzt alles zusammen im Hauptcode (main)!
Das werden doch dann aber nicht mehrere hundert Zeilen Code sein, oder? Zeig den Code.

Gruß
 
Wenn ich das richtig sehe, umfasst KARTE jeweils 99 Werte in beiden Dimensionen (also jeweils von 0 - 98)!
Deine Schleifen werden aber von '0' bis '99' (<100), also 100-mal durchlaufen, oder?

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)


Das werden doch dann aber nicht mehrere hundert Zeilen Code sein, oder? Zeig den Code.
Anfangs hatte ich das auch noch in Funktionen verteilt. Seit diesem Fehler habe ich nun mal alles zusammengefasst...
 
Zuletzt bearbeitet:
Hi.

Ich hab das Programm mal im Debugger laufen lassen. Ergebnis:

SegFault, Werte der Variablen:
Code:
breite = 2293468
hoehe = 4201946
ii = 100
i = 0
Angeblich sollte das doch anders sein... ;-]

Warum liest du die erste Zeile nicht mit fgets und die Breite und Höhe mit sscanf aus?

Werte die irgendwoher gelesen werden, sollten immer geprüft werden.

Gruß
 
Das Einlesen von "hoehe" und "breite" dürfte schieflaufen, da "cnt" nicht initialisiert wurde.

Gruß
MCoder
 
Hi.

Ich hab das Programm mal im Debugger laufen lassen. Ergebnis:

SegFault, Werte der Variablen:
Code:
breite = 2293468
hoehe = 4201946
ii = 100
i = 0
Angeblich sollte das doch anders sein... ;-]

Warum liest du die erste Zeile nicht mit fgets und die Breite und Höhe mit sscanf aus?

Werte die irgendwoher gelesen werden, sollten immer geprüft werden.

Gruß

Dann kann es doch aber nicht sein, dass die Ausgabe korrekt ist :S
Bist du sicher, dass du exakt den richtigen Input hast (keine zusätzlichen Bits)?

Warum ich das nicht so eingelesen habe: Ich habs irgendwie nicht geschafft ^^


Das Einlesen von "hoehe" und "breite" dürfte schieflaufen, da "cnt" nicht initialisiert wurde.

Aber sicher und zwar gleich davor:
Code:
  char c;
  int cnt; //<-- hier ;) (Standartwert ist meines Wissens nach ja 0)
  while ((c = fgetc(datei)) != '\n')
  {
    if (cnt == 0) {
      breite += (c - '0') * 10;
    }
    else if (cnt == 1) {
      breite += (c - '0');
    }
    else if (cnt == 3) {
      hoehe += (c - '0') * 10;
    }
    else if (cnt == 4) {
      hoehe += (c - '0');
    }
    cnt += 1;
  }
 
Zuletzt bearbeitet:
Dann kann es doch aber nicht sein, dass die Ausgabe korrekt ist :S
Bist du sicher, dass du exakt den richtigen Input hast (keine zusätzlichen Bits)?
Ziemlich sicher. \edit wenn ich das Einlesen der Dimension so mache:
C:
if (fscanf(datei, "%u %u", &breite, &hoehe) != 2) {
  // Fehler
  return 1;
}
int c;
while ((c = fgetc(datei)) != EOF && c != '\n'); // skip to the next line
dann erhalte ich in der Ausgabedatei den Wert 119.

Beachte auch, das fgetc einen Integer und keinen char zurückgibt! Und das Höhe und Breite negativ sein können, ist wohl auch etwas ungünstig.
Aber sicher und zwar gleich davor:
Code:
  int cnt; //<-- hier ;) (Standartwert ist meines Wissens nach ja 0)
Falsch. Die Variable ist nicht initialisiert und besitzt somit einen zufälligen Wert.

Gruß
 
Zuletzt bearbeitet:
Ziemlich sicher. \edit wenn ich das Einlesen der Dimension so mache:
C:
if (fscanf(datei, "%u %u", &breite, &hoehe) != 2) {
  // Fehler
  return 1;
}
int c;
while ((c = fgetc(datei)) != EOF && c != '\n'); // skip to the next line
dann erhalte ich in der Ausgabedatei den Wert 119.

Okay, danke! Ich habe das mal so gemacht! Mein Output ist nun allerdings auch nur noch 119 :S Woran mag das wohl liegen?

Beachte auch, das fgetc einen Integer und keinen char zurückgibt! Und das Höhe und Breite negativ sein können, ist wohl auch etwas ungünstig.

Falsch. Die Variable ist nicht initialisiert und besitzt somit einen zufälligen Wert.

Okay, dann habe ich ja gleich etwas dazugelernt. Hab das mal geändert (geht aber noch immer nicht).


MfG flogy
 
Zurück