我一直在摸不着头脑。 我看到很多关于如何在C循环中进行随机生成的主题,但是当涉及两个循环时我没有看到任何内容。
以下是我的代码:
typedef struct
{
char qh_uid[6];
long int qh_vd;
long int qh_pd;
long int qh_id;
double qh_value;
}quote_history;
int records_size = 20;
int batch_size = 5;
char *rand_str(char *dst, int size)
{
static const char text[] = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i, len = size;
for ( i = 0; i < len; ++i )
{
dst[i] = text[rand() % (sizeof text - 1)];
}
dst[i] = '\0';
return dst;
}
char *rand_tstp(char *dst, int size)
{
static const char text[] = "0123456789";
int i, len = size;
for ( i = 0; i < len; ++i )
{
dst[i] = text[rand() % (sizeof text - 1)];
}
dst[i] = '\0';
return dst;
}
double randfrom(double min, double max)
{
double range = (max - min);
double div = RAND_MAX / range;
return min + (rand() / div);
}
quote_history *feed_batch(quote_history *qh_batch, int batchsize)
{
int j;
char mytext[6];
char mylong[17];
for (j = 0; j < batchsize; ++j)
{
quote_history qh_aux;
printf("uid : %s - value : %lf\n",rand_str(mytext, sizeof mytext), randfrom(0,100000));
strcpy(qh_aux.qh_uid, rand_str(mytext, sizeof mytext));
qh_aux.qh_vd = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
qh_aux.qh_pd = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
qh_aux.qh_id = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
qh_aux.qh_value = randfrom(0,100000);
qh_batch[j] = qh_aux;
}
printf("--------------\n");
return qh_batch;
}
int
main(int const argc,
const char ** const argv) {
quote_history *subArray;
srand(time(NULL));
int k;
for (k = 0; k < (int)(records_size/batch_size); ++k) {
subArray= (quote_history*)calloc(batch_size, sizeof(quote_history));
subArray = feed_batch(subArray, batch_size);
// Do something with subArray
free(subArray);
}
}
嗯,基本上,我想做的是生成struct quote_history的批处理(作为数组),其中对某些值进行随机生成,然后处理批处理并移动到另一个。
出于某种原因,随机生成在feed_batch函数中运行良好,但当它移动到循环中的下一个项目时,批处理始终保持不变。
忘记粘贴代码的结果:
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
我尝试了很多组合(例如循环中的循环而不是feed_batch函数)但没有成功。
我希望有人会帮助我。
弗洛里安
答案 0 :(得分:1)
你的main分配一个quote_history字段并在for循环中释放它。
feed_batch接受此指针并将其作为一个数组进行访问 - &gt;您的调试器应报告内存访问错误。
新猜测:
我知道为什么你认为它确实有效(printfs是正确的)但在外面它不起作用。但这是猜测,因为代码丢失了:
我想你将mytext指针保存在你的结构中。所以最后所有的数组元素都指向同一个字符串。更糟糕的是,字符串是一个自动变量,在退出feed_batch后会缩小范围。
顺便说一下:
为什么需要动态分配?
简单地声明一个quote_history的对象并传递它的指针。
或声明一个quote_history对象数组。这里不需要动态分配。
答案 1 :(得分:1)
如果我理解您的代码,那么您缺少的是将随机生成的字符串复制到结构的数组qh_uid
中。实际上你不需要复制,你可以直接在结构的缓冲区中生成随机字符串。
quote_history *feed_batch(quote_history *qh_batch, int batchsize)
{
int j;
for (j = 0; j < batchsize; ++j)
{
rand_str(qh_batch[j].qh_uid, sizeof(qh_batch[j].qh_uid) - 1);
printf("uid : %s - value : %lf\n", qh_batch[j].qh_uid, randfrom(0,100000));
}
printf("--------------\n");
return qh_batch;
}
Sander De Dycker在评论中提到的是真的,你不能写在qh_uid[6]
,你可以写的最大值是qh_uid[5]
,(通过这样做,除了对齐考虑因素,你实际上覆盖qh_vd
的第一个字节,请记住数组索引从0
开始。因此,-1
添加到传递给rand_str
的大小。
还要考虑vlad_tepesch关于分配的答案。