Question

Cela me rend fou depuis quelques jours.Pourquoi ce qui suit ne fonctionne-t-il pas ?

    Dim arr(3, 3) As Integer

    For y As Integer = 0 To arr.GetLength(0) - 1
        For x As Integer = 0 To arr.GetLength(y) - 1
            arr(y, x) = y + x
        Next
    Next

Et si le tableau ressemblait à ceci ?

{ {1, 2, 3},
  {4, 5, 6, 7, 8, 9, 9, 9},
  {5, 4, 3, 2}
}
Était-ce utile?

La solution

Ok, donc ce dont vous avez vraiment besoin, c'est d'un "tableau irrégulier".Cela vous permettra d'avoir un "tableau contenant d'autres tableaux de longueurs variables".

  Dim arr As Integer()() = {New Integer() {1, 2, 3}, New Integer() {4, 5, 6, 7, 8, 9, 9, 9}, New Integer() {5, 4, 3, 2}}

  For x = 0 To arr.GetUpperBound(0)
      Console.WriteLine("Row " & x & " has " & arr(x).GetUpperBound(0) & " columns")
      For y = 0 To arr(x).GetUpperBound(0)
          Console.WriteLine("(" & x & "," & y & ") = " & arr(x)(y))
      Next
   Next

Sortir:

Row 0 has 2 columns
(0,0) = 1
(0,1) = 2
(0,2) = 3
Row 1 has 7 columns
(1,0) = 4
(1,1) = 5
(1,2) = 6
(1,3) = 7
(1,4) = 8
(1,5) = 9
(1,6) = 9
(1,7) = 9
Row 2 has 3 columns
(2,0) = 5
(2,1) = 4
(2,2) = 3
(2,3) = 2

Autres conseils

Parce qu’il n’y a pas de dimension « 2 » ou « 3 ».Doit être .GetLength(1) au lieu de .GetLength(y)

Aussi:dans les déclarations de tableau VB.Net fonctionnent un peu différemment.L'indice que vous spécifiez dans la déclaration est le dernier index, et non le nombre d'éléments créés comme avec C# ou C++.Mais le tableau est toujours indexé 0 comme C# ou C++, au lieu d'être indexé 1 comme VB6.Cela signifie que si vous passez à VB.Net à partir d'une langue différente, vos instincts de tableau sont probablement faux, quelle que soit la langue.Dans VB.Net, Dim arr(3,3) Comme entier crée en fait un 4x4 tableau.

arr.GetLength(y)

devrait être

arr.GetLength(1)

Et si j'avais un tableau qui ressemblait à ceci

{ {1, 2, 3},
  {4, 5, 6, 7, 8, 9, 9, 9},
  {5, 4, 3, 2}
}

Comment GetLength(1) connaîtrait-il toujours la longueur de chaque ligne ?


En gros, ce que je veux, c'est... un moyen de trouver le nombre d'éléments dans une ligne donnée.

Dim arr(3, 3) As Integer
Dim y As Integer
Dim x As Integer

For x = 0 To arr.Rank - 1
    For y = 0 To arr.GetLength(x) - 2
        arr(x, y) = x + y
    Next
Next

Le code ci-dessus a fonctionné pour moi.

Edit, le code semble sale cependant.Je me demande qu'est-ce que vous essayez d'accomplir ?

Ce code en C# sert à obtenir toutes les combinaisons d'éléments dans un tableau irrégulier :

    static void Main(string[] args)
    {
        bool exit = false;
        int[] indices = new int[3] { 0, 0, 0 };
        string[][] vectores = new string[3][];

        vectores[0] = new string[] { "A", "B", "C" };
        vectores[1] = new string[] { "A", "B" };
        vectores[2] = new string[] { "B", "D", "E", "F" };

        string[] item;
        int[] tamaños = new int[3]{vectores[0].GetUpperBound(0), 
            vectores[1].GetUpperBound(0), 
            vectores[2].GetUpperBound(0)};

        while (!exit)
        {
            item = new string[]{ vectores[0][indices[0]],
                    vectores[1][indices[1]],
                    vectores[2][indices[2]]};

            Console.WriteLine("[{0},{1},{2}]={3}{4}{5}", indices[0], indices[1], indices[2], item[0], item[1], item[2]);
            GetVector(tamaños, ref indices, ref exit);
        }
        Console.ReadKey();
    }

    public static void GetVector(int[] tamaños, ref int[] indices, ref bool exit)
    {
        for (int i = tamaños.GetUpperBound(0); i >= 0; i--)
        {
            if (tamaños[i] > indices[i])
            {
                indices[i]++;
                break;
            }
            else
            {
                //ULTIMO ITEM EN EL ARRAY, VALIDAR LAS OTRAS DIMENSIONES SI YA ESTA EN EL ULTIMO ITEM
                if (!ValidateIndexes(tamaños, indices))
                    indices[i] = 0;
                else
                {
                    exit = true;
                    break;
                }
            }
        }
    }

    public static bool ValidateIndexes(int[] tamaños, int[] indices)
    {
        for (int i = 0; i < tamaños.Length; i++)
        {
            if (tamaños[i] != indices[i])
                return false;
        }
        return true;
    }

La sortie ressemble à [0,0,0] = aab [0,0,1] = aad [0,0,2] = aae [0,0,3] = aaf [0,1,0] = abb [ 0,1,1] = abd [0,1,2] = abe [0,1,3] = abf [1,0,0] = bab [1,0,1] = mauvais [1,0,2 ] = Bae [1,0,3] = baf [1,1,0] = bbb [1,1,1] = bbd [1,1,2] = bbe [1,1,3] = bbf [2 , 0,0] = CAB [2,0,1] = CAD [2,0,2] = CAE [2,0,3] = CAF [2,1,0] = CBB [2,1,1] = CBD [2,1,2] = CBE [2,1,3] = CBF

Votre déclaration : DIM arr(3,3) As Integer spécifie déjà qu'il y a 3 éléments dans une ligne donnée (ou 4, je ne suis pas si sûr pour VB)

Tu pourrais essayer:

Dim arr(3) as Integer()

Vous devriez alors pouvoir faire :

arr(n).Length

Pour trouver la longueur de la ligne n.

Je suis un peu rouillé sur VB6 et je n'ai jamais appris VB.NET, mais cela devrait vous donner un tableau « irrégulier ».Consultez la documentation msdn sur les tableaux multidimensionnels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top