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

C言語なら、俺に聞け! <18>

■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ C言語なら、俺に聞け! <17>
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50
0710デフォルトの名無しさんNGNG
>709
divダタ(;´Д`)
0711デフォルトの名無しさんNGNG
俺ならこれかな。試してないが。。
return n & 0x800 ? n | 0xf000 : n;
0712デフォルトの名無しさんNGNG
>>711
いや、それ確かにifは使ってないけど・・・
0713デフォルトの名無しさんNGNG
>>709
大抵って・・・・
0714デフォルトの名無しさんNGNG
>713
少なくともVC++6ではsar使ってくれましたです。ハイ
0715デフォルトの名無しさんNGNG
もしかして700の使ってるのって、32bit固定プロセッサ?
0716デフォルトの名無しさんNGNG
dst = ((~((((unsigned)src & 0x0800) >> 11) - 1)) << 11) | src;
自信無いけど…
0717探していますNGNG
誰か折れのティムティムをfarジャンプしてくれる人はいませんか?
0718デフォルトの名無しさんNGNG
>>707 のでいいんじゃないの?
0719デフォルトの名無しさんNGNG
>>718
シフトの動作が実装依存だから、100点ではない
0720デフォルトの名無しさんNGNG
1 の補数か 2 の補数かもわからんで。
0721720NGNG
と思ったけど、関係ないかもな。
0722700NGNG
使ってるのは普通のPCですよ
>>707でいいみたいですねー

と思ったら、ヤパーシダメなケースもあり?
つーか、負数が2の補数でない環境なんてあるんでしょうか?
あとシフトの動作が違うとか.… カナーリ特殊ですよね?
0723デフォルトの名無しさんNGNG
>>719
符号付き右シフトの前に、左シフトでオーバーフローする可能性がある。
未定義動作。そこまで気にするなら716のような方法でやるんじゃないか?
716のコードはなんか間違っているような気がするけど。

>>722
規格を読むことを勧める。
0724デフォルトの名無しさんNGNG
unsignedにしないと割り算の前(後?)に補正が入りますヨー
0725デフォルトの名無しさんNGNG
素直にビットフィールドを使うのが吉かも…
0726デフォルトの名無しさんNGNG
>>723 つか、シフト時の動作はANSIで決まってないか?
0727デフォルトの名無しさんNGNG
条件分岐してるけど、こんな形も
dst = ( 2048-src > 0 ) ? src : src-4096 ;
0728デフォルトの名無しさんNGNG
>>726
実装依存だよ。K&Rを読もう
0729727NGNG
12ビットの整数と言う時点で
すでに処理系依存の罠に掛かりかけてますので
素直にifを使う事をおすすめします。
ちなみに自分が書いた>>727も、もちろん処理系依存
0730デフォルトの名無しさんNGNG
未定義動作はまずいだろうけど、処理系定義なら、
承知のうえで使うのはアリなんじゃないの?
0731デフォルトの名無しさんNGNG
>>730
ここはCのスレだから
0732デフォルトの名無しさんNGNG
dst=(0x10000-(src&0x800))|src;
ではどうかな?
適宜キャストしてね。

でも、実際に自分が使うとしたら、処理系依存に目をつぶって
>>707あたりを使うと思うけど。
0733デフォルトの名無しさんNGNG
こんな所で
dst = src - (( src & 0x0800 ) << 1 ) ;
0734デフォルトの名無しさんNGNG
ふと思った
>>700
>A案
>des = souce <<4 >>4 // と書いたらコンパイラの最適化で無視されて値変わらず
>B案
>des = souce <<4; // と2段に分けたら正常に通ります
>des = des >>4;
>聞きたいのは、これに最適化を書けた場合、やっぱり無効化されちゃいますでしょうか?
何でA案は試してるのに、B案が無効化されるか試さなかったんだ?
つーか、やっぱりネタか?
0735デフォルトの名無しさんNGNG
美しさ(プを追求しているか、
理解を深めたいかのどちらかだろ。
コンパイラのバグをつつくというのもあるけど・・・
0736デフォルトの名無しさんNGNG
数字の桁数を求めるにはどうしたらいいでしょうか。
100といれれば3を返すような関数が作りたいのです。
お忙しい所、大変申し訳ありませんがどなたかご教授ください。
0737デフォルトの名無しさんNGNG
int keta = (int)log10(100 + 1.0);

0738デフォルトの名無しさんNGNG
なるほど!対数を使えば良かったんですね!
現役なのにすっかり忘れてましたー(;´Д`)

ありがとうございます。
試してみます!
0739デフォルトの名無しさんNGNG
浮動小数点使いたくなければこんなかんじ
int keta(int num)
{
int n = 1;
while ((num /= 10) > 0)
++n;
return n;
}
ただし正の数のみ
0740デフォルトの名無しさんNGNG
>>738
0 および負数の扱いはどうするんだ ? (>>739 だと 0 の時は、0 が返る
が良いのか ? (まあ、正数のみと言ってるからいいか...。))

>>737
間違ってるぞ。それだと、100 の時に 2 が返るぞ。
0741デフォルトの名無しさんNGNG
>>739ので合ってるんじゃない?
0742デフォルトの名無しさんNGNG
>>740
いや、最初に n=1 してるから num==0 だとしても1が返るんじゃないか?
0743デフォルトの名無しさんNGNG
log10つかうなら
int keta = (int)log10(num) + 1;
だね
0744デフォルトの名無しさんNGNG
100を文字列に直して
strlenとか
0745デフォルトの名無しさんNGNG
自分で実装するのが一番難しい標準関数はprintfですか?
あれだけ変換のバリエーションを持ちながら、最後に書き込んだ文字数を返すなんて凄すぎます。
ではまた(^-^)/~~
0746デフォルトの名無しさんNGNG
予約済みマクロは#undefできますか?
0747デフォルトの名無しさんNGNG
itoa()
strlen()
0748デフォルトの名無しさんNGNG
>>726
左シフトはオーバーフローしないのか。間違い書いてスマソ。
0749740NGNG
>>741-742, >>739
合ってるわ、ごめん。なんか勘違いしてた。

>>745
VC++ のライブラリソース見ると、printf() の下請け関数 output()
だね。UNICODE 対応などもあって実に 670 行もあるぞ。
0750デフォルトの名無しさんNGNG
C99だとsnprintfが一番かねえ。
sscanfもわすれずに。
0751デフォルトの名無しさんNGNG
(A+B)&0xFF=0x
をB=の形にするには、どうしたらいいでしょうか?
0752デフォルトの名無しさんNGNG
>>751
質問の意味が不明。
0753デフォルトの名無しさんNGNG
>>751
丸一分間じっくり眺めたんだけど...
0754デフォルトの名無しさんNGNG
>>751
A+B & 0xFF = C
B = C - A & 0xFF
???
0755デフォルトの名無しさんNGNG
>>752

&0xFFした時点で上位が失われてるから、
そうゆう意味でB=にするのはむりですよね?

結局どういう質問なんだかむしょうに知りたくなってきた。
0756デフォルトの名無しさんNGNG
int keta(int num) {
return num % 10 ? keta(int num % 10) + 1 : 1;
}
0757デフォルトの名無しさんNGNG
(A+B)&0xFF=0x
が
(A+B)&0xFF==0x00
と仮定して
B=0-A
の時なら成立するって事では?
0758デフォルトの名無しさんNGNG
>>756
size_t が妥当かと
って、その前に虫々やん
0759デフォルトの名無しさんNGNG
int keta(int num) {
keta(num, 1);
}

int keta(int num, int i) {
return num % 10 ? keta(num % 10, i + 1) : i;
}

推奨 -O4
0760デフォルトの名無しさんNGNG
ここらで 一息。
すごくくだらない質問です。
C++ と VisualC++ は同じ言語ですか?
コンパイラのソフトは一緒ですか?
0761デフォルトの名無しさんNGNG
は い そ の と お り で す
0762デフォルトの名無しさんNGNG
free( >>760 );
0763デフォルトの名無しさんNGNG
>>760

C++ : 日本語
Visual C++ : 関西弁

(別に「関西」に意味はなし。)
0764デフォルトの名無しさんNGNG
アイヌ語じゃなかったのか…
0765デフォルトの名無しさんNGNG
>>764
あなたは今、差別を行いましたね、差別を。
差別差別差別。

あ、社民党から電話なので、また明日。
0766デフォルトの名無しさんNGNG
>>760 マ ル チ ポ ス ト ハ ッ ケ ソ
0767デフォルトの名無しさんNGNG
system ("kill -9 760");
0768デフォルトの名無しさんNGNG
>>767 マ ル チ ポ ス ト ハ ッ ケ ソ
0769デフォルトの名無しさんNGNG
アイヌタン(;´Д`)
0770767NGNG
遅かった…
0771デフォルトの名無しさんNGNG
>>769
あなたは今、
戦う人を勝手に妄想していますね?
妄想してますね?
0772デフォルトの名無しさんNGNG
>>769
アイヌ、アプサラスのテストに行って参ります!
0773デフォルトの名無しさんNGNG
アイナ・サハリソ
0774デフォルトの名無しさんNGNG
アイヌ、サハリン・・・なんか関係ありげ。(無いか)
0775デフォルトの名無しさんNGNG
>>746
標準マクロが定義されている文脈では、そのマクロを
#undefしたり#defineしてはいけない。

例えば、NULLを定義するへッダをインクルードしたとき、
NULLを#undefしたり#defineすると未定義動作になる。

例外として、標準関数と同じ名前のマクロと両方が定義
されている(かもしれない)とき、「マクロじゃない方を
確実に使いたい」ために#undefするのは許されている。

また、
 最初の1文字がアンダースコア、2文字目が大文字
 最初の2文字がアンダースコア
の名前を#defineしたり#undefすると、常に未定義動作と
なる。
0776デフォルトの名無しさんNGNG
>>759
-O4の意味が分からんのでネタだと思うが一応…

#define keta(s) neta( 0, s )
size_t neta ( size_t size, int num ) {
 return ( size++, num /= 10 ) ? neta ( size, num ) : size ;
}
0777デフォルトの名無しさんNGNG
マ板ではキリ番でないと知りつつも777をゲットしたくなる罠。
0778デフォルトの名無しさんNGNG
>>777
ならマ板でやってください。
0779初心者にもなってないNGNG
Cの入門書を買おうと思っているのですが
オススメはなんでしょうか?
できれば評判のいい物を買いたいので・・・
0780デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/tech/1016722820/l50
推薦図書/必読書のためのスレッド

こっちいってください>>779
0781デフォルトの名無しさんNGNG
苗字が1文字じゃないひとの本なら、なんでも。
0782デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/tech/1018792875/
C本、古臭いK&Rいつまでも持ち上げるなヴァカ

こっちにいってください(藁>>779
0783デフォルトの名無しさんNGNG
>>781
林に倉・・・・
じゃあぼーよーはいいんだな?
0784781NGNG
しまった・・・
0785デフォルトの名無しさんNGNG
わざわざ末尾再帰にするバカ
0786デフォルトの名無しさんNGNG
char test[] = "aaa"."bbb";
のように文字列や数字をくっ付けるにはどうすればいいのでしょうか?
0787デフォルトの名無しさんNGNG
>>786
意味わからん
0788デフォルトの名無しさんNGNG
文字を結合したい訳です
0789デフォルトの名無しさんNGNG
両方定数ならただならべればよし。
"ABC" "DEF"
0790デフォルトの名無しさんNGNG
>>788
strcpy
0791デフォルトの名無しさんNGNG
VBみたいなことをやりたいんじゃなかろうか<文字列や数字
0792デフォルトの名無しさんNGNG
じゃなくて
strcat
0793デフォルトの名無しさんNGNG
出来ました ありがとう御座いました。
0794デフォルトの名無しさんNGNG
すみません。教えてください。
今月の日系ソフトウェアを読んでいるのですが、
構造体は、メンバ変数のサイズの合計とトータルのサイズが
違う場合があると書いてあるのですが
強制的にあわせるコーディング方法はありますか?
または、コンパイルオプションなどで指定するのでしょうか?
なにとぞご教授ください。
0795デフォルトの名無しさんNGNG
68 :参加するカモさん :01/12/11 17:29
ひろゆきってたまーに驚く程幼稚なセリフ真顔で吐くんだけど、いったいどういう
青春を送ってきたのだろう?
普通に成長を遂げた人間であれば赤面してしまうような恥ずかしいセリフ

82 :参加するカモさん :01/12/13 15:02
なんとなく言ってることわかる。
俺もひろゆきと何回か話したことあるけど、大昔のドラマでも見てるような気になった

95 :参加するカモさん :01/12/22 16:35
飲み会になると、必ず「遅刻」の話を得意気に語りだすけど、ひろゆきって遅刻することかっこいいと
思っているのかな?
回りの人間は苦笑するしかないけど、この人やっぱり幼稚だと思う
0796794NGNG
例えば固定長のレコードを読み込んだとき
そのままmemcpyで構造体にコピーできたら
便利なんですけど、メンバ変数に隙間ができると
それができないですよね?
どうしたらよいでしょう?
0797デフォルトの名無しさんNGNG
>796
好きなほうを選ぼう
1.gccとか、コンパイラのオプションで隙間をつめるオプションをつける。
  バウンダリの問題が発生するかもしれないけど、知らん。
2.固定長のレコードを吐く人は構造体の先頭アドレスからsizeof分吐くようにする。
  書き出しと読み込みのコードを統一管理できなきゃダメだが。
0798794NGNG
>>797
ありがとうございます。
書き出しのほうはいじれないので1しかないです。
バウンダリの問題とはどのようなものでしょうか?
0799デフォルトの名無しさんNGNG
ファイルやストリームに直接書き出すような構造体は、
処理系依存になるけどかならず #pragma pack みたいなので
構造体のパック方法を統一しておこう。

整数型とか、エンディアンが異なると死ねるけど、
同じコンパイラ・同じ環境で動かすならこれで十分。
0800794NGNG
>>799
ムムッ!!
エンディアンという問題もあるんですねー
実はVCでコーディング中なんですけど
動かすのはUNIXなんです。
こりゃーやばいっすねー
0801デフォルトの名無しさんNGNG
このスレももう800か。。。

http://isweb3.infoseek.co.jp/play/ayusya/ProgramAlgorithm.html
こことか参考になるのか?
"構造体のアライメント"でMSDNから調べてみるとか。
よくわからんけど。
0802デフォルトの名無しさんNGNG
>798
まーどうにもならないんだったら、ちまちま手作業でメンバに書いてけ。確実だ。

はい次
0803デフォルトの名無しさんNGNG
アライメント境界のことを言ってるんじゃねえカナ。

32bit型データの読み書きをするとき必ずアドレスが4で
割り切れることにおいとかないとプログラムが止まっちゃうような
CPUもあるからね。

pack(2)とかしたとき、
struct foo {
INT32 a;
INT16 b;
};
の構造体を連続したメモリに配置すると、
奇数インデックスの要素のa が、4で割り切れないアドレスに配置されちゃうことがある。

これをfread(buf, sizeof(foo), n, fp);
なんかで読み出して
buf[1].a とかをアクセスすると死んじゃうわけ。

対策としては一構造体ずつ(隙間を埋めつつ)読み込むことにするか、
一気に読んで、アクセス前に構造体を安全なメモリにコピーする、
もしくは構造体の末尾にダミーのデータを入れて、想定できるすべての環境で
問題が発生しないようなサイズ(4の倍数とか8の倍数)にすること。

0804デフォルトの名無しさんNGNG
>800
えんでぃあんはこんぱいるオプションか、または根性で乗り切れ。
つーかCPUは何と何だ?
0805デフォルトの名無しさんNGNG
>>800
いろんなプラットフォームにまたがって、かつ扱うデータサイズがそれほど
大きくないならテキストではき出すのが一番楽だよ。
XMLとかつかってもいいけど、タダのCSVで済むならそうしたほうがいい。
0806デフォルトの名無しさんNGNG
>>800
コンパイラによってはアラインメントを詰められないものもあったと思うよ。
VCだと #pragma pack でOKだけど、これはコンパイラ依存。
UNIXで使うコンパイラで使える技かどうか確認されたし。
0807デフォルトの名無しさんNGNG
>805
改行コードとか。ま、どうにでもなるか。
0808デフォルトの名無しさんNGNG
MACが絡まないなら改行はどうにでも...
0809デフォルトの名無しさんNGNG
つーかXMLって改行コード規定されてなかったっけ?
■ このスレッドは過去ログ倉庫に格納されています