Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Bytearray umwandeln in Zahl mit Vorzeichen Kategorie: Programmierung (von André H. - 10.02.2006 21:35)
Als Antwort auf Re: Bytearray umwandeln in Zahl mit Vorzeichen von Felix W. - 10.02.2006 20:29
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
Hallo Felix,

>
> function getValue (byte arraywert[], byte posLow, byte posHigh) returns long
> {
>   long wert; int i; //max. 32bit / 4 Byte
>   wert=arraywert[posLow];
>   for i=posLow+1...posHigh
>     {wert=wert or (arraywert[i] shl (i-posLow)*8);}
>   return wert;
> }


Gut, Du hast eine universelle Funktion gebaut.
Die For-Schleife macht das aber unnötig langsamer.
Besser ist es, da es hier ja nur zwei sinnvolle Möglichkeiten gibt,
diese mit if zu unterscheiden.
AuÃ?erdem wird Deine Funktion Probleme mit negativen 24-Bit-Werten haben.
Denn, zum Zusammensetzen von einem Integer wird man die Funktion kaum benutzen,
da man so unnotig in Long-Werte benutzt.
Daher wäre ausführungstechnisch z.B. das schneller:
function getValue (byte arraywert[], byte posLow, byte len) returns long
{// len=3 oder 4
 long wert; int i; //max. 32bit / 4 Byte
 if len==3
  {
   wert=((arraywert[poslow+2] and 0x80)!=0 shl 7) or (arraywert[poslow+2] and 0x7F);
   return (arraywert[poslow+1] shl 8) or arraywert[poslow] or (wert shl 16);
  }
 if len==4
  {
   wert=(arraywert[poslow+3] shl 8) or (arraywert[poslow+2] and 0x7F);
   return (arraywert[poslow+1] shl 8) or arraywert[poslow] or (wert shl 16);
  }
}



 
> Hiermit wandle ich andersrum:
>
>
> function putValue (long wert, byte posLow, byte posHigh)
> {
>   int i;
>   for i=posLow...posHigh {Out_Array[i]=wert shr (i-posLow)*8;}
> }

>
> Schade, dass keine Arrays zurückgegeben werden können, sodass Out_Array[]
> global sein muss...

Natürlich kannst Du Arrays zurückgeben.
OK, nicht direkt zuückgebe, aber der Funktion als Referenz übergeben und so direkt bearbeiten:

function putValue (long wert, byte posLow, byte posHigh, byte Out_Array[])
{
 int i;
 for i=posLow...posHigh {Out_Array[i]=wert shr (i-posLow)*8;}
}
...
...
byte Daten[4];
...
putValue(1234567,0,3,Daten);


In "Daten[]" hast Du nun die Daten. ;-)

MfG André H.




Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: