tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
Like Tree1Danke
ERLEDIGT
JA
ANTWORTEN
23
ZUGRIFFE
964
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    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
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  3. #3
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Zitat Zitat von MCoder Beitrag anzeigen
    wie ist "karte[][]" deklariert (Größe) und welche Werte haben "breite" und "hoehe"? Vermutlich schießt du irgendwo über die Arraygrenzen hinaus.
    int karte[99][99];
    breite = 41;
    hoehe = 29;

    Kann also nicht sein, dass der Array zu klein wäre. Ausserdem würde ja dann das Programm beim Kompilieren meckern, was es aber nicht tut.

    MfG flogy
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  5. #5
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    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)
     

  6. #6
    Mizi Mace Mizi Mace ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    50
    Einen wunderschönen guten Tag,

    Zitat Zitat von flogy92 Beitrag anzeigen
    int karte[99][99];
    breite = 41;
    hoehe = 29;
    Eine Verletzung der Grenzen des Arrays treten somit nicht auf.

    Zitat Zitat von flogy92 Beitrag anzeigen
    int karte[99][99];
    Kann also nicht sein, dass der Array zu klein wäre. Ausserdem würde ja dann das Programm beim Kompilieren meckern, was es aber nicht tut.
    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
    Mizi
    Geändert von Mizi Mace (27.01.09 um 15:53 Uhr)
     

  7. #7
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    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
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  9. #9
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Zitat Zitat von deepthroat Beitrag anzeigen
    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
    Hallo deepthroat!

    Wie oben schon erwähnt, habe ich es auch ohne Funktion probiert - mit demselben Ergebnis...
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von flogy92 Beitrag anzeigen
    Hallo deepthroat!

    Wie oben schon erwähnt, habe ich es auch ohne Funktion probiert - mit demselben Ergebnis...
    Dann zeig deinen Code. Mit Raten kommen wir nicht weiter.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  12. #12
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Zitat Zitat von deepthroat Beitrag anzeigen
    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
     

  13. #13
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hallo zusammen,

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

    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
    Geä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 !!

  14. #14
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von flogy92 Beitrag anzeigen
    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.
    Zitat Zitat von flogy92 Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  15. #15
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Zitat Zitat von vfl_freak Beitrag anzeigen
    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...
    Geändert von flogy92 (27.01.09 um 14:23 Uhr)
     

Ähnliche Themen

  1. Segmentation fault
    Von Vippis im Forum C/C++
    Antworten: 21
    Letzter Beitrag: 05.12.10, 22:56
  2. Segmentation Fault
    Von Schnoogle im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 10.02.10, 12:25
  3. Segmentation fault
    Von stain im Forum Linux & Unix
    Antworten: 0
    Letzter Beitrag: 28.04.08, 18:34
  4. C: Segmentation fault
    Von Westbär im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 05.07.07, 10:46
  5. MC-Fehler Segmentation Fault?
    Von piti66 im Forum Linux & Unix
    Antworten: 0
    Letzter Beitrag: 06.07.05, 21:06

Stichworte