begin process at 2012 05 29 15:37:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Petit problème avec NEW DELETE et RETURN


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

Petit problème avec NEW DELETE et RETURN

mercredi 29 décembre 2004 à 22:55:43 | Petit problème avec NEW DELETE et RETURN

kuruma

Bonjour
j'ai un petit problème avec cette fonction. en c++ ou c :


#include <stdio.h>
#include <list>
#include <sys/types.h>
#include <dirent.h>
#include <string>
#include <cstring>


char * scan(char * chemin)
{

char * texte = new char;
char *temp;
temp = new char;
DIR *rep;
struct dirent *ep;
rep = opendir (chemin);
if (rep != NULL)
{
while (ep = readdir (rep))
{
temp=ep->d_name;
strcat(texte,"\r\n");
strcat(texte,temp);
}
closedir (rep);
}
return texte;
delete texte;
}

int main()
{etc...}

voila mon probleme :
la fonction renvoie un char *, donc une chaine de caratere.

I) Si j'appelle la fonction 1ere fois il me liste le dossier à l'adresse chemin (char *). ->ok

II) Si je la rapelle une deuxieme fois ->

1) sous dos -> quitte le programme.
2) sous un api windows ->

affiche 3 char bizarre et me liste mon dossier.

III)
sous win :3eme fois -> plantage.

Bon je sais que logiquement le RETURN arrete la fonction, donc le delete ne marche pas...

Bon si je le met avant c'est pas logique, il va rien me retourner.
le probleme ne vient peut etre pas du "char * texte=new char" mais d'autre chose.

Bon je sais que pour les allocations memoire et les char * ca fait 2 aussi, le mieux c'est les string.

Mais j'arrive pas a trouver la fonction qui permet de convertir en string mon "d_name" qui me renvoie un char [260].

Pouvez vous m'aider merci!!
mercredi 29 décembre 2004 à 23:57:10 | Re : Petit problème avec NEW DELETE et RETURN

CriPpLe

Réponse acceptée !
Hum déjà retourner un pointeur, c'est pas génial
mercredi 29 décembre 2004 à 23:57:50 | Re : Petit problème avec NEW DELETE et RETURN

DeAtHCrAsH

Réponse acceptée !
Tu te mélange les pédales totales mon coco.
Déjà ce que tu dois savoir, c'est que les variables déclarées localement dans les fonctions n'ont pas besoin de delete, elles sont supprimées automatiquement dès la sortie de la fonction.

Ensuite, quand tu fais "char *texte = new char;" ca serait bien de spécifier la taille à allouer, car un char simple ne vaut que un seul octet!

Tu me diras que pourtant ton programme marche bien le premier coup!
Ceci est du au fait que texte soit un pointeur. Il indique donc l'adresse du premier élément que constotue ta chaine.

Autrement dis dans ton cas, il y a un dépassement de capacité qui ecrase les données présente sur les zone mémoires suivantes.

Pour terminer, il ne faut pas oublier qu'une fonction renvoyant un pointeur, renvoi une adresse mémoire et non un contenu.
Cela signifie qu'avec 2 appels succesifs de cette fonction, le premier résultat a de forte chance de se faire écraser par le deuxieme ou de se chevaucher.

En gros t'obtiens quelques choses d'illisible au final.

Commence par apprendre les bases de la programmation en C et par assimiler la notion de pointeur!
Si tu as besoin de conseil n'hésites pas!

Shell
jeudi 30 décembre 2004 à 01:50:47 | Re : Petit problème avec NEW DELETE et RETURN

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
char * texte = new char; // Tu aloue une zone de 1 octet, pas suffisant
il faut faire char* texte = new char[...];

la méthode c_str() te donnera un char* à partir d'un string.

Si tu fais une allocation dans ta fonction, ce n'est pas à elle de faire le delete, sinon tu ne pourras jamais utiliser le résultat. Mais ce delete il faut bien le faire à un moment donné...
En général on passe en paramètre une zone déja allouée avant l'appel (comme par exemple le premier param de strcpy), sinon tu risques d'avoir des fuites de mémoire. Il n'est pas logique de voir du code comme ca:


char* p = scan(chemin);
delete[] p;


On fait plutot:


char* p = new char[260];
scan(p, chemin);
delete[] p;


Par contre pas de problème pour une fonction qui renvoie un string
jeudi 30 décembre 2004 à 11:59:18 | Re : Petit problème avec NEW DELETE et RETURN

kuruma


merci,

en fait j'ai remplace tous les char * par des string...
maintenant ca marche!!

C'est vrai que les char * c'est pas terrible...

mais bon un autre petit pobleme:

sous dos ca marche nikel

mais sous un api win32 là, j'ai ma fonction SetWindowsText(edit,texte) ou la texte est "un const char *"

et si je le converti il va creer un char* donc un pointeur que je vais rapeller... que faire?

peut etre qu'il existe une autre fonction pour afficher du texte dans un edit??
jeudi 30 décembre 2004 à 14:45:10 | Re : Petit problème avec NEW DELETE et RETURN

kuruma

probleme resolu avec c_str() :p:p:p

merci encore
jeudi 30 décembre 2004 à 17:18:30 | Re : Petit problème avec NEW DELETE et RETURN

vecchio56

Administrateur CodeS-SourceS
"C'est vrai que les char * c'est pas terrible..."

C'est toi qui le dit ca!
jeudi 30 décembre 2004 à 23:44:41 | Re : Petit problème avec NEW DELETE et RETURN

kuruma

dsl c'est que je l'ai lu et que je le repeat betement *

bref j'ai un autre petit probleme plus ou moins lié alors je sais pas si faut que je refasse un post ou pas...


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char * chemin=new char [3000];
chemin="d:\\";
// ou alors
//string chemin;
//chemin ="d:\\";
switch (message) /* handle the messages */
{

case WM_COMMAND :

switch(LOWORD(wParam))
{
case ID_LISTBOX :
{
if ((LOWORD(wParam) == ID_LISTBOX) && (HIWORD(wParam) == LBN_SELCHANGE))
{
ListBee(chemin);
break;
}
}
}
etc...


ma fonction ListBee qui est un peu longue...que j'ai racourci en truc inutile pour mon probleme.

void ListBee(char * chemin)
{
char * caption;
caption= new char[1024];
strcpy(caption, chemin);
strcat(caption,"\\");
strcat(caption,"dossier");
delete[] chemin;
chemin=new char[3000];
strcpy(chemin, caption);
}

ou

void ListBee(string chemin)
{
char * caption;
caption= new char[1024];
strcpy(caption, chemin.c_str());
strcat(caption,"\\");
strcat(caption,"dossier");
chemin.assign( caption);
}

voilà dans la procedure LRESULT CALLBACK WindowProcedure

je n'arrive pas a modifier mon "chemin"....

J'ai un doute sur le fait que la procedure en fait fait une boucle et me reassigne mon "chemin" que ce soit string ou char *

a cause de ma ListBox dans le switch...

en gros a chaque fois que j'utilise ListBee, le parametre devient "d:\\" or je voudrais qu'il change.. est ce un probleme de pointeur ou est ce a cause de la procedure LRESULT CALLBACK WindowProcedure


Merci car vraiment je vois pas et si c pas a cause de la procedure ca m'eviterai de reprendre un gros bout de code


Cette discussion est classée dans : fonction, texte, include, rep, char


Répondre à ce message

Sujets en rapport avec ce message

Texte2Hexa [ par Matt67 ] Bonjour,Je voudrais savoir si on pouvait optimiser ceci :#include #include int main(){    static char *conv[] = {"00 ", "01 ", "02 ", "03 ", "04 ", "0 fonction qui retourne une chaine==>libération de la mémoire [ par tibob51 ] Bonsoir,J'ai eu besoin d'utiliser une fonction me retournant une chaine,après mes recherches sur cpp france j'ai trouvé la syntaxe suivante:char* Fonc [c++]nom de la fenetre dans focus [ par kiki67100 ] Bonjour voila jaimerais avoir le nom de la fenetre qui se trouve dans le focus jai deja un code mais il me sort du texte bizzare voila le code :#inclu Erreur de segmentation : à cause d'un strcmp() [ par tibs624 ] Tout est dit dans le titre à la compilation aucun problème mais lors de l'exécution de mon programme. Je vous met le code et les explications. Ce code problème de fonction de tirage aléatoire en poker [ par moonlight2509 ] Salut, étant en débutant en langage c mon problème paraît peut-être très bête!! Voilà j'ai un problème d'argument ou de type de fonction dans la fonct fonction system() accès refusé [ par fratleym ] Bonjour,oui je sais, la fonction system() c'est horrible mais bon là, je l'utilise surtout pour que ceux qui reprendront le code sachent à peu près ce comment gerer ce projet pour que deux etudiants n'aient pas le meme code [ par desco182 ] Salut a tous j'aimerais bien que quelqu'un m'aide .#include#include#include#ifndef ETUDIANT_H#define ETUDIANT_Hclass etudiant{int code;<br / Pointeur sur char [ par wislam2007 ] salut j'ai un variable de type char, et une fonction qui retourne un pointeur sur un caractère (char), comment faire pour affecter le retour de la fon Fonction _T(); [ par d4M13N ] Bonjour,Je suis en train de faire un petit programme en C++ Application Windows Form sous Microsoft Visual Studio 2005.Je suis bloqué sur une malheure


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 1,217 sec (4)

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