String in Variabel konvertieren?

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,
    ich möchte das:


    zu sowas wie dem machen:



    Code
    stock AddItem(playerid, x, item[28], amount)
    {
    	PlayerCar[playerid][x][Bag"item"] += amount;
    	PlayerCar[playerid][x][Bag"item"] += ItemSpace["item"];
    }

    Hatte das schon im "Kleine Scripting Fragen" Thread gefragt, aber wurde irgendwie überlesen :(
    Hoffe jemand kann mir dabei helfen :whistling::saint:

  • Das geht nicht :)


    Aber muss es ja auch nicht, wieso willst du da unbedingt einen String wert benutzen?


    Nutz doch einfach direkt BagApple oder mach ein Makro/Enum und Mapp den wert auf z.B. ITEM_APPLE oder sowas :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Code
    enum ItemSpaceEnum
    {
    	Apple[28],
            Pear[28]
    }
    new ItemSpace[ItemSpaceEnum] =
    {
    	{1},
            {1}
    };
  • Das geht problemlos mit PVars.
    http://wiki.sa-mp.com/wiki/SetPVarInt


    SetPVarInt(playerid, item, GetPVarInt(playerid, item) + amount);
    Gegebenenfalls für das "x" dem item das noch mitgeben:
    format(item, sizeof(item), "%s%d", item, x);


    Für die globalen Variablen (nicht spielerabhängig) (ItemSpace) kannst du setproperty/getproperty nutzen.
    http://wiki.sa-mp.com/wiki/Setproperty


    Bzw, mit dieser kleinen Include fällt es dir wahrscheinlich leichter, da diese gleich genutzt werden kann, wie PVars:
    http://forum.sa-mp.com/showthread.php?t=479912




    Alternativ ließe sich auch ein Array anlegen, welches die Variablen als String beinhaltet, dazu eine Funktion mit Loop durch das Array, um anschließend damit auf den Index im Player-Array zuzugreifen.
    new varNames[][] = {
    "Banane",
    "Apfel",
    "Birne"
    };


    Sowie:
    stock getVarIdx(item[])
    {
    if(!strlen(item)) return -1;
    for(new i = 0; i < sizeof(varNames); i++)
    {
    if(!strcmp(varNames[i], item)) return i;
    }
    return -1;
    }


    Dann:
    stock AddItem(playerid, x, item[28], amount)
    {
    new idx = getVarIdx(item);
    if(idx == -1) return 0;
    PlayerCar[playerid][x][idx] += amount;
    PlayerCar[playerid][x][idx] += ItemSpace[idx];
    return 1;
    }


    PlayerCar wäre dann so deklariert:
    new PlayerCar[MAX_PLAYERS][MAX_X][MAX_ITEMS];

  • Also, man kann das so machen, wie Jeffry das gezeigt hat.
    Das wäre denke ich mal einer der einfachsten Wege.



    Man kann das aber auch elegant in O(1) lösen, ohne Strings zu vergleichen.

    Will das nur mal demonstrieren, allerdings müsste ich dafür noch wissen, wozu du das als String deklariert hast im enum?!


    Was soll das, was hat das für einen Sinn? Du willst doch dafür nur sagen, wie viel Raum das einnimmt und das ja immer ein int und kein String ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Okay, dann hier mal meine Idee ^^


    Wir nutzen einfach hier die Reihenfolge im Enum aus :)



    Wichtig hier, sorg nun dafür, dass BagApple immer das oberste Item ist und alle anderen Items hänge einfach unten dran. So wie man es normal auch tun würde.


    Dann kannste es nämlich einfach so machen:


    C
    stock AddItem(playerid, x, dtc_PlayerCar:item, amount)
    {
        PlayerCar[playerid][x][item] += amount;
        PlayerCar[playerid][x][item] += ItemSpace[item-BagApple];
    }


    Nutzung dann einfach so:



    C
    AddItem(playerid,veh,BagApple,10); //Gibt 10 Äpfel z.B.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Vielen dank für eure Lösungswege, aber das ist alles nicht das was ich wollte...
    Ich wollte einfach das wenn er AddItem aufruft Apple eingibt und in der Funktion macht er aus Apple -> BagApple, als würde man die Variabel "manipulieren".


    Es geht mir weniger um das Problem das ich jetzt habe, mehr um die Möglichkeit Variabeln die man an einer Stelle eingegeben hat, an anderer Stelle zu verändern oder ergänzen, ähnlich wie einen String.


    Ich glaub Jeffrys Idee mit den PVars geht in die Richtung, aber ich hab sie nicht zu 100% verstanden... Kann auch sein das es einfach nicht möglich ist.

  • Beide meiner Wege führen zum gleichen Ziel.
    Was du möchtest, zumindest wie ich es verstanden habe, dass ein Spieler zum Beispiel /kaufe Apfel 10 eingeben kann, und dein Code dann nur so ist:
    AddItem(playerid, x, item, amount); //in "item" steht in dem Fall das "Apfel" drin, das der Spieler eingegeben hat


    "item" und "amount" kommen in dem Fall aus sscanf z.B.
    Das klappt mit beiden meiner Wege so.


    Oder meinst du etwas anderes?

  • @Jeffry Also ich will im Script an einer Stelle einfach nur AddItem(playerid, x, Apple, 1); eingeben und er macht in der Funktion AddItem dann aus Apple > BagApple, denn die Variabel im PlayerCar Enum heißt nun mal BagApple


    Code
    stock AddItem(playerid, x, item, amount)
    {
        PlayerCar[playerid][x][item] += amount; //Hier muss [item] für 
        [BagApple] stehen
    
    
        PlayerCar[playerid][x][item] += ItemSpace[item]; //Hier muss [item] an 
        erster Stelle wieder für [BagApple] stehen und an zweiter für [Apple]
    }
  • Was ist denn dein Problem?


    Was stört dich an den bisherigen Methodiken, das versteh ich nicht :D

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • @Andosius Heute Abend geht leider nicht, wie stellst du dir vor das Problem zu lösen?

    So einfach mal als Verständnis, da ich die Problematik nicht verstehe. Warum kannst du das BagApple nicht in Apple nennen? Es sind doch verschiedene Enum´s(?).

    @Jeffry Also ich will im Script an einer Stelle einfach nur AddItem(playerid, x, Apple, 1); eingeben und er macht in der Funktion AddItem dann aus Apple > BagApple, denn die Variabel im PlayerCar Enum heißt nun mal BagApple


    Code
    stock AddItem(playerid, x, item, amount)
    {
        PlayerCar[playerid][x][item] += amount; //Hier muss [item] für 
        [BagApple] stehen
    
    
        PlayerCar[playerid][x][item] += ItemSpace[item]; //Hier muss [item] an 
        erster Stelle wieder für [BagApple] stehen und an zweiter für [Apple]
    }

    Um das zu beheben mach doch einfach: format(item, 128, "Bag%s, item); müsste doch funktionieren oder?

  • So einfach mal als Verständnis, da ich die Problematik nicht verstehe. Warum kannst du das BagApple nicht in Apple nennen? Es sind doch verschiedene Enum´s(?).

    Es sind aber trotzdem globale Variabeln, ich kann 2 globalen Var´s nicht den gleichen Namen geben




    Um das zu beheben mach doch einfach:
    format(item, 128, "Bag%s, item); müsste doch funktionieren oder?

    Schön wärs, aber das wär dann ein String... Ich such ja genau sowas, nur für Variabeln

  • Es sind aber trotzdem globale Variabeln, ich kann 2 globalen Var´s nicht den gleichen Namen geben

    Du könntest beiden Arrays das gleiche enum vergeben. Ist zwar dann für das Array mit den weniger Werten etwas Speicher verschwendet, da einige enum Werte unbelegt bleiben, entspricht dann aber auch deinem Wunsch.