Probleme bei Array-Übergabe

Gast #540821
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
Gast #540828
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
(Firma: Wilhelm.Consulting) #540836
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
Gast #540837
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
}

  
Gast #540852
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)?
Gast #540859
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.
(Firma: Wilhelm.Consulting) #540863
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...
#540912
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.