Temat: Podział projektu na wiele plików
Kod wyjściowy, niepodzielony:
#include <stdio.h>
#include <stdlib.h>
struct Macierz {
int wys;
int szer;
double** liczby;
};
void wyswietl(struct Macierz mac) {
int i,j;
for(i=0; i<mac.wys; i++) {
for(j=0; j<mac.szer; j++) {
printf("%lf ",mac.liczby[i][j]);
}
printf("\n");
}
}
void wypelnij(struct Macierz* ma, double w) {
int i,j;
for(i=0; i<(*ma).wys; i++) {
for(j=0; j<(*ma).szer; j++) {
(*ma).liczby[i][j] = w;
}
}
}
void main() {
struct Macierz m;
int i;
m.wys = 10;
m.szer = 5;
m.liczby = (double**)calloc(m.wys, sizeof(double*));
for (i=0; i<m.wys; i++) {
m.liczby[i] = (double*)calloc(m.szer, sizeof(double));
}
wypelnij(&m, 3.0);
wyswietl(m);
}
Plik macierz.h - tworzymy w folderze "Header files", zawiera: deklarację struktury, deklaracje funkcji, tutaj również umieszczamy dokumentację struktur i funkcji, pamiętamy też o "strażniku nagłówka", chroniącym przed wielokrotnym includowaniem:
#ifndef MACIERZ_H
#define MACIERZ_H
/**
* Struktura reprezentujaca macierz
*/
struct Macierz {
int wys;
int szer;
double** liczby;
};
/*
* Wyswietla macierz
* \param mac macierz wejsciowa
*/
void wyswietl(struct Macierz mac);
/*
* Wypelnia macierz
* \param ma macierz wejsciowa
* \param w wartosc, ktora macierz zostanie wypelniona
*/
void wypelnij(struct Macierz* ma, double w);
#endif
Plik macierz.c - tworzymy w folderze "Source files", załącza macierz.h i wszystkie biblioteki potrzebne do kompilacji, zawiera definicje funkcji
#include <stdio.h>
#include <stdlib.h>
#include "macierz.h"
void wyswietl(struct Macierz mac) {
int i,j;
for(i=0; i<mac.wys; i++) {
for(j=0; j<mac.szer; j++) {
printf("%lf ",mac.liczby[i][j]);
}
printf("\n");
}
}
void wypelnij(struct Macierz* ma, double w) {
int i,j;
for(i=0; i<(*ma).wys; i++) {
for(j=0; j<(*ma).szer; j++) {
(*ma).liczby[i][j] = w;
}
}
}
Plik main.c - program główny. Jeżeli oprócz funkcji main() zawiera dodatkowe funkcje, to tutaj umieszczamy do nich dokumentację.
#include <stdio.h>
#include <stdlib.h>
#include "macierz.h"
void main() {
struct Macierz m;
int i;
m.wys = 10;
m.szer = 5;
m.liczby = (double**)calloc(m.wys, sizeof(double*));
for (i=0; i<m.wys; i++) {
m.liczby[i] = (double*)calloc(m.szer, sizeof(double));
}
wypelnij(&m, 3.0);
wyswietl(m);
}
W Visual Studio strażnik nagłówka można zrobić w inny sposób, w pierwszej linijce pliku wpisując:
#pragma once
Wówczas nie potrzeba już żadnych #ifndef itd... To rozwiązanie jest wspierane przez różne kompilatory, nie tylko VS.