トップページ⇒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
0680デフォルトの名無しさんNGNG
>>679
使っていないなら書くなよ(T_T)
0681デフォルトの名無しさんNGNG
>>679
PLAYER の定義箇所どこ〜〜〜?(泣
0682681NGNG
>>680
すまん。>>672見てなかった・・・
0683デフォルトの名無しさんNGNG
>>681
>>672をCyaraData.hに書くんだって。


ところで、またまたヘッダーファイルがないって言われたよ(T_T)
0684603NGNG
完全版は>673です
0685603NGNG
Input.cppは、
#include <windows.h>
#include "Input.h"
#include "CyaraData.h"
だけでOKです。

>>684
寒いから早く寝ろ
0686デフォルトの名無しさんNGNG
これは未だかつてない..
0687681NGNG
>>685
とりあえず、sprintf() を strcpy(mes,"なんとかかんとか");
にすると、問題ないねぇ。
0688603NGNG
Menu.cppは、関係ないですから削除してください
0689デフォルトの名無しさんNGNG
今動かしてみた感じ、0 <= SelectSuu < 5 の範囲なら正常に動いてるようだが。
< 5 の方のチェックがどこにもないので、キーを押しまくったら
すぐオーバーしそうだけど。そのせいじゃない?

つーかこの、Player[SelectSuu+1] 鬼のような+1の連発は止めんか?読みにくい。
0690603NGNG
>>689
じゃあ改造しておいてください
0691デフォルトの名無しさんNGNG
>>690
偽者はだまってろ。
0692デフォルトの名無しさんNGNG
WinMeだとsprintfでも問題ないな。
そんなOS使うなとか言わないでね
0693デフォルトの名無しさんNGNG
保存時のタイムスタンプおかしくね?
0694603NGNG
>>689
うまくいきました。
ものすごく迷惑かけました。
これから,リポビタンDを飲んで,ゲームを完成させます。
親切にありがとうございました。
0695デフォルトの名無しさんNGNG
>>689
とりあえず、問題無いとこは置いておこう。
0696デフォルトの名無しさんNGNG
>>694
がんがれ。
完成したら、教えてね。
0697デフォルトの名無しさんNGNG
コンセントぬいとけって
0698デフォルトの名無しさんNGNG
なんだこれ?
実行したらWindowsの色設定が勝手に変わったぞ、おぃ
0699デフォルトの名無しさんNGNG
っていうか、このプログラムかなりヤバイ
勝手にNortonの保護がoffになったし。
どっかで悪さしてねーか?
0700 NGNG
12ビットの符号付整数を16bitに拡張したいんですけど、符号判定にif文を使わないで
書いた場合

short des;
A案
des = souce <<4 >>4 // と書いたらコンパイラの最適化で無視されて値変わらず
B案
des = souce <<4; // と2段に分けたら正常に通ります
des = des >>4;

聞きたいのは、これに最適化を書けた場合、やっぱり無効化されちゃいますでしょうか?
つーか こーいう書き方ってどうよ?
temp = souce <<4
des = temp >>4
と書けば最適化の影響は受けないけど、 読む人に不親切なコードでしょうか?
0701デフォルトの名無しさんNGNG
des = ((1<<11) & source) << 4 | source;
0702デフォルトの名無しさんNGNG
>>700
des=(src<<4)>>4;
で出来るかも。
同じ状況の時、これで解決した事有る。
0703デフォルトの名無しさんNGNG
1111_11111111
が
10001111_1111111
にならない?
0704デフォルトの名無しさんNGNG
source = (((1<<11) & source) ? 0x7800 : 0) | source;
符号拡張は、MSBを拡張ビットすべてにコピーしないといけないんじゃないか?
分岐なしで出来るのか不明。
0705デフォルトの名無しさんNGNG
符号付型なら一度左SHIFTした後、右SHIFTすれば算術シフトでMSBがコピーされるという
主旨でしょ
0706デフォルトの名無しさんNGNG
シフトが算術である保証はないんじゃ?
0707702NGNG
スマソ
des=((short)(src<<4))>>4;
だった。
最適化で効果が無くなったと言うよりは、
演算途中でintとして解釈されていたからだと思う。
0708デフォルトの名無しさんNGNG
sizeof(1 >> 1);
あひゃ(゚∀゚)
0709デフォルトの名無しさんNGNG
>700
む。
val = ((short)(inval<<4))/16;
これでオッケーかと。コンパイラがidevじゃなくて大抵sar使ってくれます。
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の入門書を買おうと思っているのですが
オススメはなんでしょうか?
できれば評判のいい物を買いたいので・・・
■ このスレッドは過去ログ倉庫に格納されています