Accueil > Forum > > > > Probleme de Malloc sur un char **
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++ :
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++ :
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|