einfache Frage von Anfänger
-
Hallo an alle,
ich brauche in meinem Programm zweimal die Speicherplatzreservierung und Nullsetzen eines zweidimensionalen array. Deshalb möchte ich eine Funktion makezero schreiben: hier ist der Anfang meines Programms:
#include <stdio.h> #include <stdlib.h> //wird für die Funktion malloc benötigt //int *queque; //int visited[3]; //int tail, head; int number_nodes, number_edges, source, sink; int **capacity; int **flow; //int *vorgaenger; //int minimum (int u, int v); //int maximum (int a, int b); //void in_queque (int x); //int out_queque (void); //int bfs (int s, int t); void input_file(void); void makezero(int**u, int v, int w); int main(void) { int i,j; input_file(); for (i=0; i<number_nodes; i++) { for (j=0; j< number_nodes; j++){ printf("%d", i); printf("%d",j); printf("%d\n",capacity[i][j]); } } } void input_file(void) { int i, h, k, c; char eingabe; //char dateiname[10]; //int max_cap; //int max_flow = 0; eingabe = 'a'; while (eingabe != 'd' && eingabe != 'e'){ printf("Wollen sie die Daten aus Datei (d eingeben) oder über die Tastatur (e eingeben) einlesen? \n"); scanf("%c", &eingabe);//mit %char hats funktioniert geht auch %s if (eingabe == 'd') { //puts("Geben sie den Namen der Datei ein."); //gets(dateiname); FILE*daten = fopen("datenkomb.txt", "r"); if (daten == NULL) fprintf(stderr, "Kann Datei nicht oeffnen\n"); else fscanf(daten, "%d %d %d %d", &number_nodes, &number_edges, &source, &sink); makezero(**capacity, number_nodes, number_edges); for (i=0; i< number_edges; i++){ //Knoten 1 wird zu Knoten 0 usw. fscanf (daten, "%d %d %d", &h, &k, &c) ; capacity[h-1][k-1] = c; printf("%d %d %d \n", h, k, c); } fclose(daten); } if (eingabe == 'e') { printf("Geben sie die Anzahl der Knoten, die Anzahl der Kanten, die Quelle und die Senke ein."); //einlesen von eingabe scanf("%d %d %d %d", &number_nodes, &number_edges, &source, &sink); makezero(**capacity, number_nodes, number_edges); for (i=0; i< number_edges; i++){ //Knoten 1 wird zu Knoten 0 usw. printf("Geben sie für die %d-te Kante Anfangsknoten Endknoten und Kapazität ein", i+1); scanf ("%d %d %d", &h, &k, &c) ; capacity[h-1][k-1] = c; printf("%d %d %d \n", h, k, c); } } } } void makezero(int**u, int v, int w){ int i, j; u = malloc(v*sizeof(int*));//oder (int*)malloc(number_nodes*sizeof(int)) if (u == NULL) { puts("Fehler bei der Speicherzuweisung."); //return 1; exit(1); } for (i=0; i<number_nodes;i++) { u[i] = malloc((v)*sizeof(int)); if (u[i] == NULL) { puts("Fehler bei der Speicherzuweisung."); //return 1; exit(1); } } for (i=0; i<v; i++) { for (j=0; j<v; j++) u[i][j] = 0; } }
Ich bekomme folgende Fehlermeldungen:
error #2140: Type error in argument 1 to 'makezero'; expected 'int * *' but found 'int'.
error #2140: Type error in argument 1 to 'makezero'; expected 'int * *' but found 'int'.Leider kenne ich mich mit Zeigern nicht sehr gut aus. Kann mir bitte jemand helfen?
lg Sabine
-
Erstens: Die beiden Sterne beim Funktionsaufruf sind überflüssig.
Zweitens: Wenn du den reservierten Speicher nach draußen übergeben willst, hast du noch eine Indirektion zu wenig - aktuell arbeitet die Funktion mit einer Kopie des Parameters.
-
Danke für deine Antwort. Kannst du mir zweitens bitte genauer erklären?
Danke!!
-
Bei
int *vorgaenger;
ist*vorgaenger
einint
undvorgaenger
ein Zeiger auf einint
Bei
int **capacity
ist**capacity
einint
,*capacity
ein Zeiger auf einint
undcapacity
ein Zeiger auf einen Zeiger auf einint
Du übergibst also ein
int
, wo ein Zeiger auf einen Zeiger auf einint
erwartet wird.
-
sabine02 schrieb:
Danke für deine Antwort. Kannst du mir zweitens bitte genauer erklären?
Danke!!Der Parameter u deiner Funktion ist nur eine Kopie des übergebenen Wertes. Wenn du dort etwas zuweist, ist das nur innerhalb der Funktion selber wirksam, während das Hauptprogramm weiterhin mit dem ursprünglichen Wert arbeitet (in deinem Fall ergibt das noch ein dezentes Speicherleck und Zugriffsfehler wenn du den Wert weiterverwenden willst). Um das Problem zu umgehen, übergibt man in C einen Zeiger auf eine Variable des Hauptprogramms, die den Wert aufnehmen soll:
void makezero(int*** pu, int v, int w) { *pu = malloc(...); ... } int main() { ... int** capacity; makezero(&capacity, x, y); ... clearfield(capacity);//die Funktion mußt du auch noch schreiben, um das gesamte Array wieder freizugeben }
-
Hallo, anscheinend bin ich zu blöd für die Zeigerarithmetik. Ich kämpf mich gerade durch die Kapitel Zeiger und arrays im Buch C-Schritt für Schritt zum Profi(P. Aitken und B. L. Jones). Auch mit den Änderungen von CStoll funktioniert das Programm nicht. Kannst du mir bitte, bitte die Funktion aufschreiben? Muss ich auch aus den anderen vorkommenden u's Zeiger machen?
Vielen Dank für deine Hilfe.
-
sabine02 schrieb:
Hallo, anscheinend bin ich zu blöd für die Zeigerarithmetik.
Da solltest du eventuell mit etwas kleinerem anfangen als mit mehrdimensionalen dynamischen Arrays.
-
Ich muss einen Algorithmus programmieren, ich brauche dazu "nur" noch diesen Eingabeteil. Natürlich hätte ich sonst mit etwas Leichterem angefangen. Aber für den Algorithmus brauche ich leider nunmal mehrere mehrdimensionale arrays. Im folgenden Teil kommt der Algorithmus vollkommen ohne Zeiger aus. Aber trotzdem danke für deine Hilfe.
-
Wenn du den letztgenannten CStoll-Codebeitrag nicht umsetzen kannst, suche dir besser ein neues Hobby.
-
Erstens ist das kein Hobby von mir, sondern ein Teil einer Pflichtübung, die ich nicht aus Spass mache. CStoll hat mir sehr geholfen und ich habe meinen Fehler auch schon gefunden. Wenn ich keine Hilfe gebraucht hätte, hätte ich ja nichts gepostet. Deinen Kommentar hättest du dir sparen können. Ich war sehr unter Zeitdruck, hab aber trotzdem versucht das Programm nicht abzuschreiben (wie sonst fast alle), sondern es alleine zu machen.