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

tablica wskaźników

Ostatnio zmodyfikowano 2015-09-04 13:14
Autor Wiadomość
stevy
Temat założony przez niniejszego użytkownika
tablica wskaźników
» 2015-09-03 21:15:58
Witam, pytanie dotyczy przekazywania tablicy do funkcji.
Chodzi o to, że moja tablica zawiera wskaźniki, a do funkcji mogę przekazać jedynie tablicę wartości. Pytanie dotyczy tego, czy istnieje jakiś sposób, oprócz kopiowania jej zawartości do innej tablicy?

C/C++
int * tablica1;

//(różne operacje na niej itd...)

int tablica2[ 20 ];

//kopiowanie zawartości z tablicy1

funkcja( tablica2 );

chodzi głównie o to, że wykonuję tą operację na dość dużej tablicy i sporej ilości obiektów, co strasznie spowalnia program.
czy istnieje więc sposób, żeby przekazać wartości z tablicy1 za pomocą wskaźnika bez kopiowania jej zawartości?
P-137239
carlosmay
» 2015-09-03 22:21:43
C/C++
void f( int * spt ) {
    cout << * spt << ", " << *( spt + 1 ) << ", " << *( spt + 2 ) << endl;
}
void f2( int t[] ) {
    cout << t[ 0 ] << ", " << t[ 1 ] << ", " << t[ 2 ] << endl;
}
void f3( int p[] ) {
    cout << p[ 0 ] << ", " << p[ 1 ] << ", " << p[ 2 ] << endl;
}
void f4( int * ppt ) {
    cout << * ppt << ", " << *( ppt + 1 ) << ", " << *( ppt + 2 ) << endl;
}
int main()
{
    int * pt;
    int tab[ 3 ] = { 3, 4, 6 };
    pt = tab;
    f( pt );
    f2( pt );
   
    int tab2[ 3 ] = { 11, 22, 33 };
    int * ppt[ 3 ];
    * ppt = tab2;
   
    f3( * ppt );
    f4( * ppt );
   
    _getch();
}
Napisałem kilka przykładów. Nie do końca zrozumiałem twój opis.
Tablica sama w sobie jest jakby wskaźnikiem i jak przekażesz ją jako wskaźnik możesz odebrać ją jako wskaźnik i działać na arytmetyce wskaźników albo jak na zwykłej tablicy.
Twoja wola...

Edit: Ustawiasz wskaźnik w wybrane miejsce, przekazujesz wskaźnik, a sposób odbioru w funkcji jest już dowolny (trzeba tylko pamiętać, co wskazuje wskaźnik żeby nie wyjść poza tablicę, bo będzie zonk)
P-137242
michal11
» 2015-09-03 22:36:30
Z tego co zrozumiałem to nie masz innego wyjścia jak kopiowanie, typy muszą się zgadzać.
P-137244
Monika90
» 2015-09-03 22:50:33
Wszystkie tablice można przekazać przez wskaźnik, nie ważne co zawierają
P-137247
carlosmay
» 2015-09-03 23:30:16
C/C++
void f3( int * p[] ) {
    cout << * p[ 0 ];
    cout << ", " << * p[ 1 ];
    cout << ", " << * p[ 2 ] << endl;
}
void f4( int ** ppt ) {
    cout << ** ppt;
    cout << ", " << **( ppt + 1 );
    cout << ", " << **( ppt + 2 );
    cout << endl;
}
int main()
{
    int * p1, * p2, * p3;
    int a, b, c;
    a = 5;
    b = 6;
    c = 3;
    p1 = & a;
    p2 = & b;
    p3 = & c;
   
    int * ppt[ 3 ];
    ppt[ 0 ] = p1;
    ppt[ 1 ] = p2;
    ppt[ 2 ] = p3;
    f3( & ppt[ 0 ] );
    f4( & ppt[ 0 ] );
   
    _getch();
}

Tablica wskaźników do funkcji na dwa sposoby.
P-137249
Monika90
» 2015-09-03 23:45:58
C/C++
void f3( int * p[] );
void f4( int ** ppt );
Tak naprawdę jest to jeden sposób, bo w deklaracji parametrów funkcji
T a[]
 znaczy dokładnie to samo co
T * a
P-137250
carlosmay
» 2015-09-03 23:48:18
Tak. Chodziło tylko o formę zapisu. Misi być to samo skoro daje te same efekty. ;)
P-137252
stevy
Temat założony przez niniejszego użytkownika
» 2015-09-04 09:31:35
Napiszę inaczej. Mam tablicę wskaźników, z której to wartości skrywane pod adresami muszę przekazać do shadera. GLSL potrzebuje wskaźnika na pierwszy element tablicy z danymi, zaś moja tablica składa się ze wskaźników na te dane i jedynym wyjściem wydaje się mi kopiowanie jej zawartości do innej, co jest strasznie powolne. Dlatego pytam czy jest możliwe jakimś sposobem przekazanie tych danych bez kopiowania


C/C++
//normalnie
int tablica[ 10 ];
glUniform1iv( uchwyt, 10 /*rozmiar*/, tablica /*wskaźnik na 1 element*/ );


//w przypadku vectora
vector < int > tablica;
glUniform1iv( uchwyt, tablica.size(), & tablica[ 0 ] );


//tablica wskaźników
int * tablica1;
//różne operacje...
int tablica2[ 10 ]
//kopiownaie zwartości z tablicy1 do tablicy2...
glUniform1iv( uchwyt, 10, tablica2 );
P-137256
« 1 » 2
  Strona 1 z 2 Następna strona