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 :

Résolution d'un problème sur les Files


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Résolution d'un problème sur les Files
    Bonjour à tous. Vraiment chapeau à l'initiateur ou aux initiateurx de ce site.Je suis nouveau dans le forum , je passe directement à ma préoccupation sans être long:
    J'ai beaucoup de problème à résoudre cet exercice vu mon très faible niveau en programmation; début du problème:

    L'objectif de cet exercice est de manipuler une file à base d'un vecteur circulaire.
    La file est composée d'un vecteur de N élément de type "Objet" et de deux variables entières:
    f: l'index de l'élément de début; r: l'index suivant celui du dernier élément.
    a) Illustrer à l'aide d'un schéma, la configuration normale et la configuration circulaire d'une telle file.
    b) Proposer en C, une structure de données pour cette file.

    Merci d'avance pour vos réponses.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 351
    Points : 42 822
    Points
    42 822
    Par défaut
    Bonsoir et bienvenue sur developpez.com.

    Nous t'aiderons mais ne ferons pas l'exercice à ta place.

    Qu'as-tu déjà fait ?

    Pour du C, petit indice : les listes chainées.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre éprouvé
    Homme Profil pro
    Programmeur des cavernes
    Inscrit en
    Août 2017
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Programmeur des cavernes
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 364
    Points : 1 241
    Points
    1 241
    Par défaut
    Pour implémenter un buffer circulaire, un tableau suffit. (redimensionnable s'il le faut).

  4. #4
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Je ne sais pas pourquoi (*), à la fin de la seconde décennie du XXIe siècle, on s'obstine à utiliser les indices de début et fin (ou + 1) pour les files représentées par des tableaux circulaires.

    Ca fait une embrouille pour tester si c'est complétement plein ou complétement vide, et ça implique de conserver une place vide dans le buffer, ce qui choque profondément mon sens de l'économie.


    En effet, un indice dans un tableau circulaire de taille N ne peut prendre que N valeurs, donc le nombre d'éléments présents, qui commence à 0, ne peut aller que jusqu'à N-1. Donc il reste une case vide. C'est con, hein ?

    Autant avoir indice de début + nb d'éléments, l'autre bout de la file étant à l'indice (début + nb - 1) % N.

    (*) parce que c'était écrit comme ça dans les vieux bouquins, quand on programmait en assembleur des tampons circulaires de caractères de taille 256 avec les indices dans des octets ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci vraiment à tous pour la considération que vous accorder à ma préoccupation.je vous montrerai ce que j'ai moi-meme fait.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Je sais pourquoi à la fin de la seconde décennie du XXIe siècle, on s'obstine à utiliser les indices de début et fin pour les files représentées par des tableaux circulaires.
    Les buffers circulaires sont souvent utilisés pour transmettre des données en FIFO entre 2 threads ou entre une interruption et un thread. Il est alors primordial d'utiliser des accès atomiques et qu'aucun élément de synchro ne soit écrit par plusieurs entités.
    En utilisant Indice début et taille utilisée, cela n'est pas possible (pour ajouter on change la taille, pour extraire on change aussi la taille en plus de l'indice de début.)
    En utilisant un indice de début et un indice de fin, cela fonctionne. L'écrivain effectue une incrémentation atomique de l'indice de fin, alors que le lecteur effectue une incrémentation atomique de l'indice de début. Il y a par contre une contrainte supplémentaire : on met au maximum N-1 éléments dans le tableaux, on évite ainsi d'avoir à distinguer le cas vide du cas plein avec N valeurs.

  7. #7
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Oui mais il n'y a pas que l'incrémentation/décrémentation à faire, il y a aussi la copie de l'élément désigné par l'indice. L'atomicité, ça ne marchera tout seul que si écrire+incrémenter l'indice se fait en une opération atomique.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par Pladel Voir le message
    J'ai beaucoup de problème à résoudre cet exercice vu mon très faible niveau en programmation
    Désolé, ce genre de phrase vue 10000 fois ça ne prend pas. Si tu as un exercice, c'est que tu as eu l'enseignement pour le résoudre donc tu as le niveau. Et si tu n'as pas le niveau, c'est que tu n'as pas travaillé quand tu aurais dû...

    Citation Envoyé par Pladel Voir le message
    L'objectif de cet exercice est de manipuler une file à base d'un vecteur circulaire.
    La file est composée d'un vecteur de N élément de type "Objet" et de deux variables entières:
    f: l'index de l'élément de début; r: l'index suivant celui du dernier élément.
    b) Proposer en C, une structure de données pour cette file.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct {
    	...
    	...
    	...
    } t_objet;
     
    typedef struct {
    	t_objet tab[SIZE_FILE + 1];
    	unsigned short f;
    	unsigned short r;
    } t_file;
    Voilà comment je ferais. Mais ne te méprends pas. Ce n'est pas parce que j'écris la structure (somme toute très banale qui aurait pu être donnée par le prof) que ça signifie qu'on fera la suite de l'exo...

    Citation Envoyé par Pladel Voir le message
    Merci d'avance pour vos réponses.
    Donc déjà on ne remercie jamais d'avance. Cette fausse politesse met le lecteur en porte à faux se sentant en quelque sorte "obligé" de faire ce pour quoi il a été remercié. Et le smiley "roll" est un smiley sarcastique signifiant "c'est vraiment n'importe quoi". Pour une première sur ce forum, tu fais assez fort...

    Citation Envoyé par ekieki Voir le message
    Je ne sais pas pourquoi, à la fin de la seconde décennie du XXIe siècle, on s'obstine à utiliser les indices de début et fin (ou + 1) pour les files représentées par des tableaux circulaires.
    Peut-être parce que le changement de siècle n'a pas rendu périmé une technologie qui était valable auparavant...

    Citation Envoyé par ekieki Voir le message
    Ca fait une embrouille pour tester si c'est complétement plein ou complétement vide, et ça implique de conserver une place vide dans le buffer, ce qui choque profondément mon sens de l'économie.
    Pour une place ? C'est quand-même pas la mort quoi. Es-tu choqué par la place prise par le '\0' dans les chaines ?
    Ok, le '\0' c'est un caractère alors que si on gère un buffer de super gros trucs, on perd une super grosse place. Mais on peut alors remplacer ça par un flag vide/non vide ce qui ne prend alors qu'un char/int...

    Citation Envoyé par ekieki Voir le message
    Autant avoir indice de début + nb d'éléments, l'autre bout de la file étant à l'indice (début + nb - 1) % N.
    En effet, ça aurait pu (et même au siècle précédent). Mais (cf dalfab)...

    Citation Envoyé par ekieki Voir le message
    L'atomicité, ça ne marchera tout seul que si écrire+incrémenter l'indice se fait en une opération atomique.
    C'est tout à fait possible de grouper plusieurs actions dans une opération atomique...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est tout à fait possible de grouper plusieurs actions dans une opération atomique...

    Comme quoi, ce n'est pas plus difficile de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    longueur = longueur + 1;
    data[(debut + longueur) mod taille] = element;
    quer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dernier = (dernier + 1) mod taille;
    data[dernier] = element
    et que l'objection sur l'atomicité ne tient pas, l'une n'étant pas d'une nature intrinsèquement plus atomique que l'autre.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/12/2011, 21h33
  2. Problème sur les dates
    Par Littlecoda dans le forum Oracle
    Réponses: 7
    Dernier message: 07/07/2006, 12h39
  3. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 12h52
  4. Réponses: 6
    Dernier message: 31/03/2006, 18h05
  5. j'ai un problème sur les hinstances
    Par ramaro dans le forum C++
    Réponses: 9
    Dernier message: 26/02/2006, 15h32

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