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ę