C:如何将结构添加到指针数组

时间:2016-10-09 02:50:05

标签: c pointers struct

对C来说有点新鲜,我已经全神贯注地解决了这个问题,但我找不到任何东西。 好的,我有这些结构:

typedef struct pixel_lab {
  double L; // Lightness channel
  double a; // Magenta/Green channel
  double b; // Cyan/Yellow channel
} Color_lab;

#define MAX_DIM 3
struct kd_node
{
    double x[MAX_DIM];
    Color_lab *pix;
    struct kd_node *father;
    struct kd_node *left;
    struct kd_node *right;

} kd_node;

typedef struct kd_node Kd_node;

这个函数将是递归的:

void function (Color_lab *pixels, int k, Kd_node* pater, int finish, int start){
 if (k>0){
    int size;
    size = floor(finish-start)/2 + 1;

    Color_lab* pixels_1[size];

    int cont1=0;
    for (int x = start; x < finish; x++){
        *pixels_1[cont1] = pixels[x];
        cont1++;
    }
    function(pixels_1 , k-1, pater, finish/2, start);
 }

其中像素是Color_lab数组。

所以我想拥有一个Color_labs数组(原始的子集),我可以重新插入该函数。对于这显然我需要它是相同的类型,但无论我怎么说,我得到一个分段错误或不兼容的类型(实际上这段代码只是一个不给我不兼容的类型,但我已经移动了指针到处都是。)

我试图将当前像素直接分配给新阵列但看起来不是它的工作原理,任何帮助?

谢谢!

*编辑

这里是整个代码,我被告知了变化(而上面的结构中的pix forom不再是指针)。失败的部分(添加数组),虽然我放入了基本条件。这篇文章的唯一尝试是仅使用原始Color_lab数组的一部分来运行函数中的其余代码。我知道问题不是在它开始递归的时候,因为我在没有它的情况下尝试代码并将其缩小到数组。

 void palletear (Color_lab *pixels, int k, Kd_node* pater, int inicio, int fin, int first, int side){

  if (k > 0){
    double gmrangemin = 255;
    double byrangemin = 255;
    double lumrangemin = 255;
    double gmrangemax = 0;
    double byrangemax = 0;
    double lumrangemax = 0;

    double lum[fin - inicio];
    double gm[fin - inicio];
    double by[fin - inicio];

    int size;
    size = fin - inicio + 1;

    Color_lab pixeles_lado1[size];
    Color_lab pixeles_lado2[size];

    for (int x = inicio; x < fin; x++){
        if (lumrangemin > pixels[x].L){
          lumrangemin = pixels[x].L;
        }
        else if (lumrangemax< pixels[x].L){
          lumrangemax = pixels[x].L;  
        }
        if (gmrangemin > pixels[x].a){
          gmrangemin = pixels[x].a;
        }
        else if (gmrangemax< pixels[x].a){
          gmrangemax = pixels[x].a;  
        }
        if (byrangemin > pixels[x].b){
          byrangemin = pixels[x].b;
        }
        else if (byrangemax< pixels[x].b){
          byrangemax = pixels[x].b;  
        }
        lum[x] = pixels[x].L;
        gm[x] = pixels[x].a;
        by[x] = pixels[x].b;
    };

    if ((lumrangemax - lumrangemin) >= (gmrangemax - gmrangemin)){
      quickSort(lum, 0, sizeof(lum)/sizeof(lum[0])-1);
      double median;
      if ((sizeof(lum)/sizeof(lum[0]))%2 == 0) {
        median = ((lum[(sizeof(lum)/sizeof(lum[0]))/2]) + ((lum[(sizeof(lum)/sizeof(lum[0]))/2]) + 1))/2;
      }
      else{
        median = lum[((sizeof(lum)/sizeof(lum[0])) + 1)/2];
      }
      printf("%lf\n", median);
      int cont1=0;
      int cont2=0;
      for (int x = 0; x < size-1; x++){
          if (pixels[x].L < median){
            pixeles_lado1[cont1] = pixels[x];
            cont1++;
          }
          else {
            pixeles_lado2[cont2] = pixels[x];
            cont2++;
          }
      }

整个第一部分是一段代码,它遍历图像中的每个像素,并在将每个像素的颜色添加到列表时看到哪个颜色具有最大范围。然后我使用这些列表按颜色强度对像素进行排序。然后,我计算介质并将每个像素放在两个列表中的一个中,如果它的颜色高于中位数以下的原点。

1 个答案:

答案 0 :(得分:1)

如果要将Color_lab结构数组传递给函数function(),则需要更改pixels_1[]数组的声明。现在你已经将它声明为指向Color_lab结构的指针数组。如果您将此行更改为:

Color_lab pixels_1[size];

然后将作业更改为:

pixels_1[cont1] = pixels[x];

你的类型错误会消失。

我认为这里还有其他问题。首先,我没有看到递归收敛于基本情况,因此它看起来永远不会结束。另一方面,变量cont1从0开始递增(finish - start)次,因此你有:{/ p>

pixels_1[0] = pixels[start];
...
pixels_1[finish - start - 1] = pixels[finish - 1];

已离开声明的数组的末尾:

size = floor(finish - start) / 2 + 1;
Color_lab pixels_1[size];

我想你所看到的段错是因为这个。

我不确定这个函数的用途是什么(你可能会尝试给它一个更具描述性的名称),但它似乎正在构建一个Color_lab结构数组。如果你想使用这个新数组,你可能必须找到一种方法将它从函数中传回。所以你可能需要malloc()在函数中有一些空间,或者传入一个静态声明的数组来接收新元素。