CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

(C/C++) Portée des variables

JeanYvesYves
JeanYvesYves
Niveau 10
16 février 2005 à 11:16:57

salut ! !

Je m´adresse aux experts en C/C++
( genre LGV, Lapintade, etc...)
suite a un message hier auquel LGV a su me répondre, sur la portée des variables.
La, j´essaie d´aller plus loin : ( j´avoue, je seche)

Voici le code ( dégueulasse) suivant

int a=10; / /1e

int main()
{
int a=20; / /2e
if ( 1)
{
int a=30; / /3e
if ( 1)
{
int a=40; / /4e
a++;
}
}
return 0;
}

et ça compile ! !!! ( que ce soit en C++, ou juste en C)

Je voudrais, la ou il y a le a++, qui modifie le 4e a, pouvoir modifier le 1e, 2e, ou 3e ?
Déja, suite a hier, si je veux modifier le 1e, je fais :
( ::a)++;
ça ok !
Mais pour modifier le 2e ou le 3e, qq un a une idée ? ?

Sinon, vu que l´opérateur de portée :: est du pur C++, quelqu´un a t il une méthode pour y modifier en C ?

Merci :)

Altonfrere
Altonfrere
Niveau 10
16 février 2005 à 11:43:00

une solution simple, renommer les variables :) tu l´as dit toi même c´est " dégueulasse" ca, hehe

Sinon je crois que par définition, en C la priorité est donnée au dernier scope déclaré, donc à ma connaissance dans ce cas précis c´est mort.

Mais bon d´autres avis pourront peut être faire avancer le schmilblik :)

JeanYvesYves
JeanYvesYves
Niveau 10
16 février 2005 à 11:48:31

vivi, je sais que la priorité sera a la derniere déclarée, autrement dit la 4 :)
Mais bon, j´aimerais juste savoir si c´est possible quand meme ! ! ( meme si on est d´accord que c´est ultra crade)

LGV
LGV
Niveau 28
16 février 2005 à 12:43:58

non, pas possible, les portees locales se masquent par imbrication. C´est rape donc :)

Lapintade
Lapintade
Niveau 30
16 février 2005 à 13:57:09

Rhooo le vilain :-)

Aucune idée en ce qui me concerne, j´ai jamais eu de probleme de portée, donc jamais eu a y reflechir.

JeanYvesYves
JeanYvesYves
Niveau 10
16 février 2005 à 14:12:45

hihi :) de toute façon, nous sommes d´accord qu´il faut éviter ça a tout prix ! merci en tout cas :-)

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 19:20:35

C´est possible ! !!

  1. include < iostream>
  2. include < vector>

using namespace std;

/ *
Programmeur : Dark Paladin et JeanYvesYves(Code Initial)

Je peux acceder à toute les variables que je veux sauf les new,new[] ou
je devrai faire une modif. Il s´agit d´un prototype, plus pour le défis.
L´offset serait mieux que l´indexation, Mais bon, c´etait pour démontrer
qu´il n´y rien d´impossible ( LGV :p).

c´est aussi possible en C, mais moins portable puisque que les class
n´existent pas en C, au pire les struct.

aussi, j´aurais du utiliser les templates pour pouvoir l´appliquer à toute
les variables possibles(short,int,long....)

DP

  • /

class INTernMe
{
int V;
static vector<void*> RSJVIPtr;
static long N;
public:
INTernMe(int a = 0) : V(a)
{
RSJVIPtr.push_back(&);
N++;
};

~INTernMe(){--N;};

int * operator()(long x)
{
if ( x > = N) return &
return ( int*)RSJVIPtr[x];
}

int operator++(int) {return V++;}
int operator++() {return ++V;}
};

vector<void*> INTernMe::RSJVIPtr;
long INTernMe::N = 0;

/ /--//

  1. define int INTernMe

int a = 10; / /1e

long main(long argc, char* argv[])
{
printf("[1e]:A : %d\n",::a); / /
int a=20; / /2e
printf("[2e]:A : %d\n",a); / /
if ( 1)
{
int a=30; / /3e
printf("[3e]:A : %d\n",a); / /
if ( 1)
{
int a=40; / /4e
( *a(1))++; / / < -- Modifie le 2e(Darkpaladin)
printf("[4e]:A : %d\n",a); / /
}
printf("[3e]:A : %d\n",a); / /
}
printf("[2e]:A : %d :)\n",a); / /
printf("[1e]:A : %d\n",::a); / /
system("pause");
return 0;
}

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 19:39:18

Dsl, j´ai oublié le pop_back() dans le destructeur :(.

LGV
LGV
Niveau 28
16 février 2005 à 20:34:47

je suis d´accord sur le principe, mais dans le contexte ça devient n´importe quoi ! Evidemment, si tu fournis un accesseur externe ( ooh, les beaux static...), ou une SD qui a le meme role, ça perd tout son interet ! Evidemment qu´on peut acceder à n´importe quel élément de son code.. Si tu offsets comme il faut dans tes segments, tu tripotes bien ce que tu veux en mémore. Mais là, autant foutre deux static en place dans la mémoire, où ça te fait plaisir, et OOOoohh miracle, un incrément sur l´adresse du premier donne acces au second :/ . .. Donc je maintiens ce que je disais plus haut.

LGV
LGV
Niveau 28
16 février 2005 à 20:40:18

( pour expliciter p-e plus clairement ce que je veux dire, c´est qu´en faisant, tu fournis des symboles annexes de portées différentes, pour les acceder aux memes données ; si on considere purement la déclaration et son contexte de portée, il n´y a PAS de solution par le langage C++, comme c´est par exemple le cas avec l´operateur de résolution de portée, pour aller voir dans les globaux, les namespaces, les classes, et autres. J´y peux rien, le standard definit les portées locales de la sorte...)

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 20:41:57

JeanYvesYves demandait si on pouvait le faire. :)

Mais, c´est surtout Altonfrere qui a la meilleur solution.

LGV : SD?

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 20:43:09

LGV: C´est vrai pour la resolution de portés

Avoues quand meme que c´est original comme principe.

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 20:46:43

LGV : " ...un incrément sur l´adresse du premier donne acces au second . .." Je me fis pas a l´incrementation pour faire ca, j´utilise plutot une double pile pour faire ca, puisque si tu declares un
double,long ou autres, cette variable ne seras pas representé avec le ´a´.

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 20:48:51

Au depart, je voulais rajouter le nom de la variable dans la variable :fou: . Comme ca, l´appel de a(0) aurait donné la premiere variable ayant comme nom a.

fil_razorback
fil_razorback
Niveau 10
16 février 2005 à 20:50:11

" Evidemment, si tu fournis un accesseur externe ( ooh, les beaux static...), ou une SD qui a le meme role, ça perd tout son interet ! Evidemment qu´on peut acceder à n´importe quel élément de son code.. Si tu offsets comme il faut dans tes segments, tu tripotes bien ce que tu veux en mémore. Mais là, autant foutre deux static en place dans la mémoire, où ça te fait plaisir, et OOOoohh miracle, un incrément sur l´adresse du premier donne acces au second :/ . . . Donc je maintiens ce que je disais plus haut."

Parfois je me demande quelle est la langue maternelle des programmeurs de C(++) :ouch:

LGV
LGV
Niveau 28
16 février 2005 à 21:21:43

DarkPaladin : je pense qu´on a compris l´exercice différement :) Pour moi en lisant la chose, on sous-entend " sans modifier le code, le C++ me donne-t-il un moyen d´acceder à mes données masquées déclarées dans une portable locale de niveau supérieur", ce à quoi la réponse est non. Par contre si on répond exclusivement à " puis-je acceder à mes données masquées", là je suis tout à fait d´accord que la réponse est oui, evidemment.

La surcharge de l´opérateur ( ) masque un peu ce qui se passe avec ton mécanisme, mais si on déroule à l´extreme un cas simplissime, on en reviens à faire qqch guère mieux qu´un :

{
int a; ( 1)
int & = a;
{
int a; ( 2)
/ / terrible j´ai encore acces a ( 1) via b
}
}

donc à partir du moment où on s´autorise des alias ( encore l´occasion de caser un mot clef qui sert à rien tiens ; ) ) , ça perd son interet :´(

enfin, au final tout le monde a ses réponses, c´est le principal :)

on devrait lancer des petites questions " amusantes" de la sorte, ça pourrait etre marrant..

ah et SD, je voulais dire Structure de Données

jejej
jejej
Niveau 9
16 février 2005 à 21:28:37

OOOOh j´aime ce mot la : SD

stp , LGV , tu pourrais me dire ce que ce mot signifie , parce que je vais recevoir bientot un livre sur " datas structures " for game programmers :p)

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 21:31:54

LGV : c´est vrai :), une fois par jour ou par semaine, ca serait fun. ( les questions amusantes)!

Darkgift
Darkgift
Niveau 9
16 février 2005 à 21:32:42

Salut ! en faîte comme vous êtes en tr1 de parler de C++ et de code . . voilà quand on a dl " Dv-c++" et qu´on a lu un ( put1) de livre qui ( est sencé) initié au C++ qu´est-ce qu´on peut essayé de faire en premier ? Parce que moi faire des triangle qui tourne en rond ça m´intéresse pas tellement.

DarkPaladin
DarkPaladin
Niveau 5
16 février 2005 à 21:35:08

fait des ronds qui suit la forme d´un triangle :p)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment