Piszę sobie skrypt w C. Mam problem w miejscu, w którym kopiuję tablicę wskaźników.
Napisałem pętlę do tego kopiowania, ale wydało mi się, że jest to sposób, który generuje więcej błędów od pojedynczego wywołania funkcji. Zakomentowałem więc pętlę i wywołałem funkcję memcpy
z odpowiednimi argumentami. Ale okazało się, że działa gorzej (?) niż pętla. PS. A w każdym razie – inaczej.
Patrzę w ten kod już któryś raz od wczoraj i wydaje mi się, że oba fragmenty powinny działać tak samo. No kurczę, dokładnie tak samo.
Chciałbym prosić o porównanie, czy kod pętli i funkcji jest taki sam. To znaczy, czy rezultat powinien być taki sam niezależnie od tego, co będą przechowywać użyte zmienne (byle przechowywały to samo dla obu przypadków).
Nie chodzi mi o sprawdzenie poprawności wyniku obu tych fragmentów; rozumiem, że do tego potrzeba by całego kodu. Ma kilka funkcji i dużo miejsc, w których są sprawdzane błędy, więc myślę, że nie ma sensu go pokazywać. Stoję na stanowisku, że nikomu nie chciałoby się go czytać, a co dopiero debugować.
Tutaj deklaracje zmiennych używanych w obu fragmentach:
char **words = (coś tam);
size_t *actualTokenWordsNumber = (coś tam);
char **tokenWords = (coś tam);
Tutaj wersja głównej pętli z wykorzystaną pętlą:
for (size_t i = 0, k = 0; i < (*actualTokensNumber); ++i)
{
(tu trochę się dzieje)
for (size_t m = 0; m < (*actualTokenWordsNumber); ++m)
{
words[k++] = tokenWords[m];
}
}
A tutaj wersja głównej pętli z wykorzystanym wywołaniem memcpy
:
size_t actualWordsNumber = 0;
for (size_t i = 0; i < (*actualTokensNumber); ++i)
{
(tu trochę się dzieje)
actualWordsNumber += (*actualTokenWordsNumber);
memcpy(
words + ((actualWordsNumber - 1) * sizeof(char *)),
tokenWords,
(*actualTokenWordsNumber) * sizeof(char *));
}
UPDATE: Dodałem informację o tym, że oba te fragmenty są w pętli, ponieważ ma to znaczenie dla fragmentu z pętlą (wartość zmiennej k
).
UPDATE2: Dodałem fragment kodu, który ma znaczenie dla wartości zmiennej actualWordsNumber
.
UPDATE3: Przeniosłem deklarację zmiennej actualWordsNumber
we właściwe miejsce i ją dokończyłem, bo zauważyłem, że ma to znaczenie dla wersji z pętlą.