Programmation en C, problème avec structures

Règles du forum
Cette section est dédié a vos projets, descriptions et demandes d'aide.
Merci de limiter le nombre de sujet par projets.
Lorsqu'un sujet deviens long vous pouvez éditer le premier message pour maintenir à jour le descriptif et garder en lisibilité
Avatar de l’utilisateur
Lanian
Electrolab::Membre
Messages : 13
Enregistré le : 20 nov. 2018, 16:42

Programmation en C, problème avec structures

Messagepar Lanian » 25 nov. 2018, 14:03

Bonjour je suis en train de programmer un petit (très petit) "jeux vidéo" (le terme correct serait peut être logiciel d'aide à MJ/joueur) pour un JDR appelé Vampire.
Je veux introduire des structures qui ont comme but de stocker les valeurs (essentiellement des int) de chaque caractéristique des joeurs (il y en a plein).

Du coup avant de faire n'importe quoi sur mon code de base et étant très très débuttant dans la programmation en C, je suis entrain de faire un petit script complètement apart pour voir si je capte un peu le fonctionnement des structures. Du coup je fais un petit programme pour démander aux utilisateurs leurs noms, prénoms, adresse et âge.
Je fais une petite boucle for pour demander aux deux utilisateurs leurs détails, mais cela plante complétement. Le programme ne sort jamais de la boucle for et saute des lignes sans me donner la posibilité d'utiliser scanf.

Voici le code :

#include <stdio.h>
#include <stdlib.h>
#define NOMBRE_UTILISATEUR 2

typedef struct Personne Personne;

struct Personne
{
char prenom[100];
char nom[100];
char adresse[200];

int age;
int sexe; //1 pour garson, 2 pour fille, 0 pour NB
};

void data_asker (Personne utilisateur1, Personne utilisateur2)
{
int i=0;

for (i=0; i=2; i++)
{
if (i==1)
{
printf("Quel est votre nom utilisateur 1 ?\n");
scanf("%s", utilisateur1.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur1.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur1.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur1.age);
printf("U1 OK\n");
}

if (i==2)
{
printf("Quel est votre nom utilisateur 2 ?\n");
scanf("%s", utilisateur2.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur2.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur2.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur2.age);
printf("U2 OK\n");
}
}

printf("L'utilisateur 1 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur1.prenom, utilisateur1.nom, utilisateur1.adresse, utilisateur1.age);
printf("L'utilisateur 2 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur2.prenom, utilisateur2.nom, utilisateur2.adresse, utilisateur2.age);

}


int main()
{
Personne utilisateur1, utilisateur2;

data_asker(utilisateur1, utilisateur2);

return 0;
}


Voici les retours sur la terminal :

http://image.noelshack.com/fichiers/2018/47/7/1543150853-captura-de-pantalla-de-2018-11-25-13-59-47.png

A noter que la boucle passe directement dans le cas i==2, ce que je ne comprends pas du tout...

Quelqu'un peu svp me dire ce qui ne va pas ?

Merci !!!!
Alain de Raucourt
Pôle Miam !
Avatar de l’utilisateur
Joel
Electrolab::Membre
Messages : 42
Enregistré le : 01 mars 2017, 15:15
Localisation : Vauréal
Contact :

Re: Programmation en C, problème avec structures

Messagepar Joel » 25 nov. 2018, 15:51

Déjà la bloucle for:
for (i=0; i < 2; i++) et pas i=2
Avatar de l’utilisateur
NicoM
Electrolab::Membre
Messages : 175
Enregistré le : 01 mars 2017, 16:05
Localisation : Paris
Contact :

Re: Programmation en C, problème avec structures

Messagepar NicoM » 25 nov. 2018, 21:29

Joel a écrit :Déjà la bloucle for:
for (i=0; i < 2; i++) et pas i=2


Ceci explique ton problème de boucle qui "saute" à i == 2 dès le départ, puisque "i=2" signifie que tu donnes la valeur 2 à i
Avatar de l’utilisateur
Joel
Electrolab::Membre
Messages : 42
Enregistré le : 01 mars 2017, 15:15
Localisation : Vauréal
Contact :

Re: Programmation en C, problème avec structures

Messagepar Joel » 26 nov. 2018, 08:33

En partie seulement, cela n'explique pas pourquoi on saute des scanf. Et là, je ne vois pas d'explication à première vue.
Il y aurait beaucoup à redire de cette extrait de code.
data_asker ne devrait pas contenir de for dépendant du nombre de paramètres d'entrée.
Elle devrait accepter 1 seul paramètre de type personnage et le for devrait être dans le main.
Ce faisant, cette fonction pourrait devenir une fonction membre intégrée dans la structure Personnage, ce qui nous rapprocherait un peu plus de la programmation orientée objet. L'appel se ferait alors avec personnage1.data_asket(), une autre méthode de Personnage pourrait alors être personnage1.display() pour afficher les infos.
Avatar de l’utilisateur
NicoM
Electrolab::Membre
Messages : 175
Enregistré le : 01 mars 2017, 16:05
Localisation : Paris
Contact :

Re: Programmation en C, problème avec structures

Messagepar NicoM » 26 nov. 2018, 09:09

Oh la ! Oh la ! Ce pauvre Alain se met tout juste au C et tu jargonnes déjà programmation orientée objet !
Avatar de l’utilisateur
Joel
Electrolab::Membre
Messages : 42
Enregistré le : 01 mars 2017, 15:15
Localisation : Vauréal
Contact :

Re: Programmation en C, problème avec structures

Messagepar Joel » 26 nov. 2018, 09:57

Je dis juste qu'on pourrait s'orienté vers sans pour autant en faire. juste placer une fonction dans une structure c'est tout.
Si c'est le jargon qui gène. On peut allègrement s'en passer. Mais intégrer la fonction dans la structure serait, je pense vraiment un plus, tout en restant en C.
Avatar de l’utilisateur
f4grx
Messages : 881
Enregistré le : 26 sept. 2016, 13:58

Re: Programmation en C, problème avec structures

Messagepar f4grx » 26 nov. 2018, 10:24

joel: sa console montre qu'on saute pas de scanf, on les a tous, mais uniquement pour i==2

Hello,
voici, a mon avis, une liste de choses a revoir

-le typedef est inutile, il est un embarras et une source de confusion pour les débutants. la définition struct est bien suffisante, struct toto est un type tout a fait acceptable pour le compilateur.
-le passage en paramètres de structures est une chose tout a fait fonctionnelle, mais a éviter quand on débute, car elle s'accompagne de génération de code bien plus complexe que si on s'en passe.
-pour moi, ce code n'a qu'un but: t'éviter de parler de pointeurs et tableaux, alors que ceux ci sont une notion fondamentale et facile a utiliser dans ton cas.
-et surtout, il montre que tu n'as pas compris le but d'une boucle. Ce n'est pas une critique négative, c'est naturel quand on commence.

Une boucle sert a répéter un traitement PARFAITEMENT IDENTIQUE. Or ici, tu as un problème, car tes données doivent aller dans des endroits différents: personne 1 et personne deux. Tu as donc été obligé d'utiliser des IF pour différencier les traitements de ta boucle inutile.

Truc intéressant numero 1: ne pas confondre affectation (i=3) et test d'égalité (i==3) qui retourne 1 (vrai) si i vaut 3, et 0 (faux) sinon
Truc intéressant numéro 2: en C, une affectation (i=3) est aussi une expression qui vaut le résultat de l'affectation, ici 3
donc par exemple (i=3)+2 est "valable" et vaut 5
0 est compris comme FAUX, tout le reste (1,2,3...) est compris comme VRAI

Quand tu écris for(A;B;C) { instructions} en fait le compilateur le TRADUIT comme:
A
while(B)
{
instructions
C
}

Donc que se passe t il chez toi
on exécute A
i=0
test B: i=2
ce n est pas un test, mais une affectation, on met 2 dans i, le résultat est différent de zéro donc vrai, on exécute les instructions
instructions: on exécute le cas correspondant a i==2
on passe a C: i++
on recommence
on refait le test B: i=2
ce n est pas un test, mais une affectation, on met 2 dans i, le résultat est différent de zéro donc vrai, on exécute les instructions
instructions: on exécute le cas correspondant a i==2
on passe a C: i++
on recommence

etc
etc
etc

Donc tu as deux options:
-soit te passer de cette boucle, qui, honnêtement, ne sert a rien dans cette structure de programme
-soit construire un programme qui a besoin de cette boucle, avec des constructions plus utiles.

Etant donné que tu sembles très débutant, je suppose que c'est plutot l'option 1 qui te servira. Voici un programme corrigé dans cet objectif:

Code : Tout sélectionner

#include <stdio.h>
#include <stdlib.h>
#define NOMBRE_UTILISATEUR 2

struct Personne
{
char prenom[100];
char nom[100];
char adresse[200];

int age;
int sexe; //1 pour garson, 2 pour fille, 0 pour NB
};

void data_asker (struct Personne utilisateur1, struct Personne utilisateur2)
{

printf("Quel est votre nom utilisateur 1 ?\n");
scanf("%s", utilisateur1.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur1.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur1.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur1.age);
printf("U1 OK\n");

printf("Quel est votre nom utilisateur 2 ?\n");
scanf("%s", utilisateur2.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur2.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur2.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur2.age);
printf("U2 OK\n");

printf("L'utilisateur 1 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur1.prenom, utilisateur1.nom, utilisateur1.adresse, utilisateur1.age);
printf("L'utilisateur 2 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur2.prenom, utilisateur2.nom, utilisateur2.adresse, utilisateur2.age);

}


int main()
{
struct Personne utilisateur1, utilisateur2;

data_asker(utilisateur1, utilisateur2);

return 0;
}


Ce code est... probablement fonctionnel mais hautement inefficace. Pour ton objectif il te faut continuer par apprendre les tableaux et les pointeurs, c'est absolument indispensable si tu veux pouvoir gérer un nombre arbitraire d'éléments. J'attends ton retour!

(pour les autres: la notion d'objet est indépendante du langage, la "masquer" me semble irréaliste et très réducteur; de plus il ne faut pas oublier que tout algo est beaucoup plus facile a concevoir une fois que la structure de données a utiliser est claire... placer une fonction dans une structure, c'est pas du tout le sujet de ce topic a mon avis...)
Avatar de l’utilisateur
nats
Electrolab::Membre
Messages : 207
Enregistré le : 25 févr. 2018, 10:13

Re: Programmation en C, problème avec structures

Messagepar nats » 26 nov. 2018, 11:18

Si mes souvenirs sont bons le typedef est obligatoire en C si tu veux utiliser la structure en tant que type sans devoir te réécrire struct à chaque déclaration. (ce n'est pas le cas en C++)
Avatar de l’utilisateur
f4grx
Messages : 881
Enregistré le : 26 sept. 2016, 13:58

Re: Programmation en C, problème avec structures

Messagepar f4grx » 26 nov. 2018, 11:23

Le but est bien d'écrire struct a chaque déclaration, pour bien savoir ce qu'on manipule. C'est une habitude qu'on m'a transmise et je la trouve particulièrement importante pour bien maitriser les bases.

De plus pour des débutants ca oblige a comprendre cette bizzarrerie de typedef struct toto toto, ou oblige a retenir une structure vachement plus compliquée: typedef struct "mot-clé-arbitraire-et-inutile" {...} "type-confus";

alors que struct chose {} est non ambigu, et permet de réaliser ce qu'on manipule dans le code.

Bref, c'est mon avis perso, mais je trouve ca utile, dans un but de maitrise des fondamentaux. Quand on a tout en tête, on peut toujours ajouter les raccourcis plus tard...
Avatar de l’utilisateur
Lanian
Electrolab::Membre
Messages : 13
Enregistré le : 20 nov. 2018, 16:42

Re: Programmation en C, problème avec structures

Messagepar Lanian » 26 nov. 2018, 15:02

Merci à tous pour vos réponses. En effet la boucle for était foiré. Du coup j'ai refais le programme mais avec une autre méthode. Cependant le problème principal venait du scanf, car avec les " " dans mon nom et adresse cela arrêter le scanf mais gardait tout de même l'entrée en mémoire, donc cela sauter directement les prochain scanf.

Du coup j'ai fais avec fget et un petit script pour éliminer l’éventuel overflow du buffer. Un peu compliqué mais efficace. Etant un flemmard à part entière, je n'aime pas réécrire mille fois struct Personnage à chaque fois que je fais appel par le biais d'une fonction ou autre, du coup j'ai décidé de le garder vu que j'ai compris assez bien le fonctionnement du typedef.

Pour ce qui est du scanf, à terme il ne sera pas du tout utiliser sur le logiciel final vu que cela sera des icônes à cliquer, donc pour l'instant je ne me soucis pas trop de la question. Je suis aller voir quelques tips sur scanf mais c'est bien trop compliqué pour moi pour le moment.

Ayant compris le problème du scanf, je me suis lancé dans la programmation d'un petit algorithme me permettant lire dans un fichier save (.txt) formaté afin de mettre en mémoire vive les données de chaque personnage enregistré dans la structure Personnage.

Le fait est que Personnage est immense (le JDR Vampire a beaucoup de variables). Je vous met en pièce jointe le fichier main (pour l'instant test), le fichier .h contenant les protocoles et la définition de la structure Personnage ainsi que le fichier.c contenant des fonctions. La fonction que je veux optimiser est perso_scanner. Tout marche bien, comme le montre le screen shot de la terminal, mais c'est juste que j'ai l'impression que je fais n'importe quoi vu que concrètement je fais copier coller les conditions pour chaque ligne. Est-ce qu'il y a moyen d'optimiser un peu la chose ? Je me disait qu'une fonction par ligne serait pas mal, mais cela reviens plus ou moins au même. Une seule fonction que j'appel à chaque fois serait top, mais comment faire appel juste à un pointeur sur un élément spécifique de ma structure personnage en utilisant juste une fonction ? Je ne sais pas comment m'y prendre.

Voici la fonction perso_scanner avec les fonction que celle ci utilise :

Code : Tout sélectionner

int perso_scanner (Personnage *p_perso, char file_perso[])
{
   FILE* fichier = NULL;
   char ligne[TAILLE_MAX] = "";
   fichier=fopen(file_perso, "r");
   int i=0;
   int line_actuelle=0;
   int k=0;
   int coordone_egale=0;
   int coordone_fin=0;
   int taille_ligne=0;
   
   if (fichier != NULL)  //vérification que le fichier s'ouvre correctement
   {      
      while (fgets(ligne, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
        {
         if (line_actuelle==0) //on est dans la première ligne, du coup on va lire le nom du perso
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);         //on ajuste la taille de la ligne en ne comptant pas le \0 de la fin ni le = et le espace du début.
            for (i=coordone_egale+2; i<coordone_fin; i++)                 //on copie la chaine de caractère ne mémoire vive pour utilisation par la suite dans le programme
            {
               if (ligne[i]!='\n')
               {
                  p_perso->nom_perso[k]=ligne[i]; //on veut commencer par k=0 pour que le tableau en mémoire vive stocke la chaine de caractère à partir du premier emplacement (et non pas le xième)
                  k++;
               }
            }
            printf("Nom de perso : %s\n", p_perso->nom_perso);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==1)  //on attaque la deuxième ligne, qui nous donne le clan
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->clan_perso[k]=ligne[i];
                  k++;
               }
            }
            printf("Clan: %s\n", p_perso->clan_perso);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==4)  //on attaque la cinquième ligne, qui nous donne la force, la cela deviens plus compliqué
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->str_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Attribus\n");
            printf("Force: %d\n", p_perso->str_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }   
         
         else if (line_actuelle==5)  //on attaque la sixième ligne, qui nous donne la dextérité
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->dex_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Dextérité %d\n", p_perso->dex_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }   
         
         else if (line_actuelle==6)  //on attaque la septième ligne, qui nous donne la vigeur
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->sta_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Vigeur: %d\n", p_perso->sta_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==7)  //on attaque la huitième ligne, qui nous donne le charisme
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->cha_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Charisme: %d\n", p_perso->cha_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==8)  //on attaque la neuvième ligne, qui nous donne la manipulation
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->man_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Mapinulation: %d\n", p_perso->man_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==9)  //on attaque la dixième ligne, qui nous donne l'aparence
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->apa_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Aparence: %d\n", p_perso->apa_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==10)  //on attaque la onzième ligne, qui nous donne la perception
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->per_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Perception ;  %d\n", p_perso->per_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==11)  //on attaque la dousième ligne, qui nous donne l'inteligence
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->int_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Inteligence:  %d\n", p_perso->int_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==12)  //on attaque la treisième ligne, qui nous donne l'astuce
         {
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->ast_carac=ligne[i]-'0';
                  k++;
               }
            }
            printf("Astuce: %d\n", p_perso->ast_carac);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==16)  //on attaque maintenant les skills, je pense que vous avez compris du coup j'arrêtesles commentaires
         {   
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->adresse_skill=ligne[i]-'0';
                  k++;
               }
            }
            printf("Capacités\n");
            printf("Adresse: %d\n", p_perso->adresse_skill);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==17)
         {   
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->athletisme_skill=ligne[i]-'0';
                  k++;
               }
            }
            printf("Athletisme %d\n", p_perso->athletisme_skill);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==18)
         {   
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->bagare_skill=ligne[i]-'0';
                  k++;
               }
            }
            printf("Bagare %d\n", p_perso->bagare_skill);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         else if (line_actuelle==19)
         {   
            get_interval(&coordone_egale, &coordone_fin, ligne);
            taille_ligne=coordone_fin - 1 - (coordone_egale+2);
            for (i=coordone_egale+2; i<coordone_fin; i++) 
            {
               if (ligne[i]!='\n')
               {
                  p_perso->commandement_skill=ligne[i]-'0';
                  k++;
               }
            }
            printf("Commandement %d\n", p_perso->commandement_skill);
            annulation_variables(&coordone_egale, &coordone_fin, &k);
         }
         
         
            
      line_actuelle++;
      }

      

      fclose(fichier);
   }
   
   else
   {   
      printf("Impossible d'ouvrir le fichier\n");
      return 1;
   }
   
   return 0;
}

void get_interval(int *p_coordone_egale, int *p_coordone_fin, char *ligne)
{
   int i=0;
   for (i=0; i<TAILLE_MAX; i++) //on va dans cette boucle enregistrer le positionement dans le tableau du caractère '=' et le caractère '\0' car dans le fichier ce qui a entre ces deux caractères nous interesse
   {
      if (ligne[i]=='=') *p_coordone_egale=i;
      if (ligne[i]=='\n')
      {
         *p_coordone_fin=i;
         i=TAILLE_MAX;
      }
   }
}

void annulation_variables(int *p_coordone_egale, int *p_coordone_fin, int *p_k)
{
   *p_k=0;
   *p_coordone_egale=0;
   *p_coordone_fin=0;
}


Je met en pièce jointe aussi le fichier lu, sachant qu'il est formaté et que à terme ce sera le logiciel qui va l'écrire et non pas un humain.

Voici ce qui a dans le main :

Code : Tout sélectionner

#include "stats.c"

//petit logiciel de test


int main ()
{
   Personnage itsu;
   char file_perso[NOM_MAX]={'p', 'e', 'r', 's', 'o', 'n', 'n', 'a', 'g', 'e', 's', '/'};
   char answer=0;
   char tableau_perso[NOM_MAX]={0};
   int checker=1;
   int i=0;
   int long_perso=0;
   
   printf("Salut, bienvenu à Vampire JDR\n");      //on est polis on dit bonjour
   printf("Entre ton nom de personnage s'il te plait\n"); //demande le nom du perso
   scanf("%s", tableau_perso);  //va sauvegarder en tableau_perso le nom du perso
   strcat(file_perso, tableau_perso); //on rajoute a file_perso le nom du perso entré par le joeur
   strcat(file_perso, ".txt"); //on ajoute finalement le .txt
   
   checker=perso_scanner(&itsu, file_perso);
    while (checker!=0) 
   {
      do
      {
         printf("ERROR, unable to open file, wanna try again (y/n) ?\n");
         scanf("%c", &answer);
         if (answer=='y')
         {   
            checker=perso_scanner(&itsu, file_perso);
            printf("Character read\n");
         }
      }
      while (answer=='y' && checker==1);
   }
   
   printf("Merci ! La guilde des rolistes indépendants te salut !\n");
   
   return 0;
}

Juste comme ça, mais en vrai ce n'est guère grave, la boucle contenant le message d’erreur qui est censée de relancé le tout ne marche pas, je ne comprends pas pourquoi mais je me dis que c'est encore lié au scanf.

Merci en tout cas !!!!!
Fichiers joints
Captura de pantalla de 2018-11-25 21-47-09.png
Captura de pantalla de 2018-11-25 21-47-09.png (99.39 Kio) Vu 4322 fois
itsu.txt
(1.11 Kio) Téléchargé 341 fois
testf.c
(1.1 Kio) Téléchargé 218 fois
stats.c
(9.84 Kio) Téléchargé 219 fois
stats.h
(2.32 Kio) Téléchargé 225 fois
Alain de Raucourt
Pôle Miam !

Retourner vers « Les Projets »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité