CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

question en c

[div]
[div]
Niveau 5
24 novembre 2009 à 23:14:24

bonjour,

J'ia un programme qui m'a l'air assez simple :

http://pastebin.com/m27293155

Quand je l'exécute, je m'attends à ce qu'il "épelle" la phrase, pourtant, avant l'affichage, il y a attente, et ensuite affichage en un temps de la phrase complète.

Question :
- pourquoi cela ne se passe comme ca : "affichage d'une lettre" "attente de 1s" "affichage d'une lettre" "attente de 1s" ....

merci, car je ne comprends pas là....

dnob700
dnob700
Niveau 10
24 novembre 2009 à 23:17:29

car, pour optimiser un programme, ce que tu demande à être afficher avec printf n'est pas afficher immédiatement, mais seulement lorsqu'il y a assez de données pour justifier une opération d'écriture (qui est assez lente).

Si tu veux forcer les données mises en attente à être imprimé, utilise l'instruction "fflush(stdout);" (c'est le bon exemple d'utilisation de cette fonction dont on a parlé il n'y a pas longtemps sur le forum) après chaque appel à printf (mais avant le sleep).

[div]
[div]
Niveau 5
24 novembre 2009 à 23:23:07

ah merci bien :-)

[div]
[div]
Niveau 5
24 novembre 2009 à 23:38:55

tiens, du coup, j'ai une autre question (je débute en threads...)

http://pastebin.com/m729dbb4f

C'est normale que j'obtienne une segmentation fault ? à cause de quoi ?

dnob700
dnob700
Niveau 10
25 novembre 2009 à 00:54:15

1000 contre un que tu as un énorme warning à la compilation. Ça serait bien que tu le lise et que tu essaye de le comprendre. Mais oui, c'est normal que ça fasse une segfault et le problème est purement du au C et n'a rien à voir avec les threads (mais je te laisse chercher un peu, c'est instructif).
Note aussi que ton algo est mauvais car tu appel strlen à chaque tour de boucle, donc même si le temps de calcul n'est pas un problème vu que tu fait un sleep(1) de toutes manières, ça fait quand même désordre et tu feais mieux de stocker le résultat quelque part.

darksmol
darksmol
Niveau 1
25 novembre 2009 à 17:13:05

Moi à ta place je n'utiliserais pas "printf" mais "write" surtout pour afficher un caractère. Ce qui donnerais :

write(1, &string[i], 1);

a la place de

printf("%c",string[i]);

enfin c'est mon avis ^^.

godrik
godrik
Niveau 30
25 novembre 2009 à 19:23:09

on s'en fout de si il utilise write ou printf. C'est une optimisation ridicule qui peut avoir un comportement bizarre avec le buffering de stdout et de la libc. Si tu veux utiliser une primitive qui sert a afficher juste un caractere utilise putc(3). Au moins tu reste dans la libC et tu ne devrais pas avoir de conflit.

darksmol
darksmol
Niveau 1
25 novembre 2009 à 21:49:51

Nous claques pas une durite godrik =) c'tait juste un avis, parce que moi j'ai eu pas mal de problèmes avec printf à cause de son buffer et que j'ai pour habitude d'utiliser write voila c'est tout :P et puis aussi putc c'est la même chose que write donc au final on tourne en rond

godrik
godrik
Niveau 30
26 novembre 2009 à 01:16:07

"c'tait juste un avis"
Non, c'est pas un avis, c'est une connerie :)

"putc c'est la même chose que write donc au final on tourne en rond"
Rate ce n'est pas du tout la meme chose.
putc ecrit sur un FILE*. FILE est la structure de la libc responsable de la gestion des entrees-sorties. write utilise un descripteur de fichier du systeme d'exploitation. Il ne sont donc pas equivalent et il est imperatif de ne pas les melanger. melanger printf et putc est par contre ok parceque ce sont deux fonctions de la libcqui utilise la meme structure. Les deux fonctions sont donc ecrites pour fonctionner ensemble.

La libc peut utiliser un systeme de buffering independant du systeme d'exploitation ainsi le resultat de
printf ("toto");
write (1,"c",1);
n'est pas garanti.
C'est la raison pour laquelle en C++ il ne faut pas melanger printf et std::cout (et encore moins write).

[div]
[div]
Niveau 5
26 novembre 2009 à 17:43:27

merci pour l'indication.
Pour moi cela me semblait correcte, car l' * portait sur le string, du coup je l'avais écris comme ca car je pensais que ca se distribuait sur string1 et string2^^

Question alternative : est-ce que vous auriez un tutoriel sur les sémaphores ?
Je dois dire que le cours que j'ai est pas ouf, et j'ai pas trouvé de bonne doc sur le net. Je rechercherai quand j'en aurait besoin, mais je demande juste si vous connaissez déjà une ressource de qualité à ce sujet (pour débutant en sémaphore j'entend :) )

merci en tout cas :-)

godrik
godrik
Niveau 30
26 novembre 2009 à 18:16:18

Il n'y a pas grand chose a dire sur les semaphores. Leur fonctionnement est simple mais leur bonne utilisation est complique.

Tu peux vouloir commencer par des mutex avant de faire des semaphores (Je sais, c'est pareil au sens de dijkstra; mais c'est pas pareil chez posix).
Cette page me parait pas mal : http://students.cs.byu.edu/~cs460ta/cs460/labs/pthreads.html
Toutes les fonctions sur les mutexs posix sont les pthread_mutex_XXX

Les fonctions sur les semaphores sont les sem_XXX

Le dernier objet important dont tu peux avoir besoin sont les files d'attentes (condition dans le terme posix). Les focntions correpondantes sont les pthread_cond_XXX

dnob700
dnob700
Niveau 10
26 novembre 2009 à 23:48:23

"Pour moi cela me semblait correcte, car l' * portait sur le string, du coup je l'avais écris comme ca car je pensais que ca se distribuait sur string1 et string2^^ "

Ouaip, pour moi c'est l'un des gros défauts du C. C'est disgracieux lors des déclarations, et ça pose quelques problèmes de cohérence surtout avec l'utilisation du mot clef const.

Cela dit, la moral est vraiment de lire les warning du compilo, qui servent à se protéger de ce genre de chose.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment