IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

La fonction Strncpy


Sujet :

C

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut La fonction Strncpy
    Salut a tous,
    au fait j'ai un problème qui peut paraitre banale pour beaucoup de personne mais pour moi il ne l'ai pas, donc je voulais exposer le problème pour prendre votre avis:
    voila j'ai donc deux chaine de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *inFile, *File;
    inFile = NULL;
    File = NULL;
    je veux copier les 45 premiers caracteres de inFile dans File avec strncpy mais le programme s'arrete subitement c'est que lorsque j'enleve l'instruction que tout devient normale

    strncpy (File,inFile,45);
    normalement l'instruction exacte de strncpy c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * strncpy ( char * destination, const char * source, size_t num );
    donc si le probleme arrive de const alors quelle fonction utiliser pour copier une chaine variable dans une autre chaine??? parce que la valeur de inFile change a chaque fois

    SVP aider moi a trouver ou est le problème
    et merci d'avance,

  2. #2
    Membre habitué Avatar de keikoz
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 146
    Points : 173
    Points
    173
    Par défaut
    Le problème n'est pas le const, le problème est plutot (je pense) que tu ne fais pas l'allocation de mémoire nécessaire à File*.

    N'oublie pas que là, tu ne déclares pas des tableaux de caractères, mais des pointeurs vers char (char *), ce qui n'est pas pareil. Si tu veux utiliser des pointeurs pour introduire une chaine de caractère, tu dois libérer de l'espace mémoire (pointé par ton pointeur). Pour pouvoir faire ce que tu veux faire tu devrais rajouter quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    File = malloc(sizeof(char) * 45)
    Et seulement ensuite faire ton strncpy.

    Tu veux pas nous montrer ton code complet ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    donc si le probleme arrive de const alors quelle fonction utiliser pour copier une chaine variable dans une autre chaine??? parce que la valeur de inFile change a chaque fois
    Le const devant le pointeur de la chaîne d'origine ne signifie pas que inFile n'a pas le droit de bouger. Il sert à garantir qu'il ne sera pas modifié à l'intérieur de la fonction strncpy.

    Sinon comme dit keikoz, le problème vient du fait que tu n'as pas alloué la chaîne. Attention toutefois : si tu veux 45 caractères et que tu en alloues 45, tu n'auras pas de zéro de fin de chaîne. Ca va bien tant que tu utilises des fonctions de manipulation de chaînes où l'on peu spécifier la taille. Mais si jamais tu as besoin d'utiliser strcpy, strcat... ces fonctions ont besoin de chaînes se terminant par un zéro.
    Pour ça il faut allouer 46 caractères, faire ton strncpy et mettre toi-même le zéro : File[45]=0;

    Ceci dit je sais pas si c'est parce que tu ne donnes pas tout le code, mais vu comme ça ton inFile en plus de ne pas être alloué ne contient rien.

  4. #4
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Avant tout je tiens a vous remercier de vous être intéressé a mon problème,

    pour infile je ne peux pas spécifier la taille exacte par ce que ça peut être 45 comme ça peut être 60... etc
    c.a.d si je fais une allocation avec un nombre precis le programme risque de beuguer en cas ou l'utilisateur utilise un nom de fichier long ;
    moi je fais la simulation avec des fichiers précis, mais le programme doit au maximum approcher la réalité;
    enfin je vous donne mon programme et jugez par vous même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    void main_sample(char option, long itemSize)
    {
        FILE *f = NULL; 
        char *inFile, *outFile;
        char encode; 
        long lSize1; 
        char *InFile;
        /* initialize data */
        inFile = NULL;
        outFile = NULL;
        InFile = NULL;
        encode = TRUE;
    	if (option == 'c'){ encode = TRUE;}/* compression mode */
    	if (option == 'd'){ encode = FALSE;}/* decompression mode */
     
        /* we have valid parameters encode or decode */
        outFile = "C:\\glomosim\\glomosim\\application\\Lzw.txt";
        if (encode)
        {
    		switch (itemSize)
    		{
    case 1000: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    case 1075: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    case 1146: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1146 exe\\vwipxspx.exe"; break;
    case 1311: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1311 BMP\\SAVE.bmp"; break;
    case 1460: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1460 TXT\\LICENSE.txt"; break;
    case 1832: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1832\\IULogo.gif"; break;
    case 1987: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1987\\HELPUS.txt"; break;
    case 2048: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\2048 TXT\\Gllomo.txt"; break;
     
    default: printf("\nThe itemsize is not specified\n"); break;// 10 fichier
    		}
    /*dans le switch le contenu de inFile varie*/
    		pch = strchr(inFile, '.');/*je sauvegarde l'extension du fichier*/
    		LZWEncodeFile(inFile, outFile);
        }
        else
        {
    		inFile = "C:\\glomosim\\glomosim\\application\\out";
                    strncpy (InFile,inFile,41);/**je prend 41 carcateres/
                    strcat(InFile, cpt);
                    cptint = atoi(cpt);cptint=cptint+1;
                    itoa (cptint,cpt,10);/*j'ajoute le compteur*/
    		strcat(InFile, pch);/*j'ajoute l'extension*/
     
    		LZWDecodeFile(outFile, InFile);
        }
        free(inFile); free(InFile); free(outFile);
    }
    Au fait j'ai utilisé strncpy parce qu'à chaque fois le contenu de inFile ne s'effaçait pas! du coup après plusieurs tentative pour trouver ou est le problème, j'ai essayer d'accomoder des solutions selon les exigences de mon programme, je sais c'est pas une solution mais je voulais seulement voir les resultats de ma simulation
    Mon problème de base est que j'ai plusieurs fichiers qui vont être compressés tour a tour et leurs résultats vont être stockés dans d'autre fichiers OUT:
    normalement je devrais avoir out1, out2, out3....
    mais j'obtient toujours
    out1
    out1.txt2
    out1.txt2.txt3
    et pourtant a chaque fois que la fonction est appelé inFile reçoit NULL et il est libéré après utilisation!!!
    meme strcpy ne marche pas avec moi??

    PS: j'utilise visual c++ 6 , peut être que cette information vous aidera à mieux cerner le problème parce que j'ai vu de toutes les couleurs avec ce compilateur
    et merci a vous.

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *inFile, *outFile;
    <...>
    char *InFile;
    - Tu manques d'imagination à ce point.

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char encode;
    <...>
    if (option == 'c'){ encode = TRUE;}/* compression mode */
    if (option == 'd'){ encode = FALSE;}/* decompression mode */
    <...>
    if (encode)
    <...>
    }
    else
    {
    - Si option est différente à la fois de 'c' et de 'd', encode ne seras pas initialisée ce qui risque de fausser le test qui suit.

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    pch = strchr(inFile, '.');/*je sauvegarde l'extension du fichier*/
    - Dans ce cas c'est le dernier point que tu dois chercher, strrchar()

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InFile = NULL;
    <...>
    inFile = "C:\\glomosim\\glomosim\\application\\out";
    strncpy (InFile,inFile,41);/**je prend 41 carcateres/
    - Attention InFile ne pointe pas vers une zone mémoire valide, documentes toi sur ce qu'est «l'allocation dynamique de mémoire».

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    free(inFile); free(InFile); free(outFile);
    - Revoir le point précédent.

    Bon courage.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    salut,
    Citation Envoyé par ssmario2 Voir le message
    - Tu manques d'imagination à ce point.
    - Oui c'est vrais c'est résolu, merci pour la remarque.
    Citation Envoyé par ssmario2 Voir le message
    - Si option est différente à la fois de 'c' et de 'd', encode ne seras pas initialisée ce qui risque de fausser le test qui suit.
    - le traitement je le fais dans une autre fonction.
    Citation Envoyé par ssmario2 Voir le message
    - Dans ce cas c'est le dernier point que tu dois chercher, strrchar()
    merci pour l'idée, ça m'a échappée.
    Citation Envoyé par ssmario2 Voir le message
    - Attention InFile ne pointe pas vers une zone mémoire valide, documentes toi sur ce qu'est «l'allocation dynamique de mémoire».
    - j'ai fait des modification sur le code, et strncpy marche trés bien c'est vrais je ne lui allouais pas d'espace mémoire, mais j'ai un problème malgrés que je libère la mémoire avec free, inFile garde toujours son contenu,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    void main_sample(char option, long itemSize)
    {
        char *inFile, *outFile = NULL;/*ici inFile est égale a NULL*/
        :
        :
        inFile = malloc (sizeof(char));
        outFile = malloc (sizeof(char));
     
     
        if ( inFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
            if ( outFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
     
    	:
            :
        if (encode)
        {
    		switch (itemSize)
    		{
    			case 1000: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    			case 1075: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    			case 1146: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1146 exe\\vwipxspx.exe"; break;
    			case 1311: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1311 BMP\\SAVE.bmp"; break;
    			case 1460: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1460 TXT\\LICENSE.txt"; break;
    			case 1832: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1832\\IULogo.gif"; break;
    			case 1987: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1987\\HELPUS.txt"; break;
    			case 2048: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\2048 TXT\\Gllomo.txt"; break;
     
    			default: printf("\nThe itemsize is not specified\n"); break;// 10 fichier
    		}
    		pch=strrchr(inFile,'.');
    		LZWEncodeFile(inFile, outFile);
        }
     
        else
        {
    		inFile = "C:\\glomosim\\glomosim\\application\\out";
    /*Pourtant inFile est toujours initialisé a "C:\\glomosim\\glomosim\\application\\out"*/
    		strcat(inFile, cpt);strcat(inFile, pch);
    		cptint = atoi(cpt);
    		cptint=cptint+1;
    		itoa (cptint,cpt,10);
     
     
    		printf("\ninFile DECODE apres= %s\n", inFile);
    		LZWDecodeFile(outFile, inFile);
        }
     
        free(inFile); free(outFile);
        inFile = NULL;
        outFile = NULL;
    }
    Quand je fais l'affichage inFile garde toujours la dernière valeur?? pourquoi??

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne comprends pas pourquoi tu alloues dynamiquement un caractère pour ensuite écraser la valeur du pointeur. C'est une fuite de mémoire. De plus, faire un free sur une chaine littérale...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inFile = malloc (sizeof(char));
    (...)
    inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif";
    (...)
    free(inFile);

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nawal.02 Voir le message
    mais j'ai un problème malgrés que je libère la mémoire avec free, inFile garde toujours son contenu,
    Et pourquoi voudrais-tu qu'il y ait quelque chose d'autre ?
    La fonction free() libère la zone allouée et la rend disponible pour quelqu'un d'autre. Elle n'a aucune raison de modifier ce qu'il y a dans ladite zone étant donné que le suivant qui récupèrera la zone y mettra ce que lui a besoin

    Citation Envoyé par nawal.02 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main_sample(char option, long itemSize)
    {
        char *inFile, *outFile = NULL;/*ici inFile est égale a NULL*/
        :
        :
        inFile = malloc (sizeof(char));
        outFile = malloc (sizeof(char));
    Non. inFile et outFile sont des zones destinées à recevoir des noms (donc une suite de caractères). Tu peux pas allouer l'espace pour stocker seulement UN caractère. Sinon t'aurais simplement écrit char inFile et char outFile

    La méthode à suivre dans le cas le plus général est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void main_sample(char option, long itemSize)
    {
        char *inFile, *outFile = NULL;/*ici inFile est égale a NULL*/
        int need;
        :
        :
        ... (algorithme qui va calculer combien j ai besoin de stocker)...
        ... (et qui met le résultat dans need)...
     
        inFile = malloc ((need + 1) * sizeof(char));
        outFile = malloc ((need + 1) *sizeof(char));
        // Le "+ 1" pour réserver aussi l'espace nécessaire au '\0'

    Citation Envoyé par nawal.02 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        if ( inFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
            if ( outFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
    Attention, dans le cas outFile=NULL faut penser à libérer inFile

    Citation Envoyé par nawal.02 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        if (encode)
        {
    		switch (itemSize)
    		{
    			case 1000: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    			case 1075: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    			case 1146: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1146 exe\\vwipxspx.exe"; break;
    			case 1311: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1311 BMP\\SAVE.bmp"; break;
    			case 1460: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1460 TXT\\LICENSE.txt"; break;
    			case 1832: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1832\\IULogo.gif"; break;
    			case 1987: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1987\\HELPUS.txt"; break;
    			case 2048: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\2048 TXT\\Gllomo.txt"; break;
    Non. Tu as écrit plus haut inFile=malloc(...) ça veut dire que t'as récupéré une valeur IMPORTANTE dans inFile (il s'agit de l'adresse de la zone allouée)
    Si tu écris 3 lignes plus bas "inFile=...", ben tu perds l'adresse précédente qui reste allouée mais qui ne peut plus être libérée => fuite de mémoire

    Maintenant que inFile a assez de mémoire pour stocker tes chaines, ben tu peux alors le remplir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if (encode)
        {
    		switch (itemSize)
    		{
    			case 1000: strcpy(inFile, "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"); break;
    			case 1075: strcpy(inFile, "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"); break;
    		... etc...
                    }
         }
         ... travail sur inFile et outFile ...
     
         // Travail terminé => libération mémoire
         free(inFile);
         free(outFile);
    }
    Ca c'est la méthode générale. Toutefois dans ce cas précis il y en a de plus simples à mettre en oeuvres. En effet, étant donné que tu vas stocker des noms de fichiers, rien ne t'empêche de définir tes zones suffisament grandes pour stocker le plus long nom de fichier possible. Cette valeur est en plus définie dans la macro MAXPATHLEN que contient le header <sys/files.h> que t'as donc le droit d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <sys/files.h>
    void main_sample(char option, long itemSize)
    {
    	char inFile[MAXPATHLEN + 1], outFile[MAXPATHLEN + 1];
     
    	if (encode)
    	{
    		switch (itemSize)
    		{
    			case 1000: strcpy(inFile, "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"); break;
    			case 1075: strcpy(inFile, "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"); break;
    			... etc...
    		}
    	}
    	... travail sur inFile et outFile ...
     
         // Travail terminé mais libération mémoire inutile vu qu'il n'y a pas eu de malloc
    }
    Autre méthode possible: étant donné que ces chaines que tu veux stocker sont écrites "en dur" dans ton code, ben le compilo leur attribue une adresse.
    Et donc rien ne t'empêche de récupérer cette adresse dans un pointeur perso que tu pourras manipuler ensuite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <sys/files.h>
    void main_sample(char option, long itemSize)
    {
    	char *inFile, outFile[MAXPATHLEN + 1];
     
    	if (encode)
    	{
    		switch (itemSize)
    		{
    			case 1000: inFile="C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    			case 1075: inFile="C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    			... etc...
    		}
    	}
    	... travail sur inFile et outFile ...
     
         // Travail terminé
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Merci, Merci beaucoup pour les explication, je suis débutante et l'allocation dynamique de mémoire m'a parru difficile a comprendre parce que les cours que j'ai lu n'explique pas vraiment en détail, ils donnent seulement les instructions a utiliser et a toi de te débrouiller
    il y'a tellement a apprendre!!!!!
    juste une chose:
    quand j'ajoute cette ligne:
    Citation Envoyé par Sve@r Voir le message
    le compilateur me dit qu'il n'arrive pas ouvrir le fichier??
    Je fais quoi la??

  10. #10
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par nawal.02 Voir le message
    le compilateur me dit qu'il n'arrive pas ouvrir le fichier??
    Je fais quoi la??
    Il n'y pas de <sys/file.h> sous Windows. Tu devrais t'en sortir en incluant <windows.h>

  11. #11
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Bonjour,
    Il n'y pas de <sys/file.h> sous Windows. Tu devrais t'en sortir en incluant <windows.h>
    bonsoir,
    c'est fait, mais voici l'erreur:
    Syntax errror before ';'.
    du n'importe quoi puisque avant, tout marchais a merveille !!!!
    et Merci a vous

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    ah petit détail un free sur un pointeur qui pointe vers une chaine "litérale" définie textuellement dans la fonction, ne sert à rien... il ne fait rien.

    en effet, cette chaine est allouée dans le cadre de pile de la fonction, et est donc nettoyée automatiquement quand on quitte la fonction... le free ne peut donc pas nettoyer cette zone, car elle n'a pas été allouée dynamiquement.

  13. #13
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par cinemania Voir le message
    ah petit détail un free sur un pointeur qui pointe vers une chaine "litérale" définie textuellement dans la fonction, ne sert à rien... il ne fait rien.
    Euh! De mémoire, ça doit même être un comportement indéfini (et donc une erreur).

    Rien ne garanti qu'il ne fasse rien.

  14. #14
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par gl Voir le message
    Euh! De mémoire, ça doit même être un comportement indéfini (et donc une erreur).

    Rien ne garanti qu'il ne fasse rien.
    exacte, personnellement j'avais un problème avec free(), le programme beuguais sans définir l'origine du problème

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cinemania Voir le message
    ah petit détail un free sur un pointeur qui pointe vers une chaine "litérale" définie textuellement dans la fonction, ne sert à rien... il ne fait rien.

    en effet, cette chaine est allouée dans le cadre de pile de la fonction, et est donc nettoyée automatiquement quand on quitte la fonction... le free ne peut donc pas nettoyer cette zone, car elle n'a pas été allouée dynamiquement.
    T'es sûr que la zone est nettoyée ? J'ai toujours eu l'impression qu'une chaine littérale était définie en tant que "static" et qu'elle était donc conservée entre les appels de la fonction...

    Citation Envoyé par nawal.02 Voir le message
    du n'importe quoi puisque avant, tout marchais a merveille !!!!
    et Merci a vous
    Hum, il faut savoir distinguer
    1) un programme qui, malgré de gros défauts, semble fonctionner
    et
    2) un programme exempt d'erreurs

    Dans le cas 1, ton programme fonctionnne par "chance". C'est ce que gl nomme "comportement indéterminé". Le programme se comporte de façon imprévisible (ce qui inclut même un semblant de fonctionnement correct).
    Et donc le programme fonctionne parfaitement pendant qq temps. Puis tu rajoutes un truc banal, stye printf("Hello") et là, patatrac. Tout plante. Et toi tu cherches pourquoi ton printf() fait planter le programme alors que l'erreur est bien ailleurs

    Le cas 2 est un cas plus difficile car il te faut veiller toi-même à ce que chaque instruction soit parfaitement cohérente par rapport au contexte. Si tu vas taper danx tab[x], à toi de t'assurer que x est bien compris entre 0 et <taille de tab> car le compilo ne le fera pas pour toi. Si tu vas taper dans *pt, à toi de t'assurer que t'as bien écrit auparavant pt=<adresse correcte> car, encore une fois, le compilo te laisse maitre de ton destin. Mais dans ce cas, tu n'auras jamais de "mauvaises surprises"...

    Citation Envoyé par nawal.02 Voir le message
    exacte, personnellement j'avais un problème avec free(), le programme beuguais sans définir l'origine du problème
    Dans mon 3° exemple où je récupère l'adresse des chaines "en dur", tu remarqueras que je n'ai pas mis de free !!! (ni dans mon 2° exemple d'ailleurs où j'utilise MAXPATHLEN).
    Pour simplifier: on en met du free que s'il y a eu du malloc (ou calloc ou realloc).
    Accessoirement, tu peux quand-même demander un free(pt) même si pt=NULL. Ce cas a été prévu. C'est pour ça que certains conseillent de toujours initialiser systématiquement ses pointeurs à NULL. Perso je considère que cette systématisation est inutile quand on acquiert une certaine expérience qui permet de connaitre en permanence l'état de ses pointeurs mais quand on débute, ça peut éviter certains ennuis...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Sve@r :
    Envoyé par cinemania
    ah petit détail un free sur un pointeur qui pointe vers une chaine "litérale" définie textuellement dans la fonction, ne sert à rien... il ne fait rien.

    en effet, cette chaine est allouée dans le cadre de pile de la fonction, et est donc nettoyée automatiquement quand on quitte la fonction... le free ne peut donc pas nettoyer cette zone, car elle n'a pas été allouée dynamiquement.
    T'es sûr que la zone est nettoyée ? J'ai toujours eu l'impression qu'une chaine littérale était définie en tant que "static" et qu'elle était donc conservée entre les appels de la fonction...
    Et tu as raison !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  17. #17
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Dans mon 3° exemple où je récupère l'adresse des chaines "en dur", tu remarqueras que je n'ai pas mis de free !!! (ni dans mon 2° exemple d'ailleurs où j'utilise MAXPATHLEN).
    Oui j'ai suivi votre exemple, et ça marhe trés bien, a part MAXPATHLEN comme je l'ai deja mentionner plus haut.
    Je vais verifier encore une fois mon programme, peut etre comme vous l'avez dit l'erreur est ailleurs.

    Merci a tous, grâce a vous je comprend mieux l'allocation dynamique de mémoire

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nawal.02 Voir le message
    Oui j'ai suivi votre exemple, et ça marhe trés bien, a part MAXPATHLEN comme je l'ai deja mentionner plus haut.
    Il semblerait que cette macro MAXPATHLEN ne sois pas connue dans le monde zindow. C'est ce qu'il me semble en lisant cette page http://www.gtk.org/api/2.6/glib/glib...Functions.html

    A ton niveau, c'est pas bien grave. Simplement au lieu d'écrire char inFile[MAXPATHLEN + 1] ben tu peux écrire char inFile[1024]. Il serait en effet assez malheureux que tu aies un nom de fichier qui dépasse les 1024 caractères. D'ailleurs le lien mentionné plus haut propose cette solution...

    Citation Envoyé par nawal.02 Voir le message
    Merci a tous, grâce a vous je comprend mieux l'allocation dynamique de mémoire
    Tant mieux. Ensuite, ce qu'il faut comprendre, c'est qu'il faut parfois savoir envisager certains compromis entre les solutions possibles...
    Par exemple, pour ton problème, ta solution initiale était de
    1) calculer la taille nécessaire pour stocker la chaine
    2) allouer cette taille
    3) travailler sur la chaine
    4) libérer la zone allouée

    Ensuite tu te rends compte qu'il y a une solution alternative qui est de
    1) définir une taille "estimée" suffisante
    2) travailler sur la chaine

    Chacune des deux solutions aura des avantages et des inconvénients. Dans la première, l'allocation est toujours consommatrice de ressources. De plus, il te faut gérer les problèmes possibles d'allocation. Dans la seconde, tu as toujours le risque de n'avoir pas prévu suffisament

    Bref rien n'est jamais tout blanc ou tout noir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup Sve@r

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découper string en fonction de position avec strncpy
    Par ceinpap dans le forum Débuter
    Réponses: 4
    Dernier message: 20/06/2012, 17h30
  2. utilisation fonction strncpy
    Par john123 dans le forum C
    Réponses: 7
    Dernier message: 16/10/2007, 21h30
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo