cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 2009
-
25 juin 2005 à 02:31
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 2009
-
25 juin 2005 à 14:01
Lol question très explicite :)
Donc je comprend plus rien du tout :)
Desfois ça marche, desfois non, desfois il plante, desfois non, desfois il compile, desfois il tape des crises... Help Me !!! Lol
Donc en faite, j'explique le principe, il charge un fichier que vous choisissez, il le coupe en ligne, il étudie chaque type de ligne et affiche le type que vous souhaitez, bref, il marche pour certain fichier, et pour d'autre, il oublie une ligne, enfin bref regarder par vous même...
J'ai tester en mettant des pauses partout, afficher les différentes valeurs de la ligne au cours du traitement, rien à faire, ma ligne se perd dans la mémoire :)
Le code est fait sous Dev C++, désolé, c'est que la structure...
Le fichier qui merde, c'est Ligne.cpp.
Donc ouvrer l'exe, ou compiler le 'like you want' et tester avec différents fichiers et explikez to me svp :p
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 25 juin 2005 à 12:31
Lol en effet ça craint, j'pense pas qu'elle soit corrompue, c'est juste ton log qui télécharge... j'avais les mêmes problèmes avec DAP sur themexp.org fin bref, jvé tout mettre sans zip :)
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 25 juin 2005 à 12:48
salut,
oublie jamais un truc 'desfois il plante, desfois non' : ton code est
buggé, et comme ds 90% des cas c'est du a une mauvaise utilisation des
pointeurs.
primo : je sais pas si t'as fait du java avant, mais il semblerait que
t'aies pas compris certaints trucs : un char *Line = new char[512]; est
inutile !! car tu connais a la compilation la taille de ton tableau.
Ecris plutot : char Line [512]; ca te permettra de pas faire de
delete[] par la suite.
deuxio, ben des le main ca commence mal :
CLigne **cLigne;
*cLigne = new CLigne[NbrLigne-1];
exemple typique d'écriture dans une zone de mémoire non allouée ...
Fais plutot CLigne * cLigne = new CLigne[NbrLigne-1]; et ensuite
utilise &cLigne si tu veux un CLigne** ... La dans ce que tu fais
tu déclares un pointeur sur un pointeur de CLigne, et en faisant
*cLigne = ... tu écris dans ce qui est pointé par ton pointeur de
pointeur, mais pb, celui ci pointe vers qqc d'aléatoire a la base, et
en tout cas certainement pas vers une zone mémoire disponible. Qd ca
plante pas a cet endroit, c'est de la chance.
Tu peux egalement faire (mais la 1ere solution est meilleure ...)
CLigne **cLigne;
cLigne = new CLigne*;
*cLigne = new CLigne[NbrLigne-1];
mais la ca te permet peut etre de mieux comprendre pourquoi ce que t'as fait ne va pas.
ensuite un pb etant lié a la partie C de ton code, si tu fais
szLigne = new char[512];
strcpy(szLigne, szValue);
exemple typique de buffer overflow car tu ne controles pas la taille de
szValue ... N'utilises jamais strcpy, prefere la version sécurisée
strncpy ...
tu devrais avoir:
szLigne = new char[512];
strncpy(szLigne, szValue,512);
szLigne[512-1] = 0;
cela dis tu devrais avoir un char szLigne[512]; comme champs de ta classe, ca t'eviterait un new avec une taille fixe !!!
bon déja une correction de ces quelques pb vont peut etre t'éviter certains plantages ..
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 25 juin 2005 à 12:53
Héhéhé merci :p pour toutes ses remarques, j'vé vite corrigé le bordel et j'dis quoi...
C'est vrai que les pointeurs lol c'est quand même ce qu'il y a de plus merdique :p
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 25 juin 2005 à 13:19
J'voudrais savoir si c'est correct ça lol xD
int NbrLigne = cFile.CompterLigne();
CLigne *cLigne[NbrLigne-1];
cLigne[0] = new CLigne(2, "David");
cLigne[0]->Afficher();
system("PAUSE");
delete cLigne;
donc on commence par compter les lignes..., on crée un tableau de pointeur qui ne point sur rien pour l'instant, et ensuite le premier élément on l'initialise... Normalement c'est bon la ??? :)
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 25 juin 2005 à 13:49
ca, ca doit pas compiler : CLigne *cLigne[NbrLigne-1];
la taille du tableau doit etre connu a la compilation si tu fais qqc
comme ca (ca doit etre une constante quoi, la NbrLigne-1, au moment de
compiler, le compilo sait pas ce que ca vaut !)
du coup le reste est pas consistant, puisque tu écris cLigne[0] = new
CLigne(2, "David");, donc en fait cLigne est supposé ici etre un
CLigne** ...
utilise le type vector de la STL, t'auras plus de pb avec les tableaux ....
ce que tu fais est plus du C que du C++......
ex:
#include <vector>
vector<CLigne> cLigneArray;
cLigneArray.push_back( CLigne(2, "David") ); // ajout d'une CLigne au tableau
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 25 juin 2005 à 13:56
enfin si tu utilises la STL, il faut que tes classes définissent proprement le constructeur par copie, et l'operateur de copie:
le CLigne& operator=(const CLigne& b); // operateur d'affectation
et CLigne::CLigne(const CLigne& b); // constructeur par copie
quand tu ne les définis pas, et que tu fais une allocation dynamique
dans le constructeur, tu peux facilement obtenir un plantage de ta
classe; essaie ca:
{
CLigne a;
CLigne b(a);
}
tu verras ca va planter :)
(lors de la destruction de b, il va essayer de faire un delete[]
szLigne; alors que la zone mémoire désignée par szLigne a déja été
désalloué lors de la destruction de a)
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 25 juin 2005 à 14:01
Mon dieu lol c'est affreuxxxxxxxxxxxx
J'suis assez mal barré donc :p
Il est donc temps que j'm'intéresse à ces vecteur la j'sais pas trop quoi :p
En tout cas merci beaucoup de t'investir lol moi ca fait longtemp j'me serais casser :p