*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?