Gambas France BETA


Pas de compte ? Incription

Question: une fonction peut elle retourner un tableau de structure ?

12
AuteurMessages
O.Coquet#1 Posté le 31/10/2024 à 19:51:08
Ce qui n'est pas devra-t-être inventéTout est dans le titre mais je répète au cas ou....

Question: une fonction peut elle retourner un tableau de structure ?

Une âme charitable aurait elle la réponse ?

Merci
Amitié
Olivier (Alias Olinux)
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
linuxos#2 Posté le 31/10/2024 à 23:35:16
Un peu de sel, de poivre et la crevette sera... Bonjour,

Oui tout a fait, meme selon la structure il y aura differentes facons de le faire.

Un Object 'Collection' est une structure

Un tableau de 'Class' est une autre structure

Enfin il existe l'Objet 'Struct' qui est similaire aux structures de C/C++ mais déconseillé par Benois dans la documention (moins performant)(plutot utilisé pour faire le lien avec des librairies C)

Donc, comment ce présente cette structure ?

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
O.Coquet#3 Posté le 31/10/2024 à 23:42:59
Ce qui n'est pas devra-t-être inventédans ma class fmain j'ai:

1
2
3
4
5
6
7
8
PUBLIC STRUCT dispositif 'Structure contenant toutes les informations d'un dispositif
Disp_Name AS STRING 'Nom du dispositif
Disp_On AS LONG 'Code DIO ON du dispositif
Disp_Off AS LONG 'Code DIO OFF du dispositif
Disp_Cal[20] AS STRING 'Calendrier horaire (10Xon et 10Xoff) du dispositif
END STRUCT

PUBLIC Dispositifs[10] AS STRUCT Dispositif 'Tableau des dix dispositifs


je souhaiterai faire appel à une fonction qui se trouve dans une autre class de la façon suivante:

1
Dispositifs = autreclass.mafonction()


Mais je n'arrive pas a trouver comment déclarer cette fonction dans l'autre class.


Amitié
Olivier (Alias Olinux)
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
linuxos#4 Posté le 1/11/2024 à 14:45:37
Un peu de sel, de poivre et la crevette sera... Bonjour,

Je pense qu'il faut soit déclarer une propriété dans 'autreclass' qui revera la valeur de autreclass.mafonction()
ou bien
il faut que la fonction 'mafonction()' dans 'autreclass' soit public pour etre accessible depuis le reste de ton projet.

Il y a aussi un option dans les Parametres de ton projets qui autorise ou pas si les objects/formulaires/classes sont 'Public' ou pas

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
vuott#5 Posté le 1/11/2024 à 17:52:00
Ne cedere ineluctabili possimusBonsoir Coquet,
cette page pourrait peut-être vous aider: :|

https://www.gambas-it.org/wiki/index.php/Uso_delle_Strutture_tra_Classi_e_Moduli
« Vita non suavis esse potest, nec Mors amara. »
O.Coquet#6 Posté le 2/11/2024 à 06:59:44
Ce qui n'est pas devra-t-être inventé
Bonsoir Coquet,
cette page pourrait peut-être vous aider: :|

https://www.gambas-it.org/wiki/index.php/Uso_delle_Strutture_tra_Classi_e_Moduli


A priori oui mais dans cette page, on parle surtout de modifier le contenu de la structure déclarée dans la classe principale à l'aide d'une fonction qui se trouve dans la classe secondaire ce que je n'aime pas beaucoup.

Ce que je recherche, ça serait le moyen de retourner une structure depuis la classe secondaire de la même façon que l'on retourne une valeur ou un tableau depuis une fonction.


mais merci quand même :)

Amitié
Olivier (Alias Olinux)
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
vuott#7 Posté le 2/11/2024 à 13:59:29
Ne cedere ineluctabili possimusEn d'autres termes, dans le cas que vous proposez, la Structure n'est présente que dans la Classe secondaire et est renvoyée à la Classe principale ?
« Vita non suavis esse potest, nec Mors amara. »
O.Coquet#8 Posté le 2/11/2024 à 14:31:11
Ce qui n'est pas devra-t-être inventéNon pas du tout, je m'exprime mal,

la structure est présente dans la classe principale

dans mon cas je souhaiterais
- appeler la fonction dans la seconde classe
- cette fonction va remplir une structure équivalente mais locale
- elle la renvoie en paramètre de retour
- je récupère ses informations dans ma classe principale


Suis je plus clair ?

Amitié
Olivier (Alias Olinux)
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
Patrick#9 Posté le 2/11/2024 à 16:10:11
Bonsoir,
A mon avis il suffit que la fonction appelante est en paramètre une variable de type variant, ce qui donnerait :
- dans la classe principale
1
2
mastruc = NEW STRUCT
autrestruc = maclasseseconde.mafonction(mastruc)


Puis dans la classe seconde :
1
2
3
4
5
PUBLIC SUB mafonction(mastruc AS VARIANT) AS VARIANT
.
.

RETURN mastruc
Patrick#10 Posté le 2/11/2024 à 16:38:00
Personnellement moi qui n'utilise pas de bibliothèques externes, je n'utilise les structures que quand j'ai besoin de données imbriquées par exemple un homme qui contient la tête qui contient les yeux, le nez, la bouche .... et ou j'en ai besoin que dans une classe. Cela m'économise un certain nombre de fichier.
Mais si je devais faire différemment je pense que j'opterai pour la solution ci dessous :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
' Gambas class file

PUBLIC STRUCT yeux_h
nombre AS INTEGER
couleur AS INTEGER
END STRUCT

PUBLIC STRUCT nez_h
couleur AS INTEGER
long AS BOOLEAN
END STRUCT

PUBLIC STRUCT levres_h
couleur AS INTEGER
epaisse AS BOOLEAN
END STRUCT

PUBLIC STRUCT tete_h
yeux AS Yeux_h
nez AS Nez_h
levres AS Levres_h
END STRUCT

PUBLIC matete AS Tete_h

PRIVATE $bav AS BOOLEAN

PROPERTY aveugle AS BOOLEAN

PUBLIC SUB _new()

matete = NEW Tete_h
matete.yeux = NEW Yeux_h
matete.yeux.nombre = 2
matete.nez = NEW Nez_h
matete.levres = NEW Levres_h
matete.levres.couleur = color.Red

END

PRIVATE FUNCTION aveugle_Read() AS BOOLEAN

RETURN $bav

END

PRIVATE SUB aveugle_Write(Value AS BOOLEAN)

$bav = Value
IF value THEN matete.yeux.nombre = 0

END


Cela me donne une classe indépendante que je peut appeler et instancier de n'importe ou et à la quelle je peu ajouter des méthodes.
vuott#11 Posté le 3/11/2024 à 14:30:44
Ne cedere ineluctabili possimus

Ce que je recherche, ça serait le moyen de retourner une structure depuis la classe secondaire de la même façon que l'on retourne une valeur ou un tableau depuis une fonction.

Vous voulez dire que vous voulez une fonction qui renvoie une Structure par 'valeur' ?

variable_structure = Fonction()
« Vita non suavis esse potest, nec Mors amara. »
O.Coquet#12 Posté le 3/11/2024 à 14:53:04
Ce qui n'est pas devra-t-être inventébingo, c'est ça ....
Sauf que pour corser le tout je voudrais qu'elle renvoie un tableau de structure pas juste une structure...

genre:

dim variable_structure as ma_structure[]

variable_structure = Fonction()


pas simple hein ;)

Amitié
Olivier (Alias Olinux)
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
linuxos#13 Posté le 3/11/2024 à 15:04:00
Un peu de sel, de poivre et la crevette sera... O.Coquet,

Je reste persuadé que l'utilisation de STRUCT n'est pas la plus simple approche, et qu'un simple tableau de Class serait plus Gambas style.
1
2
3
4
5
6
7
CLASS CDispositif

' Classe contenant la Structure
PUBLIC Disp_Name AS STRING 'Nom du dispositif
PUBLIC Disp_On AS LONG 'Code DIO ON du dispositif
PUBLIC Disp_Off AS LONG 'Code DIO OFF du dispositif
PUBLIC Disp_Cal[20] AS STRING 'Calendrier horaire (10Xon et 10Xoff) du dispositif

==========================================================================

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CLASS Fmain

' Declaration d'un nouvelle Propriété

PROPERTY ListDispositif AS STRING

PUBLIC $Dispositifs AS Collection ' Tableau pour les 10 Dispositifs

PUBLIC CONST _Properties AS STRING = "*,ListDispositif"

' --------------------------------------------------------------------

PRIVATE FUNCTION ListDispositif_Read() AS Collection
RETURN $Dispositifs
END

PRIVATE SUB ListDispositif_Write(Value AS Collection)
$Dispositifs = Value
END

' --------------------------------------------------------------------

PUBLIC Main()

PUBLIC ItemDispositif AS CDispositif ' Object pour 1 Dispositif
PUBLIC IndexDispositif AS INTEGER ' Index des Dispositifs dans le tableau

' On remplit le Tableau avec les 10 Dispositifs (Classe CDispositif)
FOR IndexDispositif = 1 TO 10
ItemDispositif = NEW CDispositif
$Dispositifs.Add(ItemDispositif, IndexDispositif)
NEXT

' On accede a un Dispositif par
$Dispositifs["1"].Disp_Name = "Nom dispositif 1"
$Dispositifs["1"].Disp_On = 0
$Dispositifs["1"].Disp_Off = 1
$Dispositifs["1"].Disp_Cal = "xxxxxxxxxx"

END

PUBLIC FUNCTION Renvoie_Dispositif(Num_Dispositif AS INTEGER) AS CDispositif

' Fonction pour renvoyer un Dispositif
IF $Dispositifs.Exist(Num_Dispositif) = TRUE THEN
RETURN $Dispositifs[Num_Dispositif]
END IF

END

==========================================================================

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CLASS AutreClass

PUBLIC SUB Traitement()

DIM NewDispositif AS Cdispositif

NewDispositif = Fmain.Renvoie_Dispositif(1)

PRINT "Dispositif Name: " & NewDispositif.Disp_Name

' Ou autre solution, plus directe

PRINT "Dispositif Name: " & Fmain.ListDispositif[1]

END



Voila
J'espere que cela aidera
Olivier


Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
O.Coquet#14 Posté le 3/11/2024 à 15:36:46
Ce qui n'est pas devra-t-être inventéHello, merci pour tous ces conseils et surtout pour avoir pris le temps de chercher tout ça pour moi, j'ai lu attentivement toutes vos suggestions et elles ont été utiles dans ma réflexion.

Pour Linuxos, la similitude inversée de nos pseudonymes (Linuxos / Olinux) et de nos prénoms, me laissent penser que nos esprits sont aussi tordus l'un que l'autre.

En effet, tu me fais deux classes qui accèdent à une structure qui se trouve dans une troisième classe (Si j'ai bien tout suivi......)

Pour ma part, j'ai choisi de créer une structure publique dans ma FMain, et d'intervenir directement dessus depuis ma seconde classe utilitaires ou se trouve ma fonction. Pas très élégant mais un peu moins tortueux quand même.

Quand à l'utilisation des structures, cela fait 25ans que je suis en désaccord avec Benoît sur le sujet, mais c'est normal, c'est un épitalien et je suis un ecelien......comprendra qui pourra :)))))

Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
linuxos#15 Posté le 3/11/2024 à 16:40:25
Un peu de sel, de poivre et la crevette sera... Je comprends, pas de soucis, chacun utilise la méthode ou il se sent le plus a l'aise.

Dernier détail, dans la majorité de mes projets, dont 1 qui fait presque 100 000 lignes, je concentre les Variables (de tous types) dans un module.

Cela permet de ne pas avoir a les chercher dans tous les Forms, Classes, etc...

Cela pourrait te simplifier le developpement.

Ex:
1
2
3
4
Module ModVars

PUBLIC TabDispositif AS Collection
PUBLIC NbreDispositif AS INTEGER


Ensuite pour y acceder de n'importe ou:
1
2
3
PRINT "Nombre de Dispositif: " & ModVars.TabDispositif.Count

PRINT "Nombre de Dispositif: " & ModVars.NbreDispositif


Voila
Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
12