"If statement" 数组不工作

"If statement" whith array is not working

我编写了一个函数,其中将一维数组 (int8_t tabelle1[768]) 转换为二维数组 (int8_t tabelle[24][32])。

我现在想在二维数组中找到一个“热点”。 “热点”是数组中的一个 2x2 块(可以位于任何位置),其中块的每个值都必须等于或大于 30。

我现在的问题是我的程序没有进入我的 if 语句。 未打印“检查点”。

函数:

bool Hotspotberechnung(int8_t tabelle1[768],int8_t tabelle2[24][32])
{
    int i=0, j=0, x=0, y=0;

    for(j=0; j<24; j++)                             //Transfer from 1D into 2D
    {
        for(i=0; i<32; i++)
        {
            tabelle2[j][i] = tabelle1[(j*32)+i];
        }
    }

    for(y=0; y<24; y++)                            //search for hotspot
    {
        for(x=0; x<32; x++)
        {
            if(tabelle2[y][x]>=30)
            {
                     printf ("1\n");       // checkpoint 
                if(tabelle2[y][x+1]>=30)
                {
                    if(tabelle2[y+1][x]>=30)
                    {
                        if(tabelle2[y+1][x+1]>=30)
                        {
                            for(j=0; j<24; j++)
                            {
                                for(i=0; i<32; i++)
                                {
                                    printf("%d.%d=%d\n",j+1,i+1,tabelle2[j][i]);
                                }
                            }
                            printf ("Hotspot!");    
                            return true;


                        }
                        else
                            return false;
                    }
                    else
                        return false;
                }
                else
                    return false;
            }
            else
                return false;
        }
    }

    return 0;
}

它永远不会打印出来,因为你的许多 return 中的一个结束函数的时间比你想象的要快得多。特别是 thenelse 中包含印刷品的那个。
使用调试器,你会看到。
或者在每个 else 旁边打印一个,确保为此使用 {}。在调用显示的函数后还要打印。

for(y=0; y<24; y++)                            //search for hotspot
    {
        for(x=0; x<32; x++)
        {
            if(tabelle2[y][x]>=30)
            {
                /* this is not reached for y=0 and x=0, i.e. first */
                printf ("1\n");       // checkpoint 
                /* much code deleted */
            }
            else
                return false;
                /* this is reached first,
                   end of the function,
                   end of the loop,
                   no printing ever */
        }
    }

一些事情...

  1. 内核width/height是2,所以我们必须在数组width/height之前停止,否则我们会超出数组的末尾
  2. 一旦找到匹配的元素,我们就必须将该元素用作 2x2 框的左上角锚点

这是重构后的代码(编译,但未测试):

#include <stdio.h>
#include <stdint.h>

#define YMAX    24
#define XMAX    32

#define BOXWID  2
#define MARG    (BOXWID - 1)

int
Hotspotberechnung(int8_t tabelle1[YMAX * XMAX], int8_t tabelle2[YMAX][XMAX])
{
    int i = 0,
        j = 0,
        x = 0,
        y = 0;

    // Transfer from 1D into 2D
    for (j = 0; j < YMAX; j++) {
        for (i = 0; i < XMAX; i++)
            tabelle2[j][i] = tabelle1[(j * XMAX) + i];
    }

    for (y = 0; y < (YMAX - MARG); y++) {
        int8_t *row = tabelle2[y];

        for (x = 0; x < (XMAX - MARG); x++) {
            if (row[x] < 30)
                continue;

            int8_t *box = &row[x];
            int match = 1;

            for (int yoff = 0;  yoff < BOXWID;  ++yoff) {
                for (int xoff = 0;  xoff < BOXWID;  ++xoff) {
                    if (box[(yoff * XMAX) + xoff] < 30) {
                        match = 0;
                        break;
                    }
                }
                if (! match)
                    break;
            }

            if (! match)
                continue;

            for (int yoff = 0;  yoff < BOXWID;  ++yoff) {
                for (int xoff = 0;  xoff < BOXWID;  ++xoff) {
                    int8_t val = box[(yoff * XMAX) + xoff];
                    printf("[%d,%d] = %d\n",y + yoff,x + xoff,val);
                }
            }
        }
    }

    return 0;
}