通过 std::thread 将参数传递给函数时出现语法错误
Posted
技术标签:
【中文标题】通过 std::thread 将参数传递给函数时出现语法错误【英文标题】:syntax error while passing arguments to function through std::thread 【发布时间】:2013-07-30 08:00:27 【问题描述】:我以以下方式编写代码,当我使用c++ -std=c++0x -lpthread
编译程序时,它给出了编译错误。我检查了很多次,但无法解决。
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <cstdlib>
#include <string>
#include <stdio.h>
#include <thread>
using namespace std;
#define ATOM 200000
#define WATER 10000
#define POLAR 20000
int main()
char text[ATOM][30];
int now=0;
int noh=0, na=0;
int nop=0, lines=0;
char inputfile[30];
char p[30];
string pdbdata;
cout<<"enter input file"<<endl;
cin>>inputfile;
char pdbn[10000][100];
char pdb[100];
float x, y ,z;
FILE *inputf=fopen(inputfile,"r");
char c;
int i;
int c1 = 0;
if(inputf == NULL)
cout<<"cannot open inputfile";
return 0;
while (1)
if( fscanf(inputf, "%s", pdb) == EOF )
fclose(inputf);
break;
else
strcpy(pdbn[lines],pdb);
lines++;
if(lines == 0)
return 0;
na = 0;
now = 0;
nop = 0;
noh = 0;
FILE *pdbf = fopen (pdb, "r");
float a, b;
if (pdbf == NULL)
return 1;
while (1)
if ((c=fgetc(pdbf)) != EOF)
p[0] = c;
for(i=1; i<30; i++)
p[i] = fgetc(pdbf);
p[30] = '\0';
pdbdata = p;
c1++;
fscanf (pdbf, "%f%f%f%f%f\n", &x, &y, &z, &a, &b);
size_t f = pdbdata.find ("ATOM");
if(f!=std::string::npos)
strcpy(text[na],p);
na++;
f=pdbdata.find("WAT");
if((f!=std::string::npos)&&(p[13]=='O'))
now++;
else if((p[13]=='O') || (p[13]=='N'))
nop++;
if((p[12]=='H') || (p[13] == 'H'))
noh=noh+1;
else
fclose(pdbf);
break;
float X[na * lines], Y[na * lines], Z[na * lines];
int pol[lines * nop];
int wat[lines * now];
int fsw[lines * now];
int na1, now1, nop1;
inputf = fopen(inputfile,"r");
int m = 1;
int SnumCPU = sysconf( _SC_NPROCESSORS_ONLN );
thread tr1[SnumCPU];
int nfiles = lines/(SnumCPU - 1);
for (i = 0; i < (SnumCPU - 1); i++)
int in = i * nfiles;
tr1[i] = thread(readfile1, in, nfiles, &pdbn[0], &X[0], &Y[0], &Z[0], &wat[0], &pol[0], now, nop, na, &text[0]);
if ( lines % (SnumCPU - 1) != 0)
tr1[(SnumCPU - 1)] = thread(readfile1, (SnumCPU - 1) * nfiles, (lines % (SnumCPU - 1)), &pdbn[0], &X[0], &Y[0], &Z[0], &wat[0], &pol[0], now, nop, na, &text[0] );
for (i = 0; i < (SnumCPU - 1); i++)
tr1[i].join();
if ( lines % (SnumCPU - 1) != 0)
tr1[SnumCPU - 1].join();
return 0;
和readfile1
函数定义如下
void readfile1 (int istart, int iend, char *pdbn[100], float *X, float *Y, float *Z, int *wat, int *pol, int now, int nop, int na, char *text[30])
float x, y, z, a, b;
for(int i = istart; i< istart + iend; i++)
string pdbdata;
char p[40];
int na1 = 0;
int now1 = 0;
int nop1 = 0;
FILE *pdbf=fopen(pdbn[i],"r");
int pdbid = na * i;
int watid = i * now;
int polid = i * nop;
float a, b;
if(pdbf == NULL)
break;
char c;
while (1)
if((c = fgetc(pdbf))!=EOF)
p[0] = c;
for(i = 1; i < 30; i++)
p[i] = fgetc (pdbf);
p[29] = '\0';
pdbdata = p;
fscanf(pdbf, "%f%f%f%f%f\n", &x, &y, &z, &a, &b);
size_t f;
strcpy (text[na], p);
X[pdbid + na1] = x;
Y[pdbid + na1] = y;
Z[pdbid + na1] = z;
f = pdbdata.find("WAT");
if ((f != std::string::npos) && (p[13] == 'O'))
wat[watid + now1] = na1;
now1++;
else if((p[13] == 'O') || (p[13] == 'N'))
pol[polid + nop1] = na1;
nop1++;
na1++;
else
fclose (pdbf);
break;
给出如下错误
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/functional:70,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/thread:39,
from parallel3.cpp:8:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/tr1_impl/functional: In member function ‘typename std::result_of<_Functor(typename std::result_of<std::_Mu<_Bound_args, std::is_bind_expression::value, (std::is_placeholder::value > 0)>(_Bound_args, std::tuple<_UElements ...>)>::type ...)>::type std::_Bind<_Functor(_Bound_args ...)>::__call(const std::tuple<_UElements ...>&, std::_Index_tuple<_Indexes ...>) [with _Args = , int ..._Indexes = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, _Functor = void (*)(int, int, char**, float*, float*, float*, int*, int*, int, int, int, char**), _Bound_args = int, int, char (*)[100], float*, float*, float*, int*, int*, int, int, int, char (*)[30]]’:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/tr1_impl/functional:1191: instantiated from ‘typename std::result_of<_Functor(typename std::result_of<std::_Mu<_Bound_args, std::is_bind_expression::value, (std::is_placeholder::value > 0)>(_Bound_args, std::tuple<_UElements ...>)>::type ...)>::type std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args& ...) [with _Args = , _Functor = void (*)(int, int, char**, float*, float*, float*, int*, int*, int, int, int, char**), _Bound_args = int, int, char (*)[100], float*, float*, float*, int*, int*, int, int, int, char (*)[30]]’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/thread:114: instantiated from ‘void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind<void (*(int, int, char (*)[100], float*, float*, float*, int*, int*, int, int, int, char (*)[30]))(int, int, char**, float*, float*, float*, int*, int*, int, int, int, char**)>]’
parallel3.cpp:150: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/tr1_impl/functional:1137: error: cannot convert ‘char (*)[100]’ to ‘char**’ in argument passing
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
【问题讨论】:
您应该认真考虑将其简化为重现问题的简短独立示例。我确信这里显示的大部分代码都是无关紧要的。 我们甚至不知道你的编译器产生了什么错误...... 在目前的形式中,问题在这里没有立足之地。投票搁置。 【参考方案1】:您的text
是数组数组,而不是指针数组。因此,更改函数签名以使 char 参数 char (*pdbn)[100]
和 char (*text)[30]
,或等效为 char pdbn[][100]
和 char text[][30]
。
(要明确:text
的每个元素都是 char[30]
,不是 char *
。)
【讨论】:
以上是关于通过 std::thread 将参数传递给函数时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章
无法将类成员函数传递给另一个函数(std::thread::thread)