Stworzenie pliku makefile - problemy.

0

Witam,
mam taki o to kod programu:

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

const int maxAlphabet = 26;

typedef struct {
    int allocated; /* keep track of allocated size  */
    int length; /* keep track of usage           */
    int *array; /* dynamicaly grown with realloc */
} s_dynamic_array;
//typedef struct s_dynamic_array s_dynamic_array;

void new_dynamic_array(s_dynamic_array *array, int initialSize) {
    if (initialSize == 0) {
        array->allocated = 0;
        array->length = 0;
    } else {
        array->array = (int*) malloc(sizeof (int) * initialSize);
        array->allocated = sizeof (int) * initialSize;
        array->length = initialSize;
    }
}

void free_dynamic_array(s_dynamic_array *array) {
    free(array->array);
    array->length = 0;
    array->allocated = 0;
}

void add_int_to_dynamic_array(s_dynamic_array *array, int value) {
    if (array->length == 0) {
        array->array = (int*) malloc(sizeof (int));
    } else {
        array->array = (int*) realloc(array->array, (array->allocated + sizeof (int)));
    }
    array->allocated += sizeof (int);
    array->array[array->length] = value;
    array->length++;
}

int int_at_index(s_dynamic_array *array, int index) {
    return array->array[index];
}

int is_letter(int character) {
    if ((character > 'A'-1 && character < 'Z'+1) || (character > 'a'-1 && character < 'z'+1)) {
        return 1;
    } else {
        return 0;
    }
}

int is_uppercase(int character) {
    if (character > 'A'-1 && character < 'Z'+1) {
        return 1;
    } else {
        return 0;
    }
}

int is_lowercase(int character) {
    if (character > 'a'-1 && character < 'z'+1) {
        return 1;
    } else {
        return 0;
    }
}

int main(int argc, char** argv) {
    if (argc != 2) {
        printf("Uzycie: \n%s \"nazwa_pliku\"\n", argv[0]);
    } else {


        FILE* plik = fopen(argv[1], "rb");
        if (plik == NULL) {
            printf("Problem z otwarciem pliku, czy plik istnieje?\n");
        } else {
            int alfabet[26];
            int iloscLinii = 1;
            int iloscSlow = 0;
            int iloscPustychLinii = 0;
            int maxSlowWLinii = 0;
            int numerLiniiZMaxSlowWLinii = 0;
            
            s_dynamic_array liczbaSlowDlaLinii;
            new_dynamic_array(&liczbaSlowDlaLinii, 0);
            s_dynamic_array liczbaZnakowDlaLinii;
            new_dynamic_array(&liczbaZnakowDlaLinii, 0);

            add_int_to_dynamic_array(&liczbaSlowDlaLinii, 0); // sprawdz dzialanie: azrael
            add_int_to_dynamic_array(&liczbaZnakowDlaLinii, 0);
            for (int i = 0; i < maxAlphabet; i++) {
                alfabet[i] = 0;
            }
            
            int c; //wczytany znak
            int stareC = 0;

            while ((c = fgetc(plik)) != EOF) {
                if (is_uppercase(c)) {
                    alfabet[c - 'A']++;
                    liczbaZnakowDlaLinii.array[liczbaZnakowDlaLinii.length - 1]++;
                } else if (is_lowercase(c)) {
                    alfabet[c - 'a']++;
                    liczbaZnakowDlaLinii.array[liczbaZnakowDlaLinii.length - 1]++;
                }
                if (is_letter(stareC) && !is_letter(c)) {
                    ++iloscSlow;
                    liczbaSlowDlaLinii.array[liczbaSlowDlaLinii.length - 1]++;
                }   
                if (c == '\n') {
                    ++iloscLinii;
                    add_int_to_dynamic_array(&liczbaSlowDlaLinii, 0);
                }


                stareC = c;
            }
            fclose(plik);
            if (is_letter(stareC)) {
                liczbaSlowDlaLinii.array[liczbaSlowDlaLinii.length-1]++;
                iloscSlow++;
            }
            

            for (int i = 0; i < liczbaSlowDlaLinii.length; i++) {
                if (0 == int_at_index(&liczbaSlowDlaLinii, i)) {
                    iloscPustychLinii++;
                }
                if (maxSlowWLinii < int_at_index(&liczbaSlowDlaLinii, i)) {
                    maxSlowWLinii = int_at_index(&liczbaSlowDlaLinii, i);
                    numerLiniiZMaxSlowWLinii = i;
                }
            }
            float sredniaSlowNaLinie = ((float)iloscSlow / iloscLinii);

            printf("Alfabet:\n");
            for (int i = 0; i < maxAlphabet; i++) {
                printf("%c = %d; ", (i+'a'), alfabet[i]);
                if (i % 7 == 0 && i != 0) {
                    printf("\n");
                }
            }
            printf("\nSuma slow: %d\n", iloscSlow);
            printf("Ilosc linii: %d\n", iloscLinii);
            printf("Srednia slow na linie: %4.2f\n", sredniaSlowNaLinie);
            printf("Ilosc pustych linii: %d\n", iloscPustychLinii);
            printf("Linia z najwieksza iloscia wyrazow: %d (%d)\n", numerLiniiZMaxSlowWLinii+1, maxSlowWLinii);

            free_dynamic_array(&liczbaSlowDlaLinii);
            free_dynamic_array(&liczbaZnakowDlaLinii);
        }
    }
    return 0;
}

Muszę zrobić plik makefile: ,,Program powinien być podzielony na 2 pliki źródłowe: *.c oraz plik nagłówkowy: *.h.
Myślę, że jeden plik powinien zawierać funkcję main, a drugi pozostałe funkcje.

Mógłby ktoś oświecić jak stworzyć owy makefile?

CC = gcc  

all: main.c reszta.h 
  $(CC) main.c reszta.h  -o test

main.o: main.c
  $(CC) main.c -c -o main.o

reszta.o: reszta.h
  $(CC) reszta.h -c -o reszta.o

Powyższy daje błędy przy kompilacji:
invalid preprocessing directive #M
expected constructor, destructor, or type conversion before '=' token"

Dziękuję

0

Od kiedy pliki *.h się kompiluje? o_O
Zakładam ze masz pliki: main.c i reszta.h, wtedy powinno to wyglądać tak:

CC = gcc  

all: main.c reszta.h 
  $(CC) main.c -o test

Albo w ogóle samo

CC = gcc  

all: main

Jesli nie przeszkadza ci ze plik wynikowy będize się nazywal main ;)

A błąd jest błędem kompilacji a nie make'a

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