Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++]prośba o wyjaśnienie linijki kodu

adyrian 17 Lip 2010 19:16 1448 6
  • #1 17 Lip 2010 19:16
    adyrian
    Poziom 23  

    Witam
    Jestem bardzo początkującym adeptem sztuki programowania Stąd z góry przepraszam za banalność mojego pytania. Czytając i przeglądając różne przykłady natrafiłem na coś takiego:

    std::string name( (char *)*componentName+1, (*(UInt8 **)componentName)[0] );

    Mam wielką prośbę o wytłumaczenie sensu tej linijki, a konkretnie argumentów.
    Czy to rzutowanie i operacja na wskaźnikach?

    0 6
  • #2 17 Lip 2010 19:21
    Daab
    Poziom 12  

    No dosyć oryginalne....

    Nie wiem ale wygląda na coś takiego:

    Cytat:

    string ( const char * s, size_t n );
    Content is initialized to a copy of the string formed by the first n characters in the array of characters pointed by s.

    źródło: www.cplusplus.com

    0
  • #3 17 Lip 2010 20:04
    Sam Sung
    Poziom 31  

    Wygląda to na konstukcję stringa (konstruktorem opisanym przez Daab'a) ze stringa pascalowego. W stringach pascalowych pierwszy bajt oznacza długość tekstu, a zaraz po nim znajduje się tekst. Czyżby Borland C++ Builder? Dla pełnej jasności trzebaby zobaczyć deklarację zmiennej componentName.

    0
  • #4 19 Lip 2010 02:08
    Dr.Vee
    VIP Zasłużony dla elektroda

    Strasznie karkołomna konstrukcja - jeśli chcesz się czegoś (dobrego) nauczyć, to nie ucz się więcej z tych przykładów...

    0
  • #5 20 Lip 2010 21:18
    adyrian
    Poziom 23  

    Siedzę dość głęboko w Pythonie ale od pewnego czasu próbuje też trochę ugryźć C++. No i właśnie problemem dla mnie jest m. in to, że w tym języku konstrukcje wzięte "z życia" często nijak się mają do książkowych przykładów... :)
    Ten fragment to kawałek działającego programu, opartego na frameworku Quicktime.


    Code:
    Handle componentName = NewHandle( 0 );
    
    if ( componentName ) {
    Handle componentInfo = NewHandle( 0 );
      if ( componentInfo ) {
        if ( GetComponentInfo( decompressor, &cd, componentName, componentInfo, NULL ) == noErr ) {
           std::string name( (char *)*componentName+1, (*(UInt8 **)componentName)[0] );
           std::string info( (char *)*componentInfo+1, (*(UInt8 **)componentInfo)[0] );
           _meta.setData(MetaData::QuickTime::CODEC_NAME, name );
           _meta.setData(MetaData::QuickTime::CODEC_INFO, info );
          }
          DisposeHandle( componentInfo );
        }
        DisposeHandle( componentName );
      }
    }


    Tak więc - abstrahując od karkołomności tej konstrukcji- czy mógłbym prosić o opisanie, choćby w kilku zdaniach, co dzieje się w tej linijce??

    Code:
    std::string name( (char *)*componentName+1, (*(UInt8 **)componentName)[0] );


    Pozdrawiam

    0
  • #6 20 Lip 2010 22:31
    Dr.Vee
    VIP Zasłużony dla elektroda

    Potrzebna jest jeszcze znajomość definicji typu Handle.

    0
  • Pomocny post
    #7 20 Lip 2010 22:49
    Sam Sung
    Poziom 31  

    adyrian napisał:
    Tak więc - abstrahując od karkołomności tej konstrukcji- czy mógłbym prosić o opisanie, choćby w kilku zdaniach, co dzieje się w tej linijce??

    Code:
    std::string name( (char *)*componentName+1, (*(UInt8 **)componentName)[0] );


    Pozdrawiam
    W tej linijce deklarowana jest zmienna name typu std::string. Zmienna ta jest od razu inicjowana nowoutworzoną instancją klasy std::string. Instancja jest tworzona konstruktorem, którego opis znajduje się w drugim poście. Jako rozmiar tekstu brany jest pierwszy bajt spod componentName, zaś sam tekst zaczyna się bajt dalej.

    0