| Nan c'est exactement la même chose
les [] signifie que l'allocation est static, et * signifie que c'est dynamique c'est juste une allocation....
je viens de le faire chez moi, et ça marche très bien....
c'est ptètre tout simplement ce que tu lui envoie...
#include <stdio.h>
int fonfon(char t[ ],int val)
{
printf("%s\n%i\n",t,val);
system("pause");
return val+2;
}
int main()
{
int val=6;
char tab[23]={"coucou les amis"};
val= fonfon(tab,val);
printf("%i\n",val);
system("pause");
return 0;
} Répondre à guillaume_74 | 12 fiddy, le 18 oct 2008 à 13:27:13Clique sur les "répondre à" quand tu parles à une personne en particulier. Là je sais pas, si c'est pour me contredire ou contredire bizu ;)
Google is your friend Répondre à fiddy | Non je ne te contredit pas du tout^^ c'est juste que je voulais répondre :D mais... j'ai du faire un truc ou deux, et quand je suis revenu, des gens avaient posté entre temps :D lol
Moi je pensais juste qu'il avait fait une erreur dans le passage de paramètre, après je sais pas... Répondre à guillaume_74 |
|
| "Nan c'est exactement la même chose les [] signifie que l'allocation est static, et * signifie que c'est dynamique c'est juste une allocation.... "
=> tu le dis toi même ce n'est pas la même chose (même si au final on peut faire les mêmes choses avec, ce que je disais..)
Ce que je disais c'est que ce n'est pas "strictement" la même chose dans le sens où si on déclare en [], on peut l'utiliser comme * mais pas toujours (ou alors c'est l'inverse jsais plus). Répondre à bizu53 | Ouais mais ce que je voulais dire, c'est que c'était une question de normalisme... pour la compréhension.
Comme pour les classes en prog objet, il faut les nommer avec des majuscules... c'est inutile, mais c'est une norme.
Mais je suis conscient que je ne m'y connais pas plus que ça.
Je ne dirai plus rien qui contredirai quelqu'un! Répondre à guillaume_74 |
| 17 fiddy, le 18 oct 2008 à 23:31:11Non et non.
C'est bien strictement la même chose dans le cadre d'une fonction.
Par exemple int fonction(char *toto) est équivalent à int fonction (char toto[]). Exactement pareil. Vérifie par toi même en regardant les différences entre les sizeof. Tu verras aucune différence, et pour cause c'est strictement pareil.
En revanche, dans le corps d'une fonction, ce n'est pas du tout pareil. Le char toto[5] va initialiser statiquement une zone dans la pile alors que le char *buffer, initialisera un pointeur qui pointera dans une zone qu'on devra déclarer dans le heap à l'aide de malloc ou cie.
Google is your friend Répondre à fiddy | Je sais bien tout ça, mais encore une fois je ne parlais pas de ça... Je sais bien qu'en mémoire c'est la même place qui est utilisée et je n'ai jamais dit le contraire.
J'ai plusieurs exemples de projets que j'ai fait où je ne pouvais pas mettre : int mafonction(..., char *toto, ...)
et je devais mettre : int mafonction(..., char toto[], ...) si je voulais que ça fonctionne correctement.
Je ne prends aucun plaisir à contredire ce que tu dis ... je le dis en connaissance "de conséquence". (car la cause je ne la connais pas). Répondre à bizu53 | 19 fiddy, le 19 oct 2008 à 00:09:07Impossible lol. Désolé d'insister sur ce point, mais je te garantie que c'est strictement et rigoureusement la même chose. Et je te l'ai même démontré par un exemple.
Par contre c'est vrai que des fois, il peut y avoir des cas où l'un doit être utilisé et non l'autre. Mais dans le cas du prototype de fonction, c'est exactement la même chose.
Google is your friend Répondre à fiddy | J'ai voulu chercher sur google pour appuyer mes dire (car mes bouts de codes qui m'ont posés pb sont bien trop longs, et google ne cherche pas les crochets ni les étoiles).
Cependant peut-être serait-ce un élément de réponse (je ne sais pas) : http://mapage.noos.fr/emdel/notes#chaine_litterale
Ou alors peut-être les options du compilateur (je ne sais pas car j'y connais rien du côté compilation, je me contente de compiler avec les options de base).
Il y a certaines petites différences entraînées par le fait d'utiliser statique/dynamique, celle-ci en fait parti, et c'est tout.
De toute façon, moi je m'arrête sur ce sujet car je sais ce que je dis, et ça m'est égal ce que t'en penses. Le jour où tu tomberas dessus tu penseras à moi ;-) lol Répondre à bizu53 | 21 fiddy, le 19 oct 2008 à 00:55:26Quand on fournit un lien, faut savoir lire entre les lignes. Le lien que tu donnes dis clairement ce que je dis.
Je cite :
Le langage C n'autorise pas le passage d'un tableau en paramètre à une fonction. La raison est probablement une recherche d'efficacité, afin d'éviter des copies inutiles. Un paramètre 'pointeur' est donc exactement ce qu'il faut.
Rappelons que lorsqu'on définit un paramètre, les syntaxes type *param et type param[] sont sémantiquement équivalentes.
Ca, plus mon petit programme que je t'ai concocté pour te convaincre que c'est pareil. Que veux-tu de plus ?
Je vois très bien ce que tu veux dire, je suis tombé plein de fois sur ces cas. Mais dans le prototype de fonction non, et c'est normal car il y a équivalence (dixit par ton site) ;)
Google is your friend Répondre à fiddy | Pour en terminer, tu le dis toi-même alors qu'en dire ... pour le reste du site je l'ai lu, et c'est d'ailleurs marqué sémantiquement équivalentes et non pas strictement. Tu peux toujours dire que je chipote, oui, j'appelle un chat un chat, ce n'est pas "strictement" équivalent. Répondre à bizu53 | 23 fiddy, le 19 oct 2008 à 01:51:38Pour ma part, je te l'ai démontré par a+b avec le programme du début. On ne peut pas faire passer un tableau dans une fonction, juste son pointeur. Voilà pourquoi, c'est strictement la même chose
Et puisque t'as l'air dubitatif, je t'envoie un lien : http://cermics.enpc.fr/polys/info1/main/node72.html
Je cite :
Contrairement à ce nous venons d'écrire pour l'affectation t = p;, qui est illégale, il se trouve que dans la situation inverse, une fonction void f(int t[]) sur les tableaux, peut être appelée avec un pointeur en argument, f(p). Ceci provient du fait que ce n'est pas l'objet tableau qui est passé en argument, mais seulement son adresse, et que cette adresse est une valeur de type int*. Les deux déclarations suivantes de fonctions sont donc exactement équivalentes :
void f(int t[]); // ÉQUIVALENT
void f(int *t); // ÉQUIVALENT
Et si t'es toujours pas convaincu, Je te demande juste de me montrer un exemple où ça marche pas. Car, si c'est juste suivant des "souvenirs", on pourra pas aller plus loin.
Google is your friend Répondre à fiddy | Je crois que tu n'as pas compris "De toute façon, moi je m'arrête sur ce sujet car je sais ce que je dis, et ça m'est égal ce que t'en penses."
(En plus t'as l'air de vouloir m'apprendre les pointeurs lol...)
Pour ma crédibilité j'ai quand même regardé si j'avais toujours le code, version avant d'avoir rectifié ce qu'il fallait pour éviter le [] que je trouve moche, mais je n'ai que celui qui fonctionne bien avec le *.
Au passage : montrer un exemple de programme qui marche n'est en rien une démonstration. C'est pas parce que 1000 choses marchent que toutes marchent. Et ce que je dis n'est pas "ce n'est pas équivalent", je dis simplement que ce n'est pas "strictement" équivalent. Répondre à bizu53 |
|
|
|
|
|
|
|
|
|