首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C 2D数组旋转

C 2D数组旋转
EN

Stack Overflow用户
提问于 2012-04-02 08:04:30
回答 3查看 700关注 0票数 0

我有一个代表网格的2D指针设置,网格由包含1/0或空列的列组成(即在任何单元格中都不包含1)。此函数按顺时针方向旋转网格90度,工作方式如下:

我认为我的malloc可能是错误的,因为它工作正常,但我在dmalloc中得到了许多超越纠察栏的错误。

我是否分配了错误的内存量?

此外,我想交换*width和*height的值来表示网格的新宽度和高度,但当我尝试这样做时,程序只是在第二次旋转时出现分段错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-02 08:39:45

所以*width是orig的第一维的维度,所以它应该是newg的第二维的大小。

同样,*height应该是newg的第一个大小,因此两组malloc大小被颠倒过来了。

我认为将值命名为orig_max_x和orig_max_y会更清楚,然后应该清楚函数是否以错误的方式使用了这些值。

代码语言:javascript
运行
复制
    newg = malloc (*height * sizeof(char *));

    // Initialise each column
    for (x = 0; x < *height; x++) {
        newg[x] = malloc (*width);
        for (y = 0; y < *width; y++)
            newg[x][y] = 0;
    }

此外,如果您想从spin()返回值,则不应释放newg存储空间中的任何

编辑:我仍然有一些令人讨厌的*宽和*高混合。抱歉的。我强烈建议这些名称应该与他们谈论的东西相关,orig_width,orig_height可以帮助我阅读代码。

我可能会这样做:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>

char** alloc_rectangle(int *width, int *height);
void free_rectangle(char **orig, int *width);
char** spin (char **orig, int *width, int *height);

int main (int argc, const char * argv[]) {
    int width = 20;
    int height = 30;

    char** orig = alloc_rectangle(&width, &height);
    char** newg = spin(orig, &width, &height);


    return 0;
}

char** alloc_rectangle(int *width, int *height) 
{
    char **newg = calloc (*width, sizeof(char *));

    // Initialise each column
    for (int x = 0; x < *width; x++) {
        newg[x] = calloc (*height, sizeof(char));
    }
    return newg;
}

void free_rectangle(char **orig, int *width)
{
    // free memory for old grid
    for (int x = 0; x < *width; x++) {
        if (orig[x] != NULL) {
            free (orig[x]);
        }
    }

    free (orig);
}

char** spin (char **orig, int *width, int *height) 
{
    int x;
    int y;

    char **newg = alloc_rectangle(height, width);

    // Rotate
    for (x = 0; x < *width; x++) {
        for (y = 0; y < *height; y++)
            if (orig[x] != NULL) 
                newg[*height - 1 - y][x] = orig[x][y];
    }

    return newg;
}

警告未经测试的代码-一些有趣的东西:-)

我不认为解救orig是spin的工作。我更喜欢它只是腾出空间来容纳旋转的结果。因此,为了使事情更整洁,我将一个矩形释放到它自己的函数中。类似地,我总是希望矩形的分配是一致的,所以这将是它自己的函数。

票数 1
EN

Stack Overflow用户

发布于 2012-04-02 08:18:09

再看一下旋转网格的代码。我认为你永远不会想把xy坐标混在一起,所以像*width - 1 - y这样的索引看起来很可疑。例如,假设*width = 3*height = 5。然后,y的范围从0到4,最后可以得到newg[3 - 1 - 4] = newg[-2]

此外,如果您以与分配newg相同的方式分配orig,则需要像这样释放它:

代码语言:javascript
运行
复制
for (x=0; x < *width; x++) {
  free (orig[x]);  // Free the individual columns
}
free (orig); // Free the array of pointers.
票数 1
EN

Stack Overflow用户

发布于 2012-04-02 09:04:16

我只是快速地写下了这篇文章,我在上面运行了几个测试,它似乎工作得很好。

代码语言:javascript
运行
复制
char **rotate(char **original, int *width, int *height)
{
    int t_width = *height;
    int t_height = *width;

    char **newgrid = (char**)calloc(t_height, sizeof(char*));

    for(int y = 0; y < t_height; y++)
    {
        newgrid[y] = (char*)calloc(t_width, sizeof(char));
        for(int x = 0; x < t_width; x++)
            newgrid[y][x] = original[x][y];         
    }

    for(int y = 0; y < *height; y++)
        free(original[y]);
    free(original);

    *width = t_width;
    *height = t_height;

    return newgrid;
}

如果有什么问题,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9969472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档