gestion de variables

gestion de variables - C - Programmation

Marsh Posté le 10-05-2011 à 00:37:09    

Bonjour,
 
voila je voudrais savoir si cette idée est réalisable :
un programme qui lit une variable par exemple : scanf ("%s",&A)
on donne par exemple A=200
est ce que c'est possible que le programme se rappelle de cette valeur pour une autre exécution ??
c'est à dire utiliser A comme 200 sans avoir besoin de l'introduire??
 
Si oui une clarification serait la bienvenue ^^
 
Merci

Reply

Marsh Posté le 10-05-2011 à 00:37:09   

Reply

Marsh Posté le 10-05-2011 à 02:17:18    

Je pense que c'est impossible. C'est d'ailleurs pour cela que lorsque tu éteins ton pc, tout ce que tu as pu faire dessus disparaît, et tu es obligé de réinstaller l'OS, les logiciels, et de retaper les textes, refaire les photos numériques, etc.
 
Plus sérieusement, pour stocker et réutiliser des données, on a inventé un truc bien pratique qui s'appelle "les fichiers".

Reply

Marsh Posté le 10-05-2011 à 03:00:35    

Citation :

est ce que c'est possible que le programme se rappelle de cette valeur pour une autre exécution


Pas en C (ni un autre langage compilé)
Pour qu'un programme se rappelle une valeur, faut qu'il l'écrive qque part quand il connait la valeur, et qu'il aille la relire a l'execution suivante.
 
Avec un langage interprété, ie un script, c'est faisable, si le programme écrit la valeur dans le script.
 
Exemple en perl:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tie::File;
  5.  
  6.  
  7. my $A;
  8. tie my @array, 'Tie::File', "automod.pl" or die "cannot tie automod.pl: $!\n";
  9. for (@array) {
  10.  if (/^my \$A/) {
  11.    if (not defined($A)) {
  12.      print "A has no value\nPlease, enter a value: ";
  13.      $A = <STDIN>;
  14.      chop $A;
  15.      s/.*/my \$A=$A;/
  16.    } else {
  17.      print "A has value $A\nValue will be erased.";
  18.      s/.*/my \$A;/
  19.    }
  20.  }
  21. }
  22. untie @array;


le script, si A n'a pas de valeur, en demande une et l'inscrit en lui même, et si A a une valeur, il l'affiche et l'efface du script.
 
Suivant le même principe, mais avec plus de code, on peut faire beaucoup plus propre, en allant dumper/loader des objets perl sous forme d'une chaîne (tout un tas de modules perls pour faire cela existent) écrite dans une zone située après la zone de code d'un script perl (délimitable par un __END__)
 
A+,


Message édité par gilou le 10-05-2011 à 03:10:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 10:04:31    

Bonjour,
 
Merci pour vos explications
j'aimerai discuter ceci :
 
+un programme qui lit des variables et qui génère en même temps un fichier avec la syntaxe du C
+le fichier généré aura les valeurs des variables  
 
comme ça on sera obligé d'introduire les valeurs une seule fois...
 
Possible????
 
Merci

Reply

Marsh Posté le 10-05-2011 à 10:38:19    

Citation :

et qui génère en même temps un fichier avec la syntaxe du C

:??: C'est pas très clair la.
Vous voulez re-générer le programme source en C, avec la valeur des variables dedans? C'est faisable, mais pas particulièrement utile, puisqu'ensuite, il faudra bien recompiler ce programme source pour obtenir un exécutable (c'est justement cette phase de recompilation qu'on n'a pas avec un langage interprété).
Ou bien, vous voulez lire et écrire des valeurs de données dans un fichier (donc autre que le programme C)?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 11:26:33    

oui c'est le deuxième cas, c'est à dire générer un fichier qui va comporter le même programme de départ mais avec les valeurs qu'on vient de lire lors du premier programme.
donc on aura un fichier.c qui vas etre compiler et exécuter tout seul et on a introduit les valeurs qu'une seule fois (c'est ça l'objectif)
voici un essai pour généré un fich.c qui marche pas  :??:  
l’idée c'est d'ajouter la lecture des variables au premier programme et leur contenu dans le "toto.c" généré
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.                FILE *toto;
  7.                char n_fich[10];
  8.                char n[10];
  9.     printf("INSERT THE FILE NAME PLEASE : " );
  10.     scanf("%s", n);
  11.     strcat(n_fich,n);
  12.     strcat(n_fich,".c" );
  13.   toto = fopen(n_fich,"w" );
  14.   fprintf(toto,"#include <stdio.h>" );
  15.   fprintf(toto,"int main()" );
  16.   fprintf(toto,"{" );
  17.   fprintf(toto,"FILE *toto;" );
  18.   fprintf(toto,"char n_fich[10];" );
  19.   fprintf(toto,"char n[10];" );
  20.   fprintf(toto,"printf(" );
  21.   fputs(toto,'"');
  22.   fprintf(toto,"INSERT THE FILE NAME PLEASE :\n" );
  23.   fputs(toto,'"');
  24.   fprintf(toto," );" );
  25.   fprintf(toto,"scanf(" );
  26.   fputs(toto,'"');
  27.   fputs(toto,'%');
  28.   fprintf(toto,"s" );
  29.   fputs(toto,'"');
  30.   fprintf(toto,", n);" );
  31.   fprintf(toto," strcat(n_fich,n);" );
  32.   fprintf(toto,"strcat(n_fich," );
  33.   fputs(toto,'"');
  34.   fprintf(toto,".c" );
  35.   fputs(toto,'"');
  36.   fprintf(toto," );" );
  37.   fprintf(toto,"toto = fopen(n_fich," );
  38.   fputs(toto,'"');
  39.   fprintf(toto,"w" );
  40.   fputs(toto,'"');
  41.   fprintf(toto," );" );
  42.   fprintf(toto,"Hello" );
  43.   fprintf(toto,"fclose(toto);" );
  44.   fprintf(toto,"return(0);" );
  45.   fprintf(toto,"}" );
  46.   fclose(toto);
  47.   return(0);
  48. }


Reply

Marsh Posté le 10-05-2011 à 11:50:03    

Ca devient nébuleux... C'est pour un nouveau concept de programme à compilation auto-récursive ?

Reply

Marsh Posté le 10-05-2011 à 12:04:06    

Je sais pas en fait ce que ça veut dire une compilation auto-récursive..
l'objectif est de ne pas être obligé à retaper des variables pendant chaque compilation donc j'ai opté pour cette idée
je sais pas si ça pourra marcher... :??:

Reply

Marsh Posté le 10-05-2011 à 12:27:31    

Citation :

l'objectif est de ne pas être obligé à retaper des variables pendant chaque compilation donc j'ai opté pour cette idée


Si il y a une phase de recompilation systématique, on peut procéder ainsi:
1) Mettre dans un fichier.h les variables concernées (déclaration et valeur)
2) Inclure le fichier .h a la compilation
3) En fin d’exécution du programme, appeler une procédure rewrite_variable_file() qui va réécrire ce fichier .h avec les valeurs courantes

 

A+,


Message édité par gilou le 10-05-2011 à 12:28:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 13:30:54    

claude_tech a écrit :

Je sais pas en fait ce que ça veut dire une compilation auto-récursive..


 
Ca ne veut rien dire du tout, ça n'existe pas. Du moins, ça n'existait pas jusqu'à aujourd'hui...
 
D'après le premier post, le programme est censé lire des variables pour se régénérer avec des valeurs "à jour". Mais ca veut donc dire que le code généré doit produire un programme qui fait la même chose. Donc c'est sans fin ?
 
Si c'est pour conserver la nouvelle valeur des variables, je ne comprends pas pourquoi ne pas produire un fichier séparé avec les valeurs modifiées, comme on fait classiquement. En informatique, un programme est distinct des données qu'il manipule. C'est un principe essentiel pour ne pas avoir à recompiler à chaque fois qu'un utilisateur "change une virgule".

Reply

Marsh Posté le 10-05-2011 à 13:30:54   

Reply

Marsh Posté le 10-05-2011 à 15:07:08    

gilou votre solution semble une bonne idée
 
"1) Mettre dans un fichier.h les variables concernées (déclaration et valeur)"
 
est ce que ce fichier.h permettra de lire ces variables pour la première exécution?? comment?
 
@+

Reply

Marsh Posté le 10-05-2011 à 15:12:08    

shaoyin oui le code doit produire un autre code qui fait la même chose sauf que ce dernier doit utiliser les variables lis lors de exécution du premier programme
ça reste juste une idée mais apparemment sa réalisation n'est pas encore possible pour moi...
 
si on génère le fichier avec juste les valeurs séparés comment est ce que on peut dire au compilateur d'utiliser ces valeurs pour exécuter le programme et non pas attendre les valeurs qu'on va taper???

Reply

Marsh Posté le 10-05-2011 à 15:24:26    

claude_tech a écrit :

shaoyin oui le code doit produire un autre code qui fait la même chose sauf que ce dernier doit utiliser les variables lis lors de exécution du premier programme
ça reste juste une idée mais apparemment sa réalisation n'est pas encore possible pour moi...
 
si on génère le fichier avec juste les valeurs séparés comment est ce que on peut dire au compilateur d'utiliser ces valeurs pour exécuter le programme et non pas attendre les valeurs qu'on va taper???


 
le compilateur n'exécute pas le programme, il traduit simplement ton code source en fichier objet ( qui seront utilisés par le linker pour générer l'exécutable).
 
Pour effectuer ce que tu souhaites faire , c'est très simple :
 
 - tu testes l'existence de ton fichier qui va contenir tes variables
 - s'il n'existe pas, tu demandes à l'utilisateur de saisir les valeurs d'initialisation, puis tu enregistres celles-ci dans un fichier
 - s'il existe, tu sautes l'étape de demander à l'utilisateur de saisir les valeurs d'initialisation, et tu initialises directement tes variables avec le contenu du fichier.
 
Un hic cependant, tu ne pourras jamais modifier la valeur d'une variable à partir du moment où elle aura été saisie une fois. Dans ce cas , soit la valeur peut être modifié ultérieurement dans le programme ( et tu enregistres dans le fichier à chaque fois qu'elle peut être modifée), soit au démarrage du programme, tu rajoutes une condition supplémentaire : celle de poser la question à l'utilisateur pour savoir s'il veut saisir une variable, ou s'il souhaite utiliser les précédentes ( si elles existent ).

Reply

Marsh Posté le 10-05-2011 à 15:56:09    

Pourquoi tu stockes aps les valeurs des variables dans un fichier texte ou binaire qui sera lu au démarrage du programme :??: Ca serait quand même vachement plus simple et logique, non?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-05-2011 à 16:03:19    

Je commence à penser comme xilebo : peut-être que claude_tech croit que le compilateur est un "interpréteur" de code source.
 
Vu sous cet angle, l'étrangeté de sa démarche peut s'expliquer. Si c'est pas ça, ben je vois pas du tout l'application pratique de ce genre de truc ! Autant utiliser lex/yacc ou des outils du même genre.

Reply

Marsh Posté le 10-05-2011 à 16:04:28    

claude_tech a écrit :

gilou votre solution semble une bonne idée
 
"1) Mettre dans un fichier.h les variables concernées (déclaration et valeur)"
 
est ce que ce fichier.h permettra de lire ces variables pour la première exécution?? comment?
 
@+


Si j'ai un fichier
toto.h
/* **** toto.h ** */
int myvar = 5;
#define MYVAR_DEFINED
/* ********* */
et que dans le programme C je fais  
#include "toto.h"
je vois pas ou est le problème.
surtout que tu peux tester
#ifndef MYVAR_DEFINED
int myvar;
// du code pour demander la valeur a l'utilisateur
#endif
 
A+,


Message édité par gilou le 10-05-2011 à 16:10:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 16:05:28    

Pareil, je pense qu'il ne sais pas ce qu'est un compilateur.
 
Du coup, pour qu'il se couche moins bête ce soir => http://fr.wikipedia.org/wiki/Compilateur   ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-05-2011 à 16:09:32    

@gilou : D'un point de vue académique, c'est sûr que c'est faisable, mais c'est vraiment se compliquer la vie pour un intérêt qui reste à démontrer. Personnellement, c'est l'exotisme du problème qui me perturbe.

Reply

Marsh Posté le 10-05-2011 à 16:11:22    

shaoyin a écrit :

@gilou : D'un point de vue académique, c'est sûr que c'est faisable, mais c'est vraiment se compliquer la vie pour un intérêt qui reste à démontrer. Personnellement, c'est l'exotisme du problème qui me perturbe.

On est d'accord sur ce point :)
Ça n'a pas le moindre intérêt, par rapport a une solution standard ou on sauve/relit un fichier.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 16:28:04    

oui tu as raison, c'est ça la tache que le programme doit accomplir
c'est simple comme tu le dis, mais j'ai eu du mal à m'exprimer ou peut être je comprenais pas bien ce que je voulais
 
maintenant j'aurai deux problèmes :
 +comment enregistrer les valeurs tapés dans un fichier
+et comment utiliser ce contenu en cas de besoin (dans le cas ou l'utilisateur voudra utiliser les précédentes valeurs)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.                FILE *toto;
  7.                char n_fich[10];
  8.                char n[10];
  9.                float A,B;
  10.     printf("INSERT THE FILE NAME PLEASE : " );
  11.     scanf("%s", n);
  12.     printf("Donner A :" );
  13.     scanf("%s",&A);
  14.     printf("Donner B :" );
  15.     scanf("%s",&B);
  16.     strcat(n_fich,n);
  17.     strcat(n_fich,".txt" );
  18.   toto = fopen(n_fich,"w" );
  19.   fclose(toto);
  20.   return(0);
  21. }


 
voila...apparemment mon programme ne fait que créer le fichier....c'est ce que je peux faire avec mon niveau
 
Merci
 
cette réponse est pour xilebo...


Message édité par claude_tech le 10-05-2011 à 16:33:07
Reply

Marsh Posté le 10-05-2011 à 16:33:51    

Tente d'ouvrir le fichier en lecture.  Si ce n'est pas possible (resultat de fopen == NULL), lis depuis stdin et ecrit le fichier (a rouvrir en ecriture) avec les valeurs lues, sinon lis depuis le fichier.


Message édité par Un Programmeur le 10-05-2011 à 16:34:21

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 10-05-2011 à 16:39:32    

voile l’intérêt de ce que je veux faire :
 
-je veux un programme qui lit des valeurs " valeurs initiales" pour réaliser certaines taches  
-je veux pas retaper ces "valeurs initiales" à chaque fois que je veux utiliser ce programme
-je veux que ces valeurs tapés "se mémorisent" d'une certaine façon de telle sorte les utiliser sur mon programme à chaque fois que je le veux
 
Du moment que je dois taper plusieurs valeurs initiales, ça ne sera pas son intérêt si j'arrive à réaliser ceci..
 
Merci

Reply

Marsh Posté le 10-05-2011 à 16:46:47    

Tente d'ouvrir un fichier avec un nom fixe.
S'il existe, lis les valeurs depuis le fichier.
S'il n'existe pas ou que la lecture a un probleme, demande les valeurs et ecrits les dans le fichier pour la prochaine execution.
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 10-05-2011 à 16:51:34    

claude_tech a écrit :

voile l’intérêt de ce que je veux faire :
 
-je veux un programme qui lit des valeurs " valeurs initiales" pour réaliser certaines taches  
-je veux pas retaper ces "valeurs initiales" à chaque fois que je veux utiliser ce programme
-je veux que ces valeurs tapés "se mémorisent" d'une certaine façon de telle sorte les utiliser sur mon programme à chaque fois que je le veux
 
Du moment que je dois taper plusieurs valeurs initiales, ça ne sera pas son intérêt si j'arrive à réaliser ceci..
 
Merci

Ca c'est juste un fichier de données lu par le programme.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 17:00:19    

Un Programmeur a écrit :

Tente d'ouvrir un fichier avec un nom fixe.
S'il existe, lis les valeurs depuis le fichier.
S'il n'existe pas ou que la lecture a un probleme, demande les valeurs et ecrits les dans le fichier pour la prochaine execution.
 


 Voila c'est exactement ce que je ne sais pas faire
ce que je peux faire c'est de créer un fichier
mais comment faire pour lire les valeurs depuis ce fichier ??
et comment faire pour les écrire??

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.                FILE *toto;
  7.                char n_fich[10];
  8.                char n[10];
  9.                float A,B;
  10.     printf("INSERT THE FILE NAME PLEASE : " );
  11.     scanf("%s", n);
  12.     printf("Donner A :" );
  13.     scanf("%s",&A);
  14.     printf("Donner B :" );
  15.     scanf("%s",&B);
  16.     strcat(n_fich,n);
  17.     strcat(n_fich,".txt" );
  18.   toto = fopen(n_fich,"w" );
  19.   fclose(toto);
  20.   return(0);
  21. }

Reply

Marsh Posté le 10-05-2011 à 17:01:37    

gilou a écrit :

Ca c'est juste un fichier de données lu par le programme.
A+,


 
 
et comment faire pour réaliser ceci??
fscanf??

Reply

Marsh Posté le 10-05-2011 à 17:03:51    

Gagne.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 10-05-2011 à 17:03:53    

Utilise les fonctions "fread" et "fwrite" pour les opérations d'entrée / sortie dans ton fichier.
 
EDIT : Ah oui, y'a "fscanf" aussi... ;)

Message cité 1 fois
Message édité par shaoyin le 10-05-2011 à 17:05:17
Reply

Marsh Posté le 10-05-2011 à 17:09:15    

shaoyin a écrit :

Utilise les fonctions "fread" et "fwrite" pour les opérations d'entrée / sortie dans ton fichier.
 
EDIT : Ah oui, y'a "fscanf" aussi... ;)


   :pt1cable:  puisqu'il y a fprintf ..pourquoi pas fscanf
 
"c'est les imbéciles qui sachent tout", c'est ce que dit notre prof d'info lorsqu'il fait une telle erreur  :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed