Forum: Compiler & IDEs Arrays aus Funktion zurückgeben


von Gast (Gast)


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ß

von Johannes M. (johnny-m)


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.

von Manuel B. (man)


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.

von Gast (Gast)


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?

von Maximilian K. (laplace)


Lesenswert?

Du definierst erst die Größe von deinem Array:
1
#define L_ARRAY_SIZE   16

dann legst du dein globales Array an
1
int array[L_ARRAY_SIZE];
2
  
3
main()
4
{
5
...
6
}

Wenn du jetzt auf das Array zugreifst benutzt du immer brav das define 
als obere Grenze:
1
int function(void)
2
{
3
   int i = 0;
4
   for(i= 0; i < L_ARRAY_SIZE; i++)
5
   { 
6
   array[i] = whatever;
7
   }
8
}
9
10
main()
11
{
12
...
13
}

von Maximilian K. (laplace)


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:
1
int funct(void)
2
{
3
int i = 0;
4
5
while(array[i] < 127)
6
{
7
   array[i] = whatever;
8
   i++;
9
   if(i >= L_ARRAY_SIZE) //zur Sicherheit
10
   {
11
   //evtl. Fehlerausgabe
12
   break;
13
   }
14
}
15
16
}

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.