Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Użycie zmiennych z jednej funkcji w innej funkcji lub pliku.

Ostatnio zmodyfikowano 2013-08-18 19:19
Autor Wiadomość
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:
C/C++
int StartProxySocks()
{
   
    //--------------Tworzenie gniazda--------------------------------
    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:
C/C++
#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 ?
P-90475
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:
C/C++
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:
C/C++
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ć.
P-90476
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ć.
P-90478
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
C/C++
#include <cstdio>

using namespace std;

void jakasFunkcja( int & );

int main()
{
    extern int zmienna;
    jakasFunkcja( zmienna );
    printf( "%i\n", zmienna );
    return 0;
}

Plik2.cpp
C/C++
int zmienna; //tą zmienną będziemy "rozciągać"
void jakasFunkcja( int & zmienna )
{
    zmienna = 5;
}
P-90479
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
P-90480
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:
C/C++
int fillupsocket( SOCKET & sock1 )
{
    //modyfikujesz 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:
C/C++
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.
P-90481
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.
P-90484
« 1 »
  Strona 1 z 1