www.mikrocontroller.net

Forum: Compiler & IDEs Probleme bei Array-Übergabe


Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t* Read_Data(void) 
{
  uint8_t data[3];

  ...

  return(&data); 
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   *data_rx = Read_Data();
   ...
}

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

Was mache ich falsch?

Vielen Dank für Eure Unterstützung!

Gruß
Kai

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans Wilhelm (hans-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so sollts gehen...
uint8_t* Read_Data(void)  {
   uint8_t *data=new uint8_t[3];
   ...
   return(data);
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   *data_rx = Read_Data();
   ...
   delete data_rx;
}

erklärung warum steht oben :)

73

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Adresse Übergeben?

Dann müsste der Code so aussehen, oder?
void Read_Data(uint8_t* data[3]) 
{
  ...
  data[0] = value1;
  ...
  data[1] = value2;
  ...
  data[2] = value3;
  ...
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   Read_Data(&data_rx);
   ...
}

  

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So würde ich das machen:
void Read_Data(uint8_t* data) 
{
  ...
  data[0] = value1;
  ...
  data[1] = value2;
  ...
  data[2] = value3;
  ...
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   Read_Data(&data_rx[0]);
   ...
}

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.

Autor: Hans Wilhelm (hans-)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
void Read_Data( uint8_t* data ) 
{
  data[0] = 5;
  data[1] = 8;
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   Read_Data( data_rx );
   ...
}

Wenn man möchte kann man auch eine alternative Syntax benutzen:
void Read_Data( uint8_t data[] ) 
{
  data[0] = 5;
  data[1] = 8;
}
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:
void Read_Data( uint8_t* data, int maxLen ) 
{
  data[0] = 5;
  data[1] = 8;

  if( maxLen > 2 )
    data[2] = 9;
}

void Command_Check(void) 
{
   ...
   uint8_t data_rx[3];
   ...
   Read_Data( data_rx, 3 );
   ...
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.