Frage zu VS2010
-
papa_multi schrieb:
char auswahl[4][50]; for(int k=0;k<4;k++) memset(auswahl[k],0,sizeof(auswahl));Diese laienhafte Initialisierung lässt auf mangelnde Sprachkenntnis schließen.
char auswahl[4][50] = {0};macht dasselbe und auch effizienter.
VS wird mit jeder Version empfindlicher.
VS 6 hat sowas in der Release und Debugversion anstandslos gefressen.Sei froh, dass dich der Compiler auf offensichtlichen Unsinn / undefiniertes Verhalten hinweist, es sind deine Fehler (der Compiler hat immer recht) auf die er dich aufmerksam macht, was er nicht muss aber wie du gemerkt hast immer detaillierter macht.
-
Wutz schrieb:
papa_multi schrieb:
char auswahl[4][50]; for(int k=0;k<4;k++) memset(auswahl[k],0,sizeof(auswahl));Diese laienhafte Initialisierung lässt auf mangelnde Sprachkenntnis schließen.
char auswahl[4][50] = {0};macht dasselbe und auch effizienter.
Es kommt immer darauf an was für Daten in der Variable gespeichert werden sollen.
Diese Speicherplätze werden mit Binärwerten aus der Registry gefüllt die geben kein Asccii NULL mit. Deshalb das "Ausnullen"
Die Länge liegt immer im Bereich und somit ist das letzte Zeichen immer Ascii Null.
Die Werte sollen mit dem RegEditor nicht gelesen werden können und sind somit verschlüsselt und enthalten in der Mitte kein Asccii Null.
-
papa_multi schrieb:
Es kommt immer darauf an was für Daten in der Variable gespeichert werden sollen.
Diese Speicherplätze werden mit Binärwerten aus der Registry gefüllt die geben kein Asccii NULL mit. Deshalb das "Ausnullen"
Die Länge liegt immer im Bereich und somit ist das letzte Zeichen immer Ascii Null.
Die Werte sollen mit dem RegEditor nicht gelesen werden können und sind somit verschlüsselt und enthalten in der Mitte kein Asccii Null.Nein es kommt nicht darauf an. Du führst einen memset mit 0 aus. Der von Wutz vorgeschlagene Code macht genau das gleiche und initialisiert alles mit 0.
Es ging um Dein Stück code und nciht um irgendwelche strcpy oder sonstigen Befehle bei denen ein terminiernedes 0 eine Rolle spielen würde.Was denkst Du eigentlich was der Unterschied zwischen binär 0 und Ascii 0 ist?
Keiner...
BTW: In der Debug Library oder mit eingeschlatetem Application Verifier wäre auch Dein alter Code gecrashed. Denn durch diesen Code wird immer eine Vaiablen Grenze überschrieben. Das ist kein VS-2010 Problem sondern einzigund alleine Deines (wie Wutz auch schon schrieb).
Zudem merkt es nciht der Compiler, sondern die CRT...
-
papa_multi schrieb:
VS wird mit jeder Version empfindlicher.
VS 6 hat sowas in der Release und Debugversion anstandslos gefressen.Also erstmal hat VS 6 das im Debug-Mode nicht gefressen, zumindest nicht bei mir.
Und dann ist mir nicht klar was du damit zum Ausdruck bringen willst. Liest sich ein wenig so als ob dich das stören würde...
Ist doch toll wenn VS solche Fehler aufdeckt. Denn dass es garantierterweise immer funktioniert, das war noch nie so, und kann mit C++ auch nicht so sein.
-
Wutz schrieb:
papa_multi schrieb:
char auswahl[4][50]; for(int k=0;k<4;k++) memset(auswahl[k],0,sizeof(auswahl));Diese laienhafte Initialisierung lässt auf mangelnde Sprachkenntnis schließen.
char auswahl[4][50] = {0};macht dasselbe
Ne, zum Glück nicht ...
-
Es hätte auch noch den Mittelweg
memset(auswahl, 0, sizeof(auswahl));gegeben.
-
Warum soll man eine Funktion bemühen, wenn der Compiler weiß wie man das erreicht?

Ich würde der Version von Wutz den Vorzug geben.
-
Bei "kleinen" Arrays/Structs ist die
= {}Version supi. Weil safe und weniger zu tippen und überhaupt.
Bei grösseren Dingen kann sichmemset()auszahlen.
Weil: manche Compiler verwenden bei= {}immer die "intrinsic" Variante, rufenmemset()aber als Funktion auf wenn man direktmemset()hinschreibt.
Und diememset()Funktion ist oft ein gutes Stück schneller als die "intrinsic" Variante.(Achja: die
0in= {0}ist überflüssig)
-
hustbaer schrieb:
Und die
memset()Funktion ist oft ein gutes Stück schneller als die "intrinsic" Variante.Selbst wenn das stimmen sollte, denke ich mal, dass das bei den Größen die man auf dem Stack so hat mehr als trivial ist.
-
cooky451 schrieb:
hustbaer schrieb:
Und die
memset()Funktion ist oft ein gutes Stück schneller als die "intrinsic" Variante.Selbst wenn das stimmen sollte, denke ich mal, dass das bei den Größen die man auf dem Stack so hat mehr als trivial ist.
Lolz.
Ja, ne, ist frei erfunden.
Und ja, ne, der Stack ist ja so klein