Convertisseur C vers PB : please help !!

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Convertisseur C vers PB : please help !!

Message 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.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Le deuxième est pas mal du tout, merci.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

A voir si tu ne connait pas!

http://c.developpez.com/cours/
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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
:?:
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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.
Dernière modification par ZapMan le sam. 17/avr./2004 15:54, modifié 1 fois.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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 ?
Dernière modification par ZapMan le sam. 17/avr./2004 16:09, modifié 1 fois.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Ne m'oubliez pas !
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message 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.
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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 ?
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message 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 :)
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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
Répondre