ファイルダンププログラムを作っています

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
てんちょー

ファイルダンププログラムを作っています

#1

投稿記事 by てんちょー » 13年前

初めて投稿いたします。ルールを拝読しましたが、至らない点がありましたらご容赦ください。

私は現在、仕事でC言語を使ったプログラムを作成しています。
自分で考えてみましたが、さっぱり分からずお力をお借りしたい次第でございます。
プログラムの仕様は以下のようになっています。
仕様が業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)
現在、自力で②まで作成してみました。(ソースコードは最後に記載)
がしかし、③以降の処理をどのように行えばいいのか、まったく分かりません。
開発環境は以下の通りです。
OS:Windows7(64bit)
コンパイラ名:gcc

C言語を学び始めて、まだ2週間と日が浅く、正直もうお手上げ状態で、
検索してみても、専門用語だらけ、しかもそのワードを調べてもまた専門用語だらけ・・・で
非常に困っております。
なにとぞよろしくお願い申し上げます。

コード:

#include <stdio.h>

main(int argc,char *argv[])
{

    if(argc < 2){
        printf("引数は2個以上入力して下さい")
    }

}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#2

投稿記事 by softya(ソフト屋) » 13年前

はじめまして。
OJTの担当の方に相談したほうが良いと思いますが、しょっちゅう聞けない状況なのでしょうか?
出来ればそのほうが早いのですし、会社の方も聞かれることは前提として課題を出していると思います。・・・と思いたい。

まぁ、色々状況があると思いますのでお答えします。
この質問だと会社に入るまではプログラミング言語は未経験と言うことでよろしいですか。

で、内容ですが仕様的に矛盾を感じるのですがプログラム実行後入力と引数でコード番号、表示周期を得ると言う点です。
確かに出来たコードは引数から得ると言う方向性ではありますがプログラム実行後入力(通常はscanf()を使う)と面では矛盾します。
ここは、もう出題者の仕様レベルの問題なので確認してくださいとしか言えません。

で出来上がったコード内容を見る限り①と②の仕様を満たせておりません。
①でコード番号、表示周期を取り出せていません。文字列の複製や文字列の数値から数値への変換が必要です。
②で処理を終了が実装されていません。exit()関数を使って下さい。
③以降に関しては仕様のさらなる分解をしないとプログラムに落としこむことはできません。
そもそも表示周期ってなんでしょうか? 私の知る表示周期とは別物のようです。それとも画面更新周期の時間単位なのでしょうか?

最後にC言語の入門書のたぐいは手元にありますでしょうか?あったら名前を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: ファイルダンププログラムを作っています

#3

投稿記事 by ISLe » 13年前

Windows 7で、画面消去にclearコマンドというのは環境も特殊なようですが。

てんちょー

Re: ファイルダンププログラムを作っています

#4

投稿記事 by てんちょー » 13年前

ご回答ありがとうございます。
先輩に聞いた方が良いのは分かっているのですが、あいにく夏休みをとってらっしゃるのです。
上司に聞くのは忙しそうでどうしてもはばかられてしまって・・・
お伝えし忘れておりましたが、私はプログラミング経験はありません。

>~仕様的に矛盾を感じるのですがプログラム実行後入力と引数でコード番号、表示周期を得ると言う点です。
失礼しました。実行後という言い方は適当ではないと思います。
「"コンパイル後"プログラムを実行するときに入力する」が正しい表現だと思います。
(例:gcc -o program program.c を入力後、program 1 2 のように引数を入力するイメージ)

>で出来上がったコード内容を見る限り①と②の仕様を満たせておりません。
>①でコード番号、表示周期を取り出せていません。文字列の複製や文字列の数値から数値への変換が必要です。
>②で処理を終了が実装されていません。exit()関数を使って下さい。
>③以降に関しては仕様のさらなる分解をしないとプログラムに落としこむことはできません。
>そもそも表示周期ってなんでしょうか? 私の知る表示周期とは別物のようです。それとも画面更新周期の時間単位なのでしょうか?
①はキャストを行う必要があるという認識でよろしいでしょうか?
②に関しては、うっかり忘れておりました。
③はおっしゃる通りの意味ですね。上司に「表示周期」と言われたので、そのように表現してみたのですが・・・
正確に申し上げますと、表示周期で例えば"2"と入力した場合、「"2秒ごと"に画面を更新する」ということになります。

最後にもう一点お伝えし忘れていることを思い出したので記載します。
プログラムの記述には「Tera term pro」というものを使っています。
入門書の方は会社から渡されたもので、
「「ANSI C対応 はじめてのC」椋田著 株式会社 技術評論社出版」という本を使っています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#5

投稿記事 by softya(ソフト屋) » 13年前

夏休みですか・・・。代わりの人はいないんですね。

①に関してはキャストを無闇に使ってはいけません。
文字列の複製 ・・・ 標準関数にあります。 string.h
文字列の数値化 ・・・ 標準関数にあります。 stdlib.h
あと②の後でやらないと引数の数をチェックした意味がありません。

②今気づきましたが、argc < 2は間違いです。argcの仕様を再確認して下さい。

③何らかの時間系の関数が必要ですが指示を受けていますか?
環境に依存しますので、gccでも状況により変わります。
Tera term proを使っているという話なので実はLinuxサーバーに接続されていて、そちらのgccでは?と言う疑問あります。

>「「ANSI C対応 はじめてのC」椋田著 株式会社 技術評論社出版」という本を使っています。

とりあえず、すごく懐かしい本です。分りやすい本じゃ無いんですよね。
「やさしいC」辺りを購入されることをおすすめしたいです。

間違いもありますがわかり易いサイトだと思います。補助としてお使いください。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
ISLe さんが書きました:Windows 7で、画面消去にclearコマンドというのは環境も特殊なようですが。
ISLeさんの疑問にお答えいただけると幸いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#6

投稿記事 by てんちょー » 13年前

指導できるほど手が空いている人がいないみたいですね;

>①に関してはキャストを無闇に使ってはいけません。
なるほど。つまり、引数のチェックを行った後(もしエラーの場合はexit()で処理を終了する)、
strcpyやatoiを使って変数に入れ、のちの処理で使用するということでしょうか?

>②今気づきましたが、argc < 2は間違いです。argcの仕様を再確認して下さい。
argcに関しては自分で考えただけなので、scanf等を使うやり方で考えてみます。

>③何らかの時間系の関数が必要ですが指示を受けていますか?
>環境に依存しますので、gccでも状況により変わります。
時間系の関数に関しては、指示は受けていません。
標準関数等にそれらしいものがないかは念のためみてみたのですが・・・
「アルゴリズムでできる」と上司はおっしゃっていたので、自分で考えろということかもしれません。

>Tera term proを使っているという話なので実はLinuxサーバーに接続されていて、そちらのgccでは?と言う疑問あります。
Linuxのコマンドが使用できたので、そうかもしれません。たぶん・・・上司に聞いてみます。

「やさしいC」ですね!さっそく購入してみようと思います!
「苦しんで覚えるC言語」の方も参考にさせていただきます。
いろいろと紹介して下さって本当にありがとうございます。とても助かります。

>Windows 7で、画面消去にclearコマンドというのは環境も特殊なようですが。
これに関しては、上司が「clearコマンド使って」と仰ったので、「特殊なんですか!?」というのが本音です;
上司に確認したところ、「system関数("cls")を使用しても良い」というお話でしたので、
そちらを使ってみようと思っています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#7

投稿記事 by softya(ソフト屋) » 13年前

てんちょー さんが書きました: >①に関してはキャストを無闇に使ってはいけません。
なるほど。つまり、引数のチェックを行った後(もしエラーの場合はexit()で処理を終了する)、
strcpyやatoiを使って変数に入れ、のちの処理で使用するということでしょうか?
そういう事です。
てんちょー さんが書きました: >②今気づきましたが、argc < 2は間違いです。argcの仕様を再確認して下さい。
argcに関しては自分で考えただけなので、scanf等を使うやり方で考えてみます。
argcの使い方が間違っているんで直せばOKです。
scanfはアレはアレで面倒です。
てんちょー さんが書きました: >③何らかの時間系の関数が必要ですが指示を受けていますか?
>環境に依存しますので、gccでも状況により変わります。
時間系の関数に関しては、指示は受けていません。
標準関数等にそれらしいものがないかは念のためみてみたのですが・・・
「アルゴリズムでできる」と上司はおっしゃっていたので、自分で考えろということかもしれません。
標準ならclock()関数とCLOCKS_PER_SECで経過時間を数えるというCPU使用率激UPな方法ならありますよ。
http://www9.plala.or.jp/sgwr-t/lib/clock.html
てんちょー さんが書きました: >Tera term proを使っているという話なので実はLinuxサーバーに接続されていて、そちらのgccでは?と言う疑問あります。
Linuxのコマンドが使用できたので、そうかもしれません。たぶん・・・上司に聞いてみます。
お願いします。
てんちょー さんが書きました: >Windows 7で、画面消去にclearコマンドというのは環境も特殊なようですが。
これに関しては、上司が「clearコマンド使って」と仰ったので、「特殊なんですか!?」というのが本音です;
上司に確認したところ、「system関数("cls")を使用しても良い」というお話でしたので、
そちらを使ってみようと思っています。
system("cls");が使えるならWindowsなんですよね。
あとTera term pro上での画面クリアには使えない気がします。
やはり開発環境が不明だとアドバイスが難しいですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#8

投稿記事 by てんちょー » 13年前

日をまたいでしまってすみません。

>開発環境がわからないとアドバイスは難しいですね。
開発環境ですか・・・Linuxにアクセスしているというのは分かったのですが、
開発環境を尋ねてみたら、上司に「え?そんなの知る必要ある?」と一笑に付されてしまいました。
詳しくお伝えできなくて申し訳ありません。

いただいたアドバイスを参考に、自分でコードを考えてみました。
またアドバイスいただけたら、幸いです。
よろしくお願いいたします。
(一部日本語で書いてあるところがありますが、そこは会社の都合上お見せできないので、変えてあります)

コード:

ソースコードが業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)
上記に「構造体定義ファイル」と書かれていますが、
これはこういう構造体を使ってね、というのが与えられています。
それは以下の通りです。

コード:

ソースコードが業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#9

投稿記事 by softya(ソフト屋) » 13年前

起動パラメータで情報が与えられている場合は、argvから得るべきであって
scanf("%d",no);
scanf("%d",cycle);
で入力するのは間違いです。あるいは、起動パラメータを止めてしまうかどちらかを選択して下さい。
int no[5];
int cycle[5];
と文字列でもない数値を配列化してる意味がありません。
ソースコードで見るかぎりコード番号もただの数値なんでしょうか?

それとsystem("cls");は全く意味が無いと言うか実行エラーしてませんか?
試していませんが、TeraTermProだと
printf("¥033[2J"); /* 画面をクリア */
のはずです。

その他読み込んでいないとか、noが使われていないなどの問題があります。
まず①と②を片づけましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#10

投稿記事 by てんちょー » 13年前

回答ありがとうございます。
いただいたアドバイスをもとにして、自分でも考えつつ、
何とかコンパイルできるところまで漕ぎ着けました。
以下のコードでコンパイルには成功しました。
しかし、上司からは「うーん、多分思ったような結果はでないと思うよ?」と言われてしまいました。。。
まだ何かおかしな点があるのでしょうか?
もし何かあればアドバイスいただけると嬉しいです

コード:

ソースコードが業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#11

投稿記事 by softya(ソフト屋) » 13年前

ご自分でテストした結果はどうなのでしょうか?
仕事の練習ですので、仕様を満たしているかの自己評価が先だと思います。
その部分の評価をこちらに丸投げするのは良くない事だと理解なさって下さい。

(1)テスト→(2)テスト結果の評価→(3)修正点の検討→(4)修正(1)にもどる。

(2)を伝えて頂ければ、(3)(4)の部分に関してはお手伝いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#12

投稿記事 by てんちょー » 13年前

確かにそうですね;
開発環境と実行環境が違う(つまり、開発機でつくったプログラムを実行機に移さなければならない)ので、
ひとまずコンパイルできたら、コードのチェックのために実行機動かそうかーという段階だったので、
まだテストはできてません。
これから静的チェックをやっていくところです。

ひとまず、テストをしてみて、自分でも考えてみて、
分からなかったまた質問に来ます。

てんちょー

Re: ファイルダンププログラムを作っています

#13

投稿記事 by てんちょー » 13年前

こんにちは。
テストやってきました。
結論から申し上げますと、まったくダメでした・・・
仕様うんぬんの前にまずプログラムが何も反応してくれなくて。

静的チェックでは何のエラーも見つからず、OKだったのですが、
実行機に移して、プログラムを実行しても何の反応もありませんでした・・・
ためしに現在時刻を取得するような記述をプラスして実行してみると、
ちゃんと表示されるので、どうやらプログラム自体は動作しているようなのです。
(コマンドミス等でプログラムが実行できていないわけではない)
if文に入っていないから、真っ白なままなんだろうとは分かるのですが、
なんで入ってくれないのかが、さっぱりわからなくて困っています;

ファイルオープンエラー文や引数の個数エラーでさえも出ない状況で
(要するに実行すると真っ白な状態のまま、うんともすんとも言わなくなる)
エラー文も出ないので、何が間違っているのかもわからず、
正直、どこを直したらいいのか、お手上げ状態です。
ヒントだけでもいただけたら、頑張りますので、よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#14

投稿記事 by softya(ソフト屋) » 13年前

プログラムの通過ポイントを調べるためにprintf();を埋め込んでみて下さい。
サンプル:printf( "if(argc != 3)が真" );
こんな感じでifやwhileの分岐の前後に埋め込んで行くとプログラムがどの様に流れたが分かります。

私の書いたデバッグ入門です。参考にして下さい。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2

なんかコンパイル機→テスト機でやっているみたいですが、Windwosでコンパイル→テストとかTeraTermProから実行とかに出来ないんですかね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#15

投稿記事 by てんちょー » 13年前

softya(ソフト屋) さんが書きました:プログラムの通過ポイントを調べるためにprintf();を埋め込んでみて下さい。
サンプル:printf( "if(argc != 3)が真" );
こんな感じでifやwhileの分岐の前後に埋め込んで行くとプログラムがどの様に流れたが分かります。
なるほど。つまり、どこまでOKで、どこに問題があるのかを特定するために入れるということですね。
さっそくやってみます!
softya(ソフト屋) さんが書きました: 私の書いたデバッグ入門です。参考にして下さい。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2
ありがとうございます。参考にさせていただきます。
softya(ソフト屋) さんが書きました: なんかコンパイル機→テスト機でやっているみたいですが、Windwosでコンパイル→テストとかTeraTermProから実行とかに出来ないんですかね?
コンパイルおよび静的チェックまではTeraTermProでできるのですが、プログラムの実行はテスト機じゃないとできないそうです(上司に確認取りました)
正直、行ったり来たりするのは疲れるのですが、こればっかりはしょうがないと言われてしまいました;

また自分でデバッグして、頑張ってみようと思います。

てんちょー

Re: ファイルダンププログラムを作っています

#16

投稿記事 by てんちょー » 13年前

度々すみません。
どうしてもわからない部分が出てきたので、教えていただきたいです。
よろしくお願いいたします。

NO.10に載せたコードですが、テストを行ったところ、バグが見つかりました。
(画面が真っ白だったのは、機械の問題だったようで直りました)
63行目の部分で、switch文により、表示する内容を変えようと思っているのですが、
ファイルの中身を変更しても、なぜか未実施のままになります。
(本来ならば、0ならば未実施、1ならば実施中のように変更されてほしい)
s__f.status[no]の部分はprintfで出力してみたところ、
ちゃんと意図通り、noを変えると、s__f.status[no]も変わるのですが・・・
switch文の書き方がおかしいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#17

投稿記事 by softya(ソフト屋) » 13年前

見せてもらったコードでは問題は無いように見えますが、値を設定している部分は他の関数みたいなので値まで合っているかは分かりません。
なので値の設定部分をチェックすべきだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: ファイルダンププログラムを作っています

#18

投稿記事 by box » 13年前

{

}
の対応関係がわかりづらかったり、字下げの仕方を統一していなかったりするので、
コードが読みづらいです。個人的には。

コードが読みづらいと、バグを見つけにくくなるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

てんちょー

Re: ファイルダンププログラムを作っています

#19

投稿記事 by てんちょー » 13年前

間が空いてしまって申し訳ありません。
あれからなんやかんやと四苦八苦しながら、テストも行いまして、なんとかプログラムが完成しました。
仕様通り、思ったように動くので、これで問題ないかなと自分では考えています。
これから、このプログラムの改善については、また考えていこうと思っております。
最後に、できあがったプログラムを載せてこのトピは解決とさせていただきます。
ご助力いただき、誠にありがとうございました。
box さんが書きました:{

}
の対応関係がわかりづらかったり、字下げの仕方を統一していなかったりするので、
コードが読みづらいです。個人的には。

コードが読みづらいと、バグを見つけにくくなるような気がします。
読みづらくてすみません;Tera termからのコピペ方法がわからなくて、メモ帳に少しずつコピペしていたので、
ずれてしまっていたようです;
改めて、別ファイルにそのまま移せる方法を見つけたので、そちらで書いてみます。

コード:

ソースコードが業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#20

投稿記事 by softya(ソフト屋) » 13年前

完成おめでとうございます。
見させてもらいましたが、同じ処理が沢山あるので共通化(関数化)などをしないとメンテナンス性の問題がありますね。
文字列配列などをうまく使うと沢山のswitch~caseも必要なくなりますので考えてみてください。
あと変数宣言部分だけインデントが乱れていますので注意してくださいね。
良きプログラマーになられますように。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#21

投稿記事 by てんちょー » 13年前

こんにちは。
解決・・・とさせていただいたのですが、アドバイスを受けてプログラムの改変をしていたところ
どうしてもわからず詰まってしまい、またご助力いただければと思い投稿させていただきました。

私はまず、まったく同じ処理が2回分(画面表示の周期が0秒のときとそれ以外のとき)も
書かれているのは、非効率的だと考えて、そこを1つにしようと思い、
以下の通りコードを改変しました。
(コンパイルおよびテストも行って、エラーなく動くことは確認済みです)

コード:

ソースコードが業務上に機密に関係するということで削除いたしました。 by softya(ソフト屋)

しかし、その後、どうやってswitch文を短くしたり、もっと効率の良いやり方をすることができるのか・・・
全く考えつかずに困っております。
『文字列を使って』とのことでしたが、何かヒントをいただければ幸いです。

なお、こういうときは新しくトピを立てるべきか否か分からなかったので、
こちらに記載してあります(同じプログラムの話なので、その方が良いかと思いまして)
以上、よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#22

投稿記事 by softya(ソフト屋) » 13年前

文字列ではなく、文字列配列って所が味噌です。
ヒント:

コード:

char *fs[3] = {
	"---",
	"---",
	"---"
};
printf( "%s", fs[なにか] );
って事ですね。ただし、なにかは2を超えないようにガードが必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#23

投稿記事 by てんちょー » 13年前

softya(ソフト屋) さんが書きました:文字列ではなく、文字列配列って所が味噌です。
ヒント:

コード:

char *fs[3] = {
	"---",
	"---",
	"---"
};
printf( "%s", fs[なにか] );
って事ですね。ただし、なにかは2を超えないようにガードが必要です。
うーん、難しいですね;
自分で考えてみたのは、以下のコードです。

コード:

if(s__f.flg[no] < 2)
{
       printf("***要求フラグ:%s\n",fs[s__f.flg[no]]);
}
else
{
       printf("%s\n",fs[2]);
}
コンパイルすると、「添字をつけられた値が配列でもポインタでもありません」というエラーが
この部分に出てしまいます。
煮詰まってしまったので、アドバイスいただければ幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#24

投稿記事 by softya(ソフト屋) » 13年前

flgは配列ではないはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てんちょー

Re: ファイルダンププログラムを作っています

#25

投稿記事 by てんちょー » 13年前

softya(ソフト屋) さんが書きました:flgは配列ではないはずです。
そうですね。そうですよね・・・
指摘されて「はっ!」と気づきました。
自分も元のプログラムでそう書いているじゃないか・・・と思わず愕然としました。
ちゃんと直してコンパイルして、実行したところ、思い通り動きました!

おかしな質問をして申し訳ありませんでした。ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルダンププログラムを作っています

#26

投稿記事 by softya(ソフト屋) » 13年前

ちなみに
int no;
と定義しておいて、
no = s__f.flg;
if( no > 2 ) no = 2;
printf("***要求フラグ :%s\n",fs[no]);
とする方法とか。

あるいは三項演算子で
printf("***要求フラグ :%s\n",s__f.flg[no]<2? fs[s__f.flg] : fs[2] );
とする方法があります。
ただし、三項演算子は分かりづらいので嫌われる場合もあります。ソースコードは短いですけどね。
http://www1.cts.ne.jp/~clab/hsample/Flow/Flow07.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る