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 :

Variable pointant sur une partie du tableau


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut Variable pointant sur une partie du tableau
    Bonjour,

    je suis novice en c et j'aimerai bien savoir s'il est possible de déclarer un tableau qui pointe sur une colonne de tableau

    par exemple p1 pointe sur la premiere colonne du tableau,p2 pointe sur la deuxieme colonne du tableau et ainsi de suite

    voici mon code

    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
    #include<stdlib.h>
    #include<stdio.h>
    void func(float *Tableau)
    {
      float *p1,*p2;
     
      for (int i=0;i<5;i++){
      	p1[i]=Tableau[i*2+0];
      	p2[i]=Tableau[i*2+1];
      }
     
       for(int i=0;i<5;i++){
    	p1[i]=3;
    	p2[i]=4;
       }
    }
    int main(int argc, char *argv[])
    {
    float *Tab;
    Tab=(float *)malloc(2*5*sizeof(float));
    printf("ok\n");
    func(Tab);
    printf("\n");
            for(int i=0;i<5;i++){
    for(int j=0;j<2;j++){	
    printf("%f\t",Tab[i*2+j]);
    }
    printf("\n");
       	}
    return 0;
    }

    merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 649
    Points : 10 620
    Points
    10 620
    Par défaut
    2 choses:
    1. La notion de colonne n'existe pas vraiment en C. Ce sera toujours un tableau linéaire
    2. Tu résous ton problème avec l'arithmétique des pointeurs: si X est le type contenu dans ton tableau: la case[r, c], colonne c (de 0 à C-1) et ligne r (de 0 à R-1) est X case = (tab + (c + r * C)); avec C le nombre de colonnes et R le nombre de lignes.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    J'ai pas du tout compris… Désolé !

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Alors, une première précision importante, un pointeur n'est pas un tableau. Ce sont des pointeurs que tu utilises dans ton code (les pointeurs peuvent pointer sur le début d'un tableau, et leur syntaxe recoupe celle des tableaux, en particulier l'opérateur []).

    D'autre part, non, un pointeur ne peut pas pointer sur une colonne d'un tableau; mais il peut pointer sur le début d'une colonne, et tu peux ensuite le déplacer du nombre de colonnes du tableau pour accéder au prochain élément de la colonne.

    Dans ton code, tu essaies de recopier une valeur contenue dans tableau dans une région de mémoire non allouée (tu devrais avoir une erreur de ce fait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void func(float *Tableau)
    {
      float *p1,*p2;
     
      for (int i=0;i<5;i++){
      	p1[i]=Tableau[i*2+0]; // erreur: l'élément de tableau est affecté dans une zone de mémoire non allouée!
      	p2[i]=Tableau[i*2+1];
      }
       for(int i=0;i<5;i++){
    	p1[i]=3;  // aucun effet sur tableau
    	p2[i]=4;
       }
    }
    Il me semble que le plus simple pour arriver au même résultat serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int i = 0; i < 10; ++i) {
      if (i % 2 == 0) Tab[i] = 3; else Tab[i] = 4;
    }
    Si tu voulais absolument passer par un pointeur pour exprimer la notion de colonnes, il faudrait plutôt à la rigueur utiliser un pointeur sur des pointeurs, mais cela paraît inutilement compliqué.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    j'ai testé ceci

    visiblement ça marche

    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
    #include<stdlib.h>
    #include<stdio.h>
    void func(float *Tableau)
    {
     
      float	*p1,*p2;
     
      p1=&Tableau[0];
      p2=&Tableau[5];
     
      for(int i=0;i<5;i++){
    	p1[i]=1;
    	p2[i]=10;
     
      }
     
    }
    int main(int argc, char *argv[])
    {
    float *Tab;
    Tab=(float *)malloc(2*5*sizeof(float));
    printf("ok\n");
    func(Tab);
    printf("\n");
    for(int i=0;i<2*5;i++){
    	printf("%d--%f\n",i,Tab[i]);
    }
     
    return 0;
    }
    mais j'aimerais bien savoir pourquoi?
    merci d'avance

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    En effet, cette fois-ci tu prends l'adresse du tableau (en fait l'adresse à laquelle pointe le pointeur), donc c'est bon.
    Néanmoins, je dirais plutôt que p1 et p2 pointent chacun sur une ligne, pas sur une colonne

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 040
    Points
    31 040
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par huître Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    float *Tab;
    Tab=(float *)malloc(2*5*sizeof(float));
    printf("ok\n");
    func(Tab);
    printf("\n");
    for(int i=0;i<2*5;i++){
    	printf("%d--%f\n",i,Tab[i]);
    }
    Bonjour
    Quand on fait un malloc, il est impératif de tester sa réussite (ou plutôt son échec possible) avec une gestion réfléchie des actions à faire dans ce cas (réfléchie donc plus évoluée qu'un bête "exit").
    Et en fin de traitement il faut libérer la zone allouée (free). Beaucoup de travail alors qu'il est si simple ici de définir un simple et vrai tableau qui aura exactement le même comportement...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float Tab[2*5];
    printf("ok\n");
    func(Tab);
    printf("\n");
    for(int i=0;i<2*5;i++){
    	printf("%d--%f\n",i,Tab[i]);
    }

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

Discussions similaires

  1. Méthode shuffle sur une partie du tableau seulement
    Par abysr dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 06/03/2015, 15h31
  2. Calcul sur une partie d'un tableau défini sous VBA
    Par VBA_LOVER dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2009, 12h27
  3. [MySQL] WHERE sur une partie de variable
    Par nicoxweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/10/2007, 23h37
  4. Scrollbar sur une partie d'un tableau
    Par Dams59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/04/2007, 09h40
  5. JScrollPane : scroll que sur une partie du tableau
    Par mickael.guilbert dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 21/08/2006, 08h53

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