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 :

recuperer un tableau d'une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut recuperer un tableau d'une fonction
    Bonsoir,

    Ayant beaucoup de mal avec les pointeurs (malgrè la doc sur le net) et ne trouvant pas comment faire, je vous pose la question.

    J'ai une fonction qui recoit un tableau en parametre, qui fait des manipulation dessus et qui doit le retourné mais je n'y arrive pas.

    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
    int tabCaract[8];
    for(j=0;j<4;j++)
      {
    *tabCaract = encodage(tabCaract);
      }
     
     
    int encodage(int caractere[8])
      {
      int binaire1[4],binaire2[4],final[8],d0[4],d1[4],i;
     
      // on sépare en 2 blocque de 4
      for(i=0;i<4;i++)
        {
        binaire1[i]=caractere[i];
        binaire2[i]=final[i]=caractere[i+4];
        }
     
      // on inverse selon la clé (2143)
      d0[0]=binaire2[1];
      d0[1]=binaire2[0];
      d0[2]=binaire2[3];
      d0[3]=binaire2[2];
     
      // on fais le XOR
      d1[0] = binaire1[0]+d0[0];
      d1[1] = binaire1[1]+d0[1];
      d1[2] = binaire1[2]+d0[2];
      d1[3] = binaire1[3]+d0[3];
     
      for(i=0;i<4;i++)
        {
        if(d1[i]==2)
          d1[i]=0;
        }
     
      //on complete la fin
      final[4]=d1[0];
      final[5]=d1[1];
      final[6]=d1[2];
      final[7]=d1[3];
     
      return ( final);
      }
    le tableau passé en paramétre est de cette forme :{0,1,1,0,1,1,1,0} et ma fonction fait bien ce quelle doit faire.

    Je doit appliquer 4 fois cette fonction sur le meme tableau pour crypter (tab->fonction->tab1->fonction->tab2->fonction->tab3->fonction->tab4)

    Mais je n'arrive pas a récupérer le tableau à la sortie de la fonction pour le repasser dedans.

    Je me doute que c'est un problème de pointeur mais je ne trouve pas.

    Merci d'avance

    Nixonne

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nixonne
    Voici mon code:
    Ton code ne compile pas. Il est incomplet.

    Même si c'est techniquement possible, retourner l'adresse d'une variable locale n'a aucun sens.

    Soit on passe l'adresse du premier élément du tableau à la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      T a[N];
     
      f (a, N);
    avec
    ou
    (idem)
    soit on retourne l'adresse d'un bloc alloué dynamiquement avec malloc().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      T *p = f();
     
      if (p != NULL)
      {
          /* utilisation. Penser a liberer proprement... */
      }
    avec

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ton code ne compile pas. Il est incomplet.
    Ceci est normal, je n'ai pas mis tout le code de mon programme mais juste ce qui me pose problème

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par nixonne
    Ceci est normal, je n'ai pas mis tout le code de mon programme mais juste ce qui me pose problème

    peut etre mais si tu veux de l'aide, il faut faire des efforts
    et donc fournir un code qui compil!

  5. #5
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binaire2[i]=final[i]=caractere[i+4];
    c'est quoi ca ????



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    binaire2[i]=caractere[i+4];
    final[i]=caractere[i+4];

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut
    Citation Envoyé par kamouminator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binaire2[i]=final[i]=caractere[i+4];
    c'est quoi ca ????



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    binaire2[i]=caractere[i+4];
    final[i]=caractere[i+4];
    C'est pour faire le codage lucifer.

    ca fais en 1 ligne ce que tu a mis en 2

  7. #7
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    on ne passe pas un tableau en argument mais son adresse !
    donc par ex, au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int encodage(int caractere[8])
    il faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int encodage(int * caractere)
    et quand tu appel cette fontion, tu le fais de cette maniere (pour un tableau appelé tab[]:

    SANS LES CROCHETS ! tab represente l'adresse de tab[0]

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut
    ok, pour le passage de mon tableau mais je ne le récupere toujours pas bien en sortie de fonction.

    Comment faire?

    Merci d'avance

    Nixonne

  9. #9
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Emanuel Delahaye te l'as expliqué plus haut !

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut
    Citation Envoyé par kamouminator
    Emanuel Delahaye te l'as expliqué plus haut !
    Je ne l'avais pas lu et je n'ai pas tout compris non plus a vrai dire

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nixonne
    Je ne l'avais pas lu et je n'ai pas tout compris non plus a vrai dire
    Dans ce cas il faut poser des questions et faire des essais. Ce sont les bases. Si on ne les maitrise pas, inutile de vouloir faire autre chose.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nixonne
    ok, pour le passage de mon tableau mais je ne le récupere toujours pas bien en sortie de fonction.

    Comment faire?
    Tu relis ça.

    http://www.developpez.net/forums/sho...48&postcount=2

    et tu fais des essais sur du code simple. Il faut traiter un problème à la fois, c'est déjà assez compliqué comme ça...

    Si tu as des problème, poste ce code (complet).

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Par défaut
    j'ai relu ton post mais je n'y comprend toujours rien, c'est trop abstrait a mon avis.

    Voici mon code entier comme tu me l'a demandé

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
    #include <stdio.h>
    #include <string.h>
    //---------------------------------------------------------------------------
    #pragma argsused
     
    long filesize(FILE *stream);
     
     
    int main(int argc, char* argv[])
      {
      char* source=NULL;
      char* dest=NULL;
      char* option=NULL;
      char* final;
      char* temp=NULL;
      char ajout[2];
      unsigned char code=NULL;
      char resultat=NULL;
      FILE* fichierSource;
      FILE* fichierDest;
      int i,j,tabCaract[8],tabCaracte[8];
      long taille_fichier;
     
      // on vérifie qu'il y ait les 4 arguments
      if(argc!=4)
        {
        printf("il manque des arguements");
        return(0);
        }
      else
        {
        // récupération des arguments
        option = argv[1];
        source = argv[2];
        dest = argv[3];
     
        // ouverture et lecture du fichier source
        if(fichierSource = fopen(source, "r+"))
          {
          taille_fichier = filesize (fichierSource);
          temp=(char *)malloc(sizeof(char) * taille_fichier);
          final=(char *)malloc(sizeof(char) * taille_fichier);
          final="";
          fread (temp,1,taille_fichier,fichierSource);
          fclose(fichierSource);
          }
        // traitement du contenu
        for (i=0;i<taille_fichier;i++)
          {
          code = temp[i];
          // on passe le caractère en tableau de 8bits
          for(j=0;j<8;j++)
            {
            tabCaract[j] = (code>127?1:0) ;
            code<<=1;
            }
          // on code ou décode en fonction de l'option
          for(j=0;j<4;j++)
            {
            if(strcmp(option,"-c")==0)
              *tabCaract = encodage(tabCaract);
            if(strcmp(option,"-d")==0)
              decode(tabCaract);
            }
          //tab_caractere[nbcaractere++]=caractere;
     
          // on repase le résultat en caractère et on le stock
          resultat = (128*tabCaract[0])+(64*tabCaract[1])+(32*tabCaract[2])+(16*tabCaract[3])+(8*tabCaract[4])+(4*tabCaract[5])+(2*tabCaract[6])+(1*tabCaract[7]);
          ajout[0] = (char)resultat;
          ajout[1] = '\0';
          strcat(final, ajout);
          }
     
        //on enregistre dans le fichier de destination
        if(fichierDest=fopen(dest,"w")!=NULL)
          {
          fwrite(final,1,taille_fichier,fichierDest);
          fclose(fichierDest);
          }
        } // fin else
      return(0);
      }
     
    //*************************************
    //********** FONCTION ENCODE **********
    //*************************************
    int encodage(int * caractere)
      {
      int binaire1[4],binaire2[4],final[8],d0[4],d1[4],i;
     
      // on sépare en 2 blocque de 4
      for(i=0;i<4;i++)
        {
        binaire1[i]=caractere[i];
        binaire2[i]=final[i]=caractere[i+4];
        }
     
      // on inverse selon la clé
      d0[0]=binaire2[1];
      d0[1]=binaire2[0];
      d0[2]=binaire2[3];
      d0[3]=binaire2[2];
     
      // on fais le XOR
      d1[0] = binaire1[0]+d0[0];
      d1[1] = binaire1[1]+d0[1];
      d1[2] = binaire1[2]+d0[2];
      d1[3] = binaire1[3]+d0[3];
     
      for(i=0;i<4;i++)
        {
        if(d1[i]==2)
          d1[i]=0;
        }
     
      //on complete la fin
      final[4]=d1[0];
      final[5]=d1[1];
      final[6]=d1[2];
      final[7]=d1[3];
     
      return (final);
      }
     
    //*************************************
    //********** FONCTION ENCODE **********
    //*************************************
    int decode(int caractere[8])
      {
      int binaire1[4],binaire2[4],final[8],d0[4],g0[4],i;
     
      // on sépare en 2 blocque de 4
      for(i=0;i<4;i++)
        {
        binaire1[i]=final[i+4]=caractere[i];
        binaire2[i]=caractere[i+4];
        }
     
      // on inverse selon la clé
      d0[0]=binaire1[1];
      d0[1]=binaire1[0];
      d0[2]=binaire1[3];
      d0[3]=binaire1[2];
     
      // on fais le XOR
      final[0] = binaire2[0]+d0[0];
      final[1] = binaire2[1]+d0[1];
      final[2] = binaire2[2]+d0[2];
      final[3] = binaire2[3]+d0[3];
     
      for(i=0;i<4;i++)
        {
        if(final[i]==2)
          final[i]=0;
        }
      return final;
      }
    //---------------------------------------------------------------------------
    long filesize(FILE *stream)
    {
       long curpos, length;
     
       curpos = ftell(stream);
       fseek(stream, 0L, SEEK_END);
       length = ftell(stream);
       fseek(stream, curpos, SEEK_SET);
       return length;
     
    }
    Nixonne

    PS : mon tableau aura toujours 8 case car il représente les 8 bits d'un cqractère

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nixonne
    j'ai relu ton post mais je n'y comprend toujours rien, c'est trop abstrait a mon avis.
    Alors précise ta question parce que "je n'y comprend toujours rien, c'est trop abstrait", ça ne fait pas avancer.

    Quels sont les mots, expressions, phrases ou concepts que tu ne comprends pas ?

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nixonne
    Voici mon code entier comme tu me l'a demandé
    Y'a du boulot, comme commencer par regler son compilateur correctement...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:3: warning: ignoring #pragma hdrstop 
    main.c:7: warning: ignoring #pragma argsused 
    main.c: In function `main':
    main.c:20: warning: initialization makes integer from pointer without a cast
    main.c:21: warning: initialization makes integer from pointer without a cast
    main.c:41: warning: suggest parentheses around assignment used as truth value
    main.c:44: warning: implicit declaration of function `malloc'
    main.c:46: warning: assignment discards qualifiers from pointer target type
    main.c:64: warning: implicit declaration of function `encodage'
    main.c:66: warning: implicit declaration of function `decode'
    main.c:78: warning: assignment makes pointer from integer without a cast
    main.c:78: warning: suggest parentheses around assignment used as truth value
    main.c:24: warning: unused variable `tabCaracte'
    main.c: In function `encodage':
    main.c:125: warning: return makes integer from pointer without a cast
    main.c:125: warning: function returns address of local variable
    main.c: In function `decode':
    main.c:159: warning: return makes integer from pointer without a cast
    main.c:159: warning: function returns address of local variable
    main.c:133: warning: unused variable `g0'
    main.c: In function `main':
    main.c:17: warning: 'final' might be used uninitialized in this function
    main.c:25: warning: 'taille_fichier' might be used uninitialized in this function
    Linking console executable: C:\dev\forums2\console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 19 warnings

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kamouminator
    on ne passe pas un tableau en argument
    OK
    mais son adresse !
    Euh c'est rare et c'est gore....

    On se contente le plus souvent de passer l'adresse d'un élément du tableau (en général le premier, mais pas forcément), soit &a[0], qui s'écrit aussi a + 0 ou encore a dans un paramètre pointeur du même type qu'un élément du tableau, ce qui peut s'écrire T a[N], T a[] ou T *a. (sans parler du qualificateur const ...)
    donc par ex, au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int encodage(int caractere[8])
    il faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int encodage(int * caractere)
    Ben non. Les deux sont valides.

    http://emmanuel-delahaye.developpez.....htm#param_tab

  17. #17
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    OK
    On se contente le plus souvent de passer l'adresse d'un élément du tableau (en général le premier, mais pas forcément), soit &a[0], qui s'écrit aussi a + 0 ou encore a dans un paramètre pointeur du même type qu'un élément du tableau, ce qui peut s'écrire T a[N], T a[] ou T *a. (sans parler du qualificateur const ...)
    oui, dsl quand je disais l'adresse du tableau, je voulais dire l'adresse du premier element soit a (tab dans mon exemple)!

    mais en fait...je ne voi pas trop ce que serait alors l'adresse d'un tableau ?!

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kamouminator
    oui, dsl quand je disais l'adresse du tableau, je voulais dire l'adresse du premier element soit a (tab dans mon exemple)!

    mais en fait...je ne voi pas trop ce que serait alors l'adresse d'un tableau ?!
    Alors laisse tomber. C'est tordu et rarement utile. Tu verras ça quand tu seras grand !

  19. #19
    Invité de passage
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Par défaut recuperer un tableau d'une fonction

    j'espére bien que j'avais bien compris ton code.
    fais bien attention aux petits trucs d'innatention.
    Fichiers attachés Fichiers attachés
    • Type de fichier : cpp d.cpp (5,2 Ko, 49 affichages)

Discussions similaires

  1. Comment recuperer un tableau dans une fonction?
    Par Sunsawe dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/06/2009, 00h52
  2. Réponses: 8
    Dernier message: 14/11/2005, 11h27
  3. Passer le résultat (tableau) d'une fonction
    Par coyote90 dans le forum Access
    Réponses: 3
    Dernier message: 10/11/2005, 19h56
  4. Retourner un tableau depuis une fonction
    Par obalais dans le forum C++
    Réponses: 2
    Dernier message: 20/10/2005, 16h49
  5. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04

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