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ß
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.
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.
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?
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.