Rückgabe von einen Zeiger auf ein struct



  • Hey,
    ich möchte eine methode schreiben die eine Matrix (struct) erzeugt und einen Zeiger darauf liefert. Nun meckert aber bei mir der Compiler mit der Meldung:
    incompatible types in return

    der Quellcode sieht folgendermaßen aus. Die zeile mit dem fehler ist markiert.

    [code]#include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    struct matrix
    {
        int spalten;
        int zeilen;
        /* values zeigt auf Speicher der Groesse spalten*zeilen*sizeof(int) */
        int* values;
    };
    
    struct matrix* createRandomMatrix(int s, int z)
    {
        int i,j;
    
        struct matrix m1;
        m1.spalten = s;
        m1.zeilen = z;
    
        long groesse = m1.zeilen * m1.spalten * sizeof(int);
    
        srand (time(NULL));
        int zufalszahl=rand()%9;
    
        //int *p;
        //p = (int *)malloc(groesse);
        m1.values = (int *)malloc(groesse);
        //if(p != NULL)
        if(m1.values != NULL)
        {
            for(i=0;i<m1.spalten; i++)
            {
                for(j=0;j<m1.zeilen; j++)
                {
                    //*(p+i+j)=rand()%9;
                    *(m1.values+i+j)=rand()%9;
                    //printf("%d\t",p[i+j]);
                    printf("%d\t",m1.values[i+j]);
                }
                printf("\n");
            }
        }
        else
        {
          printf("Kein Virtueller RAM mehr verfügbar\n");
        }
    
        [b]return m1;[/b]
    }
    
    int main()
    {
        int i,j;
        int s = 3;
        int z = 4;
    
        struct matrix m1 = createRandomMatrix(s, z);
    
        return 0;
    }[/code]
    

    Wie gesgat ich hätte gerne eine Funktion der ich die Größe einer Matrix übergebe. Die Funktion soll die matrix erzeugen und sie mit Zufallswerten füllen. der Rückgabewert soll "struct matrix *" sein.

    Danke im voraus



  • spleen schrieb:

    der Rückgabewert soll "struct matrix *" sein.

    Dann gib's doch auch zurück!
    Du hast "m1" als struct matrix deklariert. Wenn du nun schreibst "return m1;" dann gibt er dir auch den Typ "struct matrix" zurück.

    Richtiger wäre also "return &m1". Das solltest du aber auf gar keinen Fall machen, da bei dir m1 eine lokale Variable ist, die nach verlassen der Funktion nicht mehr existiert.

    In dem Fall:
    Entweder so:

    struct matrix* m1 = malloc(sizeof(struct matrix));
    return m1;
    

    Oder viel besser:

    MeineFunktion(struct matrix* m)
    {
    
    }
    

    Es ist sinnvoller einen solchen Speicherbereich von Außen der Funktion zu übergeben. Denn bei der ersten Variante müsstest du den allokierten Speicher ja auch wieder freigeben. Bei der zweiten kannst du von Außen die Funktion einfach so aufrufen:

    int main()
    {
         struct matrix m1;
         MeineFunktion(&m1);
         // [jede Menge unfassbarer Code mit m1]
    }
    


  • Na m1 ist ja offensichtlich nicht vom Typ struct matrix *

    Die typische Variante ist einen Zeiger auf die Struktur auf dem Stack anzulegen (nicht wie du die Struktur selbst) und den Speicher für die Struktur via malloc() zu reservieren.



  • Tim schrieb:

    Die typische Variante ist einen Zeiger auf die Struktur auf dem Stack anzulegen (nicht wie du die Struktur selbst) und den Speicher für die Struktur via malloc() zu reservieren.

    Die bessere Variante ist es als Parameter zu benutzen. Es ist immer besser, wenn man nachvollziehen kann, wo Speicher allokiert wird, den ich wieder freigeben muss.



  • Das ist so pauschal imho einfach falsch. Alleine schon der Name der Methode "createRandomMatrix" deutet doch darauf hin dass hier ein Objekt erzeugt werden soll. Es ist hier absolut nachvollziehbar, dass man das Objekt später mit einer Methode "deleteMatrix" wieder löscht.



  • Tim schrieb:

    Das ist so pauschal imho einfach falsch. Alleine schon der Name der Methode "createRandomMatrix" deutet doch darauf hin dass hier ein Objekt erzeugt werden soll. Es ist hier absolut nachvollziehbar, dass man das Objekt später mit einer Methode "deleteMatrix" wieder löscht.

    1. Soweit hab ich überhaupt nicht gelesen
    2. Auch nach dem lesen sehe ich eine solche "Methode" (Was ist das eigentlich?) nicht



  • FrEEzE2046 schrieb:

    Tim schrieb:

    Das ist so pauschal imho einfach falsch. Alleine schon der Name der Methode "createRandomMatrix" deutet doch darauf hin dass hier ein Objekt erzeugt werden soll. Es ist hier absolut nachvollziehbar, dass man das Objekt später mit einer Methode "deleteMatrix" wieder löscht.

    1. Soweit hab ich überhaupt nicht gelesen
    2. Auch nach dem lesen sehe ich eine solche "Methode" (Was ist das eigentlich?) nicht

    Du siehst die Methode nicht, weil sie im OP nicht steht. Das heisst aber nicht, dass es sie nie geben wird.

    http://de.wikipedia.org/wiki/Methode_(Programmierung)



  • Tim schrieb:

    http://de.wikipedia.org/wiki/Methode_(Programmierung)

    🙄

    Denk nochmal über meine Frage nach. Bei mir steht hier oben irgendwie "ANSI C" 😉



  • FrEEzE2046 schrieb:

    Tim schrieb:

    http://de.wikipedia.org/wiki/Methode_(Programmierung)

    🙄

    Denk nochmal über meine Frage nach.

    Sorry, du musst schon konkreter werden, ich bin schwer von Begriff.

    FrEEzE2046 schrieb:

    Bei mir steht hier oben irgendwie "ANSI C" 😉

    Und das hindert mich woran?


Anmelden zum Antworten