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 :

probleme avec un return


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut probleme avec un return
    Voici mon code :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_PIECE 5
    #define NB_PIECE_MAX 30
    #define ZERO 48
    #define UN 49
    #define X_MAJ 88
    #define ESPACE 32
     
    char **piece_fichier ()
    {
        FILE *ptr_piece;
        int i , j , num_piece = 0;
        char ligne_piece [TAILLE_PIECE];
        char piece [NB_PIECE_MAX] [TAILLE_PIECE];
        ptr_piece = fopen ("piece.txt", "r");
        while (!feof (ptr_piece))
    	{
    	    fgets (ligne_piece, sizeof (ligne_piece), ptr_piece);
     
    	    for (i=0 ; i<TAILLE_PIECE-1 ; i++)
    	    {
        		if (ligne_piece [i] == ZERO)
        		{
        		    piece [num_piece] [i] = ESPACE;
        		}
        		else if (ligne_piece [i] == UN)
        		{
        		    piece [num_piece] [i] = X_MAJ;
        		}
     
    	    }
    	    num_piece ++;
    	}
    	for (j = 0 ; j < NB_PIECE_MAX-1 ; j++)
    	{
    		piece [j] [TAILLE_PIECE-1] = 0;
    	}
    	return piece;   erreur : 41 I:\piece_fichier.c [Warning] return from incompatible pointer type
                                erreur : 41 I:\piece_fichier.c [Warning] function returns address of local variable
    }
     
    int main ()
    {
        char piece_retour [NB_PIECE_MAX] [TAILLE_PIECE];
        int j;
     
        piece_retour = piece_fichier ();   erreur : 49 I:\piece_fichier.c incompatible types in assignment
        for (j = 0 ; j < NB_PIECE_MAX-1 ; j++)
        {
            printf ("%s\n" , piece_retour [j]);
        }
        return 0;
    }
    Si quelqu'un pouvait me dire comment faire pour que je puisse retourner le tableau de chaine de caractère dans le main. merci d'avance.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Allez, c'est mon jour de bonte... :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    char **piece_fichier (int Nb, int Taille, int *NbReel)
    {
        FILE *ptr_piece=NULL;
        char **piece = NULL ;
        int i , j , num_piece = 0;
        char *ligne_piece=NULL;
     
        *NbReel = 0 ;
        ligne_piece = calloc ( (Taille+1), 1 );
        if ( ligne_piece == NULL )
           return NULL ;
        piece = calloc ( Nb, sizeof(char *) );
        if ( piece == NULL )
        {
           free(ligne_piece);
           return piece ;
        }
        for ( i = 0 ; i < Nb ; i++ )
          {
             piece[i] = calloc ( (Taille+1), 1);
             if ( piece[i] == NULL )
              {
                  if ( i != 0 )
                    for ( j = (i-1) ; j >= 0 ; j-- )
                      free(piece[j]);
                  free(piece);
                  free(ligne_piece);
                  piece = NULL ;
                  return piece ; 
              }
          }
     
        ptr_piece = fopen ("piece.txt", "r");
        if ( ptr_piece != NULL )
          {
              if ( fgets (ligne_piece, Taille, ptr_piece) != NULL )
                 {
                     for (i=0 ; i<Taille ; i++)
                     {
                        if (ligne_piece [i] == ZERO)
                        {
                           piece [num_piece] [i] = ESPACE;
                        }
                        else if (ligne_piece [i] == UN)
                        {
        	          piece [num_piece] [i] = X_MAJ;
                        }
                    num_piece ++;
                 }
            }
        }
     
        free(ligne_piece);
        *NbReel = num_piece ;
        return piece;
    }
     
    int main ()
    {
        char **piece_retour=NULL;
        int j, NbReel;
     
        if ( (piece_retour = piece_fichier (NB_PIECE_MAX, TAILLE_PIECE, &NbReel)) != NULL )
        {
           for (j = 0 ; j < NbReel ; j++)
             {
               printf ("%s\n" , piece_retour [j]);
             }
     
          /* liberation */
          for (j = (NB_PIECE_MAX-1) ; j >= 0 ; j--)
             free(piece_retour[j]);
          free(piece_retour);
        }
     
        return 0;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    oula. ça va être chaud patate à comprendre mai je vais m'y atteler.
    Sinon il n'y avait vraiment pas moyen en changeant assez peu mon code d'y arriver?
    merci beaucoup en tout cas.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben je fais quasi la meme chose, sauf que pour retourner une variable locale, la seule chose qui aie une valeur a l'exterieur est un pointeur.... pointant sur une zone allouee...


    Donc, au lieu de tenter de manipuler( avec insucces prevu) un tableaud etaille fixe, je passe les parametres de dimensions a la routine qui alloue a la bonne dimension, c'est tout...

  5. #5
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    tu alloues la mémoire pour ton tableau dans ton main, donc autant donner ce tableau en paramètre de ta fonction, plutôt que d'en définir un autre

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_PIECE 5
    #define NB_PIECE_MAX 30
    #define ZERO 48
    #define UN 49
    #define X_MAJ 88
    #define ESPACE 32
     
    void piece_fichier (char piece[NB_PIECE_MAX][TAILLE_PIECE])
    {
        FILE *ptr_piece;
        int i , j , num_piece = 0;
        char ligne_piece [TAILLE_PIECE];
        ptr_piece = fopen ("piece.txt", "r");
        while (!feof (ptr_piece))
    	{
    	    fgets (ligne_piece, sizeof (ligne_piece), ptr_piece);
     
    	    for (i=0 ; i<TAILLE_PIECE-1 ; i++)
    	    {
        		if (ligne_piece [i] == ZERO)
        		{
        		    piece [num_piece] [i] = ESPACE;
        		}
        		else if (ligne_piece [i] == UN)
        		{
        		    piece [num_piece] [i] = X_MAJ;
        		}
     
    	    }
    	    num_piece ++;
    	}
    	for (j = 0 ; j < NB_PIECE_MAX-1 ; j++)
    	{
    		piece [j] [TAILLE_PIECE-1] = 0;
    	}
    }
     
    int main ()
    {
        char piece_retour [NB_PIECE_MAX] [TAILLE_PIECE];
        int j;
     
        piece_fichier (piece_retour);
        for (j = 0 ; j < NB_PIECE_MAX-1 ; j++)
        {
            printf ("%s\n" , piece_retour [j]);
        }
        return 0;
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2011, 13h32
  2. probleme avec un return
    Par Kobe70 dans le forum Langage
    Réponses: 7
    Dernier message: 02/06/2007, 20h16
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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