Zuweisung schlägt fehl
-
NetSlayer schrieb:
Bin gerade unter Windows, und benutz Dev-C++. Und wenn ich da kein Sysmte("pause") hinsetz' ist das Konsolenfenster gleich wieder weg. Aber sleep ist ne gute Idee.
Du könntest das Programm ja auch ganz normal von der Konsole starten, wie man eigentlich jedes Konsolenprogramm startet ;). Und was ist eigntlich so schwer daran, selber am Ende des Programms die Eingabe einer Taste vom Benutzer zu verlangen??
-
AJ schrieb:
Und was ist eigntlich so schwer daran, selber am Ende des Programms die Eingabe einer Taste vom Benutzer zu verlangen??
Also jetz' hack doch nicht so auf mir rum. Vielleicht kannst du mal in meinen ersten Post gucken: Ich programmiere noch nicht lange C. Ich hab doch gesagt ich hab's jetzt mit sleep() gelöst, dann brauch ich nicht einmal 'ne Taste drücken.
Ach ja, ich starte das Programm nicht von der Konsole, weil ich auch einfach F9 drücken kann. Außerdem kann die Windows-Shell gar nichts; ich benutze die eigentlich nicht gern.
-
Sleep ist am Ende eines Programmes selten hilfreich, da der Benutzer vielleicht doch selbst entscheiden möchte, wann er das Ergebnis fertig gelesen hat.
getchar ... es wird auf ENTER gewartet
getch() ... nich ANSI aber wartet auf beliebige taste
scanf("%c") ... würde ich nur zur not verwenden, oder
fgetc(stdin)UND: es besteht ein "geringer" unterschied zwischen der compilerumgebung, und dem aufruf durch das OS.
man KÖNNTE auch ohne malloc speicher reservieren LASSEN:
char variable[]="Ich bin ein String*gg*";
das funkt doch auch oder?
QUESTION @AJ: warum sind casts schlecht?
mfG :xmas1: (c)h :xmas1:
-
NetSlayer schrieb:
AJ schrieb:
Und was ist eigntlich so schwer daran, selber am Ende des Programms die Eingabe einer Taste vom Benutzer zu verlangen??
Also jetz' hack doch nicht so auf mir rum. Vielleicht kannst du mal in meinen ersten Post gucken: Ich programmiere noch nicht lange C. Ich hab doch gesagt ich hab's jetzt mit sleep() gelöst, dann brauch ich nicht einmal 'ne Taste drücken.
Ach ja, ich starte das Programm nicht von der Konsole, weil ich auch einfach F9 drücken kann. Außerdem kann die Windows-Shell gar nichts; ich benutze die eigentlich nicht gern.Richtig du programmierst noch nicht lange C und genau deswegen versuche ich dir so früh wie nur möglich die Flausen aus dem Kopf zu bringen. Außerdem verstehe ich nicht, dass so viele Anfänger mit dem system("PAUSE") daherkommen (ich muss das meistens in der Woche mind. 5 mal im Forum sehen, dass einer am Schluss den Schmarrn hinmacht). Ich frag mich wie die Leute darauf kommen das herzunehmen, schließlich ist eines der ersten Sachen, die man lernt, ein Zeichen von der Tastatur mit scanf() o. ä. einzulesen.
Klar ist es einfacher auf F9 (wohl der Shortcut in deiner IDE zum Ausführen) zu drücken, um das Programm gleich auszuführen, aber Konsolenprogramme sind nun mal für die Konsole gedacht (das sagt ja der Name schon), d. h. man sollte sie auch dort testen!
Ich hab absolut nichts dagegen, dass du am Ende deines Programms einen Tastendruck zum Beenden verlangst, aber BITTE nicht mit system().
Wenn du weitere Fortschritte in C machst, dann denk bitte auch daran, nicht immer gleich system() und einen Konsolenbefehl zu verwenden. Informier dich erstmal drüber, ob es alternative Funktionen dazu gibt (das ist eigentlich immer der Fall).
-
chille07 schrieb:
man KÖNNTE auch ohne malloc speicher reservieren LASSEN:
char variable[]="Ich bin ein String*gg*";
das funkt doch auch oder?
Das Problem ist, dass du hier nur lesend zugreifen darfst. Deshlab ist const für Literale richtiger
const char variable[]="Ich bin ein String*gg*";
Dann hätte NetSlayer von vorn herein schon einige Fehler weniger gehabt.
-
groovemaster schrieb:
chille07 schrieb:
man KÖNNTE auch ohne malloc speicher reservieren LASSEN:
char variable[]="Ich bin ein String*gg*";
das funkt doch auch oder?
Das Problem ist, dass du hier nur lesend zugreifen darfst. Deshlab ist const für Literale richtiger
In diesem Fall besteht nicht nur lesender Zugriff. Da hier erstellte Array wird in der Größe reserviert, dass es für den String + Stringendezeichen braucht und der String wird dann an den reservierten Speicher kopiert. Aufpassen muss man nur, dass man nicht über den Speicher des Arrays hinausschreibt (Bufferoverflow).
-
Ich dachte eigentlich, dass das nur bei solchen Sachen gemacht wird
char variable[100] = "Ich bin ein String*gg*";
Hmm, muss ich mir doch nochmal genau anschaun, was der Standard dazu sagt.
-
groovemaster schrieb:
Ich dachte eigentlich, dass das nur bei solchen Sachen gemacht wird
char variable[100] = "Ich bin ein String*gg*";
Hmm, muss ich mir doch nochmal genau anschaun, was der Standard dazu sagt.
char foo[]="hallo";
ist ein Array, dass eine handvoll chars beinhaltetchar* foo="hallo";
ist ein zeiger auf einen konstanten Speicherbereich (denn "hallo"[1]='x' ist ja aus verstädnlichen Gründen auch nicht erlaubt).die feinen unterschiede zwischen array und zeiger
-
groovemaster schrieb:
Ich dachte eigentlich, dass das nur bei solchen Sachen gemacht wird
char variable[100] = "Ich bin ein String*gg*";
Hmm, muss ich mir doch nochmal genau anschaun, was der Standard dazu sagt.
In diesem Fall wird ein Array für 100 chars angelegt und der String danach in den reservierten Speicher kopiert. Wenn du die 100 weglässt, dann wird hald einfach nur so viel Speicher reserviert, wie für den String gebraucht wird. Ganz einfach ;).
-
Scheint tatsächlich so zu sein, dass nur bei der Zeiger Schreibweise das Literal direkt referenziert wird und somit read-only ist. Man lernt halt nie aus.