C 翻转多维数组的一部分
我使用此函数的目的是使其能够翻转此数组的行。实际上,第0行现在是最后一行,第1行现在是下一行,依此类推。你知道我为什么会出现分割错误吗?或者有没有更好的方法?谢谢,下面是函数的代码: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++) {
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代码>???1ppmPic*newPic=malloc(sizeof(ppmPic))代码>2<代码>新图片=原始图片
在为新图片存储malloc
ed内存后,立即覆盖resp。指针newPic
。因此,现在出现内存泄漏,并开始覆盖由pOriginal
ppmPic*newPic=malloc(sizeof(ppmPic))提供的内存代码>直接后跟newPic=pOriginal代码>是内存泄漏。并且不会执行您可能认为它会执行的操作(复制pOriginal
)。显示ppmPic
的声明。通常,如果我们复制并粘贴它,您应该显示编译的代码。您丢失了太多声明,因此很难看到您试图做什么。出于某种原因,我得到了一个memcpy的隐式声明,尽管我有#include Nevermind,我拼写错了,现在它工作了!非常感谢。