Operateur new allocation new

yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 27 déc. 2005 à 15:34
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 29 déc. 2005 à 20:36
Bonjour, je cherche un peu d'aide pour cette modeste class.
Telle quelle est présenté la elle génère une erreur lors de l'execution (ligne signalés dans la classe.

class
CRepertoire
{
public:
char * cNomRepertoire;
//Avec char * cNomRepertoire aucun problème (je suprime la ligne new dans le constructeur)
unsigned long ulNbReps;
unsigned long ulNbFichiers;
unsigned long ulTailleMo;
CRepertoire(char * cRepertoire = "c:");
~CRepertoire(void);
void ScanRep(char *cRepertoire);
};

CRepertoire::CRepertoire(char * cRepertoire)
{

char * cNomReperoire = new char[strlen(cRepertoire)]; //Ligne qui pose problème

*cNomRepertoire = ""

strcpy(cNomRepertoire, cRepertoire);

ulNbReps = 0;

ulNbFichiers = 0;

ulTailleMo = 0;

ScanRep(cNomRepertoire);

}
Pourquoi cette ecriture n'est pas correcte.
Merci

18 réponses

yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
27 déc. 2005 à 15:39
désolé pour la mise en forme (problème de copier coller)
0
ekinox17 Messages postés 66 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 18 janvier 2006
27 déc. 2005 à 15:48
Donne nous l'appel de ton constructeur car on connait pas la valeur que
tu as donner à cRepertoire en general les erreur a l'execution ça vient
des pointeur NULL (non initialisé)

Verifie que le paramètre de ton constructeur est bien un char* .


C U Later
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 + 1 = 1, c'est l'harmonie parfaite (citation de J-C Van-Dame)
Vive la logique: 1 ou 1 ça fait bien 1 : pas si fou que ça JC ;)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 déc. 2005 à 15:57
*cNomRepertoire = ""

Ca passe à la compilation ce truc?
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
27 déc. 2005 à 16:07
non pardon cNomRepertoire ="" passe a la compilation mais pas a l'execution c'etait a des fin de test
Je reformule donc :
class CRepertoire

{
public:
char * cNomRepertoire; //Avec char * cNomRepertoire aucun problème (je suprime la ligne new dans le constructeur)

unsigned long ulNbReps;
unsigned long ulNbFichiers;
unsigned long ulTailleMo;
CRepertoire(char * cRepertoire = "c:");
~CRepertoire(void);
void ScanRep(char *cRepertoire);
};

CRepertoire::CRepertoire(char * cRepertoire)
{
char * cNomReperoire = new char[strlen(cRepertoire)]; //Ligne qui pose problème

strcpy(cNomRepertoire, cRepertoire);
ulNbReps = 0;
ulNbFichiers = 0;
ulTailleMo = 0;
ScanRep(cNomRepertoire);
}

Et je l'appel ainsi CRepertoire CRepSource (cFileName);
J'ai controlè l'argument cFileName, il est correct puisque avec cette ecriture ca passe :
char cNomReperoire[512];
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
28 déc. 2005 à 00:11
Le strlen ne prend pas en compte le caractère nul, donc faut rajouter une case à ton tableau de caractère.

new chat[strlen(cRepertoire)+1];



Mais pourquoi se faire.... avec des char* alors que le C++ offre des string ^^
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
28 déc. 2005 à 06:41
J'avais essayé avec new chat[strlen(cRepertoire)+1];
Meme résultat. Je vais revoir tout ca. Merci
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
28 déc. 2005 à 09:18
L'erreur vient du fait que tu redeclare ta variable cNomRepertoire. Tu lui dit de créer une variable qui existe deja, donc sa pose probleme... met plutot sa :
this->cNomRepertoire = new char[strlen(cRepertoire) + 1];

Le probleme ne vient donc pas du tout du new...
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
28 déc. 2005 à 09:19
Sa m'etonne d'ailleur que personne n'y ait pensé... Tout le monde regardait l'allocation, mais pas le reste de la ligne...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
28 déc. 2005 à 11:44
NightLoad -> ya aucun problème de ce coté la. Ou vois tu une
variable deja déclarée ? De toute facon, "this" est facultatif. Perso,
il rend le code plus lisible, mais c'est une question de gout :)



Sinon voila la solution.

char * cNomRepertoire = new char[strlen(cRepertoire)+1]; //Ligne qui pose problème

memset(cNomRepertoire, 0,
strlen(cRepertoire)+1);


strcpy(cNomRepertoire, cRepertoire);






Sinon que fait la fonction scanrep ?
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
28 déc. 2005 à 11:55
Euh oui excuse... il faudra que je re-révise mon C++, je suis trop habitué au C... car dans ta classe il y avais une variable nommée cNomRepertoire et tu en redeclare une du même nom dans ton constructeur.

Oula, je suis fatigué moi...
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
28 déc. 2005 à 17:08
Merci pour vos reponse, je relirais tous ca plus tard et vous tiendrais au courrant.

Reponse a vos questions viendron plus tard.
merci a tous
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
29 déc. 2005 à 17:58
J'ai enfin ma classe qui marche parcontre toujours pas avec l'operateur new.
Voila ce que fait ma class c'est tout bete mais ca me manquait.
J'ai pas encore eu le temps de recoder tout cela avec l'operateur new. Cependant j'ai une question supplementraie qui merite peut être un autre poste :


Il est plus performant d'utiliser malloc ou new?


Autre question :
Voyez vous un moyen d'optimiser ce code?


Encore une :
Pourquoi dans le constructeur je ne peux pas utiliser free(cNomRepertoire), la compilation est OK, mais a l'execution KO?


C'est pas fini :
Telle qu'elle je ne désaloue pas cNomRepertoire explicitement, mais lors de la déstruction de la classe il est bien désaloué?


Merci a tous. C'est tout pour l'instant


class CRepertoire
{
public:
char *cNomRepertoire;
unsigned long

}
//Si non c'est un fichier
else
{
// ce n'est pas un répèrtoire donc le fichier est analysé
strcpy(cChemin, cRepertoire); strcat(cChemin, "\"); strcat(cChemin, wData.cFileName);


ulNbFichiers ++;
dwTaille = (wData.nFileSizeHigh * (MAXDWORD+1)) + wData.nFileSizeLow;
ulTailleMo += (int)(dwTaille/1048576);
}
}
} while ( FindNextFile ( hFind , &wData ) ) ;
}
FindClose( hFind );
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 18:10
new ou malloc, c'est idem
tu dois toujours libérer. Comment le destructeur pourrait-il sevoir ce qu'il doit libérer?
Pour l'optimisation, oui: tu peux enlever tous les strcat qui reparcourent la chaine en entier, alors que tu l'a déja fait pour la copie
Il te faudrait une fonction strcpy qui renvoie un pointeur su la fin, et non sur le debut. Tu as la fonction de BruNews (bnstrcpy) mais qui ne marche que sous VC++. Sinon tu peux te faire la tienne
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 18:13
free(cNomRepertoire) n'a pas de sens dans le constructeur (cNomRepertoire n'est pas initialisé à priori). Pourquoi tu veux faire ca?
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
29 déc. 2005 à 20:10
le free(cNomRepertoire), il est bien entendu que je parle du destructeur.


Je remetrais une le code j'avais pas vu que le copier coller etait pas passe comme il faut.


class CRepertoire
{
public:
char *cNomRepertoire;
unsigned long

}
//Si non c'est un fichier
else
{
// ce n'est pas un répèrtoire donc le fichier est analysé
strcpy(cChemin, cRepertoire); strcat(cChemin, "\"); strcat(cChemin, wData.cFileName);


ulNbFichiers ++;
dwTaille = (wData.nFileSizeHigh * (MAXDWORD+1)) + wData.nFileSizeLow;
ulTailleMo += (int)(dwTaille/1048576);
}
}
} while ( FindNextFile ( hFind , &wData ) ) ;
}
FindClose( hFind );
}
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
29 déc. 2005 à 20:11
Decidement.
class CRepertoire
{
public:
char *cNomRepertoire;
unsigned long ulNbRep;
unsigned long ulNbFichiers;
unsigned long ulTailleMo;


CRepertoire(char *cRepertoire)
{
ulNbRep=0;
ulNbFichiers=0;
ulTailleMo=0;
cNomRepertoire = (char*) malloc(strlen(cRepertoire) * sizeof(char));
strcpy(cNomRepertoire, cRepertoire);
ScanRep(cNomRepertoire);
}
~CRepertoire(void)
{
}
private:
void ScanRep (char *cRepertoire);
};


void CRepertoire::ScanRep (char *cRepertoire)
{
//Déclaration des variables
char cChemin [512];
DWORD dwTaille;
WIN32_FIND_DATA wData;
HANDLE hFind;


//Initialisation des variables
//Ajout de \*.* cChemin
strcpy(cChemin, cRepertoire); strcat(cChemin, "\\*.*");
//Initialisation du Handle de recherche de fichiers
hFind = FindFirstFile(cChemin, &wData);
//Suppresion de \*.* a cChemin
strcpy(cChemin, cRepertoire);

if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if(wData.cFileName[0] != '.')
{
//Increment la barre de progression

//Si C'est un répertoire
if (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{

//puisque c'est un repertoire, on recupere la nouvelle adresse, et on va rentrer dedans...


strcpy(cChemin, cRepertoire); strcat(cChemin, "\"); strcat(cChemin, wData.cFileName);


//On rappelle la fonction pour qu'elle analyse le sous répertoire
ScanRep(cChemin);
ulNbRep ++;
// revient un repertoire en arriere
strcpy(cChemin, cRepertoire);
}
//Si non c'est un fichier
else
{
// ce n'est pas un répèrtoire donc le fichier est analysé
strcpy(cChemin, cRepertoire); strcat(cChemin, "\"); strcat(cChemin, wData.cFileName);


ulNbFichiers ++;
dwTaille = (wData.nFileSizeHigh * (MAXDWORD+1)) + wData.nFileSizeLow;
ulTailleMo += (int)(dwTaille/1048576);
}
}
} while ( FindNextFile ( hFind , &wData ) ) ;
}
FindClose( hFind );
}
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
29 déc. 2005 à 20:14
Pour l'optimisation oui j'avais deja vu la fonction de BruNews . Le gain est vraiment interessant?
Pas d'autre source d'optimisation? Car sur des repertoire de plusieurs Giga et milliers de fichiers.

Merci
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 20:36
Le gain est d'autant plus intéressant que la chaine est longue et que le nombre de concaténations est important
De toutes facons, le plus lent seront les accès aux disques (induits par FindNextFile) donc les éventuelles optimisations ne serviron pas vraiment en comparaison
0
Rejoignez-nous