- 1 名前:デフォルトの名無しさん mailto:age [2007/07/24(火) 23:17:11 ]
- C言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 16 pc11.2ch.net/test/read.cgi/tech/1184003625/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 93代目 pc11.2ch.net/test/read.cgi/tech/1184506311/
- 110 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:47:24 ]
- >>109
んなわけねー
- 111 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:48:09 ]
- コンパイラの拡張機能に頼ってると、
規格とか分かんなくなるよね。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:48:53 ]
- >>109
とりあえずソース希望
- 113 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:49:44 ]
- >>110
省略してるコード見たことないの? ぱらぱらとめくってみたら、UNIXネットワークプログラミングのサンプルもreturn省略だな。
- 114 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:50:14 ]
- >>110
省略できるよ、0を返すという意味にはならないけど。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:51:24 ]
- 確かにエラーにはならんね。
- 116 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:51:52 ]
- >>113
その「サンプル」は規格に準拠したものなのか? 説明の便宜上、省いているだけってことは?
- 117 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:53:16 ]
- >>112
たとえば、ここの、11.12 www.kouno.jp/home/c_faq/c11.html > exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない return省略すると、警告でるコンパイラもあるけど、そいうのはウンコ。
- 118 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:56:46 ]
- >>116
ANSI準拠のK&Rでも、省略してるし、大丈夫なんじゃないの? >>96 も動作確認用の書き捨てコードだから、省略したんだけど。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:58:22 ]
- >>117
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない これって「exit()を呼ぶならreturn は省略できる」って意味だと思うけど
- 120 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:03:40 ]
- >>117
んー? それmain()をvoidと宣言してる場合じゃん
- 121 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:10:19 ]
- >>119
言われてみたら、回答がへんなような気がするね。 なんで最初に「return入れろ」じゃなくてexit()が着てるんだろ。 まあ、returnは省略を前提にしてるQ&Aに見えるけど。 >>120 質問者がvoidにしたいって言うのを、回答者はまっさきに否定してるじゃん。 その後はmain()を前提にした回答でしょ。
- 122 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:22:18 ]
- >>121
こんな感じ(?) >main()の戻り値は省略できるか? >できない。main()はintを戻り値とし、(適切な型の)0個か2個の引数 を持つと定義しなければならない。 main()はintを戻り値として返さなければならない.引数も(ry・・・としなければならない >exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない ただし、exit()を呼んだ場合はreturn を省略できるが、それでも警告が出るなら return を記述するしかない つまり、return (戻り値)を呼ぶか、exit()を呼ぶかであって戻り値を省略できるわけではない と受け取れる
- 123 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:27:57 ]
- >>122
「exit()を呼んでも*まだ*警告が出る のであれば」 だから、本来はexit()なしでも警告も出ないってことなんじゃない? で、そのごに「return入れろ」と言ってるということは、exit()もreturnもなしのmain()を 想定した問答なんじゃ?
- 124 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:38:36 ]
- main 関数で return 0; 省略は規格違反。省略した場合の戻り値は未定義。
GCC でいつも -ansi -pedantic -Wall でコンパイルしている俺が言うんだから間違いない。 -std=c99 にすると警告消える。
- 125 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:39:46 ]
- 一通りの書き方を妄信する奴はPythonでもやっとけ
- 126 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:47:03 ]
- >>124
リターン値が未定義ってだけで、規格違反ではないよ。 -ansi残して、-Wall消せば警告でないんじゃない?
- 127 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:50:37 ]
- 新ANSI C言語辞典で、mainを見ると、返却値が未定義になると書いてあるけど、
その項目のmain()のサンプルは全部return省略してるな。 Cの最小のコードは、main(){ return 0;} じゃなくて main(){}
- 128 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:55:22 ]
- >>126
return の省略とは誰も言ってない。 return 0; の省略と言ってる。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:56:30 ]
- >>127
普通のコンパイラを普通に使えば コンパイラの拡張機能として省略可能にしてあることが多いから 問題が起こることは無いんだろう。
- 130 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:01:36 ]
- >>129
いや、拡張機能じゃないでしょ。 ansi互換のオプションとかでコンパイルできるし。
- 131 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:04:10 ]
- >>129
>コンパイラの拡張機能として省略可能にしてあることが多いから どこのコンパイラ?
- 132 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:34:27 ]
- >>96
ありがとうございます。 なぜか自分の方だけはいつまでもできなくて 今まで唸っていたのですが、iとjが同じになっていていました。
- 133 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:57:05 ]
- ていてい!
- 134 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 02:16:45 ]
- >>127
つまりプログラム自体は未定義でないということでは?
- 135 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:41:33 ]
- >>130
戻り値が 0 になるとは限らないけどな。
- 136 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:45:55 ]
- まとめ
1. main 関数で return を省略する事は可能。しかし、コンパイラによっては警告が出る可能性はある。 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 3. C99 や C++ でなら 0 が返る事が保証される。つまり、return 0; の省略は可能である。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:15:13 ]
- もう一つ。
関数の戻り値の型はcでは省略可能。その場合、intと仮定される。 main()に関しては、void(=戻り値なし)としている例が散見されるが厳密には処理系依存。 大抵の処理系で許容されているが、その場合コマンドインタプリタへの引渡し値が0になる保障は無い。
- 138 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:25:02 ]
- >>137
C99では、関数宣言で戻り値の型の省略ができなくなったはず。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:27:45 ]
- >>138
>cでは
- 140 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:44:20 ]
- C99 が C ではないという口ぶりネ。
そう言いたくなる気持ちは分かるけど。
- 141 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:50:20 ]
- C99なんてCじゃないやい!
とか、余計な方向へ持っていこうとするテスト(って懐かしいなぉぃ)
- 142 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:58:04 ]
- コマンドインタプリタなんて概念は C にはないということもつっこんでいいのかな。
- 143 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:49:21 ]
- >>136
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 動作が未定義じゃなくて、リターン値が未定義なだけだから、省略は可能。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:51:03 ]
- >>143
もっと読解力をつけた方がいい。
- 145 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:54:21 ]
- >>144
>>143の理解でまったく問題ありません。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:02:56 ]
- uploader.fam.cx/img/u13877.png
- 147 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:05:23 ]
- >>146
それが何か?
- 148 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:38:29 ]
- >>145
return 0; を期待して return を省略する事はできない、と言ってるんだよ。
- 149 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:39:53 ]
- main が未定義値を返した時の動作が未定義なら、
return を省略する事はできないと言える。 で、どうなんだ?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:55:00 ]
- >>148
かなり前から、リターン値は未定という前提で、話は進んでます。 >>149 リターン値は未定義でも、動作は未定義じゃないよ。
- 151 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 15:51:08 ]
- どうせこうなるんならめんどくても書いたほうがいいと思う初心者だが、
プロはやっぱり出来る限り省略しないといけないぐらい(納期とか)厳しいんだろうか
- 152 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 15:54:16 ]
- 逆だな、普通に書いておくもんだ。
- 153 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:09:10 ]
- return 0;
を書くことで時間が足りなくなることなんてまずないだろw
- 154 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:37:20 ]
- >>150
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 は > return 0; を期待して return を省略する事はできない、と言ってるんだよ。 ということ。 リターン値が未定だからこそ、そうなる。
- 155 名前:151 mailto:sage [2007/07/28(土) 16:38:56 ]
- いやでもほら、プロの悲惨な現場、って感じの読み物とか時々読んで鬱になるわけだけど、
そこで数万行のコードの話とか出るじゃん チリも積もれば山となるのかなーと どちらにせよ初心者が省略なんて覚えたらロクなことにならなそうなんでちゃんと書こうと思った
- 156 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:41:44 ]
- ソースコードが何万行もあってもmain関数が何万個もあるわけじゃないだろw
- 157 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:43:29 ]
- いやだって、プログラム単体ならmain()なんて一個しかないわけだし、
複数プログラムを連携させるようなアプリケーションなら戻り値は必要になるし、 どっちにしても省略するメリットなんて無いよ。 #行単価なんてしょうもない契約だったら尚更省略しないだろうし。
- 158 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:45:26 ]
- そういえばmain関数の話だった
俺アホス
- 159 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 17:06:30 ]
- return 0; なんて1秒もかからんちん
- 160 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:07:53 ]
- return 0 つー、正常終了なら0を返すという決まりは
UNIXLinuxシステムの依存ものだから exit(EXIT_SUCCESS); を薦めておく
- 161 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:09:50 ]
- EXIT_SUCCESSが0であることも規格で決まってなかったっけ?
- 162 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:27:13 ]
- 決まってる。
main 関数の戻り値は 0 は正常終了、1 は異常終了、 その他は処理系定義という形で規定されている。
- 163 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:37:44 ]
- main の戻り値 = プログラムがその呼び出し元にどういう値を返すか ではないからな。
環境依存の部分は main から戻ったあとで処理系が勝手にやってくれる。
- 164 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:48:04 ]
- C99を使えばmainのreturn 0;は省略できるのに。
- 165 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:57:21 ]
- 無限ループに突入したところに恐縮ながら質問するぜ
while( !feof(fp) ) { fgetc(fp); byte++; } で何バイトか計算するんだけど、実際より1バイト大きくなるのはなんでだぜ? と書いてて気付いたが前判定だから最後のインクリメントが一回分余計なのかな?
- 166 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:08:26 ]
- >>165
fgetc(fp); で最後の一文字を読み込んとすると今はEOFの場所にあるわけだが その状態でfeof(fp)を呼び出してもEOFを検出しない 現在EOFにある状態でfgetc(fp);を呼び出して初めてfeof(fp)は0以外を返す while( fgetc(fp)!=EOF ) { byte++; } にすればよいかと
- 167 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:09:12 ]
- >>165
feofはファイルの最後に来たら0返すんじゃなくて ファイルの最後(EOF)の読み込み終わったら0返すんじゃなかったっけ? あとfseekとftell使ってないのはループの仮定でなんか処理入れてるから?
- 168 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:21:53 ]
- >>151
仕事のときには書いたほうがいいよ。 >>96みたいなコードに、return省略するなってツッコミ入れるやつって、 単に揚げ足とりたいだけなんだよ。 returnとfclose()の省略はめっちゃ釣れる書き方だな。 べつに釣ろうと思って書いてるわけじゃないけど。
- 169 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:23:28 ]
- >>166-167
なるほど… うーん難しい
- 170 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:30:11 ]
- >>167
追記 その二つを使っていないのはとても簡単な理由 まだ知らないからだ 開く・閉じる・EOF検知・エラー検知の関数の解説が終わって練習問題にあった
- 171 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:39:57 ]
- ということは、
/* f1の内容をtempにコピー */ while( !feof(f1) ) { ch = fgetc(f1); if( !feof(f1) ) fputc(ch, temp); } で判定が重複してるのも同じ理由? ものすごく使いづらい気がするんですが…
- 172 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:41:46 ]
- そもそもファイルの終端を検出するのに
feofはあまり使わない気がするんだが。 普通入出力関数の戻り値で判定できるし。
- 173 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:44:43 ]
- feofなんて知らなかった
- 174 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:46:41 ]
- >>171
こういうふうに書いてみるとか。 while (1) { ch = fgetc(f1); if (feof(f1)) break; fputc(ch, temp); } ループに突入する前にf1のリードが入ってると、>>171と動作がちがっちゃうけど。
- 175 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:50:44 ]
- ちょっと調べてみるとやっぱり他の処理と組み合わせるなら>>165のようにしたほうがいいって書いてあるな…
しかも解答はあくまでコードだけで説明ないからわからん 危うく\(^o^)/オテアゲ 回答者感謝
- 176 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:53:31 ]
- fgetc()は、エラーとファイル終わりでEOFを返すとあるけど、
feof()はferror()と別関数になってるね。 fgetc()がエラーで、EOFを返すような場合、feof()でループの終了判定してると、 無限ループになったりしないのだろうか。
- 177 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:13:05 ]
- しないだろ。
- 178 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:20:44 ]
- でも可能性は低いだろうけど
while(!feof(fp)) { ch=fgetc(fp); if(ch!=EOF) fputc(ch,fp); } ってコードがあったとして fgetc()がエラーでEOF返し続けるといつまでたっても !feof(fp) が偽にならず 無限ループになるんじゃない?
- 179 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:23:25 ]
- よく見たらアンカおかしかった
>>175 × >>165 ○ >>166 おかげでようやく次に進めました 改めて感謝
- 180 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:28:02 ]
- >>177
ためしてみたら、なった。
- 181 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:01:02 ]
- 教科書でfgets()を使ってstr[]にテキストファイルから文字を格納する、ってところで
FILE *fp; char str[80]; fgets(str, 79, fp); のように79になってるのはなんでだろう ・str[80]は0-80で(ヌル入れて)81字 ・fgets()は指定された数-1まで読み込んで最後にヌルと改行文字をつける だったらfgets()で80を指定すれば 79字まで読み込み→最後にヌルと改行文字→81字 でstr[80]にぴったりだと思うんだけど… なんか後半に進んでいくにつれて説明がはしょられるようになってわからないところが多くなってきた…
- 182 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:05:14 ]
- >>181
間違いだらけ。 ・先ずその糞本を晒せ。 ・char str[80]は80要素、つまり0-79しかない。 ・fgets()のパラメータは、そのような使い方の場合fgets(str, sizeof(str), fp)とするのが常道。 ・マニュアルページを読めば判るように、fgets()はそれで巧くやってくれる。
- 183 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:05:44 ]
- ・str[80]は0-79で(ヌル入れて)80字
だったらfgets()で79を指定すれば 79字まで読み込み→最後にヌルと改行文字→80字 でstr[80]にぴったりだと思うんだけど…
- 184 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:06:38 ]
- fgetsの第二引数はターミネータを含めた長さ
規格嫁やボケ
- 185 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:07:31 ]
- >>183
>182をよく読め。
- 186 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:08:35 ]
- その教科書書いた奴が無知だっただけ。
80でおk。
- 187 名前:だからと言って、79なんてもっと書くな mailto:sage [2007/07/29(日) 01:12:29 ]
- だから80なんて書くなって。
- 188 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:18:51 ]
- 教科書がウンコってのはわかるけど、>>181が攻められすぎだろ。
- 189 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:21:45 ]
- 自分で調べもせずにぞっき本を盲信してうだうだ言うからだろ
- 190 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:22:48 ]
- すまん、俺が勝手に勘違いして覚えてる可能性が存分にあるので本叩きは待ってくれ
っていうかむしろまず間違いなく俺が原因だ 何をトチ狂ったか ・str[80]は0-80で(ヌル入れて)81字 なんて書いたが、落ち着いて考えてみたら0-79+ヌルで80になるってのは理解してた 暑さとよくわからん解説でダレてボケたとしかいいようがない… ということは1字ズレるということもなくしっかり収まるのかな? 自分に呆れてしまう…本当に申し訳ない
- 191 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:27:09 ]
- >>190
もういい、一晩寝てから改めてレスをよく読め。
- 192 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:27:47 ]
- >>190
まだまちがっとる。 0-78+NUL(79) で 80だよ。
- 193 名前:181.190 mailto:sage [2007/07/29(日) 01:31:04 ]
- どうやらもう本格的にダメらしい
落ち着いて考えてきます 恥ずかしすぎる
- 194 名前:181.190 mailto:sage [2007/07/29(日) 01:50:55 ]
- ・[80]は要素の数だからそもそも[0]-[79]までしか存在しない
・文字列の場合さらにヌルが入るから[78]までしか使えない ・だからfgets()で79を指定するのは当然、-1なのも当然 これでいいんだよな…いいんだよな? 結局回答をトレースしただけだけど… 説明不足扱いしてごめんなさい教科書 何を質問したか忘れてしまいたいほどに恥をかいたがこれで今後間違えることはないはず 超くだらない質問にマジレスしてくれて本当にありがとう
- 195 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:55:32 ]
- だから、その教科書がおかしいってみんな言ってるだろ。
- 196 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 02:12:11 ]
- >>194
・だからfgets()で79を指定するのは当然、-1なのも当然 fgetsの第2引数はナルターミネータを含んだ長さ(即ち80)だと何度言えばわかってくれるんだ
- 197 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 02:22:44 ]
- >>196
80を指定したら79まで(-1された数まで)文字が入るのはつまりそういうことだよね ここがみんなの言ってた本の悪いところか… それすらわかってなかった俺お先真っ暗 ちなみに本は「独習C 第3版」です この本がやるからにはなにかあると思ったんだけど過信しすぎだったか
- 198 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 02:23:01 ]
- すみません 質問をしたいのですが
コマンドラインから 「読込ファイル名」「出力ファイル名」を入力し 読込ファイル名は「絶対パス」「相対パス」「ファイル名」の3つを入力をします 「絶対パス」「相対パス」の中で ディレクトリの読込権限 または ファイルの読込権限がなかった場合を判定したいです。 access関数の使用をしているのですが ディレクトリの読込権限をどのように判定すれば良いのか どなたかご教授あ願い致します。
- 199 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 02:53:19 ]
- >>198
access()はディレクトリにも使えるよ。
- 200 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 03:27:18 ]
- >>198
ありがとうございます ただ僕が悩んでいる所は if(access(Yname ,R_OK)==0){ printf("読込可能ファイルアクセス権限があります"); } if(access(Yname ,R_OK)!=0){ //←この部分の判断です printf(""); //ここのメッセージは2つの可能性があります } 2度目の判断文で ディレクトリでエラーが発生した場合は 「ディレクトリのアクセス権限がありません」と表示し ファイルが存在したがアクセス権限がなかった場合は 「ファイルのアクセス権限がありません」 と表示したいです 読込エラー発生時に「ディレクトリ」で発生したのか 「ファイル読込」で発生したのかを判断したいのですが どうにもうまく思いつきません。 もう少しヒントをお願い致します。
- 201 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 03:39:39 ]
- >>200
www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html ディレクトリかどうかは、statで判定できるよ。
- 202 名前:198 mailto:sage [2007/07/29(日) 07:13:13 ]
- >>201
ありがとうございます ただ statを使って2つのエラーメッセージを使い分ける 方法がちょっと見えて来ないんですが 少し詳しくご教授お願い致します。
- 203 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 07:18:08 ]
- >>202
ディレクトリとファイル名に分割してディレクトリを調べてみるしかないんじゃね? #つーか、errnoじゃだめなんか?
- 204 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 07:36:49 ]
- >>202
こんな感じかね。 if(access(Yname ,R_OK)!=0){ struct stat sb; if (stat(Yname, &sb) == 0) { if (sb.st_mode & S_IFMT == S_IFDIR) puts("ディレクトリのアクセス権限がありません"); else puts("ファイルのアクセス権限がありません"); } }
- 205 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:35:08 ]
- >>203
>>204 ありがとうございます 「ファイル読込に失敗した時に」 「ファイルが存在する場合」 までは理解できたのですが if (sb.st_mode & S_IFMT == S_IFDIR) この部分がちょっと自身がないのですがこういった意味なのですか? 「ファイルの種類がディレクトリならば」と言う意味で 絶対パスでこのように指定した場合(erroeがアクセス権限なしのディレクトリ) [ c:/dir/dir2/error/hoge.txt ] [ c: ]にアクセス権限があるか? [ dir ]にアクセス権限があるか? [ dir2 ]にアクセス権限があるか? [ error ]にアクセス権限があるか? を if (sb.st_mode & S_IFMT == S_IFDIR) の一文で調べ [ error ]にアクセス権限がなかったため puts("ディレクトリのアクセス権限がありません"); と表示されると言う事ですか?
- 206 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:57:52 ]
- >>203
後 errno についても調べてみたのですが 機能としては if(access(Yname ,R_OK)==0) などで 失敗をした場合にどんなエラーが発生をしたかを返す と言う事ですか? C言語は始めたばかりでerrnoの存在を知らずに居たので 使えるかどうかはちょっと分からないです・・・
- 207 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 14:09:38 ]
- すみません質問です。
static void test( lpfunc func ) { (void) func; } のように関数のアドレスを受け取り、 代入も何もせずvoidにキャストしているだけ(?)の場合 どういう意味があるのか教えてください。
- 208 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:48:47 ]
- >>207
それだけ見る限り、何の意味もなさそうだ。 func()としていればその関数を呼ぶことになるわけだが。
- 209 名前:207 mailto:sage [2007/07/29(日) 17:32:15 ]
- >>208
すみません情報が足りませんでした。 元のソースは以下になります。(nasm091) static void bin_init (FILE *afp, efunc errfunc, ldfunc ldef) { fp = afp; error = errfunc; (void) ldef; /* placate optimisers */ start_point = 0; /* default */ textsect.contents = saa_init(1L); datasect.contents = saa_init(1L); textsect.length = datasect.length = 0; textsect.index = seg_alloc(); datasect.index = seg_alloc(); bsslen = 0; bssindex = seg_alloc(); relocs = NULL; reloctail = &relocs; }
- 210 名前:エスパー mailto:sage [2007/07/29(日) 17:39:11 ]
- >>209
関数を改良してたらその引数は使わなくなった ↓ でも、よそから使われてるから、いまさらインターフェイス変えられない ↓ 残してると、引数が使われてないとコンパイラが警告を出す ↓ 無意味に使ってやるか…
|

|