Kleines Problem mit Float-Werten

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
  • Guten Tag Scripter, ich danke jedem der sich diesen Thread durchliest und versucht mir zu helfen.


    Ich muss nun leider die Hilfe anderer beanspruchen. Da ich ja eigentlich der Typ bin der jeden Fehler selbst herausfindet. Aber da ist mein Wissen überfragt.


    Ich arbeite mit meinem Server-Skript über MySQL-Verbindung und versuche gerade alle Werte aus der Tabelle Fahrzeuge auszulesen. Jeweils hab ich da ein paar Probleme mit den Float-Variablen.


    Ich habe es versucht die x, y, z und Roation-Koordinaten zuerst als Float in der Tabelle(in der Datenbank) zu speichern. Jedoch gabs da einige Probleme beim auslesen mit mysql_fetch_float. Somit hab ich es auf VARCHAR umgeändert. Nun funktioniert ja auch einigermaßen. Jedoch gibts da immernoch ein Problem.



    stock Fahrzeuge() {
    new id[11], name[10], typ[3], x[9], y[9], z[9], r[9], farbe1[3], farbe2[3];
    new id2, typ2, farbe3, farbe4;
    mysql_query("SELECT * FROM fahrzeuge");
    mysql_store_result();
    while(mysql_num_rows()) { // Soll alle Zeilen in der Tabelle durchgehen
    mysql_fetch_field("ID", id); // 0
    id2 = strval(id);
    mysql_fetch_field("Name", name); // LSPD
    mysql_fetch_field("Typ", typ); // 598
    typ2 = strval(typ);
    mysql_fetch_field("X", x); // 1570.2747, wird als String übernommen
    mysql_fetch_field("Y", y); // -1711.347
    mysql_fetch_field("Z", z); // 5.6106
    mysql_fetch_field("R", r); // 359.279
    mysql_fetch_field("Farbe1", farbe1);
    farbe3 = strval(farbe1);
    mysql_fetch_field("Farbe2", farbe2);
    farbe4 = strval(farbe2);
    printf("%i, %f, %f, %f, %f, %i, %i", id2, floatstr(x),floatstr(y),floatstr(z),floatstr(r), farbe3, farbe4); // Meine Ausgabe
    AddStaticVehicleEx(typ2,floatstr(x),floatstr(y),floatstr(z),floatstr(r),farbe3,farbe4,-1); // Fahrzeug sollte hier erstellt werden mit den Koordinaten
    SetVehicleNumberPlate(id2, name); // Fahrzeug mit einem neuer Schildnummer ausstatten
    }
    mysql_free_result();
    }



    Ich hab mir die Ausgabe ausgeben lassen und es kommt raus 0, 1570.274650, -1711.347045, 5.610599, 359.276885, 53, 15.
    Weiters steht auch 0 Vehicles auf dem Server. Also wird auch nicht erstellt. Brauche eure Hilfe bitte :wacko:


    Ich rufe die Methode Fahrzeuge() bei OnGameModeInit() auf. Ich möchte damit alle Fahrzeuge die ich in der Tabelle drinnen stehen habe respawnen. Also dynamisch erzeugen :)


    Wenn ihr dazu noch Fragen habt bitte melden.

    Die Macht etwas zu bewirken, ist in Dir. Du musst sie nur rauslassen


    cristiano-ronaldo-525-portugal-euro-2012-banner-wallpaper.jpg

  • AddStaticVehicleEx(typ2,floatstr(x),floatstr(y),floatstr(z),floatstr(r),farbe3,farbe4,-1); // Fahrzeug sollte hier erstellt werden mit den Koordinaten
    SetVehicleNumberPlate(id2, name); // Fahrzeug mit einem neuer Schildnummer ausstatten

    Du solltest SetVehicleNumberPlate auf die vehicleid beziehen,die dir von AddStaticVehicle zurückgegeben wird.
    printf("%i, %f, %f, %f, %f, %i, %i", id2, floatstr(x),floatstr(y),floatstr(z),floatstr(r), farbe3, farbe4); // Meine Ausgabe
    Lass dort noch zusätzlich die ModelID ( typ2 ) ausgeben. Versuch auch mal damit zu debuggen.
    printf("DEBUG: AddStaticVehicleEx = %d", AddStaticVehicleEx(typ2,floatstr(x),floatstr(y),floatstr(z),floatstr(r),farbe3,farbe4,-1) );

  • Oha der gibt diese Zeile gerade unendlich Mal aus also Endlosschleife 8|


    Es sollte eigentlich nur einmal ausgegeben werden, weil es ja nur eine Zeile in der Tabelle ist :wacko:


    Wie funktioniert denn das richtig ?(


    Aber aufjedenfall danke für deine Antwort.

    Die Macht etwas zu bewirken, ist in Dir. Du musst sie nur rauslassen


    cristiano-ronaldo-525-portugal-euro-2012-banner-wallpaper.jpg

  • Okay,
    while(mysql_num_rows()) { // Soll alle Zeilen in der Tabelle durchgehen <-- macht es aber nicht.
    Angenommen du hast eine Zeile,gibt mysql_num_rows() dir immer 1 zurück.Daher ist die while() Bedingung immer wahr,daher auch die Endlosschleife.


    Du musst die aktuelle Zeile auslesen und die "markierte" Zeile weiter schieben.
    Heisst du startest beim lesen in Zeile 1. Ist Zeile 1 vorhanden ließt du sie und der Leseindex wird auf 2 gesetzt.Nun willst du Zeile 2 auslesen. Ist diese vorhanden, wird sie ausgegeben und der Leseindex wandert wieder einen weiter bis es an einen Leseindex stößt, wo kein Eintrag vorhanden ist.
    Müsste diese Funktion sein,
    http://wiki.sa-mp.com/wiki/MySQL_Plugin#mysql_fetch_row


    Die Funktion müsste die Zeile prüfen und gibt gegenfalls 1 oder 0 zurück und bewegt dann den Leseindex weiter.
    Leseindex ist vllt nicht der richtige Begriff, lässt sich aber denk ich damit gut verstehen.

  • Ja stimmt, wirklich dummer Fehler :wacko: Danke


    So habs jetzt mal so probiert.


    EDIT: Das vorige was in dem Post stand war ja völliger Blödsinn :D


    So nun hab ich es richtig.


    stock Fahrzeuge() {
    mysql_query("SELECT * FROM fahrzeuge WHERE ID=0");
    new result[200];
    new id, name[128], typ, x[128], y[128], z[128], r[128], f1, f2;
    mysql_store_result();
    while(mysql_fetch_row(result)) {
    sscanf(result,"p<|>isiffffii",id, name, typ, floatstr(x), floatstr(y), floatstr(z), floatstr(r), f1, f2);
    printf("%f - %f", floatstr(x), floatstr(y));
    printf("DEBUG: AddStaticVehicleEx = %i", AddStaticVehicleEx(typ,floatstr(x),floatstr(y),floatstr(z),floatstr(r),f1,f2,-1) );
    AddStaticVehicleEx(typ,floatstr(x),floatstr(y),floatstr(z),floatstr(r),f1,f2,-1);
    }
    }


    Ich hab mir jetzt jeden einzelnen Wert ausgeben lassen. Lustigerweise gibt jeder Wert der übernommen wird 0 aus. Wenn es die richtigen Daten auslesen würde, würde es gehen. Denn ich habe unten statt typ mal 598 eingesetzt und es wurde gespawned :D


    Wieso werden alle Werte als 0-Wert übernommen. :wacko:

    Die Macht etwas zu bewirken, ist in Dir. Du musst sie nur rauslassen


    cristiano-ronaldo-525-portugal-euro-2012-banner-wallpaper.jpg

    Einmal editiert, zuletzt von Austrianer ()

  • Was du dort gerade machst ist irgendwie unvorteilhaft. Bist du dir denn übrigens sicher,dass du das Plugin von Strickenkid benutzt?
    mysql_query gibt kein Array zurück sondern nur folgendes:

    Zitat

    Returns 0 on success, error code (non-zero) on fail.


    Daher ist ein Array ( query ) überflüssig bzw du müsstest dort den Index angeben. zB würde folgendes funktionieren:
    query[4] = mysql_query( ... ); // In index 4 Wert ablegen


    Schau dir mal dieses Beispielscript an:
    http://www.strickenkid.com/mysql_plugin/example.pwn
    Dort siehst du,wie mysql_fetch_row genutzt wird.


    //Edit:
    Dann halt so,
    mysql_query("SELECT * FROM fahrzeuge WHERE ID=0");
    Wieso WHERE ?
    mysql_query("SELECT * FROM fahrzeuge");
    Du benutzt auch sscanf total falsch :/.
    new id, name[128], typ, Float:x, Float:y, Float:z, Float:r, f1, f2;
    sscanf(result,"p<|>isiffffii",id, name, typ, x, y, z, r, f1, f2);
    Du kannst sowieso kein floatstr in sscanf benutzen... Jedenfalls macht es kaum einen Sinn. Je nachdem welche sscanf Version du nutzt,musst du bei s auch die Arraygröße angeben.

  • Das mit dem Where = 0 hab ich jetzt nur zum Testen gemacht. Wird eh verändert :D


    stock Fahrzeuge() {
    new result[200], id[128], typ[128];
    new id2, name[128], typ2;
    mysql_query("SELECT * FROM fahrzeuge WHERE ID=0");
    mysql_store_result();
    while(mysql_fetch_row(result)) {
    mysql_fetch_field("ID", id);
    id2 = strval(id);
    mysql_fetch_field("Name", name);
    mysql_fetch_field("Typ", typ);
    typ2 = strval(typ);
    printf("%i - %s - %i", id2, name, typ2); // Ausgabe: 0 - LSPD - 598 ~~~ Genau wie ich es wollte :D
    }
    mysql_free_result();
    }


    Habs jetzt so getestet. Und JUHU es hat endlich geklappt. Ich hab das von strickenkid ausprobiert. Jedoch leider ohne Erfolg. Die split()-Methode hat nicht funktioniert :S


    Egal jetzt hab ich es so.


    Jetzt muss ich nur noch herausfinden, wie ich die Anzahl der Einträge in einer Tabelle herausfinden. Aber ich denke das geht schon mit mysql_num_rows.


    Aber danke dir für deine große Hilfe :)


    Mfg

    Die Macht etwas zu bewirken, ist in Dir. Du musst sie nur rauslassen


    cristiano-ronaldo-525-portugal-euro-2012-banner-wallpaper.jpg