Witam.
Jako projekt zaliczeniowy na studiach musze napisać program generujący i przetwarzający sygnał(sinus). Podczas sprawdzania testem gremlina zaczęły dziać sie rzeczy, których nie potrafie wytłumaczyć. Program jednym razem zadziała pięknie, innym wysypie sie podczas otwierania pliku, innym przy czyszczeniu tablicy, a jeszcze innym przy wyjściu ze switch'a. Sugeruje mi to jakiś problem z zarządzaniem pamięcią, jednak nie potrafie go zlokalizować.Do tej pory najczęściej wysypywał mi sie przy sekwencji: (w podkreślonych miejscach) 1.Generowanie>3.Zaszumienie>5.Filtracja>6.Zapis>7.Zamknięcie>Ponowne odpalenie>2.Wczytanie>3. Zaszumianie>5.Filtracja>6.Zapis>7.Zamknięcie. Niewykluczone, że popełniam jakiś banalny błąd. Prosze o analize, wskazówki co jest nie tak i jak to naprawić. :)
Kod w C:
#include<stdio.h> #include<math.h> #include<time.h> #include<stdlib.h> #include<locale.h> void wspolczynniki(float *wsp) { printf("Podaj parametry funkcji.\nAmplituda sin:\n"); scanf("%f", &wsp[0]); printf("Omega:\n"); scanf("%f", &wsp[1]); printf("Przesunięcie fazowe:\n"); scanf("%f", &wsp[2]); printf("Stała c:\n"); scanf("%f", &wsp[3]); printf("Podaj początek dziedziny:\n"); scanf("%f", &wsp[4]); printf("Podaj koniec dziedziny:\n"); scanf("%f", &wsp[5]); wsp[6] = 0; while(*(wsp + 6)==0) { printf("Podaj ilość próbek:(różną od 0)\n"); scanf("%f", &wsp[6]); } system("cls"); } void funkcja(float *wsp, float *wynik) { float p, x, a, w, f, c, d1, d2; a = *wsp; w = *(wsp + 1); f = *(wsp + 2); c = *(wsp + 3); d1 = *(wsp + 4); d2 = *(wsp + 5); p = (d2 - d1) / *(wsp+6); x = d1; printf("Wspołczynniki: %f %f %f %f\n", a, w, f, c); int i; for (i = 0; i < *(wsp+6); i++) { *wynik =a*(float)sin(w*x + f) + c; wynik = wynik + 1; x = x + p; } printf("Sygnał został wygenerowany.\n\n"); } int odczyt(float **tab1, float *wsp) { float x, y, a; int i=2; int *temp; FILE *plik; plik = fopen("C:\\tablica1.csv", "r"); if (plik == NULL) { printf("Nie można otworzyć pliku. Plik może być otwarty w innym programie.\n\n;"); return 0; } if (!feof(plik)) { fscanf(plik, "%f;%f\n", &x, &y); temp = realloc(*tab1, 1 * sizeof(float)); if (temp != NULL) *tab1 = temp; else { printf("Błąd realokacji tablicy\n"); return 0; } (*tab1)[0] = y; a = x; printf("%d\n", i); } if (!feof(plik)) { fscanf(plik, "%f;%f\n", &x, &y); temp = realloc(*tab1, 2 * sizeof(float)); if (temp != NULL) *tab1 = temp; else { printf("Błąd realokacji tablicy\n"); return 0; } (*tab1)[1] = y; printf("%d\n", i); } wsp[4] = a; float k; k = x - a; while(!feof(plik)) { i++; temp = realloc(*tab1, i * sizeof(float)); if (temp != NULL) *tab1 = temp; else { printf("Błąd realokacji tablicy\n"); return 0; } fscanf(plik, "%f;%f\n", &x, &y); (*tab1)[i - 1] = y; printf("%d\n", i); } wsp[5] = a + (i - 1)*k; wsp[6] = i; fclose(plik); } void szum(float tab[], float wsp[]) { srand(time(NULL)); int p = (rand() % 21); //Procent zaszumionych próbek int zp = (p*wsp[6] / 100); //Ilość zaszumionych próbek int* np; np = calloc(zp, sizeof(int));//Tablica z numerami zaszumionych próbek int i; for (i = 0; i < zp; i++) { np[i] = rand() % ((int)wsp[6] + 1); printf("NUMER%d\n", np[i]); } for (i = 0; i < zp; i++) { tab[np[i]] = (((float)(rand() % 201) - 100)/100); printf("LICZBA%f\n", tab[np[i]]); } free(np); printf("Szum został dodany.\n\n"); } void filtrs(float tab1[], float tab2[], float wsp[]) { float okno[5]; int i; float s; tab2[0] = tab1[0]; tab2[1] = tab1[1]; for (i = 0; i < (wsp[6]-2); i++) { okno[0] = tab2[i]; okno[1] = tab2[i + 1]; okno[2] = tab1[i + 2]; okno[3] = tab1[i + 3]; okno[4] = tab1[i + 4]; s = (okno[0] + okno[1] + okno[2] + okno[3] + okno[4]) / 5; tab2[i + 2] = s; } tab2[(int)wsp[6] - 2] = tab1[(int)wsp[6] - 2]; tab2[(int)wsp[6] - 1] = tab1[(int)wsp[6] - 1]; } void filtrm(float tab1[], float tab2[], float wsp[]) { float okno[5]; int i; tab2[0] = tab1[0]; tab2[1] = tab1[1]; for (i = 0; i < (wsp[6] - 2); i++) { okno[0] = tab2[i]; okno[1] = tab2[i + 1]; okno[2] = tab1[i + 2]; okno[3] = tab1[i + 3]; okno[4] = tab1[i + 4]; int m, n; float temp; for (m = 0; m<4; m++) { for (n = 0; n<4 - m; n++) { if (okno[n] > okno[n + 1]) { temp = okno[n + 1]; okno[n + 1] = okno[n]; okno[n] = temp; } } } tab2[i + 2] = okno[2]; } tab2[(int)wsp[6] - 2] = tab1[(int)wsp[6] - 2]; tab2[(int)wsp[6] - 1] = tab1[(int)wsp[6] - 1]; } int zapis(float tab1[], float tab2[], float tab3[], float wsp[]) { int i; float k; FILE *tablica1; FILE *tablica2; FILE *tablica3; tablica1 = fopen("C:\\tablica1.csv", "w"); if (tablica1 == NULL) { printf("Nie można otworzyć pliku 'tablica1.csv'. Plik może być otwarty w innym programie.\n\n;"); return 0; } else { for (i = 0; i < wsp[6]; i++) { k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6)); //Przyrost argumentu fprintf(tablica1, "%f;%f\n", k, tab1[i]); } fclose(tablica1); } tablica2 = fopen("C:\\tablica2.csv", "w"); if (tablica2 == NULL) { printf("Nie można otworzyć pliku 'tablica2.csv'. Plik może być otwarty w innym programie.\n\n;"); return 0; } else { for (i = 0; i < wsp[6]; i++) { k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6)); fprintf(tablica2, "%f;%f\n", k, tab2[i]); } fclose(tablica2); } tablica3 = fopen("C:\\tablica3.csv", "w"); if (tablica3 == NULL) { printf("Nie można otworzyć pliku'tablica3.csv'. Plik może być otwarty w innym programie.\n\n;"); return 0; } else { for (i = 0; i < wsp[6]; i++) { k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6)); fprintf(tablica3, "%f;%f\n", k, tab3[i]); } fclose(tablica3); } } void drukuj(float tab[], float wsp[]) { int i; for(i=0; i<wsp[6]; i++) { printf("%f\n", tab[i]); } } int main() { setlocale(LC_ALL, "polish_poland"); int n=0; float twsp[7]; int *twynik; int *zwynik; int *owynik; int r = 0; twynik = calloc(1, sizeof(float)); zwynik = calloc(1, sizeof(float)); owynik = calloc(1, sizeof(float)); do { printf("1.Generuj sygnał\n2.Wczytaj sygnał\n3.Zaszum sygnał\n4.Filtruj(średnia ruchoma)\n5.Filtruj(mediana)\n6.Zapisz sygnał\n7.Zakończ program\n"); scanf("%d", &n); switch (n) { case 1: system("cls"); wspolczynniki(twsp); int *temp; temp = realloc(twynik, twsp[6] * sizeof(float)); if (temp != NULL) twynik = temp; else printf("Błąd realokacji tablicy\n"); temp = realloc(zwynik, twsp[6] * sizeof(float)); if (temp != NULL) zwynik = temp; else printf("Błąd realokacji tablicy\n"); funkcja(twsp, twynik); r = 1; break; case 2: odczyt(&twynik, twsp); r = 1; printf("%f,%f,%f", *(twsp + 4), *(twsp + 5), *(twsp + 6)); break; case 3: if (!r) { system("cls"); printf("Brak danych do zaszumienia\n\n"); } else { system("cls"); int i; realloc(zwynik, twsp[6] * sizeof(float)); for (i = 0; i < twsp[6]; i++) zwynik[i] = twynik[i]; szum(zwynik, twsp); } break; case 4: if (!r) { system("cls"); printf("Brak danych do filtracji\n\n"); } else { system("cls"); owynik = realloc(owynik, twsp[6] * sizeof(float)); filtrs(zwynik, owynik, twsp); break; } case 5: if (!r) { system("cls"); printf("Brak danych do filtracji\n\n"); } else { system("cls"); owynik = realloc(owynik, twsp[6] * sizeof(float)); filtrm(zwynik, owynik, twsp); } break; case 6: if (!r) { system("cls"); printf("Brak danych do zapisu\n\n"); } else { system("cls"); zapis(twynik, zwynik, owynik, twsp); } break; case 7: n = 7; break; case 8: drukuj(twynik, twsp); break; default: system("cls"); printf("Nie ma takiej opcji\n\n"); break; } } while (n != 7); free(owynik); free(twynik); free(zwynik); return 0; }