Les variables et les tableaux en VB.Net [Résolu]

Signaler
-
 Utilisateur anonyme -
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

Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545
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



Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 > Utilisateur anonyme
Bonsoir
Push et Pop ce qui signifie Pousser et Tirer sont utilisés dans le langage assembleur lors des opérations sur la pile gérée par le microprocesseur ! On pousse des données sur la pile pour les mettre de côté et faire autre chose et on les récupère lorsque l'on en a besoin .
Tout ce que tu as regardé sur Wikipédia t'est inutile pour l'apprentissage de VB Net . Ces notions dépassent le cadre d'un simple cours sur ce langage .
Pour moi ce sera la fin de la discussion vu que tu ne veux pas suivre nos conseils ( 170 messages environ pour 6 posts sur des notions de base en VB Net )
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50 >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Salut vb95

Hixale ne s'en rend meme pas compte que sa question initiale n'a aucun
rapport avec vb.net et comme on lui a répondu il continue.
Lorsqu'il arrivera ...... au chapitre des List<T> Class ,on atteindra les
1000 messages comme les 1000 bornes .
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545 >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Ça oui, mais sa question
genre si je supprime la valeur d'un emplacement de tableau comment cette valeur revient ?
je ne sais pas.
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021

Salut Whis
J'en sais rien non plus mais si on supprime quelque chose pour moi il ne revient pas !
Salut Cs-ShayW
Faudrait peut-être lui mettre une Panne d'essence ou une Crevaison en espérant qu'il n'ait pas la botte pour nous faire un coup fourré !
Amitiés à vous deux
Utilisateur anonyme >
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021

bon bah ciao alors
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545
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.
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 > Utilisateur anonyme
les 2 tableaux ont leurs valeurs aux mêmes emplacements mémoire : on dit qu'ils pointent sur les mêmes emplacements mémoire !
Utilisateur anonyme >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

ah! donc tableau1(3) et tableau2(3) on chacun leur emplacement mais si tableau1(2) = tableau2(5) le compilateur regarde juste la valeur de tableau2(5) et l'affecte à tableau1(3) ?
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545 >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Salut.
Utilisateur anonyme >
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021

j'ai répondu en même temps que Whismeril du coup peut-être que vous avez pas vu le nouveau message
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545 > Utilisateur anonyme
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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)
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137
Exact Cs_Shayw
comme quoi on écrit parfois des bétises
Merci de me corriger
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545
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....

Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545 > Utilisateur anonyme
Utilisateur anonyme >
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021

j'ai fais quelques recherches

https://docs.microsoft.com/fr-fr/dotnet/articles/csharp/language-reference/keywords/reference-types

https://fr.wikipedia.org/wiki/R%C3%A9f%C3%A9rence_(programmation)

https://fr.wikipedia.org/wiki/Allocation_de_m%C3%A9moire

https://fr.wikipedia.org/wiki/Adressage_m%C3%A9moire

https://fr.wikipedia.org/wiki/Tas_(allocation_dynamique)

+ ton lien

http://cdiese.fr/gestion-de-la-memoire-en-net-en-5-min/

et encore d'autres site...

si j'ai bien compris ,


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


les Dim tableau(4) As Integer
Dim tableau2(4) As Integer
tableau2 = tableau


RAM

56327 = tableau1(0) = 5
39754 = tableau1(1) = 3
52346 = tableau1(2) = 9
75325 = tableau1(3) = 2
13456 = tableau1(4) = 6

29752 = tableau2(0) = 56327
42688 = tableau2(1) = 39754, si je veux afficher tableau1(1)
39953 = tableau2(2) = 52346
88542 = tableau2(3) = 75325
66643 = tableau2(4) = 13456


et que

tableau2(0) = console.writeline(56327)

donc ça afficherai la valeur de tableau1 ? et pas directement tableau2 ou le compilateur ou l'os affecte la valeur de tableau1 à tableau2 ?



 tableau2 = tableau1
tableau1 affecte toute ses références à tableau2 dans toute les valeurs de tableau2 , donc tableau2 est un tableau de type référence qu'on pourrai appeler pointeur ? et comme je lés dis un peu plus haut "le compilateur ou l'os ça affecte la valeur de tableau1 à tableau2 ?
"



et que

29752 = tableau2(0) = 5
42688 = tableau2(1) = 3

l'index change en fonction de ce qu'on veux affecter la valeur de tableau1 à tableau2


mais comment ça se passe pour un tableau qui une variable ou un tableau en index comme ceci


dim variable as integer = 10
dim tableau(variable) as integer


?
Utilisateur anonyme > Utilisateur anonyme
l'emplacement 56643 correspond , par exemple: tableau(0) et dans cette emplacement il y la valeur 56643 = 6

après qui attribue ces emplacement et comment l'os (si c'est l'os) sait que l'emplacement 56643 qui à une valeur , correspond à cette variable ou tableau ? ou garde t-il ces informations ?
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 > Utilisateur anonyme
Bonjour
Tu as fait plein de recherche et le résultat est que tu t'embrouilles de plus en plus !
Si tu t'en tenais à ce que t'as dit Whismeril ( voir ci-dessous son message)

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....



Car là on frise la discussion inutile et non productive !
Utilisateur anonyme >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021
545
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.
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
15934
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 mai 2021

Merci pour tes précisions Whismeril
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137
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