C言語なら俺に聞け(入門編)Part 80

このエントリーをはてなブックマークに追加
301デフォルトの名無しさん
>>300
マクロを使うか
C++でテンプレートを使うか
302謙虚フロンティア戦士:2011/03/18(金) 17:44:25.78
>>300
何がしたいかよくわからんけど共用体使えないの?
303デフォルトの名無しさん:2011/03/18(金) 17:45:06.44
引数の型が違う同名の関数を作れたような……?
304デフォルトの名無しさん:2011/03/18(金) 17:53:10.28
>>300
ヒント: printf
305デフォルトの名無しさん:2011/03/18(金) 17:53:23.91
>>301
http://homepage2.nifty.com/well/Template.html
「C++テンプレート」で検索をかけると、
こちらのサイトがヒットし、
自分のやりたい事と同じ内容でした。

ありがとうございました。
306謙虚フロンティア戦士:2011/03/18(金) 18:29:27.53
>>303
それシープラ
307デフォルトの名無しさん:2011/03/18(金) 18:34:31.62
C言語が難しすぎる。
308デフォルトの名無しさん:2011/03/18(金) 18:58:15.54
http://homepage2.nifty.com/c_lang/cpp/cpp_38.htm

上記URLのプログラムをコピペしてそのままコンパイルしてみると
住所を書き込むたびに、データが上書きされてしまって
結局最後に入力したデータしか表示されません。
ソースコードを読んでると、ちゃんとデータが追加されるようになってるのに
上書きされるのは何でなんでしょうか


309デフォルトの名無しさん:2011/03/18(金) 19:07:33.13
310デフォルトの名無しさん:2011/03/18(金) 20:29:25.67
>>308
openモードが間違っている
ios::app で OR を取りましょう
311デフォルトの名無しさん:2011/03/18(金) 21:07:41.63
appで開くとシークが不可能になって、先頭にデータの個数を
出力できないと思うのですが・・・
312デフォルトの名無しさん:2011/03/18(金) 22:16:06.23
>>311
appは書き込みの時のみファイルの最後に自動的にシークされます
読み込みもしたいのならios::inもORしておけばよいです

問題のプログラムはios::ateでopenしているので、ファイルを開いた
後にファイルの最後にseekするようになっています

Jout.seekp(0, ios::end);

で、自分でファイルの最後にseekしてから書き込みしているので、
既に書いた部分の上書きはされないと思います
313デフォルトの名無しさん:2011/03/18(金) 23:35:59.80
app は書き込みポインタを移動しても必ず最後に書き込まれるフラグですよね
でもそれじゃ困ります
ファイルをオープンした後、ファイルの一番最初にシークして
データの個数を書き込んでから、また最後にシークして新たなデータを追加しなければいけないので
具体的に説明すると、例えば一回目のデータを書き込むと


『追加データ1』

2回目は

2
『追加データ1』
『追加データ2』

って感じです
ただ単にデータを追加するのではなく、一番最初にデータの個数を書き込みます
データを表示させるときに、このデータの個数を読み込んで、個数分while文で表示するためです
だから僕はあえてateにしてるんだと解釈してるんですが、違うんでしょうか?


314デフォルトの名無しさん:2011/03/18(金) 23:37:22.67
C言語スレで続けるなよw
315デフォルトの名無しさん:2011/03/19(土) 00:31:35.56
>>313
確かにこのプログラムの作者はC++のオープンモードについてよく理解してないようです。
データが存在しない場合にデータ個数を0と書いてしまった方がすっきりします。
但し、というか元のプログラムもですが、no_of_dataを1桁と決め打ちしてしまっているので、
データが10個以上になると動作がおかしくなると思います。(nameを浸食します)

動くようにしたプロクラムを下に示します。

http://codepad.org/M26FrFlI

なお、>>314さんもおっしゃっておられますがこれはC++の話なので、スレを以下に移しましょう

スレ立てるまでもない質問はここで 110匹目
http://hibari.2ch.net/test/read.cgi/tech/1295800051/
316デフォルトの名無しさん:2011/03/19(土) 00:37:56.90
あと最後に一つだけ

ios::nocreateは非標準ですので、動作は環境依存なので使わない方が無難です
317デフォルトの名無しさん:2011/03/19(土) 01:08:16.69
C++で書かれたソースをCで書き直したいのですが、
ダブルコロンの置き換えがよく分かりません。

何の機能がCでは何に当たるのか、を調べる方法ありませんか。
318デフォルトの名無しさん:2011/03/19(土) 01:23:37.24
c++覚えたほうが早いんじゃね?
319デフォルトの名無しさん:2011/03/19(土) 01:40:18.03
>>317
当たるものはないよ
しいて言うなら命名規則で
アンダーバーやキャメル、プリフィックス、サフィックスなどで
工夫するぐらいしかない
CSTLなどありものの作法に倣うのが楽じゃないかな
320デフォルトの名無しさん:2011/03/19(土) 01:51:03.27
>>317
C++ の :: は名前空間
C で名前空間相当の処理を行う場合は接頭辞を使う
接頭辞というのは、gtk_init(), gtk_main() の様に先頭の数文字を同じ単語で揃える事
接頭辞とそれ以外の部分は _ で繋ぐ

つまり、C++ の foo::bar は C で接頭辞を使うと foo_bar になる

ただし std::vector を C で std_vector とした所でそのまま動く訳じゃないよ
std_vector というのは C には存在していないから、自分で実装する必要がある
自分で実装するのは面倒なので、C++ から一行ずつ置き換えるという考えはやめて、
ファイル単位で大体似た様な処理を一から書いて行った方が良いと思われ
321デフォルトの名無しさん:2011/03/19(土) 03:35:08.70
みなさんありがとう
322デフォルトの名無しさん:2011/03/19(土) 10:14:30.74
>>309
298です。
2ちゃんねる使うの初めてだから、これでいいのだろうか。
レスありがとうございます。
ダウンロードしてみます
323デフォルトの名無しさん:2011/03/19(土) 14:54:38.87
どういたしまして
324デフォルトの名無しさん:2011/03/19(土) 16:35:09.48
内部リンケージのグローバル変数を関数越しに値が変更できるのって変に思うんだけど普通?
325デフォルトの名無しさん:2011/03/19(土) 16:47:36.14
普通。
326デフォルトの名無しさん:2011/03/19(土) 17:06:24.75
そっか。
327313:2011/03/19(土) 17:16:03.23
313です
ちゃんと>>1を読んでいませんでした
本当に申し訳ないです
>>315さんの紹介してくださったスレで再度質問したいと思います
僕の質問に回答してくださった方、ありがとうございました
とても参考になりました
328 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/19(土) 19:22:15.64
内部リンケージのグローバル変数 = private変数
329デフォルトの名無しさん:2011/03/20(日) 11:41:34.76
ポインタってどんなときでも
*があれば「そのアドレスにある値の操作」で
なければ「アドレスそのものに対する操作」を
意味するという理解でいいのですか。
330デフォルトの名無しさん:2011/03/20(日) 13:31:13.40
>329
だいぶ用語が粗っぽくて、何も理解できていないのではないかと思う。

単に「ポインタ」といっても、型、変数、値があることを意識しなくてはならない。
しかし、普通は文脈で判る場合が多く、単に「ポインタ」と言われる。

前の文章を書き直すと

「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、
評価結果はポインタが指すオブジェクトである。
331デフォルトの名無しさん:2011/03/20(日) 13:36:32.96
相手に理解させる気のない知識の垂れ流しってただのオナニーだよね
332デフォルトの名無しさん:2011/03/20(日) 14:18:11.86
>>329
「どんなときでも」ではないが、当初それでいい
あとで出てくる char **argv; などは * があってもアドレスだったりするし
void *ptr; は * で値にすることができない

誰とは言わんが
> 「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、

前置でない単項はないから安心しろ
こいつ冗長な形容で小難しく書き直しているだけで
話がほとんどピーマンだよ
333Perl忍者lvl2(善) ◆M5ZWRnXOj6 :2011/03/20(日) 14:27:42.06
ついにPerlのモジュールまとめ日本語でたぜ

遊べるぜ ネット系のモジュールとか


この本おすすめ
Perl CPANモジュールガイド 440ページ
http://www.amazon.co.jp/gp/product/486267108X/ref=as_li_ss_tl?ie=UTF8&tag=ele-22&linkCode=as2&camp=247&creative=7399&creativeASIN=486267108X

これよめば俺と互角にはりあえる   かもしれないぜ
334デフォルトの名無しさん:2011/03/20(日) 14:32:01.99
おまわりさんこっちです
335Perl忍者lvl2(善) ◆M5ZWRnXOj6 :2011/03/20(日) 14:33:09.78
散!!!
336デフォルトの名無しさん:2011/03/20(日) 15:45:13.95
消防レベルの自分にC言語がすごい分かりやすい
サイトなどを教えてください。
関数とかわけわかりませんw
337デフォルトの名無しさん:2011/03/20(日) 15:48:39.36
関数ってのは計算をしてくれる機械
y=f(x) のfだね
338デフォルトの名無しさん:2011/03/20(日) 15:56:20.93
339デフォルトの名無しさん:2011/03/20(日) 16:10:00.12
>>337
>>338
ありがとうございます。m(__)m
340デフォルトの名無しさん:2011/03/20(日) 19:44:37.66
C
341デフォルトの名無しさん:2011/03/20(日) 22:17:45.98
ポインタでつまづいてる初学者なんですけど、
勉強しながらある程度少しは実用的なプログラム習得できる書籍かサイトご存じでしょうか?

AmazonのC言語関連書籍一通り見ましたが、しっくりくるのがなかったので。
仕事はプログラミング全く関係ないです。
342デフォルトの名無しさん:2011/03/20(日) 22:42:16.28
ポインタの用法
第一ステップ:引数をポインタにして、関数で参照渡しに相当することが
出来るようになろう。
第二ステップ:malloc/freeで変数を動的に生成しよう。NULLの使い方も
学ぼう
第三ステップ:配列とポインタの意図的混同に関連する慣習を
学ぼう
第四ステップ:構造体のメンバにポインタを用いることにより
リストや木などの高度なデータ型を取り扱えるようになろう。
343デフォルトの名無しさん:2011/03/20(日) 23:20:32.19
第五ステップ:◆QZaw55cn4cのように皆に嫌われ者になろう。
344330:2011/03/21(月) 00:14:55.51
>331>332

たしかにいきなり小難しい説明をしてしまった。あとで読み返して、
まずったとおもった。申し訳ない。

しかし、正しい用語を使うことは正しい理解につながると思って、
あのような表現になっている。もう少し噛み砕くべきだった。

>329>332
>ポインタってどんなときでも*があれば
>前置でない単項はないから安心しろ
たしかに単行*は前置しか無いから冗長な表現だった。
しかし*は、(前置)単項演算子、二項演算子、ポインタ宣言子
として登場するので、意識してもらうために明示した。

>char **argv; などは * があってもアドレスだったりするし
char **argv;の場合、
argvはchar *を指すポインタ
それに間接演算子*を適用すると、評価結果は指している
オブジェクトとなるので、その型がchar *になるだけで、
全く話は同じ。

>void *ptr; は * で値にすることができない
void *のことは失念していた。指しているオブジェクトサイズが
不定である場合は演算子*,[]を適用できない。
345 ◆QZaw55cn4c :2011/03/21(月) 00:15:22.37
×皆に嫌われ者になろう。
○皆に嫌われる者になろう。
346デフォルトの名無しさん:2011/03/21(月) 00:26:34.17
>>345
馬鹿かお前?
347 ◆QZaw55cn4c :2011/03/21(月) 00:27:56.28
>>346
joke もわからんとは。
348デフォルトの名無しさん:2011/03/21(月) 00:37:06.25
bitter smile
349デフォルトの名無しさん:2011/03/21(月) 03:34:31.18


メモリ管理って誰がやんの?
OS?
ほしたら何でCでmallocしたメモリはフラングメントすんの?
ガベージコレクションが必要な理由は?

言語?
言語は単にOSに頼んでメモリ割り当てしてもらっただけで
それもなんか違う気もする


350デフォルトの名無しさん:2011/03/21(月) 04:07:05.89
ていうか誰がメモリの本当のサイズを知ってるんだろうか
確保と開放を繰り返すとフラグメントする、ということは
確保されたぶんがそっくりそのまま開放されるというわけではないわけだ
いくらか少ない量、ってことだろ

このサイズは誰が知ってんの
プログラマがmallocでサイズを数値で見れても信用ならないって事だろ
351 ◆QZaw55cn4c :2011/03/21(月) 07:17:23.12
>>349
>メモリ管理って誰がやんの?
主に OS
ただし、malloc() に関してはリンクされたライブラリもかかわっている。

>ほしたら何でCでmallocしたメモリはフラングメントすんの?
malloc() したメモリは普通 OS には返さない。
そう仮定した場合、「malloc() したメモリがフラグメントを起こす」のなら、その原因は malloc() のアルゴリズム。

>言語は単にOSに頼んでメモリ割り当てしてもらっただけで
メモリは OS からもらうが、再利用は malloc() が管理する。
352デフォルトの名無しさん:2011/03/21(月) 07:33:33.33
Mr.マロック (うっうっうっううー)
353デフォルトの名無しさん:2011/03/21(月) 07:34:41.81
わりにこっちには、な〜〜〜んも教えてくれんよな
肝心なことなのに

どうすんのさ
354デフォルトの名無しさん:2011/03/21(月) 07:36:54.78
自分でやれってちゅうのもいいが、WindowsやLinuxだとサンダースがやらしてくれんだろ
355デフォルトの名無しさん:2011/03/21(月) 07:43:28.44
やっぱし何ちゅうの?
メモリは1ビットたりとも無駄にしたくないわけやん。
しないほうがよい。

「できないからやらない、知る必要がない」ではポロろgグラマー失格なわけやん。
こういうとき組み込みなら、iTronだなんだのメモリ管理には世話になっても
自分でできる下地があるわけで、軽減は出来る。
ならWindowsやその他でもそうすべきだ。
356デフォルトの名無しさん:2011/03/21(月) 10:26:43.26
>>355
Windows はもともと、そういう思想だったんだよ
357デフォルトの名無しさん:2011/03/21(月) 11:01:40.05
>>347
自分の頭が悪い点にズバリ切り込まれるとjokeって事にするのですね。
どこまで馬鹿なんだお前は
358デフォルトの名無しさん:2011/03/21(月) 11:51:34.49
お前らみずほ銀行のくそシステム組やがってどうにかしやがれ!
359デフォルトの名無しさん:2011/03/21(月) 12:20:43.86
再帰関数について質問です。
void merge(int first int last int *A)
{
if(){
center=(first+last)/2@
void merge(first center *A)A・・・前半起点マージ
B
void merge(center+1 last *A )C・・・後半起点マージ
}}
mainで呼び出した関数で中に二つの自分と同じ関数がある再帰構造を持ってます。
で良く分からないのですが
Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業
をするので、Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
そうなると帰納的にcenter=一定値になると思うのですが、何か違いますか?再帰関数がややこしくて仕方ありません・・・
360デフォルトの名無しさん:2011/03/21(月) 12:21:20.74
>>358
少なくとも、俺は関わってない。
また、銀行系のシステムで、この手のトラブルの原因となるコードが
Cで実装されてることは、滅多にないと思われ。
361デフォルトの名無しさん:2011/03/21(月) 12:25:20.51
>>359

良く分からんがC言語でOK
362デフォルトの名無しさん:2011/03/21(月) 12:44:46.45
>>361
はいC言語です、お願いします。
マージソートのプログラムで、centerは真ん中の配列の添え字ですかね。
再帰関数によって分けて分けて、で作業の末端までいったら
今度はくっつけてくっつけて戻ってくるというプログラムです。たぶん・・
363デフォルトの名無しさん:2011/03/21(月) 12:45:48.83
>>359
よくわからんが
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致する
>Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
merge が呼ばれるたびに新しく center が作られる
364デフォルトの名無しさん:2011/03/21(月) 12:48:34.45
printf("%d %d %d\n", first, last, center);を追加してどういう順番で呼び出されてるか見ればいいだろ
365デフォルトの名無しさん:2011/03/21(月) 13:08:49.26
>>359
間にprintfを挟んでみては?
366デフォルトの名無しさん:2011/03/21(月) 13:10:32.08
367デフォルトの名無しさん:2011/03/21(月) 13:54:06.94
無駄な比較が多いな
368デフォルトの名無しさん:2011/03/21(月) 13:55:29.16
>>359
void merge( int first, int last, int *A ) {
  if() {
    int center; // static int center; // ではない
    center = ( first + last ) / 2; // @
    void merge( first, center, A ); // A・・・前半起点マージ
    // B
    void merge( center + 1, last, A ); // C・・・後半起点マージ
  }
}
だと仮定して
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致します
>再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業
>をするので、Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
centerの型がstaticの場合、再起先と呼出元のcenterの値の格納先が同じ場所となり、
あなたの予想通り、値を上書きしてしまいますが、
今回の場合、staticは使用しないと考えられるので、再起先のcenterの値の格納先と
呼出元のcenterの値の格納先は異なる場所となるため、@・AはCと一致します。
369デフォルトの名無しさん:2011/03/21(月) 15:35:43.42



Mr.マロック (うっうっうっううー)




370デフォルトの名無しさん:2011/03/21(月) 21:10:09.40
while (!feof(f1)) {
 ch = fgetc(f1);
 if (!feof(f1))
  fputc(ch, temp);
}

教本を読んでいてファイルの入出力の章でこのようなコードが出てきたのですが、
これだと例えば今f1はファイルの最後の文字の位置にあるとすると、
ch = fgetc(f1);でf1が示す位置が1つ先にずれEOFとなり、その後if(!feof(f1))でfputc(ch, temp);をするか判定しているので
最後の1文字がtempに出力されないで終わってしまう気がするのですがどうなんでしょうか。
実際コンパイルしてみると最後の文字までちゃんと出力されていたのですが……

全ソースはこちらに上げておきました tp://ideone.com/pVv1S
宜しくお願いします。
371デフォルトの名無しさん:2011/03/21(月) 21:14:06.71
>>370
何が疑問なの?
372デフォルトの名無しさん:2011/03/21(月) 21:33:24.36
>371
何故f1の全ての内容がtempに書きこまれるのかがわかりません。
>370にも書いたのですが、if(!feof(f1))があるとその前にfgetc(f1)でf1が示す位置が既に1つ先に進んでいるので、
if文の中のfputc(ch, temp)が実行される回数が1回足りないで処理が終了してしまう気がします。

自分がこの部分を書こうと思って以下のようなコードを書いたのですが(色々違うものが挟まってますが)、
これだとtempにf1の内容のあとFF 00 00 00....(tempのバイト数が4KBになるまで)まで出力してしまいました。
なぜfputc(ch, temp)を実行する前にif(!eof(f1))を判定しなければならないのか教えて頂ければと思います。

while (!feof(f1)) {
 ch = fgetc(f1);
 if(ferror(f1)) {
  puts("FILE1の読み込みエラー");
  exit(2);
 }
 fputc(ch, temp);
  if(ferror(temp)) {
   puts("tempファイルの書き込みエラー");
   exit(2);
  }
}
373デフォルトの名無しさん:2011/03/21(月) 21:35:03.39
374デフォルトの名無しさん:2011/03/21(月) 21:36:08.88
1> screensource00103.cpp
1>d:\ワークステーション\ゲーム開発プロジェクト\rxz project laboratory\programs\rxz_ver0.01\screensource00103.cpp(40): error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。


該当の場所




(40)void bg_ctrl(){
(41) DrawGraph( 0 , 0 , Stage_BG , FALSE ) ;
(42)} /* リファレンス注釈7参照 */
(43)


375デフォルトの名無しさん:2011/03/21(月) 21:37:54.44
すいません。
誤爆です。すいません。

よく見てませんでしたすいません><;
376デフォルトの名無しさん:2011/03/21(月) 21:47:04.64
feofは最後の一文字を読み込んだときじゃなくて、EOFを読み込んだときに1を返すから
377デフォルトの名無しさん:2011/03/21(月) 21:47:23.67
>373
あー…これは読み込んでいるファイルの末端にEOFがないってことです…かね?
しかしEOFがないのにどうやってfeof()で判断してるんでしょうか、わけがわからなく…
378デフォルトの名無しさん:2011/03/21(月) 21:55:58.48
>376
EOFはどんなファイルの最後にもあるという勘違いをしてたようです、ありがとうございます

改めて考え直したのですが、そうするとif文は
if (!feof(f1))ではなくif(!ferror(f1))ではないのでしょうか
こうすればファイルの末端を超えたときその前のch = fgetc(f1);でエラーがでているはずで、処理を止めることができるという感じに

これはまた違うのでしょうか、申し訳ないのですがが宜しくお願いします。
379デフォルトの名無しさん:2011/03/21(月) 21:56:42.71
っとすいません、if(error(f1))でした…
380デフォルトの名無しさん:2011/03/21(月) 21:57:22.66
feofはファイルを最後まで読み込んだかを判定する、つまりEOFを読み込んだかどうかを判定する関数
fgetc()でchにEOFが入った後じゃないとfeofは1を返さない
381デフォルトの名無しさん:2011/03/21(月) 22:11:14.18
>380
例えばテキストファイルで今末端の位置にいるとき、

<1回目>
while (!feof(f1)) { /* ファイルの末端での判定、当然実行される */
 ch = fgetc(f1); /* chにファイルの末端の文字を代入*/
 if (!feof(f1)) /* このときf1はファイルの末端の次にあるが、その読み出しはされていないのでfeof()は0を返す */
  fputc(ch, temp); /* fputc()は行われる */
}

<2回目>
while (!feof(f1)) { /* ファイルの末端の次での判定、しかし上記と同様にしてfeof()は0を返し実行される */
 ch = fgetc(f1); /* chにf1を代入しようとするが、末端を超えているので失敗し、EOF指示子がセットされる */
 if (!feof(f1)) /* ここでfeof()はEOF指示子があるので1を返し、fputc()はスキップされる */
  fputc(ch, temp);
}

<3回目>
上記と同様にして、while文は実行されず次の処理にうつる


こういうことでよろしいでしょうか……
382デフォルトの名無しさん:2011/03/21(月) 22:19:09.25
>>370
while (1) {
 if (feof(f1))
  break;
 ch = fgetc(f1); 
 fputc(ch, temp);
}
383デフォルトの名無しさん:2011/03/21(月) 22:35:57.51
>382
前の処理がファイルの末端の文字だったとして、いまf1、tempがファイルの末端の次の位置になっているとしますと、

<1回目>
while (1) {
 if (feof(f1)) /* EOF指定子がないのでfeof()は0を返し、実行されない */
  break;
 ch = fgetc(f1);
/* f1はファイルの末端の次なのでch = fgetc(f1)が実行されchにEOF(-1)が代入され(調べ直したら失敗するわけではないですね)、
EOF指定子がセットされる */
 fputc(ch, temp); /* fputc(ch, temp)は実行され、tempにEOFが書きこまれる */
}

<2回目>
if(feof(f1))で条件が真となり、while文を抜ける


この場合だと結果的に>370でできるファイルの末尾にEOFが付加された形になるんでしょうか、解釈があっていればよいのですが
384デフォルトの名無しさん:2011/03/21(月) 22:50:55.03
>>383
規格書読んで分からないなら
1つの標準関数ごとにデバッガ使ってトレースして
振る舞いを確かめるといいよ
IDEをつかえばコマンド覚えることなく誰にでも簡単に扱えるから。
385デフォルトの名無しさん:2011/03/21(月) 23:06:34.70
>384
なるほど、了解です
一度落ち着いて整理し直し、色々試してみることにします
386 ◆QZaw55cn4c :2011/03/21(月) 23:36:17.60
>>382
これはまずいです。>>383 のような誤解を招きます。

for (;;) {
ch = fgetc(f1)
if (feof(f1))
break;
fputsc(ch, tmp);
}
とすべきです。読む→テストする→書く、というです。
387デフォルトの名無しさん:2011/03/21(月) 23:52:09.72
>>386
等価
って知ってる?
388デフォルトの名無しさん:2011/03/22(火) 00:38:22.63
C言語を始めたばかりの超初心者ですが、質問です。
strtokの返すアドレスというのは実質、文章の終わりまで置き換えが終わったかどうか確認するためだけに使うようなものなのでしょうか?
389デフォルトの名無しさん:2011/03/22(火) 00:42:09.06
他の使い方もあります。と言うか他の使い方の方がメイン
390デフォルトの名無しさん:2011/03/22(火) 00:46:26.70
そうなんですか
区切った記号までの文字列の先頭アドレスを返すと聞いたのですが、
例えばどのようなときに使うのでしょうか?
よかったらお願いします
391 ◆QZaw55cn4c :2011/03/22(火) 07:03:02.51
>>387
等価じゃないと思いますよ。

>>382
ビットパターン 0xff をディスクリプタ tmp に書いてしまいますよ。
ビットパターン0xff は EOF を示すascii 制御コードですらなく、
オリジナルのディスクリプタ f の指すファイルの内容とは、変わってしまいますよ。
392 ◆QZaw55cn4c :2011/03/22(火) 07:17:57.58
>>381,383
その解釈であっています。

>>370 のリンク先は、致命的に間違っています。
char ch; ではなく int ch; が正しい。

あと while(!eof())うんぬんは、教科書によくあらわれる書き方です。(たとえば、ハーバードシルト先生は信念があるのかいつもこう書きます。)
while() を無理に使うとこう書かざるを得ないのですが、私見では、残念ながら eof() が重複してしまい無駄ですね。
393デフォルトの名無しさん:2011/03/22(火) 08:41:48.74
てか、これってC言語の話題?
C言語の標準ライブラリの仕様の話しだが、
今時C標準ライブラリが外部言語処理系に非公開な
プラットフォームってまずない。
だからこれは微妙にこれはOSの標準ストリームの
仕様の話になりそうな件
394デフォルトの名無しさん:2011/03/22(火) 10:23:33.38
関係ないよ。eof()を使うのがタコ。
int ch;
while ((ch = fgetc(f1)) != EOF) {
fputc(ch, tmp);
}
395デフォルトの名無しさん:2011/03/22(火) 10:34:57.88
>>383
EOFはファイルに書いてある値じゃないよ
既にファイルの最後まで読んでいるのになお更に読もうとした時にfgetc()が返してくる値
ファイルに書いてある値以外の値でEOFを表現しなければならないので、fgetc()の型はunsigned charじゃなくてint
ch = fgetc(f1);の次に即fputc(ch, temp);するのはまずい
396デフォルトの名無しさん:2011/03/22(火) 11:21:56.20
>>395
アスキーコードのEOFにも対応しといてください。お願いします。
397デフォルトの名無しさん:2011/03/22(火) 11:22:52.75
99BASIC
398デフォルトの名無しさん:2011/03/22(火) 11:41:50.05
C言語において時間計算量について質問です。
マージソートの計算量は何故nlognなんですか?
例えば要素数16とします。

全て一つだけの配列に分けて、それを二つ配列にする比較回数が8回
二配列を四配列にする比較回数が3×4=12回
四配列を8配列 2×7=14回
最後8配列同士を比較して  15回
で合計49回ですよね?
n=16のとき
nlogn=1.2×16=19・・計算量19?

49とかけ離れてますよね?
399デフォルトの名無しさん:2011/03/22(火) 12:02:53.78
>>391
それは370も同じでしょ
400 ◆QZaw55cn4c :2011/03/22(火) 12:21:56.92
>>399
いいえ違います。

>>370 は読んだあと書き込む前にテストが入ります。だから正しい。
>>382 は読んだあとテストする前に書き込んでしまいます。これはバグっている。
したがって、>>370>>382 は等価ではありません。 >>382 はバグ入りのきわめてまずいコードです。