Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

wsprintf PROBLEMI!!!

[es] :: C/C++ programiranje :: wsprintf PROBLEMI!!!

Strane: 1 2

[ Pregleda: 3998 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon wsprintf PROBLEMI!!!12.03.2006. u 01:21 - pre 221 meseci
radim neki Win32 program, i hoću da mi jedna STATIC kontrola prikazuje trenutno vreme
pri prihvatanju poruke WM_TIMER pozivam funkciju GetSystemTime i za formatiranje teksta koji će da stoji u toj kontroli, pri pozivu wsprintf funkcije dolazi do Access Violation

evo koda :

case WM_TIMER:
{
SYSTEMTIME st;
GetSystemTime(&st);
LPSTR tm = NULL;
wsprintf((LPTSTR)tm, "%d : %d : %d", st.wHour, st.wMinute, st.wSecond);
SetWindowText(tw->hTimerStatic, (LPCTSTR)tm);
UpdateWindow(tw->hTimerStatic);
break;
}

dakle, on ni ne prođe liniju u kojoj se poziva wsprintf

takođe mi je isto grešku izbacivao i ranije u kodu koji je bio privemen, pa sam ga uklonio iz programa, ali ovo mi treba, pa ne znam
pomišljam da je generalno problem u okruženju u kome radim , da sam ga nešto loše podesio, mada sam samo menjao syntax highlight i veličinu taba

to mi se ranije nije dešavalo, a nemam pojma zašto se sada dešava
inače, koristim MSVS .NET 2003, ako je to bitno

da li neko možda zna o čemu se radi?

[Ovu poruku je menjao stargazer dana 12.03.2006. u 02:25 GMT+1]
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 07:44 - pre 221 meseci
Code:
LPSTR tm = NULL;

pises na NULL string, prvo ga alociraj
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 11:23 - pre 221 meseci
ne razumem ovaj odgovor

uvek sam na gore navedeni način koristio wsprintf funkciju i radila je kako treba

da dodam samo dve stvari :
probao sam i sa sprintf i sa kombinacijom strcpy i itoa ( sa char * ), ali i u ta 2 slučaja izbacuje runtime grešku

a na račun onoga da je možda do okruženja samo bih dodao da sam sve fajlove sačuvao sa codepage 1250, central european, ako to ima neke veze, mada ne znam što bi imalo

još nešto da dodam : Kada idem debug na problematičnoj liniji, on me odvede u sors fajla crt0.c, na neku liniju na kojoj se uzima povratna vrednost funkcije WinMain

[Ovu poruku je menjao stargazer dana 12.03.2006. u 13:10 GMT+1]
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 13:13 - pre 221 meseci
Nemam iskustvo iz Win API i njihovih hieroglipha.
Ali ako je LPSTR isto sto i char* onda to ne moze raditi.
...
a LPSTR je to
Citat:
Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.


Znaci da pokusavas pisati na nesto sto "ne postoji" - nulstring.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 13:54 - pre 221 meseci
NrmMyth je u pravu. Pišeš na nealociranu memoriju.

Citat:
stargazer: uvek sam na gore navedeni način koristio wsprintf funkciju i radila je kako treba


Ako je radila kako treba, sasvim sigurno je nisi koristio na taj način. Zameni liniju:

LPSTR tm = NULL;

sa (npr, mada nije baš bezbedno):

char tm[100];
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 16:28 - pre 221 meseci
ne znam šta da kažem...

LPSTR bi trebalo da bude isto što i char *, ali ko će ga više znati sa Microsoftom
jer ja sam koristio char * str = NULL, pa onda tu promenljivu u wsprintf i sasvim je lepo radilo u jednom drugom programu, a sada sam stavio LPSTR i dešava se šta se dešava

elem, hvala na pomoći, deklaracija char [100] rešava problem
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 18:47 - pre 221 meseci
Drago mi je da ti radi sad.

Ali shvati da " char * str = NULL " ne radi nigdje, ako je bilo bas ovako onda ne moze raditi. Kao programer ne mozes uzimati stvari zdravo za gotovo.

str mora pokazivati na alocirani blok memorije
LPSTR str = new char[SIZE];
bi ti takodjer trebalo rijesiti problem

Moguce je da si tad kad ti je "radilo" na "putu" izmedju str = NULL i wsprinta imao neku funkciju koja ti je namjestila str na blok memorije.
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 20:09 - pre 221 meseci
Citat:
Ali shvati da " char * str = NULL " ne radi nigdje, ako je bilo bas ovako onda ne moze raditi. Kao programer ne mozes uzimati stvari zdravo za gotovo.

str mora pokazivati na alocirani blok memorije
LPSTR str = new char[SIZE];
bi ti takodjer trebalo rijesiti problem

Moguce je da si tad kad ti je "radilo" na "putu" izmedju str = NULL i wsprinta imao neku funkciju koja ti je namjestila str na blok memorije.


ja stvarno ne želim da se prepirem oko toga da li radi char * str = NULL
ako hoćeš poslaću ti sors koji sam kompajlirao nekada u MSVS 2005, i program koji ne generiše runtime grešku sa tom linijom, pa probaj da li radi...

taj kod izgleda ovako ( tačno citiram taj sors... ):

void FatalErrorMsg2(DWORD ErrMsg)
{
char * str = NULL;
LPVOID lpMsgStr;

FormatMessage(FMT_MSG, NULL, ErrMsg, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgStr, 0, NULL);
wsprintf(str, "Error ( %d ) : %s", ErrMsg, (LPCTSTR)lpMsgStr);
MessageBox(0, str, "Fatalna Greska", MB_OK | MB_ICONERROR);
}

gde je parametar ErrMsg dobijen sa GetLastError() pre poziva funkcije gore


[Ovu poruku je menjao stargazer dana 12.03.2006. u 21:13 GMT+1]
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 20:41 - pre 221 meseci
Ostao sam bez texta! Molim te posalji mi cijeli kod na PM.
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 21:22 - pre 221 meseci
LPSTR tm = NULL;

tm - ukazuje na dio memorije u koju wsprintf funkcija moze da upise odgovarajuci sadrzaj. Obzirom da ti je tm = NULL, odnosno ne ukazuje na slobodnu memoriju, program mora da pukne.

Pogledaj help o funkcijam koje allociraju memoriju i vracaju pokazivac na slobodnu memoriju: calloc, GlobalAlloc, new (c++) ... itd

Naravno da mozes i da koristis memoriju fiksne velicine poput:
char tm[100];

Ali ako wsprintf funkcija ima potrebu da upise i vise od ovih 100 alociranih bajtova, onda ce poceti da pise po sledecem bloku memorije. Ovo moze da ti potpuno "preuredi" sadrzaj neke druge varijable ili da ti program pukne (crash).

Prema logici tvog programa char tm[100]; bi trebalo biti dosta, ali ako ne razumijes alociranje memorije i pokazivace na slobodnu memoriju onda ces prije ili kasnije naici na problem koji ce ti zadati mnogo vise muke.

Lj.
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon Re: wsprintf PROBLEMI!!!12.03.2006. u 21:37 - pre 221 meseci
Evo ti jedan primjer sta wsprintf i slicne funkcije mogu da urade (C program):

Code:


typedef struct _TESTMEMORIJE
{
char  varprva[5];
char  vardruga[15];
}TESTMEMORIJE, *LPTESTMEMORIJE;

static TESTMEMORIJE test1;



int main(int argc, char *argv[])
{

  ZeroMemory(&test1,sizeof(test1)); // ocisti memoriju na koju pokazuje test1 varijabla

  // pokazi da su test1.varprva i test1.vardruga zaista prazne
  printf("sadrzaj memorije prije prva=%s, druga=%s\n", test1.varprva, test1.vardruga);

  // upisi sadrzaj u test1.varprva  - obrati paznju da je predvidjeno samo 5 bajtova u typedef
  wsprintf(test1.varprva,"zdravo svete"); 

  // prikazi sadrzaj nakon wsprintf-a
  printf("sadrzaj memorije posle prva=%s, druga=%s\n", test1.varprva, test1.vardruga);
  return 0;   //  End of main program
}



U zavisnosti od kompajlera, trenturnog stanje memorije i sl, ovaj program ce se mozdra izvrsiti ili ce puci, ali u svakom slucaju demonstrira kako ce wsprintf funkcija pregaziti sadrzaj test1.vardruga koja bi trebala biti prazna.

Na mom racunaru i kompajlirano sa lcc-om

dobivam:

sadrzaj memorije prije prva=, druga=
sadrzaj memorije posle prva=zdravo svete, druga=o svete

Ocigledno je da je test1.vardruga pregazena sa wsprinf funkcijom.

U kompleksnijim programima ovakva greska bi mogla da ti prepise sadrzaj bilo koje varijable ili da pokusa upis u dio memorije koji je zauzeo neki drugi program.






 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!13.03.2006. u 11:29 - pre 221 meseci
razumem se ja u alociranje memorije i razumem sve što je do sada navedeno u korist toga zašto kod
char * str = NULL;
ne radi i može da pukne...

prema logici mog programa ( tm[100] ) meni je tm[15] je bilo dovoljno za prikaz trenutnog vremena u obliku hh : mm : ss, ali nije u tome poenta

primetio sam da još neki kod koji je u nejmanju ruku sumnjivog karaktera neće da se kompajlira u MSVS 2003, a hteo je u 2005... ( naravno da bez grešaka radi )
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
81.93.74.*



+2 Profil

icon Re: wsprintf PROBLEMI!!!14.03.2006. u 13:53 - pre 221 meseci
Druže da ti razumiješ pointere i alociranje memorije onda sigurno nebi postavio ovo pitanje.

Više ljudi ti je reklo da ne možeš poslati ne alociranu memoriju wsprintf funkciji i predlažem ti da ipak pročitaš nešto o tome.

 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!14.03.2006. u 16:53 - pre 221 meseci
ja stvarno ne razumem ovaj odgovor, mada možda ljudi jednostavno traže izgovor da postave post

rekoh u prethodnim postovima na ovu temu da IMAM program koji radi sa diskutabilnom linijom ( kroz ceo kod ) i da sam više nego voljan da ga pošaljem zajedno sa sorsom, ali nemam nameru da ga šaljem na PM jer je prevelik
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: wsprintf PROBLEMI!!!14.03.2006. u 22:01 - pre 221 meseci
@stargazer:
Ljudi ti lepo kazu da to ne moze da radi... to sto kod tebe radi je cista slucajnost.
Svaki pristup nealociranoj memoriji izaziva pucanje aplikacije.

Nema potrebe da saljes source... niko nece da se smara sa tim.
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: wsprintf PROBLEMI!!!14.03.2006. u 22:05 - pre 221 meseci
mods->delete(this_post);
mods->lock(this);
Ipak se ++uje.
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!15.03.2006. u 02:25 - pre 221 meseci
kod računara bi trebalo sve da bude tačno i jasno određeno a ne da na osnovu slučajnosti nešto radi ili ne...

DAKLE : ili puca ili ne

ja rekoh da kapiram svu priču, i da bi mi radio program ja prvo kako rekoste alociram memoriju i ne kažem da bilo ko nije u pravu

ali neka onda neko objasni ono što čovek mrtav ladan nazva "slučajnost" ( ćutanje je zlato ), a ne svi da drve kako nešto ne može

P.S. :

Code:

#!/bin/sh
$PID = "Mali Misha"
kill -9 $PID
echo Feels gooooooooooooooooooood..........



[Ovu poruku je menjao stargazer dana 15.03.2006. u 03:48 GMT+1]
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: wsprintf PROBLEMI!!!15.03.2006. u 11:52 - pre 221 meseci
O svemu je vec dovoljno receno.

Ako procesljas ostatak foruma, verovatno ces naci par tema i o tome zasto nije bas *da mora da ne moze* ali u principu *ne moze*.

Plus - pozivam se na pravo na repliku:
Code:
-bash: kill: ($PID) - Operation not permitted
echo Jo kann man so sich unterhalten während einige *es* lutschen... lol

Ipak se ++uje.
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: wsprintf PROBLEMI!!!15.03.2006. u 13:16 - pre 221 meseci
ja mislim da bi sa odgovorom kolege iznad mene trebalo zaključiti celu ovu priču...

samo da pojasnim jednim glupim primerom :

pretpostavimo da je računar napravljen tako da logičko kolo X pokazuje 0, kada god neko pokuša da referencira nealociranu memoriju i program koji je to pokušao pukne; ne dešava se ni u principu ni "slučajno" da baš meni to isto logičko kolo pokaže 1 u tom slučaju, tako da ako ne znaš da objasniš, ili bar probaš da daš neko pojašnjenje ( a vidim da ne znaš čim me šalješ na ostatak foruma ), onda se bolje ne javljaj
koliko god c/c++ dopuštali svašta da se radi, ipak su neke stvari fizički nemoguće

ja ne znam da li je to posledica toga što čovek nije pročitao sve ili je čitao ali nije baš pažljivo iščitao, ali ja reko' takođe da ne može, bez češljanja ostatka foruma i ne vidim uopšte razlog za dalju priču

a ona replika bi bila istog ranga kao moje referenciranje nealocirane memorije - NEMOGUĆE!!

Pozdrav

[Ovu poruku je menjao stargazer dana 15.03.2006. u 14:37 GMT+1]
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.tu-sofia.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: wsprintf PROBLEMI!!!16.03.2006. u 11:22 - pre 221 meseci
Zalim, javljacu se kada ja hocu a ono sto jeste tacno je: ako neko ne ume da cita dat i dovoljno jasan odgovor, niti ima strpljenja da potrazi druge strpljivo napisane zaista i ne zasluzuje da nesto nauci. Ako je pritom jos i nepristojan + nadmen, sto moze lezati u preteranoj ubedjenosti u znanje, zaista ne zasluzuje ni atom posvecene mu paznje.

*edit*
Uzgred, prvi put kad sam se u ovoj temi javio, bilo je za modove.
Drugi put kad sam se u ovoj temi javio, bilo je pozivanje na pravo na repliku.

[Ovu poruku je menjao Mali Misha dana 16.03.2006. u 18:11 GMT+1]
Ipak se ++uje.
 
Odgovor na temu

[es] :: C/C++ programiranje :: wsprintf PROBLEMI!!!

Strane: 1 2

[ Pregleda: 3998 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.