トップページ⇒tech
1001コメント240KB

C言語の質問スレッド<42>

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
C言語に関する質問はここでしてください。

問題をちゃんと切り分けて、Cの話かそうでないか洗ってから質問してくれ。
というより、聞く前に一応 Web で検索しろ。
コンパイラを探してるなら >>2 を見ろ。
過去ログ(DAT落ちあり)なら>>3-100あたりにあるかも。

GUIとか、C標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
ソース丸投げ、宿題、書籍 は専門の別スレがあるからそこへ逝ってくれ。

未定義・処理系依存ネタはご遠慮ください。
誰かが(故意にではなく)それらの書き込みをしても、いちいち突っ込まないでください。
規格オタクはこのスレッドには必要ありません。論争したかったら独自にスレッドを立ててそこでやってください。


C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/


前スレ <41>
http://pc3.2ch.net/test/read.cgi/tech/1036876790/
0809808NGNG
この関数のなかでpos_nodeはなんで必要なの?
listをこぴってるから、直接リストをいじるのとかわらないんでないの?
0810デフォルトの名無しさんNGNG
>>808
必要ないです。
かわらないです。
いじょ。
0811808NGNG
>>810
( ̄□ ̄;)!!
listの必要性を考えて小一時間ネット上をうろついたオレって一体・・・
0812デフォルトの名無しさんNGNG
>>811
引数を直接いじると何か気持ち悪い、っていう程度の
理由だと思うよ。
0813デフォルトの名無しさんNGNG
>>812
気持ちはわかるね。たぶん808のソースはどっかのコピペだろうから
分かりやすくしてんだろう。
でもオレも後で見たときの可読性を考えれば、いい事だと思う。
0814デフォルトの名無しさんNGNG
>>813
あなたの文章には鬱病の人特有の言い回しが見れます。
病院に行ったほうがいいと思います。
鬱は必ず直ります。
0815デフォルトの名無しさんNGNG
>>814
うつ病特有の言い回し?
0816813NGNG
>>814
813ですが何か?
0817デフォルトの名無しさんNGNG
だれかいますか?
0818デフォルトの名無しさんNGNG
>>817
いるよ。はあはあ
0819デフォルトの名無しさんNGNG
廃れたね。オレが話題をふるYO!
お前らコンパイラとエディタなんですか?
0820デフォルトの名無しさんNGNG
またその話題かよ。
0821デフォルトの名無しさんNGNG
廃れたねってお前。チャットじゃねーんだからよ。
そんなあせんなよ。
0822デフォルトの名無しさんNGNG
新スレ立って荒らされてるな(プ
0823デフォルトの名無しさんNGNG
構造体listが
{
  int num;
list *next;
}
みたいな線型リストだとして
list == NULLっていうのはどういうことですか?
listの要素全部が0,NULL,'\0'ってこと?
0824デフォルトの名無しさんNGNG
あともういっこ!
線型リストのさいしょの構造体には値は入れないんですか?
0825デフォルトの名無しさんNGNG
>>823
それは実装した人次第だが、一般的にはリストが空。
0826デフォルトの名無しさんNGNG
>>824
最初はポインタの方がすっきりするが、プログラムを組むとわかるが
空の構造体の方が扱いやすい。
0827デフォルトの名無しさんNGNG
>>824
それをおセンチっていいます。
0828デフォルトの名無しさんNGNG
>>827
なつかしいでつね
0829デフォルトの名無しさんNGNG
>>823-826
質問と回答が殺伐としていてよいね

>>827-828
消えろ。
0830デフォルトの名無しさんNGNG
>>825 && 826
サンクス
0831デフォルトの名無しさんNGNG
ある関数が再入可能かそうでないか知りたいのですが、
どうやって調べたらよいのでしょうか? なにかリストみたいなのはありますか?
printfは再入可能でないらしいのですが、僕には理由がわからず。
とにかく、リストがあればとりあえずは楽かなと。
0832デフォルトの名無しさんNGNG
830のレスみて思ったけど、次スレタイはCの演算とかうまく使ってよ。
C++ってなかなかいいセンスしてると思うのは俺だけか。
0833デフォルトの名無しさんNGNG
この静けさ。完全にCを語り尽くした。
0834デフォルトの名無しさんNGNG
>>831
マルチスレッドで使って安全という意味だよね?
C言語の規格自体ではそこまで決まってない。
かといって処理系ごとにまったくバラバラかというとそうでもない。
Unix系のOSなら、Single Unix Specificationという規格でけっこう細かく
決まっている。
http://www.opengroup.org/onlinepubs/007908799/xsh/threads.html
のThread-safetyセクションにリストされている関数はthread-safeで*ない*。
他は全てthread-safe。(printfもthread-safe。)

SUS準拠OS以外なら、処理系のマニュアルを見るしかない。
0835デフォルトの名無しさんNGNG
>>833
今度から初心者の質問すれと
上級者の議論すれにわけたいね
0836デフォルトの名無しさんNGNG
>>835
わけたら余計に人減るじゃん。
0837デフォルトの名無しさんNGNG
>>834
マルチスレッドもありますが、割り込みでprintfを使おうとしてました。
自分なりに調べましたが、
printfはスレッドセーフですが、Async-Cancel-Safe 関数ではないそうです。

いやぁ、よくわかりませんなぁ。素人は割り込むなと言うことですか?w
0838デフォルトの名無しさんNGNG
>>837
シグナルハンドラの中で使いたいのなら、async-cancel safeじゃなくて
async-signal safeなものを探すべきでしょう。
Solarisだとマニュアルに一覧があるけど(90個くらい)。
0839デフォルトの名無しさんNGNG
>>838
SolarisのAsync-Signal-Safe functions一覧
http://docs.sun.com/db/doc/816-0220/6m6nkoroc?a=view
0840デフォルトの名無しさんNGNG
>>837
printfをシグナルハンドラから呼びたいなら、
Async-Signal-Safeでないライブラリ関数を実行中はシグナルをブロックするように
すれば良いんじゃない?

あるいは、シグナルハンドラでは何か情報を変数に書くだけにして、
メインのスレッドでその情報をプリントする。
0841デフォルトの名無しさんNGNG
変数宣言時に
char buf[BUF_SIZE] = "";
と書くとbufの先頭1バイトだけでなくBUF_SIZE全部が終端文字で初期化されます。
これは標準なのでしょうか?
0842デフォルトの名無しさんNGNG
>>841
「終端文字で」ではなく、「残りは、staticな変数と同じように」
初期化されます。それが規格どおりの振る舞いです。
0843デフォルトの名無しさんNGNG
>>842
すばやいご回答ありがとうございました。
0844デフォルトの名無しさんNGNG
volatile int i;
void signal_handler (int s)
{
  i = 1;
  printf ("%d\n", s);
}
↑ここでprintfを呼ぶのと
int main ()
{
  signal (SIGINT, signal_handler);
  while (!i)
    printf ("%d\n", i);
  return 0;
}
↑ここで割り込みを入れるのと、どちらがいけないということですか?
0845デフォルトの名無しさんNGNG
>>844
(断っておきますが、これはC言語の範囲を超えた話題です。)

mainからprintfを呼び出して実行中にシグナルを受け取ったとします。
そのとき、printfが何かの資源をロックしていたとします。
signal_handlerの中からprintfを呼ぶと、デッドロックが起きる可能性が
あります。

汎用の解決策は >>840 の通りです。処理系によっては、シングルスレッドの
プログラムだとprintfが資源をロックしたりしない(したがってデッドロック
が起きない)かも知れません。
0846デフォルトの名無しさんNGNG
>>845
説明して頂いてどういうことか分かりました。
この例では両方で呼び出してはまずいということですね。
割り込みをするプログラムでは、
printfを使ってはいけないのかと思ってしまっていました。
ありがとうございました。
0847デフォルトの名無しさんNGNG
>>798
その前に糞スレの削除依頼出してこいや
話はそれからだ
0848デフォルトの名無しさんNGNG
線形リストだぜははっと、さくさくプログラミングしてたんでしが、、
リンクにポインタを使ってたばかりに、reallocしたら大変な事になって
しまいますた。

問題なのは当たり前だけど、reallocを使う可能性がある時は整数インデックス値
振らんといかんの?ってのは常識!?
0849デフォルトの名無しさんNGNG
>>848
まともな日本語で書いてみてくれないか。
0850デフォルトの名無しさんNGNG
int a[] = {1,2,3,4,5,・・・・・};
と配列を初期化したとき、配列の要素数を簡単に知る方法はありますか?
0851デフォルトの名無しさんNGNG
>>848
ひょっとして、リンクにつながった要素をreallocしようとしてるとか?
(1)大きさが変わる可能性のあるものは、リストにつながってる構造体とは
別にして、リストの構造体からポインタで指す。
(2)双方向リストにして、reallocする前にいったんリストからはずし、
reallocの後で挿入しなおす。
のどちらかで解決。
0852デフォルトの名無しさんNGNG
すまそ。

レコードの増減・並び替えが行われるデータ構造があるんだが、最初にこれを読み込む時
にはレコード総数が分かっているのでmalloc(データ構造*レコード数)という感じでメモリ確保
していたんだ。
で、データの追加・削除・並び替えが発生するんで、リスト構造にし、リンクにはレコード
参照ポインタを使っていたの。
しかし、ここで問題があって、データの追加・削除時にはreallocを使って全データのメモリ
を再確保していたんだよね。
これすると、メモリアドレス変わっちまうんで、リンク情報が役に立たなくなって困ったわけ。

1レコード読むたびにmallocして、追加・削除するたびにもmalloc,freeしていれば
よかったんだけど、レコード数が多いから速度的に難があると思って、全データを
一気にmalloc,reallocしてたの。

漏れ、
非常識なんだろな。
0853デフォルトの名無しさんNGNG
852=848
ですた。
>851 ありがと。
0854デフォルトの名無しさんNGNG
>>852
追加時にreallocする必要はないだろ。(1個ずつmallocすればよい。)
削除時にreallocは無理だろ。(途中だけ削除したりしないのか?)

いずれにせよreallocはやめるべし。
最初にまとめてmallocするのはそのままでもよい。
freeする替わりに、自分で作ったフリーリストにつないで置けばよい。
追加のときはフリーリストから空き構造体を取り出す。フリーリストが
空ならmallocする。
0855デフォルトの名無しさんNGNG
>>850

sizeof(a)/sizeof(i)
0856855NGNG
iてなんじゃい(欝
sizeof(a)/sizeof(int)だ。
0857デフォルトの名無しさんNGNG
>854
> 削除時にreallocは無理だろ。(途中だけ削除したりしないのか?)
リンクポインタだけ書き換えて、全データサイズ縮小realloc・・・すまそ。
厨な組み方してました。阿呆です。厨でも組みませんな。逝ってきます。

>freeする替わりに、自分で作ったフリーリストにつないで置けばよい。
>追加のときはフリーリストから空き構造体を取り出す。フリーリストが
>空ならmallocする。
そっか!なるほど。
フリーリストとは思い付かなかった。
質問して良かった。ありがと!!
0858デフォルトの名無しさんNGNG
(int)(sizeof(a)/sizeof(a[0]))
0859デフォルトの名無しさんNGNG
>>858
なぜintにキャストするのかわからん。
unsignedのままじゃまずいのか?
0860デフォルトの名無しさんNGNG
まあ、線型リストでreallocは普通しないな。
0861デフォルトの名無しさんNGNG
>>859
unsigned だと何か突っ込まれるんじゃないかと、無い知識を総動員してキャストしてみたものの
結局突っ込まれてしまった…に一票。
0862デフォルトの名無しさんNGNG
ポインタを置く領域をmallocするとか・・・
0863デフォルトの名無しさんNGNG
>>861
おまえのようなバカに優しいCスレ住人の俺が教えてやるとだな、
いや、教えるのもめんどうなのでエキスパートCプログラミング54ページを読め。
0864デフォルトの名無しさんNGNG
バグをバグと見ぬけないプログラマは(C言語を使うのですら)難しい。
0865デフォルトの名無しさんNGNG
>862
レコード個々にmallocが必要になってパフォーマンス悪くならない?
0866デフォルトの名無しさんNGNG
malloc後のソーティング,追加削除は配列よりポインタ配列の方が速いな。
他の構造と比べても単純で操作も難しく無い。
0867デフォルトの名無しさんNGNG
>>866
意味がわかりません。
0868デフォルトの名無しさんNGNG
863はsizeofが返した値をいちいちintにキャストしているのかな。
わざわざunsignedにしてあるのに(ワラ
0869bloomNGNG

http://homepage.mac.com/bloombloom/
0870デフォルトの名無しさんNGNG
(int)strlen(str);
0871デフォルトの名無しさんNGNG
>>867
(*^o^*)
0872デフォルトの名無しさんNGNG
>>871
(*^o^*)ごるぁ♪
0873デフォルトの名無しさんNGNG
>>ALL
(*^o^*)おはよう♪
ヌル文字なんて存在しないよね!?
あるサイトに「文字列の終端はヌル文字で・・・」ってあったYO!
これマジでネタじゃないから、ちょっと不安になった・・・
0874デフォルトの名無しさんNGNG
もっと面白いネタを用意して出直してこい
0875デフォルトの名無しさんNGNG
>>873
ASCIIの「'\0'」をヌル文字またはナル文字と言うことはありますが何か?
またNULLポインタ「NULL」とは別物ですが何か?
最後にヌルストリング「""」と言うものも存在し
上記三種は全て別物ですが何か?
0876initializationNGNG
Type_A object[2] = {[1] = {.member1 = "hoge", .member2 = 3}};
0877デフォルトの名無しさんNGNG
簡潔厨のコード*hoge->str++ = ch;見る人の事まで考えたプロのコード*hoge->str = ch;hoge->str++;
0878デフォルトの名無しさんNGNG
>>852
リンクにポインタではなく、配列のインデックスを使うと良い。
0879デフォルトの名無しさんNGNG
>>877
見る人の事まで考えて、改行してくれ。
0880デフォルトの名無しさんNGNG
>>877
むしろ冗長
0881デフォルトの名無しさんNGNG
\0ってナル文字、ヌル文字以外に呼び方あるの?終端文字?
0882デフォルトの名無しさんNGNG
>>881
C では普通考えられないが、\0 以外が終端文字になる事もある。
ナル文字、ヌル文字を覚えておけば普通は問題無いが、単にゼロと呼ぶ人がいる
すも知れない。
0883デフォルトの名無しさんNGNG
>>880はプログラマー辞めた方が良いな…,哀れ過ぎる。
0884デフォルトの名無しさんNGNG
*hoge->str++ = ch; を読めない人の方がプログラマ辞めた方が良いと思われ
0885デフォルトの名無しさんNGNG
while(fgets(...))はいかんらしい。while(fgets(...)!=NULL)とかかないとダメらしい。


ワラ
0886デフォルトの名無しさんNGNG
その話はもういいよ
論争スレ逝ってくれ
0887デフォルトの名無しさんNGNG
相手の打ちにくい所にボールを返すのが糞プログラマー
相手がどんなボールを打って来ても打ちやすい所にボールを返すのが真のプログラマー

糞プログラマーの言い分は決まって「へぇ、そんなボールも打ち返せないんだ」
真のプログラマーは糞プログラマーと同じ事を苦も無くできるが打ち返す側の
事も考慮する。
0888デフォルトの名無しさんNGNG
877=883 が何も考えていない事はよくわかりますた。
0889デフォルトの名無しさんNGNG
>>886
論争ならここですればいいだろ。そのためのスレッドなんだし。
0890デフォルトの名無しさんNGNG
>>887
意味さっぱりわかんねーよ。
バカスカ打たれてたらピッチャー降格されるだろ
0891デフォルトの名無しさんNGNG
>>887
C に関する話ならここでもいいけど、コーディングスタイルは直接関係ないだろ。
0892891NGNG
889 宛てだった・・・
0893デフォルトの名無しさんNGNG
ネタスレなんだからいいじゃん(*^o^*)
0894デフォルトの名無しさんNGNG
>>888=一人で勝手に自己完結させる(完結|簡潔)厨
0895デフォルトの名無しさんNGNG
>>885
所詮宗教問題であって間違いなんて無いのにワラなんてつけてるところが
相手の意見をまともに聞こうとしない厨房であることが明らかなのだが。
0896デフォルトの名無しさんNGNG
>>868
比較する可能性があるならすべきだが。
0897デフォルトの名無しさんNGNG
>>891
板違い。マ板逝け。
0898デフォルトの名無しさんNGNG
論争嫌いがCスレに来る資格は・・・・無い!
0899デフォルトの名無しさんNGNG
ここは論争スレじゃなくて質問スレだろ。スレタイみろや。
どっちにしてもあふぉのJPSがつくった論争スレがある。
http://pc3.2ch.net/test/read.cgi/tech/1037105440/l50
論争すんだったらこっちでやった方がいいと思うよ。
実際このスレ寿命みじかいのは論争のせいだし。
このスレ以外に宿題とかなしでCのこと訊けるスレないじゃん
0900デフォルトの名無しさんNGNG
>>899
質問にどう答えるべきかの考え方が
人によって違うんだから、質問されたら論争になるのは
仕方がない。
0901デフォルトの名無しさんNGNG
ここの論争ってのは大抵簡単な質問から始まる。
簡単な質問が論争につながってしまうのは
Cが論争を引き起こしやすい言語だからだ。
0902デフォルトの名無しさんNGNG
>>900&901
じゃあスレタイ変えたほうがいいしょ?
質問&論争スレとかさ。
質問しにきた香具師が、困るにきまってる。
0903デフォルトの名無しさんNGNG
>>902
そしたら余計論争烈しくなるじゃん。
0904デフォルトの名無しさんNGNG
今ファイル操作をやってるんですが、コマンド引数を使わずに
char型の文字列にファイル名をプログラム中で入力させて、
読み込む事とかできますか?
また、それを関数に渡して、その関数の中で処理することはできますか?
0905デフォルトの名無しさんNGNG
>>903
だから分けろっつてんの。
質問きて論争になるんだったら、そっから論争スレにうつりゃいい。
0906デフォルトの名無しさんNGNG
>>904
「char型の文字列」では多分できない。
0907デフォルトの名無しさんNGNG
>>904
出来ます。
0908デフォルトの名無しさんNGNG
char 型の文字列
美女の女性が馬から落馬した
レス数が900を超えています。1000を超えると表示できなくなるよ。