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 lassen

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


Anmelden zum Antworten