Einfach bei der Abfrage mit String.ToUpper vergleichen
oder String.ToLower
Hab mal ne kleine Frage. Wenn ich in einer Funktion ein int i = 0; initialisiere, was passiert dann wenn ich die Funktion öfters aufrufe? Habe ich dann in der Laufzeit mehrere Variablen im Speicher oder werden locale Variablen nach der Funktion wieder "gelöscht"?
Hab mal ne kleine Frage. Wenn ich in einer Funktion ein int i = 0; initialisiere, was passiert dann wenn ich die Funktion öfters aufrufe? Habe ich dann in der Laufzeit mehrere Variablen im Speicher oder werden locale Variablen nach der Funktion wieder "gelöscht"?
Funktionen werden von compilern als unterprogramme realisiert welche so zu sagen ihren eigenen Stack haben. Bei Aufruf wird der Speicher auf den Stack gepusht, beim verlassen wird dieser komplette Bereich wieder gelöscht
Ein schönes C Beispiel welches das veranschaulicht:
Code:
void foo() {
int i;
i = 5;
}
void bar() {
int i;
printf("%d", i);
}
void main() {
foo();
bar();
}
das ganze würde dann 5 ausgeben, da die erste Funktion auf dem Stack eine Variable erzeugt, dann der Speicher freigegeben wird, und dann die nächste Funktion, mit der Selben Speicherbelegung auf der selben Stelle im Speicher initialisiert wird, und somit ist i genau das i von vorher
Du vergleichst die falschen Strings miteinander. Du speicherst die Textbox in eine variable und benutzt dann ToLower. Verwendest dann aber nicht diese Variable.
So (damit kannst du die variable passworteingabe komplett weglassen)
PHP Code:
if (textBox1.Text.ToLower() == passwort.ToLower())
oder so (wenn du eine extra variable verwenden möchtest)
Korrekt in Anführungszeichen, weil deine Lösung zwar funktioniert, aber unnötigerweise eine Kopie erzeugt.
Quote:
Originally Posted by Moneypulation
Hab mal ne kleine Frage. Wenn ich in einer Funktion ein int i = 0; initialisiere, was passiert dann wenn ich die Funktion öfters aufrufe? Habe ich dann in der Laufzeit mehrere Variablen im Speicher oder werden locale Variablen nach der Funktion wieder "gelöscht"?
Kommt auf die Sprache an, in der Regel sind lokale Variablen aber auf dem Stack und verschwinden nach dem Verlassen des Scopes.
Quote:
Originally Posted by warfley
das ganze würde dann 5 ausgeben, da die erste Funktion auf dem Stack eine Variable erzeugt, dann der Speicher freigegeben wird, und dann die nächste Funktion, mit der Selben Speicherbelegung auf der selben Stelle im Speicher initialisiert wird, und somit ist i genau das i von vorher
Nein. Genau so gut könnte dein PC in die Luft gehen oder all deine Passwörter an die NSA senden. Das Verhalten beim Auslesen von uninitialisierten lokalen Variablen ist in C undefiniert. Du möchtest kein undefiniertes Verhalten.
Nein. Genau so gut könnte dein PC in die Luft gehen oder all deine Passwörter an die NSA senden. Das Verhalten beim Auslesen von uninitialisierten lokalen Variablen ist in C undefiniert. Du möchtest kein undefiniertes Verhalten.
Du hast recht, es ist in C nicht explizit definiert, allerdings ist in C die Speicherbelegung für Funktionsaufrufe fest definiert und deterministisch, und im Betriebsystem die Art der Speicheralloziierung. Und das beides zusammen Impliziert meine Aussage. Auch wenn ich Stark vereinfacht habe, indem ich von Windows, Linux oder MacOSX ausgegangen bin, und davon ausgegangen bin dass keine weitere Speicherallozierung oder Freigabe während des Programmablaufs geschieht, was in den meisten Situationen auch stimmt.
Natürlich hätte ich noch dazuschreiben müssen dass dies nicht zu 100% sicher ist und man daher sich nicht drauf verlassen sollte
Nein, das ist keinesfalls deterministisch und festgelegt. Der Code kann z.B. dahingehend optimiert werden, dass er inlined wird oder einzelne Parameter in Registern übergeben werden, die natürlich zwischenzeitlich auch für andere Rechnungen und lokale Variablen verwendet werden können. Aber ob mit oder ohne Optimierungen: Bei lokalen Variablen ist weder garantiert, wo sie gespeichert werden, noch in welcher Reihenfolge sie gespeichert werden, solange die Semantik des Programms erhalten bleibt.
Selbst wenn triviale Beispiele wie deins stellenweise funktionieren können, kann sich das schlagartig durch das Hinzufügen, Ändern oder Löschen weniger Zeilen ändern.
Davon abgesehen kann das System Mechanismen zum Verhindern/Erkennen von Bufferoverflows verwenden, die bestimmte Kontrollwerte auf dem Stack ablegen, damit kein Überschreiben der Return Address möglich ist. Auch dass kann dir bei solchen Erwartungen dazwischen funken.
Wobei man bei einem deutschen Programm lieber InvarianteCulture (bzw. CurrentCulture in .NET Core) anstatt Ordinal wählen sollte. Sonst wird ein Unterschied zwischen Großbritannien und Grossbritannien gemacht.
CO 2 Chit-Chat 04/04/2013 - Conquer Online 2 - 3 Replies Hello,
You are allowed to talk in this thread about all things belonging to CO2.
It does not matter whether you want to ask something or you just want to talk about CO2.
Posts like "lol" are forbidden!