BUG ou pas du compilo !!! [Résolu]

Signaler
Messages postés
21
Date d'inscription
mardi 6 mai 2008
Statut
Membre
Dernière intervention
13 août 2013
-
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
-
Bonjour à tous,

Je viens d'avoir un drôle de problème en c# avec le code ci-dessous. Le même code en testé en c et c++ fonctionne parfaitement.

private void test(int a,int b)
{
 if (a==b)
 {
  int c;
  c = a + b;
  Console.WriteLine(c);
 }
 int c; 
/*
le compilo (mono develop ou Visual Studio Express 2010) dit "Une variable locale nommée "c" ne peut pas être déclarée dans cette portée
*/
 c = b-a;
 Console.WriteLine(c);
}


Donc je supprime ma deuxiéme déclaration du "int c;"

private void test(int a,int b)
{
 if (a==b)
 {
  int c;
  c = a + b;
  Console.WriteLine(c);
 }

/*
le compilo (mono develop ou Visual Studio Express 2010) dit "Le nom "c" n'existe pas dans le contexte actuelle
*/
 c = b-a;
 Console.WriteLine(c);
}


Pourquoi en C ou c++ cela ne pose aucun problème et en c# si ?

private void test(int a,int b)
 {
  if(a==b)
    {
        int c;
        c=8;
        printf("%i",a);

    }

    int c;
    a=9;
    printf("%i",a);
}

/* OU EN C++ */

using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    if(1==1)
    {
        int A;
        A=8;
        cout<<A<<endl;

    }

    int A;
    A=9;
    cout<<A<<endl;
    return 0;
}




Dans l'attente de votre savoir,
Merci d'avance.

Akiko Nyuki,

5 réponses

Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Le code :
private void test(int a,int b)
{
 if (a==b)
 {
  int c;
  c = a + b;
  Console.WriteLine(c);
 }
 int c; 
 c = b-a;
 Console.WriteLine(c);
}


équivaut à :
private void test(int a,int b)
{
 int c; 
 if (a==b)
 {
  int c;
  c = a + b;
  Console.WriteLine(c);
 }
 c = b-a;
 Console.WriteLine(c);
}


Donc, tu déclares dans le bloc englobant déjà ta variable "c", mais comme la ligne est après, l'erreur est dessus.

Quand tu fais tes FOR, c'est comme si tu déclarais dans chaque bloc une variable "a", donc pas d'interférence entre les déclaration.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Car, quand tu déclares une variable dans un bloc { ... }
Cette variable n'est présente que dans ce bloc.

Si tu déclare la variable plusieurs fois il te dit que la variable est déjà déclarée.

Essayes de ne la déclarée qu'une fois ou alors, fais plusieurs fonction.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
21
Date d'inscription
mardi 6 mai 2008
Statut
Membre
Dernière intervention
13 août 2013

Ok, merci pour la réponse, c'est effectivement ce que j'ai fait, j'ai renommé ma deuxième déclaration. Mais je voudrais savoir pourquoi en C# on ne peut pas réutilisé le même nom de variable alors que en C/C++,, et en java(test réalisé) il n'y a pas de problème tant que l'environnement {....} n'est pas le même.

Par exemple en VB6 les déclaration dans une structure IF ... THEN ... END IF était global à la fonction . Dans ce cas là je comprendrai pourquoi le compilo sortirai une erreur, mais en c# c'est le cas car dans mon deuxième test je ne re-déclare pas le "int c" est le compilo refuse de me générer mon code.

Deuxiéme TEST, avec des boucles FOR (il n'y a pas de problème)
for (int a=0;a<9;a++)
{
 Console.WriteLine(a);
}

for (int a=0;a<99;a++)
{
 Console.WriteLine(a);
}


??? je ne comprends pas la logique de c#

@++
Akiko Nyuki.
Messages postés
21
Date d'inscription
mardi 6 mai 2008
Statut
Membre
Dernière intervention
13 août 2013

Ok, j'ai compris !!! Comme mon nom de variable existe déjà dans la fonction en tant que variable global, c# n'autorise pas d'occulter une variable de même nom dans un dans l'environnement de la fonction.

Il faut pensez que je peux utiliser ma variable global de la fonction dans la condition "if" donc naturellement je ne peux avoir 2 déclarations de même nom.

Perso, je prefère la façon de gérer du c/c++

<code cpp>
#include

using namespace std;

int main()
{
cout << "Hello world!" << endl;
int A;
A=7;
cout< A est bien resté à 7 // chose non possible en C# dommange
9

C'est toujours bon savoir, je serais plus attentif à mes déclarations de variables en C#.

Merci beaucoup, c'est super sympas de ta part d'avoir pris le temps pour l'explication !
Akiko Nyuki

PS : A tout hasard, n'existerai-t-il pas un moyen de compiler en c# avec une option qui permettrai d'avoir le même comportement que en c/c++ ?
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Pour des questions de clarté, il est quand même pas terrible de faire cela, car quand tu es dans une fonction qui contient une variable A, si celle-ci n'est pas la même dans la fonction selon le morceau de code, ça demande une grosse gymnastique intellectuelle.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---