matlab凑数求和,凑数求和算法 C语言问题 C语言求和算法

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看一道C语言问题吧!

C语言问题

1、问题描述

将数组A均匀划分成m个片段,每个数组片段最多有(n+m-1)/m 个元素。每个数组片段分别由一个线程负责局部求和,最后这些部分和加起来就得到数组中所有元素的总和。

2、相关代码

此代码在gcc4.3下编译通过

#include

#include

#include

#define NUM_THREADS 4

int N;

int *X;

int gSum[NUM_THREADS];

void* Summation(void *pArg){

int tNum= *((int *)pArg);

int lSum=0;

int start,end;

int i;

start = (N/NUM_THREADS)*tNum;

printf(“start is:%dn”,start);

end = (N/NUM_THREADS)*(tNum+1);

printf(“end is:%dn”,end);

if(tNum == NUM_THREADS -1)

end =N;

for(i=start;i

lSum+=X[i];

gSum[tNum]=lSum;

free(pArg);

}

void initArr(){

int i;

puts(“input array length::”);

scanf(“%d”,&N);

X=(int*)malloc(N*sizeof(int));//

for(i=0;i

{

X[i]=i+1;

printf(“%dt”,X[i]);

}

}

int main(void){

int j,sum=0;

matlab凑数求和,凑数求和算法 C语言问题 C语言求和算法_第1张图片

pthread_t tHandles[NUM_THREADS];

initArr();

for(j=0;j

int *threadNum =malloc(4);

*threadNum=j;

// printf(“threadNum is:%dn”,*threadNum);

pthread_create(&tHandles[j],NULL,Summation,(void*)threadNum);

}

for(j=0;j

pthread_join(tHandles[j],NULL);

sum+= gSum[j];

}

printf(“the sum of array elements is %dn”,sum);

return 0;

}

3、技术难点

1)动态数组初始化

C语言中不允许动态数组类型。例如: int n;scanf(“%d”,&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明,这是错误的。

这里使用malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型

void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

2)void类型转换

malloc返回类型是 void* 类型

这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void,即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。可以用强转的方法将其转换为别的类型。例如:

int *pd=NULL;

pi=(int *)malloc(N*sizeof(int));

向系统申请10个连续的int类型的存储空间,用指针pi指向这个连续的空间的首地址。

并且用(int*)对malloc的返回类型进行转换,以便把int类型数据的地址赋值给指针pi

3)主线程等待子线程结束

对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。这里用的方法是pthread_join

pthread_join方法的功能就是等待线程结束

syntax: int pthread_join(pthread_t thread, void **retval);

第一个参数,线程id,就是要等待的线程ID

第二个参数用来接受线程函数的返回值,如果没有返回值,就直接设为NULL。

以上是C语言问题的算法,有需要的话可以参考一下哦!

你可能感兴趣的:(matlab凑数求和)