スレを勃てるまでもないC/C++の質問はここで 7
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/01/27(火) 00:20:48過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
0002デフォルトの名無しさん
2009/01/27(火) 00:21:101.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0003デフォルトの名無しさん
2009/01/27(火) 00:21:31/ // /| 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-、
0004デフォルトの名無しさん
2009/01/27(火) 00:21:510005デフォルトの名無しさん
2009/01/27(火) 00:23:080006デフォルトの名無しさん
2009/01/27(火) 00:26:38>999 :デフォルトの名無しさん:2009/01/27(火) 00:07:57
>質問者は、DLLと言い切ってるところにむしろ不安があるんだが
たぶん,勘違いしてるんです。だから毒抜きしたいので思いっきり言っちゃってください。
どこらへん勘違いしてそうですか?
0007デフォルトの名無しさん
2009/01/27(火) 00:30:420008デフォルトの名無しさん
2009/01/27(火) 00:43:560009デフォルトの名無しさん
2009/01/27(火) 00:50:470010デフォルトの名無しさん
2009/01/27(火) 02:39:14ちょうど2の1000乗とかだったら、rand()をシフトさせればいいが。
何桁なのかもわからん。
0011デフォルトの名無しさん
2009/01/27(火) 02:55:24計算結果
http://www.google.com/search?q=%280.5*log%282*3.14*30000%29%2B30000%28log%2830000%29-log%282.7%29%29%29%2Flog%282%29&lr=
0012デフォルトの名無しさん
2009/01/27(火) 03:24:17というかどれくらいかかってるの?
ファイル名ということであれば256バイト固定でやってもいいように思う。
3万回のallocのコストが影響してるのかもしれないし。
連続領域の2次元配列で、インデックスのみのシャッフル(>>956-957)を試してみて。
毎回allocするのはコストが高いかも。ファイル名取得コストも調べないとだけど。
それと、tempという変数がグローバル変数ならローカル変数に変えてみて。
0013デフォルトの名無しさん
2009/01/27(火) 06:15:100014デフォルトの名無しさん
2009/01/27(火) 08:32:07リンクの仕組み
0015デフォルトの名無しさん
2009/01/27(火) 09:52:01乱数「1回」って何だよ。
多倍長の乱数を作るのと、4バイトの乱数をたくさん作るのは本質的に何も変わらないって解ってる?
逆に言えば多倍長の乱数を「1回」作ってそれをLSBから必要なビット数ずつ取り出して使えば、どんなアルゴリズムでも乱数を「1回」以上作るのは必要は無い。
0016デフォルトの名無しさん
2009/01/27(火) 10:42:17遅いっていっても、シャッフルするのに10秒はかからん感じです。
妥当なのかもです。
indexのシャッフルもやりました、tempはローカルっす。
0017デフォルトの名無しさん
2009/01/27(火) 11:03:54ちょっと改めてソース出してみてよ。手が空いてたら試してみるから。
0018デフォルトの名無しさん
2009/01/27(火) 11:24:110019デフォルトの名無しさん
2009/01/27(火) 11:27:55まぁ、ファイル名そのものにもランダム性が必要なわけじゃないなら10万くらいファイルが転がっているディレクトリくらい簡単に用意できるし。
# たまたま、今度の仕事は10*1000*10くらいの個数の画像ファイルが相手なんだw
0020デフォルトの名無しさん
2009/01/27(火) 11:36:530021デフォルトの名無しさん
2009/01/27(火) 11:41:48劇的改善おめ。
何やって高速化したか聞きたいなw
0022デフォルトの名無しさん
2009/01/27(火) 11:46:5830000件printfする前に30000中の該当データを弄る関数があって
そこをコメントアウトしたらはやくなりまうすた
シャッフル自体はまともにうごいてますた
0023デフォルトの名無しさん
2009/01/27(火) 11:50:260024デフォルトの名無しさん
2009/01/27(火) 12:02:39もっと早くなりそうだったら、と思いうpしますた
きたなくてすいません
センスのない変数ネーミングですいません
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8748.c
0025デフォルトの名無しさん
2009/01/27(火) 12:23:18実行してなくて以下完全に妄想で。
>>12さんの言うようにmallocのコスト減らしたいので
メモリの無駄を許容できるならfilename=calloc()のときに一緒にバカでかいテーブル作ってもいいかも。
あとstrcpy(filename[i], entry->dname);一発にすればtemp[]への一時strcpy()いらなくね?とか
0026デフォルトの名無しさん
2009/01/27(火) 12:38:16処理中にファイルが増えるとまずいコードになってる
できれば1回で読みながらファイル数を数えるべきだけど
せめて2回目に読むときにiがcountを越えないようにするべき
0027デフォルトの名無しさん
2009/01/27(火) 12:44:16動的配列は使えないってことですか
0028デフォルトの名無しさん
2009/01/27(火) 13:36:38realloc()で増やしながら回すとかかな
0029デフォルトの名無しさん
2009/01/27(火) 13:56:470030デフォルトの名無しさん
2009/01/27(火) 13:59:30数万件程度のシャッフルなんてミリ秒オーダーで十分だろ。
組み込み系のマイコンでも使ってるのか?
0031デフォルトの名無しさん
2009/01/27(火) 14:02:30すんまへん。。。ソースは>>24です
003212
2009/01/27(火) 14:28:33dataディレクトリに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
0033デフォルトの名無しさん
2009/01/27(火) 14:35:570034デフォルトの名無しさん
2009/01/27(火) 14:46:29#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まで処理がたどり着きません。
何が問題なのでしょうか
0035デフォルトの名無しさん
2009/01/27(火) 14:56:17とか
0036デフォルトの名無しさん
2009/01/27(火) 15:10:52func()の引数はポインタ配列が期待されているはずだが・・・
0037デフォルトの名無しさん
2009/01/27(火) 15:41:503万個の乱数を生成するには、15bit*30000ビット=45万bit必要。
順列と整数を一対一対応されるのは上の計算から40万bit必要。
少し減らせるだけであんまり変わらないか
0038デフォルトの名無しさん
2009/01/27(火) 15:44:130039デフォルトの名無しさん
2009/01/27(火) 15:52:46#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"); }}
0040デフォルトの名無しさん
2009/01/27(火) 15:54:580041デフォルトの名無しさん
2009/01/27(火) 16:35:37004212
2009/01/27(火) 16:36:47今2回走査してるのを1回にすればずいぶん速くなった。
filenameをreallocするようにしてもreadirの回数が半分になるコストダウンの方が大きく、
実行時間はおよそ半分になりました。
参考まで。
0043デフォルトの名無しさん
2009/01/27(火) 17:21:240044デフォルトの名無しさん
2009/01/27(火) 17:33:17一応変えた範囲を貼っとくけど、ずいぶんやっつけですよ。
/*
//総ファイル数カウント
(中略)
//ポインタを先頭へ
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);
0045デフォルトの名無しさん
2009/01/27(火) 17:40:31な、なるほど・・・ありがとう
0046デフォルトの名無しさん
2009/01/27(火) 20:42:55一つのHDDでCドライブを起動ディスク、Dドライブをデータディスクにして
パーティションを分けています
デフラグしたところ、Dドライブの直下に突然
msvci70.dllというのが出てきました、説明欄にMicrosoftR C++ Runtime Library
とありますがこのファイルは本来どこにあるべきものでしょうか?
0047デフォルトの名無しさん
2009/01/27(火) 20:59:36君のPCなら好きにしろ
要らなければ消せ
0048デフォルトの名無しさん
2009/01/27(火) 21:03:55何が4行なの?
0049デフォルトの名無しさん
2009/01/27(火) 21:05:150050デフォルトの名無しさん
2009/01/27(火) 21:15:280051デフォルトの名無しさん
2009/01/27(火) 21:16:48了解しました
消しときます
0052デフォルトの名無しさん
2009/01/27(火) 21:18:42これはひどいwww
0053デフォルトの名無しさん
2009/01/27(火) 21:20:28main関数だろ
shuffle関数は5行だ
0054デフォルトの名無しさん
2009/01/27(火) 21:29:170055デフォルトの名無しさん
2009/01/27(火) 23:07:24p = (int *)0x3333
char *array[10]
array = (char *)0x5555
これらはどのような動きをしているのでしょうか?
0056デフォルトの名無しさん
2009/01/28(水) 01:04:09ねーよw
0057デフォルトの名無しさん
2009/01/28(水) 01:05:590058デフォルトの名無しさん
2009/01/28(水) 01:07:280059デフォルトの名無しさん
2009/01/28(水) 01:09:24こういうことすか?
標準関数のライブラリはオブジェクトファイルが容易してあって、
そのヘッダファイルをリンクするだけでビルドできちゃう。
でも、DLLの関数はオブジェクトファイルじゃなくてライブラリなんだからロードしてつかわなきゃだめでしょ
ってことですか?
0060デフォルトの名無しさん
2009/01/28(水) 01:13:12どうすれば配列にメモリ割り当てられますか?
0061デフォルトの名無しさん
2009/01/28(水) 01:17:510062デフォルトの名無しさん
2009/01/28(水) 01:18:29標準関数であっても、それがオブジェクトファイルで用意されているか
静的ライブラリか動的ライブラリかは環境依存。
また、それらを明示する必要があるかどうかも同様。
例えばunix系のgccではmath.hで宣言されている標準関数は明示的に
ライブラリを指定する必要(-lm)があるが、iccではその必要がない。
0063デフォルトの名無しさん
2009/01/28(水) 01:18:55つーか、何がしたいのさ。
0064デフォルトの名無しさん
2009/01/28(水) 01:19:39自分でアドレスを指定したいのです
0065デフォルトの名無しさん
2009/01/28(水) 01:21:350066デフォルトの名無しさん
2009/01/28(水) 01:24:01もしかして配列の要素数だけ指定しないといけないのでしょうか?
0067デフォルトの名無しさん
2009/01/28(水) 01:24:500068デフォルトの名無しさん
2009/01/28(水) 01:26:170069デフォルトの名無しさん
2009/01/28(水) 02:00:11何がしたいのか書いて欲しい
int i; /* iをintで宣言 */
みたいな感じではなく。
0070デフォルトの名無しさん
2009/01/28(水) 02:07:42大抵変数でも構造体でも配列でも実行したら適当なメモリ番地に格納されますよね
それを指定したいわけです。テストする際でも、メモリ番地変更の必要があるとエラーがでたりするので
0071デフォルトの名無しさん
2009/01/28(水) 02:10:470072デフォルトの名無しさん
2009/01/28(水) 02:10:48なぜ必要になる事があるんだ
0073デフォルトの名無しさん
2009/01/28(水) 02:28:490074デフォルトの名無しさん
2009/01/28(水) 02:33:03みたいな感じだったな
007569
2009/01/28(水) 03:08:54おやすみorz
0076デフォルトの名無しさん
2009/01/28(水) 06:27:330077デフォルトの名無しさん
2009/01/28(水) 07:15:20array = (char(*)[10])0x5555;
0078デフォルトの名無しさん
2009/01/28(水) 07:44:56それはどういう意味なのでしょうか?
0079デフォルトの名無しさん
2009/01/28(水) 09:35:48任意のメモリアドレスにアクセスしたければ、ポインタを書き換えればいいでしょ。
なんでそれじゃ駄目なの?
0080デフォルトの名無しさん
2009/01/28(水) 10:29:23正式に確保してないからいつ内容がぶっ壊されても文句言えないけどな
0081デフォルトの名無しさん
2009/01/28(水) 10:31:44ソース上は静的な構造体にまとめといて
リンカ/ローダで物理アドレス指定するのが
16ビット時代の俺の常識。
>>75
ドンマイw
0082デフォルトの名無しさん
2009/01/28(水) 10:34:460083デフォルトの名無しさん
2009/01/28(水) 10:52:40失せろゴミ
0084デフォルトの名無しさん
2009/01/28(水) 11:26:45x86の32bitはセグメントにいろいろ属性が付けられるから(NXビットを
入れるとreadonlyも出来る)アドレスはいじらない方がよかれ
0085デフォルトの名無しさん
2009/01/28(水) 11:47:04そういう意味じゃなくてOSからはmmuを介する仮想アドレスしか触れないんじゃないの?
って言う意味での質問だったの
0086デフォルトの名無しさん
2009/01/28(水) 11:50:340087デフォルトの名無しさん
2009/01/28(水) 21:56:42分割する関数(split)と,併合する関数(merge)は何とか作れたんですが
これらを上手く組み合わせることができないです.
merge関数をソート済みの2つの配列を併合する場面で利用するのはわかるんですが
split関数のどこで呼び出せばよいかがわかりません.
ウェブ上に上手いソースコードはたくさんあるんですが,
理解したいので,手ほどきのほう,よろしくお願いいたします.
008887
2009/01/28(水) 21:59:00int 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);
}
0089デフォルトの名無しさん
2009/01/28(水) 21:59:10分からんなら、どこが分からんか言った方がいいよ
009087
2009/01/28(水) 21:59:43int 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++;
}
}
}
009187
2009/01/28(水) 22:10:35上記の,分割までして表示する関数と
ソートされた2つの配列を併合する関数までは自分で作りました.
この2つを上手く組み合わせれば,できるはずなんですが
ちょっとプログラムに起こせなくて,行き詰ってたので
ヒントでもいただけたらと思って,投稿いたしました.
0092デフォルトの名無しさん
2009/01/28(水) 22:13:54入力の配列を1要素1要素分けて注目すれば、既に分割されているのと同じことになるから。
0093デフォルトの名無しさん
2009/01/28(水) 22:23:17こんな感じじゃないの?sort()のなかにmarge()と分割が入って再帰する。
sort(配列, 要素数){
if(要素数=<2){return 2要素をソートした配列}
分割位置 = 要素数/2;
sort(配列の前半);
sort(配列の後半);
marge(配列の前半, 配列の後半, 結果);
return 結果;
}
0095デフォルトの名無しさん
2009/01/28(水) 22:45:18こんなことをするにはどういう手法があるでしょうか?
よろしくお願いします。
0096デフォルトの名無しさん
2009/01/28(水) 22:47:210097デフォルトの名無しさん
2009/01/28(水) 22:53:00が簡単に出来るのだから
typedef FuncPtr(MyClass::*FuncPtr)();
も何か方法があるのでは?という質問です。
よろしくお願いします。
0098デフォルトの名無しさん
2009/01/28(水) 22:57:490099デフォルトの名無しさん
2009/01/28(水) 23:33:44#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
}
}
0100デフォルトの名無しさん
2009/01/28(水) 23:45:490101デフォルトの名無しさん
2009/01/29(木) 19:30:13010287
2009/01/29(木) 23:15:33そりゃどうあがいても無理ですね.
本末転倒ですみませんでした.
0103デフォルトの名無しさん
2009/01/30(金) 02:09:32上のソースのエラーが取れません。
修正していただけませんか?
0104デフォルトの名無しさん
2009/01/30(金) 02:15:490105デフォルトの名無しさん
2009/01/30(金) 02:21:08うpしました!
0106デフォルトの名無しさん
2009/01/30(金) 02:28:34↓
(dt *)calloc
->の前後に空白入れるの初めて見たかも。
0107デフォルトの名無しさん
2009/01/30(金) 02:30:05宣言は関数のはじめに行う。
とりあえずこれだけでコンパイルは通ったよ。
動かしてないけど。
int main(void) {
struct dt *top;
struct dt *tmp;
struct dt *oldtmp;
struct dt *old1tmp;
0108デフォルトの名無しさん
2009/01/30(金) 02:31:59ソースの内容はいかにもベターCという感じだけど。
なので、宣言の位置が問題なのではなく、暗黙の型変換が問題になる
0109デフォルトの名無しさん
2009/01/30(金) 02:33:32Cとしてコンパイルしてた。
0110103
2009/01/30(金) 02:52:25ありがとうございました!
0111デフォルトの名無しさん
2009/01/30(金) 02:52:56ループを抜けないようにするにはどこを修正したら良いのでしょうか?
関数はポインタを使う形でお願いします
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になるまでループ
}
0112デフォルトの名無しさん
2009/01/30(金) 02:55:20↓
}while(!(1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ
0113デフォルトの名無しさん
2009/01/30(金) 02:56:18}while(!((1<=*l_Scan) && (*l_Scan<=10))); //縦の値が1〜10になるまでループ
0114デフォルトの名無しさん
2009/01/30(金) 02:58:54正しい値を入力してもループが終わらないのですが…
0115デフォルトの名無しさん
2009/01/30(金) 03:04:10↓
printf("縦(1〜10):"); scanf_s("%d",l_Scan);
0116デフォルトの名無しさん
2009/01/30(金) 03:09:01正しく動作するのですが、正しい値を入力するとデバッグエラーが起きてしまいます
0117デフォルトの名無しさん
2009/01/30(金) 03:19:26void ScanPiecePosition(int *, int *);
0118デフォルトの名無しさん
2009/01/30(金) 03:26:09原因はこのループの下に「*l_Scan=l_s;」という文を書いていたからでした
こんな夜分にお騒がせしてすみませんでした
0119デフォルトの名無しさん
2009/01/30(金) 03:32:00それを生かすなら、do〜whileでのl_Scanを全部l_sにすればいいよ。
まるまる置換ではなく、
if(*l_Scan != 0) //入力2回目以降のみ判断する
↓
if(l_s != 0) //入力2回目以降のみ判断する
みたいに、型を意識しつつ置き換え。
あと、0が入力されたら何も言わずに再入力になるけど、そこは大丈夫だろうか。
0120デフォルトの名無しさん
2009/01/30(金) 03:42:37void 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になるまでループ
}
0121デフォルトの名無しさん
2009/01/30(金) 04:26:240122デフォルトの名無しさん
2009/01/30(金) 12:30:34何故ポインター渡しなの?
0123デフォルトの名無しさん
2009/01/30(金) 19:39:55ポインターを使う事が目的なので
0124デフォルトの名無しさん
2009/01/30(金) 20:05:19と
Microsoft Visual C++ 2008 Express Editionの違いを教えてください
0125デフォルトの名無しさん
2009/01/30(金) 20:20:06Microsoft Visual Studio ⊂ Microsoft Visual C++ 2008 Express Edition
0126デフォルトの名無しさん
2009/01/30(金) 20:21:070127デフォルトの名無しさん
2009/01/30(金) 20:39:56スタジオにはC++やらBASICやらC#やらが集まってる
0128デフォルトの名無しさん
2009/01/30(金) 20:43:31ってことであってますか?
前者が指定されてる授業で後者使ってても大丈夫ですかね?
0129デフォルトの名無しさん
2009/01/30(金) 20:45:14ありがとうございます。
>>128のまるっきり逆ですね
0130デフォルトの名無しさん
2009/01/30(金) 20:53:59MFC使ってたらだけど
0131デフォルトの名無しさん
2009/01/31(土) 00:23:36staticを付けたメンバ関数の特徴としては
・メンバにアクセスできない(データ、メソッド)
・スコープ解決演算子でインスタンスが無くても呼べる
これ以外に特徴ありますでしょうか
例えばprivateにはするな、とか実行速度が落ちるとか
0132デフォルトの名無しさん
2009/01/31(土) 00:33:02>・メンバにアクセスできない(データ、メソッド)
クラスメンバにも?
0133デフォルトの名無しさん
2009/01/31(土) 00:38:35要するに、static メンバ関数ってのは、
普通の関数を単にクラス内に記述しただけのものだ。
class A {
public:
static void foo();
};
も
namespace A {
void foo();
}
も似たようなもんだ。
ただ、A は名前空間じゃないから using A; なんてできないし、
A はクラスだから protected や private にして
アクセス可能な範囲をコントロールすることができる。
>メンバにアクセスできない(データ、メソッド)
static メンバ変数にはアクセスできるぜ。
>例えばprivateにはするな、とか実行速度が落ちるとか
無茶苦茶なことを言うものではない。
private にしても問題ないし、
普通のメンバ関数より this を渡さなくて良い分実行速度は僅かに速い。
0134デフォルトの名無しさん
2009/01/31(土) 00:39:170135デフォルトの名無しさん
2009/01/31(土) 00:41:400136デフォルトの名無しさん
2009/01/31(土) 00:57:14自分のメンバどす
>>133
サンクス!
まさに聞きたかった答え!!ありがとう!
・普通の関数ポインタに代入できる
・staticメンバにはアクセスできる
・thisを渡さない分高速 ですね
0137デフォルトの名無しさん
2009/01/31(土) 10:49:40インスタンスを指定すればprivateなメンバにもアクセスできるよ。
ptr->aみたいに
0138デフォルトの名無しさん
2009/01/31(土) 13:15:50void 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文をつかうしかないのですかね?
0139デフォルトの名無しさん
2009/01/31(土) 13:24:27return;
}
か?
0140デフォルトの名無しさん
2009/01/31(土) 13:28:09コンパイルは出来るのですが、while文が終了されません・・・・
0141デフォルトの名無しさん
2009/01/31(土) 13:30:10while(bbb());
}
int bbb(){
int a;
cin >> a;
switch(a){
case 1:
return 0;
case 2:
}
return 1;
}
0142デフォルトの名無しさん
2009/01/31(土) 13:33:09breakが全く分かってないな
ちなみにgotoで c()の中から
aaa() のwhile直後に飛ぼうとするのは絶対にやってはいけない
0143138
2009/01/31(土) 13:44:06>>case 1:
>>return 0;
すいませんが、直接case 1:の処理としてreturnするのではなく、
あくまで関数cccの処理としてwhileを終了したいんですが・・・
0144デフォルトの名無しさん
2009/01/31(土) 13:49:40void aaa(){
flag = 1;
while(flag){
bbb();
}
}
void bbb(){
int a;
cin >> a;
switch(a){
case 1:
ccc();
break;
case 2:
}
}
void ccc(){
flag=0;
}
0145デフォルトの名無しさん
2009/01/31(土) 13:52:060146デフォルトの名無しさん
2009/01/31(土) 13:58:030148デフォルトの名無しさん
2009/01/31(土) 14:15:33「設計が悪い」しか答えはない
他の方法を考える
0149デフォルトの名無しさん
2009/01/31(土) 15:22:460150デフォルトの名無しさん
2009/01/31(土) 20:01:520151デフォルトの名無しさん
2009/01/31(土) 23:56:520152デフォルトの名無しさん
2009/02/01(日) 00:39:36NETだと消していけないのでまよってました
0153デフォルトの名無しさん
2009/02/01(日) 06:17:180154デフォルトの名無しさん
2009/02/01(日) 07:33:240155デフォルトの名無しさん
2009/02/01(日) 07:44:22数値を表記したいと思った時に初めて、進数という概念が現れる
0156デフォルトの名無しさん
2009/02/01(日) 12:55:130157デフォルトの名無しさん
2009/02/01(日) 17:16:350158デフォルトの名無しさん
2009/02/01(日) 17:18:200159デフォルトの名無しさん
2009/02/01(日) 20:26:29GetMessage(&msg, NULL, 0, 0);
switch (msg){
case WM_〜:
実行内容;
}
みたいなウィンドウメッセージのスイッチ文ってどうやったらちゃんとできるんですか?
「switch 文の選択式は整数型でなければならない」
というメッセージで弾かれまくりです。
0160デフォルトの名無しさん
2009/02/01(日) 20:27:090161デフォルトの名無しさん
2009/02/01(日) 23:24:06ググったりはしてみたが分からないorz
0162デフォルトの名無しさん
2009/02/02(月) 00:18:31MSG っていうのは構造体で中に色々入っている。
今回はメッセージ番号を使って振り分けたいのでそのうちの message というメンバを使うため、
switch(msg.message) { // 以下略
となる。
0163デフォルトの名無しさん
2009/02/02(月) 00:23:10ここで詰まるのだろうか。
こういう基本的な所は、もろ「こう書きますよ」って例が書いてあると思うのだが。
0164デフォルトの名無しさん
2009/02/02(月) 00:27:410165デフォルトの名無しさん
2009/02/02(月) 00:44:47QBのselect case文は柔軟だからなー。QBって懐かしいでしょ?むふ♥
0166デフォルトの名無しさん
2009/02/02(月) 00:54:400167デフォルトの名無しさん
2009/02/02(月) 01:07:17class A { virtual func()=0; };
class B : public
0168デフォルトの名無しさん
2009/02/02(月) 01:10:18class A { virtual func(){} ~A(){ func(); } };
class B : public A { func(){} };
どうして出来ない仕様なのか。
0169デフォルトの名無しさん
2009/02/02(月) 01:56:00派生クラス自身のコンストラクタで始まり、派生クラス自身のデストラクタで終わるというモデルのため。
基底クラスのデストラクタが呼ばれるとき、そこにあるのは基底クラス部分オブジェクト。
派生クラスのインスタンスがない以上、派生クラスの関数を呼べるわけがないという理屈。
0170デフォルトの名無しさん
2009/02/02(月) 08:15:30それならswitch文使うなよ
0171デフォルトの名無しさん
2009/02/02(月) 11:16:23ありがとうございます。
意味が分かってきました。
とりあえずコンパイルは通ったので、色々試してみます。
0172デフォルトの名無しさん
2009/02/02(月) 16:11:24MSG 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 );の行で待機状態になっているようです。
なんらかのウィンドウメッセージが送られていて次の行に進んでもおかしくないような気がするのですが、一体何が問題なのでしょう?
0173デフォルトの名無しさん
2009/02/02(月) 17:31:070174デフォルトの名無しさん
2009/02/02(月) 18:17:19printfが使えないことに混乱したり、何かごちゃごちゃになっているようです。
0175デフォルトの名無しさん
2009/02/02(月) 18:32:490176デフォルトの名無しさん
2009/02/02(月) 18:37:430177デフォルトの名無しさん
2009/02/02(月) 18:43:04int *abc;
sub(){
/*ここでabc配列を弄りたい*/
}
main(){
abc = (int *)calloc(10, sizeof(int));
sub();
}
こういうことってできますか?
0178デフォルトの名無しさん
2009/02/02(月) 18:50:370179デフォルトの名無しさん
2009/02/02(月) 18:54:290180デフォルトの名無しさん
2009/02/02(月) 19:07:39#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);
}
セグメンテーション違反が倒せません
0181デフォルトの名無しさん
2009/02/02(月) 19:10:47おまえのPCは64GBもメモリ積んでるのか。
0182デフォルトの名無しさん
2009/02/02(月) 19:11:240183デフォルトの名無しさん
2009/02/02(月) 19:12:570184デフォルトの名無しさん
2009/02/02(月) 19:14:550185デフォルトの名無しさん
2009/02/02(月) 19:16:340186デフォルトの名無しさん
2009/02/02(月) 19:20:240187デフォルトの名無しさん
2009/02/02(月) 19:22:0864個ほど同時に開いて[]をオーバーロードする。
0188デフォルトの名無しさん
2009/02/02(月) 19:29:380189デフォルトの名無しさん
2009/02/02(月) 19:41:020190デフォルトの名無しさん
2009/02/02(月) 19:47:260191デフォルトの名無しさん
2009/02/02(月) 19:50:23#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
0192デフォルトの名無しさん
2009/02/02(月) 19:51:480193デフォルトの名無しさん
2009/02/02(月) 19:55:25アドレス32bitなら、当然といえましょう。
0194デフォルトの名無しさん
2009/02/02(月) 20:12:18サンプル
>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;
>--->}
>}
0195デフォルトの名無しさん
2009/02/02(月) 20:18:43ちゃんとmalloc()の戻り値がNULLかどうかチェックしてください。
NULL+262143*sizeof(int) がたまたまアクセスできる場所だっただけに
見える。
0196デフォルトの名無しさん
2009/02/02(月) 20:25:12なんで関数作らないんだ?
0197デフォルトの名無しさん
2009/02/02(月) 20:27:19実験か。コンパイラはなんですか?
0198デフォルトの名無しさん
2009/02/02(月) 20:34:09gcc4.1.2?
0199デフォルトの名無しさん
2009/02/02(月) 20:47:36mallocの戻り値がNULLじゃないからといってそこが使用可能な領域かどうかが分からないから、だったかな。
0200デフォルトの名無しさん
2009/02/02(月) 20:49:55意味分からん。
NULLだったらダメなのには変わらないだろ。
0201デフォルトの名無しさん
2009/02/02(月) 20:59:37そんな派は見たことねー。
NULLのまま突っ走ったら予想外なところで落ちたりたまたま落ちずに誤
動作したりで良いことないので、malloc()の戻り値はNULLチェックする
以外あり得ない。
C++の例外はキャッチしても無意味派と勘違いしてない?
0202デフォルトの名無しさん
2009/02/02(月) 21:01:07違うよ。
0203デフォルトの名無しさん
2009/02/02(月) 21:05:120204デフォルトの名無しさん
2009/02/02(月) 21:08:030205デフォルトの名無しさん
2009/02/02(月) 21:08:500206デフォルトの名無しさん
2009/02/02(月) 21:17:320207199
2009/02/02(月) 21:28:25確かmallocのmanに、、、と思って見てみたらそれだったようでした。
お騒がせしました。
あと、>>180の
abc = (int *)calloc(68719476736, sizeof(int));
ですが、size_tこえてない?
0208194
2009/02/02(月) 21:31:23mainの再起呼出を問うてるので、明示的に意味の無いプログラムを書いた。
プロセス途中で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++じゃ使えないそうだし)
0209デフォルトの名無しさん
2009/02/02(月) 21:33:300210208=194
2009/02/02(月) 21:37:40全然洗練して無い、発想だけど、そうゆう事。
ゲームが進むと言っても、main呼び出すのは1ゲーム終わる度だし、回数はそんなに多くないと推測した上で。
簡易マルチタスクとか、なんかスゲー利用法とかないんかな?
0211デフォルトの名無しさん
2009/02/02(月) 21:41:440212デフォルトの名無しさん
2009/02/02(月) 21:51:45ただ、引数に制約があるから使いやすいとは思わないけど。
0213デフォルトの名無しさん
2009/02/02(月) 22:02:01今、C++の勉強を必死にやって、意味ある?
新しいC++の仕様って、Cの最新の仕様みたいに
仕様はあるけど誰も使わない、みたいな感じになったりするのかな
0214デフォルトの名無しさん
2009/02/02(月) 22:07:46wchar_t pop[]=L"漢字";
if(pop[0]==L'漢') 結果;
if(pop[1]==L'字') 結果;
あと、char 〜 wchar_Tに変換って難しいですか?
0215デフォルトの名無しさん
2009/02/02(月) 22:09:13C89で十分と言う人は多いだろうが、C++03で十分と言う人は少ないはず。
0216デフォルトの名無しさん
2009/02/02(月) 22:09:29変換はAPコールI一発でできるよ。
0217デフォルトの名無しさん
2009/02/02(月) 22:11:21それは9割9分問題ない。
charとwchar_tの変換は、文字列全体を一括してやるならそう面倒な話ではない。
1文字ずつとか数バイトずつとかだと死ねる。
0218デフォルトの名無しさん
2009/02/02(月) 22:18:47もし長大なプログラムをコンパイルする際にこの環境変数で指定した領域が満タンになったら、どんなことになりますか?
0219デフォルトの名無しさん
2009/02/02(月) 22:22:40エラーでとまるんじゃね?
ただ落ちるだけかもしれんけど。
0220デフォルトの名無しさん
2009/02/02(月) 22:25:48そんなに大きくないRAMディスクをTEMPに割り当てているので稀に遭遇する。
0221デフォルトの名無しさん
2009/02/02(月) 22:36:26C++ だと main の再帰呼び出しは規格で禁止されている。
>213
既に部分的に実装が始まっているので誰も使わないってことはないかと。
フルスペックで使えるまでには時間かかるかもしれんが。
変態ライブラリを書くような人間にとっては C++0x は大幅変更だろうが、
利用者側としてはいくつか便利な機能が追加されたくらいなもんだと思う。
少なくとも、勉強したことのほとんどはそのまま役に立つだろう。
0223デフォルトの名無しさん
2009/02/02(月) 22:46:08で、文字配列を宣言
y と z をint型の変数として、
yに文字列の長さが代入
zに文字列中の数字の数が代入
されるようにするにはどうすればいいんでしょう?
0224デフォルトの名無しさん
2009/02/02(月) 22:46:51という問題なんですが…ifも使わなきゃいけないというところがわかりません
どうすればよいのですか??
0225デフォルトの名無しさん
2009/02/02(月) 22:49:28あとは簡単だろう
0226デフォルトの名無しさん
2009/02/02(月) 22:50:02なんでこうばかばかしい問題だすんだろ。
0227デフォルトの名無しさん
2009/02/02(月) 22:55:26while(条件){式}
はどのように書き換えたらよいのですか?
初心者なんでわからなくて・・・
0228デフォルトの名無しさん
2009/02/02(月) 23:01:01if(cnd){
do{
...
}while(cnd);
}
みたいなこと?
0229デフォルトの名無しさん
2009/02/02(月) 23:01:12そこまで分かってるなら、それを if で実現してやればいいだけだろう
0230デフォルトの名無しさん
2009/02/02(月) 23:01:34お前なあ・・・
0231デフォルトの名無しさん
2009/02/02(月) 23:02:390232デフォルトの名無しさん
2009/02/02(月) 23:04:300233デフォルトの名無しさん
2009/02/02(月) 23:04:31if(cnd){
...
}
}while(cnd);
0234デフォルトの名無しさん
2009/02/02(月) 23:04:57だめじゃないけど、空気読んでよw
>>227
判断材料はそろってるんだから、応用力の問題でしょ。
初心者かどうかはあまり関係ない。
0235デフォルトの名無しさん
2009/02/02(月) 23:06:02そういうことか。
0236デフォルトの名無しさん
2009/02/02(月) 23:06:05y = strlen(x);
z = atoi(x);
0237デフォルトの名無しさん
2009/02/02(月) 23:06:48そんなルール聞いたことねえよ
0238デフォルトの名無しさん
2009/02/02(月) 23:11:28あれって、チクるやついないのだろうか。
0239デフォルトの名無しさん
2009/02/02(月) 23:14:38mixiはともかく、2chくらいチェックしてるだろ。
その旨、課題に書いてある学校もあるし。
0240デフォルトの名無しさん
2009/02/02(月) 23:16:050241デフォルトの名無しさん
2009/02/02(月) 23:17:18おお、こんなのあったんですね。ありがとうございます。
0242デフォルトの名無しさん
2009/02/02(月) 23:17:58仕方ないので新しくスレたてようと思います!
0243デフォルトの名無しさん
2009/02/02(月) 23:22:09これってどういう意味になりますか?
0244デフォルトの名無しさん
2009/02/02(月) 23:23:410245デフォルトの名無しさん
2009/02/02(月) 23:24:220246デフォルトの名無しさん
2009/02/02(月) 23:42:19define SIZE (7*16*16*16+7*16*16*+7*16+7)
int test[SIZE]
とか?
>>221
ノ 208
0247デフォルトの名無しさん
2009/02/02(月) 23:48:13>>180見た後だと何の違和感も感じないな
0248180
2009/02/02(月) 23:55:110249デフォルトの名無しさん
2009/02/02(月) 23:55:34ありがとうございます。
私も>>220さんと同様にRamDisk(約2.7GB)をTempフォルダにしており、
フリーズしたりしないのかと思って聞いてみた次第です。
さっきまでOSが定めるTempフォルダを使ってると気付いてなかったのですが、
「Z:\Temp Files」のフォルダ名にスペースが入ってたのがまずかったらしく、
コンパイル時にZ:\Tempは存在しない的なメッセージが出て気付きました。
Temp領域が狭いと意外なプログラムで問題が出る可能性がありそうですね。
0250デフォルトの名無しさん
2009/02/03(火) 00:06:45インターネット一時ファイル置き場も小さいと時々問題が。
0251デフォルトの名無しさん
2009/02/03(火) 00:08:54何が起こりますか?
こちらは250MBしか設定してないけど今のところ大丈夫です。
0252デフォルトの名無しさん
2009/02/03(火) 00:24:41処理内容を別関数で実装して配列を引数として与えたところ、一行目の要素以外が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はグローバルで定義しています。
エラーは出ていないので値の引き渡し自体は問題ないと思うのですが…
0253デフォルトの名無しさん
2009/02/03(火) 00:25:20遭遇したことがないからしらんけど
0254デフォルトの名無しさん
2009/02/03(火) 00:31:12nは#defineで定義してるの?
0255デフォルトの名無しさん
2009/02/03(火) 00:33:49汎用性を持たせることが用件にあったので、行列のサイズはある程度可変にしたかったんです。
0256デフォルトの名無しさん
2009/02/03(火) 00:36:120257デフォルトの名無しさん
2009/02/03(火) 00:38:21グローバル変数は値をあげてやらないと定義できないのでしょうか?
0258220
2009/02/03(火) 00:41:102.7GBもあればまず大丈夫だろう。
俺んとこのRAMドライブ、96MBしか取っていないよ。
インターネット一時ファイルもそこだけど、
問題になりそうなときは別のダウンローダ使う。
スレ違いすまん。
0259デフォルトの名無しさん
2009/02/03(火) 00:44:14本当だ。コンパイルできな。
引数の配列のサイズ指定に変数使っても、エラーにならないんだな。
0260デフォルトの名無しさん
2009/02/03(火) 00:49:23コンパイラが無視してるんじゃないの?
c言語で、配列と言う考え方は軽んじられて、ポインタ格下げが主だし。
グローバル宣言や関数の引数でも実質意味無い部分は省略だし。
参考になるかな http://www.kouno.jp/home/c_faq/c6.html#0
0261デフォルトの名無しさん
2009/02/03(火) 00:51:28VC起動するのがめんどうだったから、codepadでコンパイルしたけど、
C99なのかなって気もする。
0262デフォルトの名無しさん
2009/02/03(火) 00:51:46サイズが可変ということでどうしても変数を使って指定せざるをえなかったので…
しかし、なぜか配列内の値がかわってしまっているんです
実行の前後で出力してみたので関数呼び出しの引数引き渡しが原因だとにらんでいるのですが…
0263デフォルトの名無しさん
2009/02/03(火) 00:55:20このページは調べている時に見たんですが、その時は関数への引き渡しでエラーを吐いていたときだったので
エラーが無くなった時点で解決した物としてスルーしていました。
もう一度熟読してみます。
0264デフォルトの名無しさん
2009/02/03(火) 01:04:41少なくとも、コンパイルできたって事は、何らかの方法で&A[0][0]は渡されているはず。
行列サイズに、変数が渡されたら、例えば初期化値が指定されてたり、
デフォルトのゼロ初期化で関数に通達されてれば、何が起こってもおかしくないのではないか。
>>263
c初級者(not初心者)〜 は読んで損ない、かなり現状を忠実に語ってる文献だと思う
0265デフォルトの名無しさん
2009/02/03(火) 01:07:55ようするに、引き渡しには問題はなく、むしろ関数Hの仮引数のサイズ指定がおかしくなっている可能性があるということであってますか?
そちらもにらんで改善策を考えたいと思います。
0266デフォルトの名無しさん
2009/02/03(火) 01:10:54C99だよ。可変長配列は自動変数だけでなく引数も対象。
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];
{
0267デフォルトの名無しさん
2009/02/03(火) 01:14:16やっぱりサイズ指定に変数を使っちゃうとエラーこそでないものの、正しく指定出来ないようです。
今回は配列のサイズ上限として50を指定していたので仮引数のサイズも50として、
実際に数値が入っている部分だけでなく全体を引き渡すようにしたら上手くいきました!
アドバイスをくれた方々、本当にありがとうございました!
またさんざん調べて解らないことがあったら訊きにきますw
0268デフォルトの名無しさん
2009/02/03(火) 01:16:02引数の順番を変えるだけで上手くいくのですか!
そっちもためしてみます!
0269デフォルトの名無しさん
2009/02/03(火) 01:25:29A 先頭ポインタだけ指定して、関数内でポインタ処理する
B 2次元配列でなく、ポインタのポインタで渡せるようにする
0270デフォルトの名無しさん
2009/02/03(火) 01:30:33関数に渡した時点で配列ではなくポインタになってしまうのなら始めからポインタ使えってことなんでしょうか?
0271デフォルトの名無しさん
2009/02/03(火) 03:04:39遅レスになったが、250MBを超えるファイルをダウンロードできないと思う
0272デフォルトの名無しさん
2009/02/03(火) 06:02:32もしかしてWin?
0273デフォルトの名無しさん
2009/02/03(火) 08:04:03そんなルールない
勝手に作るな
0274デフォルトの名無しさん
2009/02/03(火) 13:11:19配列とポインタには相互に互換があると習いませんでした?
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の仕様。
0275デフォルトの名無しさん
2009/02/03(火) 13:29:25>配列とポインタには相互に互換があると習いませんでした?
ネタか?ただ、同じくアドレス返すだけだわな。
int ATAI(int& i , int n) { return *(&i +n); }
この関数も行列と互換あるのか。初めて知ったわ。
因みに、2次元配列って知ってる? sizeofって知ってる?
0276274
2009/02/03(火) 13:38:350277274
2009/02/03(火) 13:43:130278デフォルトの名無しさん
2009/02/03(火) 16:52:05いいや、一時ファイルの設定量を超えても、ディスクに空きがある限り大丈夫。
そうなったらたしか、ダウンロード終了後即座に削除されるはず。
0279デフォルトの名無しさん
2009/02/03(火) 17:40:460280デフォルトの名無しさん
2009/02/03(火) 18:12:46>>249
0281デフォルトの名無しさん
2009/02/03(火) 18:16:11話の流れで250MBのRAMディスクを想定してレスをしたよ。
0282デフォルトの名無しさん
2009/02/03(火) 19:36:06do-while嫌いだからif whileで書くことは良くある。俺は
0283デフォルトの名無しさん
2009/02/03(火) 19:40:47while(1){
...
if(!cnd)break;
...
}
条件の後にも処理が入れられるけど、どうかな・・・
0284デフォルトの名無しさん
2009/02/03(火) 19:41:12i=0;
while (i<10)
{
〜〜
i++;
}
とかみたいなね。
0285デフォルトの名無しさん
2009/02/03(火) 19:42:13} while ( );
じゃないの?
0286デフォルトの名無しさん
2009/02/03(火) 19:43:58領域確保&初期化したくて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);
}
0287デフォルトの名無しさん
2009/02/03(火) 19:45:460288デフォルトの名無しさん
2009/02/03(火) 19:46:1464ビットなコンピュータ使え。
そして載せられるだけメモリを載せろ。
0289デフォルトの名無しさん
2009/02/03(火) 19:47:27そのプログラムがいったい何バイト確保しようとしてるか、電卓でにらめっこすることだな。
0290デフォルトの名無しさん
2009/02/03(火) 20:13:46そんなに非常識に超巨大な配列で何がしたいの
気になるので教えてくれ
0291デフォルトの名無しさん
2009/02/03(火) 20:14:44>>191
0293デフォルトの名無しさん
2009/02/03(火) 20:21:03for(i=0; i<262144; i++)
{
abc[i] = (int *)calloc(262144, sizeof(int));
if (abc[i] == NULL)
{
printf("%d個目でメモリなくなりました\n", i);
return 1;
}
}
0294デフォルトの名無しさん
2009/02/03(火) 20:36:19帰ってこないですねぇ・・・・
0295デフォルトの名無しさん
2009/02/03(火) 20:50:50メモリ領域をリニアに取るんだからメモリの空き容量じゃなくて、メモリの空き方が元凶だと思う。
int a[10][10][10][10][10]; の配列宣言や、 int *****a; からメモリ確保して
呼び出し関数で、擬似的に連結するなら、メモリの空き容量でかたがつくでしょ?
0296デフォルトの名無しさん
2009/02/03(火) 20:55:500297295
2009/02/03(火) 21:07:39int a[5][5]; の時、(*(a+6) == a[1][0])が常に真なのは絶対保障されてる?
普通に考えると、ただ3次元の配列にしても、1次元と大差なさそうだが。
0298295
2009/02/03(火) 21:09:100299デフォルトの名無しさん
2009/02/03(火) 21:16:42intのポインタ配列で宣言するのと
intのポインタ配列へのポインタ配列(擬似2次元)では
まったく同じということですか?
0300デフォルトの名無しさん
2009/02/03(火) 22:03:39値を入れる入れ物の数は全部同じ。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次元的なものはあんま関係ないよね?
0301デフォルトの名無しさん
2009/02/03(火) 22:18:21スワップアウトでもしてんじゃないの?
0302デフォルトの名無しさん
2009/02/03(火) 23:20:23彼なら今、256GBのメモリを積んだシステムを構築中だよ。
0303デフォルトの名無しさん
2009/02/03(火) 23:22:55俺の知り合いを思い出したw
「おせぇおせぇよ!フリーズしてんじゃないの?」
・・・・HDDのアクセスランプを見ていない彼。
0304デフォルトの名無しさん
2009/02/04(水) 00:15:03int test[0x7777]
これは、testの変数のアドレスを0x7777とする意味なのでしょうか?
0305デフォルトの名無しさん
2009/02/04(水) 00:18:31配列は分かる?
0306デフォルトの名無しさん
2009/02/04(水) 00:26:49はい。では配列にアドレス指定をする場合はどうすればよいのでしょうか?
0307デフォルトの名無しさん
2009/02/04(水) 00:30:54まずその質問の意味がよく分からん。
あるメモリ領域を配列として扱いたいなら、ポインタを使えばいい話。
0308デフォルトの名無しさん
2009/02/04(水) 00:32:57>>304 は配列のサイズを16進で書いてるだけで、アドレスとは関係ないよ。
0309デフォルトの名無しさん
2009/02/04(水) 00:33:380x7777ってのはアドレスじゃないぞ
単なる16進法で書かれただけの数だ
ここでは配列の要素数を表す
0310デフォルトの名無しさん
2009/02/04(水) 00:34:5616進の数だからってアドレスだとは限らない
0311デフォルトの名無しさん
2009/02/04(水) 01:04:33いやされるぜ
0312デフォルトの名無しさん
2009/02/04(水) 01:57:57配列名もアドレスになるが、配列名はポインタと違って変更できない。
因みに、0x0010 = 0010(16) = 16(10) = 普通の16 が理解できるだろうか?括弧は何進数かを表す数学的表記。
0313デフォルトの名無しさん
2009/02/04(水) 06:53:43先ずは必要な記憶容量と搭載メモリ容量とOSを教えてくれ。
0314デフォルトの名無しさん
2009/02/04(水) 20:02:28INT版、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版の関数を呼び出すように設計したいのですが・・・
0315デフォルトの名無しさん
2009/02/04(水) 20:16:04intとfloatではデータの形式が違うから、それは無理。
テンプレート使え。
0316デフォルトの名無しさん
2009/02/04(水) 20:16:05void qsort(void* base, size_t n, size_t size, int(*fnc)(const void*, const void*));
http://tct.ivory.ne.jp/text/prog/C/note/qsort.htm
引数に比較用関数のポインタをとってる。
C++だったらテンプレートを使う方法もあり。
こちらも標準の algorithm 内の sort を確認してみて。
http://homepage2.nifty.com/well/sort.html
0317デフォルトの名無しさん
2009/02/04(水) 20:50:480318デフォルトの名無しさん
2009/02/04(水) 21:29:48このとき、2バイトで0xAABBをキャストしてAABBAABBとキャストすることは可能でしょうか?
キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
0319デフォルトの名無しさん
2009/02/04(水) 21:32:05キャストでは無理
>キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
うん
0320デフォルトの名無しさん
2009/02/04(水) 21:33:49符号有りならFFFFが付加する場合もある
0321デフォルトの名無しさん
2009/02/04(水) 21:39:31あってもなくても動き的にはかわらないとみていいのでしょうか
0322デフォルトの名無しさん
2009/02/04(水) 21:43:13Uはunsigned型
他にもあるからググってみ
0323デフォルトの名無しさん
2009/02/04(水) 21:45:110324デフォルトの名無しさん
2009/02/04(水) 21:45:570325デフォルトの名無しさん
2009/02/04(水) 22:04:130326デフォルトの名無しさん
2009/02/04(水) 22:38:05ttp://www9.plala.or.jp/sgwr-t/c/sec13.html
0327デフォルトの名無しさん
2009/02/04(水) 22:43:390328デフォルトの名無しさん
2009/02/04(水) 23:59:40int ** a = new int * [b];
0329デフォルトの名無しさん
2009/02/05(木) 00:00:510330328
2009/02/05(木) 00:11:43ありがとうございました。
0331デフォルトの名無しさん
2009/02/05(木) 00:15:42ディレクトリ内にあるファイルのリストを"ディレクトリ名.txt"に
書き出すルーチンがありません。
"<" で指定したフォルダ内のファイル・リストを書き出すコードを
教えてください。
0332デフォルトの名無しさん
2009/02/05(木) 00:19:500333デフォルトの名無しさん
2009/02/05(木) 00:51:230334デフォルトの名無しさん
2009/02/05(木) 01:31:180335デフォルトの名無しさん
2009/02/05(木) 07:28:49vector<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()すればいい話ではあるが
0336デフォルトの名無しさん
2009/02/05(木) 07:52:330337デフォルトの名無しさん
2009/02/05(木) 10:20:590338デフォルトの名無しさん
2009/02/05(木) 11:06:11unsigned int *last = 0;
と宣言されているときに、
変数 i のループの中でこんなことをしているコードを見かけました。
*( uint ** )( p + i ) = last;
last = p + i;
特に最初のポインタ演算がわからないのですが、*( uint ** )( p + i ) の部
分はどう読めばいいんでしょうか??
0339デフォルトの名無しさん
2009/02/05(木) 11:16:03先頭を指しているポインタなのさ!
宣言するとしたら unsigned (*p)[] かな。
だけど僕にも都合があるから unsigned にしてあるんだ。
だから p[i] にループの一回前のポインタを入れるにも
こんな苦労をしなきゃいけないのさ。
まあ、豚の肛門より汚いコードだわね。
0340338
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 ) が頭の中でパーズできません。。。
0341デフォルトの名無しさん
2009/02/05(木) 13:14:560342デフォルトの名無しさん
2009/02/05(木) 13:19:02もし
uint **p = malloc(... * sizeof(uint*));
uint **last = 0;
となっていたら、
p[i] = last;
last = &p[i];
という意味。
0343デフォルトの名無しさん
2009/02/05(木) 20:24:210344デフォルトの名無しさん
2009/02/05(木) 20:31:18嘘書いたときのつっこみの嵐が怖いから調べる癖もつくしね
0345デフォルトの名無しさん
2009/02/05(木) 21:07:510346デフォルトの名無しさん
2009/02/05(木) 21:27:49operator()
0347デフォルトの名無しさん
2009/02/05(木) 21:31:56ここの低レベルな回答みれば程度がわかるだろ
0348デフォルトの名無しさん
2009/02/05(木) 22:01:44>>347を見れば程度が分かるだろ
0349デフォルトの名無しさん
2009/02/05(木) 22:35:47#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の中にへんな文字がはいってしまいます。
初期化はどのようにやったらよいでしょうか
0350デフォルトの名無しさん
2009/02/05(木) 22:37:130351デフォルトの名無しさん
2009/02/05(木) 22:40:080352デフォルトの名無しさん
2009/02/05(木) 22:48:450353デフォルトの名無しさん
2009/02/05(木) 22:50:01よくみたら、static変数だな。
staticって、0で初期化されるんじゃなかったっけ?
0354デフォルトの名無しさん
2009/02/05(木) 22:51:100355デフォルトの名無しさん
2009/02/05(木) 22:53:09やってみたけど中身は空だったけど?
コンパイラは何よ?こちらはVS2008
0356デフォルトの名無しさん
2009/02/05(木) 23:06:09コメントありがとうございます。
>>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; }
すると変な文字が混ざっていたので初期化ができてないのかな
と思いました。自分には原因がわかりませんでした。
0357デフォルトの名無しさん
2009/02/05(木) 23:07:030358デフォルトの名無しさん
2009/02/05(木) 23:10:00なんだよ
>>349だけじゃねーのかよ
ならコンパイル通る形でよこせカス
0359デフォルトの名無しさん
2009/02/05(木) 23:10:39症状が再現する最小限のソースを貼れ
0360デフォルトの名無しさん
2009/02/05(木) 23:13:540361デフォルトの名無しさん
2009/02/05(木) 23:16:290362デフォルトの名無しさん
2009/02/05(木) 23:18:45全部貼れと言ったんだ
0363デフォルトの名無しさん
2009/02/05(木) 23:20:440364デフォルトの名無しさん
2009/02/05(木) 23:25:100365デフォルトの名無しさん
2009/02/05(木) 23:26:120366デフォルトの名無しさん
2009/02/05(木) 23:29:56してるだけちゃうんかと
0367デフォルトの名無しさん
2009/02/05(木) 23:42:410368デフォルトの名無しさん
2009/02/05(木) 23:48:10rc[]は関係ないと思うんですよ
やはりこれだけでは分からないのでしょうか?
0369デフォルトの名無しさん
2009/02/05(木) 23:49:04分からないからレス付かないんだろうが
いいから全部貼れ!
大きいならロダ使え
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0370デフォルトの名無しさん
2009/02/05(木) 23:52:39原因はオーバーランして、T[]の領域まで書き込んじゃってるだけだろ。
具体的に指摘して欲しかったら、コードを貼るしかないよ。
0371デフォルトの名無しさん
2009/02/05(木) 23:53:51ただそれを書くには、ここは余白が狭すぎるんだよね
0372デフォルトの名無しさん
2009/02/05(木) 23:55:35>>369のロダに書いて貼ってみ
0373デフォルトの名無しさん
2009/02/05(木) 23:57:29は別人です。まず質問の仕方を勉強してきます。ありがとうございました。
0374デフォルトの名無しさん
2009/02/06(金) 01:39:17自動的に検索ウィンドウが開いている状態にする方法は何かあるのでしょうか?
0375デフォルトの名無しさん
2009/02/06(金) 05:33:22半角の1バイト文字列*2で認識されてるんですか?
0376デフォルトの名無しさん
2009/02/06(金) 09:47:58処理系依存
0377デフォルトの名無しさん
2009/02/06(金) 10:01:39ただのchar型整数の連続としか認識してないと思う
0378デフォルトの名無しさん
2009/02/06(金) 10:05:53「ナニ角だか知らんがcharが2バイト」
0379デフォルトの名無しさん
2009/02/06(金) 11:39:21#define T 3;
とかで決めた変数って"=="や">" "<"の演算子使えないの?
if(num==T)とかすると
error C2059: 構文エラー : ')'
error C2143: 構文エラー : ')' が ';' の前にありません。
ってエラーが出るんだけど
0380デフォルトの名無しさん
2009/02/06(金) 11:42:390381デフォルトの名無しさん
2009/02/06(金) 11:47:58ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄
 ̄
0382デフォルトの名無しさん
2009/02/06(金) 12:02:38回答ありがとうございます
0383デフォルトの名無しさん
2009/02/06(金) 12:19:110384デフォルトの名無しさん
2009/02/06(金) 14:08:32ABS関数の中の"?"とか":"とかが何をするのかすらわかりません…
/* 呼び出し元 */
if (ABS(a[I][iCol]) > ABS(a[iRow][iCol]))
/* 関数本体 */
template <class T> inline T ABS(T A)
{
return A >= (T)0 ? A : (-1) * A;
}
0385デフォルトの名無しさん
2009/02/06(金) 14:11:270386デフォルトの名無しさん
2009/02/06(金) 14:41:29return A;
else
return (-1) * A;
0387デフォルトの名無しさん
2009/02/06(金) 14:51:19それぞれ abs()、fabsf()、fabs() 呼ぶだけ。
0388384
2009/02/06(金) 15:17:16そういう意味だったんですね。
>>387
配列の型はdoubleです。
fabs関数を呼ぶことにします。
勉強になりました。
ありがとうございました。
0389384
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;
}
0390デフォルトの名無しさん
2009/02/06(金) 15:43:56std::swap
その呼び出し元でいけるかは、知らん
型知らんし
0391389
2009/02/06(金) 15:50:48型はdoubleです。
すみません、また書き忘れてました。
0392389
2009/02/06(金) 15:55:530393デフォルトの名無しさん
2009/02/06(金) 18:58:21{
〜〜〜〜
scanf("%d", &i);
}
試験で↑をdo文で書き換える問題を下のように答えたら減点されました。
何がいけないんでしょうか?
(iの初期化値は触れられていません)
if(i > 0)
{
do{
〜〜〜〜
scanf("%d", &i);
} while( i > 0)
}
0394デフォルトの名無しさん
2009/02/06(金) 19:08:47whileの後にセミコロンがないから?
0395デフォルトの名無しさん
2009/02/06(金) 19:40:08いや、付けてました。それは写し忘れです。具体的に言うとifの部分がばっさり×になってたんです。
if取ったら動作が違ってきますよね?iの初期化値が負だった場合とか。
0396デフォルトの名無しさん
2009/02/06(金) 19:46:080397デフォルトの名無しさん
2009/02/06(金) 20:35:33そうっとー てきとーだからなw
ほんとにてきとーだぞ 普通こんなミスするかよ・・・ やる気無いとしか・・・ ってミスをする。
おまいもてきとーにかんがえたほうが良い
0398デフォルトの名無しさん
2009/02/06(金) 20:50:16勉強になるだろうし、センセってのは質問を受けると喜ぶ変態が多い
0399デフォルトの名無しさん
2009/02/06(金) 20:51:03解るw
目が輝いいらっしゃるよな
0400デフォルトの名無しさん
2009/02/06(金) 20:58:53std::wstringの使い方を解説してくれている
わかりやすいページない?
わかりやすいの基準は様々だろうけど俺の今の技量水準はSTLとかテンプレートとかは理解しているくらい。
ただしロケーションあたりの理解はだいぶ乏しい。
0401デフォルトの名無しさん
2009/02/06(金) 21:27:110402デフォルトの名無しさん
2009/02/06(金) 21:30:25std::stringと同じだよ。
0403デフォルトの名無しさん
2009/02/06(金) 21:31:18char string
wchar_t wstring
だろ。
対応からわかるだろ
0404デフォルトの名無しさん
2009/02/06(金) 21:53:29ないな。locale関係を解説してるサイトなんて俺の知る限り無い。
メンバ関数使うだけならstringから類推すればいいし
0405デフォルトの名無しさん
2009/02/06(金) 21:58:400406デフォルトの名無しさん
2009/02/06(金) 22:00:53普通はたぶん↓のどっちかを最初に書いとけばOK
std::locale::global(std::locale("japanese"));
std::locale::global(std::locale("japanese", std::locale::ctype));
上は数字を入力した場合の3桁毎のカンマ文字あり、下はカンマ文字なし
あと、VC++の場合wcoutはバグが残ってるのかもしれんから気をつけろ
0407デフォルトの名無しさん
2009/02/06(金) 22:03:53wchar -> charにする
0408406
2009/02/06(金) 22:04:06カンマ文字ってのは
wostringstream wos;
wos<<1000;
とかやる場合の話でござる
0409デフォルトの名無しさん
2009/02/06(金) 22:17:41あと、wcoutとかwcinなどにはimbueで明示的に指定しないとだめという話も。
0410デフォルトの名無しさん
2009/02/06(金) 22:51:49windowsのはインストールできません
0411デフォルトの名無しさん
2009/02/06(金) 22:54:290412デフォルトの名無しさん
2009/02/06(金) 22:58:20gccが入ってるだろ
0413デフォルトの名無しさん
2009/02/06(金) 23:08:05gccってなんですか?
0414デフォルトの名無しさん
2009/02/06(金) 23:16:14レスを漬けるまでもないC/C++の質問はここで �H
ttp://pc11.2ch.net/test/read.cgi/tech_aho/990099/
0415デフォルトの名無しさん
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==()が呼ばれません。
何故でしょうか?
0416デフォルトの名無しさん
2009/02/07(土) 02:00:300417デフォルトの名無しさん
2009/02/07(土) 02:56:55>416 の通りなんだけど仮に MyClass がキーだったとしても operator==() ではなくて、
!a.operator<(b) && !b.operator<(a) として判断が行われる。
0418デフォルトの名無しさん
2009/02/07(土) 09:02:48#define RET numnum
#define GOU *(unsigned short*)(RET+0x123U)
というのがあって、
GOU = 10
とソース中に記述すると
どのような動きをするのでしょうか?
numunumのアドレスに対して+123を足しているのでしょうか?
numnumのアドレスが0x800000だったら0x800123番地に10がセットされるのでしょうか?
0419デフォルトの名無しさん
2009/02/07(土) 09:04:59このとき、hensuとdaisuに最初1がはいってた場合、
hensuは2ではなくて1になるのでしょうか?
0420デフォルトの名無しさん
2009/02/07(土) 09:29:131になる ビット演算勉強するとよろし
0421デフォルトの名無しさん
2009/02/07(土) 09:34:010422デフォルトの名無しさん
2009/02/07(土) 09:50:02shortが2バイトなら、0x800123と0x800124に上位と下位に分けて格納されるか、バスエラーを起こす。
0423デフォルトの名無しさん
2009/02/07(土) 10:53:31abcd-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;
}
0424デフォルトの名無しさん
2009/02/07(土) 11:09:550425デフォルトの名無しさん
2009/02/07(土) 11:59:35なぜ、参照渡し? >>424みたいに直値でわたせるっけ?
0426デフォルトの名無しさん
2009/02/07(土) 12:01:13正確には即値がコピーされて渡され関数終了後に消滅する
0427デフォルトの名無しさん
2009/02/07(土) 12:06:490428デフォルトの名無しさん
2009/02/07(土) 12:37:12munmunのアドレスじゃなくて値
int munmun = 0x800000;
ならそうなる
0429デフォルトの名無しさん
2009/02/07(土) 12:54:51ありがとうございました。
>>426 >>427
void Func::func(int n, char c[])
のようにしたほうがよいということでしょうか
0430デフォルトの名無しさん
2009/02/07(土) 13:52:010431デフォルトの名無しさん
2009/02/07(土) 14:32:07ありがとう。
>>415は間違いでした。>>417の指摘の通り
×std::multimap<int, MyClass> mm; ではなく、
↓
○std::multimap<MyClass, int> mm; の場合です。
0432デフォルトの名無しさん
2009/02/07(土) 14:35:57そう言うのは何を見ればわかりますか?
VC++のオンラインマニュアルには「Finds an element that matches a specified key.」としか書いてなく
どうやってmatchesを判定するのか書いていませんし、
「C++ STL multimap find」とか「std::multimap::find 比較」とかでググっても出てきません。
0433デフォルトの名無しさん
2009/02/07(土) 14:36:54Effective STL を読んでみます。ありがとうございます。
0434デフォルトの名無しさん
2009/02/07(土) 15:28:42STL には色々と落とし穴も多いので 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
0435デフォルトの名無しさん
2009/02/07(土) 15:59:17>STL はこっち。
そちらも見ましたよ。
「equivalent」がボールドになっていたのが意味不明だったのですが、これが>>421の「等価」ですね。
>set とか map の使い方を説明してるところでは書いてあるんじゃない?
日本語で記述されているところにはありませんでした。
最後のリンクを参考にしてみます。ありがとうございます。
0436デフォルトの名無しさん
2009/02/07(土) 16:04:09それならば、find()でoperator<()が呼ばれるはずですよね。
operator<()とoperator==()の先頭にブレークポイントを付けているのですが、
find()のときにはどちらも呼ばれません。
何故だろう。。
0437デフォルトの名無しさん
2009/02/07(土) 16:06:310438デフォルトの名無しさん
2009/02/07(土) 16:08:14クラスの宣言の外で定義して、inline指定もしていませんので、
インライン展開はされていないと思います。
0439デフォルトの名無しさん
2009/02/07(土) 16:23:24ブレイクポイントを張るには、それを禁止してやらないといけない。
必要なら、ブレイクポイントではなく何かstd::cerrにでも出力してみればいい。
0440デフォルトの名無しさん
2009/02/07(土) 16:43:000441デフォルトの名無しさん
2009/02/08(日) 01:48:07setlocale すると必ず死ぬし、まともにワイド文字列も扱えない様子。
4.3.3 にしたらこのあたり改善されてるの?
0442デフォルトの名無しさん
2009/02/08(日) 02:28:540443デフォルトの名無しさん
2009/02/08(日) 03:30:15そう言われると確かに 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
0444デフォルトの名無しさん
2009/02/08(日) 04:08:52locale 文字列で "japanese" が通るのは VC じゃないのか?
"" か "ja_JP.UTF-8" とかでどうだ?
0445436
2009/02/08(日) 10:08:59>>440の通りだと思いますが、念のためstd::cerrに出力するようにしましたが、やはりfind()でoperator<は呼ばれません。
なぜでしょう。
0446439
2009/02/08(日) 10:25:060447436
2009/02/08(日) 10:32:46intとMyClassが反対になってますが、それ以外は>>415の通りです。
完全なコードが必要であればあとで貼ります。
今出先なので。。
0448デフォルトの名無しさん
2009/02/08(日) 11:12:49funcによって書き換えられるプログラムです。
実際には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;
}
0449デフォルトの名無しさん
2009/02/08(日) 11:39:27VS2005だとならないな
考え方も間違ってないので実際のfuncが間違ってるとか
0450デフォルトの名無しさん
2009/02/08(日) 12:17:24"" でも死ぬ。
0451デフォルトの名無しさん
2009/02/08(日) 12:22:25Mac で最新の GCC 使ってる人がいれば、
このあたり大丈夫かどうか教えてもらえれば助かります。
GCC 更新するの時間かかるし、
それで効果無かったら泣けるしね・・・。
0452デフォルトの名無しさん
2009/02/08(日) 13:50:10int main(void )
{
FILE* ofp;
ofp = fopen( "test.txt", "w" );
fprintf( ofp,"テスト\n");
fclose( ofp );
return 0;
}
こんな風に書いたプログラムをデスクトップ上でファイルをドラッグ&ドロップして実行した時だけ、
test.txtファイルが出力されないのはなぜですか?
普通にクリックしたりコマンドプロンプト上で動かすときはtest.txtファイルが出力されます。
自分用にファイルを変換するツールを作りたいのですが困っています。
0453デフォルトの名無しさん
2009/02/08(日) 13:51:310454デフォルトの名無しさん
2009/02/08(日) 13:54:190455デフォルトの名無しさん
2009/02/08(日) 14:19:39GCC4.3.2 でも死ぬ。
locale -a にある全てのロケールを試したけど、C と POSIX 以外通らない。
なんでこんなに腐ってるんだ。
0456デフォルトの名無しさん
2009/02/08(日) 14:20:55おお、ありがとうございます。
やはりGCCはロケール未対応と考えた方が良さそうですな・・・。
0457デフォルトの名無しさん
2009/02/08(日) 14:22:14そもそも、std::locale::globa()lって何の効果があるもんなの?
ググってサンプルをg++でコンパイルしてみたら、
wcoutはstdのメンバじゃないよ、的なエラーがでるし・・・
0458デフォルトの名無しさん
2009/02/08(日) 14:22:220459デフォルトの名無しさん
2009/02/08(日) 14:25:14wchar_t ch; std::wcin >> ch; としても入力が UTF-8 で行われるから、
ということだと判明した。
どうすればいいんだ・・・。
0460デフォルトの名無しさん
2009/02/08(日) 15:22:52setlocale(LC_ALL, "");
wchar_t ch;
std::wcin >> ch;
std::wcout << ch << std::endl;
これなら一応正しく動くな。
0461デフォルトの名無しさん
2009/02/08(日) 15:54:18なんという盲点。
ありがとうございました。
0462400です
2009/02/08(日) 16:52:20お答えくださった方々有難うございます。
wchar_tってやっぱりカオスなんだねぇ。
なんかよくマルチプラットフォームの開発環境ってさまざまなエンコードに対応した
自前の文字列クラスを用意しているけど、これってまさかwchar_tが
あまりにもクソだからですかい?
0463デフォルトの名無しさん
2009/02/08(日) 17:05:19wcoutが使えない、ってCygwinか?
Cygwinは腐る以前にそもそも何もない。
0464デフォルトの名無しさん
2009/02/08(日) 17:08:182バイト、1バイト文字がそれぞれ1文字になる点、
ファイルアクセスで長いファイル名やJISなどで対応できない文字にアクセス出来る点
が便利。
0465デフォルトの名無しさん
2009/02/08(日) 17:27:04そう、Cygwin
gccならなんでも同じだろうと思ってたけど、違うものなのね・・・
>>464
charで入出力して、中でwchar_tに変換して使うのかな?
0466デフォルトの名無しさん
2009/02/08(日) 17:30:33しかし、言語を出力するときは、wchar_tだと予定通りにならない場合がある。
charなら一通りの出力しかない
0467デフォルトの名無しさん
2009/02/08(日) 18:11:470468デフォルトの名無しさん
2009/02/08(日) 18:13:27--
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
0469デフォルトの名無しさん
2009/02/08(日) 18:16:35今は4.3.3だよ。
0470デフォルトの名無しさん
2009/02/08(日) 18:18:03もちろん、libcが駄目なことに変わりは無いので、wchar_tが使えないのは変わっていないはず。
0471デフォルトの名無しさん
2009/02/08(日) 19:43:10GCC 4.3.2 TDM-2 is now available. http://www.tdragon.net/recentgcc/
0472デフォルトの名無しさん
2009/02/08(日) 23:47:17b=2;
c=3;
d=4;
のとき
a=b=c=d=0;
とするとa,b,c,d全てに0が代入されますか
0473デフォルトの名無しさん
2009/02/08(日) 23:49:000474デフォルトの名無しさん
2009/02/08(日) 23:55:32ああ、それは--input-charset=cp932もsetlocale(LC_ALL,"")+wcoutも使える優れ物だ。
boost::wsmatchの確認に重宝してるよ。
0475デフォルトの名無しさん
2009/02/09(月) 11:31:510476デフォルトの名無しさん
2009/02/09(月) 12:19:080477デフォルトの名無しさん
2009/02/09(月) 13:21:470478デフォルトの名無しさん
2009/02/09(月) 13:58:59計算時間を測るようにしたいです
#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の計算時間はいつもゼロです。
また全計算時間のつもりの二列目の数字も負になることがあります。
どうなおしたらよいでしょうか
0479デフォルトの名無しさん
2009/02/09(月) 14:51:27↓
((double)(telaps1-telaps0) /
0480デフォルトの名無しさん
2009/02/09(月) 15:02:35hoge( )の処理が1秒以内で終わるからでしょ
clock( )の値はオーバーフローして0に戻ることもあるから負になっても不思議はないよ
そんなことよりさ
どうしてdouble型を使ってるの
0481デフォルトの名無しさん
2009/02/09(月) 15:03:01hoge()の中身はなになのよ
0482デフォルトの名無しさん
2009/02/09(月) 15:08:530483デフォルトの名無しさん
2009/02/09(月) 15:28:54思いましたので省きました。
>>482
小数点ありで表示したいです。勉強不足でオーバフローがどうい
うことなのかわからないんですが絶対値をとるだけでもよいでし
ょうか
0484デフォルトの名無しさん
2009/02/09(月) 16:09:31hoge()の内容で違うよ
0485デフォルトの名無しさん
2009/02/09(月) 20:02:05負になる理由はオーバーフロー以外考えられないな。
0486デフォルトの名無しさん
2009/02/09(月) 20:52:29>>479
と合わせて
>>480>>485
が原因でつじつまが合うな
0487デフォルトの名無しさん
2009/02/09(月) 21:18:21=======================================
【初心者歓迎】C/C++室 Ver.64【環境依存OK】
=======================================
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1231499251/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か&nbsp;に置換しておくことをお勧めします。
0488デフォルトの名無しさん
2009/02/09(月) 21:34:460489デフォルトの名無しさん
2009/02/09(月) 21:39:120490デフォルトの名無しさん
2009/02/09(月) 21:48:00もう合流でいいだろ
0491デフォルトの名無しさん
2009/02/09(月) 21:49:16新たに例外クラス作ったりせず標準機能で
throw std::error_message("エラー");
みたいにすると勝手に関数名や行番号が付くと有難い。
linuxとwindowsでそれぞれよろしく。
0492デフォルトの名無しさん
2009/02/09(月) 21:56:55__LINE__ __FUNC__は知ってるのか?
0493デフォルトの名無しさん
2009/02/09(月) 22:00:38もちろん知ってるよ。
そういうのを使って自分で書かなくてもいいように標準機能が用意されてないかなと思って。
同じようなこと皆するんだから、ありそうでしょ?
0494デフォルトの名無しさん
2009/02/09(月) 22:32:130495デフォルトの名無しさん
2009/02/09(月) 22:33:01デバッグ実行してたら
0496デフォルトの名無しさん
2009/02/09(月) 23:24:44hoge()
は
void hoge(x,y,z){....}
....の部分はいろいろな演算をしています。
....によっていろいろな値になるということでしょうか
プラスになるかマイナスになるかはどうやって見分けた
らよいのですか
0497デフォルトの名無しさん
2009/02/09(月) 23:43:14オーバーフローについて自分にわかっている範囲で原因を
考えると>>478 のループを繰り返す間にTelaps1がとりうる
値の範囲以外の値がはいってしまうということですか
大きな桁の数字がはいってオーバーフローだとするとこれ
をさけるために例えば
Telaps1=(double)(clock()/CLOCKS_PER_SEC)
のようにすれば回避できるんでしょうか
0498デフォルトの名無しさん
2009/02/09(月) 23:47:55doubleの位置指摘してくれてるのになんで直さないの?
0499デフォルトの名無しさん
2009/02/10(火) 00:00:31>>自分にわかっている範囲で
いいから言われたようにやってみろよ。キャストくらい分かれ…
…と言いたいところだが、なんかこのスレの住人達は妙にやさしいから
俺もそれに倣ってみる。
BohYoh.com−C/C++ FAQ 整数値の平均を実数で求めようとしてもうまくいかないのはどうしてですか。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00097.html
とりあえずこれを読んでから自分のコード見てみ。
万一これを読んでも分からないなら致命的だから今すぐヤメレ。
0500デフォルトの名無しさん
2009/02/10(火) 00:04:230501デフォルトの名無しさん
2009/02/10(火) 00:06:39>>486で主に指摘してるのはオーバフローの件じゃない
まさか一回のfunc()に数分もかかってるわけ無いだろうから、1000回で数分だろ?
だとすれば一回は一秒以下だからお前の計算じゃ毎度0になって当然
0502デフォルトの名無しさん
2009/02/10(火) 00:09:10そうですかー。みんなで車輪の再発明大会ですか。。無駄だなー。
>>495
デバグならね。コールスタックが残ってるからわかるね。
でも、リリースでもわかるようにしたいんだ。
0503499
2009/02/10(火) 00:09:28標準C/C++の仕様を比較して教えてくれているところで、用語が正確だから俺は好きだった。
(今も好きだがもう見る機会がない。)
0504デフォルトの名無しさん
2009/02/10(火) 00:11:03多少上達してからは使わなくなったけど。
0505デフォルトの名無しさん
2009/02/10(火) 00:21:38int func(std::string str)とint func(const std::string& str)のそれぞれのメリットとデメリットを教えてください。
記述をすっきりさせるために出来れば前者だけを使いたいです。
0506デフォルトの名無しさん
2009/02/10(火) 00:22:35STLのコンテナにはコピーが入るのですか?参照が入るのですか?
参照を入れようとすると参照が2重になって怒られるので、きっと参照が入るのだと思うのですが
そうだとすると、クラスメンバーのstd::list<MyClass>にローカルオブジェクトを入れると関数から抜けたときにオブジェクトがなくなって問題になりそうです。
どちらなのか分からなくなったので、教えてください。
0507デフォルトの名無しさん
2009/02/10(火) 00:24:14前者はコピーのコストが生じるので後者に統一するのが無難
0508デフォルトの名無しさん
2009/02/10(火) 00:27:11コピーなので
コピーコンストラクタに従う
>参照を入れようとすると参照が2重になって怒られる
多分お前のコードが別の理由でおかしいんだろう
0509デフォルトの名無しさん
2009/02/10(火) 00:30:41>多分お前のコードが別の理由でおかしいんだろう
いや、
std::map<int, MyClass&> mm;
とかやると、エラーが出るでしょ?知らない?
0510デフォルトの名無しさん
2009/02/10(火) 00:31:18コピーなのね。ありがとう。
0512デフォルトの名無しさん
2009/02/10(火) 00:35:13かなり勉強し直さなくちゃいけないの?
せっかく覚えた難解変態仕様が、無駄になるってこと?
0513デフォルトの名無しさん
2009/02/10(火) 00:35:55std::vector<X> v;
として
v.push_back(X())
とかやったときにX の参照が格納されるのかどうか、っていう意味だと思ったんだ
0514デフォルトの名無しさん
2009/02/10(火) 00:47:12いまのC++のどの辺が難解変態なの?
0515505,506
2009/02/10(火) 01:06:28その場合はどうなるの?
X()がスタックに生成されて、それがvector::push_back(const X& val)に渡されて
push_back()の中でvector::data[n] = valみたいな感じでコピーコンストラクタが呼ばれてヒープに格納されて、
最終的に呼び出し元のスタック上のXは居なくなっても大丈夫ってことでおk?
0516デフォルトの名無しさん
2009/02/10(火) 03:17:04ついていけてるプログラマが1割以下なんだから、全部ダメダメだろ
0517デフォルトの名無しさん
2009/02/10(火) 03:31:13どこでどうやって確率求めたよ?
0518デフォルトの名無しさん
2009/02/10(火) 03:35:37おk
0519デフォルトの名無しさん
2009/02/10(火) 10:43:15確率と割合の違いって知ってる?
0520デフォルトの名無しさん
2009/02/10(火) 11:03:46これまで通りに書いても問題ありません。
MS謹製言語じゃあるまいし。
0521デフォルトの名無しさん
2009/02/10(火) 11:03:49教科書に「テンプレートは用途がイマイチ不明だが、まあこんなのもあるよ」ってなことが書かれていた。
STLがネット上に公開されたより後だから、入門者がどれだけ付いていけてなかったの証左だと思う。
0522デフォルトの名無しさん
2009/02/10(火) 11:33:190523デフォルトの名無しさん
2009/02/10(火) 12:25:00デブでも喰ってろ
0524デフォルトの名無しさん
2009/02/10(火) 13:22:190525デフォルトの名無しさん
2009/02/10(火) 13:23:500526デフォルトの名無しさん
2009/02/10(火) 13:27:470527デフォルトの名無しさん
2009/02/10(火) 13:31:57まともな著書も出版できないんだぜw
0528524
2009/02/10(火) 13:40:41まぁ、雑誌の記名記事なら物したことがないわけじゃないけどね。
0529デフォルトの名無しさん
2009/02/10(火) 13:45:27>>524 に同意できないってことは
入門書未満ということか。
精進しろよ。
0530デフォルトの名無しさん
2009/02/10(火) 14:57:09取り消す方法は無いの?
winsock2.hをincludeしてws2_32.dllを動的リンクで読み込んだ時に
本来の関数名(WSAStartupとかsocket)にアドレスをGetProcAddressで
取得したいんだけど、当然と言うか既に定義されてしまってる名前だから不具合が。
winsock2.hから定義部分を取り除いて使えば出来たけど
改変ヘッダファイルをソースに同梱して配布するのに問題は無いかとか
コンパイラ依存部はどうするかとかあるし。
0531デフォルトの名無しさん
2009/02/10(火) 15:02:02winsock2.hは良くできたヘッダだから、
#define INCL_WINSOCK_API_PROTOTYPES 0でプロトタイプ宣言消えるぞ。
INCL_WINSOCK_API_TYPEDEFSも便利だよな。
0532デフォルトの名無しさん
2009/02/10(火) 15:09:58そんな機能があったとは!thx。
0533デフォルトの名無しさん
2009/02/10(火) 15:45:21前もってメンバ関数を全てvirtualにしておくべき
という考え方もアリ?
それともパフォーマンスが悪くなるから全部virtualだなんて止めろって考えるべき?
俺の思想はどっちにしたらいいの?
0534533
2009/02/10(火) 15:49:06ある自作のクラス
です。。。
0535デフォルトの名無しさん
2009/02/10(火) 15:52:560536デフォルトの名無しさん
2009/02/10(火) 15:54:51しないかもしれません。
てかしない可能性のが高いです。
それでもメンバ関数を全てvirtualにしておくべきなのか、そんな極端なことは止めるべきなのですか?
0537デフォルトの名無しさん
2009/02/10(火) 16:02:06現時点のコードで多態であることが確定していることを示すんだから付けない方がいいんじゃないかなぁ
それにあるクラスの全メンバにvirtualを機械的に付けるより不要なvirtualキーワードを取り除く方が難しいし
0538デフォルトの名無しさん
2009/02/10(火) 16:03:01わかりやすい説明ありがとうございます!
危うく間違った変なコーディングの道に迷い込んでいくところでした。。。
0539デフォルトの名無しさん
2009/02/10(火) 16:38:36そりゃそうだろ。世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
初心者レベル以下の連中が書いたものなんだから。
初心者レベル以下の連中が書いたものなんだから。
0540デフォルトの名無しさん
2009/02/10(火) 16:42:25口ばかり達者で、お前の実力を示すものを世に公表していない
無名のクズが何ほざいてやがる?こんなスレで偉そうにしているお前が
どこの誰かこっちには分からないが、プログラム以前に、人間として
レベルが低いことが窺えますねw
0541デフォルトの名無しさん
2009/02/10(火) 16:44:48入門書、この時点で対象としている人のレベルのこともあるんだがw
頭の弱い奴って、結局 自分のこと や 主観 でしか話が出来ないから
他人から嫌われているって気づかないんだよねw
お前らが有名人なら、恐らくこんな場所ではなく、もっと別の場所で
活躍しているだろう。要するに、お前ら小物が言う発言なんて重みがない軽々しい
思いつきのようなもの。そこまで言うなら、お前がそうだと思う入門書を
具体的に示せ。まぁ、事実無根なら ただの名誉毀損 で、お前らが有名人だったら
逆に訴えられるよw
0542デフォルトの名無しさん
2009/02/10(火) 16:46:18○初心者レベルの人に対して書いたものなんだから。
日本語って難しいでちゅねw
0543デフォルトの名無しさん
2009/02/10(火) 16:49:56犬がキーボードたたいているような物ってことかwww
527==539==541
なことは誰が見ても明らかだから、おとなしく引っ込んでろよ。
とりあえず氷をなめると頭冷やせるよ。
0544デフォルトの名無しさん
2009/02/10(火) 16:52:00お前に実力があるなら、言葉でなくてコードで示せ。まぁ、この世は所詮、商売、金儲けが
資本主義では勝負となるんで、ほいほいと商業用のコードなんて出せるわけねーよなw
だからあんな出版物も、初歩的なんだよ、分かったか、小僧?
簡単に手の内を見せる奴は、この勝負の世界では勝ち残れない。
0545デフォルトの名無しさん
2009/02/10(火) 16:53:510546私は543
2009/02/10(火) 16:58:31///////////////////////////////////////////////////
527==539==541==544
火病の意味(正式な用語としても2ch用語としても両方とも)を調べて来い。
あとこれ以上汚したくないから、俺とおまえで一緒に書き込むの止めないか?
例えばおまえの読点(わかる?「、」って意味だよ?)が多い汚い書込が増えたらやだろ?
0547デフォルトの名無しさん
2009/02/10(火) 17:13:450548デフォルトの名無しさん
2009/02/10(火) 17:18:33>どこの誰かこっちには分からない
けど
>口ばかり達者で、お前の実力を示すものを世に公表していない
>無名のクズ
だと思うのですね.
のうたりん? :)
0549デフォルトの名無しさん
2009/02/10(火) 17:21:03悔しかったら、1冊でも出版して、ここで報告しろよ?お前の著書が
へぼへぼだったら、こてんぱんに批判してやるからw
0550デフォルトの名無しさん
2009/02/10(火) 17:26:49>>549
悪いんだけど安価つけてやってくれない?連鎖あぼんできなくてうっとおしいんだ
0551デフォルトの名無しさん
2009/02/10(火) 17:28:260552デフォルトの名無しさん
2009/02/10(火) 17:47:14ああ、やっぱり初心者だったのか。
入門書は選ばないと、酷いのあるから気をつけろ。
推薦図書/必読書のためのスレッド 44
http://pc11.2ch.net/test/read.cgi/tech/1232206156/l50
0553デフォルトの名無しさん
2009/02/10(火) 17:53:38値⇔ポインタ: reinterpret_cast
この二つはいいとして、ポインタ⇔ポインタはどちらを使えばいいのでしょうか?
reinterpret_cast<Base *>(derived_pointer)->ほにゃほにゃ
といった感じで使っていたのですが、
継承関係のクラスも含め、ポインタ関連は全てreinterpret_castでも問題ないのでしょうか?
0554停止しました。。。
2009/02/10(火) 18:43:420555デフォルトの名無しさん
2009/02/10(火) 18:48:420556デフォルトの名無しさん
2009/02/10(火) 19:59:58ダウンキャスト・クロスキャストのように失敗する可能性のあるものはdynamic_cast。
ただし、絶対に成功するならstatic_castでも良い。
アップキャストは暗黙変換可能。
継承関係のない型同士(int*→char*など)はreinterpret_cast。
他のポインタ型からvoid*へは暗黙変換、void*から他のポインタ型へはstatic_castで良いが、
共にreinterpret_castを用いる流儀もある。
const/volatile外し(char const*→char*など)はconst_cast。付けるほうは暗黙変換で。
暗黙変換を明示したければ、static_castで置き換えられる。
0557デフォルトの名無しさん
2009/02/10(火) 20:13:14それを人間に使い分けさせるなんて危険だよなー
C++が如何に糞言語かがよく解る
0558デフォルトの名無しさん
2009/02/10(火) 20:18:41キャストミスったらコンパイルエラーになるから問題ない。
Cなんてキャストミスっても素通りだろw
0559デフォルトの名無しさん
2009/02/10(火) 20:19:47↓を参考にするといいよ
http://msdn.microsoft.com/ja-jp/library/cc440191(VS.71).aspx
http://msdn.microsoft.com/ja-jp/library/cc440192(VS.71).aspx
0560デフォルトの名無しさん
2009/02/10(火) 20:22:440561デフォルトの名無しさん
2009/02/10(火) 20:24:19基本的にダウンキャストやクロスキャストは dynamic_cast で行うべきだが、
明らかに成功する場合(CRTP など)には、
速度を優先して static_cast を行う場合もある。
0562デフォルトの名無しさん
2009/02/10(火) 20:26:110xはではそういうのも可能になるのかなぁ
0563デフォルトの名無しさん
2009/02/10(火) 20:29:36どうしてもstatic_castでダウンキャストしたいというときには、
dynamic_castによるアサート付きのBoostのpolymorphic_downcastがお勧め。
0564デフォルトの名無しさん
2009/02/10(火) 20:29:47public:
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();
}
としたら、コンパイル通ってなんか動くんですが、
これはいわゆるたまたま動いてるだけという奴?
0565デフォルトの名無しさん
2009/02/10(火) 20:31:180566デフォルトの名無しさん
2009/02/10(火) 20:34:03Visual なんとか
0567デフォルトの名無しさん
2009/02/10(火) 20:51:450568デフォルトの名無しさん
2009/02/10(火) 21:03:37#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など)。
どうすればいいでしょうかね?
0569デフォルトの名無しさん
2009/02/10(火) 21:06:02for(int i = 0; i < 3; i++){
int A = rand() % 3;
cout <<A;
}
0570デフォルトの名無しさん
2009/02/10(火) 21:14:25できました。ありがとうございました
0571デフォルトの名無しさん
2009/02/10(火) 21:18:31ほら、やっぱり危険じゃんw
0572デフォルトの名無しさん
2009/02/10(火) 21:19:200573デフォルトの名無しさん
2009/02/10(火) 21:19:25ありがとうございます
根本から勉強し直します
0574デフォルトの名無しさん
2009/02/10(火) 22:05:17いやだから
絶対通るようなコーディングの場合は…で、
通るかどうか不確実な場合は…で
っていう使い分けだっつってんじゃん。
君は言語仕様に君のケツを拭いてもらわねばならない人なのかね?
0575デフォルトの名無しさん
2009/02/10(火) 22:12:250577デフォルトの名無しさん
2009/02/10(火) 23:25:000578デフォルトの名無しさん
2009/02/11(水) 00:28:37それを車輪の再発明と言ってしまうのはちょっとひどいようにおもう
0579デフォルトの名無しさん
2009/02/11(水) 00:33:02これスマートに64bit化できんのかな
0580デフォルトの名無しさん
2009/02/11(水) 01:15:36おもうのは自由だけど、
プログラマが100万人いたら、100万同じようなコードが生成されるのは、車輪の再発明以外の何物でもないよ
0581デフォルトの名無しさん
2009/02/11(水) 01:24:18ポインタと同じ大きさの整数型を作るってのがWinAPIでもC/C++でもその他あちこちで流行。
(U)INT_PTRとかW/LPARAMにLRESULT、(u)intptr_tなどなど。Windows界隈ではsize_t/ptrdiff_tも該当。
ダイアログプロシージャの戻り値がBOOL→INT_PTRなど、ところどころ暴挙も見られるが。
0582デフォルトの名無しさん
2009/02/11(水) 01:33:18でもそのままだと効果薄そう
0583デフォルトの名無しさん
2009/02/11(水) 02:21:10レジスタが増えた分の効果を期待してもいいだろう。
0584デフォルトの名無しさん
2009/02/11(水) 02:36:20まだレジスタ余ってんだから使えばいいのに
ってコードをx64で吐いてたりする
0585デフォルトの名無しさん
2009/02/11(水) 02:40:010586デフォルトの名無しさん
2009/02/11(水) 02:48:20レジスタ間転送も消えてくれる?
0587デフォルトの名無しさん
2009/02/11(水) 06:33:44throw元の行番号を表示しようなんて酔狂な奴が100万人も居るとは思えないのだが。
0588デフォルトの名無しさん
2009/02/11(水) 11:09:560589デフォルトの名無しさん
2009/02/11(水) 21:34:14世のプログラマは、みんな失業しちゃうよ
車輪の再発明だとバレてないから、仕事になる
0590デフォルトの名無しさん
2009/02/11(水) 22:14:56ホイールの太さが気に入らないとか
うちで使ってる三輪車にはつけられないのかとか、
そんなお客が多いんです。
0591デフォルトの名無しさん
2009/02/11(水) 22:55:48ここは2chだぜ!?
真摯に議論してどーすんのさ
0592デフォルトの名無しさん
2009/02/11(水) 23:12:140593デフォルトの名無しさん
2009/02/11(水) 23:49:350594デフォルトの名無しさん
2009/02/12(木) 01:02:43プログラミングの勉強になりますか?
0595デフォルトの名無しさん
2009/02/12(木) 01:15:05なんでも勉強になるよ。
すぐOS作れ。
0596デフォルトの名無しさん
2009/02/12(木) 02:23:210597デフォルトの名無しさん
2009/02/12(木) 11:48:34#pragma once を使うか、どっちがいいのかな?
0598デフォルトの名無しさん
2009/02/12(木) 12:00:02しかし最近は多くのコンパイラが#pragma onceに対応してるっぽいので、気にせず使ってしまう手もある。
インクルードガードはマクロを使うため、名前の衝突のリスクが一応ある。
(インクルードガードに使うのと同じ名前のマクロが偶然、他の箇所でも定義されていたら……)
一部のコンパイラは、#pragma onceを使ったほうがコンパイルが速くなる。
(2度目以降、わざわざマクロとかの処理をせず、単純にヘッダファイルを読まなくなるため。)
しかし別のコンパイラには、インクルードガードを適切に認識して同様の最適化を行うものもある。
0599デフォルトの名無しさん
2009/02/12(木) 12:22:27基本#pragma 使ってコンパイラが対応してなかったらマクロにしてみる
0600デフォルトの名無しさん
2009/02/12(木) 13:04:17複数あるとダメなので、結局インクルードガードが推奨されてきている
0601デフォルトの名無しさん
2009/02/12(木) 13:57:130602デフォルトの名無しさん
2009/02/12(木) 17:07:540603デフォルトの名無しさん
2009/02/12(木) 20:39:10#define org.hogehoge.fugafuga.lib.superutility.specialstringconcat
0604デフォルトの名無しさん
2009/02/12(木) 22:37:59プログラムを使って、起動中のSkypeを強制終了させ、再びSkypeを再起動させたいのですが
Skypeを強制終了->再起動のプログラムは書けましたが
実行するとタスクトレイにSkypeのアイコンが2つ表示された状態になってしまいます。
カーソルで強制終了したSkypeアイコンを触ればアイコンは消えるのですが
カーソル操作なしで本プログラムのみで強制終了したSkypeアイコンを消したいです。
方法が分かる方がいらっしゃったら教えて下さい。
0605デフォルトの名無しさん
2009/02/12(木) 23:03:450606デフォルトの名無しさん
2009/02/12(木) 23:04:22これじゃだめ?
http://pc11.2ch.net/test/read.cgi/win/1217738171/220
> Windows版Skypeにコマンドラインは使えますか?
> はい、以下のコマンドが使えます。
> * /nosplash:Skype起動時にスプラッシュスクリーンをスキップ
> * /minimized :起動時にSkypeをシステムトレイに最小化
> * /callto:名前か電話番号:指定したスカイプ名またはSkypeOutの電話番号に通話発信
> * /shutdown:Skypeを終了
0607デフォルトの名無しさん
2009/02/12(木) 23:05:53ここはSkypeのスレか?
0608デフォルトの名無しさん
2009/02/13(金) 00:00:43Skype以外のアプリも強制終了->再起動したいので他に方法ありませんか?
Skypeはそれでとりあえずやってみます。
0609デフォルトの名無しさん
2009/02/13(金) 00:40:32トレーにリドローさせるのがいいかと
0610デフォルトの名無しさん
2009/02/13(金) 00:44:070611デフォルトの名無しさん
2009/02/13(金) 01:25:06またそういったソフトはあるのでしょうか?
0612デフォルトの名無しさん
2009/02/13(金) 01:33:09http://www.geocities.jp/ky_webid/win32c/index.html
0613デフォルトの名無しさん
2009/02/13(金) 01:33:36あります
0614デフォルトの名無しさん
2009/02/13(金) 01:44:170616赤西仁
2009/02/14(土) 16:40:32PSのアークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・ttp://www.gradius2.com/index.php?UID=1174775153
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
0617晒し
2009/02/14(土) 17:05:33> 209 名前:赤西仁[] 投稿日:2009/02/13(金) 22:47:36
> 1年間悩んでます。お力をお貸しください。
> 616 :赤西仁:2009/02/14(土) 16:40:32
> 200年間悩んでます。お力をお貸しください。
18時間が199年に相当するわけだから・・・・・・・
考え始めたきっかけは、昨日の晩飯のおかずか? もやしを大量に入れたのがいけなかったか?
0618デフォルトの名無しさん
2009/02/14(土) 18:52:290619デフォルトの名無しさん
2009/02/14(土) 23:20:36あまりにもスレ違いじゃね?
0620デフォルトの名無しさん
2009/02/14(土) 23:22:09もうおまえ死ねよ
0621デフォルトの名無しさん
2009/02/14(土) 23:23:31C++で画面を消すにはどうしたら良いのでしょうか?
0622デフォルトの名無しさん
2009/02/14(土) 23:26:37画面ってのは、コマンドラインのことじゃないよね?
0623デフォルトの名無しさん
2009/02/14(土) 23:29:27clear();を試してみたのですが、エラーが出ちゃって
0624デフォルトの名無しさん
2009/02/14(土) 23:32:09それとも、ダブルクリックで実行ファイルを起動したらそいつがコマンドプロンプトを開いたの?
(後者の場合は普通に閉じるよね?)
0625デフォルトの名無しさん
2009/02/14(土) 23:35:16VCで書いてたのですが、
画面をクリアする関数が分からないのです。
0626デフォルトの名無しさん
2009/02/14(土) 23:42:40俺にはわからね
だれか分かる方plz
0627デフォルトの名無しさん
2009/02/14(土) 23:45:02なんとか試行錯誤してやってみます。
0628デフォルトの名無しさん
2009/02/14(土) 23:47:38一晩待とう
0629デフォルトの名無しさん
2009/02/14(土) 23:48:490630デフォルトの名無しさん
2009/02/14(土) 23:50:480631デフォルトの名無しさん
2009/02/15(日) 00:05:15画面をクリアするんなら、stdlibのsystem使って、
system("cls"); // 画面のクリア(clear screenかな)
コンソールゲームなら、'\r','\b'と共に、再描画とかに使う。
それとも、ウィンドウそのものを消すことが目的なの?
0632デフォルトの名無しさん
2009/02/15(日) 00:10:50モニタの電源切りたいのか
ウィンドウを閉じたいのか最小化したいのか
コマンドプロンプト上に表示されている文字を消したいのか。
プログラマはいちいち細かいといわれるゆえんだが、選択肢がたくさんあって
超能力で相手の気持ちを読み取るプログラムも作れないのだから仕方のない話。
0633デフォルトの名無しさん
2009/02/15(日) 00:21:36system("cls");というのを使ってみたらできました。
有り難う御座いました。
>>632
すみませんでした
0634デフォルトの名無しさん
2009/02/15(日) 01:05:05回答したのも別の人だしね。
0635631
2009/02/15(日) 02:10:06問1 systemの有用な使い方ってある? "ls"(dir)使ったり何したりと。(cdでカレントは動かなかったっぽい)
問2 エスケープシーケンスで色変えとかって、やっぱwinでは使えない代物?
問3 system使わないで、c言語内部で画面をクリアすることは可能?
0636デフォルトの名無しさん
2009/02/15(日) 02:29:27というわけで、その辺の話題はスレ違い気味ではなかろうか。
と思ったけどWindowsコンソールプログラミングの話ができるスレは無いみたいだな。
0637デフォルトの名無しさん
2009/02/15(日) 03:47:57ダム端末以外の端末操作は言語仕様だけでは何もできないから、適宜必要なライブラリを使うことになる。
例えばsystem("cls")もOSに依存しているし、コンソールAPIも同じこと。
>>631
問1:
cdでカレントは動かないのではなくて、system()で起動したコマンドインタプリタで移動するだけだから
呼び出したプログラムに反映されないと言うこと。
system()のメリットは、比較的容易に他のアプリケーションを起動できるってことくらい。
木目細かい制御が必要なら、APIが必要になってくる。
問2:
コンソールAPIでできると思うが、エスケープシーケンスはデバイスドライバを組み込んでおく必要があるんじゃないだろうか。
問3:
繰り返しになるが、環境に依存しないでシンプルにやることはほぼ無理。汚い方法としては、100行くらい空行出力するくらいか。
0638デフォルトの名無しさん
2009/02/15(日) 10:59:400639デフォルトの名無しさん
2009/02/15(日) 12:08:49そう来たかwwww
0640デフォルトの名無しさん
2009/02/15(日) 12:13:12わずらわしす。あと、入力が最下段からになってしまうのも、
下手なコードだと、ゲームにはなってても、目を上下動かす必要がある。あbcでfgひあbcでfgひ
0641デフォルトの名無しさん
2009/02/15(日) 12:20:06そうなのか。知らんかった。
0642デフォルトの名無しさん
2009/02/15(日) 13:32:310643デフォルトの名無しさん
2009/02/15(日) 13:55:050644デフォルトの名無しさん
2009/02/15(日) 13:57:560645デフォルトの名無しさん
2009/02/15(日) 17:16:51ググっても思い出せれん。。。。
0646デフォルトの名無しさん
2009/02/15(日) 17:29:190647デフォルトの名無しさん
2009/02/15(日) 17:35:560648デフォルトの名無しさん
2009/02/15(日) 17:37:370649デフォルトの名無しさん
2009/02/15(日) 18:08:45{
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++どちらでもいいです。
0650デフォルトの名無しさん
2009/02/15(日) 18:12:38まとめて読んでからまとめて書く
0651デフォルトの名無しさん
2009/02/15(日) 18:15:38あれはプロのC++プログラマはもう全然使わないものなの?
多少打ち込むのが面倒でもC++スタイルのキャスト(static_cast等)でコーディングすべき?
0652デフォルトの名無しさん
2009/02/15(日) 18:17:100653デフォルトの名無しさん
2009/02/15(日) 18:19:500654デフォルトの名無しさん
2009/02/15(日) 18:33:30うん。何のためのキャストか明確だし、継承関係になくて明らかに変換できない場合はエラーになるから。
0655デフォルトの名無しさん
2009/02/15(日) 18:42:37うーん、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のキャッシュの利用効率を阻害する
可能性のほうが高いよ。
0656651
2009/02/15(日) 19:13:42じゃあ俺もそうしよう。
せっかく導入されている機能なんだし、使わなきゃね。
0657649
2009/02/15(日) 19:19:13確かに遅くなってました。
for文よりもwhileの方が多少なりとも速くなるのかと自身の判断でした。
やっぱり入れ替え対象となる型をキャストして、まとめて処理を行う様にします。
0658デフォルトの名無しさん
2009/02/15(日) 19:33:52配列双方のswap後の使われ方を追ってみて可能ならばポインタ交換だけに留める。
部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2]
0659649
2009/02/16(月) 00:11:39ポインタ自体の入れ替えだけでとどめる事は理解出来る。
それが出来れば、速くなる事も理解出来る。
> 部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2]
が、ここの言わんとする内容が高度過ぎて俺の安い頭では理解出来ない。
どなたか、もう少し噛み砕いて説明してくれない?
0660デフォルトの名無しさん
2009/02/16(月) 00:30:060661デフォルトの名無しさん
2009/02/16(月) 00:46:07どのレベルの知識を求めているのか、よく分からんけど。やるだけならuBLASとかでできる。
ちゃんと知りたいなら数値計算と呼ばれる分野の参考書を読んでみるといい。
「他の言語ではできるけどC/C++でのやり方が分からん」というなら、それに沿っての助言はこのスレで出来る。
0662デフォルトの名無しさん
2009/02/16(月) 00:46:510663デフォルトの名無しさん
2009/02/16(月) 00:52:08{ 2x + 3y = 5
{ x sin(x^2) + exp((x-u)^2/d) = 0
ってやつの解(not単一解)を導きたいのですね?
0664デフォルトの名無しさん
2009/02/16(月) 00:53:03数値計算法の知識を使ってゴリゴリやるしかなさそう。
0665デフォルトの名無しさん
2009/02/16(月) 00:54:40中学校で一番初めに習うような
2x + 3y = 5
5x + 2y = 10
こんなような連立方程式です(未知数の数は2つ固定)
0666デフォルトの名無しさん
2009/02/16(月) 00:57:120667デフォルトの名無しさん
2009/02/16(月) 01:01:06それだったら、行列 (2,3; 5,2) の逆行列を 縦ベクトル (5;10) に掛ければいい。
行列式が-11だから、逆行列は -1/11 (2,-3; -5,2) だな。
この話が意味不明なら、高校数学の行列のところを学んでほしい。もしくは適当にググってほしい。
0668デフォルトの名無しさん
2009/02/16(月) 01:07:13ありがとう
なんとなくつかめてきました
0669デフォルトの名無しさん
2009/02/16(月) 02:20:55でコンパイルして exe を起動しようとしたのですが、
Microsoft Windows ○○.exe は動作を停止しました
となってしまいます。
fatal error 、 error など何も出ていないため原因がわかりません。
プログラムが長いとエラーが出たりするんでしょうか?
思いつく理由だけでもいいので教えていただけないでしょうか?
0670デフォルトの名無しさん
2009/02/16(月) 02:28:180671デフォルトの名無しさん
2009/02/16(月) 02:48:57プログラム上のバグが原因ならとりあえず探してみます
教えていただきありがとうございます
0672デフォルトの名無しさん
2009/02/16(月) 02:54:200673デフォルトの名無しさん
2009/02/16(月) 03:08:12今度は 0x74696e69 でハンドルされていない例外が発生しました: 0xC0000005: Access violation
と表示されました
0674デフォルトの名無しさん
2009/02/16(月) 03:41:28ポインタとか配列使ってる辺りにバグがあるんじゃないの
0675デフォルトの名無しさん
2009/02/16(月) 03:47:03エラー出てるところ表示されない?
0676デフォルトの名無しさん
2009/02/16(月) 03:47:340677デフォルトの名無しさん
2009/02/16(月) 03:48:29面倒だけど、最初から確認してみます。
丁寧に教えてくださりありがとうございます。
また何か分からないことがありましたら質問させていただきます。
0678デフォルトの名無しさん
2009/02/16(月) 10:22:58たとえば
はる、あき、なつ、ふゆ、さくら
というひらがなの配列を作りたいとき
char [6][7] = {"はる","あき","なつ","ふゆ","さくら"};
と宣言しているのですがgccでコンパイルしたときに
warning: initializer-string for array of chars is too long
という警告が出てしまいます。
どのようにすれば良いのでしょうか?
0679678
2009/02/16(月) 10:24:03でお願いします。
0680デフォルトの名無しさん
2009/02/16(月) 10:39:41ソースの文字コードがUTF-8になってない?
"さくら"はUTF-8だと末端のヌル文字を含めて10バイトだよ。
0681678
2009/02/16(月) 10:42:45ありがとう御座います。
実は例題用にだした適当な配列だったのでできれば
UTF-8でのバイト数の計算方法を教えて頂けると幸いです。
0682678
2009/02/16(月) 10:45:33一文字が3または4バイトなんですね.
0683デフォルトの名無しさん
2009/02/16(月) 11:12:450684デフォルトの名無しさん
2009/02/16(月) 15:14:100685デフォルトの名無しさん
2009/02/16(月) 16:01:49#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;
}
ただ、関数一つで十分なのですが・・・・なんとなく。
0686デフォルトの名無しさん
2009/02/16(月) 16:42:42なんというひどいコードだ。
>#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とでもしたかったのか?
0687デフォルトの名無しさん
2009/02/16(月) 16:53:54>このソース内でしか使わないんだからstaticをつけろ。
C++かもしれないじゃないか!
0688デフォルトの名無しさん
2009/02/16(月) 16:56:23???
0689デフォルトの名無しさん
2009/02/16(月) 17:14:04ひどいコードってのは同意
>使われていない宣言。
NAMEOVERは激しく使われてるが? (defineでOK)
>このソース内でしか使わないんだからstaticをつけろ。
こんなネタソースが、これ以上大きくなるわけないだろ
>ここも意味をなしてない。strcpyとでもしたかったのか?
printf("Hello World!\n); は、意味を成していない。putsとでもしたかったのか?
という意味?
0690デフォルトの名無しさん
2009/02/16(月) 17:15:31C++ と C で const つけたグローバル変数のリンケージ違うじゃん
0691デフォルトの名無しさん
2009/02/16(月) 17:16:070692デフォルトの名無しさん
2009/02/16(月) 17:19:39sprintf(U, V); っておかしいだろ。(U, Vはともにchar*)
動かないわけじゃないけど、こういうコードを見ると、「ん?何か意味があるのか?」って考えてしまう。
strcpy(U, V); とするべきだ。
0693デフォルトの名無しさん
2009/02/16(月) 17:22:41#include <iostream>
int main()
{
std::map<std::string, std::string> array;
array["はる"] = "はるのるららの〜";
std::cout << array["はる"] << std::endl;
return 0;
}
0694デフォルトの名無しさん
2009/02/16(月) 17:35:130695デフォルトの名無しさん
2009/02/16(月) 17:42:000696デフォルトの名無しさん
2009/02/16(月) 17:54:28・Runge-Kutta法のプログラムの(ソースの)例
・gnuplot(導入済み)の使い方
の二つが分かる参考書が入用なのです(本当は今これを使えるレベルじゃなきゃいけない……)。情報をお願いします!
0697デフォルトの名無しさん
2009/02/16(月) 17:59:37Numerical Recipes in Cには乗っているよ
他の本にも載っているから、数値計算の本にはどれでも載ってると思う
gnuplotはwebか周りに聞いたほうがいい。本はいらない
0698696
2009/02/16(月) 18:25:590699696
2009/02/16(月) 18:36:54当方のスキルが低いため、助言を他にもいただけたならありがたいです(苦笑w)。
0700デフォルトの名無しさん
2009/02/16(月) 18:40:01素直に宿題スレ行け
0701デフォルトの名無しさん
2009/02/16(月) 18:42:570702697
2009/02/16(月) 18:58:142次ならテイラー展開+オイラーを解くだけなんで…と思ったけど難しいな
まあ、いい加減スレ違いっぽいんでこのへんで
宿題スレとか推奨書籍スレにも常駐しているんでそっちで聞いてくださいな
0703デフォルトの名無しさん
2009/02/16(月) 19:05:41松田先生のページ見れなくなっちゃったし・・・
0704デフォルトの名無しさん
2009/02/16(月) 19:12:47まだみれた。
http://www-it.sci.waseda.ac.jp/teachers/w405201/CPR2/
0705699
2009/02/17(火) 13:48:360706デフォルトの名無しさん
2009/02/18(水) 00:31:46宿題スレでボコボコにされてた人は結局どうなったんだろうか
0707デフォルトの名無しさん
2009/02/19(木) 02:18:51a[5]=0;
のように、添字の範囲外でもビルド時にエラーが出ませんが、
こういったエラーを知る方法が無いでしょうか?
0708デフォルトの名無しさん
2009/02/19(木) 02:49:140709デフォルトの名無しさん
2009/02/19(木) 02:52:20#define A(index) if( index > sizeof(a) ) printf("a error (%d,%d)",index,__LINE__); a[index]
で、デバッグとか? ゲロゲロコードだろ? やめとけ。
0710デフォルトの名無しさん
2009/02/19(木) 03:02:410711デフォルトの名無しさん
2009/02/19(木) 03:40:310712デフォルトの名無しさん
2009/02/19(木) 11:01:37デバッグモードなら operator [] を使ってても
ちゃんと範囲外エラー(もしくは警告)を出してくれる。
C を使っているならあきらめるしか。
っていうか、超プログラマの責任だし。
0713デフォルトの名無しさん
2009/02/19(木) 12:58:480714デフォルトの名無しさん
2009/02/19(木) 12:59:36>>配列すべてマクロ作って、
#define A(index) if(index>sizeof(a))printf("aerror(%d,%d)",index,__LINE__);a[index]
初めて知ったわ!へー、そうなんだ。
こういうアイディアって面白いよね。使う気はしないけど。
0715デフォルトの名無しさん
2009/02/19(木) 15:05:07libmudflapって言うのか?
使ったことない。
っていうか、セットアップの方法さえ・・・
0716デフォルトの名無しさん
2009/02/19(木) 18:53:32class SomeThing
{
public:
typedef int value_type;
...
private:
value_type value_;
};
0717デフォルトの名無しさん
2009/02/19(木) 19:04:20<functional>ヘッダとかで見るとすべてpublicで宣言してる
0718デフォルトの名無しさん
2009/02/19(木) 21:18:46クラスの内部で宣言したからと言ってアクセス指定子の影響って受けるの?
0719デフォルトの名無しさん
2009/02/19(木) 21:22:01typedefをマクロと言うなら変数だって関数だって定義は全部マクロだろ。
0720デフォルトの名無しさん
2009/02/19(木) 22:07:10private部分にtypedefしてみ?
んで、他の関数とかで定義したT::value_typeの型宣言してみ?
偉大なるコンパイラさんがめっちゃ怒るよ
あとtypedefはマクロじゃなくて同義語の定義なんだぜ
0721718
2009/02/20(金) 19:11:25全然違ったのか。
ありがとう。
0722デフォルトの名無しさん
2009/02/21(土) 13:42:31ってどういう意味だっけ?
0723デフォルトの名無しさん
2009/02/21(土) 14:15:51って意味
0724デフォルトの名無しさん
2009/02/21(土) 14:53:470725デフォルトの名無しさん
2009/02/21(土) 14:56:07同音異義語みたいなややこしさがある
0726デフォルトの名無しさん
2009/02/21(土) 14:58:26�d
なんとなくわかりました
0727デフォルトの名無しさん
2009/02/22(日) 22:10:02ってなんか嫌われているの?
問題点はC++0xで直る?
0728デフォルトの名無しさん
2009/02/22(日) 22:24:06vector< bool > はコンテナの用件を満たしていない。
にもかかわらずSTLに残されているのは過去への戒めだそうな。
0729デフォルトの名無しさん
2009/02/22(日) 23:20:55なるほど。
boolを1ビット扱いにしてメモリを節約しました的なことですよね。
もうC++0xで直せば良いのに。戒めとは。
0730デフォルトの名無しさん
2009/02/22(日) 23:31:39どんな問題があるのか素人の自分には思い付かないが。
0731デフォルトの名無しさん
2009/02/22(日) 23:42:050732デフォルトの名無しさん
2009/02/22(日) 23:43:58ちょっといろいろ見てみたが、俺にも思いつかない。
まあ確かに互換性の維持は大事だな。うん。
…でもC++とC++0xは別の言語だぜ!的なスタンスでもいいじゃんか。
せめて3態Boolean(tribool)を追加し、vector<tribool>はコンテナの用件を満たすようにするとか。これなら互換性も問題ない!
0733デフォルトの名無しさん
2009/02/23(月) 07:39:24cなら基本的にasmというのは使えるのでしょうか
0734デフォルトの名無しさん
2009/02/23(月) 10:34:29nopはno operationの意味で何もしない
0735デフォルトの名無しさん
2009/02/23(月) 12:20:58最適化on時にブレークポインタかけたいときに使ってるな。
0736733
2009/02/23(月) 21:25:18処理系というのは、プログラム実行環境ということでしょうか?
使えない環境もあると。nopってのは別にnopって書く必要はないけど
それが一般的によくかかれるようになってるということでしょうか?
>>735
これでどうやって最適化on?するのでしょうか?
0737デフォルトの名無しさん
2009/02/23(月) 21:29:22nopはCPUの命令の一つ(何もしない命令)
最適化してもasm文は消えないからブレークポイントを置ける
0738デフォルトの名無しさん
2009/02/23(月) 21:34:13プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
0739デフォルトの名無しさん
2009/02/23(月) 21:38:130740デフォルトの名無しさん
2009/02/23(月) 21:49:520741デフォルトの名無しさん
2009/02/23(月) 22:09:16マルチ死ねよ
0742デフォルトの名無しさん
2009/02/23(月) 22:12:31ブレークポイント置く意味ってデバッグのためでしょうか?
nop自体はどんなCpuでも理解できる命令で、asmもそうなのかな
ただ、コンパイラするときにasmを認識しないものがあると
0743デフォルトの名無しさん
2009/02/23(月) 22:19:02nopはx86系の命令だが、他のcpuでも同じかも
どっちにしても、asmはcpuの命令を直接書くためにあるし、当然cpuごとに内容は変わる
0744デフォルトの名無しさん
2009/02/23(月) 22:27:220745デフォルトの名無しさん
2009/02/23(月) 22:27:37{
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;
}
このコードはどういう動作をするのでしょうか?
0746デフォルトの名無しさん
2009/02/23(月) 22:27:590747デフォルトの名無しさん
2009/02/23(月) 22:31:07ていうか、別にnop使わなくてもデバッグできるのでは?
0748デフォルトの名無しさん
2009/02/23(月) 22:31:21受信したらその内容をそのままどっか送ってんだろう
0749デフォルトの名無しさん
2009/02/23(月) 22:32:11最適化で無くなってたらとまらないだろう
3歩歩くと忘れるニワトリかよ
0750デフォルトの名無しさん
2009/02/23(月) 22:34:45そうなんですか、ありがとうございます
とあるネットゲームのチートらしいのですが…なんかガセのようですね
0751デフォルトの名無しさん
2009/02/23(月) 22:39:33でも空命令なら最適化されてもいいのでは?
ただ、この分岐をとおっているかどうかとかで判断するためにいれるとかでしょうか?
0752デフォルトの名無しさん
2009/02/23(月) 22:46:05>>737
0753デフォルトの名無しさん
2009/02/23(月) 23:13:140754デフォルトの名無しさん
2009/02/23(月) 23:20:05後、メンバ関数を同じクラスのメンバ関数内で使うことはできますか?
両者返答と合わせて多少解説を付けてくれると助かります
0755デフォルトの名無しさん
2009/02/23(月) 23:33:54前半
void proc(T (*array)[4][4]) { /* (*array)[0][0] などとアクセス */ }
後半
スタティックなメンバ関数からスタティックでないメンバ関数を呼ぶことはできないが、それ以外は可能
0756デフォルトの名無しさん
2009/02/23(月) 23:34:05二つともできる。
解説って「できる」以上になんかあるか?
0757デフォルトの名無しさん
2009/02/23(月) 23:41:21>>756 方法や注意点を等なにかあれば書いてくださいってことです
言葉足らずですいませんでした
0758デフォルトの名無しさん
2009/02/23(月) 23:46:16プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
0759デフォルトの名無しさん
2009/02/23(月) 23:51:170760デフォルトの名無しさん
2009/02/24(火) 00:11:52普通はコンパイラその他がよろしくやってくれるのだから、
なんでそういうことをやりたいのか詳しく書いてくれないと答えようがない。
0761デフォルトの名無しさん
2009/02/24(火) 00:15:070762デフォルトの名無しさん
2009/02/24(火) 00:17:20ひじょうに大雑把に言って、32ビット版Windowsの場合0x0〜0x7fffffffぐらい。
ふつう、アセンブラで書くときでさえ、プログラムを書いた人が「変数
にアドレスを振る」なんてことはしない。何か特殊なことをしようとし
ているぞ。
0763デフォルトの名無しさん
2009/02/24(火) 00:25:17windowsがosとかつかって使用するメモリ領域が0x7fffffffくらいということでしょうか?
空き領域にアドレス振らないと動かないですもんね
でも、実際0x7fffffffまでどったらほとんど空き領域ないですよね
0x07ffffff くらいじゃないでしょうか?
0764デフォルトの名無しさん
2009/02/24(火) 00:36:070-0x7FFFFFFFがアプリ用だけど、
ここにもシステムDLLが読み込まれたり
0-0x7FFF(NTの場合)がぬるぽ検出用で予約されていたりして
実際使える分はもう少し少ない。
3GBモードとか64ビットだとまた違ってくるけど。
0765デフォルトの名無しさん
2009/02/24(火) 00:39:500766デフォルトの名無しさん
2009/02/24(火) 00:45:08でもその範囲あたりでも普通に使えるとこは使えました
0767デフォルトの名無しさん
2009/02/24(火) 00:46:00>windows が os とか つかって 使用するメモリ領域 が 0x7fffffffくらい ということ でしょうか?
>空き領域 に アドレス 振らないと 動かない ですもんね
>でも、 実際 0x7fffffffまで どったら ほとんど 空き領域 ないですよね
>0x07ffffffくらい じゃないでしょうか?
0768デフォルトの名無しさん
2009/02/24(火) 00:53:530769デフォルトの名無しさん
2009/02/24(火) 00:56:22「使う」って何だよ。どんなプログラムを書いて、何が疑問なのかもっと具体的に。
OSに要求してもらった領域以外は勝手に使ったらダメだぞ。
0770デフォルトの名無しさん
2009/02/24(火) 00:59:200771デフォルトの名無しさん
2009/02/24(火) 01:02:130772デフォルトの名無しさん
2009/02/24(火) 01:05:14その他はコンパイラが空いてるアドレスを適当に。
0773デフォルトの名無しさん
2009/02/24(火) 01:06:42プロセスごとにアドレス空間は独立しているから
他のアプリと衝突の心配なんて要らないぞ。
だからこそ仮想アドレスと言うくらいであって。
0774デフォルトの名無しさん
2009/02/24(火) 01:06:550775デフォルトの名無しさん
2009/02/24(火) 01:07:44C/C++で
char *p = (char*)0x70000000;
なんてことをしているってこと?
そんなこと、絶対にしてはいけないぞ。
0776デフォルトの名無しさん
2009/02/24(火) 01:09:040777デフォルトの名無しさん
2009/02/24(火) 01:12:130778デフォルトの名無しさん
2009/02/24(火) 01:15:150779デフォルトの名無しさん
2009/02/24(火) 01:16:510780デフォルトの名無しさん
2009/02/24(火) 02:30:350781デフォルトの名無しさん
2009/02/24(火) 04:25:05例えば、クラスHogeのMemberFunctionを呼ぶとするなら、
次のような普通の関数(静的メンバでも可)を作って、これをCreateThreadに渡す。
ただし、CreateThreadの4つ目のvoid*の引数にHogeへのポインタを渡すこと。
(Hogeの中ならthisも可)
DWORD WINAPI ThreadEntry(void* p)
{
Hoge* pHoge = static_cast<Hoge*>(p);
return pHoge->MemberFunction();
}
0782デフォルトの名無しさん
2009/02/24(火) 06:34:16どうしてそれだとだめなのでしょうか?
0783デフォルトの名無しさん
2009/02/24(火) 07:35:07その物理アドレスがアクセス可能であれば別にダメじゃないよ
0784デフォルトの名無しさん
2009/02/24(火) 07:40:070785デフォルトの名無しさん
2009/02/24(火) 07:57:46それがWindowsでのルールだから。(UNIXでも同じ)
たまたま使えるアドレスがあったとしても、それは他の目的でOSから割
り当てられた領域なので、使ってはダメ。
細かい理由とか書くと長くなるので、OSに関する本など読んで自分で調
べてくれ。
0786デフォルトの名無しさん
2009/02/24(火) 08:07:46マップする方法はどうすればよいのでしょうか?
>>785
>>783みたいなパターンなら可能なのかな
0787デフォルトの名無しさん
2009/02/24(火) 08:23:16特定のアドレスが必要なければ、malloc()やnewすればいい。
VirtualAlloc() で特定のアドレスを要求することもできるけど、普通は
そんなことする必要はない。
なんで特定のアドレスが必要なの?、という疑問に戻る。
0788デフォルトの名無しさん
2009/02/24(火) 09:07:51例外も名前空間もテンプレートも無いって……orz
0789デフォルトの名無しさん
2009/02/24(火) 09:14:57そんな猿が考えたモンキーC++なんて誰も使ってねーよ
0790デフォルトの名無しさん
2009/02/24(火) 09:25:23本当ですか?今は、どこの誰も使っていない?
サイトを調べても生きてるのか死んでるのかよく分かりませんし……。
それなら、Embedded C++ を考えなくて済むんですけど……。
正直、Embedded C++の事は考慮したくありませんよぅ。
だれか、公式に正式に Embedded C++ を破棄しないんでしょうか……。
0791デフォルトの名無しさん
2009/02/24(火) 09:34:450792デフォルトの名無しさん
2009/02/24(火) 11:08:24ただの愚痴だろ。
スルーしろ。
0793デフォルトの名無しさん
2009/02/24(火) 17:54:21public:
0794デフォルトの名無しさん
2009/02/24(火) 18:17:24ミスです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' のハンドルされていない例外が発生しました。とでます
配列をポインタにしない場合で->を.に変えても処理の途中で同じようなエラーメッセージがでます
解決する方法はないでしょうか?
0795デフォルトの名無しさん
2009/02/24(火) 18:20:32が領域確保されてないからだろう、コンストラクタで確保でもしたらいいだろう
そもそもなんでポインタにしてんの?
0796デフォルトの名無しさん
2009/02/24(火) 18:21:46記入忘れがありました
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
とエラーメッセージに記載されてます
0797デフォルトの名無しさん
2009/02/24(火) 18:25:24わかりましたやってみます
ポインタにした理由はいろいろ経緯があって後々便利かなと思ったんです・・・
0798デフォルトの名無しさん
2009/02/24(火) 21:15:05int 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 の配列を割り当てまたは宣言しようとしました。
配列の要素数に変数を使うにはどうすればよいのでしょうか?
0799デフォルトの名無しさん
2009/02/24(火) 21:30:13C言語ならC99対応にする
C++なら a にconst つければ通る
0800デフォルトの名無しさん
2009/02/24(火) 21:52:31WinXP 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となってしまいます。
何が原因なのでしょうか?
0801デフォルトの名無しさん
2009/02/24(火) 22:32:52関数のシンボルが違ってるんじゃないか?DLLを確認してみれ
0802デフォルトの名無しさん
2009/02/24(火) 22:58:531) GetLastError() の値を調べる
2) dumpbin /exports DLL名 でEXPORT関数名を確認する
0803800
2009/02/24(火) 23:14:42extern "C" を #define に含まず宣言に直接記述したらNULL以外を返すようになりました(なんで?)。
もうすこし色々試してみます。
どうもありがとうございました。
0804デフォルトの名無しさん
2009/02/24(火) 23:49:250805デフォルトの名無しさん
2009/02/25(水) 00:18:33これってなんでだめなのでしょうか?
0806デフォルトの名無しさん
2009/02/25(水) 00:24:25メモリ空間が4Gあっても実際にアプリで使える領域はOSが割り当てた一部のみ
勝手に任意のアドレスをポインタに代入してアクセスしようとしてもエラーになるだけ
0807デフォルトの名無しさん
2009/02/25(水) 00:25:40その領域が使用されていない&これからも未来永劫使用されないという保証がないから。
…というかそのくらいは初心者向けサイトで学ぶはずでは。
0808デフォルトの名無しさん
2009/02/25(水) 00:25:55こんな風にすると大丈夫なのでしょうか?
0809デフォルトの名無しさん
2009/02/25(水) 00:27:200810デフォルトの名無しさん
2009/02/25(水) 00:29:19そんなコードをまともにかけるのはよっぽどすごい人だけ。一般のプログラマがそんなコードを使うシチュエーションはない。
volatileってなんだか知ってるのか?
まず猫のページとかいろいろ熟読した方が良いのでは。。。
0811デフォルトの名無しさん
2009/02/25(水) 00:30:05いいよ。
0x70000000にアクセス可能な物理アドレスがマップされていれば。
0812デフォルトの名無しさん
2009/02/25(水) 00:30:54いじめるなよwww
0813デフォルトの名無しさん
2009/02/25(水) 00:31:10逆にマップされていても
そのVOLATAILEをつけないとだめってことでしょうか?
0814デフォルトの名無しさん
2009/02/25(水) 00:35:130x70000000という定数をアドレスに変換してるのが根本的におかしい
これは基礎中の基礎なので、初心者向けのポインタの入門書をじっくりよんで
でなおすべき
ここで聞いて、2-3行の答えをもらって理解できるものでない
0815デフォルトの名無しさん
2009/02/25(水) 00:35:51CPUとは別のデバイスがそのアドレスを変更する可能性がある時に付ける必要があるよ。
コンパイラはCPUが変更しないと思ったら最適化で消しちゃうから。それが抑止される。
0816デフォルトの名無しさん
2009/02/25(水) 00:37:43アドレスとポインタについて相当勉強しない限り
C/C++でプログラミングがまともにできないまま。
>>815
この質問者がそんなハイレベルな話をしていると思うのか?
無駄に上の知識を与えると基礎がおかしくなる。
0817デフォルトの名無しさん
2009/02/25(水) 00:41:44かなり下位レベルの話をしてるよ。
デバイス制御するなら必要な知識でしょ。
0818デフォルトの名無しさん
2009/02/25(水) 00:43:43何らかの特殊な理由がある人は、直接アドレスを指定して読み書きするようなコードを書くことも普通にあるわけ?
よく知らんけど、組み込みとか? あとOS自体のソースとかで使うのかな?
0819デフォルトの名無しさん
2009/02/25(水) 00:46:02ARM開発キットとかのヘッダファイルみるとよくわかるよ。
0820デフォルトの名無しさん
2009/02/25(水) 00:47:20だからそれが意地悪なんだってば。
816(=俺)がハイレベル・ローレベルをそういった意味で使っていないであろうことは想像付くだろ。
質問者がデバイス制御するような人の質問に見えるのか?
>>818
デバドラとか。
0821デフォルトの名無しさん
2009/02/25(水) 00:47:40char *p = (char *)0x70000000;とかは組み込み系の
メモリマップドI/Oの環境ならありえるんじゃないでショッカー
(SHの開発環境のHewとか?)
で、volatileで最適化を抑制するのは、例えば
メモリマップドI/O環境で、pにはアドレスが入ってる場合に
*p = 0x01;
として最適化されると、その後に*pを使わない限り最適化されて
無視されるからで、なんかわかんないけど、volatileつけるってわけじゃないかと
0822デフォルトの名無しさん
2009/02/25(水) 00:51:28正しいよ。
0823デフォルトの名無しさん
2009/02/25(水) 00:51:56ありがと。やっぱりあるみたいだね。
例の質問者は、初心者というよりは、そういう方面の背景を持った人なのかな?
と何となく思ったんだけど、そういうわけでもないのだろうか。
0824デフォルトの名無しさん
2009/02/25(水) 00:52:05>>772
>>775
>>782
この流れを読んで、皆どう解釈したのか。
0825デフォルトの名無しさん
2009/02/25(水) 00:53:19お前らちょっと気持ちを抑えようぜ。
当の本人が置いてけぼりになってるぞ。
08261/2
2009/02/25(水) 00:53:38boost::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;
};
08272/2
2009/02/25(水) 00:54:24int 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();
}
0828デフォルトの名無しさん
2009/02/25(水) 00:56:08ポインタによる書き込みはコンパイラが要/不要の判断できないので
通常最適化の対象にはならない
それはそれとして、
volatile char *p
はポインタがvolatileの対象になるだけなので意味がない
0829デフォルトの名無しさん
2009/02/25(水) 01:06:03ぱっと見た感じでは fの寿命が問題なんじゃねーの?
0831826
2009/02/25(水) 01:11:53ありがとうございました
0832デフォルトの名無しさん
2009/02/25(水) 01:25:44Hoge(42)
と
static_cast<Hoge>(42)
は同じになる?
前者はコンストラクタが呼ばれるのだろうが、後者がどうなるのかわからん。
0833デフォルトの名無しさん
2009/02/25(水) 01:51:04> ポインタによる書き込みはコンパイラが要/不要の判断できないので
> 通常最適化の対象にはならない
それはコンパイラや最適化オプションによる。
とても「通常」と言えるような動作ではない。
> volatile char *p
> はポインタがvolatileの対象になるだけなので意味がない
これの違い分かってる?
volatile char * p;
char * volatile p;
こっちでもいいや。
const char * p;
char * const p;
0834デフォルトの名無しさん
2009/02/25(水) 02:35:00char *p = (char *)0x70000000;
みたいなことはしない。
それ専用の命令やらで、結局はほとんどOSに任せる
0835デフォルトの名無しさん
2009/02/25(水) 02:41:250836デフォルトの名無しさん
2009/02/25(水) 10:40:26同じだよ どちらも一時オブジェクトがコンストラクタによって生成される
0837デフォルトの名無しさん
2009/02/25(水) 10:41:040838デフォルトの名無しさん
2009/02/25(水) 11:29:42PSPとかDSのプログラムやってるとしょっちゅう使うよ
まあマクロで定義されてるのを使うだけなんだが
#define DMA0_SRC (*(vuint32*)0x040000B0)
#define DMA0_DEST (*(vuint32*)0x040000B4)
#define DMA0_CR (*(vuint32*)0x040000B8)
0839デフォルトの名無しさん
2009/02/25(水) 12:02:44この違いも書いておかなくちゃw
volatile char * p;
char volatile * p;
0840デフォルトの名無しさん
2009/02/25(水) 13:09:45そっか。ありがとう!
0841デフォルトの名無しさん
2009/02/25(水) 18:25:04int 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
この古いページの副作用に関するところを読むと、いろいろ不安になることが書いてあるんですけど。
古いからですか?
0842デフォルトの名無しさん
2009/02/25(水) 18:26:43前者の
{/*nの値を変えない処理*/}
も、要するに
nの値を変えず、例外も投げず、breakもせず、他のプロセスからnの値が変わることもなく、gotoとかもしない
ということです。
0843デフォルトの名無しさん
2009/02/25(水) 18:38:08while(n--) printf("%d", n);
を実行してみりゃすぐわかんだろ
0844デフォルトの名無しさん
2009/02/25(水) 18:39:42わかります。
が、標準の仕様で保証されているのでしょうか?
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)
ってなっているんですよね。。。
0845デフォルトの名無しさん
2009/02/25(水) 18:42:49君の質問は、そのページに書かれているような副作用関連のトラブルの話とは無関係に見えるけど。
> 二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
(例えば a = b++ * b++;)
> 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトをアクセスしている場合。
(例えば a[i] = i++;)
に、動作は未定義である。それ以外の場合はとりあえず問題ない。
0846デフォルトの名無しさん
2009/02/25(水) 18:44:090847デフォルトの名無しさん
2009/02/25(水) 18:56:56while(n){
n--;//か--n;でも
}
すれば?
試せばわかるだよ
0848デフォルトの名無しさん
2009/02/25(水) 19:12:340849デフォルトの名無しさん
2009/02/25(水) 19:27:47よーーーーく頭を冷やして考え直してきます。
0850デフォルトの名無しさん
2009/02/25(水) 20:23:36厳密な言語仕様なんて答えられないんだ。
ゴメンね。
0851デフォルトの名無しさん
2009/02/25(水) 20:25:48その通りだよ。
0852デフォルトの名無しさん
2009/02/25(水) 20:48:28言語仕様なんて現実のコンパイラの挙動の前では、なんの役にも立たないからなあ
組んだ事の無いと、間抜けなコンパイラのセールスマンは、仕様どうこうを宣わって、遊んでられるかもしれんが。
0853デフォルトの名無しさん
2009/02/25(水) 21:10:36即刻クビにしたい。
0854デフォルトの名無しさん
2009/02/25(水) 21:13:29お前って#pragma濫用するタイプだろw
0855デフォルトの名無しさん
2009/02/25(水) 21:17:320856デフォルトの名無しさん
2009/02/25(水) 21:20:40わかるわかる
うちに来てる使えない派遣が正にそんな感じwww
0857デフォルトの名無しさん
2009/02/25(水) 21:22:01死ね
0858デフォルトの名無しさん
2009/02/25(水) 21:22:550859デフォルトの名無しさん
2009/02/25(水) 21:23:31VCじゃあるまいしw
0860デフォルトの名無しさん
2009/02/25(水) 21:25:14派遣にバカにされてる正社員乙
0861デフォルトの名無しさん
2009/02/25(水) 21:27:48しかもコメントも含めて#ifdefを一番最初にしないとうまくいかないとかそういう環境もあるらしいし
気にしてたらキリがないね
0862デフォルトの名無しさん
2009/02/25(水) 21:28:07無職に社員を首にする権限なんて無いから
0863デフォルトの名無しさん
2009/02/25(水) 21:32:29まともな技術者ならコンパイラの挙動に影響されないように言語仕様に沿って開発するだろ。
>>852は真でいい。社会の害悪だ。
0864デフォルトの名無しさん
2009/02/25(水) 22:04:08>>852 = true と見てしまったじゃないか!
0865デフォルトの名無しさん
2009/02/25(水) 22:19:38このスレ的にその勘違いは大問題。
0866デフォルトの名無しさん
2009/02/25(水) 23:41:39>>まぁ#pragma自体は標準だけどなw
あれ謎だよね。
挙動は環境依存だが存在することだけは確かってことでしょ。
0867デフォルトの名無しさん
2009/02/26(木) 00:12:36実社会でも大問題だけどな。
0868デフォルトの名無しさん
2009/02/26(木) 01:05:50char volatile * p;
この違いってなんでしょうか?
0869デフォルトの名無しさん
2009/02/26(木) 01:07:570870デフォルトの名無しさん
2009/02/26(木) 01:18:240871デフォルトの名無しさん
2009/02/26(木) 04:15:49エディットコントロールなどをシステム実行中に動的に作成する方法はありますか?
たとえば
入力を求め3と入力されたら3つ縦に並べてエディットコントロールを作成する
のような動作をさせたいです
0872デフォルトの名無しさん
2009/02/26(木) 04:17:020873デフォルトの名無しさん
2009/02/26(木) 04:31:42あります。
0874デフォルトの名無しさん
2009/02/26(木) 06:21:26CreateWindowすればいいよ。あるいは、上限が決まっているなら、
リソース上でその数だけ作っておき、必要に応じて表示したり隠したりするという手も。
0875デフォルトの名無しさん
2009/02/26(木) 08:38:42Visual C++ というと C++/CLI のことになるの?
それとも visual studio で使う C++ のことになるの?
0876デフォルトの名無しさん
2009/02/26(木) 09:14:50それは言語ではなく開発環境を示す
0877デフォルトの名無しさん
2009/02/26(木) 09:24:41C++/CLI で .NET
C++ & MFC
C++ & API
どれか解らん。なので、その辺りを書かない質問
(大抵の場合、自分が何をしているかも解ってないので
スレ違いになる) は適当に答えられたり、スルーされたりしやすい。
>>871 の場合は MFC と予測。
>>876
C++/CLI は C++ 互換の言語。
0878デフォルトの名無しさん
2009/02/26(木) 10:24:40Visual StudioはVisual C++, Visual C#, Visual Basic, Visual Web Developer を総合したやつ
Visual C++では C++/CLIもC++もCも使える
0879デフォルトの名無しさん
2009/02/26(木) 21:59:090880デフォルトの名無しさん
2009/02/26(木) 22:08:140881デフォルトの名無しさん
2009/02/26(木) 22:09:27{
static int n = 0;
n = (n + 1) % 3;
return n;
}
0882デフォルトの名無しさん
2009/02/26(木) 22:12:01++n;
if (n == 2) {
n = 0;
}
0883デフォルトの名無しさん
2009/02/26(木) 22:12:17sw += 1;
sw &= 0x03;
return sw;
}
0884デフォルトの名無しさん
2009/02/26(木) 22:12:57あ、サンが来る失敗。
0885デフォルトの名無しさん
2009/02/26(木) 22:17:05static int NumLoop[]={1,2,0};
static int n = 0;
n=NumLoop[n];
return n;
0886デフォルトの名無しさん
2009/02/26(木) 22:20:07sw += 1;
sw &= 0x03;
sw ^= sw << 1
return sw;
}
0887デフォルトの名無しさん
2009/02/26(木) 22:32:050889デフォルトの名無しさん
2009/02/26(木) 22:57:060890デフォルトの名無しさん
2009/02/26(木) 23:09:520891デフォルトの名無しさん
2009/02/26(木) 23:11:37こっちだ
0892デフォルトの名無しさん
2009/02/26(木) 23:18:380893デフォルトの名無しさん
2009/02/26(木) 23:30:13キモイのは貴様だ
いい意味で
0894デフォルトの名無しさん
2009/02/26(木) 23:31:40条件演算子をループさせるなんて…。
0895デフォルトの名無しさん
2009/02/26(木) 23:34:090896890,891
2009/02/26(木) 23:38:430897デフォルトの名無しさん
2009/02/26(木) 23:45:230898デフォルトの名無しさん
2009/02/27(金) 03:23:330899デフォルトの名無しさん
2009/02/27(金) 07:48:49でも動くんだなwww
0900デフォルトの名無しさん
2009/02/27(金) 10:12:49それならC#使う方がよさげ?
0901デフォルトの名無しさん
2009/02/27(金) 12:49:52別に悪くないよ。
C#使うならそっちの方がいいけど。
0902デフォルトの名無しさん
2009/02/27(金) 14:25:48どうすればいいでしょうか?
0903デフォルトの名無しさん
2009/02/27(金) 14:34:220904デフォルトの名無しさん
2009/02/27(金) 16:38:36調べてもいいのがでてきません
0905デフォルトの名無しさん
2009/02/27(金) 16:59:12log(DBL_MAX)/log(n) >= m;が真ならばオーバーフローしない
でどうか?
0906デフォルトの名無しさん
2009/02/27(金) 17:01:430907デフォルトの名無しさん
2009/02/27(金) 17:16:07釣り?
pow(x, y)はexp(log(x) * y)なので、log(x) * yがlog(DBL_MAX)に達するようならオーバーフローする。
って、>905と一緒だね。
0908デフォルトの名無しさん
2009/02/27(金) 17:25:000909デフォルトの名無しさん
2009/02/27(金) 18:46:06皆様、ありがとうございました。
0910デフォルトの名無しさん
2009/02/27(金) 19:09:34オーバーフローする可能性が低いならば実行時にハードウェアで検出
の方が効率が良い。
0911デフォルトの名無しさん
2009/02/27(金) 19:15:560912デフォルトの名無しさん
2009/02/27(金) 19:31:10まあ、多倍長にすればいいんだろうけど
0913デフォルトの名無しさん
2009/02/27(金) 19:36:010914デフォルトの名無しさん
2009/02/27(金) 19:40:35#define square(x) ((x) * (x)) がダメな具体例を挙げろと言われた。
答えられなかったorz
ヤバいのは関数を突っこんだときとかだっけ?
0915デフォルトの名無しさん
2009/02/27(金) 19:45:180916デフォルトの名無しさん
2009/02/27(金) 20:05:08あー、それか。
なんで出てこなかったんだろう。
0917デフォルトの名無しさん
2009/02/27(金) 20:49:29マクロ関数で同じ引数が2個出るのはまずいのを覚えましょう
0918デフォルトの名無しさん
2009/02/27(金) 20:55:11int z = square(++y);
0919918
2009/02/27(金) 20:55:420920デフォルトの名無しさん
2009/02/27(金) 21:59:16仕様も提示せずにダメな例も何も無いだろ。
記述した通りに動く。何もダメじゃない。
0921デフォルトの名無しさん
2009/02/27(金) 22:08:53くるまでC++の技術書とか買うの待ったほうがいい?
0922デフォルトの名無しさん
2009/02/27(金) 22:10:30待てるなら待ってそのまま買わなければお金を無駄にせずに済むよ。
必要ならすぐ買おう。
0923デフォルトの名無しさん
2009/02/27(金) 22:16:29なにげに楽しみな俺がいる。
0924デフォルトの名無しさん
2009/02/27(金) 22:42:39買おう思ったなら今の本買えば?
C++0xの本はしばらくでないでしょ。
boost本あたりで少し先取りできるけど
これをよしとするか中途半端だと一蹴するか
0925デフォルトの名無しさん
2009/02/27(金) 23:14:360926デフォルトの名無しさん
2009/02/27(金) 23:37:560927デフォルトの名無しさん
2009/02/28(土) 00:12:58C言語を始めて以来、徐々に規模の大きいものを組むようになりました。
はじめは関数化したり、グローバル変数をできるだけ作らないようにする、といったことを心がけることで
複雑なコードにならないようにしていたのですが、数千行になってくると、それでも
しんどくなってきました。
そこで、まとまった処理や変数をクラス化して、プログラムをモジュールに分割することを試みました。
ところが、キレイに分離できて扱い易くなったものもあるものの、かなり複雑に絡み合った処理部は
うまくモジュールに分離できず、ムリにクラス化すると、逆に分かり辛くなるという、本末転倒な
結果に陥ってしまいました・・・
やはり、初期の段階でモジュール構成など、設計をちゃんとした上で組まないと、大規模な
プログラムを効率的に組んでいくことは難しいと思いました。
そこで、このように、大規模なプログラムを組む上で気を付けることや、考え方、方針などが
書かれているWebサイトや書籍をご存知だったら教えていただきたいです。
ご助言、よろしくお願いします。
0928デフォルトの名無しさん
2009/02/28(土) 00:19:550929デフォルトの名無しさん
2009/02/28(土) 00:24:52ttp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
0930デフォルトの名無しさん
2009/02/28(土) 00:48:13それはどうだろ・・・
>>928
まあ、そこから始めればいいのかな
0931デフォルトの名無しさん
2009/02/28(土) 01:02:16Code Complete 読め
0932デフォルトの名無しさん
2009/02/28(土) 01:34:420933デフォルトの名無しさん
2009/02/28(土) 06:03:040934デフォルトの名無しさん
2009/02/28(土) 17:38:090935デフォルトの名無しさん
2009/02/28(土) 17:47:230936デフォルトの名無しさん
2009/02/28(土) 20:11:490937デフォルトの名無しさん
2009/02/28(土) 22:34:39何を入れれば良いのでしょうか?
とりあえずコンパイラが必要なようですがそれも沢山あってどれが良いのか全くわかりません。
0938デフォルトの名無しさん
2009/02/28(土) 22:36:07Windows: Visual Studio 2008 Express Edition
Linux: gcc
0939デフォルトの名無しさん
2009/02/28(土) 22:38:020940デフォルトの名無しさん
2009/02/28(土) 22:39:14俺的にはコンパイラはbccもオススメ。
あと
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
あたりを読むと完璧な初心者(というより入門者)の学習には評判が高いからいいんじゃない?
0941デフォルトの名無しさん
2009/02/28(土) 22:53:59bccはおすすめしない
0942デフォルトの名無しさん
2009/02/28(土) 23:01:28トレース機能を使いたいのですが、
TRACE("test");とすると
'TRACE': 識別子が見つかりませんでした
と出てコンパイルエラーになります。
どうすればトレース機能が使えるようになるのでしょうか?
0943デフォルトの名無しさん
2009/02/28(土) 23:11:05それはやめてstatic const hoge=42;の様に即値を定義しろと聞いたんだが、
可能な限り徹底する物なの?
正直いってまずかぶらないような長ったらしいマクロ名にすればマクロでも大丈夫だよね?
static constとかしてもヘッダーをインクルードしたら結局かぶるわけだし
0944デフォルトの名無しさん
2009/02/28(土) 23:17:22デバッガ動かすときに、名前が残るのでそれが良いという話がある
あと型が指定されるのでそれが良いこともある
Cだとしたらそもそもconstつけても定数扱いにはならないので、置換できないケースがある
そしてC++ならstatic より無名名前空間を勧めろよと
0945デフォルトの名無しさん
2009/02/28(土) 23:20:11afx.h
0946デフォルトの名無しさん
2009/02/28(土) 23:35:42afx.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]
0947デフォルトの名無しさん
2009/02/28(土) 23:36:24無名名前空間ですか。
ちょっと勉強してきます
0948デフォルトの名無しさん
2009/02/28(土) 23:36:372ちゃんのスレで荒しが書き込んだレスが「あぼーん」では無く
番号ごと削除されてるんですけど・・・
こんな事が削除人ならできるのですか?
0949デフォルトの名無しさん
2009/02/28(土) 23:39:19#define _AFXDLL を書いたら動きました。ありがとうございました
0950デフォルトの名無しさん
2009/02/28(土) 23:52:24>役者不足だろ
>役者不足だろ
>役者不足だろ
0951デフォルトの名無しさん
2009/03/01(日) 00:03:070952デフォルトの名無しさん
2009/03/01(日) 00:07:56Wikipedia見てきた。
役不足
俳優などが自分の与えられた役に対して不満を抱くこと。転じて、その人の能力に対して役目が不相応に軽いこと。
→×自分の与えられた役目が重く、自分の力量に見合わないこと。
嫌味として使われていたものを本来の意味と取り違えたもの。[要出典]謙遜の意味で誤用されているケースが多いが、これも意味がほぼ逆に解釈されている。
力不足(力量を超える役割)と勘違いした結果である。「役者不足」という役不足に語幹の似た言葉が用いられることもあるが、これは造語であり「役者不足」は単純に役者の頭数が不足しているという意味であり、
個人の能力が不足しているという意味ではない(即ち力不足の意味で役者不足を用いる事も誤用である)。「役職は多いが役者不足である」は正用。
って書いてあるね。
0953デフォルトの名無しさん
2009/03/01(日) 00:09:140954デフォルトの名無しさん
2009/03/01(日) 00:13:52ゴチになりやす
0955デフォルトの名無しさん
2009/03/01(日) 00:36:32大暴れさせるに足る論拠マダー?
0956デフォルトの名無しさん
2009/03/01(日) 01:01:570957デフォルトの名無しさん
2009/03/01(日) 01:23:200958デフォルトの名無しさん
2009/03/01(日) 01:40:420960デフォルトの名無しさん
2009/03/01(日) 05:47:56悪い事言わないからHSPにしとけ。
最新のじゃなくて、Ver2.xな
それで物足りなさを感じるようなレベルになったらdll作ってみるとか、
HSPで作った物をC++で作り直してみるとかしたほうが絶対いい
0961デフォルトの名無しさん
2009/03/01(日) 05:51:030962デフォルトの名無しさん
2009/03/01(日) 08:55:100963デフォルトの名無しさん
2009/03/01(日) 12:48:11aとbに共通するデータをcに格納する計算量の少ない方法教えてください。
0964963
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";
}
0965デフォルトの名無しさん
2009/03/01(日) 13:19:060966デフォルトの名無しさん
2009/03/01(日) 13:23:400967デフォルトの名無しさん
2009/03/01(日) 13:29:50アホか
0968デフォルトの名無しさん
2009/03/01(日) 13:31:480969デフォルトの名無しさん
2009/03/01(日) 13:44:26set_intersection()が計算量が最小になるアルゴリズムになってるだろ。
比較や移動のコストは知らんが。
0970デフォルトの名無しさん
2009/03/01(日) 13:59:37一定区間ごとbitsetで存在を表して、そのandを取れば速いかと思ったのですが964に負けました。
表面的には比較回数が減ってますが、裏の手間が掛かりすぎるようです。
0971デフォルトの名無しさん
2009/03/01(日) 14:01:30a{0 0 1 2}
b{0 1 1 2}
0972デフォルトの名無しさん
2009/03/01(日) 14:36:37おお、ほんとだ。そんなアルゴリズムがあった。
っていうか、STL標準講座はやっぱりダメな本だった
0973デフォルトの名無しさん
2009/03/01(日) 14:45:37どうダメな本なの?
0974デフォルトの名無しさん
2009/03/01(日) 15:03:31君にはいい本かもよ?
0975デフォルトの名無しさん
2009/03/01(日) 15:29:33入門書なのに読めば何でも出来るようになると思い込んでいる人間には向いていない
0976デフォルトの名無しさん
2009/03/01(日) 16:41:370977デフォルトの名無しさん
2009/03/01(日) 17:06:005つのint型配列a1[N],a2[N],・・・a5[N]はソートされているとします。
これらに共通するデータをbに格納する計算量の少ない方法教えてください。
0978デフォルトの名無しさん
2009/03/01(日) 17:09:593個でも7個でも同じアルゴリズムで出来たらいいのですが
0979デフォルトの名無しさん
2009/03/01(日) 17:11:37a3とbに共通するデータをbに格納
0980デフォルトの名無しさん
2009/03/01(日) 17:13:43a1とa2に共通するデータをbに抽出
a3とbに共通するデータをbに格納
これを繰り返してったらいいんじゃない
0981デフォルトの名無しさん
2009/03/01(日) 17:16:52binソートのごとく数字が存在したらインクリメント
最後に5こでも7こでも元配列の数だけ増えてる奴を抽出
計算量は線形だ。
0982デフォルトの名無しさん
2009/03/01(日) 17:27:410983デフォルトの名無しさん
2009/03/01(日) 17:32:58おいw
0984デフォルトの名無しさん
2009/03/01(日) 17:36:590985デフォルトの名無しさん
2009/03/01(日) 18:12:36この部分がかなりアレだが範囲が決まってるならアリだな
0986デフォルトの名無しさん
2009/03/01(日) 18:32:140987デフォルトの名無しさん
2009/03/01(日) 19:38:31a1 にある数が5個入ってたら a2〜a5 に入ってなくてもヒットしちゃう
0988デフォルトの名無しさん
2009/03/01(日) 20:22:390989デフォルトの名無しさん
2009/03/01(日) 20:25:200990デフォルトの名無しさん
2009/03/01(日) 20:36:350991デフォルトの名無しさん
2009/03/01(日) 22:22:31っていってるから別に>>987の問題はないんじゃ
0993デフォルトの名無しさん
2009/03/01(日) 22:42:03猫でも分かるはやめとけ。
まあ、猫でもいいけど、なにか引っかかったり疑問に思ったら
すぐ捨てて、ほかの入門書にあたれ。
0994940
2009/03/01(日) 23:19:28猫でも分かるは本当に最初だけだよ。
いつかは仕様について学ばなければならなくなるから、
そしたらその時にちゃんと初心者用の書籍を買って読むといい。
0995デフォルトの名無しさん
2009/03/01(日) 23:28:190996940
2009/03/01(日) 23:49:31実は俺はある程度勉強してからその存在に知ったからなぁ。
…あれはインストール方法を省略してたっけ?
その辺はもう覚えとらん。
メインコンテンツの解説の部分しか覚えとらん。
0997デフォルトの名無しさん
2009/03/02(月) 00:03:31int配列だから範囲はintの範囲と決まってんじゃんw
0998981
2009/03/02(月) 00:20:060999デフォルトの名無しさん
2009/03/02(月) 00:37:13スレを勃てるまでもないC/C++の質問はここで 8
http://pc11.2ch.net/test/read.cgi/tech/1235921779/
1000デフォルトの名無しさん
2009/03/02(月) 00:38:2210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。