Discussion:
[c++] gdzie jest blad?
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
the_foe
2008-03-01 22:06:26 UTC
Permalink
juz mi rece opadaja :/
uzywam wxdev
mam taki kodzik:

...
char** ilekf=sq.getzap(str);

ilekf to zawsze dwuelementowa tablica

drugi element to zawsze liczba ale zapisana jako char

sprawdzamy czy dziala:
wxMessageBox(ilekf[1], "cos tam",wxOK|wxICON_ERROR,this);

i poprawnie wyswietla.

teraz konwersja:
int ile;
ile=atoi(ilekf[1]);

i teraz juz nie dziala!!!
Parser nie pokazuje zadnych bledow. program, po kompilacji (bez bladow) po
prostu dochodzac do tego punktu sam sie wylacza.

najlepsze ze jak sam podstawie dane (a nie wezme z bazy) np:
char* ilekf[2]={"22","33"};

to wszystko gra.
Damian 'legion' Szuberski
2008-03-01 23:20:46 UTC
Permalink
Post by the_foe
...
char** ilekf=sq.getzap(str);
ilekf to zawsze dwuelementowa tablica
drugi element to zawsze liczba ale zapisana jako char
Elementami są tablice charów a nie liczby...
--
Damian Szuberski
the_foe
2008-03-02 10:42:19 UTC
Permalink
Post by Damian 'legion' Szuberski
Elementami są tablice charów a nie liczby...
prosze czytac dokladnie....
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
Sc0rpi0
2008-03-02 11:21:50 UTC
Permalink
Post by the_foe
Post by Damian 'legion' Szuberski
Elementami są tablice charów a nie liczby...
prosze czytac dokladnie....
No własnie ;)
Post by the_foe
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
A jesteś pewien, że jest '\0' w tablico-elemencie zwracanym przez funkcję ?
Jak nie ma to co się dziwić, że się może wywalać ? Jak podajesz ręcznie "44"
to jest to faktycznie '4','4','\0'.
--
Sc0rpi0 - [...] jakiś dziwak rzucał im pocięte kawałki drutu. Powiedziałem,
że [...] nie jadają tego. -Nie zależy mi na tym, by go jadły - odparł, [...]
-Ale mogą się udławić, [...] -Nie udławią się, bo drut tonie. [...]
-Więc po co pan rzuca ? Bo lubię karmić łabędzie.
the_foe
2008-03-02 11:47:01 UTC
Permalink
Post by Sc0rpi0
Post by the_foe
Post by Damian 'legion' Szuberski
Elementami są tablice charów a nie liczby...
prosze czytac dokladnie....
No własnie ;)
Post by the_foe
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
A jesteś pewien, że jest '\0' w tablico-elemencie zwracanym przez funkcję ?
Jak nie ma to co się dziwić, że się może wywalać ? Jak podajesz ręcznie "44"
to jest to faktycznie '4','4','\0'.
mowiac prawde nie wiem, jestem ziolony w C++ i programuje mocno na czuja
bazujac na innych znanych mi jezykach (PHP, Delphi, VB, troche Javy)

wynik ktory jest atablica charow pobieramn z tej funkcji:

char** sqlite::getzap(char *zap)
{

char *zErrMsg = 0;
sqlite *db;
db = sqlite_open("jakasbaza.db", 0,&zErrMsg);


char **result;int rows;int cols;bool rc;
rc = sqlite_get_table(db, zap, &result, &rows, &cols,&zErrMsg);
if (rc!=SQLITE_OK){
return 0;
}else{

return result;
}


}

wynik z zapytania z SQL gdzie pytam o ilosc wynikow "SELECT COUNT(*) ile
FROM jakasbaz WHERE id_user='2';".
Otrzymuje dwuelementowa tablice z char* gdzie pierwsza to nazwa kolumny
(ile) a druga to wartosc liczbowa, ale otrzymana jako char*
Jak pisalem kiedy sprawdzam otrzymana wartosc msgboxem to mi ja wyswietla.
Wszytko wywala sie kiedy chce ja konwertowac na int.
Najlepsze jest to ze kompilator nie widzi zadnych bledow. I pierwsze
uruchomienie po kompilacji daje mi prawidlowy wynik. Dopiero kiedy
uruchamiam "recznie" skompilowany plik (wszytko linkowane statycznie) to
wywala sie w miejscu konwersji (sprawdzone metoda prob i bledow).
Tmk
2008-03-02 13:27:15 UTC
Permalink
To napisz własną funkcję do zamiany stringa na int, i może wtedy będziesz wiedział czemu się wywala.
the_foe
2008-03-02 13:52:07 UTC
Permalink
Post by Tmk
To napisz własną funkcję do zamiany stringa na int, i może wtedy będziesz wiedział czemu się wywala.
nie bede wiedzial - jak pisalem kompilator nie wywala ZADNYCH bledow.
the_foe
2008-03-02 14:44:37 UTC
Permalink
Post by the_foe
Post by Sc0rpi0
Post by the_foe
Post by Damian 'legion' Szuberski
Elementami są tablice charów a nie liczby...
prosze czytac dokladnie....
No własnie ;)
Post by the_foe
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
A jesteś pewien, że jest '\0' w tablico-elemencie zwracanym przez funkcję ?
Jak nie ma to co się dziwić, że się może wywalać ? Jak podajesz ręcznie "44"
to jest to faktycznie '4','4','\0'.
mowiac prawde nie wiem, jestem ziolony w C++ i programuje mocno na czuja
bazujac na innych znanych mi jezykach (PHP, Delphi, VB, troche Javy)
char** sqlite::getzap(char *zap)
{
char *zErrMsg = 0;
sqlite *db;
db = sqlite_open("jakasbaza.db", 0,&zErrMsg);
char **result;int rows;int cols;bool rc;
rc = sqlite_get_table(db, zap, &result, &rows, &cols,&zErrMsg);
if (rc!=SQLITE_OK){
return 0;
}else{
return result;
}
}
very dziwne
jak zapytam tak

char idu[2];
itoa(this->idofuser,idu,10);
sqlite sq;

char str[200];

strcat(str,"SELECT COUNT(*) ile FROM zlom WHERE
id_user='");
strcat (str,idu);
strcat(str,"';");


char** ilekf=sq.getzap(str);

to mi po probie przeksztalcenia wywala

a jak zrobie tak:




char** ilekf=sq.getzap("SELECT COUNT(*) ile FROM zlom WHERE
id_user='2';");

to juz konwersja jest ok.
czego nie wiem?
the_foe
2008-03-02 15:05:58 UTC
Permalink
Post by the_foe
char str[200];
strcat(str,"SELECT COUNT(*) ile FROM zlom WHERE
id_user='");
strcat (str,idu);
strcat(str,"';");
i problem rozwiazany, zastapile strcat sprintf i dziala...
moze ktos jest w stanie mi wyjasnic czemu strcat robi tyle problemow...

Pozdr
Adam Karpierz
2008-03-02 15:40:26 UTC
Permalink
Post by the_foe
moze ktos jest w stanie mi wyjasnic czemu strcat robi tyle problemow...
To nie strcat winny ale samo C
Post by the_foe
Post by the_foe
char str[200];
to nie jest string.

To miejsce na ciag bajtow ktore
(w przypadku gdy jest zmienna lokalna) nie
jest w zaden sposob inicjowane/zerowane.
Tam sa po prostu smieci , a strcat szuka '\0'
No i sam sobie odpowiedz gdzie go znajdzie.

PS: Unikaj jak ognia char []
Do stringow stosuj std::string

AK
the_foe
2008-03-02 15:50:33 UTC
Permalink
Post by Adam Karpierz
to nie jest string.
a kto powiedzial ze jest?
Post by Adam Karpierz
To miejsce na ciag bajtow ktore
(w przypadku gdy jest zmienna lokalna) nie
jest w zaden sposob inicjowane/zerowane.
Tam sa po prostu smieci , a strcat szuka '\0'
No i sam sobie odpowiedz gdzie go znajdzie.
PS: Unikaj jak ognia char []
Do stringow stosuj std::string
ale sprintf jak i API sqlite operuje na charach.
Remek
2008-03-04 12:21:18 UTC
Permalink
Post by Adam Karpierz
To nie strcat winny ale samo C
Czy strcat jest jakimś samodzielnym bytem, niezależnym od języka?

Remek
Adam Karpierz
2008-03-04 12:23:28 UTC
Permalink
Post by Remek
Czy strcat jest jakimś samodzielnym bytem, niezależnym od języka?
Owszem.

AK

Adam Karpierz
2008-03-02 15:17:20 UTC
Permalink
Post by the_foe
char str[200];
strcat(str,"SELECT COUNT(*) ile FROM zlom WHERE id_user='");
strcpy(str,"SELECT COUNT(*) ile FROM zlom WHERE id_user='");

AK
Damian 'legion' Szuberski
2008-03-02 13:43:31 UTC
Permalink
Post by the_foe
Post by Damian 'legion' Szuberski
Elementami są tablice charów a nie liczby...
prosze czytac dokladnie....
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
To jest tablica charów.
--
Damian Szuberski
Adam Karpierz
2008-03-02 13:49:35 UTC
Permalink
Post by Damian 'legion' Szuberski
Post by the_foe
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char*
costam="44";
To jest tablica charów.
W kwestii formalnej:

Nieprawda.
To zupelnie co innego.

char* costam = "44"; // to jest wskaznik
a
char costam[] = "44"; // to jest tablica

PS: (sizeof(char*) != sizeof(char [])).

AK
Adam Karpierz
2008-03-02 13:53:06 UTC
Permalink
Post by Adam Karpierz
char costam[] = "44"; // to jest tablica
eh.. przepraszam za slowo
Mialo byc 'tablica' :).
(W C nie ma tablic w normalnym tego slowa znaczeniu).

AK
Damian 'legion' Szuberski
2008-03-02 15:39:49 UTC
Permalink
Post by Adam Karpierz
Post by Damian 'legion' Szuberski
Post by the_foe
mama char, ale mozliwy do pzreksztalcenia w liczbe. np. char* costam="44";
To jest tablica charów.
Nieprawda.
To zupelnie co innego.
char* costam = "44"; // to jest wskaznik
a
char costam[] = "44"; // to jest tablica
PS: (sizeof(char*) != sizeof(char [])).
Wiem doskonale, to był skrót myślowy.
--
Damian Szuberski
the_foe
2008-03-02 13:51:02 UTC
Permalink
Post by Damian 'legion' Szuberski
To jest tablica charów.
no wiem, i co z tego wynika?
Loading...