トップページ⇒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
0655デフォルトの名無しさんNGNG
>>654
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????
0656603NGNG
すごい削りましたが,これがソースです。
jpgをzipにかえてください。
ttp://sylphys.ddo.jp/imgboard/img-box/img20020505000221.jpg
0657デフォルトの名無しさんNGNG
http://sylphys.ddo.jp/imgboard/img-box/img20020505000221.jpg
0658デフォルトの名無しさんNGNG
どう考えてもFontDataからhdcをとってるあたりがおかしい。
VCスレに逝け。
0659デフォルトの名無しさんNGNG
>>656
解凍すると0バイトの"WINDOWS 98"というファイルが出てくるけど?
0660デフォルトの名無しさんNGNG
削りすぎててソースはいってねえよ
0661デフォルトの名無しさんNGNG
>>655
シェルの次はカーネルだろ
0662デフォルトの名無しさんNGNG
>>661
そこまで読めるかヴォケ!
0663603NGNG
みすりましたこっちです
ttp://sylphys.ddo.jp/imgboard/img-box/img20020505001003.jpg
0664デフォルトの名無しさんNGNG
http://sylphys.ddo.jp/imgboard/img-box/img20020505001003.jpg
0665デフォルトの名無しさんNGNG
>>663
プロジェクトを全てアップしたのかよ!
いいのか?
0666デフォルトの名無しさんNGNG
>>660
ワラタ
0667603NGNG
ttp://sylphys.ddo.jp/imgboard/img-box/img20020505001230.jpg
これが正解です。今度はlzhに変えてください。
0668603NGNG
あげみすりました
こっちです
ttp://sylphys.ddo.jp/imgboard/img-box/img20020505001300.jpg
0669デフォルトの名無しさんNGNG
ゲ
DirectXでバグ持ちか。
現在Win長期間労働記録更新中なんで、試す気にならない。
バグ取りは親切な人に任せとけ
0670デフォルトの名無しさんNGNG
正直、CyaraData.h とやらがないぞ。
0671デフォルトの名無しさんNGNG
必要なヘッダーファイルがなくてコンパイルできない。
0672デフォルトの名無しさんNGNG
すみませんでした。
削りすぎたようです。なかみはこれです。
#ifndef _CYARADATA_H_
#define _CYARADATA_H_
typedef struct{
char Name[256]; //名前
int MaxHp; //最大HP
int MaxWp; //最大WP
int Hp; //HP
int Wp; //WP
int Lev;
int Ata;
int Def;
int Ex;
int NextEx;
int Mov;
int Waza_Max;
POINT Pos;
int Type;
int IdouFlg;
int Koudou;
}PLAYER;
#endif
0673603NGNG
http://sylphys.ddo.jp/imgboard/img-box/img20020505002128.jpg

申し訳ないです
今回は無圧縮です
0674デフォルトの名無しさんNGNG
・・・
0675デフォルトの名無しさんNGNG
せめて関係ないビットマップとか、その読み込み周辺は削ろうね。
人に見てもらうんだから。
0676603NGNG
>>673
よその603さんですか?
0677デフォルトの名無しさんNGNG
マジデ━━━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━(゚∀゚)━━━!!!!!
0678デフォルトの名無しさんNGNG
Cursorsyori.hもねーよ(藁
0679603NGNG
>>678
それは,使ってないから,削除してください
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
???
■ このスレッドは過去ログ倉庫に格納されています