- 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/
- 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
関数を改良してたらその引数は使わなくなった ↓ でも、よそから使われてるから、いまさらインターフェイス変えられない ↓ 残してると、引数が使われてないとコンパイラが警告を出す ↓ 無意味に使ってやるか…
- 211 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:46:01 ]
- placate optimisers って書いてあるから、コンパイラが出す「変数つかってねーぞ」っていう
ワーニングを抑制するための参照だろう。
- 212 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:48:32 ]
- リロード(T=T)
- 213 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 17:51:41 ]
- 質問なのですが。
構造体の中の構造体の中にポインタの構造体を宣言しているのですが、 最下層であるポインタの構造体のメンバを出力させてたいのですが、..->ではないのでしょうか? これだと何故かエラーになり...で出力できます。
- 214 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 17:55:33 ]
- 何言ってるか分からんが、言ってる通りなら -> だ
とりあえずソース貼れ
- 215 名前:207 mailto:sage [2007/07/29(日) 17:55:35 ]
- >>210
>>211 よく分かりました。ありがとうございます。
- 216 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 19:06:35 ]
- struct C{
int num5; char str6; char str7[20]; }; struct B{ int num3; int num4; srtuct C *c; } struct A { int num1; int num2; struct B b; } これでC構造体のメンバを全て出力させてさせたいのですが、..−>では エラーになり...でstr7などが何故か出力されます。
- 217 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:04:58 ]
- 何がいいたいのかわからんが
A a; a.b.c->num5; a.b.c->str6; a.b.c->str7; でよくね
- 218 名前:198 mailto:sage [2007/07/29(日) 20:34:19 ]
- アロー演算子で出力出来なくて
ドット演算子で出力できる理由をしりたいのかな?
- 219 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 21:31:52 ]
- 構造体からはドット演算子、構造体のポインタからはアロー演算子。
- 220 名前:デフォルトの名無しさん [2007/07/29(日) 22:06:57 ]
- ご丁寧に有難う御座います、しかし、...で出力されてアローがエラーになる理由がわかりません。
218さんわかりますでしょうか?
- 221 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:12:33 ]
- 再現する最低限の、確実にコンパイルできるソースを晒せ。
- 222 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:31:36 ]
- >>53->>56
回答求む
- 223 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:34:23 ]
- 宿題スレ行け
- 224 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:34:51 ]
- >>220
なりません。 だからとっととソースを晒せと
- 225 名前:デフォルトの名無しさん [2007/07/29(日) 22:50:36 ]
- 質問です。
4元1次連立方程式のデータはcとcheckの2つの配列に入力されますが、何故でしょうか? また、1つの配列に入力して済ませる方法はありますか?宜しくお願いします。 void inputdata(double c[4][5],double check[4][5]) int ie ,ic;
- 226 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:55:01 ]
- >>225
その質問に答えられるってどんなエスパーですかw
- 227 名前:デフォルトの名無しさん [2007/07/29(日) 22:58:25 ]
- 4元1次連立方程式ってなに?
調べるのめんどいからおせーて
- 228 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:04:38 0]
- >>225
そんなんで分かるわけねーだろwww
- 229 名前:225 [2007/07/29(日) 23:09:32 0]
- >>226
ゴメンなさいww何処まで書けばいいのやらで(汗 >>227 変数が四つ入ってる式のこと・・・だと思います。 例として・・・w+x+y+z=20 3w+x+y+5z=18 (w,x,y,zは全て変数)
- 230 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:15:55 0]
- >>229
さぼらずに全部書け ソースも書け 問題も書け 環境も書け 出題基も書け 何もかも書け 全て書け とにかく書け
- 231 名前:225 [2007/07/29(日) 23:23:15 0]
- 以下、プログラムです。長くて申し訳ありません。
#include<stdio.h> #include<math.h> void inputdata (double [4][5],double [4][5]); void calsol (double [4][5],double [4]); void elimination (double [4][5],double [4][5]); void pivot (int *,double [4][5],int *); void outputdata (double[4]); void checksol (double [4][5],double[4]); main(){ double c[4][5],check[4][5],x[4]; inputdata(c,check); calsol(c,x); outputdata(x); checksol(check,x); return (0); } void inputdata(double c[4][5],double check[4][5]){ int ie ,ic; printf("-----\n"); printf("Input Data\n"); printf("(a0*x0 + a1*x1 + a2*x2 + a3*x3 = a4)\n"); printf("\n"); for(ie=0;ie<=3;ie++){ printf("Equation %d\n",ie); printf("Input a0 a1 a2 a3 a4\n"); for(ic=0;ic<=4;ic++){ scanf("%lf",&c[ie][ic]); check[ie][ic] = c[ie][ic]; } } }
- 232 名前:225 [2007/07/29(日) 23:24:58 0]
- 続きです。
void calsol(double c[4][5],double x[4]){ double cc[4][5]; elimination(c,cc); x[3]=cc[3][4]; x[2]=cc[2][4]-cc[2][3]*x[3]; x[1]=cc[1][4]-cc[1][3]*x[3]-cc[1][2]*x[2]; x[0]=cc[0][4]-cc[0][3]*x[3]-cc[0][2]*x[2]-cc[0][1]*x[1]; } void elimination(double c[4][5],double cc[4][5]){ int ie,ic,ienew,imax,eli; eli=0; while(eli<4){ pivot (&eli,c,&imax); cc[eli][eli]=1; for(ie=eli+1;ie<=4;ie++){ cc[eli][ie]=c[imax][ie]/c[imax][eli]; } ienew = 0; for(ic=0;ic<=3-eli;ic++){ if(ie != imax){ for(ie=eli+1;ie<=4;ie++){ c[ienew][ie] = c[ic][ie]-cc[eli][ie]*c[ic][eli]; } ienew = ienew + 1; } } eli =eli + 1; } }
- 233 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:29:03 0]
- >>225
>4元1次連立方程式のデータはcとcheckの2つの配列に入力されますが、何故でしょうか? 片方は、答えだした後、チェック用に使ってるだけじゃん 何が聞きたいのかよく分からんのだが…
- 234 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:31:29 0]
- チェック用に使っている事を理解できなかったから質問したのでは?
- 235 名前:225 [2007/07/29(日) 23:44:36 0]
- >>233
返信ありがとうございます。 検算用に使っているだけ、ということですか。わかりました。 検算の他に理由があるのかが分からなかったので質問させて頂きました。 これら二つをまとめてプログラムすることは可能でしょうか。
- 236 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:52:54 0]
- 1つの配列でどうやって検算するんだよ
- 237 名前:198 mailto:sage [2007/07/29(日) 23:55:19 0]
- >>198です
ディレクトリのアクセス権限ですが以下の方法でやってみました レビューをお願い致します。 絶対パスで[c:/dir1/dir2/yomikomi.txt]まで入力します。 ファイルの権限とディレクトリの権限を調べるにはこれで問題ないでしょうか? お願い致します。 main(int argc , char *argv[]){ char *Yname = argv[1] , *Sagyou = argv[1]; struct stat sb, struct stat sa; int Loop , LenYname = strlen(Yname); for(Loop = LenYname ; Loop >= 0 ; Loop--){ if(Sagyou[Loop] == '/'){ Sagyou[Loop] = '\0'; break; } } if(stat(Sagyou , &sa) == 0){ if(access(Sagyou , 04 /*R_OK*/)!=0) puts("ディレクトリのアクセス権限がない"); } if(stat(Yname, &sb) == 0) { if(access(Yname , 04 /*R_OK*/)==0) puts("ファイルのアクセス権限がある"); if(access(Yname ,04/*R_OK*/)!=0) puts("ファイルのアクセス権限がない"); } } </pre>
- 238 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:09:22 ]
- >>237
・YnameとSagyouが共にargv[1]を指してしまうので、Sagyou[Loop]に書き込むことでYnameとしても同様に短くなってしまう。 ・できればargv[1]からのエリアはは書き変えないほうがいい。 ・strcpy()やstrrchr()を使え。 ・ディレクトリ区切りにバックスラッシュを使われたらどうするんだ?
- 239 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:36:52 ]
- >>238
ありがとうございます 質問ですが Yname と Sagyouはポインタを使わず配列を 使ったほうが良いという事ですか?
- 240 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:30:47 ]
- んだね。
- 241 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 09:07:47 ]
- #include<pic.h>
#include"delay.h" main() { unsigned short i=0; unsigned short d[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; __CONFIG(XT & WDTDIS & PWRTEN & UNPROTECT); __IDLOC(0100); TRISA = 0x00; TRISB = 0x00; PORTA = 0x01; PORTB = 0x00; while(1){ if(RA3==1){DelayMs(500);} if(RA3==1){i++;} if(RA4==1){DelayMs(500);} if(RA4==1){i--;} PORTB=d[i]; if(i==10){ i=0;} if(i=-1){ i=9; }}}
- 242 名前:241 mailto:sage [2007/07/31(火) 09:18:24 ]
- 7セグLEDを光らすプログラムを作っていて、スイッチRA3を押すと+1、RA4を押すと-1で,
0123456789012...とループするプログラム作ろうとしているのですが、 一番最後にループするために代入する式を入れてからなんか動きがおかしくなりはじめました。 どうすれば直るでしょうか?
- 243 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 09:21:05 ]
- >>242
if(i=-1)
- 244 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 09:43:05 ]
- だから条件式はリテラルを先に置けとあれほど
- 245 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:15:50 ]
- そんな気持ち悪い書きかたを人に強制するな
- 246 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:45:44 ]
- コンパイル通らなくなって原因が分りやすいってのは利点なんだろうけど、どうにも受け付けない。
しょっちゅうそんなミスするわけでもないし、ミスっても大概のコンパイラで警告出るだろ。
- 247 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:04:18 ]
- 書いた人間がちゃんと警告を出せるコンパイラでチェックする手間と、
読む人間(書いた当人の数ヵ月後も含む)が毎回混乱する無駄を考えればどちらがいいかは一目瞭然。
- 248 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:09:00 ]
- 最近の人間はlintとか使わんわけ?
- 249 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:12:09 ]
- そんなミスが頻発し、すぐに対応できずに混乱しちゃうようなら必須なのかもね。
- 250 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:13:54 ]
- お前らんとこには優秀なコーダーが揃ってるんだな…
- 251 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:49:52 ]
- = にしたら大抵警告が出るのに、リテラル前に書くメリットは皆無。
- 252 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 14:49:23 ]
- while (num = fread(buf, size, max, fs)) {}
って書く時に警告でたらうっとおしくない? リテラルは前に書くことはないけど
- 253 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 14:52:43 ]
- >>250
俺を雇ってみる? 32歳実務経験なしだけど
- 254 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 14:54:24 ]
- まあリテラルを前に書く習慣をつけるほど注意深い人は、
=と間違うミスはまずしないし、すぐ気がつくだろうという矛盾が
- 255 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 14:56:12 ]
- >>252
while ((num = fread(buf, size, max, fs))) {}
- 256 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 15:23:46 ]
- カッコがちょっとうっとおしいな
会社で演算子の優先度が分かりにくいから 条件式に全部カッコつけろって言われた 一般的にはそうなの?
- 257 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 15:43:53 ]
- まぁ、論理演算子や関係演算子、ビットシフト演算子は括るのが多いかな。
- 258 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 15:45:20 ]
- しまった、代入演算子もだ。
- 259 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:05:47 ]
- ちょっとでも他人が迷いそうなやつはつけてる
優先順位表さっと見られる状態に無い場合もあるしな
- 260 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:12:24 ]
- ((A == B) && (C ==D)) || (E == F)
みたいな感じか? 流石に鬱陶しいから、俺ならこう書くけど。 (A == B && C == D) || E == F このカッコは動作に影響はないけど書く。
- 261 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 17:38:21 ]
- #include <stdio.h>
void func(int* num1, int* num2) { *num1+=1; *num2++; } int main(void) { int num1=0; int num2=0; func(&num1, &num2); printf("%d %d\n", num1, num2); return 0; } なんでこのプログラムの実行結果はこうなりますか
- 262 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 17:45:55 ]
- どうなるんだよ
|

|