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 :

pointeur tableau arg fonction


Sujet :

C

  1. #1
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut pointeur tableau arg fonction
    Bonsoir,

    Je poste car ca fait une heure que je galère dessus sans avancer.

    Voici, en substance, mon code (j'ai supprimé de nombreuses ligne de code pour le rendre plus lisible) :

    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
    typedef struct bille bille;
    struct bille
    {
        double accel;
        double vx;
     
    };
     
    void CreationBille (bille *uneBille, int posInitX, int posInitY);
    void DeplacerBille(bille *uneBille, bille *adTabBille, indexBille);
     
    int main(int argc, char *argv[])
    {
        ...
        int i = 0, max_billes = 10;
     
        bille billes[max_billes];
     
        for(i = 0; i < max_billes; i++){
            CreationBille(&(billes[i]));
        }
     
        int tempsPrecedent = 0, tempsActuel = 0;
        int continuer = 1;
        while (continuer)
        {
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0;
                        break;
     
                    case SDL_KEYDOWN:
                        switch (event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE:
                                continuer = 0;
                                break;
                            default:
                                break;
                        }
                        break;
                }
     
     
     
            tempsActuel = SDL_GetTicks();
            if (1000 / FPS < tempsActuel - tempsPrecedent) //timer
            {
     
                for(i = 0; i < max_billes; i++){
                    DeplacerBille(&(billes[i]), &(billes), i); 
                }
     
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 105, 105, 105));
                SDL_BlitSurface(vaisseau1.image, NULL, ecran, &(vaisseau1.position));
                for(i = 0; i < max_billes; i++){
                    SDL_BlitSurface(billes[i].image, NULL, ecran, &(billes[i].position));
                }
     
                SDL_Flip(ecran);
     
                tempsPrecedent = tempsActuel;
             }else /* Si ça fait moins de 1000/FPS depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
            {
                SDL_Delay(1000/FPS - (tempsActuel - tempsPrecedent));
            }
     
     
        }
     
        for(i = 0; i < max_billes; i++){
            DestructionBille (&(billes[i]));
        }
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
     
     
    void CreationBille (bille *uneBille)
    {
        uneBille->vmax = 5;
        uneBille->vx = uneBille->vmax;
     
        SDL_Surface *temporaire = SDL_LoadBMP("truc.jpg");
        if (temporaire == NULL)
        {
            printf("Echec lors du chargement de l'image d'une bille dans InitialiserBille : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
        uneBille->image = SDL_DisplayFormat(temporaire);
        SDL_FreeSurface(temporaire); //mémoire libérée
        SDL_SetColorKey(uneBille->image, SDL_SRCCOLORKEY, SDL_MapRGB(uneBille->image->format, 105, 105, 105)); //rend transparent l'arrière-plan de la bille
     
        uneBille->position.x = 50;
        uneBille->position.y = 50;
     
    }
     
    void DeplacerBille(bille *uneBille, bille *adTabBille, indexBille) //, vaisseau unVaisseau
    {
     
        int i = 0;
     
     
     
    }
    Voilà ce qui m'intéresse dans ma fonction déplacer bille c'est, en fonction du pointeur de la bille en premier argument, de récupérer les pointeurs respectifs des autres billes (autres index du tableau billes[]) pour faire des tests de collision (Aïe la physique !). Je dois donc faire passer le pointeur du tableau (2nd argument).

    Mais là où ça se corse

    c'est que si je met dans cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(index == 1)
        {
                printf("%d__", uneBille);
                printf("%d\n", adTabBille[1]);
     
        }
    Ces printf ne renvoient pas la même adresse (??). A votre avis c'est dû à quoi ?

  2. #2
    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
    Ton code est bizarre (ou trop simplifié pour l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void DeplacerBille(bille *uneBille, bille *adTabBille, indexBille);
    ....
    bille billes[max_billes];
    ....
    DeplacerBille(&(billes[i]), &(billes), i);
    Ces paramètres sont redondants et incorrect pour le deuxième :

    - &(billes) n'est pas du type bille * mais du type bille (*)[10]. Je suppose que tu voulais passer l'adresse du début du tableau billes (tu devrais avoir un warning à ce sujet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DeplacerBille(&(billes[i]), billes, i);
    Ce n'est pas la cause de ce que tu observes.

    - puisque tu passes l'adresse de début du tableau et l'indice i, il ne sert à rien de passer aussi l'adresse de billes[i] : &billes[i] autrement dit billes+i. La fonction peut très bien la déterminer toute seule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(index == 1)
        {
                printf("%d__", uneBille);
                printf("%d\n", adTabBille[1]);
     
        }
    Je suppose que index est en fait indexBille

    Pour ta fonction,

    - uneBille est une adresse (type bille *) égale en l'occurence à billes+1.

    - adTabBille est égale (malgré le mauvais type d'appel) à billes et a pris le type (forcé) bille *. adTabBille[1] est donc du type bille et vaut *(billes+1)

    Si tu préfères, uneBille est égal à &adTabBille[1]

    Les deux ne sont pas la même chose !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Merci,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void DeplacerBille(bille *uneBille, bille (*)[10] adTabBille, vaisseau unVaisseau, int index, int indexMax);
    Le type que tu me conseilles ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i = 0; i < max_billes; i++){
                    DeplacerBille(&(billes[i]), &(billes), i); 
                }
    Tu as raison je me contenterai de n'utiliser que le 2nd et 3e paramètre, à condition bien sûr d'arriver à manipuler les index d'un tableau de pointeurs sur le tableau billes[]...

    Peux tu me montrer stp comment rédiger le prototype et l'appel de fonction pour pouvoir faire ce que je veux ? J'avoue que là c'est assez confu dans ma tête et pourtant je pense maîtriser les bases concernants les pointeurs

    Edit : Ah je crois avoir compris : le tableau bille à pour valeur l'adresse du premier index du tableau, inutile donc de le typer en pointeur. Alors que billes[i]) a pour valeur une instance d'une structure (ici bille). J'ai bon ?

  4. #4
    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
    Edit : Ah je crois avoir compris : le tableau bille à pour valeur l'adresse du premier index du tableau, inutile donc de le typer en pointeur. Alors que billes[i]) a pour valeur une instance d'une structure (ici bille). J'ai bon ?
    Plutôt l'adresse du premier élément (d'indice 0). D'autre part, tu ne le types pas en pointeur (ce qui reviendrait à écrire (nouveau_type) billes et non & billes).

    Sinon, à part ces menus détails de rédaction, je pense qu'on est d'accord sur l'idée.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

Discussions similaires

  1. pointeur de tableau pour fonction void
    Par giovedy dans le forum C
    Réponses: 4
    Dernier message: 01/08/2012, 18h18
  2. pointeur tableau et fonction
    Par tenderstoune dans le forum C
    Réponses: 15
    Dernier message: 02/11/2007, 13h45
  3. Passage de tableau à une fonction par pointeur
    Par progfou dans le forum C++
    Réponses: 15
    Dernier message: 23/02/2007, 11h45
  4. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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