Tipuri de stringuri in MFC

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Tipuri de stringuri in MFC

Post by black_atus » 05 Dec 2012, 09:59

Buna ziua,

Sunt un programator junior si ma confrunt cu urmatoarea problema:
Nu stiu sa fac conversii intre diferite tipuri de stringuri cum ar fi WCHAR, CString, LPCTSTR si multe altele. Sunt atat de multe incat probabil nici nu le stiu pe toate...d-apoi sa mai si fac conversii intre ele sa sa stiu exact structura lor.

Ma puteti ajuta cu link-uri spre tutoriale unde sa pot invata toate aceste tipuri de stringuri si cum pot face conversii intre ele. Recunosc ca pentru probleme de felul gasesc date pe internet dar sunt foarte imprastiate. Nu am gasit inca un tutorial sau material unde sa fie prezentate toate si tipurile de conversii care se pot face intre ele.

Multumesc anticipat. :whorship:


Cu stima,
Daniel Constantin

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Tipuri de stringuri in MFC

Post by zlatomir » 05 Dec 2012, 13:01

Citeste aici, aici si aici si apoi pune intrebari daca nu intelegi.
LE: pt LPSTR logica e cam asa (pun spatii in nume ca sa intelegi):
LP vine de la long pointer
LP STR : e echivalent al lui char*
LP C STR : const char*
LP WSTR : wchar_t*
LP C WSTR : const wchar_t*
LP TSTR : TCHAR* - poate fi char* sau wchar_t* depinde daca e definit UNICODE
LP C TSTR : const TCHAR*

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Tipuri de stringuri in MFC

Post by bu7ch3r » 05 Dec 2012, 14:12

Totul trebuie sa plece putin mai de jos. Inainte sa intrebi de tipuri de stringuri ar trebui sa citesti putin despre tipuri de date. Apoi sa aprofundezi pointerii. Apoi sa raspunzi la intrebarea:

Care este valoare variabilei bRaspuns dupa executarea codului de mai jos:

Code: Select all

int bRaspuns = sizeof(char*) < sizeof(int*);
Apoi te apuci sa vezi care-i treaba cu TCHAR* cu LPSTR, LPCWSTR.
Dupa un timp o sa-ti dai seama ca WCHAR ala e o chestie tare marshava.
A da, niste notiuni de baza de OO n-ar strica, la urma urmei C-ul din MFC vine de la Class/Classes (Poate veni si de la Corporation(Manulife Financial Corporation ) :)) )
Cu stima,
Lupu Claudiu

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Tipuri de stringuri in MFC

Post by Ovidiu Cucu » 05 Dec 2012, 15:00

Repetand unele lucruri deja spuse aici.

In primul rand sa lamurim o problema de principiu: in limbajele de programare C si C++, NU exista tipul "string".
Am mai spus asta (vezi http://www.codexpert.ro/forum/viewtopic ... 272#p14793) insa vad ca nu ma crede nimeni pe cuvant. :)

LPCTSTR, LPCSTR, LPCWSTR, si alte minuni de genul asta nu sunt "tipuri MFC", ci aliasuri (typedef-uri) pentru diverse tipuri, definite in Windows SDK.
De exemplu LPCSTR este un alias pentru const char* iar LPCWSTR este un alias pentru const wchar_t*.
LPCTSTR este sau const wchar_t*, sau const char* in functie daca, aplicatia are sau nu UNICODE definit.
De obicei, acesti pointeri puncteaza la un buffer, un sir de caractere, uzual terminat cu NUL ('\0') pentru ca sa stie diverse functii unde-i "capatul".

Poti da un F12 pe ele ca sa vezi cum is definite de la mama lor.
De ce atatea alias-uri? Simplu, pentru ca programatorii Windows sa nu faca scurta la maini scriind carnaturi.
Desi sunt multe, nu-s greu de "citit". De exemplu LPCSTR se citeste "Long Pointer to Constant STRing". Idea vine de la un tip de la Microsoft, Charles Simonyi, ungur de felul lui drept care colegii i-au botezat gaselnita "Hungarian Notation" (romanii ii zic Notatia Maghiara").

MFC-ul este un wrapper C++ peste Windows SDK care iti permita sa programezi Windows intr-o maniera OOP.
CString este o clasa MFC care contine un pointer la un asemenea buffer de care vorbeam mai sus, plus o droaie de metode cu care sa-l manipulezi.
MFC foloseste in continuare tipuri din Windows SDK, normal pentru ca este un wrapper (lite) peste Windows SDK.

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Tipuri de stringuri in MFC

Post by black_atus » 06 Dec 2012, 13:44

bu7ch3r wrote:Totul trebuie sa plece putin mai de jos. Inainte sa intrebi de tipuri de stringuri ar trebui sa citesti putin despre tipuri de date. Apoi sa aprofundezi pointerii. Apoi sa raspunzi la intrebarea:

Care este valoare variabilei bRaspuns dupa executarea codului de mai jos:

Code: Select all

int bRaspuns = sizeof(char*) < sizeof(int*);
Apoi te apuci sa vezi care-i treaba cu TCHAR* cu LPSTR, LPCWSTR.
Dupa un timp o sa-ti dai seama ca WCHAR ala e o chestie tare marshava.
A da, niste notiuni de baza de OO n-ar strica, la urma urmei C-ul din MFC vine de la Class/Classes (Poate veni si de la Corporation(Manulife Financial Corporation ) :)) )

Nu am probleme cu C++-ul. Il tot invat din clasa a IX-a.
Chiar si acum cand am timp citesc din Totul despre C si C++ sau Thinking in C++.
Problema pe care o am e cu tipurile si conversiile din windows si mfc.
Cu stima,
Daniel Constantin

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Tipuri de stringuri in MFC

Post by black_atus » 06 Dec 2012, 13:45

Ovidiu Cucu wrote:Repetand unele lucruri deja spuse aici.

In primul rand sa lamurim o problema de principiu: in limbajele de programare C si C++, NU exista tipul "string".
Am mai spus asta (vezi http://www.codexpert.ro/forum/viewtopic ... 272#p14793) insa vad ca nu ma crede nimeni pe cuvant. :)

LPCTSTR, LPCSTR, LPCWSTR, si alte minuni de genul asta nu sunt "tipuri MFC", ci aliasuri (typedef-uri) pentru diverse tipuri, definite in Windows SDK.
De exemplu LPCSTR este un alias pentru const char* iar LPCWSTR este un alias pentru const wchar_t*.
LPCTSTR este sau const wchar_t*, sau const char* in functie daca, aplicatia are sau nu UNICODE definit.
De obicei, acesti pointeri puncteaza la un buffer, un sir de caractere, uzual terminat cu NUL ('\0') pentru ca sa stie diverse functii unde-i "capatul".

Poti da un F12 pe ele ca sa vezi cum is definite de la mama lor.
De ce atatea alias-uri? Simplu, pentru ca programatorii Windows sa nu faca scurta la maini scriind carnaturi.
Desi sunt multe, nu-s greu de "citit". De exemplu LPCSTR se citeste "Long Pointer to Constant STRing". Idea vine de la un tip de la Microsoft, Charles Simonyi, ungur de felul lui drept care colegii i-au botezat gaselnita "Hungarian Notation" (romanii ii zic Notatia Maghiara").

MFC-ul este un wrapper C++ peste Windows SDK care iti permita sa programezi Windows intr-o maniera OOP.
CString este o clasa MFC care contine un pointer la un asemenea buffer de care vorbeam mai sus, plus o droaie de metode cu care sa-l manipulezi.
MFC foloseste in continuare tipuri din Windows SDK, normal pentru ca este un wrapper (lite) peste Windows SDK.

Multumesc ! Asta cautam :whorship:
Cu stima,
Daniel Constantin

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Tipuri de stringuri in MFC

Post by black_atus » 06 Dec 2012, 13:47

Daca stiti vre-un tutorial sau ceva mai in amanunt despre toate tipurile astea si ce conversii se pot face intre ele ar fi super. :)
Cu stima,
Daniel Constantin

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Tipuri de stringuri in MFC

Post by black_atus » 06 Dec 2012, 14:03

zlatomir wrote:Citeste aici, aici si aici si apoi pune intrebari daca nu intelegi.
LE: pt LPSTR logica e cam asa (pun spatii in nume ca sa intelegi):
LP vine de la long pointer
LP STR : e echivalent al lui char*
LP C STR : const char*
LP WSTR : wchar_t*
LP C WSTR : const wchar_t*
LP TSTR : TCHAR* - poate fi char* sau wchar_t* depinde daca e definit UNICODE
LP C TSTR : const TCHAR*
Acum am vazut asta ... :) O sa ma uit pt ca pare ca gasesc in linkurile alea cam tot ce ma intereseaza. Mersi !
Cu stima,
Daniel Constantin

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Tipuri de stringuri in MFC

Post by Marius Bancila » 12 Dec 2012, 16:15

bu7ch3r wrote:Care este valoare variabilei bRaspuns dupa executarea codului de mai jos:

Code: Select all

int bRaspuns = sizeof(char*) < sizeof(int*);
Valoarea variabilei bRaspuns e 0, pentru ca sizeof aplicat unui pointer da intodeauna dimensiunea tipului pointer. char*, int*, foo* sunt toate pe 4 bytes pe x86 si 8 bytes pe x64 si IA64. Iar n < n e false intotdeauna.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Tipuri de stringuri in MFC

Post by black_atus » 17 Dec 2012, 14:13

char nu avea 1 byte ? parca imi amintesc ca era de la -128 la 127 sau 128 ...
Cred ca asta de care zic eu e pe C-ul vechi ...
Cu stima,
Daniel Constantin

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Tipuri de stringuri in MFC

Post by zlatomir » 17 Dec 2012, 14:45

black_atus wrote:char nu avea 1 byte ?...
char-ul are un byte, dar adresa acelui char are 4 bytes (sau 8 bytes pe x64) - deci sizeof(char) e 1, iar sizeof(char*) e 4 - un pointer trebuie sa aibe suficient loc cat sa stocheze o adresa in memorie, nu conteaza ce tip de date ai tu de la adresa aceea mai departe.
Trebuie sa te joci putin mai mult cu pointer-ii si apoi o sa vezi ca nu-i chiar asa de complicat.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Tipuri de stringuri in MFC

Post by bu7ch3r » 18 Dec 2012, 13:31

Cu raspunsul in fata si intrebarea asta tot epica e :) Q.E.D.
Cu stima,
Lupu Claudiu

Post Reply