Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
22.04.2002, 17:36
Subcourcer1



Kann mir zu der Warnung: "warning C4700: local variable 'x' used without having been initialized" eine Lösung sagen. Wenn ihr den Code braucht, kein Problem, aber ich denke, es ist ein Anfängerfehler :-).

--

zum Seitenanfang zum Seitenende Profil || Suche
001
22.04.2002, 17:44
Kriz



Du verwendest eben eine Variable x, ohne Sie vor dem ersten Benutzen initialisiert zu haben.Quellcode:void Foo()
{
    double x; // x ist nur deklariert, aber weder definiert noch initialisiert
    cout << "\nDumdidum" << endl;
}
Hier wird die Variable x zwar erzeugt, aber es geschieht nichts weiter mit ihr. Wenn du sie also nicht brauchst, lösch sie einfach aus dem Code.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
22.04.2002, 17:51
Archangel



Kriz, dein code würde die warning "Unreferenzierete lokale Variable" hervorrufen, eine warning "local variable user without having been initialized entsteht bei folgendem code:

Quellcode:
void Foo()
{
    double x;
    cout << "x ist " << x << endl;
}

also x vor der ausgabe (oder was du sonst damit machst, zB inkrementation etc) auf 0 setzen

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
003
22.04.2002, 17:56
Onkel Dittmeyer



is doch egal, hauptsache ist halt dass er vergessen hat die Variable zu deklarieren. Und er verwendet sie ja anscheinend irgendwo.
Naja egal

--

zum Seitenanfang zum Seitenende Profil || Suche
004
22.04.2002, 17:57
Archangel



rofl ? thepope, das is absoluter quatsch, er hat die variable vergessen zu initialisieren.. wenn er vergessen hätte, sie zu deklarieren, gäbs einen - achne - "undeclared identifier" error.

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
005
22.04.2002, 17:59
Kriz



@Archangel: Mit fällt gerade auf, daß ich das << x im Stream vergessen habe... Kann ja mal passieren =) Aber Danke für den Hinweis, daß es fehlt.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
006
22.04.2002, 18:23
mani



oder auch:

Quellcode:
int x;
sprintf(blubb, "%d", x);

sowas is evil

--

zum Seitenanfang zum Seitenende Profil || Suche
007
22.04.2002, 19:40
Onkel Dittmeyer



Zitat:
Archangel postete
rofl ? thepope, das is absoluter quatsch, er hat die variable vergessen zu initialisieren.. wenn er vergessen hätte, sie zu deklarieren, gäbs einen - achne - "undeclared identifier" error.

Ups, verlesen =)
Hast recht.

--

zum Seitenanfang zum Seitenende Profil || Suche
008
23.04.2002, 17:11
Subcourcer1



Gut, jetzt gibt der compiler mir keine Fehlermeldung mehr aus.
Danke für die Hilfe.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
26.04.2002, 15:57
[RMen]OneStone



Quellcode:
//wrong
int Foo1()
{
int x;
return x;
}

//right
int Foo2()
{
int x = 2;
return x;
}

Aber bitte so nen schrott wie Foo2 nicht ernsthaft verwenden, erzeugt nen riesen Overhead. #define Foo2 ((int) 2) währe hier angebracht. Aber das ist ja egal...

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
010
26.04.2002, 16:04
Tron



BAEH!!!
define fuer sowas ist uber-evil!

2 saubere loesungen waeren:
- const int Foo2 = 2;
- inline int Foo2 { return 2; }

eventuell auch:
enum Foo
{
Foo2 = 2
};

bei einem schlauen compiler (lies: gcc) erzeugt
int Foo2()
{
int x = 2;
return x;
}
uebrigens genau 0,garkein overhead, da die variable x wegoptimiert wird und Foo2 geinlined wird (mit den entsprechenden optimiereroptionen -Ox)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
011
26.04.2002, 18:12
[RMen]OneStone



Hmm, wer gcc benutzt hat glück.. =)
Aber bei vielen C/C++ Complimierern würde ein überflüßiges MOV AX, 2 stattfinden, anstatt direkt mit 2 zu arbeiten.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
012
26.04.2002, 19:37
Hellfire



Zitat:
[RMen]OneStone postete
Hmm, wer gcc benutzt hat glück.. =)
Ich würde eher sagen, wer gcc benutzt hat i.d.R. Verstand und weiß was er macht.

--


Dieser Beitrag wurde am 26.04.2002 um 19:38 von Hellfire bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
26.04.2002, 22:58
Tron



@Hellfire: ja ... einfach nur ja (;

@einsteinersatz:
was heisst hier "ueberfluessiges mov ax, 2 [...], anstatt direkt mit 2 zu arbeiten" ? der rueckgabewert WIRD bei x86er cpus und bei gaengigegen compilern im eax (eax, da normalerweise 32bit modus) register zurueckgegeben, ohne inline sieht diese funktion so aus:
mov eax, 2
ret

und falls es inline ist, ist sogar m$vc++ so schlau das wegzuoptimieren

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
014
27.04.2002, 12:04
Kriz



Der volle Optimierungsumfang für VC++ wird sowieso erst ab Professional Edition erreicht. Und #define sollte wirklich nur als das benutzt werden, wofür es ursprügnlich mal gedacht war: Als Schalterdirektive und net als Funktionsmakrofizierer oder gar Konstantenersatz. Sowas ist zwar gängig, ist in meinen Augen aber mehr als nur "dirty coded", da alles wegfällt, was Stabilität in einem Programm ausmacht wie nichtvorhandene Typkontrolle oder unvorhersehbares Programmverhalten.

Bestes Beispiel:Quellcode:
#define QUAD(x) ((x)*(x))

int a,
    b = 2;
char* c = "Ack";

a = QUAD(b); // Funzt aus einer Mischung aus Zufall und Versehen =)
a = QUAD(d); // Funzt weniger, da ohne Typkontrolle =(

Oder diese nette Falle:Quellcode:
int a,
    b = 3;

a = QUAD(b++);

Nach der Expansion sieht das ja so aus:

a = ((b++)*(b++));

Und das ist teh Uber-Evil³!!! Und nun sag mir mal, OneStone, wieso das teh Uber-Evil³ ist! >:P

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
015
27.04.2002, 15:19
Another1



Zitat:
Quellcode:
#define QUAD(x) ((x)*(x))int a,    b = 2;char* c = "Ack";a = QUAD(b); // Funzt aus einer Mischung aus Zufall und Versehen =)a = QUAD(d); // Funzt weniger, da ohne Typkontrolle =(

QUAD(d) wird hier so oder so nit funzen, wenn, dann meinst du sicher QUAD(c), was aber auch nit mehr machen wird als nen compiler error.

--

Another1

...relaxing..atm =)
... und Schweiz suckt!


Dieser Beitrag wurde am 27.04.2002 um 15:19 von Another1 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
27.04.2002, 22:48
Prefect



Mit ein bißchen Disziplin ist auch #define durchaus verwendbar :)

Übrigens würde ich konstante Variablen nur im äußersten Notfall verwenden (sprich: dann, wenn ich einen Zeiger darauf brauche, also z.B. bei Lookuparrays). Ansonsten nehme ich enum oder eben #define.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
017
27.04.2002, 23:22
Tron



wieso?
eine const-variable wird (zumindest bei gcc), falls sie nicht als zeiger oder referenz verwendet wird, automatisch wegoptimiert. (dh. nur ihr wert eird beim kompilieren verwendet, aber sie belegt keine wertvollen 4byte)

ein #define wuerde ich NIEMALS als konstante verwenden.
dummes beispiel:

#define max 5
int max(int, int); // das ergibt einen SEHR kryptischen kompilierfehler, vorallem kaum zu finden, wenn das #define und diese funktionsdeklaration weit auseinander liegen

oder was anderes
#define max 5
#define max2 2max //ausversehen das * vergessen, so wird max2 auf 25 definert ):

#define als konstante zu verwenden ist uberevil, immer const oder enum!
von der ganzen anderen sch*** die #define anrichten kann, wollen wor garnet sprechen

#define hat einige sehr genau definierte anwendungsgebiete, zb. als sentry:
#ifndef header_h
#define header_h
// deklarationen
#endif

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
018
28.04.2002, 00:17
Prefect



Eine andere Verwendung von #define:

http://www.rtts.org/source/library.h.html

... unter LObject - SIGNAL/SLOT CAPABLE CLASS

;p

Es ist vielleicht so eine kleine Idiotie von mir, aber ich verwende oft #define für Uppercase-Konstanten und enum für Lowercase-Konstanten, aber auch das nicht konsequenzt. Ich denke, auf enum kann man sich einigen ;)

Das const wegoptimiert wird ist wohl so... aber ich verwende Variablen dann doch lieber für variables...

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
019
28.04.2002, 02:37
Kriz



@Prefi, ich weiß , daß in C Makros gerne verwendet werden, aber es ist manchmal nicht von Vorteil, wenn man Präprozessordirektiven mißbraucht. Als erfahrener Anwender (wie du es bist) weiß man um die Nachteile der Makros. Daher billige ich dir (und Tron und Blair und den Rest der C/++ Mitwisser) uneingeschränkt zu, daß du (ihr) Makros problemlos verwendet. Aber nach den SWT-Richtlinien sind Makros in C/++ nur in äußersten Notfällen einzusetzen. =)

Moderne und gefällige Programme sollten (!) stabil laufen und soweit wie möglich irgendwelche Komplikationen aus dem Weg gehen, d.h. Makros nur dann verwenden, wenn Sicherheit gewährt wird =) Ich bei Siemens-VDO kann es mir beispielsweise nicht leisten, unstabilen Code abzuliefern...

@Another1: Das Beispiel mit QUAD(d) resultiert aus der Fehlerbehaftung mit Makros. Angenommen, jemand verwendet eine Library (DLL), in der das Makro QUAD() vorkommt. Aus irgendeiner "Dummheit" heraus aber verwendet er das Makro QUAD() mit einem String. Dann könnte je nach Codestruktur die Fehlersuche erheblich eingeschränkt sein! Und ja, es war ein Tippfehler. Ich meinte QUAD(c) =)

@Tron: Ich verwende #define wirklich nur als Headersperre, um redundante Headereinbindung zu verhindern oder um fundamentale Definitionen zu erleichtern (ich weiß, daß ich damit mich selber irgendwo belaste, aber manchmal muß man eben ein X für ein V vormachen =)
Quellcode:#ifndef NULL
#define NULL 0
#endif // NULL
// bzw.
#if !defined NULL
#define NULL 0
#endif // NULL

Ich persönlich verwende #define separat davon nur dann, wenn es darum geht, Headerdateien zu unifizieren:
Quellcode:#ifndef HEADER_TRALLALLA_H
#define HEADER_TRALLALLA_H
...
#endif // HEADER_TRALLALLA_H

Im Endeffekt soll jeder tun, was er meint! Das fördert die Variablität =)

Den Zwiespalt zwischen Code und Quelltext sollte man nur dann explizit verwenden, wenn man absolut sicher ist, was man tut. Ich respektiere Prefis Codeerfahrung und alle anderen Erfahrungen der jeweiligen C/++ Coder. Ich vertraue dagegen meistens den Richtlinien, nachdem sich die internationale SWT-Norm nach richtet. Wenn ich allerdings ehrlich zu mir selber bin, dann möchte ich behaupten, daß Insidercoding manchmal (!) besser ist als Vorschriftscoding...

In diiesem Sinne...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 28.04.2002 um 02:38 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
28.04.2002, 09:14
Tron



Zitat:
Kriz postete
Quellcode:#ifndef NULL
#define NULL 0
#endif // NULL
// bzw.
#if !defined NULL
#define NULL 0
#endif // NULL

warum verwendest du das makro NULL?
sogar herr stroustrup persoenlich sagt, dass man 0 verwenden soll, 0 ist garantiert laut c++-standard der wert fuer einen zeiger der auf nichts zeigt.
wenn man konsequent ist sollte man auch NULL nicht verwenden; oder wenn man es doch sooo lieb hat als
const void* NULL = 0;
defineren.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
021
28.04.2002, 12:21
Kriz



NULL ist in den Standardlibs eh immer vordefiniert, also von daher =)

Hey, OneStone, was is nu? Ich warte auf eine Antwort.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 28.04.2002 um 12:22 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
022
29.04.2002, 01:27
Another1



Zitat:

oder was anderes
#define max 5
#define max2 2max //ausversehen das * vergessen, so wird max2 auf 25 definert ):

naja, ok, blöder konter, aber wenn du max als #define und max2 als const benutzt kommt der gleiche Fehler (abgesehen davon, dass wohl fast niemand const und #define abwechselnd für so ziemlich das gleiche benutzt (in dem fall max und max2)) :

#define max 5
[...]
const int max2 = 2max; // * vergessen, gleiches resultat wie mit #define =)

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche