英語は問題ないので数学でお願いします
702 :
デフォルトの名無しさん:2011/08/04(木) 15:01:05.29
>>700 関数ポインタと offsetof
人によっては union と enum を好んで使う
vtable の仕組みさえ知っていればどうにでもできる
>>701 プログラミング自体に数学は必要ない
数学をプログラミングで解きたいなら数学の知識が要るだけ
三角関数と行列くらいは最低でも知っといて欲しい
その程度でいいなら大丈夫そうです
>>700 関数ポインタと汎用ポインタのペアの配列を使う
cygwin上でリンクする時に
gcc -mwindows -o test.exe test.obj resource.coff
とするとdllが必要な代わりに正常にうごく
mingw32-gcc -mwindows -mno-cygwin -o test.exe test.obj resource.coff
とするとdllが不要だがリソースとして埋め込んだビットマップ画像が
一部表示されなくなるのは何故?
>>708 cygwinスレへどうぞ。そもそも、今のcygwinのgccに-mno-cygwinは使えないので要注意。
>>700,702,707
ここはC入門スレ。
ソースplz
スレチなお馬鹿さん大杉だろ
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
sprintf関数について質問なんですが、この関数ってただ文字列を連結するだけですよね?
strcat関数は2個の配列しか結合できないんですよね?
ならstrcat関数使わずsprintf関数だけ使うようにしてもいいですか?
unionってどういう時に使うの?
メモリを節約したいとき
何らかの処理のために変数にバイトごとにアクセスしたいときとか
union {
long a;
char b[4];
}
同じようなキャストを繰り返してるコードに気付いたとき
720 :
デフォルトの名無しさん:2011/08/05(金) 01:49:30.32
ただ「同時には使わない」という本来は疎遠な関係が
あまりにも緊密に描かれすぎるのが難点
自分ではうまいこと言ったつもりなんだろうな...
さっぱり言いたいことが伝わらないけど。
>>716 一例だけど、通信パケットみたいに、どこかのフィールドによって
同じ領域の解釈の仕方を変えたい時に、その事を明示したい場合にも
使えるね。
>716
バージョンのよりデータの構造が変わる場合等。
struct xxx {
int ver;
union {
struct ver1 {
....
};
struct ver2 {
...
};
};
...
verの内容を見てver1かver2、どちらを参照するか判断する。
RGBAの4バイトのデータを取り出したいときと
RGBAの中のRの1バイトだけを取り出したいときとか
よくあるだろ?
725 :
デフォルトの名無しさん:2011/08/05(金) 11:42:43.01
ついていく気ないので、チラ裏にでも書いてろよ。
お前がそうしろ
自分が分からないことは全部チラ裏に書けとかどんだけ
ヒントになるかどうかわからんが
WM_PAINTメッセージ内の
BitBlt(hdc,0,0,240,480,hBackDC,0,0,SRCCOPY);
の前に
BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY);
を入れてみて
>>730 返信ありがとうございます。
書き忘れていましたがその方法はすでに試していまいた。
本当にすみません。
>>BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY);
↑の方法では前回描画した絵が消えず
上に描画する画像がつながった様に表示されます。
なんとか画像のリフレッシュをすることができないでしょうか・・・
for( int i=0; i<n; i++ )
という書き方について、自分としては使い捨てのインスタント変数を作ってその場で捨てれるので便利だと思うんですが
学校の先生は「メモリ確保→開放の分だけ処理が重くなるからなるべく使わないように」と説明していました
でも参考書などではwhile文の中身で変数を用意していることも多く、中にはこういう書き方を推奨してるようにも見えて少しこの説明に疑問を感じます
処理はどの程度重くなるのでしょうか、処理を軽くしたい時には変数のメモリ確保を減らすのはどの程度有効なのでしょうか
ウィンドウに転送する用のデバイスコンテキストをもう一つ作って
毎回そこに全ての画像(背景から全て)を描画すればいいよ
>>732 重くなることは、真っ当なコンパイラなら全く有り得ない。
先ず第一に、ローカル変数は確保や解放に殆どコストが掛からない。
第二に、ソース上ではスコープを絞っても実コードがその通りのタイミングで確保されるわけではない。
だから安心して、変数スコープを絞って使え。
普通コンパイル段階でこの関数はローカル変数にどれだけメモリ使うかって計算するものだよな?
この先生、
関数呼び出しはコストが掛かるから、
全部mainで処理しなさいって言いそう
あくまでCに限って言えば宣言は関数の先頭に記述するべきと
先生は言いたかったんではないだろうか?
じゃあ全部ハードウェアで処理しろよカス
>>732 int main() {for(int i = 0; i <10; i++){}} を gcc -S などでアセンブラに変換して先生に
見せてあげるといいんじゃないかな
>>735 自分の場合は、そもそも大きいデータをスタックに割り付ける様なコードは書かないなあ
再帰する関数の場合は流石に気にしますけど、計算はしません
Windows って使用するスタックサイズをプログラム実行時に変えられないんだっけ?
>>737 理由がメモリ確保がどうとかだから、C++でもJavaでもfor(int i;…みたいな
書き方は禁止なんじゃないの。
この先生。
まぁでも先生云々は置いといて実際プログラム書いてて
for( int i = 0 ; i < 10 ; i++ );
この形が推奨されるべき形ってそう無いぞ
コードを書く時に他人の推奨とか気にしないわ
そこ開き直ったら本末転倒だろw
スコープを限定するのは推奨されるべき
学校の先生は論理を超えた強制力を持ちうるから、何らかの対策が必要だなと思う
先生云々置いとくなら、自分の意図した通りに動くコードならそれで充分
ありがとうございます
安心してfor内に記述する事にします。
正直forとかで回す変数をいちいち最初に宣言してると段々「一回しか使われてない変数」とかが出現するのが嫌だったんですよね
けど一つの変数を色んな用途に使ってるとバグ出しそうで危なっかしいし
>>744 俺もそう思うけど、
「長いブロックを書くから、ループ変数ごときでスコープを限定しないといけなくなるんだ」
とか言いだす人が居そう
for文出てくるたびに領域確保してたらメモリの無駄じゃん
ループカウンタくらいまとめていいだろ
>>741 C99とかC++とか、その書き方ができるなら普通、そう書くでしょ。
>>748 for文出てくるたびにスタックフレーム伸ばしたり縮めたりする実装なんてないだろ。
>>750 固定長だから無駄に宣言して良いと思ってんの?
>>751 いいんじゃないの?
数バイトとかパフォーマンスを気にするより、コンパイラに最適化を
まかせてコードの質を優先すべきところ。
>>751 スコープを制限するために変数宣言することを
無駄と考えるならお前はプログラマに向いてない
for( char c = 0; c < 10; c++) とかしてる人はいるのかな?
4バイトォォくらいの割り付けをケチるより、分かりやすいコードを書いた方が良いと思う
そんなことより SHORT_MAX を超えるループカウンタに int 使ってるのを論じようぜ
スクリプト言語系なら毎回確保もありうるような気がするけど…。
大きなプログラムを書くことを禁止したらいいよ
>>755 gnuとか、20年くらいまえからintは32bit以上前提でコードを書いてるって
聞いてうらやましかった思い出がある。
>>756 LL系こそ「メモリがもったいないから変数を使いまわそう」みたいな文化じゃないような気が。
富豪的っていうの?
最近のスクリプト言語って実行前に一度ソース全部読むの?
ActivePerlでは読んでるっぽいけど。
Rubyは下で定義したメソッド(関数)を上で呼べない
762 :
デフォルトの名無しさん:2011/08/06(土) 16:39:33.91
>>761 ん?
# cat foo.rb
#!/usr/bin/ruby
def foo
bar()
end
def bar
puts "bar"
end
foo
# ./foo.rb
bar
>>761 今時、そんな言語はcとpascalくらいだよ。。。
(cはプロトタイプ宣言で回避)
こういうことだろ
foo
def foo
puts "foo"
end
766 :
デフォルトの名無しさん:2011/08/06(土) 19:19:02.57
>>764 その意味で C89 は K&R C より退化した
gccはmallocで取得した領域は勝手に0で初期化するのに
mingw32-gccだと初期化してくれないんだな・・・
ヘッダーファイルが上手く動作してなくて4日くらい悩んだわ・・・
勝手なことするってほんとよくないな
769 :
デフォルトの名無しさん:2011/08/06(土) 19:46:56.68
つーか、malloc にゼロ初期化を期待するほうがよくないだろ
ほんとそのとおり。
>>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
これはソースコードを読むかどうかとは全く別の話だよ
あ、スマン
コピペする時に行を詰めたのでエラー位置は気にしないで
>>771 当たり前だと思うよ
ただ、ああいうことが言いたいんだろうなって
>>771 Python はちょっと特殊だよ。
def とか class も実行文だから。
>>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
JS はこれが正解だったか...
foo();
var foo = function() { print("foo"); };
スレ汚しスマソ
>>733 どういう意味か分からずずっと考えていましたがやっと解決しました。
ありがとうございます。
デバイスコンテキストに描画するとかって言うやつもいるけど
APIだと実際描画してるのはWM_PAINTのBIGINPAINT〜ENDPAINT内だけ
DCにはデータを用意するだけで描画してないと俺は思う
オレオレ定義はチラ裏へどうぞ。
780 :
デフォルトの名無しさん:2011/08/06(土) 21:56:07.91
Cygwinなんですがランタイムライブラリって何ですか?Wikipedeiaみたけど
抽象的すぎてよく分かりません。
781 :
デフォルトの名無しさん:2011/08/06(土) 22:26:52.48
printf を自分で作れない人をアシストしてくれている黒子だよ
デバイスコンテキストには描画できないだろ。
そもそもデバイスコンテキストが何なのかが理解できてないんじゃないか?
>>782 Win32API質問箱 ってスレにいってらっしゃい
まぁ描画というよりは転送だろうけど
あえて分かりやすくするために抽象的な表現にしたんじゃないか
785 :
デフォルトの名無しさん:2011/08/06(土) 22:49:10.99
#define __DEBUG__
#ifdef __DEUBG__
#define DEBUGPRINT(format, ...) printf(format, ...)
#else
#define DEBUGPRINT(format, ...)
#endif
こういうことやりたいんですが、うまくいきません
何が悪いんでしょうか?
デバイスコンテキストってのは、要するにデバイスを操作する際に用いる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)
にしてほしいです。無理なんでしょうか?
__VA_ARGS__
>>789 >>790 ありがとうございました
#define DEBUGPRINT(format, ...) printf(format, __VA_ARGS__)
これでいけました本当に助かります
今さいころでマスを進んでいくすごろくを作っているのですが、
特定の升目で一回休みやマスを戻るという機能をつけたいのですが
どうすればできるか教えていただけませんか。
#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;
}
デバイスコンテキストっつーのは画像処理ソフトで使われるレイヤーと同じ様なもん
つーかそれだと思えば解釈が簡単
796 :
デフォルトの名無しさん:2011/08/06(土) 23:10:07.49
可変引数を取れる関数って、プロトタイプどうすんの?
int printf(const char *format, ...);
798 :
デフォルトの名無しさん:2011/08/06(土) 23:34:08.56
何が来るか分からんものってプロトタイプでチェックできんの?
できなんだら、なんかプロトタイプの意味がねえ気もするが
例えばprintfなら少なくとも第1引数はチェックできるでしょ
ド素人ながら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を書き込む・・・
この理解で合ってるのかな?