Der Mythos "stock"
Ein Tutorial zu dem Wort "stock"? Was will der euch denn erzählen ?
Klingt erst mal ganz schön sinnlos,da ihr ja wisst wofür stock steht. Ich muss euch da aber enttäuschen,da grob geschätzt über 90% nicht wissen,wofür stock eigentlich in Bezug auf PAWN bzw Funktion / Variablen* steht.
Es kommt hier im Forum sehr häufig vor,dass eine große Anzahl an Usern den Begriff "stock" mit "Funktion" verwechselt oder es einfach nicht besser weiss. Um diesem Fehler mal endlich aufzulösen,gibt es dieses kleine Tutorial.
Ich zitiere mal aus der pawn-lang.pdf
ZitatAlles anzeigenStock functions
A “stock” function is a function that the pawn parser must “plug into”
the program when it is used, and that it may simply “remove” from the
program (without warning) when it is not used. Stock functions allow a
compiler or interpreter to optimize the memory footprint and the file size of
a (compiled) pawn program: any stock function that is not referred to, is
completely skipped —as if it were lacking from the source file.
A typical use of stock functions, hence, is in the creation of a set of “library”
functions. A collection of general purpose functions, all marked as “stock”
may be put in a separate include file, which is then included in any pawn
script. Only the library functions that are actually used get “linked” in.
To declare a stock function, prefix the function name with the keyword
stock. Public functions and native functions cannot be declared “stock”.
When a stock function calls other functions, it is usually a good practice to
declare those other functions as “stock” too —with the exception of native
functions. Similarly, any global variables that are used by a stock function
should in most cases also be defined “stock”. The removal of unused (stock)
functions can cause a chain reaction in which other functions and global
variables are not longer accessed either. Those functions are then removed
as well, thereby continuing the chain reaction until only the functions that
are used, directly or indirectly, remain.
Den wichtigen Teil habe ich oben fett markiert.Für diejenigen die es selber nicht ins Deutsche übersetzen können,es heißt soviel wie:
Eine stock Funktion wird vom Pawn Parser in das Programm eingefügt wenn es benutzt wird oder es wird einfach "entfernt" vom Programm,
sofern es nicht genutzt wird.
Jede stock Funktion die nicht aufgerufen wird, wird komplett ignoriert, so als ob sie im Quellcode nicht existieren würde.
Was heißt das jetzt also konkret. Eine Funktion die mit "stock" markiert wird,ist für den Compiler irrelevant sobald sie im Quellcode nirgendwo
explizit aufgerufen wird. Wird diese Funktion irgendwo im Quellcode aufgerufen, so ist sie identisch zu normalen Funktionen. Es sind also Funktionen,die das Zusatzwort stock erhalten.
Hier zwei Beispiele:
#1
#include <a_samp>
main()
{
foo(1,2);
}
stock foo(a,b) {
printf("(a,b) (%d,%d)",a,b);
return 1;
}
Zitat*.AMX Größe ( 582 Bytes (582 Bytes) )
#2
#include <a_samp>
main()
{
foo(1,2);
}
foo(a,b) {
printf("(a,b) (%d,%d)",a,b);
return 1;
}
Zitat*.AMX Größe ( 588 Bytes (588 Bytes) )
Wie ihr seht,kein Unterschied zu sehen. Es ensteht der ( zumindest von der Größe ) Gleiche Quellcode.Mit einem Hex-Editor könnt
ihr auch gerne den Inhalt vergleichen,es wird auch identisch sein.
Was passiert aber,wenn die Funktion foo nicht genutzt wird ?
Dazu hier zwei weitere Beispiele:
#3
#include <a_samp>
main()
{
}
stock foo(a,b) {
printf("(a,b) (%d,%d)",a,b);
return 1;
}
Zitat*.AMX Größe ( 425 Bytes (425 Bytes) )
#4
#include <a_samp>
main()
{
}
foo(a,b) {
printf("(a,b) (%d,%d)",a,b);
return 1;
}
Zitat4.pwn(12) : warning 203: symbol is never used: "foo"
*.AMX Größe ( 425 Bytes (425 Bytes) )
Wie man sieht,man bekommt hier den Warnhinweis,dass die Funktion foo nicht genutzt wurde.Der Unterschied von Quellcode #3 zu Quellcode #4
ist nur das Wort "stock". Je nachdem ob die Funktion mit stock deklariert wurde, wird die Funktion ( wie oben erwähnt ) vom Kompiler beachtet
oder eben nicht.
Wir werden hier also gewarnt,dass es eine Funktion in unserem Quellcode gibt,die wir nicht nutzen. Es könnte ja sein,dass wir sie ausversehen vergessen haben zu nutzen oder es ein überbleibsel ist.
Es sind also Funktionen,keine Stocks/stocks(!). ( Wenn das Wort "stock" unbedingt auftauchen soll ,dann halt: stock Funktionen )
Ihr könnt diese Funktionen lediglich vom Kompiler ignorieren lassen,sofern sie in eurem Code nicht explizit genutzt wird.
Wenn ihr aber für euch eine Funktion schreibt,werdet ihr sie mit große Wahrscheinlichkeit auch selber nutzen.Wieso würdet ihr diese
denn sonst schreiben ? Da macht das Wort "stock" also gar keinen Sinn.
Natürlich ist es Gewohnheit ( auch bei mir ) ob man es ( stock ) davor schreibt oder nicht,nur macht es absolut keinen Unterschied ob es davor steht oder
nicht.Das Problem ist meiner Meinung nach auch viel mehr die falsche Nutzung des Begriffes "stock". Denn häufig wird das Wort "stock" mit "Funktion" gleich gesetzt,wobei da dann auch ein "Stock" viel besser ist als eine normale Funktion.
Es gibt unzählige Themen,in denen es um Probleme mit "stocks" geht. Es sind Probleme mit Funktionen,nicht mit stocks. Genau so häufig
wird geschrieben, "zeig mal deinen stock". Das stimmt alles nicht,ich wiederhole es nochmal,es sind Funktionen.
Hier mal eines von vielen Beispielen.
Wenn ihr also etwas aus diesem Tutorial mitnehmt,dann folgendes:
Kennzeichnet man Funktionen oder Variablen* mit stock,so sind diese für den Kompilier irrelevant,
sofern sie im Programm/Code nicht genutzt werden.Ihr erhaltet auch keine Warnung,falls diese nicht genutzt werden. Werden sie allerdings genutzt,so sind sie identisch zu normalen Funktionen.
*
#5
#include <a_samp>
new stock a; // <- Wird nie benutzt,vom Kompiler ignoriert da "stock"
new b; // Wird nie genutzt, vom Kompiler als nicht genutzt gemeldet
main()
{
ZitatSpoiler anzeigen 5.pwn(9) : warning 203: symbol is never used: "b"
ZitatAlles anzeigenSpoiler anzeigen A global variable may be declared as “stock”. A stock declaration is one
that the parser may remove or ignore if the variable turns out not to be used
in the program.
Stock variables are useful in combination with stock functions. A public
variable may be declared as “stock” as well —declaring public variables as
“public stock” enables you to declare al public variables that a host application
provides in an include file, with only those variables that the script
actually uses winding up in the P-code file.
Goldkiller.