C言語なら、俺に聞け! <9>
■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe Youichi
NGNGあちこちの言語に手を出したが結局極めたのは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言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0083デフォルトの名無しさん
NGNGな処理系、あるいは両者のcastがうまくいかない処理系って
どんなのがありますか?規格では保証していないようですが。
0084デフォルトの名無しさん
NGNGそのやりかた、あってる?
あと、FAQの何章に書いてありました?
見つからなかった(^^;
0085デフォルトの名無しさん
NGNGいいんじゃないの?
それならcharでもintでもいけるし。たぶん。
最上位ビットを残して云々 って一瞬考えたけど
処理系にすげー依存しそうだしやめた。
0086デフォルトの名無しさん
NGNGマイナスのとき、処理がうまくいかないよ。
0087Kusakabe Youichi
NGNGIn article >>81, 81 デフォルトの名無しさん
wrote:
> for( i = 0; i < M; i++ ) {
こういうふうに「for」と「(」をはくっつける、
「(」と「)」の内側に空白を明けるっていうのは、
どこの影響だろう :)
括弧のフォントをデザインした人がかわいそうだ :)
0088デフォルトの名無しさん
NGNGでも、そういうのはアセンブラで書いたほうが確実。
処理系依存部分は、処理系依存言語に任せる。これ最強。
0089Kusakabe Youichi
NGNGwrote:
> 符号付き整数を符号維持したまま右シフトするもっとも単純な方法って?
「>>>」 :-P
> FAQには符号付き整数の右シフトは処理系依存と書いてあります。
> #define RSHIFT(i,n) ((i>0?1:(-1))*(signed)(((unsigned)i)>>n))
> こんな馬鹿みたいなのしか思いつかないのですが。
unsignedにcastするか、負の場合だけ場合分けしてmaskを使うかでしょうね。
009082
NGNGすみません。処理系依存とは書いてないですね。
ですが Q20.15(書籍版ですが)に「負の数を右シフトすることは割算と
等しくない」とあります。
また、K&R第2版の253ページに「右シフトを負の数にした場合、結果は処
理系依存」という旨の文章があります。
>>84,86
思いきりまちがえてますね。失礼しました。
(ちょっとオリジナルFAQ&JIS本見る時間が無いので夜まで失礼します)
0091デフォルトの名無しさん
NGNG右シフトしたときに処理系によって
0が入るのと符号がはいるのと両方ある
って書いてあるね
手元のだとP60だから、まあその辺
0092デフォルトの名無しさん
NGNG>>> って古いコンパイラでもつかえる?
0093デフォルトの名無しさん
NGNG60点。確率が均等でない。
ためしにN=2でtable[0]が2になる確率を考えてみろ。
19,4c19,7
< int r = rand() % M;
< int tmp = table[i];
< table[i] = table[r];
< table[r] = tmp;
---
> int r = rand() % (M - i);
> if (r) {
> int tmp = table[i];
> r += i;
> table[i] = table[r];
> table[r] = tmp;
> }
0094Kusakabe Youichi
NGNGwrote:
> なるほど、カニチャーハンには
> 右シフトしたときに処理系によって
> 0が入るのと符号がはいるのと両方あるって書いてあるね
私なら、「そこだけJavaやる」:) も。
なんでCには「>>>」がないんだろうね。
0095Kusakabe Youichi
NGNGwrote:
> >>89
> >>> って古いコンパイラでもつかえる?
いや、新しいのでも無理では?
0096デフォルトの名無しさん
NGNG> 私なら、「そこだけJavaやる」:) も。
もうね、アホかと。馬鹿かと。
0097Kusakabe Youichi
NGNGwrote:
> >>94
> > 私なら、「そこだけJavaやる」:) も。
>
> もうね、アホかと。馬鹿かと。
そんなにうれしいですか? :)
0098デフォルトの名無しさん
NGNG0099Kusakabe Youichi
NGNGwrote:
> インラインアセンブラはあっても、インラインジャヴァはありません
あってもだれもつかわなそう:)
0100てきとう
NGNG0101てきとう
NGNGかっこがおおいのはかんべんしてちょー ぷりぷり
0102デフォルトの名無しさん
NGNG> なんでCには「>>>」がないんだろうね。
Cは実行効率至上主義だから。
CPUの都合を考えて実行効率の良い方法でやっちゃって良いよって方針だから。
符号拡張しなけりゃならんとか決めたら、
そーゆー命令のないCPU上で実行効率が落ちるから、そーゆーのを嫌って。
0103Marezo
NGNG0104デフォルトの名無しさん
NGNGそれnが2以上だと
0105味噌醤油醸造株式会社
NGNGうちのPCだと、変な結果になります(T-T)
0106デフォルトの名無しさん
NGNGうん。間違ってるもん。
0107初心者
NGNG画面上のラインとカラムを指定して、値の入力・出力ができるんでしょうか?
又、表形式で罫線をひいたりすることはできるんですか?
C言語入門の本は読んだのですが、上記の部分は載っていませんでした。
公開されているサンプルPGも調べてみたのですが、
(調査不足ならすいません)見つけることができませんでした。
教えてください。
0108デフォルトの名無しさん
NGNGncursesのようなライブラリが用意されてれば
それを使うがいいし、もしなければ
機種依存上等!てな感じで
コントロールコードやエスケープシーケンスを駆使して
描画すればいいじゃん、って感じ
0109初心者
NGNG0110デフォルトの名無しさん
NGNG絵を描きたいならそう言えよ。
0111初心者
NGNGすいません。
本には一行単位で入出力が行なわれているんですが、
画面単位で特定の項目の内容を受け取りたい場合や
画面単位で項目名や注意書きを表示する方法が
無かったんです。
で、調べていくうちグラフィック関数の名前だけを知り
それで、表作成ができるのかなと思ってたんです。
0112Kusakabe Youichi
NGNGん wrote:
> > なんでCには「>>>」がないんだろうね。
>
> Cは実行効率至上主義だから。
> CPUの都合を考えて実行効率の良い方法でやっちゃって良いよって方針だから。
> 符号拡張しなけりゃならんとか決めたら、
> そーゆー命令のないCPU上で実行効率が落ちるから、そーゆーのを嫌って。
でも、その割には1の補数とか、1命令でできないハードウェアもたまに
存在するのに、演算子はありますね。
0113デフォルトの名無しさん
NGNGたとえばどのハード?
そういうハードに出会ったこと無いので教えてほしい
0114デフォルトの名無しさん
NGNG>>82 のまんまでいいと思うけど。
0115Kusakabe Youichi
NGNGyndns.org> wrote:
> C言語で画面の制御はどんな関数を使用するんですか?
環境依存でしょう。
0116デフォルトの名無しさん
NGNG11111000 -8
(unsigned)
00001000 8
>>1
00000100 4
符号復活
11111100 -4
あー>>82のままでいいのか。納得
0117あぼーん
NGNG0118Kusakabe Youichi
NGNGん wrote:
> >>112
> たとえばどのハード?
> そういうハードに出会ったこと無いので教えてほしい
正確には「ない」のではないかもしれないが、
メルコムとか、その上のCの処理系が履くコードをみてみると、
わざわざ数命令で実現しているので、「ない」のだと思ったが。
(そのマシン純正のfortranもそうだったのでたぶん本当にハード的にないんだと思
う)
まあ、「ないようなハードがいけない」といわれればそれまでだが、
だったら「>>>」も入れてくれてもいいのになーと思ったわけです。
0119デフォルトの名無しさん
NGNG>あー>>82のままでいいのか。納得
printf("%d\n", RSHIFT(-8,1));
うちで実行すると結果はこうなります。
-2147483644
これで、いいんでしょうか?
(俺が勘違いしてるかのかな?)
0120デフォルトの名無しさん
NGNGおいおい確認もしないで発言してたのかよ
0121デフォルトの名無しさん
NGNG>>100のはどうよ?
0122デフォルトの名無しさん
NGNG0x80000004 だな
なんかヘンテコリン
0123デフォルトの名無しさん
NGNG0124デフォルトの名無しさん
NGNGprintf("%d\n", RSHIFT(-8,1));
で結果は
-4
だった。
0125デフォルトの名無しさん
NGNGじゃあ>>100のが正解か
もうちっと短くならんかね?
0126デフォルトの名無しさん
NGNGそれじゃあ、iが負のとき正になっちゃうんじゃないか?
0127デフォルトの名無しさん
NGNGC++は?
VBは?
誰か教えて!
0129初心者
NGNG環境依存って、例えばエクセルやアクセスで画面展開して、
必要項目をテキストファイルでCで受け取る。
というような事ですか?
0130デフォルトの名無しさん
NGNGCは二ヶ月。
C++は半年。
VBは一日。
0131about:RSHIFT
NGNG内部表現が2の補数であるという仮定に基づいていると
思いますが、この仮定って規格で保証されてましたっけ?
保証されていない場合、最上位ビットの判定は
n&~((~((unsigned)0))>>1)
でいいでしょうか?
この問題って、いかなる内部表現であれ、
2の補数表現の数を2で割ったようなビット操作を
エミュレートせよ、ってことなのかな。。
0132デフォルトの名無しさん
NGNGどんな感じでやればいいのでしょうか?
char *buf[4][8];
今は下みたいにしていて、コンパイルは通るけど
sub関数でmemcpyをして、その値を出そうとするとcoreを吐いてしまうのですが
void sub( char *[][] );
main(){
char *buf[4][8];
sub( buf );
}
sub( char buf[][8] ){
}
0133デフォルトの名無しさん
NGNGおおっと。たしかにそんな規定は無いかもしれないけど
内部表現が2の補数じゃないアーキテクチャって
どんな表現なのかな?
つーかビット演算って
0134デフォルトの名無しさん
NGNGmain(){
char *buf[4][8];
sub( buf );
}
sub( char *buf[][8] ){
}
でいいんでないの?
0135デフォルトの名無しさん
NGNG数値表現は全て正数表現っていうアーキテクチャが一部の
大型計算機にある(あった?)というのを聞いたことがある。
正か負は符号ビットで判断するんだって。
0136Kusakabe Youichi
NGNGん wrote:
> Cを習得するのにどれくらいかかった?
3日
> C++は?
3週間
> VBは?
3version:)
0137Kusakabe Youichi
NGNG> こんな感じの変数を宣言した場合、関数に渡すときって
> どんな感じでやればいいのでしょうか?
>
> char *buf[4][8];
> 今は下みたいにしていて、コンパイルは通るけど
> sub関数でmemcpyをして、その値を出そうとするとcoreを吐いてしまうのですが
>
> void sub(char *[][]);
> sub(char buf[][8])
っていうか、よくコンパイル通りますねえ
0138デフォルトの名無しさん
NGNG>Cを習得するのにどれくらいかかった?
一年くらいかかた。
COBOLをやってたから、最初は、ローカル変数とか引数ってのが
ビンとこなくて、変数は全部、ソースの先頭のところにグローバル
で使ってた。しかも仕事で。はっはっは!
0139デフォルトの名無しさん
NGNG>sub関数でmemcpyをして
なにやりたいのか,よくわからんのだけれど,
*buf[][]に、memcpyするってこと?
0140デフォルトの名無しさん
NGNGそれはageなくちゃいけないような内容なのか?
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNG処理系依存じゃないか?
0143デフォルトの名無しさん
NGNG2進数表現を素直にマッピングできないような
アーキテクチャのマシンわざわざ作る奴いないだろ。
数字を左から書く文化圏でコンピュータが発明されていたなら
あったかもしれないけど。
数値にグレイコードとか使う変態マシンも理論上ありえるけど
アキュムレータが大変なことになりそう。
0144デフォルトの名無しさん
NGNGで、cpadのコンパイラパス入力すれば歓声〜〜、ですか?
0145C初心者
NGNG0146デフォルトの名無しさん
NGNG破って尻を拭かないように。
0147デフォルトの名無しさん
NGNG右にシフトしたら数が小さくなる、んじゃなくて、
シフトして数が小さくなる方向が右、なんじゃない?
0148デフォルトの名無しさん
NGNG0149C初心者
NGNGありがとうございます。
他の本でK&Rをケチョンケチョンにこき下ろしてる記述(K&RはC言語を分かりづらくしている諸悪の根源とか)
があったりするのですが、実際どうなのでしょうか・・・・。
0150デフォルトの名無しさん
NGNGCが分からないと言う奴はそもそもK&Rを読まない。
0151C初心者
NGNGオレもそう思うんですけどね。。。
K&Rをこき下ろしてる本とは、これです。↓
http://www2.gihyo.co.jp/books/bookinfo.asp?ID=971
0152デフォルトの名無しさん
NGNGだからintは4バイトだの、void mainだのって平気で書いちゃう
K&Rには未定義な動作は未定義と書いてるだけだから、そこは別途調べる必要が有ります
0153C初心者
NGNGいや、この本はその辺はちゃんとしてます。
void main についてもわざわざ欄を設けて説明してありました。
0154デフォルトの名無しさん
NGNG0155C初心者
NGNGと、言いますと?
0156デフォルトの名無しさん
NGNGああ、あれか。K&Rの第五章を焼き直した本ね。
参考文献にK&Rが入っていないCの本は見たことない。
参考文献すら書いてない本は買うに値しない。
ちがう?
0157C初心者
NGNGそんな、オレを責められても困りますよ。
0158デフォルトの名無しさん
NGNG3分で吐き気がした。
コンピューターとは話せるが、まともな人間と普通のコミュニケーションが取れないヲタが文章を書くと、ああなるという、良い見本だった。
教育学の教科書にサンプルとして採用しようと思った。
もちろん、ダメな解説例として。
人にわかりやすく物事を教えるには、それなりに「教えるスキル」が必要だ。
カニチャーハンは、その辺がまったくわかっていない。
K&Rは、最後の一冊として読むべきだ。最初に読んではいけないし、勉強の途中で読んでもいけない。
ほとんど全部他の本を読み尽くして、C++に逝く直前に読むと良い。
0159C初心者
NGNGワロタ!
0160C初心者
NGNG0161デフォルトの名無しさん
NGNG> うーん、K&R買わなければ良かったかなあ・・・(鬱
買っといて損はない。
K&Rが理解できればCの文法は理解したと思って良い。
あと、K&Rは規格書やマニュアルに近い書き方なので、
慣れていない人が読むと>>158のような感想を持つでしょう。
0162デフォルトの名無しさん
NGNGK&R はあくまで「Cの入門書」であって「プログラミングの入門書」でも教科書でも
ないからね。
基本的なプログラミング技術が身についていない人間が読むのは、ちょっと辛い。
身近に質問できる先輩とかいれば、どうにかなるけど。
0163C初心者
NGNGなるほど・・・。
「解説書」ではなくて「規格書」「Cの定義文」みたいに接すれば有用だということですね?
0165デフォルトの名無しさん
NGNG0166C初心者
NGNGその話はよく聞きますね。
0167デフォルトの名無しさん
NGNGあれって許可いるのか?
0168C初心者
NGNG0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNGいや、引用でなくて、丸ごと一冊訳そうとたくらんどるんだけど。
0172デフォルトの名無しさん
NGNGどっかスレ作って、そこでガンガン訳しちゃうってのはどう?
添削も出来るし。
まーこの際著作権は無視だな、ムシ
0173デフォルトの名無しさん
NGNGなんならオレがその役をかってでてもいい
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNG役所が金出してくれればいいんだが。
0176デフォルトの名無しさん
NGNGこきおろしている、というより「時代遅れな記述がある」と言っているんじゃ・・・
俺にはそう読めましたが。
(まあ、たしかにどうでもいいあげあしとりもありますが)
0177Marezo
NGNG勘違いしていた(^^;
#define RSHIFT(i,n) i<0 ? (signed)!(!(unsigned)i >> n) : i >> n;
確か「!」はnotだったはず。
0178デフォルトの名無しさん
NGNGつーか負の表現に2の補数を使ってるところなら
>>100で完了してるんだけど、どうよ?
0179デフォルトの名無しさん
NGNGstatic void hoge();
void hoge();
returnした時に挙動が変わるようなのですが・・・・
よろしくお願いします。
0180デフォルトの名無しさん
NGNG外部から参照できる(static なし)かできないかの違い(static)
0181デフォルトの名無しさん
NGNGstatic にすると同一の翻訳単位 (厳密に言うと #include とかあるからアレなんだが、
基本的には同じ *.c に書いてある範囲)からしか呼び出せない。static にしないと、
外部からでも呼び出せる。
> returnした時に挙動が変わるようなのですが・・・・
それは static 変数と勘違いしてないか?
018282
NGNGなんだかお題の書き方が曖昧だったみたいですんません
割算をしたいという趣旨ではなくて、最上位ビット以外をシフトしたい
ということでした。てことでいろいろヒントをいただいた結果こんなん
になりました。
#define MASK ((~(unsigned)0)>>1)
#define RSHIFT(i,n) (signed)((i<0?(~MASK):0)|(((unsigned)i&MASK)>>n))
簡単にならんかな・・・
■ このスレッドは過去ログ倉庫に格納されています