Forum: PC-Programmierung [C] dynamische Arrays in Funktionen


von DerPaul (Gast)


Lesenswert?

Hallo Leute ich brauche mal eure Hilfe...

Ich schreibe bin dabei ein Programm zu schreiben, bei dem ich Werte über 
die Tastatur einlese und in ein Array schreibe. Das Array soll dynamisch 
sein! Wenn ich einen neuen Wert über die Tastatur einlese soll das Array 
um ein Element vergrößert werden...

Leider habe ich etwas Probleme! Wie schreibe ich die Werte in das 
Element? Wie schaffe ich es die mit realloc() erstellten pointer adresse 
wieder zurück zu geben?

So weit habe ich das jetzt, funktioniert aber nicht richtig...

Vielleicht kann mir jemand ein paar Lösungsansätze geben...
1
//main
2
int main(void)
3
{
4
  double *werteX = NULL;
5
  double *werteY = NULL;
6
7
  werteX = calloc(ARRAYSIZE, sizeof(double));
8
  werteY = calloc(ARRAYSIZE, sizeof(double));
9
  
10
    
11
  hauptmenue(&werteX, &werteY);
12
13
    
14
}
15
16
//Hauptmenü
17
void hauptmenue(double **werteX, double **werteY){
18
  int auswahl, anzahl = 0;
19
20
  do{
21
      
22
    printf("\n"
23
      "Berechnung einer Ausgleichsgeraden\n"
24
      "==================================\n"
25
      "(1) Daten aufnehmen\n"
26
      "(2) Daten ausgeben\n"
27
      "(3) Daten korrigieren\n"
28
      "(4) Daten speichern\n"
29
      "(5) Daten laden\n"
30
      "(6) Ausgleichsgerade ermitteln\n"
31
      "(0) Ende\n"
32
      "\n"
33
      "Treffen Sie eine Wahl: "    
34
      );
35
36
    scanf("%i", &auswahl);
37
    while (getchar() != '\n');
38
  
39
    switch (auswahl){
40
    case 1: anzahl = menue1(&werteX, &werteY); break; 
41
    case 2: menue2(werteX, werteY, anzahl); break;
42
    case 3: menue3(werteX, werteY, anzahl); break;
43
    case 4: menue4(werteX, werteY, anzahl); break;
44
    case 5: anzahl = menue5(werteX, werteY); break;
45
    case 6: menue6(werteX, werteY, anzahl); break;
46
    default: break; 
47
    }
48
49
  } while (auswahl != 0);
50
  
51
}
52
53
54
//Menü Daten aufnehmen 
55
int menue1(double **werteX, double **werteY){
56
  int counter = 0;
57
58
  double *test1, *test2;
59
  
60
61
  printf("\n"
62
    "(1) Daten aufnehmen: (Ende ersten Punkt noch einmal eingeben)\n"
63
    "____________________\n"
64
    "\n");
65
66
  do{  
67
    //X-Koordinate einlesen  
68
    printf("%i. Punkt: x: ", counter + 1);
69
    scanf("%lf", &werteX[counter]);
70
    while (getchar() != '\n');
71
72
    //Y-Koordinate einlesen  
73
    printf("%i. Punkt: y: ", counter + 1);
74
    scanf("%lf", &werteY[counter]);
75
    while (getchar() != '\n');
76
77
    counter++;
78
79
    if (counter >= ARRAYSIZE){
80
      test1 = realloc(*werteX, (counter + 1) * sizeof(double));
81
      test2 = realloc(*werteY, (counter + 1) * sizeof(double));
82
83
      if (test1 != NULL && test2 != NULL){
84
        
85
        *werteX = test1;
86
        *werteY = test2;
87
      }
88
      
89
    }
90
    
91
  } while (counter <= 1 || werteX[0] != werteX[counter - 1] || werteY[0] != werteY[counter - 1]);
92
93
  return counter - 1;
94
}

von Bitflüsterer (Gast)


Lesenswert?

>So weit habe ich das jetzt, funktioniert aber nicht richtig...

So? Was genau funktioniert denn nicht richtig? Woran stellst Du das 
fest?

Aber, klar ist, dass Du dem Arrays erst einen Wert zufügst, und dann 
seine Grösse erhöhst. Nimm mal an, Du ruft die Funktion das erstemal 
auf. Wohin wird der Wert, den Du mit scanf liest, denn gespeichert? Da 
existiert ja noch garkein Array!

von Bitflüsterer (Gast)


Lesenswert?

Ups. Da steht ja ein alloc. OK. Das Problem tritt also die ersten 
ARRAYSIZE noch nicht auf. Aber beim ARRAYSIZE + 1 dann.

von Bitflüsterer (Gast)


Lesenswert?

Sorry. Irgendwie habe ich mich nochmal versehen. Im Code wird gibts ja 
das realloc wenn der counter >= ARRAYSIZE wird.

Hm. Dann beschreibe mal wie der Fehler genau aussieht. Es sollte mit dem 
Code kein Problem geben.

von Bitflüsterer (Gast)


Lesenswert?

Blöde lange Leitung.

Das hier wird das Problem sein.
1
... (... **werteY ...)
2
scanf("%lf", &werteY[counter]);

Da bildest Du ein weiteres Mal die Address von WerteY. Du erhälst also:
1
double ***WertY

Die Array-Index-Klammern dereferenzieren wieder eine Ebene. Und Du 
erhälst.
1
double **WertY

Da ist aber garkein Speicherplatz für doubles, sondern erstmal nur 
wieder ein Zeiger (auf einen Zeiger).

Vielmehr musst Du also
1
scanf("%lf", (*werteY)[counter]);

schreiben.

Tut mir leid wegen meiner falschen Antworten.

von DerPaul (Gast)


Lesenswert?

Danke für die schnelle Antwort!!

Also ich habe es so probiert,...
1
scanf("%lf", (*werteY)[counter]);

Aber dann bekomme ich einen Speicherzugriffsfehler...

Wenn ich
1
scanf("%lf", &(*werteY)[counter]);
Schreibt er immerhin das erste Element, aber im 2. Durchgang schreibt 
der nicht mehr! Bei einer wiederholten eingabe der ersten beiden Werte 
soll er aus der Schleife rausspringen - macht er aber nicht. Im Debugger 
ändert sich der Wert für werteX und werteY auch nicht...

von Bitflüsterer (Gast)


Lesenswert?

Ich fürchte ich habe heute einen Knoten im Gehirn. Ich halte mich lieber 
raus. Sorry.

von DerPaul (Gast)


Lesenswert?

Schade,... wäre dir trotzdem sehr dankbar wenn du versuchst zu 
helfen...! Hast ja um Welten mehr Ahnung davon als ich...

Und wenn nicht,.. Trotzdem Vielen Dank!!!

von Dirk B. (dirkb2)


Lesenswert?

@Bitflüsterer
Es ist nicht dein Gehirn, sondern der Auruf von menue1.
Die Typen passen nicht zusammen.
1
void hauptmenue(double **werteX, double **werteY){
2
...
3
   case 1: anzahl = menue1(&werteX, &werteY); break; 
4
...
5
}
6
7
int menue1(double **werteX, double **werteY){
8
....

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.