www.mikrocontroller.net

Forum: PC-Programmierung Byteoperation funktioniert nicht


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite mit LabWindows/CVI 9.0.1. Wenn ich zwei char in einen short 
kopieren will, mache ich das normalerweise so:

Cues[iTempVal].cviAchsen[iTempVal_2].AxDelays.sDelayValue = (((short) 
cTempData[uiDataOffset +57] << 8) | cTempData[uiDataOffset +56]);

Aber hier funktioniert das irgendwie net. Wenn ich aber ein memcopy 
mache:

memcpy (&Cues[iTempVal].cviAchsen[iTempVal_2].AxDelays.sDelayValue, 
&cTempData[uiDataOffset + 56], 2);

dann funktioniert das einwandfrei. Liegt das jetzt an mir, oder is da 
irgendwo im CVI ein Bug?

MfG

Markus

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist

  iTempVal].cviAchsen[iTempVal_2].AxDelays.sDelayValue

vom Typ short? Dann sollte es eigentlich auch mit der Bitshifterei
funktionieren.

> Aber hier funktioniert das irgendwie net.

Was bedeutet das? Gibt der Compiler einen Fehler aus? Stimmt das
Ergebnis nicht? Wenn ja, hast du ein paar Beispiele dafür?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, der Zieldatentyp ist ebenfalls short. Es gibt keinen 
Compilerfehler. Es stimmt nur das Ergebnis nicht, weil nur das Low-Byte 
eingefügt wird.

Das komische ist, dass es ein paar Zeilen weiter oben mit anderen 
Variablen Funktioniert wie es soll.

MfG

Markus

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Datentyp nutzt C(++) bei einer Operation? Die des ausgehenden, 
ersten Operanden. Also hat er ein Byte vor sich und das willst du um 8 
Bits nach links shiften. Damit wird es 0 und dann oder dein anderes Byte 
dazu und du erhälst nur dein Low Byte. Das Ergebnis castest du dann von 
Byte aus Short und fertig ist.

Lösung:
Caste vorher cTempData[uiDataOffset +57] auf einen short - also vorher 
explizit auf einen 16 Bit grossen Datentyp casten und dann kann man auch 
8 Bit hochshiften.

Oder du baust dir einfach eine kleine Helferfunktion:
short MakeShort(byte h, byte l)
{
  return ((short)h << 8) | l;
}

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Lösung:
> Caste vorher cTempData[uiDataOffset +57] auf einen short - also vorher

Das macht Markus doch.

Da in C aber alle Rechenoperationen sowieso mindestens mit int-Breite
ausgeführt werden¹, erübrigt sich sogar dieser Cast nach short, und
folgendes funktioniert ebenfalls:
  Cues[iTempVal].cviAchsen[iTempVal_2].AxDelays.sDelayValue =
    cTempData[uiDataOffset+57] << 8 | cTempData[uiDataOffset+56];

Der Cast und die Klammern bei Markus dienen ausschließlich der besseren
Lesbarkeit.

Ich kann also beim besten Willen keinen Fehler erkennen. Entweder liegt
der Fehler woanders im Code, bspw. beim Befüllen des cTempData-Arrays
oder bei der Ausgabe des Ergebnisses, oder der Compiler hat tatsächlich
einen Bug.

¹) Der Compiler darf nur dann 8-Bit-Operationen verwenden, wenn dies am
   Ergebnis nichts ändert.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal mehrere Dinge überlegen:

1. Ein char ist nicht immer vorzeichenlos.
2. Ein short hat nicht unbedingt mehr Bits als ein char.
#include <stdio.h>

int main(void) {
        signed char sc1, sc2;
        unsigned char uc1, uc2;

        sc1 = uc1 = 0xAA;
        sc2 = uc2 = 0xFF;

        int sz = sc1<<8 | sc2;
        int uz = uc1<<8 | uc2;
        printf("sz = %i\nuz = %i\n", sz, uz);
}
sz = -1
uz = 43775

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure rege Anteilnahme. Wenn ich das cTempData Array anschaue 
dann stehen die Daten da schon richtig drin. Sonst würde ja auch der 
memcopy ein falsches Ergebnis liefern. Ich hab das Problem jetzt auch 
mal mit dem Support von National Instruments besprochen und denen mein 
Programm geschickt. Bin gespannt was dabei rauskommt.

MfG

Markus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.