Probleme d'allocation d'une matrice

emomar Messages postés 4 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 4 octobre 2012 - 30 déc. 2010 à 14:10
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 30 déc. 2010 à 15:06
salut à tous voila j'ai un probleme avec la fonction remplir voila le code si quelqu'un peut m'aider merci
code :
#include <stdio.h>
#include <stdlib.h>

int n,m;

void dimen()
{
    printf("donner le nbre de ligne");
    scanf("%d",n);
    
    printf("donner le nbre de colonne");
    scanf("%d",m);
}

void Affich(int **A)
{
int i,j;
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            printf("%d\t",A[i][j]);
        printf("\n");
    }
}

void remplir(int **T)
{
int *z; 
int i,j;
   
    printf("donner le nbre de ligne");
    scanf("%d",&n);
    
    printf("donner le nbre de colonne");
    scanf("%d",&m);
    
    z=(int*)malloc(n*m*sizeof(int));   /*allocation d'espace pour les elements de la matrice*/
    
    T=(int**)malloc(n*sizeof(int*)); /*allocation d'espace pour le vecteur de pointeurs*/
    
    /*remplissage du vecteur pointeur*/
    for(i=0;i<n;i++)
    {
        T[i]=z+i*m;
    }
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        { 
            printf("donner la valeur\n");
            scanf("%d",&T[i][j]);
        }
    }
}

void Add(int **A,int **B)
{
int i,j;
  
    printf("n = %d\n",n);/*juste pour verifier le contenu de n et m*/
    printf("m = %d\n",m);

    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            A[i][j]=A[i][j]+B[i][j];
        }
    }
    
    Affich(A);
}

void main()
{
int **A,**B;

    remplir(A);
    Affich(A);/* ca plante la tant dis que si je mets affiche dans la fonction ca marche */
    remplir(B);
    Affich(B);
    Add(A,B);
}

7 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
30 déc. 2010 à 14:26
Salut,

C'est juste un soucis de portée des variables. Dans remplir() tu alloue de la mémoire à T... sauf que T c'est qu'une copie du pointeur A (qui pointe sur n'
importe quoi). Bref, tu n'alloue pas de mémoire pour A et forcément... ça plante lorsque tu veux l'afficher. Ce n'est donc pas une copie de A que tu veux passer mais un pointeur dessus.

Quelques autres erreurs :
- Dans ta fonction dimen(), et plus particulièrement dans tes scanf(), c'est l'adresse de tes variables globales qu'il faut passer.
- Si tes matrices sont de taille différentes, la fonction Add() plante lamentablement.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 déc. 2010 à 14:33
Ton allocation est étrange.
Si tu as une matrice, tu dois allouer la taille puis taille * largeur.

Ex tableau de 3 par 4:
int** tab = NULL;
int i = 0;
tab = malloc(3 * sizeof(int*));
for (i = 0; i < 3; ++i)
  tab[i] = malloc(4 * sizeof(int));


PS: Si tu fais du C, utilise un compilateur de C, pas de C++. (En C, il n'y aucune raison de caster un malloc...)
Évite aussi les variables globales.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
emomar Messages postés 4 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 4 octobre 2012
30 déc. 2010 à 14:33
tout d'abord merci pour m'avoir repondu aussi rapidement
je vais voir ca et pour la fonction add j'ai pas fini je sais qu'il faut verifier les dimensions encore merci
0
emomar Messages postés 4 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 4 octobre 2012
30 déc. 2010 à 14:36
oui je fais du c
j'ai pas bien compris ton example tu peux m'expliqué merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
30 déc. 2010 à 14:39
Yop,
J'ajouterais que l'allocation en elle-même est un peu louche...
Généralement, on alloue un tableau 2D de la manière suivante:
T=(int**)malloc(n*sizeof(int*));
for (int i=0; i<n; i++)
{
  T[i] = (int*)malloc(m*sizeof(int));
  for (int j=0; j<m; j++)
  {
    printf("donner la valeur de l'élément (%d,%d): ", i, j);
    scanf("%d",&T[i][j]);
  }
}



@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
30 déc. 2010 à 14:42
*tain!! Double-grilled, là...ma connexion est à la masse...sorry

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 déc. 2010 à 15:06
@buno: :D. En tous cas on donne vraiment les mêmes types de réponses ! :)

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous