- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 gcc 我收到以下错误,我不确定是否解决未声明的错误。
V_TRAP.c:在函数“my_func”中:
V_TRAP.c:168:22:错误:“a”未声明(在此函数中首次使用)部分总和 = (f(a) + f(b))/2.0;
V_TRAP.c:168:22:注意:每个未声明的标识符对于它出现的每个函数仅报告一次
V_TRAP.c:168:29:错误:‘b’未声明(在此函数中首次使用)部分总和 = (f(a) + f(b))/2.0; ^V_TRAP.c:172:37:错误:‘h’未声明(在此函数中首次使用)partial_sum += f((a)+i*(h));
/*
* This version does not make use of any atomics.
*Input: a, b, n, num_threads
* Output: Estimate of integral from a to b of f(x)
* using n trapezoids, with num_threads.
* Compile: gcc -o trap V_TRAP.c -O3 -std=c99 -Wall -lpthread -lm
* Usage: ./V_TRAP
* */
#define _REENTRANT
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <math.h>
#include <pthread.h>//
#ifdef _WIN32
# define NOMINMAX
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <time.h>
/* Data structure defining what to pass to each worker thread. */
typedef struct thread_data_s {
int tid; /* The thread ID. */
float a; /* Pointer to a. */
float b; /* Pointer to b. */
int num_trapezoids; /* Number of trapezoids in the
float h; /* Pointer to base lenght of trapezoid */
int num_threads; /* Number of threads in the pool. */
int offset; /* Starting offset for each thread
int chunk_size; /* Chunk size. */
double *partial_sum; /* Starting address of the partial_sum array. */
} thread_data_t;
/* Function prototypes. */
double compute_using_pthreads (float , float , int, float , int);
void *my_func (void *);
void print_args (thread_data_t *);
int
main (int argc, char **argv)
{
if (argc < 5) {
printf ("Usage: trap lower-limit upper-limit num-trapezoids
num- threads\n");
printf ("lower-limit: The lower limit for the integral\n");
printf ("upper-limit: The upper limit for the integral\n");
printf ("num-trapezoids: Number of trapeziods used to
approximate the area under the curve\n");
printf ("num-threads: Number of threads to use in the
calculation\n");
exit (EXIT_FAILURE);
}
float a = atof(argv[1]); /* Lower limit */
float b = atof(argv[2]); /* Upper limit */
float num_trapezoids = atof(argv[3]); /* Number of trapezoids */
float h = (b - a)/num_trapezoids; /* Base of each trapezoid */
printf ("The base of the trapezoid is %f \n", h);
/* Compute the using the multi-threaded solution. */
int num_threads = atoi(argv[5]); /* Number of threads */
struct timeval start, stop;
gettimeofday (&start, NULL);
double mt_result = compute_using_pthreads (a, b,
num_trapezoids, h, num_threads);
gettimeofday (&stop, NULL);
printf ("Pthread solution = %f. \n", mt_result);
printf ("Execution time = %fs. \n", (float)(stop.tv_sec -
start.tv_sec +\
(stop.tv_usec - start.tv_usec)/(float)1000000));
printf ("\n");
/* Free memory here. */
//free ((void *) a);
//free ((void *) b);
pthread_exit (NULL);
}//------------------------------------- END OF MAIN
* Function: f
* Purpose: Defines the integrand
* Input args: x
* Output: sqrt((1 + x^2)/(1 + x^4))
*/
float
f (float x)
{
return sqrt ((1 + x*x)/(1 + x*x*x*x));
}
/* This function computes using pthreads. */
double
compute_using_pthreads (float a, float b, int num_trapezoids, float h,
int num_threads)
{
pthread_t *thread_id = (pthread_t *) malloc (num_threads * sizeof
(pthread_t)); /* Data structure to store the thread IDs. */
pthread_attr_t attributes; /* Thread attributes. */
pthread_attr_init (&attributes); /* Initialize the thread attributes
to
the default values. */
/* Allocate memory on the heap for the required data structures and
create the worker threads. */
int i;
double *partial_sum = (double *) malloc (sizeof (double) *
num_threads); /* Allocate memory to store partial sums returned by the
threads. */
thread_data_t *thread_data = (thread_data_t *) malloc (sizeof
(thread_data_t) * num_threads);
int chunk_size = (int) floor ((float) num_trapezoids/(float)
num_threads); /* Compute the chunk size. */
for (i = 0; i < num_threads; i++) {
thread_data[i].tid = i;
thread_data[i].a = a;
thread_data[i].b = b;
thread_data[i].num_trapezoids = num_trapezoids;
thread_data[i].h = h;
thread_data[i].num_threads = num_threads;
thread_data[i].offset = i * chunk_size;
thread_data[i].chunk_size = chunk_size;
thread_data[i].partial_sum = partial_sum;
}
for (i = 0; i < num_threads; i++)
pthread_create (&thread_id[i], &attributes, my_func, (void *)
&thread_data[i]);
/* Wait for the workers to finish. */
for (i = 0; i < num_threads; i++)
pthread_join (thread_id[i], NULL);
/* Accumulate partial sums. */
double sum = 0.0;
for (i = 0; i < num_threads; i++)
sum += partial_sum[i];
sum = sum*h;
/* Free dynamically allocated data structures. */
free ((void *) partial_sum);
free ((void *) thread_data);
return sum;
}
/* This function is executed by each thread to compute the overall
result. */
void *
my_func (void *args)
{
// /* Typecast the argument to a pointer to the thread_data_t
structure. */
thread_data_t *thread_data = (thread_data_t *) args;
/* Compute the partial sum that this thread is responsible for. */
double partial_sum = 0.0;
partial_sum = (f(a) + f(b))/2.0;
if (thread_data->tid < (thread_data->num_threads - 1)) {
for (int i = thread_data->offset; i < (thread_data->offset +
thread_data->chunk_size); i++)
partial_sum += f((a)+i*(h));
}
else { /* This takes care of the number of trapezoids that the
final thread must process. */
for (int i = thread_data->offset; i < thread_data->num_trapezoids;
i++)
partial_sum += f((a)+i*(h));
}
/* Store partial sum into the partial_sum array. */
thread_data->partial_sum[thread_data->tid] = partial_sum;
pthread_exit (NULL);
}
/* Helper function. */
void
print_args (thread_data_t *thread_data)
{
printf ("Thread ID: %d\n", thread_data->tid);
printf ("Numer of threads: %d\n", thread_data->num_threads);
printf ("Num trapezoids: %d\n", thread_data->num_trapezoids);
printf ("Address of vector A on heap: %p\n", &(thread_data->a));
printf ("Address of vector B on heap: %p\n", &(thread_data->b));
printf ("Offset within the vectors for thread: %d\n",
thread_data->offset);
printf ("Chunk size to operate on: %d\n", thread_data->chunk_size);
printf ("\n");
}
最佳答案
函数 my_func
中不存在变量 a
、b
和 h
,即为什么您会收到有关未声明标识符的错误。
但是,这些名称是通过 void *
传递给该函数的 thread_data_t
的成员。您可能需要 thread_data->a
、thread_data->b
和 thread_data->h
。
关于c - 如何解决 "undeclared"参数的错误,和/或可能合并指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55803153/
我有几个长度不等的 vector ,我想对其进行cbind。我将 vector 放入列表中,并尝试结合使用do.call(cbind, ...): nm <- list(1:8, 3:8, 1:5)
合并(合并)两个 JSONObjects 的最佳方式是什么? JSONObject o1 = { "one": "1", "two": "2", "three": "3" }
我在一个表中有许多空间实体,其中有一个名为 Boundaries 的 geometry 字段。我想生成一个具有简化形状/几何图形的 GeoJson 文件。 这是我的第一次尝试: var entitie
谁能说出为什么这个选择返回 3.0 而不是 3.5: SELECT coalesce(1.0*(7/2),0) as foo 这个返回 3: SELECT coalesce(7/2,0) as foo
首先抱歉,也许这个问题已经提出,但我找不到任何可以帮助我的东西,可能是因为我对 XSLT 缺乏了解。 我有以下 XML: 0 OK
有时用户会使用 Windows 资源管理器复制文件并在他们应该执行 svn 存储库级别的复制或合并时提交它们。因此,SVN 没有正确跟踪这些变化。一旦我发现这一点,损坏显然已经完成,并且可能已经对相关
我想组合/堆叠 2 个不同列的值并获得唯一值。 如果范围相邻,则可以正常工作。例如: =UNIQUE(FILTERXML(""&SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPO
使用iTextSharp,如何将多个PDF合并为一个PDF,而又不丢失每个PDF中的“表单字段”及其属性? (我希望有一个使用来自数据库的流的示例,但文件系统也可以) 我发现this code可以正常
是否有一个合并函数可以优先考虑公共(public)变量中的非缺失值? 考虑以下示例。 首先,我们生成两个 data.frames,它们具有相同的 ID,但在特定变量上有互补的缺失值: set.seed
我们正在尝试实现 ALM Rangers 在最新的 Visual Studio TFS Branching and Merging Guide 中描述的“基本双分支计划”。 .从指导: The bas
我在不同目录(3个不同名称)中有很多(3个只是一个例子)文本文件,如下所示: 目录:A,文件名:run.txt 格式:txt制表符分隔 ; file one 10 0.2 0.5 0.
我有一张包含学生等级关系的表: Student Grade StartDate EndDate 1 1 09/01/2009 NULL 2
我在学习 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associatio
我觉得我有世界上最简单的 SVN 用例: 我有一个文件,Test.java在 trunk SVN的。 我分行trunk至 dev-branch . 我搬家Test.java进入 com/mycompa
我有两个数据框,其中一些列名称相同,而另一些列名称不同。数据框看起来像这样: df1 ID hello world hockey soccer 1 1 NA NA
Elasticsearch 中是否缺少以扁平化形式(多个子/子aggs)返回结果的方法? 例如,当前我正在尝试获取所有产品类型及其状态(在线/离线)。 这就是我最终得到的: aggs [ { key:
如何合并如下所示的 map : Map1 = Map(1 -> Class1(1), 2 -> Class1(2)) Map2 = Map(2 -> Class2(1), 3 -> Class2(2)
我试图通过从netezza服务器导入数据来合并两个数据集。 以下是数据集,其数字为,ID为,字母为,名称为: 下表都是使用命令从netezza导入的: sqoop import --connect n
我有两个数组 $array1 = array('first', 'second', 'third', 'fourth'); $array2 = array('first', 'third', 'fou
我正在 SQL Server 中运行合并。在我的更新中,我只想在值发生更改时更新该行。有一个版本行在每次更新时都会递增。下面是一个例子: MERGE Employee as tgt USING (SE
我是一名优秀的程序员,十分优秀!