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
NicoM
Electrolab::Membre
Messages : 136
Enregistré le : 01 mars 2017, 16:05
Localisation : Chez oim
Contact :

Re: Programmation en C, problème avec structures

Messagepar NicoM » 26 nov. 2018, 15:24

Les instructions que tu répètes dans chaque condition peuvent être groupées en une seule fois hors du test de condition.
Au lieu d'écrire (je te fais un pseudo-code pour illustrer) :
while (a < 3)
if (a == 1)
do_x;
do_y;
do_z;
do_case_1;
elsif (a == 2)
do_x;
do_y;
do_z,
do_case_2;
endif;
endwhile;

tu peux écrire:
while (a < 3)
do_x;
do_y;
do_z;
if (a == 1)
do_case_1;
elsif (a == 2)
do_case_2;
endif;
endwhile;
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:42

Mmmm, ok mais qu'est-ce que tu éntends exactement par do_x do_y do_z ?
Alain de Raucourt
Pôle Miam !
Avatar de l’utilisateur
NicoM
Electrolab::Membre
Messages : 136
Enregistré le : 01 mars 2017, 16:05
Localisation : Chez oim
Contact :

Re: Programmation en C, problème avec structures

Messagepar NicoM » 26 nov. 2018, 16:14

Lanian a écrit :Mmmm, ok mais qu'est-ce que tu éntends exactement par do_x do_y do_z ?


Vois ça comme des appels de fonction, ça peut être tout et n'importe quoi. Il me semble que dans ton cas, ça serait les deux lignes get_interval... et taille_ligne=...
De la même manière, la ligne annulation_variables... peut être placée après les conditions.

Et pour répondre à ta question sur les pointeurs, un tableau étant un pointeur, ça se fait tout seul. Tu peux créer une fonction copie_carac_perso(char* carac) que tu appelles en lui passant le pointeur sur la caractéristique voulue : copie_carac_perso(p_perso->nom_perso) par exemple
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, 17:14

Ok dak je crois que j'ai compris, du coup j'ai essayé d'optimiser comme cela avec deux fonctions (une pour les chaines de caractère, une autre pour les valeurs), tout en métant celle qui recherche une valeur en dehors de la condition mais l'intérieur de la boucle, et celle qui recherche une chaine de caractère à l'intérieur de la condition (en faites les deux sont sensiblement différentes (clan et nom_perso) car l'une a un maximum de 50 et l'autre un maximum de 5, du coup bah pour optimiser de la mémoire tout cela tout cela.....

Cela donne ceci, et cela marche !

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 line_actuelle=0;
   int valeur=0;
   char clan[CLAN_MAX]="";
   char nom_perso[NOM_MAX]="";
   
   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)
        {
         
         recherche_valeur(ligne, &valeur);
         
         if (line_actuelle==0) //on est dans la première ligne, du coup on va lire le nom du perso
         {
            recherche_chaine(ligne, nom_perso);
            strcpy(p_perso->nom_perso, nom_perso);
            printf("Nom du personnage %s\n", p_perso->nom_perso);
         }
         
         else if (line_actuelle==1)  //on attaque la deuxième ligne, qui nous donne le clan
         {
            recherche_chaine(ligne, clan);
            strcpy(p_perso->clan_perso, clan);
            printf("Clan %s\n", p_perso->clan_perso);
         }
         
         else if (line_actuelle==4)  //on attaque la cinquième ligne, qui nous donne la force, la cela deviens plus compliqué
         {
            p_perso->str_carac=valeur;
            printf("Force %d\n", p_perso-> str_carac);
         }   
         
         else if (line_actuelle==5)  //on attaque la sixième ligne, qui nous donne la dextérité
         {
            p_perso->dex_carac=valeur;
            printf("Dextérité %d\n", p_perso-> dex_carac);
         }   
         
         else if (line_actuelle==6)  //on attaque la septième ligne, qui nous donne la vigeur
         {
            p_perso->sta_carac=valeur;
            printf("Vigeur %d\n", p_perso-> sta_carac);
         }
         
         else if (line_actuelle==7)  //on attaque la huitième ligne, qui nous donne le charisme
         {
            p_perso->cha_carac=valeur;
            printf("Charisme %d\n", p_perso-> cha_carac);
         }
         
         else if (line_actuelle==8)  //on attaque la neuvième ligne, qui nous donne la manipulation
         {
            p_perso->man_carac=valeur;
            printf("Manipulation %d\n", p_perso->man_carac);
         }
         
         else if (line_actuelle==9)  //on attaque la dixième ligne, qui nous donne l'aparence
         {
            p_perso->apa_carac=valeur;
            printf("Aparence %d\n", p_perso->apa_carac);
         }
         
         else if (line_actuelle==10)  //on attaque la onzième ligne, qui nous donne la perception
         {
            p_perso->per_carac=valeur;
            printf("Perception %d\n", p_perso->per_carac);
         }
         
         else if (line_actuelle==11)  //on attaque la dousième ligne, qui nous donne l'inteligence
         {
            p_perso->int_carac=valeur;
            printf("Inteligence %d\n", p_perso->int_carac);
         }
         
         else if (line_actuelle==12)  //on attaque la treisième ligne, qui nous donne l'astuce
         {
            p_perso->ast_carac=valeur;
            printf("Astuce %d\n", p_perso->ast_carac);
         }
         
         else if (line_actuelle==16)  //on attaque maintenant les skills, je pense que vous avez compris du coup j'arrêtesles commentaires
         {   
            p_perso->adresse_skill=valeur;
            printf("Adresse %d\n", p_perso->adresse_skill);
         }
         
         else if (line_actuelle==17)
         {   
            p_perso->athletisme_skill=valeur;
            printf("Athetisme %d\n", p_perso->athletisme_skill);
         }
         
         else if (line_actuelle==18)
         {   
            p_perso->bagare_skill=valeur;
            printf("Bagare %d\n", p_perso->bagare_skill);
         }
         
         else if (line_actuelle==19)
         {   
            p_perso->commandement_skill=valeur;
            printf("Commandement %d\n", p_perso->commandement_skill);
         }
         
         else if (line_actuelle==20)
         {
            p_perso->empathie_skill=valeur;
            printf("Empathie %d\n", p_perso->empathie_skill);
         }
         
            
      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 recherche_valeur(char ligne[], int *valeur)
{
   int coordone_egale=0;
   int coordone_fin=0;
   int taille_ligne=0;
   int k=0;
   int i=0;
   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 va chercher la valeur puis on la transforme en int, car sur le fichier le nombre est un caractère et non pas un nombre
   {
      if (ligne[i]!='\n')
      {
         *valeur=ligne[i]-'0';
         k++;
      }
   }
}

void recherche_chaine(char ligne[], char chaine[])
{
   int coordone_egale=0;
   int coordone_fin=0;
   int taille_ligne=0;
   int k=0;
   int i=0;
   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')
      {
         chaine[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++;
      }
   }
}


Merci beaucoup ! Je continue à coder le reste si jamais j'ai encore des questions je reviens, encore MERCI !
Alain de Raucourt
Pôle Miam !
Leimury
Electrolab::Membre
Messages : 25
Enregistré le : 16 juil. 2018, 21:19

Re: Programmation en C, problème avec structures

Messagepar Leimury » 26 nov. 2018, 19:56

Bonjour,

A voir l'image tu bosses sous linux avec GCC.
Vu que tu es en apprentissage il te faudrait des outils plus agréables et surtout un accès débug plus ergonomique.

Tu pourrais peut être prendre Netbeans avec le plugin pour le C/C++.
https://netbeans.org/downloads/

Là tu pourras éditer, compiler et immédiatement débugguer : ça ne fait qu'ajouter une interface à make, gcc et gdb.
C'est ce que j'utilisais sur un projet linux, ça permet de se simplifier la vie et de se concentrer sur le code.

Amuses toi bien.
Avatar de l’utilisateur
f4grx
Electrolab::Référent
Messages : 846
Enregistré le : 26 sept. 2016, 13:58

Re: Programmation en C, problème avec structures

Messagepar f4grx » 27 nov. 2018, 09:43

je suis absolument contre: plus d'outils signifie plus de trucs différents et compliqués pour arriver au résultat.

Puisque l'édition et la compilation ne sont pas un problème dans ce topic, ne complexifions pas l'affaire, il y a déja suffisamment de complexité pour un débutant avec les questions soulevées :)
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 » 02 déc. 2018, 21:58

Bonsoir à tous et à toutes !

Bon j'ai finis la version 0.1 de mon petit logiciel. Concrètement, toutes les fonctionalités de "base" sont prêtes. Bien entendu, je dois encore en rajouter plusieurs, qui vont rendre le logiciel plus "sexy", par exemple la capacité de créer des fiches perso, la capacité de prendre en compte dans les lancés de dés les diciplines (cf Vampire), une boucle qui mantient le programme en execution tant que l'utilisateur ne demande pas de sortir, et bien entendu, une interface graphique.

Mais avant de m'aventurer dans ce chemin qui risque d'être bien plus long (surtout pour l'interface graphique), je voulais avoir votre avis concernant le code dans l'état actuel des choses. Bon, je suis certain qu'un énorme travail d'optimisation peut être fait, et par ailleurs il est possible que des bugs existent que je n'ai pas remarqué (n'oubliez pas quand même que je suis débutant hahaha)

Donc voilà, vous en pensez quoi du code ? Qu'est-ce que je pourais faire mieux ?

Merci !

Vampire JDR _version alpha 0.1.zip
(24.38 Kio) Téléchargé 71 fois
Alain de Raucourt
Pôle Miam !
Avatar de l’utilisateur
b1ue
Electrolab::Membre
Messages : 4
Enregistré le : 06 nov. 2018, 15:00

Re: Programmation en C, problème avec structures

Messagepar b1ue » 03 déc. 2018, 17:30

Pardonnez moi, je déterre la discussion du début de ce topic, parce que je la trouve super intéressante car débutant moi aussi. Pour ce qui est de la lecture de l'entrée utilisateur, je préfère utiliser les sys calls, parce que je pense que c'est un très bon moyen de progressivement s'approprier les techniques de ce language si particulier. Et aussi, mais c'est un avis personnel, parce que je pense que le C n'est pas fait pour être utilisé en faisant abstraction de la gestion de mémoire. Les librairies standards peuvent faire le café, mais je pense qu'elles ne font pas le poids aujourd'hui avec d'autres languages à partir du moment où on veut faire quelque chose de solide (ie: sans arrêts soudains du programme, comportements indéterminés, ou pire un problème au runtime).

Ce qui me gêne avec fgets, c'est qu'au lieu de retourner le nombre de charactères lus (comme c'est le cas pour read), il retourne un pointeur sur le buffer lu. Du coup, on peut penser qu'il a correctement lu l'entrée de l'utilisateur alors que non. Ce n'est pas mortel c'est un petit problème. Mais qui peut s'ajouter à d'autres petits problèmes, et qui, au bout de quelques lignes de codes en plus peut devenir enquiquinant.

L'avantage quand on choisit d'utiliser ces fonctions c'est qu'on peut commencer doucement à mettre la main dans le cambouis et penser à comment fonctionne un programme, qu'est ce que coûte une suite d'instructions ? comment on peut faire des optis etc... L'inconvénient c'est qu'il faut essayer de penser à tout, je pense que c'est justement cet exercice qui vaut le coup !

ssize_t read(int fd, void* buf, size_t nbytes);
http://www.linux-france.org/article/man ... ead-2.html
ssize_t write(int fd, void *buf, size_t nbytes);
http://www.linux-france.org/article/man ... ite-2.html
Maximusk
Electrolab::CA
Messages : 53
Enregistré le : 15 nov. 2017, 08:58

Re: Programmation en C, problème avec structures

Messagepar Maximusk » 04 déc. 2018, 10:18

Oui, mais il y a un détail que tu oublies. fgets marche sur à peu près n'importe quel OS (au moins les plus utilisés). Read et write ne fonctionnent pas sous windows par exemple, et c'est quand même toujours plus de 80% des machines (PC, bien sur, pas les téléphones et l'embarqué). Sinon, il te faut recoder ta librairie standard en utilisant des macros pour appeller la bonne fonction selon ta plateforme, ton compilateur et ta lib C.
Et pour savoir comment fonctionne un programme, ce que coûte une suite d'instructions, ou comment optimiser, rien de tel que l'assembleur (c'est pas le plus simple, et ça n'a pas de sens d'écrire directement en assembleur de nos jours, mais connaitre les bases de l'assembleur permet de mieux comprendre le fonctionnement de la machine, par contre l'assembleur x86 est à éviter, c'est une usine a gaz).

Retourner vers « Les Projets »

Qui est en ligne

Utilisateurs parcourant ce forum : vince et 1 invité