Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème pour retourner une chaîne de charactère.

Avec une fonction et un main

Sujet résolu
    18 juin 2021 à 20:49:23

    Bonjour ;

    J'ai un problème avec mon programme, qui doit calculer le réseau @hôte d'une adresse IP. Les étapes du programme sont :

    1- Additionner le masque et l'ip dans une variable "reseau" en binaire (en int)
    2- Convertir en décimal la variable "reseau" (en char[])
    3- Renvoyer la variable "reseau" dans main

    Bref, je suis à l'étape 1. Et pour voir que tout fonctionne, j'essaye actuellement de renvoyer la chaîne de charactère "reseau" qui contient l'addition binaire.

    Problème : Je n'y arrive pas malheureusement. Ça m'affiche le code d'erreur suivant :

    " returning 'char *' from a function with return type 'char' makes integer from without a cast [-Wint-conversion]
    33. return reseau; "

    Je me doute que c'est à cause du fait qu'on ne puisse pas renvoyer de tab de charactère comme ça (d'après mes recherches) mais je n'arrive pas à comprendre.

    Code :

    #include <stdio.h>
    #include <stdio.h>
    #include <string.h>
    
    char calcul(char* octet, char* masque);
    
    void main(){
        char octetB[]="11000000101010000000000100000111";
        char masqueB[]="11111111111111111111111100000000";
    
        printf("octetB : %s\n", octetB);
        printf("octetB 3e valeur : %c\n", octetB[2]);
    
        printf("Adresse réseau : %s\n", calcul(octetB, masqueB));
    }
    
    char calcul(char* octet, char* masque){
        int i;
        char reseau[100];
    
        printf("\n");
        printf("octet dans calcul : %s\n", octet);
        printf("masque dans calcul : %s\n", masque);
    
        for(i=0; i<32; i++){
            if((octet[i]='1') && (masque[i]='1')){
                reseau[i]='1';
            } else {
                reseau[i]='0';
            }
            printf("nombre %d : %d\n", i, reseau[i]);
        }
        return reseau;
    }

    Donc j'aimerais bien avoir de l'aide pour savoir où je me suis tromper ? Afin de comprendre. Merci :D
    (Je m'excuse si il y a des fautes d'orthographes)

    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2021 à 21:01:24

      Il semblerait que tu souhaites retourner une chaîne de caractère (tableau de char) dans ta fonction calcul, mais son prototype est censé ne retourner qu'un char donc ça ne colle pas.

      De plus tu ne peux pas retourner l'adresse de ton tableau de char reseau car c'est une variable locale à la fonction, qui par conséquent n'existe plus en dehors de la fonction !

      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2021 à 21:09:01

        rouloude a écrit:

        Il semblerait que tu souhaites retourner une chaîne de caractère (tableau de char) dans ta fonction calcul, mais son prototype est censé ne retourner qu'un char donc ça ne colle pas.

        De plus tu ne peux pas retourner l'adresse de ton tableau de char reseau car c'est une variable locale à la fonction, qui par conséquent n'existe plus en dehors de la fonction !

        Oui c'est ce qui semblait poser problème.

        Cela dit je ne sais pas à transmettre le tableau char "reseau" dans le main. J'ai essayé avec un appel de function sans return donc dans le void :

        calcul(octetB, masqueB, &reseau);

        Mais ça ne marchait pas non plus.


        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2021 à 21:30:54

          Oui, c'est une solution d'envoyer son adresse en paramètre du moins l'adresse de son premier élément (pas besoin de l'esperluette & pour envoyer l'adresse du premier élément d'un tableau à une fonction).

          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2021 à 21:37:51

            UP :

            J'ai finalement trouvé la solution !

            Voici donc le code actualisé :

            char* calcul(char* octet, char* masque){
                int i;
                char reseau[100];
            
                printf("\n");
                printf("octet dans calcul : %s\n", octet);
                printf("masque dans calcul : %s\n", masque);
            
                for(i=0; i<32; i++){
                    if((octet[i]=='1') && (masque[i]=='1')){
                        reseau[i]='1';
                    } else {
                        reseau[i]='0';
                    }
                    printf("nombre %d : %d\n", i, reseau[i]);
                }
                char* result = malloc(strlen(reseau)+1);
                strcpy(result, reseau);
                return result;
            }



            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2021 à 22:45:24

              L'utilisation de malloc et aussi une solution.

              Mais pourquoi alors, ne pas allouer directement ton tableau reseau avec malloc ?

              PS : Tu penseras à rajouter le caractère de fin de chaîne à ta chaîne reseau pour en faire une vraie chaîne de caractère !

              -
              Edité par rouloude 18 juin 2021 à 23:14:51

              • Partager sur Facebook
              • Partager sur Twitter
                21 juin 2021 à 14:50:57

                Et n'oublie pas de libérer la mémoire allouée avec free()
                • Partager sur Facebook
                • Partager sur Twitter

                Problème pour retourner une chaîne de charactère.

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown