簡単なDBを作成する。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_MEMBER 10
#define NAME_LENGTH 50
#define MESSAGE_LENGTH 256
enum ERROR {
MESSAGE_OK,
MESSAGE_ERROR
};
typedef struct {
int id;
char name[NAME_LENGTH];
} member;
// グローバル変数
int num = 0;
member member_databese[MAX_MEMBER];
int Error;
// プロトタイプ宣言
void init_db();
int add(int, char*);
member* get(int);
void show_data(member*);
void show_error();
int main(void) {
int i;
char names[][NAME_LENGTH] = {
"John",
"Mike",
"Taro",
"Hana"
};
int ids[] = {1, 2, 3, 4};
init_db();
for (i=0; i<4; i++) {
add(ids[i], names[i]);
printf("added id:%d name:%s to db.\n", ids[i], names[i]);
show_error();
}
for (i=0; i<4; i++) {
show_data(get(i+1));
}
return 0;
}
void init_db(void) {
int i;
for (i=0; i<MAX_MEMBER; i++) {
member_databese[i].id = -1;
strcpy(member_databese[i].name, "");
}
Error = MESSAGE_OK;
num = 0;
}
int add(int id, char* name) {
if (get(id)==NULL && num < MAX_MEMBER) {
member_databese[num].id = id;
strcpy(member_databese[num].name, name);
num++;
Error = MESSAGE_OK;
return 1;
}
Error = MESSAGE_ERROR;
return 0;
}
member* get(int id) {
int i;
for (i=0; i<num; i++) {
if (member_databese[i].id == id) {
return &member_databese[i];
}
}
return NULL;
}
void show_data(member* data) {
if (data != NULL) {
printf("id:%d name:%s \n", data->id, data->name);
} else {
printf("No matched data.\n");
}
}
void show_error() {
switch (Error) {
case MESSAGE_OK:
printf("Finish inserting data.\n");
break;
case MESSAGE_ERROR:
printf("Error occured. Could not insert data.\n");
break;
}
}
頭から順に0, 1, 2…と整数を割り振る。
ソースの分割
ソースを、ヘッダファイル、メイン関数、その他関数へと分割する。
関数の持つ機能ごとに分割する。
ヘッダファイル
database.h
#ifndef _DATABASE_H_
#define _DATABASE_H_
#define MAX_MEMBER 10
#define NAME_LENGTH 50
enum ERROR {
MESSAGE_OK,
MESSAGE_ERROR
};
typedef struct {
int id;
char name[NAME_LENGTH];
} member;
void init_db();
int add(int, char*);
member* get(int);
#endif //_DATABASE_H_
output.h
#ifndef _OUTPUT_H_ #define _OUTPUT_H_ #include "database.h" void show_data(member*); void show_error(); #endif //_OUTPUT_H_
メイン関数
main.c
#include <stdio.h>
#include "database.h"
#include "output.h"
int main(void) {
int i;
char names[][NAME_LENGTH] = {
"John",
"Mike",
"Taro",
"Hana"
};
int ids[] = {1, 2, 3, 4};
init_db();
for (i=0; i<4; i++) {
add(ids[i], names[i]);
printf("added id:%d name:%s to db.\n", ids[i], names[i]);
show_error();
}
for (i=0; i<4; i++) {
show_data(get(i+1));
}
return 0;
}
その他関数
database.c
static を関数や変数の前につけると、別のファイルからその変数を参照できなくなる。
#include <string.h>
#include "database.h"
// グローバル変数
static int num = 0;
static member member_databese[MAX_MEMBER];
int Error;
void init_db(void) {
int i;
for (i=0; i<MAX_MEMBER; i++) {
member_databese[i].id = -1;
strcpy(member_databese[i].name, "");
}
Error = MESSAGE_OK;
num = 0;
}
int add(int id, char* name) {
if (get(id)==NULL && num < MAX_MEMBER) {
member_databese[num].id = id;
strcpy(member_databese[num].name, name);
num++;
Error = MESSAGE_OK;
return 1;
}
Error = MESSAGE_ERROR;
return 0;
}
member* get(int id) {
int i;
for (i=0; i<num; i++) {
if (member_databese[i].id == id) {
return &member_databese[i];
}
}
return NULL;
}
output.c
#include <stdio.h>
#include "output.h"
extern int Error;
void show_data(member* data) {
if (data != NULL) {
printf("id:%d name:%s \n", data->id, data->name);
} else {
printf("No matched data.\n");
}
}
void show_error() {
switch (Error) {
case MESSAGE_OK:
printf("Finish inserting data.\n");
break;
case MESSAGE_ERROR:
printf("Error occured. Could not insert data.\n");
break;
}
}