D'accord, mais comment on teste une fonction?Envoyé par Mayhem
D'accord, mais comment on teste une fonction?Envoyé par Mayhem
Ok!! j'ai compris ça alors! 8) C'est moi ou c'est dur au début pour tout le monde???Envoyé par bigquick
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...
En effet, très important si tu ne veux pas passer 15mn à chercher ailleurs alors que c'est juste le malloc qui a échouéPrend également soin de tester le retour de la fonction malloc pour savoir si celle-ci 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
Et ouai, au début c'est dur, mais après t'y penses plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (p != NULL) { // tout va bien }
And still we will be here, standing like statues ...
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
A bientôt, et bon courage
And still we will be here, standing like statues ...
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 free(ptab);
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).Envoyé par Mayhem
Donc:
- s'assurer qu'on compile en C (extension du fichier .c et non .cpp)
- inclure stdlib.h
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)); } }
Dans ce cas, le bon forum est C++... mais tu vas te faire critiquer car tu programmes "à la C".Envoyé par Spike Spiegel
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.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...
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part scanf("%d", ptab+i);
Code : Sélectionner tout - Visualiser dans une fenêtre à part scanf("%d", &ptab[i]);
Eh bien, il s'en passe des choses pendant ma sieste!
Tu n'invoques pas le bon compilateur. Assure toi que tu appelles bien le compilateur C :Envoyé par Spike Spiegel
- 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
Oui.Envoyé par Spike Spiegel
Oui (aux fautes de frappes près...)celle ligne signifie que l'on alloue un espace mémoire de 10 fois 1 entier
Code : Sélectionner tout - Visualiser dans une fenêtre à part ptab = (int *)malloc(10*sizeof(int));
Non.au pointeur ptab.
Non. Je reformule (et j'utilise une meilleure présentation) :C'est à dire, que le pointeur va contenir l'adresse mémoire de 10 entiers. (?)
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int *ptab = malloc (10 * sizeof *ptab);
On peut ensuite utiliser le tableau alloué gràce au pointeur et à la notation indicée.
Pas de Wi-Fi à la maison : CPL
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 ^^
si je lui donné l'adresse d'un pointeur ça serait plutôt &ptab plutôt que *ptab non?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
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.
Pas vraiment. Mais je rappelle que le cast n'est pas obligatoire en C, qui garantit la conversion implicite void* -> T* et T* -> void *.Envoyé par bigquick
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
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...
bon, j'ai encore un soucis.
Il y 5 minutes, j'ai essayé ce code, il fonctionnait.
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); }
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'
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é.
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
5
6 void saisir(int **t,int n) { *t = (int *)malloc(n * sizeof(int)); int *ptr; if(t != NULL) {
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 !
Bonjour
je vais m'y mettre aussi :
Attention au prototype de main
En C c'est :
et en principe à la fin du main on a return 0;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int main (void) ou int main(int argc, char *argv[])
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
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!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager