C言語なら俺に聞け(入門編)Part 87

このエントリーをはてなブックマークに追加
701デフォルトの名無しさん
英語は問題ないので数学でお願いします
702デフォルトの名無しさん:2011/08/04(木) 15:01:05.29
>>700
関数ポインタと offsetof
人によっては union と enum を好んで使う

vtable の仕組みさえ知っていればどうにでもできる
703デフォルトの名無しさん:2011/08/04(木) 15:41:59.21
>>701
プログラミング自体に数学は必要ない
数学をプログラミングで解きたいなら数学の知識が要るだけ
704デフォルトの名無しさん:2011/08/04(木) 15:43:44.06
三角関数と行列くらいは最低でも知っといて欲しい
705デフォルトの名無しさん:2011/08/04(木) 15:49:51.95
>>704
それ言いだしたら切りが無いから。
706デフォルトの名無しさん:2011/08/04(木) 15:52:05.11
その程度でいいなら大丈夫そうです
707デフォルトの名無しさん:2011/08/04(木) 16:05:52.89
>>700
関数ポインタと汎用ポインタのペアの配列を使う
708デフォルトの名無しさん:2011/08/04(木) 16:11:27.88
cygwin上でリンクする時に
gcc -mwindows -o test.exe test.obj resource.coff
とするとdllが必要な代わりに正常にうごく
mingw32-gcc -mwindows -mno-cygwin -o test.exe test.obj resource.coff
とするとdllが不要だがリソースとして埋め込んだビットマップ画像が
一部表示されなくなるのは何故?
709 忍法帖【Lv=3,xxxP】 :2011/08/04(木) 16:17:14.00
>>708
cygwinスレへどうぞ。そもそも、今のcygwinのgccに-mno-cygwinは使えないので要注意。

>>700,702,707
ここはC入門スレ。
710デフォルトの名無しさん:2011/08/04(木) 16:39:38.77
ソースplz
711デフォルトの名無しさん:2011/08/04(木) 17:00:20.39
>>710
スレタイと>>1
712デフォルトの名無しさん:2011/08/04(木) 17:04:38.82
スレチなお馬鹿さん大杉だろ
713デフォルトの名無しさん:2011/08/04(木) 17:12:31.77
gcc -mwindows -o test.exe test.obj resource.coff
これなら全てのビットマップリソースが正しく表示されるのに
mingw32-gcc -mwindows -o test.exe test.obj resource.coff
これだと一部のビットマップリソースが正しく表示されない
714デフォルトの名無しさん:2011/08/04(木) 23:54:12.78
>>709
では、あなたこそ「にゅーもんスレ」へどうぞw
715デフォルトの名無しさん:2011/08/05(金) 01:07:58.85
sprintf関数について質問なんですが、この関数ってただ文字列を連結するだけですよね?
strcat関数は2個の配列しか結合できないんですよね?
ならstrcat関数使わずsprintf関数だけ使うようにしてもいいですか?
716デフォルトの名無しさん:2011/08/05(金) 01:26:15.18
unionってどういう時に使うの?
717デフォルトの名無しさん:2011/08/05(金) 01:27:41.46
メモリを節約したいとき
718デフォルトの名無しさん:2011/08/05(金) 01:38:08.73
何らかの処理のために変数にバイトごとにアクセスしたいときとか
union {
long a;
char b[4];
}
719デフォルトの名無しさん:2011/08/05(金) 01:45:12.24
同じようなキャストを繰り返してるコードに気付いたとき
720デフォルトの名無しさん:2011/08/05(金) 01:49:30.32
ただ「同時には使わない」という本来は疎遠な関係が
あまりにも緊密に描かれすぎるのが難点
721デフォルトの名無しさん:2011/08/05(金) 07:11:29.67
自分ではうまいこと言ったつもりなんだろうな...

さっぱり言いたいことが伝わらないけど。
722デフォルトの名無しさん:2011/08/05(金) 07:44:41.27
>>716
一例だけど、通信パケットみたいに、どこかのフィールドによって
同じ領域の解釈の仕方を変えたい時に、その事を明示したい場合にも
使えるね。
723デフォルトの名無しさん:2011/08/05(金) 09:56:39.50
>716
バージョンのよりデータの構造が変わる場合等。

struct xxx {

int ver;

union {
struct ver1 {
....
};
struct ver2 {
...
};
};
...

verの内容を見てver1かver2、どちらを参照するか判断する。
724デフォルトの名無しさん:2011/08/05(金) 10:08:58.47
RGBAの4バイトのデータを取り出したいときと
RGBAの中のRの1バイトだけを取り出したいときとか
よくあるだろ?
725デフォルトの名無しさん:2011/08/05(金) 11:42:43.01
>>721
ついてこれないなら、そうおっしゃい
726デフォルトの名無しさん:2011/08/05(金) 12:38:48.85
ついていく気ないので、チラ裏にでも書いてろよ。
727デフォルトの名無しさん:2011/08/05(金) 15:09:24.28
お前がそうしろ
728デフォルトの名無しさん:2011/08/05(金) 19:21:41.78
自分が分からないことは全部チラ裏に書けとかどんだけ
729デフォルトの名無しさん:2011/08/06(土) 10:20:48.37
WIN32APIのWM_Createを使った画像の描画で質問があります。


背景とその上の絵を二つ同時に表示して、上の絵をキー操作で動かそうとしています。
しかしキー操作を受け取り、WM_Createを呼び出すと上の画像だけにx,y座標を与えることができません。

ちらつき回避のためダブルバッファをしてるのですが、どちらか片方の絵に座標を与えることはできないでしょうか?

↑の説明文だけでは意味不明なのでソースコードをうpしておきます。
http://www.dotup.org/uploda/www.dotup.org1870372.cpp.html
730デフォルトの名無しさん:2011/08/06(土) 10:53:24.88
ヒントになるかどうかわからんが
WM_PAINTメッセージ内の
BitBlt(hdc,0,0,240,480,hBackDC,0,0,SRCCOPY);
の前に
BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY);
を入れてみて
731デフォルトの名無しさん:2011/08/06(土) 11:39:31.20
>>730
返信ありがとうございます。

書き忘れていましたがその方法はすでに試していまいた。
本当にすみません。

>>BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY);
↑の方法では前回描画した絵が消えず
上に描画する画像がつながった様に表示されます。

なんとか画像のリフレッシュをすることができないでしょうか・・・
732デフォルトの名無しさん:2011/08/06(土) 12:00:11.18
for( int i=0; i<n; i++ )

という書き方について、自分としては使い捨てのインスタント変数を作ってその場で捨てれるので便利だと思うんですが
学校の先生は「メモリ確保→開放の分だけ処理が重くなるからなるべく使わないように」と説明していました

でも参考書などではwhile文の中身で変数を用意していることも多く、中にはこういう書き方を推奨してるようにも見えて少しこの説明に疑問を感じます
処理はどの程度重くなるのでしょうか、処理を軽くしたい時には変数のメモリ確保を減らすのはどの程度有効なのでしょうか
733デフォルトの名無しさん:2011/08/06(土) 12:08:54.87
ウィンドウに転送する用のデバイスコンテキストをもう一つ作って
毎回そこに全ての画像(背景から全て)を描画すればいいよ
734 忍法帖【Lv=35,xxxPT】 :2011/08/06(土) 13:06:50.93
>>732
重くなることは、真っ当なコンパイラなら全く有り得ない。
先ず第一に、ローカル変数は確保や解放に殆どコストが掛からない。
第二に、ソース上ではスコープを絞っても実コードがその通りのタイミングで確保されるわけではない。
だから安心して、変数スコープを絞って使え。
735デフォルトの名無しさん:2011/08/06(土) 13:19:43.92
普通コンパイル段階でこの関数はローカル変数にどれだけメモリ使うかって計算するものだよな?
736デフォルトの名無しさん:2011/08/06(土) 13:23:45.53
この先生、
関数呼び出しはコストが掛かるから、
全部mainで処理しなさいって言いそう
737デフォルトの名無しさん:2011/08/06(土) 13:37:10.79
あくまでCに限って言えば宣言は関数の先頭に記述するべきと
先生は言いたかったんではないだろうか?
738デフォルトの名無しさん:2011/08/06(土) 13:38:33.58
じゃあ全部ハードウェアで処理しろよカス
739デフォルトの名無しさん:2011/08/06(土) 13:42:06.32
>>732
int main() {for(int i = 0; i <10; i++){}} を gcc -S などでアセンブラに変換して先生に
見せてあげるといいんじゃないかな

>>735
自分の場合は、そもそも大きいデータをスタックに割り付ける様なコードは書かないなあ
再帰する関数の場合は流石に気にしますけど、計算はしません

Windows って使用するスタックサイズをプログラム実行時に変えられないんだっけ?
740デフォルトの名無しさん:2011/08/06(土) 14:10:57.98
>>737
理由がメモリ確保がどうとかだから、C++でもJavaでもfor(int i;…みたいな
書き方は禁止なんじゃないの。
この先生。
741デフォルトの名無しさん:2011/08/06(土) 14:20:53.33
まぁでも先生云々は置いといて実際プログラム書いてて
for( int i = 0 ; i < 10 ; i++ );
この形が推奨されるべき形ってそう無いぞ
742デフォルトの名無しさん:2011/08/06(土) 14:25:46.75
コードを書く時に他人の推奨とか気にしないわ
743デフォルトの名無しさん:2011/08/06(土) 14:28:45.32
そこ開き直ったら本末転倒だろw
744デフォルトの名無しさん:2011/08/06(土) 14:35:08.87
スコープを限定するのは推奨されるべき
745デフォルトの名無しさん:2011/08/06(土) 14:37:52.13
学校の先生は論理を超えた強制力を持ちうるから、何らかの対策が必要だなと思う
先生云々置いとくなら、自分の意図した通りに動くコードならそれで充分
746デフォルトの名無しさん:2011/08/06(土) 14:40:03.84
ありがとうございます
安心してfor内に記述する事にします。
正直forとかで回す変数をいちいち最初に宣言してると段々「一回しか使われてない変数」とかが出現するのが嫌だったんですよね
けど一つの変数を色んな用途に使ってるとバグ出しそうで危なっかしいし
747デフォルトの名無しさん:2011/08/06(土) 14:41:13.48
>>744
俺もそう思うけど、

「長いブロックを書くから、ループ変数ごときでスコープを限定しないといけなくなるんだ」

とか言いだす人が居そう
748デフォルトの名無しさん:2011/08/06(土) 14:44:03.95
for文出てくるたびに領域確保してたらメモリの無駄じゃん
ループカウンタくらいまとめていいだろ
749デフォルトの名無しさん:2011/08/06(土) 14:49:15.91
>>741
C99とかC++とか、その書き方ができるなら普通、そう書くでしょ。
750デフォルトの名無しさん:2011/08/06(土) 14:51:20.67
>>748
for文出てくるたびにスタックフレーム伸ばしたり縮めたりする実装なんてないだろ。
751デフォルトの名無しさん:2011/08/06(土) 14:56:27.67
>>750
固定長だから無駄に宣言して良いと思ってんの?
752デフォルトの名無しさん:2011/08/06(土) 14:59:17.33
>>751
いいんじゃないの?
数バイトとかパフォーマンスを気にするより、コンパイラに最適化を
まかせてコードの質を優先すべきところ。
753デフォルトの名無しさん:2011/08/06(土) 14:59:51.75
>>751
スコープを制限するために変数宣言することを
無駄と考えるならお前はプログラマに向いてない
754デフォルトの名無しさん:2011/08/06(土) 15:01:52.87
for( char c = 0; c < 10; c++) とかしてる人はいるのかな?

4バイトォォくらいの割り付けをケチるより、分かりやすいコードを書いた方が良いと思う
755デフォルトの名無しさん:2011/08/06(土) 15:04:25.75
そんなことより SHORT_MAX を超えるループカウンタに int 使ってるのを論じようぜ
756デフォルトの名無しさん:2011/08/06(土) 15:06:56.33
スクリプト言語系なら毎回確保もありうるような気がするけど…。
757デフォルトの名無しさん:2011/08/06(土) 15:11:32.04
大きなプログラムを書くことを禁止したらいいよ
758デフォルトの名無しさん:2011/08/06(土) 15:14:35.87
>>755
gnuとか、20年くらいまえからintは32bit以上前提でコードを書いてるって
聞いてうらやましかった思い出がある。
759デフォルトの名無しさん:2011/08/06(土) 15:17:06.76
>>756
LL系こそ「メモリがもったいないから変数を使いまわそう」みたいな文化じゃないような気が。
富豪的っていうの?
760デフォルトの名無しさん:2011/08/06(土) 15:37:26.00
最近のスクリプト言語って実行前に一度ソース全部読むの?
ActivePerlでは読んでるっぽいけど。
761デフォルトの名無しさん:2011/08/06(土) 16:21:41.83
Rubyは下で定義したメソッド(関数)を上で呼べない
762デフォルトの名無しさん:2011/08/06(土) 16:39:33.91
>>754
そんなあなたに B 言語
763デフォルトの名無しさん:2011/08/06(土) 17:54:53.27
>>761
ん?

# cat foo.rb
#!/usr/bin/ruby

def foo
bar()
end

def bar
puts "bar"
end

foo

# ./foo.rb
bar
764デフォルトの名無しさん:2011/08/06(土) 18:57:20.61
>>761
今時、そんな言語はcとpascalくらいだよ。。。
(cはプロトタイプ宣言で回避)
765デフォルトの名無しさん:2011/08/06(土) 19:05:47.53
こういうことだろ

foo
def foo
    puts "foo"
end
766デフォルトの名無しさん:2011/08/06(土) 19:19:02.57
>>764
その意味で C89 は K&R C より退化した
767デフォルトの名無しさん:2011/08/06(土) 19:22:58.58
gccはmallocで取得した領域は勝手に0で初期化するのに
mingw32-gccだと初期化してくれないんだな・・・
ヘッダーファイルが上手く動作してなくて4日くらい悩んだわ・・・
768デフォルトの名無しさん:2011/08/06(土) 19:24:43.22
勝手なことするってほんとよくないな
769デフォルトの名無しさん:2011/08/06(土) 19:46:56.68
つーか、malloc にゼロ初期化を期待するほうがよくないだろ
770デフォルトの名無しさん:2011/08/06(土) 19:50:34.08
ほんとそのとおり。
771デフォルトの名無しさん:2011/08/06(土) 19:52:19.28
>>765
評価されていないメソッドが呼び出せないのは当たり前じゃないの?

% cat foo.py
#!/usr/bin/python
foo()
def foo():
  print("foo")
% ./foo.py
Traceback (most recent call last):
  File "./foo.py", line 3, in <module>
    foo()
NameError: name 'foo' is not defined

これはソースコードを読むかどうかとは全く別の話だよ
772デフォルトの名無しさん:2011/08/06(土) 19:54:39.35
あ、スマン
コピペする時に行を詰めたのでエラー位置は気にしないで
773デフォルトの名無しさん:2011/08/06(土) 20:01:57.19
>>771
当たり前だと思うよ
ただ、ああいうことが言いたいんだろうなって
774デフォルトの名無しさん:2011/08/06(土) 20:04:43.84
>>771
Python はちょっと特殊だよ。
def とか class も実行文だから。
775デフォルトの名無しさん:2011/08/06(土) 20:15:19.69
>>773
了解した

>>774
% cat ../foo.lsp
(foo)
(defun foo () (print "foo"))
% ./dx86cl -l ../foo.lsp
> Error: Undefined function FOO called with arguments () .

一方 JavaScript さんは...

% cat foo.js
foo();
function foo() { print("foo"); };
% jsc -f foo.js
foo
776デフォルトの名無しさん:2011/08/06(土) 20:18:13.68
JS はこれが正解だったか...

foo();
var foo = function() { print("foo"); };

スレ汚しスマソ
777デフォルトの名無しさん:2011/08/06(土) 21:20:34.21
>>733
どういう意味か分からずずっと考えていましたがやっと解決しました。
ありがとうございます。
778デフォルトの名無しさん:2011/08/06(土) 21:39:11.00
デバイスコンテキストに描画するとかって言うやつもいるけど
APIだと実際描画してるのはWM_PAINTのBIGINPAINT〜ENDPAINT内だけ
DCにはデータを用意するだけで描画してないと俺は思う
779デフォルトの名無しさん:2011/08/06(土) 21:53:52.58
オレオレ定義はチラ裏へどうぞ。
780デフォルトの名無しさん:2011/08/06(土) 21:56:07.91
Cygwinなんですがランタイムライブラリって何ですか?Wikipedeiaみたけど
抽象的すぎてよく分かりません。
781デフォルトの名無しさん:2011/08/06(土) 22:26:52.48
printf を自分で作れない人をアシストしてくれている黒子だよ
782デフォルトの名無しさん:2011/08/06(土) 22:36:02.09
デバイスコンテキストには描画できないだろ。
そもそもデバイスコンテキストが何なのかが理解できてないんじゃないか?
783デフォルトの名無しさん:2011/08/06(土) 22:39:42.14
>>782
Win32API質問箱 ってスレにいってらっしゃい
784デフォルトの名無しさん:2011/08/06(土) 22:43:31.13
まぁ描画というよりは転送だろうけど
あえて分かりやすくするために抽象的な表現にしたんじゃないか
785デフォルトの名無しさん:2011/08/06(土) 22:49:10.99
#define __DEBUG__

#ifdef __DEUBG__
#define DEBUGPRINT(format, ...) printf(format, ...)
#else
#define DEBUGPRINT(format, ...)
#endif

こういうことやりたいんですが、うまくいきません
何が悪いんでしょうか?
786デフォルトの名無しさん:2011/08/06(土) 22:51:27.66
>>785
typo
787デフォルトの名無しさん:2011/08/06(土) 22:53:02.64
デバイスコンテキストってのは、要するにデバイスを操作する際に用いるTMPやプロパティーのようなもろもろのワーキングデータのコンテナでしょ?簡単に言うと。
そこにフレームバッファーを含めたとしても違和感は無いんじゃないの?
GTKしかしらないけど。
788デフォルトの名無しさん:2011/08/06(土) 22:57:03.31
>>786
あ、すいませんDEUBGになってましたね・・・
これを直しても...の部分がそのままになってしまいます
DEBUGPRINT("%d %d %d", 1, 2, 3)

printf("%d %d %d", 1, 2, 3)
にしてほしいです。無理なんでしょうか?
789デフォルトの名無しさん:2011/08/06(土) 22:58:32.05
>>788
gcc なら
__VA_ARGS__
790デフォルトの名無しさん:2011/08/06(土) 22:59:32.74
__VA_ARGS__
791デフォルトの名無しさん:2011/08/06(土) 23:01:26.72
>>789 >>790
ありがとうございました
#define DEBUGPRINT(format, ...) printf(format, __VA_ARGS__)
これでいけました本当に助かります
792デフォルトの名無しさん:2011/08/06(土) 23:03:18.85
今さいころでマスを進んでいくすごろくを作っているのですが、
特定の升目で一回休みやマスを戻るという機能をつけたいのですが
どうすればできるか教えていただけませんか。
793デフォルトの名無しさん:2011/08/06(土) 23:04:26.97
>>792
if
794デフォルトの名無しさん:2011/08/06(土) 23:04:31.32
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int num,i,sai;
char ps[] = " \n";
char c;
srand((unsigned int)time(0));
num = i = sai = 0;
while(i != 8)
{
sai = rand()%6+1;
num = i;
i += sai;
printf("Your number =%d\n",sai);
printf("123456789\n");
printf("s G \n");

if(i > 8)
{
i = 8-(i-8);
}
ps[i] = '*';
printf("%s\n",ps);
ps[i] = ' ';
printf(">Dice try (N=end)\n");
c = getchar();
if(c == 'N' || c == 'n') return 1;}
printf("you win !\n");
return 0;
}
795デフォルトの名無しさん:2011/08/06(土) 23:06:28.28
デバイスコンテキストっつーのは画像処理ソフトで使われるレイヤーと同じ様なもん
つーかそれだと思えば解釈が簡単
796デフォルトの名無しさん:2011/08/06(土) 23:10:07.49



可変引数を取れる関数って、プロトタイプどうすんの?


797デフォルトの名無しさん:2011/08/06(土) 23:13:33.39
int printf(const char *format, ...);
798デフォルトの名無しさん:2011/08/06(土) 23:34:08.56
何が来るか分からんものってプロトタイプでチェックできんの?
できなんだら、なんかプロトタイプの意味がねえ気もするが
799デフォルトの名無しさん:2011/08/06(土) 23:47:47.30
例えばprintfなら少なくとも第1引数はチェックできるでしょ
800デフォルトの名無しさん:2011/08/07(日) 00:14:49.55
ド素人ながらGNUライブラリのobstackのソース読んでるんだけど

# define obstack_int_grow(h,datum) \
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
obstack_int_grow_fast (h, datum))

# define obstack_int_grow_fast(h,aint) \
(((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))

このマクロを読んでみると
チャンクの範囲を超えてるなら_obstack_newchunkで新しいチャンクを割り当て
超えてないならobstack_int_grow_fastでintデータ(datnum)を書き込むという流れらしいが


3行目の三項演算子の2項目で、_obstack_newchunk関数に引数を渡した後カンマを打って0をつけたり、その後3項目も0にする理由が分からない。
0そのままだと警告でるよね?

それから、obstack_int_grow_fastもややこしいけど
next_freeが指すポインタをintサイズだけ進ませたものを代入し直して、それに配列アクセスで増やしたintサイズのスペースにaintを書き込む・・・
この理解で合ってるのかな?