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
A voir si tu ne connait pas!

http://c.developpez.com/cours/

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 :lol:

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:

Code : Tout sélectionner

  Data.s "DWORD", "l"
  Data.s "WORD", "w"
  Data.s "CHAR", "b"
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