Expected ‘;’, identifier or ‘(’ before ‘int’

Résolu
Arkoy -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous, je suis bloqué avec ceci :

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main(){
    srand(time(NULL));
    struct Donnees {
        char nomStation;
        double temp[24],precipitation;
}
int i,j;
struct Donnees t[100];
for (i=0;i<=99; i=i+1) {
    sprintf(t[i].nomStation,"station",i);
    for (j=0; i<=23; i=i+1){
        t[i].temp[j]=rand()%(46-(-36))+46;
    }
    t[i].precipitation=rand()%(100-0)+0;
}
}


main.c:13:1: error: expected ‘;’, identifier or ‘(’ before ‘int’
13 | int i,j;
| ^~~
main.c:16:17: warning: passing argument 1 of ‘sprintf’ makes pointer from integer without a cast [-Wint-conversion]
16 | sprintf(t[i].nomStation,"station",i);
| ~~~~^~~~~~~~~~~
| |
| char
In file included from main.c:1:
/usr/include/stdio.h:334:38: note: expected ‘char * restrict’ but argument is of type ‘char’
334 | extern int sprintf (char *__restrict __s,
| ~~~~~~~~~~~~~~~~~^~~
main.c:16:29: warning: too many arguments for format [-Wformat-extra-args]
16 | sprintf(t[i].nomStation,"station",i);
| ^~~~~~~~~

Merci d'avance pour votre aide.


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser dans tes prochains messages.

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Plusieurs choses ne vont pas :
    • tu devrais déclarer les fonctions et les structures avant de les utiliser.
    • je te recommande en particulier de commencer ton fichier source par les structures, ensuite les fonctions, ensuite le main ;
    • si tu indentes proprement ton code, tu éviteras beaucoup d'erreur (tu devrais également mettre des espaces autour des opérateurs et derrière les
      ,
      et les
      ;
      ) ;
    • généralement et à moins de savoir ce qu'on fait, on déclare rarement une structure à l'intérieur d'une fonction ;
    • tu inclues des headers qui n'ont aucune raison d'être inclus, car aucune des fonctions qu'ils fournissent ne sont actuellement utiliser dans ton code ;
    • lorsque tu déclares une structure, à la fin de sa déclaration, il devrait y avoir un
      ;
      derrière
      }
      (contrairement aux fonctions).
    • je pense que dans ta deuxième boucle for, tu as utilisé
      i
      au lieu de
      j
      ;
    • la fonction
      sprintf
      est mal appelée (voir la documentation en cherchant "man sprintf" dans google ou dans un terminal si tu es sous linux)
    • comme ta fonction
      main
      a pour type de retour
      int
      elle devrait en retourner un (par convention 0 quand le programme se termine bien, une valeur non nulle abitraire correspondant au code d'exécution sinon).
    • nomStation
      est de type
      char
      alors qu'elle est amenée à stocker une chaîne de caractère. Ce devrait donc soit être un tableau de char pré-alloué suffisamment grand pour accueillir la chaîne de caractère, soit un
      char *
      alloué dynamiquement (e.g. avec
      malloc
      ).
    • certains calculs "constants" ne sont pas calculés, c'est un peu bizarre, autant les simplifier.


    Une fois corrigé ton programme pourrait ressembler à :

    #include <stdio.h>  // printf
    #include <stdlib.h> // srand
    #include <time.h>   // time
    
    struct Donnees {
        char nomStation[30];
        double temp[24], precipitation;
    };
    
    int main(){
        srand(time(NULL));
        int i, j;
        struct Donnees t[100];
        for (i = 0; i < 100; i++) {
            sprintf(t[i].nomStation, "station%d", i);
            for (j = 0; i < 24; i++) {
                t[i].temp[j] = rand() % 82 + 46;
            }
            t[i].precipitation = rand() % 100;
        }
        return 0;
    }
    1
  2. Arkoy
     
    Bonjour mamiemando.

    Merci beaucoup pour toutes les réponses et conseils apportés, et de la correction !
    Je les appliquerai pour la suite de mon apprentissage.

    Je vous souhaite une très agréable journée !
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      Merci pour ton retour, bonne continuation et bon apprentissage :-)
      1