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

C# Discussion :

problème pointeur avec C#


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut problème pointeur avec C#
    Bonjour à tous j'implémente cette fonction de copiage avec le code ci joint:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
     static unsafe void Copy(char* src, int srcIndex, char* dst, int dstIndex, int count)
            {
                if (src == null || srcIndex < 0 ||
                    dst == null || dstIndex < 0 || count < 0)
                {
                    throw new System.ArgumentException();
                }
     
                //byte[] src1 = System.Text.Encoding.Default.GetBytes(src);
                //byte[] dst1 = System.Text.Encoding.Default.GetBytes(dst);
     
                int srcLen = src.Length;
                int dstLen = dst.Length;
                if (srcLen - srcIndex < count || dstLen - dstIndex < count)
                {
                    throw new System.ArgumentException();
                }
     
                // The following fixed statement pins the location of the src and dst objects
                // in memory so that they will not be moved by garbage collection.
                fixed (byte* pSrc = src, pDst = dst)
                {
                    byte* ps = pSrc;
                    byte* pd = pDst;
     
                    // Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time:
                    for (int i = 0; i < count / 4; i++)
                    {
                        *((int*)pd) = *((int*)ps);
                        pd += 4;
                        ps += 4;
                    }
     
                    // Complete the copy by moving any bytes that weren't moved in blocks of 4:
                    for (int i = 0; i < count % 4; i++)
                    {
                        *pd = *ps;
                        pd++;
                        ps++;
                    }
                }
            }
    et lorsque je compile je recois l'erreur suivante:

    Operator '.' cannot be applied to operand sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     int srcLen = src.Length;
    d'ou vient le problème?
    Merci par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    1) On joue pas avec les pointeurs normalement
    2) un pointeur n'a pas de taille (ben tu peux faire un sizeof() mais ca va pas te donner le résultat que tu penses )
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  3. #3
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Je pense qu'il faut que tu utilises src->Length ou (*src).Length vu que tu manipules un pointeur.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut
    Merci pour vos réponse:
    1) pourquoi le sizeof() ne me donne pas le résultat que je pense?
    2) j'ai essayé le (*src).length mais ça ne marche pas aussi

    on peut pas essayer de convertir le char * src en byte [] src ? si oui comment on procède?
    Merci par avance.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    1) On joue pas avec les pointeurs normalement
    Bien sur que si, en C++ c'est même tres utiles pour certaine fonction de chaine

    Citation Envoyé par BenoitM Voir le message
    2) un pointeur n'a pas de taille (ben tu peux faire un sizeof() mais ca va pas te donner le résultat que tu penses )
    Et heureusement q'un pointeur à une taille!!

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par gcorbineau Voir le message
    Bien sur que si, en C++ c'est même tres utiles pour certaine fonction de chaine



    Et heureusement q'un pointeur à une taille!!
    on est en c# pas en c++

    un pointeur a une taille mais ca taille c'est l'espace qu'il occupe pour stocker l'adresse mémoire vers l'endroit où il pointe.
    Je pense qu'il préférait avoir la taille de sont tableau plutot que la taille du pointeur...
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut
    exactement je veux la taille du tableau plutot que la taille du pointeur, je suis bloqué et j'ai pas trouvé une solution pour ça :/

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut
    je tourne la question autrement:
    comment convertir un char* en un char[] ?
    Merci.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    soit tu es sur que src est un un string soit faut mettre la taille en parametre
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Pour ma part, quand une question sur les pointeurs arrive dans un contexte C#, la première question qui me vient à l'esprit est :

    "où est censé être utilisée la fonction postée au début et pourquoi ?"

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  11. #11
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour khalil.ajmi....
    Comme dit par les intervenants un pointeur en C# (ou meme en C++) est une simple adresse (dans le cas d'un tableau il pointe vers le 1er element array[0])...
    comme l'illustre cette instruction du code transmis :
    Le controle de taille des tableaux n'est pas toujours exigible et c'est pour cela qu'on le qualifie de code "unsafe" ou non verifiable à la compilation....
    Neamoins ce code issu de la SDK tu l'as modifie et par consequent tu dois supprimer le controle de taille des tableaux...
    Code SDK MSDN:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    class TestCopy
    {
        // The unsafe keyword allows pointers to be used within the following method:
        static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
        {
            if (src == null || srcIndex < 0 ||
                dst == null || dstIndex < 0 || count < 0)
            {
                throw new System.ArgumentException();
            }
     
            int srcLen = src.Length;
            int dstLen = dst.Length;
            if (srcLen - srcIndex < count || dstLen - dstIndex < count)
            {
                throw new System.ArgumentException();
            }
     
            // The following fixed statement pins the location of the src and dst objects
            // in memory so that they will not be moved by garbage collection.
            fixed (byte* pSrc = src, pDst = dst)
            {
                byte* ps = pSrc;
                byte* pd = pDst;
     
                // Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time:
                for (int i = 0 ; i < count / 4 ; i++)
                {
                    *((int*)pd) = *((int*)ps);
                    pd += 4;
                    ps += 4;
                }
     
                // Complete the copy by moving any bytes that weren't moved in blocks of 4:
                for (int i = 0; i < count % 4 ; i++)
                {
                    *pd = *ps;
                    pd++;
                    ps++;
                }
            }
        }
     
        static void Main()
        {
            byte[] a = new byte[100];
            byte[] b = new byte[100];
     
            for (int i = 0; i < 100; ++i)
            {
                a[i] = (byte)i;
            }
     
            Copy(a, 0, b, 0, 100);
            System.Console.WriteLine("The first 10 elements are:");
     
            for (int i = 0; i < 10; ++i) 
            {
                System.Console.Write(b[i] + " ");
            }
            System.Console.WriteLine("\n");
        }
    }
    Il n'existe pas de solution miracle 2012 à ce vieux probleme ....de gestion des pointeurs:
    -soit tu transmets les 2 tableaux
    -soit un pointeur sur chaque tableau + un parametre size
    bon code....................................

  12. #12
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Je me demande pourquoi tu souhaites (re)créer une fonction de copie de tableau et de plus en code unsafe?

    Il est évident que ton code est issu du didacticiel de la MSDN, mais tu as remplacé les paramètres byte[] en char*.

    Je te conseille de garder la fonction d'origine. Sinon que souhaites-tu faire?
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2008, 00h55
  2. Problème de pointeurs avec un tableau
    Par Tom_Tom_RoF dans le forum Fortran
    Réponses: 8
    Dernier message: 05/10/2007, 17h34
  3. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  4. Problèmes de pointeurs avec les arbres
    Par thierry57 dans le forum C
    Réponses: 17
    Dernier message: 22/12/2005, 23h35
  5. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57

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