malloc richtig anwenden

  • 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:

    Das ist der Code mit Funktion:


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

    lg
    Sabine

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

    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 ;) 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

  • 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

  • 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

Jetzt mitmachen!

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