[C] Referencja w modułach

0

Witam.

Mam problem z referencją w modułach w języku C.

Otóż tak - dylematy są dwa - do tej pory używałem referencji z C++ (deklarowanie parametru funkcji z ampersandem), w tym momencie przychodzi mi się zmierzyć z C - gdzie z tego co się dowiedziałem należy przekazywać parametr z gwiazdką, i następnie tak też się do niego odnosić - stąd nie wiem, czy tej referencji poprawnie używam.

Ale teraz już do rzeczy - mam program modułowy - pliki nagłówkowe, kod. Program jako całość (nie podzielony na moduły i z C++'ową referencją) działał bez problemu, niestety muszę go zmodularyzować (taki wymóg). No i tu już na wstępie w plikach nagłówkowych GCC wyrzuca mi 'parse error', dev 'syntax error' a visual c++ to już w ogóle modułom nie daje rady tak więc.. Pytanie do Was - co tutaj w zapisanym w ten sposób pliku modułowym jest źle?

#ifndef STDOPER_H
#define STDOPER_H

void losuj(short *x, short *y, short *poz);
void nowa_partia(short c_ships[10][10], short c_shoots[10][10], short h_ships[10][10], char h_shoots[10][10], short c_boom[6]);
bool czy_wygrana_gracza(short c_ships[10][10], bool *player_win);
bool czy_wygrana_kompa(short h_ships[10][10], bool *cpu_win);

#endif

błąd w dev'ie - "syntax error before czy_wygrana_gracza", "syntax error before bool", "sytnax error before czy_wygrana_kompa" - w gcc bliźniaczo.

Z góry dzięki za pomoc.

0
  1. W C nie ma typu bool, zastap to np intem o wartosciach 0 i 1 (albo zrob sobie #define 0 FALSE i #define 1 TRUE)
  2. W C to nie referencje a wskazniki
0

@up:
odwrotnie, powinno byc #define FALSE 0 oraz w C mozesz uzywac referencji, ale wskaznik to zawsze wskaznik :)

0

O, to nie wiedziałem.
Rozumiem że wystarczy jak to true/false zdefiniuję w pliku macierzystym (tam gdzie mam funkcję main), czy muszę osobno w każdym nagłówku/ciele każdego modułu?

0

A z tym wskaźnikiem - tak, teraz to logiczne - w sumie nie wpadłem na to :) Ale tak czy śmak zwał jak zwał, działa tak samo jak referencja, kwestia taka że do funkcji przekazuję wskaźnik (nie zmienną) i sama funkcja operuje już na wskaźniku i zapisuje wartości na zmiennej wskaźnikowej :)

(wybaczcie posta pod postem ale jak nie mam konta to nie mogę edytować, chyba wielki czas się zarejestrować)

0

Tam gdzie chcesz uzywac, a pliki nie sa powiazane.

0

Ok, to jeden dylemat z głowy, niestety pojawiają się następne.

  1. Wszystkie biblioteki mam dołączone w moim głównym module, ale jeżeli używam funkcji char(int) w innych modułach to kompilator pluje mi się znowu, że 'syntax error'. Co zrobić? Dołączyć tą bibliotekę w każdym module?

  2. 'for' loop initial declaration used outside C99 mode - to już w ogóle - pętli 'for' nie mogę używać w modułach..?

0

W plikach naglowkowych raczej nie mozesz uzywac petli, ani innych takich rzeczy, poniewaz inaczej sa przetwarzane przez kompilator.
Co do tego pierwszego char(int) to nie wiem o co Ci tutaj chodzi, wyglada mi to podobnie do rzutowania w pythonie ;)
int(zmienna)

0

Nie używam pętli w plikach nagłówkowych (.h), a w ciałach danych modułów (.c). Tam też nie mogę używać pętli for..?

A co do char(int) - chodziło mi o funkcję char(zmienna typu integer), zwracającą wartość danej liczby w kodzie ASCII.

0

Mozesz, z tym ze w C tak bedzie zle:

for(int i = 3; i < 323; i++);

Poniewaz musisz i zadeklarowac wczesniej, a co do tej Twojej funkcji to char jest zastrzezone, wiec nie mozesz tak nazywac swoich tworow.

0

Czyli pętli for muszę użyć, z tym że muszę zadeklarować lokalną zmienną iteracyjną wcześniej?

A co do char - ciągle widzę mnie nie rozumiesz. char jako funkcja w bibliotece stdlib.h zwraca dla zmiennej całkowitej wartość znakową w kodzie ASCII. Coś jak IntToStr w Pascalu. Mówiąc prosto - załóżmy że jeżeli jakaś zmienna ma wartość 0 to ja chcę wyświetlić A, jak 1 to B itd. - załóżmy niech tą zmienną będzie x, wtedy char(x+65) zwróci mi właśnie to o co mi chodzi, bo w ASCII A ma numer 65, B - 66 i tak dalej. Nie spotkałeś się nigdy z tą funkcją? I chodzi o to że ja jej sobie normalnie w moim module głównym (tam gdzie jest funkcja main i zadeklarowane są biblioteki) używam, ale w ciałach modułów już nie mogę, bo mi krzyczy błąd.

0

Tam w pierwszym zdaniu miało być 'mogę', tzn. 'czyli pętli for mogę użyć'. Masz rację, w ten sposób działa.

Natomiast skoro już piszę nowego posta jeszcze jedno pytanie - jeżeli mam funkcję pobierającą jako parametr wskaźnik, np. wykonaj(short *x), i przekazuję do niej jako parametr zmienną (nie wskaźnik, np. wykonaj(y) gdzie y jest zmienną typu short) wyrzuca mi ostrzeżenie 'passing arg 1 of 'wykonaj' making pointer from integer without a cast'. Ale jeżeli przekażę wykonaj(*y), wyrzuca nie ostrzeżenie a błąd - 'invalid type argument of 'unary *''. To co mam tu zrobić w końcu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1