Je suis nouveau en C et surtout en pointeurs. J'apprécierais toute aide.
int checkDiamonds(cor_row,cor_collumn,char *arr2)
{
if (*(arr2 + cor_row*7 + cor_collumn)=='*')
return 1;
else
return 0;
}
C'est l'une des fonctions que j'utilise pour mon code et je ne comprends pas pourquoi elle continue de me donner cette erreur: Attendu ') 'avant' char '.
3 Réponses :
Vous devez définir le type de vos paramètres, par exemple:
int checkDiamonds(int cor_row, int cor_collumn, char *arr2)
{
// ...
}
Une déclaration de fonction qui est en même temps sa définition peut utiliser soit une liste d'identificateurs, soit une liste de types de paramètres, mais pas les deux simultanément.
Donc, cette définition de fonction
One Two Two
est analysé par le compilateur comme une fonction qui a une liste d'identificateurs mais ensuite il a rencontré un spécificateur de type.
Vous devez donc utiliser soit une liste d'identificateurs, soit une liste de types de paramètres. Bien sûr, il est préférable d'utiliser une liste de types de paramètres fournissant le prototype de fonction pour le compilateur.
Par exemple, votre fonction pourrait être déclarée comme
#include <stdio.h>
void f( s, n )
const char *s; size_t n;
{
puts( s + n );
}
void g( const char *s, size_t n )
{
puts( s + n );
}
int main(void)
{
f( "One Two", 0 );
g( "One Two", 4 );
return 0;
}
Ici est un programme démonstratif qui montre la différence entre l'utilisation d'une liste d'identificateurs et d'une liste de types de paramètres dans une déclaration de fonction qui est en même temps une définition de fonction.
int checkDiamonds( size_t cor_row,size_t cor_collumn, const char *arr2)
{
return *( arr2 + cor_row*7 + cor_collumn ) == '*';
}
La sortie du programme est
int checkDiamonds(cor_row,cor_collumn,char *arr2)
{
if (*(arr2 + cor_row*7 + cor_collumn)=='*')
return 1;
else
return 0;
}
+1 Excellente explication des différences grammaticales qui ont causé l'erreur spécifique du compilateur - expliquant pourquoi ils obtiennent CETTE erreur (mais PAS "ce qui ne va pas avec mon code", ce que beaucoup de gens pensent que la réponse doit être). Votre réponse explique "pourquoi" OP obtenait l'erreur (question réelle de l'OP) - pas seulement "comment y remédier".
La façon moderne de définir votre fonction consiste à utiliser un type pour chaque paramètre:
int checkDiamonds(cor_row, cor_collumn, arr2)
int cor_row;
int cor_collumn;
char *arr2;
{
â¦
}
Pour prendre en charge l'ancien code source, une fonction peut toujours être définie avec les types séparément:
int checkDiamonds(int cor_row, int cor_collumn, char *arr2)
{
â¦
}
Parce que le compilateur a vu int checkDiamonds (cor_row, cor_collumn , il s'attendait à ce que la prochaine chose soit un autre nom de paramètre ou une parenthèse fermante. Quand il a vu un type, char , au lieu de cela, c'était inattendu, donc plaint, vous disant qu'il attendait un ) plutôt que char.
Là sont d'autres différences entre les deux méthodes de définition. Le premier distingue mieux les types et devrait être utilisé dans le nouveau code.
Les compilateurs sont connus pour donner de mauvais messages d'erreur. alors ne vous sentez pas mal. Malheureusement, le "frontal" est écrit pour être rapide, il signale donc une erreur au moment où il a découvert que la grammaire était brisée, pas nécessairement là où se trouve réellement votre problème. Il ne veut pas passer beaucoup de temps à déterminer ce que vous essayez de faire. Ce serait bien s'il y avait 2 versions différentes du compilateur frontal, une qui est rapide, une autre qui fournit de meilleurs messages d'erreur.
@ franji1 Les compilateurs sont assez bons pour donner les messages d'erreur, si vous les prenez dans le contexte et regardez le numéro de ligne qui est omis dans la question.
@ franji1 La qualité des messages d'erreur n'a presque rien à voir avec les performances d'analyse. Au lieu de cela, il est simplement beaucoup plus difficile d’écrire des compilateurs pour donner de bons messages d’erreur. Et par «plus difficile», j'entends à la fois compliqué et rendre le code d'analyse (substantiellement) plus complexe.
Le correctif de l'erreur n'avait absolument RIEN à voir avec l'absence d'un ')' autour du caractère, correct? C'est un mauvais message d'erreur. Voir l'explication @vlad de Moscou. Le message d'erreur ASSUMED le problème était qu'il s'agissait d'une liste d'identificateurs mal formée. Mauvaise hypothèse. C'était une liste de types de paramètres mal formée. Cela aurait pu générer 2 erreurs différentes sur la base de chacune de ces hypothèses. C’est ce dont je parle.