Structure de données conditionnelles

FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014 - 21 janv. 2014 à 20:30
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 - 6 avril 2014 à 08:45
Bonjour,

Je suis en train de développer un programme en VB 2010 qui assure le dialogue, l'affichage de valeurs, modification de valeurs avec un appareil à base de microcontroleur 16 bits programmé en C et datant des années 2000 (vous imaginez les problèmes de correspondance dans le type des variables). Mon programme dialogue via une liaison série RS232 avec un protocole ressemblant à MODBUS. J'ai réussi à faire tourner mon programme.

Le problème est que le dialogue PC <-> Appareil se fait via la lecture de structures de données et que, suivant l'utilisation de l'appareil, les structures n'ont pas les mêmes "grandeurs". A l'époque, il y avait un programme par appareil et on me demande de standardiser.

Je m'explique :
Pour un type d'appareil, j'ai une structure de 2 tableaux de 16 "char" (programmation en C) soit 2 x 16 x 1Byte = 32 Bytes.
Pour un autre type d'appareil, la même structure de 2 tableaux est de 16 "int" (programmation en C) soit 2 x 16 x 2 Short = 64 bytes. (Merci le développeur de l'époque qui a modifié le type pour stocker des valeurs < 255)

Donc, ce que j'aimerai c'est que suivant le type d'appareil, je puisse déclarer ma structure. Exemple :
Si appareil 1 :
Public structure AA
 public aa() as byte
 public bb() as byte
 sub new(byval a as byte)
  redim aa(a)
  redim bb(a)
 end sub
end structure
public AAA as new AA(10)


Si appareil 2 :
Public structure AA
 public aa() as ushort
 public bb() as ushort
 sub new(byval a as byte)
  redim aa(a)
  redim bb(a)
 end sub
end structure
public AAA as new AA(10)


Puis après, j'utilise AAA sans m'en préoccuper.

Donc, voici ma question, est-il possible de faire un truc du genre :

Si appareil1 : déclaration AAA appareil 1
Si appareil2 : déclaration AAA appareil 2

J'espère ne pas avoir était trop long dans l'explication et que vous m'aiderai à résoudre ce problème (j'ai quasiment 20 appareils différents avec des structures ayant le même nom mais pas la même déclaration).

Merci d'avance.

A+
Alain

14 réponses

NHenry Messages postés 15121 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 mai 2024 159
21 janv. 2014 à 21:45
Il est clair que l'usage d'une seule structure serait totalement impossible.

Pour cela, je te propose de mémoriser le type de l'appareil dans un objet "Equipement", cet objet sera chargé aussi de la retranscription des données brutes (tableau d'octet) en type utilisable par le code (Int32 par exemple).

Cela te permettra d'éviter un code complexe et trop chargé.
0
FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014
24 mars 2014 à 19:53
Salut,

Avec beaucoup de retard car je croyais que mon projet aller être annulé, je suis de retour car on me demande à nouveau de m'y remettre.
Pourrais tu m'expliquer un peu plus ta solution? Tu parles d'objets qui seraient chargés suivant le type d'appareil. J'ai beau avoir cherché sur MSDN, je n'ai rien trouvé de vraiment positif.
Peut-être que la solution passerait par des classes au lieu de structures
Je suis perdu :(

A+
Alain
0
NHenry Messages postés 15121 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 mai 2024 159
30 mars 2014 à 19:57
En gros, à la place d'avoir une seuls information, tu envoie un identifiant qui te donne la structure à utiliser.
0
FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014
1 avril 2014 à 17:30
Bonjour NHenry,

Pourrais-tu être un peu plus clair en me donnant un exemple simple que j'adapterai à mon cas?
Merci d'avance.

A+
Alain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15121 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 mai 2024 159
1 avril 2014 à 22:54
Bonsoir,

En gros, réception d'un entier définissant le type :
Si Type=1 Alors utiliser telle structure pour la traduction
Si Type=2 Alors, en utiliser une autre
Si Type=3, ...
0
FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014
2 avril 2014 à 07:31
Bonjour,

Merci de ta réponse mais je ne comprends pas.
Je ne peux pas faire, en prenant l'exemple de mon 1er message:
select case Type_app
  Case 1
    Public AAA as new AA(10)
  Case 2
    Public AAA as new AA1(10) 'Renommé la 2ème structure AA1
End select

Car je suis obligé de déclarer ma structure "publique" afin de l'utiliser dans tout mon programme.

A+
Alain
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
5 avril 2014 à 10:57
Salut
tu dois déclarer des structures différentes au niveau du nom

Public struct1 as .....
Public Struct2 as .....
etc .....

Ensuite lors de l'utilisation tu utilises Select Case pour choisir le traitement à faire pour telle structure !

Tu dis : " A l'époque il y avait un programme par appareil !"
Maintenant il faut faire un seul programme avec un sous-programme par appareil et chaque sous-programme utilise une seule des structures définies en Public
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 avril 2014 à 11:10
Bonjour,
Pourquoi ne pas (ce serait plus simple) ne pas définir une structure plus grande (4 tableaux au lieu de deux) et en utiliser les membres selon le type de a ?
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
5 avril 2014 à 15:44
salut ucfoutu !
pas bête ton idée ! il y en a plus dans 2 têtes que dans une !
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
5 avril 2014 à 16:02
Pour Ft8alain
Tu dis :" pour un appareil j'ai 2 tableaux de 16 bytes et pour un autre appareil j'ai 2 tableaux de 16 int16 "
donc tu définis 2 structures ainsi

Public Structure struct8
Dim tabl2() as byte
End Structure

Public Structure struct16
Dim tabl1() as int16
Dim tabl2() as int16
End Structure

public appareil8 as struct8
public appareil16 as struct16


ensuite dans l'initialisation du programme au chargement du premier formulaire tu initialises tes tableaux

With appareil8
redim .tabl1(0 to 15)
redim .tabl2(0 to 15)
End with
With appareil16
redim .tabl1(0 to 15)
redim .tabl2(0 to 15)
End with

ensuite selon le type d'appareil tu utilises l'une ou l'autre des structures
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
5 avril 2014 à 16:03
Public Structure struct8
Dim tabl1() as byte ' manquant au message précédent
Dim tabl2() as byte
End Structure
0
FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014
6 avril 2014 à 06:53
Salut,

Merci pour vos réponses et d'essayer de m'aider.
La solution de déclarer les structures par appareils, je l'ai déjà fait mais cela m'amène a utiliser un paquet de "Select case..End select" car l'exemple que j'ai décrit dans mon 1er message n'est qu'une goutte d'eau dans un verre. En effet, j'ai une variable structure globale qui est composée de plusieurs structures dont les noms sont identiques mais sont composées de variables de types différents voire de différentes variables (variables qui existent pour tel appareil mais n'existent pas pour d'autres, etc.). Après ces variables globales sont affichées dans des écrans mais aussi lues et écrites via liaison série dans les appareils (les structures sont aussi définies dans l'appareil mais là je ne peux pas les modifier, je n'ai pas le droit de toucher au logiciel interne de l'appareil).
Donc j'ai le choix:
1 - Créer des écrans et des dialogues via liaison série pour chaque appareil, ce qui correspond à créer un soft par appareil.
2 - Jongler avec des conditions (case, If, etc.) en gardant les mêmes écrans et les mêmes dialogues.

A+
Alain
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 6/04/2014 à 07:50
Je ne suis pas vb.nettiste et peux donc m'avancer à tort, mais je serais assez surpris que l'on ne puisse, sous VB.Net, jongler au moins autant que sous VB6.
Les structures se définissent sous VB6 en Types (types personnalisés).
Et je jonglerais avec quelque chose du genre :
Private Type mes_types
machine1 As Integer
machine2 As Long
machine3 As String
End Type
Private Type toto
titi As mes_types
tata As mes_types
End Type

Private Sub Command1_Click()
Dim teste As toto
teste.titi.machine2 = 5 ' et j'aurais ici une erreur de type en y mettant par ex un string
teste.tata.machine3 = "blabla"
Var1 = teste.titi.machine2
var2 = teste.tata.machine3
MsgBox Var1 & vbCrLf & var2
End Sub

Enfin ... "je jonglerais" n'est pas tout-à-fait exact. Car j'éviterais tout simplement de faire une telle usine à gaz, au prétexte de ne pas alourdir mon code par une longue série de select case...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
6 avril 2014 à 08:45
Salut FT8alain
Pourquoi ne pas faire une forme de sélection pour choisir l'appareil utilisé et que chaque appareil utilise une forme "fille" pour les différents traitements ! Si certains traitements ou variables sont identiques pour plusieurs appareils mettre ces variables en Public et ces traitements en Public aussi dans un module !
0
Rejoignez-nous