各位高手,本人又来问问题了,哎希望你们能帮本人解答一下下 谢谢!
LS是本人编译的平滑函数,对矩阵的一列元素进行平滑处理,输出的矩阵第一行、最后一行是原始函数第一行和第二行的平均、最后一行和倒数第二行的平均。其余中间的是相邻三行的平均。
//LS1.c
#include<stdio.h>
void LS(int (**Prebdata),int (**bDataLS),float a,float b,int b_lines,int b_points)
{
float c=1-a-b;
int i,j;
for (j=0;j<b_lines;j++)
{
*((int*)bDataLS+j)=0.5*(*((int*)Prebdata+j))+0.5*(*((int*)Prebdata+j+b_lines));
*((int*)bDataLS+j+(b_points-1)*b_lines)=0.5*(*((int*)Prebdata+(b_points-2)*b_lines+j))+0.5*(*((int*)Prebdata+(b_points-1)*b_lines+j));
}
for (i=1;i<b_points-1;i++)
for(j=0;j<b_lines;j++)
{
*((int*)bDataLS+j+i*b_lines)=a*(*((int*)Prebdata+j+(i-1)*b_lines))+b*(*((int*)Prebdata+j+i*b_lines))+c*(*((int*)Prebdata+j+(i+1)*b_lines));
}
}
int main()
{
// int b_lines=5;
// int b_points=5;
float a=0.25;
float b=0.5;
int i;
int Prebdata[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int bDataLS[5][5];
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
for(i=0;i<5;i++)
{
printf(“%d\n”,bDataLS[i][0]);
}
}
上述函数运行结果正确:
3
6
11
16
18
然后本人将LS函数弄成静态库。
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi LS1.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -c LS1.c -o ls.o
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ ar cqs libls.a ls.o
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi main.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -o main main.c -L ./ -lls
main.c: In function ‘main’:
main.c:11:4: warning: implicit declaration of function ‘LS’ [-Wimplicit-function-declaration]
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi main.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -o main main.c -L ./ -lls
main.c: In function ‘main’:
main.c:11:4: warning: implicit declaration of function ‘LS’ [-Wimplicit-function-declaration]
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
^
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ ./test
3
11
16
21
18
结果和之前的不一样了 这个结果是错误的,不知道为什么。希望有明白的高手帮本人解答一下 万分感谢!
LS是本人编译的平滑函数,对矩阵的一列元素进行平滑处理,输出的矩阵第一行、最后一行是原始函数第一行和第二行的平均、最后一行和倒数第二行的平均。其余中间的是相邻三行的平均。
//LS1.c
#include<stdio.h>
void LS(int (**Prebdata),int (**bDataLS),float a,float b,int b_lines,int b_points)
{
float c=1-a-b;
int i,j;
for (j=0;j<b_lines;j++)
{
*((int*)bDataLS+j)=0.5*(*((int*)Prebdata+j))+0.5*(*((int*)Prebdata+j+b_lines));
*((int*)bDataLS+j+(b_points-1)*b_lines)=0.5*(*((int*)Prebdata+(b_points-2)*b_lines+j))+0.5*(*((int*)Prebdata+(b_points-1)*b_lines+j));
}
for (i=1;i<b_points-1;i++)
for(j=0;j<b_lines;j++)
{
*((int*)bDataLS+j+i*b_lines)=a*(*((int*)Prebdata+j+(i-1)*b_lines))+b*(*((int*)Prebdata+j+i*b_lines))+c*(*((int*)Prebdata+j+(i+1)*b_lines));
}
}
int main()
{
// int b_lines=5;
// int b_points=5;
float a=0.25;
float b=0.5;
int i;
int Prebdata[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int bDataLS[5][5];
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
for(i=0;i<5;i++)
{
printf(“%d\n”,bDataLS[i][0]);
}
}
上述函数运行结果正确:
3
6
11
16
18
然后本人将LS函数弄成静态库。
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi LS1.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -c LS1.c -o ls.o
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ ar cqs libls.a ls.o
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi main.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -o main main.c -L ./ -lls
main.c: In function ‘main’:
main.c:11:4: warning: implicit declaration of function ‘LS’ [-Wimplicit-function-declaration]
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ vi main.c
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ gcc -o main main.c -L ./ -lls
main.c: In function ‘main’:
main.c:11:4: warning: implicit declaration of function ‘LS’ [-Wimplicit-function-declaration]
LS((int**)Prebdata,(int**)bDataLS,a,b,5,5);
^
yujiaxin@yujiaxin-HP-Pavilion-14-Notebook-PC:~$ ./test
3
11
16
21
18
结果和之前的不一样了 这个结果是错误的,不知道为什么。希望有明白的高手帮本人解答一下 万分感谢!
解决方案
5
LS的逻辑可以再详细一些,不然不容易理解,第一行和第二行,怎么还跟原函数扯上关系了呢
30
你的函数没有声明。
默认的声明和你的函数定义不一致。
5
括号太多,参数传递也有问题,有越界的嫌疑;