C - program wczytujący z pliku csv i zapisujący odszumione dane do csv

0

Napisałem cały programik. Nie wiem gdzie mogą być błędy, ale znając mnie jest ich sporo. Program ma działać z wiersza poleceń -> c:\nazwa_programu.exe sygnal_zaszumiony.csv sygnal_odszumiony.csv

Dzięki za jakiekolwiek zainteresowanie

 #include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    struct sygnal
    {
        double poczatek;
        double interwal;
        double koniec;
        double *tablica;
    };
    ////////////////////////////////////////////////////////////////////FUNKCJE/////////////////////////////////////////////////////////////
    int rozmiar (struct sygnal s)
    {
       return ( ( sizeof(s.tablica) ) / ( sizeof(double) ) );
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void zamiana(char *nazwapliku)
    {
        FILE *f;
        f=fopen(nazwapliku,"a");
        while(getc(f) != EOF)
        {
            if(getc(f) == ',')
            putc(';',f);
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////
    int SygnalZapisz(struct sygnal s, char* nazwapliku)
    {
        FILE *f;
        f=fopen(nazwapliku,"w");
        int i;
        double x = s.poczatek;
        for (i = 0; i <=( rozmiar(s) - 2 ); i++, x = x + s.interwal)
        {
            fprintf(f,"%g ; %g \n", x , s.tablica[i]);
            x = x + s.interwal;
        }
        fclose(f);
    }
    ////////////////////////////////////////////////////////////////////////////////////
    int SygnalWczytaj(struct sygnal s, char* nazwapliku)
    {
        double x;
        char napis[255];
        int wiersz = 0;
        int i;
        FILE *f;
        if ((f=fopen(nazwapliku,"r"))==NULL)
        {
            printf("Nie moge otworzyc pliku\n");
            return 0;
        }
        f=fopen(nazwapliku,"r");
        s.tablica = (float*)malloc(wiersz * sizeof(float));
        while(getc(f) != EOF)
        {
            if(getc(f) == '\n')
                ++wiersz;
        }
        for (i = 0 ; i<=wiersz ; i++)
        {
            if (fgets(napis,1,f) == '#')
            fseek(f,1,i);
            else
            i=wiersz;
        }
        for (i=0;i <= rozmiar(s); i++)
        {
            sscanf(f,"%lf;%lf",&x,&s.tablica[i]);
            if (i=0)
            s.poczatek=x;
            if(i=1)
            s.interwal=x-s.poczatek;
            if(i=rozmiar(s))
            s.koniec=x;
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////
    int Mediana (struct sygnal s)
    {
        int i=0;
        for(i ; i <= ( rozmiar(s) - 2 ) ; i++)
        {
            int a;
            for(a=i;a<=i+2;a++)
            {
                if (((s.tablica[a] <= s.tablica[a++]) && (s.tablica[a] >= s.tablica[a+=2])) || ((s.tablica[a] >= s.tablica[a++]) && (s.tablica[a] <= s.tablica[a+=2])))
                s.tablica[i] = s.tablica[a];
            }
        }
    }
    ///////////////////////////////////////////////////////////////PROGRAM//////////////////////////////////////////////////////////////////////
    /
    struct sygnal pierwszy;
    SygnalWczytaj(pierwszy,argv[1]);
    Mediana(pierwszy);
    SygnalZapisz(pierwszy,argv[2]);
    free(pierwszy.tablica);
    system("pause");
    return 0;
};
0

Nie chciało mi się przeglądać całości, bo nic konkretnego nie napisałeś. Np. co się dzieje, że wg. Ciebie są błędy.
Na pierwszy rzut oka funkcja rozmiar nie działa tak jak Ci się wydaje. Zwraca zawsze 0 - sizeof(tablica) zwróci wielkość wskaźnika do double'i. Biorąc pod uwagę, że ten rozmiar jest mniejszy od rozmiaru double to dzielenie całkowite będzie zawsze przyjmowało wartość 0.

Dodatkowo raz używasz double, a raz float co też się dobrze nie skończy.

Proponuję zaprzyjaźnić się z debuggerem

0

Przecież sizeof(s.tablica) powinien zwracać jej wielkość w bajtach...

0

Nie powinien. sygnal::tablica jest wskaźnikiem, dlatego sizeof zwróci jego wielkość, a nie bloku pamięci, na który wskazuje.

0

ah czyli powinno być

 sizeof (*s.tablica)

Mam już coś takiego. Wyróżnione i oddzielone komentarzami miejsca, to te co do których mam wątpliwości, ew. kompilator się w nich czepia, a ja nie wiem co zmienić.


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct sygnal
    {
        double poczatek;
        double interwal;
        double koniec;
        double *tablica;
    };

int rozmiar (struct sygnal s);
void zamiana(char *nazwapliku);
int SygnalZapisz(struct sygnal *s, char* nazwapliku);
int SygnalWczytaj(struct sygnal s, char* nazwapliku);
int Mediana (struct sygnal s);

int main(int argc, char **argv)
{
    struct sygnal pierwszy;
///////////////////////////////////////
    SygnalWczytaj(pierwszy,argv[1]);         //warning C4700: uninitialized local variable 'pierwszy' used
////////////////////////////////////
    Mediana(pierwszy);
    SygnalZapisz(&pierwszy,argv[2]);
    free(pierwszy.tablica);
    system("pause");
    return 0;
};
int rozmiar (struct sygnal s)
    {
       return ( ( sizeof(*s.tablica) ) / ( sizeof(double) ) );      // liczba elementów tablicy to jej rozmiar przez rozmiar pojedynczego elementu
    }

void zamiana(char *nazwapliku)         //zamiana przecinków na średniki
    {
        FILE *f;
        f=fopen(nazwapliku,"R +");            //do nadpisywania
        while(getc(f) != EOF)               //do końca pliku
        {
            if(getc(f) == ',')
            putc(';',f);                    //wstaw średnik
        }
    }

int SygnalZapisz(struct sygnal *s, char* nazwapliku)
    {
        int i;
        double x = s->poczatek;
        FILE *f;
        f=fopen(nazwapliku,"w");            //do zapisywania
        for (i = 0; i <=( rozmiar(*s) - 2 ); i++)  //tablica po filtrowaniu jest o 2 elementy mniejsza
        {
            fprintf(f,"%g ; %g \n", x , s->tablica[i]);
            x = x + s->interwal;
        }
        fclose(f);
        return 1;
    }

    int SygnalWczytaj(struct sygnal s, char* nazwapliku)
    {
        double x;
        char napis[255];
        int wiersz = 0;
        int i;
        FILE *f;
        f=fopen(nazwapliku,"r");
        s.tablica = (double*)malloc(wiersz * sizeof(double));  //tworzenie dynamicznej tablicy na dane
        while(getc(f) != EOF)                                  //zliczamy liczbę rekordów
        {
            if(getc(f) == '\n')
                ++wiersz;
        }
        for (i = 0 ; i<=wiersz ; i++)
        {
            if (*fgets(napis,1,f) == '#')                //pomijamy komentarze
            fseek(f,1,i);
            else
            i=wiersz;
        }
        for (i=0;i <= rozmiar(s); i++)
        {
///////////////////////////////
            sscanf(f,"%lf;%lf",&x,&s.tablica[i]);       //wczytujemy dane         //warning C4133: 'function' : incompatible types - from 'FILE *' to 'const char *'
//////////////////////////////
            if (i=0)
            s.poczatek=x;
            if(i=1)
            s.interwal=x-s.poczatek;
            if(i=rozmiar(s))
            s.koniec=x;
        }
        fclose(f);
        return 1;
    }

    int Mediana (struct sygnal s)
    {
        int i=0;
        for(i ; i <= ( rozmiar(s) - 2 ) ; i++)
        {
            int a;
            for(a=i;a<=i+2;a++)                     //trochę pokręcone - sprawdzamy która liczba z 3 nie jest ani najmniejsza ani największa
            {
                if (((s.tablica[a] <= s.tablica[a++]) && (s.tablica[a] >= s.tablica[a+=2])) || ((s.tablica[a] >= s.tablica[a++]) && (s.tablica[a] <= s.tablica[a+=2])))
                s.tablica[i] = s.tablica[a];
            }
        }
        return 1;
    }
    }
0
Kierownik napisał(a)

ah czyli powinno być

sizeof (*s.tablica)

NIE! teraz sizeof zwróci Ci wielkość tego na co pokazuje czyli rozmiar double. Musisz sobie gdzieś przechowywać rozmiar tablicy, nie ma możliwości sprawdzenia rozmiaru dynamicznie alokowanego bloku pamięci.

Naprawdę tak trudno odpalić debugger i zobaczyć czy zmienne zawierają odpowiednie wartości, a funkcje zwracają to co myślisz, że zwracają? Jak nie umiesz odpalić debuggera to chociaż dodaj printfy, które Ci wypiszą wartości zmiennych w różnych miejscach kodu.

0

Już sobie poradziłem.

Potrafię uruchomić debbuger.

dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0