Größe von Variablen (Arrays?!)

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
  • Hi,
    ich verstehe immoment mehrere script basics nicht. Aber eins nach'm andern.
    Meine erste frage ist wann ich immer die größe definieren muss.


    Damit meine ich sowas wie:
    new blubb[16];


    sowas muss ich nur definieren wenn ich einen Text speichern will oder?!
    und sowas
    new blubb2[MAX_PLAYERS];


    muss ich definieren wenn ich will das die Variable für jeden Spieler einen eigenen Wert haben kann oder?
    Kann mir das bitte noch einmal jemand genauer erläutern?


    Lg Dono


    PS: Natürlich hab ich die sufu und wiki genutzt aber da hab ich es auch nicht so 100% verstanden.

  • Nicht ganz. Ich erklärs mal genauer:


    Ein String ist ein Array.
    Und ein Array ist eine Variable die mehrere Zellen hat, die man jeweils mit Werten besetzen kann.


    Du kannst dir einen Array vorstellen wie einen Eierkarton.
    Der Eierkarton ist die Variable, die Hülsen für die Eier die Zellen.
    In jede Zelle kann ein anderes Ei rein, eins kann grün sein, eins blau, eins gelb und eins weiß - Alles kein Problem.


    Ein String ist im Prinzip auch nur ein Array, jedoch mit Werten besetzt die im ASCII Code Buchstaben entsprechen.
    Würde man sich einen String mal genau anschauen könnte er so aussehen:
    104 97 108 108 111 \0 x x x x
    Wichtig ist der '\0'-Charakter am Ende der das Ende des Strings angibt. Was nach diesem Char kommt ist NICHT mehr im String!


    Um jetzt das ganze mit "MAX_PLAYERS" zu klären muss man wissen wie SA:MP Werte überträgt.
    Jeder Spieler hat, wie man wissen sollte, eine playerid. Diese playerid ist ein Integerwert.
    Wenn man jetzt einen Array mit der Größe von MAX_PLAYERS (in 0.3 500) erstellt, kann man (bspw. beim Connect) der Zelle "playerid" des Arrays einen gewissen Wert zuweisen.
    new gMyArray[MAX_PLAYERS];
    public OnPlayerConnect(playerid)
    {
    gMyArray[playerid] = 255; // Der Slot "playerid" hat den Wert 255
    return 1;
    }


    MAX_PLAYERS ist nur eine Definition, die einen Wert von 500 hat. Im Prinzip kann man den Array dann auch für einen String hernehmen!
    main()
    {
    new gArray[MAX_PLAYERS];
    format(gArray, sizeof gArray, "Bla Bla, das funktioniert auch!");
    print(gArray);
    }


    Ich hoffe du hast jetzt verstanden wie das ganze abläuft.


    // Übrigens schön mal wieder eine Frage zu haben die sich direkt mit Pawn befasst. :D

    Einmal editiert, zuletzt von [NSG]Bright ()

  • Ich muss auch noch mal fragen



    also das heißt einfach gesehen


    new test[126]


    new -- definiert was neues
    test -- definiert den Speicherplatz (Slot) namen
    126 -- Ist der Speicherplatz im Script



    Wenn ich das falsch sehe bitte helfen


    Ach und


    MAX_PLAYERS -- definiert den Speicherplatz 500 sofern nichts anderes angegeben ist


    wie gesagt bitte helfen...
    so verstehe ich das ganze i mom

  • > new = Anweisung neue Variable / Begriff
    > <Dein Variablen Bezeichner > = Der Name der Variable bzw. der Bezeichner unter dem er im Speicher des Skripts zu finden ist
    > Index [zahl] = Erstellt die Variable mit einem angegebenen Index bzw. <Zahl> freien slots wie 126 = 126 Zeichen / 126 Zahlen Slots oder einfach 126 mal eine Variable nur das sie den selben Bezeichner hat und bestimmte Slots hat bzw. kann man das wie Einträge ansehen halt ein Index


    Etwas genaueres Beispiel....


    new test[20]; // 20 Slots für 20 Zeichen oder 20x eine Zahl...


    test[0] = 70; // eine Zahl
    test[1] = 'A'; // Ein Zeichen



    Beispiel 2:


    test[0] = 'H';
    test[1] = 'E';
    test[2] = 'L';
    test[3] = 'O';
    test[4] = ' ';
    test[5] = 'W';
    test[6] = 'O';
    test[7] = 'R';
    test[8] = 'L';
    test[9] = 'D';


    // á 9 Zeichen

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    Einmal editiert, zuletzt von BlackFoX ()

  • Definier mir dochmal bitte nochmal genau "Variable"


    Und berichtige mich nochmal.....
    **Sorry das ich so doof frage.... aber ich bekomme grade mal nen Mini Freeroom hin ohne große Saves usw...**


    Und übersetzt das mal bitte dann ins noobsche :P


    > new - sagt das er was neu machen soll egal was erstmal
    > name - sagt an unter welchem namen es im script gespeichert wird
    > zahl - Mögliche Varienten den "name" einzusetzen???????

  • Nun gut ...


    variable = Weist einen Bezeichner auf der einen bestimmten Pfad zu einem Inhalt aufweist , dieser muss im Speicher des Skripts jedoch Registriert sein,
    der Bezeichner ist nur Optional , in echt wird das ganze in einem Hex Dezimalen System Registriert , ein solches System lässt am besten in der Sprache der
    Assembler ansehen



    Wie gesagt eine Zahl( integer ) nicht gleich String/Text , deswegen heißt es Index , man kann es sich vorstellen wie ein Liste mit mehreren Inhalten,
    String heißt nicht umsonst Zeichenkette also eine zusammen gesetzte Reihe aus Zeichen



    Hier mal die Variante den Spieler Namen in solch eine Variable zu Speichern...


    new spielername[MAX_PLAYER_NAME] // Der Index ist ein definierter Inhalt der auf eine Länge der des Spieler Namens verweist dieser ist wieder mit einer Zahl definiert und gibt für die Variable den Index an
    GetPlayerName(playerid,spielername,sizeof spielername); // Ein normale Sa-mp Funktion die Zeichen für Zeichen in Spielername kopiert , bis zur Länge von spielername bzw. bis zu Maximalen Länge von Spielername also den Index von MAX_PLAYER_NAME



    Hier noch ein Beispiel...


    new Zeichenbaum[] = {'A','B','C'};


    Wie man sieht kann man eine Reihenfolge auch festlegen die Größe ist nun jedoch uneingeschränkt , nennt man auch Dynamisch & beliebig
    veränderbar ohne am Index zu schrauben bzw. Grenzenlos .


    new size_of_var = sizeof(Zeichenbaum);


    nun wissen wir wie große die Dynamische Variable ist

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    Einmal editiert, zuletzt von BlackFoX ()

  • Gut ich glaube gleich ham wa das :thumbup:


    also new ham wa ja


    test steht auch kla.....


    was ne variable ist hab ich auch so relativ kapiert.... (auch wenn ich kaum durchsehe)
    nur das mit der Zahl..... da blockt die logik bei mir so ein bisschen
    (wie wir ja eig alle wissen ist SAMP recht unlogisch aber naja ?( )


    gut [zahl] gibt also die anzahl der variablen an, welche man aufteilen kann in "Einer für alle" und "jeder für jeden"
    .......................
    bitte nicht aufregen aber bis jetzt hab ich mich noch net damit beschäftigt großartig..... deswegen bin ich so ein bisschen blind bis hierhin

  • Ich möchte noch hinzufügen das Pawn im Allgemeinen nichts mit Sa-mp zu tun hat und eine kleine eigene Programmiersprache ist bzw
    Skript Sprache sie wird nur für Sa-mp verwendet & hat vom Syntax her fast alle Eigenschaften die C & C++ auch haben ,
    ich finde das der Vorgang bei mehreren Variablen recht logisch ist da man sich da schon einiges an Arbeit spart ^^


    Hier mal eine kleine Visuelle Darstellung ...


    definiert test mit 5 Slots = new test[5]; // das heißt von 0 bis 4 der Fünfte Slot ist hierbei nicht verwendbar
    |test> Slot 0 > Zahl > 0
    |test> Slot 1 > Zahl > 0
    |test> Slot 2 > Zahl > 0
    |test> Slot 3 > Zahl > 0
    |test> Slot 4 > Zahl > 0


    Das dort oben ist kein Direkter Pawn Code, es stellt nur das Visuelle da was geschieht wenn man diese variable definiert, ich könnte auch so definieren..


    new test1,test2,test3,test4;


    bringt mir aber nichts da die Indexierte Variable übersichtlicher ist


    new test[5];



    die Zahl stellt so zu sagen mehrere Variable unter dem selben Bezeichner da , also 4x eine Möglichkeit unter dem Bezeichner Test zu speichern.

    test[0] = CreateVehicle(...); // gibt eine ID zurück somit eine Zahl = Integer


    test[0] = 'A'; // Ein Zeichen in einem dieser Indexierungen


    man kann auch das Zeichen in Hex darstellen ... wie hier...


    test[0] = 0x40; // Stellt das Zeichen A dar


    So sieht man das in einen Slot auch Hex Werte Vollständig gespeichert werden können

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Das heißt wenn ich jetzt ""NUR EIN BEISPIEL""
    bei


    test[0] = 0x40; // Stellt das Zeichen A dar

    SendClientMessage(playerid,color,test);


    habe


    wird mir "Egal wann jetzt" der Buchstabe A zugesendet.....


    Sprich ... teoretisch ist das eine Savefunktion.... die nur etwas komplizierter aufgebaut ist....
    wenn das jetzt nicht richtig ist dann versuch ich das später nochmal....


    will dich nicht nerven damit.... ausser du machst sowas gerne bzw. bietes anfänger kurse an :thumbup:

  • Danke an euch 2 schonmal für die antworten.
    Also, ich muss IMMER eine größe angeben wenn ich:
    -einen string (sprich buchstaben) abspeicher
    -oder ich die variable für mehrere Leute etc. brauche und sonst nie oder?


    Das heist aber natürlich dann auch das ich auch variable z.B. des typs bool eine größe zuweisen kann oder?

  • Ich wollte mal die Größe in SA:MP der einzelnen Variabeln wissen..
    in C++ ist es ja so:
    Char/Bool 1 Byte
    Integer 4 Byte
    Double 8 Byte


    Und gibt's in SAMP keine "string"/"list"/"multimap" Includes? :)

  • Pawn: 1 Cell 4 Byte
    Ausnahme: Packed Strings.
    new str[12] = "Hello World"; // 12 Char - 48 Bytes
    new str[12 char] = !"Hello World"; // 3 Char - 12 Bytes


    Problem bei Packed Strings ist dass wichtige native Funktionen nur eingeschränkt/überhaupt nicht funktionieren (print, format).


    // Es gibt auch für Pawn die string.inc - Ist standartmäßig beim SA:MP Windows-Server dabei.