Aller au menu - Aller au contenu

L'allocation dynamique

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3  4 
Pseudo Commentaire
Page Précédente  1  2  3  4 
Hors ligne Zax512 # Posté le 16/03/2011 à 12:10:03
Avatar

Salut à tous!
Pour ceux travaillant avec Visual Studio et qui rencontrent des soucis avec l'allocation dynamique il faut configurer l'IDE pour qu'il compile votre projet en C, cela est réglable dans le menu Project -> Properties -> Configuration Properties -> C/C++ -> Advanced, là il faut modifier l'option "Compile As" (qui de base est sur Default) et la mettre sur C code.

Voilà, maintenant vous pourrez vraiment programmer C sans devoir faire de conversions.

Il est possible qu’IntelliSense continu à souligner l'opération en rouge mais cela disparaitra à la prochaine compilation.

Voilà, bon C à tous!
Hors ligne Ghost_anon # Posté le 21/02/2012 à 10:17:25
Avatar

Avis : Très bon

Salut
bon, encore une fois, que du bon dans ce tuto :)

je me suis aperçu avoir encore un peu de mal avec les pointeurs, mais je pense qu'avec un peu (voir beaucoup :) ) de pratique , ça devrait s'arranger!

mais je redoute quand même un peu le chapitre suivant ^^

merci à toi
Hors ligne SkkN # Posté le 04/04/2012 à 17:21:05
Avatar

Avis : Bon

J'ai une question:

ageAmis est un pointeur, mais alors pourquoi dans le scanf on as mis &ageAmis et non pas ageAmis :(
Hors ligne aladdin29 # Posté le 17/04/2012 à 15:30:19

Bonjour et merci pour tous ces cours !
J'ai une question sur des histoires de longueur de tableaux... Avec ce code :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int main (int argc, char *argv[])
{
	char motSecret[] = "MARRON";
	int longueur = strlen(motSecret);

	printf("La longueur de marron est de %d\n", longueur); // on trouve bien 6

	char *chaineMyst = NULL;
	chaineMyst = (char *) malloc(sizeof(char)*longueur); // j'ai fait un cast sinon la compilation n'était pas contente

	int longueurChaineMyst = strlen(chaineMyst);
	printf("La longueur de chaineMyst est de %d\n", longueurChaineMyst);

    return 0;
}


je m'attends à ce que la longueur de chaineMyst soit de 6 (puisque longueur = 6 et sizeof(char), après vérification, donne bien 1) Cependant, avec Microsoft Visual C++ je trouve 10 (et il donne toujours un résultat de 4 octets supérieurs à ce que j'attends), et avec Code::Blocks, je trouve 3, peut-importe la longueur du motSecret !!! Quelqu'un pourrait-il m'expliquer s'il vous plait ?
Merci !
Hors ligne Otruch # Posté le 19/04/2012 à 08:56:37

Bonjour bonjour, joli tuto :)

Cela m'a donné envie de créer une fonction qui initialise la taille d'un tableau, seulement ça n'a pas l'air de fonctionner...J'ai repris le même exemple que donné avec le nombre d'amis :
Code : C
 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
#include <stdio.h>
#include <stdlib.h>

void tableauVariable(int* tableau, int taille)
{
    if(taille>0)
        {tableau = malloc(taille * sizeof(int));}
    if(tableau==NULL)
        {exit(0);}
}


int main()
{
    int nombreDAmis = 0, i = 0;
    int* ageAmis = NULL;
    printf("Combien d'amis avez-vous ? ");
    scanf("%d", &nombreDAmis);
    void tableauVariable(int* ageAmis,int nombreDAmis);
        for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel age a l'ami numero %d ? ", i + 1);
                scanf("%d", &ageAmis[i]);
            }

            // On affiche les âges stockés un à un
            printf("\n\nVos amis ont les ages suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%d ans\n", ageAmis[i]);
            }

    free(ageAmis);
    printf("Hello world!\n");
    return 0;
}


Quand je lance ce code, le programme demande le nombre d'amis, me demande l'age du premier ami, et plante après la saisie. J'ai donc copié la condition d'arrêt après l'appel de la fonction :
Code : C
1
2
3
void tableauVariable(int* ageAmis,int nombreDAmis);
    if(ageAmis==NULL)
        {exit(0);}

Le programme s'arrête automatiquement après la demande du nombre d'ami, comme si le pointeur ageAmis n'avait pas été modifié, cela voudrait dire que le pointeur *tableau en paramètre n'a été modifié que localement? Je trouve ça étrange, pouvez-vous m'aider?
Hors ligne zéro_pointé_95 # Posté le 19/04/2012 à 21:04:39

Avis : Très bon

bonjour Otruch
dans ton main, la ligne suivante resemble plus à un prototype de fonction qu'à un appel :)
void tableauVariable(int* ageAmis,int nombreDAmis);

Alladin29,
tu ne fais qu'allouer de la memoire pour ton pointeur chaineMyst, tu ne lui affectes ensuite aucune valeur par un strcpy par exemple. Du coup ton strlen est dans les choux puisqu'il se base sur le premier caractère '\n' qu'il trouve dans ta chaine pour en donner la longueur, qui peut être n'importe où suivant ce qui traine en memoire.

Skkn,
c'est vrai si ton scanf porte sur ageAmis qui est en effet un pointeur. Or le scanf porte sur ageAmis[i], la ième occurence du tableau, qui est une valeur et non une adresse.
Hors ligne frodooon # Posté le 21/05/2012 à 16:15:13

Avis : Très bon

Pour répondre à SkkN :

Je me suis posé la même question :)

Et je pense avoir trouvé l'explication : en effet ageAmis est un pointeur.. MAIS lorsqu'on met l'adresse du tableau (ex : ageAmis[i]), c'est bien à une variable qu'on accède, d'où l'utilisation du "&" dans le scanf...

Enfin, je crois...
Pour accéder à cette section
Connectez-vous !
connexion_rpx