这是我的代码。 findMin()函数中的语句int value = atoi(ptr [index])给出了一个错误,如屏幕截图所示。
奇怪的是,当我在main中使用相同的atoi()函数时,一切都很好但是它在findMin中尖叫!
CODE:
void* findMin(void *param);
int main(int argc, char *argv[])
{
pthread_t t2; //for min
num=argc;
/*int index=1; THIS WORKS
int value=atoi(argv[index]);*/
//creating worker thread
pthread_create(&t1,NULL,findMin,argv);
pthread_join(t2,NULL); //wait for min
printf("The minimum value is %d\n",min);
return 0;
}
void* findMin(void *param)
{
char *ptr=(char *) param; //casting
int index=1;
min=ptr[1];
for(index; index<num; index++)
{
int value=atoi(ptr[index]); //THIS SCREAMS LIKE HELL!
if(comp<min) min=value;
}
}
答案 0 :(得分:3)
查看atoi
的签名:
int atoi(const char *);
该函数要求参数为char *
类型。您正在传递ptr[index]
char
,其类型为char digit[2] = "";
简单的解决方案是使用局部变量:
digit[0] = ptr[index];
int value = atoi(digit);
然后将第一个字符设置为您要处理的值:
digit
因为char[]
属于int value = ptr[index] - '0';
类型,它会在将函数传递给函数时衰减为指针
但那会很混乱。有一种更简单的方法。 C标准要求数字字符是顺序的,因此将数字字符转换为整数值的常见技巧是写下:
'0'
这是有效的,因为在ASCII中,'1'
的数值为48,"1234"
为49,2为50,依此类推。因此,如果您有这样的字符串:
'0'
你迭代每个角色,从每个角色中减去49 - 48 = 1
50 - 48 = 2
51 - 48 = 3
52 - 48 = 4
,你会得到:
argv
基本上做你想要/需要的事情
我刚注意到你实际上正在迭代char *ptr=(char *) param;
。您的演员不正确!
char **ptr = param;
实际应该是:
argv
因为char **
是char **ptr= param; //no need for cast, void * is compatible with char **
int i = 1;
min = atoi(ptr[1]);//assuming min is int, because you're assigning value to it later on
for(i; i<num; ++i)
{
int value = atoi(ptr[i]);
if(value < min)//replaced comp with value, because I can't see the comp variable anywhere
min = value;
}
(指向指针的指针)。
你在这里也做了一些奇怪的事情:
如果您真正想要做的是比较所有传递的参数并从中选择最小的数字,那么这就是您应该写的:
m <- matrix(as.numeric(lung.X), nrow = 86, ncol = 7129)