int problém v g ++ / MySQL / redhat

hlasů
0

Nepsal jsem C na delší dobu a píši aplikace pomocí API MySQL C, kompilaci v g ++ na RedHat.

Takže začnu výstup některá pole s printfs ... použití Oracle API, pomocí Pro * C, který jsem použil k použití (na SUSE před lety), jsem mohl zvolit int i výstup to jako:

int some_int;
printf ( % i, some_int);

Snažil jsem se dělat, že s MySQL ints a já mám zobrazena 8 náhodných čísel ... Myslel jsem, že to byl problém mysql api a některé config problém s mým serverem, a já promarnil několik hodin se snaží opravit, ale nešlo to, a zjistil, že jsem mohl udělat:

int some_int;
printf ( % s, some_int);

a to tak, vytisknout číslo správně. Vzhledem k tomu, já nedělám výpočty na hodnotách Jsem těžebním, myslel jsem, že toto použití stalo v pořádku řešení.

Dokud jsem se snažil spočítat některé věci ....

Udělal jsem jednoduchý:

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

Jsem stále 8místný náhodné číslo znovu ... Nemohl jsem přijít na to, co dohoda je s ints na tomto stroji.

Pak jsem si uvědomil, že pokud i inicializaci int na nulu, pak jsem si správné číslo.

může mi někdo prosím vysvětlete mi, za jakých podmínek je třeba inicializovat int proměnné na nulu? Nevzpomínám si, že dělá tento pokaždé, když ve svém starém codebase, a já jsem to neviděl v příkladu, že jsem byl modelování můj mysql_stmt kód z ...

Je tu něco, co mi chybí? Také, to je docela možné, že jsem zapomněl je to nutné pokaždé

dík...

Položena 02/04/2009 v 17:43
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
1

Vždycky neet inicializovat proměnné. Chytit tento druh chyby, asi byste měli kompilace s -Walldát všechna varování, které g++může poskytnout. Také jsem raději použít -Werror, aby všechny chyby varování, protože je to téměř vždy platí, že výstraha indikuje chybu nebo potenciální chyby a vyčištění kódu je lepší, než nechat ji tak jak je.

Také ve svém druhém printf, kterou jste použili %s, který je určen pro tisk strun, nikoli celá čísla.

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

Je to, co chcete.

Odpovězeno 02/04/2009 v 17:56
zdroj uživatelem

hlasů
1

budou nastaveny na nulu pouze globální a statické hodnoty. Proměnné v zásobníku bude vždy obsahovat odpadky hodnotu, pokud není inicializována.

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
}
Odpovězeno 02/04/2009 v 17:48
zdroj uživatelem

hlasů
1

Pokud nechcete inicializovat proměnné, není žádná záruka, výchozí 0 / NULL / jakékoliv hodnotě. Některé kompilátory MOHLY inicializovat na hodnotu 0 pro vás (IIRC, MSVC ++ 6.0 by tak laskav, aby tak učinily), a jiní nemusí. Takže se nemusíte spoléhat na to. Nikdy použít proměnnou, aniž by nejprve dávat to nějaký rozumný hodnoty.

Odpovězeno 02/04/2009 v 17:45
zdroj uživatelem

hlasů
0

Neinicializované variabilní.

int some_int = 0;
Odpovězeno 02/04/2009 v 17:50
zdroj uživatelem

hlasů
0

Skutečně jste zapomněli. V C a C ++, nemusíte dostat žádné automatické inicializace; obsah cpoté, co int c;jsou, co se stane, že na adrese uvedené na které cv té době.

Nejlepší praxe: inicializovat při definici: int c = 0;.

Oh, PS, a trvat nějakou péči, že MySQL typ int odpovídá typu C int; Myslím, že ano, ale nejsem pozitivní. Bude to však, jak architekturu a překladač citlivá, protože sizeof(int)není stejná ve všech prostředích C.

Odpovězeno 02/04/2009 v 17:46
zdroj uživatelem

hlasů
0

Variabilní nejsou automaticky inicializuje vc.

Odpovězeno 02/04/2009 v 17:46
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more