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

Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 14 mai 2017 à 17:49 - Dernière réponse : Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention
- 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 :)
Afficher la suite 

45 réponses

Répondre au sujet
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 14 mai 2017 à 19:48
0
Utile
16
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.
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 15 mai 2017 à 22:37
les 2 tableaux ont leurs valeurs aux mêmes emplacements mémoire : on dit qu'ils pointent sur les mêmes emplacements mémoire !
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 22:40
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) ?
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 17:35
Salut.
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 19:32
j'ai répondu en même temps que Whismeril du coup peut-être que vous avez pas vu le nouveau message
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 15 mai 2017 à 21:23
Commenter la réponse de Whismeril
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 15 mai 2017 à 22:38
0
Utile
1
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)
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 22:46
Exact Cs_Shayw
comme quoi on écrit parfois des bétises
Merci de me corriger
Commenter la réponse de cs_ShayW
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 22:54
0
Utile
10
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....

Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 16 mai 2017 à 07:57
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 16 mai 2017 à 19:12
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


?
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 16 mai 2017 à 20:58
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 ?
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 17 mai 2017 à 01:15
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 !
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 13:49
Commenter la réponse de Whismeril
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 15 mai 2017 à 23:31
0
Utile
2
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
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 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.
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 23:55
Merci pour tes précisions Whismeril
Commenter la réponse de cs_ShayW
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 mai 2017 à 23:49
0
Utile
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
Commenter la réponse de vb95
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 11:03
0
Utile
10
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



vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention - 17 mai 2017 à 20:03
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 )
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 20:20
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 .
Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 20:20
Ça oui, mais sa question
genre si je supprime la valeur d'un emplacement de tableau comment cette valeur revient ?
je ne sais pas.
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 20:41
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
Hixale 219 Messages postés samedi 25 février 2017Date d'inscription 16 septembre 2017 Dernière intervention > Whismeril 11412 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 17 mai 2017 à 20:42
bon bah ciao alors
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.