problem mit struct
-
so, hab mal wieder ein kleines prob

es geht um data.value[] bzw wert[]
unterschied zwischen a und b:
bei a befindet sich der wert (value[]) im struct.Problem:
die berechnung von data.peakmax, data.peakmin funktioniert bie version A nicht. wenn ich data.value[3] bzw. data.value[4] ausgebe, dann ist der inhalt = 0. berechnung von rpm, averagevalue und der objekte funktionieren aber.bei version B funktioniert alles.
VERSION A
struct Sensor_st{ char timestamp[8]; //hh:mm:ss double rpm; double peakmin; double peakmax; double averagevalue; double object[5]; int value[39]; // <------------------------------------------- }; int Record (SensorClass &sensor, FILE *logfile){ int iLen; char cBuffer[200]; int i, j; int leveloverflows = 0; Sensor_st data; char *timestamp; timestamp = new char; struct tm *the_time; time_t long_time; for(;;){ if(kbhit()){ if(KeyMenu(sensor)){return -1;} } // Wurde eine Taste gedrückt iLen=ComRead(sensor.com_port-1,cBuffer,200); //read string from buffer if(iLen>0){ cBuffer[iLen]=0; /* converting incoming string to integer values */ for (i=j=0; i<90; i++){ if (cBuffer[i+1] < 0){data.value[j] = (cBuffer[i] <<8) + (cBuffer[i+1]+256);} else { data.value[j] = (cBuffer[i] <<8) + (cBuffer[i+1]);} i++; j++; } // end for (i=j=0; i<90; i++) /* create timestamp */ time(&long_time ); the_time = localtime( &long_time ); sprintf(data.timestamp,"%s:%s:%s:%s", IntToString(the_time->tm_hour,2), IntToString(the_time->tm_min,2), IntToString(the_time->tm_sec,2)); data.peakmax = (data.value[3]*1.990049751); // <--------------------- data.peakmin = (data.value[4]*1.990049751); // <--------------------- data.averagevalue = ((data.value[5] * pow(2, data.value[6]))/15500)*1.990049751; data.rpm = data.value[18]*1.5; data.object[0] = (data.value[7] * pow (2,data.value[12])) / (8.625*data.value[17]); data.object[1] = (data.value[8] * pow (2,data.value[13])) / (8.625*data.value[17]); data.object[2] = (data.value[9] * pow (2,data.value[14])) / (8.625*data.value[17]); data.object[3] = (data.value[10] * pow (2,data.value[15])) / (8.625*data.value[17]); data.object[4] = (data.value[11] * pow (2,data.value[16])) / (8.625*data.value[17]); PrintData(data); } else{Sleep(50);} // wait if buffer is empty }//end for (;;) return -1; }VERSION B
int Record (SensorClass &sensor, FILE *logfile){ int iLen; char cBuffer[200]; int i, j; int leveloverflows = 0; Sensor_st data; int wert[39] // <------------------------------------------- char *timestamp; timestamp = new char; struct tm *the_time; time_t long_time; for(;;){ if(kbhit()){ if(KeyMenu(sensor)){return -1;} } // Wurde eine Taste gedrückt iLen=ComRead(sensor.com_port-1,cBuffer,200); //read string from buffer if(iLen>0){ cBuffer[iLen]=0; /* converting incoming string to integer values */ for (i=j=0; i<90; i++){ if (cBuffer[i+1] < 0){wert[[j] = (cBuffer[i] <<8) + (cBuffer[i+1]+256);} else { wert[[j] = (cBuffer[i] <<8) + (cBuffer[i+1]);} i++; j++; } // end for (i=j=0; i<90; i++) /* create timestamp */ time(&long_time ); the_time = localtime( &long_time ); sprintf(data.timestamp,"%s:%s:%s:%s", IntToString(the_time->tm_hour,2), IntToString(the_time->tm_min,2), IntToString(the_time->tm_sec,2)); data.peakmax = (wert[[3]*1.990049751); data.peakmin = (wert[[4]*1.990049751); data.averagevalue = ((wert[[5] * pow(2, wert[[6]))/15500)*1.990049751; data.rpm = wert[[18]*1.5; data.object[0] = (wert[[7] * pow (2,wert[[12])) / (8.625*wert[[17]); data.object[1] = (wert[[8] * pow (2,wert[[13])) / (8.625*wert[[17]); data.object[2] = (wert[[9] * pow (2,wert[[14])) / (8.625*wert[[17]); data.object[3] = (wert[[10] * pow (2,wert[[15])) / (8.625*wert[[17]); data.object[4] = (wert[[11] * pow (2,wert[[16])) / (8.625*wert[[17]); PrintData(data); } else{Sleep(50);} // wait if buffer is empty }//end for (;;) return -1; }bin fuer jeden tipp dankbar
sash
-
Erstens: Ich hoffe mal, die doppelten Klammern [[ bei Version B sind nur ein C&P-Fehler.
Zweitens: Am Ende der for(i=j=0)-Schleife steht i auf 90 und j (wenn ich das richtig überblicke) auf 45 - da schreibst du jenseits des verfügbaren Arrays. Und das timestamp-Feld ist ebenfalls zu klein für die Daten, die du reinpacken willst (daß sprintf() auch Zahlenwerte verarbeiten kann, ignorieren wir mal ;))
Drittens: Das C-Board ist eine Etage weiter oben.
-
CStoll schrieb:
Drittens: Das C-Board ist eine Etage weiter oben.
Das ist kein C.
-
Bashar schrieb:
CStoll schrieb:
Drittens: Das C-Board ist eine Etage weiter oben.
Das ist kein C.
Was dann? Das einzige C++-artige, was ich an dem Code sehe, ist das "SensorClass &sensor" im Funktionskopf - und die Tatsache, daß er "Sensor_st" ohne struct-Kennung verwendet.
-
CStoll schrieb:
Das einzige C++-artige, was ich an dem Code sehe, ist das "SensorClass &sensor" im Funktionskopf - und die Tatsache, daß er "Sensor_st" ohne struct-Kennung verwendet.
Reicht das nicht?
-
Bashar schrieb:
Reicht das nicht?
Es reicht aus, damit ich dem Thread nicht gleich einen Schubs ins C-Board verpasse
Aber es ist zu wenig, um das Problem als C++ typisch einzuordnen.
-
Dann brauchen wir ein Board für C++-Probleme, die nicht C++-typisch sind.

-
Bashar schrieb:
Dann brauchen wir ein Board für C++-Probleme, die nicht C++-typisch sind.

Ich denke, CStoll wollte dem Threadsteller eher einen Schubs in die Richtung geben, sauberen Code zu schreiben.
-
CStoll schrieb:
Erstens: Ich hoffe mal, die doppelten Klammern [[ bei Version B sind nur ein C&P-Fehler.
Zweitens: Am Ende der for(i=j=0)-Schleife steht i auf 90 und j (wenn ich das richtig überblicke) auf 45 - da schreibst du jenseits des verfügbaren Arrays. Und das timestamp-Feld ist ebenfalls zu klein für die Daten, die du reinpacken willst (daß sprintf() auch Zahlenwerte verarbeiten kann, ignorieren wir mal ;))
Drittens: Das C-Board ist eine Etage weiter oben.
Ersten: ja, sonst wuerd ja garnix gehen^^
zweitens: danke (hab die anfang und strings vergessen mit dazu zu zaehlen), werds verbessern
sprintf() macht mir aber keine 0'len davor. also wuerde halt 1:4:2 statt 01:04:02 rauskommen, oder gibts da schon was fertiges?drittens: stimmt, wollte anfangs die ganze klasse und noch paar sachen dazu kopieren, aber dann gemerkt das ich fuer den fehler irrelevant sind
Konrad Rudolph schrieb:
Bashar schrieb:
Dann brauchen wir ein Board für C++-Probleme, die nicht C++-typisch sind.

Ich denke, CStoll wollte dem Threadsteller eher einen Schubs in die Richtung geben, sauberen Code zu schreiben.
Immer gerne
programmiere eigentlich mehr auf mikrocontrollern
wobei die funktion noch der prototyp ist und ich die gerade optimieren will und jetzt eben am den dem struct haenge.
-
sash schrieb:
zweitens: danke (hab die anfang und strings vergessen mit dazu zu zaehlen), werds verbessern
sprintf() macht mir aber keine 0'len davor. also wuerde halt 1:4:2 statt 01:04:02 rauskommen, oder gibts da schon was fertiges?Ja, die printf-Formatierungen sind zwar reichlich kryptisch, aber auch recht mächtig - für deine Zwecke sollte %02d die richtige Formatkennung sein.
Konrad Rudolph schrieb:
Bashar schrieb:
Dann brauchen wir ein Board für C++-Probleme, die nicht C++-typisch sind.

Ich denke, CStoll wollte dem Threadsteller eher einen Schubs in die Richtung geben, sauberen Code zu schreiben.
Ja, darauf wollte ich hinaus - der Code sah aus wie von einem C-Programmierer, der jetzt krampfhaft versucht, sein Wissen 1:1 in C++ umzusetzen.
-
printf() mit%02 funktioniert

und der fehler kam, weil ich uebers array hinaus geschrieben hab.ich weiss jetzt nicht was man hier c++ typisch machen koennte, mir fallen nur ein paar kleine "optimierungen auf:
koennte die konstanten fuer die berechnung definieren und die 5 objekte in einer schleife berechnen lassen
-
sash schrieb:
ich weiss jetzt nicht was man hier c++ typisch machen koennte, mir fallen nur ein paar kleine "optimierungen auf:
koennte die konstanten fuer die berechnung definieren und die 5 objekte in einer schleife berechnen lassenDiese Optimierungen sind zwar durchaus brauchbar, aber nicht C++ typisch

Ich meinte eher, du solltest Sachen wie std::string oder std::vector<> verwenden anstelle der nackten Arrays.