2013-06-18 2 views
-1

Я слишком долго царапал себе голову. Я видел много тем о том, как получить случайное поколение в цикле С, однако я ничего не видел, когда задействованы две петли.Петля в петле и случайной генерации в 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[] = ""; 
    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, например), но безуспешно.

Я надеюсь, что кто-то поможет мне в этом.

Florian

+0

Это не ваш полный код - нет определения 'qh_aux', например. –

+0

Это не компилируется. Что такое qh_aux? – rectummelancolique

+1

Терминатор '' \ 0'', написанный 'rand_str', выходит за рамки массива' mytext' так, как вы вызываете функцию. Быть осторожен ! –

ответ

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 о распределении.

+0

Ну, во-первых, я не перенаправлял результаты случайного ввода в printf, я делал это только для целей отладки. Я использовал strcpy и strtol для перенаправления случайных сгенерированных элементов в моей структуре, как вы можете видеть в коде сейчас – kv000

+0

Почему вы работаете в 'qh_aux', а затем копируете? Почему вы не работаете непосредственно с памятью, которую хотите заполнить? – rectummelancolique

+0

Ну, потому что я не думал об этом ... :-( – kv000

1

ваши основные выделяет одно поле quote_history и освобождает его в цикл.

feed_batch принимает этот указатель и обращается к нему, как если бы он был массивом -> ваш отладчик должен сообщить об ошибках доступа к памяти.

new guess:
У меня есть идея, почему вы думаете, что она работает (printfs верны), но вне ее не работает. Но это предположение только с отсутствием кода: Я думаю, вы сохраните указатель mytext в своей структуре. поэтому в конце все элементы массива указывают на одну и ту же строку. И еще хуже, что строка является автоматической переменной, которая теряет область после выхода из feed_batch.

Btw:
Почему вам нужно динамическое распределение? просто объявите объект quote_history и передайте его указатель. или объявить массив объектов quote_history. динамическое распределение здесь не обязательно.

+1

Спасибо за редактирование @Mike. Ты подтолкнул меня на это. –

+0

выделяет пространство для 'batch_size' (т.е. 5) объектов' quote_history', а не только 1 –

+0

@SanderDeDycker, о, вы правы! Я ошибаюсь. –