[问题] 二维阵列 指标传递

楼主: DirKai (Dirk_AI(MIX))   2016-11-09 09:30:05
开发平台(Platform): (Ex: Win10, Linux, ...)
win 7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
code blocks
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
两种情况,第一种正常,第二种有问题,不懂为什么。
1.
void test(unsigned char img[640][480])
{
unsigned char *img_r; //用一维指标接二维阵列(不懂目的,有什么好处吗?)
imgr = &img[0][0];
执行运算..
}
main()
{
unsigned char img[640][480];
...
test(img);
}
2. 其实这是我改的,compile出错,有时却会顺利执行到结束
void test(unsigned char **img)
{
unsigned char *img_r; //用一维指标接二维阵列(不懂目的,有什么好处吗?)
img_r = img;
执行运算..
}
main()
{
unsigned char **img;
unsigned long i;
img=(unsigned char**)malloc(512*sizeof(unsigned char*));
for(i=0; i<512; i++)
img[i]=(unsigned char*)malloc(640*sizeof(unsigned char));
test(img);
}
喂入的资料(Input):
image raw data
预期的正确结果(Expected Output):
我是不知道为何原本的程式要把二维位址传到一维,
但不论目的,我觉得我改这样跟原本没什么差吧?
除了在内存内 可能排列不太一样之外(?
错误结果(Wrong Output):
有时程式执行到一半直接当掉,检查是在test副程式内运算一维阵列时出错
程式码(Code):(请善用置底文网页, 记得排版)
补充说明(Supplement):
1.我不知道为何要丢给一维去处理,这样有什么好处吗? 比较快?
(那干脆读图就用一维接阿@@?)
2.我这两种写法有什么具体的差别吗? 我是不是想错什么了?
作者: theTai (theTai)   2016-11-09 09:36:00
感觉好像是置底十三戒中的第十二条
作者: steve1012 (steve)   2016-11-09 09:39:00
你用一个pointer 接double pointer 不觉得怪吗都不用derefernce?
作者: pttworld (批踢踢世界)   2016-11-09 09:49:00
2之test不就直接拿二维的img运算了。实务上怕动到可以新写函数内容小改,要注解舍弃也容易。业界的话因为有版控,改错了抓history回来覆蓋程式段。
作者: aiwhat   2016-11-09 12:17:00
1里面资料都是连续,2里面不一定连续吧?后面的运算如果是把它当成640*480大小的array感觉会炸掉for i = [0, 640*480) do img_r[i] = xxx; end-for 这种
作者: steve1012 (steve)   2016-11-09 13:53:00
一的type 是对的2 根本连compile都不会过 你怎么让他跑的?2 你用一个pointer接double start pointer 光type就错怎么会对?我上面的推文本来就是讲2 1本来就没有错写code有时候为了干净 的确可能会把一个2d array的每一个row 都特别用一个pointer去指 看起来比较干净不过你给的code片段太少 很难知道为啥他要这样但1本来就没错就是了不是 img[0][0] 是第一个element &img[0][0]是它的位置 跟 *img 指导的地方基本上一样
作者: aiwhat   2016-11-09 14:28:00
2的后续运算有img_r[i * width + j]这种东西吗?照main里面的配置方式应该超过640就会越界了吧而且 main 里面的 for 应该是 i = [0, 512)不是[0, 640)但是你main里面那样配置 img2 = img1 + width可能会越界&img[0] + width == &img[1] 结果应该会是 falseimg[i]里面只保证img[i][0~639]是连续img[i][639]→img[i+1][0]不一定连续我是指2的写法14:51那个写错 (&img[0][0] + width == &img[1][0])

Links booklink

Contact Us: admin [ a t ] ucptt.com