begin process at 2012 05 29 21:23:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Probleme de Malloc sur un char **


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

Probleme de Malloc sur un char **

mercredi 27 octobre 2010 à 01:25:09 | Probleme de Malloc sur un char **

tomy46

Bonjour a tous,

Avant tout, désole pour les accents (sauf ceux repris par la correction orthographique) mais je suis sur qwerty ...

Bon voici mon problème :
Je lis un fichier qui contient plusieurs ligne de texte ...
Pour cela :
Code C/C++ :
read(fd, buffer, 1)

J'effectue donc une lecture caractère par caractère que je stock dans le buffer...
Âpres cela je veux stocker ces lignes dans une belle chaîne de caractère char **tabl :
Pour cela :

Code C/C++ :
int     my_open_file(char *argv, char *buffer, int fd, int argc)
{
  int   x;
  int   y;
  int   reader;
  char  **tabl;

  x = 0;
  y = 0;
  reader = 1;
  fd = open(fichier, O_RDONLY);
  while (reader == 1)
    {
      reader = read(fd, buffer, 1);
      buffer[reader] = '\0';
      if (buffer[1] = '\n')
        {
          y = y + 1;
          x = 0;
        }
      alloc_new_tabl(tabl, buffer, x, y);
      x = x + 1;
      my_putstr("O.K \n");
      //my_putstr(buffer);                                                     
      //my_putstr(tabl[0]);                                                    
    }
  close(fd)
}


Puis j'appel alloc_new_tabl :

Code C/C++ :
void    alloc_new_tabl(char **tabl, char *buffer, int x, int y)
{
  tabl[y][x] = malloc(1);
  tabl[y][x] = buffer[1];
}


Seg Fault juste après le malloc ...
Le problème vient donc de la mais je n'arrive pas a le régler (sûrement par manque de connaissances ...)

Bref pouvez vous me corriger et m'expliquer pourquoi mon allocation dynamique n'est pas correct.

Merci d'avance :)


....:::: Tom JOSEPH ::::....
mercredi 27 octobre 2010 à 05:24:31 | Re : Probleme de Malloc sur un char **

DeAtHCrAsH

Réponse acceptée !

Salut,

Plusieurs choses à dire sur ton code.
Je vais essayer de rester simple pour ne pas te perdre.

1) Ta condition est toujours vrai tel que tu l'as ecrit :
Code C/C++ :
if (buffer[1] = '\n')


Il manque un '=' pour effectuer la comparaison. D'autre part tu effectues une lecture caractère par caractère, mais pourtant tu oses ecrire buffer[1]... Vu ton code, buffer[1] devrais toujours valoir 0 qui marque la fin d'une chaine.

2) Ta boucle while ce base sur un nombre d'octet lus ce qui n'est pas correcte. Utilise feof a la place : while(!feof(fd)){...}

3) La lecture caractère par caractère va te bouffer les perfoamance. Il vaut mieux utiliser une lecture par bloc. Mais ce point la n'est pas critique, il n'empeche pas le bon fonctionnement du programme.

4) Ton tableau a deux dimensions. Avant de l'utiliser tu dois allouer la premiere dimensions sans quoi ttu va te prendre des erreurs dans tous les sens. Cela implique que tu dois connaitre a l'avance le nombre de ligne de ton fichier. Si ce n'est pas le cas tu peux toujours initialiser ta zone mémoire par bloc, et la redimenssioner si tu as besoin de plus d'espace.
Code C/C++ :
char ** myArray;
malloc(*myArray, 2); //Initialise le nombre de ligne a 2
malloc(myArray[0], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[0], "bonjour"); // Affecte une valeur a la premiere ligne
malloc(myArray[1], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[1], "au revoir"); // Affecte une valeur a la deuxieme ligne


4) Pour rester cohérent avec le reste de ton code utilise la méthode fclose plutot que close pour liberer la mémoire allouer pour ton fichier.

Bref beaucoup de chose à améliorer. Tu peux regarder dans mes sources tu trouveras quelques codes sur la manipulation des fichiers textes en C avec le stockage dans des tableaux.

Shell
mercredi 27 octobre 2010 à 06:14:36 | Re : Probleme de Malloc sur un char **

DeAtHCrAsH

Tu l'auras remarquer mes mallocs sont faux, mais l'idée est la.
Voici un petit code rapide qui va peut etre mieux t'aider a comprendre les tableaux a deux dimensions :

Code C/C++ :
#include <iostream>

void displayArray(char ** arr);

int main(int argc, char **argv)
{
	char **myArray = NULL;
	myArray = (char**)malloc(2);

	myArray[0] = (char*)malloc(15);
	strcpy(myArray[0], "bonjour");
	
	myArray[1] = (char*)malloc(15);
	strcpy(myArray[1], "au revoir");

	displayArray(myArray);

	system("pause");

	return EXIT_SUCCESS;
}

void displayArray(char ** arr)
{
	std::cout << "Table values :" << std::endl;

	for(int i=0;i<2;++i)
	{
		std::cout << arr[i] << std::endl;
	}
}



Shell
mercredi 27 octobre 2010 à 13:52:15 | Re : Probleme de Malloc sur un char **

tomy46


Bonjour,

Pour le if c'est une erreur de ma part ...
Pour le reste je suis en train de finir de corriger ...
Je re-poste des que j'ai fini :)

Un GRAND merci en tout cas !

Bonne journée ....

....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
mercredi 27 octobre 2010 à 17:15:49 | Re : Probleme de Malloc sur un char **

tomy46

Re-Bonjour !

Alors mes problèmes sont règles mais il me reste un petit problème d'affichage, explication :
Voila mon code fini ...

Code C/C++ :

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h

void    my_putchar(char c)
{
  write(1, &c, 1);
}

int     check(int fd, char *argv, int argc)
{
  if (argc != 2)
    {
      my_putchar('\n');
      my_putstr("Attention: Il y a trop de parametres !\n");
      my_putchar('\n');
      return (0);
    }
  if (fd == -1)
    {
      my_putchar('\n');
      my_putstr("Erreur: Le fichier d'entree n'a pas ete trouve !\n");
      my_putchar('\n');
      return (0);
    }
  else
    return (1);
}

void    aff_string(char **tabl)
{
  int   i;
  int   j;

  i = 0;
  while (tabl[i] != '\0')
    {
      j = 0;
      while (tabl[i][j] != '\0')
        {
          my_putchar(tabl[i][j]);
          j = j + 1;
        }
      i = i + 1;
    }
}

int     my_open_file(char *argv, char **tabl, int fd, int argc)
{
  int   x;
  int   y;
  int   reader;
  char  *buffer;

  x = 0;
  y = 0;
  reader = 1;
  fd = open(argv, O_RDONLY);
  if (check(fd, argv, argc) == 0)
    return (-1);
  buffer = malloc(1 * sizeof(*buffer));
  read(fd, buffer, 2);
  tabl = (char**)malloc(buffer[0]);
  tabl[y] = (char*)malloc(64);
  while (reader == 1)
    {
      reader = read(fd, buffer, 1);
      buffer[reader] = '\0';
      if (buffer[0] == '\n')
        {
          y = y + 1;
          tabl[y] = (char*)malloc(64);
          x = 0;
        }
      tabl[y][x] = buffer[0];
      x = x + 1;
    }
  aff_string(tabl);
  free(buffer);
  close(fd);
}

int     main(int argc, char **argv)
{
  char  **tabl;
  int   fd;
  int   tmp;

  tmp = my_open_file(argv[1], tabl, fd, argc);
  if (tmp == -1)
    return (-1);
  //aff_string(tabl);                                                          
}



Mon problème est le suivant:
Âpres avoir traite mon tableau (char **tabl), je l'affiche a la fin de la fonction my_open_file ... Jusque la tout va bien ...
Mais comme je dois utiliser ce tableau dans la suite de mon programme, je re-test son affichage directement dans mon main et la : ERREUR !
Je réalise aucune action sur le **tabl mais il ne s'affiche qu a partir de la fonction my_open_file ...

HELP :(

Merci...

....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
mercredi 27 octobre 2010 à 23:45:42 | Re : Probleme de Malloc sur un char **

tomy46

HELP

Personne?
Ma variable char **tabl une fois malloce ne peut pas être utilise dans une autre fonction??

Merci ...


....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
vendredi 29 octobre 2010 à 05:36:44 | Re : Probleme de Malloc sur un char **

DeAtHCrAsH

Réponse acceptée !
Alloue la mémoire de ton tableau dans le main(), ca réglera tes problèmes.
Prend l'habitude de ne jamais passer en paramatres un pointeur non initialisé, ca t'évitera d'avoir des surprises.

Shell
vendredi 29 octobre 2010 à 11:14:35 | Re : Probleme de Malloc sur un char **

tomy46


Nickel PARFAIT :)



....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner


Cette discussion est classée dans : buffer, code, int, char, tabl


Répondre à ce message

Sujets en rapport avec ce message

taille chaine de char [ par langedechu ] Salut , voila mon prob (je sais plus comment faire) :j'ai une variable : const char *buffer; et j aimerais savoir le nombre de caractere stocker dans mon prog plante [ par lcampeur ] Voilà, j'ai un programme qui consiste a envoyer des fichiers quelconques sur des postes référencés précedemment. Je dois pouvoir envoyé plusieurs fich "désallocation" inopinée [ par vecchio56 ] J'ai touvé un truc bizarre avec Visual C++ 6: le code suivant plante:#include void f(char* a){ a = new char[100]; // alloue de la Comment forcer le RTS pour une liaison RS232 [ par ancat ] Bonjourje viens de faire un petit prog (grandement inspire de sources du site) mais je ne saisis pas trop le controle du RTS.Celui ci est-il traite pa problème de char [ par minet03 ] Coucoutout le monde, tout d'abord voilà mon code :#include #include #include #include #include #include char *bin_dec(char *binai problème de char [ par minet03 ] Bonjour c'est encore le débutant, voilà le code :#include #include #include char inverser_char(char variable[]){ int longueur = strlen(variable); // l longip ... probleme [ par winwarrior ] Salut :)Voila j'ai un petit probleme avec un code qui est censé me renvoyer le longip, il me retourne -795585024 au lieu de 2130772483 (longip de 127. [ C ] copier ds un tableau apres un read? [ par lcstriker ] bonjour!!!g un leger probleme, que je suis sur vous serai nombreux a pouvoir resoudre:#include #define BUFF_SIZE 42int main(int ac, char **av){ Création d'un client [ par tomalille ] Bonjour,je viens d'écrire ce code qui cré un client qui se connecte sur un serveur apache. A la compilation (sous visual C++) j'ai 5 erreurs, je ne co Prob avec les variables [ par Ilsundal ] Bonjour a tous,voila mon probleme, j'ai declaré une variable, mais quand je lui assigne par exemple  : MAISON, il m'affiche que M. comment faire pour


Nos sponsors


Sondage...

Comparez les prix

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,842 sec (4)

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