Problem mit BYTE*??



  • Hallo,
    ich sende Daten über RS232, dazu benutze ich datentyp unsigned char(BYTE).
    Ich lese aus meinem Programm 2 Floats in die Variablen BYTE* UpperRangeValue und BYTE* LowerRangeValue ein. Doch dann steht in beiden der selbe Wert.

    //COMMAND 35, write PVUnit, upper range, lower range
    	BYTE* UpperRangeValue;
    	BYTE* LowerRangeValue;	
    	UpperRangeValue=GetTH200HexValues(MyApp->GetView()->GetVarUpperRangeValue());
    	LowerRangeValue=GetTH200HexValues(MyApp->GetView()->GetVarLowerRangeValue());
    	BYTE HARTCOMMAND_035[23] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0xAA, Flags,
    		DeviceId[0], DeviceId[1], DeviceId[2], 0x23, 0x09, PVUnit,
    		UpperRangeValue[3], UpperRangeValue[2], UpperRangeValue[1], UpperRangeValue[0],
    		LowerRangeValue[3], LowerRangeValue[2], LowerRangeValue[1], LowerRangeValue[0], 0xE8};
    	MyCOM.Communication(HARTCOMMAND_035, 23, Response, 0, 3000);
    
    BYTE* TH200COM::GetTH200HexValues(float FloatValue)
    {
    	Hex2Float hex2float;
    	hex2float.fValue=FloatValue;
    
    	return hex2float.Hex;
    }
    
    float GetVarLowerRangeValue(){return m_fAnfangswert;}
    		float GetVarUpperRangeValue(){return m_fEndwert;}
    

    Wer hat ne Idee woran es liegt?
    Ich denke mal es liegt an Pointer BYTE*?



  • Wie arbeitet denn die Funktion GetTH200HexValues()? Ich würde ja darauf tippen, daß sie ein statisches BYTE-Array hat und bei jedem Afuruf überschreibt. (daraus folgt, daß du den Rückgabewert auslesen mußt, bevor du die Funktion das nächste Mal aufrufen kannst).

    (PS: Zeig doch das nächste Mal etwas zusammenhängendes - aus den Bruchstücken lässt sich noch nicht einmal ein lauffähiges Programm rekonstruieren)



  • GetTH200HexValues hat ein Union hex2float, mit dem ich float in BYTE umwandle.
    Die Werte stehn dann in einem Array.
    Den Rückgabewert von GetTH200HexValues schreibe ich dann in UpperRangeValue.
    Was sollte ich denn ändern damit es funktioniert?



  • Auf jeden Fall keinen Zeiger auf eine lokale Variable zurückgeben (daß die sich in einem union verbirgt, macht die Sache auch nicht besser). Aber diese Hilfskonstruktion mit dem union brauchst du auch nicht wirklich - nimm doch stattdessen reinterpret_cast<>.



  • Kein Plan wie ich das jetzt anders machen soll.
    Muss mal überlegen, viel möchte ich jetzt auch nicht mehr an diesem Konstrukt ändern.



  • char* UpperRangeValue=reinterpret_cast<char*>(&MyApp->GetView()->GetVarUpperRangeValue());
    

    So schwierig ist das doch gar nicht, oder?



  • char* UpperRangeValue=reinterpret_cast<char*>(&MyApp->GetView()->GetVarUpperRangeValue
    

    das wandelt mir einen Float-Wert in ein unsigned char um?
    Also Beispielsweise macht es aus dem Float-Wert 32.00 -> 42 00 00 00?
    Na wenn das funktioniert wär ja nicht schlecht.



  • Habs mit deiner Methode probiert, doch ich bekomme folgende Fehlermeldung:
    '&' erwartet L-Wert.
    Was hat das zu bedeuten?



  • Erstens: dein BYTE* ist auch nur ein Zeiger auf ein char-Array (BYTE ist idR ein typedef für 'unsigned char')

    Zweitens: An das Problem RWert/LWert habe ich jetzt nicht gedacht, sorry. Aber das kannst du lösen, indem du den Rückgabetyp der beiden GetVar...() Funktionen auf 'const float&' änderst (oder ihre Rückgabe in eine lokale float-Variable packst).



  • Danke es klappt einwandfrei.
    Jetzt kann ich auch die blöden Unions löschen. 😃


Anmelden zum Antworten