|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Bonjour,
J'envisage de réaliser un ensemble de structures et de fonctions pour gérer les chaînes de caractères un peu dans l'idée des objets C++ Je pense que cela pourrait me faire gagner au global sur le codage de certains projets. Je programme pour l'instant en C et exclusivement pour Windows (et je suis débutant). Les fonctions de l'API Windows ont un type LPCTSTR, l’investissement serait vraiment intéressant si je pouvais créer des fonctions qui retournent ce type, par exemple : C'est faisable ou juste impossible ? Merci pour votre réponse et des idées ou des liens sur ce sujet. |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Inscription : décembre 2010 Messages : 174 ![]() |
Sous l'api Windows, LPCTSTR désigne un "pointeur vers une chaine de caractères constante où chaque caractère est de type TCHAR".
En effet, rien ne t'empêche de définir une fonction myStrCat () qui alloue un buffer de TCHARs, y stocke la concaténation des deux chaines passées en paramètre, et retourne un pointeur vers ce buffer. Il faudra juste préciser dans la documentation de myStrCat() que l'appelant ne doit pas oublier de libérer le buffer en question en appelant une fonction désignée. Qu'est-ce qui te bloque ? |
|
|
10
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Merci de me répondre, il n'y a rien qui me bloque vraiment :
J'essaie d'en apprendre le plus possible avant de me lancer dans des dev. plus conséquents. Comme LPCTSTR désigne un pointeur vers une chaine de caractères constante, je craignais que l'on ne puisse pas faire une affectation comme pour une variable. Est_ce que : a un sens ? C'est la taille du pointeur ou de la chaîne ? Les allocations sont certainement le cœur du sujet et je suis encore peu expérimenté avec les allocations dynamiques. |
|
|
00
|
|
|
#4 | ||
|
Membre éclairé
![]() Inscription : décembre 2010 Messages : 174 ![]() |
Citation:
typedef const TCHAR* LPCTSTR; Quand un qualifier "const" apparait AVANT l'étoile (*), cela signifie que les données POINTEES sont constantes, pas le pointeur lui même. On a le droit de modifier le pointeur (le faire pointer vers autre chose), mais on a pas le droit de modifier la chaîne pointée par ce pointeur. Tu as le droit d'allouer un buffer, y copier des données, et retourner un pointeur CONST vers ce buffer : cela signifie à l'appelant "je te donne accès en lecture seule à une chaîne de caractères". Citation:
Pour obtenir la taille de la chaine, il faut la parcourir jusqu'à obtenir un 0, c'est le principe des chaînes en C. |
||
|
|
20
|
|
|
#5 | |||
|
Membre éclairé
![]() Inscription : décembre 2010 Messages : 174 ![]() |
Citation:
Une fonction Win32 dans ce genre : Code :
Cela ne veut pas dire que toi, appelant de cette fonction, tu doives manipuler des pointeurs vers des constantes. Tu PEUX le faire, mais tu n'y es pas obligé. Tu peux très bien lui passer un pointeur vers une chaine modifiable, c'est juste que le prototype de CopyFile() te promets qu'il ne va pas la modifier. |
|||
|
|
10
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
OK,
Si j'ai ce code : Code :
est-ce que ensuite dans le programme, je peux avoir une fonction : ? |
||
|
|
00
|
|
|
#7 | ||||
|
Membre éclairé
![]() Inscription : décembre 2010 Messages : 174 ![]() |
Citation:
Citation:
|
||||
|
|
10
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() |
Bonjour,
Pour travailler facilement avec des TCHAR (ou _TCHAR), tu dois utiliser les fonctions de <tchar.h> (ou d'autres fonctions données par Windows). Code C :
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||
|
|
20
|
|
|
#9 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Merci pour ces infos Medinoc,
Quel est le type ou la structure correspondant à TCHAR ? Avec le petit exemple ci-dessous je sais passer d'une chaine vers LPCTSTR. Mais je n'ai pas encore réussi pour passer de LPCTSTR vers une chaîne, c'est forcement plus compliqué puisqu'il faut gérer la longueur de la chaîne. Je suis preneur d'un petit exemple sur le principe. Code :
|
||
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() |
TCHAR
Les conversions sont une plaie, surtout en C. Tu te retrouves à bosser avec des #ifdef partout, ou autres joyeusetés... En C++ on gagne un peu de répit avec des classes dédiées à la conversion et des surcharges de fonctions.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
01
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
A la place des #ifdef, est-il possible de s'en sortir avec la taille ?
Code :
Si taille = 2 ou 4 ou autre ? Comment faire ? y a t-il des "endians" à considérer ? |
||
|
|
00
|
|
|
#12 | ||||
|
Expert Confirmé Sénior
![]() |
J'ignore si l'endianness change d'une version de Windows à une autre (quelle est l'endianness d'un ARM?), mais sous x86, c'est du little-endian; aussi, sous Windows un wchar_t fait deux octets.
Pas contre, je ne dois pas l'intérêt de bosser avec des if plutôt que des #ifdef et des macros. Dans tous les cas, on peut au minimum faire des fonctions de conversion: Code C :
Code C :
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||||
|
|
10
|
|
|
#13 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Merci pour ces fonctions de conversion.
D'après ton message je comprend qu'elles sont pour Windows sous X86 ? Plus je me documente sur ce sujet et plus je me pose des questions, je vais résumer mes acquis : - LPCTSTR est un pointeur sur un tableau de TCHAR - un TCHAR est soit un char soit un wchar_t Je cherche à faire des conversions entre TCHAR et char donc dans un cas (qui semble être celui de ma configuration actuelle) il n'y a rien à faire. Je devrais pouvoir écrire : Code :
Je pensais que wchar_t était nécessaire pour les accents et je viens de m'apercevoir que je peux mettre des accents dans une chaine de char ? Un char est-il toujours un octet ? Éventuellement aussi : - qu'est ce que : #pragma once ? - #define _CRT_SECURE_NO_WARNINGS ? - qu'est ce qui conditionne _UNICODE ? En tout cas merci d'avance pour ce petit cours en ligne |
||
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() |
Bonjour,
alors, tes réponses en vrac:
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
30
|
|
|
#15 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Super
![]() Encore 2 questions (pour l'instant !): - Est ce que le code ci-dessous est correct, en particulier maFonction (ou est-ce que l'on retourne ici un pointeur sur une variable locale) ? - Qu'est ce qui fait concrètement sous Windows qu'un TCHAR pourrait être différent d'un char, est-ce uniquement lié à ma configuration de compilation (ou faut-il craindre des problèmes de portabilité) ? Code :
|
||
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() |
Les lignes 14, 19 et 30, et tout ce qui en dépend, ne marcheront que si UNICODE et _UNICODE ne sont pas définis.
Par contre, maFonction est OK, parce que "retour" (ou L"retour" si UNICODE est défini) est une chaîne littérale. Addition: Si tu utilises des printf() (et surtout des _tprintf()), ces informations peuvent être utiles: Size and Distance Specification Ce qu'il faut retenir:
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
10
|
|
|
#17 | ||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
Bonjour,
J'ai réalisé des fonctions qui me retournent un LPCTSTR, voici un exemple : Code :
Bref, d'après mes tests cela semble OK et je voudrais savoir si cette fonction est 100% sure : pas de souci de portabilité (autre machine 32/64 , version de Windows ...). Merci pour votre avis et vos conseils
|
||
|
|
00
|
|
|
#18 | ||
|
Expert Confirmé Sénior
![]() |
Ce n'est pas un vrai LPCTSTR, c'est un char* (LPSTR) casté en LPCTSTR.
Code C :
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||
|
|
00
|
|
|
#19 | |||
|
Nouveau Membre du Club
![]() Ingénieur développement matériel électronique Inscription : juin 2012 Messages : 57 ![]() |
OK, merci pour la correction avec tchar.h
Mais : Citation:
si je caste quand même avec LPCTSTR int2str(int nb) (c'est le type attendu des fonctions API Windows que je veux utiliser) et pour libérer , c'est comme cela ? Code :
|
|||
|
|
00
|
|
|
#20 | ||||
|
Expert Confirmé Sénior
![]() |
Citation:
Citation:
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||||
|
|
10
|
Copyright © 2000-2013 - www.developpez.com