2016-05-04 21 views
2

, wenn ich den folgenden Code kompiliert:Casting struct Zeiger in C

AVFrameSideData* avfsd=NULL; 
avfsd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS); 
if(avfsd != NULL) { 
    int n_mvs = 0; 
    if(avfsd->size > 0) 
     n_mvs = avfsd->size/sizeof(struct AVMotionVector); 
    struct AVMotionVector *mv = (struct AVMotionVector *) (avfsd->data); 
    printf("motion vectors of this frame:\n"); 
    int idx; 
    for(idx=0; idx<n_mvs; idx++) { 
     printf("mv[%d]:\n", idx); 
     if(mv[idx]->source < 0) 
      printf("the current macroblock comes from the past\n"); 
    } 
} 

mein Compiler beschwert:

video_analysis.c:46:13: error: invalid type argument of ‘->’ (have ‘struct AVMotionVector’) 
    if(mv[idx]->source < 0) 

Ehrlich gesagt, es ist etwas falsch hier:

struct AVMotionVector *mv = (struct AVMotionVector *) (avfsd->data); 

mv ist ein struct Zeiger, davon ist es nicht erlaubt, durch eine zweidimensionale Array-Art wie * mv [] zuzugreifen. Allerdings, wenn ich es in GDB lief, konnte ich Dinge drucken wie folgt aus:

(gdb) print mv[0] 
$2 = {source = -1, w = 16 '\020', h = 16 '\020', src_x = 6, src_y = 10, dst_x = 8, dst_y = 8, flags = 0, motion_x = -5, motion_y = 4, 
    motion_scale = 2} 

das ist genau das, was ich ... drucken möchten Wie Sie sehen können, mv [0], die kann nicht von meinem ursprünglichen code zugegriffen werden spinet oben kann jetzt im GDB-Modus zugegriffen werden. Wie macht GDB diese Magie möglich? Wenn ich wie in GDB auf mv [0] in meinem Programm zugreifen möchte, wie sollte ich diese struct Zeiger verarbeiten? Vielen Dank im Voraus :-)

+1

Einrückung stimmt nicht mit den Blockumfängen überein. Bitte [bearbeiten] und beheben Sie es. – user694733

+0

'avfsd-> data' scheint ein Zeiger auf ein Array von' struct AVMotionVector's zu sein. Wenn ja, dann ist 'mv [idx] 'eine gültige Möglichkeit, auf diese Strukturen zuzugreifen. In diesem Fall sollte jedoch 'mv [idx] -> source' wahrscheinlich durch' mv [idx] .source' ersetzt werden, da nur eine Umleitung benötigt wird. – user694733

+0

Ich habe bemerkt, dass es in Ihrem Code keinen einzigen Kommentar gibt - für Ihre eigene geistige Gesundheit, beheben Sie diese schlechte Angewohnheit. – KevinDTimm

Antwort

2

ändern

if(mv[idx]->source < 0) 

zu

if(mv[idx].source < 0) 

Erklärung

  • mv ist ein Zeiger zu struct AVMotionVector

  • mv[idx] ist ein struct AVMotionVector und deshalb müssen Sie . statt ->.

+0

jetzt funktioniert es! Vielen Dank!! – Kindermann