Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 翻转多维数组的一部分_C_Arrays_Multidimensional Array - Fatal编程技术网

C 翻转多维数组的一部分

C 翻转多维数组的一部分,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我使用此函数的目的是使其能够翻转此数组的行。实际上,第0行现在是最后一行,第1行现在是下一行,依此类推。你知道我为什么会出现分割错误吗?或者有没有更好的方法?谢谢,下面是函数的代码: ppmPic *flipVertical(ppmPic *pOriginal) { ppmPic *newPic = malloc(sizeof(ppmPic)); newPic = pOriginal; for(int a=0; a<newPic->rows; a++) {

我使用此函数的目的是使其能够翻转此数组的行。实际上,第0行现在是最后一行,第1行现在是下一行,依此类推。你知道我为什么会出现分割错误吗?或者有没有更好的方法?谢谢,下面是函数的代码:

ppmPic *flipVertical(ppmPic *pOriginal) {
    ppmPic *newPic = malloc(sizeof(ppmPic));
    newPic = pOriginal;
    for(int a=0; a<newPic->rows; a++) {
            for(int b=0; b<newPic->cols; b++) {
                    newPic->pixels[a][b].red = newPic->pixels[newPic->rows - a][b].red;
                    newPic->pixels[a][b].green = newPic->pixels[newPic->rows - a][b].green;
                    newPic->pixels[a][b].blue = newPic->pixels[newPic->rows - a][b].blue;
            }
    }

    return newPic;
}
ppmPic*flipVertical(ppmPic*pOriginal){
ppmPic*newPic=malloc(sizeof(ppmPic));
newPic=原始的;
for(int a=0;arows;a++){
for(int b=0;bcols;b++){
新建图片->像素[a][b]。红色=新建图片->像素[newPic->行-a][b]。红色;
新建图片->像素[a][b]。绿色=新建图片->像素[newPic->行-a][b]。绿色;
新建图片->像素[a][b]。蓝色=新建图片->像素[newPic->行-a][b]。蓝色;
}
}
返回newPic;
}

代码的一个明显问题是复制行:

newPic->pixels[a][b].red = newPic->pixels[newPic->rows - a][b].red;
认识到行的值范围为[0..rows-1]。您的第一个赋值将引用
像素[行]
,这是一个off by 1错误。您正在数组中引用无效的索引

您可能打算从源图像复制。所以你真的想说的很可能是:

newPic->pixels[a][b].red = pOriginal->pixels[pOriginal->rows - a][b].red;
我不是100%确定,但我相信您对ppmPic的定义引用了相同的东西

在这种情况下,ppmPic定义如下:

typedef struct ppm {
    int rows;
    int cols;
    int colors;
    Pixel **pixels;
} ppmPic;

typedef struct pixel {
    int red;
    int green;
    int blue;
} Pixel;
如果我的假设是ppmPic的
像素
成员在一个行数组中(每行都是一个列单元格分配),那么下面将翻转您的图像。我们将使用
memcpy
来完成复制整行的繁重工作

ppmPic* flipVertical(ppmPic *pOriginal)
{
    ppmPic* newPic = malloc(sizeof(ppmPic));
    int rows = pOriginal->rows;
    int cols = pOriginal->cols;

    // allocate an array of "rows"
    Pixel** pixels = (Pixel**)malloc(rows * sizeof(Pixel*));

    // now allocate each row, and copy from the original into it    
    for (int r = 0; r < rows; r++)
    {
        pixels[r] = (Pixel*)malloc(cols * sizeof(Pixel));
        mempcy(pixels[r], pOriginal->pixels[rows-r-1], cols * sizeof(Pixel));
    }

    newPic.rows = rows;
    newPic.cols = cols;
    newPic.pixels = pixels;
    newPic.colors = pOriginal->colors; // honestly, I'm not sure if colors is revelant here.. and if it is, that may mean that our allocation for each row needs to change
    return newPic;
}
ppmPic*flipVertical(ppmPic*pOriginal)
{
ppmPic*newPic=malloc(sizeof(ppmPic));
int rows=pOriginal->rows;
int cols=pOriginal->cols;
//分配一个“行”数组
像素**像素=(像素**)malloc(行*sizeof(像素*);
//现在分配每一行,并将原始行复制到其中
对于(int r=0;r像素[rows-r-1],cols*sizeof(像素));
}
newPic.rows=行;
newPic.cols=cols;
newPic.pixels=像素;
newPic.colors=pOriginal->colors;//老实说,我不确定这里的颜色是否相关……如果相关,这可能意味着我们对每一行的分配需要更改
返回newPic;
}

Post-an。对于另外两种情况,请尝试
newPic->rows-a-1
相同。你的代码没有任何意义
newPic=pOriginal???1
ppmPic*newPic=malloc(sizeof(ppmPic))2<代码>新图片=原始图片
在为新图片存储
malloc
ed内存后,立即覆盖resp。指针
newPic
。因此,现在出现内存泄漏,并开始覆盖由
pOriginal
ppmPic*newPic=malloc(sizeof(ppmPic))提供的内存直接后跟
newPic=pOriginal是内存泄漏。并且不会执行您可能认为它会执行的操作(复制
pOriginal
)。显示
ppmPic
的声明。通常,如果我们复制并粘贴它,您应该显示编译的代码。您丢失了太多声明,因此很难看到您试图做什么。出于某种原因,我得到了一个memcpy的隐式声明,尽管我有#include Nevermind,我拼写错了,现在它工作了!非常感谢。