Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[C] Problème de variables !


Messages recommandés

Posté(e)

Hello,

 

Comme indiqué dans le titre j'ai un petit souci de variables, ou plutôt pour me servir de celles-ci ...

 

Je précise que je n'ai pas l'habitude de coder en C donc merci de ne pas me frapper ... :P

 

Je m'explique, j'ai un fichier main.c ( j'en met juste un petit bout pour illustrer ) :

 

PS : pas de remarques sur la tabulation, merci :P

 

 
# ici plein d'include ...

#include "fonction.h"


 int main (int argc, char *argv[])
  {
 int i;
 for (i = 1; i != argc; ++i)
  {
 if (argv[i][0] == '-')
  {
 char* popt;
 for (popt = &argv[i][1]; *popt != '\0'; ++popt)
  {
 switch (*popt)
  {


... ici plein de choses ...


 case 'l':
  {
 if(opendir(argv[2]) != NULL)
  {
 char* popt;
 for (popt = &argv[i][1]; *popt != '\0'; ++popt)
  {
 switch (*popt)
  {


 case 'a':
  {
 chdir(argv[2]);
 AllDA ();
 return 0;
  }
 break;

 case 'f':
  {
 chdir(argv[2]);
 AllDF ();
 return 0;
  }
 break;

... et encore plein de choses ...

 

Et dans mon fichier fonction.h , bah les fonctions .. :P

 

Au lieu d'avoir 200 fonction quasi identiques ( une seule ligne change ) dans le .h je voudrais dans une même fonction mettre des if(variable = ...) et donc en fonction de cette variable modifier les actions mais là n'est pas le problème .. le souci c'est que quand je déclare la variable dans le main.c par exemple :

 

	case 'f':
 {
   chdir(argv[2]);
 long variable = 4;
   AllDF ();
   return 0;
 }
   break;

 

Dans la fonction AllDF ( dans le cas présent ) qui se trouve dans le fonction.h je ne peux pas me servir de la variable qui semble avoir perdu sa valeur, je crois que c'est normal mais existe t-il une solution pour conserver la valeur de celle-ci dans la fonction du .h ?

 

J'espère que la question est assez claire et merci à celui(ceux) qui pourra(ont) répondre :P

Posté(e)

Salut,

As tu essayé le passage par adresse de ta variable?

Du genre :

lors de la declaration de ta fonction AllDF (long *Var) {...}

et lors de l'appel : AllDF(&variable);

Posté(e)

ta variable variable (sic) est définie dans ton bloc d'instructions de ton switch, elle a une portée locale.

 

Pourquoi ne pas l'initialiser en variable globale avant l'appel de la fonction main()? (i.e juste après les include)

Ainsi, cette variable sera utilisable dans tout le code et pas uniquement dans ton bloc d'instructions.

 

//normalement dans un .h, tu as uniquement les déclarations des prototypes de fonctions, les define.... et dans un fichier source .c la/les fonction(s) proprement dites avec leur(s) variable(s) locale(s)

 

quel est ton prototype de fonction? le code de la fonction?

 

exemple:

header.h

...
/*Déclaration des sous-fonctions */
FILE * LireFichier(char *nom_fichier);
int nb_lignes (FILE *fp);
...

LireFichier est une fonction prenant en paramètre un pointeur sur un char et qui retourne un pointeur sur une structure FILE

nb_lignes est une fonction prenant en paramètre un pointeur sur une structure FILE et qui retourne un entier

 

LireFichier.c

#include <stdio.h>
#include <stdlib.h>

/*Déclaration des variables*/
FILE *fichier = NULL;

FILE* LireFichier(nom_fichier) {
scanf("%[^'\n']s",&nom_fichier);
printf("Le fichier d'analyse est %s\n", nom_fichier);*/

/* ouverture du fichier */
fichier = fopen(nom_fichier, "r");

if (fichier != NULL)
	{
		//lecture du fichier
		printf("Chargement du fichier .... \nTermin\202\n");
	}
else
	{
		printf("Erreur. Impossible de charger %s\n", nom_fichier);
		return EXIT_FAILURE;
	}

return fichier;
}

 

nb_lignes.c

#include <stdio.h>

/*Comptage du nombre de lignes*/
int nb_lignes (FILE *fp)
{
 int nl=0, c;

 while ((c = fgetc(fp)) != EOF)
 {
if (c == '\n')
{
  ++nl;
}
 }
 return nl;
}

 

main.c

#include <stdio.h>
...
int main(int argc, char *argv[]) {
//ouverture du fichier
FILE *fichier = LireFichier(argv[1]);
int nlig = nb_lignes(fichier);
printf("Le fichier comporte %i lignes\n", nlig);
return 0;
}

 

les variables sont correctement transmises aux sous-fonctions car elles correspondent à ce qu'attendent les fonctions en terme d'arguments

Posté(e)

Hello Greywolf,

 

Merci pour ta réponse détaillée, je vais tester certaines choses :P

 

Ce que je voudrais faire c'est juste éviter de répéter les codes des fonctions, le programme fonctionne bien mais j'utilise une fonction par argument passé en ligne de commande, par exemple :

 

test.exe -lt "c:\"

 

va se placer dans c:\ ( chdir(argv[2]) )

 

puis va utiliser cette fonction :

 

char * AllDat ()

{

DIR *FichA = opendir(".");

if (FichA != NULL)

{

struct dirent *FichL;

while ((FichL = readdir (FichA)))

{

struct stat st;

stat (FichL->d_name, &st);

{

time_t t = st.st_mtime;

struct tm tm = *localtime (&t);

char s[32];

strftime (s, sizeof s, "%d/%m/%Y %H:%M", &tm);

if (!strcmp(FichL->d_name, ".") || !strcmp(FichL->d_name, "..")) continue;

printf ("[%s] %s\n", s, FichL->d_name);

}}

closedir (FichA), FichA = NULL;

}}

 

si on utilise ceci : test.exe -la "c:\"

 

il va lancer une autre fonction identique à la précédente mais sans les dates .. et ainsi de suite avec d'autres arguments donc à mon avis répétition de code pour rien .. c'est pour ça que j'avais pensé à donner une valeur différente à une variable pour chaque argument et mettre des conditions suivant sa valeur dans une seule fonction. Mais je suis ouvert à toute autre solution :P

Posté(e)

c'est argv[1] qui conditionne tes tests?

 

si oui, tu balances argv[1] à ta fonction AllData()

 

prototype de fonction

void AllData(char *);

 

//void car manifestement ta fonction AllData ne retourne rien à la fonction appelante si on se réfère au bout de code que tu as donné

 

appel de la fonction

AllData(argv[1]);

Posté(e) (modifié)
c'est argv[1] qui conditionne tes tests?

En partie oui, mais dans le cas du -lt le "l" sert à tester si le argv[2] existe avant de continuer, si oui c'est le suivant qui conditionne la fonction qui sera appelée ( ici "t" )

 

 

case 'l':

{

if(opendir(argv[2]) != NULL)

{

char* popt;

for (popt = &argv[1]; *popt != '\0'; ++popt)

{

switch (*popt)

{

 

 

case 'a':

{

....

}

break;

 

case 't':

{

...

 

//void car manifestement ta fonction AllData ne retourne rien à la fonction appelante si on se réfère au bout de code que tu as donné

Non elle ne retourne rien, elle se contente d'afficher ce qu'on lui demande

Modifié par Eric_71
Posté(e)

Un code qui marche

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>

int Alldat(char character){
	printf("%c\n",character);
	return(0);
}

int main(int argc, char* argv[]) {
	char *popt = NULL;
	popt = &argv[1][2];
	Alldat(*popt);
	return 0;
}

 

Le troisième caractère du premier argument du programme est transmis à Alldat(). Tu peux ensuite t'amuser à faire des switchs dessus

Posté(e)

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


void Alldat(char character){
printf("caractère pointé par popt: %c\n", character);
switch(character) {
	case 'a':
		printf("il faut afficher les fichiers cachés!\n");
		break;
	case 't':
		printf("il faut afficher les dates!\n");
		break;
}
}

int main(int argc, char **argv) {
char *popt = NULL;
int i = 1;

while (i< argc) {
	for (popt = &argv[i][0]; *popt != '\0'; ++popt) {
		Alldat(*popt);
	}
	i++;
}
return 0;
}

 

retourne

./test -lt -la
caractère pointé par popt: -
caractère pointé par popt: l
caractère pointé par popt: t
il faut afficher les dates!
caractère pointé par popt: -
caractère pointé par popt: l
caractère pointé par popt: a
il faut afficher les fichiers cachés!

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...