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 :

les tableaux et le pointeur !prob


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut les tableaux et le pointeur !prob
    Salut à tous je ss debutant en C .... j aime bcp de trouver la solution de mon prob chez vous ...
    bon , ...

    Nous avons vu que le mode de transmission par valeur semblait interdire à une fonction de modifier la valeur de ses arguments
    effectifs et nous avions mentionné que les pointeurs fourniraient une solution à ce problème.

    j ai essayé deja avec les variables , et aprés le deroulement ce code fonction trés trés bien §....


    mais j aime a faire ça avec les tableau et les enregistrements ...
    comment on peut faire ça .... !

    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
    /**************************************/
    void echange(int * i,int * l)
    {
    int x;
    x=*l;
    *l=*i;
    *i=x;
    }
    /**********************************/
     
    void tab(int *t[2]; int *k[2], struc *strr )
    {
    int n;
    n=0;
    *t[1]=n;
    n=1;
    *t[2]=n;
     
    *k[]=*t[]; //
    printf("%d %d",t[1],t[2]);
    }

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Euh, je suis désolé, mais sur le coup, je n'ai rien compris a ce que tu racontait

    Deux trois conseil pour améliorer la lisibilité de ton post :

    Lorsque tu post un code, il faut que tu utilise les balise code Elles se situe au dessus de la ou tu ecrit et la symbole est un diese en gras. La balise est comme ceci [ C O D E ] [ / C O D E ] sauf qu'il n'y a pas d'espace.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void echange(int *i, int *l)
    {
       int x = (*l);
       (*l) = (*i);
       (*i) = x;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*  /!\ Attention, pas de ; entre les different argument
    void tab(int *t[2], int *k[2], struc *strr )
    {
       int n = 0;
       *t[1]=n;
       n=1;
       *t[2]=n;
    
       *k[]=*t[]; //
       printf("%d %d",t[1],t[2]);
    }
    Bon, si j'ai bien comprit, tu souhaite changer des valeur de par des fonctions en passant des pointeur. Apparemment, tu as réussi avec des variable, mais tu voudrais savoir comment faire avec des tableaux ou des structure (parce que enregistrement, a part en pascal, ca me dit rien en C).

    Il faut que tu lise des didactitiel sur les tableau en C. Developpez propose cela.

    Si ton tableau est declarer statiquement ou dynamiquement, on ne le passe pas de la meme maniere.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* t est un tableau allouer statiquement
       alors que k est un pointeur sur un tableau allouer dynamiquement */ 
    void tab(int t[], int *k)
    {
     
    }
    Pourrait tu poster un code minimal avec le main afin de bien voir e qui ne va pas ?

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Si ton tableau est declarer statiquement ou dynamiquement, on ne le passe pas de la meme maniere.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* t est un tableau allouer statiquement
       alors que k est un pointeur sur un tableau allouer dynamiquement */ 
    void tab(int t[], int *k)
    {
     
    }
    Ah bon, pour faire simple essaies les écritures suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void tab(int t[], int k[])
    void tab(int *t, int *k)
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    ssmario >> Je me suis trompé ?

    Ca fait longtemps que je declare toujours *t car mes tableaux sont alloué dynamiquement ( ou je suis sur du C++ ).
    Je pensais vraiment qu'il y avait deux maniere, c'est faux ?

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Oui, dans ce contexte c'est pareil.
    Le nom du tableau est toujours converti en un pointeur vers son premier élément, sauf dans les cas suivants :
    • Devant l'opérateur sizeof
    • Devant l'opérateur &
    • Une chaîne littérale utilisée pour l'initialisation d'un tableau

    d'où cette équivalence d'écriture, comme avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int t[16];
    int *p = t;
     
    p[3] == t[3] == *(p+3) == *(t+3)
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le nom du tableau est toujours converti en un pointeur vers son premier élément, sauf dans les cas suivants :
    • Devant l'opérateur sizeof
    • Devant l'opérateur &
    • Une chaîne littérale utilisée pour l'initialisation d'un tableau
    C'est plutôt derriere ou avec les opérateurs ....
    La chaîne littérale n'ayant pas d'identificateur, la question ne se pose pas

    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par diogene
    La chaîne littérale n'ayant pas d'identificateur, la question ne se pose pas
    En effet
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  8. #8
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Il me semble en voir 2 ou 3 au fond qui font mollement "oui" de la tête, pas encore complètement convaincus ...

    Alors, deux fonctions, l'une traitant un 'int *tab', l'autre un 'int tab[]', et des appels en passant un tableau alloué à la compilation et un tableau alloué dynamiquement : c'est pareil !

    On peut même passer l'adresse d'un int (c'est de la triche car ça n'est rien d'autre qu'un tableau à 1 élément, alloué statiquement !)

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAB_NB      3
     
    void fois_5_stat (int tab[],int nb)
    {
        int i;
     
        printf("argument fonction fois_5_stat : %p\n",tab);
     
        for (i=0;i<nb;i++)
            tab[i] = 5 * tab[i];
    }
     
    void fois_7_dyn (int *tab,int nb)
    {
        int i;
     
        printf("argument fonction fois_7_dyn  : %p\n",tab);
     
        for (i=0;i<nb;i++)
            tab[i] = 7 * tab[i];
    }
     
    int main(void)
    {
        int  tab_stat[TAB_NB];
        int *tab_dyn = malloc(TAB_NB*sizeof(int));
        int  single_int;
        int  i;
     
        printf("quid des adresses ?\n");
     
        printf("tab_stat       : %p\n",tab_stat);
        printf("&(tab_stat[0]) : %p\n",&(tab_stat[0]));
        printf("tab_dyn        : %p\n",tab_dyn);
        printf("single_int     : %p\n",&single_int);
     
     
        printf("\ntab_stat (%p) mis en argument\n",tab_stat);
     
        /* remplissage manuel avec 1 */
        printf("au depart ... ");
        for (i=0;i<TAB_NB;i++) {
            tab_stat[i] = 1;
            printf("%d%c",tab_stat[i],(i==TAB_NB-1)?'\n':' ');
        }
     
        /* tableau statique dans fonction avec "tableau statique" */
        fois_5_stat(tab_stat,TAB_NB);
        /* ca donne quoi ? */
        printf("au retour ... ");
        for (i=0;i<TAB_NB;i++)
            printf("%d%c",tab_stat[i],(i==TAB_NB-1)?'\n':' ');
     
        /* tableau statique dans fonction avec "tableau dynamique" */
        fois_7_dyn(tab_stat,TAB_NB);
        /* ca donne quoi ? aie ??? */
        printf("au retour ... ");
        for (i=0;i<TAB_NB;i++)
            printf("%d%c",tab_stat[i],(i==TAB_NB-1)?'\n':' ');
     
        /* traitement analogue avec le tableau alloue dynamiquement */
     
        printf("\ntab_dyn (%p) mis en argument\n",tab_dyn);
     
        printf("au depart ... ");
        for (i=0;i<TAB_NB;i++) {
            tab_dyn[i] = 2;
            printf("%d%c",tab_dyn[i],(i==TAB_NB-1)?'\n':' ');
        }
     
        fois_5_stat(tab_dyn,TAB_NB);
        printf("au retour ... ");
        for (i=0;i<TAB_NB;i++)
            printf("%d%c",tab_dyn[i],(i==TAB_NB-1)?'\n':' ');
     
        fois_7_dyn(tab_dyn,TAB_NB);
        printf("au retour ... ");
        for (i=0;i<TAB_NB;i++)
            printf("%d%c",tab_dyn[i],(i==TAB_NB-1)?'\n':' ');
     
        /* traitement analogue sur l'entier */
     
        printf("\nadresse single_int (%p) mis en argument\n",&single_int);
     
        single_int = 3;
        printf("au depart ... %d\n",single_int);
     
        fois_5_stat(&single_int,1);
        printf("au retour ... %d\n",single_int);
     
        fois_7_dyn(&single_int,1);
        printf("au retour ... %d\n",single_int);
     
        return 0;
    }
    qui donne à l'exécution

    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
    quid des adresses ?
    tab_stat       : 0xbffff74c
    &(tab_stat[0]) : 0xbffff74c
    tab_dyn        : 0x100120
    single_int     : 0xbffff748
     
    tab_stat (0xbffff74c) mis en argument
    au depart ... 1 1 1
    argument fonction fois_5_stat : 0xbffff74c
    au retour ... 5 5 5
    argument fonction fois_7_dyn  : 0xbffff74c
    au retour ... 35 35 35
     
    tab_dyn (0x100120) mis en argument
    au depart ... 2 2 2
    argument fonction fois_5_stat : 0x100120
    au retour ... 10 10 10
    argument fonction fois_7_dyn  : 0x100120
    au retour ... 70 70 70
     
    adresse single_int (0xbffff748) mis en argument
    au depart ... 3
    argument fonction fois_5_stat : 0xbffff748
    au retour ... 15
    argument fonction fois_7_dyn  : 0xbffff748
    au retour ... 105
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAB_NB      3
     
    void fois_5_stat (int tab[],int nb)
    {
        int i;
     
        printf("argument fonction fois_5_stat : %p\n",tab);
     
        for (i=0;i<nb;i++)
            tab[i] = 5 * tab[i];
    }
    Même pour un exemple, je ne comprendrais jamais les gens qui mettent un type int pour la taille d'un tableau...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    ... et pesonne pour demander "pourquoi ?" Zut !!
    Comment placer maintenant ce fameux size_t ?

    Comme on est sur un forum C / Débuter, je m'y colle

    Size_t est LE type de prédilection pour dénombrer des tailles (en octets, d'éléments, ...). On le retrouve dans la série de fonctions (x)alloc, dans memcpy, etc... et ça doit être, de mémoire, mais on me corrigera si besoin, le type retourné par sizeof.

    Il eût donc été préférable que je misse un type size_t pour le nombre d'éléments des tableaux. Autant pour moi.

    ps : le dire directement aurait fait avancer les choses ... sinon ça reste du bruit
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Size_t est LE type de prédilection pour dénombrer des tailles (en octets, d'éléments, ...).
    En bytes, pas en octet.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Premières galères avec les tableaux et les pointeurs
    Par Gargok dans le forum Débuter
    Réponses: 23
    Dernier message: 29/12/2014, 19h29
  2. prob avec les tableaux
    Par marooh dans le forum Débuter
    Réponses: 8
    Dernier message: 19/10/2010, 11h41
  3. Les tableaux de pointeurs char*
    Par Basmor dans le forum Débuter
    Réponses: 4
    Dernier message: 28/08/2009, 01h19
  4. petit prob avec les tableaux
    Par imorum dans le forum Langage
    Réponses: 7
    Dernier message: 11/11/2008, 19h30
  5. Problème avec les tableaux de pointeurs
    Par TheDoci dans le forum C
    Réponses: 2
    Dernier message: 07/01/2007, 13h04

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