Bonsoir , je ne trouve pas de tutoriel sur l'emploi de variable generique (void*) dans les listes chainées .
Quelq'un pourrait il me renseigner ?
Merci
Bonsoir , je ne trouve pas de tutoriel sur l'emploi de variable generique (void*) dans les listes chainées .
Quelq'un pourrait il me renseigner ?
Merci
Te renseigner sur quoi exactement ?
Un exemple à donner ? Un problème à exposer ?
Pas besoin de tutoriel, juste un cerveau en état de marche...Envoyé par issou
C'est simple. Toute variable a une adresse. Il suffit que celle-ci soit valide pendant le moment où on en a besoin pour enregistrer celle-ci dans un void *. Ensuite, on la récupère intacte et on initalise un pointeur du bon type avec cette valeur d'adresse (et on évite ainsi les cast gores, même un soir d'Halloween...) et le tour est joué. Aucune difficulté majeure.
Voir qsort() et sa fonction de comparaison.
Fait de ton mieux et poste ton code si tu es planté...
Pour savoir commment récuperer la valeur pointer par mon void * . Je sais que je dois faire un "cast" mais je voudrais avoir un exemple pour comprendre bien le principe .
Merci
Merci .
C'est simple. Toute variable a une adresse. Il suffit que celle-ci soit valide pendant le moment où on en a besoin pour enregistrer celle-ci dans un void *. Ensuite, on la récupère intacte et on initalise un pointeur du bon type avec cette valeur d'adresse (et on évite ainsi les cast gores, même un soir d'Halloween...) et le tour est joué. Aucune difficulté majeure.
Oui je crois que je dois avoir ca ...lolPas besoin de tutoriel, juste un cerveau en état de marche...
Ben non, pas besoin de cast si tu fais ce que je t'ai déjà expliqué. Essaye, ça mord pas.Envoyé par issou
Trop facile un exemple. C'est à toi de découvrir le mécanisme et de secouer ton neurone...
Voila le code qui bug . Il m'affiche toujours le même nom .
Un petit peu d'indulgence ne serait pas de refus merci . Ce code est pour s'entrainer et n'a aucun rôle précis ,mis a part apprendre à manipuler des listes doubles génériques ...(à bon entendeur ...)
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 #include <stdio.h> #include <alloc.h> struct liste { void * data; struct liste * suivant; struct liste * precedent; } depart, * noeud; struct element { char *nom; } tab_el[10]; main( void ) { int i; char *nom; depart.suivant = NULL; // liste vide depart.precedent = NULL; noeud = & depart; for ( i = 0; i < 10; i++ ) { noeud->suivant = ( struct liste * ) malloc( sizeof( struct liste ) ); noeud->suivant->precedent = noeud; // l'adresse du precedent du suivant est l'adresse du noeud courant noeud = noeud->suivant; printf(" entrez nom : \n");fgets(nom,sizeof(nom),stdin); noeud->data = nom; tab_el[i].nom = (char*) noeud->data; // affecte directly la valeur pointé par noeud->data dans le tableau de structure noeud->suivant = NULL; } noeud = depart.suivant; //adresse du début de liste i = 0; // calcul le nombre d'elements de la liste while ( noeud ) { i++; noeud = noeud->suivant; } printf( " il y a %d elements dans la liste \n", i ); getchar(); noeud = depart.suivant; //*********************************** i=0; while ( i<10) { printf( " %s\n", tab_el[i].nom ); i++; } getchar(); //************************************ return 0; }
Merci![]()
Hum...Envoyé par issou
Quelques remarques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Compiling: main.c main.c:2:19: alloc.h: No such file or directory main.c:27: warning: return type defaults to `int' main.c: In function `main': main.c:43: warning: implicit declaration of function `malloc' main.c:46: warning: implicit declaration of function `sieof' main.c:92:3: warning: no newline at end of file main.c:29: warning: 'nom' might be used uninitialized in this function
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 //#line 1 #include <stdio.h> /* -ed- #include <alloc.h> n'existe pas en C standard. */ #include <stdlib.h> struct liste { void * data; struct liste * suivant; struct liste * precedent; } depart, * noeud; struct element { char *nom; } tab_el[10]; /* -ed- main( void ) en C99, le type retourne' doit etre explicite. */ int main(void ) { int i; char *nom; depart.suivant = NULL; // liste vide depart.precedent = NULL; noeud = & depart; for ( i = 0; i < 10; i++ ) { noeud->suivant = ( struct liste * ) malloc( sizeof( struct liste ) ); /* -ed- Ne pas mettre de commentaires longs en fin de ligne. Ne pas depasser 76 colonnes. */ // l'adresse du precedent du suivant est l'adresse du noeud courant noeud->suivant->precedent = noeud; noeud = noeud->suivant; printf(" entrez nom : \n"); /* -ed- fgets(nom,sieof(nom),stdin); - faute de frappe. Ne pas retaper, mais copier/coller. - parentheses inutiles. - garder en tete que fgets() prend aussi le '\n' (quand il peut)... - 'nom' n'a jamais ete initialise. Le comportement est indefini. * Arret de l'analyse du code. * */ fgets(nom,sizeof nom,stdin); <...>
inclut stdlib.h au lieu de alloc.h
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Un peu de réflexion ne fait pas de mal non plus : je pense que ce qu'Emmanuel Delahaye a voulu dire est qu'il ne faut pas constamment se tourner vers les autres quand on est face à un problème car c'est un bon moyen de ne rien apprendre.Envoyé par issou
Autrement dit, il y a deux approches : "C'est en forgeant qu'on devient forgeron" ou "RentACoder".
Je ne pense pas que ni ses remarques (ni les miennes) soient faites pour être méchantes/te rabaisser/etc...c'est juste qu'un petit "coup de pied au c*l" aide parfois à avancer
Bref...
1) Pour malloc(), il me semle qu'on inclut plutôt "<stdlib.h>" et pas "<alloc.h>".
2) j'utiliserai "sizeof" plutôt que "sieof"
3) avant de stocker des données lues à un emplacement pointé par...un pointeur ("char *nom" en est un il me semble), je m'assurerai que la zone pointée a été allouée. Or, je ne vois pas de "nom=malloc(taille)".
[Edit 1] : ajout du "a" avant "vant" pour obtenir "avant"
Voila c'est fait . ( quel est le probleme avec alloc.h ? )--------------------------------------------------------------------------------
inclut stdlib.h au lieu de alloc.h
j'ai éditer le code et corriger la faute de frappe . Donc vola je repose la question
Non standard. (N'existe pas chez moi, comme déjà indiqué).Envoyé par issou
(Puisque tu as trouvé le bouton [editer], profites en pour te relire et corriger tes fautes. Ca permet d'être lisible à peu de frais...)j'ai éditer le code et corriger la faute de frappe . Donc vola je repose la question
- Tu as laissé le <alloc.h>
- Tu as reçu des indications pour corriger ton code. Il en manque une. Pour que les données soient stockée en liste chainée, il faut instancier les données attachées aux élément de la liste chainée. Pour celà, tu dois créer une copie des données (par exemple dynamique avec un strdup() du nom, par exemple).
Nota : strdup() n'est pas standard, mais POSIX, ce qui la rend très portable. strdup() faisant un malloc() interne, il faut ensuite faire un free() quand on libère ...
Autant pour moi, si c'est le sentiment que tu as eu, cela m'ennuie de poster un message sur le forum car j'aime apprendre par moi meme sans rien demander , mais quand j'ai pas le choix ? j'ai tester 20 fois , visister une dizaine de site parlant de ce sujet, tester differemment, shématiser et malgré ca je ne trouve pas c'est là que je me tourne à vous . Alors si vous pensez que je ne "forge" pas assez, désolé ...Un peu de réflexion ne fait pas de mal non plus : je pense que ce qu'Emmanuel Delahaye a voulu dire est qu'il ne faut pas constamment se tourner vers les autres quand on est face à un problème car c'est un bon moyen de ne rien apprendre.
Autrement dit, il y a deux approches : "C'est en forgeant qu'on devient forgeron" ou "RentACoder".
Je ne pense pas que ni ses remarques (ni les miennes) soient faites pour être méchantes/te rabaisser/etc...c'est juste qu'un petit "coup de pied au c*l" aide parfois à avancer
Sinon merci pour les explications .
P.s: heureusement que j'ai écrit ceci avant lol :
amicalementUn petit peu d'indulgence ne serait pas de refus merci .![]()
Salut !
Je ne sais pas si Emmanuel va se souvenir de moi ...![]()
L'année dernière, je l'ai rendu un peu dingue avec toutes mes questions et je lui ai expliqué à maintes reprises que ça ne tenait absolument pas de la mauvaise volonté mais qu'avec les minables infos qu'on nous donnait aux cours, il était très difficile de progresser, meme si on a un cerveau un bon état...
Et je vois qu'aujourd'hui, c'est Issou (issu de la meme école et des memes profs) qui répète la meme chose. A nouveau, il ne faut pas croire qu'il se repose sur vous... Il est légèrement perdu et le moindre petit indice le ferait bien avancer; c'est en ce sens qu'il demandait un exemple.
Voilà, c'était ma petite contribution au topic![]()
Je sens une certaine moquerie dans ta phrase , cela n'etait pas nécessaire je pense . Enfin soit, on peut pas tout apprendre dans les bouquins de C non plus !Puisque tu as trouvé le bouton [editer
C'est bien pour ça que nous (moi y compris) lui en avons donné. On est pas des sauvages tout de même...Envoyé par Mike888
Je parlais des listes doublement chainées et surtout du pointeur sur void.
On a pas dit le contraire et d'ailleurs je t'ai remercié pour cela .C'est bien pour ça que nous (moi y compris) lui en avons donné
Partager