Pb en C
Résolu
bonjour,
j'ai un petite fonction en C mais qui me pose bcp de problèmes,
je voudrai savoir ce que retourne la fonction main
et si possible ce serait encore mieux si quelqu'un arrive a m'expliquer le resultat.
Merci.
(@_@)
j'ai un petite fonction en C mais qui me pose bcp de problèmes,
je voudrai savoir ce que retourne la fonction main
void f(int **i)
{
*((*i)++) +=1;
}
void main(void)
{
int i[5] = {0, 2, 4, 6, 8}, *p=i;
for(; *p!=8; p++)
f(&p);
printf("%d %d\n", i[0], *p);
}
et si possible ce serait encore mieux si quelqu'un arrive a m'expliquer le resultat.
Merci.
(@_@)
28 réponses
Résumé de la discussion
Le fil porte sur l'interprétation d'une fonction C et sur l'expression *((*i)++) += 1 dans le cadre d'un tableau d'entiers et d'un pointeur itinérant repéré dans une boucle. Plusieurs messages expliquent comment le postfix sur le pointeur et l'incrémentation de la valeur affectent i[0] et la position du pointeur p, certains détails pouvant prêter à confusion. Des échanges abordent aussi des aspects hors sujet ou des réponses ambiguës, reflétant une diversité de niveaux de compréhension et des réactions parfois tendues entre participants. En pratique, l'exécution entraîne que i[0] est incrémenté d'une unité et que p avance jusqu'au dernier élément avant la condition d'arrêt, ce qui conduit à l'impression 1 8.
-
Bonjour,
pour répondre correctement à Bob le ranger, je te faits mes excuses pti gars, DSL, j'avais pas vu O COMBIEN j'avais touche ton amour propre en disant que cette fonction renvoyer de la chiasse, dsl.
Bon sinon, je vois vraiment pas pourquoi il est aussi long ton baratin, tout ca pour me dire " je t'en veux d'être un genie en informatique[ petite precision d'ailleurs> pas qu'en info rassures toi boby]".
Voilà
Bon faudrait qu'on arrête de prendre ce forum pour un defouloir parce que l'admni de ces environs doit maintenant se dire " je les vire ou pas ces cons !!!"
@+
abdelhak
" Nul être humain ne peut en elever un autre, ' Il ' fait de ns ce que ns sommes, la nature ns aide à ns en rappeler au quotidien " -
Bonjour,
tout d'abord et avant tout je voudrai remercier tous ceux qui ont eu l'amabilité de lire et de répondre à ma requête.
Bon, maintenant que c'est fait, je peux m'attaquer à l'energumène qui se prend pour Freud.
Toi! qui n'a rien de mieux à faire que d'écrire des sotises tu ferais mieux de trouver une utilité dans ta misérable vie. Parce que si je lis toutes tes âneries, je me rends compte à quel point t'as battu (de très loin d 'ailleurs) le record du monde de la stupidité. Je dis stupidité pour ne pas prononcer d'autres termes qui risqueraient de choquer les lecteurs. Car moi aussi je peux être violent et agressif. C'est facile, gratuit et c'est à la portée de tout le monde. Mais ça n'aide personne. D'ailleurs c'est un grand effort que celui que je suis en train de faire, cad de ne pas me rabaisser à ton niveau de langage.
Tu devrais savoir que si t'a choisi de t'exprimer dans ce forum c'est ton droit et personne ne peut t'en empecher. Mais par contre comme tout internaute, t'as aussi des devoirs. Le minimum serait de les appliquer. Au cas où tu les aurait oubliés:
http://www.commentcamarche.net/ccmguide/ccmcharte.php3
Bon t'a fini la lecture de la charte???
Je suis sûr que t'a rien compris. Relie le encore une fois ça ne peut te faire que du bien.
D'ailleurs en même temps ça mettra en route les quelques neurones qui te restent. Car avouons-le t'as surement moins de neurones qu'une blonde. (J'ai rien contre les blondes mais bon on va pas quand même le comparer à un chimpanzé. Ce serait humiliant pour le singe.)
http://www.commentcamarche.net/ccmguide/ccmcharte.php3
Bon, j'espère que la lecture de la charte n'a pas été trop ennuyante pour toi. Maintenant tu saura qu'est ce que tu peux (ou pas) dire et/ou faire.
Comme le dit si bien Bob:
ce code n'est pas "humain" mais ce n'est pas une raison pour se montrer agressif
En effet, je suis content que d'autres personnes s'intéressent à mon problème. Est ce que tu crois que j'aurai demandé de l'aide si je voulais savoir qu'est ce qu'elle faisait la fonction suivante???
main() { printf("Hello world\n"); }
Si tu veux je peux même répondre à l'une de tes questions:
Quel est ton but quand tu poses ta question sur ton ramassi de merde en c???
Savoir s'il existe tjrs des imbéciles sur terre pour réagir comme des troglodites (tu c'est pas ce que veux dire ce mot là??? va voir dans le dico...). Tu va chercher la lettre T qui se trouve entre S et U. Puis t'enchaine avec la lettre R... et ainsi de suite.
Tiens je te redonne l'ordre alphabétique des lettres (o cas ou tu l'oré oublié):
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Merde j'ai oublié de t'expliquer c quoi un dico... ben tu demande à papa ou maman ils le sauront sûrement, il doit être caché quelque part.
Au fait si t'a besoin de construire une base en beton armé je te conseille de t'adresser a des maçons. Ils auront surement plus de qualifications et d'expérience qu'un groupe d'informaticiens. (Quoique l'un n'empêche pas l'autre.)
Ne vous inquiétez pas, je ne suis pas devenu fou c'est juste que abdel m'a influencé avec sa merde.
Merci @rachnid de toutes tes réponses. Je te remercie d'avoir pris du temps pour me répondre.
J'ai encore une multitude de questions et de nouvelles fonctions à résoudre par la suite.
Merci d'avoir lu jusqu'à la fin même si ce que j'ai dit n'a pas toujours du sens.
(désolé pr les blagues pourries... )
"Il faut de tout pour faire un monde."
THE END
(@_@) -
Tu me rafraichis la mémoire stp?
-
ouai alors tout cela ne repond pas à ma demande
pour le moment, personne ne peut me dire si oui ou non le projet est pertinnent
comme dirait l'autre
ALLES KLAR
abdel -
cet effet*
-
Vous avez fini cet enfantillage? J'ai pas 30 plombes et pourtant je me rabaisserai pas à ce jeu qui ne rime à rien. Oui ce code n'est pas "humain" mais ce n'est pas une raison pour se montrer agressif. C'est la tournure de notre société qui vous fait cette effet? Prenez un bouffé d'air frais cela vous fera le plus grand bien.
On inspire :-.
On expire :-o -
salut
déjà je voudrais dire à celui qui m'insulte de con que, à mon avis, si je prends au premier degré la manière dont il m'imagine intellectuellement, je crois que y'as pas PHOTOS mon ptit entre toi et moi.
Tu vois, moi, mon default, c'est de dire 'con' par devant, à la personne qui es conne, contrairement à toi, qui préferera la comédie, c'est à dire, vanter les merites de cette même personne sachant pertinnement qu'elle te ressemble, et donc, qu'elle est conne, donc, stupide.
Quand j'ai donné mon avis sur le gars qui voulait savoir ce que son prof lui avait filer comme fonction C, je l'ai donne honnêtement parce que je savais que ce code , c'est de la vrai merde
Ce code a été créer avec l'intelligence du gars en question , et sans pour autant suivre un quelquonque standard de programmation dans un soucis de portabilité efficiente mon ptit con, voilà.
De ce coup, son auteur à peut être compris ce qui parait etre une merveille de prog à ses yeux, mais comme disait Albert, " tout est relatif".....
Sinon, toi, tu à une grande geule, mais cela , je m'en tape.
Ce qui m'interèsse, c'est de savoir si tu pourrais rejoindre une equipe que je suis en train de monter sur des bases en beton armé....
T'es une bête en programmation?? quand je dis " bête", je suppose déjà que tu as plus de trentes piges , ca c clair, pas de ptis cons dans l'entreprise, juste des gars qui savent de quoi ils parlent.
Si le gars qui gère ce site est partant, il n'a qu'à me répondre par mail afin que ns puissions déjà evaluer son niveau.
voilà
j'ai finis
bonne programmation propre à tout le monde et @+
abdel -
fonction main de type void renvoyant void
question posée> que renvoie la fonction principale???
c vraiment se foutre de la tete des gens( permettez si cela se dit)
un pointeur sur l'adresse du tableau en memoire &i[0]???
pourquoi?
incrementer le pointeur pour que lui incremente les valeurs de tab[]??
comment voulait vous aider des personnes qui posent des questions comme cela??
comme dirait un gars qui a poster plus haut, y 'as vraiment des personnes à la logique" tordument" deroutante -
Je veux savoir si c'est l'algorithme d'une matrice magique :
k:=1;i:=1;j:=(n+1)/2;Mi,j:=k;
Pour k de 2 à n2 faire:
i1:=i-1 (si i=1, on prend i1=n)
j1:=j+1 (si j=n, on prend j1=1)
si Mi1,j1¹ 0, faire i1=i+1 (ou i1=n), et j1:=j
Mi1,j1:=k
i:=i1; j:=j1 -
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 | -
Je me permet de corriger une erreur du visiteur
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). -
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 ... -
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 -
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)
-
-
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.
(@_@) -
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. -
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 !
(@_@) -
Je me suis encore gouré je croi que je V fermé ma gueule et laissé parlé les autres ^^
-
Je me suis encore gouré je croi que je V fermé ma gueule et laissé parlé les autres ^^
-
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.
- 1
- 2
Suivant