Frage zu Funktionszeiger und dessen Verwendung

Gast #3318042
Lesenswert?

Hi, für einen alten Hasen ist das sicherlich ganz easy, ich dageben 
bräuchte mal wieder kurze Starthilfe.

Es geht um folgende Funktion:
1
void TWI_read(u08 TWI_adr, u08 *val, u08 count)
2
//------------------------------------------------
3
// Read n=count bytes from I2C-Bus in polled mode
4
// needs about 200us for reading addr + one byte
5
//------------------------------------------------
6
{
7
  u08 i=0;
8
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);     // send START condition
9
  while (!(TWCR & (1<<TWINT)));               // wait for response
10
  if ((TWSR & 0xF8) == TW_START)              // if START was successful
11
  {
12
    TWDR = (TWI_adr | 0x01);                  // put slave address+READ to TWDR
13
    TWCR = (1<<TWINT)|(1<<TWEN);              // and start transmission
14
    while (!(TWCR & (1<<TWINT)));             // wait for response
15
    if ((TWSR & 0xF8) == TW_MR_SLA_ACK)       // if acknowledge ok
16
    {
17
      count--;
18
      while (count>i)                         // while more than one byte to read
19
      {
20
        TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);  // then start transfer with acknowledge
21
        while (!(TWCR & (1<<TWINT)));         // wait for response
22
        val[i++]=TWDR;                        // read databyte from TWDR
23
      }
24
      TWCR=(1<<TWINT)|(1<<TWEN);              // start last byte transfer without acknowledge
25
      while (!(TWCR & (1<<TWINT)));           // wait for response
26
      val[i]=TWDR;                            // read databyte from TWDR
27
    }
28
    else
29
    {
30
      printf_P("Error: I2C[R] Addr\n");
31
    }
32
  }
33
  else
34
  {
35
    printf_P("Error: I2C[R] Start\n");
36
  }
37
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);      // transmit STOP condition
38
  delay_us(10);                                // wait until STOP is transmitted
39
}

Der Aufruf der Funktion geschieht hiermit: void TWI_read(0x30, u08 *val, 
4)

Hierbei möchte ich 4 Bytes von der Adresse 0x30 lesen. Doch was mache 
ich mit dem Funktionszeiger an der Stelle?

Beim ausführen der Funktion füllt sich das Array val[] mit den Werten 
des Slaves, wozu muss ich den Wert des Zeigers mitgeben?

Danke, Gruß
Matthias
Gast #3318053
Lesenswert?

u08 *val <- Ist das kein Zeiger?

Sprich das muss so aussehen?

u08 val[]; // Deklaration des Arrays val

void TWI_read(0x30, val[], 4); // Array val wird gefüllt

val[2]; // Wert des 2. Bytes vom Slave

Stimmt das so?
Gast #3318074
Lesenswert?

> PS: val[2] ist das dritte Byte ;-)

War klar, ist mir kurz nach dem Absenden schon aufgefallen, werd mich 
dann wohl doch mal anmelden müssen hier...


Nochmals rein zum Verständnis... was bewirkt denn der Stern?
#3318082
Lesenswert?

Matthias M. schrieb:
>> PS: val[2] ist das dritte Byte ;-)
>
> War klar, ist mir kurz nach dem Absenden schon aufgefallen, werd mich
> dann wohl doch mal anmelden müssen hier...
>
>
> Nochmals rein zum Verständnis... was bewirkt denn der Stern?

Schau am besten mal in ein gutes C-Buch(geht ja auch online).
Stichwort Array/Pointer.
Mit dem Stern erzeugst du einen u08-Pointer.
Gast #3319935
Lesenswert?

Matthias M. schrieb:
> was bewirkt denn der Stern?

Tja, das ist eben eine der vielen Ärgerlichkeiten von C, daß seine 
Autoren nur bis zu ihrem jeweiligen Mützenrand gedacht haben und 
wahrscheinlich aus nem angeborenen Sprachfehler heraus darauf bedacht 
waren, möglichst keine echten Wörter (also mehrere zusammenhängende 
Buchstaben) in C zu benutzen. Deshalb all die vielen Mehrdeutigkeiten 
bei den anstelle von Wörtern benutzten Sonderzeichen.
Beispiele:

A*B
A* *B
A**B
A* *(*B)
*A*B
A/*B*/   ;-)
char *B
char* B
(char*) B
es hat fast immer ne andere Bedeutung, die man erlernen muß - großartig 
gelle? Es hat mal Wettbewerbe gegeben, wer den unverständlichsten C-Code 
schreibt.

Aber mal im Ernst: A = *B; heißt A wird geladen mit dem Wert, der dort 
im Speicher steht, wo B draufzeigt. Als was dieses Stück Speicher 
angesehen wird, hängt von der Definition von B ab.

W.S.

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