Forum: Mikrocontroller und Digitale Elektronik Probleme mit C


von Tim S. (169)


Lesenswert?

Servus Leute,

ich hab mal wieder Probleme mit C.
In einer .h Datei ist eine i2c Routine implementiert mit folgenden 
Übergabewerten:

i2csendedaten(unsigned char addresse, unsigned char* daten)

Nun möchte ich diese Funktion nutzen und folgende daten Übergeben:

#define adresse 0xE0
unsigned char commands[3]={0x00,0xA1,0x02};


int main()
{
  ...
  for(int i=0;i<=2;i++)
  {
   i2csendedaten(addresse, commands[i])
  }
  ...
}

kann ich das so machen?

Danke für eure Beiträge

von -_- (Gast)


Lesenswert?

Tim S. schrieb:
> #define adresse 0xE0

kann man so machen, aber ich wuerd defines in grossbuchstaben schreiben

von Hans O. (piwibit)


Lesenswert?

Tim S. schrieb:

>
> #define adresse 0xE0
           ^^
>    i2csendedaten(addresse, commands[i])
                    ^^

korrigiere das noch

von Tim S. (169)


Lesenswert?

Also es ging mir eigentlich um den 2. Übergabewert

i2csendedaten(addresse, commands[i])

kann ich durch das array iterieren?

Da diese Routine folgende Werte benötigt:

i2csendedaten(unsigned char addresse, unsigned char* daten)
                                                 ^
                                                 |
                                                 |
                                                 |

Das soll ein Pfeil sein ;)

von Sebastian R. (Gast)


Lesenswert?

So wie es geschrieben ist, wird es Unsinn tun.
Der zweite Parameter muss ein Zeiger sein (deshalb das * in der 
Funktionsdefinition).

Lösbar z.B. durch:
i2csendedaten(addresse, &commands[i])

von Rolf Magnus (Gast)


Lesenswert?

Tim S. schrieb:
> Also es ging mir eigentlich um den 2. Übergabewert
>
> i2csendedaten(addresse, commands[i])
>
> kann ich durch das array iterieren?

Warum solltest du das nicht können?

Ich würde statt:

>   for(int i=0;i<=2;i++)

aber schreiben:
1
    for(int i=0;i<3;i++)

Das entspricht eher der in C üblichen Schreibweise. Der erfahrene 
C-Programmierer sieht dort schon aus dem Augenwinkel heraus, daß durch 
die ersten drei Elemente iteriert wird. Bei deiner Variante muß er erst 
kurz nachdenken, weil sie ungewohnt aussieht.

von Sebastian R. (Gast)


Lesenswert?

Vorsicht:
commands[i] ist ein WERT weil der "[]" Operator verwendet wurde.
commands alleine wäre ein Zeiger. Im Prinzip müsste auch "commands+i" 
funktionieren um einen Zeiger auf das i-te Objekt zu bekommen.

So wie es geschrieben ist, würde der Wert in commands[i] als Zeiger auf 
eine Stelle im Speicher verstanden werden, in der das Kommando liegt.
Das dies das gewünschte Ergebnis liefert wäre allerdings reiner Zufall.

von Klaus W. (mfgkw)


Lesenswert?

Ist das i2csendedaten() von dir oder von irgendwo übernommen?
So wie du es beschreibst, übergibst du immer nur je ein Zeichen.

Wenn i2csendedaten() aber nur ein Zeichen erwartet, ist es ziemlich
ungewöhnlich, den über einen Zeiger zu übergeben.
Kann es nicht sein, daß die Funktion einen String erwartet?

von Karl H. (kbuchegg)


Lesenswert?

Nur so zur Info

Beitrag "Datenformat i2c Routine"


Hast du diesmal auch vergessen so beiläufig zu erwähnen, dass die 
Funktion i2csendedaten ebenfalls 3 Parameter nimmt, von denen der 3.te 
die Längenangabe ist?

Denn: wie Klaus schon sagte - deine Funktionssignatur ist ungewöhnlich.

Dann reduziert sich dein Beispiel zu
1
#define ADRESSE 0xE0
2
unsigned char commands[] = {0x00,0xA1,0x02};
3
4
5
int main()
6
{
7
  ...
8
  i2csendedaten( ADRESSE, commands, sizeof( commands ) );
9
  ...
10
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.