Problème de portée de variables en C# [Résolu]

Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 6 juil. 2009 à 10:37 - Dernière réponse : Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention
- 9 juil. 2009 à 09:40
Bonjour,

Je suis actuellement en stage sur un projet C# objet. Je découvre le monde de l'objet et je bloque sur un problème de portée de variables ...
Voici mon script :

protected void Button3_Click(object sender, EventArgs e)
    {
        ArrayList vList = AsrCall.connect();

        ArrayList vAccountCallAsr = new ArrayList();
        string vCopy = null;

        int i = 0;
        string vType;
        int nbTotalsuccess = 0;
        int nbTotalfail = 0;
        int vAsrTotalCalculated;

        for (i = 0; i < vList.Count; i++)
        {
            AsrCall vAsrCall = (AsrCall)(vList[i]);

            vType = vAsrCall.Type;

            if (vType == null)
            {
                nbTotalsuccess++;
            }
            else
            {
                nbTotalfail++;
            }

            vAsrTotalCalculated = nbTotalsuccess / (nbTotalsuccess + nbTotalfail);

            AcpAsr vAcpAsr;

            if ((vCopy == null) || (vAsrCall.Prefix != vCopy))
            {
                AcpAsr vAcpAsr = new AcpAsr(vAsrCall.Prefix, vAsrCall.Date, vAsrCall.Zone);
                vList.Add(vAcpAsr);
            }

            AcPrefix vAcPrefix = new AcPrefix(vAsrCall.Serial, vAsrCall.Date, vAsrCall.TimeC,
                                               vAsrCall.Cause, vAsrCall.Type, vAsrCall.Cli,
                                               vAsrCall.Destination, vAsrCall.Carrier, vAsrCall.Prefix,
                                               vAsrCall.Creneau, vAsrCall.CreneauC, vAsrCall.CarrierC);

            vAcpAsr = vAcpAsr;
           
            vAcpAsr.addCallAsr(vAcPrefix);

            vCopy = vAsrCall.Prefix;
        }
    }

Et voici les scripts des classes utilisées :

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Data.SqlClient;
using System.Data.SqlTypes;
using BooProd.Core;
using System.Collections;

/// <summary>
/// Description résumée de AsrCall
/// </summary>
public class AsrCall
{

    private SqlInt32 _Serial;
    public int Serial
    {
        get { return (_Serial.IsNull) ? Int32.MinValue : _Serial.Value; }
    }

    private SqlDateTime _Date = new SqlDateTime();
    public DateTime Date
    {
        get { return (_Date.IsNull) ? DateTime.MinValue : _Date.Value; }
    }

    private SqlString _Prefix;
    public string Prefix
    {
        get { return (_Prefix.IsNull)?null:_Prefix.Value; }
    }

    private SqlInt16 _Cause;
    public int Cause
    {
        get { return (_Cause.IsNull) ? Int16.MinValue : _Cause.Value; }
    }

    private SqlString _Type;
    public string Type
    {
        get { return (_Type.IsNull) ? null : _Type.Value; }
    }

    private SqlString _CreneauC;
    public string CreneauC
    {
        get { return (_CreneauC.IsNull) ? null : _CreneauC.Value; }
    }

    private SqlInt32 _Carrier;
    public int Carrier
    {
        get { return (_Carrier.IsNull) ? Int32.MinValue : _Carrier.Value; }
    }

    private SqlString _CarrierC;
    public string CarrierC
    {
        get { return (_CarrierC.IsNull) ? null : _CarrierC.Value; }
    }

    private SqlInt32 _TimeC;
    public int TimeC
    {
        get { return (_TimeC.IsNull) ? Int32.MinValue : _TimeC.Value; }
    }

    private SqlString _Cli;
    public string Cli
    {
        get { return (_Cli.IsNull) ? null : _Cli.Value; }
    }

    private SqlString _Destination;
    public string Destination
    {
        get { return (_Destination.IsNull) ? null : _Destination.Value; }
    }

    private SqlString _Creneau;
    public string Creneau
    {
        get { return (_Creneau.IsNull) ? null : _Creneau.Value;  }
    }

    private SqlString _Zone;
    public string Zone
    {
        get { return (_Zone.IsNull) ? null : _Zone.Value; }
    }

    public static ArrayList connect()
    {
        QConnection vQConnection = new QConnection(ExecSplan.DB_ASR);
        vQConnection.addVarChar("@pPrefix", "00212");
        vQConnection.addVarChar("@pCli", null);
        vQConnection.addInt("@pCarrier", 4);
        vQConnection.addVarChar("@pCompte", null);
        vQConnection.addTinyInt("@pSort", 3);
        vQConnection.addTinyInt("@pCallType", 2);
        vQConnection.addTinyInt("@pModeTime", 5);
        vQConnection.addVarChar("@pTypeSem", "2");
        vQConnection.addVarChar("@pTypeHeure", "1");
        vQConnection.addVarChar("@pType", "3");
        vQConnection.addDateTime("@pBeginDate", new DateTime(2009, 06, 22, 10, 40, 0));
        vQConnection.addDateTime("@pEndDate", new DateTime(2009, 06, 22, 13, 20, 0));
        SqlDataReader vReader = vQConnection.execQuerySP("[ASR_billing_call]");

        // On va lire les résultats de la procédure stockée
        // et les mettre dans un tableau
       
       
        AsrCall vAsrCall= new AsrCall();
          ArrayList vArrayList = new ArrayList();
        while (vAsrCall.read(vReader))
        {
            vArrayList.Add(vAsrCall);
            vAsrCall= new AsrCall();               
        }

        return vArrayList;
    }

    private bool read(SqlDataReader pReader)
    {
        if (pReader == null || !pReader.Read())
                return false;
            _Serial = pReader.GetSqlInt32(pReader.GetOrdinal("serialNumber"));
            _Date = pReader.GetSqlDateTime(pReader.GetOrdinal("timedate"));
            _Prefix = pReader.GetSqlString(pReader.GetOrdinal("prefix"));
            _Cause = pReader.GetSqlInt16(pReader.GetOrdinal("clear_cause"));
            _Type = pReader.GetSqlString(pReader.GetOrdinal("type"));
            _CreneauC = pReader.GetSqlString(pReader.GetOrdinal("creneaucolor"));
            _Carrier = pReader.GetSqlInt32(pReader.GetOrdinal("carrier"));
            _CarrierC = pReader.GetSqlString(pReader.GetOrdinal("carrierColor"));
            _TimeC = pReader.GetSqlInt32(pReader.GetOrdinal("timeCall"));
            _Cli = pReader.GetSqlString(pReader.GetOrdinal("cli"));
            _Destination = pReader.GetSqlString(pReader.GetOrdinal("destination"));
            _Creneau = pReader.GetSqlString(pReader.GetOrdinal("creneau"));
            _Zone = pReader.GetSqlString(pReader.GetOrdinal("zone"));
            return true;
       
    }

    public AsrCall()
    {
        //
        // TODO : ajoutez ici la logique du constructeur
        //
    }
}

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Collections;

/// <summary>
/// Description résumée de AcpAsr
/// </summary>
public class AcpAsr
{

    private string _Prefix;
    public string Prefix
    {
        get { return _Prefix; }
    }

    private DateTime _DateTime;
    public DateTime DateTime
    {
        get { return _DateTime; }
    }

    private string _Zone;
    public string Zone
    {
        get { return _Zone; }
    }

   

    public AcpAsr(string pPrefix, DateTime pDateTime, string pZone)
    {
        //
        // TODO : ajoutez ici la logique du constructeur
        //
    }

}

Mon problème est le suivant :

"Erreur    2    Une variable locale nommée 'vAcpAsr' ne peut pas être déclarée dans cette portée, car elle modifierait la signification de 'vAcpAsr', déjà utilisée dans une portée 'parent ou en cours' pour désigner autre chose    C:\Users\Vincent\Desktop\Boulot BTS\Stage\Maquette_Appli\Default.aspx.cs    161    24    C:\...\Maquette_Appli"

"Erreur    4    'AcpAsr' ne contient pas une définition pour 'addCallAsr' et aucune méthode d'extension 'addCallAsr' acceptant un premier argument de type 'AcpAsr' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)    C:\Users\Vincent\Desktop\Boulot BTS\Stage\Maquette_Appli\Default.aspx.cs    172    21    C:\...\Maquette_Appli"

Merci d'avance
Afficher la suite 

Votre réponse

12 réponses

krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 6 juil. 2009 à 11:09
+3
Utile
Salut

C'est gentil de mettre ton code, mais là ça en fait un peu trop pour qu'on s'amuse à tout lire, surtout si tu ne précises pas où se trouvent tes erreurs.

Cependant : pour ta première erreur, c'est simple :
            AcpAsr vAcpAsr;
            if ((vCopy == null) || (vAsrCall.Prefix != vCopy))
            {
                AcpAsr vAcpAsr = new AcpAsr(vAsrCall.Prefix, vAsrCall.Date, vAsrCall.Zone);
                vList.Add(vAcpAsr);
            }
Tu crées une référence que tu appelles vAcpAsr. Et si la condition est vraie, tu crées une autre référence qui s'appelle aussi vAcpAsr. Donc c'est évident que ça risque de poser problème...
Donc dans ta quatrième ligne, assigne juste une valeur à ta référence existante, au lieu d'en créer une nouvelle (donc efface AcpAsr de ta quatrième ligne).

Pour ta deuxième erreur, c'est encore plus simple :
            vAcpAsr.addCallAsr(vAcPrefix);
Là tu appelles carrément une fonction qui n'existe pas. On ne trouve nulle part dans ton code une méthode appelée addCallAsr dans ta classe AcpAsr. Donc il faut la créer.

PS :
                        new AcPrefix(vAsrCall.Serial, vAsrCall.Date, vAsrCall.TimeC,
                                               vAsrCall.Cause, vAsrCall.Type, vAsrCall.Cli,
                                               vAsrCall.Destination, vAsrCall.Carrier, vAsrCall.Prefix,
                                               vAsrCall.Creneau, vAsrCall.CreneauC, vAsrCall.CarrierC);
c'est assez barbare comme code. Ce ne serait pas plus simple de faire new AcPrefix(vAsrCall); et d'extraire les valeurs dans le constructeur ?

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 6 juil. 2009 à 12:56
+3
Utile
Alors le problème c'est que ta méthode requiert un string (string pPrefix) alors que tu lui envoies un AcPrefix. Donc il te faudrait remplacer

public void addCallAsr (string pPrefix) par public void addCallAsr (AcPrefix pPrefix)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 6 juil. 2009 à 14:15
+3
Utile
ta méthode addCallAsr() se trouve bien dans ta classe AcpAsr ?

parce que si je décris ta ligne :
vAcpAsr.addCallAsr(vAcPrefix);
vAcpAsr est unobjetde type AcpAsr.
vAcPrefix est un objet de type AcPrefix.
et supposons que ta méthode Button3_Click() n'est pas dans la classe AcpAsr ni dans une classe qui en hérite.

Voici ce que je peux déduire de ça (juste de cette ligne et des 3 infos supplémentaires)
La classe AcpAsr ou une classe dont elle hérite doit posséder une méthode non statique appelée addCallAsr avec un opérateur de portée publicou internal, et qui prend comme unique paramètre un objet de type AcPrefix ou d'un type dont il hérite.

(Les couleurs correspondent à où j'ai pu voir telle ou telle information)

Il faut que tous ces points soient respectés et c'est bon.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 6 juil. 2009 à 14:43
+3
Utile
Alors déjà, j'ai vu un truc très moche auquel j'avais pas fait gaffe dans ton code.vAcpAsr vAcpAsr;> C'est inutile, et ça embrouille celui qui va lire ton code.


"Utilisation d'une variable locale non assignée"
"Alors qu'elle est déclarée avant mon if ..."
=> Tu confonds l'assignation et la déclaration. Si tu ne l'avais pas déclarée, il aurait mit "la variable vAcpAsr n'existe pas dans le contexte actuel".
Ton programme arrivera à la ligne "vAcpAsr.addCallAsr(vAcPrefix);", qu'il soit passé par le if ou non. S'il est passé par le if, pas de problème, il a assigné uen valeur à ta variable en faisant new AspAcr(); Mais s'il n'est pas passé par le if ?? Tu utilises une variable qui vaut n'importe quoi, puisqu'elle n'a pas été assignée.

Donc 2 solutions : soit tu mets cette ligne DANS le if, soit tu initialise ta variable avant d'entrer dans le if.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 6 juil. 2009 à 17:13
+3
Utile
Bah c'est que tu utilises un AcpAsr à un endroit où il attend un AsrCall.
Mais ce serait bien que tu recherches un peu par toi même, parce que là, ce sont vraiment des erreurs de base.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 8 juil. 2009 à 10:19
+3
Utile
Il y a certaines erreurs que le compilateur ne peut pas remarquer tant que d'autres erreurs subsistent.

Exemple :
if machin > true)
{

}

> true ne veut rien dire, évidemment (dumoins en C#), mais il ne t'en parlera pas, car il n'a pas compris l'ensemble de la structure de la ligne parce que tu n'as pas mis de parenthèse avant machin.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 6 juil. 2009 à 11:39
0
Utile
Si on la trouve en fait mais j'ai oublié de copier le code ^^

Que voici :

private ArrayList maListe = new ArrayList();

    public void addCallAsr (string pPrefix)
    {
        maListe.Add(pPrefix);
    }

    public AcPrefix(int pSerial, DateTime pDate, int pTimeC,
                    int pCause, string pType, string pCli,
                    string pDestination,int pCarrier, string pPrefix,
                    string pCreneau, string pCreneauC, string pCarrierC)
    {
        //
        // TODO : ajoutez ici la logique du constructeur
        //
    }

Et merci pour la première erreur
Commenter la réponse de Chaboow
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 6 juil. 2009 à 13:56
0
Utile
Malgré ce changement j'ai toujours la meme erreur je ne comprends pas :/
Commenter la réponse de Chaboow
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 6 juil. 2009 à 14:24
0
Utile
En effet je n'ai plus cette erreur en changeant de classe ma methode mais j'ai ceci :

"Erreur    17    Utilisation d'une variable locale non assignée 'vAcpAsr'    C:\Users\Vincent\Desktop\Boulot BTS\Stage\Maquette_Appli\Default.aspx.cs    170    13    C:\...\Maquette_Appli"

Alors qu'elle est déclarée avant mon if ...
Commenter la réponse de Chaboow
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 6 juil. 2009 à 15:01
0
Utile
Merci beaucoup mais me voila face a un nouveau problème a l'exécution ...

Impossible d'effectuer un cast d'un objet de type 'AcpAsr' en type 'AsrCall'.
Description : Une
exception non gérée s'est produite au moment de l'exécution de la
demande Web actuelle. Contrôlez la trace de la pile pour plus
d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.InvalidCastException: Impossible d'effectuer un cast d'un objet de type 'AcpAsr' en type 'AsrCall'.
Commenter la réponse de Chaboow
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 8 juil. 2009 à 09:23
0
Utile
Le fait est que dans ma méthode précédente, cette ligne me m'a pas renvoyé d'erreur, c'est pourquoi je me posais des questions
Commenter la réponse de Chaboow
Chaboow 7 Messages postés lundi 6 juillet 2009Date d'inscription 9 juillet 2009 Dernière intervention - 9 juil. 2009 à 09:40
0
Utile
Le truc c'est que j'ai besoin de cette ligne pour parcourir mon ArrayList, et que le type ne doit pas poser de problèmes vu que c'es celui qui est requis (comme dans l'autre méthode ou je l'utilise)

Donc j'avoue ne pas comprends le problème, car ma ligne de code est identique à celle de l'autre méthode ...
Commenter la réponse de Chaboow

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.