Vister26 Temat założony przez niniejszego użytkownika |
Użycie zmiennych z jednej funkcji w innej funkcji lub pliku. » 2013-08-18 17:51:16 Ciężko mi wytłumaczyć mój problem ale postaram się to zrobić na programie, który teraz robie: plik biblioteka.h: int StartProxySocks() { SOCKET proxySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); sockaddr_in service; memset( & service, 0, sizeof( service ) ); service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "127.0.0.1" ); service.sin_port = htons( 25000 );
W 5 linijce mam definicje zmiennej(?) 'masterSocket' i teraz jeśli chciałbym jej użyć w innej funkcji to mógłbym po prostu ją wyrzucić na początek programu i po problemie. Ale jeśli chciałbym jej użyć w innej bibliotece albo w *.cpp to już jest problem ponieważ 'extern' nie działa: main.cpp: #include <hclengine.h>
int bytesSent; int bytesRecv = SOCKET_ERROR;
char sendbuf[ 64 ] = "siema"; char recvbuf[ 64 ] = "";
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { StartProxySocks(); extern SOCKET proxySocket; bytesSent = send( proxySocket, sendbuf, strlen( sendbuf ), 0 ); bytesRecv = recv( proxySocket, recvbuf, 32, 0 ); MessageBox( NULL, recvbuf, "Wiadomość", MB_ICONINFORMATION | MB_OKCANCEL ); }
Gdy próbuje to skompilować debugger pokazuje błąd w 16 linijce : |16|error: 'proxySocket' was not declared in this scope
Może popełniam jakiś błąd przy 'extern' a jeśli nie to w jaki inny sposób można rozwiązać ten problem ? |
|
RazzorFlame |
» 2013-08-18 18:00:08 To co ty tworzysz w funkcji to zmienna lokalna, extern na nią nie działa. Użyj argumentu: int StartProxySocks( SOCKET & masterSocket ) { }
Już nie mówiąc o tym że zmienna w 5 linijce biblioteka.h nazywa się "masterSocket" a ta którą chcesz "externować" ma nazwe "proxySocket", a skąd kompilator ma wiedzieć że chcesz "externować" akurat masterSocket. Troche to nielogiczne nieprawdaż? Edit: char sendbuf[ 64 ]; char recvbuf[ 64 ] = "siema";
A nie powinno być na odwrót? Powinieneś wysyłać wiadomość a odbierać do bufora recvbuf. Send = ang. Wysyłać, Recv (Receive) = ang. Odbierać. |
|
Vister26 Temat założony przez niniejszego użytkownika |
» 2013-08-18 18:26:18 Dzięki za odpowiedź, te błędy są tylko tutaj ponieważ w moim programie jest wszystko bardziej rozbudowane i zlepiając kod na forum musiałem je przeoczyć.
Jeśli użyję argumentu 'int StartProxySocks(SOCKET &masterSocket)' to wtedy extern zadziała czy po prostu nie będę musiał go pisać? I jeszcze jedno: jeśli w funkcji mam zdefiniowane dwa gniazda (masterSocket i proxySocket) to jak zapisać ten argument?
@EDIT
OK, już mniej więcej wiem o co chodzi ;). Zrobilem to ale teraz gdy używam funkcji to musze wypełnić nawias i nie wiem co tam wpisać. |
|
unimator |
» 2013-08-18 18:42:36 Aby extern zadziałało zmienna, którą chcesz "rozciągnąć" do innych plików modułowych musi być globalna. Czyli proxySocket definiujesz gdzieś na górze. Plik1.cpp #include <cstdio>
using namespace std;
void jakasFunkcja( int & );
int main() { extern int zmienna; jakasFunkcja( zmienna ); printf( "%i\n", zmienna ); return 0; }
Plik2.cpp int zmienna; void jakasFunkcja( int & zmienna ) { zmienna = 5; }
|
|
Vister26 Temat założony przez niniejszego użytkownika |
» 2013-08-18 18:54:41 Dzięki unimator, zadziałało! Wyrzuciłem masterSocket poza funkcję i potem użyłem externu. Przy okazji znalazłem błąd w książce Grębosza. Pisał, że extern służy do wydobywania zmiennych które są gdzieś "na zewnątrz". To "na zewnątrz" może też oznaczać jakąś funkcję biblioteczną, którą dołączymy dopiero na etapie linkowania
|
Wg. mnie to "na zewnątrz" nie może oznaczać funkcji ponieważ extern nie chce wydobywać zmiennych które są zdefiniowane w funkcji |
|
RazzorFlame |
» 2013-08-18 18:59:04 Poczytaj może o funkcjach, masz tam dokładnie wytłumaczone. OK, już mniej więcej wiem o co chodzi ;). Zrobilem to ale teraz gdy używam funkcji to musze wypełnić nawias i nie wiem co tam wpisać |
Wpisujesz tam swoje zmienne. Przykład użycia takiej funkcji: int fillupsocket( SOCKET & sock1 ) { }
int main() { SOCKET socket; fillupsocket( socket ); }
Tworzysz w funkcji w której potrzebujesz daną zmienną (w tym przypadku w funkcji main, u ciebie WinMain), potem używając funkcji "fillupsocket" (u ciebie nazywa sie chyba StartProxySock) robisz z nią to co jest w tej funkcji (modyfikacja). Argumenty funkcji podajesz po przecinku. Przykład: int dodaj( int liczba1, int liczba2 ) { return liczba1 + liczba2; }
Nazwa argumentów nie gra roli (jedynie przy odwoływaniu sie do nich). Za argument możesz podać dowolną liczbe (w przypadku int) bądź inną wartość danego typu danych. Nie możesz podać liczby ani samej wartości jeśli w argumencie jest referencja do zmiennej (taki cichy wskaźnik oznaczany znakiem "&", pozwala modyfikować zmienną podaną w argumencie). Edit: Wg. mnie to "na zewnątrz" nie może oznaczać funkcji ponieważ extern nie chce wydobywać zmiennych które są zdefiniowane w funkcji |
Chodziło o funkcje a nie o zmienne w funkcji. |
|
pekfos |
» 2013-08-18 19:19:11 Przy okazji znalazłem błąd w książce Grębosza. Pisał, że extern służy do wydobywania zmiennych które są gdzieś "na zewnątrz". | extern sprawia, że dana zmienna jest łączona zewnętrznie, czyli można się do niej odwołać (po nazwie) z innych jednostek translacji. |
|
« 1 » |