Ioannis20x gibt hier ein Wiki dazu: https://team.sa-mp.com/wiki/MySQL_R40.html
Die neuen Funktionen heißen ähnlich, musst du quasi nur umbenennen und die Parameter neu anordnen
#Handy
Ioannis20x gibt hier ein Wiki dazu: https://team.sa-mp.com/wiki/MySQL_R40.html
Die neuen Funktionen heißen ähnlich, musst du quasi nur umbenennen und die Parameter neu anordnen
#Handy
Ein Lock reicht ungünstigerweise nicht aus, da das Sichern eines kritischen Abschnittes selbst kritisch ist.
Yes mb, es war nicht atomar. Sry, es ist 10 Jahre her, dass ich manuell so sections sichern musste...
Genau aus dem Grund macht das auch keiner manuell xD
nicht die Korrektheit ändert
Hat ja nichts mit Clean Code zu tun. Was eine Troll Ergänzung.
Also der Code von dir funktioniert nicht, dort fahren mehrere Autos über die Brücke, da der kritische Abschnitt nicht richtig ist gesichert ist
Naja, ich sag mal, eigentlich sollte der genauso funktionieren wie dein Code.
Wieso meinst du, dass er nicht funktioniert?
Das heißt in beiden Fällen kann es zu einer Race-Condition kommen, da die Variablen nicht richtig synchronisiert werden zwischen den Threads.
Dafür sollte man z.B. stdatomic.h oder Mutexes nutzen.
Beides wird hier nicht getan, somit ist das so oder so kritisch...
Mogly1 dann versuch ich mal etwas Licht ins Dunkel zu bringen.
Wieso ist das bad code?
Anfangs ist man noch sehr darauf bedacht jedes Byte und jeden CPU Zyklus zu sichern.
Aber die Clean-Code Regeln sind deutlich wichtiger: https://de.wikipedia.org/wiki/Clean_Code
Und darauf aufbauend, Software-Engineering.
Okay, nun zum Rest.
Ich verstehe nicht, wofür du die status Variable benötigst. Ich verstehe weiterhin nicht, wofür du die enter Variable brauchst.
Weiterhin verstehe ich nicht, wofür du die "Kollision Variable" brauchst. Der Plan ist doch, dass sowas nicht stattfinden kann, oder etwa nicht?
Wieso dann nicht z.B. einfach so lösen?
//Edit: Funktioniert nicht, außer als wenn ticket eine atomare Variable ist.
#define _DEFAULT_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#define NUM_THREADS 5
#define sle 0.01
#define crosses 100
clock_t start_t, end_t;
volatile long ticket;
int bridge_crosses;
void lock (long tid) {
while(ticket != -1)
{
printf("Thread [%ld] waiting...\n",tid);
sleep(sle);
}
ticket = tid;
}
void unlock (long tid) {
printf("Thread [%ld] unlocked!\n", tid);
ticket=-1;
}
void *bridge_scenario (void *threadid)
{
long tid = (long) threadid;
printf ("Hello World! It's me, thread #%ld !\n", tid);
while (bridge_crosses < crosses) {
lock(tid);
printf("Car [%ld] crossing the road...\n", tid);
sleep(sle);
unlock(tid);
bridge_crosses += 1;
sleep(sle);
}
pthread_exit (NULL);
}
int main()
{
start_t = clock();
pthread_t threads[NUM_THREADS];
long t;
// init data
bridge_crosses = 0;
ticket = -1;
for (t = 0; t < NUM_THREADS; t++) {
printf ("In main: creating thread %ld\n", t);
int rc = pthread_create(&threads[t], NULL, bridge_scenario, (void *)t);
if (rc) {
printf ("ERROR; return code from pthread_create () is %d\n", rc);
exit (-1);
}
}
// joining threads
for (t = 0; t < NUM_THREADS; t++) {
pthread_join(threads[t], NULL);
}
// output
end_t = clock();
double total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
printf ("bridge crosses: %d\n time: %f \n", bridge_crosses, total_t);
/* Last thing that main() should do */
pthread_exit (NULL);
return 0;
}
Alles anzeigen
So könntest z.B. auch ganz einfach zählen, wie oft welches Auto gerade drübergefahren ist.
Und es kann so zu keinen Kollisionen kommen.
Der Grund btw, wieso das ohne das printf bei dir nicht funktioniert ist der, dass der Compiler die Variablen und Abfragen wegoptimiert 😄 Auf -O2 denkt der sich, ach, das brauch der nicht, weg damit xD
Damit das nicht passiert, musst du sie volatile setzen, dann lässt der Compiler die Finger davon
Hoffe es hilft etwas.
Mogly1 Noch schlechter hätte man die Frage glaube wirklich nicht formulieren können.
Was genau möchtest du erreichen.
Erkläre doch mal mehr zu deinem Code. Was genau geht denn nicht? Die printf sind ja ausgeklammert, da wird also nichts ausgegeben. Wieso geht denn das nicht?
Was soll das random Semikolon da? Soll das eine Endlosschleife sein? Dieser Code ist maximal dirty.
Eventuell mehr auf Clean-Code achten...
Achso.
Ja, das sind nur Warnings, die kannst du eig ignorieren.
Beheben tust du sie entweder, indem du deine MySQL Version updatest (empfohlen).
Oder du bearbeitest das a_mysql.inc, denn da kommen die Warnings her, das hat nichts mit deinem Code zu tun.
Dort werden Strings in den Funktionen übergeben, als Beispiel:
native MySQL:mysql_connect(host[], user[], password[], database[], MySQLOpt:option_id = MySQLOpt:0);//So steht es da
native MySQL:mysql_connect(const host[], const user[], const password[], const database[], MySQLOpt:option_id = MySQLOpt:0); //So müsste es aussehen
Also immer wenn Strings (bzw Arrays) übergeben werden, also wenn diese eckigen Klammern bei den Parametern verwendet werden, sollte man ein const verwenden, wenn diese in der Funktion nicht verändert werden
weiß jemand woran das liegt und kann mir evtl helfen?
Wieso in aller Wellt sollte das query const sein?
const bedeutet, der Wert ist konstant und ändert sich nicht. Aber da du das hier bei der Deklaration verwendest und der "Variable" keinen Wert zuweist, wäre das immer leer...
Also mach aus dem const ein new
Um welches Game handelt es sich denn?
Also SA:MP, MTA, GTA IV, GTA V (Rage:MP/Alt:V)?
Sie kann in ihrem aktuellen Stand keine komplexeren Programmieraufgaben lösen.
Achso, das klang so, als ob du generell von KI sprichst. Dass das ChatGPT aktuell noch nicht vermag - ok.
Das sind im Gegensatz zu ChatGPT auch tatsächlich sehr flexible Systeme. Sprache an sich hat viele Regeln, die klar strukturiert sind. Das macht eine solche Implementierung weniger Komplex als ein Straßenverlauf.
Nur als Info, das kann man so pauschal gar nicht sagen.
Wenn man vom reinen DNN spricht, ist ChatGPT deutlich größer und komplexer, als die für ein autonomes Fahrzeug.
Sind ja aber völlig unterschiedliche Anwendungszwecke, deshalb ist das nicht so zu vergleichen.
Schlussendlich wird sie aber niemals den Menschen ersetzen können.
Hui ui ui, mächtige Worte.
Wie kommst du zu dieser Annahme?
Hast du das aus diesem Tutorial entnommen?
Hast du da am Anfang die Änderungen an der Client-Config auch vorgenommen?
Wenn nicht, check das mal aus und teste evtl das auch mit dem Chat. Vermutlich stimmt da etwas bei der Einrichtung nicht.
Sagen wir du hast 3 Felder in der Datenbank.
id, level, geld
Und weiterhin sagen wir in der Datenbank gibt es 2 Spieler, die du abfragst.
Dann ist der row_count = 2 und der field_count = 3
Also wenn Rows = 0 ist, dann wissen wir, dass kein Spieler gefunden wurde. Das ist die wichtige Information.
Wie viele Felder zurückkommen, wenn Rows zurückkommen, wissen wir eig eh schon immer, da wir sie im Query spezifizieren.
Aus diesem Grund ist diese Info eig unnötig und wurde dann später ausgelagert in eine andere Funktion.
Falls du aus irgendwelchen Gründen das auch wissen magst, gibt es die: cache_get_field_count Funktion, welche genauso funktioniert wie die row_count Funktion
wie muss das hier bei r41 4 aussehen hänge dort fest und werde nicht ganz aus der include schlau
Einfach:
wie müsste es denn nun sein das er nicht mehr mekkert?
Also eigentlich ist es richtig so.
Keine Ahnung, was qawno hat, wenn ich den Code bei mir verwende, bekomme ich keine Warnings.
Allerdings ein paar Hinweise:
Ich empfehle dir sowas:
//Nutze das Pressed Makro:
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
stock IsFahrlehrerOnline() //Klar, am Besten nicht Denglisch, aber who cares
{
for(new i; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && SpielerInfo[i][pFraktion] == 10) return true;
}
return false;
}
//Und dann unten:
if(PRSSED(KEY_SECONDARY_ATTACK) && IsPlayerInRangeOfPoint(playerid,3,1020.2769,-1348.1006,13.3283) && !IsPlayerInAnyVehicle(playerid))
{
return ShowInfoDialog(playerid,"Information", IsFahrlehrerOnline() ? ("Es ist ein Fahrlehrer online /service!") : ("Es ist leider kein Fahrlehrer online!"));
}
Alles anzeigen
Kannst auch einfach dein Skript in Notepad++ öffnen und oben auf "Codierung" klicken und schauen, dass du es nach ANSI kodierst.
Kannst du mir das vielleicht erklären? Ich benutze den pawncc von open.mp.
Das hat damit nichts zu tun.
Die haben das in der Standard-Lib geändert, dass man sich nicht vertippen kann.
Du solltest da nicht TEXT_DRAW_FONT:1 nutzen, sondern die Werte, welche im enum definiert wurden.
In diesem Fall TEXT_DRAW_FONT_1
Genauso solltest du oben nicht progressbar_direction:0 nutzen, sondern direkt: BAR_DIRECTION_RIGHT
Beim Align, sollst du dann auch nicht TEXT_DRAW_ALIGN:1 nutzen, sondern direkt: TEXT_DRAW_ALIGN_LEFT
Dadurch kann man das besser lesen, als einfach nur eine 0 oder 1. Da weiß man direkt, um was es sich handelt.
Kannst ja einfach mal in das Include von omp reinschauen, das ist das omp_textdraw.inc Da siehst du die ganzen enums.
Joa...ist wohl n Bug im Include.
Die "aktuelle" Version wurde ja auch nicht als Stable Release gekennzeichnet...vermutlich wurde da nicht mehr so viel getestet.
Allerdings habe ich dir mal die stable Version angehangen, dort funktioniert es.
Sicher, dass deine Variable nicht negativ wird? xD
Wie erstellst du denn das Progressbar.
Kannst du uns etwas Code geben, wie das so aussieht bei dir?
Bad news, wie im issue schon vermutet: https://github.com/Marvisak/altv-python-module/issues/31
Wird das Modul wohl nicht mehr weiterentwickelt.
Kannst dir natürlich den aktuellen Source ziehen und versuchen es selbst gegen die aktuelle SDK zu bauen.
Da müssen aber vermutlich einige Sachen angepasst werden, da das letzte Update schon gut n halbes Jahr her ist 😅
Benutzen die auch includes?
Ja, natürlich.
Aber viele "durchsuchen" auch tausende Zeilen Code. Da wissen die Skripter halt, wo was steht.
Wenn man die grundlegenden Callbacks in SA:MP kennt, dann weiß man ja tendenziell, wo was zu suchen ist.
Aber natürlich ist es extrem schwer so Bugs zu identifizieren. Das ist der Grund, wieso es so viele Bugs auf vielen Servern gibt.