Rueckgabewert von Funktionen



  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    int einlesen(int, char *[], int *, int *);

    int einlesen(int anzahl, char *argumente[], int *b, int *c)
    {
    printf("%d %d %d\n", anzahl,*b,*c);
    b=b+5;
    c=c+7;
    return (0);
    }

    int main(int anzahl , char *argumente[] )
    {
    int b,c;
    b=0;
    c=1;
    einlesen(anzahl, argumente,&b,&c);
    printf("%d %d\n",b,c);
    return 0;
    }

    Es soll ein der Funktion die Wert von "b" und "c" geaendert werden und mir im Hauptprogramm ueberschreiben, so das ich damit weiter arbeiten kann.
    Ich kann die Variablen aber nicht global machen.

    Was mache ich falsch?



  • Änder das mal in der Funktion ab:

    *b=*b+5; 
    *c=*c+7;
    

    Bei deiner Version verschiebst du die Zeiger nur um 20 bzw. 28 Bytes.



  • CarstenJ schrieb:

    Änder das mal in der Funktion ab:

    *b=*b+5; 
    *c=*c+7;
    

    Bei deiner Version verschiebst du die Zeiger nur um 20 bzw. 28 Bytes.

    Ich versteh es zwar nicht, aber es geht.

    Danke schoen. Damit komme ich aber dennoch weiter.



  • dann lies dir mal genauer durch, was pointer sind, und was pointerarithmetik ist 🙂



  • Das ist nicht wirklich das, worauf ich hinaus wollte.

    Also da ich nur rausfinden wollte, wie ich Werte an Unterfunktion uebergebe weiss ich ja. Aber ich weiss nicht, wie ich die Werte in der Unterfunktion ueberschreibe und dann zurueckgebe. Das ist mein Problem.

    ?????

    Wenn ich eine Datei oeffne in der Unterfunktion, wie gebe ich die Adressen richtig zurueck ???

    Das muss ich erfahren, nicht wie ich Zeiger Addiere oder Subtrahiere.



  • Chris233 schrieb:

    Also da ich nur rausfinden wollte, wie ich Werte an Unterfunktion uebergebe weiss ich ja. Aber ich weiss nicht, wie ich die Werte in der Unterfunktion ueberschreibe und dann zurueckgebe. Das ist mein Problem.

    Dann beschaeftige dich mit 'Pointer Arithmetik'

    Das ist der Ueberbegriff fuer 'mit Zeigern arbeiten' - und genau das willst du doch, oder?

    Sicher koennten wir dir sagen WIE du WAS tun sollst, aber das bringt dir ja nichts. Du hast es dann nicht verstanden und wirst bald wieder an dem Problem haengen.

    A Tutorial on Pointers and Arrays in C



  • Ok, ich versuch es jetzt nocheinmal und anders.

    Vielleicht gehts so.

    WER FINDET DEN .... FEHLER ????

    int oeffnen (int , char *[], FILE *, FILE *,FILE *);
    void ausgabe(FILE *);

    int oeffnen(int anzahl , char *argumente[], FILE *datei_in, FILE *datei_in_1, FILE *datei_out)
    {
    char *arg1=argumente[1];
    char *arg2=argumente[2];
    char *arg3=argumente[3];
    char *arg4=argumente[4];
    char *arg5=argumente[5];
    char *arg6=argumente[6];
    char buf[input];
    char layer_name[20+1];
    char c,f,*lay=layer_name;
    double x,y,a,r,alpha_start,alpha_end,x_v,y_v,z_v;
    int i,b=0,aus=0;
    FILE *dat_in;
    FILE *dat_in_1;
    FILE *dat_out;
    if (anzahl=='2')
    {
    dat_in=(fopen(arg1,"r"));
    dat_in_1=(fopen(arg2,"r"));
    if (NULL==dat_in)
    {
    printf("FEHLER BEI OEFFNEN DER DATEI %s\n",arg1);
    printf("(DATEI GGF. NICHT VORHANDEN) \n");
    return(-1);
    }
    else if (NULL==dat_in_1)
    {
    printf("FEHLER BEI OEFFNEN DER DATEI %s\n",arg2);
    printf("(DATEI GGF. NICHT VORHANDEN) \n");
    return(-1);
    }
    else
    {
    printf("datei erfolgreich geoeffnet %s\n",arg1);
    printf("datei erfolgreich geoeffnet %s\n",arg2);
    dat_out=(fopen(arg3,"w"));
    printf("datei erfolgreich geoeffnet %s\n",arg3);
    return (0);

    }
    }
    else
    {
    dat_in=(fopen(arg1,"r"));
    *datei_in=*dat_in;
    if (NULL==dat_in)
    {
    printf("FEHLER BEI OEFFNEN DER DATEI %s\n",arg1);
    printf("(DATEI GGF. NICHT VORHANDEN) \n");
    return(-1);
    }
    else
    {
    printf("datei erfolgreich geoeffnet %s\n",arg1);
    dat_out=(fopen(arg2,"w"));
    *datei_out=*dat_out;
    printf("datei erfolgreich geoeffnet %s\n",arg2);
    fprintf(dat_out,".units mile \n");
    return(0);
    }
    }
    }

    void ausgabe(FILE *datei_out)
    {
    int b=0,a=0,c=0,nr=0,i=1;
    double x=0, y=0, weite=BREITE, hohe=HOEHE;
    double layer_hoehe;
    char lay[MAX];
    char *layer=lay;
    char buf[input];
    struct punkt *zeiger,*zeiger1;
    zeiger=anfang;

    fprintf(datei_out,".units mile \n");
    fprintf(datei_out," bla bla \n);
    }
    int main(int anzahl , char *argumente[] )
    {
    char *arg1=argumente[1];
    char *arg2=argumente[2];
    char *arg3=argumente[3];
    char suche='.';
    char d='d',D='D';
    int len=0;
    FILE datei_in, datei_in_1,datei_out;
    FILE *dat_in,*dat_in_1,*dat_out;
    if ( argumente[1] == 0 )
    { printf("\nSo eingeben\n \? \n");
    printf("Beispiel dxf2inp datei.dxf ausgabe.inp \n oder \n");
    printf("Beispiel dxf2inp datei.dxf datei-2.dxf ausgabe.inp \n");
    }
    else
    while (arg2[len])
    {
    if (arg2[len++]==suche)
    {
    if ((arg2[len]==d) != (arg2[len]==D ))
    {
    anzahl=2;
    oeffnen(anzahl, argumente, &datei_in, &datei_in_1, &datei_out);
    break;
    }
    else
    {
    anzahl=1;
    oeffnen(anzahl, argumente, &datei_in, &datei_in_1, &datei_out);
    break;
    }
    }
    }
    ausgabe(&datei_out);
    switch (anzahl)
    {
    case 1: {
    fclose(&datei_out);
    fclose(&datei_in);
    }
    case 2: {
    fclose(&datei_out);
    fclose(&datei_in);
    fclose(&datei_in_1);
    }
    default: printf("Schwerer Fehler");
    }
    return(0);
    }



  • C übergibt Argumente immer by-Value, d.h. wenn du von der Funktion aus die ursprünglichen Variablen verändern willst, mußt du Call-by-Reference simulieren, indem du Pointer auf die zu verändernden Variablen übergibst.

    void foo(FILE ** blah)
    {
      *blah = fopen("blub", "r");
    }
    int main()
    {
      FILE *bleh;
      foo(&bleh);
    }
    


  • Ich danke dir.

    Nach 5 Std endlich eine Loesung die geht.

    :-))

    Danke, danke, danke


Log in to reply