2016-10-18 1 views
-1

der Code:Allokierung von Speicher für ein Array von struct i einen Fehler

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 20 

typedef struct word{ 

    char word[20]; 
    int occurrance; 
} word; 

int array_word_creator(word *array, FILE *fp); 
void initialize(word array[], int max); 
void comparator(word array[], int max, FILE *fp); 
void printer(word array[], int max); 





int main(int argc, char *argv[]) 
{ 
    FILE *f_sent, *f_words; 
    word *array; 
    int arr_lenght=0; 
    if(argc!=3) 
    { 
     printf("Wrong argument number, please use NAME FILE1 FILE2;\n"); 
     exit(EXIT_FAILURE); 
    } 
    if((f_sent=fopen(argv[1], "r"))==NULL||(f_words=fopen(argv[1], "r"))==NULL) 
    { 
     printf("Can't find or open the files, please check if the name is correct\n"); 
     exit(EXIT_FAILURE); 
    } 
    arr_lenght=array_word_creator(array, f_words); 
    comparator(array, arr_lenght ,f_sent); 
    printer(array, arr_lenght); 

    return 0; 
} 

int array_word_creator(word *array, FILE *fp) 
{ 
    int n,i=0; 
    fscanf(fp,"%d",&n); 
    *array= malloc(n*sizeof(word)); 
    while(fscanf(fp,"%s", array[i].word)!=EOF) 
    { 
     i++; 
    } 
    initialize(array,n); 

    return n; 
} 

void initialize(word array[], int max) 
{ 
    int i; 
    for(i=0;i<max;i++) 
    { 
     array[i].occurrance=0; 
    } 
} 

void comparator(word array[], int max, FILE *fp) 
{ 
    char word[MAX]; 
    int i; 
    while(fscanf(fp,"%s", word)!=EOF) 
    { 
     for(i=0;i<max;i++) 
     { 
      if(strcmp(word, array[i].word)==0) 
      { 
       array[i].occurrance++; 
      } 
     } 
    } 
} 

void printer(word array[], int max) 
{ 
    int i; 
    for(i=0;i<max;i++) 
    { 
     if(array[i].occurrance>0) 
     { 
      printf("The word '%s' occurs %d times\n", array[i].word, array[i].occurrance); 
     } 
    } 
} 

Und der Compiler sagt mir:

C:\Users\Matteo\Google Drive\Programming\C\lab3\es1\main.c|47|error: incompatible types when assigning to type 'word' from type 'void *'| 

I-Speicher nur studierte Zuteilung so bin ich einige Probleme, mit ihm, besonders mit Strukturen. Wenn möglich, verlinken Sie mir auch ein paar gute Dokumente zu diesem Thema.

danke!

+0

Typ von '* Array' ist ein' Wort'. Sie können ihm keinen Zeiger zuweisen. Wenn Sie zugewiesenen Zeiger von Ihrer Funktion zurückgeben wollen, sollte sein Prototyp sein 'int array_word_creator (Wort ** Array, FILE * fp)' – Ari0nhh

+0

Welche Zeile ist 47? – 2501

+0

Es ist eine Struktur in der Nähe der Spitze definiert –

Antwort

0

Sie wollen dies:

... 
arr_lenght = array_word_creator(&array, f_words); 
... 


int array_word_creator(word **array, FILE *fp) 
{ 
    int n, i = 0; 
    fscanf(fp, "%d", &n); 
    *array = malloc(n * sizeof(word)); 
    while (fscanf(fp, "%19s", (*array)[i].word) != EOF) 
    { 
    i++; 
    } 
    initialize(*array, n); 

    return n; 
} 
+0

Ich würde 'while (fscanf (fp,"% s ", (* array) [i] .word)! = EOF)' zu 'while (i mch

+0

@mch korrigiert, danke –

1

In main Wort * Array ein Zeiger auf eine Struktur vom Typ Wort.

Dann übergeben Sie Array, das auf nichts verweist, an die Funktion array_word_creator.

Sie versuchen dann, den von malloc zurückgegebenen Zeiger dem Array zuzuweisen, aber er zeigt noch nirgendwo hin, und selbst wenn, würde es auf ein Wort zeigen (da es ein Wort * ist) Daher kann kein Zeiger gespeichert werden, daher der Compilerfehler.

Wenn Sie den Array-Zeiger in main auf das Ergebnis von malloc setzen möchten, müssen Sie einen Zeiger auf den Zeiger übergeben. int array_word_creator(word **array, FILE *fp), dann würden Sie es anrufen, indem Sie array_word_creator(&array, ....) tun, das Ihre * array = malloc wird funktionieren.

Verwandte Themen