Declaration fonction en C HELP

Résolu/Fermé
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 - 18 oct. 2008 à 10:28
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 - 19 oct. 2008 à 15:58
Bonjour,

Je démarre un programme en C par une fonction toute simple déclarée de la facon suivante :

int verif(char t[], int x){

instructions

}

le compilateur rend l'erreur suivante :

error parsing parameter list, found "[" when expecting ........

Je comprends pas, aidez moi svp

merci d'avance

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 11:50
Salut,
Mets ton message d'erreur en entier ;)
-1
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 121
18 oct. 2008 à 11:51
int verif(char *t, int x){

instructions

}

marcherait beaucoup mieux. L'argument t passé à la fonction est un pointeur sur caractères.
Tu peux donc faire :


char cMaChaine[50];

rc = verif( cMaChaine , 1 );

-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 11:57
Ce qu'il a mit est strictement la même chose ;)
-1
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 oct. 2008 à 12:22
Je ne saurais plus te dire la différence mais non ce n'est pas "strictement" la même chose (même si cela permet d'obtenir de 2 façons différentes la même chose).
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015
18 oct. 2008 à 12:25
Si, c'est strictement.
La différence est que l'une est dans la pile et l'autre dans le tas. Sauf que là tu passes le tout en appel de fonction et qu'on ne passe que le pointeur quelque soit la notation.
Donc int fonction(char buffer[10]) est équivalent à int fonction(char buffer[]), encore équivalent à int fonction(char *buffer)
-1
saly_inf Messages postés 44 Date d'inscription lundi 13 octobre 2008 Statut Membre Dernière intervention 29 décembre 2008 4 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 oct. 2008 à 12:36
salut...
je veux savoir seulement si la declaration "char buffer[]" veut dir que buffer est un string (pas de longueur spécifiée)...
merci d'avance..
@+
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > saly_inf Messages postés 44 Date d'inscription lundi 13 octobre 2008 Statut Membre Dernière intervention 29 décembre 2008
18 oct. 2008 à 13:09
Pas bien de piquer le topic des autres.
char buffer[] dans une fonction ne veut rien dire sauf si tu l'initialises à la déclaration (exemple char buffer[]="coucou")
Dans les autres cas, il faut spécifier un nombre entre les crochets pour que le compilateur réalise l'allocation statique.
-1
guillaume_74 Messages postés 111 Date d'inscription samedi 18 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 22
18 oct. 2008 à 13:21
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;
}
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 13:27
clique sur les "répondre à" quand tu parles à une personne en particulier. Là je sais pas, si c'est pour me contredire ou contredire bizu ;)
-1
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
18 oct. 2008 à 21:38
"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).
-1
guillaume_74 Messages postés 111 Date d'inscription samedi 18 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 22 > bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015
18 oct. 2008 à 22:00
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!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015
19 oct. 2008 à 00:55
Quand 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) ;)
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 oct. 2008 à 00:58
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.
0
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
19 oct. 2008 à 15:40
ouah ca suscite des discussions mon sujet

bon au final j'ai reussi en faisant passer le pointeur.

en revanche j'ai une nouvelle question sur la manipulation de chaine de caracteres

j'aimerai extraire n caracteres d'une chaine par exemple

const char ch = {"bonjou"};

char m = ch[2]; //me renvoie 'n' bien sur

comment faire pour recuperer 'nj'?

j'ai essaye les fonctions str et des chipotages du genre

char m=ch[2,3]
char m=ch[2:3]
char m=ch[2;3]
char m=ch[2][3]

mais je ne trouve pas

quelqu'un sait?

encore merci pour vos reponses
-1
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
19 oct. 2008 à 15:43
ouais tu fais une petite fonction qui prend en paramètres ta chaîne de caractères + 2 entier.
et tu parcours du premier au 2ème entier en concaténant les caractères ;-)

pour concaténer tu peux utiliser strcat() (je crois, je ne l'utilise jamais), j'utilise sprintf()
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 oct. 2008 à 15:45
"nj" n'est pas un char.
Si tu veux récupérer "nj".
La façon la plus simple :
char m[3];
m[0]=ch[2];
m[1]=ch[3];
m[2]='\0';
Sinon tu peux passer aussi par strncpy ;)
Par exemple
strncpy(ch,m+2,2);
m[2]='\0';
-1
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 oct. 2008 à 15:48
oui alors justement avec strncpy comment demarrer la copie a partir d'un element de la chaine et non pa forcement par le premier element de la chaine
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011
19 oct. 2008 à 15:49
Ben en ajoutant tout simplement.
Par exemple dans l'exemple que je te donne. Ca copie à partir de l'indice 2.
strncpy(ch,m+2,2);
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
19 oct. 2008 à 15:46
"une petite fonction qui prend en paramètres ta chaîne de caractères + 2 entier"

je comprend pa tu peux illustrer avec un peu de code svp?

merci
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 oct. 2008 à 15:48
Pas besoin de faire cette fonction qui existe déjà. strncpy.
char m[3);
strncpy(ch,m+2,2);
m[2]='\0';
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 oct. 2008 à 15:49
je l'avais oubliée celle là c'est vrai ^^
-1
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
19 oct. 2008 à 15:53
ok ca marche

mais donc je suis force d'utiliser une fction pas de m=ch[1:3] comme en fortran?
-1
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
19 oct. 2008 à 15:54
ouais "obligé" comme tu dis ^^
enfin, il y a peut-être d'autres astuces mais en tout cas tu ne peux pas faire de ch[1:3] ou rien comme ça.
0
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
19 oct. 2008 à 15:58
ok merci beaucoup pour votre aide je vais me debrouiller avec ca

a +
-1