Speicher Fehler (etwas größeres Problem)



  • Lern debuggen 😡

    BTW: Dein RAM ist wahrscheinlich zu klein.



  • das ist doch nur keine lösung, das muss man doch auch mit wenig ram
    erledigen können, der ließt ja lediglich ne zeile und und schreibt wieder rein.
    während der laufzeit frißt das programm 700kb. also daran liegt es dann wohl
    nicht, am ende ist der speicher mal kurz 1200kb groß.



  • Hab das "zeilenweise" überlesen. Dann lern debuggen.



  • Mit valgrind kann man den Speicher eines Programms (ist echt gut) untersuchen, ich weiß aber nicht, ob's ne windows Portierung gibt. Sonst wie meiner Vorgänger: Lerne debuggen, du kannst nicht von uns verlangen, dass wir die Arbeit eines Debuggers machen, oder?



  • so hab nochmal getestet, also wenn ich die obere funktion rausnehme debugge
    ist er an addrees 0x0, da ist wohl schluss, bei allem schreibt er ja nur 14mb
    da ist bei 0909090 schluss. kann man nicht immer ein stück bearbeiten oder wie
    versteh das nicht,



  • zeilenweise den code durchgehen!
    dh:
    von der main angefangen, immer die exit(0); funktion eine zeile nach unten tun, bis du den fehler lokalisieren konntest 🙂
    so in der art machs ich halt. dazu jede menge debugausgaben, damit ich seh, was in der variable drin steht... gdb hab ich noch nie wirklich verwendet...

    hth,
    ciao


  • Mod

    void ChangeInetnum(char *pTinetnum)                         //"-" rausnehmen und dafür Tab einsetzen
    {
        char *ptemp, *ptemp2;
       for(ptemp=pTinetnum;*ptemp!=' ';ptemp++){                                                  //Bis zur ersten Leerstelle springen
           ;
       }
       for(ptemp2=ptemp;((int)*ptemp2)<48||((int)*ptemp2)>57;ptemp2++){             //Ab Leerstelle bis zur ersten Zahl-
           ;                                                                         //mit casting (int) ermittelt
       }
       *ptemp++='\t';
       *ptemp='\t';                                                                 //2 Tab zwischen die IPs
       ptemp++;
       while(*ptemp2!='\n'){
           *ptemp=*ptemp2;
          ptemp++;
          ptemp2++;
       }
       *ptemp++='\n';                                                               //hinten NewLine
       *ptemp='\0';                                                                 //und Ende dran
    
    }
    

    der cast nach int ist ganz sicher falsch - es würde mich wundern, wenn das nicht zu einer speicherschutzverletzung führt. du willst nicht wissen, ob die vier byte, an der stelle ptemp2, als integer interpretiert, kleiner als 48 bzw. grösser als 57 sind, sondern ob das zeichen, auf das ptemp2 zeigt, eine ziffer ist.

    for( ptemp2 = ptemp; *ptemp2 < '0' || *ptemp2 > '9'; ++ptemp2 );
    

    wenn du dir die bisherige ausgabedatei ansiehst, stellst du sicher fest, dass die zweite ip fast immer dieselbe ist.
    ein anderes mögliches problem ist, dass das programm nicht fehlertolerant ist. falls also die eingabedatei aus irgendeinem grund an einer stelle falsch formatiert ist, könntest du leicht probleme bekommen.
    zum beispiel:

    void ChangeTchanged(char *pTchanged)                        //Alles hinter Leerzeichen abtrennen
    {
        char *ptemp;
       for(ptemp=pTchanged;*ptemp!=' ';ptemp++){
           ;
       }
       *ptemp++='\n';
       *ptemp='\0';
    }
    

    was machst du, wenn die zeile mal kein weiteres leerzeichen enthält...
    also besser hier mindestens noch sicher stellen, dass nicht über das zeilenende hinweg gelesen wird, was du für den fall, dass die zeile falsch ist machen willst, bleibt dir überlassen. am simpelsten wäre, gar nichts zu tun:

    void ChangeInetnum(char *pTinetnum)             //"-" rausnehmen und dafür Tab einsetzen
    {
    	char *ptemp, *ptemp2;
    	for( ptemp = pTinetnum; *ptemp && *ptemp != ' '; ++ptemp );	//Bis zur ersten Leerstelle springen
    	if( ! *ptemp ) return;	// bei Zeilenende nichts tun
    	for( ptemp2 = ptemp; *ptemp2 && ( *ptemp2 < '0' || *ptemp2 > '9' ); ++ptemp2 );	//Ab Leerstelle bis zur ersten Zahl
    	if( ! *ptemp2 ) return;
    	if( ptemp + 2 > ptemp2 ) return;
    	*ptemp++ = '\t';
    	*ptemp++ = '\t';                                                                 	//2 Tab zwischen die IPs
    	while( *ptemp++ = *ptemp2++ );
    }
    


  • Das ist doch mal eine Aussage danke dir dafür.
    Also das erste wird richtig interpretiert so wie ich das gemeint hatte.

    Es liegt wohl an der formatierung, der Fehler tritt immer an der gleichen
    stelle auf, und habe das unter bsp von dir eingefügt und fehler liegt an
    einer anderen stelle. so werde ich mal jeden fehler beseitigen.

    danke dir camper

    muss dazu sagen das mein ersten freies programm mehr oder weniger frei
    schnauze gemacht, jo einige sachen die man besser machen könnte


  • Mod

    logisch, muss funktionieren, du castest ja nach int NACHDEM du den zeiger dereferenziert hast - das ist lediglich überflüssig; hab ich geschlafen.
    ob den cast dort hast oder nicht ist völlig egal.
    kleiner tip: (läuft aber vermutlich unter schlechter stil 🙂 )

    wenn du schon castest, dann so dass es was bringt:

    for( ptemp2 = ptemp; *ptemp2 && (unsigned char)( *ptemp2 - '0' ) > 9; ++ptemp2 );    //Ab Leerstelle bis zur ersten Zahl
    


  • @pradox
    Versuch mal den Fehler etwas weiter einzugrenzen. Du kannst dir dazu z. B. einfach die Zeilennummer ausgeben lassen, bei der es kracht. Sollte es immer die selbe sein, dann versuch genau bei dieser Zeile zu debuggen.

    Michael E. schrieb:

    Lern debuggen 😡

    BTW: Dein RAM ist wahrscheinlich zu klein.

    Man kann nicht immer so einfach debuggen! Quäl du dich mal durch 14 MB durch mit dem Debugger. Da muss man den Fehler erstmal anders eingrenzen und dann kann man mit dem Debugger ran gehen. Außerdem hättest du das auch ein wenig höflicher formulieren können.


Anmelden zum Antworten