Kleines Speicherproblem bzw malloc Verständnis
-
warum willst du dein query überhaupt auf dem heap mit malloc/new erstellen? in deinem falle reicht doch eine einfache stack-variable:
char query[100];
die wird automatisch ferigegen, da brauchst du dich gar ncit drum kümmern.
-
Ah, ok.
Also dann so?
bool checkOP (MString *Sender) { char query [100]; MYSQL_RES *res; MYSQL_ROW row; sprintf(query, "select * from operatorenliste where operator='%s';",Sender->print());dann noch das delete [] raus und gut ist, ja?
-
... if ((mysql_fetch_row(res)>0)||(*Sender=="abcde")) delete [] query; return(1); ...Jetzt wird das delete[] beim if-Fall ausgeführt nicht aber das return. Zum einen, wie angemerkt kasst du hier auch mit einem normalen Array arbeiten, zum anderen solltest du Klammern...
Nachtrag: Bzw. das return wird nun immer ausgeführt, dein Compiler sollte wenn er gut ist meckern das es "unreachable code" gibt...... if ((mysql_fetch_row(res)>0)||(*Sender=="abcde")) { delete [] query; return(1); } ...Einrücken würde ich dir auch empfehlen...
cu André
-
Ich habe es nun so geschrieben:
bool checkOP (MString *Sender) { char query [100]; MYSQL_RES *res; MYSQL_ROW row; sprintf(query, "select * from operatorenliste where operator='%s';",Sender->print()); res=SQLGetCommand(query); if ((mysql_fetch_row(res)>0)||(*Sender=="abcde")) { return(1); } else { MString x; x = "/w "; x = x + Sender->print(); x = x + " Du bist nicht berechtigt diesen Befehl ausführen zu lassen."; ChatBot.say(x.print()); return(0); } }Was ist eigentlich, wenn ich in dem void noch ein anderes query ausführen möchte? Kann ich dann einfach das char query[100]; neu füllen? Oder erstelle ich dann einfach ein neues?
Gruß,
SKB
-
Also das mit dem Einrücken solltest du noch lernen, üblich sind zum Beispiel die drei folgenden Stile:
int main() { ... if(irgendwas) { ... } else { ... } ... } int main() { ... if(irgendwas) { ... } else { ... } ... } int main() { ... if(irgendwas) { ... } else { ... } ... }Unabhängig was du machst, Einrücken erleichtert das Lesen, du solltest aber versuchen im Stil konsistent zu bleiben. Man findet schneller heraus wozu ein bestimmtes Statement gehört. Ich selber präferiere eigentlich den ersten Stil, das ist aber persönlicher Geschmack (so übersehe ich seltener die öffnende Klammer). Bei sehr kurzen Funktionen (Ein- oder Zweizeiler) nutze ich auch mal den letzteren.
SKB schrieb:
...Was ist eigentlich, wenn ich in dem void noch ein anderes query ausführen möchte? Kann ich dann einfach das char query[100]; neu füllen? Oder erstelle ich dann einfach ein neues?...
Mit dem void???
Aber grundsätzlich: Ja du kannst eine Variable mehrfach verwenden, solltest dies aber nur tun wenn man im Code erkennen kann was gemeint ist (nicht das man später etwas ergänzt und nicht bemerkt das die Variable schon mit anderen Werten als erwartet gesetzt wird). Es gibt einfach nur eine potentielle Fehlerquelle auf die man aufpassen sollte.
cu André
-
Also das Einrücken finde ich bei meinem Beitrag, den ich zuletzt erstellt habe schonmal gar nicht schlecht

Also kann ich hingehen:
char query [100]; sprintf(query, "insert into table (id, name) VALUES ('%s', %s);", z.print(), SenderX->print()); SQLCommand(query); // und hier dann ein neues sprintf sprintf(query, "select * from table where Wert='Wert';"); SQLCommand(query);Zumindest meckert der Compiler da nicht und die Daten werden einwandfrei ausgelesen.
Gruß,
SKB
-
Ja, das geht auf jeden Fall
Und der Variablen-Name passt auch zur Verwendung, deshalb ist das auch noch gut zu lesen.
-
Dankeschön

Also verstehe ich auch richtig, dass das neue sprintf einfach das alte "überschreibt"?
Somit hätte ich ja dann mein malloc() Problem gelöst und alles ist fein

-
SKB schrieb:
Also verstehe ich auch richtig, dass das neue sprintf einfach das alte "überschreibt"?
Ja, das sprintf überschreibt den bestehenden Inhalt mit etwas neuem (was bei längeren Funktionen auch gerne mal übersehen wird ;P aber zu lange Funktionen sollte man eh vermeiden).
cu André
-
Super

Ich danke dir für die schnelle Hilfe. Habe viel gelernt und viel verändert. Seitdem läuft das Prog nun zur vollsten Zufriedenheit
