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 :

Matrices de structures ?


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Par défaut Matrices de structures ?
    Bonsoir,

    Pour un projet, je dois pouvoir simuler des voitures qui se déplacent sur une route.

    Dans le principe c'est relativement simple, il suffit de créer une matrice dans laquelle à l'aide de boucles et de conditions on analyse la matrice puis échange les cases, l'afficher quelques milisecondes, l'effacer (ou plutot effacer l'écran), et reboucler, ainsi, à l'instar un film, on affiche image par image la route qui évolue

    Le code sera peut être plus parlant

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    typedef char* String;  // une chaîne de caractères
    typedef String* Vecteur;  // une ligne (tableau 1d) de strings
    typedef Vecteur* Matrice; // un tableau 2d de strings
     
    void wait(int millisecondes);
     
    main(){
     
        /*----------initialisation MATRICE--------------*/
     
        int n = 40;
        int m = 100;
        int i, j, k; /*variable de boucles, pas besoin de definir dautres variables*/
        int rando;
        system("clear");
     
        Matrice mat=(Matrice) malloc(n*sizeof(Vecteur));
     
        for(i=0;i<n;i++){
          mat[i]=(Vecteur) malloc(m*sizeof(String));
        }
     
     
        for(i=0; i < n; i++){
                for(j=0; j < m; j++){
     
                    mat[i][j] =" ";
                }
        }
     
     
        for(i=0;i<40;i++){ /*NORD*/
          mat[i][40]="|";
          mat[i][42]="|";
          mat[i][44]="|";
          mat[i][45]="/";
          mat[i][46]="|";
          mat[i][48]="|";
          mat[i][50]="|";
        }
     
     
     
    /*animation route*/
     
        for(k=0; k<3000; k++){
     
    /*on efface les voitures en bout de route*/
        mat[39][41] = " ";
        mat[39][43] = " ";
     
     
                    /*APPARITION ALEATOIRE DES VOITURES */
     
            int nombre_aleatoire = 0;
            int rando = 0;
     
            while(rando==nombre_aleatoire){ /*force le programme random a choisir un nouveau nombre, sinon le meme ressort à l'infini*/
            nombre_aleatoire = rand()%5;
            }
     
            rando=nombre_aleatoire;
     
     
            switch(rando){
     
     
            case 0:
            mat[0][41] = "V";
            mat[0][43] = "V";
            break;
            case 1:
            mat[0][43] = "V";
            break;
            case 2:
            mat[0][41] = "V";
            break;
            }
     
            /*on dessine le rond point à l'état k*/
     
                for(i=0; i < n; i++){
                    for(j=0; j < m; j++){
     
                    printf("%s", mat[i][j]);
                    }
                    printf("\n");
                }
     
     
                /*ENTREE NORD*/
            for(i=39; i > 0; --i){
                if(mat[i-1][41] != " " && mat[i][41]==" "){
                    mat[i][41] = mat[i-1][41]; 
                    mat[i-1][41] = " ";
     
                }
            }
     
            for(i=39; i > 0; --i){
                if(mat[i-1][43] != " " && mat[i][43]==" "){
                    mat[i][43] = mat[i-1][43]; 
                    mat[i-1][43] = " ";
     
                }
        }
     
        wait(100);
        system("clear");
     
        }
     
    }
     
     
    void wait(int millisecondes)
    {
        clock_t start = clock();
        while ((clock() - start) * 1000 < millisecondes * CLOCKS_PER_SEC) ;
    }

    Bref, c'est juste un code réduit de mon projet pour illustrer le propos.

    A présent, j'aimerais "personnaliser" un peu plus les voitures, c'est à dire leur assigner une vitesse, voir un comportement.

    Et pour ca, une matrice de char c'est pas l'idéal ! J'avais d'abord penser à créer une matrice de matrice, c'est a dire une matrice 3d i j k ou la "3e dimension" k contiendrai des valeurs qualitative, tandis que i et j designe uniquement la position

    Mais en fait c'est assez lourd à manipuler, donc les structures semblent etre un meilleur choix

    Mais est l possible de definir une matrice de structures ? Quelque chose qui s'ecrirait

    Struct mat [i][j]

    avec la structure qui contiendrai un int pour la vitesse, un char pour l'état de la voiture, etc

    Je suis assez maladroit pour manipuler des structures, je pense avoir saisi l'idée mais par encore la syntaxe, je demande donc humblement votre aide

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour et bienvenue,

    Il est tout-à-fait possible de définir un tableau, même à plusieurs dimensions (ici 2, pour former ta matrice) dont le type soit une structure comme tu viens de l'écrire. Cela ne pose pas de problème algorithmique. Par contre, à l'usage, cela devient vite très gros. La taille du tableau augmente exponentiellement si tu fais croître tes deux dimensions simultanément, et cette taille doit être multipliée par celle d'une structure, qui elle-même peut contenir en plus des octets de padding. À chaque fois que tu veux déplacer une voiture dans ta grille, tu es obligé de copier une entrée (donc une structure entière) vers la cellule cible. C'est possible mais gourmand en mémoire et peu efficace.

    Tu auras mieux fait, à mon avis, d'utiliser un tableau linéaire (à une dimension) de voitures, qui te permettra d'en définir un nombre maximum fixe. Ensuite, tu ajoutes des coordonnées x et y à la structure « voiture ». Ainsi, quelle que soit la taille de ta grille, les ressources mises en jeu ne dépendront que du nombres de véhicules que tu souhaites simuler.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Par défaut
    Tout d'abord merci, j'espere bien être actif, c'est vrai qu'il s'agit de mon premier sujet

    Je tiens à préciser que mon projet et en fait un rond point, avec une apparition aléatoire des voitures, une sortie prédéfinie (donc il faut gérer la sortie à l'aide de tests), et je dois gérer les conflits (si il y a quelqu'un qui bloque la route alors attendre, j'aimerais aussi simuler des accidents) etc, peut être que ca t'aideras à comprendre la voie que j'ai prise

    Alors premièrement, ai je bien saisi ta solution ?

    ll faudrait que je crée une structure voiture de tableaux linéaire booléens, un tableau contenant le nombre maximal de type de voitures de taille n, un tableau x et un tableau y

    Dans le tableau voitures,il peut avoir 0 ou 1, si à i c'est 1 alors: si c'est le premier faire apparaître une voiture aléatoirement à x/y, afficher la matrice t secondes, l'effacer

    On retourne dans le tableau, on incremente x et y tant que x < n ou y < m, i = 1 et recommencer

    Donc si j'ai bien compris tu me propose de gérer une structure de tableau VOITURE et "d'algorithmer" dedans pour alléger la mémoire, c'est ca ?

    Et la complexité d'une telle méthode serait donc en n le nombre de voitures maximale, ce qui est plus efficace que ma méthode qui augmente en complexité en fonction de x et y la taille de ma matrice !

    Mais en y réfléchissant à 2 fois, le nombre maximale de voitures n'est qu'en fait x*y non ? Donc pour le cas limite la complexité est la même pour moi ?

    Après ca reste intéressant car la tienne est forcément moins complexe que la mienne, au pire des cas égale !

    Ca fera une bonne remarque pour mon rapport ca héhé, mais je ne comprends pas comment gérer une vitesse avec ta méthode par exemple

    Mais je ne suis vraiment pas sûr d'avoir compris ce que tu voulais me proposer alors j'attends ta réponse de confirmation d'abord :p

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Citation Envoyé par cptvancleef Voir le message
    Tout d'abord merci, j'espere bien être actif, c'est vrai qu'il s'agit de mon premier sujet

    Je tiens à préciser que mon projet et en fait un rond point, avec une apparition aléatoire des voitures, une sortie prédéfinie (donc il faut gérer la sortie à l'aide de tests), et je dois gérer les conflits (si il y a quelqu'un qui bloque la route alors attendre, j'aimerais aussi simuler des accidents) etc, peut être que ca t'aideras à comprendre la voie que j'ai prise
    Dans ce cas, il y a des chances que ton sujet soit le même qu'ici : http://www.developpez.net/forums/d15...leme-voitures/
    Je suppose que vous étudiez tous deux dans le même cours, donc.

    Alors premièrement, ai je bien saisi ta solution ?

    ll faudrait que je crée une structure voiture de tableaux linéaire booléens, un tableau contenant le nombre maximal de type de voitures de taille n, un tableau x et un tableau y
    Pas « un tableau x et un tableau y ». Une simple liste de voitures qui, elles, conservent chacune leur propre position dans leurs attributs. Maintenant, si ton problème est celui du rond-point, ce n'est pas forcément la meilleure approche non plus.

    Dans le tableau voitures,il peut avoir 0 ou 1, si à i c'est 1 alors: si c'est le premier faire apparaître une voiture aléatoirement à x/y, afficher la matrice t secondes, l'effacer

    On retourne dans le tableau, on incremente x et y tant que x < n ou y < m, i = 1 et recommencer
    Donc si j'ai bien compris tu me propose de gérer une structure de tableau VOITURE et "d'algorithmer" dedans pour alléger la mémoire, c'est ca ?

    Et la complexité d'une telle méthode serait donc en n le nombre de voitures maximale, ce qui est plus efficace que ma méthode qui augmente en complexité en fonction de x et y la taille de ma matrice !
    Oui, d'une part parce que ça ne sert à rien de gérer des cases vides pour rien et ensuite, parce que la seule chose qui nous intéresse en fin de compte est la manière dont les voitures vont circuler dans le rond point. Et en réalité, il s'agit d'une variante des problèmes classiques d'algorithmique : gérer les flux d'informations au travers de files (qui peuvent être en mémoire comme être des lignes de transmission) ou des buffers circulaires.

    Mais cela, en fait, n'est vrai que si l'on considère que ton rond point n'a qu'une seule voie et que les voitures se suivent forcément. Si le problème consiste réellement à modéliser un flux routier avec dépassements, accélérations, embouteillages et possibilité de chevauchement des voies, et que le travail consiste à trouver la meilleure forme possible au rond point, alors il peut être intéressant de replacer ça dans une grille. Quoi qu'il en soit, les voitures gérant leurs propres positions reste le plus intéressant.

    Mais en y réfléchissant à 2 fois, le nombre maximale de voitures n'est qu'en fait x*y non ? Donc pour le cas limite la complexité est la même pour moi ?
    Sauf que tes voitures doivent interagir avec leur environnement : donc soit tu te limites aux cases adjacentes et ça fait 8 cas à traiter par position (donc 8×x×y), soit tu étends ça à deux cases et tu en es déjà à 24 cas, soit tu considères que chaque voiture doit interagir avec toutes les autres (produit cartésien) et là, il faut les retrouver, donc associer chaque case de la grille à toutes les autres, soit (x×y)×(x×y). Pour une grille carrée de 100 pixels de cotés, cela ferait 100 millions de combinaisons à contrôler à chaque passage.

    Mais je ne suis vraiment pas sûr d'avoir compris ce que tu voulais me proposer alors j'attends ta réponse de confirmation d'abord :p
    En fait, il serait intéressant d'exposer clairement le sujet ici, de façon à ce que l'on puisse t'orienter vers la voie la plus appropriée.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Par défaut
    Bonsoir,

    pour commencer, le sujet du projet est de programmer un simulateur de rond point à 2 voies, c'est tout mais plus on rajoute des fonctionnalités, mieux c'est

    Ta méthode du tableau de voitures qui autogère sa position est en effet la meilleure méthode niveau ressources,mais elle est très différente de la mienne et je pense que je vais rester sur celle ci, bien que tes remarques soient très pertinentes, mais par exemple, lorsque tu dis que les voitures doivent interagir avec leur environnement et donc avec 8 cases, ce n'est pas vrai, en fait au vu de la structure de mon rond point à 2 voies, quel que soit la position d'une voiture, le programme n'aura qu'à analyser 2 cases (pour une voiture allant de bas en haut par exemple, il regarde la case directement en haut de la voiture ou en haut a gauche de la voiture, ce qui a derrière n'a aucune importance typiquement)

    Ce qui m'a poussé à simplement coder les portions de routes comme des tapis roulants est qu'une fois l'algorithme écrit, je n'ai plus qu' faire apparaitre les voitures aléatoirement au niveau des différents points de départs, et à gérer des point critiques de sorties

    Maintenant, je pense finir dans cette voie, mais quand j'aurais le temps j'essaierai de programmer le tableau voitures, c'est vrai que c'est une technique très intelligente

    Pour en revenir à mon problème initial, je ne vois vraiment pas comment définir une matrice de structure voiture(char direction (N S E W), int vitesse) telle que la matrice affiche le char direction en fait (le int vitesse sera utilisé dans les boucles, par exemple si case i non vide et case (i + vitesse vide) alors case (i + vitesse) = case i et case i = vide ), je ne sais pas si tu comprends bien mon problème...

    En fait je ne vis même pas commenter allouer de la mémoire pour une matrice de structure sans savoir la taille de ma structure, je ne sais pas qu'elle est la taille d'une strcture d'ailleurs !

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Pour connaître la taille d'une structure, tu le demandes au compilateur ;-)

    sizeof(mystruct) renvoie la taille de mystruct.

    Sans parler de la question de la mémoire, je pense que ton modèle va être rapidement dépassé lorsque tu vas devoir rajouter des sorties, des priorités, des vitesses, un risque d'accident... Tu devrais explorer les techniques proposées par Obsidian, ce serait très formateur.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    L'idée générale c'est que tu as un environnement et des agents qui reçoivent des perceptions et font des actions, donc un boucle générale du type (en pseudo-code):

    tant qu'il y a des agents:
    trouver l'agent prioritaire
    percept p = visionAgent(agent, environnement)
    action a = deciderAction(agent, p)
    updateEnvironnement(a, environnement)

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Par défaut
    Alors merci pour votre aide et votre vision du projet mais finalement, je pense m'affranchir des structures pour ce projet, je m'explique:

    Premièrement je n'arrive pas à écrire une matrice de structure, et même si j'y arrive, ca sera relativement lourd à manipuler..

    Mais surtout, e plutôt que de définir une vitesse pour chaque voiture, je définis une vitesse pour chaque portion de route, puis à l'aide de conditions je fais passer les voitures sur la route lente ou rapide en fonction de la situation ou elles se trouvent

    Grâce à la "simplicité" du projet, je pense que les structures sont dispensables, et je préfère manipuler les routes plutôt que les voitures, bien que ca demande pas mal de tests, au moins c'est relativement manipulable, je peux facilement définir des situations particulières, même pour les accidents

    Bref, c'est essentiellement par manque de temps que je n'utilise pas une méthode de contrôle des voitures via un tableau linéaire, mais l'idée était vraiment intéressante et riche de potentiel.

    Merci encore et pour finir, je tiens à signaler que si quelqu'un est capable de me montrer la syntaxe d'une matrice de strcture, ca m'interesse toujours !

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    La déclaration d'une matrice de structure?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Voiture {
      char direction;
      float speed;
      int x, y;
    };
     
    struct Voiture voitures[8][8]; // voilà ta matrice :-)
    Sachant qu'une matrice peut aussi bien être représentée sous forme d'un tableau simple: mat[x][y] <==> tab[x*NB_COL+y]

  10. #10
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    mon conseil est de faire toujours attention au structures dans C.
    et c'est bien d'utiliser les structures.

Discussions similaires

  1. Send() une matrice de structure en SOCKET
    Par Shakto dans le forum Débuter
    Réponses: 13
    Dernier message: 18/11/2012, 20h32
  2. matrice de structures
    Par EmilieGh dans le forum Débuter
    Réponses: 1
    Dernier message: 07/05/2011, 07h05
  3. [Débutant] Initialisation de structure, matrice de structure
    Par huguette dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/03/2009, 19h35
  4. structure matrice en C
    Par pedro7 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2006, 15h28
  5. TAD matrice (structure + tableau dynamique)
    Par supermanu dans le forum C
    Réponses: 10
    Dernier message: 13/11/2004, 20h04

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