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: 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ą: 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? |
|
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. |
|
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: size_t fwrite( const void * buffer, size_t size, size_t count, FILE * stream );
a mamy powiedzmy (zgodnie z cplusplus.com): 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? ^^ int a = 0; void ** A =( void ** ) malloc( sizeof( * void ) ); funkcja( a, A );
FILE * pFile; pFile = fopen( "myfile.bin", "wb" );
fwrite( A,,, pFile );
fclose( pFile );
free( A )
return 0;
przepraszam, może głupio pytam, ale naprawdę nie rozumiem. |
|
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. |
|
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. |
|
pekfos |
» 2018-01-10 19:45:39 void * ptr = nullptr; funkcja( n, & ptr );
|
|
Anim Temat założony przez niniejszego użytkownika |
» 2018-01-10 19:47:02 Aaaa.... no głupi ja :) |
|
« 1 » |