Pb en C
Résolu/Fermé
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
-
3 nov. 2003 à 09:14
Abdélhak - 19 nov. 2003 à 10:33
Abdélhak - 19 nov. 2003 à 10:33
28 réponses
La fonction "main()" ne retourne rien car "void"apres je note que le typage du pointeur "p" est sans doute "int" car apposé par "," puis la boucle "for()" n'est pas commode car il n'y a pas d'initialisation dans la boucle mais on comprend que c'est la valeur pointé par "p" soit "i" qui initialise la boucle et que la condition d'arrêt est la valeur pointée par "p" soit "i == 8". L'incrémentation semble douteuse car on devrait non incrémenté le pointeur "p" qui je rappelle contient une adresse mais la valeur pointé soit "i" ou "*p". Bref ensuite on applique la fonction "f()" à l'adresse de "p" soit ... ça devient space sur ce morceau, bon on respire une grande bouffée d'air pure. Je remarque que dans la fonction "f()" on incrémente la valeur pointée par "i" soit la valeur de "p" ou l'adresse du "i" global dans "main()". Bon ici je lache prise ça devient du n'importe nawak si quelqu'un se sentait le courage de poursuivre parce que c'est vraiment du code spaghetti.
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
4 nov. 2003 à 10:41
4 nov. 2003 à 10:41
je te remercie de ton explication...
ce serait encore mieux si qqun pourrait expliquer le reste (cad la fonction f)
merci
(@_@)
ce serait encore mieux si qqun pourrait expliquer le reste (cad la fonction f)
merci
(@_@)
Tu l'as déniché où ce code car je serais curieux de savoir quel être à la logique si déroutante a bien pu écrire ce programme.
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
4 nov. 2003 à 11:03
4 nov. 2003 à 11:03
je donnerai pas le nom... ni la source...
disons que c fait par un "prof"... je vais me taire!!
je voudrai plutot comprendre le code...
merci
(@_@)
disons que c fait par un "prof"... je vais me taire!!
je voudrai plutot comprendre le code...
merci
(@_@)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Il ne reste plus grand chose à expliquer si ce n'est que "i" de "main()" est finalement incrémententée dans "f()".
salut
déjà , je me demande vraiment à quoi peut bien servir un tel ramassi compact et dense de portion de code c????
bref,
la fonction f comme je l'ai comprise, revoie en fait " de la merde" et croyez moi, je n'exagère en rien l'expression utilisée!!!
toutes les lois de la programmation sont enfreinds
une telle fonction ne peut que vraiment vraiment fonctionner avec un co:mpilo créer dans un même etat d'esprit> cad> complètement chaotique
donc, je me refuse totalement d'aider des personnes qui posent des questions propres à des problèmes aussi tordus!!!
sans deconné, je m'adresse à l'auteur de ce post> quel est ton but quand tu poses ta question sur ton ramassi de merde en c???
vraiment n'importe quoi, c même pas du code spaguettos, c du neant total
@+
déjà , je me demande vraiment à quoi peut bien servir un tel ramassi compact et dense de portion de code c????
bref,
la fonction f comme je l'ai comprise, revoie en fait " de la merde" et croyez moi, je n'exagère en rien l'expression utilisée!!!
toutes les lois de la programmation sont enfreinds
une telle fonction ne peut que vraiment vraiment fonctionner avec un co:mpilo créer dans un même etat d'esprit> cad> complètement chaotique
donc, je me refuse totalement d'aider des personnes qui posent des questions propres à des problèmes aussi tordus!!!
sans deconné, je m'adresse à l'auteur de ce post> quel est ton but quand tu poses ta question sur ton ramassi de merde en c???
vraiment n'importe quoi, c même pas du code spaguettos, c du neant total
@+
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
4 nov. 2003 à 13:30
4 nov. 2003 à 13:30
tu fais ce que tu veux...
sache que ce charabia c issu d'une interro, c pr ca ke c oci simple
:-p
si t'a pas envie de m'aider, je me passerai de tes services...
je crois ke je suis dans un forum et que le but est de s'entraider...
a mon avis tes commentaires ne me sont pas d'une grande utilité
la fonction f comme je l'ai comprise, revoie en fait " de la merde" et croyez moi, je n'exagère en rien l'expression utilisée!!!
il faut pas etre surdoué pr le deviner... c pour ca que j'utilise ce forum...
bon, j'espere que ce genre de commentaires ne se reproduiront pas
si qqun veut m'aider c bien, sinon tant pis...
(@_@)
sache que ce charabia c issu d'une interro, c pr ca ke c oci simple
:-p
si t'a pas envie de m'aider, je me passerai de tes services...
je crois ke je suis dans un forum et que le but est de s'entraider...
a mon avis tes commentaires ne me sont pas d'une grande utilité
la fonction f comme je l'ai comprise, revoie en fait " de la merde" et croyez moi, je n'exagère en rien l'expression utilisée!!!
il faut pas etre surdoué pr le deviner... c pour ca que j'utilise ce forum...
bon, j'espere que ce genre de commentaires ne se reproduiront pas
si qqun veut m'aider c bien, sinon tant pis...
(@_@)
G pas fini de tout dechiffrer mais tu peut dorzédeja remplacer
a l' interrieur de la fonction f() par "
4 represente la taille d'une variable de type int. En gros on avance d'un caractere dans le tableau a chaque fois que l'on va dans la fonction.
*((*i)++) +=1;
a l' interrieur de la fonction f() par "
*1=*1 =4;".
4 represente la taille d'une variable de type int. En gros on avance d'un caractere dans le tableau a chaque fois que l'on va dans la fonction.
dsl mais je me suis tromper en haut c'est pas 4 qu' il faut mettre dans la fonction mais 1. ca augment de 4 ocets dans l' emplacement automatiquement.
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
5 nov. 2003 à 08:41
5 nov. 2003 à 08:41
je te remercie de ton aide...
tu m'aide plus que certaines personnes qeu je ne citerai pas.
Petit a petit...
l'oiseau fait son kiki !
(@_@)
tu m'aide plus que certaines personnes qeu je ne citerai pas.
Petit a petit...
l'oiseau fait son kiki !
(@_@)
G compris ce que fait le programme: il incremente de 1 un element sur deux dans le tableau (a part le dernier vu que la boucle s' arrete quand on arrive a l'element 8). Et si on enleve le ++ dans la fonction f() c'est tout les element(a part le dernier tjr).
La fonction prend l'emplacement de p soit l'emplacement du tableau. Donc l'emplacement du tableau devient i dans la fonction. Donc le pointeur i est egale au tableau ( si je n'abuze (*i)+1 est egale à i[1] ). Et on incremante 1 sur un element du tableau comme on peut le voir *((*i)++) +=1;.
Mais il incremente que un element sur deux car en plus de l'incremantation de p dans la boucle for() il y a un ++ apres le pointeur i.
Voila ce que G compris. Si ce que G di n'est pas tres explicite n'esite a me poser des questions.
La fonction prend l'emplacement de p soit l'emplacement du tableau. Donc l'emplacement du tableau devient i dans la fonction. Donc le pointeur i est egale au tableau ( si je n'abuze (*i)+1 est egale à i[1] ). Et on incremante 1 sur un element du tableau comme on peut le voir *((*i)++) +=1;.
Mais il incremente que un element sur deux car en plus de l'incremantation de p dans la boucle for() il y a un ++ apres le pointeur i.
Voila ce que G compris. Si ce que G di n'est pas tres explicite n'esite a me poser des questions.
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
12 nov. 2003 à 11:10
12 nov. 2003 à 11:10
je remercie tt ceux qui m'ont repondu.
prenons un exemple pour que je me clarifie un peu les idées (c tt sombre la dedans...)
disons que notre tableau est le suivant et que le premier élément du tableau commence à l'adresse 700.
le pointeur p (qui se trouve par exemple à l'adresse 800) va pointer vers le premier élément du tableau (a l'adresse 700)
_700_701_702_703_704_______800___
| 0 | 2 | 4 | 6 | 8 |..........| p |
maintenant que cela est dit je vais essayer d'expliquer étape par étape si j'ai bien compris la fonction f
(plus precisement ce charabia: *((*p)++) += 1 ;)
lors de son premier appel *p est egal à 700
->puis (*p)++ donne 700++ cad 701 ??
->ensuite *((*p)++) c'est la même chose que *(701) => 2 ??
->enfin *((*p)++) += 1 on incrémente la deuxieme case de 1
=> donc le tableau lors du premier appel à f devient:
_700_701_702_703_704_______800___
| 0 | 3 | 4 | 6 | 8 |...........| p |
est-ce bien cela ???
mais ce que je n'arrive pas à comprendre c'est :
"Mais il incremente que un element sur deux car en plus de l'incremantation de p dans la boucle for() il y a un ++ apres le pointeur i."
Comment se fait-il qu'il incremente 1 élément sur 2..???
donc à la fin du traitement le tablo devient...
_700_701_702_703_704_______800___
| 0 | 3 | 4 | 7 | 8 |...........| p |
et *p vaut quoi a la fin???
dsl d'être oci nul...
mais je ne trouve aucun otre moyen pr progresser...
merci.
(@_@)
prenons un exemple pour que je me clarifie un peu les idées (c tt sombre la dedans...)
disons que notre tableau est le suivant et que le premier élément du tableau commence à l'adresse 700.
le pointeur p (qui se trouve par exemple à l'adresse 800) va pointer vers le premier élément du tableau (a l'adresse 700)
_700_701_702_703_704_______800___
| 0 | 2 | 4 | 6 | 8 |..........| p |
maintenant que cela est dit je vais essayer d'expliquer étape par étape si j'ai bien compris la fonction f
(plus precisement ce charabia: *((*p)++) += 1 ;)
lors de son premier appel *p est egal à 700
->puis (*p)++ donne 700++ cad 701 ??
->ensuite *((*p)++) c'est la même chose que *(701) => 2 ??
->enfin *((*p)++) += 1 on incrémente la deuxieme case de 1
=> donc le tableau lors du premier appel à f devient:
_700_701_702_703_704_______800___
| 0 | 3 | 4 | 6 | 8 |...........| p |
est-ce bien cela ???
mais ce que je n'arrive pas à comprendre c'est :
"Mais il incremente que un element sur deux car en plus de l'incremantation de p dans la boucle for() il y a un ++ apres le pointeur i."
Comment se fait-il qu'il incremente 1 élément sur 2..???
donc à la fin du traitement le tablo devient...
_700_701_702_703_704_______800___
| 0 | 3 | 4 | 7 | 8 |...........| p |
et *p vaut quoi a la fin???
dsl d'être oci nul...
mais je ne trouve aucun otre moyen pr progresser...
merci.
(@_@)
n@n¤u
Messages postés
195
Date d'inscription
mardi 30 septembre 2003
Statut
Membre
Dernière intervention
24 octobre 2008
10
13 nov. 2003 à 10:46
13 nov. 2003 à 10:46
si qqun voudé bien répondre ce seré cool...
(@_@)
(@_@)
bonjour
voila ce que j'ai compris de ce prog :
1.initialisation :
création d'1 tableau i de int (l'adresse de ce tableau correspond à l'adresse du premier élément du tableau ici 0),
ensuite on donne au pointeur p l'adresse du premier élément de i (ici vaut 0 à l'adresse 0x... ) donc *p=0.
2.description de la boucle for :
2.1 attention à l'initialisation car elle change avec la fonction f puis si *p différent de 8 on traite f
2.2 premier tour de boucle
l'adresse est celle du premier élément du tableau i ici 0
donc *p=0 on appelle la fonction f qui reçoit l'adr de p
ici 2 choses :
on change la valeur pointée par l'adresse passée en paramètres :
on fait +=1 sur la valeur à cette adresse (1er élément du tableau)
donc on passe de 0 à 1 pour i[0].
puis on incrémente l'adresse ((*j)++) donc l'adresse de p a été augmentée de 1
on passe à la deuxième itération mais avec p qui vient d'être modifiée
2.3 deuxième tour de boucle
ici p vaut l'adr de départ +2 car (*j)++ et (p++ ds le for) l'adresse est donc celle du 3ème élément du tableau i donc *p = 4
(rem p++ équivaut à +4 car c un pointeur sur int dc 4 octets mais c transparent)
on change la valeur pointée par l'adresse mémoire passée en paramètres (on fait +1) donc ici 4+1 = 5 pour i[3]:
puis on incrémente l'adresse ((*j)++)
on passe à la troisième itération mais avec p qui vient d'être modifiée :
2.4 troisième tour de boucle
ici p vaut l'adr de départ +4 car (*j)++ et (p++ ds le for) l'adresse est donc celle du 5ème élément du tableau i donc *p = 8
il faut sortir de la boucle
3. impression des résultats :
1 pour i[0] (voir 2.2) et 8 pour *p (voir 2.4)
voila ce que j'ai compris de ce prog :
1.initialisation :
création d'1 tableau i de int (l'adresse de ce tableau correspond à l'adresse du premier élément du tableau ici 0),
ensuite on donne au pointeur p l'adresse du premier élément de i (ici vaut 0 à l'adresse 0x... ) donc *p=0.
2.description de la boucle for :
2.1 attention à l'initialisation car elle change avec la fonction f puis si *p différent de 8 on traite f
2.2 premier tour de boucle
l'adresse est celle du premier élément du tableau i ici 0
donc *p=0 on appelle la fonction f qui reçoit l'adr de p
ici 2 choses :
on change la valeur pointée par l'adresse passée en paramètres :
on fait +=1 sur la valeur à cette adresse (1er élément du tableau)
donc on passe de 0 à 1 pour i[0].
puis on incrémente l'adresse ((*j)++) donc l'adresse de p a été augmentée de 1
on passe à la deuxième itération mais avec p qui vient d'être modifiée
2.3 deuxième tour de boucle
ici p vaut l'adr de départ +2 car (*j)++ et (p++ ds le for) l'adresse est donc celle du 3ème élément du tableau i donc *p = 4
(rem p++ équivaut à +4 car c un pointeur sur int dc 4 octets mais c transparent)
on change la valeur pointée par l'adresse mémoire passée en paramètres (on fait +1) donc ici 4+1 = 5 pour i[3]:
puis on incrémente l'adresse ((*j)++)
on passe à la troisième itération mais avec p qui vient d'être modifiée :
2.4 troisième tour de boucle
ici p vaut l'adr de départ +4 car (*j)++ et (p++ ds le for) l'adresse est donc celle du 5ème élément du tableau i donc *p = 8
il faut sortir de la boucle
3. impression des résultats :
1 pour i[0] (voir 2.2) et 8 pour *p (voir 2.4)
Je V essayé de te repondre mais je te repondré surment ce soir vers 11h00 12h00 donc si tu va bien tu ora ta reponse demain.
mais je doi avouer que C assez compliquer a expliqué dans ma tete tout est clair mais pour expliquer apres c plus pareil
mais je doi avouer que C assez compliquer a expliqué dans ma tete tout est clair mais pour expliquer apres c plus pareil
dsl de ne pas t'avoir repondu plus tot mais je ne pouV pas.
Au debut du progamme on initialise un tableau 'i' de type 'int' juste apres on initialise un pointeur qui pointe vers le tableau 'i'. Donc maintenant '*p = i' et 'p = l'emplacement de i'(&i).
En suite il y a une boucle for quia comme condition pour tourner 'p' ne soit pas egale '8' ensuite il y a une incremantation de 'p' soit l'emplacement du tableau 'i' a la fin de chaque tours. Autrement dit on avance d'un argument dans le tableau.
Poursuivont, la il y a un appel a la fonction 'f()' avec comme argument l'emplacement de pointeur 'p' (&p) le pointeur 'p' qui je le rapel pointe vers le tableau.
Nous voila dans la fonction, on initialise un "double" pointeur 'i'(**i) (tu veras pk il faut faire un "double" pointeur un peu plus apres) (ce 'i' la n'a "rien a voir" avec le tableau du meme nom) avec comme "objet" 'p'. Maitenant 'i = l'emplacement de p' , '*i = p = l'emplacement du tableau i'(&i) et enfin '**i = *p = tableau i'.
je sais pas si c'est tres clair alors je vais te faire un piti chéma
i (tableau) | | | &i | i |
p | | &p | p | *p |
i (pointeur) | &i | i | *i |**i |
N'importe quel argument du tableau a pour equivalent un des arguments ce trouvant dans la meme colone que celui ci(exemple : si l'on ecrit '*i=20' ce la reviens a dire que 'p=20' ou '&i=20').
Il faut initialiser un "double" pointeur 'i' pour pouvoir acceder a 'i' ou a '*p'. Ce "double" pointage oré plus etre evité en metan comme argument de la fonction 'p' a la place de '&p' mais le programme n'est pas fait comme ca alors passon
Si taV pas compris jesper que C plus clair.
Nous allons analiser l'insrtuction de la fonction je vais essayé d'etre le plus clair possible.
On commence a incrementer '*i' soit '&i'(le tableau cette fois) a l'aide de '(*i)++'.
Note qui si on incremente l'emplacement d'un tableau on arrive a l'emplacement du premiere argument de celui ci et note aussi l'importance des parentèzes qui servent a dire que l'on incremente '*i' et non 'i' si on avez marqué '*i++' c'est 'i' qui aurait ete incremente et non '*i'.
Les dernieres parentezes servent a pointer le tous pour "arivé" a 'i'. (putain !!c'est laborieu a expliqué) le '+= 1' sert a ajouter 1 a l'argument du tableau, au premier si c'est le premier passage dans la fonction. Si ta pas compris C normal, mais la G du mal a expliqué.
Des que la boucle est fini on sort quelques valeurs. Mais je pense que tu a compris la derniere ligne.
Bon bah voila !! G fait du mieu que je peu alors voila ...
Au debut du progamme on initialise un tableau 'i' de type 'int' juste apres on initialise un pointeur qui pointe vers le tableau 'i'. Donc maintenant '*p = i' et 'p = l'emplacement de i'(&i).
En suite il y a une boucle for quia comme condition pour tourner 'p' ne soit pas egale '8' ensuite il y a une incremantation de 'p' soit l'emplacement du tableau 'i' a la fin de chaque tours. Autrement dit on avance d'un argument dans le tableau.
Poursuivont, la il y a un appel a la fonction 'f()' avec comme argument l'emplacement de pointeur 'p' (&p) le pointeur 'p' qui je le rapel pointe vers le tableau.
Nous voila dans la fonction, on initialise un "double" pointeur 'i'(**i) (tu veras pk il faut faire un "double" pointeur un peu plus apres) (ce 'i' la n'a "rien a voir" avec le tableau du meme nom) avec comme "objet" 'p'. Maitenant 'i = l'emplacement de p' , '*i = p = l'emplacement du tableau i'(&i) et enfin '**i = *p = tableau i'.
je sais pas si c'est tres clair alors je vais te faire un piti chéma
i (tableau) | | | &i | i |
p | | &p | p | *p |
i (pointeur) | &i | i | *i |**i |
N'importe quel argument du tableau a pour equivalent un des arguments ce trouvant dans la meme colone que celui ci(exemple : si l'on ecrit '*i=20' ce la reviens a dire que 'p=20' ou '&i=20').
Il faut initialiser un "double" pointeur 'i' pour pouvoir acceder a 'i' ou a '*p'. Ce "double" pointage oré plus etre evité en metan comme argument de la fonction 'p' a la place de '&p' mais le programme n'est pas fait comme ca alors passon
Si taV pas compris jesper que C plus clair.
Nous allons analiser l'insrtuction de la fonction je vais essayé d'etre le plus clair possible.
On commence a incrementer '*i' soit '&i'(le tableau cette fois) a l'aide de '(*i)++'.
Note qui si on incremente l'emplacement d'un tableau on arrive a l'emplacement du premiere argument de celui ci et note aussi l'importance des parentèzes qui servent a dire que l'on incremente '*i' et non 'i' si on avez marqué '*i++' c'est 'i' qui aurait ete incremente et non '*i'.
Les dernieres parentezes servent a pointer le tous pour "arivé" a 'i'. (putain !!c'est laborieu a expliqué) le '+= 1' sert a ajouter 1 a l'argument du tableau, au premier si c'est le premier passage dans la fonction. Si ta pas compris C normal, mais la G du mal a expliqué.
Des que la boucle est fini on sort quelques valeurs. Mais je pense que tu a compris la derniere ligne.
Bon bah voila !! G fait du mieu que je peu alors voila ...
Je me permet de corriger une erreur du visiteur
l'adresse du tabeau ne corespond pas a l'adresse du premiere element mais juste a l'adresse du tableau. C'est 'i' sans idexation apres qui donne l'adresse du premiere element
si vous executez se code vous obti1dré l'adresse du premier element du tableau (moi j'obtient : 0x241ff50).
création d'1 tableau i de int (l'adresse de ce tableau correspond à l'adresse du premier élément du tableau ici 0),
l'adresse du tabeau ne corespond pas a l'adresse du premiere element mais juste a l'adresse du tableau. C'est 'i' sans idexation apres qui donne l'adresse du premiere element
int i[4] = {1,2,3,4}; cout<<i;
si vous executez se code vous obti1dré l'adresse du premier element du tableau (moi j'obtient : 0x241ff50).
re voila le tableau de met zexplikation pk il est tres clair (et c le mois que l'on puisse dire)
i (tableau) | | | &i | i |
p | | &p | p | *p |
i (pointeur) | &i | i | *i |**i |
i (tableau) | | | &i | i |
p | | &p | p | *p |
i (pointeur) | &i | i | *i |**i |