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.