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 ![]()
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 ![]()
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)
non, pas possible, les portees locales se masquent par imbrication. C´est rape donc ![]()
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.
hihi
de toute façon, nous sommes d´accord qu´il faut éviter ça a tout prix ! merci en tout cas ![]()
C´est possible ! !!
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
.
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;
/ /--//
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;
}
Dsl, j´ai oublié le pop_back() dans le destructeur
.
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.
( 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...)
JeanYvesYves demandait si on pouvait le faire.
Mais, c´est surtout Altonfrere qui a la meilleur solution.
LGV : SD?
LGV: C´est vrai pour la resolution de portés
Avoues quand meme que c´est original comme principe.
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´.
Au depart, je voulais rajouter le nom de la variable dans la variable
. Comme ca, l´appel de a(0) aurait donné la premiere variable ayant comme nom a.
" 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(++) ![]()
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
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 ![]()
LGV : c´est vrai
, une fois par jour ou par semaine, ca serait fun. ( les questions amusantes)!
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.
fait des ronds qui suit la forme d´un triangle ![]()