Beiträge von Goldkiller

    Was sagt dir das denn ?
    Genau,das hier ist nicht wahr.
    while(mysql_fetch_row(Query))
    {
    sscanf(Query,"e<p<|>{i}s[32]s[24]iiiiiiis[34]iiiiiiiiiiiiiiiiii>",PlayerInfo[playerid]);
    }
    Wieso es nicht wahr ist,musst du zurück verfolgen.


    Zitat

    mysql_query("SELECT * FROM `accounts` WHERE `Name` = '%s'",PlayerInfo[playerid][pName]);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'


    Du musst auch das Query vorher formatieren.mysql_query kann nicht das,was format kann.

    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


    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;
    }

    Zitat

    4.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.



    *

    Spoiler anzeigen

    #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()
    {

    Zitat
    Spoiler anzeigen

    5.pwn(9) : warning 203: symbol is never used: "b"


    Goldkiller.

    Am besten du lässt dir mal das Query über print ausgeben und führst es manuell an deiner Datenbank / Tabelle aus ( phpmyadmin o.Ä ).
    print(query);
    Eventuell siehst du dann ja, dass irgendein Parameter falsch ist.

    Erst möglich wenn du den dazugehörigen Code postest.
    Am besten du markierst auch du Zeilen in denen der Fehler auftritt.


    Ansonsten,

    Zitat

    error 001: expected token: ")", but found ";"

    Meistens ist Version 2 von etwas aktueller als Version 1 ;).
    Somit auch SSCANF V2,was als Plugin angeboten wird.


    sscanf(Query, "p<|>iiffffiiiii", BuyInfo[i][ ID ] , BuyInfo[i][ Preis ] , ....);
    Wieso machst es nicht so,anstatt direkt über die Enumeration zu gehen ? Der direkte scan auf eine Enumeration ( so wie du es vorher hattest ) geht auch nur mit der Plugin Version von SSCANF.
    Da muss nämlich auch alles passen von der Reihenfolge, vollständig!

    Das ist nichts ungewöhnliches JumperKenny.


    Zitat

    1134.621 | 13.4 | 180.0
    1134.620971 | 13.399999 | 180.000000


    Ob 1134.621 oder 1134.620971 , 13.4 oder 13.399999 macht am Ende von der Position keinen Unterschied. Das sind in der Theorie nur mm die dort nicht exakt sind. Du kriegst es aber auch nicht exakter. Liegt nämlich daran wie eine Gleitkommazahl gespeichert wird.



    printf("%s | %s | %s",vx,vy,vz);
    printf("%.2f | %.2f | %.2f",floatstr(vx),floatstr(vy),floatstr(vz));
    So lässt du auf 2 Nachkommastellen Runden. Eventuell hilft dir das zumindest bei der Ausgabe etwas. Das oben genannte Problem besteht aber immernoch.

    Die Funktion ist ja auch total umständlich gemacht :/. Total umständliche Lösung wo ich auf den ersten Blick nicht mal wirklich durchblick(t)e.
    Es wird erst der Erste Punkt "." aus der IP gelöscht und nachträglich wieder eingefügt, was ist das denn für ein Quatsch :wacko: .


    Zitat

    Ich versteh nicht wiso habe die Tabelle auf VARCHAR eingestellt


    Auf was denn sonst ? Varchar oder Text ist für eine IP schon logisch.


    Spoiler anzeigen

    Hier eine Lösung die man auch versteht:
    stock SplitIP(const IP[]) {
    new
    i,
    j,
    split[] = "XXX.XXX. ";
    i = strfind( IP , "." );
    j = strfind( IP , "." , .pos = i + 1 );
    if( i != -1 && j != -1 ) {
    strmid( split , IP , 0 , j + 1 );
    }
    return split;
    }

    switch(count)
    {
    case 0: z = GetVehicleSeats(vehicleid);
    case 1: z = ((GetVehicleSeats(vehicleid))-1);
    case 2: z = ((GetVehicleSeats(vehicleid))-2);
    case 3: z = ((GetVehicleSeats(vehicleid))-3);
    case 4: z = ((GetVehicleSeats(vehicleid))-4);
    case 5: z = ((GetVehicleSeats(vehicleid))-5);
    case 6: z = ((GetVehicleSeats(vehicleid))-6);
    case 7: z = ((GetVehicleSeats(vehicleid))-7);
    case 8: z = ((GetVehicleSeats(vehicleid))-8);
    }

    Wie wäre es mit "GetVehicleSeats(vehicleid) - count" ?


    for(new i; i<GetMaxPlayers(); i++)
    So würde ich niemals GetMaxPlayers() nutzen. Schau mal hier.


    Die Fahrzeuge fangen erst ab ID 1 an,nicht 0.

    Wenn du schon per SetTimerEx einen Parameter übergibst,dann nutz den doch auch ;).
    xxxx[playerid] = SetTimerEx("xxx",1500,1,"i",playerid);
    Du übergibst an die Funktion xxx einen Wert als Parameter, in diesem Fall playerid. Diesen kannst du dann auch in der Funktion xxx Nutzen:


    public xxx(uebergabeid) {
    // usw
    }
    uebergabeid wäre der Wert,der per SetTimerEx ( playerid ) an die Funktion übergeben wurde.



    Du könntest aber auch ( Methode 2 ) lediglich 1 Timer nutzen ( SetTimer ), diesen einmalig bei OnGameModeInit bzw Filterscript und dann wie du es jetzt hast eine Schleife nutzen. Dann bräuchtest du nicht jedes mal einen neuen Timer zu erstellen,wie du es jetzt hast.

    Du brauchst "COUNT(*)" nicht im Query.


    SQL
    SELECT * FROM `Cars` WHERE `Nummernschild` = '%s'


    Wenn du das als Query ausführst, kannst du das Ergebnis in PAWN speichern ( mysql_store_result ) und dann die Anzahl an Zeilen ausgeben lassen,die das Ergebnis hat ( mysql_num_rows ).
    Gibt es 0 Ergebnisse ( num_rows ) , dann ist das Nummerschild noch nicht vergeben. Gibt es 1 Ergebnis ( oder mehr,wäre aber Unlogisch ) , dann ist das Kennzeichen bereits vergeben.
    Nicht vergessen das Ergebnis wieder freizugeben ( mysql_free_result ).



    [hide]Mit dem Query von dead müsstest du zusätzlich mysql_fetch_field ( In dem Fall wäre das Feld "count" , da "AS count" in Query bzw 0 ) verwenden und das Ergebnis noch in einen Zahl umwandeln.Dann wüsstest du erst ob es bereits vergeben ist oder nicht.[/hide]

    Ich habe doch geschrieben,dass du mit dem Rückgabewert von GetPVarString nichts anfangen kannst. Der Grund steht in der Variable pmsg drin. Den kannst du jetzt in die Datei via dini_Set schreiben. Anscheinend hast du dir den Wiki-Eintrag nicht wirklich genau angeschaut :/.