Wenn man es über eine DB usw macht dauert es schon etwas länger
Wie lang dauert es für dich bitte eine Integer Variable zu deinem speichersystem hinzuzufügen?!
Ich denke maximal 30 Sekunden...
Wenn man es über eine DB usw macht dauert es schon etwas länger
Wie lang dauert es für dich bitte eine Integer Variable zu deinem speichersystem hinzuzufügen?!
Ich denke maximal 30 Sekunden...
Wie lang dauert es für dich bitte eine Integer Variable zu deinem speichersystem hinzuzufügen?!
Er meint wohl den kompletten aufbau.
Mit 5 Minuten kommt man da wohl nicht aus.
Datenbank anlegen, Tabellen anlegen, Speicherung schreiben, Laden schreiben.
Halbe bis dreiviertel Stunde würde ich da schätzen.
Je nachdem wie "umfangreich" und intelligent das System an sich nachher ist, vielleicht auch eine ganze Stunde.
Hinzufügen von Dingen - davon will jetzt jetzt nicht anfangen - das ist wirklich lächerlich ;D
Das Arbeiten mit Bits ist bei heutigen Prozessoren meist unnötig und nur eine komplizierte Schreibweise, die zudem meistens langsamer ist. Ich würde das so nicht empfehlen, wenn jemand wirklich auf die Laufzeitperformance achtet.
Sondern:
new bool:Hut[MAX_PLAYERS];
new bool:Shirt[MAX_PLAYERS];
new bool:Tasche[MAX_PLAYERS];
new bool:Fahrrad[MAX_PLAYERS];
#define GivePlayerItem(%0,%1) %1[%0] = true
#define RemovePlayerItem(%0,%1) %1[%0] = false
#define HasItem(%0,%1) %1[%0]
#define ResetAllItems(%0) Hut[%0] = Shirt[%0] = Tasche[%0] = Fahrrad[%0] = false
GivePlayerItem(playerid,Hut);
Mal vom ResetAllItems abgesehen, das ist nicht sooo schön.
Das egalisiert sich aber durch den Performancegewinn am Rest, denn die Bit-Methode ist knappe 25% langsamer beim schreiben, und 15% beim Lesen und die Tatsache, dass man kein 32er Limit an Items hat.
Und nebenbei, einfacher zu verstehen ist es auch
wenn jemand wirklich auf die Laufzeitperformance achtet.
Ich sag mal so, bei 10.000 Durchläufen brauchen beide 1ms für das setzen...da ist kein Unterschied...erst ab über 1.000.000 Durchläufen wird da was ersichtlich, aber bitte...wer hat Schleifen im Skript für mehr als 10.000 Durchläufe...
und nur eine komplizierte Schreibweise
Man hat 1x die Makros...dann ist es einfach nur noch hinzufügen, denke so komplex ist das nicht.
Der Vorteil an der Methode ist einfach, dass man keine 32 Variablen mit einem Array von jeweils MAX_PLAYERS erstellen muss!
Somit hält das halt die amx schön klein und wie gesagt, den Laufzeit unterschied wirst du niemals auch nur ansatzweise inGame merken
wer hat Schleifen im Skript für mehr als 10.000 Durchläufe
Wobei das ja nichts an der Tatsache ändert, dass die Laufzeitperformance besser ist. Dass sie - im kleinen Bereich - unwesentlich ist, ist mir klar. Besser ist sie trotzdem.
Man hat 1x die Makros...dann ist es einfach nur noch hinzufügen
Natürlich. Das ändert aber auch nichts daran, dass die Schreibweise von Bit-Berechnungen komplizierter ist. Du argumentierst am Thema vorbei.
Somit hält das halt die amx schön klein
400 Bytes Unterschied, mein MAX_PLAYERS steht auf 150. Das ist ebenso unwesentlich wie die eingesparte Laufzeit, nur habe ich persönlich lieber eine größere AMX als Lags.
Aber das wird doch lächerlich. Weder 1MB Festplattenplatz noch 1ms Laufzeit stören jemand - in SA-MP zumindest.
Allerdings will mit Sicherheit jemand mal mehr als 32 Items haben, und dann ist er froh drum.
Nun gibt es auch IsString und IsFloat + IsOnlyString, IsOnlyFloat und IsOnlyNumber.
Auch wenn es IsNumeric schon gibt, hab ich es kurz selber geschrieben
new alphabet[] = {"a", "ä", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "ö", "p", "q", "r", "s", "ß", "t", "u", "ü", "v", "w", "x", "y", "z"};
new number[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
/*
Zweck: Prüft, ob die Variabe einen String(zb. Text) enthält.
Arbeitsweise: Prüft ein Inhalt auf Buchstaben
Benutzung: IsString("Hallo ich bin ein Text.") //true
IsString("0.1") //false
IsString("1234567890") //false
*/
stock IsString(string[]) //@Whitetiiger aka. Kaito-sensei
{
for(new j; j < strlen(alphabet);j++)
{
if(strfind(string, alphabet[j], true) != -1)
{
return true;
}
}
return false;
}
/*
Zweck: Prüft, ob die Variabe ein Float(zb. Position) enthält.
Arbeitsweise: Prüft ein Inhalt auf ein Punkt(.)
Benutzung: IsFloat("Hallo ich bin ein Text.") //true
IsFloat("0.1") //true
IsFloat("1234567890") //false
Zu beachten: In Texten mit einem Punkt(.) kommt bei IsFloat auch ein true.
*/
stock IsFloat(string[]) //@Whitetiiger aka. Kaito-sensei
{
if(strfind(string, ".", true) != -1)
{
return true;
}
return false;
}
/*
Zweck: Prüft, ob die Variabe eine Zahl enthält.
Arbeitsweise: Prüft ein Inhalt auf die Zahlen von 0 bis 9
Benutzung: IsNumber("Hallo ich bin ein Text.") //false
IsNumber("0.1") //true
IsNumber("1234567890") //true
Zu beachten: In Texten mit einem Punkt(.) kommt bei IsFloat auch ein true.
*/
stock IsNumber(string[]) //@Whitetiiger aka. Kaito-sensei
{
for(new j; j < strlen(number);j++)
{
if(strfind(string, number[j], true) != -1)
{
return true;
}
}
return false;
}
stock IsOnlyString(string[]) //@Whitetiiger aka. Kaito-sensei
{
if(IsString(string) == 1 && IsNumber(string) == 0) return true;
return false;
}
stock IsOnlyFloat(string[]) //@Whitetiiger aka. Kaito-sensei
{
if(IsString(string) == 0 && IsNumber(string) == 1 && IsFloat(string) == 1) return true;
return false;
}
stock IsOnlyNumber(string[]) //@Whitetiiger aka. Kaito-sensei
{
if(IsString(string) == 0 && IsNumber(string) == 1 && IsFloat(string) == 0) return true;
return false;
}
Alles anzeigen
printf("%d",IsOnlyString("Hallo ich bin ein Text.")); //true
printf("%d",IsOnlyString("0.1")); //false
printf("%d",IsOnlyString("1234567890")); //false
printf("%d",IsOnlyFloat("Hallo ich bin ein Text.")); //false
printf("%d",IsOnlyFloat("0.1")); //true
printf("%d",IsOnlyFloat("1234567890")); //false
printf("%d",IsOnlyNumber("Hallo ich bin ein Text.")); //false
printf("%d",IsOnlyNumber("0.1")); //false
printf("%d",IsOnlyNumber("1234567890")); //true
Alles anzeigen
Hier nochmal ein Screen von der reihenfolge.
Keine der Funktionen funktioniert so wie sie soll.
printf("%d",IsString("Hallo1")); //true -> (Hat aber eine Zahl, muss false sein)
printf("%d",IsFloat("0.a")); //true -> (Hat einen Buchstabe, muss false sein)
printf("%d",IsFloat("0..1")); //true -> (Hat zwei Punkte, muss false sein)
printf("%d",IsNumber("Hallo0a")); //true -> (Das ist keine Zahl, sollte klar sein dass das false ist)
printf("%d",IsOnlyString("eeeee")); //false -> (Das ist ein String, muss true sein)
printf("%d",IsOnlyFloat("9.9")); //false -> (9.9 ist sehr wohl ein Float, muss true sein)
printf("%d",IsOnlyNumber("123456789")); //false -> (Das ist eine Zahl, muss true sein)
Das solltest du überarbeiten.
Die Funktionen sind kaum bis gar nicht einsatzbereit.
Ergänzend zu dem von Jeffry:
- Bei Floats möchtest du sicherlich nur einen Punkt (.) erlauben und nicht 20.
- Zahlen können ein Vorzeichen haben (+ oder -)
- Texte (Strings) decken nur deutsche Buchstaben ab und da nicht mal alle (ß, Satzzeichen, etc).
Um jetzt nur mal die gängigsten Fälle abzudecken.
Zumindest hast du dir Tests geschrieben um die Funktionen zu prüfen. Das sind aber zu wenig Testfälle um die gängisten Szenarien abzudecken. Bischen kreativer muss man da schon bei seinen Tests sein.
Ich war so frei und habe die Funktionen verbessert.
Die IsOnly... Funktionen habe ich weg gelassen, da diese hier keinen Sinn mehr geben, da sie das gleiche darstellen würden.
stock IsLetterString(str[]) //©Jeffry
{
if(!strlen(str)) return 0;
for(new i = 0, j = strlen(str); i < j; i++)
{
switch(str[i])
{
case 'A'..'Z', 'a'..'z': continue;
case 138, 142, 159, 192..214, 216..246, 248..255: continue;
}
return 0;
}
return 1;
}
stock IsNumber(str[]) //©Jeffry
{
if(!strlen(str)) return 0;
for(new i = 0, j = strlen(str); i < j; i++)
{
switch(str[i])
{
case '0'..'9': continue;
case '+', '-': if(i == 0) continue;
}
return 0;
}
return 1;
}
stock IsFloat(str[]) //©Jeffry
{
if(!strlen(str)) return 0;
new l_dct;
for (new i = 0, j = strlen(str); i < j; i++)
{
switch(str[i])
{
case '0'..'9': continue;
case '+', '-': if(i == 0 && i != j-1) continue;
case '.':
{
l_dct++;
if(l_dct == 1 && i != 0 && i != j-1 && str[i-1] != '+' && str[i-1] != '-') continue;
}
}
return 0;
}
return 1;
}
Verwendung:
printf("%d",IsLetterString("Jeffry")); //true
printf("%d",IsLetterString("Hallo123!")); //false
printf("%d",IsNumber("+14032401")); //true
printf("%d",IsNumber("14032401")); //true
printf("%d",IsNumber("Jeffry")); //false
printf("%d",IsFloat("14.03")); //true
printf("%d",IsFloat("-24.01")); //true
printf("%d",IsFloat("9.9a")); //false
Jeffry wieso keine natives nutzen , welche ziemlich schnell sind
#define IsNumber(%0) (strval(%0) ? true : false)
#define IsFloat(%0) (floatstr(%0) ? true : false)
Doppelt gemobbelt hält zwar besser , aber da wir Performance Junkies sind
stock IsLetterString(const str[])
{
new i = 0, j = strlen(str);
if(!j) return 0;
for(; i < j; i++) if(48 <= str[i] <= 57) return 0;
return 1;
}
Jeffry wieso keine natives nutzen , welche ziemlich schnell sind
0 ist auch eine Zahl.
Und dein IsLetterString kann Zeichen enthalten, die kein Buchstabe sind.
Alles anzeigenprintf("%d",IsString("Hallo1")); //true -> (Hat aber eine Zahl, muss false sein) (dies ist schon richtig so)
printf("%d",IsFloat("0.a")); //true -> (Hat einen Buchstabe, muss false sein)(IsFloat überprüft nur den Punkt, wenn es eine Position sein soll, dann IsOnlyFloat)
printf("%d",IsFloat("0..1")); //true -> (Hat zwei Punkte, muss false sein)(da hast du recht, jedoch hab ich mir so gedacht, es wird eh keiner auf so ein Einfall kommen)
printf("%d",IsNumber("Hallo0a")); //true -> (Das ist keine Zahl, sollte klar sein dass das false ist)(genau das gleiche, wenn es nur Zahlen enthalten soll, dann IsOnlyNumber verwenden)
printf("%d",IsOnlyString("eeeee")); //false -> (Das ist ein String, muss true sein)(das kommt mir selber komisch vor, sollte jedoch normalerweise nicht sein)
printf("%d",IsOnlyFloat("9.9")); //false -> (9.9 ist sehr wohl ein Float, muss true sein)(genau das gleiche, sollte eigendlich Funktionieren)
printf("%d",IsOnlyNumber("123456789")); //false -> (Das ist eine Zahl, muss true sein)(und nochmal das gleiche)
Aber Trotzdem Danke Jeffty, dass du es mit anderen Fehlern mal getestet hast.
Ist das nicht ein PHP thread?
@CloudNinja: Nein ist es nicht.
Du meinst vielleicht den hier: Nützliche PHP-Codeschnipsel
Und dein IsLetterString kann Zeichen enthalten, die kein Buchstabe sind.
Seit wann sind Strings mit Zahlen eigentlich keine Strings mehr?
"Hey, ich bin 12 Jahre alt" ist doch auch ein String oder irre ich mich da?
LetterString = Buchstaben String
Man könnte damit abfragen, ob ein korrekter Name eingegeben wurde, der beinhaltet ja keine Zahlen.
Mit der Funktion will man überprüfen ob der String eine Zahl ist. Wenn du jetzt in einen Dialog 7 eingibst, ist der String ja "7"
Er meint die IsLetterString Funktion
Man könnte damit abfragen, ob ein korrekter Name eingegeben wurde, der beinhaltet ja keine Zahlen.
dann dürfte aber zb. 123marvin123 seinem Namen in kein Dialog schreiben, wenn der input mit IsLetterString geprüft wird.
Außerdem hatte ich für die Nur String,Float,Number die Only Funktionen geschrieben.
Das wäre dann auch kein wirklicher Name, sondern ein Nickname.
Das spielt ja auch keine Rolle, IsLetterString fragt ab ob der String nur aus validen Buchstaben besteht. Wofür man das letztendlich verwendet kann sehr unterschiedlich sein. Beispiele sind wie gesagt Namen, Stadtnamen, irgendwelche Essen, etc...
Eine Abfrage IsString würde keinen Sinn machen, da ein String nach seiner Definition jedes Zeichen beinhalten kann, das als Text dargestellt werden kann.