begin process at 2012 05 30 15:18:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

répétition d'allocation, désallocation de mémoire sur des matrices


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

répétition d'allocation, désallocation de mémoire sur des matrices

mardi 8 novembre 2005 à 16:13:30 | répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

Bonjour a tous !
pour mes cours j'ai besoin de faire un petit programme de résolution de systèmes linéaires. Le problème n'est pas dans l'lgorithme de calcul comme vous pouvez le lire dans le titre mais plus dans la gestiond e la mémoire. En effet, le programme lit des matrices dans un fichier texte et ajuste la taille de la matrice en fonction des besoins (le rang de la matrice est indiqué dans le fichier). Une fois fini on lance le calcul et on affiche le résultat. L'utilisateur peut alors décider de lire une nouvelle matrice dans le fichier (elle peut être plus grande ou plus petite). Et c'est justement à partir de la que ça ce complique.
Mon programme ressemble à ça (ce n'est qu'une structure ne faites pas attention a la syntaxe car c'est tout sauf du c ^^) :

 lire taille matrice <---,
allouer_matrice          |
lire données               |
calcul                        |
afficher données        |
désallouer matrice     |
recommencer ?     ---'

void allouer_matrice(int nb_lignes, int nb_colonnes, matrice mat_p)
{
    mat_p=realloc(mat_p,(nb_lignes+1)*sizeof(vecteur));
    if (mat_p == NULL)
    {
      printf("\n /!\\ Manque d'espace memoire mat col\n");
      getch();
      exit(1);
    }
    for(i=1;i<=nb_lignes;i++)
    {
      mat_p[i]=realloc(mat_p[i],nb_colonnes*sizeof(double));
      if (mat_p)[i] == NULL)
      {
        printf("\n /!\\ Manque d'espace memoire mat lignes %d\n",i);
        getch();
        exit(1);
      }
    }
}

void free_mat(int nb_lignes, matrice mat_p)
{
    for(i=1;i<=nb_lignes;i++)
    {
      free(mat_p[i]);
      mat_p[i]=NULL;
    }
    free(mat_p);
}
mardi 8 novembre 2005 à 16:37:17 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

DeAtHCrAsH

Ou est le problème ?
Tu as des plantages ? Des erreurs de compilations ?

Donne plus d'info...

Shell
mardi 8 novembre 2005 à 16:42:54 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

autant pour moi ! ca compile pas mais j'arrive pas à allouer plusieurs fois de suite la même matrice et le programme fini par planter. du style : "l'instruction à "0x7c94426d" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être "read". " ou bien j'arrive a exécuter sur plusieurs exemples et puis sur un exemple le programme quitte sans message d'erreur.

mardi 8 novembre 2005 à 17:07:24 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

DeAtHCrAsH

Lorsque tu fais un free(mat_p) tu detruit ta variable.
Elle pointe donc nullpart, c'est pourquoi tu ne peut pas alloué ensuite.

Met cette ligne en commentaire et testes.


Shell
mardi 8 novembre 2005 à 17:15:38 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

DeAtHCrAsH

En fait le free_mat(...) ne doit etre appeller qu'a la fin du programme.
A chaque fois que tu veux gerer une nouvelle matrice, appelle directement allouer_matrice(...), sans passer par free_met(...).

realloc(...), réalloue une zone mémoire comme sont nom l'indique.
Cette fonction redimenssione donc ta variable en conséquence, qu'elle soit plus petite ou plus grande.
Si ta variable vaut null, alors realloc appelle malloc, sinon la réallocation se fait sur le tas.

Shell
mardi 8 novembre 2005 à 17:37:38 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

merci ça précise ma pensée ! donc avec ce changement je peut allouer la meme matrice autant de fois que je veux mais quand je change d'exemple ... parfois je me retrouve avec le même type d'erreurs

en fait j'ai régler le problème qui était sur l'allocation des vecteurs : je suis obliger d'allouer nb_lignes+1 sinon ca plante ...

merci beaucoup shell ! j'y voit un peu plus clair maintenant

mercredi 9 novembre 2005 à 18:50:09 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

et c'est pas fini ^^
en fait j'ai pas de soucis en allouant une matrice et deux vecteurs.
Dans un second alogorithme j'ai plus de variable a allouer : trois matrices et trois vecteurs dans cet ordre : matrice, vecteur, matrice, matrice et les deux autres vecteurs. ca plante justement lors de l'allocation des deux derniers vecteurs. si je change l'ordre d'allocation (par exemple les deux derniers vcteurs avant les matrices) c'est sur les matrices que ca plante (message d'erreur du style la mémoire ne peut être lue blabla). je veu bien a nouveau un petit coup de main :-D merci d'avance !
lundi 14 novembre 2005 à 16:13:46 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

Et bien je chercher mais sans trouver. J'ai beau alloué dans tous les sens et il y a rien à y faire dev-c++ compile exécute mais au bout de quelques allocations ca plante. Si quel'qu'un veu bien me donner un dernier coup de pouce ce serait tres sympa. Merci d'avance.
lundi 14 novembre 2005 à 16:43:25 | Re : répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1

pour pouvoir trouver l'erreur j'ai fait un programme simplifié qui alloue a répétition des matrices :

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

typedef double *vecteur;
typedef vecteur *matrice;

void allouer_matrice(int nb_lignes, int nb_colonnes, matrice *A);
void allouer_vecteur(int nb_lignes, int nb_colonnes, vecteur *V);

int main(void)
{
  int i;
  matrice A,B,C,D,E,F,G;
  vecteur H,I,J,K,L;
  for(i=0;i<=100;i++)
  {
  printf("\niteration %d :",i);
  allouer_matrice(20,20,&A);
  printf("mA ");
  allouer_matrice(20,20,&B);
  printf("mB ");
  allouer_matrice(20,20,&C);
  printf("mC ");
  allouer_vecteur(20,0,&H);
  printf("vH ");
  allouer_vecteur(20,0,&I);
  printf("vI ");
  allouer_matrice(20,20,&D);
  printf("mD ");
  allouer_matrice(20,20,&E);
  printf("mE ");
  allouer_vecteur(20,0,&J);
  printf("vJ ");
  allouer_vecteur(20,0,&K);
  printf("vK ");
  allouer_vecteur(20,0,&L);
  printf("vL ");
  allouer_matrice(20,20,&G);
  printf("mG ");
  }
  getch();
}

void allouer_matrice(int nb_lignes, int nb_colonnes, matrice *A)
{
  int i;

  *A=malloc(nb_lignes*sizeof(vecteur));
  if (*A == NULL)
  {
    printf("\n /!\\ Manque d'espace memoire mat col\n");
    getch();
    exit(1);
  }
  for(i=1;i<=nb_lignes;i++)
  {
    (*A)[i]=malloc(nb_colonnes*sizeof(double));
    if ((*A)[i] == NULL)
    {
      printf("\n /!\\ Manque d'espace memoire mat lignes %d\n",i);
      getch();
      exit(1);
    }
  }
}

void allouer_vecteur(int nb_lignes, int nb_colonnes, vecteur *V)
{
  int i;
  *V=malloc((nb_lignes+1)*sizeof(double));
  if (*V == NULL)
  {
    printf("\n /!\\ Manque d'espace memoire vect\n");
    getch();
    exit(1);
  }
}




Cette discussion est classée dans : lire, lignes, nb, matrice, mat


Répondre à ce message

Sujets en rapport avec ce message

Problème pour dériver une classe [ par arc59 ] J'ai créé une classe Matrice comportant des fonctions get_ele, set_ele (toutes les 2 sont "virtual") et la redéfinition de l'opérateur +.Dans ma class [C] lignes d'un fichier dans un tableau : Segmentation fault [ par Michel76 ] Bonjour,Pardonnez-moi de cette question de débutant.Soit un fichier contenant :-----001002-----Je souhaiterais mettre chacune des lignes de ce fichier lire fichier ligne par ligne [ par mat74 ] salut a ts je voudrai savoir comment je pourrai lire un fichier lignes par lignes . par exemple une fonction qui me permerttrai de recuperer la ligne ArrayList (C#) vers int ** [ par typhoonx ] Bonjour, je voudrai réaliser une conversion d'un ArrayList contenant un ArrayList pour chaque case du premier ArrayList en int ** dans le but d'appele Multiplication d'une matrice par un scalaire [ par skrime ] Bonjour, j'ai un exercice à faire qui consiste à multiplier une matrice par un scalaire en C (la prof ne veut pas qu'on se serve des boucles FOR), je Manipulation de matrices en C. [ par T TeKa K ] Hello les gens! Je viens quemander de l'aide afin de me sortir de ce programme qui me prend la tete. But de l'exericice: creer un programme qui m Lire un fichier txt contenant des nombres [ par wwalker ] Je souhaite qu'une variable integer prennent successivement les valeurs contenus dans un fichier txt.Forme du fichier nombres.txt:123445677890...Voila lire plusieurs lignes d'un fichier text [ par oudkaramla ] salut à tous,j'ai un problème: j'ai un fichier texte contenant quatre lignes.moi je veux lire ces quatre lignes et les stocker chacun dans une variabl MULTIPLICATION D'UNE MATRICE PAR UN VECTEUR [ par jfk20004 ] Quelqu'un pourrait il m'expliquer le bout de code suivant tiré d'un prog de raytrace .Cette partie est censée multiplier une matriceet un vecteur.Je n lire d'une ficjier texte et affichage d'une matrice [ par Stiko ] slt,j ai un fichier texte danslequele se trouve une matrice dont les membres sonr séparés par des point- virgule.comment par un programme C++ je peux


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales