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

C言語なら俺に聞け! Part 112

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0210デフォルトの名無しさん2005/08/11(木) 02:22:31
>>205
'FILENAME.EXT' (8 + 1 + 3 = 12)
116 + 12 = 128
0211デフォルトの名無しさん2005/08/11(木) 02:33:14
PSPの制限が由来だな。
doskeyか何かとconfig.sysの設定で
2倍程度までは増やせた気もするが。
0212デフォルトの名無しさん2005/08/11(木) 03:13:39
>>209
なるほど。この場合、intが16bitだとcharの24bit shift結果は
規格上ロストする可能性があるということになりますね。
>>208
そうですね。キャストすることにします。
0213デフォルトの名無しさん2005/08/11(木) 11:05:42
>>182
何がどう厨ネタなのかわからんのだが。
心配するな、お前には受け渡ししないから。
そして、仕事しなくていいから。
>そんな不細工なソースを人に受け渡しするなら殴ってもいい。
それは自分自身のことにならないように気をつけることだな。
0214デフォルトの名無しさん2005/08/11(木) 11:51:07
>に何の意味があるか解説すると、もっと面白くなるかもしれないが。
それを言うなら、何がどう厨ネタなのか「解説すると、もっと面白くなるかもしれないが。」
0215デフォルトの名無しさん2005/08/11(木) 12:10:34
>>208
>規格上保障されるかどうかより、現実の実装で確実性の高い手法を使うべし。
規格上保証されているわけではないが、現実の実装で確実性が高いからその手法でも
まあいい、というのはわかるが、規格が保証されているものよりもあえて、規格は保証
されないが、現実の実装で確実性が高いものを推奨するという意味なのかな。
0216デフォルトの名無しさん2005/08/11(木) 14:17:24
こんにちは

Win32には、::IsDBCSLeadByte(char byte)という、マルチバイト文字かどうかを確かめるAPIがあるのですが、
ANSIライブラリにこのAPIと同様の機能をするものがありますか?
Googleで調べたのですが、どうもHitしませんでした。

教えていただけると助かります。

よろしくお願いします。
0217デフォルトの名無しさん2005/08/11(木) 14:47:35
ありません。
0218デフォルトの名無しさん2005/08/11(木) 16:14:52
linux板の方がいいのかな。

gccなんですが、/usr/include/linuxの下のヘッダではなくて、
/home/hoge/work/include/linuxの下にあるヘッダを読ませたい
んですけど、どうすればいいんでしょう。C_INCLUDE_PATHを

/home/hoge/work/include:/usr/include

と設定してるんだけど、どうしても標準インクルードの方が
優先されちゃうみたいで。
0219デフォルトの名無しさん2005/08/11(木) 16:20:41
素直に -I 使えよ
検索順序としては
-I > C_INCLUDE_PATHのような環境変数 > 標準ヘッダ
0220デフォルトの名無しさん2005/08/11(木) 16:34:30
> 素直に -I 使えよ

-Iは複雑なMakefileの中なんで。環境変数指定の方が優先
されると俺も思ってるんだけどなあ。/usr/includeとかの
クリティカルなパスは特別扱いされてるとか。その辺の事情
知らない?


0221sage2005/08/11(木) 16:41:54
>219
モノを頼んで悪いんだけどさ、今手元に環境あるんなら、

/home/hoge/work/include/linux/config.h:
#error "local"

main.c:
#include <linux/config.h>
main(){}

C_INCLUDE_PATH=/home/hoge/work/include gcc -c main.c

って試してみてくんない?
俺が阿呆なのかgccのblack magicに引っかかってるのか
切り分けたいんで。
0222デフォルトの名無しさん2005/08/11(木) 16:47:35
お前らスレ違い過ぎですよ。
処で、-Iは複数指定できるんでないかい?
0223デフォルトの名無しさん2005/08/11(木) 16:51:51
#include "lunix/config.h"
0224デフォルトの名無しさん2005/08/11(木) 16:53:18
-nostdinc してみるとか
0225sage2005/08/11(木) 17:37:02
やっぱスレ違いかの。だって「俺に聞け」って言うからさ。
ム板はめったに来ないので勝手が分からんでの。

> -nostdinc

なるほど、と試してみた。明示的に標準パスを付加してるはず
なんだけどなーんか微妙にエラーが出るんだよなー・・




ん?てことは/home/.../includeの方を読んでるってことかー?
てことは、阿呆なのはgccではなくやはり俺だったということかー?
0226デフォルトの名無しさん2005/08/11(木) 17:40:16
ていうかよく見たらあげてるな、俺。
0227デフォルトの名無しさん2005/08/11(木) 17:42:04
このスレでは、C言語自体の話題をするのであって、
Cコンパイラの実装の話は他のスレでやってくれ的なんだ
0228デフォルトの名無しさん2005/08/11(木) 17:45:23
Cursesとかで現在カーソルのある座標を取得する関数とかありませんか?調べていますがなかなか見つからない
0229デフォルトの名無しさん2005/08/11(木) 17:51:55
/home/の下読んでた。阿呆なのは俺だった。お騒がせ。
0230デフォルトの名無しさん2005/08/11(木) 17:52:18
>>228
あんたもスレ違いですから。
cursesは専用スレがないから環境依存OKスレかUnixプログラミングスレ辺りかな。
0231デフォルトの名無しさん2005/08/11(木) 17:58:52
>>230
スマソ、スレ違いでした。
CursesにはこだわっていないのですがC言語の標準関数では無理なんでしょうか?
0232デフォルトの名無しさん2005/08/11(木) 18:00:41
>>231
しつこいぞボケ
0233デフォルトの名無しさん2005/08/11(木) 18:04:58
>>231
誘導したんだから……
標準関数に座標を云々する関数がないことくらいすぐ判るだろ。
0234デフォルトの名無しさん2005/08/11(木) 18:12:32
>>213,214
ふうむ、スレ違い相当の低脳厨がはりついてるのだけはよくわかった。
0235デフォルトの名無しさん2005/08/11(木) 20:16:06
はいはい埋め埋め
0236デフォルトの名無しさん2005/08/11(木) 22:10:54
C言語に限らないんだけど質問させて

テストの時、トレースするのめんどいからprintf文で値確かめようとしたら
ソースが汚くなるからやめろっていわれた。テスト終わったら消すっていったんだけど
めんどくさがらないでトレースしろ、といわれたんだけどこれって普通?

知りたい値が最初から決まってるんだからprintfでいいと思ったんだけど
わざわざデバッガでトレースするのめんどくせーし
0237デフォルトの名無しさん2005/08/11(木) 22:18:36
>>236
GUIプログラムとかprintfで出力する先がないときもあるし。
0238デフォルトの名無しさん2005/08/11(木) 22:23:13
>>236
たんなるprintfじゃ、確かに見難くなるかもな。
デバッグ出力用の専用ライブラリを使うなり作るなりしろ。
DBG_PRINT() とか DBG_MSG() みたいな用途がハッキリ分かるマクロなら、そんなに可読性を損なうこともない。
リリース時にはマクロでブランクに置換。
0239デフォルトの名無しさん2005/08/11(木) 22:27:24
デバッガ用のマクロ/スクリプトを書くのが良い方法
と思ったが、その種の機能は使っているデバッガに有りや無しや
0240データボックス2005/08/12(金) 00:25:34
 int n1;

 n1 = 1 //* */ 2
  ;
 
 if (n1)
 printf("何で 0 にならないんだ?\n");
0241デフォルトの名無しさん2005/08/12(金) 00:33:47
>>240
最近のCコンパイラはC++ コメントを理解するから //
以降がコメントとされて消えたと思われ。
0242デフォルトの名無しさん2005/08/12(金) 00:35:22
なんでマジレス?
0243デフォルトの名無しさん2005/08/12(金) 00:58:36
>>236
そもそも、テストの時始めからデバッガ使うなんて横着。
0244デフォルトの名無しさん2005/08/12(金) 01:03:33
全関数全分岐、ステップ実行で目視確認するのかね。
近寄りたくないチームだ。
0245デフォルトの名無しさん2005/08/12(金) 01:16:04
>>236
debugはマクロ使うな。
テスト後にデバック用printfの削除だと
消し忘れが発生するかもしれない。

出荷やソースコードのcvs管理等をやってない、
どーでも良いプログラムならprintfでも有りだけど。
0246デフォルトの名無しさん2005/08/12(金) 01:19:32
マクロの消し忘れと、cvsの関係が分からん。
0247デフォルトの名無しさん2005/08/12(金) 01:21:04
単に最初の一行はその後の文章と何の関係もない文章なのか?
下手だな。日本語。
0248デフォルトの名無しさん2005/08/12(金) 01:24:07
消すのはもったいないなぁ。
起動パラメタなどでデバッグレベル調節できるようにすればリリースバージョンでも
デバッグメッセージ消さなくても済む。
0249デフォルトの名無しさん2005/08/12(金) 01:31:43
まぁ、ASSERTとかTRACEとかのマクロ使うよな、大抵。
0250デフォルトの名無しさん2005/08/12(金) 01:37:05
>debugはマクロ使うな。
この文は「俺はマクロを使うよ。」、「お前らはマクロを使ったらダメだ。」のどちらにも取れる。
>>245は、前者の意味で書いたと思うが、>>246- は、後者の意味で読んでいると思われ。

>>247の2行目に同意。
0251デフォルトの名無しさん2005/08/12(金) 16:02:12
えーと、いまソケット通信を行うプログラムを作っています。
送受信ともにselect()を使って待機させているんですが、
CPU使用率が99%とかいってしまいます。

OSはRedHat9 2.4.20-6です。
0252デフォルトの名無しさん2005/08/12(金) 16:09:21
で?
0253デフォルトの名無しさん2005/08/12(金) 16:09:27
>>251
独り言ですか。邪魔です。
0254デフォルトの名無しさん2005/08/12(金) 16:12:25
>>251
タイムアウト時間をきちんと設定してください。迷惑です。
0255デフォルトの名無しさん2005/08/12(金) 16:15:54
selectの使い方を間違ってるんじゃないの?
selectから読み書き可能だと通知されたファイルを放置してるとか。
02562562005/08/12(金) 16:21:04
 
0257デフォルトの名無しさん2005/08/12(金) 16:22:31
>>256
なるほど・・・そういう考えもありか
02582512005/08/12(金) 16:23:30
肝心の質問かいてないおれアホッス

CPU負荷率が高いのはselect()使ってたら、しょうがないんですか?
(タイムアウトなしです)
下がられるなら下げたいので、その方法もお願いします。

で、もしかして答えは>>254だったり?
0259デフォルトの名無しさん2005/08/12(金) 16:26:54
マニュアルよんだのか?
読んでないのなら読め
読んだのなら理解できてないからもっかい読め
0260デフォルトの名無しさん2005/08/12(金) 16:33:51
あと、man select_tutの内容もチェックな。
0261デフォルトの名無しさん2005/08/12(金) 16:42:19
つーか、スレ違いだがね。
0262デフォルトの名無しさん2005/08/12(金) 16:55:02
>>260
解決しました、ありがとう。

ちなみに原因↓

SELECT の掟
10. タイムアウトの値は select を呼ぶたびに初期化すべきである。 OS に
よっ て は timeout 構造体を変更する場合があるからである。ただし
pselect は、自分の timeout 構造体を変更することはない。
0263デフォルトの名無しさん2005/08/12(金) 18:47:56
日本語のマニュアルをよんでる時点で
こいつの程度が分かるな
0264デフォルトの名無しさん2005/08/12(金) 18:50:46
>>263
その程度の事しか見ていないお前の程度も解かるよ。
0265デフォルトの名無しさん2005/08/12(金) 19:01:44
>>263
Linuxユーザは基本的に日本語マニュアル読んでるな

0266デフォルトの名無しさん2005/08/12(金) 19:03:10
MIKO GNYOユーザーの俺が来ましたよ
0267デフォルトの名無しさん2005/08/12(金) 19:13:31
>>265
読んでないんじゃなくて読めないんだと思う
イベントとかいったら、たまにLinux使ってる人と話すことがあるけど
そのときになんか聞いたりすると、マニュアル見て英語だったら一瞬で閉じて
googleで日本語サイト限定にして検索する
めっちゃ古いのとか、gnuのじゃなかったりしてもお構い無しにそれを読んでた
0268デフォルトの名無しさん2005/08/12(金) 19:20:53
ここで英語のマニュアル引用しても、読める奴がいないしな。
0269デフォルトの名無しさん2005/08/12(金) 21:25:35
2chは日本人用の掲示板ですから
英語にかぶれた非国民は出て行け!
0270デフォルトの名無しさん2005/08/12(金) 21:32:05
プ
0271デフォルトの名無しさん2005/08/12(金) 21:52:38
正直、K&Rの「5.12 複雑な宣言」が理解できなかった。

char (*(*x[3])())[5];

ってなんだよ?こんな変態じみた宣言を普通に使ってるのか、おまえら?
俺は、宣言の意味さえ分からん・・・
0272デフォルトの名無しさん2005/08/12(金) 21:55:37
必要だからそう宣言するだけ
意味が分かればそれが分かると思う

意味が分からないということは
それが必要でないって事
必要でなければ知る必要もないでしょ
0273デフォルトの名無しさん2005/08/12(金) 21:55:57
そういうのはtypedefで分解してやるとわかりやすいかも
0274デフォルトの名無しさん2005/08/12(金) 21:58:57
char を返す関数ポインタの配列の配列へのポインタ?

なんか戻り地の書き方が変なような。
0275デフォルトの名無しさん2005/08/12(金) 21:59:36
お前ら真面で分からないのか・・・
0276デフォルトの名無しさん2005/08/12(金) 22:00:23
ただの配列じゃん
何が分からないのか分からん
0277デフォルトの名無しさん2005/08/12(金) 22:00:42
関数ポインタの配列と理解した
0278デフォルトの名無しさん2005/08/12(金) 22:04:09
複雑すぎる宣言は使いみちはあまりない。
>>273 みたいなのは、、二段のディスパッチテーブルに分解したほうが使いかってがいい。
0279デフォルトの名無しさん2005/08/12(金) 22:04:28
>>271
http://kmaebashi.com/programmer/pointer.html
x is array[3] of pointer to function() returning pointer to array[5] of char.
つまりxはcharの配列[5]へのポインタを返す関数へのポインタの配列[3]。
0280デフォルトの名無しさん2005/08/12(金) 22:06:27
いや見ただけで分かるだろ
0281デフォルトの名無しさん2005/08/12(金) 22:09:25
こう言うの、一瞬見ただけで分からないと、Cプログラマーを名乗ってはいけないのか?
0282デフォルトの名無しさん2005/08/12(金) 22:10:29
むしろ解るやつはPerler
02832742005/08/12(金) 22:11:18
「配列へのポインタを返す」ってとこが分からんかった。
つか今でもピント来ないな。

char (*)[]

配列へのポインタだろ。これを返す関数は。どういうプロトタイプになるんだ?

char (*)f()[]

char (*f)()[]

うーん。
0284デフォルトの名無しさん2005/08/12(金) 22:11:24
いけなくは無いと思うけど
charとキャストとポインタが分かってたら分かるだろ
それらを理解してたつもりで上を読んで理解できなかったのなら
理解できてなかった証拠でしょ
0285デフォルトの名無しさん2005/08/12(金) 22:14:41
>>271を読み解くのは問題ないけど、
typedef どう使うのかわからん。
0286デフォルトの名無しさん2005/08/12(金) 22:22:04
>>283
char (*)[]を返す関数はchar ((*)[])()。全体を括弧でくくって右に関数の括弧を付ける。
0287デフォルトの名無しさん2005/08/12(金) 22:22:19
>>285
俺ならこうやる(型名が糞とか抜きね)

typedef char FIXEDSTRING5[5];
typedef FIXEDSTRING5 *LPFIXEDSTRING5;

以下略
0288デフォルトの名無しさん2005/08/12(金) 22:23:54
>>285
つまり自分で書くソースにあんな宣言が必要になったら>>287みたいにtypedefを使うということ。
既存のものを読み解くのに使えるわけではない。
0289デフォルトの名無しさん2005/08/12(金) 22:35:31
>>285
typedef char (*Type_X)[5];//char型配列[5]のポインタ
typedef Type_X (*Type_FuncX)();//Type_Xを返す関数のポインタ

//検証用 これでコンパイラ通れば正解。
char (*(*x[3])())[5];
Type_FuncX lp = NULL;
x[0] = lp;

0290デフォルトの名無しさん2005/08/13(土) 06:32:25
なんで、
char*[5] (*f[3])();
じゃないの?演算子の優先順位の問題?
0291デフォルトの名無しさん2005/08/13(土) 06:36:24
ああそうか。悪い、スルーしてン。
0292デフォルトの名無しさん2005/08/13(土) 13:53:41
関数ポインタが入った段階で typedef しちゃうへたれだけど、とりあえず
ttp://www.kouno.jp/home/c_faq/c1.html#21

char (*(*x[3])())[5]; を typedef 分解するとこんな感じだろうか。

typedef char A[5]; /* A = (*(*x[3])()) -> A *(*x[3])(); */
typedef A *B; /* B = (*x[3])() -> B (*x[3])(); */
typedef B C(); /* C = (*x[3]) -> C *x[3]; */
typedef C *D; /* D = x[3] -> D x[3]; */
D x[3];

あるいは
typedef A x[3]; /* typedef char (*(*A)())[5]; */
typedef B *A; /* typedef char (*B())[5]; */
typedef C B(); /* typedef char (*C)[5]; */
typedef D *C;
typedef char D[5];

>286
それだと、char 型を返す関数の配列へのポインタにならない?
char (*f())[5] じゃないか?関数ポインタの型だと char (*(*)())[5] かな。
0293デフォルトの名無しさん2005/08/13(土) 22:11:48
コマンドラインからもらったargv[]がファイルなのかディレクトリなのか
判断するにはどうすればいいですか?
02942932005/08/13(土) 22:12:31
すいませんWinXPです。
0295デフォルトの名無しさん2005/08/13(土) 22:27:14
>>294
>>1
0296デフォルトの名無しさん2005/08/13(土) 22:42:50
>>293
argv[]は単なる文字列へのポインタ。
その文字列が、ファイル名かディレクトリ名か、
あるいは、その他の意味を持つ文字列かは、
コマンドラインで実行した本人以外は誰もわからん。

その文字列と同じ名前のファイルやディレクトリが
存在するか確認する方法はOS依存。

まあ、拡張子が付いていたらファイル、それ以外はディレクトリ、
ファイル名、ディレクトリ名に使用できない文字があったらエラーとか、
ファイルをオープンしにいって、成功したらファイル、それ以外はディレクトリとか、
そんな安易な実装でいいんだったら、純粋なCでも可能だけど。
0297デフォルトの名無しさん2005/08/13(土) 23:04:40
>>296
そんな安易な実装について聞いているんだろ
OS依存といってもPOSIX準拠な方法があるんだから
もうstatでいいじゃん。面倒くさい。
0298デフォルトの名無しさん2005/08/13(土) 23:10:16
やれやれだぜ
02992932005/08/13(土) 23:42:56
>>297
statをmsdnで調べて出来ました!
ありがとうございました。

>>296
決して安易という訳ではないんですが、
こういうシステム依存の部分て調べ辛くて…
文法とかアルゴリズムは良く見つかるんですけどね。

>>295
言いたいことはよく分かるのですが、
正直、1のリンクからは見つけられませんでした。
0300デフォルトの名無しさん2005/08/13(土) 23:55:13
>>295みたいなのはマジであほというか、ナンセンス
>>296みたいなのは長々と書いてるだけで何の情報も無い
長文結構だが、その中にこっそり情報混ぜてやれよ

こういう>>293みたいなやつにはヒントをあげるだけでいいんだよ。
問題はそのヒントのセンス。
0301デフォルトの名無しさん2005/08/14(日) 00:13:28
ナンセンスとかヒントとか使う奴増えたなー
0302デフォルトの名無しさん2005/08/14(日) 03:45:39
ヒントが増えたことは認めるがナンセンスは認めない
0303デフォルトの名無しさん2005/08/14(日) 04:25:25
>296はダメダメだな。例えばa.txtなるディレクトリがあるやもしれん。
0304デフォルトの名無しさん2005/08/14(日) 05:51:39
ううむ、夏の補講で残されてる数人だけが
俺だって勉強してると言わんばかりに
とくいげに無駄話ばかり続ける状態。
0305デフォルトの名無しさん2005/08/14(日) 12:03:39
ファイルの内容を%x使わないで16進数に表示させたいのですが、どうやったらいいんでしょうか?
0306デフォルトの名無しさん2005/08/14(日) 12:06:27
宿題は宿題スレへ
0307デフォルトの名無しさん2005/08/14(日) 12:06:43
>>305
%x使うのが一番楽。
0308デフォルトの名無しさん2005/08/14(日) 12:11:28
宿題スレにいきます
0309デフォルトの名無しさん2005/08/14(日) 12:12:16
猫でもわかるC言語プログラミングという本を見ながら
勉強しようとしたんですが、わからない事があります。
Microsoft Visual C++ .NET にて

/*hello.c*/
#include <stdio.h>
int main()
{
printf(
"Hello ""World\n");
return 0;
}

というのをビルドしたんですが
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。

と、エラーが二つでます。 どうしたらいいのでしょうか?
設定があるのですか? それともソースを変えなきゃ行けないのでしょうか? 
■ このスレッドは過去ログ倉庫に格納されています