French Tableau et données structurées

Nopix

New Member
Licensed User
Longtime User
Bonjour,

Je vous expose mon problème ;

Je veux pouvoir charger dans un tableau, des données structurées.
Les données doivent être présentes dans le code (pas de table SQL / fichier CSV/XML/...).
Je débute sous B4A et malgré mes recherches sur les forums et autres guides, je ne comprend pas d'où vient le problème (ci-dessous).
Merci pour votre expertise.

Que ce soit avec ce code :

Type myStruct (x As Byte, y As Boolean, z As String)
Dim listOfArrays As List
listOfArrays.Initialize
listOfArrays.Add(Array As myStruct(1, True, "foo"))

ou celui-ci :

Type myStruct (x As Byte, y As Boolean, z As String)
Dim tabNum() As myStruct
tabNum = Array As myStruct(1, True, "foo")

J'obtiens la même erreur...

(code 1)
src\b4a\example\main.java:288: error: inconvertible types
mostCurrent._listofarrays.Add((Object)(new b4a.example.main._mystruct[]{(b4a.example.main._mystruct)(1),(b4a.example.main._mystruct)(anywheresoftware.b4a.keywords.Common.True),(b4a.example.main._mystruct)("foo")}));
^
(code 2)
src\b4a\example\main.java:293: error: inconvertible types
mostCurrent._tabnum = new b4a.example.main._mystruct[]{(b4a.example.main._mystruct)(1),(b4a.example.main._mystruct)(anywheresoftware.b4a.keywords.Common.True),(b4a.example.main._mystruct)("foo")};
^
(commun aux deux)
required: _mystruct
found: int
1 error
 

Informatix

Expert
Licensed User
Longtime User
Bonjour,

Je vous expose mon problème ;

Je veux pouvoir charger dans un tableau, des données structurées.
Les données doivent être présentes dans le code (pas de table SQL / fichier CSV/XML/...).
Je débute sous B4A et malgré mes recherches sur les forums et autres guides, je ne comprend pas d'où vient le problème (ci-dessous).
Merci pour votre expertise.

Les deux bouts de code sont erronés en effet. Voici comment ça marche:
B4X:
Type myStruct (x As Byte, y As Boolean, z As String)
Dim listOfArrays As List
listOfArrays.Initialize
Dim myRecord As myStruct
myRecord.Initialize 'ce n'est pas indispensable ici car les types des donnees sont basiques, mais c'est une bonne habitude a prendre
myRecord.x = ...
myRecord.y = ...
myRecord.z = ...
listOfArrays.Add(myRecord)
 

Nopix

New Member
Licensed User
Longtime User
Informatix, merci pour la solution. J'apprécie.

Cela me rappel les enregistrements (record) en Delphi :)
Pour rester sur ce parallèle, en Delphi on peut affecter l'ensemble des valeurs dans la déclaration d'une constante comme ceci :

type
myStruct = record
x : Byte;
y : bool;
z : ShortString;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const
myRecord : array [0..2] of myStruct =
((x: 5; y: False; z: 'foo'),
(x: 10; y: True; z: 'foo1'),
(x: 7; y: False; z: 'foo2'));
begin
label1.Caption:=myRecord[1].z; //--- affiche foo1
end;


Mes 2 essais en B4A n'étaient pas suffisamment précis car c'est ce type d'affectation de valeurs que je cherche à faire.
Je ne sais pas si cela est possible avec B4A mais je vais chercher :)

Meilleures salutations.
 

Informatix

Expert
Licensed User
Longtime User
Je ne sais pas si cela est possible avec B4A mais je vais chercher :)

Non car le type est en fait une classe en Java. Il faut donc créer une instance à chaque fois et B4A ne le fait pas automatiquement. De toute façon, il vaut mieux écrire une fonction dédiée:
Sub AjouterRecord(X, Y, Z)
Dim myRecord As myStruct
myRecord.Initialize
myRecord.x = X
myRecord.y = Y
myRecord.z = Z
listOfArrays.Add(myRecord)
End Sub
et appeler AjouterRecord pour chaque ensemble de valeurs.
 

Nopix

New Member
Licensed User
Longtime User
Non car le type est en fait une classe en Java. Il faut donc créer une instance à chaque fois et B4A ne le fait pas automatiquement. De toute façon, il vaut mieux écrire une fonction dédiée

Je comprends ! Merci de m'avoir fait gagner un temps précieux :)

Effectivement, la fonction dédiée est une solution.

Je peux aussi décomposer ma struture en tableaux, comme ceci :

Dim listOfArraysX, listOfArraysY, listOfArraysZ As List

listOfArraysX.Initialize
listOfArraysY.Initialize
listOfArraysZ.Initialize

listOfArraysX.Add(Array As Byte(5, 10, 7))
listOfArraysY.Add(Array As Boolean(False, True, False))
listOfArraysZ.Add(Array As String("foo","foo1","foo2"))

Dim myTabX() As Byte = listOfArraysX.Get(0)
Dim myTabY() As Boolean = listOfArraysY.Get(0)
Dim myTabZ() As String = listOfArraysZ.Get(0)

Et ainsi récupérer mes valeurs avec le même indice.

Log(myTabX(1)) ' ---> 10
Log(myTabY(1)) ' ---> true
Log(myTabZ(1)) ' ---> foo1
 
Top