スレを勃てるまでもないC/C++の質問はここで 7
janeの隠し機能 1.書き込みウィンドウを出し半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
/ // / // ______ / // / / // /| r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、., / / / / | |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__ `'ー-‐''" ヽ、_'´ `| |:::::|'" 二.,_> ,.へ_ / //__// / / / `ヽ7::/ か っ も | / // メ,/_,,. /./ /| i Y // ァ て う. |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ , |〉 | 約 ク ヽ! O .|/。〈ハ、 rリ '´ ,ァ=;、`| ,ハ |、 / | 束 ソ > o ゜,,´ ̄ . ト i 〉.レ'i iヽ|ヽ、.,____ | し ス / ハ | u ,.--- 、 `' ゜o O/、.,___,,..-‐'"´ | た レ | / ハ, / 〉 "从 ヽ! / | じ は |,.イ,.!-‐'-'、,ヘ. !、_ _,/ ,.イヘ. ` ヽ. ッ .ゃ .立 |/ ヽ!7>rァ''7´| / ', 〉`ヽ〉 ! ! な て .', `Y_,/、レ'ヘ/レ' レ' い .な ヽ、_ !:::::ハiヽ. // / で い ./‐r'、.,_,.イ\/_」ヽ ', / / す / `/:::::::/ /,」:::iン、 / / 〈 ,,..-‐''"´ ̄ ̄77ー--、_\.,__ / ,.:'⌒ヽ ´ | | , i |ノ `ヾr-、
このスレつかうの?合流するの?
ひょっとしていらんかったのですか・・・ごめんよ
前スレの982です。 >999 :デフォルトの名無しさん:2009/01/27(火) 00:07:57 >質問者は、DLLと言い切ってるところにむしろ不安があるんだが たぶん,勘違いしてるんです。だから毒抜きしたいので思いっきり言っちゃってください。 どこらへん勘違いしてそうですか?
立ってしまったからには使うしか無いな。
乱数一回で3万件のシャッフルできるやつ明日までに作るから待ってろ。他のプログラム使わず。
たのんます。
30000!まで扱うのは出来るとしても、その範囲の乱数の生成法が思いつかん。 ちょうど2の1000乗とかだったら、rand()をシフトさせればいいが。 何桁なのかもわからん。
シャッフルの人に聞きたいんだが、どこが遅いかおおむね分かったりしないかな。
というかどれくらいかかってるの?
ファイル名ということであれば256バイト固定でやってもいいように思う。
3万回のallocのコストが影響してるのかもしれないし。
連続領域の2次元配列で、インデックスのみのシャッフル(
>>956-957 )を試してみて。
毎回allocするのはコストが高いかも。ファイル名取得コストも調べないとだけど。
それと、tempという変数がグローバル変数ならローカル変数に変えてみて。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>8 乱数「1回」って何だよ。
多倍長の乱数を作るのと、4バイトの乱数をたくさん作るのは本質的に何も変わらないって解ってる?
逆に言えば多倍長の乱数を「1回」作ってそれをLSBから必要なビット数ずつ取り出して使えば、どんなアルゴリズムでも乱数を「1回」以上作るのは必要は無い。
>>12 遅いっていっても、シャッフルするのに10秒はかからん感じです。
妥当なのかもです。
indexのシャッフルもやりました、tempはローカルっす。
>>16 ちょっと改めてソース出してみてよ。手が空いてたら試してみるから。
ディレクトリに3万の無作為なファイルが必要ですけど。。。
ん? ファイル名を入れ替えているだけじゃないの? まぁ、ファイル名そのものにもランダム性が必要なわけじゃないなら10万くらいファイルが転がっているディレクトリくらい簡単に用意できるし。 # たまたま、今度の仕事は10*1000*10くらいの個数の画像ファイルが相手なんだw
!?ソース削ってたら2秒くらいで全件表示まで動くようになった
えー!まさかのうっかりミス? 劇的改善おめ。 何やって高速化したか聞きたいなw
シャッフル以外の処理の部分でした 30000件printfする前に30000中の該当データを弄る関数があって そこをコメントアウトしたらはやくなりまうすた シャッフル自体はまともにうごいてますた
「問題を再現する最小限のソースの提示」が問題解決に役立つ好例だな。
>>24 実行してなくて以下完全に妄想で。
>>12 さんの言うようにmallocのコスト減らしたいので
メモリの無駄を許容できるならfilename=calloc()のときに一緒にバカでかいテーブル作ってもいいかも。
あとstrcpy(filename[i], entry->dname);一発にすればtemp[]への一時strcpy()いらなくね?とか
>>24 処理中にファイルが増えるとまずいコードになってる
できれば1回で読みながらファイル数を数えるべきだけど
せめて2回目に読むときにiがcountを越えないようにするべき
1回で読みながらファイル数を数えるってことは 動的配列は使えないってことですか
処理前の時点で数が未知なものは動的確保の得意とするところじゃない? realloc()で増やしながら回すとかかな
やってみまう
10秒、2秒とか何言ってるんだ? 数万件程度のシャッフルなんてミリ秒オーダーで十分だろ。 組み込み系のマイコンでも使ってるのか?
32 :
12 :2009/01/27(火) 14:28:33
3万ファイル作ってやってみたけど、十分速いように思った dataディレクトリに1.dat〜30000.datがある状態で以下。 % time ./a.out data 30000 >| /dev/null finish!! ./a.out data 30000 >| /dev/null 0.03s user 0.03s system 99% cpu 0.068 total
わざわざありがとう、これでいきます
34 :
デフォルトの名無しさん :2009/01/27(火) 14:46:29
Cです。 #include<stdio.h> typedef struct{ int a,b; }A; int func(A **a){return a[0]->a;} int main(){ A foo[12]; int x; foo[0].a = 1; x = func(&foo); printf("%d\n", x); return 0; } コンパイルできるのですが、実行するとprintfまで処理がたどり着きません。 何が問題なのでしょうか
int func(A (*a)[12]) とか
>>34 func()の引数はポインタ配列が期待されているはずだが・・・
>>15 3万個の乱数を生成するには、15bit*30000ビット=45万bit必要。
順列と整数を一対一対応されるのは上の計算から40万bit必要。
少し減らせるだけであんまり変わらないか
多倍長のやつ作ろうとしたが、割り算が面倒、速度低下するのでやめたよ。
全ての順列を生成するプログラムとしてはこれが最適ではないかな。たった4行。 #include<stdio.h> #include<vector> using namespace std; typedef vector<unsigned char> ret; void shuffle(ret A, ret &B, int k){ int i,n,N=k,M=A.size(); B.resize(M); for(i=M;i>=1;i--) { n=N % i; N/=i; B[M-i]=A[n]; memmove(&A[n], &A[n+1], i-n-1); }} main(){ ret A(5),B; for(int i=0; i<5; i++)A[i]=i+1; for(int k=0; k<120; k++){ shuffle(A,B,k); for(int i=0; i<5; i++) printf("%d ",B[i]);printf("\n"); }}
void shuffle(ret A, ret &B, int k){int i,n,N=k,M=A.size(); B.resize(M);for(i=M;i>=1;i--) {n=N % i; N/=i; B[M-i]=A[n];memmove(&A[n], &A[n+1], i-n-1); }}
42 :
12 :2009/01/27(火) 16:36:47
手が空いたので試してみたけど、うちの環境ではallocよりreaddirの方が十分遅いので 今2回走査してるのを1回にすればずいぶん速くなった。 filenameをreallocするようにしてもreadirの回数が半分になるコストダウンの方が大きく、 実行時間はおよそ半分になりました。 参考まで。
ソースくれてもいいんだよ^^
必要だろうか。 一応変えた範囲を貼っとくけど、ずいぶんやっつけですよ。 /* //総ファイル数カウント (中略) //ポインタを先頭へ rewinddir(dp); */ //ファイル名を配列へ filename = NULL; i=0; while ( (entry = readdir(dp) ) != NULL) { if((strcmp(".",entry->d_name) == 0) || (strcmp("..", entry->d_name) == 0)) continue; filename = realloc(filename, sizeof(char *) * (i+1)); filename[i] = (char *)malloc(strlen(entry->d_name)+1); strcpy(filename[i], entry->d_name); i++; } count = i; closedir(dp);
そ、そこですか!? な、なるほど・・・ありがとう
46 :
デフォルトの名無しさん :2009/01/27(火) 20:42:55
困ってるんで教えてください 一つのHDDでCドライブを起動ディスク、Dドライブをデータディスクにして パーティションを分けています デフラグしたところ、Dドライブの直下に突然 msvci70.dllというのが出てきました、説明欄にMicrosoftR C++ Runtime Library とありますがこのファイルは本来どこにあるべきものでしょうか?
>>46 君のPCなら好きにしろ
要らなければ消せ
shuffle関数
これまた酷い釣りだな
>>49 main関数だろ
shuffle関数は5行だ
あなたが神ですかwww
55 :
デフォルトの名無しさん :2009/01/27(火) 23:07:24
int *p p = (int *)0x3333 char *array[10] array = (char *)0x5555 これらはどのような動きをしているのでしょうか?
>array = (char *)0x5555 ねーよw
57 :
デフォルトの名無しさん :2009/01/28(水) 01:05:59
どう間違っているのでしょうか?
配列名に代入できるわけがない
>>14 こういうことすか?
標準関数のライブラリはオブジェクトファイルが容易してあって、
そのヘッダファイルをリンクするだけでビルドできちゃう。
でも、DLLの関数はオブジェクトファイルじゃなくてライブラリなんだからロードしてつかわなきゃだめでしょ
ってことですか?
60 :
デフォルトの名無しさん :2009/01/28(水) 01:13:12
>>58 どうすれば配列にメモリ割り当てられますか?
61 :
デフォルトの名無しさん :2009/01/28(水) 01:17:51
&array[] = malloc(100);
>>59 標準関数であっても、それがオブジェクトファイルで用意されているか
静的ライブラリか動的ライブラリかは環境依存。
また、それらを明示する必要があるかどうかも同様。
例えばunix系のgccではmath.hで宣言されている標準関数は明示的に
ライブラリを指定する必要(-lm)があるが、iccではその必要がない。
64 :
デフォルトの名無しさん :2009/01/28(水) 01:19:39
array[0] = (char *) 0x5555;
66 :
デフォルトの名無しさん :2009/01/28(水) 01:24:01
>>65 もしかして配列の要素数だけ指定しないといけないのでしょうか?
だから、やりたいことを具体的に書け。
68 :
デフォルトの名無しさん :2009/01/28(水) 01:26:17
ポインタとしての変数や配列、構造体、関数にメモリ番地をしていしたいのです
この質問最近良く見るけど同じ人? 何がしたいのか書いて欲しい int i; /* iをintで宣言 */ みたいな感じではなく。
70 :
デフォルトの名無しさん :2009/01/28(水) 02:07:42
>>69 大抵変数でも構造体でも配列でも実行したら適当なメモリ番地に格納されますよね
それを指定したいわけです。テストする際でも、メモリ番地変更の必要があるとエラーがでたりするので
どんなときにメモリ番地変更の必要があるんだ?
>メモリ番地変更の必要があると なぜ必要になる事があるんだ
ダメだこりゃ。
>int i; /* iをintで宣言 */ みたいな感じだったな
75 :
69 :2009/01/28(水) 03:08:54
あぁぁ。。なにこの絶望感 おやすみorz
組み込み系で64Kbyteの隙間にデータを埋め込んだりしてるんじゃないだろうか
char (*array)[10]; array = (char(*)[10])0x5555;
78 :
デフォルトの名無しさん :2009/01/28(水) 07:44:56
>>78 任意のメモリアドレスにアクセスしたければ、ポインタを書き換えればいいでしょ。
なんでそれじゃ駄目なの?
>>77 正式に確保してないからいつ内容がぶっ壊されても文句言えないけどな
物理アドレスにマッピングしたいシンボルは
ソース上は静的な構造体にまとめといて
リンカ/ローダで物理アドレス指定するのが
16ビット時代の俺の常識。
>>75 ドンマイw
16bit時代は直接物理アドレスいじれたの?
>>82 x86の32bitはセグメントにいろいろ属性が付けられるから(NXビットを
入れるとreadonlyも出来る)アドレスはいじらない方がよかれ
>>84 そういう意味じゃなくてOSからはmmuを介する仮想アドレスしか触れないんじゃないの?
って言う意味での質問だったの
x86の16bit CPUに仮想アドレスなど(ry
マージソートに関してです. 分割する関数(split)と,併合する関数(merge)は何とか作れたんですが これらを上手く組み合わせることができないです. merge関数をソート済みの2つの配列を併合する場面で利用するのはわかるんですが split関数のどこで呼び出せばよいかがわかりません. ウェブ上に上手いソースコードはたくさんあるんですが, 理解したいので,手ほどきのほう,よろしくお願いいたします.
88 :
87 :2009/01/28(水) 21:59:00
void split(int a[],int sin,int dex){ int mid; printf("left:%d right:%d\n",sin,dex); if (sin>=dex){ printf("n[%d]=%d\n",dex,a[dex]); return; } mid=( sin + dex )/2; split(a,mid+1,dex); split(a,sin,mid); }
解説サイトとか見ても分からんのか? 分からんなら、どこが分からんか言った方がいいよ
90 :
87 :2009/01/28(水) 21:59:43
void merge(int A[],int front_first,int rear_first,int rear_last){ int i,j,k; for(i=front_first;i<rear_first;i++){ tmp[i]=A[i]; } i=front_first; j=rear_first; k=front_first; while(i<=rear_last){ if(j==rear_last){ A[i]=tmp[k]; i++; k++; } if(k==rear_first){ A[i]=A[j]; i++; j++; } if(tmp[k]<=A[j]){ A[i]=tmp[k]; i++; k++; }else{ A[i]=A[j]; i++; j++; } } }
91 :
87 :2009/01/28(水) 22:10:35
マージソートの原理自体は紙上では理解してます. 上記の,分割までして表示する関数と ソートされた2つの配列を併合する関数までは自分で作りました. この2つを上手く組み合わせれば,できるはずなんですが ちょっとプログラムに起こせなくて,行き詰ってたので ヒントでもいただけたらと思って,投稿いたしました.
そもそも分割自体は特に何もする必要がないと思うよ。 入力の配列を1要素1要素分けて注目すれば、既に分割されているのと同じことになるから。
93 :
デフォルトの名無しさん :2009/01/28(水) 22:23:17
>>91 こんな感じじゃないの?sort()のなかにmarge()と分割が入って再帰する。
sort(配列, 要素数){
if(要素数=<2){return 2要素をソートした配列}
分割位置 = 要素数/2;
sort(配列の前半);
sort(配列の後半);
marge(配列の前半, 配列の後半, 結果);
return 結果;
}
94 :
87 :2009/01/28(水) 22:32:58
>>92 ,93
ありがとうございます.
もう少し考えてみます.
95 :
デフォルトの名無しさん :2009/01/28(水) 22:45:18
typedef FuncPtr(MyClass::*FuncPtr)(); こんなことをするにはどういう手法があるでしょうか? よろしくお願いします。
delegate
97 :
デフォルトの名無しさん :2009/01/28(水) 22:53:00
typedef int(MyClass::*FuncPtr)(); が簡単に出来るのだから typedef FuncPtr(MyClass::*FuncPtr)(); も何か方法があるのでは?という質問です。 よろしくお願いします。
98 :
デフォルトの名無しさん :2009/01/28(水) 22:57:49
Yコンビネーター
状態遷移を単純な単一のループで書いてみるテスト #include <iostream> typedef void (*func)(); typedef func (*foo)(); int n; static foo a(); static foo b(); static foo a() { if (n < 7) { ++n; return (foo)a; } else { return (foo)b; } } static foo b() { printf("%d\n", n); return NULL; } int main() { foo p = (foo)a; while ((p = (foo)p()) != NULL) { // Do nothing } }
再帰呼び出しをループに展開したような感じだな
マージでソートする5秒前
102 :
87 :2009/01/29(木) 23:15:33
merge関数が間違ってました. そりゃどうあがいても無理ですね. 本末転倒ですみませんでした.
DLできませんが
申し訳ありません! うpしました!
calloc ↓ (dt *)calloc ->の前後に空白入れるの初めて見たかも。
>>105 宣言は関数のはじめに行う。
とりあえずこれだけでコンパイルは通ったよ。
動かしてないけど。
int main(void) {
struct dt *top;
struct dt *tmp;
struct dt *oldtmp;
struct dt *old1tmp;
c++だよ ソースの内容はいかにもベターCという感じだけど。 なので、宣言の位置が問題なのではなく、暗黙の型変換が問題になる
あ、ほんとだ。 Cとしてコンパイルしてた。
110 :
103 :2009/01/30(金) 02:52:25
型変換を意識しなければいけませんね ありがとうございました!
このプログラムを実行すると初回の入力値が1〜10でなくてもループを抜けてしまいます ループを抜けないようにするにはどこを修正したら良いのでしょうか? 関数はポインタを使う形でお願いします void main(void) { int l=0,h=0; ScanPiecePosition(&l,&h); } void ScanPiecePosition(int *l_Scan,int *h_Scan) { int l_s,h_s; do { if(*l_Scan != 0) //入力2回目以降のみ判断する { printf("入力した値が違います!\n"); } printf("縦の座標を入力してください\n"); printf("縦(1〜10):"); scanf_s("%d",&l_s); }while((1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ }
}while((1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ ↓ }while(!(1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ
あ。。 }while(!((1<=*l_Scan) && (*l_Scan<=10))); //縦の値が1〜10になるまでループ
>>113 正しい値を入力してもループが終わらないのですが…
printf("縦(1〜10):"); scanf_s("%d",&l_s); ↓ printf("縦(1〜10):"); scanf_s("%d",l_Scan);
>>115 正しく動作するのですが、正しい値を入力するとデバッグエラーが起きてしまいます
以下の行をmain関数の前に書く? void ScanPiecePosition(int *, int *);
解決しました 原因はこのループの下に「*l_Scan=l_s;」という文を書いていたからでした こんな夜分にお騒がせしてすみませんでした
そっかぁ。 それを生かすなら、do〜whileでのl_Scanを全部l_sにすればいいよ。 まるまる置換ではなく、 if(*l_Scan != 0) //入力2回目以降のみ判断する ↓ if(l_s != 0) //入力2回目以降のみ判断する みたいに、型を意識しつつ置き換え。 あと、0が入力されたら何も言わずに再入力になるけど、そこは大丈夫だろうか。
無理やりですがこの様にしました void ScanPiecePosition(int *l_Scan,int *h_Scan) { do { if(!((1<=*l_Scan) && (*l_Scan<=10))) //入力2回目以降のみ判断する { printf("入力した値が違います!\n"); } printf("縦の座標を入力してください\n"); printf("縦(1〜10):"); scanf_s("%d",l_Scan); }while(!((1<=*l_Scan) && (*l_Scan<=10))); //0と1を整理する 縦の値が1〜10になるまでループ }
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
124 :
デフォルトの名無しさん :2009/01/30(金) 20:05:19
Microsoft Visual Studio と Microsoft Visual C++ 2008 Express Editionの違いを教えてください
>>124 Microsoft Visual Studio ⊂ Microsoft Visual C++ 2008 Express Edition
逆じゃん
>>124 スタジオにはC++やらBASICやらC#やらが集まってる
「Microsoft Visual Studio」より機能が増えたのが「Microsoft Visual C++ 2008 Express Edition」 ってことであってますか? 前者が指定されてる授業で後者使ってても大丈夫ですかね?
GUIのプログラムを使ってるなら問題があるかもな (それ以外の違いは多分大丈夫だろう) MFC使ってたらだけど
質問どす staticを付けたメンバ関数の特徴としては ・メンバにアクセスできない(データ、メソッド) ・スコープ解決演算子でインスタンスが無くても呼べる これ以外に特徴ありますでしょうか 例えばprivateにはするな、とか実行速度が落ちるとか
>>131 >・メンバにアクセスできない(データ、メソッド)
クラスメンバにも?
・普通の関数ポインタに代入できる 要するに、static メンバ関数ってのは、 普通の関数を単にクラス内に記述しただけのものだ。 class A { public: static void foo(); }; も namespace A { void foo(); } も似たようなもんだ。 ただ、A は名前空間じゃないから using A; なんてできないし、 A はクラスだから protected や private にして アクセス可能な範囲をコントロールすることができる。 >メンバにアクセスできない(データ、メソッド) static メンバ変数にはアクセスできるぜ。 >例えばprivateにはするな、とか実行速度が落ちるとか 無茶苦茶なことを言うものではない。 private にしても問題ないし、 普通のメンバ関数より this を渡さなくて良い分実行速度は僅かに速い。
もちろん、static メンバ関数にもアクセス可能だぜ
using namespace A; だったな
>>132 自分のメンバどす
>>133 サンクス!
まさに聞きたかった答え!!ありがとう!
・普通の関数ポインタに代入できる
・staticメンバにはアクセスできる
・thisを渡さない分高速 ですね
>>136 インスタンスを指定すればprivateなメンバにもアクセスできるよ。
ptr->aみたいに
//プロトタイプ宣言 void bbb(); void ccc(); void aaa(){ while(1){ bbb(); } } void bbb(){ int a; cin >> a; switch(a){ case 1: ccc(); break; case 2: } } void ccc(){ break; } 数の入力を求め、それが1なら関数cccにとび、関数cccを実行しwhile文を終了する、 という具合にしたいのですが、コンパイルするとbreakが正しくありませんとでて困ります。 goto文をつかうしかないのですかね?
void ccc(){ return; } か?
>>139 コンパイルは出来るのですが、while文が終了されません・・・・
void aaa(){ while(bbb()); } int bbb(){ int a; cin >> a; switch(a){ case 1: return 0; case 2: } return 1; }
>>138 breakが全く分かってないな
ちなみにgotoで c()の中から
aaa() のwhile直後に飛ぼうとするのは絶対にやってはいけない
143 :
138 :2009/01/31(土) 13:44:06
>>141 >>case 1:
>>return 0;
すいませんが、直接case 1:の処理としてreturnするのではなく、
あくまで関数cccの処理としてwhileを終了したいんですが・・・
int flag; void aaa(){ flag = 1; while(flag){ bbb(); } } void bbb(){ int a; cin >> a; switch(a){ case 1: ccc(); break; case 2: } } void ccc(){ flag=0; }
そうだsetjmp使おう!
returnやbreakの効力が及ぶ範囲を全く理解していないんだな
147 :
138 :2009/01/31(土) 14:03:46
>>144 そういう手法がありましたか。
解決です。どうもありがとうございました
>>147 「設計が悪い」しか答えはない
他の方法を考える
メッセージループの実装だったんだろうか
150 :
デフォルトの名無しさん :2009/01/31(土) 20:01:52
Microsoft SDKsは6.1いれたら5と6a消して良いですか?
どうぞ
152 :
デフォルトの名無しさん :2009/02/01(日) 00:39:36
レスありがとうごさいます NETだと消していけないのでまよってました
153 :
デフォルトの名無しさん :2009/02/01(日) 06:17:18
時々ヘッダを付け忘れます。
int で定義された変数に16進を入れると自動的に変換されるの?
数値という概念に進数という属性は存在し無い 数値を表記したいと思った時に初めて、進数という概念が現れる
そうだな。進数、進法でググるといいかも。
概念概念うるせーっつーのw
概念が無いな
MSG msg; GetMessage(&msg, NULL, 0, 0); switch (msg){ case WM_〜: 実行内容; } みたいなウィンドウメッセージのスイッチ文ってどうやったらちゃんとできるんですか? 「switch 文の選択式は整数型でなければならない」 というメッセージで弾かれまくりです。
msg.message
>>160 ググったりはしてみたが分からないorz
>159 MSG っていうのは構造体で中に色々入っている。 今回はメッセージ番号を使って振り分けたいのでそのうちの message というメンバを使うため、 switch(msg.message) { // 以下略 となる。
一体どんな本やサイトを参考にすれば ここで詰まるのだろうか。 こういう基本的な所は、もろ「こう書きますよ」って例が書いてあると思うのだが。
その前に型と宣言の意味が分かってないような予感が・・・
いや、単にswitch case文の使い方がわかっていないだけじゃないだろうか。 QBのselect case文は柔軟だからなー。QBって懐かしいでしょ?むふ♥
たしかにオブジェクト指向だったらそうなってほしいよな
基底クラスのデストラクタから、派生クラスの仮想関数を呼びたい。 class A { virtual func()=0; }; class B : public
基底クラスのデストラクタから、派生クラスの仮想関数を呼びたかった。 class A { virtual func(){} ~A(){ func(); } }; class B : public A { func(){} }; どうして出来ない仕様なのか。
派生クラスの実体(インスタンス)の寿命は、 派生クラス自身のコンストラクタで始まり、派生クラス自身のデストラクタで終わるというモデルのため。 基底クラスのデストラクタが呼ばれるとき、そこにあるのは基底クラス部分オブジェクト。 派生クラスのインスタンスがない以上、派生クラスの関数を呼べるわけがないという理屈。
>>162 ありがとうございます。
意味が分かってきました。
とりあえずコンパイルは通ったので、色々試してみます。
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPSTR lpCmdLine ,int nCmdShow ) { MSG msg; GetMessage( &msg, NULL, 0, 0 ); switch(msg.message){ case WM_@ <メッセージがWM_@だったときの処理> case WM_A: <メッセージがWM_Aだったときの処理> } <その他の処理> } というプログラムを組んでみたのですが、何のメッセージも受け取ることができませんでした。 行ごとに「ShellExecute(NULL,"edit","a.txt",NULL,NULL,SW_SHOWNORMAL);」を入れて観察したところ、 やはり、GetMessage( &msg, NULL, 0, 0 );の行で待機状態になっているようです。 なんらかのウィンドウメッセージが送られていて次の行に進んでもおかしくないような気がするのですが、一体何が問題なのでしょう?
ウィンドウ作ってないからでしょ。
ありがとうございます。順序だてて調べてみます。 printfが使えないことに混乱したり、何かごちゃごちゃになっているようです。
グローバル変数を動的に確保することってできますか
グローバル変数でポインタつくっとけば。
/*グローバル変数*/ int *abc; sub(){ /*ここでabc配列を弄りたい*/ } main(){ abc = (int *)calloc(10, sizeof(int)); sub(); } こういうことってできますか?
できるよ。
んー、じゃあソースコードがわるいのか・・・
再度すんません #include<stdio.h> #include<stdlib.h> int *abc; void sub(){ abc[60000000]=5; /*ここでabc配列を弄りたい*/ } int main(){ abc = (int *)calloc(68719476736, sizeof(int)); sub(); printf("%d",abc[60000000]); return(0); } セグメンテーション違反が倒せません
>>180 おまえのPCは64GBもメモリ積んでるのか。
intだから、256GB?
このような配列をCで実現するにはどんな方法が考えられますか
184 :
デフォルトの名無しさん :2009/02/02(月) 19:14:55
256G
メモリ使い過ぎワロタw
186 :
デフォルトの名無しさん :2009/02/02(月) 19:20:24
メモリマップドファイル使え。 一つでは間に合わないと思うので複数同時使用。・
187 :
デフォルトの名無しさん :2009/02/02(月) 19:22:08
うちの環境では、ファイルにマップしても4G程度しか作れなかった。 64個ほど同時に開いて[]をオーバーロードする。
調べてみます、レスありがd
つーか、そんな広大な領域を何に使おうとしてるのか気になる
世界征服
二次元配列で実現できますた
#include<stdio.h>
#include<stdlib.h>
int **abc;
void sub(){
abc[262143][262143]=5;
/*ここでabc配列を弄りたい*/
}
int i;
int main(){
abc = (int **)malloc(262144 * sizeof(int *));
for(i=0; i<262144; i++)
abc[i] = NULL;
for(i=0; i<262144; i++)
abc[i] = (int *)malloc(262144 * sizeof(int));
sub();
printf("%d",abc[262143][262143]);
return(0);
}
気づいたことがあれば、アドバイスくだしい
>>189 ただの実験ですw
実現できましたって・・・いい計算機だな。
>>187 アドレス32bitなら、当然といえましょう。
mainの再起って意味ある? サンプル >int main(void){ >--->static KEY = 0; >--->switch(KEY++){ >--->--->case (0): >--->---> --->puts("KEY 0ぜ"); >--->---> --->KEY = main(); >--->---> --->return main(); >--->---> case (1): >--->---> --->puts("KEY 1ぜ"); >--->---> --->return (-1); >--->---> case (-1): >--->---> --->puts("これでいいのぜ"); >--->---> --->return KEY; >--->} >}
>>191 ちゃんとmalloc()の戻り値がNULLかどうかチェックしてください。
NULL+262143*sizeof(int) がたまたまアクセスできる場所だっただけに
見える。
mallocの戻り値をチェックすることは無意味だよ派がいると思った。 mallocの戻り値がNULLじゃないからといってそこが使用可能な領域かどうかが分からないから、だったかな。
>>199 意味分からん。
NULLだったらダメなのには変わらないだろ。
>>199 そんな派は見たことねー。
NULLのまま突っ走ったら予想外なところで落ちたりたまたま落ちずに誤
動作したりで良いことないので、malloc()の戻り値はNULLチェックする
以外あり得ない。
C++の例外はキャッチしても無意味派と勘違いしてない?
mallocの戻り値をチェックするならprintfの戻り値もチェックしないとな。
Linuxのオーバーコミットと混同してるのかなぁ?
(スコア:-1, フレームのもと)
/.erキモ
207 :
199 :2009/02/02(月) 21:28:25
>>204 確かmallocのmanに、、、と思って見てみたらそれだったようでした。
お騒がせしました。
あと、
>>180 の
abc = (int *)calloc(68719476736, sizeof(int));
ですが、size_tこえてない?
208 :
194 :2009/02/02(月) 21:31:23
>>196 mainの再起呼出を問うてるので、明示的に意味の無いプログラムを書いた。
プロセス途中でmainを使うメリット無いなら、それを回答欲しかった。
今、initとかがmainに置いてあると仮定すると
>void Othello(void){
>--->int i;
>--->for(i=0;i>=0;i++){
>--->--->/* turn(&i);など */
>--->}
>--->puts("リトライしますか? Y/N");
>--->if(getch() == 'y'){ main(); exit(1); } //scanfでも何でも
>}
>int main(void){
>--->static KEY = 0;
>--->//init();など
>--->Othello();
>--->return 0;
>}
こういう使い方は・・・・Othelloとかを再起する方が賢いだろうし
再起しないで、繰り返し文の方がいいのだろうね・・・・(C++じゃ使えないそうだし)
ゲームが進めば進むほどスタックに積んでいくということ?
>>209 全然洗練して無い、発想だけど、そうゆう事。
ゲームが進むと言っても、main呼び出すのは1ゲーム終わる度だし、回数はそんなに多くないと推測した上で。
簡易マルチタスクとか、なんかスゲー利用法とかないんかな?
IOCCCでは常套手段ですな。
別にmain()で再帰しても何も問題ないよ。 ただ、引数に制約があるから使いやすいとは思わないけど。
213 :
デフォルトの名無しさん :2009/02/02(月) 22:02:01
C++って、今年、大幅に仕様が変わってしまうのだろ? 今、C++の勉強を必死にやって、意味ある? 新しいC++の仕様って、Cの最新の仕様みたいに 仕様はあるけど誰も使わない、みたいな感じになったりするのかな
214 :
デフォルトの名無しさん :2009/02/02(月) 22:07:46
これは、問題ありますか? wchar_t pop[]=L"漢字"; if(pop[0]==L'漢') 結果; if(pop[1]==L'字') 結果; あと、char 〜 wchar_Tに変換って難しいですか?
C99よりは、待ち望まれていると思う。 C89で十分と言う人は多いだろうが、C++03で十分と言う人は少ないはず。
>>214 それは9割9分問題ない。
charとwchar_tの変換は、文字列全体を一括してやるならそう面倒な話ではない。
1文字ずつとか数バイトずつとかだと死ねる。
コンパイルの際、どうやら作業領域として環境変数で指定したTEMPフォルダが使われてるみたいなんですが、 もし長大なプログラムをコンパイルする際にこの環境変数で指定した領域が満タンになったら、どんなことになりますか?
>>218 エラーでとまるんじゃね?
ただ落ちるだけかもしれんけど。
VC++だとエラーで止まる。 そんなに大きくないRAMディスクをTEMPに割り当てているので稀に遭遇する。
>194 C++ だと main の再帰呼び出しは規格で禁止されている。 >213 既に部分的に実装が始まっているので誰も使わないってことはないかと。 フルスペックで使えるまでには時間かかるかもしれんが。 変態ライブラリを書くような人間にとっては C++0x は大幅変更だろうが、 利用者側としてはいくつか便利な機能が追加されたくらいなもんだと思う。 少なくとも、勉強したことのほとんどはそのまま役に立つだろう。
222 :
デフォルトの名無しさん :2009/02/02(月) 22:41:37
char x[100]; で、文字配列を宣言 y と z をint型の変数として、 yに文字列の長さが代入 zに文字列中の数字の数が代入 されるようにするにはどうすればいいんでしょう?
224 :
デフォルトの名無しさん :2009/02/02(月) 22:46:51
while文をif文とdo-while文を使って表現せよ という問題なんですが…ifも使わなきゃいけないというところがわかりません どうすればよいのですか??
do-while と while の差が分かれば あとは簡単だろう
>>224 なんでこうばかばかしい問題だすんだろ。
227 :
デフォルトの名無しさん :2009/02/02(月) 22:55:26
whileは条件しだいでは作業が1回も実行されない場合があるんですよね。 while(条件){式} はどのように書き換えたらよいのですか? 初心者なんでわからなくて・・・
>>227 if(cnd){
do{
...
}while(cnd);
}
みたいなこと?
>whileは条件しだいでは作業が1回も実行されない場合があるんですよね。 そこまで分かってるなら、それを if で実現してやればいいだけだろう
宿題スレ以外で答えをダイレクトに教えちゃダメだろ・・・
do{ if(cnd){ ... } }while(cnd);
>>231 だめじゃないけど、空気読んでよw
>>227 判断材料はそろってるんだから、応用力の問題でしょ。
初心者かどうかはあまり関係ない。
>>223 y = strlen(x);
z = atoi(x);
mixiの宿題コミュとか、プロフィールに学校書いてるやつでも平気で質問してるもんな。 あれって、チクるやついないのだろうか。
>>238 mixiはともかく、2chくらいチェックしてるだろ。
その旨、課題に書いてある学校もあるし。
定期的に全大学の教務課に宿題スレや宿題コミュの注意情報を流しています
241 :
デフォルトの名無しさん :2009/02/02(月) 23:17:18
>>236 おお、こんなのあったんですね。ありがとうございます。
242 :
デフォルトの名無しさん :2009/02/02(月) 23:17:58
どうやらこのスレには答えられる人がいないようですね。 仕方ないので新しくスレたてようと思います!
243 :
デフォルトの名無しさん :2009/02/02(月) 23:22:09
int test[0x7777] これってどういう意味になりますか?
int test[アドレス]
配列の要素数だろwww
>>243 define SIZE (7*16*16*16+7*16*16*+7*16+7)
int test[SIZE]
とか?
>>221 ノ 208
0x7777 は3万ちょっとか
>>180 見た後だと何の違和感も感じないな
248 :
180 :2009/02/02(月) 23:55:11
すいませんね!!
>>219 >>220 ありがとうございます。
私も
>>220 さんと同様にRamDisk(約2.7GB)をTempフォルダにしており、
フリーズしたりしないのかと思って聞いてみた次第です。
さっきまでOSが定めるTempフォルダを使ってると気付いてなかったのですが、
「Z:\Temp Files」のフォルダ名にスペースが入ってたのがまずかったらしく、
コンパイル時にZ:\Tempは存在しない的なメッセージが出て気付きました。
Temp領域が狭いと意外なプログラムで問題が出る可能性がありそうですね。
>>249 インターネット一時ファイル置き場も小さいと時々問題が。
>>250 何が起こりますか?
こちらは250MBしか設定してないけど今のところ大丈夫です。
Cで行列演算をさせるために二次元配列を使って表現したのですが、 処理内容を別関数で実装して配列を引数として与えたところ、一行目の要素以外が0.0となってしまいました。 二次元配列A[][]を関数H()に引き渡す方法は main{ ... H(A,y,m,n,i); ... } void H(double B[][n],double b[],int l,int w,int o){ ... } で当たっているでしょうか? nはグローバルで定義しています。 エラーは出ていないので値の引き渡し自体は問題ないと思うのですが…
保存するじゃなくて、実行する?開く?を選んだときに問題があるんじゃね 遭遇したことがないからしらんけど
グローバルで指定した変数にargvから与えています。 汎用性を持たせることが用件にあったので、行列のサイズはある程度可変にしたかったんです。
コンパイルできないんじゃないの?
普通に出来ましたが… グローバル変数は値をあげてやらないと定義できないのでしょうか?
258 :
220 :2009/02/03(火) 00:41:10
>>249 2.7GBもあればまず大丈夫だろう。
俺んとこのRAMドライブ、96MBしか取っていないよ。
インターネット一時ファイルもそこだけど、
問題になりそうなときは別のダウンローダ使う。
スレ違いすまん。
>>257 本当だ。コンパイルできな。
引数の配列のサイズ指定に変数使っても、エラーにならないんだな。
>>260 VC起動するのがめんどうだったから、codepadでコンパイルしたけど、
C99なのかなって気もする。
配列のサイズ指定の方でしたか サイズが可変ということでどうしても変数を使って指定せざるをえなかったので… しかし、なぜか配列内の値がかわってしまっているんです 実行の前後で出力してみたので関数呼び出しの引数引き渡しが原因だとにらんでいるのですが…
>>260 このページは調べている時に見たんですが、その時は関数への引き渡しでエラーを吐いていたときだったので
エラーが無くなった時点で解決した物としてスルーしていました。
もう一度熟読してみます。
>>262 少なくとも、コンパイルできたって事は、何らかの方法で&A[0][0]は渡されているはず。
行列サイズに、変数が渡されたら、例えば初期化値が指定されてたり、
デフォルトのゼロ初期化で関数に通達されてれば、何が起こってもおかしくないのではないか。
>>263 c初級者(not初心者)〜 は読んで損ない、かなり現状を忠実に語ってる文献だと思う
>>264 ようするに、引き渡しには問題はなく、むしろ関数Hの仮引数のサイズ指定がおかしくなっている可能性があるということであってますか?
そちらもにらんで改善策を考えたいと思います。
>>259 C99だよ。可変長配列は自動変数だけでなく引数も対象。
http://seclan.dll.jp/c99d/c99d04.htm#dt19990719 >>252 このまま可変長配列の引数を使うなら、引数の順を並び替えて、
void H(double b[],int l,int w,int o,double B[][w])にしたほうが
グローバル変数使わずに済むのでいいと思う。
引数の順を変えたくなければ、K&Rスタイルで関数定義を書かないといけない。
void F(double B[][*], double b[], int l, int w, int o); //プロトタイプ宣言 アスタリスクもC99
void F(B, b, l, w, o) //関数定義
double b[];
int l;
int w;
int o;
double B[][w];
{
解決しました! やっぱりサイズ指定に変数を使っちゃうとエラーこそでないものの、正しく指定出来ないようです。 今回は配列のサイズ上限として50を指定していたので仮引数のサイズも50として、 実際に数値が入っている部分だけでなく全体を引き渡すようにしたら上手くいきました! アドバイスをくれた方々、本当にありがとうございました! またさんざん調べて解らないことがあったら訊きにきますw
>>266 引数の順番を変えるだけで上手くいくのですか!
そっちもためしてみます!
従来の方法なら、 A 先頭ポインタだけ指定して、関数内でポインタ処理する B 2次元配列でなく、ポインタのポインタで渡せるようにする
関数に直接配列は渡せないから、先頭要素のポインタを渡して参照するってことですよね。 関数に渡した時点で配列ではなくポインタになってしまうのなら始めからポインタ使えってことなんでしょうか?
>>251 遅レスになったが、250MBを超えるファイルをダウンロードできないと思う
そんなヘボな環境あるのけ?おれの環境ではでけたよ。 もしかしてWin?
>>270 配列とポインタには相互に互換があると習いませんでした?
int array[10];
printf("%d %d\n", array[0], *array);
printf("%d %d\n", array[1], *(array+1));
逆も然り。
int buf[10];
int *array = buf;
printf("%d %d\n", array[0], *array);
printf("%d %d\n", array[1], *(array+1));
>>272 WinっていうかIEの仕様。
>>274 >配列とポインタには相互に互換があると習いませんでした?
ネタか?ただ、同じくアドレス返すだけだわな。
int ATAI(int& i , int n) { return *(&i +n); }
この関数も行列と互換あるのか。初めて知ったわ。
因みに、2次元配列って知ってる? sizeofって知ってる?
276 :
274 :2009/02/03(火) 13:38:35
ごめん、流れを把握してなかったw スルーしてください。
277 :
274 :2009/02/03(火) 13:43:13
ちなみにintのサイズを考慮してなかったのは、俺がボケてただけですw
>>271 いいや、一時ファイルの設定量を超えても、ディスクに空きがある限り大丈夫。
そうなったらたしか、ダウンロード終了後即座に削除されるはず。
もうちょっとゆるいタイミングじゃなかったか?削除
>>278 話の流れで250MBのRAMディスクを想定してレスをしたよ。
>>224 その逆は良く使う
do-while嫌いだからif whileで書くことは良くある。俺は
>>282 while(1){
...
if(!cnd)break;
...
}
条件の後にも処理が入れられるけど、どうかな・・・
あー、たまにいるね、そういう人。 i=0; while (i<10) { 〜〜 i++; } とかみたいなね。
if ( ) do { } while ( ); じゃないの?
すいません、昨日大きな配列の件で質問したものです 領域確保&初期化したくてmallocからcallocにしたところ 処理が帰ってきません malloc後にforループで0を代入しても同様でした 何が原因ですかね・・・ たびたびすいません #include<stdio.h> #include<stdlib.h> int **abc; void sub(){ abc[262143][262143]=5; } int main(){ int i; abc = (int **)calloc(262144, sizeof(int *)); if (abc==NULL){ }else{ for(i=0; i<262144; i++) abc[i] = NULL; for(i=0; i<262144; i++) abc[i] = (int *)calloc(262144, sizeof(int)); } sub(); printf("%d",abc[262143][262143]); return(0); }
全部forでいい。
>>286 64ビットなコンピュータ使え。
そして載せられるだけメモリを載せろ。
それが無理なら、自分のコンピュータの搭載しているメモリの量と そのプログラムがいったい何バイト確保しようとしてるか、電卓でにらめっこすることだな。
>>286 そんなに非常識に超巨大な配列で何がしたいの
気になるので教えてくれ
292 :
290 :2009/02/03(火) 20:17:39
>>286 for(i=0; i<262144; i++)
{
abc[i] = (int *)calloc(262144, sizeof(int));
if (abc[i] == NULL)
{
printf("%d個目でメモリなくなりました\n", i);
return 1;
}
}
そんな巨大配列より、超絶深度のポインタでええんでない? メモリ領域をリニアに取るんだからメモリの空き容量じゃなくて、メモリの空き方が元凶だと思う。 int a[10][10][10][10][10]; の配列宣言や、 int *****a; からメモリ確保して 呼び出し関数で、擬似的に連結するなら、メモリの空き容量でかたがつくでしょ?
3次元にしてみます
297 :
295 :2009/02/03(火) 21:07:39
訂正 : 配列宣言や → 配列宣言のように int a[5][5]; の時、(*(a+6) == a[1][0])が常に真なのは絶対保障されてる? 普通に考えると、ただ3次元の配列にしても、1次元と大差なさそうだが。
298 :
295 :2009/02/03(火) 21:09:10
申し訳ない連続ミス : *(a+6) → *(a+5)
intの配列で宣言するのと intのポインタ配列で宣言するのと intのポインタ配列へのポインタ配列(擬似2次元)では まったく同じということですか?
>>299 値を入れる入れ物の数は全部同じ。2次元配列char a[100][1024]を擬似的に扱うなら
1行目は全て100*1024バイト直線的にとって、aに1000個ずつ飛ばして値を読むように教える。
2行目は100個のポインタを定義したあと、1024バイトの領域を100回別に取って、それぞれのポインタに先頭アドレスを渡す。
3行目は、2のような100個のポインタが1列になってる状態の先頭アドレスをポインタのポインタが持つようにする。
(連続的に取るメモリの最大幅 , 入れ物(変数)の数) = 1行目(100*1024,100*1024) , 2行目(1024,100*1024+100) , 3行目(1024,100*1024+100+1)
問題は前者。a[100][100][10]なら、10個ずつ100×100回確保だから動的確保なら確保しやすいんじゃないかと。
厳密な説明じゃないけど。でも、昔4次元配列(50,50,3,3くらい?)を
ポインタで1次元と思って扱ってたら、データの最後の方上手くいかなかったし、
メモリのとり方も単純ではないと思う。
ポインタの概念でアセンブリ言語より融通効くってのは、1次元的なものはあんま関係ないよね?
>>301 彼なら今、256GBのメモリを積んだシステムを構築中だよ。
>>301 俺の知り合いを思い出したw
「おせぇおせぇよ!フリーズしてんじゃないの?」
・・・・HDDのアクセスランプを見ていない彼。
304 :
デフォルトの名無しさん :2009/02/04(水) 00:15:03
すみません、再度まだよく理解できないのですが int test[0x7777] これは、testの変数のアドレスを0x7777とする意味なのでしょうか?
306 :
デフォルトの名無しさん :2009/02/04(水) 00:26:49
>>305 はい。では配列にアドレス指定をする場合はどうすればよいのでしょうか?
>>306 まずその質問の意味がよく分からん。
あるメモリ領域を配列として扱いたいなら、ポインタを使えばいい話。
>>304 0x7777ってのはアドレスじゃないぞ
単なる16進法で書かれただけの数だ
ここでは配列の要素数を表す
アドレスも数の一種だから16進で表すことはあるけど 16進の数だからってアドレスだとは限らない
ここの人たちってやさしいよな。 いやされるぜ
printf("iのアドレス16進%x,10進%d\n",&i,&i); を実行すれば同じ整数である事は分かるだろう。 配列名もアドレスになるが、配列名はポインタと違って変更できない。 因みに、0x0010 = 0010(16) = 16(10) = 普通の16 が理解できるだろうか?括弧は何進数かを表す数学的表記。
>>286 先ずは必要な記憶容量と搭載メモリ容量とOSを教えてくれ。
314 :
デフォルトの名無しさん :2009/02/04(水) 20:02:28
以下のようなクイックソートのプログラムを INT版、FLOAT版で作ろうと思うのですが、どのようにオーバーロードすれば コードが短くすみますか? void QuickSort(int x[], const int nSize, int nLeftIndex, int nRightIndex ) void QuickSort(float x[], const int nSize, int nLeftIndex, int nRightIndex ) INT型のポインタをFLOAT型に型変換してFLOAT版の関数を呼び出すように設計したいのですが・・・
> INT型のポインタをFLOAT型に型変換してFLOAT版の関数を呼び出すように intとfloatではデータの形式が違うから、それは無理。 テンプレート使え。
317 :
デフォルトの名無しさん :2009/02/04(水) 20:50:48
318 :
デフォルトの名無しさん :2009/02/04(水) 21:29:48
2バイトの文字が入っている配列の1要素を4バイトにキャストしたいとおもいます。 このとき、2バイトで0xAABBをキャストしてAABBAABBとキャストすることは可能でしょうか? キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
>2バイトで0xAABBをキャストしてAABBAABBとキャストすることは可能でしょうか? キャストでは無理 >キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか うん
>キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか 符号有りならFFFFが付加する場合もある
321 :
デフォルトの名無しさん :2009/02/04(水) 21:39:31
ソースコード中に0x1111U とかある場合のUって何なのでしょうか? あってもなくても動き的にはかわらないとみていいのでしょうか
それは整数定数の型を指定する接尾辞 Uはunsigned型 他にもあるからググってみ
323 :
デフォルトの名無しさん :2009/02/04(水) 21:45:11
整数定数のunsignedとかまったくよくわからないです
じゃあそれもググれば
325 :
デフォルトの名無しさん :2009/02/04(水) 22:04:13
ぐぐってもでてきませんでした
さすがに定数もぐぐれなかったら、パソコン使うのは不可能だろ
328 :
デフォルトの名無しさん :2009/02/04(水) 23:59:40
以下のコードのnew演算子をmalloc関数に置き換えるとどのようなコードになるか教えてください。 int ** a = new int * [b];
int ** a = (int **)malloc(b * sizeof(int*));
330 :
328 :2009/02/05(木) 00:11:43
>> 329 ありがとうございました。
331 :
デフォルトの名無しさん :2009/02/05(木) 00:15:42
参考書(複数)にはファイル操作のルーチンはあるのですが、 ディレクトリ内にあるファイルのリストを"ディレクトリ名.txt"に 書き出すルーチンがありません。 "<" で指定したフォルダ内のファイル・リストを書き出すコードを 教えてください。
dirent とか readdir とか scandir でググれ。
333 :
デフォルトの名無しさん :2009/02/05(木) 00:51:23
ここはVC++の質問も可能なスレですか?
334 :
デフォルトの名無しさん :2009/02/05(木) 01:31:18
はいどうぞ。
std::vector<int>の配列オブジェクトって vector<int> array(n); for(int n=0;n<5;n++){array.push_back(n);} こうやって for(n=0;n<5;n++){cout << array[n] <<endl;} こういうことは出来るんだけど for(n=0;n<5;n++){if(n==array[n])cout<<array[n]*n<<endl;} て感じで ↑ array[n]で'*''-''='は出来ても'>''<''=='とかは使えないんだよね そうしたいときはarray.at(n)でないと出来ない. なぜarray[n]でも'>''<''=='などの演算子を使えるようにしてないんだ? まあできるように書き換えるか.at()すればいい話ではあるが
できるよ
最初の初期化の意味とその後のpush_backの意味勘違いしてるとか
338 :
デフォルトの名無しさん :2009/02/05(木) 11:06:11
unsigned int p; unsigned int *last = 0; と宣言されているときに、 変数 i のループの中でこんなことをしているコードを見かけました。 *( uint ** )( p + i ) = last; last = p + i; 特に最初のポインタ演算がわからないのですが、*( uint ** )( p + i ) の部 分はどう読めばいいんでしょうか??
pは、実は「unsigned を指すポインタ」の配列の 先頭を指しているポインタなのさ! 宣言するとしたら unsigned (*p)[] かな。 だけど僕にも都合があるから unsigned にしてあるんだ。 だから p[i] にループの一回前のポインタを入れるにも こんな苦労をしなきゃいけないのさ。 まあ、豚の肛門より汚いコードだわね。
340 :
338 :2009/02/05(木) 11:35:32
すみません、最初の宣言部分がおもいっきり間違えていました。 正しくは、こうなります。 unsigned int *p = malloc( ( 1 << 16 ) * sizeof( uint ) ); unsigned int *last = 0; このときに、変数 i のループ内の部分、 *( uint ** )( p + i ) = last; last = p + i; 特に最初の*( uint ** )( p + i ) が頭の中でパーズできません。。。
頭がわるい人はtypedefを使って複雑さを一段階下げるといいよ
>>340 もし
uint **p = malloc(... * sizeof(uint*));
uint **last = 0;
となっていたら、
p[i] = last;
last = &p[i];
という意味。
343 :
デフォルトの名無しさん :2009/02/05(木) 20:24:21
このスレで他人の質問に答えてたらCうまくなりますか?
そりゃ人に教えようと思えば自然と深い知識が身に付くってもんだ 嘘書いたときのつっこみの嵐が怖いから調べる癖もつくしね
俺いつも適当に答えてるwww
>>343 ここの低レベルな回答みれば程度がわかるだろ
初心者です。よろしくおねがいします。 #define N 100000 struct T{ char name[16]; }; int main(void){ static T t[N]; for(int i=0;i<N;i++){ cout << t[i].name << endl; } } とするとnameの中にへんな文字がはいってしまいます。 初期化はどのようにやったらよいでしょうか
C++ならコンストラクタ使えば?
char なら memset で 0 で埋めれば
static T t[N] = {0};でいいじゃない。
>>349 よくみたら、static変数だな。
staticって、0で初期化されるんじゃなかったっけ?
VC2008で確認したら0初期化されてた
>>349 やってみたけど中身は空だったけど?
コンパイラは何よ?こちらはVS2008
>>350-355 コメントありがとうございます。
>>355 g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
nameにはランダムな文字列を代入したいんですが
char c[63];
int k=0;
strcpy(c,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
strcat(c,"abcdefghijklmnopqrstuvwxyz");
strcat(c,"0123456789");
for(int i=0;i<n;i++){
k=rand()%62;
rc[i]=c[k];
}
のようにしてから
for(int i=0;i<N;i++){ cout << t[i].name << endl; }
すると変な文字が混ざっていたので初期化ができてないのかな
と思いました。自分には原因がわかりませんでした。
ちょwwww
情報小出しにすんな 症状が再現する最小限のソースを貼れ
これで大体全部です
rc[]がだいたいないじゃん 全部貼れと言ったんだ
もう貼らなくてもいいよ。
いつまでも一人で悩んでろ
とか言いつつ、貼られたら大喜びで教えちゃうんだろ? おまえら。
どうせrc[]もstaticにあってまだ呈示されてないソースでオーバーラン してるだけちゃうんかと
結局、変かどうかは主観に基づくからね
>>362 rc[]は関係ないと思うんですよ
やはりこれだけでは分からないのでしょうか?
>>368 原因はオーバーランして、T[]の領域まで書き込んじゃってるだけだろ。
具体的に指摘して欲しかったら、コードを貼るしかないよ。
俺はわかったよ ただそれを書くには、ここは余白が狭すぎるんだよね
Microsoft Visual C++ 2008 Express Editionでソリューションを選択してソースを表示した時に 自動的に検索ウィンドウが開いている状態にする方法は何かあるのでしょうか?
stringクラスに日本語をつっこんだときは日本語の2バイト文字として認識されているんじゃなくて 半角の1バイト文字列*2で認識されてるんですか?
3バイトかもしれない 処理系依存
>>375 ただのchar型整数の連続としか認識してないと思う
>>375 「ナニ角だか知らんがcharが2バイト」
C++で日本語処理は大変さー #define T 3; とかで決めた変数って"=="や">" "<"の演算子使えないの? if(num==T)とかすると error C2059: 構文エラー : ')' error C2143: 構文エラー : ')' が ';' の前にありません。 ってエラーが出るんだけど
#define T 3
∧∧ ヽ(・ω・)/ ズコー \(.\ ノ 、ハ,,、  ̄  ̄
あ、セミコロン要らないんですね。 回答ありがとうございます
殺伐としていた気分がすっかり和んだ。
384 :
デフォルトの名無しさん :2009/02/06(金) 14:08:32
下記の二次元配列を渡している処理をC++からCに直すにはどう修正すればよいか教えて下さい。 ABS関数の中の"?"とか":"とかが何をするのかすらわかりません… /* 呼び出し元 */ if (ABS(a[I][iCol]) > ABS(a[iRow][iCol])) /* 関数本体 */ template <class T> inline T ABS(T A) { return A >= (T)0 ? A : (-1) * A; }
?とか:はCにもあるだろ
if(A >= (T)0) return A; else return (-1) * A;
型が int/float/double なら、わざわざ独自関数にするまでもない。 それぞれ abs()、fabsf()、fabs() 呼ぶだけ。
388 :
384 :2009/02/06(金) 15:17:16
>>386 そういう意味だったんですね。
>>387 配列の型はdoubleです。
fabs関数を呼ぶことにします。
勉強になりました。
ありがとうございました。
389 :
384 :2009/02/06(金) 15:39:12
下記の関数のような処理についても標準関数ってあるのでしょうか? 連投でスミマセン… /* 呼び出し元 */ SWAP(a[iCol][J],a[iRow][J]); /* 関数本体 */ template <class T> inline void SWAP(T & A, T & B) { T Temp; Temp = A; A = B; B = Temp; }
>>389 std::swap
その呼び出し元でいけるかは、知らん
型知らんし
391 :
389 :2009/02/06(金) 15:50:48
>>390 型はdoubleです。
すみません、また書き忘れてました。
392 :
389 :2009/02/06(金) 15:55:53
Cではstd::swapにあたるものは無いみたいですね。
for(; i > 0; ) { 〜〜〜〜 scanf("%d", &i); } 試験で↑をdo文で書き換える問題を下のように答えたら減点されました。 何がいけないんでしょうか? (iの初期化値は触れられていません) if(i > 0) { do{ 〜〜〜〜 scanf("%d", &i); } while( i > 0) }
>>393 whileの後にセミコロンがないから?
>>394 いや、付けてました。それは写し忘れです。具体的に言うとifの部分がばっさり×になってたんです。
if取ったら動作が違ってきますよね?iの初期化値が負だった場合とか。
ということを先生に伝えてみたら?
397 :
デフォルトの名無しさん :2009/02/06(金) 20:35:33
プログラミング教えてる先生なんて、 そうっとー てきとーだからなw ほんとにてきとーだぞ 普通こんなミスするかよ・・・ やる気無いとしか・・・ ってミスをする。 おまいもてきとーにかんがえたほうが良い
なんにせよ、試験の解答はすべて聞いた方がいいと思うぞ 勉強になるだろうし、センセってのは質問を受けると喜ぶ変態が多い
399 :
デフォルトの名無しさん :2009/02/06(金) 20:51:03
std::stringは分かるんだけど、 std::wstringの使い方を解説してくれている わかりやすいページない? わかりやすいの基準は様々だろうけど俺の今の技量水準はSTLとかテンプレートとかは理解しているくらい。 ただしロケーションあたりの理解はだいぶ乏しい。
セミコロンいらね
std::wstringの使い方は・・・ std::stringと同じだよ。
>>400 char string
wchar_t wstring
だろ。
対応からわかるだろ
>>400 ないな。locale関係を解説してるサイトなんて俺の知る限り無い。
メンバ関数使うだけならstringから類推すればいいし
locale はコンパイラがまともに対応してない事もあるしな・・・
ロケーションってのはlocaleのことか 普通はたぶん↓のどっちかを最初に書いとけばOK std::locale::global(std::locale("japanese")); std::locale::global(std::locale("japanese", std::locale::ctype)); 上は数字を入力した場合の3桁毎のカンマ文字あり、下はカンマ文字なし あと、VC++の場合wcoutはバグが残ってるのかもしれんから気をつけろ
内部の動作は、wcharつかっても入出力はcharにしとけよ。表示するときに wchar -> charにする
408 :
406 :2009/02/06(金) 22:04:06
追記 カンマ文字ってのは wostringstream wos; wos<<1000; とかやる場合の話でござる
"japanese"じゃなくて""でお任せにしておけばいいじゃない。 あと、wcoutとかwcinなどにはimbueで明示的に指定しないとだめという話も。
C始めたいんですが何をインストールすればいいんですか? windowsのはインストールできません
OS書けよw
415 :
デフォルトの名無しさん :2009/02/07(土) 01:54:09
質問があります。 <と==を定義しているクラスMyClassがあって bool MyClass::operator<(const MyClass& m); bool MyClass::operator==(const MyClass& m); これをstd::multimapに入れました。 std::multimap<int, MyClass> mm; このmmに対して、 mm.insert(); でoperator<()が呼ばれるのは確認できたのですが mm.find(); でoperator==()が呼ばれません。 何故でしょうか?
findの対象になるのはintの方
>415 >416 の通りなんだけど仮に MyClass がキーだったとしても operator==() ではなくて、 !a.operator<(b) && !b.operator<(a) として判断が行われる。
418 :
デフォルトの名無しさん :2009/02/07(土) 09:02:48
int numnum #define RET numnum #define GOU *(unsigned short*)(RET+0x123U) というのがあって、 GOU = 10 とソース中に記述すると どのような動きをするのでしょうか? numunumのアドレスに対して+123を足しているのでしょうか? numnumのアドレスが0x800000だったら0x800123番地に10がセットされるのでしょうか?
hensu |= daisu このとき、hensuとdaisuに最初1がはいってた場合、 hensuは2ではなくて1になるのでしょうか?
>>415 等値と等価だね 詳しくは Effective STL 読んでくれ
>>418 shortが2バイトなら、0x800123と0x800124に上位と下位に分けて格納されるか、バスエラーを起こす。
P[i].nameに関数funcで得た文字列を代入して実行したときに abcd-ABCDEFGHIJ abcd-ABCDEFGHIJ abcd-ABCDEFGHIJ .... と出力されるようにしたいのですがどうしたらよいでしょうか struct Person{ char name[16]; }; class Func{ public: void func(const int&, char[]); }; int main(void){ static Person P[10]; Func F; char c[11]; for(int i=0;i<10;i++){ strcpy(P[i].name,"abcd-"); F.func(10,c); strcat(P[i].name,c); } for(int i=0;i<10;i++){ cout << P[i].name <<" "; } cout << endl; return 0; } void Func::func(const int& n, char c[]){ char tmp[11]; strcpy(tmp,"ABCDEFGHIJ"); for(int i=0;i<n;i++){ c[i]=tmp[i]; } //cout << c << endl; }
F.func(11,c);
void Func::func(const int& n, char c[])
なぜ、参照渡し?
>>424 みたいに直値でわたせるっけ?
const int& は即値をバインドできる 正確には即値がコピーされて渡され関数終了後に消滅する
でも組み込み型は普通const 参照にはしないな
>>418 munmunのアドレスじゃなくて値
int munmun = 0x800000;
ならそうなる
>>424 ありがとうございました。
>>426 >>427 void Func::func(int n, char c[])
のようにしたほうがよいということでしょうか
431 :
デフォルトの名無しさん :2009/02/07(土) 14:32:07
>>416 >>417 ありがとう。
>>415 は間違いでした。
>>417 の指摘の通り
×std::multimap<int, MyClass> mm; ではなく、
↓
○std::multimap<MyClass, int> mm; の場合です。
432 :
デフォルトの名無しさん :2009/02/07(土) 14:35:57
>>471 そう言うのは何を見ればわかりますか?
VC++のオンラインマニュアルには「Finds an element that matches a specified key.」としか書いてなく
どうやってmatchesを判定するのか書いていませんし、
「C++ STL multimap find」とか「std::multimap::find 比較」とかでググっても出てきません。
433 :
デフォルトの名無しさん :2009/02/07(土) 14:36:54
>>421 Effective STL を読んでみます。ありがとうございます。
>432
STL には色々と落とし穴も多いので Effective STL は読んどくべき。
で、君が見ているのは STL じゃなくて STL/CLR のオンラインヘルプではないかね?
STL はこっち。
ttp://msdn.microsoft.com/en-us/library/9987620f.aspx > Remarks
> The member function returns an iterator that addresses an element in the multimap
> whose sort key is equivalent to the argument key under a binary predicate that induces
> an ordering based on a less than comparability relation.
これで分かれっちゅうのも酷な話だと思うが。
>そう言うのは何を見ればわかりますか?
今回は find に固有の挙動ではなくて associative container(set とか map) 一般の挙動についてなので、
set とか map の使い方を説明してるところでは書いてあるんじゃない?
最良の資料は規格だろうけど買えってのも厳しいとは思うので前の版の C++ 規格の最終 draft なんかも参考になる。
ttp://www.hep.wisc.edu/~pinghc/isocppstd/lib-containers.html#lib.associative.reqmts
435 :
デフォルトの名無しさん :2009/02/07(土) 15:59:17
>>434 >STL はこっち。
そちらも見ましたよ。
「equivalent」がボールドになっていたのが意味不明だったのですが、これが
>>421 の「等価」ですね。
>set とか map の使い方を説明してるところでは書いてあるんじゃない?
日本語で記述されているところにはありませんでした。
最後のリンクを参考にしてみます。ありがとうございます。
436 :
デフォルトの名無しさん :2009/02/07(土) 16:04:09
>>417 それならば、find()でoperator<()が呼ばれるはずですよね。
operator<()とoperator==()の先頭にブレークポイントを付けているのですが、
find()のときにはどちらも呼ばれません。
何故だろう。。
まさかとは思うが、インライン展開されているなんて落ちはないよな。
438 :
デフォルトの名無しさん :2009/02/07(土) 16:08:14
operator<()とoperator==()についてですが、 クラスの宣言の外で定義して、inline指定もしていませんので、 インライン展開はされていないと思います。
インライン展開の判断はコンパイラが勝手にする。 ブレイクポイントを張るには、それを禁止してやらないといけない。 必要なら、ブレイクポイントではなく何かstd::cerrにでも出力してみればいい。
まあ、VCならデバッグビルドすれば最適化オフが標準設定だけどな。
未だに GCC 4.0.1 を使ってるんだけど、 setlocale すると必ず死ぬし、まともにワイド文字列も扱えない様子。 4.3.3 にしたらこのあたり改善されてるの?
それホントにgccの問題か?
ワイド文字列の日本語を出力しようとすると ? になんだが、 そう言われると確かに g++ の問題ではないかもしれない。 環境は MacOSX 10.4.11 だけど、ターミナルの環境設定が何かまずいのかも? でも、setlocale で死ぬのは流石に関係ないと思いたい。 というか、setlocale じゃなくて std::locale::global だった。すまん。 std::locale::global(std::locale("japanese")); terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_S_create_c_locale name not valid Abort trap
>443 locale 文字列で "japanese" が通るのは VC じゃないのか? "" か "ja_JP.UTF-8" とかでどうだ?
445 :
436 :2009/02/08(日) 10:08:59
>>439 >>440 の通りだと思いますが、念のためstd::cerrに出力するようにしましたが、やはりfind()でoperator<は呼ばれません。
なぜでしょう。
446 :
439 :2009/02/08(日) 10:25:06
私に聞かれても知らんよ。状況を再現する最低限のソースでもあればgccで追試くらいはしてもいいけど。
447 :
436 :2009/02/08(日) 10:32:46
>>446 intとMyClassが反対になってますが、それ以外は
>>415 の通りです。
完全なコードが必要であればあとで貼ります。
今出先なので。。
mainの中でstaticに宣言した構造体のメンバーnが二重ループの中にある funcによって書き換えられるプログラムです。 実際にはfuncの部分はもっと長いです。jに関するループを出た後、T.nが -2147477599になってしまうことがあります。Tの寿命はmainが終わるまで ずっとあってメンバーの値を参照渡しして変えると変更された値は保持さ れていると考えたんですが間違いでしょうか struct Temp{ int n; }; class Func{ public: void func(struct Temp&); }; int main(void){ static Temp T; Func F; T.n=0; for(int i=0;i<100;i++){ cout << "A" <<T.n <<" "<< &T.n << endl; for(int j=0;j<100;j++){ cout << "B" << T.n <<" "<< &T.n << endl; F.func(T); cout << "C" << T.n <<" "<< &T.n << endl; } } return 0; } void Func::func(struct Temp& T){ T.n=T.n+1; }
>>448 VS2005だとならないな
考え方も間違ってないので実際のfuncが間違ってるとか
"ja_JP.UTF-8" でも死んだ。 Mac で最新の GCC 使ってる人がいれば、 このあたり大丈夫かどうか教えてもらえれば助かります。 GCC 更新するの時間かかるし、 それで効果無かったら泣けるしね・・・。
#include<stdio.h> int main(void ) { FILE* ofp; ofp = fopen( "test.txt", "w" ); fprintf( ofp,"テスト\n"); fclose( ofp ); return 0; } こんな風に書いたプログラムをデスクトップ上でファイルをドラッグ&ドロップして実行した時だけ、 test.txtファイルが出力されないのはなぜですか? 普通にクリックしたりコマンドプロンプト上で動かすときはtest.txtファイルが出力されます。 自分用にファイルを変換するツールを作りたいのですが困っています。
相対パスだから
よく探してごらん、どっかに出来てるよw
>>451 GCC4.3.2 でも死ぬ。
locale -a にある全てのロケールを試したけど、C と POSIX 以外通らない。
なんでこんなに腐ってるんだ。
>>455 おお、ありがとうございます。
やはりGCCはロケール未対応と考えた方が良さそうですな・・・。
難しい話をしているところ申し訳ないが、 そもそも、std::locale::globa()lって何の効果があるもんなの? ググってサンプルをg++でコンパイルしてみたら、 wcoutはstdのメンバじゃないよ、的なエラーがでるし・・・
って、CとPOSIXは通るんだ。
ワイド文字で ? になるのは、 wchar_t ch; std::wcin >> ch; としても入力が UTF-8 で行われるから、 ということだと判明した。 どうすればいいんだ・・・。
#include <clocale> setlocale(LC_ALL, ""); wchar_t ch; std::wcin >> ch; std::wcout << ch << std::endl; これなら一応正しく動くな。
本当だ! なんという盲点。 ありがとうございました。
遅レスでごめん。 お答えくださった方々有難うございます。 wchar_tってやっぱりカオスなんだねぇ。 なんかよくマルチプラットフォームの開発環境ってさまざまなエンコードに対応した 自前の文字列クラスを用意しているけど、これってまさかwchar_tが あまりにもクソだからですかい?
>>457 wcoutが使えない、ってCygwinか?
Cygwinは腐る以前にそもそも何もない。
wchar_tで入出力しなければいい。 内部操作だけで使う。 2バイト、1バイト文字がそれぞれ1文字になる点、 ファイルアクセスで長いファイル名やJISなどで対応できない文字にアクセス出来る点 が便利。
>>463 そう、Cygwin
gccならなんでも同じだろうと思ってたけど、違うものなのね・・・
>>464 charで入出力して、中でwchar_tに変換して使うのかな?
すまん。APIで対応している場合はつかっていい。 しかし、言語を出力するときは、wchar_tだと予定通りにならない場合がある。 charなら一通りの出力しかない
Cygwin の gcc ってバージョンいくつだっけ?
手元のはこれ。最新かどうかは知らん。 -- gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
やっぱりまだ3.xだったか。 今は4.3.3だよ。
インストーラで、4.3.xのバイナリも別途導入できるよ。 もちろん、libcが駄目なことに変わりは無いので、wchar_tが使えないのは変わっていないはず。
a=1; b=2; c=3; d=4; のとき a=b=c=d=0; とするとa,b,c,d全てに0が代入されますか
はい
>>471 ああ、それは--input-charset=cp932もsetlocale(LC_ALL,"")+wcoutも使える優れ物だ。
boost::wsmatchの確認に重宝してるよ。
コンパイラとライブラリの区別がついてない人がいるな。
最近はコンパイラがライブラリの知識を持ってるぞ。
それはない
プログラム全体の計算時間とそのプログラム内のある関数の 計算時間を測るようにしたいです #include <time.h> int main(void) { double Telaps0,Telaps1; double telaps0,telaps1; Telaps1=Telaps0=clock(); for(int i=0;i<1000;i++){ telaps1=telaps0=clock(); hoge();//何かの関数 telaps1=clock(); Telaps1=clock(); cout << (double)((telaps1-telaps0)/CLOCKS_PER_SEC) <<" " << (double)((Telaps1-Telaps0)/CLOCKS_PER_SEC) << endl; } return 0; } 実行すると 0 0 0 10 0 45 となってhogeの計算時間はいつもゼロです。 また全計算時間のつもりの二列目の数字も負になることがあります。 どうなおしたらよいでしょうか
(double)((telaps1-telaps0) / ↓ ((double)(telaps1-telaps0) /
>>478 hoge( )の処理が1秒以内で終わるからでしょ
clock( )の値はオーバーフローして0に戻ることもあるから負になっても不思議はないよ
そんなことよりさ
どうしてdouble型を使ってるの
ああ少数で表示したいからdoubleなのか
>>480 >>481 hoge()は数分かかります。内容は質問に無関係だと
思いましたので省きました。
>>482 小数点ありで表示したいです。勉強不足でオーバフローがどうい
うことなのかわからないんですが絶対値をとるだけでもよいでし
ょうか
ゼロになるのは処理時間が短すぎて計測できてないから。 負になる理由はオーバーフロー以外考えられないな。
アンパサンドの実態参照が見えちゃってるよ
そのまま貼れるようにしたんだよ
C++の例外で手っ取り早くthrow元の関数名か行番号を表示させる方法ってある? 新たに例外クラス作ったりせず標準機能で throw std::error_message("エラー"); みたいにすると勝手に関数名や行番号が付くと有難い。 linuxとwindowsでそれぞれよろしく。
まず __LINE__ __FUNC__は知ってるのか?
>>492 もちろん知ってるよ。
そういうのを使って自分で書かなくてもいいように標準機能が用意されてないかなと思って。
同じようなこと皆するんだから、ありそうでしょ?
ないんですよ。それが。
VC++なら例外投げられた所で止まらなかったっけ? デバッグ実行してたら
>>484 hoge()
は
void hoge(x,y,z){....}
....の部分はいろいろな演算をしています。
....によっていろいろな値になるということでしょうか
プラスになるかマイナスになるかはどうやって見分けた
らよいのですか
>>486 オーバーフローについて自分にわかっている範囲で原因を
考えると
>>478 のループを繰り返す間にTelaps1がとりうる
値の範囲以外の値がはいってしまうということですか
大きな桁の数字がはいってオーバーフローだとするとこれ
をさけるために例えば
Telaps1=(double)(clock()/CLOCKS_PER_SEC)
のようにすれば回避できるんでしょうか
doubleの位置指摘してくれてるのになんで直さないの?
どうでもいいけど、そのサイトの色使いひどいな。目が痛くなる。
>>497 >>486 で主に指摘してるのはオーバフローの件じゃない
まさか一回のfunc()に数分もかかってるわけ無いだろうから、1000回で数分だろ?
だとすれば一回は一秒以下だからお前の計算じゃ毎度0になって当然
502 :
デフォルトの名無しさん :2009/02/10(火) 00:09:10
>>494 そうですかー。みんなで車輪の再発明大会ですか。。無駄だなー。
>>495 デバグならね。コールスタックが残ってるからわかるね。
でも、リリースでもわかるようにしたいんだ。
503 :
499 :2009/02/10(火) 00:09:28
柴田望洋さん(の後援会のHP)だったような。 標準C/C++の仕様を比較して教えてくれているところで、用語が正確だから俺は好きだった。 (今も好きだがもう見る機会がない。)
結構好きなサイトだった。 多少上達してからは使わなくなったけど。
質問1 int func(std::string str)とint func(const std::string& str)のそれぞれのメリットとデメリットを教えてください。 記述をすっきりさせるために出来れば前者だけを使いたいです。
質問2 STLのコンテナにはコピーが入るのですか?参照が入るのですか? 参照を入れようとすると参照が2重になって怒られるので、きっと参照が入るのだと思うのですが そうだとすると、クラスメンバーのstd::list<MyClass>にローカルオブジェクトを入れると関数から抜けたときにオブジェクトがなくなって問題になりそうです。 どちらなのか分からなくなったので、教えてください。
>>505 前者はコピーのコストが生じるので後者に統一するのが無難
>>506 コピーなので
コピーコンストラクタに従う
>参照を入れようとすると参照が2重になって怒られる
多分お前のコードが別の理由でおかしいんだろう
>>508 >多分お前のコードが別の理由でおかしいんだろう
いや、
std::map<int, MyClass&> mm;
とかやると、エラーが出るでしょ?知らない?
>>507 わかりました。
STLのコンテナに入れる時もconst std::string&の方がいいですか?
512 :
デフォルトの名無しさん :2009/02/10(火) 00:35:13
今年、C++の仕様が変わるらしいけど、 かなり勉強し直さなくちゃいけないの? せっかく覚えた難解変態仕様が、無駄になるってこと?
>>509 std::vector<X> v;
として
v.push_back(X())
とかやったときにX の参照が格納されるのかどうか、っていう意味だと思ったんだ
>>513 その場合はどうなるの?
X()がスタックに生成されて、それがvector::push_back(const X& val)に渡されて
push_back()の中でvector::data[n] = valみたいな感じでコピーコンストラクタが呼ばれてヒープに格納されて、
最終的に呼び出し元のスタック上のXは居なくなっても大丈夫ってことでおk?
>>514 ついていけてるプログラマが1割以下なんだから、全部ダメダメだろ
プログラマが1割以下 どこでどうやって確率求めたよ?
>>512 これまで通りに書いても問題ありません。
MS謹製言語じゃあるまいし。
10年ちょっと前、オレがC++の独習していた頃は、 教科書に「テンプレートは用途がイマイチ不明だが、まあこんなのもあるよ」ってなことが書かれていた。 STLがネット上に公開されたより後だから、入門者がどれだけ付いていけてなかったの証左だと思う。
まあ、初心者が書いたようなものを教科書にするなという査証にはなるな。
そりゃそうだろ。世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
そんな縛り儲けたらそれこそピアソンぐらいしか選択肢なくなるじゃん
いや、入門書は初心が書いていると割り切って、とっとと卒業するくらいじゃないと使い物にならないってことだよ。
527 :
デフォルトの名無しさん :2009/02/10(火) 13:31:57
>>524 みたいな奴ほど、自分は出来ると思い込んでいて
まともな著書も出版できないんだぜw
528 :
524 :2009/02/10(火) 13:40:41
大丈夫、説明文書くのが苦手なのは自覚しているから、入門書を出版しようなんて妄想さえしていないから。 まぁ、雑誌の記名記事なら物したことがないわけじゃないけどね。
530 :
デフォルトの名無しさん :2009/02/10(火) 14:57:09
C++じゃなくCだけど、マクロのundefみたいに変数宣言や関数のプロトタイプ宣言を 取り消す方法は無いの? winsock2.hをincludeしてws2_32.dllを動的リンクで読み込んだ時に 本来の関数名(WSAStartupとかsocket)にアドレスをGetProcAddressで 取得したいんだけど、当然と言うか既に定義されてしまってる名前だから不具合が。 winsock2.hから定義部分を取り除いて使えば出来たけど 改変ヘッダファイルをソースに同梱して配布するのに問題は無いかとか コンパイラ依存部はどうするかとかあるし。
>>530 winsock2.hは良くできたヘッダだから、
#define INCL_WINSOCK_API_PROTOTYPES 0でプロトタイプ宣言消えるぞ。
INCL_WINSOCK_API_TYPEDEFSも便利だよな。
>531 そんな機能があったとは!thx。
そのクラスが継承される時を考えて。 前もってメンバ関数を全てvirtualにしておくべき という考え方もアリ? それともパフォーマンスが悪くなるから全部virtualだなんて止めろって考えるべき? 俺の思想はどっちにしたらいいの?
534 :
533 :2009/02/10(火) 15:49:06
そのクラスじゃなくて ある自作のクラス です。。。
本当に継承なんてするの?
>>535 しないかもしれません。
てかしない可能性のが高いです。
それでもメンバ関数を全てvirtualにしておくべきなのか、そんな極端なことは止めるべきなのですか?
コードの上ではvirtual指定された関数は多態である可能性を示すよりむしろ 現時点のコードで多態であることが確定していることを示すんだから付けない方がいいんじゃないかなぁ それにあるクラスの全メンバにvirtualを機械的に付けるより不要なvirtualキーワードを取り除く方が難しいし
>>537 わかりやすい説明ありがとうございます!
危うく間違った変なコーディングの道に迷い込んでいくところでした。。。
539 :
デフォルトの名無しさん :2009/02/10(火) 16:38:36
524 名前:デフォルトの名無しさん 投稿日:2009/02/10(火) 13:22:19 そりゃそうだろ。世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。 世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。 初心者レベル以下の連中が書いたものなんだから。 初心者レベル以下の連中が書いたものなんだから。
540 :
デフォルトの名無しさん :2009/02/10(火) 16:42:25
>>529 口ばかり達者で、お前の実力を示すものを世に公表していない
無名のクズが何ほざいてやがる?こんなスレで偉そうにしているお前が
どこの誰かこっちには分からないが、プログラム以前に、人間として
レベルが低いことが窺えますねw
541 :
デフォルトの名無しさん :2009/02/10(火) 16:44:48
>>524 は自分で言っておきながら、ものすごい勘違いをしている。
入門書、この時点で対象としている人のレベルのこともあるんだがw
頭の弱い奴って、結局 自分のこと や 主観 でしか話が出来ないから
他人から嫌われているって気づかないんだよねw
お前らが有名人なら、恐らくこんな場所ではなく、もっと別の場所で
活躍しているだろう。要するに、お前ら小物が言う発言なんて重みがない軽々しい
思いつきのようなもの。そこまで言うなら、お前がそうだと思う入門書を
具体的に示せ。まぁ、事実無根なら ただの名誉毀損 で、お前らが有名人だったら
逆に訴えられるよw
×初心者レベル以下の連中が書いたものなんだから。 ○初心者レベルの人に対して書いたものなんだから。 日本語って難しいでちゅねw
初心者レベルより下ってないよな。 犬がキーボードたたいているような物ってことかwww 527==539==541 なことは誰が見ても明らかだから、おとなしく引っ込んでろよ。 とりあえず氷をなめると頭冷やせるよ。
544 :
デフォルトの名無しさん :2009/02/10(火) 16:52:00
あっ、早速、口先だけで実力も著書も出版できないヘタレ初心者が必死にファビョりましたよw お前に実力があるなら、言葉でなくてコードで示せ。まぁ、この世は所詮、商売、金儲けが 資本主義では勝負となるんで、ほいほいと商業用のコードなんて出せるわけねーよなw だからあんな出版物も、初歩的なんだよ、分かったか、小僧? 簡単に手の内を見せる奴は、この勝負の世界では勝ち残れない。
初心者レベルのタイプだけ早い糞が必死なスレはここですか?
みなさんお見苦しいところをお見せして申し訳ございません。 /////////////////////////////////////////////////// 527==539==541==544 火病の意味(正式な用語としても2ch用語としても両方とも)を調べて来い。 あとこれ以上汚したくないから、俺とおまえで一緒に書き込むの止めないか? 例えばおまえの読点(わかる?「、」って意味だよ?)が多い汚い書込が増えたらやだろ?
似非中級者が初心者を見下すスレなんですね、ここは?w
>>540 >どこの誰かこっちには分からない
けど
>口ばかり達者で、お前の実力を示すものを世に公表していない
>無名のクズ
だと思うのですね.
のうたりん? :)
著書もない無名の雑魚が、必死に初心者を弄って楽しいかい?w 悔しかったら、1冊でも出版して、ここで報告しろよ?お前の著書が へぼへぼだったら、こてんぱんに批判してやるからw
お、今日はここか。
組み込み型⇔組み込み型: static_cast 値⇔ポインタ: reinterpret_cast この二つはいいとして、ポインタ⇔ポインタはどちらを使えばいいのでしょうか? reinterpret_cast<Base *>(derived_pointer)->ほにゃほにゃ といった感じで使っていたのですが、 継承関係のクラスも含め、ポインタ関連は全てreinterpret_castでも問題ないのでしょうか?
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
再開
>>553 ダウンキャスト・クロスキャストのように失敗する可能性のあるものはdynamic_cast。
ただし、絶対に成功するならstatic_castでも良い。
アップキャストは暗黙変換可能。
継承関係のない型同士(int*→char*など)はreinterpret_cast。
他のポインタ型からvoid*へは暗黙変換、void*から他のポインタ型へはstatic_castで良いが、
共にreinterpret_castを用いる流儀もある。
const/volatile外し(char const*→char*など)はconst_cast。付けるほうは暗黙変換で。
暗黙変換を明示したければ、static_castで置き換えられる。
>>556 それを人間に使い分けさせるなんて危険だよなー
C++が如何に糞言語かがよく解る
何言ってるんだ? キャストミスったらコンパイルエラーになるから問題ない。 Cなんてキャストミスっても素通りだろw
「絶対に成功するなら」ってあるけど、絶対に成功するかどうかってコンパイラが判断してくれるの?
それはユーザが判断する。 基本的にダウンキャストやクロスキャストは dynamic_cast で行うべきだが、 明らかに成功する場合(CRTP など)には、 速度を優先して static_cast を行う場合もある。
しかしその明らかに成功するという根拠をコードで示せないのが悲しいところかな 0xはではそういうのも可能になるのかなぁ
CRTP絡みで、仮想関数がないからdynamic_castが使えないという事情で使う場合もある。 どうしてもstatic_castでダウンキャストしたいというときには、 dynamic_castによるアサート付きのBoostのpolymorphic_downcastがお勧め。
class X { public: virtual void show() {std::cout << "X" << std::endl;} }; class Y: public X { int x; public: virtual void show() {std::cout << "Y" << std::endl;} }; class Z: public X { public: virtual void show() {std::cout << "Z" << std::endl;} }; int main() { X *x; x = new Z; Y *y; y = static_cast<Y*>(x); y->show(); } としたら、コンパイル通ってなんか動くんですが、 これはいわゆるたまたま動いてるだけという奴?
GUIアプリケーションを作る際にどんなソフトをしたらよいでしょうか?
今なら何でも作れそうだけど、環境の縛りが少ない、Qt+Eclipse CDTが好きかな。
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; for(int i = 0; i < 3; i++){ srand( (unsigned)time( NULL ) ); int A = rand() % 3; cout <<A; } forが回る度に違う乱数を取得したいのですが、 どうも同じ乱数を取得してしまいます(0と0と0など)。 どうすればいいでしょうかね?
srand( (unsigned)time( NULL ) ); for(int i = 0; i < 3; i++){ int A = rand() % 3; cout <<A; }
バカに付ける薬は無い
>>556 , 559
ありがとうございます
根本から勉強し直します
>>571 いやだから
絶対通るようなコーディングの場合は…で、
通るかどうか不確実な場合は…で
っていう使い分けだっつってんじゃん。
君は言語仕様に君のケツを拭いてもらわねばならない人なのかね?
釣られてどうする
576 :
574 :2009/02/10(火) 22:21:27
そもそも危険なキャストを行うようなコード書いてる事が問題だ
>>502 それを車輪の再発明と言ってしまうのはちょっとひどいようにおもう
WinAPI叩いてるとポインタと整数キャストの連続なんだが これスマートに64bit化できんのかな
>>578 おもうのは自由だけど、
プログラマが100万人いたら、100万同じようなコードが生成されるのは、車輪の再発明以外の何物でもないよ
>>579 ポインタと同じ大きさの整数型を作るってのがWinAPIでもC/C++でもその他あちこちで流行。
(U)INT_PTRとかW/LPARAMにLRESULT、(u)intptr_tなどなど。Windows界隈ではsize_t/ptrdiff_tも該当。
ダイアログプロシージャの戻り値がBOOL→INT_PTRなど、ところどころ暴挙も見られるが。
windowsはLLP64だから移植は楽そう でもそのままだと効果薄そう
>>582 レジスタが増えた分の効果を期待してもいいだろう。
でもVC++なんかを見ると まだレジスタ余ってんだから使えばいいのに ってコードをx64で吐いてたりする
気にスンナ。CPU内部でリマッピングされてるから何も変わらん。
そうなの? レジスタ間転送も消えてくれる?
>>580 throw元の行番号を表示しようなんて酔狂な奴が100万人も居るとは思えないのだが。
そうか?
車輪の再発明をしなくなったら、 世のプログラマは、みんな失業しちゃうよ 車輪の再発明だとバレてないから、仕事になる
既成の車輪を持っていくと、 ホイールの太さが気に入らないとか うちで使ってる三輪車にはつけられないのかとか、 そんなお客が多いんです。
車輪の再発明がどうとかもうどうでも良いじゃん。 ここは2chだぜ!? 真摯に議論してどーすんのさ
車輪の再発明がどうとか言う奴は、既存のコードのコピペしかできない糞コーダーだからいらね
593 :
デフォルトの名無しさん :2009/02/11(水) 23:49:35
独習デザインパターンC++は役に立った
冬休み暇なんで何かしようと思うんですが、「30日でできる! OS自作入門」って プログラミングの勉強になりますか?
なにをすればいいか聞かなきゃならないレベルなのだろうから なんでも勉強になるよ。 すぐOS作れ。
車輪の再発明が良くないのは周知のとおりだが、今回のは車輪ですらないから突っ込まれたんでしょ
ちょっと質問なんだけど、インクルードガードを使うか #pragma once を使うか、どっちがいいのかな?
従来は環境依存の#pragma onceは避けるべきといわれており、インクルードガードが推奨されていた。 しかし最近は多くのコンパイラが#pragma onceに対応してるっぽいので、気にせず使ってしまう手もある。 インクルードガードはマクロを使うため、名前の衝突のリスクが一応ある。 (インクルードガードに使うのと同じ名前のマクロが偶然、他の箇所でも定義されていたら……) 一部のコンパイラは、#pragma onceを使ったほうがコンパイルが速くなる。 (2度目以降、わざわざマクロとかの処理をせず、単純にヘッダファイルを読まなくなるため。) しかし別のコンパイラには、インクルードガードを適切に認識して同様の最適化を行うものもある。
詳しい説明ありがとう 基本#pragma 使ってコンパイラが対応してなかったらマクロにしてみる
さらに今は、#pragma onceでは同じファイルを指すパスが 複数あるとダメなので、結局インクルードガードが推奨されてきている
識別子にUUIDでも使えば衝突の可能性は減るんじゃないか?
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
#ifndef org.hogehoge.fugafuga.lib.superutility.specialstringconcat #define org.hogehoge.fugafuga.lib.superutility.specialstringconcat
質問です。 プログラムを使って、起動中のSkypeを強制終了させ、再びSkypeを再起動させたいのですが Skypeを強制終了->再起動のプログラムは書けましたが 実行するとタスクトレイにSkypeのアイコンが2つ表示された状態になってしまいます。 カーソルで強制終了したSkypeアイコンを触ればアイコンは消えるのですが カーソル操作なしで本プログラムのみで強制終了したSkypeアイコンを消したいです。 方法が分かる方がいらっしゃったら教えて下さい。
強制終了にどのような方法を用いたのか書きなさい
>>606 Skype以外のアプリも強制終了->再起動したいので他に方法ありませんか?
Skypeはそれでとりあえずやってみます。
強制終了したら消すタイミングが無いからな トレーにリドローさせるのがいいかと
SendMessage
CでGUIアプリケーションを作ることはできるのでしょうか? またそういったソフトはあるのでしょうか?
可能です あります
615 :
614 :2009/02/13(金) 01:44:49
616 :
赤西仁 :2009/02/14(土) 16:40:32
200年間悩んでます。お力をお貸しください。
PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッドUは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・
ttp://www.gradius2.com/index.php?UID=1174775153 ◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
617 :
晒し :2009/02/14(土) 17:05:33
えーと 伏垢 > 209 名前:赤西仁[] 投稿日:2009/02/13(金) 22:47:36 > 1年間悩んでます。お力をお貸しください。 > 616 :赤西仁:2009/02/14(土) 16:40:32 > 200年間悩んでます。お力をお貸しください。 18時間が199年に相当するわけだから・・・・・・・ 考え始めたきっかけは、昨日の晩飯のおかずか? もやしを大量に入れたのがいけなかったか?
どう見ても偽者
C/C++とアークザラッドUじゃ あまりにもスレ違いじゃね?
てかよく見たら他のスレにもコピペしてるのか。 もうおまえ死ねよ
本当に初歩で申し訳ないのですが、 C++で画面を消すにはどうしたら良いのでしょうか?
どういう状況? 画面ってのは、コマンドラインのことじゃないよね?
いえ、コマンドラインです。 clear();を試してみたのですが、エラーが出ちゃって
コマンドプロンプトから実行ファイルを起動したの? それとも、ダブルクリックで実行ファイルを起動したらそいつがコマンドプロンプトを開いたの? (後者の場合は普通に閉じるよね?)
すみません。完全に言葉が足りてませんね。 VCで書いてたのですが、 画面をクリアする関数が分からないのです。
ごめn 俺にはわからね だれか分かる方plz
ご回答ありがとうございました。 なんとか試行錯誤してやってみます。
だれか知ってるヤツいるんじゃね? 一晩待とう
はい、VC弄りながら待ってます。
キモイ
> C++で画面を消すにはどうしたら良いのでしょうか? 画面をクリアするんなら、stdlibのsystem使って、 system("cls"); // 画面のクリア(clear screenかな) コンソールゲームなら、'\r','\b'と共に、再描画とかに使う。 それとも、ウィンドウそのものを消すことが目的なの?
なにがしたいのかも判らない状況だよな。 モニタの電源切りたいのか ウィンドウを閉じたいのか最小化したいのか コマンドプロンプト上に表示されている文字を消したいのか。 プログラマはいちいち細かいといわれるゆえんだが、選択肢がたくさんあって 超能力で相手の気持ちを読み取るプログラムも作れないのだから仕方のない話。
>>631 の
system("cls");というのを使ってみたらできました。
有り難う御座いました。
>>632 すみませんでした
いや、たんに考え方を伝えたかっただけなので誤られても。 回答したのも別の人だしね。
635 :
631 :2009/02/15(日) 02:10:06
自分は今まで、system("cls");多用だけでうまくいったのですが、 問1 systemの有用な使い方ってある? "ls"(dir)使ったり何したりと。(cdでカレントは動かなかったっぽい) 問2 エスケープシーケンスで色変えとかって、やっぱwinでは使えない代物? 問3 system使わないで、c言語内部で画面をクリアすることは可能?
C/C++の固有の機能としてはなかったはず。 というわけで、その辺の話題はスレ違い気味ではなかろうか。 と思ったけどWindowsコンソールプログラミングの話ができるスレは無いみたいだな。
環境依存スレとかWinAPIスレとか。
ダム端末以外の端末操作は言語仕様だけでは何もできないから、適宜必要なライブラリを使うことになる。
例えばsystem("cls")もOSに依存しているし、コンソールAPIも同じこと。
>>631 問1:
cdでカレントは動かないのではなくて、system()で起動したコマンドインタプリタで移動するだけだから
呼び出したプログラムに反映されないと言うこと。
system()のメリットは、比較的容易に他のアプリケーションを起動できるってことくらい。
木目細かい制御が必要なら、APIが必要になってくる。
問2:
コンソールAPIでできると思うが、エスケープシーケンスはデバイスドライバを組み込んでおく必要があるんじゃないだろうか。
問3:
繰り返しになるが、環境に依存しないでシンプルにやることはほぼ無理。汚い方法としては、100行くらい空行出力するくらいか。
回答1,2,3にしろよ紛らわしい
>>100 行くらい空行出力するくらいか。
そう来たかwwww
って、文字の多いところで、連続改行すると、どれくらい遅いか知ってるか わずらわしす。あと、入力が最下段からになってしまうのも、 下手なコードだと、ゲームにはなってても、目を上下動かす必要がある。あbcでfgひあbcでfgひ
それがいやなら環境に依存するコードを書けばいい。
まぁすでに環境依存だけどな
どうせならもうムッチャクチャ環境依存に。
645 :
デフォルトの名無しさん :2009/02/15(日) 17:16:51
VC++2008で、folderBrowserDialogってどうやって使うんだっけな ググっても思い出せれん。。。。
あれユーザからするとひどく使いづらいからもう廃止して欲しいな。
「思い出せれん」?
648 :
デフォルトの名無しさん :2009/02/15(日) 17:37:37
ぶっちゃけいうと忘れました
649 :
デフォルトの名無しさん :2009/02/15(日) 18:08:45
void Swaps(char *src, char *dst, int size) { int lp = size; char tmp; while(lp--) { tmp = *(src + lp -1); *(src + lp - 1) = *(dst + lp - 1); *(dst + lp - 1) = tmp; } } srcメモリとdstメモリの領域範囲size分、charデータを入れ替えたいと思います。 パフォーマンス的にこれ以上速くする方法はありますでしょうか? C/C++どちらでもいいです。
cスタイルのキャストってあるじゃん。 あれはプロのC++プログラマはもう全然使わないものなの? 多少打ち込むのが面倒でもC++スタイルのキャスト(static_cast等)でコーディングすべき?
エディタの機能に頼るべき
scasって打てばstatic_cast<>()って展開されるスニペットとか使うんですねわかります
>>651 うん。何のためのキャストか明確だし、継承関係になくて明らかに変換できない場合はエラーになるから。
>>649 うーん、x86だとしたらわざわざ手間を掛けて遅くなりそうで
読み難いだけのコードな気がするなぁ。
先ず最初に「普通に読み易い関数」を作るべき。
void Swaps(char *src, char *dst, int size)
{
for (int ic = 0; ic < size; ++ic) {
char tmp = src[ic];
src[ic] = dst[ic];
dst[ic] = tmp;
}
}
こいつを、条件を設定して実測してみて充分納得してから
高速化に取り掛かった方が結果として近道だと思う。
なんせ今のコンパイラは激しく強力だし、今のCPUは
激しくメモリ配置に依存するから。
例えばrestrictの意味を適切に考慮してくれるコンパイラなら、
それだけで速くなるかもしれない。
また、sizeが小さめなら作業領域をchar一個ではなく
size分丸々取ってしまった方がいいかもしれない。
# 大きいなら「適当に」取るという手もあることだし。
最初に戻って、凝って逆方向アクセスにしてみたんだろうが、
それによるwhileの条件判定のコスト削減よりも順方向じゃないことによる
コンパイラの最適化の妨げやCPUのキャッシュの利用効率を阻害する
可能性のほうが高いよ。
656 :
651 :2009/02/15(日) 19:13:42
ありがとう。 じゃあ俺もそうしよう。 せっかく導入されている機能なんだし、使わなきゃね。
657 :
649 :2009/02/15(日) 19:19:13
> 最初に戻って、凝って逆方向アクセスにしてみたんだろうが... 確かに遅くなってました。 for文よりもwhileの方が多少なりとも速くなるのかと自身の判断でした。 やっぱり入れ替え対象となる型をキャストして、まとめて処理を行う様にします。
>>649 配列双方のswap後の使われ方を追ってみて可能ならばポインタ交換だけに留める。
部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2]
659 :
649 :2009/02/16(月) 00:11:39
>658 ポインタ自体の入れ替えだけでとどめる事は理解出来る。 それが出来れば、速くなる事も理解出来る。 > 部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2] が、ここの言わんとする内容が高度過ぎて俺の安い頭では理解出来ない。 どなたか、もう少し噛み砕いて説明してくれない?
連立方程式を解きたいのですがどのように記述すればよいのでしょうか?
>>660 どのレベルの知識を求めているのか、よく分からんけど。やるだけならuBLASとかでできる。
ちゃんと知りたいなら数値計算と呼ばれる分野の参考書を読んでみるといい。
「他の言語ではできるけどC/C++でのやり方が分からん」というなら、それに沿っての助言はこのスレで出来る。
簡単に言うと、 { 2x + 3y = 5 { x sin(x^2) + exp((x-u)^2/d) = 0 ってやつの解(not単一解)を導きたいのですね?
それは簡単な方法は無い。 数値計算法の知識を使ってゴリゴリやるしかなさそう。
説明不足ですみません 中学校で一番初めに習うような 2x + 3y = 5 5x + 2y = 10 こんなような連立方程式です(未知数の数は2つ固定)
自分がどう解くか、その順番通りに処理を書けばいいだろ。
>>665 それだったら、行列 (2,3; 5,2) の逆行列を 縦ベクトル (5;10) に掛ければいい。
行列式が-11だから、逆行列は -1/11 (2,-3; -5,2) だな。
この話が意味不明なら、高校数学の行列のところを学んでほしい。もしくは適当にググってほしい。
>>667 ありがとう
なんとなくつかめてきました
c言語で 750行ほどのプログラムを組んで、 visual c++ 2008 のコマンドプロンプト でコンパイルして exe を起動しようとしたのですが、 Microsoft Windows ○○.exe は動作を停止しました となってしまいます。 fatal error 、 error など何も出ていないため原因がわかりません。 プログラムが長いとエラーが出たりするんでしょうか? 思いつく理由だけでもいいので教えていただけないでしょうか?
単にバグってるだけだろ
ということはプログラムは長くてもエラーが起こったりはしないんですかね? プログラム上のバグが原因ならとりあえず探してみます 教えていただきありがとうございます
色々起動しすぎて重くなってるとかは?
言われたとおりに余分なものを消したら一応そうならなかったんですが、 今度は 0x74696e69 でハンドルされていない例外が発生しました: 0xC0000005: Access violation と表示されました
それはアクセスしちゃいけないところにアクセスしようとしてる ポインタとか配列使ってる辺りにバグがあるんじゃないの
Visual C++ ならデバッグありで実行(F5)すれば エラー出てるところ表示されない?
ああ。コマンドプロンプトからか…。
そうなんですか 面倒だけど、最初から確認してみます。 丁寧に教えてくださりありがとうございます。 また何か分からないことがありましたら質問させていただきます。
678 :
デフォルトの名無しさん :2009/02/16(月) 10:22:58
日本語の配列の作り方がわからないのでお教え願います。 たとえば はる、あき、なつ、ふゆ、さくら というひらがなの配列を作りたいとき char [6][7] = {"はる","あき","なつ","ふゆ","さくら"}; と宣言しているのですがgccでコンパイルしたときに warning: initializer-string for array of chars is too long という警告が出てしまいます。 どのようにすれば良いのでしょうか?
679 :
678 :2009/02/16(月) 10:24:03
sed 's/char /char foo/' 678 でお願いします。
>>678 ソースの文字コードがUTF-8になってない?
"さくら"はUTF-8だと末端のヌル文字を含めて10バイトだよ。
681 :
678 :2009/02/16(月) 10:42:45
>>680 ありがとう御座います。
実は例題用にだした適当な配列だったのでできれば
UTF-8でのバイト数の計算方法を教えて頂けると幸いです。
682 :
678 :2009/02/16(月) 10:45:33
自決しました。 一文字が3または4バイトなんですね.
自決しちゃったのかよ!
自決フイタwwww
日本語の配列 → 配列名が日本語? と思ってしまった #include<stdio.h> #include<stdlib.h> #include<string.h> #define jp(STRING) array[ch(STRING)] enum{HARU,NATU,AKI,FUYU,SAKURA,GRA,NAMEOVER}; const char* jpname[NAMEOVER] = {"はる" , "夏" , "あき" , "冬" , "さくら" , "ごるぁ"}; int ch(const char * str){ for(int i = 0;i<NAMEOVER;i++) if(strcmp(str,jpname[i])) return i; exit(1); } int main(){ char array[NAMEOVER][256]; sprintf(jp("はる") , "はるのるららの〜"); puts(jp("はる")); return 0; } ただ、関数一つで十分なのですが・・・・なんとなく。
>>685 なんというひどいコードだ。
>#define jp(STRING) array[ch(STRING)]
ローカル変数を参照するマクロ・・・最悪。
>enum{HARU,NATU,AKI,FUYU,SAKURA,GRA,NAMEOVER};
使われていない宣言。
>const char* jpname[NAMEOVER] = {"はる" , "夏" , "あき" , "冬" , "さくら" , "ごるぁ"};
>int ch(const char * str){
このソース内でしか使わないんだからstaticをつけろ。
> for(int i = 0;i<NAMEOVER;i++) if(strcmp(str,jpname[i])) return i; exit(1);
バグってるし。if(!strcmp())だろ。
さらに、for()の行と同じ行に次のexit()を書くなんて嫌がらせとしか思えない。
>sprintf(jp("はる") , "はるのるららの〜");
ここも意味をなしてない。strcpyとでもしたかったのか?
>>686 >このソース内でしか使わないんだからstaticをつけろ。
C++かもしれないじゃないか!
>>686 ひどいコードってのは同意
>使われていない宣言。
NAMEOVERは激しく使われてるが? (defineでOK)
>このソース内でしか使わないんだからstaticをつけろ。
こんなネタソースが、これ以上大きくなるわけないだろ
>ここも意味をなしてない。strcpyとでもしたかったのか?
printf("Hello World!\n); は、意味を成していない。putsとでもしたかったのか?
という意味?
>>688 C++ と C で const つけたグローバル変数のリンケージ違うじゃん
覚えたてでいろいろ添削したくなる年頃なんですよw
>>689 sprintf(U, V); っておかしいだろ。(U, Vはともにchar*)
動かないわけじゃないけど、こういうコードを見ると、「ん?何か意味があるのか?」って考えてしまう。
strcpy(U, V); とするべきだ。
#include <map> #include <iostream> int main() { std::map<std::string, std::string> array; array["はる"] = "はるのるららの〜"; std::cout << array["はる"] << std::endl; return 0; }
stringもincludeしようぜ
わすれてたw
当方、今現在Cの用語を覚えて簡単なプログラムを書く練習をしているレベルの者なんですが、 ・Runge-Kutta法のプログラムの(ソースの)例 ・gnuplot(導入済み)の使い方 の二つが分かる参考書が入用なのです(本当は今これを使えるレベルじゃなきゃいけない……)。情報をお願いします!
ルンゲクッタとは懐かしい Numerical Recipes in Cには乗っているよ 他の本にも載っているから、数値計算の本にはどれでも載ってると思う gnuplotはwebか周りに聞いたほうがいい。本はいらない
698 :
696 :2009/02/16(月) 18:25:59
>697ありがとうございます。明日にでも本屋にあたってみます。
699 :
696 :2009/02/16(月) 18:36:54
連投失礼します。当方二重振り子の運動の概算値をルンゲクッタ法で求め、gnuplotで表示しなければなりません。 当方のスキルが低いため、助言を他にもいただけたならありがたいです(苦笑w)。
>700把握
702 :
697 :2009/02/16(月) 18:58:14
二重振り子ならルンゲクッタとかよりもsymplectic integratorとかを使った方が良いかも 2次ならテイラー展開+オイラーを解くだけなんで…と思ったけど難しいな まあ、いい加減スレ違いっぽいんでこのへんで 宿題スレとか推奨書籍スレにも常駐しているんでそっちで聞いてくださいな
>>699 松田先生のページ見れなくなっちゃったし・・・
705 :
699 :2009/02/17(火) 13:48:36
>704 神支援サンクス!
この課題…ちょっと前に見たな 宿題スレでボコボコにされてた人は結局どうなったんだろうか
int a[3]; a[5]=0; のように、添字の範囲外でもビルド時にエラーが出ませんが、 こういったエラーを知る方法が無いでしょうか?
C#を使う
配列すべてマクロ作って、 #define A(index) if( index > sizeof(a) ) printf("a error (%d,%d)",index,__LINE__); a[index] で、デバッグとか? ゲロゲロコードだろ? やめとけ。
高価なツールだとそういうのを検出する機能を備えたものもあると思う。
vectorでatをつかえ
大概のコンパイラにはデバッグモードの STL があって デバッグモードなら operator [] を使ってても ちゃんと範囲外エラー(もしくは警告)を出してくれる。 C を使っているならあきらめるしか。 っていうか、超プログラマの責任だし。
gcc -fmudflapやcl /analyzeで検出できないか?
>>709 >>配列すべてマクロ作って、
#define A(index) if(index>sizeof(a))printf("aerror(%d,%d)",index,__LINE__);a[index]
初めて知ったわ!へー、そうなんだ。
こういうアイディアって面白いよね。使う気はしないけど。
>>713 libmudflapって言うのか?
使ったことない。
っていうか、セットアップの方法さえ・・・
class 設計でちと聞きたいんだが、内部でメンバの型をtypedef したい場合はやっぱりpublic にすべきだよね? class SomeThing { public: typedef int value_type; ... private: value_type value_; };
SomeThing::value_typeをクラスの外側で絶対使わないっていうならprivateでもいいけど <functional>ヘッダとかで見るとすべてpublicで宣言してる
typedefとかってマクロだよね? クラスの内部で宣言したからと言ってアクセス指定子の影響って受けるの?
>>718 typedefをマクロと言うなら変数だって関数だって定義は全部マクロだろ。
>>718 private部分にtypedefしてみ?
んで、他の関数とかで定義したT::value_typeの型宣言してみ?
偉大なるコンパイラさんがめっちゃ怒るよ
あとtypedefはマクロじゃなくて同義語の定義なんだぜ
721 :
718 :2009/02/20(金) 19:11:25
typedefは#defineみたいなプリプロセッサの1つなのかと思ってた。 全然違ったのか。 ありがとう。
(BYTE**)&hensuu ってどういう意味だっけ?
BYTEというクラスのポインタへのポインタにhensuuという変数のアドレスをキャストする って意味
クラス?
キャストをビットマスク的な意味で使うこともあるから混乱するんだよなー 同音異義語みたいなややこしさがある
vector<bool> ってなんか嫌われているの? 問題点はC++0xで直る?
Effective STL読むとわかるけど vector< bool > はコンテナの用件を満たしていない。 にもかかわらずSTLに残されているのは過去への戒めだそうな。
>>728 なるほど。
boolを1ビット扱いにしてメモリを節約しました的なことですよね。
もうC++0xで直せば良いのに。戒めとは。
例によって、互換性のために直せないのではないだろうか? どんな問題があるのか素人の自分には思い付かないが。
vector<bool>は無くなるんじゃなかったっけ?非推奨なだけかな?
>>730 ちょっといろいろ見てみたが、俺にも思いつかない。
まあ確かに互換性の維持は大事だな。うん。
…でもC++とC++0xは別の言語だぜ!的なスタンスでもいいじゃんか。
せめて3態Boolean(tribool)を追加し、vector<tribool>はコンテナの用件を満たすようにするとか。これなら互換性も問題ない!
asm(nop) の文って何をやっているのでしょうか? cなら基本的にasmというのは使えるのでしょうか
処理系依存 nopはno operationの意味で何もしない
>>733 最適化on時にブレークポインタかけたいときに使ってるな。
736 :
733 :2009/02/23(月) 21:25:18
>>734 処理系というのは、プログラム実行環境ということでしょうか?
使えない環境もあると。nopってのは別にnopって書く必要はないけど
それが一般的によくかかれるようになってるということでしょうか?
>>735 これでどうやって最適化on?するのでしょうか?
処理系ってのはコンパイラのこと nopはCPUの命令の一つ(何もしない命令) 最適化してもasm文は消えないからブレークポイントを置ける
windowsで使用できるメモリアドレス空間の範囲ってどうすれば分かりますか? プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
自分でコンパイラやリンカでも作っているのか?
742 :
デフォルトの名無しさん :2009/02/23(月) 22:12:31
>>737 ブレークポイント置く意味ってデバッグのためでしょうか?
nop自体はどんなCpuでも理解できる命令で、asmもそうなのかな
ただ、コンパイラするときにasmを認識しないものがあると
asmはassemblerのasm nopはx86系の命令だが、他のcpuでも同じかも どっちにしても、asmはcpuの命令を直接書くためにあるし、当然cpuごとに内容は変わる
何もしない命令でブレークポイントを置くが謎ですね・・・
745 :
デフォルトの名無しさん :2009/02/23(月) 22:27:37
DWORD WINAPI OutputToSocket(Lunatia lpvoid) { LuDATA pthData = (LuDATA)lpvoid; DWORD dwLen; char szBuf[1024]; while(pthData->bThreadFlag){ Sleep(100); BOOL bret = ReadFile(pthData->fd_write, &szBuf, sizeof(szBuf), &dwLen, NULL); if(bret == FALSE) continue; if(dwLen > 0) send(pthData->sock, szBuf, dwLen, 0); } return 0; } このコードはどういう動作をするのでしょうか?
ブレークポイントを置くのはデバッグのため以外にないだろう
747 :
デフォルトの名無しさん :2009/02/23(月) 22:31:07
デバッグしたあとは、そのプログラムの部分だけを取り除くのでしょうか? ていうか、別にnop使わなくてもデバッグできるのでは?
>>745 受信したらその内容をそのままどっか送ってんだろう
>>747 最適化で無くなってたらとまらないだろう
3歩歩くと忘れるニワトリかよ
750 :
デフォルトの名無しさん :2009/02/23(月) 22:34:45
>>748 そうなんですか、ありがとうございます
とあるネットゲームのチートらしいのですが…なんかガセのようですね
751 :
デフォルトの名無しさん :2009/02/23(月) 22:39:33
>>749 でも空命令なら最適化されてもいいのでは?
ただ、この分岐をとおっているかどうかとかで判断するためにいれるとかでしょうか?
753 :
デフォルトの名無しさん :2009/02/23(月) 23:13:14
つまりどういうことでしょうか?
C++で二次元配列のポインタを関数に渡すのは無理でしょうか? 後、メンバ関数を同じクラスのメンバ関数内で使うことはできますか? 両者返答と合わせて多少解説を付けてくれると助かります
>>754 前半
void proc(T (*array)[4][4]) { /* (*array)[0][0] などとアクセス */ }
後半
スタティックなメンバ関数からスタティックでないメンバ関数を呼ぶことはできないが、それ以外は可能
>>754 二つともできる。
解説って「できる」以上になんかあるか?
>>755 ありがとうございます!助かります
>>756 方法や注意点を等なにかあれば書いてくださいってことです
言葉足らずですいませんでした
windowsで使用できるメモリアドレス空間の範囲ってどうすれば分かりますか? プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
長さが決まってない2次元配列は渡せないとか
>>758 普通はコンパイラその他がよろしくやってくれるのだから、
なんでそういうことをやりたいのか詳しく書いてくれないと答えようがない。
アドレスを振る必要がある場合があります
>>758 ひじょうに大雑把に言って、32ビット版Windowsの場合0x0〜0x7fffffffぐらい。
ふつう、アセンブラで書くときでさえ、プログラムを書いた人が「変数
にアドレスを振る」なんてことはしない。何か特殊なことをしようとし
ているぞ。
あ、質問の仕方がおかしかったぽいかな windowsがosとかつかって使用するメモリ領域が0x7fffffffくらいということでしょうか? 空き領域にアドレス振らないと動かないですもんね でも、実際0x7fffffffまでどったらほとんど空き領域ないですよね 0x07ffffff くらいじゃないでしょうか?
カーネルは0x80000000-0xFFFFFFFFを使う。 0-0x7FFFFFFFがアプリ用だけど、 ここにもシステムDLLが読み込まれたり 0-0x7FFF(NTの場合)がぬるぽ検出用で予約されていたりして 実際使える分はもう少し少ない。 3GBモードとか64ビットだとまた違ってくるけど。
いまだに763が何を言いたいのかさっぱりわからん
>>764 でもその範囲あたりでも普通に使えるとこは使えました
>あ、 質問の仕方 が おかしかった ぽい かな >windows が os とか つかって 使用するメモリ領域 が 0x7fffffffくらい ということ でしょうか? >空き領域 に アドレス 振らないと 動かない ですもんね >でも、 実際 0x7fffffffまで どったら ほとんど 空き領域 ないですよね >0x07ffffffくらい じゃないでしょうか?
>>766 「使う」って何だよ。どんなプログラムを書いて、何が疑問なのかもっと具体的に。
OSに要求してもらった領域以外は勝手に使ったらダメだぞ。
変数を割り振るとしたら、osが実際他のアプリとかで使用してる領域はつかえませんよね
だれが変数を割り振るの?
変数のアドレスを指定して割り振るので自分でアドレスは割り振ります。指定したやつだけ。 その他はコンパイラが空いてるアドレスを適当に。
>>770 プロセスごとにアドレス空間は独立しているから
他のアプリと衝突の心配なんて要らないぞ。
だからこそ仮想アドレスと言うくらいであって。
何のために自分でアドレスを割り振るの?ハードウェア制御とか?
>>772 C/C++で
char *p = (char*)0x70000000;
なんてことをしているってこと?
そんなこと、絶対にしてはいけないぞ。
volatile char *p = (volatile char*)0x70000000;
ハードウェア制御する奴がこんな質問はしないだろ…
malloc()を知らないダケだったりして。
どうやって割り振っているんだろう
CreateThread関数で第三引数をクラスのメンバ関数にしたい場合はどういう記述をすればいいのでしょうか?
>>780 例えば、クラスHogeのMemberFunctionを呼ぶとするなら、
次のような普通の関数(静的メンバでも可)を作って、これをCreateThreadに渡す。
ただし、CreateThreadの4つ目のvoid*の引数にHogeへのポインタを渡すこと。
(Hogeの中ならthisも可)
DWORD WINAPI ThreadEntry(void* p)
{
Hoge* pHoge = static_cast<Hoge*>(p);
return pHoge->MemberFunction();
}
783 :
デフォルトの名無しさん :2009/02/24(火) 07:35:07
0x70000000にどこかの物理アドレスがマップされていて その物理アドレスがアクセス可能であれば別にダメじゃないよ
MS-DOS時代ならメモリ自由に使えたかもしれないが
>>782 それがWindowsでのルールだから。(UNIXでも同じ)
たまたま使えるアドレスがあったとしても、それは他の目的でOSから割
り当てられた領域なので、使ってはダメ。
細かい理由とか書くと長くなるので、OSに関する本など読んで自分で調
べてくれ。
>>786 特定のアドレスが必要なければ、malloc()やnewすればいい。
VirtualAlloc() で特定のアドレスを要求することもできるけど、普通は
そんなことする必要はない。
なんで特定のアドレスが必要なの?、という疑問に戻る。
788 :
デフォルトの名無しさん :2009/02/24(火) 09:07:51
Embedded C++ の処理系ってあるんですか? 例外も名前空間もテンプレートも無いって……orz
>>788 そんな猿が考えたモンキーC++なんて誰も使ってねーよ
>>789 本当ですか?今は、どこの誰も使っていない?
サイトを調べても生きてるのか死んでるのかよく分かりませんし……。
それなら、Embedded C++ を考えなくて済むんですけど……。
正直、Embedded C++の事は考慮したくありませんよぅ。
だれか、公式に正式に Embedded C++ を破棄しないんでしょうか……。
おーい通訳!
792 :
デフォルトの名無しさん :2009/02/24(火) 11:08:24
通訳の必要は無い。 ただの愚痴だろ。 スルーしろ。
class A{ public:
>>793 ミスですorz
class A{
public:
int a;
int b;
};
class B:A{
public:
A *a[1][1];
void sam();
}
void B::sam(){
a[0][0]->a = 0;
}
例としてこのような形のaとbの要素を持つ配列a[1][1]を作って計算させようとしたところ
System.NullReferenceException' のハンドルされていない例外が発生しました。とでます
配列をポインタにしない場合で->を.に変えても処理の途中で同じようなエラーメッセージがでます
解決する方法はないでしょうか?
A *a[1][1]; が領域確保されてないからだろう、コンストラクタで確保でもしたらいいだろう そもそもなんでポインタにしてんの?
>>794 記入忘れがありました
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
とエラーメッセージに記載されてます
>>795 わかりましたやってみます
ポインタにした理由はいろいろ経緯があって後々便利かなと思ったんです・・・
void main(){ int a = 15; int map[a][20] = { { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, }; } なぜか実行できません。 エラー内容1:定数式が必要です。 エラー内容2:サイズが 0 の配列を割り当てまたは宣言しようとしました。 配列の要素数に変数を使うにはどうすればよいのでしょうか?
>>798 C言語ならC99対応にする
C++なら a にconst つければ通る
DLLの動的リンクがうまくいきません。 WinXP SP2+VC2008 ---DLL作成プロジェクト--- [ファイル]→[新規作成]→[プロジェクト]→[Win32プロジェクト] プロジェクト名 : DLL_TEST アプリケーションの種類:DLL 共通ヘッダー ファイルを追加: MFC -DLL_TEST.cpp 追記- DLL_TEST_API int fnDLL_TEST(void){ return 1; } // DLL_TEST.h //#define DLL_TEST_API extern "C" __declspec(dllexport) //DLL_TEST_API int fnDLL_TEST(void); ------------------------ 呼び出し側 Win32 コンソールアプリ int _tmain(int argc, _TCHAR* argv[]){ HINSTANCE lib; void *lpHr; lib = LoadLibrary(_T("DLL_TEST.dllフルパス記入")); if (lib == NULL){return -1;} lpHr = (void *)GetProcAddress(lib,"fnDLL_TEST"); return 0; } ---------------- GetProcAddress()の返り値がNULLとなってしまいます。 何が原因なのでしょうか?
>>800 関数のシンボルが違ってるんじゃないか?DLLを確認してみれ
>>800 1) GetLastError() の値を調べる
2) dumpbin /exports DLL名 でEXPORT関数名を確認する
803 :
800 :2009/02/24(火) 23:14:42
dumpbin /exportsで調べたら?fnDLL_TEST@@YAPA_WXZとなってました。 extern "C" を #define に含まず宣言に直接記述したらNULL以外を返すようになりました(なんで?)。 もうすこし色々試してみます。 どうもありがとうございました。
コメントアウトしてるからじゃないの
char *p = (char*)0x70000000; これってなんでだめなのでしょうか?
メモリはOSが管理するものだから メモリ空間が4Gあっても実際にアプリで使える領域はOSが割り当てた一部のみ 勝手に任意のアドレスをポインタに代入してアクセスしようとしてもエラーになるだけ
>>805 その領域が使用されていない&これからも未来永劫使用されないという保証がないから。
…というかそのくらいは初心者向けサイトで学ぶはずでは。
volatile char *p = (volatile char*)0x70000000; こんな風にすると大丈夫なのでしょうか?
ダメ
>>808 そんなコードをまともにかけるのはよっぽどすごい人だけ。一般のプログラマがそんなコードを使うシチュエーションはない。
volatileってなんだか知ってるのか?
まず猫のページとかいろいろ熟読した方が良いのでは。。。
811 :
デフォルトの名無しさん :2009/02/25(水) 00:30:05
>>808 いいよ。
0x70000000にアクセス可能な物理アドレスがマップされていれば。
>>811 逆にマップされていても
そのVOLATAILEをつけないとだめってことでしょうか?
volatileは関係なく 0x70000000という定数をアドレスに変換してるのが根本的におかしい これは基礎中の基礎なので、初心者向けのポインタの入門書をじっくりよんで でなおすべき ここで聞いて、2-3行の答えをもらって理解できるものでない
815 :
デフォルトの名無しさん :2009/02/25(水) 00:35:51
>>813 CPUとは別のデバイスがそのアドレスを変更する可能性がある時に付ける必要があるよ。
コンパイラはCPUが変更しないと思ったら最適化で消しちゃうから。それが抑止される。
>>811 アドレスとポインタについて相当勉強しない限り
C/C++でプログラミングがまともにできないまま。
>>815 この質問者がそんなハイレベルな話をしていると思うのか?
無駄に上の知識を与えると基礎がおかしくなる。
817 :
デフォルトの名無しさん :2009/02/25(水) 00:41:44
>>816 かなり下位レベルの話をしてるよ。
デバイス制御するなら必要な知識でしょ。
せっかくだから俺も質問するけど 何らかの特殊な理由がある人は、直接アドレスを指定して読み書きするようなコードを書くことも普通にあるわけ? よく知らんけど、組み込みとか? あとOS自体のソースとかで使うのかな?
819 :
デフォルトの名無しさん :2009/02/25(水) 00:46:02
>>818 ARM開発キットとかのヘッダファイルみるとよくわかるよ。
>>817 だからそれが意地悪なんだってば。
816(=俺)がハイレベル・ローレベルをそういった意味で使っていないであろうことは想像付くだろ。
質問者がデバイス制御するような人の質問に見えるのか?
>>818 デバドラとか。
ピント外れてたらすいません。 char *p = (char *)0x70000000;とかは組み込み系の メモリマップドI/Oの環境ならありえるんじゃないでショッカー (SHの開発環境のHewとか?) で、volatileで最適化を抑制するのは、例えば メモリマップドI/O環境で、pにはアドレスが入ってる場合に *p = 0x01; として最適化されると、その後に*pを使わない限り最適化されて 無視されるからで、なんかわかんないけど、volatileつけるってわけじゃないかと
822 :
デフォルトの名無しさん :2009/02/25(水) 00:51:28
>>819-820 ありがと。やっぱりあるみたいだね。
例の質問者は、初心者というよりは、そういう方面の背景を持った人なのかな?
と何となく思ったんだけど、そういうわけでもないのだろうか。
もういいじゃん お前らちょっと気持ちを抑えようぜ。 当の本人が置いてけぼりになってるぞ。
826 :
1/2 :2009/02/25(水) 00:53:38
大量のファイルを読み込むプログラムが必要な状況です。 boost::threadを使って,ファイル読み込みと処理の部分をマルチスレッド化しようと思っていますが,うまくいきません。 大量のファイルを読み込み,最初の一行をvectorに読み込む場合,下のようなプログラムになると思うのですが,何がだめなのでしょうか? boost::mutex state_guard; class FileOpener { public: FileOpener(std::string file_name, std::vector<std::string> *first_lines) : file_name(file_name), first_lines(first_lines) { }; virtual ~FileOpener(){}; void run() { boost::mutex::scoped_lock lk(state_guard); std::fstream member_csv(file_name.c_str(), std::ios::in); std::string str; getline(member_csv, str); first_lines->push_back(str); member_csv.close(); } private: std::string file_name; std::vector<std::string> *first_lines; };
827 :
2/2 :2009/02/25(水) 00:54:24
int main(int argc, char **argv) { boost::filesystem::path order_path = "./log/"; std::vector<std::string> first_lines; boost::thread_group th_gp; for (directory_iterator it = directory_iterator(order_path); it != directory_iterator(); ++it) { // ここでファイル名と,一行目を格納するvectorを渡しております。 FileOpener f(it->string(), &first_lines); th_gp.create_thread(boost::bind(&FileOpener::run, &f)); } th_gp.join_all(); }
>>821 ポインタによる書き込みはコンパイラが要/不要の判断できないので
通常最適化の対象にはならない
それはそれとして、
volatile char *p
はポインタがvolatileの対象になるだけなので意味がない
>>826 ぱっと見た感じでは fの寿命が問題なんじゃねーの?
830 :
826 :2009/02/25(水) 01:08:28
>>829 なるほど,つまりforループを抜けた時点でスコープから外れてfが無効になるということですね
それを考慮してやり直して見ます
831 :
826 :2009/02/25(水) 01:11:53
classではなく普通の関数を渡すようにするとうまく動くようになりました ありがとうございました
自作のクラスHogeがあったとして、int型の引数を取るコンストラクタがある時、 Hoge(42) と static_cast<Hoge>(42) は同じになる? 前者はコンストラクタが呼ばれるのだろうが、後者がどうなるのかわからん。
833 :
デフォルトの名無しさん :2009/02/25(水) 01:51:04
>>828 > ポインタによる書き込みはコンパイラが要/不要の判断できないので
> 通常最適化の対象にはならない
それはコンパイラや最適化オプションによる。
とても「通常」と言えるような動作ではない。
> volatile char *p
> はポインタがvolatileの対象になるだけなので意味がない
これの違い分かってる?
volatile char * p;
char * volatile p;
こっちでもいいや。
const char * p;
char * const p;
一応ハードを直接いじるような仕事しているけど、それでも char *p = (char *)0x70000000; みたいなことはしない。 それ専用の命令やらで、結局はほとんどOSに任せる
まあ、おぜん立てされてたら苦労せんわな。
>>832 同じだよ どちらも一時オブジェクトがコンストラクタによって生成される
VirtualAllocでアドレス指定できるから、いろいろ試してみそ
>>834 PSPとかDSのプログラムやってるとしょっちゅう使うよ
まあマクロで定義されてるのを使うだけなんだが
#define DMA0_SRC (*(vuint32*)0x040000B0)
#define DMA0_DEST (*(vuint32*)0x040000B4)
#define DMA0_CR (*(vuint32*)0x040000B8)
>>833 この違いも書いておかなくちゃw
volatile char * p;
char volatile * p;
標準C/C++で
int n=42;
while(--n)
{/*nの値を変えない処理*/}
と
int n=42;
while(n--)
{/*nの値を変えず、例外も投げず、breakもしない処理*/}
とで、
前者だと確実に41回のループ、後者だと確実に42回のループが行われると考えていいですか?
初級C言語Q&A(7)
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html この古いページの副作用に関するところを読むと、いろいろ不安になることが書いてあるんですけど。
古いからですか?
すみません。 前者の {/*nの値を変えない処理*/} も、要するに nの値を変えず、例外も投げず、breakもせず、他のプロセスからnの値が変わることもなく、gotoとかもしない ということです。
while(--n) printf("%d", n); while(n--) printf("%d", n); を実行してみりゃすぐわかんだろ
>>843 わかります。
が、標準の仕様で保証されているのでしょうか?
Q 【a[i] = i++;】
配列に0から始まる整数の値を入れたい。次のコードはなぜうまく動かないか。
int a[10];
int i = 0;
while (i < 10)
a[i] = i++;
A
i++ という式を実行すると、 i の値が変化します。このような振る舞いのことを副作用と呼びます。ある変数に対して副作用が生じるような式においては、他の箇所でその変数を参照することはできません。その結果は未定義とされています。
この式の場合、 i は i++ の他に、配列 a の要素を指定するために参照されているため、その結果は未定義となるのです。
K&Rの記述を読むと、上の結果は不定であると解釈できるような記述がありますが、ANSI Cの規格では、不定ではなく未定義の扱いとすることになっています。
(参考 comp.lang.c FAQ 3.1)
ってなっているんですよね。。。
>>841-842 君の質問は、そのページに書かれているような副作用関連のトラブルの話とは無関係に見えるけど。
> 二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
(例えば a = b++ * b++;)
> 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトをアクセスしている場合。
(例えば a[i] = i++;)
に、動作は未定義である。それ以外の場合はとりあえず問題ない。
というか、「i++ は常に危険」とか変な勘違いしてる気がする。文章をよく読んでね。
不安なら while(n){ n--;//か--n;でも } すれば? 試せばわかるだよ
そんな疑問を持っていいようなレベルじゃねーよw
みなさんありがとうございます。 よーーーーく頭を冷やして考え直してきます。
このスレ読んでる人間は経験則以外Cの知識は持ってないから 厳密な言語仕様なんて答えられないんだ。 ゴメンね。
>>850 言語仕様なんて現実のコンパイラの挙動の前では、なんの役にも立たないからなあ
組んだ事の無いと、間抜けなコンパイラのセールスマンは、仕様どうこうを宣わって、遊んでられるかもしれんが。
853 :
デフォルトの名無しさん :2009/02/25(水) 21:10:36
プログラマだとしたら最悪の思考だな。 即刻クビにしたい。
>>852 お前って#pragma濫用するタイプだろw
まぁ#pragma自体は標準だけどなw
そう言って使いまくっちゃうんだよなww わかるわかる うちに来てる使えない派遣が正にそんな感じwww
と、何も作ったことのない無能どもが申しております
#ifndefを使う場合でもプリプロセッサシンボルに使える文字数とか気になるわぁ しかもコメントも含めて#ifdefを一番最初にしないとうまくいかないとかそういう環境もあるらしいし 気にしてたらキリがないね
>>853 無職に社員を首にする権限なんて無いから
言語仕様よりコンパイラの挙動を優先するって、どんだけマヌケなんだよ。
まともな技術者ならコンパイラの挙動に影響されないように言語仕様に沿って開発するだろ。
>>852 は真でいい。社会の害悪だ。
一瞬
>>852 = true と見てしまったじゃないか!
>>855 >>まぁ#pragma自体は標準だけどなw
あれ謎だよね。
挙動は環境依存だが存在することだけは確かってことでしょ。
volatile char * p; char volatile * p; この違いってなんでしょうか?
同じ
*の前なら同じ
VisualC++ ダイアログベースでシステムを作成しているのですが エディットコントロールなどをシステム実行中に動的に作成する方法はありますか? たとえば 入力を求め3と入力されたら3つ縦に並べてエディットコントロールを作成する のような動作をさせたいです
スレチ
>>871 CreateWindowすればいいよ。あるいは、上限が決まっているなら、
リソース上でその数だけ作っておき、必要に応じて表示したり隠したりするという手も。
ちょと聞きたいんだけど、 Visual C++ というと C++/CLI のことになるの? それとも visual studio で使う C++ のことになるの?
>>875 C++/CLI で .NET
C++ & MFC
C++ & API
どれか解らん。なので、その辺りを書かない質問
(大抵の場合、自分が何をしているかも解ってないので
スレ違いになる) は適当に答えられたり、スルーされたりしやすい。
>>871 の場合は MFC と予測。
>>876 C++/CLI は C++ 互換の言語。
>>875 Visual StudioはVisual C++, Visual C#, Visual Basic, Visual Web Developer を総合したやつ
Visual C++では C++/CLIもC++もCも使える
呼ぶたびに変数の中身が0〜2で循環する文はどう書くですか?
staticかグローバルで変数取って3で割れ
int foo() { static int n = 0; n = (n + 1) % 3; return n; }
これでいいじゃない。 ++n; if (n == 2) { n = 0; }
int ask(int sw){ sw += 1; sw &= 0x03; return sw; }
static int NumLoop[]={1,2,0}; static int n = 0; n=NumLoop[n]; return n;
int ask(int sw){ sw += 1; sw &= 0x03; sw ^= sw << 1 return sw; }
sin使うと循環するよ
879でできました。
890 :
デフォルトの名無しさん :2009/02/26(木) 23:09:52
n=n?n-1?2:1:0;
n=n?n-1?0:2:1 こっちだ
いい意味でキモイな
ゴルフじゃねーぞ
896 :
890,891 :2009/02/26(木) 23:38:43
帰宅中のiPhoneからだと長いコードは入力するのが大変なんだ。
変態
n = (1 << n)& 3;
ひどいww でも動くんだなwww
C++ってSQL Server とかデータベースとの相性悪い? それならC#使う方がよさげ?
>>900 別に悪くないよ。
C#使うならそっちの方がいいけど。
C++でpowなどの関数が内部でオーバーフローを検出した時にいちいちダイアログが出るのを止めたいんですが どうすればいいでしょうか?
903 :
デフォルトの名無しさん :2009/02/27(金) 14:34:22
#undef DEBUG
事前にpowがオーバーフローするのを検出したいんですが、いい判定法知りませんか? 調べてもいいのがでてきません
pow(n,m)のとき log(DBL_MAX)/log(n) >= m;が真ならばオーバーフローしない でどうか?
log取ってlimits.hと比較すれば?
>>904 釣り?
pow(x, y)はexp(log(x) * y)なので、log(x) * yがlog(DBL_MAX)に達するようならオーバーフローする。
って、>905と一緒だね。
指数と対数がわかってないだけだろ
>>908 まぁ、そうです^^;
皆様、ありがとうございました。
オーバーフローする可能性が高いならば事前に検査 オーバーフローする可能性が低いならば実行時にハードウェアで検出 の方が効率が良い。
つーか、pow()がオーバーフローする可能性が高いってのは設計に問題があるだろ。
32bitなら2^33とかでオーバーフローするんだからしかたないんじゃね まあ、多倍長にすればいいんだろうけど
いや、pow()はdoubleだから。整数でやりたいなら、尚のことpow()は使えないし。
チラ裏。 #define square(x) ((x) * (x)) がダメな具体例を挙げろと言われた。 答えられなかったorz ヤバいのは関数を突っこんだときとかだっけ?
つ[square(x++)]
>915 あー、それか。 なんで出てこなかったんだろう。
>>914 マクロ関数で同じ引数が2個出るのはまずいのを覚えましょう
int y = ...; int z = square(++y);
919 :
918 :2009/02/27(金) 20:55:42
うわ、リロードしてなかった恥ずかしい
920 :
デフォルトの名無しさん :2009/02/27(金) 21:59:16
>>914 仕様も提示せずにダメな例も何も無いだろ。
記述した通りに動く。何もダメじゃない。
C++の新しい仕様って、本当に今年中にくるの? くるまでC++の技術書とか買うの待ったほうがいい?
922 :
デフォルトの名無しさん :2009/02/27(金) 22:10:30
>>921 待てるなら待ってそのまま買わなければお金を無駄にせずに済むよ。
必要ならすぐ買おう。
C++0xか。 なにげに楽しみな俺がいる。
>>921 買おう思ったなら今の本買えば?
C++0xの本はしばらくでないでしょ。
boost本あたりで少し先取りできるけど
これをよしとするか中途半端だと一蹴するか
925 :
デフォルトの名無しさん :2009/02/27(金) 23:14:36
オーバーフローさせる時点でお前が阿保としか言いようがない
亀レスすんならアンカぐらいつけろよ、阿呆w
大規模プログラム設計に関する質問です。 C言語を始めて以来、徐々に規模の大きいものを組むようになりました。 はじめは関数化したり、グローバル変数をできるだけ作らないようにする、といったことを心がけることで 複雑なコードにならないようにしていたのですが、数千行になってくると、それでも しんどくなってきました。 そこで、まとまった処理や変数をクラス化して、プログラムをモジュールに分割することを試みました。 ところが、キレイに分離できて扱い易くなったものもあるものの、かなり複雑に絡み合った処理部は うまくモジュールに分離できず、ムリにクラス化すると、逆に分かり辛くなるという、本末転倒な 結果に陥ってしまいました・・・ やはり、初期の段階でモジュール構成など、設計をちゃんとした上で組まないと、大規模な プログラムを効率的に組んでいくことは難しいと思いました。 そこで、このように、大規模なプログラムを組む上で気を付けることや、考え方、方針などが 書かれているWebサイトや書籍をご存知だったら教えていただきたいです。 ご助言、よろしくお願いします。
デザインパターンでググれ
設計の問題だから code completeじゃ役者不足だろ
933 :
デフォルトの名無しさん :2009/02/28(土) 06:03:04
期待通り動きゃ、何でもいいんだよ
934 :
デフォルトの名無しさん :2009/02/28(土) 17:38:09
期待通り動いてるように見えちゃうから問題なんだろ?
なんで動いてるかわかんないのも問題だな。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
C言語始めようと思うのですが導入からまず挫折気味です 何を入れれば良いのでしょうか? とりあえずコンパイラが必要なようですがそれも沢山あってどれが良いのか全くわかりません。
>>937 Windows: Visual Studio 2008 Express Edition
Linux: gcc
うむ、VisualC++2008expressで問題無かろう。
942 :
デフォルトの名無しさん :2009/02/28(土) 23:01:28
VisualStudio2005でC++コンソールAPPを作成しています。 トレース機能を使いたいのですが、 TRACE("test");とすると 'TRACE': 識別子が見つかりませんでした と出てコンパイルエラーになります。 どうすればトレース機能が使えるようになるのでしょうか?
マクロで即値を定義しちゃうといろいろと弊害が生じるから、 それはやめてstatic const hoge=42;の様に即値を定義しろと聞いたんだが、 可能な限り徹底する物なの? 正直いってまずかぶらないような長ったらしいマクロ名にすればマクロでも大丈夫だよね? static constとかしてもヘッダーをインクルードしたら結局かぶるわけだし
>>943 デバッガ動かすときに、名前が残るのでそれが良いという話がある
あと型が指定されるのでそれが良いこともある
Cだとしたらそもそもconstつけても定数扱いにはならないので、置換できないケースがある
そしてC++ならstatic より無名名前空間を勧めろよと
946 :
デフォルトの名無しさん :2009/02/28(土) 23:35:42
>>945 afx.hをインクルードしたのですが、以下のエラーメッセージが・・・
1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
>>944 無名名前空間ですか。
ちょっと勉強してきます
948 :
デフォルトの名無しさん :2009/02/28(土) 23:36:37
質問なんですけど・・・ 2ちゃんのスレで荒しが書き込んだレスが「あぼーん」では無く 番号ごと削除されてるんですけど・・・ こんな事が削除人ならできるのですか?
949 :
デフォルトの名無しさん :2009/02/28(土) 23:39:19
>>945 #define _AFXDLL を書いたら動きました。ありがとうございました
>>932 >役者不足だろ
>役者不足だろ
>役者不足だろ
この後役者不足で正しいことを指摘されて大暴れするに1000点
ん〜と、2chで議論するならWikipediaがソースでも十分でしょと思って Wikipedia見てきた。 役不足 俳優などが自分の与えられた役に対して不満を抱くこと。転じて、その人の能力に対して役目が不相応に軽いこと。 →×自分の与えられた役目が重く、自分の力量に見合わないこと。 嫌味として使われていたものを本来の意味と取り違えたもの。[要出典]謙遜の意味で誤用されているケースが多いが、これも意味がほぼ逆に解釈されている。 力不足(力量を超える役割)と勘違いした結果である。「役者不足」という役不足に語幹の似た言葉が用いられることもあるが、これは造語であり「役者不足」は単純に役者の頭数が不足しているという意味であり、 個人の能力が不足しているという意味ではない(即ち力不足の意味で役者不足を用いる事も誤用である)。「役職は多いが役者不足である」は正用。 って書いてあるね。
(・∀・)クスクス
辞書引き厨とかまだ存在してたんだw
言うことはそれだけ?w
959 :
927 :2009/03/01(日) 01:52:06
960 :
デフォルトの名無しさん :2009/03/01(日) 05:47:56
>>937 悪い事言わないからHSPにしとけ。
最新のじゃなくて、Ver2.xな
それで物足りなさを感じるようなレベルになったらdll作ってみるとか、
HSPで作った物をC++で作り直してみるとかしたほうが絶対いい
HSPはオモチャ。 これ出来ても評価されない。 完成品ならウケる可能性はある
釣りっぽいけど、初心者に進められる言語じゃないね
2つのint型配列 a[M],b[N]はソートされているとします。 aとbに共通するデータをcに格納する計算量の少ない方法教えてください。
964 :
963 :2009/03/01(日) 13:17:13
これより速くできますか? #include <iostream> #include <time.h> #include <vector> using namespace std; #define N 5000000 main(){ vector<unsigned int> a(N,0),b(N,0),c; c.reserve(N); int m, n, cl; for(n=1; n<N; n++){ a[n]=a[n-1]+(rand()&3); b[n]=b[n-1]+(rand()&3); } m=n=0; cl=clock(); while(m<N && n<N){ if(a[m]<b[n]) m++; else { if(a[m]>b[n]) n++; else {c.push_back(a[m]); m++; n++;} }} cl=clock()-cl; cout<<cl<<" clock\n"; m=n=0; c.resize(0); unsigned int x=a[0],y=b[0]; cl=clock(); while(m<N && n<N){ if(x<y) {m++; x=a[m];} else { if(x>y){ n++;y=b[n];} else {c.push_back(x); m++; n++; x=a[m]; y=b[n]; } }} cl=clock()-cl; cout<<cl<<" clock\n"; }
Mはどこに消えたんだろう
966 :
デフォルトの名無しさん :2009/03/01(日) 13:23:40
面倒なので、M=Nにしてます。 こうした所で計算時間を比較するのには問題ないです。
汎用アルゴリズム使うならmarge(線形)→unique(線形)だろうけど
>>964 の方が速い感じ?
普通に考えて set_intersection()が計算量が最小になるアルゴリズムになってるだろ。 比較や移動のコストは知らんが。
970 :
デフォルトの名無しさん :2009/03/01(日) 13:59:37
set_intersectionはしりませんでした。 一定区間ごとbitsetで存在を表して、そのandを取れば速いかと思ったのですが964に負けました。 表面的には比較回数が減ってますが、裏の手間が掛かりすぎるようです。
同値の含有率で・・ a{0 0 1 2} b{0 1 1 2}
>>969 おお、ほんとだ。そんなアルゴリズムがあった。
っていうか、STL標準講座はやっぱりダメな本だった
俺との相性が悪い 君にはいい本かもよ?
>>973 入門書なのに読めば何でも出来るようになると思い込んでいる人間には向いていない
そういう人間はプログラム自体が向いてないんじゃないかね
977 :
デフォルトの名無しさん :2009/03/01(日) 17:06:00
新たにおねがいします。 5つのint型配列a1[N],a2[N],・・・a5[N]はソートされているとします。 これらに共通するデータをbに格納する計算量の少ない方法教えてください。
978 :
デフォルトの名無しさん :2009/03/01(日) 17:09:59
できれば5個限定でないやつおねがいします。 3個でも7個でも同じアルゴリズムで出来たらいいのですが
a1とa2に共通するデータをbに抽出 a3とbに共通するデータをbに格納
途中で書き込んじまった a1とa2に共通するデータをbに抽出 a3とbに共通するデータをbに格納 これを繰り返してったらいいんじゃない
全てのunsigned intが入る配列を確保して0で初期化 binソートのごとく数字が存在したらインクリメント 最後に5こでも7こでも元配列の数だけ増えてる奴を抽出 計算量は線形だ。
トンクス! いいやつありがとうございます
おい、って何か?
>unsigned intが入る配列 この部分がかなりアレだが範囲が決まってるならアリだな
0-9999 10000-19999とする。
それ重複があったらあったらダメじゃないの? a1 にある数が5個入ってたら a2〜a5 に入ってなくてもヒットしちゃう
ソートされているんだから特に問題にならないと思うが
そうとも言い切れないと思うよ
連続する所を一つと見なす
>数字が"存在したら"インクリメント
っていってるから別に
>>987 の問題はないんじゃ
992 :
937 :2009/03/01(日) 22:30:08
>>938 ,
>>940 ありがとうございます。
Visual Studio 2008というのを使ってみます。
>>992 猫でも分かるはやめとけ。
まあ、猫でもいいけど、なにか引っかかったり疑問に思ったら
すぐ捨てて、ほかの入門書にあたれ。
994 :
940 :2009/03/01(日) 23:19:28
>>993 猫でも分かるは本当に最初だけだよ。
いつかは仕様について学ばなければならなくなるから、
そしたらその時にちゃんと初心者用の書籍を買って読むといい。
っていうか、初心者は第1章でつまづくだろ。猫のC言語入門って。
996 :
940 :2009/03/01(日) 23:49:31
>>995 実は俺はある程度勉強してからその存在に知ったからなぁ。
…あれはインストール方法を省略してたっけ?
その辺はもう覚えとらん。
メインコンテンツの解説の部分しか覚えとらん。
>>985 int配列だから範囲はintの範囲と決まってんじゃんw
998 :
981 :2009/03/02(月) 00:20:06
ネタで書いたんだが微妙に好評?だなw
get!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。