, 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 :-)
Einrückung stimmt nicht mit den Blockumfängen überein. Bitte [bearbeiten] und beheben Sie es. – user694733
'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
Ich habe bemerkt, dass es in Ihrem Code keinen einzigen Kommentar gibt - für Ihre eigene geistige Gesundheit, beheben Sie diese schlechte Angewohnheit. – KevinDTimm