Les variables et les tableaux en VB.Net

Résolu
Utilisateur anonyme - Modifié le 14 mai 2017 à 17:50
 Utilisateur anonyme - 17 mai 2017 à 20:42
Bonjour ,

j'aimerais savoir comment ça se passe au niveau du compilateur ou de la RAM lorsque une variable est passer en argument ou qu'une variable = une autre variable comme ceci


Dim variable as integer = 9
Dim tableau(variable) as integer

' tableau = variable donc 9 se qui revient à faire tableau(9)




Dim variable as integer = 10
Dim variable2 as integer = variable

variable = variable2 'donc 10 se qui revient à faire variable2 = 10


je voulais savoir si au moment de compiler quand par exemple il arrive à
tableau(variable)
dés qu'il voit
variable
il regarde la valeur de celle ci et remplace
tableau(variable)
par
tableau(9)
, et pareil pour une variable qui contient une autre variable

ou si au niveau de la RAM par exemple à l'emplacement 45832 de la RAM

cet emplacement contient la variable avec comme valeur comme variable ,comme ça se passe dés qu'il voit la variable comme valeur il vas voir cette variable à son emplacement et rapporte cette valeur ?

bref je voulais avoir un peu plus d'infos à ce niveau la si possible

merci d'avance :)

6 réponses

Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
17 mai 2017 à 11:03
Bonjour

je tente un dernier truc, après je suis à court d'idées.
Désolé pour l'écriture, j'ai des gros doigts et pas de stylet sur ma tablette.

Dim tableau(9)



as Interger



ET il s'appelle tableau


tableau2 = tableau



1
Utilisateur anonyme
17 mai 2017 à 11:40
Bonjour comment tu fais pour afficher des images ? car j'aimerais aussi pour te faire voir un truc
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
17 mai 2017 à 15:11
Salut Whis
Qui ne tente rien n'a rien !
Plus simple y a pas !
Tu aurais pu faire concurrence à Picasso
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596 > vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022

17 mai 2017 à 17:18
Mouais.....


Pour les photos, en théorie c'est en suivant cette procédure
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#insertion-via-le-bouton-d-edition

Mais ce matin, ça ne marchait pas. J'ai ouvert une discussion sur ccm, y ai importé les images et copié les liens ici.
Ensuite j'ai annulé l'autre discussion
0
Utilisateur anonyme > Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022

Modifié le 17 mai 2017 à 17:58
merci du lien
voici l'image
http://www.zimagez.com/zimage/test845.php

fais pas gaffe à droite, à valeur juste en dessous d'emplacement , c'est référence pas valeur

j'ai vu qu'il y avais ceci https://en.wikipedia.org/wiki/Stack_(abstract_data_type)

"l'effet" Push et Pop je voulais savoir vu que pour accéder à une donnée il faut supprimer des données , comment les valeurs supprimer reviennent ? genre si je supprime la valeur d'un emplacement de tableau comment cette valeur revient ?
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596 > Utilisateur anonyme
17 mai 2017 à 19:21
J'en sais rien
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
14 mai 2017 à 19:48
Bonsoir

pour les tableaux il ne s'agit pas d'argument, mais d'index.
Un argument c'est pour une méthode (Sub ou Function).
VB.Net porte à confusion sur ce point car la syntaxe utilise des parenthèses pour les deux cas.
EN C, C++, Java C# (et sans doute d'autres langages), les parenthèses sont réservées aux arguments, les index sont entre crochets.

Cela dit, ta question concerne au final la variable et pas le fait qu'elle soit un index ou un argument.

Quand tu exécutes
Dim variable as integer = 9
ça crée un espace mémoire pour un entier (4 octets) et y place la représentation de 9.
Quand tu exécutes
Dim tableau(variable) as integer
tableau n'est pas égal à variable. Ça crée un espace mémoire de type tableau d'entiers, ce tableau est prévu pour n entier, la valeur de n est lue dans l'espace mémoire qui correspond à variable. Ça crée donc n fois 4 octects pour la place des entiers et quelques octects supplémentaires pour la définition du tableau.

Quand tu exécutes
Dim variable as integer = 10
Dim variable2 as integer = variable
variable = variable2

Ça crée 2 emplacements pour entier dans la mémoire, ça place la représentation de 10 dans le 1er et copie ce qu'il y a dans le 1er vers le 2eme, parce que integer est un type valeur.

Par contre un tableau est un type référence.
Dim tableau(10) as integer
Dim tableau2(10) as integer
tableau2 = tableau1
ça ne crée pas 2 emplacement pour 10 entiers, mais ça lie tableau2 avec l'emplacement de tableau.
Donc
        Dim tableau(10) As Integer
        Dim tableau2(10) As Integer
        tableau2 = tableau
        tableau(0) = 1
        tableau(1) = 2
        tableau(2) = 3
        tableau(3) = 4
        tableau(4) = 5
        tableau(5) = 6
        tableau(6) = 7
        tableau(7) = 8
        tableau(8) = 9
        tableau(9) = 10
        Console.WriteLine(tableau2(5).ToString())


La console va afficher 6 même si j'ai affecté les valeurs de tableau après tableau2 = tableau

Par contre
        Dim tableau(10) As Integer
        Dim tableau2(10) As Integer
        tableau2 = tableau
        tableau(0) = 1
        tableau(1) = 2
        tableau(2) = 3
        tableau(3) = 4
        tableau(4) = 5
        tableau(5) = 6
        tableau(6) = 7
        tableau(7) = 8
        tableau(8) = 9
        tableau(9) = 10
        Console.WriteLine(tableau2(5).ToString())

        tableau = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4}

        Console.WriteLine(tableau2(5).ToString())

va afficher 2 fois 6, car tableau = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4} crée un nouvel emplacement qui sera lié à tableau, tableau2 lui est toujours lié à l’emplacement d'origine.
0
Utilisateur anonyme
14 mai 2017 à 21:10
"Dim tableau(variable) as integer tableau n'est pas égal à variable. Ça crée un espace mémoire de type tableau d'entiers, ce tableau est prévu pour n entier, la valeur de n est lue dans l'espace mémoire qui correspond à variable. Ça crée donc n fois 4 octects pour la place des entiers et quelques octects supplémentaires pour la définition du tableau."

je comprend pas le n , qu'est ce que c'est ?

tableau = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4} crée un nouvel emplacement qui sera lié à tableau

comprend pas
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596 > Utilisateur anonyme
14 mai 2017 à 22:53
n c'est un nombre quelconque, t'as pris 9 , ça aurait 2 ou 100.

tableau = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4} 
ça crée un tableau avec les valeurs entre accolades.
C'est pour éviter de faire
        tableau(0) = 4
        tableau(1) = 4
        tableau(2) = 4
        tableau(3) = 4
        tableau(4) = 4
        tableau(5) = 4
        tableau(6) = 4
        tableau(7) = 4
        tableau(8) = 4
        tableau(9) = 4
0
Utilisateur anonyme > Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022

Modifié le 15 mai 2017 à 01:10
si j'ai bien compris car avec les n je me perd un peu

"Quand tu exécutes
Dim variable as integer = 9 ça crée un espace mémoire pour un entier (4 octets) et y place la représentation de 9.
Quand tu exécutes
Dim tableau(variable) as integer tableau n'est pas égal à variable. Ça crée un espace mémoire de type tableau d'entiers, ce tableau est prévu pour n entier, la valeur de n est lue dans l'espace mémoire qui correspond à variable. Ça crée donc n fois 4 octects pour la place des entiers et quelques octects supplémentaires pour la définition du tableau.
"


Dim tableau(variable) as integer


variable = 9

donc quand ça va dans la mémoire arriver à
Dim tableau(variable) as integer
dés qu'il voit variable il récupère la valeur de variable dans la RAM et remplace variable comme ceci
Dim tableau(9) as integer
ce qui correspond à l'emplacement du tableau ?

"Quand tu exécutes
Dim variable as integer = 10
Dim variable2 as integer = variable
variable = variable2

Ça crée 2 emplacements pour entier dans la mémoire, ça place la représentation de 10 dans le 1er et copie ce qu'il y a dans le 1er vers le 2eme, parce que integer est un type valeur. "


dans la RAM quand il arrive à variable il regarde la valeur et la valeur c'est variable2 il vas à variable2 et remplace variable2 à variable par sa valeur ?

"tableau = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4} ça crée un tableau avec les valeurs entre accolades. "

merci de l'astuce c'est plus pratique :)
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
15 mai 2017 à 08:57
dans la RAM quand il arrive à variable il regarde la valeur et la valeur c'est variable2 il vas à variable2 et remplace variable2 à variable par sa valeur?

Je ne comprends pas cette phrase
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022

15 mai 2017 à 10:51
Bonjour
Je me permets de me mêler à cette discussion

revenons au variable et prenons le cas d'une variable de type Integer
Dim Nombre1 as Integer = 10


Ce code dimensionne une variable de type Integer ( c'est-à-dire que la variable est déclarée comme une variable de type Integer) et on lui donne la valeur 10
Que fait le compilateur : il voit qu'il y a une variable de type Integer dont le nom est Nombre1 : il réserve donc une zone mémoire où est stockée cette valeur et il se souvient de l'adresse de cette zone mémoire

Maintenant
Dim Nombre2 as Integer = Nombre

On déclare une nouvelle variable Nombre2 de type Integer et on lui donne la valeur de Nombre1
Le compilateur crée la zone mémoire pour stocker la valeur de Nombre2 et comme le code demande que Nombre2 soit égal à Nombre1 le compilateur va chercher la valeur de Nombre1 et l'affecte à Nombre2

Maintenant les tableaux
Dim Nombres(9) as Integer

Ce code déclare un tableaux de 10 Nombres indicés de 0 à 9 ( on peut dire indice ou index pour la dimension du tableau)
Nombres(0)
Nombres(1)
etc....


Nombres(9)

Le compilateur réserve 10 emplacements ( chacun de ces emplacements est réservé à un seul élément du tableau : Nombre(3) et Nombre(4) par exemple ont chacun leurs propres adresses en mémoire)
Si dans le code on a
nombres(3) = 25
le compilateur va affecté à l'élément d'indice 3 du tableau Nombres la valeur 25


Maintenant le cas de 2 tableaux
Dim Nombres(3) as Integer = {0,1,2,3}
Dim Valeurs(3) as Integer = Nombres
.

On a bien 2 tableaux de 4 éléments : le tableau Nombres et le tableau Valeurs . On se rend compte que les 2 tableaux ont les mêmes valeurs .
Mais le compilateur ne crée qu'un seul tableau dans sa mémoire et ceci fait que les 2 tableaux pointent sur les mêmes adresses mémoire pour les valeurs
C'est là que l'on dit que les tableaux sont de type référence : les 2 tableaux sont liés entre eux comme dit Whismeril . Si on modifie Nombres(5) par exemple Valeurs(5) prendra la valeur de Nombres(5)
Le cas de 2 tableaux avec des noms différents mais des valeurs identiques est assez rare mais cela peut exister dans certains cas .

Maintenant plus personne ne s'occupe de savoir comment le compilateur gère tout ceci en mémoire ( à part dans des cas spéciaux dont je ne parlerais point ici) . L'important est de savoir manipuler les variables et les tableaux correctement !

un bonjour à Whis
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
15 mai 2017 à 22:38
Bonsoir à tous

Dim Nombres(3) as Integer = {0,1,2,3}
Dim Valeurs(3) as Integer = Nombres


pas correct
Une initialisation explicite n'est pas autorisée pour les tableaux déclarés avec des limites explicites

on écrit

Dim Nombres() as Integer = {0,1,2,3}
Dim Valeurs() as Integer = Nombres

atttention
comme le tableau valeurs pointe sur la même adresse mémoire
que Nombres

Dim Nombres() As Integer = {1, 2, 3, 4}
Dim Valeurs() As Integer = Nombres
Dim x As Double
x = Valeurs(1) / Valeurs(0)
Nombres(0) = 0
'et le crash tu as divisé un nombre par zéro
x = Valeurs(1) / Valeurs(0)


l'enigme

Si j'écris

Dim Nombres() As Integer = {1, 2, 3, 4}
Dim Valeurs() As Integer = Nombres
j'ai redimensioné le tableau nombre
ReDim Nombres(0)

' Dim x As Double

'comme le tableau valeurs pointe sur la même adresse mémoire
'que Nombres et nombre contient une valeur
'y a t'il une erreur ?
x = Valeurs(3) / Valeurs(2)
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
15 mai 2017 à 22:46
Exact Cs_Shayw
comme quoi on écrit parfois des bétises
Merci de me corriger
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
15 mai 2017 à 22:54
As tu lu l'article wikipédia?

Après pour reprendre l'analogie de ShayW, personne n'a besoin de connaitre par le détail la mécanique d'une voiture pour la conduire.
Et si tu veux connaitre ça par le détail, il ne faut pas passe le permis, mais suivre une formation de mécano.

Là ton questionnement touche au fonctionnement même d'un ordinateur et de son OS.
C'est pour une bonne part de l'électronique.
Et la partie code de l'OS c'est pas en VB.Net que tu la verras.

Y'a un moment
  • soit t'acceptes que ça marche comme ça:
    • Une variable lie un nom que tu as donné (qui ne représente rien pour le PC, juste pour toi dans le fichier texte qu'est le code source) avec un emplacement mémoire.
    • Pour les types valeur, à chaque nom correspond un emplacement différent.
    • Pour les types référence, le premier nom crée l'emplacement, les autres noms sont liés à cet emplacement (exemple, tu crées un tableau dans la sub Main, tu le passes en paramètre à la sub Traitement, le tableau dans traitement est un autre nom pour le tableau dans Main)
  • Soit t'arrêtes VB et tu vas faire un BTS en électronique assortie d'une formation en assembleur.


Y'a plein de choses que tu as acceptées avant de les comprendre:
  • que le jour succède à la nuit,
  • les saisons,
  • la télé, le frigo, le train, etc....

0
Utilisateur anonyme
15 mai 2017 à 23:03
oui mais j'ai pas compris pour

Dim tableau(10) As Integer
Dim tableau2(10) As Integer
tableau2 = tableau
tableau(0) = 1
tableau(1) = 2
tableau(2) = 3
tableau(3) = 4
tableau(4) = 5
tableau(5) = 6
tableau(6) = 7
tableau(7) = 8
tableau(8) = 9
tableau(9) = 10


je vois pas trop comment au même emplacement de la mémoire il y a deux tableaux

après je voulais juste une confirmation

c'est au moment du compilateur
dés qu'il voit
variable = variable2
ou
tableau(variable)
il vas cherché les valeurs dans Variable2 et la remplace par sa valeur par exemple 5 , et pour
tableau(variable)
le compilateur vas dans variable prend la valeur et remplace variable par sa valeur 10 par exemple de variable et ensuite il créer les 11 emplacements en partant de 0 jusqu'à 10 ?
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
Modifié le 15 mai 2017 à 23:14
Déjà, il faut que tu arrêtes de penser que le compilateur exécute le code.
Le compilateur compile, il transforme le fichier texte, compréhensible de l'humain, en une suite de mots binaires compréhensible de l'OS.
C'est l'OS qui exécute le code, et donc qui va lire ou écrire la mémoire.
En .Net c'est sensiblement différent, mais je ne vais pas rajouter une couche d'incompréhension sur l'incompris. (Pas très français mon truc).

Pour

Dim tableau(10) As Integer
        Dim tableau2(10) As Integer
        tableau2 = tableau
        tableau(0) = 1
        tableau(1) = 2
        tableau(2) = 3
        tableau(3) = 4
        tableau(4) = 5
        tableau(5) = 6
        tableau(6) = 7
        tableau(7) = 8
        tableau(8) = 9
        tableau(9) = 10


Prenons toi comme exemple.
Hixale c'est ton pseudo, mais tu as un vrai prénom (on va dire Albert).
Albert et Hixale sont deux variables différentes de la même personne, y'a pas 2 personnes.
Y'a une personne avec 2 noms.
Donc tout ce qui est appliqué à l'un est valable pour l'autre: quand Albert va chez le coiffeur, Hixale change de coiffure.
0
Utilisateur anonyme > Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022

Modifié le 16 mai 2017 à 00:33
oui il me sembler bien que le compilateur exécuter pas le code,


c'est au moment du compilateur (OS)
dés qu'il voit variable = variable2 ou tableau(variable) il vas cherché les valeurs dans Variable2 et la remplace par sa valeur par exemple 5 , et pour
tableau(variable) le compilateur (OS) vas dans variable prend la valeur et remplace variable par sa valeur 10 par exemple de variable et ensuite il créer les 11 emplacements en partant de 0 jusqu'à 10 ?


tu peux changer compilateur par Os si tu veux , mais ça ne change pas la question

je veux juste un oui ou un non

pour

Prenons toi comme exemple.
Hixale c'est ton pseudo, mais tu as un vrai prénom (on va dire Albert).
Albert et Hixale sont deux variables différentes de la même personne, y'a pas 2 personnes.
Y'a une personne avec 2 noms.
Donc tout ce qui est appliqué à l'un est valable pour l'autre: quand Albert va chez le coiffeur, Hixale change de coiffure.


oui ça j'ai compris , mais comment , par exemple à l'emplacement 56388
de la mémoire comment es-ce possible qu'au même emplacement il y a deux tableaux ?


Dim tableau(10) As Integer
Dim tableau2(10) As Integer
tableau2 = tableau


emplacement 
56388 de la ram = tableau(0) = 4
tableau2(0) = 4

comme ceci ?
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > Utilisateur anonyme
16 mai 2017 à 00:40
A l'emplacement 56388 de la Ram comme tu dis il n'y a qu'une seule valeur : 4
Mais cette valeur appartient aux 2 tableaux
On dit que les 2 tableaux pointent sur les mêmes emplacements mémoire : c'est si dur à comprendre ceci
0
Utilisateur anonyme > vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022

16 mai 2017 à 01:30
ah d'accord il y a que la valeur qui est dans l'emplacement de la RAM,
du coup c'est l'emplacement de la RAM qui est aux deux tableaux ? comment il font pour associer l'emplacement de la RAM avec les deux tableaux ou même juste avec une variable ? c'est l'OS qui s'occupe de l'association de l'emplacement de RAM aux deux tableaux ou d'une seul variable ?
0

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

Posez votre question
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
15 mai 2017 à 23:31
Bonjour Wishmeril


Si j'écris

Dim Nombres() As Integer = {1, 2, 3, 4}
Dim Valeurs() As Integer = Nombres
j'ai redimensioné le tableau nombre
ReDim Nombres(0)
Dim x As Double

'comme le tableau valeurs pointe sur la même adresse mémoire
'que Nombres et nombre contient une valeur
'y a t'il une erreur ?
x = Valeurs(3) / Valeurs(2)

non
réponse x = 1.3333
bizarre si j'ai redimensioné le tableau nombre j'aurais pensé
obtenir une exception
Valeurs(3) index out of range
0
Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022
596
15 mai 2017 à 23:50
Non car quand tu redim Nombres, tu lui affectes la référence vers le nouveau tableau, et Valeurs garde la référence vers l'ancien.
Par contre, je ne sais pas si c'est un comportement spécifique à .Net ou si Java et C++ (au hasard !) fonctionnent pareil.
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > Whismeril
Messages postés
17337
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 mai 2022

15 mai 2017 à 23:55
Merci pour tes précisions Whismeril
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
15 mai 2017 à 23:49
Salut Cs_ShayW

J'ai testé

Si tu redimensionnes avec Redim Nombres(0) tu réinitialises le tableau Nombres avec un seul élément de valeur 0 vu qu'il n'y a de Preserve .
Mais le tableau Valeurs existe toujours avec ses 4 éléments d'origine : donc il n'y a aucune erreur

J'ai même testé avec un Redim Nombres(3)
Ceci remet à 0 les 4 éléments de Nombres mais ne modifie nullement le tableau Valeurs .

On peut donc en déduire que le redimensionnement du tableau Nombres enlève la liaison par référence entre les 2 tableaux
0