Frage von micholee, 24

Was macht ein C-Code beginnend mit Klammer und dann mit Rechteck?

Hallo zusammen,

ich bin kein Softwareentwickler, vor allem nicht in C, mich würde aber folgender Codeschnipssel interessieren:

(*data)[var_1] = (t16)(read_bla_1(0));

var_1++;

(*data)[var_1] = (t16)(read_bla_1(0) >> 8);

var_1++;

(*data)[var_1] = (t16)(read_bla_2(0));

var_1++;

(*data)[var_1] = (t16)(read_bla_2(0) >> 8);

var_1++;

....

  1. Sieht zwar aus wie ein Array [var_1], micht irritiert aber die vorangehende Klammer, welches aussieht wie ein Cast. Vor allem mit dem Stern darin.

  2. Nach dem Gleichheitszeichen sollte dies ein Cast für 16 bit oder 2 byte sein. Sieht so aus, als würde man das erste Byte lesen und dann das zu nächsten Arraystelle gehen und das nächste Byte auslesen. Wobei es hier doppeltgemobbelt aussieht. Erst gehen wir in das nächste Array, schieben aber die Bits trotzdem 8mal nach rechts.

  3. Das letzte was mich irritiert ist das Gleichheitszeichen. Das was ich auslese, weise ich dem Array wieder zurück?

Über kleine Hilfestellungen, bzw. 1-Zeiler-Erklräungen zu den drei fragen oben, wäre ich euch sehr dankbar.

Expertenantwort
von martin7812, Community-Experte für programmieren, 24

micht irritiert aber die vorangehende Klammer, welches aussieht wie ein Cast

Nein, das ist kein Cast. In einer Cast-Klammer steht immer nur ein Datentyp; hier steht kein Datentyp in der Klammer.

Beispiele:

(t16 *)1234 // Cast
((t16 *)1234)[5] // äußere Klammer ist kein Cast

Prinzipiell kann man bei C extra-Klammern setzen wie man will; die folgenden Zeilen sind alle dasselbe:

a*5+b
(a*5)+b
(((a*5)))+b

In anderen Fällen muss man Klammern verwenden:

a*(5+b)

Was bei dir passiert, ist dass ein Pointer aufgelöst wird, das Ergebnis ein Array ist und von diesem Array dann das Element [var_1] verwendet wird.

Die beiden folgenden Zeilen sind übrigens dasselbe:

(*data)[var_1]
data[0][var_1]

Wobei es hier doppeltgemobbelt aussieht.

Warum?

Eine Verschiebung um 8 Bits nach rechts ist nicht anderes als eine Division durch 256.

Folgender Code ist eventuell leichter zu lesen, macht allerdings dasselbe wie dein Code:

data[10] = funktion1(0);
data[11] = funktion1(0)/256;
data[12] = funktion2(0);
data[13] = funktion2(0)/256;

Nun müsste man noch wissen, ob "funktion1(0)" immer denselben Wert zurückliefert oder ob bei jedem Aufruf ein anderer Wert zurückgeliefert wird.

Im ersten Fall wäre der von dir gezeigte Code sinnvoll, wenn das Array einen 8-bit-Datentyp hätte (dann wäre allerdings ein Cast nach einem 8-bit-Typ angebrachter).

In diesem Fall würden in data[10] die unteren 8 Bit und in data[11] die oberen 8 Bit des Rückgabewertes gespeichert werden.

Im Zweiten Fall ist data[10] und data[11] sowieso etwas anderes, da "funktion1" ja jedes Mal einen anderen Wert zurückliefert.

Beispiel:

Beim ersten Aufruf gibt "funktion1" den Tag des Datums zurück, beim zweiten Aufruf den Monat multipliziert mit 256. Dann würde jetzt im Feld data[10] der Tag und in data[11] der Monat stehen.

Das letzte was mich irritiert ist das Gleichheitszeichen

(*data)[var_1] = (t16)(read_bla_1(0) >> 8);
  • Die Funktion "read_bla_1" wird ausgeführt
  • Das Ergebnis wird durch 256 dividiert
  • Von diesem Ergebnis werden wiederum nur die 16 unteren Bits genommen
  • Diese unteren 16 Bits werden nun in das Array an der Stelle "var_1" geschrieben

Keine passende Antwort gefunden?

Fragen Sie die Community