*zgr = *zgr; - oder wie?



  • Nabend,

    ich habe 3 Dateien: f[0], f[1] und f[2].

    FILE *f[3] // Global - alle sind NULL -.
    

    Ich setze f[0] (kann NULL oder FILE sein).

    FILE *f[0] = getfile(argv[1], "rb"); // natürlich in der int main (int argc, char *argv[]); Funktion.
    /* Datenstrom im Modus char *m öffnen */
    FILE *getfile (char *path, char *m)
    {
       errno = 0;
       FILE *f = NULL;
       f = fopen (path, m);
       if (errno > 0) {
          fprintf (stderr, "%s\npath:\"%s\"\nmode:%s (c-sourcecode)\n", strerror (errno), path, m);
       }
       return (f);
    } /* getfile () */
    

    Dann möchte ich: Wenn argv[3] NULL ist, daß f[2] auch f[0] ist. (Das selbe FILE nicht ein gleiches.)

    Ich mache das so:

    if (argv[3] == NULL)
       *f[2] = *f[0];
    else
       ;
    

    Nun sind f[0] und f[1] doch Zeiger auf die selbe Adresse, an der f[0] beginnt - oder?

    - Hier bricht Windows ab. - Warum bricht Windows hier immer ab und wie macht man's richtig?

    ... das ganze soll dann so weiter gehen:

    char *c;
    while ((c=fgetc(f[0]))!=EOF){
       fputc(c, f[2]);
    }
    

    So das die Eingabedatei auch die Ausgabedatei sein kann - oder aber auch nicht - und man nicht x Zeilen code braucht.



  • tito schrieb:

    Ich mache das so:

    if (argv[3] == NULL)
       *f[2] = *f[0];
    else
       ;
    

    probier mal das ganze ohne die sternchen...



  • Habe es ausporbiert, funktionierte aber aucht nicht.
    Es ist doch auch das selbe, da f[0] und f[2] Zeiger sind. oder nicht?



  • ...



  • Sry für die Verwirrung, aber mein Problem war dieses:

    int main (int argc, char *arg[])
    {
       int i;
       if (argc == 1)
          for (i=0; i<4; i++)
             printf(">%s...\n", arg[i]);
    }
    

    Warum liefert arg[1] auch NULL zurück???



  • tito schrieb:

    Sry für die Verwirrung, aber mein Problem war dieses:

    int main (int argc, char *arg[])
    {
       int i;
       if (argc == 1)
          for (i=0; i<4; i++)
             printf(">%s...\n", arg[i]);
    }
    

    Warum liefert arg[1] auch NULL zurück???

    Wenn argc == 1 ist, steht auch nur ein Argument zur Verfügung, nämlich der Programmname selbst.
    Dann gibts auch kein arg[1] (also einen zweiten Parameter).

    Ein Zeiger wird z. B. char *ptr deklariert. Wenn Du dann ptr benutzt (ohne stern), dann
    sprichst Du die Adresse an, auf die ptr zeigt. Wenn Du aber *ptr im Programm benutzt,
    dann hast Du den Inhalt von der speicheradresse, auf die ptr (ohne Stern) zeigt.
    Mit anderen Worten: wenn ptr ein Zeiger auf eine Kuh ist, ist *ptr die Kuh selbst ;).



  • thknopp schrieb:

    Wenn argc == 1 ist, steht auch nur ein Argument zur Verfügung, nämlich der Programmname selbst.
    Dann gibts auch kein arg[1] (also einen zweiten Parameter).

    Das ist richtig.

    Aber wenn argc == 1 ist, warum liefert dann arg[1] NULL, arg[2] "" und arg[3] Absturz. Klar ist mir das ich bei arg[3] auf ein nicht dimensioniertes geschweige denn initalisiertes Objekt zugreifen wollte.
    Doch sollte das nicht auch schon bei arg[1] der Fall sein, also arg1 Absturz.
    Muss man das als Tatsache akzeptieren, oder steckt da ein Sinn hinter?



  • Du musst nur akzeptieren dass undefiniertes Verhalten nicht heisst dass ein Absturz stattfindet. Du kannst das Ergebnis einfach nicht vorhersagen. Deshalb vermeide es besser 😉



  • Ich weiß nicht, ob das vom Standard so definiert wurde, aber laut MSDN ist das Absicht:

    MSDN - main() schrieb:

    argv
    An array of null-terminated strings. It can be declared as an array of pointers to char (char *argv[ ]) or as a pointer to pointers to char (char **argv). The first string (argv[0]) is the program name, and each following string is an argument passed to the program from the command line. The last pointer (argv[argc]) is NULL.



  • Wenn ich doch aber in der shell PROGRAMM.EXE aufrufe: Habe ich doch keine parameter, ausser dem Programmnamen mit übergeben.
    Also sollte doch auch kein arg[1] == NULL sein oder aber es wäre auch arg[n] == NULL. Das verstehe ich nicht.

    EDIT:

    The last pointer (argv[argc]) is NULL.

    - Erst gar nicht gesehen.
    Also werde ich es wohl als Tatsache ansehen.



  • Laut Standard ist argv[0] bis argv[argc - 1] mit den Parametern gefüllt (einschließlich des Programmnamens). Darüber hinaus kannst Du keinerlei Annahmen treffen, finde dich damit ab. Will heissen in argv[argc], argv[argc + 1] ... argv[argc + n] kann ALLES drinstehen, und da hast Du keinerlei Einfluß drauf.

    Oder verstehe ich die Frage falsch?!



  • tito schrieb:

    Wenn ich doch aber in der shell PROGRAMM.EXE aufrufe: Habe ich doch keine parameter, ausser dem Programmnamen mit übergeben.
    Also sollte doch auch kein arg[1] == NULL sein oder aber es wäre auch arg[n] == NULL. Das verstehe ich nicht.

    Wieso das? argv ist einfach ein Array von Zeigern, die hintereinander im Speicher stehen:

    0   1   2 ...
    | NULL  |
    |      ...
    "PROGRAMM.EXE"
    

    (die ersten Elemente werden vom Startup-Code belegt, alles dahinter enthält irgendwelche willkürlichen Werte)



  • LordJaxom schrieb:

    Oder verstehe ich die Frage falsch?!

    Nein schon richtig.

    Habe mich schon damit abgefunden, tut ja nicht weh 😉
    Bis argv[argc-1] == PROGARG. ist ja logisch und ab argv[argc] alles als UNDEFIENIERT anzusehen aus Sicht des Programmes irgendwie auch.

    ... btw: Braucht der Theard nun einen anderen Tietel?


Log in to reply