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
-
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
-
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.