Denke nicht das es daran liegt aber änder das mal:
zu
hast du irgendwie unten nicht gemacht, sonst aber immer benutzt.
Nevermind, wenn es ja richtig aus printet.... (dann geht das mit dem format ja)
Denke nicht das es daran liegt aber änder das mal:
zu
hast du irgendwie unten nicht gemacht, sonst aber immer benutzt.
Nevermind, wenn es ja richtig aus printet.... (dann geht das mit dem format ja)
Halli hallo, kannst du das mal in LoadAtm hinzufügen und schauen ob es etwas verbessert/schlechtert?
if(AtmLabelID[atmid] != INVALID_3DTEXT_ID)
{
DestroyDynamic3DTextLabel(AtmLabelID[atmid]);
}
if(IsValidDynamicObject(AtmObjectID[atmid]))
{
DestroyDynamicObject(AtmObjectID[atmid]);
}
Das kommt über
AtmLabelID[atmid] = CreateDynamic3DTextLabel("Bankautomat",GREEN,aInfo[atmid][aX],aInfo[atmid][aY],aInfo[atmid][aZ],4.0,INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0); //Objekt wird erstellt aber manchmal nicht angezeigt
AtmObjectID[atmid] = CreateDynamicObject(19324,aInfo[atmid][aX],aInfo[atmid][aY],aInfo[atmid][aZ],0.0,0.0,aInfo[atmid][aR]); //Objekt wird erstellt aber manchmal nicht angezeigt
Und in
public OnATMDeleted(atmid)
dann noch hinzufügen
Nicht das es sich somehow neu setzt.
Heyho, kennt jemand evtl. eine gute Seite(Programm) für Konzepte (Mindmap oder co.)
Ich habe das Gefühl mich mit meinen Konzepten und Ideen zu verlaufen, derzeit nutze ich Trello , aber irgendwie, fehlt mir da eine verknüpfung mit Linien...
Dass ich das Visuell miteinander verbinden kann?
Guten Tag, ich wollte mal fragen, ob jemand Tipps hat bezüglich:
Preise auf einem Server erstellen (Bsp. GtaV).
Irgendwie habe ich, ein falsches Gefühl dafür.
Sollte ich immer mit einem Gegenstand anfangen und Referenzen machen oder bei Jobs das Durchschnittsgehalt mir anschauen?
Danke im Voraus.
Sobald ich auf diesem verbinden möchte, steht dort Wrong Params.
Seit wann kam das, was hast du seit dem hinzugefügt?
Also mit den Infos kann ich nur sagen, schau dir die playerclass an, wenn der Warning beim connecten kommt (maybe fällt da was auf :D)
Also
1. Die Resource ist Serverside, wo die Befehle drinnen sind?
2. In der Readme ist ein Beispiel:
// Sends a chat message to the player with their position information.
chat.registerCmd('pos', (player, args) => {
chat.send(player, `X: ${player.pos.x}, Y: ${player.pos.y}, Z: ${player.pos.z}`);
// Sends to all players.
chat.broadcast(`${player.name} is located at: ${player.pos.x}, Y: ${player.pos.y}, Z: ${player.pos.z}`);
});
Daraus schließe ich, dass die Abfragen
nicht sinnvoll sind, da das registrieren schon bedeutet, dass es von /pos (example von Readme) ausgeht
füge mal das Example vom Spoiler hinzu und schau ob es funktioniert, dann mit /pos sollten im Chat deine Koordinaten stehen.
Dann sollte ein Befehl maybe so gehen?
chat.registerCmd('createuser', (player, args) =>{
const socialClubId = player.socialClubId;
const username = args[0];
const password = args[1];
const userData = {
socialClubId: socialClubId,
username: username,
password: password
};
const userDataPath = `${playerDataDirectory}${socialClubId}.json`;
fs.writeFileSync(userDataPath, JSON.stringify(userData), 'utf8');
chat.send(player, 'Benutzer erstellt.', { color: new alt.RGBA(0, 255, 0) });
});
Alles anzeigen
Geht denn ein anderer Befehl oder sind das die ersten Befehle die du von ai generiert hast und nutzt? Sonst Vergleich nochmal mit schon bestehenden befehlen woran es liegen könnte. Nutzt du die Standart Chat resource?
Je nachdem wie es implementiert wurde, kann beim Wechsel von der Garage zum Interrior ein Fehler im Code sein. Da es nicht unbedingt derselbe Aufruf wie beim Eingang sein muss.
Meinst du sowas oder was genau?
Verschiedene Kraftstoffe, schau dir den Beitrag mal an (Musst für jedes fahrzeug dann selber definieren siehst du dann aber):
und zu 2.
Hilft dir erstmal ein Enum, damit kannst du dir Tankstellen erstellen und auch noch weiter ausbauen.
Das wäre mein ansatz dazu
enum gasStationData {
Float:g_x[2],
Float:g_y[2],
Float:g_z[2],
g_max,
g_fill,
g_price,
Text3D:g_info[2]
};
new gasStation[][gasStationData] = {
/*
x1,y1,z1 = posiiton von dem ersten Tankpunkt, wo auch der 3D text und ein icond ann steht
x2,y2,z2 = posiiton von dem zweiten Tankpunkt, wo auch der 3D text und ein icond ann steht
{{x1,x2},{y1,y2},{z1,z2},Max_tankstellen_Volumen}
*/
{{1.0,1.0},{9.0,9.0},{3.0,3.0},1000}
};
in ongamemodeInit:
for(new i=0;i<sizeof(gasStation);i++)
{
gasStation[i][g_fill] = gasStation[i][g_max];
CreatePickup(1318,1,gasStation[i][g_x][0],gasStation[i][g_y][0],gasStation[i][g_z][0],-1);
CreatePickup(1318,1,gasStation[i][g_x][1],gasStation[i][g_y][1],gasStation[i][g_z][1],-1);
gasStationRandomPrice(i);
}
unten oder für dich passen im Script:
stock gasStationRandomPrice(id)//setzt einen neuen Preis für die tankstelle
{
gasStation[id][g_price] = 1 + random(4);
new string[50];
format(string,sizeof(string),"%d$ pro Liter\nNutze: /fill",gasStation[id][g_price]);
Update3DTextLabelText(gasStation[id][g_info][0],weiss,string);
Update3DTextLabelText(gasStation[id][g_info][1],weiss,string);
}
Alles anzeigen
geht der Mac Downlaod evtl.?
MySQL :: Download MySQL Community Server
Habe ich aus:
Ja, das hatte ich hier heruntergeladen:
und dann MySQL, installiert und da bekommst du dann die library.
oder direktter Link: https://dev.mysql.com/downloads/connector/j/
und dann musst du es in deinem Programm noch hinzufügen, ich nutze Eclipse. da kann ich höchstens erklären ![]()
Heyho, also ich habe mir das damals so geschrieben.
Bin jetzt kein Experte in Java, also evtl. geht es cleaner :D. (geht es ja fast immer)
MySQL klasse:
package Mysql; // anpassen
import java.sql.*;
public class mysql {
private static String url = "jdbc:mysql://Ip/DatenBank"; //Serverip und Datenbank auswählen
private static String user = "root";
private static String pass = "password";
private static Connection con = null;
public static void main(String[] args){
}
public static void close()// schließt die Mysql Conenction con und setzt sie wieder auf null (falls es nicht geht, gibt es ein Mysql fehler aus)
{
try {
if(!con.isClosed())
{
con.close();
con = null;
System.out.println("Database closed");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static PreparedStatement prepareStatement(String s)
{
try {
return con.prepareStatement(s);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static Statement createStatement()
{
try {
return con.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static boolean open() //Öffnet eine verbindun, falls keiner existiert. dafür nutzen fir die Conenction con variable.
{
if(con != null)return true;
try {
con = DriverManager.getConnection(url, user, pass);
System.out.println("Database connected");
}
catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
return true;
}
}
Alles anzeigen
Dann kannst du in deinem Programm das ganz einfach nutzen wie hier z.B.:
package Mysql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class programm {
public static void main(String[] args){
auftragLaden();
}
public static void auftragLaden()
{
if(!mysql.open())return;
try
{
Statement stm = mysql.createStatement();
String query = "SELECT * FROM Tabelle";
ResultSet rs = stm.executeQuery(query);
while(rs.next()){
//rs.getInt("SpaltenName aus der Tabelle"), achte gleich auf die werte ob Int, String, boolean
System.out.println(rs.getInt("ID") + " " +
rs.getString("Name")); //Bsp.
}
mysql.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void auftragSpeichern()
{
if(!mysql.open())return;
try
{
String query = "UPDATE Tabelle SET Thema = ? WHERE ID = ?";
PreparedStatement ps = mysql.prepareStatement(query);
// ps.setString(a,b) a = welches Fragezeichen aus der query fängt bei 1. b = der wert für das Fragezeichen geht auch setString und co.
ps.setInt(1, 99);
ps.setInt(2, 4); //beispiele
ps.executeUpdate();
System.out.println("Mysql Updated");
mysql.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void auftragErstellen()
{
if(!mysql.open())return;
try
{
String query = "INSERT INTO Tabelle (Regel, Thema) VALUES (?, ?)";
PreparedStatement ps = mysql.prepareStatement(query);
// ps.setString(a,b) a = welches Fragezeichen aus der query fängt bei 1. b = der wert für das Fragezeichen
ps.setString(1, "Nicht bei Rot fahren");
ps.setInt(2, 108); //beispiele
ps.executeUpdate();
System.out.println("Mysql Insert");
mysql.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Alles anzeigen
kleiner eklärung dazu:
Erkärung noch evtl. weil du meintest nciht verstanden:
Verbindung aufbauen tuhen wir hiermit:
private static String url = "jdbc:mysql://Ip/DatenBank"; //Serverip und Datenbank auswählen
private static String user = "root";
private static String pass = "password";
private static Connection con = null;
try {
con = DriverManager.getConnection(url, user, pass);
System.out.println("Database connected");
}
catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
wichtig ist immer,w enn wir mit mysql fertig sind die conenction weider zuschließen.
dafür nutzen wir dann
con.close();
mit
co.prepareStatement(query);
können wir noch die ? ersetzen und somit mit unseren values füllen
und am ende
con.createStatement();
damit erstellen wir einfach eine feste query abfrage
ich habe das als Klasse ausgelagert, damit man leichtere übersicht hat und man es noch als Object anpassen kann für verschiedene Datenbanken...
Alles anzeigen
Hey, kannst du in FiveM C# nutzen?
Dann hätte ich das gerade mal eben erstellt (evtl. hilft dir das, ist jetzt nicht komplett done):
diniCreate("mogly1");
diniRemove("mogly1");
diniSet("mogly1", "level", "100");
diniSet("mogly1", "name", "mogl");
string output: diniGet("mogly1", "level");
ist dann eine .txt file aber evtl egal ^^.
Bsp. von oben
Player
level:100
name:mogl
Code:
using System.Text;
namespace Dini
{
internal class Dini
{
static string path = @"C:\...\";//Pfad anpassen wo die datein landen sollen
public static bool diniExists(string name)
{
string fileName = path + name + ".txt";
reutrn File.Exists(fileName);
}
public static void diniCreate(string name)
{
string fileName = path + name + ".txt";
if (File.Exists(fileName)) return;
try
{
using (FileStream fs = File.Create(fileName))
{
byte[] info = new UTF8Encoding(true).GetBytes("Player\n");// lässt oben als Info Palyer stehen
fs.Write(info, 0, info.Length);
}
}
catch (Exception e)
{
Console.WriteLine("The deletion failed: {0}", e.Message);
}
}
public static void diniRemove(string name)
{
string fileName = path + name + ".txt";
if (File.Exists(fileName))
{
try
{
File.Delete(fileName);
}
catch (Exception e)
{
Console.WriteLine("The deletion failed: {0}", e.Message);
}
}
else
{
Console.WriteLine("Specified file doesn't exist");
}
}
public static void diniSet(string name, string key, string value)
{
string fileName = path + name + ".txt";
key = key.ToLower();
if (!File.Exists(fileName)) return;
string[] lines = File.ReadAllLines(fileName);
for(int i=1; i < lines.Length; i++)
{
if(lines[i].Contains(key))
{
lines[i] = key + ":" + value;
File.WriteAllLines(fileName, lines);
return;
}
}
using (StreamWriter sw = File.AppendText(fileName))
{
sw.WriteLine(key + ":" + value);
}
return;
}
public static string diniGet(string name, string key)
{
key = key.ToLower();
string fileName = path + name + ".txt";
if (!File.Exists(fileName)) return "Null";
string[] lines = File.ReadAllLines(fileName);
for (int i = 1; i < lines.Length; i++)
{
if (lines[i].Contains(key))
{
int value = lines[i].IndexOf(":");
return lines[i].Substring(value+1);
}
}
return "Null";
}
}
}
Alles anzeigen
Hat ja nichts mit Clean Code zu tun. Was eine Troll Ergänzung.
Meine Aussage war doch nur das Clean Code wichtig ist und du da recht hast.
Jedoch nur als hint ist dein Clean Code nicht korrekt und darauf muss man achten, dass wollte ich damit nur sagen.
Mir ging es nur darum, du meintest mein code ist dirty, ist ja auch richtig mein Code kann Cleaner geschrieben werden keine Fragen.
Aber wenn du Clean Code vorschlägst, sollte er auch korrekt bleiben. Darum ging es mir nur, ich habe mich bei der Aussage nur auf deinen Clean Code bezogen, nicht auf Clean Code allgemeinen.
Damit wünsche ich noch einen schönen Tag ![]()
Naja, ich sag mal, eigentlich sollte der genauso funktionieren wie dein Code.
Wieso meinst du, dass er nicht funktioniert?
Nein, das ist leider absolut falsch, du nutzt nur einen normalen Lock mit einer globalen Variable, während mein Code eine Twofold-Lock und Ticketsystem(warteraum) nutzt.
Grund:
Zitat- Checking and setting the lock variable
is by itself a critical section.
- The simple lock approach does not
meet all requirements for a solution to
protect a critical section.
Ein Lock reicht ungünstigerweise nicht aus, da das Sichern eines kritischen Abschnittes selbst kritisch ist.
Dein Code hat leider Konflikte im kritischen Abschnitt Output:
(Threads: 20 Brückenüberfahrten: 10.000)
Threads: 20
bridge crosses: 10019
accidents: 4223
time: 1.238070
(Threads: 5 Brückenüberfahrten: 100.000)
Threads: 5
bridge crosses: 100004
accidents: 3270
time: 3.146314
Mein Code (Ohne Konflikte):
(Threads: 20 Brückenüberfahrten: 10.000)
Threads: 20
bridge crosses: 10019
accidents: 0
time: 1155.172462
(Threads: 5 Brückenüberfahrten: 100.000)
Threads: 5
bridge crosses: 100004
accidents: 0
time: 24.827244
Aufgrund Lage der Zeit habe ich das nicht weiter hochskaliert, aber ich kann dir sagen, dass "Multiple Locks with Mutual Access – Lamport"
ZitatThe multiple locks with mutual access (Lamport) approach meets all requirements for a solution to protect a critical section.
Das heißt in beiden Fällen kann es zu einer Race-Condition kommen, da die Variablen nicht richtig synchronisiert werden zwischen den Threads.
Natürlich versucht jeder am schnellsten den lock zu nutzen. Jedoch, durch den Twofold-Lock, warten die anderen Threads bis ein Thread wieder aus dem kritischen Abschnitt ist, dies ist aber nur möglich mit den Twofold-Lock und einem Warte-System. oder "Twofold Lock with Mutual Precedence"
Dafür sollte man z.B. stdatomic.h oder Mutexes nutzen.
Wie erwähnt, sollen wir das ohne Hardware- oder Betriebssystemunterstützung lösen.
Mit Mutex ist es ja ganz simpel :3
Clean Code ist sehr wichtig, aber Kaliber du musst darauf achten, dass dein Clean Code nicht die Korrektheit ändert. Was bei deinem Code bedauerlicherweise der Fall ist.
Dein Cleaner Code hätte jetzt mein Code verbuggt.
Am Ende wurde meine Frage beantwortet von dir, also danke ich dir nochmals dafür. ![]()
Kaliber Es lag wirklich an -O2 danke dir :3
Die Status variable ist dafür da, um zu überprüfen, ob 2 Autos quasi im kritischen Abschnitt sind. Somit kann ich die nicht entfernen (so wie die for schleife dazu)
Sonst kann ich das ja nicht kontrollieren.
Also der Code von dir funktioniert nicht, dort fahren mehrere Autos über die Brücke, da der kritische Abschnitt nicht richtig ist gesichert ist. (quasi kein korrekter code)
Ich habe mich an "Multiple Locks with Mutual Access – Lamport" gehalten.
Aber ist ja egal. Mir ging es ja nur darum, wieso die Schleife nicht ging, wenn ich das printf entferne.
Ja hier meine datei:
NUM_THREADS ist auf 5 welches aber für beliebige gehen soll.
crosses ist auf 10 welche aber eigtl. auf 100.000 mind. seien sollen. (aber durch den print, dauert das etwas. Weshalb ich es auf 10 gestelt habe)
#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 10
clock_t start_t, end_t;
char enter[NUM_THREADS]; // init with 0
int tickets[NUM_THREADS]; // init with 0
int bridge_crosses;
int accidents;
int state[NUM_THREADS];
int lock (long tid) {
int i, max = 0;
enter[tid] = 1;
for (i = 0; i < NUM_THREADS; i++) {
if (max < tickets[i])
{
max = tickets[i];
}
}
tickets[tid] = max + 1;
enter[tid] = 0;
printf("tid: %ld, my ticket is: %d\n", tid, tickets[tid]);
for (i = 0; i < NUM_THREADS; i++) {
if (i != tid) {
while (enter[i])
;
while((tickets[i] != 0) && ((tickets[tid] > tickets[i]) || ((tickets[tid] == tickets[i])&&(tid > i))))
{
printf("thread waiting\n");//ohne das geht es nicht O.o
}
}
}
return 0;
}
int unlock (long tid) {
printf("tid: %ld, unlocked \n", tid);
tickets[tid] = 0;
return 0;
}
void *bridge_scenario (void *threadid)
{
long tid;
tid = (long) threadid;
printf ("Hello World! It's me, thread #%ld !\n", tid);
while (bridge_crosses < crosses) {
if (state[tid] == 0 || state[tid] == 3) {
// try to access critical section
lock(tid);
printf("tid: %ld doing stuff\n", tid);
state[tid] += 1;
for (int i = 0; i < NUM_THREADS; i++) {
if (i == tid) {
continue;
}
if (state[i] == 1 || state[i] == 4){
accidents += 1;
//printf("KOLLISION\n");
break;
}
}
sleep(sle);
state[tid] += 1;
unlock(tid);
bridge_crosses += 1;
}
else if (state[tid] == 2) {
//sleep(sle);
state[tid] += 1;
}
else {
//sleep(sle);
state[tid] = 0;
}
}
pthread_exit (NULL);
}
int main()
{
start_t = clock();
pthread_t threads[NUM_THREADS];
int rc;
long t;
// init data
bridge_crosses = 0;
accidents = 0;
for (t = 0; t < NUM_THREADS; t++) {
state[t] = 0;
printf ("In main: creating thread %ld\n", t);
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 accidents: %d \n time: %f \n", bridge_crosses, accidents, total_t);
/* Last thing that main() should do */
pthread_exit (NULL);
return 0;
}
Alles anzeigen
meine Makefile:
CC = gcc
CFLAGS = -std=c11 -Wall -Wextra -pedantic -O2 -g -pthread
#CPPFLAGS = -MMD -MF $*.d #activate only if you want extra output as .d files
# TODO: edit BIN with your target binary (e.g. exercise01)
BIN = uebung02
OBJS = $(BIN).o
all: $(BIN)
# uncomment this if you want object files
#$(BIN): $(OBJS)
run: $(BIN)
./$(BIN)
# define test cases here
test1: $(BIN)
./$(BIN) 5
test2: $(BIN)
./$(BIN) 10
# run all testcases
test: test1 test2
clean:
@$(RM) -v $(BIN) *.o *.d
.PHONY: clean all
Alles anzeigen
Output so:
[...]
thread waiting
thread waiting
thread waiting
tid: 2, unlocked
thread waiting
tid: 4 doing stuff
tid: 4, unlocked
bridge crosses: 14
accidents: 0
time: 0.019173
output ohne:
./uebung02
In main: creating thread 0
In main: creating thread 1
Hello World! It's me, thread #0 !
tid: 0, my ticket is: 1
tid: 0 doing stuff
In main: creating thread 2
Hello World! It's me, thread #1 !
tid: 1, my ticket is: 2
tid: 0, unlocked
In main: creating thread 3
tid: 0, my ticket is: 3
Hello World! It's me, thread #2 !
tid: 2, my ticket is: 4
In main: creating thread 4
Hello World! It's me, thread #3 !
tid: 3, my ticket is: 5
Hello World! It's me, thread #4 !
tid: 4, my ticket is: 6
und dann ist ein deadlock (also passiert nichts mehr...
Oh tut mir leid (wenn man so in Gedanken ist, vergisst man immer, dass ihr ja nicht alles habt wie ich :3).
Also Ausgangspunkt:
Wir sollen mit pthreads eine Simulation bauen. (von Autos die über die Brücke fahren aber immer einzeln)
Im Code sollen wir noch ohne Hardware oder Betriebssystem Unterstützung arbeiten, um kritische Abschnitte zu bearbeiten.
Die Threads generieren sich ganz normal,
hier die lock und unlock Methoden, für den kritischen Abschnitt:
int lock (long tid) {
int i, max = 0;
enter[tid] = 1;
for (i = 0; i < NUM_THREADS; i++) {
if (max < tickets[i])
max = tickets[i];
}
tickets[tid] = max + 1;
enter[tid] = 0;
printf("tid: %ld, my ticket is: %d\n", tid, tickets[tid]);
for (i = 0; i < NUM_THREADS; i++) {
if (i != tid) {
while (enter[i])
;
while((tickets[i] != 0) && ((tickets[tid] > tickets[i]) || ((tickets[tid] == tickets[i])&&(tid > i))))
{
printf("thread waiting\n");//ohne das geht es nicht O.o
}
}
}
return 0;
}
int unlock (long tid) {
printf("tid: %ld, unlocked \n", tid);
tickets[tid] = 0;
return 0;
}
Alles anzeigen
Die Endlosschleifen sind wichtig, da die Threads während des kritischen Abschnittes nichts tun dürfen, da es sonst zu Fehlern kommt.(2 Autos auf der Brücke)
Das "random Semikolon" ist doch dafür, dass die Endlosschleife funktioniert oder nicht? Wie schreibt man das sonst besser?
So nun das Problem:
Wenn ich das
entferne, kommt es zu einem Deadlock. Warum weiß ich aber nicht.
(es ergibt für mich auch keinen Sinn)
Kaliber (Wieso ist der Code maximal dirty? Wie schreibt man das besser?)