对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++;
}
}
整个第一部分是一段代码,它遍历图像中的每个像素,并在将每个像素的颜色添加到列表时看到哪个颜色具有最大范围。然后我使用这些列表按颜色强度对像素进行排序。然后,我计算介质并将每个像素放在两个列表中的一个中,如果它的颜色高于中位数以下的原点。
答案 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()
在函数中有一些空间,或者传入一个静态声明的数组来接收新元素。