Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst] i++
- - By Serpens66 (More than 200 posts.) Date 27.09.2015 18:53 Edited 27.09.2015 19:07
wenn ich folgenes schreibe:

var def_num, def;
while (def = GetDefinition(def_num++))


wird im ersten Durchlauf dann GetDefinition(0) oder GetDefinition(1) ausgeführt? Also wird def_num vorher, oder hinterher ausgeführt? (Ich nehme an, dass ++def_num und def_num++ dasselbe bedeutet, oder? )

Ich hab nämlich das Gefühl, dass GetDefinition(1) ausgeführt wird, wodurch ja die erste definition bei 0 ausgelassen werden würde, oder?

edit:
habe es mal mit def_num=-1 zu beginn ausgeführt, und das hat nichts gefunden, weshalb obige Frage wohl mit GetDefinition(0) zu beantworten ist.
Auf die Frage bin ich gekommen, weil
var idBase = DefinitionCall(idDef,"GetResearchBase"), fHasBase, j;
fHasBase = !idBase || GetPlrKnowledge(iPlr,idBase); j=1;
// Erweiterte Forschungsgrundlagen
while (idBase = DefinitionCall(idDef, Format("GetResearchBase%d", ++j)))
   if (!GetPlrKnowledge(iPlr,idBase)) fHasBase=0;

aus dem forschungslabor skript nichts bei GetReserchBase1() bewirkt hat... aber vllt wars auch ein anderer Fehler, ich teste nochmal...
Parent - - By Luchs (More than 1000 posts.) Date 27.09.2015 19:04 Edited 27.09.2015 19:09 Upvotes 1
Variablen werden implizit mit 0 initialisiert. Also `var def_num;` ist dasselbe wie `var def_num = 0;`.

>Ich nehme an, dass ++def_num und def_num++ dasselbe bedeutet, oder?


Nein! Der subtile Unterschied liegt im Rückgabewert: `foo++` gibt den Wert von `foo` vor dem Erhöhen zurück, `++foo` den Wert nach der Addition. In deinem Beispiel wird `GetDefinition` also tatsächlich mit den Werten 0, 1, 2, ... aufgerufen. Mit `++def_num` wäre es stattdessen 1, 2, 3, ...

Diese Unterscheidung kommt aus C, wo es hauptsächlich praktisch ist, wenn man kompakten Code mit Pointern schreiben will. Viele neuere Sprachen unterstützen dieses Konstrukt nicht mehr, weil es einerseits durchaus verwirrend ist und zu subtilen Fehlern führen kann, und andererseits die Optimierer mittlerweile gut genug sind, solche Konstrukte auch zusammenzufassen, wenn sie über mehrere Zeilen geschrieben sind.

Edit: Mit der Erklärung oben kannst du auch das Problem in deinem "Edit" finden. Wenn du es nicht siehst, frag nochmal nach :)
Parent - - By Serpens66 (More than 200 posts.) Date 27.09.2015 19:10
aaah. gut dann ist das mein Fehler gewesen, dass ich dachte i++ und ++i wäre dasselbe!  Aus der Doku habe ich das nicht rauslesen können.. =/  Aber gut zu wissen! :)  (man sollte bei der doku auch die dazugehörigen Erklärungen lesen, da stehts doch :D )

Das heißt ja dann, bezüglich meines hinzueditierten Beispiels, dass dort dann tatsächlich mit j=2 angefangen wird? (weil j=1 zu beginn ist).
Das ist wie gesagt aus dem originalen Forschungslabor Skript.  Man muss also mit GetResearchbase2() anfangen, wenn man auf diese Weise mehr als eine Base zufügen will?
Parent - By Luchs (More than 1000 posts.) Date 27.09.2015 19:21 Edited 27.09.2015 19:23 Upvotes 1

>Aus der Doku habe ich das nicht rauslesen können.


[Hier](http://clonk.de/docs/de/sdk/script/operatoren.html#opppmm) ist es beschrieben. Ist aber zugegebenermaßen etwas verwirrend durch die Verwendung der `Var()`-Funktion.

>Man muss also mit GetResearchbase2() anfangen, wenn man auf diese Weise mehr als eine Base zufügen will?


Sieht so aus. Macht auch ein bisschen Sinn, weil das erste ja einfach keine Zahl hintendran hat.
Up Topic Deutsch / Hilfestellung / [Gelöst] i++

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill