Guardian_McLeavy Napisano 19 Kwietnia 2006 Zgłoś Napisano 19 Kwietnia 2006 Witam! Pisałem dosyć dawno temu koder, i zaprzestałem, ponieważ zatrzymałem się na momęcie, którego nie potrafie rozwiązać. Może wy coś poradzicie. Działanie programu: Wprowadza się tekst do kodowania. Program losuje "mnoznik", który zapisuje do struORT: ORT: ORT: ktury. Następnie przekształća po kolei znaki tekstu, na kod, tzn. dodaje do numeru znaku w ASCII wylosowany mnoznik. Po tym zapisuje całą strkturę, zawierającą kod i mnożnik do pliku (binarnie). I do tąd chodzi (bynajmniej pojawiają się ślaczki w pliku tekstowym). Problem jest z odkodowaniem, bo wtedy funkcja się sypie. Wykonuje w nieskończoność pętle. Czy ktoś wie gdzie leży błąd? Oto kod programu: #include <stdio.h>#include <stdlib.h>#include <math.h>void Zakoduj(char* before, int* after, int a);void Odkoduj(char* before, int* after, int a);int main(){ struct KOD { int kod[100]; int przelicznik; }; KOD podaj; char tresc[100]; printf("Koder objektowy by Guardian\nWybierz:\n"); printf("1. Koduj"); printf("2. Dekoduj"); int opcja; scanf("%d", &opcja); if(opcja == 1) { printf("Podaj tresc do kodowania:\n"); scanf("%s", &tresc); int x = (int) rand() % 21; podaj.przelicznik = (int) pow(2,(double) x); Zakoduj(tresc, podaj.kod, x); //Zapis binarny FILE* plik = fopen("kod.dat","wb"); fwrite(&podaj,1, sizeof( KOD ), plik); fclose(plik); } else { FILE* plik = fopen("kod.dat","rb"); fread(&podaj,1, sizeof( KOD ), plik); fclose(plik); Odkoduj(tresc, podaj.kod, podaj.przelicznik); printf("%s", &tresc); } return 0;}void Zakoduj(char* before, int* after, int a){ int bufor; for(int i = 0; i < 100; i++) { bufor = before[i]; after[i] = bufor + a; }}void Odkoduj(char* before, int* after, int a){ int i = 1; int bufor; while(1) { if(pow(a,1/i) == 2) break; i++; } for(int i = 0; i < 100; i++) { bufor = after[i]; before[i] = (int) after - a; }} Z góry dziękuję za pomoc! Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Sid Napisano 19 Kwietnia 2006 Zgłoś Napisano 19 Kwietnia 2006 Odpowiedzi gotowej nie podam bo nie mam trochę czasu, ale wiesz chyba że błąd jest tu: while(1) { if(pow(a,1/i) == 2) break; i++; } Widocznie pow(a,1/i) nigdy nie osiąga u Ciebie wartości 2.... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
parmezan Napisano 19 Kwietnia 2006 Zgłoś Napisano 19 Kwietnia 2006 Witam! Pisałem dosyć dawno temu koder, i zaprzestałem, ponieważ zatrzymałem się na momęcie, którego nie potrafie rozwiązać. Może wy coś poradzicie. (...) Czy ktoś wie gdzie leży błąd? Uf błędów tutaj sporo, ale po kolei if(opcja == 1) { printf("Podaj tresc do kodowania:\n"); scanf("%s", &tresc);źle, winno być scanf("%s",tresc); nazwa tablicy może być użyta jako wskaźnik na pierwszy element po &tresc masz wskaźnik na wskaźnik na pierwszy element Odkoduj(tresc, podaj.kod, podaj.przelicznik); printf("%s", &tresc);źle, jak wyżej, printf("%s",tresc) void Zakoduj(char* before, int* after, int a){ int bufor; for(int i = 0; i < 100; i++) { bufor = before[i]; after[i] = bufor + a;bufor ci nie potrzebny, nie można tak?: after = before + a; void Odkoduj(char* before, int* after, int a){ int i = 1; int bufor; while(1) { if(pow(a,1/i) == 2) break; i++; } i co po tej pętli ? nic, masz swój klucz w i, którą za chwile nadpiszesz daj np. a = i; głupio wygląda ale działa for(int i = 0; i < 100; i++) { bufor = after[i]; before[i] = (int) after - a; a tutaj masakra, rzutujesz wskaźnik (pierwszy element tablicy) na int, odejmujesz a i zapisujesz jako i-ty element w tablicy charów spróbuj before = (char)(after - a); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Guardian_McLeavy Napisano 21 Kwietnia 2006 Zgłoś Napisano 21 Kwietnia 2006 Wprowadziłem zmiany. Te początkowe to były niekonieczne, ale faktycznie, poprawiają jakościowo kod. I problem z funkcją odkoduj. Dalej się "zacina" :/ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
parmezan Napisano 21 Kwietnia 2006 Zgłoś Napisano 21 Kwietnia 2006 Wprowadziłem zmiany. Te początkowe to były niekonieczne, ale faktycznie, poprawiają jakościowo kod. I problem z funkcją odkoduj. Dalej się "zacina" :/ Masz w załączniku poprawioną wersję. U mnie działa, kompilator poniżej ~/temp$ g++ --version g++ (GCC) 3.4.5 (Gentoo 3.4.5-r1, ssp-3.4.5-1.0, pie-8.7.9) koder.txt Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Guardian_McLeavy Napisano 22 Kwietnia 2006 Zgłoś Napisano 22 Kwietnia 2006 Wiem, czego wtedy nie poprawiłem. Ale kurcze dalej nie chce mi odkodować :-( Korzystam z Code:Blocks 1.0 ; mingw32-g++.exe WtF? Ma ktoś pojęcie, co może być źle? :/ Tak zastanawiam się, jkaby zmienić dat na txt czy to coś pomoże. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Guardian_McLeavy Napisano 25 Kwietnia 2006 Zgłoś Napisano 25 Kwietnia 2006 Problem rozwiązany. Ten sposób odkodowywania trwał bardzo długo. Dostałem poprawioną funkcję, któa wykorzystuje zależność dwójki podnoszonej do potęgi w zapisie binarnym. To tak, jakby kogoś interesowało :-) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
novo Napisano 7 Maja 2006 Zgłoś Napisano 7 Maja 2006 Ten post zostawie na przyszlosc. Dzialo sie tak prawdopodobnie dla tego, ze 1/i nie musi dawac poprawnych wynikow. Tzn 1/2 nie oznacza koniecznie 0.5, moze byc np 0.4999999999999999. Wynika to z faktu iz obliczenia zmiennoprzecinkowe sa zawsze podawane z pewna dokladnoscia. Aby sprawdzic ile ta dokladnosc wynosi(zalezy od typu) mozna uzyc std::numeric_limits<T>::epsilon(). Dla float bedzie to: std::numeric_limits<float>::epsilon(). Wiecej info jest tu. Pozdr! novo. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...