FAQ C++/CLI et VC++.Net
FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
Pour utiliser un tableau en C++/CLI, vous pouvez utiliser le mot clé array du namespace cli.
Ainsi, vous pouvez déclarer un tableau et l'initialiser en une fois ou élément après élément.
cli::
array<
String^>^
tabChaine =
{
"Element 1"
, "Element 2"
, "Element 3"
}
;
cli::
array<
String ^
, 1
>
^
tabChaine =
gcnew cli::
array<
String ^>
(3
);
tabChaine[0
] =
"Element 1"
;
tabChaine[1
] =
"Element 2"
;
tabChaine[2
] =
"Element 3"
;
Pour accéder aux éléments du tableau, on peut utiliser l'accès direct avec [] ou dans une boucle for each.
for
(int
i=
0
;i<
tabChaine->
Length;i++
)
Console::
WriteLine(tabChaine[i]);
for
each (String ^
s in tabChaine)
Console::
WriteLine(s);
Avec le framework .Net est apparu pour le C++ le mot clé for each. Il est très utile pour parcourir un tableau ou une collection.
Chaque itération initialise un objet qui contient la valeur courante de l'itération.
using
namespace
System;
using
namespace
System::Collections::
Generic;
List <
String ^>
^
listChaine =
gcnew List<
String ^>
();
listChaine>
Add("element 1"
);
listChaine>
Add("element 2"
);
for
each (String ^
s in listChaine)
Console::
WriteLine(s);
Le namespace Array permet de trier des tableaux CLI grâce à la méthode Sort().
array<
int
>^
nombres =
{
99
, 43
, 28
, 11
, 16
, 52
, 30
}
;
Array::
Sort(nombres);
for
each(int
nombre in nombres)
Console::
Write(nombre +
" "
);
Ceci affichera :
11 16 28 30 43 52 99
Le namespace Array permet de rechercher un objet dans des tableaux CLI grâce à la méthode IndexOf().
On peut aussi utiliser la méthode BinarySearch.
array<
String^>^
jours =
{
"Lundi"
, "Mardi"
, "Mercredi"
, "Jeudi"
, "Vendredi"
, "Samedi"
, "Dimanche"
}
;
int
pos =
Array::
IndexOf(jours, "Mercredi"
);
if
(pos >
0
)
Console::
WriteLine("Mercredi a été trouvé à la position {0}"
, pos );
else
Console::
WriteLine("Mercredi n'a pas été trouvé"
);
Remarque : Si BinarySeach retourne une valeur négative, alors l'élément n'est pas trouvé. Cependant, avec cette valeur nous disposons d'une indication sur l'emplacement de l'élément qui est juste supérieur à la recherche.
Cela peut être utile pour insérer une valeur dans un tableau trié. Il suffit alors de faire un complément à zéro de la position :
pos =
~
pos;
Il peut être intéressant de faire en sorte que ses classes persos puissent être parcourues grâce au mot clé for each.
Pour ceci, il faut que la classe soit en mesure de fournir un objet IEnumerator et implémente l'interface IEnumerable afin de surcharger les méthodes MoveNext et Reset tout en permettant l'accès à la propriété Current.
Une solution est d'avoir une classe implémentant les interfaces IEnumerable et IEnumerator. Voici l'exemple d'une classe MyString, qui en l'occurence permet le parcours d'une chaîne avec for each (ce qui sert bien sur uniquement d'exemple, dans la mesure où la classe String le permet déjà).
using
namespace
System;
using
namespace
System::
Collections;
public
ref class
MyString : public
IEnumerable, public
IEnumerator
{
private
:
String ^
string_;
int
i;
public
:
MyString()
{
string_ =
""
;
i =
-
1
;
}
MyString(const
char
*
c)
{
string_ =
gcnew String(c);
i =
-
1
;
}
virtual
bool
MoveNext(void
)
{
if
( i <
string_->
Length -
1
)
{
i++
;
return
true
;
}
return
false
;
}
virtual
void
Reset() {}
property Object^
Current
{
virtual
Object^
get()
{
return
string_[i];
}
}
;
virtual
IEnumerator^
GetEnumerator()
{
return
this
;
}
}
;
int
main()
{
MyString ^
maChaine =
gcnew MyString("abcd"
);
for
each ( Object^
c in maChaine )
Console::
WriteLine(c);
}
On remarquera la méthode GetEnumerator qui renvoi this.
Une autre solution pourrait être d'utiliser une structure nested implémentant IEnumerator.