Wykonanie danej akcji n razy

0

Witam mam do naprawienia kawałek poniższego kodu. Funkcja action ma zostać wykonana n razy. Poniżej błędny kod

void execute (void (*action)(), int nTimes) {
  for (int i = 0; i < nTimes; i += 1) {
    action();
  }
}

Mój pomysł na naprawienie kodu poniżej

static int i=0;
void pusty(void)
  {i++;}
typedef void (*action)(void);
void execute (action pusty, int nTimes) {
  for (; i < nTimes;) {
    pusty();
  }
}

Nie wiem dlaczego to nie działa. Komilowałem w VisualStudio i jest ok funkcja pusty wykonuje się zadaną liczbę razy. Ktoś ma jakieś pomysły

5

Co jest "błędnością" pierwszego kodu?
Nocną porą, bez kompilatora, nie widzę problemów.

gonskabalbinka napisał(a):

Mój pomysł na naprawienie kodu poniżej

Drugi to jakaś masakra. Co paliłeś przy tym?
W zasadzie nie wiem, czy w tym "naprawianiu" więcej da się ale SPIEPRZYĆ, ale chyba nie.

2

Zadanie z codewars. Pierwszy kod nie przechodzi testów, przekracza limit czasu - gonskabalbinka 4 minuty temu

a co to jest 'action', czyli daj pełny kod podlegający uruchamianiu. To, co widać, to się wykonuje nanosekundy.

0

Treść zadania:

Fix a bug in provided method which should execute a passed action n (possibly hundreds) times. The method is timing out and not completing in time.

2

Ja zgaduje że chodzi o to zeby odpalić to na k wątkach.

1
gonskabalbinka skomentoeał(a):

Zadanie z codewars. Pierwszy kod nie przechodzi testów, przekracza limit czasu

Daj linka albo pełny kod do naprawienia.

1

Jak to powiadają u mnie działa ...

https://onlinegdb.com/rkDk-EXBP

ale jeśli ma być na wątkach to inna bajka ...

0

Biorąc pod uwagę że https://www.codewars.com/kata/5b2b4836b6989d207700005b ma

Similar Kata:
  Concurrent task execution

to zgaduje ze faktycznie musisz tam odpalić więcej wątków ;]

0

Ja bym się nie bawił w cplusowe thready tylko:

#pragma omp parallel for
for (int i = 0; i < nTimes; i += 1) {
    action();
  }
0

Poniżej kod dla przykładowych testów. To chyba znaczy ze jednak trzeba zastosować wątki.

#include <criterion/criterion.h>
#include <stdio.h>
#include <stdatomic.h>
#include <unistd.h>

void execute(void (*)(), int);

static atomic_int counter;

void thread() {
  fputs(".", stdout);
  sleep(1 /* second */);
  counter += 1;
}

Test(the_multiply_function, should_pass_all_the_tests_provided) {
  execute(&thread, 20);
  if (counter != 20) {
    cr_assert_fail("Action was executed %d times instead of %d times", counter, 20);
  } else {
    cr_assert(1);
  }
}
#include <omp.h>
#pragma omp parallel 
void execute (void (*action)(), int nTimes) {
  #pragma omp for schedule(dynamic, 100)
  for (int i = 0; i < nTimes; i += 1) {
    action();
  }
}

Próbuję tak i też nie działa. Może jakieś sugestie? Proszę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1