スレを勃てるまでもないC/C++の質問はここで 6
2 :
デフォルトの名無しさん :2009/01/10(土) 15:07:21
いちおつ
カコログってなんか意味あるの?
意味があるかという問いかけをする者には何の意味もない 意味を見出す者だけがその存在を享受できる
レスの最後に # をつけるのって何か意味あるの?
# 別に最後とは限らないが…… 意味を見出せない人には意味がない。
7 :
デフォルトの名無しさん :2009/01/10(土) 16:21:32
レスの中に # をつけるのって何か意味あるの?
あるよ。気取れる。
今までVSでコンソールのプログラムを作っていたのですが、GUIアプリを作りたくなりました。 どういった環境でつくればいいでしょうか?
10 :
デフォルトの名無しさん :2009/01/10(土) 16:32:08
> 意味を見出せない 勝手に自分基準の意味を付けられても、他人には通じないんだが・・・ ナンバーサインはナンバーサイン。何でつけたの?意味もなく 気分でつけるのはどうかと。んじゃ俺は・・・ ♣でも付けようかしらん♪
まさか、わざわざ「ナンバーサイン」と言う御仁が本来の意味を知らないとも思えないのだが。 # 知らないならぐぐれとしか。
>>11 expresseditionですが、できますか?.netってやつをつかうんですか?
>>12 しかし、#ひとつであぼーんで切るわけでもなし、やくたいないことこのうえない。
>>9 VC++、VSでも導入しておくがよろし
€ スレタイからして、スレ違いかもしれないが
>>16 expressはwindows.hとか入ってないんじゃね?
gccやg++でも出来るけど、ここで聞いているくらいの人物だとどうだろ。
ATLとかMFCが使えないんですよね? 何か不都合がありますか?
>>20 ATLとかMFCを使おうと思わなければ問題は無い
>>19 2005は入ってなかったけど2008で最初からはいるようになったよ
えへ、乙
stdio.h は standard ioの略ですよね そういった省略前のものが載ってる書籍、或いはサイトってありませんか?
C++を始めたいです、お勧めの環境を教えて下さい。 マニュアル本についても知りたいです。
auto_ptr や shared_ptr を使うためのヘッダって<memory>でOK?
関数のデフォルト値って宣言のところに書いておかないと駄目なの? 定義のところに書いて使おうとすると。「関数に 1 個の引数を指定できません」 ってエラーが出てきてコンパイルできません。 いつも宣言ではfunc(int,int)みたいな感じで書いてるから変数書かないといけないの不便に感じる
>>28 いや違う
shared_ptrはboostだから
>>28 あっているよ。
>>31 今はstd::tr1::shared_ptrという存在があって、それが<memory>に入っている(ことがある)。
ただし、ものによっては<tr1/memory>ということがある。
なお、<boost/tr1/memory.hpp>なら環境を識別して正しいヘッダをインクルードしてくれるほか、
持っていない処理系ではboost::shared_ptrのtypedefで対応という親切設計。
だったら、Boostを入れたならboost::shared_ptrを使えばいいという気もしてくるけど。
>>31-32 サンクス
boost入れてなくてVC++2008だと<memory>で宣言、定義されていたです
>>29 定義の方に書いたって、他のコンパイル単位には伝わらない。
だからこそ宣言を別ファイルにしてるわけで。
>>34 それは、「関数呼び出しの仕組み」がある程度わかっている人にはわかるけど
初心者はそこまで考えが回らないのよ。
デフォルト引数の仕組みが「呼び出し側で不足する引数を補うものだ」とね。
つまり、わからないから
呼び出される側で「引数がない時には補う処理」をしている、と思いがちなわけ。
なにしろデフォルト引数を含む関数は呼び出される側だから。
そういう発想を持っているということを前提にすると
>>34 の内容では意図が伝わらないし理解が深まるわけでもないのよ。
あ、そうそう。
>>29 宣言で
void func(int, int = 100);
と宣言できるよ。
37 :
デフォルトの名無しさん :2009/01/11(日) 13:51:47
はじめまして、今Cを色々勉強してるんですけど。 実行すると以下の文章がでてくるんですが 何を言われているのか意味が分からないので 良ければ教えてください・・・ 7 [main] kak 2444 _cygtls::handle_exceptions: Error while dumping state (p robably corrupted stack) Segmentation fault (core dumped) と出てくるんですが、コンパイルではエラーがでずに、実行するとコレが出る状況です ググっても、参考書で調べても全く分からないのでよければ教えてください。
スタック食いつぶしてる。でかい配列とってるとか?
40 :
37 :2009/01/11(日) 14:17:33
#include<stdio.h> typedef unsigned long int ulint; typedef struct{ ulint TANS[10];//*p//下の足し算して返す結果 ulint AA[10];//*s ulint BB[10];//*t }FANS; void tas(FANS* ,FANS* ,FANS*); int main(void){ ulint a = 0xf6736fd6; //a=4134760406 ulint b = 0xdb6db6db; //b=3681400539 ulint c = 0; ulint A[1]={0},B[1]={0},C[4]={0}; int i,j,k,l; i=j=k=l=0; int *p,*s,*t; FANS F={{0},{0},{0}}; for(;;){ A[i] = a & 0xffff; B[i] = b & 0xffff; a = a >> 16; b = b >> 16; if(i==1)break; i = i + 1; }
41 :
37 :2009/01/11(日) 14:18:37
i = 0; for(;;){ for(;;){ *s = k; c = A[i] * B[j]; *s = c & 0xffff; printf("AA[%d]>%x\n",k,*s); c = c >> 16; k = k + 1; *s = c & 0xffff; printf("AA[%d]>%x\n",k,*s); tas(&F,&F,&F); *t = *p; for(l=0;l>5;l++){ *s = l; *s = C[l]; } i = i + 1; if(i==2)break; } i = 0; k = k - 1; j = j + 1; if(j==2)break; }
42 :
37 :2009/01/11(日) 14:19:44
i=8; *p = i; for(;;){ printf("%x",*p); if(i==0)break; i = i - 1; } return 0; } //足し算:関数 void tas(FANS *s, FANS *t, FANS *p){ ulint SUM[10]={0},KETA[10]={0}; int m; m=0; for(;;){ SUM[m] = s -> AA[m] + t -> BB[m] + KETA[m]; p -> TANS[m] = SUM[m] & 0xffff; KETA[m+1] = SUM[m] >> 16; if(m==4) break; m = m + 1; } } こんな感じです。 知識が乏しいのですが今ある知識で32bit×32bitをやろうとしてます
>>40 アップローダつかうとか、考えられないだろうか・・・
44 :
37 :2009/01/11(日) 14:22:51
>>40 ポインタのsが初期化されてないのに、*sに代入されてないか?
あと、
for(l=0;l>5;l++){
これは、一回も回らないよな。
int *p,*s,*t; の実態がない?
>>45 さん
int *p,*s,*t;
FANS F={{0},{0},{0}};
これじゃポインタの中身pstを初期化できてないんですか???
>>46 int *p,*s,*t;
コレを構造体でmainとしたの関数で使いたかったんですが。
配列に入れて配列の足し算をしたくて、こう書いてみたんですが・・・
>*t = *p; これ?
>>48 さん
*t=*pで下のTANSの中身をAAに入れようと思ってそうやったんですが・・・
>>47 ulint *p,*s,*t;
FANS F={{0},{0},{0}};
p = F.TANS;
s = F.AA;
t = F.BB;
とかしとけばいいかな?
>>50 さん
それでやってみると、エラーでなくワーニングで
assignment from incompatible pointer type
assignment from incompatible pointer type
assignment from incompatible pointer type
とでて、ポインタのタイプがおかしいって言われちゃいました・・・
ウォーニング
>>49 こんなかね
>int *p,*s,*t;
↓
int pe,*p=&pe,se,*s=&se,te,*t=&te;
そもそも、ポインタである必要があるのか・・・
>>53 さん
これで、tasの関数に飛ばすときはpe,se,teを飛ばせばいいってことですか??
>>54 さん
最終的に無限桁にしたのでポインタと構造体がいいと進められたんです。
>>55 さん
Cygwinだからでしょうか・・・
>>55 >ulint *p,*s,*t;
こっちの型を差し替えてないんだろ
>>56 ポインタの型をint*からulint*に直した?
そもそも、tasに引数が3つもあるのが意味不明。 tas(&F,&F,&F);としてしか呼び出してないし。
>>58 さん
大分回るようになりました!!
けどやはりAA[2]まで進んだ後でとまりました・・・
>>59 さん
tas(&F,&F,&F)でTANS、AA、BBをtasの関数に飛ばすってイメージだったんですが・・・
>>56 >
>>53 さん
> これで、tasの関数に飛ばすときはpe,se,teを飛ばせばいいってことですか??
tasとp,s,tは関係ないじゃん
ユーザがfor文と配列使って異なる数字を標準入力して出来た数列が出来たとき 奇数番目の合計をAに、偶数番目の合計をBに入れるっていうプログラム作りたいのですがどうすればいいのでしょうか… とりあえず、 #include<stdio.h> main() { int n,i,a[i]=100000; scanf("%d",&n); for(i=0;i<=n;i=i++) { printf("i番目");scanf("%d",&a[i]); puts("\n") } まで出来たのですが、同じ数字があったときにやり直しさせるのと、iが奇数番号の数の合計とiが偶数番号の時の合計を代入させるのがわからないです。 だれか、そこを教えてくれないでしょうか。
>>62 int n,i,a[i]=100000;
怖ぇ・・・たぶん
int n,i,a[100000];
って書きたかったに違いない
>>61 さん
*p,*s,*t=TANS,AA,BBってリンクしてるイメージだったんですが違うんですか?
ポインタと構造体の関係が本当に分からなくて・・・すみません・・・
#include <stdio.h> #define TBL_SIZE 100000 int main() { int tbl[TBL_SIZE]; int i, n; printf("入力する回数>"); scanf("%d", &n); for (i = 0; i < n; i++) { printf("%d番目", i); scanf("%d", &tbl[i]); } return 0; } こんな感じだろ?
>>64 ちがうな。
そもそも、何をしてるプログラムだかさっぱりわからないが。
>>66 さん
プログラムは32bit×32bit=64bitをするために
配列をつかって筆算みたいなやり方で答えを出そうとしてます。
AA+BB=TANSにしてBB=TNASでまたAA+BB=TNASを繰り返そうという考えです。
>>68 さん
ちょwwwもろ回答がwwwww
参考にしながら頑張ってみます、一応今ある知識だけで組んでみたいんで。
ありがとうございます!
>>65 for (i = 0; i < n; i++) {
printf("%d番目", i);
scanf("%d", &tbl[i]);
}
の部分を
int jを定義しておいて
for (i = 0; i < n; i++) {
printf("%d番目", i);
scanf("%d", &tbl[i]);
for(j=0; j < i; j++ ){
if( tbl[i] == tbl[j] ){
printf("重複させんな氏ね\n");
i--;break;
}
}
}
にすればいいか
71 :
sage :2009/01/11(日) 16:29:32
>>70 ありがとうございます
あとはiが奇数時に配列に入れた数の和と、iが偶数の時に入れた数の和を比べて、多い方をAに入れ、Bに小さい方を入れるってしたいのですが
for文使っても、iが偶数の時と奇数の時に分けられないので困ってます。
なんか最初から間違いがあったみたいですがw
本題これでして…
Cの規格書が高いからpdfを手書きで写しているのですが、「写本」という文字をシードにして乱数を生成する高速な方法を教えてください。
pdfを見ている状況なら、保存すればいいじゃん。 # pdfとしてが無理ならキャプチャしてもいいし。
>>73 char s[] = "写本";
とかやって、s[0]からs[3]までの値をシードにして、ってこと?
>>72 むしろそこの自然数が書かれたカードがうんたらゲームを自分で作ろうとしてて
部分的な質問を投げるようになったんだと思う。
宿題スレは丸投げ用だと思うからこっちでもいいんじゃないのかな
ありがとうございました。 何とか間に合いそうです。
80 :
デフォルトの名無しさん :2009/01/12(月) 02:24:40
まだナンバーサイン野郎は意味も無く、不適切なナンバーサインの使い方をしているの? ♠はトランプのスーツの中で最強ですけど
81 :
71 :2009/01/12(月) 02:37:44
本当すいません…ここしか頼るとこなくて… とりあえず71さんのヒント使って作ってみたのですが とりあえずint gを定義して for(g=0;g<0;g++){ if(g%2=0){ x=x+a[g]; else{ y=y+a[g]; } } if(x<y){ printf("先手の点数=%d\n",x); printf("後手の点数=%d\n",y); else{ printf("先手の点数=%d\n",y); printf("後手の点数=%d\n",x); } } printf("先手の勝ち"); てなったんですけど、でもこれじゃあ、勝ち負けと先手が勝ちって表示されるのが連動してなくてなんか不安なんですよね… あとは引き分けの時に、数列の端と端を比べて大きい方をとるってやつが今模索中でございまして、ヒントくれればいいなと
82 :
デフォルトの名無しさん :2009/01/12(月) 12:54:16
他言語経験者でC++を学んでいます。 コピーコンストラクタに関する質問です。 いわゆる深いコピーをする際に、privateフィールドを 直接参照できるようなんですが、これは何か特別なルールなんでしょうか。 private: int num; ...... MyClass::MyClass(const MyClass& other) num = other.num; ....... ちなみに、学習に利用している本はロベールC++でページは302です。 よろしくお願いします。
MyClass のメンバだから、 MyClass のメンバ関数からは参照できる。
84 :
デフォルトの名無しさん :2009/01/12(月) 13:04:49
ああ、なるほど。 別オブジェクトでも、同一クラスのメンバは参照できるんですね。 クラス外に定義した関数では同じことができなかったので疑問を持っていました。 ありがとうございます。
昨日多倍長系で質問した者です。
考えながらやっているんですが、mainで入った数字が関数で微妙に入れ違っていて
原因が分からないのですが、どなたか教えてくださいませんでしょうか・・・
http://codepad.org/XgqEjsWE 後、未だにスタックが食いつぶされている?
実行結果で配列がどうのこうので分からない状況です・・・
よろしければ教えてください、お願いします。
>>86 さん
一応知人に借りた本とグーグル先生には聞いてみているんですが・・・
いまいち理解できていないんです・・・
クソースすぎる for文を無限ループ風に使うな 多倍長演算なんて100年早い
>>88 さん
一応、加減乗除の加減までは解決したんですが・・・
for(i=0;i>4;i++){
とかでちゃんと回す回数指定したほうがいいのでしょうか・・・
>>89 さん
配列がおかしい?
最初の宣言がすでにおかしいってことですか?
>>92 さん
タイプミスです・・・
for(i=0;i<4;i++){
でした。
for(;;){ *s = l; *s = C[l]; l = l + 1; if(l==4)break; } この部分とかlは初期化されてないから値は上がりっぱなしだし そもそも代入文に何の意味もないからこの部分は初期化バグ抜きでも*s = C[3];と等価だ もう一度言う、顔洗って出直せ
>>94 さん
はい、勉強しなおしてきます。
ただ、ポインタと構造体が全く分からなくて。
mainではAA[0]とAA[1]に思い通りに値が入れられているのに
下の関数に飛んだときにはAA[0]の値がAA[1]になっているんです・・・
*s=l;
*s=C[l];
は、メモを忘れてしまったので何がしたいかすら自分でも分かりません・・・
ただ、このAA[0]とAA[1]の部分が謎でしょうがないです・・・
>>81 ・前半
そのfor文は一回も回らない
数の比較は=じゃなくて==
{}のネストがおかしい
for(g=0;g<n;g++){
if(g%2==0){
x += a[g];
}else{
y += a[g];
}
}
こんな感じでしょ?
・後半
a[0]を入力した人(=偶数の入力をした人)が常に先手じゃないの?
printf("先手の点数=%d\n",x);
printf("後手の点数=%d\n",y);
if(x>=y){
printf("先手の勝ち");
}else{
printf("先手の勝ち");
}
それから数列の端と端ってどこのこと?a[n-1]とa[n-2]?
>>96 まちがえた、どっちも"先手の勝ち"になってる
if(x>=y){
printf("先手の勝ち");
}else{
printf("後手の勝ち");
}
>>98 さん
同じ人物ですよ?、一応昨日も来たって書いてあるんですが・・・
暗黙の型変換が良く解らなくて困ってます><、詳しいサイト教えてください。 (bool)(_bool^_int&2)とか(int)^(_short^_char>> 15)とかそんな感じのが知りたいです。
(int)^(_short^_char>> 15)じゃ無くて(int)~(_short^_char>> 15)みたいなでした
ファイルが見つかりません。 File not found. との事ですけど・・・?登録とか必要なの?
見つかりました。ありがと〜
107 :
デフォルトの名無しさん :2009/01/12(月) 17:58:59
キーボードで入力した文字列を表示させるというプログラムなんですが、↓で実行してもできません。 配列を使う方法ならできるんですが、ポインタを使った方法が知りたいんです。 これのどこが悪いのか教えてください。 #include <stdio.h> int main(void){ char* str; scanf("%s",str); printf("%s",str); return 0; }
>>107 文字列を格納する十分な大きさのメモリ領域を確保しなきゃだめだぴょん
>>107 大体、初期化されていないポインタはどこを指しているか未定義だぴょん
110 :
デフォルトの名無しさん :2009/01/12(月) 18:15:27
>>108 ありがとうございます。
でも、それは何故でしょうか?
scanfの時点で入力した文字列はメモリに記憶されたわけだから、それ以上メモリ領域を確保する必要が
無いように思うんですが・・・
>>110 ごめんね、書き方が微妙だったぴょん
>>109 を見てもらえれば分かると思うけど、strは初期化されていないから、アクセス違反が起こり得るんだ
その証拠に、これを実行すると「不正な処理」とか「セグメントエラー」とかならない?
112 :
デフォルトの名無しさん :2009/01/12(月) 18:29:30
>>111 実行しても何も表示されませんでした。
今調べたんですが、初期化されてないっていうのは、
>>109 ということですよね?
mallocで領域を確保しなきゃいけないってことでおkですか?
>>112 そうそう、mallocを知っているなら話が早いぴょん
あ、それから、 > scanfの時点で入力した文字列はメモリに記憶されたわけだから この辺、もう少し勉強してみる必要があるんだぴょん
#include <stdio.h> int main(void){ char str[100]; scanf("%s",str); printf("%s",str); return 0; } 配列でもいいよ。
>>115 >配列を使う方法ならできるんですが、ポインタを使った方法が知りたいんです。
>>116 よく読んでなかったよ。
#include <stdio.h>
int main(void){
char buf[100];
char* str = buf;
scanf("%s",str);
printf("%s",str);
return 0;
}
こうか。
>>117 みたいな奴をみると、文法と文脈は別物だと実感する
H8 に対して RS-232C を利用し *.srec ファイルを送るプログラムを作成しています。 「*.srec ファイルを送る」部分以外は正常に作動しています。 ※アスキーモードです。 @ ifstream で *.srec を開く A WriteFile で 送る という単純なやり方では、うまくいきませんでした。 1行ずつ送るということも試してみましたが、やはりダメでした。 いわゆる、TeraTerm 等の Send file... に価するプログラムを作ろうとしています。 どなたか RS-232C 通信、ファイル送信等に知識をお持ちの方がおりましたら、 御指南頂けますでしょうか?
ざっと書いた該当部分のソースです。 以下のような16進数の内容をそのまま送っています。 S00B00006A73702E73726563CC S2144000007A0700FFFF1001006B200040007001F0EF S214400010640047025D007A00005000087A010050F4 S2144000201EC01AA2010069827A10000000041F90C8 S21440003045F27A00004066B07A01004066B87A021F ・ ・ ・ std::ifstream fin; fin.open("*.srec", std::ios::in); if(!fin) { std::cout << "FILE Open Error!\n" << std::endl; return 1; } DWORD nWritten; int i = 0; char line[128]; while(!fin.eof()) { fin.getline(line, sizeof(line)); int now = sizeof(line + 1); line[now] = 10; std::cout << line; WriteFile(hCom, &line, sizeof(line), &nWritten, 0); } char cEof[1]; cEof[0] = 26; WriteFile(hCom, &cEof, 1, &nWritten, 0);
>>119 hComのオープンにはちゃんと成功しているか?
WriteFile()の第二引数は&いらない
>121 はい。成功しています。 その他にも文字のみの通信(コマンドの送信も含む)が有り、その部分は正常に動いています。 ファイル送信のモードを追加しようとしてつまずいています。 &無しで大丈夫ですね。すみません。この部分については、結果は同じでした。
>>118 ポインタを使うって条件だけで、malloc()使うとは言ってないじゃん。
124 :
デフォルトの名無しさん :2009/01/12(月) 20:08:21
>>117 わざわざ丁寧にありがとうございました。
scanfの件、了解しました。もうちょい勉強してみます。
>>123 だから、「文脈」
コミュニケーションが苦手だと苦労するぞ
>>123 おっと、ボロが出たね
条件は「ポインタを使う」だけではないぞ
>配列を使う方法ならできるんですが、ポインタを使った方法が知りたいんです。
この文の意図するところ(必ずしも明文化できない)が「条件」
もし
>>117 =
>>123 なら、
>>123 の発言は
>>117 が「配列を使う方法」に該当しないことを意味する
呼び出しスタックについて教えてください
128=2^7
>>122 sizeof(line)がおかしいような?
>>126 >>配列を使う方法ならできるんですが、ポインタを使った方法が知りたいんです。
いや、ポインタの使い方が分かればいいんだろ?
>>117 でもいいじゃん。
これは痛い
「ポインタを使いたい」→「malloc()だな」 のほうがエスパーすぎるんじゃね? ふつーに。
>>133 ヒント:mallocを提示したのは質問者
よっしゃ、エスパー認定されたぜ
>>134 それは読んでなかったわ。
へんなところ引用しないで、そこを引用すればいいのに。
>>133 =
>>130 もうあきらめたら?
108 :デフォルトの名無しさん:2009/01/12(月) 18:11:21
>>107 文字列を格納する十分な大きさのメモリ領域を確保しなきゃだめだぴょん
109 :デフォルトの名無しさん:2009/01/12(月) 18:12:37
>>107 大体、初期化されていないポインタはどこを指しているか未定義だぴょん
これが回答者の直接の回答。
お前が勝手に「確保=malloc」だと思い込んでいるだけ
>>136 ろくに状況を理解できないならレスすんなよクズ
すいません質問です。 for(i=x[0];i<=x[1];i++){ for(j=y[0]-chousei;j<=y[0]+chousei;j++){ r_img[i][j]=r; g_img[i][j]=g; b_img[i][j]=b; } for(j=y[1]-chousei;j<=y[1]+chousei;j++){ r_img[i][j]=r; g_img[i][j]=g; b_img[i][j]=b; } } for(j=y[0];j<=y[1];j++){ for(i=x[0]-chousei;i<=x[0]+chousei;j++){ r_img[i][j]=r; g_img[i][j]=g; b_img[i][j]=b; } for(i=x[1]-chousei;i<=x[1]+chousei;i++){ r_img[i][j]=r; g_img[i][j]=g; b_img[i][j]=b; } } だいたいこんな感じのプログラム(一部)を書いているのですが、 下の二個を囲っている/* */を取ってしまうとその場で計算が終わってしまうのか、 「続行するには何かキーを押してください」と表示されてしまうんです。 出力は他に設定してあるんですが、それでも終わってしまうんです。 環境はVS2005の学生版です。
136 :デフォルトの名無しさん:2009/01/12(月) 22:23:31
>>134 それは読んでなかったわ。
へんなところ引用しないで、そこを引用すればいいのに。
こいつは往生際が悪いなww
>>138 自分のツッコミの頭の悪さ棚にあげてなに言ってるんだよ。
おれはツッコミに反論してただけだろ。
ツッコミに沿った反論しかしないから、ツッコミが見当違いだったら、
反論だってスジから外れるのはあたりまえ。
>>142 は?wwwwwついに頭おかしくなったか?wwwwww
>>142 ほう、じゃあお前は質問をろくに読まずに回答することを肯定するんだな
142 :デフォルトの名無しさん:2009/01/12(月) 22:31:07
>>138 自分のツッコミの頭の悪さ棚にあげてなに言ってるんだよ。
おれはツッコミに反論してただけだろ。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ツッコミに沿った反論しかしないから、ツッコミが見当違いだったら、
反論だってスジから外れるのはあたりまえ。
はて、お前は質問者に答えていたのでは?ww
>>143 おまえ、マジ頭わるそうだな。
>>144 見当違いなツッコミを指摘するのと、それと、どう関係するんだ。
>>145 アンカー先の書き込みに反論してるだろ。
>>146 見当違いな答えを書いたお前を棚にあげて何言ってんだ。
上から順番にレスを見直せ。
お前が質問を読んでないのが原因なのは明白。
さすがにこの争っている二人、キモイな。頭がおかしいと 第三者に見られていることに気づけよ。お前らがやっているのは 質問に対するレスじゃなくて、詰らない言い争い。 周りの見えない視野の狭い奴って、実社会でも迷惑だよな。
゚ | ・ | .+o _ o。 | *。 | *o ゚ |+ | ・゚ _二ー-゙ヽ/_ +・ o |* o○+ | |i -= ´ ` ミ、 ゚| o ○。 ・+ ・ l /, ヽ ・|*゚ + | ゚ |i | + / i |ー|-|i | i l . i | |! | o。! |! ゚o !|{ヽ{`━' |i iト、 l | | * ゚ | 。*゚ l ・ ゚ |ソ_` "" リ!ノ /| |o ゚。・ ゚ *o゚ |! | 。 ヽ'- ノi| { + *| 。 | ・ o ゚l ゚+ ` イ jハ l *゚・ +゚ || |o |・゚ ,.‐- .._ -‐}! ヽ! | ゚ | * ゚ l| / 、 i } \ o.+ | ・ |l + ゚o i ` -、{! /_ \ ○・ |o゚ o○ | | ヽ. ヾ´  ̄ `ヽ *。 ・| + ゚ o } } ヽ O。 O。 | | リ、 ..::: .. l 。 o+ |!*。| / `ー:::: , ヘ:::::.. | * |・ | ゚・ |/ / :::... .. /:::/ | ::..... { | _|\∧∧∧MMMM∧∧∧/|_ > < /\ ──┐| | \ ヽ| |ヽ ム ヒ | | / \ / / | ̄| ̄ 月 ヒ | | \ _ノ _/ / | ノ \ ノ L_い o o > <
別にこんなところで誰に見られていようがwwww
C言語についての質問してもよろしいでしょうか?
150 :デフォルトの名無しさん:2009/01/12(月) 22:53:22 さすがにこの争っている二人、キモイな。頭がおかしいと 第三者に見られていることに気づけよ。お前らがやっているのは 質問に対するレスじゃなくて、詰らない言い争い。 周りの見えない視野の狭い奴って、実社会でも迷惑だよな。 お前もこいつらの仲間入りってか
もうどうでもいいんだが
>>153 まともな回答が得られるかは分からんよw
レベルが低いかもしれませんが・・・ #include <stdio.h> void rev(char *); int main() { char string[64]; printf("文字列を入力してください --- "); gets(string); printf("入力された文字列は「%s」です\n", string); rev(string); printf("逆順に並び替えると「%s」になります\n", string); return 0; } void rev(char *str) { char c, *p; p = str + strlen(str) - 1; while (str < p) { c = *str; *str++ = *p; *p-- = c; } return; } これのrev関数の中でどういうふうになっているのか教えてもらえないでしょうか。 環境はVisual C++ 2008で、C言語です。
>>157 p = str + strlen(str) - 1;
まずこれは分かるか?
入力された文字列のそれぞれの文字を数値化して考えて、それに文字列の長さをたして1を引いているんでしょうか? 正直よくわからないです。
whileのなかは c = *str; *str = *p; *p = c; str++;p--; と書いた方がわかりやすいね pはstrlenの行でstrの末端を指すようになってる strとpを両端から入れ替えていってる whileの停止条件はstrとpが交差?するまで
>>160 そのwhileのなかでのことをもう少し詳しく教えてもらえないでしょうか・・・
説明不足でしたが、仰るとおり文字列を反転させるプログラムです
163 :
161 :2009/01/12(月) 23:14:43
>ちなみにfor文ではなくswitchにしても同じでコメントアウトした部分を消すなり >してbreak;しないとまた似たようなエラーが起こってしまうんです。 とありますが、正確には ちなみにif文ではなくswitchにしても同じでコメントアウトした部分を消すなり してbreak;しないとまた似たようなエラーが起こってしまうんです。 でした。 すいません。
>>162 例として、次の6文字を考える。
[S][A][M][P][L][E]
まず、端っこ同士を交換する
[E][A][M][P][L][S]
次に端っこから一つ内側を交換する
[E][L][M][P][A][S]
もう一つ内側も
[E][L][P][M][A][S]
とすると、並びが逆順になる、というのはOK?
>>166 これを実現するにはポインタの操作が必要。
で、それが
>>160 の人が書いたやつなんだけど、これ、理解できる?
あぁ、ごめん、
>>160 が分かんないから困ってるのか
>>167 まずcにstrのアドレスを代入して、
strのアドレスにpのアドレスを代入して、
pのアドレスにcを代入して、
strの配列の要素の一つ先に移って、
pの配列?の一つ先に戻ってるってことでしょうか…?
なんとなくですが
>>169 アドレスではないよ、内容そのもの。
c = *str;
*str = *p;
*p = c;
最初、strは文字列の最初([0]とする)を指す。
pは文字列の最後(例えば[5]とする)を指す。
cっていうのは「交換」に必要な適当なハコ。
[c] = [0];
[0] = [5];
[5] = [c];
↑まず、このようにすると[0]と[5]が交換できる。おk?
あ、
>>170 の[0]とかは配列の[]とは無関係。
単純に、ハコの中身を入れ替えてると考えて。
>>170 あぁわかりました!
ところでp = str + strlen(str) - 1;
つまりどういうことでしょう?
>>172 >入力された文字列のそれぞれの文字を数値化して考えて、それに文字列の長さをたして1を引いているんでしょうか?
これが君の答えだよね?
数値化って惜しいんだけど、この場合返ってくる数値は「文字数」ね。
「最初」と「最後尾」を交換するためには、「最後尾」のアドレスが必要。
だから、それを計算してpに代入している。おk?
>>172 あ、数値化ってアドレスのことか。なら間違ってはいないのかな
つまり、
p=(strの先頭)+(文字列の長さ)−1
なんで-1するかというと、「文字列の1文字目」って配列で考えるとstr[0]でしょ?
さすがに答えているこいつの発言の仕方がきめぇw 構ってチャンタイプだろ?
>>173 つまりたとえば"SAMPLE"という文字列だった場合、
p = str + strlen(str) - 1;
の式でstrlen(str) = 6で、
strにはS = 1, A = 2…
となるのでしょうか?
>>177 大体合ってる。
ただし、文字列は0から始まる。
>>177 ごめん
>数値化って惜しいんだけど、この場合返ってくる数値は「文字数」ね。
誤解を招くような書き方をしてしまった。
strが文字列を返すわけではないよ。
>>180 …どういうことでしょう?
strは単に文字列の最初の文字のアドレス?ってことでしょうか?
abcdefg という文字列の場合 str は先頭の a を、pはstrlen(str)の7から1引いてstr[6]に当たる g。 あとは先頭を指しているstrと後ろを指し示しているpのそれぞれのポインタの位置を 順番に真ん中の文字に近づけつつ、入れ替えているわけだが。
ポインタstrはアドレス(数値を足すとその分前後にずれる) *strがアドレスが指す文字 っていうのを誰か説明しないと
わかりました! 教えてくださってありがとうございました。 また来るかもしれませんがそのときはよろしくお願いします。 それでは。
Cを使うためにはBASICとか学んだほうがいいですか? 大学ではFORTRANとか学べるんですが履修してません・・・
全然問題ない。 CとBASICとFORTRANは別物だし、むしろBASICなんて学んでいないほうがいいくらいだ。
>>161 r_imgを使ってるところをくまなく注意深く調べれば原因が分かる
BASIC って BASIC Ain't Super Intelligent Computer の略?
今いるかどうかはわかりませんが、
>>97 ご指摘ありがとうございます。
先手か後手の勝敗は奇数番目と偶数番目を比べて大きい方が勝ちなので、比べてから判断して欲しいのでa[0]取ったほうが勝ちというわけじゃないです
>>189 よくわかんない。
n=4の場合
先手:a[0]:1 後手:a[1]:2 先手:a[2]:3 後手:a[3]:4
x=4, y=6
y>xなので後手の勝ち
こんな感じに進むもんだと思ってたんだけど違うの?
191 :
デフォルトの名無しさん :2009/01/13(火) 15:24:25
四則演算のアプリを作るんですが、設計ツールって何がありますか? というかこれはC言語以外で作る手立てというのはあるのでしょうか?
192 :
デフォルトの名無しさん :2009/01/13(火) 15:33:27
>>191 確かBisonというのが演算子の優先順位を認識できるとどこかで読んだ。
設計ツールについては思い当たるものがない。
せいぜいVisioくらいしか思いつかない。
193 :
デフォルトの名無しさん :2009/01/13(火) 17:20:26
これをビルドするとエラーが出てしまうんですが、どこが間違えているのでしょうか?? 問題: 文字列配列 a[] に含まれる文字'A','B','C'が、それぞれ何文字だけ含まれているかをカウントするプログラムを作成 #include <stdio.h> #include <stdlib.h> int main(void) { char a[]="ABBBCBBBBCCAABBCCC"; // この文字列配列 a[]を調査せよ char *ptr; int i, j, count[3]={0}; // count[i] はすべて 0 で初期化 printf("%s\n", a); ptr = a; // 配列aの先頭アドレスをポインタ ptr にコピー j=0; while (*ptr != '\0'){ // ポインタ ptr の指し示す配列中の文字が「ナル文字」でない間 j++; if((i = 0; i < j; i++) == 'A') count[0]++; if(("str=%s \t ptr= %s \t str2=%s \n", str, ptr, ptr2) == 'B') count[1]++; if((i = 0; i < j; i++) == 'C') count[2]++; ptr++; } printf("入力した文字列は %d 文字です\n",j); printf(" Aの個数 = %d \n",count[0]); printf(" Bの個数 = %d \n",count[1]); printf(" Cの個数 = %d \n",count[2]); return (0); }
ifの使い方がおかしい。
195 :
デフォルトの名無しさん :2009/01/13(火) 17:25:05
もうひとつお願いします>< 次のプログラムにおいて int ######; // 変数、ポインタの宣言 ########## // int型変数 e に「値」 30 を代入 ########## // 変数e の「アドレス」を ポインタpointer_e に代入 ######### // ポインタpointer_e が指し示すアドレスのメモリ内の「値」を 変数gに代入り と処理したいとする。 各変数を適切に宣言し(#####を埋めよ)、e, pointer_e, g のアドレスと値の両方をprintf("### の[データ or アドレス]\n",###) 文により表示させるプログラムを完成させて実行せよ。 #include <stdio.h> int main(void) { int hennsuu; // 変数、ポインタの宣言 int e = 30; // int型変数 e に「値」 30 を代入 int e = pointer_e // 変数e の「アドレス」を ポインタ pointer_e に代入 char buffer[30]; // ポインタ pointer_e が指し示すアドレスのメモリ内の「値」を 変数gに代入 printf("eのデータ =%d\n", data.e); printf("eのアドレス=&d\n", address.e); printf("ポインタpointer_e のデータ =%d\n", data.pointer_e); printf("ポインタpointer_e のアドレス=%d\n", data.pointer_e); printf("gのデータ =%d\n", data g); printf("gのアドレス=%d\n", address g); return (0); }
196 :
デフォルトの名無しさん :2009/01/13(火) 17:25:47
>>194 どういう回答をすればいいでしょうか><?
馬鹿ですいません
>>196 for(i = 0; i < j; i++) if(str[i]== 'A') count[0]++;
for(i = 0; i < j; i++) if(str[i]== 'B') count[1]++;
for(i = 0; i < j; i++) if(str[i]== 'C') count[2]++;
198 :
デフォルトの名無しさん :2009/01/13(火) 17:30:11
>>197 ありがとうございます
ほかに問題はありませんでしょうか??
>>198 文字列の長さ調べてるところが、いまいちな?
200 :
デフォルトの名無しさん :2009/01/13(火) 17:41:04
>>199 いまいちわかりませんでした
申し訳ないのですが模範解答を張っていただけないでしょうか??
なぜ宿題スレに行かない
ロベール先生はなぜC++教室を作ろうと思ったんですか?
>>200 while (*ptr++ != '\0'){ // ポインタ ptr の指し示す配列中の文字が「ナル文字」でない間
もしくは
j=strlen(a);
もしくは
j=sizeof(a);
かな?
std::tr1::function を勉強中なんだけど関数オブジェクトが絡むとエラーが出てしまいます class CSamp; typedef std::tr1::function<int(const CSamp&)> pFunc; class CSamp{ pFunc pfunc; public: CSamp(pFunc pf) : pfunc(pf){} }; //関数オブジェクト struct stFunc{ int operator()(const CSamp& samp){ return 1; } }; これで CSamp samp1(stFunc()); とすると warning C4930: 'CSamp samp2(stFunc (__cdecl *)(void))': プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) という警告が出てしまいます。どこが問題なのでしょうか?
>>190 でも、それだと
2.9.1.5
って来たときは先手が偶数番目を取って勝ち、
3.2.4.1
なら先手は奇数番目を取って勝ちにならなきゃいけないので常に初めをとらなきゃいけない訳ではないんですよ
206 :
デフォルトの名無しさん :2009/01/13(火) 22:54:37
メモリアドレスを表記するときに最後にHをつけるのでしょうか?0000000Hみたいに また、0E00アドレスの一つ前は 0F00でしょうか? 1000つ先は1DFFであってますか?
Hを付けるのは一般に十六進法であると示すため。 メモリアドレスは十六進法で表す習わし。 0E00hの1つ手前は0DFF。1000が十六進での値なら、1E00。 これくらい、Windowsの電卓でも叩け。
208 :
デフォルトの名無しさん :2009/01/13(火) 23:16:55
>>207 ありがとうございます。
でもHのほかに0xをつけて示す場合もあるみたいなのがどう違うのでしょうか?
両方とも16進数って意味ですよね
>>208 後置のhはインテル系のアセンブラでの表記、前置の0xはCなどの言語での表記。
この他にも、前置の$や前置の&H、後置の(16)など、色々ある。
210 :
デフォルトの名無しさん :2009/01/13(火) 23:26:18
継承を使用してvectorクラスにfindメソッドを追加してくれ コンストラクタもどうやって書いたらいいんだ? タノム
>>210 <algorithm>のfind()では何かご不満でも?
>>210 STLのコンテナは継承するもんじゃないだろ。
213 :
デフォルトの名無しさん :2009/01/13(火) 23:32:40
int main(int argc, char *argv[]) { vector<int> t; t.push_back(0); t.push_back(1); t.push_back(2); t.push_back(3); int c = find(t.begin(), t.end(), 2); return 0; } こんな使い方をしたいのです。 実際は、intじゃなくて他のクラスにしたいんだけど
>>213 他のクラスでも==で比較できればfindできる。
==で比較できなくてもfind_ifがある。
215 :
デフォルトの名無しさん :2009/01/13(火) 23:33:40
訂正 int main(int argc, char *argv[]) { vector<int> t; t.push_back(0); t.push_back(1); t.push_back(2); t.push_back(3); int c = t.find(t.begin(), t.end(), 2); return 0; }
で、cには何が入ってほしいの? もし、t[2]に所望の要素が入っているからc = 2になってほしいという具合であれば、 int c = std::find(t.begin(), t.end(), 2) - t.begin();とすればいい。
STLコンテナを継承するクラスなんて作るなってばっちゃんが言ってた
219 :
デフォルトの名無しさん :2009/01/13(火) 23:37:27
tのvectorに、2のインスタンスが含まれていたら、 それが帰ってきてほしい。 いまんとこ、forでループして探してるんだけど ながったらしくて ごめんなさい
220 :
デフォルトの名無しさん :2009/01/13(火) 23:38:14
vectorにfindが無いなんて不思議じゃん
221 :
デフォルトの名無しさん :2009/01/13(火) 23:38:34
test = array[0]<<16; test |= array[1]<<8; test |= array[2]: すみませんこれはどういうことでしょうか?
>>219 見つからなかったらどうしてほしいの?
必ず見つかるなら、int c = *find(t.begin(), t.end(), 2);でいいのだが。やる意味はともかく。
>>221 そういうことです。何が判らないのか判らないので謝られても困ります。
225 :
デフォルトの名無しさん :2009/01/13(火) 23:44:47
見つからなかった場合は、-1返すとかそのへんは
後で実装するんで、いいんですけど
構文が分からないのです。
誤ったのは、教えていただくのにこちらはなんもできないので
すみませんって思ったんです。
>>216 int main(int argc, char *argv[])
{
vector<int> t;
t.push_back(0);
t.push_back(1);
t.push_back(2);
t.push_back(3);
int c = std::find(t.begin(), t.end(), 2) - t.begin();
return 0;
}
↑こういうことでしょうか?あってますか?
コンパイル通らなかったです。
main.cpp: In function 'int main(int, char**)':
main.cpp:32: error: no matching function for call to 'find(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int)'
linuxなんですけど。
>>225 <algorithm>インクルードした?
>>225 >誤ったのは、教えていただくのにこちらはなんもできないので
藪から棒になんだ?
>コンパイル通らなかったです。
gccでコンパイルしているなら、コマンドをg++にして味噌。
228 :
デフォルトの名無しさん :2009/01/13(火) 23:56:02
げ、ゴメン。 大変失礼。 うまくいきました。なんで、 - t.begin()(イテレータの減算) で取得できるのかわからないので、そこは勉強します。 ありがとうございました。
229 :
デフォルトの名無しさん :2009/01/13(火) 23:58:18
>>227 なんか恐縮でw
コンパイラは、g++使ってます。ありがとうございます。
t[0] == 2だったらc == 0だけど大丈夫?
どっちかと言うと、std::distance(t.begin(), std::find(t.begin(), t.end(), 2))だと思うがまぁいいや。
232 :
デフォルトの名無しさん :2009/01/14(水) 00:03:36
>>230 え?なんか理解できませんが、そうなんですか。
試してみたらそうみたいですね。
意味不明ですが、勉強します。
えーなんでだ・・・
233 :
デフォルトの名無しさん :2009/01/14(水) 00:06:39
>>207 0E00Hの0x1000先は1E00Hとのことでしたが
これは1バイト限定の話でしょうか?
仮に全て2バイトが入るとすると
メモリアクセス単位は0E00 0E02 0E04と1000先まであるけど実際は500個しか
メモリに値をおけないということですよね
234 :
デフォルトの名無しさん :2009/01/14(水) 00:09:10
ちなみに、もっと具体的に書くと こんなメソッドが、いっぱいあるんだが、 find使ったらもっと、スマートに書けるんじゃないかと 思って、調べてました。 まぁそれだけですが。 void hogeclass::clear(unsigned int id) { vector<huga *>::iterator it = list.begin(); for (int i = 0; it != list.end(); i++, it++) { if (list[i]->get_id() == id) { list.erase(it); break; } } }
>>234 そんな間抜けなプログラム、一体全体どこの阿呆が書いたんだ?
ループ制御変数にインデックスカウンタとイテレータを両方とも使うのなんて初めて見たよ。
int j = 0; while( ( j = getchar() ) != '\n') { printf("%d\n", j ); } C言語で↑の様に書いて、数値を入力して出力させたら入力した数値と出力される数値が異なるんですが、 何故異なるのか解りません。 誰かご教示お願いします。 例:6 と入力→54 と出力される。
>>236 getchar()は文字コードを返す。
>>237 なるほど…
即答ありがとうございます!
os : Linux ubuntu8.10 compiler : gcc c++でカレントディレクトリの情報を取得するには どうすればいいですか?
// / / パカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ まピョーん☆ / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
>>232 std::find()が返すのは見つかった要素を指すイテレータ。
まぁ慣れないうちはポインタみたいなものと思えば。
目的の要素のポインタから先頭要素を指すポインタを引けばindexになる
243 :
デフォルトの名無しさん :2009/01/14(水) 07:28:23
とあるメモリたとえば0x0001に文字列 chr というものを入れたとします。 そしたら、メモリから見るとこのメモリにはどのように記述というか表されているのでしょうか? 二進数で0101010とか もしくは16進数でいれられてるのでしょうか? 2バイトの整数でも同じでしょうか
>>243 寧ろ聞きたい。二進数で入るのと16進数で入るのとでは何が違うと思うのかね。
246 :
デフォルトの名無しさん :2009/01/14(水) 07:56:38
>>245 どっちかしか解釈できないかとおもいまして
機械語だと二進数になるみたいに
>>246 例えば10(16)は16(10)であり10000(2)であるわけで。
勿論それは、100(4)でもあるし、20(8)でもある。
つまり、何進数であろうともそれがその数値であることには変わらないのだが。
# 中学校辺りから数学をやり直すべきじゃないか?w
まりさのぺにっぺにっでにっしんさせようとすると insert error not founc 404 found anal OK? とでるんですがどうしたらいいんでしょうか?
英語を勉強するといいよ
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ こいつ まピョーん☆ 彡、 |∪| / / __ ヽノ / (___)
Human *human = new Marisa human->push_back(); human->pop(); human->push_back(); human->pop(); human->push_back(); human->pop(); human->push_back(); human->pop(); human->push_back(); human->pop(); ってコンパイル通したら Oh!! YES!! an an an an an... ってコンパイラがいかれちゃったんですけど どうすればいいんですか?
X * x = new X; X * x = new X(); Xというクラスがあったとして両者は同じこと?
そこで Marisa->SetSex( Man ); Marisa->Sex( Marisa ); ってコンパイルしたら compiling.... .... .... .... ( ゚д゚ )ポカーン とでるんですけど・・・
>>255 よくみろよ警告でてるぞw
warrning : Marisa has HIV.
>>256 #pramga warrning ( disable : Marisa )
bool ∀ = 1; int T = 0; while( T∀T ) printf( "帰れません\n" );
259 :
デフォルトの名無しさん :2009/01/14(水) 21:00:19
16進数で61 は 文字列abになりますか? pingすると 61 62 63 64... というデータが取得できそれらはab cd ef となっているのですが これは何がおこっているのでしょうか? というか、例えば charで文字列 string を配列に保存した場合 機械語にされたらというか、メモリ上ではどのような値で存在しているのでしょうか? また、その値を見たら文字列stringだとわかるのでしょうか?
>>259 0x61 は a です。
メモリにはアスキーコードが格納されます。
メモリの値だけを見た時、それが数字としての0x61なのか、文字のaなのかを知る術はありません。
261 :
デフォルトの名無しさん :2009/01/14(水) 21:28:43
>>260 なんでこんな知るすべのない方式にしたのでしょうか?
0x61は16進数の61でもあるし、aにもなりうるということですよね
263 :
デフォルトの名無しさん :2009/01/14(水) 21:33:30
>>メモリの値だけを見た時、それが数字としての0x61なのか、文字のaなのかを知る術はありません。] では、メモリをそれをどうやって文字なのか数字なのか解釈しているのでしょうか?
解釈してるのはお前だろうが。 0x61をみたときに、体重97Kgとみるか、バスト97cmとみるか、解釈しだい
ASCIIこーどだと思い込んで読めば, ASCIIこーどになるんだよっ!
266 :
デフォルトの名無しさん :2009/01/14(水) 21:40:31
つまり10進数になおして97とみるか、文字コードになおしてaとみるかは自分次第ってことですよね
>>263 読む側が適当に解釈してます。
というよりも、実際はメモリの値だけを見てどうにかしようとすることが稀ですね。
大抵は型を保持している変数を経由してアクセスしますから。
キャストといって、あえて本来とは異なる型で読むこともあります。
268 :
デフォルトの名無しさん :2009/01/14(水) 23:32:24
test = array[0]<<24; test |= array[1]<<16; test |= array[2]<<8; test |= array[3]: arrayは1byteの型としておきます これでtestは何バイト型になるのでしょうか?
testを宣言した時の型で決まる それは演算しても変わらんよ
test の宣言次第だろ・・・。
271 :
デフォルトの名無しさん :2009/01/14(水) 23:44:36
例えばテストを2byteで宣言したならビットシフトして入りきらない部分は切れてなくなるということですよね 4byte以上で宣言すればなくならないことかな
array[0] が int に汎整数昇格してから計算されるので、 int が 2 バイトの環境では array[0] << 16 や array[0] << 24 が未定義動作になる。 array[2] << 8 はどんな環境でも大丈夫だが、 char と int が両方 16 ビットとかいう超特殊な環境なら、上の 8 ビットが死ぬ。 (そもそも char が 8 ビットであることを期待したコードだから関係ないけどね)
273 :
デフォルトの名無しさん :2009/01/15(木) 00:10:21
>>272 test をlongで4バイトにしても
arrayは昇格しないのですよね
intが2バイト環境で解決するほうほうはないでしょうか?
すいません質問です。 for(i=x[0];i<=x[1];i++) { for(j=((y[1]-y[0])/(x[1]-x[0]))*(i-x[0])+y[0]-hutosa;j<=((y[1]-y[0])/(x[1]-x[0]))*(i-x[0])+y[0]+hutosa;j++){ r_img[i][j] = r; b_img[i][j] = b; g_img[i][j] = g; } } こんな感じのプログラムで、hutosa*2の太さの斜線を描こうと思ったのですが、 出てきたのはなぜか指定された太さの斜線ではなく普通の横棒でした・・・。 太さだけは指定されたとおりのものが出てきたのですが。 for(i = 0;i< 2048;i++) { for(j = i*katamuki-3;j<=i*katamuki+3;j++){ if(j>2048) j =0;//2048を超えたら描画しないようにする。エラーが起こるため。 r_img[i][j] = 0; g_img[i][j] = 0; b_img[i][j] = 0; } } こんな感じで、傾きだけ指定してからなら太さを指定しても太い斜線が出力できるの ですが、どうしてでしょうか?
xがint型だとエスパー
276 :
デフォルトの名無しさん :2009/01/15(木) 01:00:58
while(1){ 処理 } このような文はいつwhile文が終了するのでしょうか? 組み込み系に多いらしいのですが、終了しないと無限ループして やたら領域とCpuを食うとおもうのですが
「処理」の部分でbreakか何かをやってるんでしょ。
ポーリング、スピンロック、ビジーウェイトあたりでググれ
>>275 ありがとうございます。
intからdoubleにしたらちゃんと描画されました。
JISX 3010 をテキストに起こした人居ないかな? 検索できなくて面倒なんだけど
282 :
276 :2009/01/15(木) 07:01:44
つまり、これはポーリングだとするとずっと処理しっぱなしってことでしょうか?
>>273 array[*] を 4 バイトの型にキャストすればいい。
>>283 それなら、ビットシフトする必要はなくなるかな?
右辺のシフト演算時にキャストってことだろうよ
>>284 ・バイトオーダに依存する
・CPU によってはアラインメントがズレてて死ぬかもしれない
まあ、環境が許すならいいじゃない?
2項演算は片方がlongならlongで行われるから もしかしたら = array[0] << 8L; でも大丈夫かも でも責任はもてない
<< は特殊な演算子だから_
289 :
デフォルトの名無しさん :2009/01/15(木) 11:04:58
GDI+は、Win95/NT4でも使えるのでしょうか?
VC++2008の変換ウィザードで次へのボタンが表示されないんですがどうしたらよいのでしょうか
外部関数に引数として2次元配列を指定し、 その外部関数内で配列をいじくるとmain関数内の二次元配列の値も変わってしまうのですが、 どうすればよいのでしょうか。
そういうものなので、変わってしまって困る場合はコピーを作って渡すか、 外部関数内で配列をいじらないようにする。
294 :
デフォルトの名無しさん :2009/01/15(木) 16:14:40
strtok関数を使って、カンマ区切りのCSVファイルデータを配列に格納したいのですが、調べていて array[ 0 ] = strtok( file_image, ",\n" ); array[ 1 ] = strtok( NULL, ",\n" ); array[ 2 ] = strtok( NULL, ",\n" ); こういうのがでてきました。しかしここで疑問なのですが、なぜ2回目からNULLなのでしょうか? 指し示すファイルから、指定した文字で分割する関数ですよね?NULLを指定しても意味がないように見えるのです
strtok関数のマニュアルを読みなさい
>>274 x と y はどのように初期化してるんだい?
その配列を除外すると斜めに引けるんでしょ?
実行時に引数を2つとり、指定されたディレクトリから、指定した数だけデータを読み込むプログラムを作っています。 第一引数にディレクトリ名、第二にファイル数です。 このプログラムを改造して指定ディレクトリから、選んでくるファイルをランダムにするようにしたいのですが、 どのようなコーディングになりますでしょうか。(エラー処理は適当です、すいません) main( int argc, char *argv[] ) { char *dir; /* ディレクトリ情報を示すためのポインタ */ int num; int i; DIR *dp; /* 各エントリの情報を示すための構造体ポインタ */ struct dirent *entry; struct stat statbuf; if(argc<2){ dir = getenv("PWD"); }else{ dir = argv[1]; num = atoi(argv[2]); } i = 0; while((entry = readdir(dp)) != NULL && i < num){ if((strcmp(".",entry->d_name) == 0) || (strcmp("..", entry->d_name) == 0)) continue; fprintf( stdout, "%s\n", entry->d_name ); chdir(dir); watasi_JK( entry->d_name );//処理 i++; } closedir(dp); }
dirent.h使えば何とかなるだろ 多分その環境ならあるだろう
>>298 readdir()がNULLを返すまで繰り返さないと、ディレクトリに何個ファイ
ルが存在するかはわからなかった気がする。
簡単にやるには、readdir()ループでファイル名をぜんぶ記録して、総数
がわかってから確率で選んで、実際の処理をする。
>>298 うまい方法はないので、一旦全部のファイルを読んで
数とファイル名を覚えておく。そのあと、そこからランダムに選んでいく。
ランダムに選ぶのを厳密にやるのは面倒だけど、そこを気にしては
いないでしょ?
>>298 ちなみに、乱数の揺らぎのせいで選出パターンがリストの序盤に偏ったり、
逆に必要数が集まらなかったりするので、厳密にやろうとすれば
1.ファイル情報を全て配列に並べる
2.乱数を使ってソーティングする
3.上から必要な分だけ選ぶ
という流れになる。
ランダムソートのコストが大きいのであれば、ちょっと低めの確率で2〜3回リストを
走査して必要数が集まるようにすれば、それっぽい動きをするでしょう。
303 :
302 :2009/01/15(木) 20:14:03
ぬ、書いてる間に書き込みがw
>>301 さんの言うように、重複チェックして選ぶ方がシンプルです。
>>298 ふっ、この程度のもの、プログラミングを職としていない俺でも
昼食前だぜ
305 :
デフォルトの名無しさん :2009/01/15(木) 20:43:05
C++の本を見ると[a, b)というようなのが出てくるんだけど、これなんですか?
>>305 C++ というより数学の記号
開区間と閉区間でぐぐれば分かるんじゃねー
ちなみにそれはa 以上、b未満って言う意味だね
(a, b) : a < x < b [a, b] : a <= x <= b [a, b) : a <= x < b
309 :
デフォルトの名無しさん :2009/01/15(木) 21:16:29
おーそうだったのか! みんな頭いいな。
311 :
298 :2009/01/15(木) 21:46:06
>>299-304 みんなレスありがとー
ファイル名全部を配列に保持して、インデックスをランダム抽選するのですね
C初で関数名が鮭わかめですがググル先生とがんばってみまう
ファイル名を、入る(ふぁいる)だけ記憶するの?
すいません下のコードの場合、castの際に + '0' を付けるとどういう意味があるか教えてもらえないでしょうか? static char name[30]; static int sequence = 0; name[3] = static_cast<char>(sequence + '0');
sequence が十進法で一桁の数字なら、それに '0' を足すことでASCIIコードの数字になる。 例えば sequence = 1 なら、sequence + '0' ==> '1' といった具合に。
>>314 ありがとうございます!
単にchar型にキャストするだけじゃ文字には変換されないんですね。
316 :
デフォルトの名無しさん :2009/01/16(金) 20:25:06
std::istream::get()で、終端子の取り扱いをread()のようにするにはどうすれば いいですか?イテレータで詰まってます。
お金が無いので、無料の開発環境で作りたいのですが、 グーグルで「C++ 開発環境 無料」での一番上のサイトで揃えようとしましたが、 デバッカーだけ揃えられませんでした。 デバッカーをダウンロードできる項目と 上記の環境以外で、無料開発環境のオススメを教えて下さい。 お願いします。
WindowsならVisual C++ 2008 Express使っておけ。 もっとも、Windowsが無料じゃないというのが手落ちだが。
Windows -> Visual C++ 2008 Express Mac OS X -> XCode(OS に同梱) Linux -> Eclipse これでおk
320 :
デフォルトの名無しさん :2009/01/16(金) 22:41:25
Eclipseってデバッガなの?
いやIDEだよ
322 :
デフォルトの名無しさん :2009/01/16(金) 22:50:07
だよな。
それが何か?
324 :
デフォルトの名無しさん :2009/01/16(金) 22:58:37
いや、べつに。
うん。
しゃぶれよ
bcc も gcc も vc も実質ついてるようなもんだが
変な質問かもしれませんが・・・ VisualStudio6.0を使ってC言語の勉強をしています コンソールアプリケーションで色々書いて動かしているようなレベルなのですが ファイル名の命名規則のようなものがあったら教えて頂けないでしょうか? 変数や関数の命名規則は色々出てきたのですが、 ファイル名の命名規則のようなものが見つけ切れませんでした 例えばソースファイルならこのような形式の名前のファイルにするとか 大文字だとかそういうルール的なものがあればという意味合いなのですが もし、そんなルールがないのでしたら一般的な一例を教えて頂ければと思います 変な質問で恐縮ですが、宜しくお願いします
source_file.c SourceFile.c sourceFile.c source-file.c source file.c ソースファイル.c 好きなの使っとけ。
質問させて頂きます。 for(・・・) { for(・・・) { switch(・・・) { case *: ・・・ } } } というようなループ機構で、ループ内でswitch分岐を行っているのですが、 ループ回数がかなり多く、高速化のため分岐を外に出しました。 つまり同じループ機構をいくつか書いて、ループ内でなるべく条件判定を 行わないようにしたのですが、実際このループ部分も結構色々書いてまして、 同じ文を何度も書くと結構な量です。さらにこうなると後の修正も非常に面倒になりますので、 何とか同じ文を何度も書かずに済む方法はないかと思っています。 結果的に分けられたループそれぞれの違いはループ内だけになるのですが、 何かうまい方法はありませんでしょうか? 例えばテンプレートなんかだと、結構似たようなことが出来ますが、 あれは型や値で分けることしか出来ないみたいですね。 ループ前後をマクロ化するというのも考えましたが何か不格好な・・・。 ちなみにループひとつでおよそ50行くらいです。
なーんか要領を得ない文章だな あと条件判定が外出しすることで高速化した、と言ってるようだが 普通、条件判定みたいに一瞬で終わるものを外に出しても 高速化しない。
アホは黙ってていいよ
コンパイラを信じてinline関数を使うんだ。
ループの一番内側の処理だけ変更したいってことだろ? 関数オブジェクトあたりを使うといいんじゃないだろうか
335 :
317 :2009/01/18(日) 11:43:59
遅くなりましたが、
>>318 さん、有難うございます。
早速、試してみます。
Visual C++ 2008 Expressをインストールしましたが、 開発環境を立ち上げる事ができません。 どうやって起動すればいいでしょうか? 因みに、 >もっとも、Windowsが無料じゃないというのが手落ちだが。 はどういう意味でしょうか?
WindowsというOS自体が無料じゃないと言っているだけだな。 まぁ、バンドル品しか買ってないと気がつきにくい話ではあるが。
>>336 VC++のアイコンがデスクトップにあれば、それをダブルクリックすると起動するよ。
あるいは、デスクトップ左下のスタートアイコンの「すべてのプログラム」からVC++をさがしてクリックすれば起動するはず。
#include <iostream> int main(void) { char* str; str = "string"; std::cout << str << std::endl; return 0; } のようにすると↓の警告が出るのですが,どのように書くのが自然なんでしょうか? test2.cpp: In function 'int main()': test2.cpp:6: warning: deprecated conversion from string constant to 'char*'
const char* str;
const char * str = "string";
const char * const str = "string";
>>341-343 なるほど分かりました.
Java のように文字列が string 型扱い…ということではなかったんですね
うん。文字列リテラルの型はconst charの配列だ。 Cとの互換のためchar*への変換が可能になっている。 まあstring型は別にあるけど、それはともかく。
「Cとの互換のため」←ウソ CもC++も初めからconst charの配列。 互換のためでも何でもなく、変換はそもそも可能。
C99でさえcharの配列(ただし書き変えちゃダメ)だよ。 constが無かった時代を引きずっている。
>>346 何を血迷ってるんだ。
リテラルを書き換えられた古代の C との互換性のため
ANSI C でしかたなく char* への変換を可能にして、
それとの互換性で C++ でも同様にしてるんじゃないか。
349 :
336 :2009/01/18(日) 20:40:24
>>339 さん、
なぜか、すべてのプログラムの項目にもVC++の欄は無く、
デスクトップには、リンク先が「F:\vcsetup.exe」の「vcsetup へのショートカット」
というアイコンしか出ませんでした・・・orz
それはダウンロードしただけでインストールしていないというオチに見える。
351 :
デフォルトの名無しさん :2009/01/18(日) 22:39:44
#include<stdio.h> int ave(int x[5]); int main(void); int ave(int x[5]) { return((x[0]+x[1]+x[2]+x[3]+x[4])/5); } int main(void) { int y[5]; scanf("%d,%d,%d,%d,%d",&y[0],&y[1],&y[2],&y[3],&y[4]); printf("平均値 %d\n",ave(y[5])); return(0); } でコンパイルすると 17行目の部分で パラメータ`x`は int*型として定義されているのでintは渡せない(関数main) とエラーが出るのですが、どのようにすればいいのでしょうか?教えてください。
> printf("平均値 %d\n",ave(y[5])); printf("平均値 %d\n",ave(y));
yはint[5] y[5]はint
ave(y)
355 :
デフォルトの名無しさん :2009/01/18(日) 23:10:26
352、353、354さん ありがとうございました。
>>334 関数をテンプレートにして、関数オブジェクトを使えば確かにできそうですね。
しかし実際やってみると本当にインライン展開してくれるのかが不安です・・・
もし展開されてないと呼び出しオーバーヘッドが発生しては意味がないので。
案ずるよりも産むがやすし
358 :
デフォルトの名無しさん :2009/01/19(月) 15:10:53
1.多角形の頂点座標を保存するため、int型2次元配列 coor を用いる。 各行はひとつの三角形を示す。1行の各数値は三角形の頂点座標を示している。 例えば、三角形A0A1A3の場合、その行の各列の要素は{x0,y0,x1,y1,x3,y3}となる。 下記をそのまま使え。 int coor[NUM][6] = {{4, 3, 2, 3, 5, 1}, {2, 3, 0, 2, 5, 1}, {0, 2, 5, 1, 3, 0}}; 2.マクロNUMで三角形の数を3と定義する。 3.NUM個に三角形面積を保存するため配列triangle_areaを用いる。 4.三角形面積を計算する関数calc_triangle_areaを作成する。 引数は三角形の各頂点座標(整数)、例えば、三角形A0A1A3の場合、引数は(x0, y0, x1, y1, x3, y3)となる。 戻り値は面積(単精度浮動小数点)とする。 実行例% ./a.out 該当多角形の面積は 9.00である。 3 個の三角形の面積は下記のとおりである。 2.00 3.50 3.50
そうですか
360 :
デフォルトの名無しさん :2009/01/19(月) 15:32:34
テキストで a * 3.14 / (4 + b) + e ^ (3c) などと書かれたテキストを解析して計算させようとおもっているのですが、 こういうのってなんて言うんですか? (数式処理プログラム…とはちょっと違いますよね) 実現できるライブラリや、開設サイトとかありましたらご教授ください。
361 :
358 :2009/01/19(月) 15:33:00
#include<stdio.h> #include<math.h> #define NUM 3 main(){ int i; float s1, s2, s3, triangle_area; int coor[NUM][6] = {{4, 3, 2, 3, 5, 1}, {2, 3, 0, 2, 5, 1}, {0, 2, 5, 1, 3, 0}}; s1 = fabs((coor[0][2] - coor[0][0])*(coor[0][5] - coor[0][1]) - (coor[0][4] - coor[0][0])*(coor[0][3] - coor[0][1]))/2; s2 = fabs((coor[1][2] - coor[1][0])*(coor[1][5] - coor[1][1]) - (coor[1][4] - coor[1][0])*(coor[1][3] - coor[1][1]))/2; s3 = fabs((coor[2][2] - coor[2][0])*(coor[2][5] - coor[2][1]) - (coor[2][4] - coor[2][0])*(coor[2][3] - coor[2][1]))/2; printf("%d 個の三角形の面積は下記のとおりである。\n", NUM); printf("%f\n", s1); printf("%f\n", s2); printf("%f\n", s3); triangle_area = s1 + s2 + s3; printf("該当多角形の面積は%f\n", triangle_area); return 0; } 例のとおりに表示するにはどうすればいいのでしょう?
printf("該当多角形の面積は%.2fである\n", triangle_area); printf("%d 個の三角形の面積は下記のとおりである。\n", NUM); printf("%.2f\n", s1); printf("%.2f\n", s2); printf("%.2f\n", s3); ということ?
364 :
358 :2009/01/19(月) 15:59:17
>>362 そうすると実行例どおりに行くんですが、
問題文に沿ってプログラムを書いたらどうなるんでしょうか?
宿題丸投げなら該当スレあるよ。 もともと質問が表示するにはどうしたらいいか?だったからprintfしか書かなかったが。
問題文にあわせるとこんな感じ?(改行大杉言われたからつめた) #include<stdio.h> #include<math.h> #define NUM 3 double calc_triangle_area(int x0, int y0, int x1, int y1, int x2, int y2); int main() { int i; double triangle_area[NUM]; double sum = 0.0; int coor[NUM][6] = {{4, 3, 2, 3, 5, 1}, {2, 3, 0, 2, 5, 1}, {0, 2, 5, 1, 3, 0}}; for (i = 0; i < NUM; i++) { triangle_area[i] = calc_triangle_area(coor[i][0], coor[i][1], coor[i][2], coor[i][3], coor[i][4], coor[i][5]); sum += triangle_area[i]; } printf("該当多角形の面積は%.2fである\n", sum); printf("%d 個の三角形の面積は下記のとおりである。\n", NUM); for (i = 0; i < NUM; i++) { printf("%.2f\n", triangle_area[i]); } return 0; } double calc_triangle_area(int x0, int y0, int x1, int y1, int x2, int y2) { return fabs((double)((x1 - x0)*(y2 - y0) - (x2 - x0)*(y1 - y0)))/2; }
367 :
358 :2009/01/19(月) 17:11:57
>>366 参考になります、ありがとうございました。
368 :
360 :2009/01/19(月) 18:13:53
>>363 うーん、コンパイラコンパイラとはちょっと違うと思います…
上手く説明できてないんですけど、
たとえば、aとbとcという変数があったとき、
それを
a * 3.14 / (4 + b) + e ^ (3c)
とか、
a * log(b) + c
とか、任意の式を文字列で与えて計算できるようにしたい…という感じです。
BearGraph(グラフ描画ソフト)で、式を入れると、それを解析して、
変数に応じたグラフを吐いてくれる…みたいな使い方です。
…とBearGraphのヘルプ見たらなんとかなるんじゃないかと思い、参考文献読みあさったら、
アルゴリズム事典の"式の評価"の所にそれらしきものが載っていました(四則演算のみですが)。
ちょっとこれをいじって関数使えるように挑戦してみますが、
もし既にこんな事ができるライブラリがありましたらご教授願います。
し・・・・・・知らーーーーーーーんッ!!! そんなのは自分で考えェェ!!!
373 :
360 :2009/01/19(月) 22:26:26
>>369 これすごいw 知らなかったw
ちょっとがんばってみるww
>>368-369 一口に式の評価といっても、いろいろあるんですね…
勉強になりました。ありがとうございました。
数式位なら、boost::spiritがお手軽。
逆ポーランド記法で直接式を書かせる計算機を作るつもりじゃないだろうね?w まあそれはそれで面白いけど、 計算式を構文解析して内部的に逆ポーランド記法みたいな状態にコンパイルしてから スタックマシンに計算させるって使い方が普通じゃね。
式のパーシングをしたければ再帰降下法でゴリゴリと書いてしまうのがお手軽 たぶんコンパイラの教科書の最初の方(構文解析のところ)に載ってるよ
中値記法は記号の間に空白入っても入らなくてもいいけど 逆ポーランド記号は確実に入るから 構文解析が楽なのかね とこの流れを見てふと思った
3 1 2+-
逆ポーランド記法はコンパイラの本なら必ず載ってる基本だけど、 この場合はyaccとlexでいいんじゃないかと思う
でも自分で構文解析するのも面白いよ。 yacc/lex だとプログラムの組み方にも変な制限かかるしね。
lex ってライブラリをリンクしないといけなかった気がする。 公開したい場合は面倒なんだよな。
スクリプト言語処理系呼び出せば簡単に計算できるけどね。 cf. system("awk 'BEGIN {a = 3; b = 4; c = 5; print c * c - a * a - b * b;}'");
俺もその手のコマンド作ってるわw Ruby で計算させるやつ。
384 :
349 :2009/01/19(月) 23:50:20
>>350 さん、
「Program Files」の「Microsoft Visual Studio 9.0」というフォルダの中に
「Microsoft Visual C++ 2008 Express Edition with SP1 - JPN」や「VC」がありますが、
確かにsetupと書いてあるので、
おそらくインストールされていないでしょうが、
私の使っているパソコンには、Fドライブはありませんですし、
それに至るプロセスが無い以上、どうする事も出来かねます。
0〜1000乱数を1000回、発生させたいのですが、 重複しないようにするには、これまで発生した数すべて記憶するほか術はないのでしょうか
>>385 記憶っていうか、そういうことをするなら、配列に0〜1000の値を
入れておいて、シャッフルするのがふつーだと思う。
>>385 for(i=0;i<=1000;i++)
a[i]=i;
for(i=0;i<適当に;i++)
swap(&a[rand()%1001], &a[rand()%1001]);
こんなんでどうよ?
swap()は適当に実装よろ
>>386 即レスありがd
シャッフル同盟について調べてみるお
GO FIGHT
>>387 100回くらい読んだけどわかんないお・・・(^オメガ^;)
swapについて調べてみるお
>>386 さんの言うシャッフルをコードにしてるだけさね
391 :
387 :2009/01/20(火) 01:05:59
インデックスを両方rand()使うとスワップされないところが出てくるな for(i=0;i<=1000;i++) swap(&a[i], &a[rand()%(i+1)]); こっちのがよさげだわ
>>385 for(i=0; i<=1000; i++) {
j = rand() % (i + 1);
a[i] = a[j];
a[j] = i;
}
393 :
デフォルトの名無しさん :2009/01/20(火) 01:18:13
すみません、質問させてください CALLBACK関数のポインタを受け取りたいんですけど、書き方がどうしてもわからずに相当なやんでます。 使ってるのはVC++ .NET、 Cで書いてます。 void CALLBACK print_status(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2){ } void timerset(void CALLBACK (*func)(UINT, UINT, ULONG, ULONG, ULONG), UINT time_delay, UINT event){ } main(){ timerset(print_status, TIME_WAIT, TIME_ONESHOT); } エラーログ C2143: 構文エラー : ')' が '*' の前にありません。 C2143: 構文エラー : ')' が '*' の前にありません。 C2143: 構文エラー : '{' が '*' の前にありません。 C2059: 構文エラー : ')' C2059: 構文エラー : '型' C2059: 構文エラー : ')' 括弧がどうとか、ってことなんですけど・・・
394 :
385 :2009/01/20(火) 01:21:02
ありがとーなんとかイメージがつかめてきました
>>392 私のa[i]を返して!!!!!!!
>>393 俺は関数ポインタを扱うときは(メンバ関数も含め)必ずtypedefするようにしてる。
だからどうやったらエラーが消せるかわからない。
>>391 の方法はシャッフル前の並びに依存して
シャッフル後の並びに確率的な偏りが生じるから注意
生じませんw
どっち?
>>393 void timerset(void (CALLBACK *func)(UINT, UINT, ULONG, ULONG, ULONG),
UINT time_delay, UINT event)
>>393 void timerset(void CALLBACK (*func)(UINT, UINT, ULONG, ULONG, ULONG),UINT time_delay, UINT event) ↓ void timerset(void (CALLBACK *func)(UINT, UINT, ULONG, ULONG, ULONG),UINT time_delay, UINT event) 死ねよw
素直にstd::random_shuffle使え。 C++じゃないならあきらめろ。
>>398 生じる
まともにやりたきゃ、1から1000のリンクリスト作ってランダムで1個ずつ抜いていけ
>>393 です
ありがとうございます!
今日の夕方から調べたり試したりしてたので、多分7時間くらいはなやんでましたw
死んできますw
>>402 プw
for(i=0;i<=1000;i++)
a[i]=i;
で初期化して
for(i=0;i<=1000;i++)
swap(&a[i], &a[rand()%(i+1)]);
すれば偏りなんてありませんw
407 :
387 :2009/01/20(火) 02:36:52
インクリメントでループしてんのがまずいのかな? デクリメントループだとFisher-Yatesのアルゴリズムと言われるみたいだな。 根拠となる文献示してもらえると無駄にあれなくて済むから 偏るって言ってる人はキーワードだけでも教えてもらえるとうれしい。 この辺で今日は寝る
>>406 カスがカスに向かってカスとは、失礼だろw このクズがw
おめーがな
>>404 どう考えても偏ります。本当にありがとうございました。
&a[(int)((double)rand()/(double)RAND_MAX*(i+1))]こういうこと? さっぱりわからん
>>413 まじでありがとう。
なんとなくわかってきたわ。
ifstream data_in(argv[1]); // 入力ファイル while(data_in.eof()){
while(!data_in.eof()){
すいません、教えてください ifstream data_in(argv[1]); // 入力ファイル int num; while(!data_in.eof()){ data_in >> num; cout << num; } return(0); とするとですね、空っぽのファイルを読み込む場合、 EOFを読む前に一回loopに入ってしまうみたいなんですが、 どうすればloopに入らないようにできるんでしょうか? あと入力ファイルに文字列が含まれていた場合、止まらなくなったんですが どういう挙動が起こっているのかも教えてほしいです
そりゃあ一回は読まないとeofかどうかわからんからな。
eof()やfeof()、或いはferror()もそうだが、 その系統は全て、「前回読んだ結果EOFに達したかどうか」の判定をしているだけ。 while (feof()) {...} みたいなループはおそらく意図通りには動かない。 また、数字を読みたいのに数字以外が入力されたときは 入力エラーということだけを返して 次回の入力はまた同じ位置から始まるので、また同じエラーが繰り返される。 詳しくはscanf+無限ループあたりでぐぐるとよいかも。
>>417 while (!data_in.eof()) {
data_in >> num;
if (data_in.fail()) break;
cout << num;
}
- 読み込みに失敗した場合は failbit が立つ
- 一度も読み込んでいない時点ではファイルが空かどうかはわからないので
その時点では eofbit は立っていない。
読み込もうとした後に eofbit が立つ(読み込みに失敗するので failbit も立つ)
>>419 C++のストリームの場合は、データを成功裏に読み込んだ後に
ちょうどぴったりEOFに到達した場合は eofbit が立つよ。
今回の場合は意味がないわけではない。
ファイルの中身が
12345<EOF>
の場合、一度数字を読み込んだ後に eofbit が立つ(failbitは立たない)。
ただ、
12345<改行><EOF>
の場合は一回読み込んだだけでは eofbit も failbit も立たないけどね。
いやそれはscanfでも同じだから
いやと言われてもな・・・
「前回の読み込みで(読み込みフォーマットと一致している状態で) 次の文字を読み込もうとしてEOFに達した」というのも 「前回の読み込みでEOFに達した」に含まれるでしょ。
>> 418-420 みなさんありがとうございます!勉強になりました。 そこそこ高い参考書を買ったんですが、 細かい所までは載ってないんですよね
>>422 だから
>>420 の「C++のストリーム云々」が関係ないっての。
12345<EOF>をscanf("%d")しても読み込めるし、(FILE構造体内の)eofビット立つっての。
それと「いや」のどこが関係あるんだか
>>420 「C++のストリームの場合」
>>421 「いや、C++のストリームだけじゃないよ」
どこがおかしいの?
おかしいだろ、よく読め
>>420 はそれ以外でのことを否定してるわけじゃないのに、かみついてるのがおかしいね。
なんで?
そもそも、
>ちょうどぴったりEOFに到達した場合は eofbit が立つよ。
自体がおかしいんだから。
「ちょうどぴったりだった」じゃなくて、
「次を読もうとして一致しなかった(EOFだった)」からeofbitが立つのであって
全然
>>419 の「前回読んだ結果がEOFだったかどうかの結果を示す」の反論になってない。
その上で、わざわざ「C++の場合は意味があるよ」と言ってるが
その程度の「意味があるよ」なら「C++に限らない」というだけ。
まさか 「C++の場合はEOFの位置を読もうとトライして失敗した結果じゃなく、 ファイルサイズを知っていて12345<EOF>の<EOF>を読み込もうとはしていない」 と言いたいわけじゃあるまい。
つまり、
int n;
cin >> n;
というコードがあるとして、
>>419 は、cin >> n; が失敗したかどうかに関係なく
「読み込みのときにEOFに達したら」eof()になるという話なのに
>>420 が「cin >> n; が失敗したら」と読み取って
「ちょうどぴったりだと、」という話を始めたんだろ?
だから、「それは(C++のstreamに限らず)一般的なことで、当然である」
ということなんだが。
433 :
デフォルトの名無しさん :2009/01/20(火) 13:48:52
はじめまして。 私は趣味で音声認識をやってみたいと思い手始めにMicrosoftの Speech SDK 5.1 のSimple Dictationを使ってみることにしました。 言語はc++です 使用しているosはwindows2000で環境はmicrosoft visual studio 2005 を使用しています。 しかしこのプログラムをコンパイル使用とすると以下のようなエラーが出ました。 //エラー始め c:\program files\microsoft speech sdk 5.1\include\sphelper.h(2559) : error C2440: '初期化中' : 'CSpDynamicString' から'SPPHONEID *' に変換できません。 この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 c:\program files\microsoft speech sdk 5.1\include\sphelper.h(2634) : error C2664: 'wcslen' : 1 番目の引数を'SPPHONEID *' から'const wchar_t *' に変換できません。(新しい機能; ヘルプを参照) 指示された型は関連がありません。変換にはreinterpret_cast、C スタイルキャストまたは関数スタイルのキャストが必要です。 ブラウザ情報ファイルを作成しています... //エラー終わり googleでreinterpret_castを調べてみたのですが、関数のようなものの使い方がよくわからずに困り果てています。 型の変換をしたらいいということまではわかったのですが… どなたか解決策を教えていただけないでしょうか??
434 :
デフォルトの名無しさん :2009/01/20(火) 13:55:07
#include<stdio.h> #include<stdlib.h> int calc(char, int, int); main(){ int a, b, result; char command; while(1){ printf("5*3 のように入力してください(終了 0#0) ==>"); scanf("%d %c%d", &a,&command,&b); if(command == '#') exit(0); result =calc(command, a, b); printf("%d %c %d = %d\n", a, command, b, result); } } 上記をどう直せばコンパイル成功しますか? 1-10.c:5: warning: return type defaults to `int' /省略/cc96Wza0.o:1-10.c:(.text+0x7f): undefined reference to `_calc' collect2: ld returned 1 exit status
int calc(char, int, int) { return 0; } を付け加えるというのでどうだろう
436 :
デフォルトの名無しさん :2009/01/20(火) 14:16:21
>>435 うまくいきませんでしたが、ありがとうございます。
438 :
デフォルトの名無しさん :2009/01/20(火) 15:14:36
>437 神きたーー!! そのまんまコピペでコンパイルできました!! ありがとうございます! ほんとにたすかりました
コンパでコンパイル、なんちってw
山田君
>>439 の座布団と生爪全部取っちゃって。
生爪もかよ!
http://www2.uploda.org/uporg1949857.cpp エラー E2451 C:\Documents and Settings\Owner\デスクトップ\bccdev1221\c\windowtest\windowtest.cpp 47: 未定義のシンボル jitama(関数 shooting() )
エラー E2451 C:\Documents and Settings\Owner\デスクトップ\bccdev1221\c\windowtest\windowtest.cpp 48: 未定義のシンボル jikidata(関数 shooting() )
すみません質問してください
何故「未定義のシンボル」エラーが出るのでしょうか?
それと47,48行目でエラーが出ているのに何故49,50行目でエラーが出ていないのかもわかりません。
(if(CheckHitKey(KEY_INPUT_Z) == 1 && jitama.shooting == 0){ が47行目です)
してくださいじゃないさせてくださいだorz
struct CharaData{ int x; int y; int ghandle; int shooting; }; struct CharaData jikidata; struct CharaData jitama; を #include "DxLib.h" の直後に移動させるといいよ しかいスコープを全く理解していないんだな
動きました!ありがとうございました! スコープの無い言語から最近C++に移ったもので、おっしゃる通りスコープの概念をまだあまり理解できてないです… whileの外で宣言していたから大丈夫かと思ったのですが、どうやら違っていたようで… 本当にありがとうございました。
C++の勉強始めてくる
>>446 で気付いたのですがこれc++じゃなくてcですねごめんなさい
買う本間違えました
では検証のためのプログラムを
451 :
デフォルトの名無しさん :2009/01/20(火) 22:12:00
for(;;){ } このような文があった場合、いつまでループするのでしょうか?
break か return するまで
goto で外に出ても終わりはするがおすすめはしない。
454 :
デフォルトの名無しさん :2009/01/20(火) 22:17:35
>>452 ということは、それが前提だとたいてい
for文の中にif文があるということでしょうか?
break return gotoなきfor(;;)は無限ループということですよね
例外でもループの外に出るよ
456 :
デフォルトの名無しさん :2009/01/20(火) 22:21:48
すみません、例外とはどのようなときおきるのでしょうか?
1/0とかで起きるんじゃなかったっけ?
>>448 rand()に依存するため、どの道、何かしら偏りというのは起こる。
思い込みや勝手な持論を展開する奴ほど、厄介。
結果が全て物語っているんだが・・・結果を見ない奴もいるし。
>>404 どっかのブログで、その方法は偏りがでるって解説してたな。
(rand()が偏りなくても)
>>459 それがどこのブログか、どんな理由で偏りが生じるかがわかればすっきりするんだがな
461 :
デフォルトの名無しさん :2009/01/20(火) 22:36:38
462 :
459 :2009/01/20(火) 22:41:35
>>461 ゼロ除算 これやると死ぬっていう話だったんだけど
ためしにVC2008でコードかいたらコンパイラに突っぱねられたorz
int a, b = 0;
a = 1/b;
とでも書いてみるといい
>>463 VC独自は置いとけば、
0除算で例外はおきないよ
は?
467 :
460 :2009/01/20(火) 22:56:24
0除算で例外起きないね
>>464 どんなアルゴリズムでも、rand()に依存するから
何かしら偏りはある
>>465 ,468
まじすか?
ごめん 勘違いだったみたい
クヌース先生じゃないですか
0~4で3万回回してみたけど、特に出づらいパターンとか無いようだけど?
>>472 線形合同法で内部で32bitで計算して、上位16bitを返してる
実装だと、下位ビットの周期はたぶん6万くらいだから、
数十万とか数百くらいでためせば偏りがわかるかも。
>>476 rand()の偏りについてはだれも疑問にすら思ってないから安心しろ
>>476 rand()が理想的な一様分布の乱数と仮定したとき
>>404 のアルゴリズムに偏りが生じるかどうか答えてもらおうか
これでこの話も終わるだろ
>>474 例えば4枚のカードをシャッフルする例で、三万回やれば24パターンが同数出るとでも思っているのか?
>>470 VC++ では構造化例外という例外の独自拡張により
0 除算なども構造化例外を投げるよ。
rand()を頼っている以上、それに応じた偏りは回避できない。 もしそれ以上追求したいなら、例えば1〜10までの値を扱う場合、 前半に5以下の値をいくつまでと決めるとか、何かしら手を加えなきゃ無理。 いくらあのアルゴリズムで並び替えても、連続する数字が並んでいたら 偏りと言ってしまえば、それまで。それも偶然か、rand()依存は関与してしまう。
整数0除算は例外を発生させるだろう、普通 と思ってたけど、ググると PowerPCは単に0を返すみたいだ。へえ
VC++ だと catch(...) や ___except で整数 0 除算をキャッチできる。 独自拡張だけどな。
>>485 たった24パターンしかないのに、三万回もやってそんなに偏りはでないだろ。
489 :
デフォルトの名無しさん :2009/01/20(火) 23:43:00
>>489 資料は合ってると思うけど
君の書いた奴を晒してくれないと
0除算すると例外が発生してプロセスが死ぬよ
>>489 二次元配列の作り方には主に3つある。
その中の1つが、そのサイトにある方法。
そのサイトにある方法は a[i][j] のように扱う事ができる代わりに、
二次元配列全体が連続領域にならないという欠点があるため、
bitmap を作る際に使う事はできない。
もう1つは一次元配列を二次元配列であるかのように使う方法。
この方法はさらに2つに分けられる。
1つは、a[i][j] のように使う事を諦め、a[i * width + j] のように扱う方法。
もう1つは、a[i * width] のアドレスを全て格納した b を作って b[i][j] のように扱う方法。
前者はメモリを食わない代わりに扱い辛い。
後者はメモリを食う代わりに扱いやすい。
bitmap のように連続領域を必要とする場合はこっちの方法を使う必要がある。
あと、bitmap の場合、幅のバイト数が4の倍数に満たない場合は
詰め物をして4の倍数にする必要もあるので注意な。
>>491 シグナル関連の話なのか
構造化例外のことなのか
この場で例外ハンドラを例外と呼称しないでよw
C++ の try catch以外の、 で
>>479 >
>>404 のアルゴリズムに偏りが生じるかどうか
環境依存。rand()を使用している以上、その仕様に依存する。
確率を調べようにも、結局、コンピュータが内面的に出している乱数も
偏りがあるから仕方が無い。たまたま、使用した環境、タイミング、PCで述べられても困る。
そこまで気にするなら、予めいくつかパターンを用意しておくなり、ハッシュを使え。
あと、例のサイトの落とし穴は、そいつがあの結果をもとに、そう思ったに過ぎない。
意図的に仕組まれていない以上、最初の順番が関与するというなら、その順番を一度
並び替えてから、また並び替えを行えば良いじょのいこ?w
また、並び替えられた先頭からではなく、たまには中間から、逆から 取り出すのもありだろ?頭を使わないと、結局その場当たり的な結果で 己の思考まで左右されてしまうぞ?もっと客観的に、柔軟に考えろ。 最初からバラバラに並んでいるのなら、シャッフルも必要なかろうw
>>497 だからさぁ、言いたいことがあるなら言えよ。宿題スレにしろ、うぜぇんだよガキが
ちょっと質問なんですが、randの偏りがと言ってるバカは 一人でいいんですよね?
あのサイトが言いたいことは分かるが、だからなんだと? それじゃ、先頭から適当に乱数を入れて、それより前のものと 重複しないものが出るまでやり直すのかね? 落とし穴を言う割には、それじゃ何が偏りが出ないか、まったく説明していないじゃないかw どの道、rand()を使用する以上、それによって左右されるし、いくら効率が悪くても 上記のやり方でやれば、範囲を広めて、使用する個数を増やしたら、処理に時間が掛かるよ? そもそも、RAND_MAXの範囲内で10個選ぶなら、大して時間は掛からないけどさ。 使用目的に応じて、何を使うかは人それぞれ。欠点ばかり指摘しているんでは、 事故が起きたら面倒な自動車なんて、乗れませんよ?w
全く理解できてないw
何度も言うようでくどいが、rand()を使用している以上、何かしらそれに応じて 偏りは出てしまう。あのサイトの説明では、ある要素を順番に並べたものを 入れ替えるのでは、ある要素がn番目に来る確率で説明しているが、それじゃ ある要素がn番目に来る確率が低かったら、結局それも偏りだろ?w 説明する方も、自分の穴を見落としてんだよ。だったら、シャッフルする回数を 増やせば良いじょのいこぉ〜?
>>501 C関係のスレで頭の悪いヤツが暴れてたら、こいつと思って間違いない。
>>502 まさか、理解できていないとは・・・
・・・しまった、釣られた!!!
508 :
デフォルトの名無しさん :2009/01/21(水) 03:17:24
とにかく、穴を説明したから偏りがあるとは言っても、では偏りがなくなる アルゴリズムは?と聞かれて、答えていないなら意味ないだろ。 あれが偏る?そうこともあるが、何か?それで?嫌なら使うなよw 事故りたくないなら、自動車に乗るなよ。被害に遭いたくないなら、 路上に出るなよ、引きこもりかっ!? 人と触れ合うチャンスさえ、なくなるぞ?そうなると面倒だ。 視野が狭くなるからな。頑固になって、自分の間違いや不手際さえ認めない、 のに、相手に対して勝手なことを言う、だから言い返される。 典型的な虐められっ子も、いじめっ子もそういうタイプじゃね?
だからね、いくら確率を述べられても、そういうこともありますね、なんだわ。 不良だから非処女率が高い?それじゃ、不良でなきゃ処女か?違うだろ? 思い込みなんて、他人に言っても無駄だということ。 逆に、その仕組みを理解している人には、だから何?って言われるだけだよ。 嫌ならやるなよ、そういうこと。分かったかね、人間としても未熟の青二才?
ねえ、これってコピペか何か?
まぁ、あとは使用目的次第。rand()に依存する以上、結局ある場面において、 ある範囲内で選ぶとしたら、その範囲内の何か1つが 頻繁に出てしまうなんてことは良くあること。
rand()の話してるのはFisher-Yatesが理解できないバカ一人なんだが、 本人だけがわかってないw
専門外なもので確証ももてなくて、偏るなんて意見にいろいろ悩まされたけれど まさかこんなのに振り回されてただけだとはorz 俺の時間を返せこんちくしょうw
だからよぉ、あの確率だって、実装されている乱数発生ライブラリを使用してのことだろ? そこから理解していないから、あんな結果に対して、勝手な評価をしてしまうんだよ。 所詮、使用しているのは実装された環境。それに応じて作り変えるのが人間。 何のためにてめぇらはPCにない知能を持ち合わせているんだと?
ってあれえ!俺が
>>391 を落ち着いて見れていなかった!
すまんこまんこ
どんなシャッフルのアルゴリズムを書こうが、擬似乱数ライブラリに依存して それに応じて偏る。扱い方次第。嫌なら、先頭からではなく、後ろから、 中間から、適当に取り出しゃ良いだろ?頭を使えない奴こそ、変な持論を展開して 出来た気になるから迷惑。お前らが東大に行けない理由は、もう思想の面から 日本では通じないからなんだよ。
>>517 rand君以外の発言は、有用なものとちょっとお茶目なミスだろう?
どんと来いだぜ
520 :
デフォルトの名無しさん :2009/01/21(水) 05:47:39
>>413 > 風邪で寝てるあいだ、頭痛な頭でなぜか配列のシャッフルするアルゴリズムのことを思い出し、
こんな頭で考えた奴の意見を信じろと?何を考えているんだね、あんたは?
Fisher-Yatesなどの、パターンごとの出現確率が均等になるアルゴリズムを実装したとして、 実際に何回か実験すると、各パターンが現れる回数の揺らぎは中心極限定理に従って ばらつくんですよね。
for (int i = 0; i < array.length; i++) { int dst = (int) Math.floor(Math.random() * (i + 1)); (i+1)ではなく、(array.length+1)でやってみてはどうだろうか? にしても、落とし穴も何も、それがどういう並び替えかくらい分かっているだろ。 どれを選ぼうが、最終的には擬似乱数発生ライブラリに依存する以上、 何かしらそれに応じて偏りはある。
まだいるよ
東大から適当に取り出して ... 官僚 官僚から適当に取り出して ... 天下り・大臣 その結果が、今のこの国の状態。(w
少なくとも風邪の人よりも
>>520 のほうが
バカなのは信用できるな
>>518 擬似乱数っていうものは、ある回数で 「収束してしまう」 から擬似乱数なんですよ?
もちろん、短期的に偏るのは当たり前の話。規則性があったら乱数じゃないし・・・。
問題は、長期的、統計的に偏りが出るかどうか。
CPUの使用率を10%に制限してプログラムを起動させるにはどうすればいいんでしょうか
10cpu環境で起動すればいいと思います。
知りたいのは1CPUでの方法です。
板違いだから消えろ糞野郎
適当な時にsleep()でも呼べばいいのでは? もっとも、ほとんどのケースではプロセスの優先度を設定すれば事足りると思いますが。
533 :
デフォルトの名無しさん :2009/01/21(水) 10:26:07
>>528 タイマー割り込みで10回に1回そのプログラムが
動くようにすればよいです。
OSから書く必要あるけど
起動時にCPU使用率を指定できるOSを自分で作る。
なるほどありがとうございます。タイマーでやってみます。 sleepだとプログラムの量で%に調整するのが難しくてつまってました。 起動中のアプリにCUP使用率制限をかけるソフトはいろいろあるみたいなんですが、 これはアプリにかぶせるように起動させて実行停止を繰り返し制限させてるんでしょうか?そんな関数あるんですか?
からかわれてるって気付きなよ。 10%に固定なんて出来るOSは存在しないから自分で作れと言われている。
>>532 すいません。プログラムのコード量で調整ではなくて、CPUMAXと使用率の取得で分岐させることで
Sleepでも制限できるようになりました。ありがとうございました。
SystemIdleProcessから計算するのもいいかもしれない
Visual C++R 2008 Express Edition が使えなくなった・・・どうしよう
登録しようとすると 現在 Windows Live ID で技術的な問題が発生しています。後でもう一度やり直してください。 となります・・どうすればいいんでしょう・・・
登録しなきゃいいだけ。
それじゃあ使えないじゃないかッ!! 僕にC++を諦めろと言いたいのかい・・・・・!?
認証サーバに問題あるのかな・・・ Web版じゃなくてISO版ダウンロードしてきてインストールすりゃ認証いらないかもよ、
ふむ・・・・つまりISO版をDLすればいいんだね。 やってみる。サンクス
ISO版はCDがいるって・・・ガチ?
isoをなんだと思ってるんだよ
マウントすればいいんだよ。 PowerISOとかDeamonToolsとかあるべ。
548 :
デフォルトの名無しさん :2009/01/21(水) 18:43:17
>>492 bitmapの画像処理をする際に、
二次元配列を動的に使ってはダメなのは初めて知りました。
驚きました。一次元配列では死ぬほど画像処理をやった経験があるので
一次元は大丈夫なんですがアドバイすありがとう。
連続領域じゃないとだめだなんて不便だなぁ・・。
>>527 「収束」ってどういう意味で使ってる?
普通の数学ではそういう使い方しないよね。
>>548 何をどう読んだら動的に使ってはダメという結論に達するのか理解できない。
>>551 そういう意味でもなさそうじゃない?
>>527 は周期のことを言ってるように見える。
うーん、言いたいことはわかるけどなー。
rand君の話はもういい
555 :
デフォルトの名無しさん :2009/01/21(水) 20:44:53
1週間前にCを勉強し始めて、やっと文字の表示の仕方覚えた。 「見てわかるC言語入門」って本なんだけど。 次何勉強すればいいの?本では「printfの表示」ってなってるんだけど
556 :
デフォルトの名無しさん :2009/01/21(水) 20:49:39
hairetu[num]++ すみません、これはどういうことでしょうか? また、 hairetu[2] | = これもどういう風に足しているのでしょうか? =
>>556 1 足す
ビット演算子と代入がセットになったもの
558 :
デフォルトの名無しさん :2009/01/21(水) 21:10:21
>>557 1たすとは配列の要素番号を1たすということでしょうか?
下の方は、配列2の要素の値のビット数+ 右辺にあるビット数を足したものを
配列2に格納するというこでしょうか?
基本的に& や | があったら、ビットの演算子であるとおもえばよろしいのでしょうか?
>>555 まず、一冊読み終えろよ。
そしたら、どうレベルの本を図書館で借りて読め。
本を信じるな。
560 :
デフォルトの名無しさん :2009/01/21(水) 21:31:38
>>559 読むだけでいいの?全部理解しなくても?
>>558 a++ は a = a + 1 とおなじ
a|=b は a = a | b とおなじ
563 :
デフォルトの名無しさん :2009/01/21(水) 21:41:43
>>561 いや、その読み終える本について。読んだとこ全て理解しなきゃってこと
お前は今までに食べたパンの枚数を覚えているのか?
565 :
デフォルトの名無しさん :2009/01/21(水) 21:51:23
うん
568 :
デフォルトの名無しさん :2009/01/21(水) 21:53:11
1たすとは配列の要素番号を1たすということでしょうか? 下の方は、配列2の要素の値のビット数+ 右辺にあるビット数を足したものを 配列2に格納するというこでしょうか? 基本的に& や | があったら、ビットの演算子であるとおもえばよろしいのでしょうか?
570 :
デフォルトの名無しさん :2009/01/21(水) 21:57:40
>>564 ありがと。とりあえず読んでおく。
でも学校にあるかな・・・・・
571 :
デフォルトの名無しさん :2009/01/21(水) 22:01:59
初心者ですいませんがC#で10万個くらいの配列のデータの正規化をしたいのですが、どのようにすればいいのかまったくわかりません。誰かご教授いただけないでしょうか?
hairetu[num]++ すみません、これはどういうことでしょうか? また、 hairetu[2] | = これもどういう風に足しているのでしょうか? = 1たすとは配列の要素番号を1たすということでしょうか? 下の方は、配列2の要素の値のビット数+ 右辺にあるビット数を足したものを 配列2に格納するというこでしょうか? 基本的に& や | があったら、ビットの演算子であるとおもえばよろしいのでしょうか?
すいません 他のスレでも聞こうと思ったら間違えてここに書いてしまいました
尻洗いずのことじゃね?
>>565 aをhairetu[num]と読み替えればいいとは思えなかった?
他の解釈をしたならその解釈を書いてみて
578 :
デフォルトの名無しさん :2009/01/21(水) 22:30:05
aは配列じゃないから読み変えられないと思いました。 でもそれならhairetu[num++]だと要素数をプラス hairetu[num]++だと中身をプラスとかポインタプラスのほうがわかりやすいような
>>578 前者は要素数は増えない。hairetu[num]の値を評価した後に、numがインクリメントされる
後者は中身がプラスされる。
>>578 中身をプラスとポインタをプラスじゃ意味違うじゃねーか
プログラム書いてすぐ判ることをきくなよ。バカじゃねーの?
582 :
デフォルトの名無しさん :2009/01/21(水) 22:41:30
581 名前:デフォルトの名無しさん 投稿日:2009/01/21(水) 22:40:34
>>580 お前は黙ってろ
お前ら全員だまれ
585 :
デフォルトの名無しさん :2009/01/21(水) 22:46:40
>>579 ということは
>>569 は違うということでしょうか?
つまり、hairetu[num]++は、hairetu[num]の中の値が+1される?中身が文字だった場合は、次の文字?
hairetu[num++]は、hairetu[num]の中身をみたあと、次呼び出されたらhairetu[num+1]の値を見るというこでしょうか?
>>585 おおむねあってる。
>>569 は間違い。
>>586 は釣り。というか、実際に試してみたらどうだい?という意味を込めてこう書いてるんだろうけど
>>587 座学でやってるから、実際にはためせないんです。
実際に試せ
590 :
デフォルトの名無しさん :2009/01/21(水) 22:56:19
どうせなら前置演算子(++numなど)も知っておいた方がいい。 こっちはインクリメントが先ね。
実際に試せとかウゼーっつーの 聞かれたことにだけ答えろカス
せっかくだから hairetu[num] = hairetu[num++]; とかするとどうなるかとかも覚えといたらいいよ
double型をインクリメントしてるコードを見たんだけど 仕様的にはアリなの?
Cに限らず、プログラム言語学習するなら実行環境がないと話にならんだろ。
598 :
デフォルトの名無しさん :2009/01/22(木) 01:02:17
添え字が扱えて、途中のデータを削除できるデータ構造はありますか vectorは可能ですか
listでどうぞ
可能です
>どこら辺がおかしいのでしょうか? こんなところでいきなり丸投げするあんたの頭。
俺、ライフゲームを作ったことあるけど、何か?
>>605 やれよ?何命令してんだてめぇは?アホじゃね?こんな場所、任意でレスしても良いだろうが
他人から指図されする場所じゃねーよ。答えて欲しけりゃ、金払えや。何でもただの時代じゃねーぞ
現代の貨幣経済は。経済を習え、小僧。
すいません、おしえてください。 ライフゲームが私のライフワークなんです。
誰でも一回くらいは作ったことあるであろうライフゲームをわざわざ言う
>>603 がだめなんじゃ
609 :
デフォルトの名無しさん :2009/01/22(木) 17:43:28
610 :
デフォルトの名無しさん :2009/01/22(木) 18:29:12
611 :
デフォルトの名無しさん :2009/01/22(木) 18:30:55
>>608 > 誰でも一回くらいは作ったことあるであろう
大嘘ぶっこいてやがるな、こいつ。それじゃ、この世の全員に
「あなたはぁ〜、ライフゲームを、ちゅくったこと、ありまちゅか?」って
訊ねてこいよ?w 9割近くの人が「知りません」って言うか、
すごろくのようなボードゲーム?って思うかもw
まあその辺は同意するが、
>>603 がダメなことに変わりはないな。
>>601 ざっと見たけどfloatじゃなくてもintでいいのでは
614 :
デフォルトの名無しさん :2009/01/22(木) 18:55:28
1からライアーゲームの作り方教えて。
616 :
デフォルトの名無しさん :2009/01/22(木) 20:31:30
*point ^= 0x003333 *pp^0x0000ffff すみません、このよう文はどういう意味をあらわしているのでしょうか?
x += 3 や、 int* p; p=&x; printf("%d",*p); など。
618 :
デフォルトの名無しさん :2009/01/22(木) 21:17:27
^ ←は+という意味になるのでしょうか? | じゃなくて また、この場合ポインタにアドレスを直接セットしているのでしょうか?
x^ = 3 だと、 x = x XOR 3という意味。 排他的論理和。
int x=1,*p; p=&x; *p+=3; だと、x=4になる。排他的論理和の場合も計算結果が入るだけ。
>>611 誰でも、をそのまま取っちゃったか。
プログラム書いてる人ね。
>>611 はまだ作ったことないのか。割りと面白いものだよ。
同じころにハノイとかも作る人おおいのではないかな
622 :
デフォルトの名無しさん :2009/01/22(木) 21:38:36
x = x xor 3 でxの値が1だとするとxは最終的に何になるのでしょうか?」 x = x or 3 だと 4でいいのですよね?16進数だと違いますが
だめだ全くわかってねぇ | とか & の演算子の意味を知らないのか?
失礼します 可変長引数をとる関数で、引数整形部分を別の関数に任せたいのですが 以下の方法は正しいでしょうか? WindowsXP + bcc5.1 / vc2003 で正常に動作しました 呼び出し元 foo と整形関数 format での fmt のアドレスも同一でした // fmtで書式を指定しoutへ出力する // インライン展開されるのでfmtのアドレスは呼び出し元と同じになってスタックを参照できる…はず? // インラインじゃなくてもconst参照だし安全(アドレスは同一)? inline void format( char* out, const char*& fmt, ... ){ va_list arg = va_start(fmt); wvsprintf(out, fmt, arg); va_end(arg); } // 呼び出し元関数 void foo( char* msg, ... ){ // 引数を整形 char buffer[256]; format(buffer, msg); ..処理.. }
625 :
デフォルトの名無しさん :2009/01/22(木) 21:48:59
>>622 16進数だと何が変わるのかさっぱりわかりませんが、
1と3の論理和は3ですよ
>>625 和を得るには+演算子を用い、積を得るには*演算子を用い、
論理和を得るには|演算子を用い、論理積を得るには&演算子を用います
^は排他的論理和を得たい場合に使用します。
>>624 それで大丈夫だと言う保証は何もないな。
多重継承つてあるじゃあないですか。 何重まで継承出来んの? 今のデファクトスタンダードのVC++でどのくらい?
630 :
デフォルトの名無しさん :2009/01/22(木) 22:09:09
1と3の排他的論理和だと何になるのでしょうか?
1=01 3=11 だから、2=10 異なる数字だと1。同じだと0。
>>629 コンパイラの制限の話か。
やったことはないが、
一文の長さの制限かなにかで制限は受けそうだな。
635 :
デフォルトの名無しさん :2009/01/23(金) 02:12:47
現在 Microsoft Visual C++ 6.0を使っているのですが、 Win32 applicationで作成するwindowsアプリケーションの種類を 次の3つから選択できますが、どのように違うのですか? @空のプロジェクト A単純なWin32アプリケーション B標準的な"Hello World"アプリケーション また、Microsoft Visual Studio 2005/2008ではこの3つに 当たるものがあるのでしょうか?
636 :
デフォルトの名無しさん :2009/01/23(金) 04:19:17
例えばwindows上でプログラムを実行するとして 宣言した配列なり関数なりポインタにメモリアドレスを指定するにはどうすればよいのでしょうか?
637 :
デフォルトの名無しさん :2009/01/23(金) 06:56:36
例えば配列ですと char array[2] のメモリアドレスを指定
>>637 Ex. void * ptr = reinterpret_cast<void *>(0x80000000);
>>621 > プログラム書いてる人ね。
それでも少ないと思うよ
古くて安っぽいC系の和書はアルゴリズムの練習問題が中盤以降に書かれてることが多いけど
入門者にそういう本をすすめる人は珍しくなった
業務レベルで使えるようにと、先日からC言語の勉強を始めました VBや.NETの経験はあるのですが、C言語は初めてです 勉強がてら、汎用関数のようなものを作ろうと思っているのですが C言語を使った処理で、よく使われるような関数にはどのようなものがあるのでしょうか? そういうものをいくつか作って勉強したいと思っているのですが、思いつかず困っております どなたか師事頂けませんでしょうか?
なぜお前の弟子にならねばならんのだ
>>640 VBでいうとこのTrim関数みたいなの作ってみ
日本語でおk
647 :
デフォルトの名無しさん :2009/01/23(金) 12:56:40
, ._., ... ‘^^’
演算子の意味を習いたい
>>618 が師事すればベストマッチな師弟誕生。
指示の誤変換なら認める
「醜い豚であるわたくしにご命令を!」 ちっとも変じゃない。
653 :
デフォルトの名無しさん :2009/01/23(金) 15:19:46
Cのソース解析ツール(フリー)でお勧めがあれば教えてください
VS2008重い そんなことよりC入門のサイトより本のほうが参考になるって本当ですか? もしそうだとして、一番参考になってわかりやすいC入門のサイトはどこですか?
スタートページ消せ
メモリ上のデータを、アプリにファイルと見せかける方法ありますか?
657 :
デフォルトの名無しさん :2009/01/23(金) 19:54:56
ファイルをメモリのように扱うメモリマップドファイルの逆です。 char ch[1000]="hage"; をファイルに書き込まずに、ファイルのように扱いたいです。 たとえばデータが50Mなど大きい場合、出力とアプリの入力にかかる時間が短縮できます。
658 :
デフォルトの名無しさん :2009/01/23(金) 20:04:09
もしくは、プログラム実行中に、RAMディスクを確保する方法でもいいです。
ファイル名の書かれた文字列の配列10000個をシャッフルしてprintfしたいんですけど
文字列配列を呼び足す順番を書いた添字配列を別途作ってそれをシャッフルするのと
実際、文字列配列をシャッフルするのではどちらが早いですか?
上で実装したのですが、コーディングがへたくそなのか非常に動作がもたつきます
>>385 のときはありがとございました
ファイルのようにとはどういうレベル?ストリームだったらメモリストリームクラスが使える
>>659 添え字配列のほうが速いよ。文字列のポインタを交換するほうが簡単だね。
文字列のコピーはすごく遅い
662 :
デフォルトの名無しさん :2009/01/23(金) 20:30:22
>>660 ファイルを読み込むアプリを騙してメモリから読ませいって言うことです。
動的にRAMファイルが作れれば、メモリマップドファイルを使えばできるのですが。
>>657 1 そういうファイルシステムを作る。
2 リモートファイルシステムでごまかす。
3 API乗っ取る。
好きなのをどうぞ。
>>662 RAMディスクの代わりなら、Win32APIでファイルを作るときの属性でキャッシュ制御ができる。その中にテンポラリファイル用の属性があってスワップアウトを抑制してRAM(ディスクキャッシュ)にデータをとどまるように努力するオプションがあったと思う。
>>657 それもメモリマップドファイルでいいと思う。
現代のOSでは、メモリマップドファイルでないメモリ領域も
どうせページングでディスクに書き出される。
逆に、メモリマップドファイルだって、いたずらにファイルに書き出すわけではない。
メモリマップドファイルとそうでない領域の違いは、ページング時の書き出し先が
どこかのファイルかシステムの用意した領域かの違いでしかないと言っても過言ではない。
>>662 ファイルを読み込むアプリをだます為にRAMドライブに読み込むのは誰がやるのか
一旦読んでおいたものをなんども読ませたいってなら動的に云々はいらなさそうに思うし
もうちょっとやりたいことを細かくお願いできますか
668 :
デフォルトの名無しさん :2009/01/23(金) 22:54:12
たとえば、メモリに100Mあるデータを、DLLで圧縮しようとします。 DLLはファイルしか読み込めないとします。 ファイルに書き出してからDLLに渡すよりかは、 メモリをファイルに見せかければ短時間で済みます。
669 :
デフォルトの名無しさん :2009/01/23(金) 23:03:18
もし動的にRAMディスクを生成出来れば、そこにファイルを作って メモリマップドファイルで関連づけてそこへデータを蓄えれば メモリをファイルに見せかけられる事になります。 できませんか?
なんだその程度か。もっとおもしれー事やろうとしてるのかと期待したのに。 ファイル作っちゃいなよ。想像してるほど速度差無いよ。
クリティカルなのは圧縮処理だから無意味だろうけどなぁw
>>669 事前にRAMドライブをつくっておいてそこにファイルを作れば?
つまり、ディスクキャッシュなんて信用ならんと。 俺の方がうまくやれると。 そう言いたいわけだな。
>>669 おとなしくメモリマップドファイルで書き出しちゃいなよ。
すぐに閉じず、とっとと向こうにファイル名を渡してやれば、
ディスクに書き出したものを読み込むなんて無駄なことにはならないから。
675 :
デフォルトの名無しさん :2009/01/23(金) 23:33:43
初めからファイルにデータを蓄えろってことですか?
それでいいじゃん。何かまずいの?
横レスすまんが、その場合、メモリマップドファイルに書くよりも速く向こうが読み出すとどうなるの?
同期取れよ
全部書いてから向こうを起動するしかないだろ。これ以上の細工は出来なそうだから。
「どうなるの?」 ↓ 「〜しろ」 会話が成り立っていない。
ディスクキャッシュってHDDのキャッシュではないってことかしら? Server2008ででっかいファイル作ろうとすると処理が終わるまでずーっと0KBのままなんで、何でだろうなあとは思ってた
同期とるためには向こうを制御しなくちゃだよね? 質問主がやろうとしてるのは向こうは既製アプリだから危なくないの?
なんか変になった。 既製アプリに読ませようとしてるから同期とる仕組みを提供できないんじゃないの? と読み替えてorz
686 :
デフォルトの名無しさん :2009/01/24(土) 00:38:11
include <stdio.h> #include <math.h> degree(double a,double *c,double *h,double *g); main() {double a,x,y,z; scanf("%lf",&a); degree(a,&x,&y,&z); printf("%3.0lf %2.0lf %2.0lf",x,y,z); } degree(double a,double *c,double *h,double *g) { double b,d,e,f; b=modf(a,&c); d=60*b; f=modf(d,&h); g=60*f; } 度数を度分秒に変換するプログラムなのですが、 (14) : error C2440: '関数' : 'double' から 'double *' に変換できません。 (14) : warning C4024: 'modf' : の型が 2 の仮引数および実引数と異なります。 (16) : error C2440: '関数' : 'double' から 'double *' に変換できません。 (16) : warning C4024: 'modf' : の型が 2 の仮引数および実引数と異なります。 (17) : error C2440: '=' : 'double' から 'double *' に変換できません。 と出てきてしまいます。 どうすればよいのでしょうか?
b=modf(a,c); d=60*b; f=modf(d,h); g=60*f;
いやごめん、これじゃ不味いな
double b,d,f; b=modf(a,c); d=60*b; f=modf(d,h); *g=60*f;
690 :
デフォルトの名無しさん :2009/01/24(土) 00:55:05
>>687-689 ありがとうございます。
modfってmain関数の中だと&つけてたのに自分で作った関数の中だと&つけなくてもいいんですね。
ポインタが全くわかってないな
ボイン太なら分かります!
おもしろくないよ
おもしろくないよ
>>696 とかなんとか言っちゃって、ググって (・∀・)ニヤニヤ しているくせにw
>>697 上位の方、この板が随分引っ掛かるのだが。
というかこのスレ以外に有効な結果が見あたらないんだけど
>>700 まさかとは思うが、"ボイン太"で検索してないなんて言わないよな。
>>701 まさかとは思うが、ググレの意味が分かっていないなんて言わないよな?
確かに、検索しろという意味でもあるが、googleで検索しているか?w
>>702 望ましい検索結果を得られず「何でそこで区切っちゃったんだ?」
と思いながら検索結果の中から人力検索してたりする?
>>704 先生、ググった際のURLを貼っていただけますか?
706 :
デフォルトの名無しさん :2009/01/24(土) 03:48:46
ググレの意味が分からなかった奴が、この板の中で検索したようですw
いいからはやく検索キーワード含めたURL貼れよ
つか今ここに何人いるんだよw ちゃんとググれないのが一人で、それをニヤニヤしながら見てるのが三人くらいか?
urlマダー?
この板でボイン太とか言ってるのは一人だけ。 本人だけが面白いと思ってるが、回りは誰も相手にしてない。
712 :
デフォルトの名無しさん :2009/01/24(土) 04:36:21
ググレがgoogleで検索をすることを知らなかった初心者必死すぎw
ある単語をググる時に""で括るという常識を知らなかったのはお前だけw
714 :
デフォルトの名無しさん :2009/01/24(土) 05:25:54
初心者必死だなw 今頃、ググった結果でナニを勃てていることやら?w
>>681 ここでいってるキャッシュはOSのディスクキャッシュ。NTのディスクキャッシュは仮想記憶機構の一部である。
問題 int 型の引数2つを値で、1つをポインタで受取り、その和を受け取ったポインタに格納する関数 add2 を作成しなさい。 ただし、関数自体は返却値を持たない。 main から add2 関数に 23 と 50 を渡して呼び出し、int 型 ans のアドレスを渡して呼び出し、ans の内容を標準出力に表示しなさい。 イカのソースで上記の問題に答えてると言えるんでしょうか. どうも日本語能力が弱いんです. #include<stdio.h> main(){ int ans; int a,b; int *p; p=&ans; a=23; b=50; add2(a,b,p); printf("a+b=%d\n",*p); } void add2(int x,int y,int *z){ *z=x+y; return; }
int *pなくして関数の呼び出しをadd2(a, b, &ans)にしたほうがいいんじゃね?
どうもありがとです. ポインタの仕組みはたぶんわかってるつもりなんですが, 日本語的に渡すだの何だので,混乱して自爆するんです. ありがとでした.
プロトタイプ宣言も ってか動かしてないの?
動かしてますよー. 環境はLinuxです. 何でプロトタイプ宣言なくても動くっちゃ動きます. 一応答えも出たんですが,問題の答えになってるかどうか不安だったんです.
#include <stdio.h> void add2(int x, int y, int *z) { *z = x + y; } int main(void) { int ans; add2(23, 50, &ans); printf("23+50=%d\n", ans); return 0; } aとかbに数値入れなくてもこれでいいんじゃね?
>>716 それで問題には答えてるけど、
a,bを定義する必要性はないね
いろいろありがとうです. いろいろスマートじゃないのは, 生まれつきなんです.んません.
>>716 void add2(int i1, int i2, void* pi3){pi3 = (void*)(i1+i2);}
void main(){
int ans;
add2(23, 50, (void*)&ans);
printf("%p\n", (void*)ans);
}
和をポインタに格納するなんてマニアックな問題だな。
なんじゃそりゃ
>>724 void add2(int i1, int i2, void* pi3) { }
日本語のあやしい716をそのまま受け取るのはどうかと思うがね
729 :
716 :2009/01/24(土) 16:09:29
>>728 確かに私の日本語はアレですけど
問題じたいはコピペなんで,この問題がおかしいんだったら
私に問題出した人も日本語がおかしいということになっちゃいますよ.
>>729 >私に問題出した人も日本語がおかしいということになっちゃいますよ.
いや、そのとおりだから。
問題文もポインタとかアドレスとかわかってない感じがするな。
>int 型の引数2つを値で、1つをポインタで受取り、その和を受け取ったポインタに格納する関数 add2 を作成しなさい。 これが真っ当な日本語だと思えるのなら、自分の頭を疑うべきだ。
733 :
716 :2009/01/24(土) 16:31:58
言われてみればそうですね. 日本語が弱すぎるのは自分だと思って損しました…
あれだろ。 馬鹿なクライアントの要求から、本当に必要としていることを導き出すSEの採用試験なんだろ。
じゃあ何て言えばいいの?
二つの整数の和を求める関数を作りなさい。 ただし、結果はポインタ渡しした引数で返し、関数自体は戻り値を持たないものとする。
まだだめだな
二つの整数の和を求める関数を作りなさい。 ただし、関数は返り値を持ちません
二つの整数の和を求める返り値を持ちません
足し算ってあるじゃん、あれちょっと作ってよ。サクッとさ。 で、関数で、結果はポインタ渡しでみたいな。 そんなんでよろしく。明日までね。
0点
ニュートン法か
744 :
デフォルトの名無しさん :2009/01/24(土) 17:38:04
圧縮・復元で安全と思うのは、パスワードをチェックせずに どんなパスワードでも復元できるようにして、元に戻せるのは一通りがいいと思う。
圧縮は圧縮、パスワードはパスワード、分けて考えた方がいい。
746 :
デフォルトの名無しさん :2009/01/24(土) 17:46:31
効率的にはそうだが、パスワードが一致するかどうかが直ぐチェックできたら 総当たりされてしまう。 どんなパスワードでも復元されれば無理。
弖爾乎波
日本語でおk
>>746 ですよねー。ブルートフォース最強ですよねー
その調子で暗号も解読しまくってくださいね
圧縮はセキュリティツールではない。 以上。
752 :
デフォルトの名無しさん :2009/01/24(土) 19:11:30
テンプレート関数についての質問です。 いろんな型で同じ処理をできるようテンプレート関数を作りました。 template <typename T> func(); というものです。 機能的には、呼び出すときに、 switch(どの型を使えばよいのかの判断){ case ちゃんちゃら: func<ちゃんちゃらの時の型> break; } としたいのですが、上はもっとうまく実現できないのでしょうか。
ポリモーフィズム
754 :
デフォルトの名無しさん :2009/01/24(土) 19:14:59
↑たとえば、 if( flag==1 ){ func<int>();} else{ func<double>(); } とか面倒なんです。 flagに対して,型を返すみたいなものをマクロとか何か使ってうまくできればなぁ、と。
よくわかったね。
自分で一々場合わけしてたらテンプレートの意味なくね?
ifやswitchの判断はプログラムの実行時の処理。 一方、テンプレートはコンパイル時の処理。 そもそもそこにテンプレートを使うのがふさわしいかどうか考え直したほうがいい。
場合分けは機能上必要なんですが、おっしゃるとおりテンプレートの意味が薄れてかっこわるいなぁと思い、質問させていただきました。 場合分けは、ほとんどすべてのテンプレート関数で同じものを使うので、うまく解決したいんですが。
>>758 どぉーん。おっしゃるとおりで。
マクロで都合よく解決できないかと思いましたが、あきらめまふ。
だから実行時に型によって処理分けたいならクラス作れよ。
なんで誰も特殊化の事を言わないのか
テンプレートなんて知らないし
template <typename T, typename U> T func(U x); 的なのじゃだめなの?
int main(int argc, char*argv[]){ char* name; strcpy(name, argv[1]); } として、argv[1]をhanafudashaffle.cppとしたところエラーが生じました。 char* name で宣言すると、確保できるメモリの限界はどのようになるのでしょうか? またargv[1]に格納された文字列のサイズを知るにはどうしたら良いでしょうか?
>>765 char *name;
じゃ全く確保されてない、コピーするな
長さはstrlen使え
>>767 ありがとうございます!!
ポインタ宣言してるだけですし、そりゃそうですよね・・。
ただargv[1]をもっと短い文字列にすると何事もなく動作してくれるんですが、
これは何でなんでしょうか?
先っぽだけなら許してくれるんだよ それでもたまに失敗して妊娠するけどな
>>768-769 なるほどー。
へんてこなコード書いてもたまたまうまくいってるってこともあるんですね。
771 :
デフォルトの名無しさん :2009/01/24(土) 21:06:05
C言語で小数が出ないように商と余りを出すにはどうすればいいですか?
/, %
773 :
デフォルトの名無しさん :2009/01/24(土) 21:24:51
>>772 doubleの数字(整数)を/を使って割ると、商が小数になってしまうのですが・・・
割るときだけ整数型にすればいいじゃん。
777 :
デフォルトの名無しさん :2009/01/24(土) 21:36:06
doubleの数字(整数)を/を使って割ってでてきた小数点以下の数は 誤差であって、それを四捨五入したものが正しい商だと考えてもいいですか?
いいえ
なんで四捨五入すんだよアホか
質問させていただきます。
ttp://orangeknowledge.jpn.org/tips/sdk005.html こちらのサイトのサインプルプログラムを呼んでいましたところ、WinMain関数内で
InvalidateRect();
を呼んでいました。この関数の働きについて質問したいのですが、サンプルプログラムは
ClassAを継承したClassABで、クラスAではウィンドウの初期化から表示までを行い、ウィンドウハンドルと
オブジェクトのポインタをSetPropで保存しておくという感じです。
そしてウィンドウプロシージャでGetPropでClassA*のポインタを取得して
virtual ClassA::classWndProcにメッセージを送るという形なのですが。。。
ClassABではvirtual ClassAB::classWndProcをオーバーライドして正式なメンバ関数としての
ウィンドウプロシージャにしています。
上のプログラムでInvalidateRectを呼ばないと、子クラスのプロシージャが呼ばれてしまいますが
( GetPropするときに ClassA* classA = (ClassA*)GetProp(...)としているからでしょうか)なぜInvalidateRect
を呼ぶことで解消されるのかがわからずに質問させていただきました。
無効領域を作る、、、という説明しかなかったので。
よろしくお願いします。
>>780 よく分からんが、ウィンドウプロシージャと特定のインスタンスを関連づけたい時は
CreateWindowEx の任意のパラメータに this を渡して
WM_CREATE 時にそれを GWLP_USERDATA に SetWindowLongPtr するのがセオリーだと思うよ。
これだと別に InvalidateRect なんて必要になったことなどない。
LRESULT CALLBACK CBaseWindow::StaticWndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
CBaseWindow* base = NULL;
if (hwnd != NULL) {
if (msg == WM_CREATE) {
LPCREATESTRUCT cs = reinterpret_cast<LPCREATESTRUCT>(lparam);
base = static_cast<CBaseWindow*>(cs->lpCreateParams);
SetWindowLongPtr(hwnd, GWPL_USERDATA, (LONG_PTR)cs->lpCreateParams);
base->Attach(hwnd); // ウィンドウハンドルを CBaseWindow に記憶させる
} else {
LONG_PTR self = GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (self != 0) {
base = static_cast<CBaseWindow*>((LPVOID)self);
}
}
}
if (base == NULL) {
return DefWindowProc(hwnd, msg, wparam, lparam);
} else {
return base->WndProc(msg, wparam, lparam);
}
}
>>781 それと同じことはSetProp/GetPropでもできる。
むしろ、ATOM併用ではSetWindowLongPtrより僅かに早いという話を見たこともある(ソース失念御免)。
>>780 のページのやり方では、CreateWindowの後でSetPropしているのが良くない。
SetPropでも
>>781 のようにWM_CREATEあるいはWM_NCCREATEで設定すべき。
より完璧を期すなら、WM_NCCREATEより前にやってくる
WM_MINMAXINFOに対処できるようにしたくなるんだけど、
普通は使わないから、自分だけで使う分にはめったに問題にならないだろう。
すまんs/早い/速い
ああ、そうか。WM_NCCREATE だった。 GetWindowLongPtr ってそんなに遅いんだ?
WM_MINMAXINFOに対処するには ウィンドウ作成関数で同期を取ればいいんだよね?
786 :
デフォルトの名無しさん :2009/01/24(土) 23:34:07
>>781 ,782 さん
なるほど・・・CreateWindowの後でSetPropしてるのがそもそもの原因だったようですね。
thisをCreateWindowEXのPVOIDに渡してWM_NCCREATEの時に結びつけるということでしょうか。
とにかくいろいろと試してみます。ありがとうございました。
788 :
デフォルトの名無しさん :2009/01/25(日) 01:20:29
1を加算する演算で flag++ flag=flag+1 がありますが、調べたところ、flag++のが高速だと書いてありました その理由がほしいんですが誰か説明してくれませんか? そしてどのくらい高速なんでしょうか
>>788 そのflagがPOD型なら、今時のコンパイラにとってそれらは全く同じように解釈できる。
だが仮にPOD型ではなくクラスなのであれば、そのクラスの定義によっては差が出るかもしれない。
いずれにしても、速度については観測と実測に基づかない限り云々する意味がない。
6文字読み込むのと、11文字読み込むのの違い。 前者の方が約2倍速く読み込める。
C++で演算子がオーバーライドされてたら、これだけの情報では比べることは出来ない。 intならば、大抵のCPUは一つの命令で値を+1する命令を持っている。 前者はその命令を使う。後者は、値を読み出す、1を加える、値を書き戻す。 ので、20年前は後者は遅いと言われていた。 今時のコンパイラはどちらでも同じコードを生成するので変わらない。
792 :
デフォルトの名無しさん :2009/01/25(日) 03:08:30
Cの課題中 どうもあってるはずなのに動作がおかしい 手本を走らせてもオープンエラーが出る。 #include <stdio.h> #define BUFFER_SIZE 200 void main(){ char buffer[BUFFER_SIZE]; FILE *fp; fp = fopen("test.txt", "r"); // ファイルオープン失敗か? if ( !fp ){ printf("ファイルオープンエラー\n"); return; } // 1行ずつ読み込んで表示する while( fgets(buffer, BUFFER_SIZE, fp) ){ printf("%s", buffer); } // ファイルクローズ fclose(fp); return; } これはコンパイラ側の設定ミスかなにかですか?
test.txtがないってオチじゃねーの?
printf("%s", buffer); の前にperror(0); 入れてみれ そして結果を報告しろ 多分、カレントディレクトリをお前が勘違いしてるのが原因だろうが
fopern("fdsafd", "w"); わからないならを使って場所特定したら?
796 :
デフォルトの名無しさん :2009/01/25(日) 03:19:31
>>794 変化なしです。
EXEがあるディレクトリと同じところにtextをおいています。
本当に同じ場所か、fopen()で書き込みファイル作って確認してみた?
>>796 完全に、ファイル名を間違ってる感じだな
カレントディレクトリでないところにある実行ファイルを動かしているオチですか?
カレントディレクトリが違うって落ちか? それにしても、拡張子.dってなんだよ。
>>800 デバッカーからじゃなくて、 Read_Test.exeのアイコンをダブルクリックして直接実行したらどうなるの?
おすすめのC言語入門サイトを教えてください
805 :
デフォルトの名無しさん :2009/01/25(日) 13:56:06
fopenとfopen_sではどちらが高速ですか?。 FILE *fpt=fopen("test.raw","wb"); FILE *fpt; fopen_s(&fpt,"test.raw","wb"); fopen_sでは2行になってしまうので遅くなる気がするんですが コンパイラはfopen_sを推奨してきます。
>fopenとfopen_sではどちらが高速ですか?。 同じ >コンパイラはfopen_sを推奨してきます。 なら、fopen_sを使おう。
速度の問題ではない。 安全性の問題だ。
移植性を窓から投げ捨ててセキュリティと利便性を重視するのです
本当に移植なんてするの?
>2行になってしまうので それを言うなら、 FILE *fpt=fopen("test.raw","wb"); と FILE *fpt; fpt=fopen("test.raw","wb"); はどうなんだ?
FILE *fpt; fopen_s(&fpt,"test.raw","wb"); でいいだろ。
_s 関数は標準化狙ってんじゃなかったっけ?
どう違うのか教えてください 書き方以外で
>>809 OS間で移植なんかしなくても
移植性が問題になるケースはあるよ
ずいぶん限定的な意味で捉えてないかい
移植しないのに、移植性が問題になるって、それってホントに移植なの?
コンパイラのバージョンが上がっただけでも変わる
そんな非互換なバージョンアップを平気でする田舎コンパイラなんて使うなよw
VC++の事ですね、わかります。
あれは標準が決まったのに互換を引きずったからだろw
規格準拠率が変わるだけでコンパイルできなくなることはよくある話。
つまり移植性を考えても意味ないってことだな。
移植のことは、移植するときに考えればいいよ。どうせ移植なんてしないんだし。
そうやって適当にやってて Win98 → Win2k で ユニコード化関連で大変だった人もいるだろうに。
皆が移植性の話をしてるのに一人だけ移植の話をしてる奴がおるな
>>825 そんな大事が起きたら移植性を考えていたところで大半作り直しだろ。
明日起きるかどうかも分からない移植のことを考えて今日大変な思いをする必要はない。
>>825 どうしていたら、ユニコード化関連で大変にならずに済んだんだ?
>>827 移植性を高くするために TCHAR なんてものが用意されてんのに
(しかも使い方が難しいわけではない)、
それを舐めてて使わなかった結果苦しんだのはバカとしか言えないと思うが。
>>826 移植をしないのに、移植性の話をするなんて、滑稽だろ
結論 移植性を高めるためにTCHARを使いましょう。
>>831 ユニコード関連が問題になるのは API を使う時だけなので、
Windows 以外の OS への移植に関しての移植性を語るのはナンセンス。
Windows 内での移植に限れば移植性は高い。
>Windows 内での移植に限れば 凄い限っちゃったなww
>>834 API を使ったプログラムなんて
どう頑張っても OS 間の移植性なんか無いだろw
つまり、移植性に関して、TCHARの例は適切でなかったとw
Windows 内での移植の話だっつってんだろ
>Windows 内での移植 そんなのテキスト置換でOKだろw
これほどまでにバカだったとは
OS間の移植性まだー
結論 移植することが決まっていなければ、移植性なんて考えなくてもいい
こうだろ 移植しないことが決まっていれば、移植性なんて考えなくてもいい
wxWidgetsで苦労してるやつはいるけどなw
違う
64ビット化で苦しめばいい
うらわああああああわああww
移植性なんて言ってる奴のコードにろくなものは無い。
最近やった移植といえばC++→Javaだな 多重継承がちと厄介だった
言語間の移植はあまり対策しようがないな。 その言語に特有の機能をできるだけ使わないようにする、 とか、流石にバカらしいし。
使えない開発者 移植性を考慮して開発遅延する奴 死ねよw
移植性に関する知識が事前に無いから開発遅延なんて必要になる。 確かにそんな奴は使えないな。
正直、ファイル関連の標準関数は機能がしょぼいから 細かい制御をするには環境に依存するしかないわな そういう環境依存が避けられない部分はわかるけど どうでもいいループカウンタにDWORDとか使うアホは死ねよと
警告 勝手に移植性を高めるために使った工数に、対価は支払いません。 移植に対価は払いますが、移植性に対価を支払うことはありません。
大規模な移植が発生したら責任追及はされるがな
IT土方の分際で、勝手に移植性とか高めるなよw お前らは要求通りの機能を作ってりゃいいんだよ。
とコピペ土方が申しております。
見苦しいよね。
Fランクが高めたつもりの移植性なんて、実際移植するとき役に立ちませんからww
Fランしか身近に居ない環境なのか。 大変だな。心中察するわ。
俺も基本的には移植性は考えない。 さっさと作りたい機能付くった方が気持ちいいし。 移植性は必要になってから考える。
高学歴は必要がなければ移植性なんて考えません。
だからと言って、int a[10];に対してa[10]の読み書きするのやめてください。
むしろWinよりUnix系の方が移植性に気を使う 基盤更改でSolarisからHP-UXになりました とか平気で言われるからな
IT土方は移植を考える暇があったら次の就職を考えてろw
>>864 「それでは移植にこれだけの工数が必要です」で済む話じゃん。
何故HP-UXが出てくる前に、移植性を考慮する必要があろうか。
>>866 その工数が低く見積もれる事に越した事はないだろ
というかSoralisそのまま使えよと意見するのが先だけど
あるかどうかも分からない未来のために、今の工数を投資するの? この御時世、君の会社はそんなに余裕があるの?
移植性高いコード書くのに特別な工数なんて必要か?
きれいなコード書くと、だいたい移植性も高いよな。
必要無いなら、後でやってもいいだろ。
想像力というより移植性に関する知識が無いんだろ
で、結局移植するの?
来年ぐらいには・・・
IT土方のみなさん 移植するとき、別途お金上げるから 今は移植性考慮しないでwwwwおねがいwwww
ベテランが普通にプログラムすりゃ 移植性の高いコードに勝手になるんだよ。 そして、移植性の高いコードはバグも出にくい。
移植性真理教
>>877 それは激しく同意する
ソフト会社に発注して上がってくるコードを見ると、
ベテランと初心者(たいてい新人)の差は果てしなく大きい。
特に目につくのは、初心者は知識量が少ないくせに全力で頑張った結果、
ぎりぎりで動くプログラムを作ってくる。このギリギリプログラムが、まさに
移植性の無いものなんだよね。動くけど、余裕がないというか
移植性といっても、別にWin→Linuxとかの移植に限らない。
同じアプリの次のエンハンスに使いまわすことも含まれる。ちょっと気を回せば
汎用的になるのに、嫌がらせのごとく特定の状況しか動かないコードは移植性が無い。
880 :
デフォルトの名無しさん :2009/01/25(日) 18:55:50
で、次のエンハンスっていつするの?
おかえり、バカ
質問です 関数ポインタをvoid*のポインタにはいれてはいけないらしいんですが、 クラスとか、構造体、同じものですが関数オブジェクトはvoid *型のポインタに代入してもおk?
おk。 まあ、あまりvoid*は使いたくはないが。 あと、関数ポインタへのポインタならvoid*に入れられるよ。 ミディアムモデルとかコンパクトモデルとかでググると 関数ポインタを入れらんないのも無理は無いと思うようになるよ。
キーボードから1行ずつ入力して、入力した文字列を一括表示させるプログラムをポインタを使って作っているのですが、 assignment makes pointer from integer without a cast ポインタと整数との比較を行っています とコンパイラに言われてしまいます 何故、そう言われてしまうのかが解りません ご教示お願いします。 環境 : Linux コンパイラ : gcc
ソースコード #include <stdio.h> int main(void) { int i = 0; int cont[5]; int *cont_ptr[5]; //cont配列のポインタ cont_ptr[0] = &cont[0]; printf("文字列を入力してください(EOFで終了)\n"); while( ( cont_ptr[i] = getchar() ) != EOF ){ if(cont_ptr[i] == '\n'){ i++; } //改行が入力されたら、次の配列へ else if(cont_ptr[i] == 5){ cont_ptr[i] = EOF; } //5回入力されたら終了 } for (i = 0; i == 5; i++){ printf("%d 行目:%s\n",i+1,cont_ptr[i]); } return(0); }
全体的にcont_ptrがいらない
まずちゃんと動くようにしろ それと今後質問するときは、エラーメッセージを抜粋しないこと どの行で発生したのかぐらい書け
cont_ptr[i] = getchar() この辺で出そうに思うけどな
>>880 データ量のエクスポーネンシャルで増大していく処理速度に耐えられなくなった時。
>>887 >int *cont_ptr[5]; //cont配列のポインタ
どう見ても「ポインタの配列」になっている件。
もしかして:
int (*cont_ptr)[5];
>>886 if文の中でメッセージの通りのことをしているから
895 :
886 :2009/01/26(月) 14:07:49
突っ込みどころが多すぎる。どこから説明すればいいんだ・・・
cont_ptr[0] = &cont[0]; cont_ptr[1] = &cont[1]; cont_ptr[2] = &cont[2]; cont_ptr[3] = &cont[3]; cont_ptr[4] = &cont[4];
>>886 の質問だと、警告の原因だけを聞いていて、さも動作するような雰囲気だから
>>889 の言い分もわかるw
899 :
889 :2009/01/26(月) 14:44:51
初期化も行数数えるところも結果表示もバグがあるわけで、
警告を消したい以前の問題なんだよね
まあでも今回の場合、警告を調べることがバグつぶしに繋がるので、
頑張るといいかもしれない。
でも
>>886 は相当にC言語分かってないので、そのまま提出するのが
正解だと思う。先生も、そういう生徒が多ければなんか対策するでしょう
配列の動的なメモリー割り当てに関して質問です。 int main{ int i; int num=100; char *array; for( i = 0; i < num; i ++ ){ load();//この関数中で、mallocを使ってarray配列を確保しています watasiJK();//適当な処理 } save(); return(0); } こんな感じのプログラムでload関数内で動的配列arrayを使っているのですが、 freeは必要でしょうか、もしfreeをするならwatasiJK関数内でfreeすべきでしょうか 同じ関数名arrayで確保を繰り返すことになりますが、メモリ管理はどのような感じになってるのですか サーバーで走らせるので、他人に迷惑になりそうで・・・
901 :
デフォルトの名無しさん :2009/01/26(月) 15:03:32
変数宣言時に無限大をデフォルト値とする方法はありますか? float val = 1.0/0; としておくとwarning: division by zeroがでてしまうし。 (実行は問題ないのですが) float val = Inf;とかfloat val = inf;とかは全然駄目だし。 ご存知のひとよろしくお願い。
>>900 malloc した以上、free する必要はある。
free するタイミングは array が必要でなくなったとき。
load 内だけで使うんだったら load から戻る前に free すべきだし、
load 以降も使うんだったら、その例だと main の中で free すべきかな。
>>895 ならまずはポインタを使わずに動作するものを作成してみては?
動作するものができたがポインタの使いどころが見あたらなかったといって提出するのはだめなことじゃない
まずは文字列をどこに保存するの?ってとこからだな。 最後のprintfで%s指定してるがchar*やchar[]がどこにもないぜ。
>>901 float val = INFINITY;
として、c99指定コンパイルをするか、その警告を出力させないようにするか
906 :
デフォルトの名無しさん :2009/01/26(月) 16:04:10
インポートライブラリ(静的リンク)をつかうヘッダファイルを入力したら ダイナミックリンク用のヘッダを出力するツールはありませんか? 必要な関数のダイナミック呼び出しを追加するツールです。
907 :
デフォルトの名無しさん :2009/01/26(月) 16:06:39
スタティックライブラリを変換するツールを使っても上手くできないし、常にダイナミックリンクにすれば コンパイラの依存が無くせるのですが。 どうしたらいいですか?
909 :
900 :2009/01/26(月) 16:19:48
レスありがとうございます 続けて質問すいません、mallocの数だけfreeすべきですか? それともmain関数の最後にfreeでいいですか watasiJKはarrayデータを弄る処理です
別にfreeしなくてもいいよ
JKっていうのが?
913 :
906 :2009/01/26(月) 16:33:20
なんとかなりませんか
意味がわからん。 プロトタイプ宣言を自動で作れないかってこと?
915 :
906 :2009/01/26(月) 16:38:54
DLLを使う場合、 hoge.hとhoge.libを読み込みますが、 hoge.libはコンパイラに依存します。 そのため、hoge.hやhoge.libを解析して 必要な関数を動的呼び出しで読み込むようにヘッダに追加するんです。 するとそのヘッダだけで、DLLが使えます。
よくわからん。 使いたい関数がDLLにあるならそのヘッダ使えばいいだけじゃないの?
よくわからん。 コンパイラごとに切り替えたいなら、たいていそのコンパイラを識別できる何かが#defineされてるからそれ使えば?
ああ、LoadLibraryとGetProcAddressのコードを自動生成ってことか。
919 :
906 :2009/01/26(月) 16:49:16
> ああ、LoadLibraryとGetProcAddressのコードを自動生成ってことか。 これなんです。 そういうツールかいい方法ありませんか?
>>919 P/InvokeだとVS用にそういうアドインがあったからC++でもあるんでないのかな
922 :
886 :2009/01/26(月) 18:03:07
886です もう少しで疑問が解けそうです 助言してくれた方ありがとうございました!
C++のnewに関して質問です。 typedef {何か型} type; void* a = new type; void* b = new type[1]; 上記のコードは同じバイト数を確保すると思うのですが、 パフォーマンス等に差はありますか? 削除時のdeleteとdelete[] を統一したいのです。
最適化がどうとかを置いておけば、 new []は確保した領域の大きさを(大抵の方法としては)確保した領域の直前に置き 解放時にそれを読むのでので、ちょっと落ちることにはなる そんな細かい手間省きたいならスマートポインタつかっときゃいいのに
925 :
923 :2009/01/26(月) 20:23:38
>>924 ありがとう 参考になります
動的メモリを管理するラッパー関数を自作したかったのです
自己管理しないと落ち着かない強迫観念・・・
ラッパ関数も new 用と new [] 用と2つ用意すればいいのに
void swap_ptr(char **x, char **y) { char *tmp = *x; *x = *y; *y = tmp; } int main( ) { int num; char (*filename)[100]; int i; //配列確保 filename = (char (*)[100])malloc(i * 100); for (i = 0; i < num; ++i) swap_ptr(&filename[i], &filename[rand( ) % (i+1)]); }
928 :
927 :2009/01/26(月) 20:57:46
ああああああ、途中で書き込み押してしまった・・・・ 以前シャッフルでお世話になったものです。 実装を試みているのですが、なかなかうまくいきません。 strのコピーは遅いとお聞きして、ポインタの配列でswapを行いたいのですが、気づいたことがあればどんなことでもお教え願えませんか
できないことをやろうとしてるのに気づかないのか?
>>927 なんでそんな馬鹿なことしているの?
char配列の確保とポインタ配列の確保を一回で済ませようなんて横着しないで、
地道に確保して味噌。
>>930 お前も勘違いしてないか
確保までは普通のことしてるだろ
大丈夫、>930はメモリアロケートと代入をセットで確保と言っているのだろうからw
>>930 むしろおまいさんがchar (*)[100]の意味をわかってないんじゃないかと
>>931 確保までっていうのは確保を含まない、でいい?
やりたいことはこの方法じゃ実現できないよね
えええ、じゃあ俺もりかいできてないっぽ。
>>934 スルーしてくだされ><
936 :
927 :2009/01/26(月) 21:19:10
レスありがとー
ポインタを使った配列の動的確保は無理ってことですか
配列確保コメ以下はいまいちわかってません
>>933 さんが指摘されたところは、まさにさっぱりです
うーん・・・・
>>934 確保まで含むよw
まぁ確かにこの方法で質問主の望むことが出来ないが
二次元配列の確保としては正しいだろ
>char配列の確保とポインタ配列の確保を一回で済ませようなんて横着しないで
これは勘違いしてるだろ・・・
939 :
930 :2009/01/26(月) 21:27:40
char二次元配列の確保だけじゃポインタの入れ替えなんてできないからそう書いているんだが。
二次元配列の確保を行っている処理に対して >char配列の確保とポインタ配列の確保を一回で と書いたことを問題視していて、質問主のやりたいことはそっちのけだったみたいだね。
>>940 いや、君が質問主のやりたいことをわかってないからそう思うだけ。
char *filename[100]; 使ったほうで誰かくやってやれよ
連続領域で確保しちゃったらやりたいことできないように思ったんだけどそういう訳じゃないの?
連続領域で確保しても、別途ポインタ配列を用意すればできるね。
むしろ char (*filename)[100]; を使った方法でやってやれよ
>>945 だから無理ジャン、文字列を内容コピーは嫌だからポインタの指す先変えたいっつってんだもん
948 :
927 :2009/01/26(月) 22:14:42
皆さんの意見を所々参考に一応なんとなくできましたー void swap_ptr(char **x, char **y)//前と一緒 { char *tmp = *x; *x = *y; *y = tmp; } int main( ) { int num; char **filename;//ポインタのポインタが必要だったのかな・・? int i; //ポインタ配列確保 filename = (char **)calloc(num, sizeof(char *)); while(/*データとってくる*/){ strcpy(temp, /*シャッフルするデータ群のうち一つ*/); filename[i] = (char *)malloc(strlen(temp)+1); strcpy(filename[i], temp); i++; } srand((unsigned) time(NULL));//これないとダメみたい? for (i = 0; i < num; ++i) swap_ptr(&filename[i], &filename[rand( ) % (i+1)]); } freeはスペースの都合で略しました。すんまそん こんなかんじです。これでもやっぱり遅いです・・・ 気づいた点あれば、ご指摘願えませんか。
なんでtemp一旦入れるの。 先にmallocして直接strcpyしたらだめなのか?
950 :
デフォルトの名無しさん :2009/01/26(月) 22:28:30
for文の中の初期条件に当てられている変数を 処理の中でいじっちゃいけないって書いてあるんですがどうしてなのですか? 下のようなことはしてはいけないらしいですが動きはします。 for(n = 1 ; n <= 100 ; n++){ n=n+1; }
951 :
927 :2009/01/26(月) 22:28:32
>>949 データのファイル名の長さが不均一でして・・・・
>filename[i] = (char *)malloc(strlen(temp)+1);
ここは常に最大長の256でいったほうがはやい気もするのですが・・・
私の勘違いな気もしないでもなくて・・・
といっても、多分自力では書けないっす
>>950 やっていることが理解できているのなら、別に問題はない。
一体全体何に書いてあったのか知らんが、それを書いた者は初心者への警告の積もりなのか他言語と混同しているか、根本的に間が抜けているのだろう。
>>950 何に書いてあったのか、確かに知りたいな。
普通、Cでは0から始めるのに1で始めているところからしても、basic崩れなんじゃないだろか。
やっぱりやってもいいのですね。 書いてあったのは授業で使った教科書・・・ 調べるとかなり酷評されていますが。
955 :
デフォルトの名無しさん :2009/01/26(月) 22:38:55
文字列シャッフルせずに、その添え字をシャッフルすればいいだろ。
956 :
デフォルトの名無しさん :2009/01/26(月) 22:41:19
char ch[5][4]={"aaa","bbb","ccc","ddd","eee"}; を直接やらず、 int num[5]={0,1,2,3,4}; をやれば結果は同じでかんたんだろ画。
957 :
927 :2009/01/26(月) 22:41:23
>>955 先にそれを実装したのですが、ポインタのつなぎかえだけのほうが早い気がしまして・・・
データ数30000でシャッフルしてますが、速度はどちらも同じくらいですね・・・
958 :
デフォルトの名無しさん :2009/01/26(月) 22:50:22
一回乱数を生成するだけで、シャッフル出来る高速アルゴリズム知ってるよ。 教えてやるよ。
たった1つの乱数で?!
961 :
デフォルトの名無しさん :2009/01/26(月) 22:54:21
ただしデータ数Nに対して、Nの階乗までの数値が扱えて、その範囲の乱数が生成出来ること が必要。 3万だと多倍長演算しないと無理だな。
962 :
927 :2009/01/26(月) 22:56:49
あうあうあう
Fisher-Yatesシャッフルでいいだろ。
>>960 AESのCBCに初期値を乱数で1回作って入れて回して出力される系列で混ぜればいい。
965 :
デフォルトの名無しさん :2009/01/26(月) 23:14:16
配列や変数、ポインタに対して決まったメモリを割り当てるにはどうすればよいでしょうか? int suji[0x55555555] char array[0xFFFF] */で先頭配列を指定? とかいったかんじでしょうか?
966 :
958 :2009/01/26(月) 23:14:53
#include<stdio.h> #include<string.h> #include<vector> using namespace std; #define M 5 #define K 120 // K=M! vector<unsigned char> A(M), B(M), C(M); void shuffle(int k){ int i,j,N=k; memcpy(&B[0],&A[0],M); for(i=M;i>=1;i--) { int n=N % i; C[M-i]=B[n]; for(j=n;j<i-1;j++) B[j]=B[j+1]; N/=i;}} main(){ int i,k; for(i=0; i<M; i++) A[i]=i+1; for(k=0; k<K; k++) { shuffle(k); for(i=0; i<M; i++) printf("%d ",C[i]); printf("\n"); }}
>>950 ダメだと言うとすれば、コンパイラが理解しても読む人間がぱっと理解しづらいということかな。
for自体の中身以外でループ変数を書き換えるコードは滅多に見かけないから。
>>965 int suji;
&suji = 0x55555555;
char array[10];
&array = 0xffff;
>>965 特定のメモリアドレスでなければ困るという意味であれば、
コンパイラやリンカにここに割り当ててくれって指示を出したり、
領域だけ用意してもらって、int* hoge = (int*)0xdead;のように決め打ちしたりする。
970 :
958 :2009/01/26(月) 23:19:05
こっちのほうがみやすいか #include<stdio.h> #include<string.h> #include<vector> using namespace std; #define M 5 #define K 120 // K=M! vector<unsigned char> A(M); void shuffle(int k){ int i,j,N=k; vector<unsigned char> B(M); for(i=0; i<M; i++) B[i]=i+1; for(i=M;i>=1;i--) { int n=N % i; A[M-i]=B[n]; for(j=n;j<i-1;j++) B[j]=B[j+1]; N/=i;}} main(){ int i,k; for(k=0; k<K; k++) { shuffle(k); for(i=0; i<M; i++) printf("%d ",A[i]); printf("\n"); }}
972 :
デフォルトの名無しさん :2009/01/26(月) 23:19:32
>965 int *p; p = (int *)0x55555555
973 :
958 :2009/01/26(月) 23:22:49
数値に対して、順列が一意的にもとまるから、ランダムに入れ替えた物よりも偏りが出ないはず。
汎用性低くっw 自信満々に持ち出すならもうちょっときれいなコードくれよ
>>973 単にヘボい疑似乱数使ってるのと同値だろ。rand()使った方がよっぽど混ざる。
俺の知らない世の中ではO(n*n!)のアルゴリズムを高速っていうの?
それよりオーダーで負けてないか?Fisher-Yatesに
978 :
977 :2009/01/26(月) 23:33:25
981 :
958 :2009/01/26(月) 23:41:36
これなら汎用性出るか? Aを整数kでシャッフルし結果をBに格納する関数。 #include<stdio.h> #include<vector> using namespace std; typedef vector<int> ret; void shuffle(ret A, ret &B, int k){ int i,j,N=k,M=A.size(); B.resize(M); for(i=M;i>=1;i--) { int n=N % i; B[M-i]=A[n]; for(j=n;j<i-1;j++) A[j]=A[j+1]; N/=i;}} main(){ ret A(5),B; A[0]=0; A[1]=3; A[2]=5; A[3]=7; A[4]=9; shuffle(A,B,5); for(int i=0; i<5; i++) printf("%d ",B[i]); }
すんません,質問です。 DLLの関数を使うときって,そのヘッダーファイルをインクルードするだけじゃなくて, DLL(の関数)をロードして使いますよね? でも平方根を取るsqrt()関数とかってmath.hをインクルードするだけで使えちゃいます。 なんでですか? 僕は初めて学んだ言語がJavaなせいか,C++とごちゃまぜにしている可能性が高いです。 おかしな点があったら指摘してください。 Javaだと,スタティックなメソッドだとそのメソッドを持っているクラスファイルをインポートするだけで使えちゃいますよね? これが僕の中では,math.hのsqrt()関数です。 それで,ロードしなきゃ使えない関数が,Javaで言うところの,非スタティックなメソッドで, インスタンスを生成しなければ使えないやつです。 このイメージって全然ちがいますか?
>>981 汎用性以前に、質の悪い乱数でかきまぜる、遅いアルゴリズムで、何したいの?
985 :
958 :2009/01/26(月) 23:50:43
みんな勘違いしてるぞ。 このアルゴリズムは全ての順列と、自然数を対応される一対一対応になってるんだよ。 与える自然数が異なれば、異なる順列が生成されるんだ。 シャッフルに限れば完璧の性能。
>>982 標準ライブラリの関数は特別扱いで、自動的にDLL/LIBなどがリンクされるよう
手はずを整えられていることが多い。
O(n*n!)はさすがに勘違いだった。よく見てなかった。 要するに順列でいうk番目を取り出してるわけか
>>985 自然数と順列の数では集合としての濃度が違うのだが、わかってる?
989 :
958 :2009/01/26(月) 23:56:42
たとえば、配列数が10ならば、その順列数は10の階乗個。 1〜10!と、配列数10のシャッフル全体が一対一対応。
で、何個までシャッフルできるの?
よく分からんので明日までに議論をまとめといてくれ
2^64 = 20! = 大体19桁 つまり20個まで ( ゚д゚)、ペッ
993 :
958 :2009/01/27(火) 00:03:26
>>986 なーるほど。じゃ,基本はDLLの関数を使うときは,ちゃんとロードしないとだめ
ってことなんですね。で,標準ライブラリの場合は,暗黙的に勝手にロードしてくれると。
見なくてもわかる。必要のない知識ということが。
>>958 >for(j=n;j<i-1;j++) A[j]=A[j+1];
センスねーなw
997 :
958 :2009/01/27(火) 00:05:04
GMP(多倍長演算)使えば、メモリの許す限り、配列の添え字として扱える数字までいけるだろ。
勝手にいってろ。
質問者は、DLLと言い切ってるところにむしろ不安があるんだが
ストリーム暗号使った方がよっぽど速い
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。