Forum: Mikrocontroller und Digitale Elektronik struct pointer übergeben


von Herman Uh. (Gast)


Lesenswert?

1
const uint8_t NUM_SLAVES = 1;
2
struct leds
3
{
4
  uint8_t r;
5
  uint8_t g;
6
  uint8_t b;
7
};
8
9
void spi_master_transmit(struct leds *struct_ptr)
10
{
11
  SPI_PORT &= ~(1<<SPI_SS);
12
  for(uint8_t num = 0; num < NUM_SLAVES; num++)
13
  {
14
    SPDR = (*struct_ptr).r;
15
    while(!(SPSR & (1<<SPIF)));
16
    SPDR = (*struct_ptr).g;
17
    while(!(SPSR & (1<<SPIF)));
18
    SPDR = (*struct_ptr).b;
19
    while(!(SPSR & (1<<SPIF)));
20
  }
21
  SPI_PORT |= (1<<SPI_SS);
22
}
23
24
int main(void)
25
{
26
  struct leds rgb[NUM_SLAVES];
27
  while(1)
28
  {
29
    spi_master_transmit(&rgb);
30
  }
31
}

Warning  1  passing argument 1 of 'spi_master_transmit' from 
incompatible pointer type [enabled by default]

Message  2  expected 'struct leds *' but argument is of type 'struct 
leds (*)[(sizetype)NUM_SLAVES]

Was ist an der Übergabe nicht regelkonform? Desweiteren gibt es einen 
unterschied zwischen '.' und '->'. Atmel Studio macht mir aus dem . 
immer ein ->

von Max H. (hartl192)


Lesenswert?

Herman Uh. schrieb:
> Was ist an der Übergabe nicht regelkonform?
"rgb" selbst ist schon ein Pointer auf das nullte Element des Array, 
"&rgb" ist damit ein Pointer auf einen Pointer.

> Desweiteren gibt es einen
> unterschied zwischen '.' und '->'.
"structpointer->element" ist für Pointer und die Kurzform von 
"(*structpointer).element"

"Struct.element" ist die Struktur selbst.

Für deinen Doppelpointer müsste es dann z.B. so etwas ein:
(*Doppelpointer)->element

von Dirk B. (dirkb2)


Lesenswert?

Max H. schrieb:
> "rgb" selbst ist schon ein Pointer auf das nullte Element des Array,
rgb steht für die Adresse vom nullten Element. Es ist aber kein Pointer

> "&rgb" ist damit ein Pointer auf einen Pointer.
Da rgb kein Pointer ist, stimmt das nicht.

von Tobi (Gast)


Lesenswert?

Durch die verwendung eines Structarrays muss das ganze so aussehen:
Ich hoffe ich habe nichts übersehen

const uint8_t NUM_SLAVES = 1;
struct leds
{
  uint8_t r;
  uint8_t g;
  uint8_t b;
};

void spi_master_transmit(struct leds struct_ptr[])
{
  SPI_PORT &= ~(1<<SPI_SS);
  for(uint8_t num = 0; num < NUM_SLAVES; num++)
  {
    SPDR = struct_ptr[num]->r;
    while(!(SPSR & (1<<SPIF)));
    SPDR = struct_ptr[num]->g;
    while(!(SPSR & (1<<SPIF)));
    SPDR = struct_ptr[num]->b;
    while(!(SPSR & (1<<SPIF)));
  }
  SPI_PORT |= (1<<SPI_SS);
}

int main(void)
{
  struct leds rgb[NUM_SLAVES];
  while(1)
  {
    spi_master_transmit(rgb);
  }
}

von Dirk B. (dirkb2)


Lesenswert?

Tobi schrieb:
> Durch die verwendung eines Structarrays muss das ganze so aussehen:
> Ich hoffe ich habe nichts übersehen
> ...
> void spi_master_transmit(struct leds struct_ptr[])
> {
>   SPI_PORT &= ~(1<<SPI_SS);
>   for(uint8_t num = 0; num < NUM_SLAVES; num++)
>   {
>     SPDR = struct_ptr[num]->r;

Das [num] ist genau so eine Dereferenzierung wie *. Daher kommt da dann 
auch ein . und kein -> hin.
1
SPDR = struct_ptr[num].r;

Und ob als Parameter bei der Funktion ein Array oder ein Pointer steht 
ist (an der Stelle) völlig gleichwertig.

Zwischen
1
void spi_master_transmit(struct leds struct_ptr[])
und
1
void spi_master_transmit(struct leds *struct_ptr)
gibt es keinen Unterschied.

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.