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

void **

Ostatnio zmodyfikowano 2018-01-10 19:47
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
void **
» 2018-01-10 19:04:29
Cześć.

Mam problem ze zrozumieniem idei konstrukcji z tematu:

C/C++
void **

Czy ktoś może mi wytłumaczyć jak to działa? Po co i kiedy można to stosować? Do zadania tych pytań skierował mnie problem, który widziałem gdzieś na stacku jakiś czas temu. Problem polegał na tym, że chłopak miał bibilotekę, z metodą:

C/C++
int funkcja( int a, void ** tmp )

Problem polegał na tym, że chłopak chciał przekierować do pliku to, na co po wywołaniu powyższej metody miał wskazywać void ** tmp. I tak pomyślałem, że w sumie sam nie wiem, jak miałbym przekierować na strumień binarny coś takiego. Niestety nie pamiętam nic więcej. Na stacku odpowiedzi nie było.

Czy ktoś znalazłby chwilę, aby wytłumaczyć zagadnienie?
P-168584
pekfos
» 2018-01-10 19:14:12
Funkcja przyjmuje void**, więc pewnie "w stylu C" zwraca przez argument void*. Więcej nie można powiedzieć. To wskaźnik bez określonego typu, więc może wskazywać na cokolwiek. Powiedzmy że funkcja podstawia adres jakiegoś bloku danych i z kontekstu jest znany rozmiar tego bloku (argument a?) W tym momencie zapisanie czegoś takiego do pliku jest trywialne. Popatrz sobie chociażby na argumenty przyjmowane przez fread() - przyjmuje wskaźnik void* i rozmiar.
P-168585
Anim
Temat założony przez niniejszego użytkownika
» 2018-01-10 19:26:00
Hm. Jednak nie rozumiem mimo tego, że powinno być trywialne :)

Skoro funkcja fwrite:
C/C++
size_t fwrite( const void * buffer, size_t size, size_t count, FILE * stream );

a mamy powiedzmy (zgodnie z cplusplus.com):

C/C++
FILE * pFile;
char buffer[] = { 'x', 'y', 'z' };
pFile = fopen( "myfile.bin", "wb" );
fwrite( buffer, sizeof( char ), sizeof( buffer ), pFile );
fclose( pFile );
return 0;

to dla przypadku z naszym void **, powinno być co? ^^

C/C++
int a = 0;
void ** A =( void ** ) malloc( sizeof( * void ) ); //<-- Tutaj  rozumiem, że void ** musi mieć jakoś zdefiniowany rozmiar(?)
funkcja( a, A );

FILE * pFile;
pFile = fopen( "myfile.bin", "wb" );

//jako rozmiar ma być rozmiar voida? voida*? chara?

fwrite( A,,, pFile );


fclose( pFile );


//zwolnienie w taki sposób?
free( A )

return 0;


przepraszam, może głupio pytam, ale naprawdę nie rozumiem.
P-168586
jankowalski25
» 2018-01-10 19:36:32
void ** A =( void ** ) malloc( sizeof( * void ) );
Co to jest? Dlaczego rzutujesz
void *
 na
void **
? I dlaczego alokujesz próbujesz alokować (
sizeof( * void )
 jest niepoprawne, jeśli już to
sizeof( void * )
) kilka bajtów na stercie (nigdzie ich nie zwalniając)? Stos nie wystarcza? Przecież jak masz
void *
, to możesz tam wcisnąć dowolny wskaźnik. A
void **
 to po prostu wskaźnik do dowolnego wskaźnika.
P-168587
Anim
Temat założony przez niniejszego użytkownika
» 2018-01-10 19:43:15
Dobrze, przyznaję się, że nie wiem jak to zrobić i spróbowałem wykorzystać sposób, który znalazłem przed chwilą w Internecie (mówię o alokacji pamięci, a nie o samym problemie...chociaż o problemie też, bo w sumie nie mój :) ). W takim razie, jak powinno wyglądać to co próbuję "uskutecznić" powyżej? Po prostu nie mam pojęcia.
P-168589
pekfos
» 2018-01-10 19:45:39
C/C++
void * ptr = nullptr;
funkcja( n, & ptr );
// ptr teraz ma wartość jakąś (zapewne)
P-168590
Anim
Temat założony przez niniejszego użytkownika
» 2018-01-10 19:47:02
Aaaa.... no głupi ja :)
P-168591
« 1 »
  Strona 1 z 1