Zeiger an Funktion übergeben



  • Hallo zusammen,

    ich möchte einen Zeiger auf ein 2D-Array an eine Funktion übergeben. Folgende Funktionsdefinition und Deklaration:

    bool organize(GraphObj toPlace,bool ausgang,int* field[12][12],int vor)

    Der Funktionsaufruf sieht wie folgt aus:
    organize(obj,ausgang,&field,vorg);

    field wurde dabei als int field[12][12] deklariert.

    Folgender Fehler wird vom Compiler gemeldet:

    error C2664: 'organize' : Konvertierung des Parameters 3 von 'int (*)[12][12]' in 'int *[][12]' nicht moeglich.

    Als Zeile wurde dabei der Funktionsaufruf angeben.

    Ich hoffe jemand kann mir bei diesem Problem weietrhelfen.
    Gruß,
    Termi



  • int *field[12][12] ist ein 12x12-Array von int-Pointern, weil [] eine hoehere Prioritaet als * hat. Fuer das was du willst musst du also Klammern setzen: int (*field)[12][12]. Im Uebrigen waer auch diese Loesung moeglich:

    void foo(int field[12][12]);
    ...
    foo(field); // ohne &
    

    Das Feld wird trotzdem nicht by-value uebergeben (das werden Felder nie). Tatsaechlich ist die Deklaration int field[12][12] im Funktionskopf gleichbedeutend mit int (*field)[12], die eine Dimension faellt also weg bzw. ist beliebig.



  • Danke funzt. 👍



  • Hi!

    Ich hab` immer wieder die Fehlermeldung beim Compilieren:

    segmentation fault

    Eigentlich soll es der Fall sein, wenn der Zeiger was-weiss-ich-wohin-zeigt oder irre ich mich?
    Und eigentlich (zumindest ist es gedacht worden), ist der Zeiger eindeutig definiert und identifiziert worden. Was ist schief gegangen, hat vielleicht eine Idee? Ich bin mittlereweile überfragt.

    das Program selbst ist folgendermaßen aufgebaut:
    void ploT(int x,char *data,...){
    va_list ar;

    double **vectorField;
    int vectorNr,i,j;
    char t;
    FILE *fp;

    /*die Prozedur mit dem Öffnen lasse ich einfach aus*/

    va_start(ar,data);
    lChar = ' \0';
    vectorNr = 0;
    t = data[0];
    while(t!=lChar){
    vectorNr++;
    t = data[vectorNr];
    }

    vectorField = (double **)malloc(vectorNr*sizeof(double *));
    for(j=0;j<vectorNr;j++)
    vectorField[j] = (double )malloc(xsizeof(double));

    for(j=0;j<vectorNr;j++)
    vectorField[j] = va_arg(args,double *);
    for(j=0;j<vectorNr;j++){
    for(i=0;i<x;i++)
    fprintf(fp,"%e\n",*vectorField[j]++); //hier tritt das Problem auf
    fprintf(fp,"e\n");
    }

    va_end(ar);
    }



  • soll der Code besonders schlau sein oder so? warum nicht einfach vectorField[j][i]?



  • funktioniert leider nicht
    😞



  • Ich meine, nicht, dass das nicht funktioniert, sondern das ist nicht das Problem, ich kriege auch damit dieselbe Error-Meldung



  • Dann wurde vielleicht ganz banal die Datei nicht richtig geoeffnet -- hast du das ueberprueft?



  • naja, es wird wie übilch so geöffnet:

    if(!(fp = fopen("temp.gn","w"))) {
    fprintf(stderr,"unable to open temp.gn\n");
    exit(1);
    }

    ich hab` bisher noch nie Probleme damit gehabt...



  • for(j=0;j<vectorNr;j++)
        vectorField[j] = va_arg(args,double *);
    

    Das seh ich ja jetzt erst, was soll das denn machen? Sieht in jedem Fall nicht sehr sinnvoll aus, den gerade mit malloc initialisierten Zeigern irgendwas anderes zuzuweisen.



  • Hi!

    Ne, das ist es nicht. Mit malloc kann man Speicher "reservieren" und da stehen irgendwelche Werte drin. Um meine Werte darstellen zu können, weise ich dem Vektor die Werte zu, die ich haben möchte.

    Naja, das ist jedenfalls nicht das Problem. Ich hab` es bereits gefunden und es funktioniert weiter (es lag nicht an diesem Programmausschnitt, sondern an dem Programm, das das hier aufruft).

    Viele Grüße!


Anmelden zum Antworten