Se connecter

Informatique

Programmation

Sujet : printf("blabla");
Pocolo
Niveau 10
24 août 2011 à 01:17:18

" En rajoutant en C "

En rajoutant un "c".

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 01:20:03

Ouaip, d'ailleurs c'est conseillé d'utiliser la version avec le 'c' devant plutôt qu'avec l'extension du fichier (.h).

Par contre, je me suis toujours demandé pourquoi. Par souci d'homogénéité, peut-être ?

(Au passage, j'ai une autre question : sur un OS "moderne", si on ne libère pas une ressource allouée à la main (malloc/new), que se passe-t-il après la fermeture du programme ?)

Pocolo
Niveau 10
24 août 2011 à 01:22:28

A noter que je viens de dire une connerie, il n'y pas d'equivalent C++ pour cstdio. :peur:

Mais bon le fait est qu'au lieu d’écrire <en-tête.h> pour les trucs C tu peux ecrire <cen-tête>.

Pocolo
Niveau 10
24 août 2011 à 01:28:55

" (Au passage, j'ai une autre question : sur un OS "moderne", si on ne libère pas une ressource allouée à la main (malloc/new), que se passe-t-il après la fermeture du programme ?) "

Normalement la mémoire est quand libérée à la fermeture du programme.

Pocolo
Niveau 10
24 août 2011 à 01:29:13

quand même*

:honte:

Pocolo
Niveau 10
24 août 2011 à 01:53:17

" Par contre, je me suis toujours demandé pourquoi. Par souci d'homogénéité, peut-être ? "

Ah et pour cette question il me semble que c'est parce qu'avec les versions <ctruc> des en-têtes les fonctions sont dans l'espace de nom "std".

Par exemple avec <cstdio> tu peux écrire std::printf, je ne saurais pas en dire beaucoup plus à ce sujet.

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 02:10:00

Effectivement, je viens de tester, ça marche.

godrik
Niveau 26
24 août 2011 à 06:51:02

"Le sens des operations physiquement tant que je peux comprendre ce que ca fait calculatoirement."

->

"Le sens physique des operations n'est pas important tant que je peux comprendre les calculs qui sont a effectues"

godrik
Niveau 26
24 août 2011 à 06:54:50

" (Au passage, j'ai une autre question : sur un OS "moderne", si on ne libère pas une ressource allouée à la main (malloc/new), que se passe-t-il après la fermeture du programme ?) "

Le systeme libere la memoire a fermeture du process. Mais ce n'est pas une raison pour ne pas liberer la memoire "au bon moment". Une appli qui ne libere pas sa memoire est souvent une appli qui ne va pas paser a l'echelle quand on va monter la charge.

( Mon etudiant m'a fait le coup hier:
L'etudiant : "Pas besoin de liberer la memoire, le systeme le fera pour moi!!"
Moi : "Tu sais qu'on va allouer des GigaOctets la semaine prochaine?"
L'etudiant : "ah. heu..." )

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 13:06:13

Du coup, comment le système le fait-il ?

caelacanthe
Niveau 10
24 août 2011 à 13:14:25
  1. IIIIIIIIIIIIIll Voir le profil de IIIIIIIIIIIIIll
  2. Posté le 24 août 2011 à 13:06:13 Avertir un administrateur
  3. Du coup, comment le système le fait-il ?

:d) il intégre un ramasse-miette...

mais je crois qu'il le fait de manière bien moins efficace que quand c'est le programme même qui s'y colle. quelquefois, tu coupes un jeu particulièrement mal fait, et le système est ralenti pendant les cinq minutes qui suivent. :oui:

concernant mes chaines de caractère... justement, ce sont de simples char*, je pensais éviter d'utiliser les strings juste pour récupérer des longueurs et coller deux chaines de caractère ensemble. :peur:

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 14:12:12

Oui, mais nous on parlait d'inclure <cstring> et non <string>. :)

godrik
Niveau 26
24 août 2011 à 15:23:10

malloc() est une fonction en espace utilisateur, ca n'alloue pas de memoire directement. La fonction qui alloue de la memoire c'est brk(). brk() est une fonction du noyau qui etends le segment de donnee. Quand un processus meurt, le systeme desalloue tous les segments de ton processus, y comprisle segment de donnee. C'est basiquement comme ca pour toutes les ressources dont par exemple les descripteurs de fichiers. Les descripteurs viennent du noyau donc il sait ce qui est ouvert et ce qui ne l'est pas. Et il fait le menage a la fin du processus.

note que tu peux avoir plus d'un segment de donnee et que brk() n'est pas la seule fonction qui fait de l'allocation de memoire (mmap() peut faire ca aussi). Mais encore une fois le principe est le meme, c'est le systeme qui alloue la ressource pour commencer, donc il sait comment la fermer.

Note que dans le cas de malloc(), un appel a malloc ne correpond pas a un appel a brk(). brk() est seulement appeller de temps en temps pour augmenter significativement l'espace memoire, la plupart du temps, malloc utilise un bout de memoire qui a ete alloue par le systeme dans un appel anterieur a malloc.

NB: linux ne fait que de l'allocation de memoire virtuelle quand tu appelle malloc() ou brk() ou mmap() ou whatever(). La memoire physique n'est actuellement alloue que lorsque la memoire est lue ou ecrite pour la premiere fois.

NB2: la memoire est desalloue, mais si tu as des objets a deconstruire proprement, il disparaisse a la mort du processus. Donc si tu as des traitements a faire a la destruction d'objet, il faut voir si le langage supporte leur liberation (typiquement en C++, tous les objet alloues dynamiquement ne seront pas detruit, juste desalloue).

NB3: ne pas desallouer la memoire, ca fait pleurer les bebes chats.

Pocolo
Niveau 10
24 août 2011 à 15:44:48

Oh non, pas les bébés chats.

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 15:56:33

http://www.youtube.com/watch?v=bHHeoDmqdKQ&amp;t=14m49s

caelacanthe
Niveau 10
24 août 2011 à 18:34:46
  1. IIIIIIIIIIIIIll Voir le profil de IIIIIIIIIIIIIll
  2. Posté le 24 août 2011 à 14:12:12 Avertir un administrateur
  3. Oui, mais nous on parlait d'inclure <cstring> et non <string>. :)

:d) ça, c'est une chose, d'accord. mais si inclure <cstring> ne permettait pas d'utiliser les fonctions de <cstring>? si je devais inclure windows.h pour ça? :peur:

Pocolo
Niveau 10
24 août 2011 à 18:36:12

" mais si inclure <cstring> ne permettait pas d'utiliser les fonctions de <cstring>? "

Tu délires mon pauvre. :oui:

caelacanthe
Niveau 10
24 août 2011 à 18:46:36

c'est précisément ce qui m'arrive, là. j'aimerais utiliser strlen, qui est supposé se trouver dans stdio ou stdlib. le compilateur lance une erreur en disant que la fonction est inconnue. si j'inclus windows.h, par contre, ça fonctionne parfaitement. :oui:

IIIIIIIIIIIIIll
Niveau 10
24 août 2011 à 18:48:57

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

Regarde bien où elle est. :-)

Pocolo
Niveau 10
24 août 2011 à 18:49:34

Eh bien non, cette fonction se trouve dans <cstring> (ou string.h, comme tu veux), c'est ce qu'on viens de dire.

Sujet : printf("blabla");
   Retour haut de page
Consulter la version web de cette page