2009-04-02 5 views
0

Ich habe nicht C geschrieben und schreibe eine Anwendung mit der MySQL C-API, in g ++ auf Redhat kompilieren.int Problem in g ++/mysql/redhat

So starten ich einige Felder mit printfs Ausgeben ... das Orakel api verwenden, mit PRO * C, das ich verwende verwendet (auf suse, vor Jahren), ich könnte einen int auswählen und ausgeben als:

Ich habe versucht, das mit mysql ints zu tun und ich habe 8 Zufallszahlen angezeigt ... ich dachte, das war ein mysql-api-Problem und ein config-Problem mit meinem Server, und ich verschwendete ein paar Stunden, um es zu beheben, aber konnte nicht, und festgestellt, dass ich tun konnte:

 
int some_int; 
printf("%s",some_int); 

und es würde die ganze Zahl richtig ausdrucken. Weil ich keine Berechnungen über die Werte mache, die ich extrahiere, fand ich das eine gute Lösung.

bis ich einige Dinge ....

hat zu zählen TRIED

ich ein einfaches:

 
int rowcount; 
for([stmt]){ 
rowcount++; 
} 
printf("%i",rowcount); 

i wieder eine 8-stellige Zufallszahl immer bin ... Ich konnte nicht herausfinden, was Der Deal ist mit Ints auf dieser Maschine.

dann erkannte ich, dass, wenn ich den Int auf Null initialisieren, dann bekomme ich eine richtige Zahl.

kann mir bitte jemand erklären unter welchen bedingungen sie initialize auf null initialisieren müssen? Ich erinnere mich nicht, dies jedes Mal in meiner alten Codebasis zu tun, und ich sah es nicht in dem Beispiel, dass ich meine mysql_stmt-Code von modellierte

Ist da etwas, was ich vermisse? auch ist es durchaus möglich, die ich vergessen habe dies jedes Mal erforderlich ist

dank ...

+0

Sie zeigen nicht den gesamten Code in diesem Fall an, fügen Sie bitte den Code, den Sie verwenden, um ein int aus der Datenbank auszuwählen, da Sie gerade gerade Mülldaten drucken. –

Antwort

1

Wenn Sie nicht Ihre Variablen initialisieren, gibt es keine Garantie für eine Standard 0/NULL/was auch immer Wert. Einige Compiler könnten es für Sie auf 0 initialisieren (IIRC, MSVC++ 6.0 wäre dafür ausreichend), andere nicht. Also verlass dich nicht darauf. Verwenden Sie niemals eine Variable, ohne zuerst einen vernünftigen Wert zu geben.

0

Variable werden in c nicht automatisch initialisiert.

0

Sie haben in der Tat vergessen. In C und C++ erhalten Sie keine automatische Initialisierung; der Inhalt von c nach int c; ist, was auch immer passiert, an der Adresse zu sein, auf die sich c zu der Zeit bezieht.

Best Practice: initialisieren bei der Definition: int c = 0;.

Oh, PS, und achten Sie darauf, dass der MySQL-Int-Typ mit dem C-Int-Typ übereinstimmt; Ich denke es ist aber ich bin nicht positiv. Es wird jedoch sowohl die Architektur als auch der Compiler empfindlich sein, da sizeof(int) nicht in allen C-Umgebungen gleich ist.

1

Nur globale und statische Werte werden auf Null initialisiert. Die Variablen im Stapel enthalten immer einen ungültigen Wert, wenn sie nicht initialisiert sind.

int g_var; //This is a global varibale. So, initialized to zero 
int main() 
{ 

int s_var = 0; //This is on stack. So, you need to explicitly initialize 
static int stat_var; //This is a static variable, So, initialized to zero 
} 
+0

perfekt! Das ist der Unterschied, nach dem ich gesucht habe ... vielen Dank. –

+0

um zu verdeutlichen, verwende ich alle Globals für die Bind-Variable an der Spitze des Programms, die zu meiner Verdunkelung in diesem Problem führen ... Danke –

+0

Sind globale Variablen auf Null auf Null initialisiert? Ich erinnerte mich vage daran, dass es sich nur um ein UNIX-Verhalten handelte, aber ich könnte mich irren. – ephemient

0

Nicht initialisierte Variable.

int some_int = 0; 
1

Sie müssen immer Ihre Variablen initialisieren. Um diese Art von Fehler zu erfassen, sollten Sie wahrscheinlich mit -Wall kompilieren, um Ihnen alle Warnungen zu geben, die g++ bieten kann. Ich bevorzuge es auch, -Werror zu verwenden, um alle Warnungen Fehler zu machen, da es fast immer der Fall ist, dass eine Warnung einen Fehler oder einen möglichen Fehler anzeigt, und dass das Bereinigen des Codes besser als das Verlassen ist, wie es ist.

Auch in Ihrem zweiten printf verwendeten Sie %s, die zum Drucken von Zeichenfolgen, keine Ganzzahlen ist.

int i = 0; 
printf("%d\n", i); 
// or 
printf("%i\n", i); 

Ist was du willst.