2015-01-28 8 views
5

Hej, jestem nowy w programowaniu (uczenie się przez cs50x w C) i kiedy wspomnieli o strukturach postanowiłem spróbować oszukać i napisać szybki program, który zamieniłby pewne wartości w struktura korzystająca z funkcji. Pracuję do momentu pojawienia się kilku komunikatów o błędach, z których pierwszy jest "niekompatybilnymi wskaźnikami przekazującymi" numery struct * "do parametru typu" struct numbers *. "Kolejna kwestia pojawia się w definicji funkcji, w której kompilator mówi" niekompletne definicja typu „struct numer””ja tylko nadzieję na jakąś pomoc, bo jestem zakłopotany.Nowość w programowaniu, problem ze strukturami i funkcjami

Herezje kod (znam jego szorstki ale uczę 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

"Numery struktur zdefiniowane w obrębie głównego" i "numery struktur poza dowolną funkcją" są uznawane za różne typy. Przenieś definicję poza 'main'. – immibis

+1

Witamy w SO. Chociaż pytanie jest ogólnie w porządku, będzie łatwiej każdemu, jeśli następnym razem po wpisaniu pytania określisz, która linia podnosi każdy błąd. Nie zapomnij zaznaczyć jednej z odpowiedzi, które rozwiązują twój problem (jeśli taki istnieje) jako rozwiązanie. – SJuan76

+0

Jak wcześniej wspomniano, zmień definicję "struct" na globalną. Ponadto, umieść dodatkową przestrzeń między liniami, które zajmują się różnymi rzeczami (takimi jak po '# include', C nie dba o wcięcia.) Możesz chcieć użyć'% d' również w 'printf', jest to bardziej powszechne. – Gophyr

Odpowiedz

6

problemem jest to, deklaracja struct numberso nazwie jest globalna, ale definicja jest lokalna w main, Aby użyć m Żar struktury, funkcja swap musi wiedzieć, jakie elementy ma struktura, a ponieważ nie widzi definicji, nie wie o tym. Usuń deklarację i umieść definicję w zasięgu globalnym.

8

czekasz kod w swap() aby mieć dostęp do pól z struct numbers, ale pełna deklaracja tego typu jest wewnątrzmain(), więc nie jest to widoczne.

Wywołaj deklarację, która musi być widoczna dla wszystkich, którzy jej potrzebują. Umieszczenie go na pierwszym miejscu również usunie potrzebę wstępnego zadeklarowania struktury.

To samo z swap() samemu, umieszczając go przed main() usunie potrzebę posiadania prototypu dla niego w tym samym pliku.

Powinno być:

struct numbers 
{ 
. 
. 
. 
} 

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

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

Dzięki, że naprawił problem. – ashissl

+0

Warto również użyć 'typedef', aby utworzyć wiele instancji struktury:' typedef struct {int a; int b; int c; } NUMBERS; 'pozwala ci po prostu napisać' static void swap (NUMBERS * s) 'w podobny sposób jak użyłeś' int * 'lub' float * '. – GoBusto

+0

Oczywiście, to wygodne, ale nie rozumiem, co masz na myśli przez "wiele instancji". To nie ma nic wspólnego z 'typedef' i nie stanowi problemu w kodzie OP. Zwróć uwagę na wiersz w 'main()', który zaczyna się od 'struct numbers x =', który tworzy instancję i może istnieć dowolna liczba takich. – unwind

4

Funkcja swap nie widać definicji struct numbers. Umieść go na całym świecie poza main.

Extra Tip - Wykorzystanie typedef z kodowanym, to daje elastyczność w deklaracji:

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

Zauważ, że typeNumbers jest opcjonalne. Deklaracja taka jak:

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

Problem polegał na tym, że struktura była w głównej części, wprowadziłem pewne poprawki również do kodu i skomentowałem je.

#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; 
} 
Powiązane problemy