C > Zeiger operationen

Gast #5847281
Lesenswert?

Nabend,
1
s8 BMP180_I2C_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
2
{
3
  enum I2c_Return_Codes Exitcode = I2cWriteBytes( reg_data , cnt , dev_addr );
4
  #warning "reg_addr muss noch uebergeben werden"
5
      
6
  return (s8)Exitcode;
7
}

Ich habe da mal eine Frage an euch Profis (:
Die Funktion "I2cWriteBytes" nimmt jetzt nur 3 Parameter an.
Die Funktion "BMP180_I2C_bus_write" jedoch hat einen Parameter mehr 
"reg_addr".

Meine Frage jetzt an euch.
Kann ich die "reg_addr" irgendwie ohne großen Aufwand vor "reg_data" 
hängen? Da "reg_addr" ja ein Zeiger ist bin ich ein wenig verwirrt ob 
das überhaupt funktioniert.

Hätte mir das jetzt so gedacht -> ( Pseudokode! )
1
uint8_t *I2cTransfer[] = 
2
{
3
   &reg_addr,
4
   reg_data
5
};

Natürlich müsste die Funktion "I2cWriteBytes" damit auch umgehen können.

Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an 
"I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig 
"kompakt" halten.

Mfg
Gast #5847300
Lesenswert?

Thomsa A. schrieb:
> Hätte mir das jetzt so gedacht -> ( Pseudokode! )uint8_t *I2cTransfer[]
> =
> {
>    &reg_addr,
>    reg_data
> };

Wenn dein Pseudocode ein Array beschreibt ist das gar nicht schlecht.
"I2cWriteBytes" wird nur ein Array der Länge "cnt" übertragen.
darin befindet sich dann auch die Register-Adresse, die du deinem 
"reg_data"-Array voranstellen musst.
Das hängt damit zusammen, dass es I²C-Bauteine gibt, die 
16Bit-Registeradressen verwenden, und welche die nur 8bit breite 
RegisterAdressen verwenden.

(Die Info solltest du aber in der Doku zu der Funktion finden.)

Du brauchst also ein u8-Array, das um ein oder zwei Bytes länger ist, 
als das, was an die Funktion übergeben wurde.
Da packst du zu erst die Registeradresse bytweise rein (bei 16bit die 
Bytereiehenfolge beachten).
Hinter die Adresse kopierst du dann die Daten, die deine Funktion 
übergeben bekommen hat.
Gast #5847301
Lesenswert?

> Kann ich die "reg_addr" irgendwie ohne großen Aufwand vor "reg_data"
> hängen?

Nein, nicht ohne Umkopieren.

> Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an
> "I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig
> "kompakt" halten.

I2cWriteBytes() erweitern oder reg_addr und reg_data adäquat in ein 
struct packen.

HTH
#5847434
Lesenswert?

Thomsa A. schrieb:
> Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an
> "I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig
> "kompakt" halten.

Eine der grundlegendsten Grundregeln beim programmieren lautet, sich 
niemals selber ohne Not von hinten durch die Brust ins Knie zu schießen. 
Das könnte nicht nur ins Auge gehen, daß tut das mit Sicherheit.

Wenn eine Funktion vier Parameter braucht, dann bekommt die vier 
Parameter. Elektronisches Papier ist unbegrenzt verfügbar, und die 
Buchstaben kosten auch nichts.

Wenn Daten sinnvoll zusammengefasst werden können und auch 
zusammengehören, dann packt man die in ein struct.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren