繁体   English   中英

从int到unsigned int的无效转换

[英]Invalid conversion of int to unsigned int

此代码用于分配。 但是,计算pi carte函数存在错误。 从int转换为unsigned int的错误统计信息无效。 林不知道这是否是有意的,但我无法纠正此问题。 如果您想知道的话,此函数是线程示例的一部分。 任何建议是最赞赏的

void *compute_pi( void *s )   
{
int seed;
int ii;
int *hit_pointer;
int local_hits;
double rand_no_x;
double rand_no_y;

hit_pointer = (int *) s;
seed = *hit_pointer;
local_hits = 0;

for( ii=0; ii < sample_points_per_thread; ii++ )
{
  rand_no_x = (double) (rand_r( &seed ))/(double)RAND_MAX;//*error is these lines
  rand_no_y = (double) (rand_r( &seed ))/(double)RAND_MAX;//*error is these lines
  if(((rand_no_x - 0.5) * (rand_no_x - 0.5) +
  (rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25)//*error 
local_hits++;
  seed *= ii;
 }

*hit_pointer = local_hits;
 pthread_exit(0); 
 }

我做了一些调试,现在看看错误可能在哪里。 现在请发布主要函数,其中将调用compute pi。 我相信这是将参数解析为样本点和线程数的地方。 当我运行该程序后,它要求输入,但由于分段错误而失败。 有什么建议么?

  #include <pthread.h>
  #include <stdlib.h>
  #include <stdio.h>

  #define MAX_THREADS 512

  void *compute_pi( void * );


  int sample_points;
  int total_hits;
  int total_misses;
  int hits[ MAX_THREADS ];
  int sample_points_per_thread;
  int num_threads;



  int main( int argc, char *argv[] )
  {
  /* local variables */
  int ii;
  int retval;
  pthread_t p_threads[MAX_THREADS];
  pthread_attr_t attr;
  double computed_pi;

  /* initialize local variables */
  retval = 0;


  pthread_attr_init( &attr );
  pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

  printf( "Enter number of sample points: " );
  scanf( "%d", &sample_points );
  printf( "Enter number of threads: " );
  scanf( "%d%", &num_threads );

  /* parse command line arguments into sample points and number of threads */
  /* there is no error checking here!!!!! */
  sample_points = atoi(argv[1]);
  num_threads = atoi(argv[2]);


  total_hits = 0;
  sample_points_per_thread = sample_points / num_threads;

  for( ii=0; ii<num_threads; ii++ )
  {
  hits[ii] = ii;
  pthread_create( &p_threads[ ii ], &attr, compute_pi, (void *) &hits[ii] );
  }

  for( ii=0; ii<num_threads; ii++ )
  {
   pthread_join( p_threads[ ii ], NULL );
   total_hits += hits[ ii ];
    }

   computed_pi = 4.0 * (double) total_hits / ((double) (sample_points));


   printf( "Computed PI = %lf\n", computed_pi );


   /* return to calling environment */
   return( retval );
   }

rand_r(3)手册页中

int
rand_r(unsigned *ctx);

如您所见,它需要一个unsigned指针-如果将其传递给int并且在编译器中打开了适当的警告/错误(而且看来确实如此),那么您将得到该错误。 更改seed类型,您将被设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM