2014-09-09 3 views
5

Ok, quindi continuo a ricevere questo errore:.gcc dicendo "incarico da incompatibile tipo di puntatore [attivata per impostazione predefinita]

$ gcc -Wall -g translate.c support.c scanner.c -o translate 
translate.c: In function ‘main’: 
translate.c:22:16: warning: assignment from incompatible pointer type [enabled by default] 
    dictionary = createArray(count); 
      ^
support.c: In function ‘readTokens’: 
support.c:66:18: warning: assignment from incompatible pointer type [enabled by default] 
     a[count] = token; 
      ^

e io non so perché

Ecco la mia funzione principale:

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

int main(int argc, char** argv) { 
    int i; 
    int count; 
    char** dictionary; 

    if (argc != 3) { 
     printf("need two arguments!\n"); 
     exit(-1); 
    } 

    count = countTokens(argv[1]); 
    printf("there are %d tokens and strings\n", count); 

    dictionary = createArray(count); 

    readTokens(argv[1], dictionary); 

    printf("The dictionary:\n"); 
    for (i = 0; i < count; ++i) { 
     printf("%s\n", dictionary[i]); 
    } 
    return 0; 
} 

e la mia funzione di creare array:

char* createArray(int count) { 
    char* a; 
    a = malloc(sizeof(char*) * count); 
    if (a == 0) { 
     fprintf(stderr, "memory allocation failed\n"); 
     exit(1); 
    } 

    return a; 
} 

e il suo colpo di testa

char * createArray(int);

non ho idea di come ottenere questo di andare via. Ho provato a togliere e ad aggiungere asterischi e passare da un segno di uguale a due, ma non funziona. Studente di secondo anno, primo anno in C. Qualsiasi aiuto sarebbe apprezzato un milione di volte. Grazie!

+2

'dictionary = createArray (count);' assegna un 'char *' a un 'char **'. –

+0

Potresti aggiungere la definizione della funzione 'readTokens()'? – Nandyy

+0

è qui sotto. questo è quello che mi ha davvero dato problemi.grazie mille per la risposta createArray e rispondendo così rapidamente :) –

risposta

6

Le funzioni createArray vengono dichiarate e implementate con un errore. Avete bisogno di un array di puntatori char, che è di tipo (char **), in modo da creare e restituire una tale varietà:

char** createArray(int count) { 
    char** a; 
    a = malloc(sizeof(char*) * count); 
    if (a == 0) { 
     fprintf(stderr, "memory allocation failed\n"); 
     exit(1); 
    } 

    return a; 
} 
+2

Quasi la stessa risposta della mia, ma 6 secondi dopo! –

5

Il tuo createArrray ha la firma sbagliata. Prova invece

char** createArray(unsigned count) { 
    char** a = malloc(sizeof(char*) * count); 
    if (a == NULL) { 
    perror("createArray"); exit(EXIT_FAILURE); 
    } 
    return a; 
} 

Naturalmente modificare la dichiarazione nel file di intestazione di conseguenza:

char** createArray(unsigned); 

BTW, hai ragione nella compilazione con gcc -Wall -g. Ora prova ad avviare il tuo programma passo dopo passo nel debugger gdb.

NB: non ha senso avere count dichiarato come int (moralmente, non può essere negativo).

+1

+1 - mi hai battuto :) – MByD

3

Non si contano le tue stelle.

Foo* foo =      // 1 star 
    malloc(sizeof(Foo));   // 0 stars 

Foo** foo =      // 2 stars 
    malloc(sizeof(Foo*));  // 1 star 

Foo******* foo =     // N stars 
    malloc(sizeof(Foo******)); // N-1 stars 

Se il tuo conteggio è diverso, stai sbagliando.

Naturalmente questo è solo un controllo di sicurezza. Devi capire che cosa fa ogni * nel tuo codice.

Il dizionario è char**. Perché? È un array (il primo *) di stringhe (il secondo *). Quindi non può essere char o char* o char***. Quindi sul lato destro del compito è necessario anche un char**, quindi char** deve restituire char** e char** e char** e all'interno del malloc è necessario N-1 = 1 stella.

Problemi correlati