IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Probleme Cast ou compilateur


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 15
    Points
    15
    Par défaut [C#] Probleme Cast ou compilateur
    Bonjour j'ai un petit probleme :

    j'utilise visual sudio 2003 pour info

    j'obtient une erreur sur la ligne apres le if pourtant cela me semble correct pouvez vous m'aider merci d'avance
    ERREUR : La partie gauche d'une assignation doit être une variable, une propriété ou un indexeur (CS0131)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    struct INI_ITEM
    {
    	public string Key_name;
    	public string Key_value;
    }
     
    Hashtable myHT = new Hashtable();
     
    public void ModifyValue(string Section, string Key, string Value, string OldValue)
    {
    for (int index =0;index<TotalKeysinSection(Section);index++)
    {
    if (((INI_ITEM)(((ArrayList) myHT[Section])[index])).Key_name == Key)
    ((INI_ITEM)(((ArrayList) myHT[Section])[index])).Key_value = Value;
    }
    }
    merci d'avance

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Ilisible ton truc.

    Si j'ai bien compris, essaye ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            public void ModifyValue(string Section, string Key, string Value, string OldValue) {
                if ( myHT.ContainsKey(Section)) {
                    INI_ITEM it;
                    ArrayList lst = (ArrayList)(myHT[Section]);
                    for (int i=0; i<lst.Count-1; i++) {
                        it = (INI_ITEM)(lst[i]);
                        if (it.Key_name == Key)
                            it.Key_value = Value;
                    }
                }
            }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Désole pour mon code pas tres clair

    Merci d'avoir repondu aussi vite

    dans ton code j'ai pas l'impression qu'il va modifié l'item.key_value d'origine ??

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Hello,

    dans ton code j'ai pas l'impression qu'il va modifié l'item.key_value d'origine ??
    Effectivement, la valeur retournée est passée par valeur étant donné que INI_ITEM est une structure. Il te faut donc réassigner l'élément de ta collection s'il y a eu une modification.

    a+

    ---
    OLD MESSAGE, avant de voir que INI_ITEM était une struct, donc faux

    dans ton code j'ai pas l'impression qu'il va modifié l'item.key_value d'origine ??
    Tu dis ça parce qu'il fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    it = (INI_ITEM)(lst[i]);
    // puis
    it.Key_value = Value;
    ?

    Les objets sont traîtés par référence, ce code ne va donc pas copier lst[i] et obtenir une nouvelle instance, mais simplement transmettre la référence de l'objet. L'affection agit donc bien sur le bon objet.

    a+

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par abelman
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<lst.Count-1; i++)
    Petit bug de compteur. Le -1 c'est pour les For de VB.NET :)

    Autre version pour faire pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void ModifyValue( string section, string key, string value, string oldValue )
    {
      ArrayList collection = myHT[ section ] as ArrayList;
      if ( collection == null )
        return;
     
      foreach ( INI_ITEM item in collection )
      {
        if ( item.Key_name == key )
          item.Key_value = Value;
      }
    }
    (en partant du principe qu'il y a le bon nombre d'éléments dans chaque ArrayList, donc aucun besoin de TotalKeysInSection)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Maniak
    Citation Envoyé par abelman
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<lst.Count-1; i++)
    Petit bug de compteur. Le -1 c'est pour les For de VB.NET
    Pkoi : En C#, les tableaux commencent à 0 donc, il vont jusqu'a -1....

    La bonne syntaxe seraint plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<=lst.Count-1; i++)
    Autre version pour faire pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void ModifyValue( string section, string key, string value, string oldValue )
    {
      ArrayList collection = myHT[ section ] as ArrayList;
      if ( collection == null )
        return;
     
      foreach ( INI_ITEM item in collection )
      {
        if ( item.Key_name == key )
          item.Key_value = Value;
      }
    }
    (en partant du principe qu'il y a le bon nombre d'éléments dans chaque ArrayList, donc aucun besoin de TotalKeysInSection)



    une boucle foreach, c'est plus lent qu'une boucle for

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<=lst.Count-1; i++)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<lst.Count; i++)
    sont tout à fait équivalents Le second est simplement plus court à écrire et plus lisible d'après moi, mais ça, c'est subjectif. Il ne faut par contre pas mélanger les deux et aboutir à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<=lst.Count; i++)
    qui déclenchera une exception, ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<lst.Count-1; i++)
    qui loupera le dernier élément

    une boucle foreach, c'est plus lent qu'une boucle for Laughing
    C'est vrai ça ?

    a++[/code]

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Morpheus
    Citation Envoyé par Maniak
    Citation Envoyé par abelman
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<lst.Count-1; i++)
    Petit bug de compteur. Le -1 c'est pour les For de VB.NET :)
    Pkoi :?: En C#, les tableaux commencent à 0 donc, il vont jusqu'a -1....
    Ouaip, d'où le <, et non <=.

    En VB.NET tu dois faire un For i = 0 To Count - 1 parce que c'est un <=. En C#, tu choisis la comparaison :)

    Citation Envoyé par Morpheus
    La bonne syntaxe seraint plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<=lst.Count-1; i++)
    Voilà. Ça, ça reproduit le For du VB.NET. Sauf que c'est inutilement plus lourd (normal, c'est du VB :)

    Tu vires le = et tu vires le -1. C'est pas beau ? :)
    (et tu mets ++i aussi :)

    Citation Envoyé par Morpheus
    une boucle foreach, c'est plus lent qu'une boucle for :lol:
    Ce qui me faisait m'en tenir à l'écart, jusqu'à ça qui indique que le foreach du framework 1.1 a été bien amélioré et n'est donc plus à éviter.

    Et après tests, en effet, ça fonctionne carrément mieux :)
    La différence de perfs est minime. Avec 100000 itérations sur un tableau de 100 chaînes, foreach est au moins aussi rapide que for, voire plus (mais ça se joue de l'ordre de la milliseconde).

    100000 itérations sur un ArrayList de 100 StringBuilder (il y a deux implémentations différentes de foreach selon qu'il s'agit de types valeur ou référence), foreach est un poil plus lent. De l'ordre de 10%. À savoir insignifiant dans 99% des cas.

    Alors vu que ça évite de devoir faire un compteur (avec les erreurs potentielles, genre dans ce topic :) ainsi que de devoir faire le cast soi-même, bref que c'est quand même plus clean niveau code, sans la grosse pénalité en perfs qu'il y avait avant, y a tout de suite moins de raisons de s'en priver :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Les objets sont traîtés par référence, ce code ne va donc pas copier lst[i] et obtenir une nouvelle instance, mais simplement transmettre la référence de l'objet. L'affection agit donc bien sur le bon objet.
    merci beaucoup je savais pas que ca marché par référence

    mon code de depart est bon pourtant, donc pourquoi il bloc dessus ?
    le ligne de comparaison marche tres bien alors pourquoi pas celle d'affectation ??


    merci de votre aide a tous

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    La comparaison et l'affectation sont deux opérations différentes Ici tu obtiens une erreur parce que INI_ITEM est une structure et non une classe. Cela te donne un type par valeur et non par référence : tu ne peux pas le mettre à gauche d'une affectation sans passer par une variable.

    Essaie de remplacer struct par class, et tu verras, ça passera tout de suite mieux !

    D'ailleurs je me rends compte que tu as utilisé une structure seulement à l'instant. Ce qui remet en question ce que je t'ai dit en dessus sur le passage par référence, je suis navré. Je vais éditer ça.

    a+

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par Maniak
    (et tu mets ++i aussi
    J'ai pris l'habitude de faire ça avec les itérateurs en C++, mais est-ce que cela change vraiment quelque chose concrètement ? Le compilateur optimise sûrement ça, surtout dans un cas simple comme une boucle for, no ?

    As-tu par hasard fait un petit test de perfs ?

    Merci !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par smikar
    D'ailleurs je me rends compte que tu as utilisé une structure seulement à l'instant. Ce qui remet en question ce que je t'ai dit en dessus sur le passage par référence, je suis navré. Je vais éditer ça.
    Ah oui tiens, très juste :)

    Toutes les réponses jusque-là sont fausses en somme, que ce soit via for+cast ou foreach. Ça renvoit de toute façon une copie de chaque élément, donc pas modifiable.

    Avec une classe au lieu d'une structure c'est bon, en passant par un tableau au lieu d'un ArrayList c'est bon aussi (avec for uniquement). Mais structure + collection, ça coince :)

    Citation Envoyé par smikar
    Citation Envoyé par Maniak
    (et tu mets ++i aussi :)
    J'ai pris l'habitude de faire ça avec les itérateurs en C++, mais est-ce que cela change vraiment quelque chose concrètement ?
    En C# dans ce cas-là ? Non, rien du tout :)

    Citation Envoyé par smikar
    Le compilateur optimise sûrement ça, surtout dans un cas simple comme une boucle for, no ?
    Yup, ça génère exactement le même code.

    Citation Envoyé par smikar
    As-tu par hasard fait un petit test de perfs :) ?
    Inutile vu qu'à la compilation c'est pareil :)

    C'est juste à la fois une maniakerie, un rappel des différences entre les deux formes de cet opérateur pour quand on fait une affectation en même temps et une habitude de C++ à ne pas perdre (vu que là il peut y avoir différentes implémentations pour les deux formes :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Cool, j'ai changé ma struc en class
    j'ai modifié mes INI_ITEM item en INI_ITEM item = new INI_ITEM()

    et hop ca marche super bien

    vous etes des pro merci beaucoup a tous...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme cast vers type reel.
    Par Costent dans le forum C++
    Réponses: 9
    Dernier message: 12/04/2012, 15h34
  2. Problème de configuration compilateur Kdevelop
    Par jejerome dans le forum Linux
    Réponses: 3
    Dernier message: 18/04/2008, 16h09
  3. [C#] Probleme Cast et Interface
    Par valcriss dans le forum C#
    Réponses: 1
    Dernier message: 14/02/2007, 10h47
  4. [debutant]probleme cast et compilation
    Par Battosaiii dans le forum C
    Réponses: 7
    Dernier message: 31/10/2005, 20h00
  5. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo