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 :

Retourner un tableau d'entiers


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut Retourner un tableau d'entiers
    Bonjour à tous,
    ça va faire une bonne semaine que je me casse la tête sur un projet pour l'école, je dois envoyer 3 tableaux en paramètre à une fonction et retourner un tableau mais je suis complètement bloqué... Ce code ci-dessous ne fait pas partie de mon projet mais si je sais envoyer 1 tableau et en récupérer 1, je saurai en envoyer 3. Bref ce code devrait m'afficher :
    0
    1
    2
    ...
    9


    mais à la place j'ai ceci :
    0
    -858993460
    -858993460
    -858993460
    ....

    voici le 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
    #include <cv.h>
    #include <highgui.h>
    #include <time.h>
    #include <stdio.h>
     
    int initialiser_tab(int * ptr, size_t n_elements)
    {
        size_t i;
     
        for(i = 0; i < n_elements; i++)
    	{
            ptr[i] = (int)i;
    	}
    	return *ptr;
    }
     
    int main(void)
    {
        int t[10];
    	int result[10];
     
        size_t i, n_elements = sizeof(t) / sizeof(t[0]);
     
        *result = initialiser_tab(t, n_elements);
     
        for(i = 0; i < n_elements; i++)
    	{
    		printf("%d\n", result[i]);
    	}
     
        system("PAUSE");
        return 0;
    }

    Je sais que d'autres méthodes existent pour en arriver à ce résultat mais j'ai absolument besoin de retourner un tableau pour la suite car ceci n'est qu'un bête bout de code je ne l'utiliserai même pas car si je peux retourner un tableau je saurai finir mon projet.

    D'avance merci pour vos avis, réactions, conseils.

    PS : je sais qu'il est impossible d'envoyer ou de retourner un tableau mais cela se fait par le pointeur qui pointe vers le 1er élément de ce tableau. Mais bon je suis quand même un peu perdu. Et ne faites pas attentions aux includes c'est pour mon projet.

  2. #2
    Membre Expert
    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
    Par défaut
    Salut

    Dans ton code, tu remplis un tableau mais tu affiches le contenu du second, qui n'a pas été initialisé, donc ça affiche effectivement n'importe quoi. Seul le premier élément du second tableau a été initialisé... avec la valeur du premier élément du premier tableau. Le code n'est pas cohérent.

    Par contre il faudrait expliquer plus précisément :
    je dois envoyer 3 tableaux en paramètre à une fonction et retourner un tableau
    car c'est pas clair du tout.
    Que doivent contenir les trois tableaux et celui renvoyé ? (en C on ne peut pas renvoyer de tableau mais un pointeur)
    Quel rapport entre les trois tableaux et celui renvoyé ? La fonction est censée faire quoi ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    Je viens de remarquer que j'ai fais une petite erreur dans mon code précédent, ce n'est pas exactement ce que je souhaite. Pour plus de précisions sur ma fonction finale, je dois faire quelque chose qui ressemble à ça :

    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
     
    int traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem)
    {
         size_t = j;
         int resultat[nbr_elem];
     
         for(j = 0; j<nbr_elem; j++)
         {
              resultat[j] = ptr1[j] + ptr2[j] + ptr3[j];
         }
         return *resultat;
    }
     
    int main(void)
    {
         int t1[10];
         int t2[10];   // ces tableaux seront déjà rempli
         int t3[10];
     
         int resultat_final[10];
     
        size_t i, n_elements = sizeof(t1) / sizeof(t1[0]);
     
        *resultat_final = traitement(t1,t2,t3, n_elements);
     
        for(i = 0; i < n_elements; i++)
    	{
    		printf("%d\n", resultat_final[i]);
    	}
     
    }
    Je suis vraiment désolé pour le manque de précision du précédent message mais hier soir après la sale journée que je me suis tapé j'ai presque du me forcer à poster mais bon que je suis à la bourre donc l'un dans l'autre je suis dos au mur la

  4. #4
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par lepetitdeveloppeur Voir le message
    Je viens de remarquer que j'ai fais une petite erreur dans mon code précédent, ce n'est pas exactement ce que je souhaite. Pour plus de précisions sur ma fonction finale, je dois faire quelque chose qui ressemble à ça :

    .....

    Je suis vraiment désolé pour le manque de précision du précédent message mais hier soir après la sale journée que je me suis tapé j'ai presque du me forcer à poster mais bon que je suis à la bourre donc l'un dans l'autre je suis dos au mur la
    Tu connais ton problème, mais nous pas du tout.
    Tu devrais décrire précisément ce que tu veux faire : "faire quelque chose qui ressemble à ça" n'est pas suffisant pour obtenir des réponses pertinentes.
    Tu perds du temps (et apparemment tu n'en as pas de trop) et tu en fais perdre aux autres qui essayent de deviner ce que tu veux faire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    Citation Envoyé par diogene Voir le message
    Tu connais ton problème, mais nous pas du tout.
    Tu devrais décrire précisément ce que tu veux faire : "faire quelque chose qui ressemble à ça" n'est pas suffisant pour obtenir des réponses pertinentes.
    Tu perds du temps (et apparemment tu n'en as pas de trop) et tu en fais perdre aux autres qui essayent de deviner ce que tu veux faire.
    En fait le problème réside dans le return du tableau, le traitement de la fonction importe peu je n'aurai aucun mal à l'adapter.

    Mais si vous voulez encore plus de précisions, je récupère les valeurs (RVB en int) d'une image que je stock dans 3 tableaux à 1 dimension.
    Je souhaite envoyer ces 3 tableaux à une fonction imgnvg pour les traiter et transformer l'image en niveau de gris (donc en gros gris = (rouge+vert+bleu) /3). J'ai donc besoin de renvoyer ce tableau contenant les int pour l'image en niveau de gris.

    PS : j'ai absolument besoin d'utiliser cette méthode .

  6. #6
    Membre Expert
    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
    Par défaut
    Citation Envoyé par lepetitdeveloppeur Voir le message
    Mais si vous voulez encore plus de précisions, je récupère les valeurs (RVB en int) d'une image que je stock dans 3 tableaux à 1 dimension.
    Je souhaite envoyer ces 3 tableaux à une fonction imgnvg pour les traiter et transformer l'image en niveau de gris (donc en gros gris = (rouge+vert+bleu) /3). J'ai donc besoin de renvoyer ce tableau contenant les int pour l'image en niveau de gris.PS : j'ai absolument besoin d'utiliser cette méthode .
    Il suffit de créer, dans la fonction, un tableau dynamique, de le remplir, puis de renvoyer son adresse.

    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
    int * cree_tableau_niveau_gris(int * tableau_composante_rouge , int * tableau_composante_verte , int * tableau_composante_bleue , size_t nombre_pixels)
    {
    	int * tableau_niveau_gris = malloc(nombre_pixels * sizeof *tableau_niveau_gris);
    	if (tableau_niveau_gris != NULL)
    	{
    		/* remplissage tableau */
    	}
    	return tableau_niveau_gris;
    }
     
    ... fonction_quelconque(...)
    {
    	int * tableau_niveau_gris;
     
    	/* tableau_composante_rouge , tableau_composante_verte , tableau_composante_bleue sont des tableaux (dynamiques de préférence), chacun composés de 'nombre_pixels' éléments */
     
    	...
     
    	tableau_niveau_gris = cree_tableau_niveau_gris(tableau_composante_rouge , tableau_composante_verte , tableau_composante_bleue , nombre_pixels);
    	if (tableau_niveau_gris != NULL )
    	{
    		...
    	}
     
    	...
    }
    N'oublie pas de libérer la mémoire avec free lorsque tu n'as plus besoin de ton tableau de niveau de gris, ainsi que les autres s'ils sont également dynamiques.

    donc en gros gris = (rouge+vert+bleu) /3
    On utilise généralement cette équation :
    Y = R * 0,299 + G * 0,587 + B * 0,114

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    D'abord la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem)
    Plusieurs choses :
    1. Quand on doit retourner un tableau, retourner un "int" est plutôt maladroit. Deux solutions plus propres sont : retourner un pointeur vers le tableau instancié dynamiquement, ou remplir un tableau résultat passé en paramètre (et initialisé correctement au prélable)
    Donc voici les signatures des deux fonctions possibles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Résultat dans le retour de la fonction
    int* traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem);
    // Résultat dans le pointeur "result" des paramètres
    void traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem, int* result);
    2. Ce que tu retournes pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem) {
       // [...]
       int resultat[nbr_elem];
       // [...]
       return *resultat;
    }
    Dans ton cas tu retournes un variable locale... Donc une fois sortie de la fonction, la variable n'existe plus...

    Enfin dans ton main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int resultat_final[10];
    // [...]
    *resultat_final = addition(t1,t2,t3, n_elements);
    La dernière ligne signifie que tu écris le retour de la fonction addition (ie. ici en entier) à l'endroit pointé par resultat_final, ou autrement dit tu ne modifies que resultat_final[0]...

  8. #8
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Fabllot Voir le message
    2. Ce que tu retournes pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int traitement(int * ptr1, int * ptr2, int * ptr3, size_t nbr_elem) {
       // [...]
       int resultat[nbr_elem];
       // [...]
       return *resultat;
    }
    Dans ton cas tu retournes un variable locale... Donc une fois sortie de la fonction, la variable n'existe plus...
    Non, là la fonction renvoie la valeur du premier élément du tableau (un entier). Par contre, si la fonction renvoyait l'adresse du premier élément du tableau, ça poserait effectivement un gros soucis (vu qu'il s'agit d'un tableau local non statique).

    Le vrai soucis ici c'est que la fonction renvoie la valeur du premier élément, ce qui n'a pas de sens pour cette fonction-là.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/05/2008, 08h02
  2. Retourner un tableau d'entier
    Par theotaki dans le forum C
    Réponses: 2
    Dernier message: 11/04/2008, 14h26
  3. fonction retournant un tableau entier
    Par ninours23 dans le forum C
    Réponses: 11
    Dernier message: 04/02/2008, 16h35
  4. Retourner un tableau d'entier avec une fonction ?
    Par Seb33300 dans le forum C++
    Réponses: 10
    Dernier message: 05/04/2007, 16h25
  5. Réponses: 6
    Dernier message: 22/09/2006, 18h17

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