BUG ou pas du compilo !!!

Résolu
Nyuki Messages postés 21 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 13 août 2013 - 12 mai 2012 à 17:55
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 12 mai 2012 à 20:18
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

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
12 mai 2012 à 19:13
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
---
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
12 mai 2012 à 18:17
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
---
0
Nyuki Messages postés 21 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 13 août 2013
12 mai 2012 à 18:48
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.
0
Nyuki Messages postés 21 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 13 août 2013
12 mai 2012 à 20:06
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++ ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
12 mai 2012 à 20:18
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
---
0
Rejoignez-nous