Stringumwandlung ->Crash ->Hilfe! Kategorie: Programmierung (von Gordon Klimm - 8.02.2005 7:23) | ||
| ||
Hallo zusammen. Ich bin kurz vorm Verzweifeln. Wahrscheinlich sehe ich die Hand vor meinen Augen nicht und bitte hier um Hilfe. Ich schreibe momentan ein Programm zur Ansteuerung eines Pyrometers. Dabei lese ich Strings über SWCOM ein und wandle diese in eine Tabelle mit Zahlen um. Bei dieser Aktion schmiert meine CC2 regelmä�ig ab und ich finde nicht heraus woran es liegen könnte. Kann mir jemand helfen? Funktion, in der CC2 abschmiert (Erklärungen unten): function UpdateTable(byte s[]) { // Definition for local variables int lI_Counter; int lI_Column; long lI_tempInt; long lL_temp1; long lL_temp2; long lLong1; long lL_x; long lL_y; long lL_z; float lF_dx; float lF_dy; string debugout; // Initialization of local variables lLong1 = 0; lI_Column = 0; lL_temp1 = 0; // Work // Split the Line /*/DEBUG1: hwcom.print2(s); //ENDDEBUG */ for lI_Counter=0 ... <s[31] { if s[lI_Counter] == 0x2C // colon "," { if lI_Column == 0 { lL_x = lL_temp1; } else// if lI_Column == 1 { lL_y = lL_temp1; } lL_temp1 = 0; lI_Column = lI_Column + 1; /*/DEBUG2: debugout = "X"; str.putlong(debugout,lL_temp1); hwcom.print(debugout); //ENDDEBUG */ continue; } else if s[lI_Counter]<0x30 or s[lI_Counter]>0x39 { // we do have a serious problem here ! continue; //for now } else { lL_temp2 = lL_temp1 * ten; /*/DEBUG3: debugout = ""; str.putlong(debugout,lL_temp1); str.put(debugout,"#"); str.putlong(debugout,lL_temp2); hwcom.print(debugout); hwcom.ret(); //ENDDEBUG */ lL_temp1 = s[lI_Counter] - 0x30; /*/DEBUG4: debugout = ""; str.putlong(debugout,lL_temp1); hwcom.print(debugout); hwcom.ret(); //ENDDEBUG */ lL_temp1 = lL_temp1 + lL_temp2; /*/DEBUG5: debugout = ""; str.putlong(debugout,lL_temp1); hwcom.print(debugout); hwcom.ret(); //ENDDEBUG */ } } lL_z = lL_temp1; // cut here (->next theme) // we do have three values "lL_x", "lL_y" and "lL_z" if ( lL_x | lL_y | lL_z ) == 0 { // "0,0,0" -> First set // Decide to rebuild the table gI_tabellenindex = 0; gI_tabellenindexUsed = 0; tabelle[0].L_offsX = 0; tabelle[0].L_offsY = 0; tabelle[0].L_m = 0; //add Current Value tabelle[gI_tabellenindex].L_x = lL_x; tabelle[gI_tabellenindex].L_y = lL_y; tabelle[gI_tabellenindex].L_sonst = lL_z; // tell the CNC, we cleared our curve gI_BitsToCNC = gI_BitsToCNC & !CNC_bCURVE; } else { lI_tempInt = gI_tabellenindex; //previous //update Index and recalc steepness gI_tabellenindex = gI_tabellenindex + 1; //->actual // put the results into the desired shape //add Current Value tabelle[gI_tabellenindex].L_x = lL_x; tabelle[gI_tabellenindex].L_y = lL_y; tabelle[gI_tabellenindex].L_sonst = lL_z; tabelle[gI_tabellenindex].L_offsX = tabelle[lI_tempInt].L_x; tabelle[gI_tabellenindex].L_offsY = tabelle[lI_tempInt].L_y; // we do need "local_dx" and "local_dy", otherwise CC2 doesnot use Float for math :-( lF_dx = tabelle[gI_tabellenindex].L_x - tabelle[gI_tabellenindex].L_offsX; lF_dy = tabelle[gI_tabellenindex].L_y - tabelle[gI_tabellenindex].L_offsY; if (lF_dx == 0) lF_dx = 1; // prevent "DIV BY ZERO" tabelle[gI_tabellenindex].L_m = 10000 * lF_dy; tabelle[gI_tabellenindex].L_m = tabelle[gI_tabellenindex].L_m / lF_dx; } /*/DEBUG6: debugout = "#"; //show me, where we are str.putlong(debugout,lL_x); hwcom.print(debugout); debugout = "*"; str.putlong(debugout,lL_y); hwcom.print(debugout); debugout = "@"; str.putint(debugout,gI_tabellenindex); hwcom.print(debugout); debugout = "$"; str.putlong(debugout,tabelle[gI_tabellenindex].L_m); hwcom.print(debugout); hwcom.ret(); //ENDDEBUG */ if gI_tabellenindex < 255 lI_tempInt = gI_tabellenindex + 1; else lI_tempInt = 255; //Define next (LAST) Value if (lL_x >= 9999989) gI_BitsToCNC = gI_BitsToCNC | CNC_bCURVE; tabelle[lI_tempInt].L_x = 9999990; tabelle[lI_tempInt].L_y = 37; tabelle[lI_tempInt].L_sonst = 0; //debug(2); } Erklärung: Ich empfange bis zu 255 Triplets "123,234,3<cr>" über SWCOM. Diese werden als string gespeichert und nach <cr> an die Funktion gegeben. Dort sollen aus dem Text drei Zahlen erzeugt werden. (s.o.) wenn ich die DEBUG-Zeilen aktiviere, sehe ich, dass die CC2 irgendwann in DEBUG3 den ersten Faktor nicht mehr kennt und mit Null multipliziert. Kurz darauf ist alles zu spät und die CC2 läuft Amok. Ich kann aber nicht ersehen warum das so ist. Kann mir jemand helfen? Herzlichen Dank, Gordon. | ||
Antwort schreiben Antworten: Re: Stringumwandlung ->Crash ->Hilfe! (von André H. - 19.02.2005 10:07) |