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
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621 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
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.
"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
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621
>
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
Utilisateur anonyme
>
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023 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 :)
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621 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
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165
>
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023 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 !
cs_ShayW
Messages postés3258Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201956 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)
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165 15 mai 2017 à 22:46
Exact Cs_Shayw
comme quoi on écrit parfois des bétises
Merci de me corriger
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621 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:
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 ?
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621 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).
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.
Utilisateur anonyme
>
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023 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 ?
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165
>
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
Utilisateur anonyme
>
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023 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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_ShayW
Messages postés3258Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201956 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
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023621 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
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165
>
Whismeril
Messages postés18285Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention21 mars 2023 15 mai 2017 à 23:55
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165 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
17 mai 2017 à 11:40
17 mai 2017 à 15:11
Qui ne tente rien n'a rien !
Plus simple y a pas !
Tu aurais pu faire concurrence à Picasso