zahlen in string umwandeln geht nicht

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • zahlen in string umwandeln geht nicht

    moin
    ich habe mit larsi
    bei einem code stunden rum versucht
    aber es hat nie geklappt:
    wir wollten zahlen in einen string umwandeln(ascii) aber weil es mehrere zahlen sind kann man ja nicht
    einfach chr(zahl) machen
    und deswegen haben wir uns dieses fehlerhafte script gemacht
    wo nichts wiedergegeben wird also von return nur ""

    Quellcode

    1. text2=""
    2. zahl=1
    3. do
    4. {
    5. text[zahl]=string_char_at(argument0,zahl)
    6. text2+=text[zahl]
    7. zahl+=1
    8. }
    9. until string_length(argument0)<=zahl
    10. return text2
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ich weiß jetzt nicht genau, was ihr eigentlich vorhattet - "Zahlen in Strings umwandeln" klingt für mich einfach nach string(x); aber ich schätze, ihr wollt dem Skript ein Array voller Bytewerte übergeben, und er soll daraus dann über die ASCII-Zeichen der entsprechenden Werte einen String zusammenbauen.
    Was euer Code tut, ist folgendes:
    Er nimmt einen String als Argument, durchläuft ein Array namens text[zahl] von 1 bis zur Länge dieses Strings und füllt es mit den Zeichen dieses Strings. Außerdem packt er diese Zeichen, ausgelesen aus dem gerade gefüllten Array, in einen weiteren String und gibt den dann am Ende zurück. Das hat mit Zahlen in String umwandeln jetzt nicht wirklich was zu tun (und bei meinem Test funktioniert's auch, schneidet aber wegen dem <= im until-Teil das letzte Zeichen ab). Wenn ich dem Skript allerdings eine Zahl übergebe, kriege ich tatsächlich, wie ihr, einen Leerstring zurück.
    Ich schätze also mal, ihr habt die Funktion string_char_at missverstanden (diese Funktion gibt ein einzelnes Zeichen zurück, das an der gegebenen Position eines gegebenen Strings liegt) und dem Skript eine Zahl statt des erwarteten Strings übergeben.

    Was genau ist denn text[zahl] für ein Array; also was liegt da drin bzw. soll da rein? Das wirkt auf mich, als wär der richtige Gedanke schon da gewesen, aber dann ins Leere gelaufen. ^^
  • also man gibt z.B. als argument
    234
    ein soll da
    2 als chr sein 3 als chr und 4 als chr
    und das alles zusammen soll ...
    ergeben
    ich weis jetzt nicht was 2,3,4 als string ist
    aber ist das so verständlich??
    edit:
    man könnte das auch mit string_copy machen oder?
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von husi012 ()

  • Ja, ist verständlich, aber damit limitiert ihr euch auf die ASCII Codes von 0 bis 9 - und das sind allesamt nicht darstellbare Steuerzeichen. Statt also eine Zahl zu passen und dann Zehnerpotenz für Zehnerpotenz auseinanderzunhemen würd ich euch zu folgender Methode raten:


    Schritt 1: Eine ds_list
    Beim Erstellen einer Datenstruktur wird ja die ID derselben zurückgegeben. Ihr könnt also diese ID über

    GML-Quellcode

    1. global.bytes=ds_list_create();

    in eine globale Variable stecken und dann einfach via

    GML-Quellcode

    1. ds_list_add(global.bytes,/*Zahl hier*/);
    eine beliebig lange Zahl dieser Liste hinzufügen.


    Schritt 2: Liste verwalten
    Weil diese Datenstrukturen etwas anders funktionieren als gewöhnliche Arrays, muss man mit ihnen auch etwas anders umgehen. Man kann einen Eintrag in der Liste zum Beispiel nicht einfach über global.bytes[position] ansprechen, sondern muss das über

    GML-Quellcode

    1. ds_list_find_value(global.bytes,position)
    machen. Das ist etwas mehr Schreibarbeit, aber sonst nix. Wichtig wird's erst, wenn man eine Liste haben will, die nur kurz benutzt wird und dann entweder länger nicht mehr oder nie wieder. Wenn sowas passiert, muss man sie entweder mit

    GML-Quellcode

    1. ds_list_clear(global.bytes)
    leeren oder mit

    GML-Quellcode

    1. ds_list_destroy(global.bytes)
    ganz entfernen; sonst bleibt sie im Speicher und verbraucht unnötig Platz.
    Einzelne Einträge in der Liste könnt ihr mit

    GML-Quellcode

    1. ds_list_delete(global.bytes,position)
    löschen - müsst dabei aber bedenken, dass wenn ihr z.B. Eintrag 4 löscht, Eintrag 5 auf 4 "vorrückt".


    So, das war der kurze ds_list-Crashkurs, nun zu
    Schritt 3: Listeneinträge --> String

    Der folgende Skript erwartet als Argument eine Liste (also in meinem Beispiel hier global.bytes), in der nur Zahlenwerte liegen, niemals Strings.

    GML-Quellcode

    1. var i,ret;
    2. ret="";
    3. for(i=0;i<ds_list_size(argument[0]);i+=1){ // Listen fangen mit dem Zählen bei 0 an
    4. ret+=chr(ds_list_find_value(argument[0],i));
    5. // Achtung, chr! Nicht versehentlich böse Steuerzeichen treffen!
    6. // Wenn die Liste nur mit Werten zwischen 32 und 127 gefüllt ist,
    7. // seid ihr auf der sicheren Seite.
    8. }
    9. return ret;


    Und das sollte dann das machen, was ihr wollt. Ich hoffe, das war alles einigermaßen versändlich. ^^
  • ok also ich hatte noch nie mit ds_list gearbeitet aber so geht das nicht ;(

    GML-Quellcode

    1. position=0
    2. global.bytes=ds_list_create();
    3. ds_list_add(global.bytes,argument0);
    4. do
    5. {
    6. ds_list_find_value(global.bytes,position)
    7. position+=1
    8. }
    9. until string_length(string(argument0))=position
    10. var i,ret;
    11. ret="";
    12. for(i=0;i<ds_list_size(argument[0]);i+=1){ // Listen fangen mit dem Zählen bei 0 an
    13. ret+=chr(ds_list_find_value(argument[0],i));
    14. // Achtung, chr! Nicht versehentlich böse Steuerzeichen treffen!
    15. // Wenn die Liste nur mit Werten zwischen 32 und 127 gefüllt ist,
    16. // seid ihr auf der sicheren Seite.
    17. }
    18. return ret;
    19. ds_list_clear(global.bytes)
    20. ds_list_destroy(global.bytes)
    Alles anzeigen
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Nun... ja. Ich hab das vielleicht etwas zu grob umrissen, deswegen nochmal ein bisschen genauer:
    Das Ganze ist so gedacht, dass du die Liste am Anfang des Spiels erstellst und dann mehrere Werte über ds_list_add da reinsetzt. Der Skript mit der for-Schleife ist dann nur noch dafür da, aus den ganzen Werten in der Liste wieder einen String zusammenzubauen. Stell die die Liste ungefähr so vor:

    1. 80
    2. 12
    3. 33
    4. 72
    5. 104
    6. 150
    7. 38
    8. 104


    An jeder Position steht ein einzelner Zahlenwert, der dann von chr in ein Zeichen verwandelt wird. Und mit der Schleife gehst du dann quasi die Liste Eintrag für Eintrag durch und packst jedes von chr erzegte Zeichen an den String namens ret. Den Code aber einfach in das zu packen, was du schon hast, funktioniert logischerweise nicht wirklich - deine do-until-Schleife macht effektiv nichts und du fügst der Liste am Anfang argument0 hinzu - aber die for-Schleife weiter unten erwartet, dass argument0 selbst eine Liste ist. Code-Copypasting hilft dir in 99% aller Fälle nicht weiter, glaub mir. ^^

    Versuchs doch stattdessen mal so:

    :action_script: s_read_bytes

    GML-Quellcode

    1. var i,ret;
    2. ret="";
    3. for(i=0;i<ds_list_size(argument[0]);i+=1){
    4. ret+=chr(ds_list_find_value(argument[0],i));
    5. }
    6. return ret;


    Und in einem Testobjekt:
    :event_create: Create

    GML-Quellcode

    1. MYLIST=ds_list_create();
    2. // Ein paar Testbytes
    3. ds_list_add(MYLIST,71);
    4. ds_list_add(MYLIST,101);
    5. ds_list_add(MYLIST,115);
    6. ds_list_add(MYLIST,99);
    7. ds_list_add(MYLIST,104);
    8. ds_list_add(MYLIST,97);
    9. ds_list_add(MYLIST,102);
    10. ds_list_add(MYLIST,102);
    11. ds_list_add(MYLIST,116);
    12. ds_list_add(MYLIST,33);
    13. show_message(s_read_bytes(MYLIST));
    14. ds_list_clear(MYLIST);
    Alles anzeigen


    Führ das mal aus und schau, was passiert - vielleicht verstehst du so besser, was ich meine. ^^