Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Officiels > Programmation > Apprenez à programmer en C ! > [Théorie] Techniques avancées > L'allocation dynamique > Lecture des commentaires

L'allocation dynamique

Vous devez être inscrit pour pouvoir poster des messages

Page : 1  2  Suivante
Pseudo Commentaire
Page : 1  2  Suivante
Hors ligne mleg # Posté le 02/03/2006 à 00:16:50 - Ce membre a mis la note : 17
None
Groupe : Membres
Comme d'habitude, très bon ;) . Par contre, tu ne détaille pas trop le passage pointeur/tableau quand tu alloue de la mémoire pour le tableau. Ca peut en décourager.

N'empêche, premier chapitre que je lis avant la news, faut dire que je l'attendais :p .

Enfin voilà donc je vais m'attaquer au tp :pirate: .
 
Hors ligne Djeepy46234 # Posté le 02/03/2006 à 03:23:32 - Ce membre n'a pas mis de note
L'épilepsie +1 (guesswhy?)
Avatar
Groupe : Membres
Code : C++
int main(int argc, char *argv[])
{
    long* memoireAllouee = NULL;

    memoireAllouee = malloc(sizeof(long));
    if (memoireAllouee == NULL) // Si l'allocation a échoué
    {
        exit(0); // On arrête immédiatement le programme
    }

    // On peut continuer le programme normalement sinon.

    return 0;
}

Ça ne fonctione pas sous Code::blocks :

error: invalid conversion from 'void*' to 'long int*'
 
Hors ligne Antartika # Posté le 02/03/2006 à 09:21:30 - Ce membre n'a pas mis de note
Groupe : Membres
Euh tu n'avais pas dit que tu abandonnais le system("pause") ?

Y'en a un au début du tuto ;)
Hors ligne rz0 # Posté le 02/03/2006 à 09:46:54 - Ce membre n'a pas mis de note
meuh
Avatar
Groupe : Membres
Djeepy46234 > Quand on compile du C comme si c'était du C++ faut pas s'étonner...
 
Hors ligne M@teo21 # Posté le 02/03/2006 à 10:39:50 - Ce membre n'a pas mis de note
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Je rappelle que c'est un cours de C, pas de C++.

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne Hells_Dark # Posté le 02/03/2006 à 14:17:25 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Citation : Cours
Code : C
sizeof(int)



A la compilation, cela sera remplacé par un nombre : le nombre d'octets que prend char en mémoire


Char ? C'est pas int plutot ? o_O

En tout cas, merci pour ce chapitre. C'est justement là que j'étais rendu dans mon apprentissage (j'apprend sur différents pdf, en cours et ..ici ;)) et j'avoue ne pas avoir tout capté (j'ai pas encore lu ton cours en entier, c'est pour ça :) ).

"You caught me at a strange time in my life."
compte devianArt - nouveau site personnel about Linux
 
Hors ligne M@teo21 # Posté le 02/03/2006 à 14:22:23 - Ce membre n'a pas mis de note
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Merci c'est corrigé

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne louisclem # Posté le 02/03/2006 à 18:20:13 - Ce membre a mis la note : 15
J'aime le
Avatar
Groupe : Membres
J'ai pleins de petits commentaires :D sur certains passages que je trouve un peu mal dits.

D'abord, dans l'affichage des sizeof. Comme sizeof retourne un size_t et qu'on ne connaît pas son type exact, on ne peut pas l'afficher, à moins de le caster avant. J'ai testé, et quand on fait rentrer une trop grande valeur dans un size_t et qu'on l'affiche avec %ld on obitent un petit résultat négatif (testé sur Linux / x86).

Le passage d'information qui parle du long int est légèrement confus aussi : "En fait, le type "long" est équivalent à un type appelé "long int", qui est ici équivalent au type... "int". Bref, ça fait beaucoup de noms différents pour pas grand-chose au final" laisse penser que long, int et long int sont équivalents, alors que la différence est simplement que long est un "raccourci" de long int, et que souvent les deux types ont la même taille.

Après les free (), il n'est pas conseillé aussi, par sécurité, de mettre le pointeur à NULL ? Cela permet déviter certains erreurs.

Dernière question du QCM, c'est un peu confus la réponse : cela ne réserve pas forcément un tableau mais une zone de la taille de 25 int. Cependant on l'utilise pas forcément comme un tableau.

Puis, dernière remarque, mais positive cette fois :D : sous la déclaration d'un tableau avec une variable, il y a écrit (Notez : ce code marche peut-être sur certains compilateurs mais uniquement dans des cas précis, il est recommandé de ne pas l'utiliser !). Je préfère voir cela que de dire que ça existe que en C99 et que tu nous apprends le C89, alors que tu mets des commentaies // :D

Donc voilà, j'étais d'humeur à chercher la petit bête aujourd'hui ;) et j'ai comme l'impression que je vais me faire tapper dessus :-°

:soleil: :soleil: :soleil:
 
Hors ligne ddx39 # Posté le 03/03/2006 à 12:04:32 - Ce membre a mis la note : 14
Avatar
Groupe : Membres
Dites moi si je raconte n'importe quoi ^^

Citation : M@teo21
Explications : Notre tableau d'int occupe 10 * 4 = 40 octets en mémoire. Il se trouve à l'adresse 15060. Il va donc occuper de la place jusqu'à l'adresse 15060 + 40 = 15100 ! La prochaine adresse utilisable en mémoire sera donc l'adresse 15100 :)


Bah non ^^, la prochaine adresse utilisable sera 15101 (puisque 15100 est déjà occupée) ;)

Image utilisateur
 
Hors ligne M@teo21 # Posté le 03/03/2006 à 13:28:42 - Ce membre n'a pas mis de note
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Bah oui tu dis n'importe quoi :p
Si tu comptes à partir de 15060 et que tu prends 40 cases (y compris la 15060), la première case libre sera belle et bien la numéro 15100.

Pour faire plus simple, supposons qu'on alloue 10 cases. La prochaine libre sera 15070. En effet, on allouera les cases :
15060 - 15061 - 15062 - ... - 15069
Si tu comptes bien, ça fait 10 ;) Il ne faut pas oublier de compter le 0ème élément ;)

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne ddx39 # Posté le 03/03/2006 à 13:38:53 - Ce membre a mis la note : 14
Avatar
Groupe : Membres
Oki oki merci pour l'explication ;)

Image utilisateur
 
Hors ligne Asgeir # Posté le 03/03/2006 à 16:53:45 - Ce membre a mis la note : 17
Canardesque
Avatar
Groupe : Bannis
Très bon tuto m@t :D

Code : C
memoireAllouee = malloc(sizeof(long));
if (memoireAllouee == NULL) // Si l'allocation a échoué
{
    exit(0); // On arrête immédiatement le programme
}

A noter l'utilisation de la fonction assert dans les systèmes GNU/Linux (c.f. advanced linux programming) ;)
Hors ligne rz0 # Posté le 03/03/2006 à 18:17:31 - Ce membre n'a pas mis de note
meuh
Avatar
Groupe : Membres
assert c'est du C mais c'est pas vraiment fait pour ça (enfin, d'après moi). C'est fait pour les conditions normalement impossibles, pas les erreurs.
 
Hors ligne Shandra # Posté le 18/06/2006 à 20:21:32 - Ce membre n'a pas mis de note
Groupe : Membres
Bonjours tout le monde

J'ai rencontré la même problème, lors de la compilation Dev c++ se plante car il ne parvient pas a passer d'un void* à un int long. La ligne qui fait se planter la compilation est donc la suivante :

ageAmis = malloc(nombreDAmis * sizeof(long));

Une explication ?
Merci d'avance
Hors ligne 0v3rb1t # Posté le 11/12/2006 à 12:44:17 - Ce membre a mis la note : 17
C et C++, pas C/C++
Avatar
Groupe : Bannis
Pour aller plus loin avec calloc() et realloc() c'est ICI
 
Hors ligne damoun53 # Posté le 16/02/2007 à 14:28:33 - Ce membre a mis la note : 17
Groupe : Membres
C'est vraiment un cours extraordinaire et bien expliqué.
Il y a quelques passages difficiles, mais je pense pas que sa vienne de matéo21, mais tout simplement du language de programation qui n'est pas de la tarte quand même, il faut le dire !
Pour moi, ça va car j'ai assez de facilité à apprendre. Il faut dire que je suis rendu à l'ouverture et le fermeture d'un fichier grace à des fonctions en 1 mois. Je pense que c'est raisonnable. J'ai bloqué un peu sur les pointeurs et sur les structures et les fonctions. Mais maintenant, ça av beaucoup mieux.
Sauf que je suis bloquer à l'ouverture et le fermenture d'un fichier grace à des fonctions car matéo21, tu ne donne que les prototypes de ses fameuses fonctions !!
Et je n'arrive pas à deviner ce qu'elle contiennent exactement ! D'ailleurs, j'aimerais bien savoir ! :D
Hors ligne Sepheryn # Posté le 08/03/2007 à 16:22:41 - Ce membre a mis la note : 20
Groupe : Membres
Je mets la meilleure des notes pour ce cours, qui, avec les autres du même auteur, m'ont permis de me lancer dans le monde dangereux du C/C++ ^^

Sinon j'ai vu que certains avaient des problèmes de typage pour le malloc, du fait qu'ils utilisaient C++, j'ai cherché sur notre ami google et j'en ai tiré ça:

Citation
int *pointeur = NULL;
int index = 5;

pointeur = (int *) malloc(index * sizeof(int));


En fait en C++ il faut indiquer le changement de type en rajoutant le type entre parenthèses devant l'expression, ici le type est un pointeur sur int.

Si j'ai bien compris, ça devrait marcher, en tout cas ça a résolu mon problème de typage.

Avant même d'être conçu, un programme est déjà obsolète...
 
Hors ligne Eridan # Posté le 15/03/2007 à 16:12:59 - Ce membre n'a pas mis de note
Groupe : Membres
Excellent tuto. Ca m'a permi de réactualiser sans problèmes quelques notions que j'avais oublié :D
Par contre, un petit détail m'a attiré l'oeil (et comme personne n'en a parlé ici je pense pas faire doublon, par contre je peux me tromper) :

vers la fin du tuto on trouve les lignes de codes suivantes :

Citation : M@teo21

ageAmis = malloc(nombreDAmis * sizeof(long)); // On alloue de la mémoire pour le tableau


et un peu plus bas :

Citation : M@teo21

scanf("%ld", &ageAmis[i]);


Et dans le QCM :

Citation : M@teo21

pointeur = malloc(sizeof(long));


avec

Citation : M@teo21

scanf("%ld", &pointeur);


Et dans la réponse du QCM, il est précisé que le "&" est de trop puisque celà donne l'adresse où est stocké le pointeur au lieu de donner l'adresse où est stockée la donnée à afficher.
Or ageAmis est aussi un pointeur (qui stocke l'adresse du premier élément du tabeau) crée de la même façon que dans l'exemple du QCM.

Il ne devrait donc pas y avoir de "&" dans le scanf non? Ou alors j'ai loupé quelque chose? :lol:
Hors ligne Sepheryn # Posté le 05/04/2007 à 14:11:41 - Ce membre a mis la note : 20
Groupe : Membres
En fait je crois qu'il y a une différence subtile:

ageAmis -> pointeur sur le premier élément du tableau
ageAmis[i] -> valeur du i-éme élément du tableau
&ageAmis[i] -> pointeur sur le i-éme élément du tableau

Donc le cours me paraît correct. En fait rajouter le [i] après le pointeur ça devient une variable normale, ageAmis[i] est la variable qui contient le i-éme élément du tableau.

Après j'peux me tromper, c'est pas rare! :-°

Avant même d'être conçu, un programme est déjà obsolète...
 
Hors ligne Reign # Posté le 19/05/2007 à 13:30:59 - Ce membre n'a pas mis de note
I'm your master
Groupe : Membres
J'ai bien aimé le tuto, mais si tu veux être totalement complet sur l'alloc mémoire, es-ce que tu ne ferais pas un petit quelque chose sur le realloc ? plus qu'utile il me semble. Sinon c'est bien fait ! Toujours très utile quand on a un petit trou de mémoire ^^
Autre chose, je pense qu'il serait utile de noté que lorsqu'on fait un alloc d'un double pointeur il faut free d'abord chaque ligne puis ensuite chaque colonne. :-)
bravo sinon ! impec ! :)
Hors ligne empire1601 # Posté le 22/05/2007 à 20:04:31 - Ce membre a mis la note : 19
Les maths rytment ils la vie ?
Avatar
Groupe : Membres
:) Très bon tutorial comme tout les autres.

:( Seul petit défaut : j'aurais aimé que le code soit aussi inscrit pour les utilisateurs de Dev C++ et code blocks car avec le code en C ça ne marche pas.
Sinon merci à l'auteur pour son magnifique tuto très complet et à Sepheryn pour son aide pour les utilisateurs du C ++ ^^
Je tien aussi à préciser qu'il existe aussi 2 fonction pour l'allocation de mémoire dans le C++ : new et delete.
A ce jour je n'ai toujour pas compris comment les utiliser.

Code : C++
1
2
3
4
5
6
7
MyLife( SDL_Event  event, SDL_Food lotsOf, SDL_Friends friends, SDL_Create programmes ) 
{
          bool onOff = 1;
          bool happy = 0;
          if( (eat(lotsOf, &friends)) && (meetPeoples( friends )) && (make(programmes))
          { happy = 1 ;}
}
 
Hors ligne gd*T # Posté le 15/06/2007 à 10:41:28 - Ce membre a mis la note : 17
Groupe : Membres
"Je suis beau" à raison, et ça ne fonctionne pas sous Dev-C++ aussi d'ailleurs ...

" error: invalid conversion from 'void*' to 'long int*' "

o_O ?

[Edit] " C'est un cours de C, pas de C ++ "

Au temps pour moi ..., merci =)

"...that place, where the wave finaly broke, and rolled back..."
 
Hors ligne Zzz C # Posté le 25/08/2007 à 12:27:17 - Ce membre a mis la note : 20
Avatar
Groupe : Membres
Bravo pour ce tuto M@teo !

Je vais mettre un petit 20/20 parce que je trouve qu'il est très bien éxpliqué ( j'ai tout compris d'un seul coup :D ).
Hors ligne mezcalio # Posté le 18/09/2007 à 15:47:51 - Ce membre a mis la note : 19
pfffffff...
Avatar
Groupe : Membres
Trés bon tuto comme d'hab...
J'ai en revanche une petite remarque à faire :

M@teo nous donne 2 exemples d'allocation de mémoire (1 dynamique et 1 automatique) :
- Allocation de mémoire dynamique
Code : C - Afficher / masquer les numéros de ligne
  1. int main(int argc, char *argv[])
  2. {
  3.     long* memoireAllouee = NULL;
  4.  
  5.     memoireAllouee = malloc(sizeof(long)); // Allocation de la mémoire
  6.     if (memoireAllouee == NULL)
  7.     {
  8.         exit(0);
  9.     }
  10.  
  11.     // Utilisation de la mémoire
  12.     printf("Quel age avez-vous ? ");
  13.     scanf("%ld", memoireAllouee);
  14.     printf("Vous avez %ld ans\n", *memoireAllouee);
  15.  
  16.     free(memoireAllouee); // Libération de mémoire
  17.  
  18.     return 0;
  19. }

- Allocation de mémoire automatique
Code : C - Afficher / masquer les numéros de ligne
  1. int main(int argc, char *argv[])
  2. {
  3.     long maVariable = 0; // Allocation de la mémoire (automatique)
  4.  
  5.     // Utilisation de la mémoire
  6.     printf("Quel age avez-vous ? ");
  7.     scanf("%ld", &maVariable);
  8.     printf("Vous avez %ld ans\n", maVariable);
  9.  
  10.     return 0;
  11. } // Libération de la mémoire (automatique à la fin de la fonction)


Il est dit dans le tuto qu'au final les 2 méthodes reviennent "exactement au même".
Il me semble que ce n'est pas tout à fait vrai.
Dans le premier exemple (allocation dynamique) on est obligé de déclarer un pointeur sur long (via une allocation automatique). Ce pointeur va donc occuper 4 octets dans la mémoire, en plus des 4 octets que l'on aura alloué dynamiquement.
Au final, on aura donc occupé 4 + 4 = 8 octets en mémoire, contre 4 octets seulement pour le deuxième exemple (allocation automatique).

Bon je sais, je suis tatillon :p , faites comme si je n'avais rien dit (sauf si j'ai tort, dans ce cas vous pouvez m'allumer).

EDIT : Sinon, si vous voulez m'encenser, j'aime bien aussi ;) .
Hors ligne charox # Posté le 20/09/2007 à 19:49:44 - Ce membre a mis la note : 20
Groupe : Membres
pfff arrete d'expliquer tes cours aussi bien parceque sinon tout le monde va devenir programmeur :p
Et dire que mon frere qui est a l'isen comprend pas des trucs en info et pour trouver sa solution il a du venir sur le SdZ ^^
Tu devrais ouvrir ta propre école d'info carrément et faire payer les cours que tu donnes :D

-200 invitations Gmail (mp si vous en voulez ^^ )
-Ah oui au fait MERCI M@THEO !!!!! xhtml/css, php, c(++) t'es le meilleur (enfin peut-etre pas mais quand meme :-° )!!
Citation : Devises Shadock
Il vaut mieux mobiliser son intelligence sur des conneries que sa connerie sur des choses intelligentes !
 
Hors ligne malakian # Posté le 23/09/2007 à 06:04:35 - Ce membre n'a pas mis de note
is ... Holala
Avatar
Groupe : Membres
Un grand merci matteo . J'était arrivé sur ce site je ne savait mem pas c'était quoi la programation .Grace a oti je sais faire un petit programme ! je n'est pas encore finin le cours et j'espere ne jamais le finir tellement j'pprend de chose.

Encore merci ^^

Jacque Prevert
Dans chaque église il y a quelque chose qui cloche.
 
Hors ligne Dagrut # Posté le 28/09/2007 à 17:13:20 - Ce membre a mis la note : 19
Be API! ^_^
Avatar
Groupe : Membres
Trés bon tuto (d'ailleurs ça en deviens lassant :D :p ^^ )
Il manque juste un petit chose :
Code : C - Afficher / masquer les numéros de ligne
  1. FILE *fichiersortie = NULL;
  2. fichiersortie = malloc(nbfichieracreer * sizeof(FILE);
  3. fichiersortie[i] = fopen(repertoirefichier, "wb+");

À préciser...
J'ai été très étonné quand j'ai eu ce petit problème et hereusement que d'aimables personnes m'ont aidées sur l'IRC Xchat!

Ps: la solution est de faire un pointeur sur pointeur à l'initialisation :
Code : C - Afficher / masquer les numéros de ligne
  1. FILE **fichiersortie = NULL;
  2. *fichiersortie = malloc(nbfichieracreer * sizeof(FILE);
  3. fichiersortie[i] = fopen(repertoirefichier, "wb+");


Édit: j'ai essayé − par inadvertance, et j'aurais du me relire, mais bon − une sorte de :
Code : C - Afficher / masquer les numéros de ligne
  1. while(1)
  2.     malloc(sizeof(int));

J'ai eu chaud, mais heureusement, le programme n'à pas eu le temps de prendre tous mes 1000Mo de Ram! Ça fait quand même peur, les fenêtres qui ne réagissent plus et qui se grisent quand on clique dessus ^^

Racketiciel - Langage SMS
Lien cassé >> MP!
Mes programmes et mes circuits TMN/TMNF << Donnez votre avis! :)
Le pédalo c'est du passé. ^^
État jabber : Image utilisateur
















Adresse de test (Pour les spams). Ne pas envoyer de message!
ofguiauzomxumwcaysqx@yahoo.fr
 
Hors ligne john_sk8er # Posté le 05/01/2008 à 23:17:34 - Ce membre a mis la note : 20
Groupe : Membres
Très bien expliqué comme les autres tutos :D

Je donne la meilleure note ^^

pour ceux que sa ne fonctionne pas sur Code::Blocks, moi j'utilise ce programme et ça fonctionne très bien il faut seulement changer au début c++ source en c source dans file option ;)

pour celui qui a fait la boucle infinie, :-° j'ai testé et j'ai laissé tourner pour voir le resultat :lol: finalement la mémoire na pas été toute utilisée et seulement 50 mo restait dans la ram a comparé a 3go dans la mémoire virtuelle (j'ai configuré a 4go dans le fichier de pagination) :euh: :p

comme je disait: un gros bravo a m@teo pour ses cours, j'ai commencé sans rien connaitre et maintenant, à peine 1 mois après, je peut faire des programmes simple et je suis rendu a la partie 3 avec les évènements [20/20] ^^
Hors ligne JeMs95 # Posté le 30/01/2008 à 17:20:15 - Ce membre n'a pas mis de note
Groupe : Membres
Bonjour, ce tuto sur l'allocation dynamique est assez bon, facil à comprendre.
Hors ligne Vinoo # Posté le 14/03/2008 à 14:31:35 - Ce membre a mis la note : 20
Keep Cool.
Groupe : Membres
20/20 sans hésiter!
Comment ça "un chapitre assez difficile" ? :pirate:

Au contraire, moi je pense que c'était vraiment "le moment détente" de cette partie du cours. Il suffit en effet de comprendre les pointeurs (c'est pas vraiment la mer à boire non plus) et le reste rentre tout seul!
Non franchement Mateo, tes cours sont tellement bien expliqués que pour nous c'est limpide tu t'en rends pas compte à la fin! :lol: Bien sûr, il faut que nous aussi on fasse parfois quelques efforts si on veut assimiler.

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 58 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0582s (0.0388s)