Moinsen Leute,
Heut hab ich mal ein kleines Problem/ eine Frage, und zwar:
Folgender Beispielcode:
Wir haben new array[5][20];
Dieses Array belegen wir in den Index von 0-4 (bsp. array[1] = "blub"; ) mit einem String.
Nun möchte ich es via
CallLocalFunction("blubb","ds",playerid,array);
übergeben
Das Bsp-Public sieht so aus:
public blubb(pid,array[][])
{
for(new i= 0;i<5;i++) SendClientMessageToAll(farbe,array[i]);
}
Nun gibt mir "CallLocalFunction" immer 0 aus, also das Public wird nicht ausgeführt. Wie kann ich multidimensionale Arrays via CallLocalFunction übergeben?
Ein Array via "CallLocalFunction" übergeben?
- RG_
- Geschlossen
- Erledigt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Also ich finde es endlich mal anreizend, dass hier richtige Fragen gestellt werden
Es ist ganz einfach, wofür dir der Parameter 'a' in CallLocalFunction helfen wird. Er deklariert bzw. in diesem Fall eine Meldung, dass ein Array kommt. Nachfolgend zum 'a' kommt ein Platzhalter für einen Integer, also ein 'd' der die Gesamtgröße des Array´s übermittelt. Ein Beispiel für ein ein-dimensionales Array:
new string[128] = "Hallo, Willkommen auf unserem Server";
CallLocalFunction("WelcomeText", "ad", string, sizeof(string)); //sizeof(string) wiedergibt 128, also die Gesamtgrößte.Beachte auch, dass wenn du das Feld string (im obigen Beispiel) leer lässt, da er anhand der direkten Eingabe die Größe der Eingabe berechnen kann ist es auch wichtig, dass du dann den Array Global Initialisieren musst, denn ansonsten entsteht ein Kompiler Fehler.
Und nun schauen wir uns ein zwei-dimensionales Array an:
new multistring[5][128] = {"Hallo Joe wie gehts dir?", "Mir gehts gut danke, und dir?", "Altah wat für ne Frage..", "Kleine Spaltung in der Persönlichkeit?", "Guten Morgen :D"}; //Ich nenne ihn einfach multistring, keine Ahnung warum ^^
CallLocalFunction("WelcomeText", "ad", multistring, sizeof(multistring) * sizeof(multistring[])); //Es wird nun auch die Größe vom 2. Array per sizeof(multistring[]) ermittelt und mit der 1. Arraygrößte multipliziert, womit wir die Gesamtgröße erhalten.Bei einem drei-dimensionalem Array sieht es nun kurz gezeigt dann so aus:
new uberstring[5][20][128]; //Ich definiere nun direkt keinen Text dafür, da es zu viel Aufwand wäre ^^
CallLocalFunction("WelcomeText", "ad", uberstring, sizeof(uberstring) * sizeof(uberstring[]) * sizeof(uberstring[][]));//EDIT: Kleiner Fix, da ich mich vertan habe, Sry
-
Ok vielen Dank erstmal. Es funktioniert auch soweit, nur erhalte ich lediglich 2 der, mithilfe von for(new u = 0;u<5;u++) SendClientMessageToAll(GREEN,params[u]);
ausgegebenen Werte. Der Rest scheint leer zu sein, was aber nicht sein kann, da ich zuvor (also vor "CallLocalFunction") mir ebenfalls die Werte via derselben for-Schleife ausgeben lasse.
Hier das Public:
public blubb1(params[][]){
for(new u = 0;u<5;u++) SendClientMessageToAll(ROT,params[u]);
return 1;
}
Wie rufe ich es auf? So:
return CallLocalFunction(cmdtext,"ad",params, sizeof(params) + sizeof(params[]) + 4);
params ist hierbei so deklariert:
new params[5][20]; -
So entschuldige, leider hab ich mich gestern irgendwie verdacht. Nicht addiert, sondern multipliziert müssen die 2 Array Größen. Und das zzgl. addieren von Zahlen kann man (egal ob String oder ein anderer Datentyp) weglassen.
Tut mir echt leid
return CallLocalFunction(cmdtext,"ad",params, sizeof(params) * sizeof(params[]));
-
Perfekt, funktioniert 100% :]
Danke
Noch ne Frage am Rande:
Was ist schneller? eine for-Schleife bis 100, oder eine while-Schleife bis 100?
Also Bsp:
for(new i=0;i<100;i++)
{
//blabla blubb
}new i=0;
while(i <= 100)
{
//blabla blubb
i++;
} -
Ehrlich gesagt ist da nun nicht die Frage von der Schnelligkeit, sondern vom verwenden her. Denn Schnell sind eigentlich beide
Ich meine, wenn du bei einer FOR-Schleife ein continue verwendest, so wird trotzdem die variable, jene du im 3. Parameter stets editiert, weiter gezählt.
Wenn du nun bei einer WHILE-Schleife ein continue verwendest, so müsstest du vor dem continue noch selber eine Zeile setzen, dass die Variable verändert wird, ansonsten entsteht ein Dauer-Loop.
Natürlich gibt es auch andere Beispiele, wo ein WHILE besser ist, als ein FOR, wie bei einer von vielen mySQL Funktionen, wo die Funktion solange true wiedergibt, bis es keine Zeilen mehr gibt und daher am Ende false wiedergibt ^^.
Nebenbei eine kleine Anmerkung, bei deiner obigen FOR-Schleife wird von 0 bis 99 gezählt und bei deiner obigen WHILE-Schleife von 0 bis 100. Keine Ahnung ob dir dies bekannt war, wollts nur so zu meinem Roman anhängen.
-
breadfish.de
Hat das Thema geschlossen.