2015-01-28 6 views
5

Hey, sono nuovo alla programmazione (imparando attraverso cs50x in C) e quando hanno menzionato le strutture ho deciso di provare a scherzare e ho appena scritto un programma rapido che avrebbe scambiato alcuni valori in una struttura che utilizza una funzione. Sono in esecuzione fino a diversi messaggi di errore, il primo dei quali è "tipi di puntatori incompatibili che passano" numeri di struct * "al parametro di tipo" struct numbers * ". Un altro problema sembra emergere nella definizione della funzione dove il compilatore dice" incompleto definizione del tipo 'struct numero'" speravo solo per un aiuto perché sono perplesso.Nuovo alla programmazione, problema con strutture e funzioni

Heres il codice (so che la sua ruvida ma sto imparando lol)

#include <stdio.h> 
struct numbers; 
void swap(struct numbers* s); 

int main(void) 
{ 
    struct numbers 
    { 
     int a; 
     int b; 
     int c; 
    }; 
    struct numbers x = {1, 5 , 9}; 
    swap(&x); 
    printf("%i, %i, %i\n", x.a, x.b, x.c); 
    return 0; 
} 

void swap(struct numbers* s) 
{ 
    int temp = s -> a; 
    int temp2 = s -> b; 
    s -> a = s -> c; 
    s -> b = temp; 
    s -> c = temp2; 
} 
+1

"i numeri di struct definiti all'interno di main" e "struct numbers outside any function" sono considerati tipi diversi. Sposta la definizione all'esterno di 'main'. – immibis

+1

Benvenuti in SO. Mentre la domanda è generalmente ok, sarà più facile per tutti se la prossima volta che inserisci una domanda specifichi quale linea solleva ogni errore. Non dimenticare di contrassegnare una delle risposte che risolvono il problema (se esiste) come soluzione. – SJuan76

+0

Come detto in precedenza, rendere globale la definizione di 'struct'. Inoltre, metti ulteriore spazio tra le righe che trattano cose diverse (come ad esempio dopo il '# include ', a C non interessa i rientri. Puoi anche usare'% d' in 'printf', è più comune. – Gophyr

risposta

6

il problema è che la dichiarazione è globale, ma la definizione è locale in main, Per utilizzare il m le braci di una struttura, la funzione swap deve sapere quali membri hanno la struttura e, poiché non può vedere la definizione, non lo sa. Rimuovere la dichiarazione e inserire la definizione nell'ambito globale.

8

vi aspettate il codice in swap() per essere in grado di accedere ai campi di struct numbers, ma la dichiarazione completa di quel tipo è all'internomain(), quindi non è visibile.

Scomporre la dichiarazione, deve essere visibile a tutti coloro che ne hanno bisogno. Mettendolo prima rimuoverà anche la necessità di pre-dichiarare la struttura.

Lo stesso con swap() stesso, inserendolo prima dello main() eliminerà la necessità di avere un prototipo per esso nello stesso file.

Dovrebbe essere:

struct numbers 
{ 
. 
. 
. 
} 

static void swap(struct numbers *s) 
{ 
. 
. 
. 
} 

int main(void) 
{ 
. 
. 
. 
} 
+0

Grazie, ha risolto il problema. – ashissl

+0

Potrebbe anche valere la pena di usare 'typedef' in modo da creare più istanze della struttura:' typedef struct {int a; int b; int c; } NUMERI: 'consente semplicemente di scrivere' static void swap (NUMBERS * s) 'più o meno allo stesso modo in cui si usa' int * 'o' float * '. – GoBusto

+0

Certo, è comodo, ma non capisco cosa intendi per "istanze multiple". Questo non ha niente a che vedere con 'typedef', e non è un problema nel codice dell'OP. Nota la riga in 'main()' che inizia con 'struct numbers x =', che sta creando un'istanza e può esserci un numero qualsiasi di tali. – unwind

4

funzione swap non riescono a vedere la definizione di struct numbers. Mettilo globalmente fuori dallo main.

Extra Tip - Uso typedef con le strutture, ti dà la flessibilità nella dichiarazione:

typedef struct typeNumbers 
{ 
    int a; 
    int b; 
    int c; 
} numbers; 

Nota che typeNumbers è facoltativo. Lo dichiariamo:

numbers x = {1, 2, 3}; 
1

Il problema era che la struttura era in main, ho apportato alcune correzioni anche al codice e commentarle.

#include <stdio.h> 

//By defining the struct at the beginning you can avoid the forward declaration 
//and it make more sense to know what "numbers" is before continuing reading the code. 
struct numbers { 
    int a; 
    int b; 
    int c; 
}; 

void swap(struct numbers* s) 
{ 
    //Small change to use only one temp variable... 
    int temp2 = s -> b; 
    s -> b = s -> a; 
    s -> a = s -> c; 
    s -> c = temp2; 
} 

int main(void) 
{ 
    struct numbers x = {1, 5 , 9}; 
    swap(&x); 
    printf("%i, %i, %i\n", x.a, x.b, x.c); 
    return 0; 
} 
Problemi correlati