2013-04-11 3 views
-4

Donc j'écris ce programme, et je ne sais pas comment passer par référence ou valeur. J'ai juste besoin de passer des valeurs d'une fonction (processFile) à une autre fonction (printReport). Toute aide sur la façon de le faire serait appréciée.C passant et pointeurs

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

void printInstructions(); 
int processFile(FILE *fileIn); 
void printReport(); 

int main(void) 
{ 
    FILE *fileIn; 
    int words = 0, 
     lines = 0, 
     characters = 0, 
     sentences = 0; 

    printInstructions(); 

    fileIn = fopen("input09.txt", "r"); 

    if(fileIn == NULL) 
     printf("\n\nERROR\n\n"); 

    processFile(fileIn); 

    printReport(words, lines, characters, sentences); 

} 

void printInstructions() 
{ 
    printf("\n Program reads a file and returns the number of \n"); 
    printf("lines, words, characters, and sentences in the file.\n\n"); 

    return; 
} 

int processFile(FILE *fileIn) 
{ 
     int sentences = 0, 
      words = 0, 
      lines = 0, 
      characters = 0, 
      ch; 

    while(ch != EOF) 
    { 
      ch = fgetc(fileIn); 

      if(ch == '\n' || ch == 60) 
        lines++; 

      if(ch == '.') 
        sentences++; 

      if(ch != '.' || ch != ' ' || ch != '\n') 
        characters++; 

      if(ch == ' ') 
        words++; 
    } 

    return 0; 
} 

void printReport() 
{ 
    printf("This file contains NUMBER lines.\n"); 
    printf("This file contains NUMBER words.\n"); 
    printf("This file contains NUMBER characters.\n"); 
    printf("This file contains NUMBER sentences.\n\n"); 

    return; 
} 

Répondre

0

Essayez de changer à ceci:

int processFile(FILE *fileIn, int *sentences, int *words, int *lines, int *characters) 
{ 
    int ch; 
    ... 

     if(ch == '\n' || ch == 60) 
       *lines++; 
    ... 

int main(void) 
{ 
    ... 
    processFile(fileIn, &sentences, &words, &lines, &characters); 
    ... 

Ainsi, dans ce changement, la fonction processFile prend maintenant quatre paramètres par pointeur. Lorsque vous accédez à ces paramètres, utilisez (par exemple) *lines pour déréférencer le pointeur.

Dans main(), lorsque vous appelez processFile(), vous transmettez des adresses à vos paramètres.

Espérons que cela aide; Je pense que vous voulez en savoir plus sur le passage des paramètres en C/C++ (valeur par passe, point par point, et référence par référence - vous pourriez vouloir utiliser Google pour ces termes).

0

Si vous voulez lire depuis FILE dans votre fonction, vous le faites déjà correctement.

FICHIER * fileIn pointe vers un bloc de mémoire sur la pile. Fondamentalement, c'est un nombre. Lorsque vous passez ce "numéro" à une autre fonction, vous pointez toujours sur la même chose, ce qui vous permet de modifier ce que vous pointez. Toutefois, si vous placez fileIn point à un autre endroit dans votre fonction. Par exemple: fileIn = null; vous devrez passer fileIn comme un double pointeur. Il devrait y avoir 2 * comme ceci: void foo(FILE **bar).

0

Vous pouvez commencer par définir une structure de données pour contenir toutes les statistiques pour une phrase donnée comme

typedef struct stats { 
    int words; 
    int lines; 
    int characters; 
    int sentences; 
}stats; 

En principal, vous pouvez créer un objet de cette structure de données

struct stats stats_obj; 

Pour Récupérez les statistiques de processFile, vous pourriez donner une référence à cet objet comme

processFile(fileIn, &stats_obj); 

En processFile, à la fin du traitement, vous pouvez stocker de nouveau les résultats que

stats_obj->words = words; 
stats_obj->lines = lines; 
......... 

Après processFile retours, vous pouvez passer la même chose à printReport que printReport(stats_obj) et imprimer la même au sein de cette fonction

void printReport(struct stats stats_obj) 
{ 
    printf("This file contains %d lines.\n", stats_obj.lines); 
    printf("This file contains %d words.\n" , stats_obj.words); 
    printf("This file contains %d characters.\n", stats_obj.characters); 
    printf("This file contains %d sentences.\n\n", stats_obj.sentences); 

    return; 
} 

NOTE: Il est toujours recommandé de vérifier la sortie de fopen et par conséquent vous devrez insérer un NULL vérifier fileIn après fileIn = fopen("input09.txt", "r");

0

Vous pouvez faire comme ceci:

int main(void) 
{ 
    ... 
    int sentences = 0, 
     words = 0, 
     lines = 0, 
     characters = 0, 
     ch; 

    processFile(fileIn, &words, &lines, &characters, &sentences); 

    printReport(words, lines, characters, sentences); 
} 

int processFile(FILE *fileIn, int *pWords, int *pLines, 
           int *pLines, int *pSentences) 
{ 
     ... 
     *pLines++; 
     *pSentences++; 
     *pCharacters++; 
     *pWords++; 
}