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 :

Passer l'adresse d'un tableau statique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut Passer l'adresse d'un tableau statique
    Bonjour,
    j'ai une petite question d'optimisation.
    une de mes fonctions lis des message stockées dans un tableau statique (preferable dans mon cas pour eviter les allocations).
    je passe toujours en parametre a plusieurs fonctions l'adresse comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char msg [512];
    sql_conn->notify = sql_notify_read(sql_conn, &msg[0]);
    Dans le cas ou je veux lire &msg[4] est ce que msg + 4 est plus clean ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Bonjour,

    que tu utilises msg ou &msg ou &msg[0], l'adresse sera la même.
    que tu utilises msg + 4 ou &msg[4] aussi.

    Tant que tu reste dans un tableau à une dimension tu n'a aucun soucis de ce coté, c'est juste comme tu préfères le lire.
    j'ai un faible pour msg + 4

    cdt

  3. #3
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par sloshy Voir le message
    Bonjour,

    que tu utilises msg ou &msg ou &msg[0], l'adresse sera la même.
    que tu utilises msg + 4 ou &msg[4] aussi.

    Tant que tu reste dans un tableau à une dimension tu n'a aucun soucis de ce coté, c'est juste comme tu préfères le lire.
    j'ai un faible pour msg + 4
    cdt
    Je suis à peu près d'accord. Une nuance quand même. On va dire qu'on a soit msg + 4, qui s'accompagne de msg + 0, et disqualifie msg. Ou &msg[4] qui s'accompagne de &msg[0] et disqualifie &msg. Question de cohérence sémantique et de maintenabilité. C'est juste mon avis.

    Pour le reste, l'équivalence est d'autant plus flagrante que msg + 4 ou &msg[4] seront traités de la même façon. Dans le code produit, ce seront la même valeur constante, produite à la compilation. En fait un adressage immédiat.

    Sinon, je ne pige pas trop le problème de Fooshi. Pourquoi pas simplement un tableau de chaînes ?

    Comme je ne fais plus de C depuis un moment, j'ai voulu m'y remettre un peu. J'ai fait quelques essais sans intérêt majeur. C'est surtout utile pour suivre dans un débugger, ou sortir le code assembleur:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    //const char const mots1[] = "zero\0un\0deux\0trois\0quatre\0";
    //const char const * mots2[] = {"zero", "un", "deux", "trois", "quatre"};
     
    static void affiche(const char* s){
    	puts(s);
    }
     
    #define AFFICHE(s) puts((s))
     
     
    int main(void) {
    	static const char const lettres[] = "zero\0un\0deux\0trois\0quatre\0";
    	static const char const * mots[] = {"zero", "un", "deux", "trois", "quatre"};
     
    	affiche(lettres + 0);
    	affiche(lettres + 13);
    	affiche(&lettres[0]);
    	affiche(&lettres[13]);
     
    	affiche(mots[0]);
    	affiche(mots[2]);
    	affiche(*(mots + 0));
    	affiche(*(mots + 2));
     
    	AFFICHE(lettres + 0);
    	AFFICHE(lettres + 13);
    	AFFICHE(&lettres[0]);
    	AFFICHE(&lettres[13]);
     
    	AFFICHE(mots[0]);
    	AFFICHE(mots[2]);
    	AFFICHE(*(mots + 0));
    	AFFICHE(*(mots + 2));
     
    	return EXIT_SUCCESS;
    }

  4. #4
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    Dans mon cas le message est un tableau de chaine de caracteres classiques et non un tableau de chaines, tableau a une dimension donc.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fooshi Voir le message
    Bonjour,
    j'ai une petite question d'optimisation.
    une de mes fonctions lis des message stockées dans un tableau statique (preferable dans mon cas pour eviter les allocations).
    Salut

    Fais gaffe aux tableaux statiques, ça peut produire des effets de bord difficilement détectable
    Exemple
    Code C : 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
     
    #include <stdio.h>
    #include <string.h>
     
    char *fct(char l)
    {
            static char tab[512];
            int len;
     
            len=strlen(tab);
            tab[len]=l;
            tab[len+1]=0;
            return tab;
    }
     
    int main()
    {
            int i;
            for (i=0; i < 5; i++)
            {
                    printf("%s\n", fct(i + 'a'));
            }
    }

    Exécution
    moi@debian:~$ ./essai
    a
    ab
    abc
    abcd
    abcde
    Là ça fonctionne super

    Petite modif
    Code C : 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
     
    #include <stdio.h>
    #include <string.h>
     
    char *fct(char l)
    {
            static char tab[512];
            int len;
     
            len=strlen(tab);
            tab[len]=l;
            tab[len+1]=0;
            return tab;
    }
     
    int main()
    {
            int i;
            int j;
            for (i=0; i < 5; i++)
            {
                    printf("%s\n", fct(i + 'a'));
                    for (j=0; j < 5; j++)
                    {
                            printf("%s\n", fct(j + 'A'));
                    }
            }
    }

    Exécution
    moi@debian:~$ ./essai
    a
    aA
    aAB
    aABC
    aABCD
    aABCDE
    aABCDEb
    aABCDEbA
    aABCDEbAB
    aABCDEbABC
    aABCDEbABCD
    aABCDEbABCDE
    aABCDEbABCDEc
    aABCDEbABCDEcA
    aABCDEbABCDEcAB
    aABCDEbABCDEcABC
    aABCDEbABCDEcABCD
    aABCDEbABCDEcABCDE
    aABCDEbABCDEcABCDEd
    aABCDEbABCDEcABCDEdA
    aABCDEbABCDEcABCDEdAB
    aABCDEbABCDEcABCDEdABC
    aABCDEbABCDEcABCDEdABCD
    aABCDEbABCDEcABCDEdABCDE
    aABCDEbABCDEcABCDEdABCDEe
    aABCDEbABCDEcABCDEdABCDEeA
    aABCDEbABCDEcABCDEdABCDEeAB
    aABCDEbABCDEcABCDEdABCDEeABC
    aABCDEbABCDEcABCDEdABCDEeABCD
    aABCDEbABCDEcABCDEdABCDEeABCDE
    moi@debian:~$
    Comme il n'y a qu'une seule zone statique, les fonctions des deux boucles imbriquées tapent dans la même (alors qu'on s'attendait très certainement à une certaine indépendance des appels)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    Bien sur mais dans le deuxieme exemple, tu utilise deux index ce qui est risqué, j'utilise toujours un seul index qui va parcourir la chaine du debut a la fin.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fooshi Voir le message
    Bien sur mais dans le deuxieme exemple, tu utilise deux index ce qui est risqué
    Hé oui. C'est le problème inhérent aux statiques. J'avais eu le même problème avec strstr que j'appelais dans 2 boucles imbriquées sur des chaines différentes. Comme cette fonction garde dans une statique une trace du dernier appel, la seconde boucle polluait la première (comme ici).

    Citation Envoyé par Fooshi Voir le message
    , j'utilise toujours un seul index qui va parcourir la chaine du debut a la fin.
    Pas de soucis. Garde juste cet exemple à l'esprit pour te souvenir du danger (si jamais ton code évolue par exemple...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui, moi aussi j'utilisais un tableau statique pour ce genre ce chose. Maintenant je préfère ce type d'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int Carte(char* Ligne, FILE *lec,  int nbcar);
     
    int main()
    {
    // initialisation de ligne, soit malloc, soit static
      int NbCar=80; // anciennes cartes perforées
      char Ligne[81];
      FILE *lec=fopen(...);
      int nbLu=Carte(Ligne, lec, NbCar);
    }
    La raison principale est que je peux lire des lignes pas très longues, mais je veux pouvoir lire aussi des lignes très-très longues, tout avec la même fonction. Et naturellement, j'ai eu aussi des effets de bord , alors dans ces cas là on n'hésite pas.

  9. #9
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exemple
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static char tab[512];
    int len;
     
    len=strlen(tab);

    Ne manquerait-il pas une initialisation de tab avant l'utilisation de strlen ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    @uknow,
    En l'absence de déclaration explicite, une variable static est initialisée à o ou NULL.

  11. #11
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    C'est le cas et donc len vaudra zero

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <string.h>
    #include <stdio.h>
     
    int             main(void)
    {
      static char   tab[512];
      int           len;
     
      len = strlen(tab);
      printf("len = '%d'\n", len);
      return (0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sloshy@clonix-laptop:/tmp/src$ gcc -W -Wall -ansi -pedantic main.c -o test
    sloshy@clonix-laptop:/tmp/src$ ./test 
    len = '0'
    sloshy@clonix-laptop:/tmp/src$

  12. #12
    Invité
    Invité(e)
    Par défaut
    @sloosky,
    Où voulez-vous en venir avec votre code.
    Le tableau static est dans une fonction.
    A la création, sauf initialisation, il vaut NULL, donc len = 0 (naturellement)
    Puis cette fonction est appelée et modifie le tableau (voir #5).
    La question est tableaux static ou pas?

Discussions similaires

  1. Adresse et taille d'un tableau statique
    Par Aspic dans le forum C
    Réponses: 16
    Dernier message: 31/03/2014, 20h58
  2. Réponses: 7
    Dernier message: 04/05/2007, 12h20
  3. Réponses: 1
    Dernier message: 03/05/2007, 07h49
  4. Réponses: 1
    Dernier message: 02/05/2007, 15h08
  5. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02

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