Segmentation Fault Problem!!!



  • ums ehrlich zu sagen: ich hab diese abfragen komplett aus einem alten programm übernommen. in wiefern da dieses segfault-problem aufgetreten ist weiss ich leider nicht.
    da genau diese kombinationen überprüft werden müssen habe ich das ganze einfach so kopiert.

    die beiden inneren if-else-blöcke sind nicht genau gleich. der if überprüft auf ">" und der else auf "d".
    (oder meintest du etwas anderes?)



  • das sieht ja so als als hätte ein assembler programmierer das geschrieben.

    Die frage ist nun, wie groß ist inpline (wieviel speicher forderst du dafür an)
    welchen wert hat:

    DQS0
    DQ
    t

    bzw wie groß kann das werden.... ich denke mal irgendwo (das ist doch sicherlich eine schleife) gehst du mal über die arraygröße hinaus.



  • manu1984 schrieb:

    ums ehrlich zu sagen: ich hab diese abfragen komplett aus einem alten programm übernommen. in wiefern da dieses segfault-problem aufgetreten ist weiss ich leider nicht.
    da genau diese kombinationen überprüft werden müssen habe ich das ganze einfach so kopiert.

    Und die angeforderte Speichermenge (und der Wert von DQS0 und DQ) sind auch immer noch identisch mit damals?

    die beiden inneren if-else-blöcke sind nicht genau gleich. der if überprüft auf ">" und der else auf "d".
    (oder meintest du etwas anderes?)

    Ich meinte den Inhalt der beiden Blöcke "if(inpline[DQS0]=='H'...)" und "in(inpline[DQS0]=='L'...)" - abgesehen von einem Buchstaben sind die identisch.



  • *g* ja assembler programmiere ich auch gelegentlich 🙂
    die maschinensprache ist da doch wesentlich unkomplizierter 🙂

    also: inpline[DQS0] ist genau 1 zeichen lang.

    was die if-abfragen machen:
    ich habe eine datei mit sehr vielen zeilen und in jeder zeile 90 zeichen.
    jetzt will ich schauen:
    wenn das zeichen an position 40 = H && position 50 == 1 ,... dann soll er eben z.b. DDR_READ schreiben.
    allerdings habe ich für die inpline 150 zeichen reserviert, weil ich ja die gesamte zeile erstmal einlese.



  • manu1984 schrieb:

    also: inpline[DQS0] ist genau 1 zeichen lang.

    Guter Witz 😃 (oder auf Deutsch: Diese Aussage hat einen Informationsgehalt von 0)

    Viel interessanter ist: Wie lang ist das komplette Array 'inpline'? Und welche Werte haben die Indexvariablen DQS0, DQ, t?

    (zu den if's - da lässt sich noch einige zusammenfassen (Tip: C kennt auch einen Operator || (OR))



  • also für inpline hab ich 150 reserviert.
    per #define MAXLENGTH 150
    char inpline[MAXLENGTH]

    DQS0 ist z.b. 42

    na aber diese verzweigungen kann ich mit || nicht wirklich verknüpfen. hab schon versucht die inneren if-else blöcke mit switch-case zu ersetzen.
    hat aber auch nicht funktioniert. (oder was wohl eher so war: ich war zu doof dafür *g*)



  • Um nur mal den obigen Ausschnitt zu vereinfachen:

    if(strcmp(inpline,"even")==0
    {
      if((inpline[DQS0]=='H'||inpline[DQS0]=='L') && inpline[DQ-1]=='Z' && inpline[DQ-8]=='Z')
      {
        if(inpline[70+t]=='>')
          fprintf(fout,"    (DDR_READ__03 ");
        else if(inpline[70+t]=='d')
          fprintf(fout,"    (DDR_READ__13 ");
      }
      ...
    }
    

    Ansonsten könnten wir jetzt noch endlos weiter-theoretisieren. Aber dir ist vermutlich mehr geholfen, wenn du dieses Programm durch einen Debugger jagst und deine Aufmerksamkeit auf die verwendeten Index-Werte richtest.
    (selbst wenn es im Debugger nicht zu einem SegFault kommt, siehst du vermutlich die Bereichsüberschreitungen "live")



  • oh, ja richtig!!!! das habe ich übersehen... klaro, sowas kann ich dann doch zusammenfassen ...
    aber damit hätte ich mir vielleicht von den 20 schleifen 3 gespart. das wird wohl das problem nicht lösen, oder? 😞

    ja debugger ist schlecht. da ich das ganze auf einer sunstation mache mit dem lausigsten compiler, den man sich vorstellen kann.
    wenn ich die MAXLENGTH einfach mal auf 100 runtersetze, wäre mir damit schon geholfen?



  • manu1984 schrieb:

    ja debugger ist schlecht. da ich das ganze auf einer sunstation mache mit dem lausigsten compiler, den man sich vorstellen kann.

    Da gibt es immer noch den Notfallplan - printf()-Debugging (auf Deutsch: du baust an strategisch günstigen Stellen printf()-Aufrufe ein, die den aktuellen Wert wichtiger Zähler auf dem Bildschirm ausgeben).

    wenn ich die MAXLENGTH einfach mal auf 100 runtersetze, wäre mir damit schon geholfen?

    Damit dürftest du das Problem eher verschlimmern - wenn du bei 150 Zeichen über die Arraygrenzen hinausschreibst, schaffst du es bei 100 Zeichen erst recht.



  • na meine Zeilen sind ja nur um die 100 Zeichen lang.
    Dann müssten ja z.b. 110 zeichen komplett ausreichen...
    aber die frage ist eben ob das viel bringt?!



  • DQS0 ist es also noch nicht, wo wird der wert von t bestimmt? Welche werte kann t annehmen? t sollte ja niemals größer als 79 werden die Frage ist halt, wird das in der schleife abgefangen?



  • also t ist entweder 0 oder 1

    irgendwie geht mir das echt nicht in kopf rein. wieso klappt das an dem einen pc wirklich immer! und bei dem anderen dauernd nicht.
    bzw es klappt ja bei manchen dateien auch immer und bei anderen nie.


Anmelden zum Antworten