mikrocontroller.net

Forum: Compiler & IDEs Arrays aus Funktion zurückgeben


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich ärgere mich gerade mit folgendem C-Problem herum:

Ich habe eine Funktion, in der ein Vektor generiert wird, der 
unterschiedliche Dimensionen haben kann.
Ich möchte nun allerdings in einer anderen Funktion auf diesen Vektor 
zugreifen können.
Bin in C net so fit, daher meine Frage:
Was wäre die sinnvollste Lösung? Kann ich es irgendwie schaffen auf den 
Vektor zuzugreifen, bzw. den Vektor aus der Funktion zurückzugeben? Oder 
wäre es geschickter, die Funktion, die den Vektor generiert 
umzuschreiben? Und wenn ja, wie?

Bin für alle ernsthaften Tipps dankbar!

Gruß

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arrays werden eigentlich nie direkt übergeben(*) (weder als Parameter an 
eine Funktion noch als Rückgabewert). Bei sowas arbeitet man mit Zeigern 
auf das erste Array-Element.

(*) Auch wenn es eine Schreibweise gibt, die suggeriert, dass man ein 
Array an eine Funktion übergeben kann: Im Hintergrund wird das genauso 
verarbeitet, wie ein Zeiger.

Autor: Manuel Bührer (man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du auf jedenfall beachten musst in c ist, dass du, wenn die Funktion 
das Array zurückgeben soll, den Speicher für das Array mit malloc erst 
mal allokieren/holen musst. Denn wenn du nur ein lokales Array erstellst 
und du das zurückgibst wird beim verlassen der Funktion der Speicher der 
lokalen Variabeln(also auch der für das Array) wieder freigegeben und 
der Zeiger auf das Array zeigt ins leere bzw auf die falsche Stelle.
Nur musst du, wenn du malloc verwendest den Speicher mit free auch 
selber wieder deallokieren/freigeben.

Um das Problem zu umgehen, könntest du auch das Array global definieren. 
Nur musst du dann von Anfang an wissen wie groß es sein wird.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten!
Habe auch schon überlegt das Array global zu definieren. Ich weiß 
immerhin, dass es nicht mehr als 50 Stellen haben wird. Es kann aber 
genauso gut nur 2 haben. Daher würde ich gerne eine elegante Lösung 
erreichen.
Kenne mich leider mit der Zeigerei nicht so gut aus. Wie würde ich das 
realisieren? Muss ich da nicht auch wissen wie groß es letztendlich 
wird?

Autor: Maximilian K. (laplace)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du definierst erst die Größe von deinem Array:
#define L_ARRAY_SIZE   16

dann legst du dein globales Array an
int array[L_ARRAY_SIZE];
  
main()
{
...
}

Wenn du jetzt auf das Array zugreifst benutzt du immer brav das define 
als obere Grenze:
int function(void)
{
   int i = 0;
   for(i= 0; i < L_ARRAY_SIZE; i++)
   { 
   array[i] = whatever;
   }
}

main()
{
...
}

Autor: Maximilian K. (laplace)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja...und falls du das ganze auf einem µC implementierst dann rate 
ich davon ab dein Array dynamisch anzulegen oder anzupassen (malloc 
etc.). Wenn es maximal 50 Elemente groß wird dann mach es 50 Elemente 
groß.

Um sicherzustellen, daß du nur deine relevanten Arrayelemente 
bearbeitest kannst du dein Array mit einem Wert initialisieren (memset) 
der außerhalb deines verwendeten Wertebereichs liegt. Dann kannst du die 
Verarbeitung in einer while-Schleife machen. Wenn du also eine 
Temperaturmessung machst (Wertebereich von -50..60) dann initialisierst 
du einfach mit 127 und verarbeitest dein Array so:
int funct(void)
{
int i = 0;

while(array[i] < 127)
{
   array[i] = whatever;
   i++;
   if(i >= L_ARRAY_SIZE) //zur Sicherheit
   {
   //evtl. Fehlerausgabe
   break;
   }
}

}

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.