Zmieniłem kod i dodatkowo zainicjalizowałem do funkcji kodujLZ77 strukturę okna, program wykonuje się. Jednak w wyniku dalej jest Pozycja: 0 Długość: 0 Znak:. Debuger znajduje breakpoint w inicjalizacji struktury w linii 102 "memset(&oknoKompresji, 0, sizeof(oknoKompresji)); // Inicjalizacja struktury "
#include <stdio.h>
#include <string.h>
#define MaxBuforSize 4
#define MaxDictionarySize 8
#define Min(x, y) ((x) < (y) ? (x) : (y))
struct trojkaLZ77
{
int pozycja;
int dlugosc;
char znak;
};
struct okno
{
char slownik[MaxBuforSize];
char bufor[MaxDictionarySize];
char niewykorzystane[60];
struct trojkaLZ77 trojka; // Teraz trojka jest częścią struktury okno
};
void wczytajDane(struct okno *okno, const char *nazwaPliku)
{
FILE *plik = fopen(nazwaPliku, "r");
if (!plik)
{
perror("Błąd wczytania pliku");
return;
}
int index = 0;
char znak;
while ((znak = fgetc(plik)) != EOF && index < sizeof(okno->niewykorzystane) - 1)
{
okno->niewykorzystane[index++] = znak;
}
okno->niewykorzystane[index] = '\0';
fclose(plik);
}
void przesuniecieOkna(struct okno *okno) {
int przesuniecie = okno->trojka.dlugosc + 1;
// Przesunięcie słownika
for (int i = 0; i < MaxBuforSize - przesuniecie; i++)
{
okno->slownik[i] = okno->slownik[i + przesuniecie];
}
// Przesunięcie bufora
memmove(okno->bufor, okno->bufor + przesuniecie, MaxDictionarySize - przesuniecie);
// Wczytanie nowych danych do bufora z niewykorzystanych
int iloscDoWczytania = Min(przesuniecie, strlen(okno->niewykorzystane));
memcpy(okno->bufor + MaxDictionarySize - przesuniecie, okno->niewykorzystane, iloscDoWczytania);
// Aktualizacja niewykorzystanych
memmove(okno->niewykorzystane, okno->niewykorzystane + iloscDoWczytania, strlen(okno->niewykorzystane) - iloscDoWczytania + 1);
}
struct okno kodujLZ77(struct okno *wejscioweOkno)
{
wejscioweOkno->trojka.pozycja = 0;
wejscioweOkno->trojka.dlugosc = 0;
wejscioweOkno->trojka.znak = wejscioweOkno->bufor[0];
int MaxDl = 0, Poz = 0;
for (int i = 0; i < strlen(wejscioweOkno->slownik); i++)
{
for (int j = 0; j < strlen(wejscioweOkno->bufor); j++)
{
int k = 0;
while (i + k < MaxBuforSize && j + k < MaxDictionarySize && wejscioweOkno->slownik[i + k] == wejscioweOkno->bufor[j + k])
{
k++;
}
if (k > MaxDl)
{
MaxDl = k;
Poz = i;
}
}
}
wejscioweOkno->trojka.pozycja = Poz;
wejscioweOkno->trojka.dlugosc = MaxDl;
if (MaxDl < MaxDictionarySize)
{
wejscioweOkno->trojka.znak = wejscioweOkno->bufor[MaxDl];
} else
{
wejscioweOkno->trojka.znak = '\0';
}
przesuniecieOkna(wejscioweOkno);
return *wejscioweOkno;
}
int main()
{
struct okno oknoKompresji;
memset(&oknoKompresji, 0, sizeof(oknoKompresji)); // Inicjalizacja struktury
const char *nazwaPliku = "plik.txt";
wczytajDane(&oknoKompresji, nazwaPliku);
if (strlen(oknoKompresji.niewykorzystane) == 0)
{
printf("Brak danych do kompresji.\n");
return 1;
}
// Przetwarzanie danych
struct okno skompresowaneOkno = kodujLZ77(&oknoKompresji);
printf("Pozycja: %d, Długość: %d, Znak: %c\n", skompresowaneOkno.trojka.pozycja, skompresowaneOkno.trojka.dlugosc, skompresowaneOkno.trojka.znak);
return 0;
}