2011-03-18 3 views
2

J'utilise le struct CvPoint2D32f de OpenCV, qui est défini commeComment allouer un tableau de pointeurs vers une struct

typedef struct CvPoint2D32f 
    { 
     float x; /* x-coordinate, usually zero-based */ 
     float y; /* y-coordinate, usually zero-based */ 
    } 
    CvPoint2D32f; 

Je suis en train d'affecter un tableau de pointeurs de ces objets comme suit, et ne fonctionne pas. Comment cela doit-il être accompli?

CvPoint2D32f *cvpoints[8]; 
for (i = 0; i < 16; i++) 
    { 
     if (i % 2 == 0) 
     { 
      (*cvpoints)[i/2].x = float(points[i]); // points is an array of ints. 
     } 
     else 
     { 
      (*cvpoints)[i/2].y = float(points[i]); 
     } 
    } 

Répondre

5

Vous disposez d'un tableau de pointeurs vers CvPoint2D32f, pas un tableau des structures elles-mêmes. Vous n'avez pas de mémoire allouée aux structures réelles. Vous avez trois options:

  • Modifiez votre déclaration en CvPoint2D32f cvpoints[8]; afin de disposer de toutes les structures dans un tableau de la pile.
  • Après avoir alloué le tableau pour les pointeurs, ajoutez une instruction malloc pour allouer de la mémoire. Exemple:

    CvPoint2D32f *cvpoints[8]; 
    for (i = 0; i < 8; i++) 
        { 
        cvpoints[i] = (CvPoint2D32f *)malloc(sizeof(CvPoint2D32f)); 
        } 
    
  • Utilisez malloc d'allouer taille pour toutes les structures. Exemple:

    CvPoint2D32f *cvpoints = (CvPoint2D32f *)malloc(8 * sizeof(CvPoint2D32f)); 
    
+0

Ce sentiment de faire! Mais j'obtiens l'erreur d'erreur: conversion invalide de 'void *' en 'CvPoint2D32f *' – soxarered

+0

Puis cast le retour de malloc avec '(CvPoint2D32f *)'. Mise à jour de la réponse ... –

+0

Notez, cependant, qu'en C, vous ne devriez pas avoir besoin de renvoyer le retour de malloc au type de pointeur. Souvent, lorsque vous en avez besoin, c'est parce que vous compilez avec un compilateur C++. –

1
CvPoint2D32f *cvpoints = (CvPoint2D32f*) malloc(sizeof(struct CvPoint2D32f) * 8); 
memset(cvpoints, \0, sizeof(struct CvPoint2D32f) * 8); 

for (i = 0; i < 16; i++) 
{ 
    if (i % 2 == 0) 
    { 
     cvpoints[i/2].x = float(points[i]); // points is an array of ints. 
    } 
    else 
    { 
     cvpoints[i/2].y = float(points[i]); 
    } 
} 

Et quand vous avez fini avec eux, vous libérez de la mémoire:

free(cvpoints); 
0

Où ces pointeurs pointent vers? Je suppose que ce que vous voulez faire est d'allouer de la mémoire dynamique pour les structures, mais je ne vois aucune allocation de mémoire dans votre code. Actuellement, tous les pointeurs pointent vers une mémoire non définie, donc bien sûr cela échouera.

0

Vous êtes juste en train de créer les pointeurs, mais vous avez besoin pour pointer vers quelque chose en mémoire!

Exemple:

struct CvPoint2D32f *cvpoint = (struct CvPoint2D32f *)malloc(sizeof(struct CvPoint2D32f)); 
if (cvpoint == NULL) { 
    //malloc error 
} 
Questions connexes