Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Debug vs. Release

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.01.2004, 16:19 Uhr
~macintosh
Gast


Hallo!

ich habe eine Win32 Anwendung gebastelt, poste aber hier weil es ein C/C++ Problem ist.

Bevor ich in den MessageLoop steige rufe ich noch einige void Funktionen auf, die diverse Sachen initialisieren.
Im Debug Modus ging das bisher auch ohne Probleme, aber nun habe ich versucht meine Anwendung im Release-Mode zu compilen und erhalte diverse Fehlermeldungen.

deshalb habe ich einfach ein paar grundlegende fragen zum c/c++ programmierstil:

wenn ich eine variable in einer funktion definiere, ist sie dann in der ganzen funktion gültig?

was ist wenn ich die variable in der funktion in einem loop definiere. wird sie dann bei jedem durchlauf neu angelegt, so dass ich irgendwann einen speicherüberlauf habe?

wieso kann ich void funktionen manchmal nicht aufrufen, sondern nur wenn ich static davor schreibe? was genau bewirkt static.

merci
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.01.2004, 16:36 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~macintosh postete
wenn ich eine variable in einer funktion definiere, ist sie dann in der ganzen funktion gültig?


Allgemein gesprochen ist eine Variable ab dann nutzbar, wenn man sie deklaraiert hat bis zum ende des umgebenden Gültigkeitbereich. Wenn es keine gloable Variable ist, dann Endet die Gültigkeit mit der entsprechenden geschweiften Klammer zu. Folgender Quelltext:

C++:
int global;

// Stelle 1:

void function()
{
// Stelle 2:

   int local1;

// Stelle 3;

   if/do/oder was auch immer
   {
// Stelle 4
       int local2;
// Stelle 5
   }
// Stelle 6
}
// Stelle 7


An Stelle 1 : Nur Variable "global" ist gültig/sichtbar
An Stelle 2 : Nur Variable "global" ist gültig/sichtbar
An Stelle 3 : Variablen "global" und " local1" sind gültig/sichtbar
An Stelle 4 : Variablen "global" und " local1" sind gültig/sichtbar
An Stelle 5 : Variablen "global", "local1" und " local2" sind gültig/sichtbar
An Stelle 6 : Variablen "global" und " local1" sind gültig/sichtbar
An Stelle 7 : Nur Variable "global" ist gültig/sichtbar

In der Regel wird Dich der Compiler daraufhinweisen, wenn du da was falsch machst, weil er die Variable selbst nicht findet.
In einer for/while Schleife kann man auch eine Variable definieren, die verhält sich dann wie local2. Der VC6 hat da einen Bug, der die Gültigkeit von local2 bis stelle6 hinausverlängert.

Bearbeitung:

Gmeint ist folgendes:

C++:
  . ..
  for(int i = 0; i<10; ++i)
  {
  }
  ...
  // i ist noch immer gültig!


Dieses Verhalten wird von MS als Feature verkauft, allerdings hebelt es die Standardconformität komplett aus-



Zitat:
~macintosh postete
was ist wenn ich die variable in der funktion in einem loop definiere. wird sie dann bei jedem durchlauf neu angelegt, so dass ich irgendwann einen speicherüberlauf habe?


Nein, weil die alte Variable ja gelöscht wird. Es sei denn, du belegst den Variableninhalt mit einem von new/malloc/calloc/realloc zurückgegebenen Wert. Dann mußt du ihn freigeben.

Zitat:
~macintosh postete
wieso kann ich void funktionen manchmal nicht aufrufen, sondern nur wenn ich static davor schreibe? was genau bewirkt static.


WEil Du vielleicht keine normale Funktion benutzen willst, sondern eine Methode (also eine Funktion, die Mitgleid eine Klassendefinition ist). Ka. Meghr Code.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 21.01.2004 um 16:46 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.01.2004, 16:40 Uhr
typecast
aka loddab
(Operator)


Zu
1.) Eine Variable ist nur in dem Block gültig, in dem du sie Deklariert hast. Ein Block ist ein Programmteil zwischen { und }. Hier ein Beispiel

C++:
void funktion()
{
  int a = 0; // ab hier kannst du a benutzen
  a++;
  {
     int a = 2;  // das geht auch. Innerhalb dieses Blocks gilt die neue Variable a mit dem Wert 2
                   // ist aber verdammt schlechter Stil
  }
  // hier ist a dann wieder 1
  int b = 0;  // ab hier kannst du dann b benutzen
}
// hier sind a und b nicht mehr bekannt


Noch eine kleine Anmerkung: Mit C kannst du die Deklaration int b an dieser Stelle nicht machen, das geht nur unter C++. In C müssen alle Variablen nach einer öffnenden geschweiften Klammer vor der ersten Anweisung (im Bsd a++) stehen.

2.) Variablen in einer Funktion werden auf dem Stack angelegt, wenn du die Funktion (oder auch den Codeblock) verlässt, dann wird auch die Variable gelöscht. Das Problem kannst du nur dann bekommen, wenn du eine Funktion rekursiv aufrufst.

3.) Hab ich noch nie gesehen. Gib mal bitte ein Beispiel.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.01.2004, 16:40 Uhr
typecast
aka loddab
(Operator)


Sch*** zu spät
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.01.2004, 16:59 Uhr
~macintosh
Gast


ok danke erstmal. hab das soweit verstanden. das mit dem static versteh ich auch nich, aber auf jeden fall funktionierts jetzt erst mal.

also haut rein jungs!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: