Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD9] Equivalence structures en C

6 réponses
Avatar
Eric Laurent
Bonjour,
Je dois utiliser avec windev une DLL fournie par un client. Pour cela
je dois construire une structure (SMI_IO) contenant entre autre un
tableau de structures (ALARMREC) et la passer en paramètre.
J'obtiens toujours -1 comme résultat du passage de la structure, ce qui
signifie que la fonction n'a pas pu être effectuée.
Pourriez-vous me dire si mes déclarations de structures en Windev sont
équivalentes aux structures en C ?
Où ai-je fait une bétise ?
Merci d'avance de votre aide éventuelle.

Je vous joins les modèles ci après:

typedef struct ALARMREC
{
int Flag;
int AlarmType;
int AlarmUnitNum;
int AlarmUnitWing;
int AlarmLocation;
int AlarmDelayFlag;
char AlarmTime[20];
}alarmRec;

Traduit par:
alarmRec est une structure
Flag est un entier sans signe sur 4 octet
AlarmType est un entier sans signe sur 4 octet
AlarmUnitNum est un entier sans signe sur 4 octet
AlarmUnitWing est un entier sans signe sur 4 octet
AlarmLocation est un entier sans signe sur 4 octet
AlarmDelayFlag est un entier sans signe sur 4 octet
AlarmTime est une chaîne fixe sur 20
FIN

et,

typedef struct SMI_IO
{
BYTE ErrorCode;
BYTE DisplaySegmentStatus[50];
BYTE AuxiliarySensorStatus[60][3];
BYTE PMTamperStatus[8];
BYTE LUTamperStatus[9];
BYTE RMTamperStatus[20];
BYTE DisplaySegmentAlarmState[50];
BYTE AuxiliaryAlarmState[60][3];
BYTE PMTamperAlarmState[8];
BYTE LUTamperAlarmState[9];
BYTE RMTamperAlarmState[20];
BYTE CableAFaultState[8];
BYTE CableBFaultState[8];
BYTE PMComFailState[8];
BYTE RMComFailState[20];
alarmRec AlarmData[10];
}SmiIo;

Traduit par:

SmiIo est une structure
ErrorCode est un entier sur 1 octet
DisplaySegmentStatus est un tableau fixe de 50 entier sur 1 octet
AuxiliarySensorStatus est un tableau fixe de 60 par 3 entier sur 1
octet
PMTamperStatus est un tableau fixe de 8 entier sur 1 octet
LUTamperStatus est un tableau fixe de 9 entier sur 1 octet
RMTamperStatus est un tableau fixe de 20 entier sur 1 octet
DisplaySegmentAlarmState est un tableau fixe de 50 entier sur 1
octet
AuxiliaryAlarmState est un tableau fixe de 60, 3 entier sur 1 octet
PMTamperAlarmState est un tableau fixe de 8 entier sur 1 octet
LUTamperAlarmState est un tableau fixe de 9 entier sur 1 octet
RMTamperAlarmState est un tableau fixe de 20 entier sur 1 octet
CableAFaultState est un tableau fixe de 8 entier sur 1 octet
CableBFaultState est un tableau fixe de 8 entier sur 1 octet
PMComFailState est un tableau fixe de 8 entier sur 1 octet
RMComFailState est un tableau fixe de 20 entier sur 1 octet
AlarmData est un tableau fixe de 10 alarmRec
FIN

Et le code d'exécution en C++
...
SmiIo* arrayI;
char mapstring[250];
strcpy(mapstring,comPort.m_strMapName);
int
err=SMIAPI_Init(comPort.m_iCom,mapstring,comPort.m_iPCAddress,&arrayI);
...

Traduit par
ResuChargeDll est un entier
ResuDLL est un entier
DllTPI est une chaîne="win32dll.dll"
NomMap est une chaîne fixe sur 250
SmiIo est un tableau de 8 Smi_Io

ResuChargeDll=ChargeDLL(DllTPI)
SI ResuChargeDll = 0 ALORS
Erreur(ErreurInfo())
Ferme
FIN

NomMap="C:\Cartes\Test.SMP"

comTPI est un entier=1
ComPC est un entier =1
ResuDLL=AppelDLL32(DllTPI,"SMIAPI_Init",comTPI,NomMap,ComPC,&SmiIo)
SI ResuDLL<=0 ALORS
Trace("Erreur sur 'SMIAPI_Init' ")
Ferme
FIN

--
Eric Laurent
nospam.laurent.systel@wanadoo.fr
(enlever nospam.)

6 réponses

Avatar
Romain PETIT
Eric Laurent avait énoncé :

Pourriez-vous me dire si mes déclarations de structures en Windev sont
équivalentes aux structures en C ?
Où ai-je fait une bétise ?



Pour les "int" (structure), traduis-les plutôt par des "entiers sur 2
octets" (ou "entiers" tout court).

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Eric Laurent
Après mure réflexion, Romain PETIT a écrit :
Pour les "int" (structure), traduis-les plutôt par des "entiers sur 2 octets"
(ou "entiers" tout court).

A+



Merci de ton aide mais j'ai essayé aussi et cela ne marche pas mieux.
Je crois que le problème vient du passage d'une structure contenant
elle même une structure.
Des idées ?


--
Eric Laurent

(enlever nospam.)
Avatar
Romain PETIT
Eric Laurent a couché sur son écran :

Merci de ton aide mais j'ai essayé aussi et cela ne marche pas mieux.
Je crois que le problème vient du passage d'une structure contenant elle même
une structure.
Des idées ?



Je crois que je m'en étais sorti avec "tableau statique".
Cf :
http://www.windasso.org/cgi-bin/gesmod.exe?exec=VISU&NUMRUBRIQUEA8&MDP=&TYPE=TRUC

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Eric Laurent
Romain PETIT a couché sur son écran :

Je crois que je m'en étais sorti avec "tableau statique".
Cf :
http://www.windasso.org/cgi-bin/gesmod.exe?exec=VISU&NUMRUBRIQUEA8&MDP=&TYPE=TRUC

A+



Cela ne marche pas non plus.
J'ai comparé la taille des structures en C++ et en Windev et j'obtiens
les mêmes résultats (44 pour Alarmrec et 1020 pour Smi_Io).
Je ne vois vraiment pas ce qui cloche !

--
Eric Laurent

(enlever nospam.)
Avatar
Sécurité Pointage & Biométrie
Bonjour,

Normalement le code de vos structures devrait être :

alarmRec est une structure
Flag est un entier
AlarmType est un entier
AlarmUnitNum est un entier
AlarmUnitWing est un entier
AlarmLocation est un entier
AlarmDelayFlag est un entier
AlarmTime est une chaîne fixe sur 20
FIN


SmiIo est une structure
ErrorCode est un caractère
DisplaySegmentStatus est une chaîne fixe sur 50
AuxiliarySensorStatus est une chaîne fixe sur 60
PMTamperStatus est une chaîne fixe sur 8
LUTamperStatus est une chaîne fixe sur 9
RMTamperStatus est une chaîne fixe sur 20
DisplaySegmentAlarmState est une chaîne fixe sur 50
AuxiliaryAlarmState est une chaîne fixe sur 60
PMTamperAlarmState est une chaîne fixe sur 8
LUTamperAlarmState est une chaîne fixe sur 9
RMTamperAlarmState est une chaîne fixe sur 20
CableAFaultState est une chaîne fixe sur 8
CableBFaultState est une chaîne fixe sur 8
PMComFailState est une chaîne fixe sur 8
RMComFailState est une chaîne fixe sur 20
AlarmData est un entier sur 10 octets // (à VERIFIER)
FIN

A vérifier toutefois.

Sincères salutations
--
Jean-Claude FLAJOULOT
Avatar
Eric Laurent
Après mure réflexion, Sécurité Pointage & Biométrie a écrit :
Bonjour,

Normalement le code de vos structures devrait être :



Merci de votre aide mais les structures que vous me suggérez sont
erronées.
Regardez bien le code en C, il utilise des tableaux dont un tableau
faisant référence à la structure AlarmRec.

Merci quand même,

Cordialement.

--
Eric Laurent

(enlever nospam.)