C言語なら俺に聞け(入門篇) Part 17at TECH
C言語なら俺に聞け(入門篇) Part 17 - 暇つぶし2ch143:デフォルトの名無しさん
07/07/28 12:49:21
>>136
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 

動作が未定義じゃなくて、リターン値が未定義なだけだから、省略は可能。




144:デフォルトの名無しさん
07/07/28 12:51:03
>>143
もっと読解力をつけた方がいい。

145:デフォルトの名無しさん
07/07/28 12:54:21
>>144
>>143の理解でまったく問題ありません。

146:デフォルトの名無しさん
07/07/28 13:02:56
URLリンク(uploader.fam.cx)

147:デフォルトの名無しさん
07/07/28 13:05:23
>>146
それが何か?

148:デフォルトの名無しさん
07/07/28 13:38:29
>>145
return 0; を期待して return を省略する事はできない、と言ってるんだよ。

149:デフォルトの名無しさん
07/07/28 13:39:53
main が未定義値を返した時の動作が未定義なら、
return を省略する事はできないと言える。
で、どうなんだ?

150:デフォルトの名無しさん
07/07/28 13:55:00
>>148
かなり前から、リターン値は未定という前提で、話は進んでます。

>>149
リターン値は未定義でも、動作は未定義じゃないよ。

151:デフォルトの名無しさん
07/07/28 15:51:08
どうせこうなるんならめんどくても書いたほうがいいと思う初心者だが、
プロはやっぱり出来る限り省略しないといけないぐらい(納期とか)厳しいんだろうか

152:デフォルトの名無しさん
07/07/28 15:54:16
逆だな、普通に書いておくもんだ。

153:デフォルトの名無しさん
07/07/28 16:09:10
return 0;
を書くことで時間が足りなくなることなんてまずないだろw

154:デフォルトの名無しさん
07/07/28 16:37:20
>>150
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。

> return 0; を期待して return を省略する事はできない、と言ってるんだよ。
ということ。
リターン値が未定だからこそ、そうなる。

155:151
07/07/28 16:38:56
いやでもほら、プロの悲惨な現場、って感じの読み物とか時々読んで鬱になるわけだけど、
そこで数万行のコードの話とか出るじゃん
チリも積もれば山となるのかなーと

どちらにせよ初心者が省略なんて覚えたらロクなことにならなそうなんでちゃんと書こうと思った

156:デフォルトの名無しさん
07/07/28 16:41:44
ソースコードが何万行もあってもmain関数が何万個もあるわけじゃないだろw

157:デフォルトの名無しさん
07/07/28 16:43:29
いやだって、プログラム単体ならmain()なんて一個しかないわけだし、
複数プログラムを連携させるようなアプリケーションなら戻り値は必要になるし、
どっちにしても省略するメリットなんて無いよ。
#行単価なんてしょうもない契約だったら尚更省略しないだろうし。

158:デフォルトの名無しさん
07/07/28 16:45:26
そういえばmain関数の話だった
俺アホス

159:デフォルトの名無しさん
07/07/28 17:06:30
return 0; なんて1秒もかからんちん

160:デフォルトの名無しさん
07/07/28 18:07:53
return 0 つー、正常終了なら0を返すという決まりは
UNIXLinuxシステムの依存ものだから
exit(EXIT_SUCCESS); を薦めておく

161:デフォルトの名無しさん
07/07/28 18:09:50
EXIT_SUCCESSが0であることも規格で決まってなかったっけ?

162:デフォルトの名無しさん
07/07/28 20:27:13
決まってる。
main 関数の戻り値は 0 は正常終了、1 は異常終了、
その他は処理系定義という形で規定されている。

163:デフォルトの名無しさん
07/07/28 20:37:44
main の戻り値 = プログラムがその呼び出し元にどういう値を返すか ではないからな。

環境依存の部分は main から戻ったあとで処理系が勝手にやってくれる。

164:デフォルトの名無しさん
07/07/28 20:48:04
C99を使えばmainのreturn 0;は省略できるのに。

165:デフォルトの名無しさん
07/07/28 20:57:21
無限ループに突入したところに恐縮ながら質問するぜ

while( !feof(fp) ) {
 fgetc(fp);
 byte++;
}

で何バイトか計算するんだけど、実際より1バイト大きくなるのはなんでだぜ?
と書いてて気付いたが前判定だから最後のインクリメントが一回分余計なのかな?

166:デフォルトの名無しさん
07/07/28 21:08:26
>>165
fgetc(fp); で最後の一文字を読み込んとすると今はEOFの場所にあるわけだが
その状態でfeof(fp)を呼び出してもEOFを検出しない
現在EOFにある状態でfgetc(fp);を呼び出して初めてfeof(fp)は0以外を返す

while( fgetc(fp)!=EOF ) {
 byte++;
}
にすればよいかと

167:デフォルトの名無しさん
07/07/28 21:09:12
>>165
feofはファイルの最後に来たら0返すんじゃなくて
ファイルの最後(EOF)の読み込み終わったら0返すんじゃなかったっけ?
あとfseekとftell使ってないのはループの仮定でなんか処理入れてるから?

168:デフォルトの名無しさん
07/07/28 21:21:53
>>151
仕事のときには書いたほうがいいよ。
>>96みたいなコードに、return省略するなってツッコミ入れるやつって、
単に揚げ足とりたいだけなんだよ。
returnとfclose()の省略はめっちゃ釣れる書き方だな。
べつに釣ろうと思って書いてるわけじゃないけど。


169:デフォルトの名無しさん
07/07/28 21:23:28
>>166-167
なるほど…
うーん難しい

170:デフォルトの名無しさん
07/07/28 21:30:11
>>167
追記
その二つを使っていないのはとても簡単な理由
まだ知らないからだ

開く・閉じる・EOF検知・エラー検知の関数の解説が終わって練習問題にあった

171:デフォルトの名無しさん
07/07/28 21:39:57
ということは、

/* f1の内容をtempにコピー */

while( !feof(f1) ) {
ch = fgetc(f1);
if( !feof(f1) ) fputc(ch, temp);
}

で判定が重複してるのも同じ理由?
ものすごく使いづらい気がするんですが…

172:デフォルトの名無しさん
07/07/28 21:41:46
そもそもファイルの終端を検出するのに
feofはあまり使わない気がするんだが。
普通入出力関数の戻り値で判定できるし。

173:デフォルトの名無しさん
07/07/28 21:44:43
feofなんて知らなかった

174:デフォルトの名無しさん
07/07/28 21:46:41
>>171
こういうふうに書いてみるとか。

while (1) {
  ch = fgetc(f1);
  if (feof(f1))
    break;
  fputc(ch, temp);
}

ループに突入する前にf1のリードが入ってると、>>171と動作がちがっちゃうけど。

175:デフォルトの名無しさん
07/07/28 21:50:44
ちょっと調べてみるとやっぱり他の処理と組み合わせるなら>>165のようにしたほうがいいって書いてあるな…

しかも解答はあくまでコードだけで説明ないからわからん
危うく\(^o^)/オテアゲ

回答者感謝

176:デフォルトの名無しさん
07/07/28 21:53:31
fgetc()は、エラーとファイル終わりでEOFを返すとあるけど、
feof()はferror()と別関数になってるね。
fgetc()がエラーで、EOFを返すような場合、feof()でループの終了判定してると、
無限ループになったりしないのだろうか。

177:デフォルトの名無しさん
07/07/28 22:13:05
しないだろ。

178:デフォルトの名無しさん
07/07/28 22:20:44
でも可能性は低いだろうけど
while(!feof(fp))
{
ch=fgetc(fp);
if(ch!=EOF) fputc(ch,fp);
}
ってコードがあったとして fgetc()がエラーでEOF返し続けるといつまでたっても !feof(fp) が偽にならず
無限ループになるんじゃない?

179:デフォルトの名無しさん
07/07/28 22:23:25
よく見たらアンカおかしかった

>>175
× >>165
○ >>166

おかげでようやく次に進めました
改めて感謝

180:デフォルトの名無しさん
07/07/28 22:28:02
>>177
ためしてみたら、なった。

181:名無しさん@そうだ選挙に行こう
07/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:名無しさん@そうだ選挙に行こう
07/07/29 01:05:14
>>181
間違いだらけ。
・先ずその糞本を晒せ。
・char str[80]は80要素、つまり0-79しかない。
・fgets()のパラメータは、そのような使い方の場合fgets(str, sizeof(str), fp)とするのが常道。
・マニュアルページを読めば判るように、fgets()はそれで巧くやってくれる。

183:名無しさん@そうだ選挙に行こう
07/07/29 01:05:44
・str[80]は0-79で(ヌル入れて)80字

だったらfgets()で79を指定すれば
79字まで読み込み→最後にヌルと改行文字→80字
でstr[80]にぴったりだと思うんだけど…

184:名無しさん@そうだ選挙に行こう
07/07/29 01:06:38
fgetsの第二引数はターミネータを含めた長さ
規格嫁やボケ

185:名無しさん@そうだ選挙に行こう
07/07/29 01:07:31
>>183
>182をよく読め。

186:名無しさん@そうだ選挙に行こう
07/07/29 01:08:35
その教科書書いた奴が無知だっただけ。
80でおk。

187:だからと言って、79なんてもっと書くな
07/07/29 01:12:29
だから80なんて書くなって。

188:名無しさん@そうだ選挙に行こう
07/07/29 01:18:51
教科書がウンコってのはわかるけど、>>181が攻められすぎだろ。

189:名無しさん@そうだ選挙に行こう
07/07/29 01:21:45
自分で調べもせずにぞっき本を盲信してうだうだ言うからだろ

190:名無しさん@そうだ選挙に行こう
07/07/29 01:22:48
すまん、俺が勝手に勘違いして覚えてる可能性が存分にあるので本叩きは待ってくれ
っていうかむしろまず間違いなく俺が原因だ

何をトチ狂ったか

・str[80]は0-80で(ヌル入れて)81字

なんて書いたが、落ち着いて考えてみたら0-79+ヌルで80になるってのは理解してた
暑さとよくわからん解説でダレてボケたとしかいいようがない…

ということは1字ズレるということもなくしっかり収まるのかな?
自分に呆れてしまう…本当に申し訳ない

191:名無しさん@そうだ選挙に行こう
07/07/29 01:27:09
>>190
もういい、一晩寝てから改めてレスをよく読め。

192:名無しさん@そうだ選挙に行こう
07/07/29 01:27:47
>>190
まだまちがっとる。
0-78+NUL(79) で 80だよ。

193:181.190
07/07/29 01:31:04
どうやらもう本格的にダメらしい

落ち着いて考えてきます
恥ずかしすぎる

194:181.190
07/07/29 01:50:55
・[80]は要素の数だからそもそも[0]-[79]までしか存在しない
・文字列の場合さらにヌルが入るから[78]までしか使えない
・だからfgets()で79を指定するのは当然、-1なのも当然

これでいいんだよな…いいんだよな?
結局回答をトレースしただけだけど…
説明不足扱いしてごめんなさい教科書

何を質問したか忘れてしまいたいほどに恥をかいたがこれで今後間違えることはないはず
超くだらない質問にマジレスしてくれて本当にありがとう

195:名無しさん@そうだ選挙に行こう
07/07/29 01:55:32
だから、その教科書がおかしいってみんな言ってるだろ。

196:名無しさん@そうだ選挙に行こう
07/07/29 02:12:11
>>194
・だからfgets()で79を指定するのは当然、-1なのも当然
fgetsの第2引数はナルターミネータを含んだ長さ(即ち80)だと何度言えばわかってくれるんだ

197:名無しさん@そうだ選挙に行こう
07/07/29 02:22:44
>>196
80を指定したら79まで(-1された数まで)文字が入るのはつまりそういうことだよね

ここがみんなの言ってた本の悪いところか…
それすらわかってなかった俺お先真っ暗

ちなみに本は「独習C 第3版」です
この本がやるからにはなにかあると思ったんだけど過信しすぎだったか

198:名無しさん@そうだ選挙に行こう
07/07/29 02:23:01
すみません 質問をしたいのですが
コマンドラインから
「読込ファイル名」「出力ファイル名」を入力し
読込ファイル名は「絶対パス」「相対パス」「ファイル名」の3つを入力をします
「絶対パス」「相対パス」の中で
ディレクトリの読込権限 または
ファイルの読込権限がなかった場合を判定したいです。
access関数の使用をしているのですが
ディレクトリの読込権限をどのように判定すれば良いのか
どなたかご教授あ願い致します。


199:名無しさん@そうだ選挙に行こう
07/07/29 02:53:19
>>198
access()はディレクトリにも使えるよ。

200:名無しさん@そうだ選挙に行こう
07/07/29 03:27:18
>>198
ありがとうございます
ただ僕が悩んでいる所は
if(access(Yname ,R_OK)==0){
printf("読込可能ファイルアクセス権限があります");
}
if(access(Yname ,R_OK)!=0){    //←この部分の判断です
printf(""); //ここのメッセージは2つの可能性があります 
}

2度目の判断文で
ディレクトリでエラーが発生した場合は
「ディレクトリのアクセス権限がありません」と表示し
ファイルが存在したがアクセス権限がなかった場合は
「ファイルのアクセス権限がありません」
と表示したいです

読込エラー発生時に「ディレクトリ」で発生したのか
「ファイル読込」で発生したのかを判断したいのですが
どうにもうまく思いつきません。
もう少しヒントをお願い致します。




201:名無しさん@そうだ選挙に行こう
07/07/29 03:39:39
>>200
URLリンク(www.linux.or.jp)
ディレクトリかどうかは、statで判定できるよ。

202:198
07/07/29 07:13:13
>>201

ありがとうございます
ただ statを使って2つのエラーメッセージを使い分ける
方法がちょっと見えて来ないんですが
少し詳しくご教授お願い致します。

203:名無しさん@そうだ選挙に行こう
07/07/29 07:18:08
>>202
ディレクトリとファイル名に分割してディレクトリを調べてみるしかないんじゃね?
#つーか、errnoじゃだめなんか?

204:名無しさん@そうだ選挙に行こう
07/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:名無しさん@そうだ選挙に行こう
07/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:名無しさん@そうだ選挙に行こう
07/07/29 08:57:52
>>203

後 errno についても調べてみたのですが
機能としては  if(access(Yname ,R_OK)==0) などで
失敗をした場合にどんなエラーが発生をしたかを返す と言う事ですか?
C言語は始めたばかりでerrnoの存在を知らずに居たので
使えるかどうかはちょっと分からないです・・・

207:名無しさん@そうだ選挙に行こう
07/07/29 14:09:38
すみません質問です。
static void test( lpfunc func )
{
(void) func;
}
のように関数のアドレスを受け取り、
代入も何もせずvoidにキャストしているだけ(?)の場合
どういう意味があるのか教えてください。



208:名無しさん@そうだ選挙に行こう
07/07/29 16:48:47
>>207
それだけ見る限り、何の意味もなさそうだ。
func()としていればその関数を呼ぶことになるわけだが。

209:207
07/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:エスパー
07/07/29 17:39:11
>>209
関数を改良してたらその引数は使わなくなった

でも、よそから使われてるから、いまさらインターフェイス変えられない

残してると、引数が使われてないとコンパイラが警告を出す

無意味に使ってやるか…


211:名無しさん@そうだ選挙に行こう
07/07/29 17:46:01
placate optimisers って書いてあるから、コンパイラが出す「変数つかってねーぞ」っていう
ワーニングを抑制するための参照だろう。

212:名無しさん@そうだ選挙に行こう
07/07/29 17:48:32
リロード(T=T)

213:名無しさん@そうだ選挙に行こう
07/07/29 17:51:41
質問なのですが。
構造体の中の構造体の中にポインタの構造体を宣言しているのですが、
最下層であるポインタの構造体のメンバを出力させてたいのですが、..->ではないのでしょうか?
これだと何故かエラーになり...で出力できます。

214:デフォルトの名無しさん
07/07/29 17:55:33
何言ってるか分からんが、言ってる通りなら -> だ
とりあえずソース貼れ

215:207
07/07/29 17:55:35
>>210
>>211
よく分かりました。ありがとうございます。



216:名無しさん@そうだ選挙に行こう
07/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:名無しさん@そうだ選挙に行こう
07/07/29 20:04:58
何がいいたいのかわからんが

A a;
a.b.c->num5;
a.b.c->str6;
a.b.c->str7;

でよくね

218:198
07/07/29 20:34:19
アロー演算子で出力出来なくて
ドット演算子で出力できる理由をしりたいのかな?



219:デフォルトの名無しさん
07/07/29 21:31:52
構造体からはドット演算子、構造体のポインタからはアロー演算子。

220:デフォルトの名無しさん
07/07/29 22:06:57
ご丁寧に有難う御座います、しかし、...で出力されてアローがエラーになる理由がわかりません。
218さんわかりますでしょうか?


221:デフォルトの名無しさん
07/07/29 22:12:33
再現する最低限の、確実にコンパイルできるソースを晒せ。

222:デフォルトの名無しさん
07/07/29 22:31:36
>>53->>56
回答求む

223:デフォルトの名無しさん
07/07/29 22:34:23
宿題スレ行け

224:デフォルトの名無しさん
07/07/29 22:34:51
>>220
なりません。
だからとっととソースを晒せと

225:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/29 22:55:01
>>225
その質問に答えられるってどんなエスパーですかw

227:デフォルトの名無しさん
07/07/29 22:58:25
4元1次連立方程式ってなに?
調べるのめんどいからおせーて

228:デフォルトの名無しさん
07/07/29 23:04:38 0
>>225
そんなんで分かるわけねーだろwww

229:225
07/07/29 23:09:32 0
>>226
ゴメンなさいww何処まで書けばいいのやらで(汗

>>227
変数が四つ入ってる式のこと・・・だと思います。
例として・・・w+x+y+z=20 3w+x+y+5z=18 (w,x,y,zは全て変数)


230:デフォルトの名無しさん
07/07/29 23:15:55 0
>>229
さぼらずに全部書け
ソースも書け
問題も書け
環境も書け
出題基も書け
何もかも書け
全て書け
とにかく書け

231:225
07/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
07/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:デフォルトの名無しさん
07/07/29 23:29:03 0
>>225
>4元1次連立方程式のデータはcとcheckの2つの配列に入力されますが、何故でしょうか?

片方は、答えだした後、チェック用に使ってるだけじゃん
何が聞きたいのかよく分からんのだが…

234:デフォルトの名無しさん
07/07/29 23:31:29 0
チェック用に使っている事を理解できなかったから質問したのでは?

235:225
07/07/29 23:44:36 0
>>233
返信ありがとうございます。
検算用に使っているだけ、ということですか。わかりました。
検算の他に理由があるのかが分からなかったので質問させて頂きました。

これら二つをまとめてプログラムすることは可能でしょうか。

236:デフォルトの名無しさん
07/07/29 23:52:54 0
1つの配列でどうやって検算するんだよ

237:198
07/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:デフォルトの名無しさん
07/07/30 00:09:22
>>237
・YnameとSagyouが共にargv[1]を指してしまうので、Sagyou[Loop]に書き込むことでYnameとしても同様に短くなってしまう。
・できればargv[1]からのエリアはは書き変えないほうがいい。
・strcpy()やstrrchr()を使え。
・ディレクトリ区切りにバックスラッシュを使われたらどうするんだ?

239:デフォルトの名無しさん
07/07/30 00:36:52
>>238
ありがとうございます
質問ですが
Yname と Sagyouはポインタを使わず配列を
使ったほうが良いという事ですか?

240:デフォルトの名無しさん
07/07/30 01:30:47
んだね。

241:デフォルトの名無しさん
07/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
07/07/31 09:18:24
7セグLEDを光らすプログラムを作っていて、スイッチRA3を押すと+1、RA4を押すと-1で,
0123456789012...とループするプログラム作ろうとしているのですが、
一番最後にループするために代入する式を入れてからなんか動きがおかしくなりはじめました。
どうすれば直るでしょうか?

243:デフォルトの名無しさん
07/07/31 09:21:05
>>242
if(i=-1)


244:デフォルトの名無しさん
07/07/31 09:43:05
だから条件式はリテラルを先に置けとあれほど

245:デフォルトの名無しさん
07/07/31 10:15:50
そんな気持ち悪い書きかたを人に強制するな

246:デフォルトの名無しさん
07/07/31 10:45:44
コンパイル通らなくなって原因が分りやすいってのは利点なんだろうけど、どうにも受け付けない。

しょっちゅうそんなミスするわけでもないし、ミスっても大概のコンパイラで警告出るだろ。

247:デフォルトの名無しさん
07/07/31 11:04:18
書いた人間がちゃんと警告を出せるコンパイラでチェックする手間と、
読む人間(書いた当人の数ヵ月後も含む)が毎回混乱する無駄を考えればどちらがいいかは一目瞭然。

248:デフォルトの名無しさん
07/07/31 11:09:00
最近の人間はlintとか使わんわけ?

249:デフォルトの名無しさん
07/07/31 11:12:09
そんなミスが頻発し、すぐに対応できずに混乱しちゃうようなら必須なのかもね。

250:デフォルトの名無しさん
07/07/31 11:13:54
お前らんとこには優秀なコーダーが揃ってるんだな…

251:デフォルトの名無しさん
07/07/31 11:49:52
= にしたら大抵警告が出るのに、リテラル前に書くメリットは皆無。

252:デフォルトの名無しさん
07/07/31 14:49:23
while (num = fread(buf, size, max, fs)) {}
って書く時に警告でたらうっとおしくない?

リテラルは前に書くことはないけど

253:デフォルトの名無しさん
07/07/31 14:52:43
>>250
俺を雇ってみる?
32歳実務経験なしだけど

254:デフォルトの名無しさん
07/07/31 14:54:24
まあリテラルを前に書く習慣をつけるほど注意深い人は、
=と間違うミスはまずしないし、すぐ気がつくだろうという矛盾が

255:デフォルトの名無しさん
07/07/31 14:56:12
>>252
while ((num = fread(buf, size, max, fs))) {}

256:デフォルトの名無しさん
07/07/31 15:23:46
カッコがちょっとうっとおしいな

会社で演算子の優先度が分かりにくいから
条件式に全部カッコつけろって言われた
一般的にはそうなの?

257:デフォルトの名無しさん
07/07/31 15:43:53
まぁ、論理演算子や関係演算子、ビットシフト演算子は括るのが多いかな。

258:デフォルトの名無しさん
07/07/31 15:45:20
しまった、代入演算子もだ。

259:デフォルトの名無しさん
07/07/31 16:05:47
ちょっとでも他人が迷いそうなやつはつけてる
優先順位表さっと見られる状態に無い場合もあるしな

260:デフォルトの名無しさん
07/07/31 16:12:24
((A == B) && (C ==D)) || (E == F)

みたいな感じか?
流石に鬱陶しいから、俺ならこう書くけど。

(A == B && C == D) || E == F

このカッコは動作に影響はないけど書く。

261:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/31 17:45:55
どうなるんだよ

263:デフォルトの名無しさん
07/07/31 17:45:57
こうすれば期待通りかな?
(*num2)++;

264:デフォルトの名無しさん
07/07/31 17:50:09
優先順位の話してるときに優先順位の質問が来たw

265:デフォルトの名無しさん
07/07/31 19:53:07
>>263
なんでなんで?括弧がない場合は何がどうなってるの?

266:デフォルトの名無しさん
07/07/31 20:17:12
*num2++と書くと演算子の優先順位から*(num2++)ということになる。

num2++;という式文は次のように書くのと同等。
num2 = &num2[1];
ポインタに対する増分演算子は、次の要素へ進むことを意味し、
普通は配列を指すポインタでないと使い道がない。

ようするに*num2++ではポインタ型の変数そのものの値を書き換えているが、
ポインタが指す値は読み取るだけで、書き換えてはいない。


267:デフォルトの名無しさん
07/07/31 20:45:18
じゃあ括弧がない場合のprintfはnum2[1]の値が表示されるますか、あたまがこんがらがっちゃっちゃ

268:デフォルトの名無しさん
07/07/31 20:50:11
いや、それはない。

func内のnum2とmain内のnum2は別の変数。
func内でnum2自身の値をいくら書き換えようとも、呼出元のmainへは反映されない。
下のプログラムで0と出力されるのと同じ理屈。
void f(int x)
{
  x = 7;
}

void g()
{
  int i = 0;
  f(i);
  printf("%d\n", i);
}

269:デフォルトの名無しさん
07/07/31 20:57:10
*num2++;



*num2;
num2++;

と同じようなもんだと考えれば。

270:デフォルトの名無しさん
07/07/31 20:58:39
入出力で「1文字」って場合、1バイト分を指すの?

271:デフォルトの名無しさん
07/07/31 21:00:04
文脈による

272:241
07/07/31 21:13:26
>>243
サンクス。やってみます。

273:デフォルトの名無しさん
07/07/31 22:29:54
>>266>>268
簡潔かつ分かりやすい説明ありがとうございました。
なるほど。

274:デフォルトの名無しさん
07/07/31 23:18:39
>>272
???

275:デフォルトの名無しさん
07/08/01 00:00:20
質問
001 C言語によるプログラムの一般的な作成手順を述べよ。
002 C言語のプログラムのソースファイルの拡張子は何か。
003 ソースファイルからオブジェクトファイルを作ることを何というか。
004 オブジェクトファイルから実行ファイルを作ることを何というか。
005 講義で使ったコンパイラの名前を答えよ。
006 UNIX(LINUX)では実行ファイルの名前はどのようになるか。
007 デバッグとは何か。
008 C言語でプログラムに使う文字はどういうものか。
009 C言語の標準規格はどう呼ばれるか。
010 もっとも短い実行できるC言語のソースを書け。
011 main関数とは何か。
012 main関数の型は何か。
013 main関数の戻り値はどうなるか。
014 グローバル(大域)変数とローカル(局所)変数の違いを答えよ。
015 静的変数はどういうときに使われるか。
016 変数の基本データ型をいくつか答えよ。
017 初期値が1である整数変数iの宣言は。
018 変数のアドレスとは何か。
019 変数のアドレスを知るにはどうするか。
020 講義で使ったシステムの整数の範囲を答えよ。
021 配列(変数)とは何か。
022 100個宣言した配列(変数)の添え字の範囲は。


276:デフォルトの名無しさん
07/08/01 00:02:02
023 配列(変数)の初期値はどのように設定するか。
024 2次元配列はどのように宣言するか。
025 2次元配列はどのように並んでいるか。
026 構造体とは何か。
027 typedefとstructの役割はどう違うか。
028 #includeとは何か。
029 #include <stdio.h>の<>の意味は。
030 ヘッダファイルとは何か。
031 ヘッダファイルの拡張子は何か。
032 コメントとは何か。
033 コメントをソースに記入するのにはどうするか。
034 代入i=1の式としての値は何になるか。
035 整数変数iを1増やすのにどういう方法があるか。
036 printf関数は何をする関数か。
037 printf関数のfの由来は。
038 printf関数で改行させたいときには何を使うか。
039 printf関数で文字配列sの文字列を表示させたいときにはどう書くか。
040 整数変数iの値が1のときprintf("%d",--i);printf("%d",i++);でどういう表示がされるか。
041 整数変数dにscanf関数で整数をキーボード入力させる文を書け。
042 文字配列にscanf関数でキーボード入力するとき気をつけるべきことは。
043 文字リテラル'A'の整数としての値は。
044 'c'-'C'の値はいくらになるか。

277:デフォルトの名無しさん
07/08/01 00:03:22
045 文字の種類を判別するときにインクルードするヘッダファイルの名前は。
046 文字列と'\0'の関係は。
047 strcmp関数を使うときにインクルードするヘッダファイルの名前は。
048 文字列の長さを知るために使う関数は。
049 1*2+3の値はいくらになるか。
050 10%(-3)の値はいくらになるか。
051 ビット演算子の例をあげよ。
052 27&15の値はいくらになるか。
053 27|15の値はいくらになるか。
054 31>>2の値はいくらになるか。
055 int i,j;と宣言されているとき、&i-&jの絶対値はいくらか。
056 整数変数aの値が12から19までのときだけ「TEEN」の4文字を表示する文を書け。
057 (i>=0)?i:(-i)は何をする式か。
058 NULLとは何か。
059 for(i=0;i<10;i++)printf("!");という文では感嘆符は何回表示されるか。
060 for(i=10;i>-10;--i)if(i)printf("o");ではoは何文字表示されるか。
061 i=10;while(i){printf("+");--i;}では+は何文字表示されるか。
062 breakはfor,do,whileではどのような意味があるか。
063 continueはfor,do,whileではどのような意味があるか。
064 switch文ではcaseの最後にbreak文が必要なのはなぜか。
065 switch文でdefault:はどういう意味を持つか。
066 if(i==0){}else{printf("A");}を出来るだけ簡単に書き直せ。
067 関数のプロトタイプ宣言はなぜ必要か。
068 関数の値を返すのに使う予約語は。
069 ファイルを扱うときにインクルードするヘッダファイルの名前は。
070 ファイルを扱うときに使う構造体の型の名前は。

278:デフォルトの名無しさん
07/08/01 00:03:30
>>53

279:デフォルトの名無しさん
07/08/01 00:04:26
071 fopen関数の戻り値は何か。
072 fopen関数が実行に失敗するとどうなるか。
073 fprintf関数とprintf関数の引数の違いは。
074 fscanf関数で1行読み込むときの注意は。
075 getc関数はどのような引数と戻り値を持つ関数か。
076 EOFとは何か。
077 cが整数変数、fpが正しい状態でwhile(EOF!=(c=getc(fp)))printf("%c",c);を実行すると結果は。
078 fflush関数は何をする関数か。
079 fclose関数が実行に失敗するとどうなるか。
080 標準入力とは何か。
081 標準出力とは何か。
082 ファイル入出力でどのようなエラーが考えられるか。
083 マルチタスク環境でファイルをロックするとはどういうことか。
084 rand関数を扱うときにインクルードするヘッダファイルの名前は。
085 rand関数の返す整数の値はどのような名前で呼ばれるか。
086 擬似乱数のシードとは何か。
087 srand関数はrand関数とどのような関係にあるか。
088 32ビットのint型は10進数で何桁の精度になるか。

280:デフォルトの名無しさん
07/08/01 00:05:43
089 float型は十進数でほぼ何桁の精度になるか。
090 double型は十進数でほぼ何桁の精度になるか。
091 プログラムの処理の手順を一般に何と呼ぶか。
092 自分自身を呼び出すプログラムの手法を何というか。
093 キュー(待ち行列)とはどのようなものか。
094 スタックとはどのようなものか。
095 オーバーフローとは何か。
096 アンダーフローとは何か。
097 いわゆるセグメンテーションフォルトで中断した後にできるファイルを一般に何というか。
098 C言語を作ったのは誰か。
099 C言語の祖先に当たるプログラム言語は。
100 C言語はどういう種類のプログラム言語か。

281:デフォルトの名無しさん
07/08/01 00:07:06
>>53-56 を読んだら氏ね

282:デフォルトの名無しさん
07/08/01 00:09:33
読みましたよ。同じですね。答え教えて。

283:デフォルトの名無しさん
07/08/01 00:12:40
>>282
100回ググれ。全ての答えはそこにある。

284:デフォルトの名無しさん
07/08/01 00:13:14
何しに来たの?
死ねよマジで

285:デフォルトの名無しさん
07/08/01 00:20:20
なにしにって答え聞きに。

286:デフォルトの名無しさん
07/08/01 00:21:54
殺伐中のところお邪魔しますよ

問題:指定したテキストを、タブをスペースに置き換えて別ファイルとしてコピーする

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *from, *to;
char ch;
int tab, count=0;

if(argc!=3) {
printf("<test> <コピー元> <コピー先>\n");
exit(1);
}

if( (from=fopen(argv[1], "r")) ==NULL) {
printf("コピー元ファイル %s が開けません。" , argv[1]);
exit(1);
}

if( (to=fopen(argv[2], "w")) ==NULL) {
printf("コピー先ファイル %s が開けません。" , argv[2]);
exit(1);
}


287:デフォルトの名無しさん
07/08/01 00:23:58

while(!feof(from)) {
ch = fgetc(from);
if(ch=='\t') {
for(tab=count; tab<8; tab++)
fputc(' ' , to);
count=0;
}
else {
if(!feof(from)) fputc(ch, to);
count++;                 //※
if(count==8 || ch=='\n') count=0;  //※
}
}
fclose(from);
fclose(to);

return 0;
}

/* ここまで */

※の部分は何のために何の処理をしているんだろう

288:デフォルトの名無しさん
07/08/01 00:25:39
>>285
学校(がっこう)の先生(せんせい)か、パパやママにきいてみよう!

289:デフォルトの名無しさん
07/08/01 00:26:54
先生は教えてくれない。親は使えない

290:286-287
07/08/01 00:27:22
見づらくなってしまった…すいません
あと、
tab<8

count==8
の8は何の数なんだろう

291:デフォルトの名無しさん
07/08/01 00:34:48
>>290
実行して確認するとかしてみたのか?
「8」はタブ文字を8個のスペースにしてるだけだ。
for文の前後3行を読むだけでわかる。

292:デフォルトの名無しさん
07/08/01 00:36:33
>>291
ということは別に8である必要はないのかな

293:デフォルトの名無しさん
07/08/01 00:38:31
Windowsならデフォルトは8じゃないか?Linuxとかは知らん。
デフォルトって言葉が正しいかどうかは知らんが、メモ帳とかはそうだよな。
ってか、8が何かわからんかったら10にして実行してみろ。

294:デフォルトの名無しさん
07/08/01 00:47:45
なるほど
サントス

295:デフォルトの名無しさん
07/08/01 00:55:01
俺のはシカト?

296:デフォルトの名無しさん
07/08/01 01:08:45
おーい

297:デフォルトの名無しさん
07/08/01 01:46:27
#include <stdio.h>
main()
{
static int a[][3] = {{001, 010, 100}, {002, 020, 200}, {003, 030, 300}};

int i, j;

for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf("%d\t", a[i][j]);
}
putchar('\n');
}
}

このプログラムの実行結果が下のなんですがなぜそうなるかわかりません。
教えてください。

1 8 100
2 16 200
3 24 300


298:デフォルトの名無しさん
07/08/01 01:50:11
頭に0がついてると八進数になるから

299:デフォルトの名無しさん
07/08/01 01:50:36
0から始る場合8進数になるから


300:デフォルトの名無しさん
07/08/01 01:51:10
>>297
>{{001, 010, 100}, {002, 020, 200}, {003, 030, 300}}
これは0で始まってるから8進法で書かれてる
んでprintfでの出力は10進法になってる

301:デフォルトの名無しさん
07/08/01 01:51:16
#include <stdio.h>
main()
{
static char input[] = "B1LSWIELTECH1\1\11W\1EE1ELLST?";
int i, c;

for (i=0; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'B' : putchar('A'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('T');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 A SWITCH T ST?
A SWITCHから先の動きがわかりません。わかる方教えてください。

302:デフォルトの名無しさん
07/08/01 01:53:39
ってちょっと言い方がまずかったな
>{001, 010, 100}
たとえばこの部分の001と010が8進法で100は10進法ね

303:デフォルトの名無しさん
07/08/01 01:54:26
#include <stdio.h>
char input[] = "SSSWILTECH1\1\11W\1WALLMP1";

main()
{
int i, c;

for (i=2; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'a' : putchar('i'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('S');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 SWITCH SWAMP
同じ感じなんですが、SWITCHから先の動きがわかりません。お願いします。

304:297
07/08/01 02:00:39
ありがとうございます
解決しました

305:デフォルトの名無しさん
07/08/01 02:01:36
while ((c=input[++i]) != '\1' && c != '\0');
ここで条件が真の間、iが+1ずつされていく。
whileをぬけたらbreakが無いので次のputschar('T')が実行されて・・・
って感じだ。
デバッガあるならステップ実行してみればわかる。
なければwhileを弄れば多少わかる?
while ((c=input[++i]) != '\1' && c != '\0')puts("[while中]");

306:デフォルトの名無しさん
07/08/01 03:28:00
自分で考えるための方法を教える必要があるような状況だな。

307:デフォルトの名無しさん
07/08/01 11:32:27
リンカする前の実行ファイルを起動すると一瞬で消えるんだが何故でしょうか?

308:デフォルトの名無しさん
07/08/01 11:45:28
>>307
「リンカする」なんてことは通常できません。
リンクする前なら、それは実行ファイルになっていない筈です。
リンクされた実行ファイルについてなら、GUIを持たないプログラムを
GUIからダブルクリックで起動したら終了と同時に表示が消えるのは自明ですね。

309:デフォルトの名無しさん
07/08/01 11:50:37
Ctrl-F5で解決する例のあれか

310:デフォルトの名無しさん
07/08/01 12:29:44
昨日のお子様哀れすぎワロタ

311:初心者
07/08/01 15:14:36
構造体の数値データからcsv形式のファイルを作りたいのですが、どうすればいいでしょうか。教えていただけるとありがたいです。

312:デフォルトの名無しさん
07/08/01 15:24:33
構造体のメンバをcsv形式でファイルに書き込め

313:デフォルトの名無しさん
07/08/01 15:56:39
C++なら簡単に出来るからC++スレで質問するといいよ^^

314:デフォルトの名無しさん
07/08/01 15:58:15
まだ全然初歩のプログラムなのですが、わからないので教えてください。
プログラムファイル
入力データファイル
が用意されている。
問題
 文字データ中に含まれる文字の種類を調べるプログラムを作成しなさい。
[仕様]
・入力データ件数10件
  1件に最大100文字(半角とする)
  入力データは、文字型1次元配列(サイズ:101)に格納

・文字の種類は最大200種(文字型1次元配列使用)
 ただし、入力した文字中の改行(’¥n’)マークは処理対象外 とする

・文字コード順に並べ替えを行い出力する
・出力設計
 1行に最大25文字(文字区切りに1カラム空白)
 構成文字(並べ替え済み)を出力する

 X X X X X X X~~X X X X X X X

315:デフォルトの名無しさん
07/08/01 16:08:34
>>314
自分がどこまでできてて、どこがわからないのか明確に
丸投げなら宿題スレに

C/C++の宿題を片付けます 94代目
スレリンク(tech板)

316:デフォルトの名無しさん
07/08/01 17:11:26
プログラムは既に出来てるように思えた

317:デフォルトの名無しさん
07/08/01 18:41:55
>>314
です。入力データ、文字種を入力するところまではわかるのですが、どういう処理をすれば入力データに文字データが含まれているのか、また、そのデータを文字コード順に並べる処理がわからないです。アルゴリズムが浮かばなくて悩んでいます。お願いします。


318:デフォルトの名無しさん
07/08/01 18:47:33
文字の種類が200種なんだから、int の配列[200]を用意して
文字種ごとに足していけばよかろう。
まあ文字種そのものは256個あるから[256]作ったほうが楽ではあるが。

319:デフォルトの名無しさん
07/08/01 19:18:22
ちょっと今感動してる・・。
一ヶ月前の自分には解らなかった事が解るようになってる。
ニマニマしちゃうよ。

320:デフォルトの名無しさん
07/08/01 23:36:44
>>318
回答ありがとうございます。文字種類の配列を用意するのは理解できました。もし
int i,n
char moji[100],shu[200]で入力しおえて
文字種ごとに足していくにはどのように書けばよいのでしょうかか?


321:デフォルトの名無しさん
07/08/02 00:03:16
>>320
char shu[256]={0}
としたうえで

for(i=0;i<100;i++) {
shu[moji[i]]++;
}


322:デフォルトの名無しさん
07/08/02 00:25:13
>>321
素早い回答ありがとうございます。その文字種に含まれた文字はどのようにしたら文字コード順に並び替えられるのですか?

323:デフォルトの名無しさん
07/08/02 00:28:42
>>322
ちょっと根本的に分かってないみたいだけど
文字コードがインデックスになってるから

for(i < 256) {
for(j = 0 ; j < shu[i] ; j++){
putchar i
}
}

でおk

324:デフォルトの名無しさん
07/08/02 06:46:03
分布数えソートだな。

325:デフォルトの名無しさん
07/08/02 08:05:01
>>323
全然理解してなくて申し訳ないです。
回答ありがとうがざいました。これからプログラム書いてみようと思います。

326:デフォルトの名無しさん
07/08/02 09:39:43
プログラムファイルは用意されてたんじゃなかったのかよw
sageは半角でな

327:デフォルトの名無しさん
07/08/02 09:45:47
分布数えソート大好き

328:デフォルトの名無しさん
07/08/02 09:59:24
分布数えソートはもっと巧妙だけどな
アイディアは同じ

329:デフォルトの名無しさん
07/08/02 10:08:09
Linux環境で半角の円マーク(\)打つのってどうやればいい?

330:デフォルトの名無しさん
07/08/02 10:08:49
英字キーボードで、と言った方が良かったかも

331:デフォルトの名無しさん
07/08/02 10:17:11
バックスラッシュと円マークの文字コードは
ASCII コードの範囲内でなら同一。
あとはフォントの問題。

どうしても混在させたいなら、ユニコードで何とかするしかない。
00A5 が円マークだ。
もちろん、エスケープ記号としては使えんがな。

332:デフォルトの名無しさん
07/08/02 13:38:15
Linuxでの最長パス名なのですが、#defineされているものに
MAX_PATH とか MAXPATHLEN とかありますが
どれを#includeしてどの#defineを使うのが一般的なのでしょうか。
なんかいろいろあってわからなくなった。
教えて下さい。


333:デフォルトの名無しさん
07/08/02 17:08:43
Linuxは知らないが、標準Cには<stdio.h>にFILENAME_MAXという定数がある。

334:デフォルトの名無しさん
07/08/03 00:02:15
int a[3][4];
int b[4];

と宣言した際に

a[0] = b;

がNGなんですか?

C言語の2次元配列は配列の配列と習ったんで
aのゼロ番目に大きさ4の配列を入れれると思ったんです。



335:デフォルトの名無しさん
07/08/03 00:07:29
配列の配列と2次元配列は別物だよ

336:デフォルトの名無しさん
07/08/03 00:17:43
というか、int a[3], b[3];だったとしても、
a = b; みたいな代入はできない。

337:デフォルトの名無しさん
07/08/03 00:21:15
>>336みたいなのが何で出来ないんですか?って質問されたら
言語仕様です。としかいえないよな。
それでもなんで?って聞いてきたら教えるのをあきらめる。


338:デフォルトの名無しさん
07/08/03 00:30:31
Cを作った人や、後にコンパイラを実装した人達が
できなくてよいという判断を下したから。

339:デフォルトの名無しさん
07/08/03 00:47:16
配列の代入はできません。

340:デフォルトの名無しさん
07/08/03 01:01:38
>>335
規格票では全く同一のものとなっていますが何か?

341:デフォルトの名無しさん
07/08/03 01:08:11
配列の配列
配列へのポインタ
ポインタの配列

などの細かなこと知らなくても問題ないよ


342:デフォルトの名無しさん
07/08/03 01:09:38
いや、それは問題ある。

343:デフォルトの名無しさん
07/08/03 01:17:23
構文上は配列の配列と思っておくと都合がいいけど、
Cでは配列の配列とは別に2次元配列が存在するわけでもないので、
少なくともCでは両者の言葉が区別されることなく使われている。

こう言えばいいか?

344:デフォルトの名無しさん
07/08/03 01:21:08
>>342
ないよ

そんな細かなこと知っててもなんの役にもたたん

345:デフォルトの名無しさん
07/08/03 01:24:34
int (*a)[10];

って大きさが10のintの配列へのポインタですよね

これの配列(大きさ20)はどう宣言すればいいのですか?

346:デフォルトの名無しさん
07/08/03 01:26:09
そんなの自分で考えろよ

int (*a)[10][20];


死ねよ


347:デフォルトの名無しさん
07/08/03 01:28:43
>>344
int n[10][10]; を int** に渡せないとか言う人の相手をしなきゃいけない身になってみろ。

348:デフォルトの名無しさん
07/08/03 01:33:51
>>346
君が死んだほうがいいような・・・

349:デフォルトの名無しさん
07/08/03 01:42:50
配列は 「変数名の直後に [サイズ] を書く」
ポインタは 「変数名の直前に * を書く」

括弧があろうがこれは変わらない。

それだけ覚えていれば何も迷うことは無い。

350:デフォルトの名無しさん
07/08/03 02:28:56
>>346
最初の一行、このスレのタイトルからしてお前が来なきゃ良いんじゃね?って
周りに思われていることに気づいた方が良いんじゃね?
自分が嫌うものをわざと見つけて、勝手にその対象物を叩いてイラついている
基地外にしか見えない・・・

351:デフォルトの名無しさん
07/08/03 02:40:09
配列へのポインタの配列が必要になる状況って考え付かないんだけど、どんなの?

352:デフォルトの名無しさん
07/08/03 02:44:52
double x y;
scanf("%f%f",&x,&y);

1.0 1.0
と取り込んだら
printf("x y = %f %f\n",x,y);

x y = 0.000000 0.000000
と出力された。
なんで???

353:デフォルトの名無しさん
07/08/03 02:46:04
%lf

354:352
07/08/03 02:48:12
わいわ…アホや…

355:デフォルトの名無しさん
07/08/03 03:04:33
>>351
必要になるならないは問題ではない
どう書けるかときいているのです。

356:デフォルトの名無しさん
07/08/03 03:08:06
そんなどうでもいいこと気にする前にもっと学ばなきゃいけないことがたくさんあると思うけど。

357:デフォルトの名無しさん
07/08/03 03:33:49
わからないならわからないっていえよ
しったかぶってんなよw

358:デフォルトの名無しさん
07/08/03 03:35:56
教えられないくせに学べだの説教するやつは痛過ぎ・・・

359:デフォルトの名無しさん
07/08/03 03:36:37
>>351
回転行列へのポインタの配列とか。

360:デフォルトの名無しさん
07/08/03 03:37:26
あげくのはてには、必要ないだってw



361:デフォルトの名無しさん
07/08/03 03:41:54
int (*(*(*p[1])[2])[3])();

を3秒以内に理解できるかい?

362:デフォルトの名無しさん
07/08/03 03:43:06
そこまですっきりしてると分かりやすい。

363:デフォルトの名無しさん
07/08/03 03:45:00
int (*(*p)(int (*)(int (*)[20])))[10];

364:デフォルトの名無しさん
07/08/03 03:49:20
それを有効に使ったコード書いてみてくれw

365:デフォルトの名無しさん
07/08/03 04:07:32
ごめん、無理。

366:デフォルトの名無しさん
07/08/03 05:42:26
・C言語の欠陥
関数アドレスを返す関数において、その関数と同じ型の関数アドレスを
返す型の循環構造を定義できない。

typedef func_t (*func_t)(); // エラー
func_t f();

367:デフォルトの名無しさん
07/08/03 05:58:18
こういう場合は構造体を定義するしかない。
struct _s_t;
typedef struct _s_t (*func_t)();
typedef struct _s_t {
func_t f;
} s_t;

s_t f() {
s_t s = {f};
printf("f()");
return s;
}

main () {
// f()()()()()(); 本来期待する呼び出し形式
f().f().f().f().f().f();
}

結果:
f()f()f()f()f()f()

368:デフォルトの名無しさん
07/08/03 06:35:56
それ聞いたことはあるけど、どういう場合に使うの?

369:デフォルトの名無しさん
07/08/03 07:34:06
にわかプログラマーは心の狭いやつが多いねぇ
おまけにちょっと噛み付かれたらギャーギャー喚き散らさないと気がすまないらしい

370:デフォルトの名無しさん
07/08/03 08:12:21
URLリンク(kmaebashi.com)

371:デフォルトの名無しさん
07/08/03 08:39:05
   / ̄ ̄\
 /   _ノ  \
 |   ( ●)(●)  < スレタイ読めないならどっか余所へ行けよ
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \
   ヽ   |、    (  ヨ    | ← にわかプログラマー
   /    `ー─-  厂   /
   |   、 _   __,,/     \

372:デフォルトの名無しさん
07/08/03 11:57:59
>>370
他の解説読んでたけどif文にセミコロンいらないの知らなかった…
でもコード見たらちゃんと書けてた

(´・ω・`)??
とりあえず気付けてよかった

373:デフォルトの名無しさん
07/08/03 12:51:25
>>345
ヒント:a[20]と書くとaと[がとても強くくっつくので、「aは20個の要素を持つ配列です」ということになります。

374:デフォルトの名無しさん
07/08/03 14:58:37
ポインタについて質問なのですが、軽くググった感じではポインタとは
ガーベッジコレクタを利用した変数という認識で良いのでしょうか

375:デフォルトの名無しさん
07/08/03 15:06:18
全然違います。
アドレスを保持する変数です。

376:デフォルトの名無しさん
07/08/03 15:06:38
>>374
びっくりするぐらいダメ


377:デフォルトの名無しさん
07/08/03 15:06:54
>>374
ぜーーーんぜん違いますw

ポインタ = 変数や関数のアドレスを格納した変数。値はつねにアドレスになる。


378:デフォルトの名無しさん
07/08/03 15:07:54
なにこの同時ダメだしw ワロタ

379:デフォルトの名無しさん
07/08/03 15:08:42
wwwwwwwwwwwwwwwwwwwwwwww

380:374
07/08/03 15:10:06
私も吹きました。修行不足のようですね。出直してきます

381:デフォルトの名無しさん
07/08/03 15:45:39
そもそもCにガベコレなんて無いし

382:デフォルトの名無しさん
07/08/03 16:50:41
軽くググってガベージクレクタにたどり着いた道程に興味があります。

383:デフォルトの名無しさん
07/08/03 17:10:33
童貞に興味があります

384:デフォルトの名無しさん
07/08/03 17:10:51
>>383
いりますか?

385:デフォルトの名無しさん
07/08/03 17:10:59
俺は無い

386:デフォルトの名無しさん
07/08/03 18:56:25
質問です。
①wininetを使ってhtmファイルを読み込みtemp.htmで出力。
②そのtemp.htmを読み込み、必要な部分をaaa.htmで出力。
ということをしたいのですが、1度ならできたのですが、
while文で2回以上ループさせると①のtemp.htmをwモードで
fopenするとエラーが出てうまくいきません。
一応大まかなソースを書いておきます。よろしくお願いします。

void create_htm(int times){
 FILE *wfp;
 FILE *rfp;
 if((wfp = fopen("temp.htm, "w")) == NULL){ ←2回目になるとここでエラーが発生し強制終了。しかしfprintfは実行されないまま。
  fprintf(stderr, "--- wfp error");
  exit(1);
 }
 get_htm(wfp, times); /*①の関数*/
 fclose(wfp);
 if((rfp = fopen("temp.htm", "r")) == NULL){
  fprintf(stderr, "--- rfp error times = %d", times);
  exit(2);
 }
 diet_htm(rfp, times); /*②の関数*/
 fclose(rfp);
}

main(){
 int times;
 get_config(); /*gettimesをファイルから取得。gettimesはグローバル変数*/
 for(times = 0; times < gettimes; times--){
  create_htm(times);
 }
}

387:386
07/08/03 18:59:51
すいません。while文ではなくfor文でループしてます。
mainのfor文はtimes--ではなくtimes++です。
よろしくおねがいします。

388:デフォルトの名無しさん
07/08/03 19:15:36
問題の無い部分を手書きで書いて見せたって何にもならんと思うのだが。
せめてエラーのときはerrnoくらい出してよ。

389:386
07/08/03 19:35:44
問題のある部分がcreate_htm関数のif((wfp = fopen("temp.htm, "w")) == NULL)
の部分でエラーが出るのですが。すみません。errnoはどのように出すのでしょうか。
ネットで調べてみて、問題のある部分のあとに書いたのですが、強制終了されるので
出力されないのですが。

390:デフォルトの名無しさん
07/08/03 19:53:26
そもそもこれはファイル名の後に"が抜けててコンパイルもできないだろ
問題のあったソースをコピペすることもできんのか
エラー処理もしないでそこで落ちるというのはどうやって判明したんだ?

391:デフォルトの名無しさん
07/08/03 19:55:41
強制終了って、アクセス違反?
どっかぜんぜん別のところでメモリ破壊を起こしてるのかもね。
get_htm や diet_htm の中身を見ないと解決できない気がする。
>>386に載ってる部分では特に問題なさげ。

392:386
07/08/03 20:05:19
>>390
あ、すみません。抜けてました。
そこで落ちるというのは、一行ごとにprintfでどこがエラーかをみてみたら、
その部分でprintfがされなかったので判明しました。


>>391
メモリ破壊ですか。メモリ破壊を調べる方法とかないですか?


393:デフォルトの名無しさん
07/08/03 21:04:33
gdb使えよ

394:386
07/08/03 21:48:16
windowsでもgdbは使えますか?
turbo debuggerというので動かしてみると、例外が出たと言われました。

395:デフォルトの名無しさん
07/08/03 21:56:31
いまどきCなんて使う機会ってあるの?
OSを書く
組み込み系

これくらいにしか使わないよね

396:386
07/08/03 21:56:57
何度も失礼します。
gdbをするには、gcc -g program.cをすればいいですよね?
でも、コンパイル時にwininet.hのInternetOpenなどでエラーが出るのですが
どうしたらいいですか?

397:デフォルトの名無しさん
07/08/03 22:03:15
>>395
LinuxアプリとかR&Dとか

398:デフォルトの名無しさん
07/08/04 00:55:07
>>396
そもそも何使って開発してるのよ。VCのデバッガ使えば?

399:386
07/08/04 01:06:28
windows XP、bccを使っています。
すみません、自己解決できそうです。
メモリ破壊というものをネットで調べながらソースとにらめっこしてたら、
どうやら、②の関数内でmallocでサイズを確保するときに、strlenではなく
sizeofを使ってしまっていたのが原因のようでした。お騒がせしました。
また、新たなエラーが発生した際にはお邪魔させていただきます。

400:デフォルトの名無しさん
07/08/04 01:12:41
もう来るな

401:デフォルトの名無しさん
07/08/04 01:13:26
>>400
お前みたいな奴に質問に答えてもらわんでも結構、お前が来るな

402:デフォルトの名無しさん
07/08/04 01:14:47
sizeofをどう使ってたんだ?

403:デフォルトの名無しさん
07/08/04 01:15:34
>>400-401
邪魔

404:デフォルトの名無しさん
07/08/04 01:18:15
>>402
ポインタに使ってばぐったんだろ。

405:デフォルトの名無しさん
07/08/04 01:19:16
だから他の関数も最初から晒(ry

406:デフォルトの名無しさん
07/08/04 01:20:40
>gdbをするには、gcc -g program.cをすればいいですよね?
>windows XP、bccを使っています。
質問される方の身になってください。

類似例
URLリンク(www.nicovideo.jp)

407:デフォルトの名無しさん
07/08/04 06:45:47
>>403 お前も邪魔。いちいちうるせー

408:デフォルトの名無しさん
07/08/04 13:11:15
>>407-408
邪魔

409:デフォルトの名無しさん
07/08/04 16:56:50
質問ですが、

int main() {
int w;
printf("0から6までの整数を入力してください!\n");
scanf("%d",&w);
switch (w) {
case 0: printf("日曜日です。\n"); break;
case 1: printf("月曜日です。\n"); break;
case 2: printf("火曜日です。\n"); break;
case 3: printf("水曜日です。\n"); break;
case 4: printf("木曜日です。\n"); break;
case 5: printf("金曜日です。\n"); break;
case 6: printf("土曜日です。\n"); break;
default:printf("???\n");
} return 0; }

の4行目のscanfで("%d\n",&w)と間違えて打ったら2度入力が求められ、
結果には、1回目の入力が反映されました。なぜでしょうか?
使っているコンパイラはborland c++ 5.5.1で、OSはビスタです。



410:デフォルトの名無しさん
07/08/04 17:06:32
>>409
scanf()は、エラーの場合、そのデータが取り除かれないで、入力ストリームに残ったままになるから。
エラー処理をしっかりしたかったら、scanf()は使わないほうがいいよ。

411:デフォルトの名無しさん
07/08/04 17:09:29
>>409
scanfは"%d\n"の書式に合う文字列を入力したあとに改行が押されるまで待ってる
つまり1回目の改行は書式の中で要求されてるからそっちで使われていて2回目の改行でscanfが終了できる

412:デフォルトの名無しさん
07/08/04 17:16:33
>>410, >>411
す、素早い!
ありがとうございます。勉強になった。

413:デフォルトの名無しさん
07/08/04 17:40:34
scanf("%d\n", &w) の場合、%d と \n の2個分の入力が要る。

414:デフォルトの名無しさん
07/08/04 19:58:53
マクロでこうゆうのは有りですか?(使われていたりしますか?)
※VFuncは動的引数持ちの関数

#define MACRO_HOGE(inA, inB)   inA = VFunc inB

-使用例-----------------------------------
void main(void){
int V;

MACRO_HOGE(V, (A, B, C));
}

例は適当に書きましたがようするにMACRO_HOGEの第2引数に"()"付きで複数の引数を書き並べることについてです。

415:デフォルトの名無しさん
07/08/04 20:08:35
なんでまたそんなことをしたいと?

416:デフォルトの名無しさん
07/08/04 20:09:58
>>414
(コーディング規約などで制限されていない限り)誰も止めはしないと思うよ。
デバッグ出力用途で時折見掛けるしね。

417:デフォルトの名無しさん
07/08/04 20:24:59
>>414

×こうゆう
○こういう

418:デフォルトの名無しさん
07/08/04 20:29:40
>>415
引数の数が不定の関数に対するマクロを作る必要がありました。
マクロの内容も実際には複数行にわたっており、その中でin_Aの値を使用するためこのような形になってしまっています。

>>416
製品に組み込まれるソースではなく、社内でデバック用に開発メンバーのみで使用するものです。
他のところでも使われているようでちょっと安心しました。

ありがとうございました。

>>417
「・・・・・・・・・・・・・・・・・・。」

419:デフォルトの名無しさん
07/08/04 20:51:59
>>414
c99で可変長引数のマクロつかえば.


420:デフォルトの名無しさん
07/08/04 21:10:38
> >>417
> 「・・・・・・・・・・・・・・・・・・。」

ガキか


421:デフォルトの名無しさん
07/08/04 22:06:47
int *p;
は、「intへのポインタ」ってことらしいけど
「ポインタが指している変数の型がint」ってこと?

422:デフォルトの名無しさん
07/08/04 22:14:55
うん。
int *p; は *p が int になる。

423:デフォルトの名無しさん
07/08/04 22:23:24
サントス

噂に聞いていたがポインタは難しい…

424:デフォルトの名無しさん
07/08/04 22:44:18
難しいと思ってるから難しいんだよ。一度分かれば何が難しかったのか理解するのが難しくなる

425:デフォルトの名無しさん
07/08/04 23:02:18
ポインタは、変数の置いてある場所を入れておくもの。
置いてある場所が分かれば、そこにある値も操作できるはず。

426:デフォルトの名無しさん
07/08/04 23:06:34
とにかくいろいろ読んだり組んだりしなきゃダメだな
がんばるぜ

じゃーの


427:デフォルトの名無しさん
07/08/04 23:28:58
fopenでファイルがオープンされなかったらNULLが返ってくるけど
rはファイルがなかった場合などが挙げられる。
じゃーwだったらどういうときにそうなるの?

428:デフォルトの名無しさん
07/08/04 23:31:34
>>427
存在しないディレクトリだとか。

429:デフォルトの名無しさん
07/08/04 23:31:41
書き込みロックされてる場合とか

430:デフォルトの名無しさん
07/08/04 23:32:17
ディレクトリを fopen しようとした時とか

431:デフォルトの名無しさん
07/08/04 23:57:35
ファイルの作成をOSに拒否されたときとか

432:デフォルトの名無しさん
07/08/05 00:14:17
ファイルの開き過ぎとか

433:デフォルトの名無しさん
07/08/05 00:18:56
How many files(0-15)?

434:デフォルトの名無しさん
07/08/05 05:58:56
ファイルを書き込むのに十分な空き容量がないとか
書き込めない場所への書き込みをしようとしたとか

435:デフォルトの名無しさん
07/08/05 06:30:36
ディレクトリに書き込み権限がないとか。

って、切りがないよw

436:デフォルトの名無しさん
07/08/05 06:42:56
入れる穴がないからといって後ろの(ry

437:デフォルトの名無しさん
07/08/05 12:31:35
アッーー!

438:デフォルトの名無しさん
07/08/05 13:17:12
なるほど。勉強になった。
fopen・fcloseをちゃんとしてれば、その一連は何度もループできるの?
それとも上限回数とかあったりするの?

439:デフォルトの名無しさん
07/08/05 13:55:08
容量は有限なんだから、書き込みで新しいファイルを作っていけばいつかは上限に達する。

440:デフォルトの名無しさん
07/08/05 14:02:14
しかし、既にあるファイルを開いて閉じてなら、永遠に繰り返していい。

441:デフォルトの名無しさん
07/08/05 14:45:00
できました~。ありがとうございます。

442:デフォルトの名無しさん
07/08/05 18:21:27
無償リンクソフトは無いのでしょうか?
もし無いのであれば有名なリンクソフトを教えて頂けないでしょうか?

443:デフォルトの名無しさん
07/08/05 18:23:35
リンクソフトって何のことよ?
リンカーのことなら、GNU ld か?
目的を書いた方がいいと思うよ

444:デフォルトの名無しさん
07/08/05 18:24:14
コンパイラ入れたら大抵リンカも入ってるだろ

445:デフォルトの名無しさん
07/08/05 21:01:14
質問ですが
「C言語のプログラムをアセンブリ・コードに変換せよ」
という課題が出されたのですが、変換するツールのようなものはありますか?

446:デフォルトの名無しさん
07/08/05 21:03:45
あります。

447:デフォルトの名無しさん
07/08/05 21:04:46
コンパイラで出来たような気がする

448:デフォルトの名無しさん
07/08/05 21:05:32
コンパイラがやってくれる
gcc なら -S オプションつけてコンパイルしてみ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch