テーブル(配列)の初期化を外部ファイルに指定
お世話になっております。
以下は列車の時刻表を検索する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分を表示させる箇所も、テーブル使い たいのですが、これも自分でコーディングするとコンパイルが通りませ ん。
長々と申し訳ありません。ご教授願います。
--前回ご覧頂いた方--
結局期限を明日までにのばしてもらいました。。
お礼
回答ありがとうございます! 確かにそうですね。 その場合Load関数は具体的にどう記述すればよいかわかる方はいらっしゃいますか? 条件を指定せず全文を読み込む方法しかわからないので・・・ どうかよろしくおねがいします。
補足
すいません何か勘違いしてました。 一行ずつ読み込む → 条件に合った場合のみ指定した桁数を変数に入れて処理(for文などで) ということですよね? だんだんできてきました。 ただ、一行ずつ読み込む方法だけがよくわかりません・・・。 変数gyouのみを関数に持っていけばいいとは思っているのですが。 関数内の具体的な記述がわかる方はどうかおねがいします。