Как мне перевести функцию с Java на C? - PullRequest
0 голосов
/ 14 апреля 2019

Нас попросили создать библиотеку случайных букв на Java.Я сделал домашнее задание.Нас просят написать на С сейчас.Я сделал это с nanotime в Java.Я провел небольшое исследование, и я не смог найти nanotime в C.

Уже пробовал в C: (не работает)

Random SayiOlustur(){
Random this;
this = (Random) malloc(sizeof(struct RANDOM));
char randomly;
int i;
struct timeval before , after;
gettimeofday(&before , NULL);
for (i=1 ; i <= 100 ; i++){
   printf("%d %d %d ",i, i*i, i*i*i);}
gettimeofday(&after , NULL);
printf("%d",Nano(before,after)); 
int random;
double test;
while(true){
    test = Nano(before,after);
    random = (int)test % (int)123.0;
    if((random >= 65 && random <= 90) || (random >= 97 && random <= 122)){
    randomly = (char) random;
    break;
    }}}
int Nano(struct timeval x,struct timeval y){
    double x_ms , y_ms , diff;
    x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec;
    y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec;
    diff = (double)y_ms - (double)x_ms;
    return diff;
}

Java Code: (работает)

 private long Now(){
        long now = System.nanoTime();
        return now;
 }
public char Random(){
        char rastgele;
        while(true){
            random = (int)((Now())%123);
            // ASCI
            if((random >= 65 && random <= 90) || (random >= 97 && random <= 122))
                break;
        }
        rastgele = (char) random;
        return rastgele;
    }
public static void main(String[] args) {
        RastgeleKarakter rastgele = new RastgeleKarakter();
        System.out.println("Rastgele Karakter: " + rastgele.Random());
}

Out:

run:
Rastgele Karakter: m \\ Random

Out:

run
Rastgele Karakter: y \\ Random

1 Ответ

1 голос
/ 15 апреля 2019

Системный вызов Unix, который вы ищете, это clock_gettime (), который даст вам наносекундное время.

Тем не менее, я предложу некоторые комментарии к вашему коду C, даже если вы не спрашивали: вам лучше будет попробовать написать код с нуля, а не переносить код Java. Ваша система, скорее всего, предлагает случайный () вызов, который даст вам случайное число гораздо более аккуратно, чем ваш подход. Кроме того, вам никогда не следует приводить возврат из malloc (): он возвращает void *. Никогда не применяйте заклинания, если вы можете избежать этого - это очень плохая привычка, которая в конечном итоге скрывает от вас ошибки Точно так же не приводите y_ms и x_ms к double - вы объявили их как double. Это приведение может причинить вам боль только тогда, когда вы измените объявление y_ms и x_ms и забудете изменить приведение.

Вы переходите до и после к Nano (), что плохо. Это структуры, поэтому вы копируете все данные в структурах в стек. Гораздо лучше передавать указатели на структуры, поэтому вы пишете только указатель.

...