1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

malloc richtig anwenden

  • Sabine02
  • 14. September 2011 um 19:48
  • Unerledigt
  • Sabine02
    2
    Sabine02
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 14. September 2011 um 19:48
    • #1

    Hallo an alle,

    ich bin am Beginn meines Programms und soll entweder Daten von einer Datei einlesen oder die Daten per Tastatur einlesen. Die Eingabedatei sieht beispielsweise so aus:

    4 5 1 4
    1 2 6
    1 3 5
    2 3 2
    2 4 7
    3 4 3

    Mein Problem ist (unter anderem;)): Ich möchte das Nullsetzen von capacity in eine eigene Funktion schreiben. Aber es funktioniert irgendwie nicht. Ich bekomme folgende Fehlermeldung:

    c(80): error #2162: Extraneous return value.
    c(88): error #2162: Extraneous return value.
    *** Error code: 1 ***

    Das ist der Code der funktioniert:

    C
    #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);
    
    
    
    
    int main(void) {
    
        int i, j, h, k, c, y;
        char eingabe;
        //int max_cap;
        //int max_flow = 0;
    
    
    
    
        printf("Daten aus Datei (d) oder Daten eingeben (e)\n");
    
    
        scanf("%c", &eingabe);//mit %char hats funktioniert geht auch %s
    
            if (eingabe == 'd') {
    
    
                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);
    
                capacity = malloc(number_nodes*sizeof(int*));//oder (int*)malloc(number_nodes*sizeof(int))
    
                if (capacity == NULL) {
                    puts("Fehler bei der Speicherzuweisung.");
                    return 1;
                }
    
    
                for (i=0; i<number_nodes;i++) {
                    capacity[i] = malloc((number_nodes)*sizeof(int));
    
    
                    if (capacity[i] == NULL) {
                        puts("Fehler bei der Speicherzuweisung.");
                        return 1;
                    }
                }    
    
    
    
                for (i=0; i<number_nodes; i++) {
                    for (j=0; j< number_nodes; j++)
                        capacity[i][j] = 0;
                }
    
    
    
    
                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);
            }
    
    
            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]);
                }
            }
        //else
    
    
    }
    Alles anzeigen

    Das ist der Code mit Funktion:

    C
    #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 **u;
    //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 makezero(int**u, int v, int w); 
    
    
    int main(void) {
    
        int i, j, h, k, c, y;
        char eingabe;
        //int max_cap;
        //int max_flow = 0;
    
    
    
    
        printf("Daten aus Datei (d) oder Daten eingeben (e)\n");
    
    
        scanf("%c", &eingabe);//mit %char hats funktioniert geht auch %s
    
            if (eingabe == 'd') {
    
    
                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);
            }
    
    
            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]);
                }
            }
        //else
    
    
            //printf("Eingabe der Daten folgenderweise:\n Anzahl der Knoten Anzahl dder Kanten Quelle Senke\n für i-te Kante:Anfangsknoten Endknoten Kapazität\n zwischen den Werten ein Leerzeichen."); //einlesen von eingabe
    
    }
    
    
    
    
    
    
    void makezero(int **u, int v, int w) {
    
                int i,j;
                u = malloc(v*sizeof(int*));//oder (int*)malloc(v*sizeof(int))
    
                if (u == NULL) {
                    puts("Fehler bei der Speicherzuweisung.");
                    return 1;
                }
    
    
                for (i=0; i<v;i++) {
                    u[i] = malloc((v)*sizeof(int));
    
    
                    if (u[i] == NULL) {
                        puts("Fehler bei der Speicherzuweisung.");
                        return 1;
                    }
                }    
    
    
    
                for (i=0; i<v; i++) {
                    for (j=0; j< v; j++)
                        u[i][j] = 0;
                }
    
    
            }
    Alles anzeigen


    Danke für eure Hilfe******

    lg
    Sabine

  • Bernd
    5
    Bernd
    Mitglied
    Reaktionen
    22
    Punkte
    267
    Beiträge
    49
    • 14. September 2011 um 20:45
    • #2

    Die Funktion makezero ist mit Rueckgabetyp void deklariert: d.h. Bei einem Return, darfst du auch nichts zurueckgeben:

    Code
    void makezero(int **u, int v, int w) {
    
                int i,j;
                u = malloc(v*sizeof(int*));//oder (int*)malloc(v*sizeof(int))
    
                if (u == NULL) {
                    puts("Fehler bei der Speicherzuweisung.");
                    return;
                }
    
    
                for (i=0; i<v;i++) {
                    u[i] = malloc((v)*sizeof(int));
    
    
                    if (u[i] == NULL) {
                        puts("Fehler bei der Speicherzuweisung.");
                        return;
                    }
                }    
    
    
    
                for (i=0; i<v; i++) {
                    for (j=0; j< v; j++)
                        u[i][j] = 0;
                }
    
    
            }
    Alles anzeigen

    Dafuer ist die main-Funktion mit dem Rueckgabetyp int definiert: da solltest du auf jeden Fall etwas returnen: sollte kein Fehler auftreten EXIT_SUCESS (0, Makro in stdlib.h) bzw. einen Integer ungleich 0 (z.B. EXIT_FAILURE, ebenfalls in stdlib.h) im Fehlerfall.

    Nur weil ich es sehe (Fuer Bib.Fkt verwende ich die 'man-page Syntax' [1]: d.h. Funktionsname und in Klammer welche Section der man-pages; klarerweise ist das dann nur auf Linux/Unix Systeme so auffindbar):
    - nichts zurueckzugeben (insb. im Fehlerfall) bei makezero ist natuerlich nicht optimal: Du koenntest noch den Fehlercode abfragen (in der globalen Variable errno) od. diesen gleich formatiert mit perror(3) ausgeben und per exit(3) terminieren.
    - Klammerung von der Variable v hier nicht notwendig: u[i] = malloc((v)*sizeof(int));
    - du solltest in sauberen Programmen auch noch jeden per malloc angeforderten Speicher wiederum freigeben, wenn du ihn nicht mehr brauchst (jedenfalls noch vor der Terminierung).
    - ad '//oder (int*)malloc(v*sizeof(int))': Casten brauchst du in C nicht, da malloc void* zurueckgibt
    - Zur Initalisierung der einzelnen Int-Arrays (Speicher der vom 2. malloc kommt) koenntest du auch gleich in der ersten For-Schleife in makezero memset(3) (in string.h) verwenden und auf die geschachtelte For-Schleife am Schluss verzichten
    - 'sprechende' Variablennamen verwenden - auch in makezero :winking_face: und einheitliche Formatierung
    - kein scanf verwenden, sondern fgets u. sscanf [2] [3]


    Ich kann die LVA 'Betriebssysteme UE' empfehlen, falls du rasch in C hineinkommen willst bzw. Programmierpraxis suchst.

    [1] http://en.wikipedia.org/wiki/Man_page
    [2] http://www.giannistsakiris.com/index.php/2008…avoid-using-it/
    [3] http://ti.tuwien.ac.at/rts/teaching/c…ing/Richtlinien

    Einmal editiert, zuletzt von Bernd (14. September 2011 um 20:51) aus folgendem Grund: Fehlerbehandlung + Manpages Hint

  • Sabine02
    2
    Sabine02
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 14. September 2011 um 22:31
    • #3

    Danke Bernd für deine schnelle Antwort. Das ist nur der erste Teil des Programms,ich muss noch den Algorithmus von Ford Fulkerson programmieren. Leider funktionierts auch mit den geänderten return Werten nicht.
    lg Sabine

  • anwesender
    8
    anwesender
    Mitglied
    Reaktionen
    12
    Punkte
    647
    Beiträge
    125
    • 15. September 2011 um 00:36
    • #4
    Zitat von Sabine02

    Danke Bernd für deine schnelle Antwort. Das ist nur der erste Teil des Programms,ich muss noch den Algorithmus von Ford Fulkerson programmieren. Leider funktionierts auch mit den geänderten return Werten nicht.
    lg Sabine

    wäre für diesen fall c++ nicht besser geeignet?
    exceptions sind meistens angenehmer handzuhaben als bei jeder funktion systemprogrammierer mässig return-werte zu überprüfen
    ausserdem sind klassen "einfacher" zu allokieren und freizugeben als daten mit malloc, bzw hättest du dann auch datenstrukturen wie den std::vector (zB zum speichern des pfads) zur verfügung

    was mir noch auffällt, der pointer wird nur u zugewiesen, aber nie an die aufrufende funktion übergeben (bei malloc bekommst du einen neuen pointer)
    entweder du änderst die signatur von

    Code
    void makezero(int **u, int v, int w)


    auf

    Code
    int **makezero(int v, int w)


    (dann kannst du mit auf NULL testen gleich die fehler analyse machen)
    oder auf

    Code
    void makezero(int ***u, int v, int w)


    und weist mit

    Code
    *u = malloc(..)

    zu (würde ich eher als einen kunstgriff bezeichnen)
    der aufruf wäre dann:

    Code
    int **array;
    makezero(&array, v, w);

    Thomas

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung