Forum: Compiler & IDEs Probleme bei Array-Übergabe


von Kai (Gast)


Lesenswert?

Hallo!

Ich habe Probleme in GCC ein uint8_t Array von einer Funktion in eine 
andere zu Übergeben.

Momentan sieht der Code so aus:
1
uint8_t* Read_Data(void) 
2
{
3
  uint8_t data[3];
4
5
  ...
6
7
  return(&data); 
8
}
9
10
void Command_Check(void) 
11
{
12
   ...
13
   uint8_t data_rx[3];
14
   ...
15
   *data_rx = Read_Data();
16
   ...
17
}

Aber in data_rx steht nie das, was in data steht! :(

Was mache ich falsch?

Vielen Dank für Eure Unterstützung!

Gruß
Kai

von Thomas (Gast)


Lesenswert?

Hallo!

Soweit ich weiss kann man keine Arrays direkt zurückgeben.
Da ja auch deine lokal deklarierten Variablen ungültig werden, sobald 
die Funktion beendet wird, zeigt der zurückgegebene Zeiger auf Daten, 
deren Inhalt nicht definiert sind.

Entweder du packst dein Array in ein Struct, das du dann zurückgibst, 
oder du übergibst beim Funktionsaufruf von "Read_Data" eine Adresse auf 
ein Array und das wird in dieser Funktion dann gefüllt.

MfG,
Thomas

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

so sollts gehen...
1
uint8_t* Read_Data(void)  {
2
   uint8_t *data=new uint8_t[3];
3
   ...
4
   return(data);
5
}
6
7
void Command_Check(void) 
8
{
9
   ...
10
   uint8_t data_rx[3];
11
   ...
12
   *data_rx = Read_Data();
13
   ...
14
   delete data_rx;
15
}

erklärung warum steht oben :)

73

von Kai (Gast)


Lesenswert?

Adresse Übergeben?

Dann müsste der Code so aussehen, oder?
1
void Read_Data(uint8_t* data[3]) 
2
{
3
  ...
4
  data[0] = value1;
5
  ...
6
  data[1] = value2;
7
  ...
8
  data[2] = value3;
9
  ...
10
}
11
12
void Command_Check(void) 
13
{
14
   ...
15
   uint8_t data_rx[3];
16
   ...
17
   Read_Data(&data_rx);
18
   ...
19
}

  

von Kai (Gast)


Lesenswert?

@Hans Wilhelm:
Welche Header-Datei muss ich denn für den Befehl 'new' einbinden, da ich 
nämlich eine Fehlermeldung erhalte ('../sigmadelta.c:158: error: 'new' 
undeclared (first use in this function)'), obwohl 'new' als Befehl 
erkannt wird (Schriftfarbe wird blau)?

von Thomas (Gast)


Lesenswert?

So würde ich das machen:
1
void Read_Data(uint8_t* data) 
2
{
3
  ...
4
  data[0] = value1;
5
  ...
6
  data[1] = value2;
7
  ...
8
  data[2] = value3;
9
  ...
10
}
11
12
void Command_Check(void) 
13
{
14
   ...
15
   uint8_t data_rx[3];
16
   ...
17
   Read_Data(&data_rx[0]);
18
   ...
19
}

Aber ich weiss grad nicht, ob beim Parameter von "Read_Data" eine 
Arraygröße dran muss. Glaube aber nicht.

Bei "Command_Check" solltest du aber das erste Feld angeben. Kann auch 
sein, dass das der Compiler automatisch macht, wenn nichts weiter 
angegeben ist. Würd mich aber nicht drauf verlassen.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

hmm das ist anscheinend nicht implementiert... macht nix nimm halt 
malloc...

das ist in der stdlib.h

statt
uint8_t *data=new uint8_t[3];
kommt
uint8_t *data=(uint8_t *)malloc(sizeof(uint8_t)*3);

und statt
delete data_rx;
kommt
free(data_rx);

das ist aber recht bösartig auf so kleinen systemen... lieber die 
methode die du oben gepostet hast...

der fehler liegt hier:
 Read_Data(&data_rx);

da sollte folgendes hin:
 Read_Data(data_rx);

data_rx ist nämlich schon ein pointer...

von Karl H. (kbuchegg)


Lesenswert?

Hans Wilhelm wrote:
> hmm das ist anscheinend nicht implementiert...

Das ist auch kein Wunder.
new ist C++

Wir reden hier aber von C

> macht nix nimm halt
> malloc...

@Kai
Tu's nicht.
Das ist keine so gute Lösung.

> da sollte folgendes hin:
>  Read_Data(data_rx);
>
> data_rx ist nämlich schon ein pointer...

Na ja. Nicht wirklich.
data_rx ist immer noch ein Array.
Aber Arrays werden in C übergeben, indem ein Pointer
auf das erste Array Element übergeben wird. Das heist
aber nicht, das data_rx ein Pointer ist.
1
void Read_Data( uint8_t* data ) 
2
{
3
  data[0] = 5;
4
  data[1] = 8;
5
}
6
7
void Command_Check(void) 
8
{
9
   ...
10
   uint8_t data_rx[3];
11
   ...
12
   Read_Data( data_rx );
13
   ...
14
}

Wenn man möchte kann man auch eine alternative Syntax benutzen:
1
void Read_Data( uint8_t data[] ) 
2
{
3
  data[0] = 5;
4
  data[1] = 8;
5
}
macht aber genau das gleiche. In Read_Data ist 'data' auch
nichts anderes als ein Pointer auf das erste Array Element.
Nur wird das durch diese Syntax etwas verschleiert.


Wie immer: Achtung: Read_Data hat keine Möglichkeit abzuklären,
ob es einen Array-Überlauf geben wird. Daher ist es oft
sinnvoll, in die Funktion auch die Länge das Arrays mit
hininzugeben:
1
void Read_Data( uint8_t* data, int maxLen ) 
2
{
3
  data[0] = 5;
4
  data[1] = 8;
5
6
  if( maxLen > 2 )
7
    data[2] = 9;
8
}
9
10
void Command_Check(void) 
11
{
12
   ...
13
   uint8_t data_rx[3];
14
   ...
15
   Read_Data( data_rx, 3 );
16
   ...
17
}


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.