bug apparement inexisatn mais prtt ... [c] - Programmation
Marsh Posté le 01-12-2001 à 23:02:42
a te dire comme ca je vois pas, attaque ca au debuggeur ....
edit : t sur que ton J sert pas ensuite comme index dans un tableau, et qu'il serait > a la taille dudit tableau ? (ca explique pas trop pkoi ca plante pas dans un cas et dans l'autre, mais bon...)
[edtdd]--Message édité par chrisbk--[/edtdd]
Marsh Posté le 01-12-2001 à 23:19:16
chrisbk a écrit a écrit : a te dire comme ca je vois pas, attaque ca au debuggeur .... edit : t sur que ton J sert pas ensuite comme index dans un tableau, et qu'il serait > a la taille dudit tableau ? (ca explique pas trop pkoi ca plante pas dans un cas et dans l'autre, mais bon...) |
le dernier test imbrique est proprement dit est :
char *lelien;
....
while ((!eof(entree)) && (sortie == 0)
{
if ((i == ' ' || (i == '>'
)
{
lelien[j] = '\n';
printf("%s\n",lelien);
j = 0;
sortie = 1;
}
fread(&i, sizeof(char), 1, entree);
}
aparement ca correspond peut etre au pb que tu m'a dis ...
je sai pas corriger ...
Marsh Posté le 01-12-2001 à 23:20:01
chrisbk a écrit a écrit : a te dire comme ca je vois pas, attaque ca au debuggeur .... edit : t sur que ton J sert pas ensuite comme index dans un tableau, et qu'il serait > a la taille dudit tableau ? (ca explique pas trop pkoi ca plante pas dans un cas et dans l'autre, mais bon...) |
je sais pas me servir du debugger
Marsh Posté le 01-12-2001 à 23:37:24
lelien est bien alloué la bonne taille ?
(sinon, apprends a te servir d'un debuggeur, c vraiment la bequille indispensable quand ton prog plante. enfin je sais pas trop sous linux ce qu'il y a comme debugger valable...)
Marsh Posté le 01-12-2001 à 23:38:49
hum attends je crois que je vois
remplace :
lelien[j] = '\n';
printf("%s\n",lelien);
par
lelien[j] = '\n';
lelien[j+1] = 0;
printf("%s\n",lelien);
Marsh Posté le 01-12-2001 à 23:45:56
chrisbk a écrit a écrit : hum attends je crois que je vois remplace : lelien[j] = '\n'; printf("%s\n",lelien); par lelien[j] = '\n'; lelien[j+1] = 0; printf("%s\n",lelien); |
en effet ca marche ...
mais g pas capte prkoi ...
lelien[j] = '\0';
le \0 correspond prtt a une fin de string alors prkoi mettre le 0 apres ... pour moa c le \0 qui fait tt !
en tt cas merci
Marsh Posté le 01-12-2001 à 23:50:21
encore un petit pb ...
juste un Warning qui apparait avec le -Wall
'lelien' might be used unitialized in this function
je traduit ca par
"'lelien' devrait etre utiliser pas intitialise dans cette fonction"
char *void
c ce qui est fait non ?!
Marsh Posté le 01-12-2001 à 23:51:18
chrisbk a écrit a écrit : sauf que la tu a pas fait \0 mais \n |
c t une faute de frappe j'avais bien tape \0
Marsh Posté le 02-12-2001 à 00:30:27
Non il te dit que lelion sera peut etre utilisé sans etre initialisé
t'alloc bien la mémoire, pour lelien ?
Marsh Posté le 02-12-2001 à 00:34:16
chrisbk a écrit a écrit : Non il te dit que lelion sera peut etre utilisé sans etre initialisé t'alloc bien la mémoire, pour lelien ? |
nop je l'utilise tel quel !
char *lelien
et apres ...
lelien[j] = 'X';
Marsh Posté le 02-12-2001 à 00:48:28
otb82 a écrit a écrit : nop je l'utilise tel quel ! char *lelien et apres ... lelien[j] = 'X'; |
C pour ça que ça plante....
Il faut allouer de la mem por lelien
genre
lelien = (char *)malloc(100 * sizeof(char));
avec 100 la taille de ton tableau.....
Marsh Posté le 02-12-2001 à 00:54:43
[SDF]Poire a écrit a écrit : C pour ça que ça plante.... Il faut allouer de la mem por lelien genre lelien = (char *)malloc(100 * sizeof(char)); avec 100 la taille de ton tableau..... |
je croyais qu'avec char *lelien
il allouais la memeoire tt seul comme un gd !
sinon autant utiliser
char lelien[100]
j'utilisais le dynamique exprtes pour pas etre limite et avec
lelien = (char *)malloc(100 * sizeof(char));
je suis limite a 100 char !
Marsh Posté le 02-12-2001 à 01:55:32
Non, quand tu ecris 'char *lelien', ca te cree un pointeur lelien. Mais il pointe sur rien.
Quand tu mets 'char lelien[100]', ca alloue effectivement une zone memoire de 100 caracteres, avec lelien qui pointe dessus.
De toute facon, tu peux pas avoir une taille allouee sans lui dire a un moment combien il te faut.
Marsh Posté le 02-12-2001 à 13:42:08
otb82 a écrit a écrit : je croyais qu'avec char *lelien il allouais la memeoire tt seul comme un gd ! sinon autant utiliser char lelien[100] j'utilisais le dynamique exprtes pour pas etre limite et avec lelien = (char *)malloc(100 * sizeof(char)); je suis limite a 100 char ! |
Non avec allocation dynamique T pas limité (C à ça que ça sert)
Regarde l'aide de malloc et de realloc
(si C++ il y a new....)
ID : alloue un buffer (genre 1024) si dépassement realloue le double (2048) etc..... (Je suis ptet pas trés clair....)
Si tu comprends pas demande j'expliquerai +....
Marsh Posté le 02-12-2001 à 13:46:31
[SDF]Poire a écrit a écrit : Non avec allocation dynamique T pas limité (C à ça que ça sert) Regarde l'aide de malloc et de realloc (si C++ il y a new....) ID : alloue un buffer (genre 1024) si dépassement realloue le double (2048) etc..... (Je suis ptet pas trés clair....) Si tu comprends pas demande j'expliquerai +.... |
en effet pas tout compris
Marsh Posté le 02-12-2001 à 13:56:25
ce que SDF veut te dire c'est ca :
1) allouer dynamiquement un tableau de 1024 case
2) ecrire dans ce tableau
3) si a un moment tu ecris a la case 1024, alors
- allouer nouveau tableau de 2048 case
- recopier les 1024 premieres cases du tableau dans le nouveau
- effacer le premier tableau
- continuer a travailler avec le deuxieme ( de 2048)
exemple :
int courant = 0;
int max = 1024;
char * tab = malloc(1024);
char * tab2;
while(....)
{
........
tab[courant] = trucBidule;
courant++;
if (courant == max)
{
max+=1024;
tab2 = malloc(max);
memcpy(tab2,tab,courant);
free(tab);
tab = tab2;
}
........
}
See ?
Marsh Posté le 02-12-2001 à 13:56:39
otb82 a écrit a écrit : en effet pas tout compris ![]() |
oki
Ex :
char *lelien;
int taille;
....
taille = 1024
lelien = (char *)malloc(taille * sizeof(char));
while ((!eof(entree)) && (sortie == 0)
{
if ((i == ' ' || (i == '>'
)
{
if (j >= taille) {
lelien = (char *)realloc(taille * sizeof(char));
taille = taille + 1024;
}
lelien[j] = '\0';
printf("%s\n",lelien);
j = 0;
sortie = 1;
}
fread(&i, sizeof(char), 1, entree);
}
Bon G fait ça de mémoire y a ptet des bugs.... (en + il est tôt
)
T'as compris l'idée ?
Marsh Posté le 02-12-2001 à 13:57:39
chrisbk a écrit a écrit : ce que SDF veut te dire c'est ca : 1) allouer dynamiquement un tableau de 1024 case 2) ecrire dans ce tableau 3) si a un moment tu ecris a la case 1024, alors - allouer nouveau tableau de 2048 case - recopier les 1024 premieres cases du tableau dans le nouveau - effacer le premier tableau - continuer a travailler avec le deuxieme ( de 2048) exemple : int courant = 0; int max = 1024; char * tab = malloc(1024); char * tab2; while(....) { ........ tab[courant] = trucBidule; courant++; if (courant == max) { max+=1024; tab2 = malloc(max); memcpy(tab2,tab,courant); free(tab); tab = tab2; } ........ } See ? |
+ rapide que moi....
Là si il à pas compris.....
Marsh Posté le 02-12-2001 à 14:01:18
je post plus vite que mon ombre
ton realloc sera peut etre plus explicite (mais j'utilise jamais realloc..)
Marsh Posté le 02-12-2001 à 14:05:42
chrisbk a écrit a écrit : je post plus vite que mon ombre ![]() ton realloc sera peut etre plus explicite (mais j'utilise jamais realloc..) |
Ben en fait ça fait longtemps que j'ai pas fait de l'allocation dynamique....
Tien G oublié de lui dire qu'un jour faut qu'il libére la mem...
Marsh Posté le 01-12-2001 à 22:51:19
en simplifiant mon pg :
if (j<10)
{
j++;
printf("%d\n",j);
}
il se passe un truc trop chelou :
qd le printf est present le prog tourne ...
mais qd je l'enleve ou le met en commentaire ...
g un segmentation fault ...
if (regegerge)
{
j++;
}
=>>> erreur
alors la je capte plus rien !!!!!!!!!!!!
bien sur c n'etait pas ce code qui merdais mais un prog bc plus important mais le bug revient a ca ...
si quelq'un vois ou a deja eu pareil
il faut signaler (je sais pas si ca a une importance mais ce teste se situe deja a l'interieur d'un dizzaine de test imbriques ...
je compille sous la mandrake 8.1 avec gcc 3.0.1
---------------
email : otb82@hotmail.com