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 :

multiplication deux vecteurs de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut multiplication deux vecteurs de pointeurs
    Bonjour
    j'ai fait un programme qui permet la saisie de deux tableaux dans deux pointeurs, ensuite je calcule la somme de leurs produits
    donc mon programme marche si j'utilise des tableau pointeurs c'est à dire lieu de faire *p, je fait p[i]
    normalement *p et p[i] référencent la même chose mais je comprends pas les erreurs de mon programme

    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
    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
     
     
    void main()
    {
        int * p;
        int * q;
        int  pq;
        int n,i,res=0;
        printf("donner la taille des tableaux: "),scanf("%d",&n);
        p=(int*)malloc(n*sizeof(int));
        q=(int*)malloc(n*sizeof(int));
     
        for (i=0;i<n;i++)
        {
            printf("donner l'element p[%d]: \n",i);scanf("%d",p);
            p++;
     
            printf("donner l'element q[%d]: \n",i);scanf("%d",q);
           q++;
        }
     
        for (i=0;i<n;i++)
        {
     
     
     
        res = res + ((*p)* (*q));
            printf("%d \n",res);
     
        }
     
     
    }
    Ca retourne un résultat erroné

    merci pour votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    oops... j'ai mal lu ton code.

    Je rectifie.

    Tu as fait une chose très sale dans ton code.
    Tu donnes à p et q les adresses mémoire allouées.

    Dans ta boucle, tu modifies ces valeurs : il ne faut jamais faire ça, car tu perds la valeur d'origine et tu ne peux plus libérer la mémoire (chose obligatoire) avec free.

    Il faut absolument garder intacte la valeur des pointeurs. Sers-toi des écritures telles quepour écrire les valeurs dans les éléments du tableau. Même chose pour le scanf qui suit.

    Pour la seconde boucle, tu peux accéder aux valeurs viap[ i ] et q[ i ]

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
     
     
    void main()
    Salut

    Désolé, main est de type "int" !!!
    Citation Envoyé par africanwinners Voir le message
    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
    {
        int * p;
        int * q;
        int  pq;
        int n,i,res=0;
        printf("donner la taille des tableaux: "),scanf("%d",&n);
        p=(int*)malloc(n*sizeof(int));
        q=(int*)malloc(n*sizeof(int));
     
        for (i=0;i<n;i++)
        {
            printf("donner l'element p[%d]: \n",i);scanf("%d",p);
            p++;
     
            printf("donner l'element q[%d]: \n",i);scanf("%d",q);
           q++;
        }
    Comme l'a dit Jeroman, tu as alloué deux zones et tu as récupéré les adresses allouées (on va dire 1000 et 2000) dans p et q puis tu décales ces adresses. Donc 1000 passe à 1001, 1002, 1003 etc et pareil pour 2000 qui passe à 2001, 2002, 2003 etc. En fin de boucle, tu as perdu les valeurs 1000 et 2000 !!!
    Bon tu peux les retrouver grâce à n mais c'est pas ce qu'il y a de plus sain comme façon de faire

    Citation Envoyé par africanwinners Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for (i=0;i<n;i++)
        {
        res = res + ((*p)* (*q));
            printf("%d \n",res);
       }
    }
    Ben oui mais p et q sont maintenant en fin de tableau et ne bougent pas. Tu boucles n fois mais tu calcules et affiche la même valeur à chaque tour de boucle !!!

    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
    29
    30
    31
    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
    int main()
    {
        int *tab1;
        int *tab2;
        int *p;
        int *q;
        int n,i,res=0;
     
        printf("donner la taille des tableaux: "),scanf("%d",&n);
        tab1=(int*)malloc(n*sizeof(int));
        tab2=(int*)malloc(n*sizeof(int));
     
        for (i=0, p=tab1, q=tab2; i<n; i++, p++, q++)
        {
             printf("donner l'element p[%d]: \n",i);scanf("%d", p);
             printf("donner l'element q[%d]: \n",i);scanf("%d", q);
        }
     
        for (i=0, p=tab1, q=tab2; i<n; i++, p++, q++)
        {
             res = res + ((*p)* (*q));
             printf("%d \n",res);
        }
     
         free(tab1);
         free(tab2);
    }
    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]

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    Merci à vous deux j'ai compris mon erreur
    en fait je réserve l'adresse mémoire P et Q, je met dedans des valeurs , ensuite je décale de P++ alors je perds les ancienne valeurs

    J'ai confus l'allocation dynamique d'une seule variable par exemple int A à l'allocation dynamique d'un tableau-pointeur int * P qu'on peut remplir grace à &P[i] lors de la saisie et accéder à ces éléments avec P[i]


    merci pour votre aide

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

Discussions similaires

  1. multiplication de deux vecteur en SIMD
    Par bensof1 dans le forum Débuter
    Réponses: 2
    Dernier message: 04/03/2013, 14h15
  2. Réponses: 1
    Dernier message: 29/03/2007, 19h17
  3. Convolution cyclique entre deux vecteurs
    Par valencfaty dans le forum Mathématiques
    Réponses: 1
    Dernier message: 28/01/2007, 17h40
  4. [Débutant]Vecteur de pointeurs
    Par @r$£~%[ dans le forum C++
    Réponses: 18
    Dernier message: 09/08/2005, 16h19
  5. Comparer le contenu de deux vecteurs
    Par misou83 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 20/07/2005, 17h17

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