Return value einer funktion
-
Nach dem Standard müsste es gehen, aber MSVC++ ist bekanntlich nicht gerade einer der standardkonformsten Compiler ...
-
2 fragen:
1. wilst du was überhaupt zurückgeben?
wenn ja post was genau, dann schreib ich dir ne lösung,
wenn nein:
lasss das "return irgendwas" aus.
also:
void DoSeomthing()
{// do something aber kein return schreiben da du wegen void
// (das nichts) auch nix zurückgibst.
}2. Hast du ne ahnung warum mein Update auf die DB nicht klappt, lass ich die Where klausel aus wird der erst geändert. das where statement habe ich auch überprüft scheint nix falsches zu sein, ich kann n#mlich auch die spalteninhalte auslesen und die sind korrekt...
-
da war ich mir zu sicher bei der ersten Antwort...habe gerade im Standard nachgesehen (und wenn Stroustrup das schreibt ist es ein zusätzliches Indiz), es ist dem Standard nach korrekt. Da ich aber ein solches Konstrukt noch nie benötigt habe, bin ich darüber auch nie gestolpert...es bleibt wohl nichts anderes übrig, als z.B. die Deklaration der Funktion zu ändern, und sie einen Typ (dummy-Wert) zurückgeben zu lassen, oder die Funktion anderweitig umzuschreiben.
MfG
-
Man muss sowas ja nicht machen, z.b. kann man folgenden Code ganz einfach umschreiben:
void f(); void g() { return f(); } // g umschreiben in: void g() { f(); return; // kann man hier weglassen, aber manchmal vielleicht auch nicht }Das zurückgeben von void-"Werten" wurde AFAIK wegen Templates in den Standard aufgenommen, so dass eine Funktion vom Typ T grundsätzlich einen Wert vom Typ T zurück geben kann, auch wenn T mit void instantiiert wird.
-
An alle schrieb:
Nach dem Standard müsste es gehen, aber MSVC++ ist bekanntlich nicht gerade einer der standardkonformsten Compiler ...
... und was bringt die Konstruktion?

Da steige ich nicht durch.
Grüße, Berlins letzter Stadthalter...
-
ok, bashers loesung funktioniert, damit ist das problem geloest.
haette aber noch eine frage
und moechte keinen neuen thread eroeffnen.void foo () { for ( int i = i; i < MAX; ++i ) { //... } // hier endet doch der scope von i? for ( int i = i; i < MAX; ++i ) { //... } // hier sagt er aber i wurde redeklariert };normalerweise endet doch der scope von i schon vorher und deswegen ist es doch keine redeklaration?
p.s.:ich benoetige solche konstrukte z.b. fuer die menus in meinen projekten, wie z.b.:
//definition vom main menu void main_menu () { // bla bla // dann kann man natuerlich auswaehlen wies weiter geht :rolling_eyes: // waehlt man, nur als beispiel, punk 1 kommt man zur benutzerverwaltung // welche auch mit der selben struktur aufgebaut ist if ( choice == ACCOUNT ) return account_menu (); // account_menu ist als void account_menu () deklariert else if ( coice == was_auch_immer ) return was_auch_immer_menu (); // ...nur mal so als beispiel.
und noch ne dumme frage
wenn ich bei meinem projekt release waehle und auf ok druecke ist es gleich wiede die debug version. wie kann ich das einstellen, dass es auch debug bleibt?was auch immer
-
Bashar schrieb:
Das zurückgeben von void-"Werten" wurde AFAIK wegen Templates in den Standard aufgenommen, so dass eine Funktion vom Typ T grundsätzlich einen Wert vom Typ T zurück geben kann, auch wenn T mit void instantiiert wird.
ah ja, das war das fehlende Glied in meiner (Gedanken-)Kette bezüglich Notwendigkeit dieses Konstrukts, und VC++/Standard-Konformität im Template-Bereich ist ja dann das passende Stichwort.
MfG
-
was auch immer schrieb:
normalerweise endet doch der scope von i schon vorher und deswegen ist es doch keine redeklaration?
ja, das ist auch eine "Schwäche" im VC++, im Standard ist es ok. Für dieses Problem gibt es allerdings von Microsoft empfohlene work-arounds hier:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;167748
MfG
-
hab das mit dem ms link versucht.ich mach ein haeckchen bei Disable Language Extensions und drueck auf ok, aber die einstellungen werden nicht uebernommen, genauso, wenn ich von debug auf retail wechseln will, es passiert nichts.
hoffe jemand weiss, was ich falsch mache,
was auch immer
-
2 kleine fragen meinerseits, vielleicht denke ich grad auch nicht so gerade aus und versteh irgend etwas offensichtliches nicht.
zur for-schleife:
wieso benutzt man dann nicht einfach das i aus der ersten schleife, den richtigen startwert muss man natürlich eintragen.
zur rückgabe von void:
also wenn der code gaaaanz am anfang dieses artikels wirklich eine rekursive funktion darstellt, vielleicht mag vc++ es deswegen nicht?
mfg floh
-
Floh schrieb:
zur for-schleife:
wieso benutzt man dann nicht einfach das i aus der ersten schleife, den richtigen startwert muss man natürlich eintragen.
kann man natürlich, aber wenn man viel Code hat, in dem man "standardgemäß" programmiert hat, müßte man evtl. sehr viel ändern, da ist ein einfacher workaround wie dieser natürlich immer willkommen.
Floh schrieb:
zur rückgabe von void:
also wenn der code gaaaanz am anfang dieses artikels wirklich eine rekursive funktion darstellt, vielleicht mag vc++ es deswegen nicht?
VC++ akzeptiert keine Art von Rückgabe eines void-Ausdrucks über return in einer void-Funktion, die Rekursion hat hier nur zufällig das Problem deutlich gemacht.
@was auch immer:
dann stimmt irgendetwas mit deiner Konfiguration nicht. Vor allen Dingen sollte der Wechsel von Debug- auf Release-Konfiguration funktionieren. Wird denn wenigstens sichtbar der Modus gewechselt (ist also im Ausgabe-Fenster "Konfiguration Projektname - Release" zu sehen als erste Zeile?)? Was meinst du, daß bei dir dann "nichts passiert"?
MfG
-
ist also im Ausgabe-Fenster "Konfiguration Projektname - Release" zu sehen als erste Zeile?
eben nein.dort steht immer noch debug, aber vieleicht mach ich das falsch.ich mach es naemlich folgendermassen:
workspace -> projektname files -> rechtsklick -> settings -> win32 debug auf win32 release umstellenwas auch immer
-
..hmmm...also ich gehe meistens über "Erstellen"->"Aktive Konfiguration festlegen", "Projektname-Win32 Release" selektieren, OK klicken, kompilieren...
MfG
-
Probe-Nutzer schrieb:
..hmmm...also ich gehe meistens über "Erstellen"->"Aktive Konfiguration festlegen", "Projektname-Win32 Release" selektieren, OK klicken, kompilieren...
MfG
das wars. ich hab immer rechtsklick auf projekt und dort unter einstellungen versucht was zu aendern

danke fuer eure hilfe,
was auch immer
-
Dann defiiere dein for neu. Ist dort auch beschrieben.