Page 1 sur 3
Convertisseur C vers PB : please help !!
Publié : mer. 14/avr./2004 23:49
par ZapMan
Pour plus de clarté, j'ouvre une nouvelle rubrique que je souhaiterais réserver strictement aux difficultés que je rencontre, et aux réponses que chacun voudra bien y apporter.
L'évolution globale du programme continuera a être racontée dans
"Convertisseur C vers PB : -> ça commence à marcher" et si vous avez des réflexions à faire sur ce projet, ça serait cool de les faire plutôt dans cette rubrique là.
Problème N°1
Est-ce quelqu'un connait un bon site donnant des explications sur le language C ? Tous les sites que j'ai trouvé s'adressent plutôt à des débutants ou semi-débutants et ne donnent pas trop de détails sur les syntaxes des fonctions. Je cherche quelquechose de vraiment TRES complet pour être sur d'avoir passé en revue TOUTES les syntaxes possibles d'une instructions, y compris TOUTES les subtilités qui peuvent s'y rattacher.
Publié : mer. 14/avr./2004 23:59
par julien
Publié : jeu. 15/avr./2004 0:29
par ZapMan
Le deuxième est pas mal du tout, merci.
Publié : jeu. 15/avr./2004 1:14
par nico
Publié : sam. 17/avr./2004 2:19
par ZapMan
Question N°2 pour les pros du C :
est-ce que :
Code : Tout sélectionner
typedef struct mmtime_tag {
UINT wType;
union {
DWORD ms;
DWORD sample;
DWORD cb;
DWORD ticks;
struct {
BYTE hour;
BYTE min;
BYTE sec;
BYTE frame;
BYTE fps;
BYTE dummy;
BYTE pad[2];
} smpte;
struct {
DWORD songptrpos;
} midi;
} u;
} MMTIME,*PMMTIME,*LPMMTIME;
est bien traduit par le code suivant :
Code : Tout sélectionner
Structure midi
songptrpos.l
EndStructure
Structure smpte
hour.b
min.b
sec.b
frame.b
fps.b
dummy.b
pad.b[2]
EndStructure
Structure mmtime_tag
wType.w
StructureUnion
ms.l
sample.l
cb.l
ticks.l
smpte.smpte
midi.midi
EndStructureUnion ;
EndStructure
MMTIME.mmtime_tag
*PMMTIME.mmtime_tag
*LPMMTIME.mmtime_tag

Publié : sam. 17/avr./2004 2:56
par ZapMan
Question N°3 pour les Pros du C
Dans le code suivant :
Code : Tout sélectionner
typedef struct tagMIXERCONTROLW {
DWORD cbStruct;
DWORD dwControlID;
DWORD dwControlType;
DWORD fdwControl;
DWORD cMultipleItems;
WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
WCHAR szName[MIXER_LONG_NAME_CHARS];
union {
struct {
LONG lMinimum;
LONG lMaximum;
}_STRUCT_NAME(s);
struct {
DWORD dwMinimum;
DWORD dwMaximum;
}_STRUCT_NAME(s1);
DWORD dwReserved[6];
} Bounds;
union {
DWORD cSteps;
DWORD cbCustomData;
DWORD dwReserved[6];
} Metrics;
} MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW;
KeskeC que ces _STRUCT_NAME(s) et _STRUCT_NAME(s1)
Que signifient les (s) et (s1)
Merci de proposer si possible une traduction de ce code en PureBasic.
Publié : sam. 17/avr./2004 2:58
par ZapMan
Question N°4 pour les Pros du C
Les équivalences suivantes sont-elles correctes ?
Code : Tout sélectionner
Procedure.s ConvertCType(c.s)
Select c
Case "DWORD"
c = ".l"
Case "LONG"
c = ".l"
Case "ULONG"
c = ".l"
Case "BOOL"
c = ".l"
Case "FLOAT"
c = ".f"
Case "BYTE"
c = ".b"
Case "CHAR"
c = ".b"
Case "UCHAR"
c = ".b"
Case "WORD"
c = ".w"
Case "UINT"
c = ".w"
Case "INT"
c = ".w"
Case "SHORT"
c = ".w"
Case "WCHAR"
c = ".w"
Case "GUID"
c = ".GUID"
Case "STRING"
c = ".s"
EndSelect
ProcedureReturn c
EndProcedure
Quelle est l'équivalence de LPSTR ?
Publié : sam. 17/avr./2004 5:40
par Chris
Je suis pas un pro du C, vu que j'y connais rien, mais j'aurais plutôt vu ça comme ça:
Code : Tout sélectionner
Procedure.s ConvertCType(C.s)
Select C
Case "DWORD" ;<-- Entier non signé 32 bits
C = ".l"
Case "LONG"
C = ".l"
Case "ULONG"
C = ".l"
Case "BOOL" ;<-- renvoie 1 ou 0, donc, byte
C = ".b"
Case "FLOAT"
C = ".f"
Case "BYTE"
C = ".b"
Case "CHAR" ;<-- renvoie un string
C = ".s"
Case "UCHAR" ;<-- certainement un ".s"
C = ".s"
Case "WORD"
C = ".w"
Case "UINT" ;<-- là, je dirais ".l"
C = ".l"
Case "INT" ;<-- idem ici
C = ".l"
Case "SHORT"
C = ".w"
Case "WCHAR" ;<-- ".s", à mon avis : caractère codé sur 8 bits
C = ".s"
Case "GUID" ;<-- PB le prends t'il en charge. Je dirais ".l"
C = ".l"
Case "STRING"
C = ".s"
EndSelect
ProcedureReturn C
EndProcedure
On va voir combien j'ai de bonnes réponses
Chris

Publié : sam. 17/avr./2004 15:48
par ZapMan
Je ne sais pas si j'ai tout juste, mais toi, Chris, tu as tout faux. Désolé, il faut vraiment connaitre le C pour répondre à ces questions.
Voici la Question N°5 pour les pros du C :
Code : Tout sélectionner
typedef struct wavehdr_tag {
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag *lpNext;
DWORD reserved;
} WAVEHDR,*PWAVEHDR,*LPWAVEHDR;
Que signifie ce "struct wavehdr_tag *lpNext;" au milieu de la structure ?
Merci de proposer si possible une traduction de ce code en PureBasic.
Publié : dim. 18/avr./2004 17:37
par ZapMan
Ne m'oubliez pas !
Publié : lun. 19/avr./2004 0:32
par KarLKoX
ZapMan a écrit :Je ne sais pas si j'ai tout juste, mais toi, Chris, tu as tout faux. Désolé, il faut vraiment connaitre le C pour répondre à ces questions.
Voici la Question N°5 pour les pros du C :
Code : Tout sélectionner
typedef struct wavehdr_tag {
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag *lpNext;
DWORD reserved;
} WAVEHDR,*PWAVEHDR,*LPWAVEHDR;
Que signifie ce "struct wavehdr_tag *lpNext;" au milieu de la structure ?
Merci de proposer si possible une traduction de ce code en PureBasic.
Je fais que passer donc je vais répondre a au moins celle la :
"struct wavehdr_tag *lpNext;"
Ici on met struct car wavehdr a été définie comme un nouveau type via typedef struct.
*lpNext est un pointeur sur la struct permettant de faire une liste chainée.
Publié : lun. 19/avr./2004 1:46
par ZapMan
Merci KarLKox de me donner un peu de ton temps. Il semble que tu sois le seul "Pro du C" disponible en ce moment.
Concernant ta réponse, j'ai trouvé une doc qui me dit à peu près la même chose mais je ne suis pas du tout sûr de la façon dont je devrais traduire cette déclaration en PureBasic.
Crois-tu que tu pourrais me proposer quelquechose ?
Publié : lun. 19/avr./2004 3:12
par KarLKoX
Je dirais pas que je suis un Pro du C mais bon, si je peux aider

Concernant la conversion en PureBasic, sachant qu'on ne peut créer un nouveau type, en tout cas, pas de la même facon qu'en C, je verrais :
Code : Tout sélectionner
Structure wavehdr_tag
lpData.l
dwBufferLength.l
dwBytesRecorded.l
dwUser.l
dwFlags.l
dwLoops.l
lpNext.l
reserved.l
EndStructure
WAVEHDR.wavehdr_tag
*PWAVEHDR.wavehdr_tag
*LPWAVEHDR.wavehdr_tag
Si tu l'utilisateur veut, pour x raison, manipuler la liste (lpNext), il pourra le faire en créant une nouvelle liste via NewList et définir un pointeur sur la structure wavehdr_tag :
Code : Tout sélectionner
MyWave.wavehdr_tag
NewList wavelist.wavehdr_tag()
*ptr.wavehdr_tag
*ptr = AddElement (wavelist()) // ptr pointe sur la liste en cours
MyWave.lpNext = @*ptr
Il n'y a plus qu'a utiliser les fonctions de liste de PureBasic pour avancer dans la liste

Publié : lun. 19/avr./2004 6:22
par ZapMan
Merci, je crois que je vais m'en sortir avec ça.
Si tu as un peu de temps pour les question 2,3 et 4, je suis preneur.
Publié : lun. 19/avr./2004 9:49
par Fred
Un conseil: utilise les Data pour faire la conversion des types, parce que y'en a un paquet sous Windows. Quelque chose du genre:
Apres tu stockes tout dans un tableau et c'est tranquille. Pas de gros Select/Case et tu peux en rajouter autant que tu veux.
Sinon, pour tes questions:
Tous les LPXXXX sont des 'Long Pointer' vers un type de base. Donc LPSTR c'est un pointer vers un STR donc un string (equivalent à *MaVar.b ou *MaVar.s).
Pour cette question:
Code : Tout sélectionner
Structure mmtime_tag
wType.w
StructureUnion
ms.l
sample.l
cb.l
ticks.l
smpte.smpte
midi.midi
EndStructureUnion ;
EndStructure
MMTIME.mmtime_tag
*PMMTIME.mmtime_tag
*LPMMTIME.mmtime_tag
non, il ne faut surtout pas creer de variables ! Ce sont des nouveaux types. Tu peux ignorer tous les LPxxx car en PureBasic y'a pas moyen de faire ca directement dans le type (faut specifier le pointer). Sinon, sous Windows, quand t'as un _tag ou tag_ dans le nom de la structure, c'est que c'est pas la bonne

. Dans le cas ci dessus, la 'vrai' structure s'appelle 'MMTIME'. Donc ton code devra ressembler à ca:
Code : Tout sélectionner
Structure MMTIME
wType.w
StructureUnion
ms.l
sample.l
cb.l
ticks.l
smpte.smpte
midi.midi
EndStructureUnion ;
EndStructure
KeskeC que ces _STRUCT_NAME(s) et _STRUCT_NAME(s1)
Que signifient les (s) et (s1)
Ce sont des macros, va falloir aller voir dans les .h ce que ca veut dire.
Sinon, tes equivalences sont correctes.
Que signifie ce "struct wavehdr_tag *lpNext;" au milieu de la structure ?
Ca veut dire que c'est un pointer vers la structure wavehdr_tag. Et comme c'est celle en cours de creation, tu peux pas encore utiliser son alias (WAVEHDR). Par contre en PureBasic ca va donner ca:
Code : Tout sélectionner
Structure WAVEHDR
*lpData.b;
dwBufferLength.l;
dwBytesRecorded.l;
dwUser.l;
dwFlags.l;
dwLoops.l;
*lpNext.WAVEHDR;
reserved.l;
EndStructure