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 :

malloc(); et visual studio


Sujet :

C

  1. #21
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Mayhem
    Prend également soin de tester le retour de la fonction malloc pour savoir si celle-ci a échoué.
    D'accord, mais comment on teste une fonction?

  2. #22
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par bigquick
    exactement !

    et tu peux "passer" au suivant en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pointeur = pointeur + 1
    , pour que ton pointeur contienne l'adresse du suivant

    ou encore y accéder avec la notation "tableau"
    où "i" est le numéro de l'élément qui t'intéresse
    Ok!! j'ai compris ça alors! 8) C'est moi ou c'est dur au début pour tout le monde???

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Points : 50
    Points
    50
    Par défaut
    eh bien si elle te renvoie NULL tu sais qu'il y a une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int * ptab;
    if( (ptab = (int *)malloc(sizeof(int)) ) == NULL)
        //problème d'allocation mémoire
    else
        //tout s'est bien passé, on continue...

  4. #24
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Prend également soin de tester le retour de la fonction malloc pour savoir si celle-ci a échoué.
    En effet, très important si tu ne veux pas passer 15mn à chercher ailleurs alors que c'est juste le malloc qui a échoué

    Tu peux tester, comme dans l'exemple que tu as posté, la valeur du pointeur. En cas d'echec, malloc retourne NULL, et donc donc pointeur contiendra NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (p != NULL)
    {
       // tout va bien
    }
    Et ouai, au début c'est dur, mais après t'y penses plus
    And still we will be here, standing like statues ...

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Merci à vous deux!

    Je vais me lancer sur l'exo que le prof nous à demander de faire, et je penses m'en sortir, enfin j'éspère!

    Allez A bientôt je penses

  6. #26
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    A bientôt, et bon courage
    And still we will be here, standing like statues ...

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Points : 50
    Points
    50
    Par défaut
    autre chose, chaque bloc alloué doit être restitué au système.
    malloc va de paire avec free qui s'occupe de libérer la mémoire.
    A la fin de ton application, il faut donc libérer ton tableau dynamique d'entier


  8. #28
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Mayhem
    Il me semble que certains compilateurs font le cast sur le retour de malloc implicitement en fonction du type de donnée auquel on les associe.
    Non, le probleme est que Spike Spiegel compile en mode C++. Comme le typage est plus fort en C++, le cast implicite d'un pointeur void est interdit. Par contre, en C, c'est permis (il est même recommandé de ne pas caster le retour de malloc, qui cache l'erreur de la non-inclusion de stdlib).
    Donc:
    - s'assurer qu'on compile en C (extension du fichier .c et non .cpp)
    - inclure stdlib.h

  9. #29
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    tout juste dazumba, je compile en C++ en fait, car l'extension du fichier est cpp. ^^


    juste une question encore. Dans cette fonction je ne trouve pas pourquoi ca bloque... je n'ai aucune erreur mais juste après la saisie du premier nombre j'ai un message d'erreur du debuger...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void saisir(int taille)
    {
    	int i;
    	int *ptab= (int *)malloc(taille * sizeof(int));
    	if(ptab == NULL) printf("\n\n ALLOCATION ECHOUEE \n\n");
    	else printf("\n Allocation reussie \n");
     
    	for(i=0;i<taille;i++)
    	{
    		printf("\nEntrez un entier: ");
    		scanf("%d",*(ptab+i));
    		printf("%d",*(ptab+i));
    	}
    }

  10. #30
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Spike Spiegel
    tout juste dazumba, je compile en C++ en fait, car l'extension du fichier est cpp.
    Dans ce cas, le bon forum est C++... mais tu vas te faire critiquer car tu programmes "à la C".

    juste une question encore. Dans cette fonction je ne trouve pas pourquoi ca bloque... je n'ai aucune erreur mais juste après la saisie du premier nombre j'ai un message d'erreur du debuger...
    Encore une confusion entre pointeur et valeur pointée. scanf() attend l'adresse d'une variable, et tu lui donnes l'adresse d'un pointeur.
    ou

  11. #31
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: malloc(); et visual studio
    Eh bien, il s'en passe des choses pendant ma sieste!
    Citation Envoyé par Spike Spiegel
    Encore une question sur une fonction en C!!

    On vient de voir les pointeurs en cours, et chez moi, sous visual studio c++, lorsque j'essaye de compiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main()
    {
    	int *ptab;
    	*ptab = (int *)malloc(sizeof(int));
    	//printf("%d\n",*(ptab+1));
    	system("pause");
    }
    j'ai l'erreur suivante: error C2440: '=' : cannot convert from 'int *' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    Tu n'invoques pas le bon compilateur. Assure toi que tu appelles bien le compilateur C :
    • extension .c et non .C ni .cpp
    • configuration de ton IDE


    Néanmoins, ton code est incorrect et invoque de mauvaises pratiques :
    • main() retourne int. Toujours.

      http://emmanuel-delahaye.developpez....s.htm#typemain
    • manque le prototype pour malloc () (<stdlib.h>)
    • '*ptab' est un int. De plus, ptab n'étant pas encore initialisé, le déréférencer invoque un comportement indéfini. Tu veux probablement dire 'ptab'.
    • la valeur retournée n'est pas testée
    • la mémoire allouée n'est pas libérée


    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Ceci est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
     
    int main (void)
    {
       int *ptab = malloc (sizeof *ptab);
     
       if (ptab != NULL)
       {
          /* utilisation de ptab */
          free (ptab), ptab = NULL;
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Spike Spiegel
    Bon, comme je souhaiterai vraiment comprendre les pointeurs et rien oublier, vous allez me dire si c'est faux:

    On déclare un pointeur qui pointe vers un entier (qui contient l'adresse d'une variable qui contient un entier.
    Oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptab = (int *)malloc(10*sizeof(int));
    celle ligne signifie que l'on alloue un espace mémoire de 10 fois 1 entier
    Oui (aux fautes de frappes près...)
    au pointeur ptab.
    Non.
    C'est à dire, que le pointeur va contenir l'adresse mémoire de 10 entiers. (?)
    Non. Je reformule (et j'utilise une meilleure présentation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *ptab = malloc (10 * sizeof *ptab);
    Cette ligne signifie que l'on alloue un bloc mémoire de la taille d'un tableau de 10 int et que l'adresse de ce bloc est stockée dans le pointeur ptab.

    On peut ensuite utiliser le tableau alloué gràce au pointeur et à la notation indicée.
    Pas de Wi-Fi à la maison : CPL

  13. #33
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    euh désole dazumba: je voulais dire que je programme en C mais que le non de fichier étant en cpp, je compile avec le mauvais compilateur ^^

    Encore une confusion entre pointeur et valeur pointée. scanf() attend l'adresse d'une variable, et tu lui donnes l'adresse d'un pointeur
    si je lui donné l'adresse d'un pointeur ça serait plutôt &ptab plutôt que *ptab non?
    lorsque l'on fait *ptab=2; on affecte pas à la première "case" du tableau l'entier 2. Si oui, je comprends tjrs pas pk le code ne marche pas.

    Emmanuel: merci pour toutes ces précisions.

  14. #34
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par bigquick
    Par contre, il ne sait pas ce que tu vas faire de cette mémoire, donc il te renvoie un (void*) et c'est à toi de le convertir vers le type qui t'intéresse ...

    Je sais, tu précises sizeof(int) donc il pourrait deviner tout seul que tu vas caster ça en (int*), mais c'est comme ça
    Pas vraiment. Mais je rappelle que le cast n'est pas obligatoire en C, qui garantit la conversion implicite void* -> T* et T* -> void *.

    Evidemment, si on se trompe de compilateur, c'est autre chose.... Pour éviter ça, dans mes codes source,

    http://emmanuel-delahaye.developpez.com/clib.htm

    il y a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif
    Pas de Wi-Fi à la maison : CPL

  15. #35
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Non c'est bon j'ai compris!! je viens de faire le rapport entre scanf() et son utilisation avec les pointeurs.

    comme l'a dis Dazumba, scanf attend une adresse de variable, donc ptab+i ici.

    C'était pourtant logique...

  16. #36
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    bon, j'ai encore un soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    # ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif 
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
     
    void saisir(int **t,int n)
    {
    	*t = (int *)malloc(n * sizeof(int));
    	int *ptr;
    	if(t != NULL) 
    	{
    		for(ptr=*t;ptr<*t+n;ptr++)
    		{
    			printf("\nEntrez un entier: ");
    			scanf("%d",ptr);
    		}
    	}
    	else printf("\n\n ALLOCATION ECHOUEE \n\n");
    	system("pause");
    }
     
    void afficher(int *t,int n)
    {
    	int *ptr;
    	for(ptr=t;ptr<t+n;ptr++)
    	{
    		printf(" %d ",*ptr);
    		if(ptr!=t+n-1)
    		{
    			printf("-");
    		}
    	}
    	printf("\n");
    	system("pause");
    }
     
    void main()
    {
    	int choix, nb;
    	int *ptab;
    	do
    	{
    	system("cls");
    	printf("\n      ___ Menu ___\n");
    	printf("\n 1 : Saisir le tableau");
    	printf("\n 2 : afficher");
    	printf("\n 3 : trier");
    	printf("\n 4 : recherche");
    	printf("\n 5 : rotation");
    	printf("\n 0 : occurence");
    	printf("\n Votre choix : ");
    	scanf("%d",&choix);
     
    		switch(choix)
    		{
    		case 1: printf("Indiquez la taille du tableau: ");
    				scanf("%d",&nb);
    				saisir(&ptab,nb);
    				break;
    		case 2:	printf("Le tableau que vous avez entrez est: ");
    				afficher(ptab,nb);
    				break;
    		case 3: /*trier(&ptab,nb);*/
    			break;
    		case 4:
    			break;
    		case 5:
    			break;
    		case 0:	printf(" \n\n Fin du programme \n\n");
    				system("pause");
    				free(ptab);
    				break;
    		default: printf(" \n Erreur de frappe. Veuillez rechoisir: \n");
    				 break;
    		}
    	}while(choix!=0);
     
    }
    Il y 5 minutes, j'ai essayé ce code, il fonctionnait.

    J'ai tout fermé (workspace etc...) et tout réouvert et depuis, ça ne foncitonne plus.

    error C2065: 'ptr' : undeclared identifier
    et
    error C2143: syntax error : missing ';' before 'type'

  17. #37
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    bon en fait ça ne fonctionne pas lorsque je le compile avec le compilateur C mais avec le C++ ça marche... Alors là je suis paumé.

  18. #38
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void saisir(int **t,int n) 
    { 
       *t = (int *)malloc(n * sizeof(int)); 
       int *ptr; 
       if(t != NULL) 
       {
    Tu dois déclarer tes variables en début de bloc (sauf en C99 où ce n'est pas obligatoire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { 
       int *ptr;
       *t = (int *)malloc(n * sizeof(int)); 
       if(t != NULL)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  19. #39
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Bonjour

    je vais m'y mettre aussi :
    Attention au prototype de main
    En C c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main (void)
    ou 
    int main(int argc, char *argv[])
    et en principe à la fin du main on a return 0;

    Autre chose, je n'ai pas vu de remarque au sujet de scanf, j'ai lu trop vite, ou on est fatigué sur le forum ??
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #40
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    merci les gens! la remarque qui concerne le scanf est dans la page deux je crois.

    Sinon, je n'ai pas bien saisie l'utilisation du **t. je suppose que c'est pareil que *(*t) donc ce serait un pointeur d'un pointeur ?!

    si quelqu'un peut m'éclairer sur ce sujet je suis preneur!!

Discussions similaires

  1. News Visual Studio
    Par farscape dans le forum Visual C++
    Réponses: 34
    Dernier message: 27/04/2010, 10h21
  2. [IDE] Visual Studio 2005 Express
    Par Louis-Guillaume Morand dans le forum Général Dotnet
    Réponses: 130
    Dernier message: 23/12/2006, 15h08
  3. Visual Studio .Net et template
    Par Sphax dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 17/07/2004, 16h33
  4. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33
  5. Version de Windows dans Visual Studio !!!
    Par Jasmine dans le forum MFC
    Réponses: 3
    Dernier message: 18/03/2004, 17h40

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