テーブル(配列)の初期化を外部ファイルに指定
お世話になっております。
以下は列車の時刻表を検索するCのソースです
// ヘッダー省略
#define PRN_PORTD 0x0378
#define PRN_PORTC 0x037a
void lightLED( int num, int loc )
{
static int table[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x27, // 7
0x7F, // 8
0x6F, // 9
};
// table[ num ] で数値から変換
printf("num[%x] port[%x]\n loc[%d]",
able[ num ], PRN_PORTD, loc ); // デバックの為
outb( table[ num ], PRN_PORTD );
outb( loc, PRN_PORTC );
outb( loc | 0x04, PRN_PORTC );
outb( loc, PRN_PORTC );
}
// 時刻表の時:分を表示する関数
void digitalLED( int time )
{
int ret, four, three, two, one;
four = ((time / 1000) % 10); // 4桁目を取り出す
three = ((time / 100) % 10); // 3桁目を取り出す
two = ((time / 10) % 10); // 2桁目を取り出す
one = ((time / 1) % 10); // 1桁目を取り出す
ret = ioperm( PRN_PORTD, 4, 1 );
lightLED( four, 0x03 ); // 時の10桁を表示
lightLED( three, 0x02 ); // 時の 1桁を表示
lightLED( two, 0x01 ); // 分の10桁を表示
lightLED( one, 0x00 ); // 分の 1桁を表示
ret = ioperm( PRN_PORTD, 4, 0 );
exit(0);
}
// ここまでのソースはLEDに表示させる関数です
int main(void)
{
char type;
int ret;
do {
// ↓テーブル初期化。本来はこれを使用したいのですが。
// static int table[] = { ここで外部ファイル指定 }; /
int findtime; // 0000形式に変換後の現在時間
int *search; // テーブル内の検索時間
int h; // 時
int m; // 分
FILE *file;
time_t timer; // 現在時刻を取得し地方形式に
struct tm *local;
time(&timer); // 現在時刻の取得
local = localtime(&timer); // 現在時刻を構造体に変換
h = local->tm_hour; // 時
m = local->tm_min; // 分
findtime = h * 100 + m ; // 現在時間を0000形式へ変換
file = fopen( "jikoku.txt", "r" );
if( file == NULL ) {
puts( "jikoku.txtが開けません" );
return 1;
}
while ( !feof(file)) {
fscanf(file, "%d", &*search);
printf("%d\n", *search);
// 該当時間検索
// for ( search = table ; *search != -1 ; search++ ) {
// ↑時刻表を外部ファイルにしたことによって使わなく
// なったのですが。。。
if ( *search > findtime ){
break;
}
}
// 結果表示
if ( *search == - 1 ) { // テーブル内の-1に当たったら //06:10表示
// ↓table[0]の形に要修正
printf( "06:10\n\n" );
digitalLED( 610 );
}
else {
digitalLED( *search );
printf( "%02d:%02d\n\n",
(*search / 100), // 「時」取り出し
(*search % 100) ); // 「分」取り出し
}
fclose(file);
scanf("%c", &type); // Enterで再度プログラム開始
}
while (type == '\n');
}
テーブルの外部ファイルは以下の様な感じです
610 650 ..... 2310 2350 -1
まだ勉強中の初心者です。汚いソースで申し訳ないです。
これでもみなさんに強力して頂きながら数日かけて、やっとここまでできました。
【困っている箇所】
・この状態ですと、現在時間の「時」が2桁(10~23時)の場合、セグメン テーションエラーですとの表示で実行できなくなります。
・コメントになってしまっているテーブル初期化を外部ファイル
(jikoku.txt)にしたいのですが(teble[0]→6:10 teble[1]→
6:50 ...の様に。)ファイル名を入れたり色々試したのですがなかなかで きません
・テーブル内で-1に当たったら、6:10分を表示させる箇所も、テーブル使い たいのですが、これも自分でコーディングするとコンパイルが通りませ ん。
長々と申し訳ありません。ご教授願います。
--前回ご覧頂いた方--
結局期限を明日までにのばしてもらいました。。