Aide sur déclaration et utilisation de tableau

Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 27 sept. 2007 à 10:40
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 27 sept. 2007 à 14:35
BOnjour, j'ai de nouveau besoin de votre savoir car un truc m'échappe !
Je ne comprends pas les suptilité de la déclaration de tableau ex :Dim

champs_de_la_ligne
As
String()

' différence avec :

Dim Num_prod ()
As
String

????

Ensuite j'ai un soucis avec des erreurs de référence nul !
si je dis

champs_de_la_ligne = parser.ReadFields()

ya aucun soucis le tableau champs_de_la_ligne contient bien les 11 valeurs strings de la ligne en cours de lecture, ensuite je veux que le champs 1 soit champs_de_la_ligne (1) de cette ligne soit mémorisé dans la variable Num_prod(ligne en cours), donc je pensais écrire : (je vous passe les détails de la lecture du fichier car c'est pas le probléme)

Num_prod(index_ligne) =

CInt(champs_de_la_ligne(1))
'le champs 1 contient l'id_prodstat_prod(index_ligne) =

CBool(champs_de_la_ligne(10))
'le champs 10 contient le statusindex_ligne += 1

'au prochain coup on lit la ligne suivante donc num_prod et stat_prod +1Et bien là il est pas content du tout ! Une <?XML:NAMESPACE PREFIX MSHelp NS "http://msdn.microsoft.com/mshelp" /??><mshelp:link tabindex="0" keywords="T:System.NullReferenceException">NullReferenceException</mshelp:link> se produit lorsque vous tentez de référencer un objet dans votre code qui n'existe pas ! GRRR alors là ou je ne pige pas c'est que je ne peux pas lui dire combien de ligne j'aurais puisque je suis dans une boucle WHILE NOT EOF, et puis pourquoi cela ne le géne pas lorsqu'il fait champs_de_la_ligne = parser.ReadFields() ?? pourtant il ne sais pas non plus combien de champs il y aura à lire sur cette ligne
Comment faire dans le While pour récupérer deux valeurs du tableau champ_de_la_ligne (le 1 et le10) et le transferer dans deux variables pour les traiter à la fin de la boucle de lecture des lignes.
D'avance merci

Tiens les balises ne sont pas reconnues ^_____^, zut alors.....

7 réponses

cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
27 sept. 2007 à 10:50
Salut,

Pour les champ null essaye ceci :
If not parser.ReadFields() VbNullString then champs_de_la_ligne parser.ReadFields()

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
27 sept. 2007 à 11:22
salut exploreur, en fait champs_de_la_ligne ne pose aucun soucis , c'est pas lui qui bloque, car il recoit le tableau entier => champs_de_la_ligne = parser.ReadFields()
là ou cela bloque c'est lorsque je veux extraire une valeur de ce tableau !
exemple => mavaleur  as string = champs_de_la_ligne(1), la pas de soucis non plus,
Mais comme à chaque boucle de la lecture du fichier la valeur champs_de_la_ligne(1) change je dois l'archiver dans mavaleur(indéxé de la ligne en cour) et c'est la que cela merdouille !
voila ce que je pensais faire :

dim  mavaleur() as string ou dim mavaleur as string() je pige pas la différence ^^
Using

parser
As
New TextFieldParser(monfichier)parser.SetDelimiters(séparateur)

While
Not parser.EndOfData
'tant que pas fin de fichierchamps_de_la_ligne = parser.ReadFields()

mavaleur (index_ligne) = champs_de_la_ligne(1) <=== c'est ici que cela merdouille car il ne connait la longueur de mavaleur !

index_ligne += 1

' on compte le nombre de ligne

End
While

End
UsingDu coup pour que cela fonctionne j'ai bricolé ! 
 [mode bricolage = on]
faire une premiére boucle de lecture while pour récuperer index_ligne, puis apres
Dim mavaleur (index_ligne) as string
remettre index_ligne à zéro et relancer la lecture avec cette fois ci
mavaleur (index_ligne) = champs_de_la_ligne(1)
Et là ca marche bien.

Sauf que :
Comme le DIM mavaleur (index_ligne)  as string et dans la boucle While, elle ne peut pas être lu ailleurs -_-"
Obligé de la retransferer dans un autre tableau (public lui)
MESvaleursenfinrécupéré = mavaleur()

 [mode bricolage = off]

mais j'aimerai comprendre les détails de ces tableaux et comment faire ceci dans les régles de l'art SVP.
merci de vos lectures.
Tiens les balises ne sont pas reconnues ^_____^, zut alors.....
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
27 sept. 2007 à 11:30
Excuse moi alors  j'avais pas bien compris le problème de "null"...

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
0
Utilisateur anonyme
27 sept. 2007 à 13:34
Salut,


J'ai du mal a comprendre ce que tu veux faire dans tes codes, donc je vais t'expliquer "les régles de l'art" des tableaux.

Pour la déclaration :
Dim Tab() as String et équivalent de Dim Tab as String()
Les deux sont correcte, tu écris a la manière que tu veux.
Mais en principe, en vb on met Dim Tab() as String
Les parenthèses sur le type c'est plus pour le retour d'un tableau a une fonction.
Function Func(Args as Object) as String()

Pour les indices :
En vb.net, ils commencent toujours à 0
Un tableau de 10 valeurs sera indexée de 0 à 9

__________
Kenji
(
Nouveau forum VBA/Office
0

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

Posez votre question
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
27 sept. 2007 à 14:17
merci bien pour ces infos.
Pour préciser mon besoin :

dim a(), b(10) as integer ' soit deux tableau un dynamique et l'autre finit

si je dis a=b il le prends
si je dis :
for a=0 to "fin de fichier"
a(index) = b(1) il léve une exception : NullReferenceException se produit lorsque vous tentez de référencer un objet dans votre code qui n'existe pas !

hors j'ai besoin de pouvoir "piocher" l'octet N°1 dans ce tableau (qui contient N octet d'une ligne d'un fichier)
pour le placer dans un autre tableau qui lui est indéxé sur le nombre lignes
J'ai pas l'impression d'être clair alors je vais vous poster le code "bricolé" pour faire ce que je veux ^^

déclaration début de class form

' zone final de récup du numéro de produit

Dim Num_prod
As
Integer()

' zone final de récup du status du test pour ce produit

Dim stat_prod
As
Boolean()
dans le form load :

'******************************************* LECTURE DU FICHIER CSV AU DEMARRAGE ****************************************

' chemin fixe du fichier à lire

Dim monfichier
As
String = Application.StartupPath &
"\testsTOR.csv"

' variable binaire qui test la présence du fichier

Dim monfichier_existe
As
Boolean =
My.Computer.FileSystem.FileExists(monfichier)

' tableau de champs à lire pour une ligne (notre csv fait 11 champs par ligne)

Dim champs_de_la_ligne
As
String()

' valeur du séparateur de champs (pour un csv c'est le point virgule

Dim séparateur
As
String =
";"

' bit de test de la premiére ligne (ligne de titre pas à traiter)

Dim ligne_data
As
Boolean =
False

' index de ligne en cours

Dim index_ligne
As
Integer = 0 

' si le fichier existe ont lit toutes les lignes une à une

If monfichier_existe
Then

' obligé pour l'instant de faire un tour à vide du fichier pour dimensionner le tableau en fonction du nb de ligne

Using parser
As
New TextFieldParser(monfichier)parser.SetDelimiters(séparateur)

While
Not parser.EndOfData
'tant que pas fin de fichierchamps_de_la_ligne = parser.ReadFields()

index_ligne += 1

' on compte le nombre de ligne

End
While

End
Using

' zone de récup temporaire du numéro de produit de la taille du nombre de ligne luent - la premiére et la derniére (-2 quoi)

Dim Num(index_ligne - 2)
As
Integer

' zone de récup du status du test pour ce produit

Dim stat(index_ligne - 2)
As
Boolean

'raz de l'index ligne pour remplissage des valeursindex_ligne = 0

Using parser
As
New TextFieldParser(monfichier)parser.SetDelimiters(séparateur)

While
Not parser.EndOfData
'tant que pas fin de fichier

' on lit tous les champs de la ligne en courschamps_de_la_ligne = parser.ReadFields()

' traitement des variables luent (1)=Id_prod et (10)=status

'élimine la premiére ligne car c'est la ligne des titres

If ligne_data
Then
' au premier cycle on ne fait rienNum(index_ligne) =

CInt(champs_de_la_ligne(1))
'le champs 1 contient l'id_prodstat(index_ligne) =

CBool(champs_de_la_ligne(10))
'le champs 10 contient le statusindex_ligne += 1

'au prochain coup on lit la ligne suivante donc num_prod et stat_prod +1

End
If

' mise à vrai lorsque la premiére ligne est passéligne_data =

True

End
While

' transfert de la lectureNum_prod = Num

stat_prod = stat

End
Using

ElseMsgBox(

"Fichier introuvable !")

End
IfEt là cela marche je récupére bien dans num_prod et stat_prod les champs contenues dans le fichiers CSV, voila je trouve cela un peu lourding comme façon de faire !
Tiens les balises ne sont pas reconnues ^_____^, zut alors.....
0
Utilisateur anonyme
27 sept. 2007 à 14:27
Salut,

Il faut d'abord créer le tableau avant de le remplier :
a = CType(System.Array.CreateInstance(GetType(Integer), TailleTalbeau), Integer())







__________
Kenji

(


Nouveau forum VBA/Office
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
27 sept. 2007 à 14:35
Ah bon ? et un dim a(10) as integer cela suffit ? du moment où l'on connais la taille, car c'est la mon soucis c'est que je ne sais pas combien de ligne contient le fichier, donc je suis obligé de faire une lecture pour rien et ensuite je peux écrire a(nbdeligne) et la ça marche, mais je suis sur qu'il y a un moyen plus simple pour attribuer une valeur à un tableau non défini en taille, du style :
dim a() as integer
for i=0 to "je ne connais pas la valeur" then a(i)=un truc.

c'est ça que j'arrive pas à faire

Peux tu me préciser la différence entre dim a(10) et a = CType(System.Array.CreateInstance(GetType(Integer), 10), Integer())  . merci pour les infos si rapides ^^

Tiens les balises ne sont pas reconnues ^_____^, zut alors.....
0
Rejoignez-nous