/ / wartość tablicy zmienia się po wyjściu z pętli - c, loop, for-loop

wartość tablicy zmienia się po wyjściu z pętli - c, pętle, pętla for

Dziękuję Ci! fread (& byte [i], sizeof (BYTE), 1, inptr) rozwiązuje problem.

Część kodu:

BYTE (byte[block_size]);
for (int i = 0; i < block_size; i++)
{
fread(&byte, sizeof(BYTE), 1, inptr);
byte[i] = *byte;
printf("b[%i] = %it", i, byte[i]);
}
printf("b0 = %i, b1 = %i, b2 = %i, b3 = %in", byte[0], byte[1], byte[2], byte[3]);
return 0;

Wewnątrz bajtu „dla pętli” wartości są drukowane poprawnie. Bajt [0] ma wartość 104. Poza wartością pętli dla bajtu [0] jest 0. Dlaczego to nie 104? Wartości bajtów 1, 2 i 3 są prawidłowe poza pętlą.

Odpowiedzi:

2 dla odpowiedzi № 1

Kiedy czytasz w tablicy bajtów, używasz pierwszej wartości byte[0] lub *byte jako miejsce na zarysowania. Istnieje kilka sposobów rozwiązania tego problemu:

Zmienna tymczasowa - Zamiast używać *byte, utwórz zmienną tymczasową:

for (int i = 0; i < block_size; i++) {
BYTE tmp;

fread(&tmp, sizeof(BYTE), 1, inptr);
byte[i] = tmp;
}

Dostęp bezpośredni - Naprawdę nie potrzebujesz zmiennej tymczasowej, jeśli kopiujesz ją później, abyś mógł zaadresować bajt, do którego chcesz napisać bezpośrednio:

for (int i = 0; i < block_size; i++) {
fread(&byte[i], sizeof(BYTE), 1, inptr);
}

Czytaj bloki - W rzeczywistości nie potrzebujesz nawet pętli, ponieważ fread już czyta pewną liczbę bloków:

fread(byte, sizeof(BYTE), block_size, inptr);

Twój kod wygląda trochę tak, jakby pomieszał dwie pierwsze i trzecią metodę.

Na koniec uwaga: BYTE nie jest typem standardowym, więc proszę dołączyć typedef więc wiemy o czym mówisz. Twoja deklaracja zrzuciła mnie z tropu

BYTE (byte[block_size]);

Nawiasy wyglądają dziwnie, choć wydają się mieć poprawną składnię. Pozbądź się ich, a ta linia wygląda jak deklaracja tablicowa, którą oczywiście jest:

BYTE byte[block_size];