スレを勃てるまでもないC/C++の質問はここで 7

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもない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/
2デフォルトの名無しさん:2009/01/27(火) 00:21:10
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
3デフォルトの名無しさん: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-、












4デフォルトの名無しさん:2009/01/27(火) 00:21:51
このスレつかうの?合流するの?
5デフォルトの名無しさん:2009/01/27(火) 00:23:08
ひょっとしていらんかったのですか・・・ごめんよ
6デフォルトの名無しさん:2009/01/27(火) 00:26:38
前スレの982です。

>999 :デフォルトの名無しさん:2009/01/27(火) 00:07:57
>質問者は、DLLと言い切ってるところにむしろ不安があるんだが

たぶん,勘違いしてるんです。だから毒抜きしたいので思いっきり言っちゃってください。
どこらへん勘違いしてそうですか?
7デフォルトの名無しさん:2009/01/27(火) 00:30:42
立ってしまったからには使うしか無いな。
8デフォルトの名無しさん:2009/01/27(火) 00:43:56
乱数一回で3万件のシャッフルできるやつ明日までに作るから待ってろ。他のプログラム使わず。
9デフォルトの名無しさん:2009/01/27(火) 00:50:47
たのんます。
10デフォルトの名無しさん:2009/01/27(火) 02:39:14
30000!まで扱うのは出来るとしても、その範囲の乱数の生成法が思いつかん。
ちょうど2の1000乗とかだったら、rand()をシフトさせればいいが。 
何桁なのかもわからん。
11デフォルトの名無しさん:2009/01/27(火) 02:55:24
スターリングの公式に当てはめると30000!は2進数でおよそ403200桁らしい。
計算結果
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=
12デフォルトの名無しさん:2009/01/27(火) 03:24:17
シャッフルの人に聞きたいんだが、どこが遅いかおおむね分かったりしないかな。
というかどれくらいかかってるの?

ファイル名ということであれば256バイト固定でやってもいいように思う。
3万回のallocのコストが影響してるのかもしれないし。
連続領域の2次元配列で、インデックスのみのシャッフル(>>956-957)を試してみて。
毎回allocするのはコストが高いかも。ファイル名取得コストも調べないとだけど。

それと、tempという変数がグローバル変数ならローカル変数に変えてみて。
13デフォルトの名無しさん:2009/01/27(火) 06:15:10
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
14デフォルトの名無しさん:2009/01/27(火) 08:32:07
>>6
リンクの仕組み
15デフォルトの名無しさん:2009/01/27(火) 09:52:01
>>8
乱数「1回」って何だよ。
多倍長の乱数を作るのと、4バイトの乱数をたくさん作るのは本質的に何も変わらないって解ってる?
逆に言えば多倍長の乱数を「1回」作ってそれをLSBから必要なビット数ずつ取り出して使えば、どんなアルゴリズムでも乱数を「1回」以上作るのは必要は無い。
16デフォルトの名無しさん:2009/01/27(火) 10:42:17
>>12
遅いっていっても、シャッフルするのに10秒はかからん感じです。
妥当なのかもです。
indexのシャッフルもやりました、tempはローカルっす。
17デフォルトの名無しさん:2009/01/27(火) 11:03:54
>>16
ちょっと改めてソース出してみてよ。手が空いてたら試してみるから。
18デフォルトの名無しさん:2009/01/27(火) 11:24:11
ディレクトリに3万の無作為なファイルが必要ですけど。。。
19デフォルトの名無しさん:2009/01/27(火) 11:27:55
ん? ファイル名を入れ替えているだけじゃないの?
まぁ、ファイル名そのものにもランダム性が必要なわけじゃないなら10万くらいファイルが転がっているディレクトリくらい簡単に用意できるし。
# たまたま、今度の仕事は10*1000*10くらいの個数の画像ファイルが相手なんだw
20デフォルトの名無しさん:2009/01/27(火) 11:36:53
!?ソース削ってたら2秒くらいで全件表示まで動くようになった
21デフォルトの名無しさん:2009/01/27(火) 11:41:48
えー!まさかのうっかりミス?
劇的改善おめ。
何やって高速化したか聞きたいなw
22デフォルトの名無しさん:2009/01/27(火) 11:46:58
シャッフル以外の処理の部分でした
30000件printfする前に30000中の該当データを弄る関数があって
そこをコメントアウトしたらはやくなりまうすた
シャッフル自体はまともにうごいてますた
23デフォルトの名無しさん:2009/01/27(火) 11:50:26
「問題を再現する最小限のソースの提示」が問題解決に役立つ好例だな。
24デフォルトの名無しさん:2009/01/27(火) 12:02:39
すんません、おそくなりました
もっと早くなりそうだったら、と思いうpしますた
きたなくてすいません
センスのない変数ネーミングですいません

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8748.c
25デフォルトの名無しさん:2009/01/27(火) 12:23:18
>>24
実行してなくて以下完全に妄想で。
>>12さんの言うようにmallocのコスト減らしたいので
メモリの無駄を許容できるならfilename=calloc()のときに一緒にバカでかいテーブル作ってもいいかも。
あとstrcpy(filename[i], entry->dname);一発にすればtemp[]への一時strcpy()いらなくね?とか
26デフォルトの名無しさん:2009/01/27(火) 12:38:16
>>24
処理中にファイルが増えるとまずいコードになってる
できれば1回で読みながらファイル数を数えるべきだけど
せめて2回目に読むときにiがcountを越えないようにするべき
27デフォルトの名無しさん:2009/01/27(火) 12:44:16
1回で読みながらファイル数を数えるってことは
動的配列は使えないってことですか
28デフォルトの名無しさん:2009/01/27(火) 13:36:38
処理前の時点で数が未知なものは動的確保の得意とするところじゃない?
realloc()で増やしながら回すとかかな
29デフォルトの名無しさん:2009/01/27(火) 13:56:47
やってみまう
30デフォルトの名無しさん:2009/01/27(火) 13:59:30
10秒、2秒とか何言ってるんだ?
数万件程度のシャッフルなんてミリ秒オーダーで十分だろ。
組み込み系のマイコンでも使ってるのか?
31デフォルトの名無しさん:2009/01/27(火) 14:02:30
>>30
すんまへん。。。ソースは>>24です
3212:2009/01/27(火) 14:28:33
3万ファイル作ってやってみたけど、十分速いように思った
dataディレクトリに1.dat〜30000.datがある状態で以下。
% time ./a.out data 30000 >| /dev/null
finish!!
./a.out data 30000 >| /dev/null 0.03s user 0.03s system 99% cpu 0.068 total
33デフォルトの名無しさん:2009/01/27(火) 14:35:57
わざわざありがとう、これでいきます
34デフォルトの名無しさん:2009/01/27(火) 14:46:29
Cです。
#include<stdio.h>
typedef struct{
int a,b;
}A;

int func(A **a){return a[0]->a;}

int main(){
 A foo[12];
 int x;
 foo[0].a = 1;
 x = func(&foo);
 printf("%d\n", x);
 return 0;
}

コンパイルできるのですが、実行するとprintfまで処理がたどり着きません。
何が問題なのでしょうか
35デフォルトの名無しさん:2009/01/27(火) 14:56:17
int func(A (*a)[12])
とか
36デフォルトの名無しさん:2009/01/27(火) 15:10:52
>>34
func()の引数はポインタ配列が期待されているはずだが・・・
37デフォルトの名無しさん:2009/01/27(火) 15:41:50
>>15
3万個の乱数を生成するには、15bit*30000ビット=45万bit必要。 
順列と整数を一対一対応されるのは上の計算から40万bit必要。
少し減らせるだけであんまり変わらないか
38デフォルトの名無しさん:2009/01/27(火) 15:44:13
多倍長のやつ作ろうとしたが、割り算が面倒、速度低下するのでやめたよ。
39デフォルトの名無しさん:2009/01/27(火) 15:52:46
全ての順列を生成するプログラムとしてはこれが最適ではないかな。たった4行。

#include<stdio.h>
#include<vector>
using namespace std;
typedef vector<unsigned char> ret;

void shuffle(ret A, ret &B, int k){
int i,n,N=k,M=A.size(); B.resize(M);
for(i=M;i>=1;i--) {
n=N % i; N/=i; B[M-i]=A[n];
memmove(&A[n], &A[n+1], i-n-1); }}

main(){
ret A(5),B;
for(int i=0; i<5; i++)A[i]=i+1;
for(int k=0; k<120; k++){
shuffle(A,B,k);
for(int i=0; i<5; i++) printf("%d ",B[i]);printf("\n"); }}
40デフォルトの名無しさん:2009/01/27(火) 15:54:58
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); }}
41デフォルトの名無しさん:2009/01/27(火) 16:35:37
>>8>>38
4212:2009/01/27(火) 16:36:47
手が空いたので試してみたけど、うちの環境ではallocよりreaddirの方が十分遅いので
今2回走査してるのを1回にすればずいぶん速くなった。
filenameをreallocするようにしてもreadirの回数が半分になるコストダウンの方が大きく、
実行時間はおよそ半分になりました。
参考まで。
43デフォルトの名無しさん:2009/01/27(火) 17:21:24
ソースくれてもいいんだよ^^
44デフォルトの名無しさん: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);
45デフォルトの名無しさん:2009/01/27(火) 17:40:31
そ、そこですか!?
な、なるほど・・・ありがとう
46デフォルトの名無しさん:2009/01/27(火) 20:42:55
困ってるんで教えてください

一つのHDDでCドライブを起動ディスク、Dドライブをデータディスクにして
パーティションを分けています
デフラグしたところ、Dドライブの直下に突然
msvci70.dllというのが出てきました、説明欄にMicrosoftR C++ Runtime Library
とありますがこのファイルは本来どこにあるべきものでしょうか?
47デフォルトの名無しさん:2009/01/27(火) 20:59:36
>>46
君のPCなら好きにしろ
要らなければ消せ
48デフォルトの名無しさん:2009/01/27(火) 21:03:55
>>39
何が4行なの?
49デフォルトの名無しさん:2009/01/27(火) 21:05:15
shuffle関数
50デフォルトの名無しさん:2009/01/27(火) 21:15:28
これまた酷い釣りだな
51デフォルトの名無しさん:2009/01/27(火) 21:16:48
>>47
了解しました
消しときます
52デフォルトの名無しさん:2009/01/27(火) 21:18:42
>>49
これはひどいwww
53デフォルトの名無しさん:2009/01/27(火) 21:20:28
>>49
main関数だろ
shuffle関数は5行だ
54デフォルトの名無しさん:2009/01/27(火) 21:29:17
あなたが神ですかwww
55デフォルトの名無しさん:2009/01/27(火) 23:07:24
int *p
p = (int *)0x3333

char *array[10]
array = (char *)0x5555

これらはどのような動きをしているのでしょうか?
56デフォルトの名無しさん:2009/01/28(水) 01:04:09
>array = (char *)0x5555
ねーよw
57デフォルトの名無しさん:2009/01/28(水) 01:05:59
どう間違っているのでしょうか?
58デフォルトの名無しさん:2009/01/28(水) 01:07:28
配列名に代入できるわけがない
59デフォルトの名無しさん:2009/01/28(水) 01:09:24
>>14
こういうことすか?
標準関数のライブラリはオブジェクトファイルが容易してあって、
そのヘッダファイルをリンクするだけでビルドできちゃう。
でも、DLLの関数はオブジェクトファイルじゃなくてライブラリなんだからロードしてつかわなきゃだめでしょ
ってことですか?
60デフォルトの名無しさん:2009/01/28(水) 01:13:12
>>58
どうすれば配列にメモリ割り当てられますか?
61デフォルトの名無しさん:2009/01/28(水) 01:17:51
&array[] = malloc(100);
62デフォルトの名無しさん:2009/01/28(水) 01:18:29
>>59
標準関数であっても、それがオブジェクトファイルで用意されているか
静的ライブラリか動的ライブラリかは環境依存。
また、それらを明示する必要があるかどうかも同様。
例えばunix系のgccではmath.hで宣言されている標準関数は明示的に
ライブラリを指定する必要(-lm)があるが、iccではその必要がない。
63デフォルトの名無しさん:2009/01/28(水) 01:18:55
>>55
つーか、何がしたいのさ。
64デフォルトの名無しさん:2009/01/28(水) 01:19:39
>>61
自分でアドレスを指定したいのです
65デフォルトの名無しさん:2009/01/28(水) 01:21:35
array[0] = (char *) 0x5555;
66デフォルトの名無しさん:2009/01/28(水) 01:24:01
>>65
もしかして配列の要素数だけ指定しないといけないのでしょうか?
67デフォルトの名無しさん:2009/01/28(水) 01:24:50
だから、やりたいことを具体的に書け。
68デフォルトの名無しさん:2009/01/28(水) 01:26:17
ポインタとしての変数や配列、構造体、関数にメモリ番地をしていしたいのです
69デフォルトの名無しさん:2009/01/28(水) 02:00:11
この質問最近良く見るけど同じ人?
何がしたいのか書いて欲しい
int i; /* iをintで宣言 */
みたいな感じではなく。
70デフォルトの名無しさん:2009/01/28(水) 02:07:42
>>69
大抵変数でも構造体でも配列でも実行したら適当なメモリ番地に格納されますよね

それを指定したいわけです。テストする際でも、メモリ番地変更の必要があるとエラーがでたりするので
71デフォルトの名無しさん:2009/01/28(水) 02:10:47
どんなときにメモリ番地変更の必要があるんだ?
72デフォルトの名無しさん:2009/01/28(水) 02:10:48
>メモリ番地変更の必要があると
なぜ必要になる事があるんだ
73デフォルトの名無しさん:2009/01/28(水) 02:28:49
ダメだこりゃ。
74デフォルトの名無しさん:2009/01/28(水) 02:33:03
>int i; /* iをintで宣言 */
みたいな感じだったな
7569:2009/01/28(水) 03:08:54
あぁぁ。。なにこの絶望感
おやすみorz
76デフォルトの名無しさん:2009/01/28(水) 06:27:33
組み込み系で64Kbyteの隙間にデータを埋め込んだりしてるんじゃないだろうか
77デフォルトの名無しさん:2009/01/28(水) 07:15:20
char (*array)[10];
array = (char(*)[10])0x5555;
78デフォルトの名無しさん:2009/01/28(水) 07:44:56
>>77
それはどういう意味なのでしょうか?
79デフォルトの名無しさん:2009/01/28(水) 09:35:48
>>78
任意のメモリアドレスにアクセスしたければ、ポインタを書き換えればいいでしょ。
なんでそれじゃ駄目なの?
80デフォルトの名無しさん:2009/01/28(水) 10:29:23
>>77
正式に確保してないからいつ内容がぶっ壊されても文句言えないけどな
81デフォルトの名無しさん:2009/01/28(水) 10:31:44
物理アドレスにマッピングしたいシンボルは
ソース上は静的な構造体にまとめといて
リンカ/ローダで物理アドレス指定するのが
16ビット時代の俺の常識。

>>75
ドンマイw
82デフォルトの名無しさん:2009/01/28(水) 10:34:46
16bit時代は直接物理アドレスいじれたの?
83デフォルトの名無しさん:2009/01/28(水) 10:52:40
>>78
失せろゴミ
84デフォルトの名無しさん:2009/01/28(水) 11:26:45
>>82
x86の32bitはセグメントにいろいろ属性が付けられるから(NXビットを
入れるとreadonlyも出来る)アドレスはいじらない方がよかれ
85デフォルトの名無しさん:2009/01/28(水) 11:47:04
>>84
そういう意味じゃなくてOSからはmmuを介する仮想アドレスしか触れないんじゃないの?
って言う意味での質問だったの
86デフォルトの名無しさん:2009/01/28(水) 11:50:34
x86の16bit CPUに仮想アドレスなど(ry
87デフォルトの名無しさん:2009/01/28(水) 21:56:42
マージソートに関してです.

分割する関数(split)と,併合する関数(merge)は何とか作れたんですが
これらを上手く組み合わせることができないです.

merge関数をソート済みの2つの配列を併合する場面で利用するのはわかるんですが
split関数のどこで呼び出せばよいかがわかりません.

ウェブ上に上手いソースコードはたくさんあるんですが,
理解したいので,手ほどきのほう,よろしくお願いいたします.
8887:2009/01/28(水) 21:59:00
void split(int a[],int sin,int dex){
int mid;
printf("left:%d right:%d\n",sin,dex);

if (sin>=dex){
printf("n[%d]=%d\n",dex,a[dex]);
return;
}

mid=( sin + dex )/2;
split(a,mid+1,dex);
split(a,sin,mid);

}
89デフォルトの名無しさん:2009/01/28(水) 21:59:10
解説サイトとか見ても分からんのか?
分からんなら、どこが分からんか言った方がいいよ
9087:2009/01/28(水) 21:59:43
void merge(int A[],int front_first,int rear_first,int rear_last){
int i,j,k;
for(i=front_first;i<rear_first;i++){
tmp[i]=A[i];
}
i=front_first;
j=rear_first;
k=front_first;
while(i<=rear_last){
if(j==rear_last){
A[i]=tmp[k];
i++;
k++;
}
if(k==rear_first){
A[i]=A[j];
i++;
j++;
}
if(tmp[k]<=A[j]){
A[i]=tmp[k];
i++;
k++;
}else{
A[i]=A[j];
i++;
j++;
}
}
}
9187:2009/01/28(水) 22:10:35
マージソートの原理自体は紙上では理解してます.

上記の,分割までして表示する関数と
ソートされた2つの配列を併合する関数までは自分で作りました.

この2つを上手く組み合わせれば,できるはずなんですが
ちょっとプログラムに起こせなくて,行き詰ってたので
ヒントでもいただけたらと思って,投稿いたしました.
92デフォルトの名無しさん:2009/01/28(水) 22:13:54
そもそも分割自体は特に何もする必要がないと思うよ。
入力の配列を1要素1要素分けて注目すれば、既に分割されているのと同じことになるから。
93デフォルトの名無しさん:2009/01/28(水) 22:23:17
>>91
こんな感じじゃないの?sort()のなかにmarge()と分割が入って再帰する。

sort(配列, 要素数){
 if(要素数=<2){return 2要素をソートした配列}
 分割位置 = 要素数/2;
 sort(配列の前半);
 sort(配列の後半);
 marge(配列の前半, 配列の後半, 結果);
 return 結果;
}
9487:2009/01/28(水) 22:32:58
>>92,93
ありがとうございます.
もう少し考えてみます.
95デフォルトの名無しさん:2009/01/28(水) 22:45:18
typedef FuncPtr(MyClass::*FuncPtr)();
こんなことをするにはどういう手法があるでしょうか?
よろしくお願いします。
96デフォルトの名無しさん:2009/01/28(水) 22:47:21
delegate
97デフォルトの名無しさん:2009/01/28(水) 22:53:00
typedef int(MyClass::*FuncPtr)();
が簡単に出来るのだから
typedef FuncPtr(MyClass::*FuncPtr)();
も何か方法があるのでは?という質問です。
よろしくお願いします。
98デフォルトの名無しさん:2009/01/28(水) 22:57:49
Yコンビネーター
99デフォルトの名無しさん: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
 }
}
100デフォルトの名無しさん:2009/01/28(水) 23:45:49
再帰呼び出しをループに展開したような感じだな
101デフォルトの名無しさん:2009/01/29(木) 19:30:13
マージでソートする5秒前
10287:2009/01/29(木) 23:15:33
merge関数が間違ってました.
そりゃどうあがいても無理ですね.
本末転倒ですみませんでした.
103デフォルトの名無しさん:2009/01/30(金) 02:09:32
http://www.tecnocat.org/c.zip

上のソースのエラーが取れません。
修正していただけませんか?
104デフォルトの名無しさん:2009/01/30(金) 02:15:49
DLできませんが
105デフォルトの名無しさん:2009/01/30(金) 02:21:08
申し訳ありません!
うpしました!
106デフォルトの名無しさん:2009/01/30(金) 02:28:34
calloc

(dt *)calloc

->の前後に空白入れるの初めて見たかも。
107デフォルトの名無しさん:2009/01/30(金) 02:30:05
>>105
宣言は関数のはじめに行う。
とりあえずこれだけでコンパイルは通ったよ。
動かしてないけど。

int main(void) {
struct dt *top;
struct dt *tmp;
struct dt *oldtmp;
struct dt *old1tmp;
108デフォルトの名無しさん:2009/01/30(金) 02:31:59
c++だよ
ソースの内容はいかにもベターCという感じだけど。
なので、宣言の位置が問題なのではなく、暗黙の型変換が問題になる
109デフォルトの名無しさん:2009/01/30(金) 02:33:32
あ、ほんとだ。
Cとしてコンパイルしてた。
110103:2009/01/30(金) 02:52:25
型変換を意識しなければいけませんね

ありがとうございました!
111デフォルトの名無しさん:2009/01/30(金) 02:52:56
このプログラムを実行すると初回の入力値が1〜10でなくてもループを抜けてしまいます
ループを抜けないようにするにはどこを修正したら良いのでしょうか?
関数はポインタを使う形でお願いします

void main(void)
{
int l=0,h=0;
ScanPiecePosition(&l,&h);
}

void ScanPiecePosition(int *l_Scan,int *h_Scan)
{
int l_s,h_s;

do
{
if(*l_Scan != 0) //入力2回目以降のみ判断する
{
printf("入力した値が違います!\n");
}

printf("縦の座標を入力してください\n");
printf("縦(1〜10):"); scanf_s("%d",&l_s);

}while((1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ
}
112デフォルトの名無しさん:2009/01/30(金) 02:55:20
}while((1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ

}while(!(1<=*l_Scan) && (*l_Scan<=10)); //縦の値が1〜10になるまでループ
113デフォルトの名無しさん:2009/01/30(金) 02:56:18
あ。。
}while(!((1<=*l_Scan) && (*l_Scan<=10))); //縦の値が1〜10になるまでループ
114デフォルトの名無しさん:2009/01/30(金) 02:58:54
>>113
正しい値を入力してもループが終わらないのですが…
115デフォルトの名無しさん:2009/01/30(金) 03:04:10
printf("縦(1〜10):"); scanf_s("%d",&l_s);

printf("縦(1〜10):"); scanf_s("%d",l_Scan);
116デフォルトの名無しさん:2009/01/30(金) 03:09:01
>>115
正しく動作するのですが、正しい値を入力するとデバッグエラーが起きてしまいます
117デフォルトの名無しさん:2009/01/30(金) 03:19:26
以下の行をmain関数の前に書く?
void ScanPiecePosition(int *, int *);
118デフォルトの名無しさん:2009/01/30(金) 03:26:09
解決しました
原因はこのループの下に「*l_Scan=l_s;」という文を書いていたからでした
こんな夜分にお騒がせしてすみませんでした
119デフォルトの名無しさん:2009/01/30(金) 03:32:00
そっかぁ。
それを生かすなら、do〜whileでのl_Scanを全部l_sにすればいいよ。
まるまる置換ではなく、
if(*l_Scan != 0) //入力2回目以降のみ判断する

if(l_s != 0) //入力2回目以降のみ判断する
みたいに、型を意識しつつ置き換え。

あと、0が入力されたら何も言わずに再入力になるけど、そこは大丈夫だろうか。
120デフォルトの名無しさん:2009/01/30(金) 03:42:37
無理やりですがこの様にしました

void ScanPiecePosition(int *l_Scan,int *h_Scan)
{
do
{
if(!((1<=*l_Scan) && (*l_Scan<=10))) //入力2回目以降のみ判断する
{
printf("入力した値が違います!\n");
}

printf("縦の座標を入力してください\n");
printf("縦(1〜10):"); scanf_s("%d",l_Scan);

}while(!((1<=*l_Scan) && (*l_Scan<=10))); //0と1を整理する 縦の値が1〜10になるまでループ
}
121デフォルトの名無しさん:2009/01/30(金) 04:26:24
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
122デフォルトの名無しさん:2009/01/30(金) 12:30:34
>>120
何故ポインター渡しなの?
123デフォルトの名無しさん:2009/01/30(金) 19:39:55
>>122
ポインターを使う事が目的なので
124デフォルトの名無しさん:2009/01/30(金) 20:05:19
Microsoft Visual Studio

Microsoft Visual C++ 2008 Express Editionの違いを教えてください
125デフォルトの名無しさん:2009/01/30(金) 20:20:06
>>124
Microsoft Visual Studio ⊂ Microsoft Visual C++ 2008 Express Edition
126デフォルトの名無しさん:2009/01/30(金) 20:21:07
逆じゃん
127デフォルトの名無しさん:2009/01/30(金) 20:39:56
>>124
スタジオにはC++やらBASICやらC#やらが集まってる
128デフォルトの名無しさん:2009/01/30(金) 20:43:31
「Microsoft Visual Studio」より機能が増えたのが「Microsoft Visual C++ 2008 Express Edition」
ってことであってますか?
前者が指定されてる授業で後者使ってても大丈夫ですかね?
129デフォルトの名無しさん:2009/01/30(金) 20:45:14
>>127
ありがとうございます。
>>128のまるっきり逆ですね
130デフォルトの名無しさん:2009/01/30(金) 20:53:59
GUIのプログラムを使ってるなら問題があるかもな (それ以外の違いは多分大丈夫だろう)
MFC使ってたらだけど
131デフォルトの名無しさん:2009/01/31(土) 00:23:36
質問どす
staticを付けたメンバ関数の特徴としては
・メンバにアクセスできない(データ、メソッド)
・スコープ解決演算子でインスタンスが無くても呼べる
これ以外に特徴ありますでしょうか
例えばprivateにはするな、とか実行速度が落ちるとか
132デフォルトの名無しさん:2009/01/31(土) 00:33:02
>>131
>・メンバにアクセスできない(データ、メソッド)
クラスメンバにも?
133デフォルトの名無しさん: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 を渡さなくて良い分実行速度は僅かに速い。
134デフォルトの名無しさん:2009/01/31(土) 00:39:17
もちろん、static メンバ関数にもアクセス可能だぜ
135デフォルトの名無しさん:2009/01/31(土) 00:41:40
using namespace A; だったな
136デフォルトの名無しさん:2009/01/31(土) 00:57:14
>>132
自分のメンバどす

>>133
サンクス!
まさに聞きたかった答え!!ありがとう!
・普通の関数ポインタに代入できる
・staticメンバにはアクセスできる
・thisを渡さない分高速 ですね
137デフォルトの名無しさん:2009/01/31(土) 10:49:40
>>136
インスタンスを指定すればprivateなメンバにもアクセスできるよ。
ptr->aみたいに
138デフォルトの名無しさん:2009/01/31(土) 13:15:50
//プロトタイプ宣言
void bbb();
void ccc();

void aaa(){
  while(1){
   bbb();
  }
 }

void bbb(){
  int a;
  cin >> a;
  switch(a){
  case 1:
   ccc();
  break;

  case 2:
  }
 }

void ccc(){
  break;
  }

数の入力を求め、それが1なら関数cccにとび、関数cccを実行しwhile文を終了する、
という具合にしたいのですが、コンパイルするとbreakが正しくありませんとでて困ります。
goto文をつかうしかないのですかね?
139デフォルトの名無しさん:2009/01/31(土) 13:24:27
void ccc(){
  return;
  }
か?
140デフォルトの名無しさん:2009/01/31(土) 13:28:09
>>139
コンパイルは出来るのですが、while文が終了されません・・・・
141デフォルトの名無しさん:2009/01/31(土) 13:30:10
void aaa(){
  while(bbb());
 }

int bbb(){
  int a;
  cin >> a;
  switch(a){
  case 1:
   return 0;
  case 2:
  }
 return 1;
 }
142デフォルトの名無しさん:2009/01/31(土) 13:33:09
>>138
breakが全く分かってないな


ちなみにgotoで c()の中から
aaa() のwhile直後に飛ぼうとするのは絶対にやってはいけない
143138:2009/01/31(土) 13:44:06
>>141
>>case 1:
>>return 0;

すいませんが、直接case 1:の処理としてreturnするのではなく、
あくまで関数cccの処理としてwhileを終了したいんですが・・・
144デフォルトの名無しさん:2009/01/31(土) 13:49:40
int flag;
void aaa(){
  flag = 1;
  while(flag){
   bbb();
  }
 }

void bbb(){
  int a;
  cin >> a;
  switch(a){
  case 1:
   ccc();
  break;

  case 2:
  }
 }

void ccc(){
  flag=0;
  }
145デフォルトの名無しさん:2009/01/31(土) 13:52:06
そうだsetjmp使おう!
146デフォルトの名無しさん:2009/01/31(土) 13:58:03
returnやbreakの効力が及ぶ範囲を全く理解していないんだな
147138:2009/01/31(土) 14:03:46
>>144
そういう手法がありましたか。
解決です。どうもありがとうございました
148デフォルトの名無しさん:2009/01/31(土) 14:15:33
>>147
「設計が悪い」しか答えはない
他の方法を考える
149デフォルトの名無しさん:2009/01/31(土) 15:22:46
メッセージループの実装だったんだろうか
150デフォルトの名無しさん:2009/01/31(土) 20:01:52
Microsoft SDKsは6.1いれたら5と6a消して良いですか?
151デフォルトの名無しさん:2009/01/31(土) 23:56:52
どうぞ
152デフォルトの名無しさん:2009/02/01(日) 00:39:36
レスありがとうごさいます
NETだと消していけないのでまよってました 
153デフォルトの名無しさん:2009/02/01(日) 06:17:18
時々ヘッダを付け忘れます。
154デフォルトの名無しさん:2009/02/01(日) 07:33:24
int で定義された変数に16進を入れると自動的に変換されるの?
155デフォルトの名無しさん:2009/02/01(日) 07:44:22
数値という概念に進数という属性は存在し無い
数値を表記したいと思った時に初めて、進数という概念が現れる
156デフォルトの名無しさん:2009/02/01(日) 12:55:13
そうだな。進数、進法でググるといいかも。
157デフォルトの名無しさん:2009/02/01(日) 17:16:35
概念概念うるせーっつーのw
158デフォルトの名無しさん:2009/02/01(日) 17:18:20
概念が無いな
159デフォルトの名無しさん:2009/02/01(日) 20:26:29
MSG msg;
GetMessage(&msg, NULL, 0, 0);

switch (msg){
case WM_〜:
実行内容;
}

みたいなウィンドウメッセージのスイッチ文ってどうやったらちゃんとできるんですか?
「switch 文の選択式は整数型でなければならない」
というメッセージで弾かれまくりです。
160デフォルトの名無しさん:2009/02/01(日) 20:27:09
msg.message
161デフォルトの名無しさん:2009/02/01(日) 23:24:06
>>160
ググったりはしてみたが分からないorz
162デフォルトの名無しさん:2009/02/02(月) 00:18:31
>159
MSG っていうのは構造体で中に色々入っている。
今回はメッセージ番号を使って振り分けたいのでそのうちの message というメンバを使うため、
switch(msg.message) { // 以下略
となる。
163デフォルトの名無しさん:2009/02/02(月) 00:23:10
一体どんな本やサイトを参考にすれば
ここで詰まるのだろうか。
こういう基本的な所は、もろ「こう書きますよ」って例が書いてあると思うのだが。
164デフォルトの名無しさん:2009/02/02(月) 00:27:41
その前に型と宣言の意味が分かってないような予感が・・・
165デフォルトの名無しさん:2009/02/02(月) 00:44:47
いや、単にswitch case文の使い方がわかっていないだけじゃないだろうか。
QBのselect case文は柔軟だからなー。QBって懐かしいでしょ?むふ♥
166デフォルトの名無しさん:2009/02/02(月) 00:54:40
たしかにオブジェクト指向だったらそうなってほしいよな
167デフォルトの名無しさん:2009/02/02(月) 01:07:17
基底クラスのデストラクタから、派生クラスの仮想関数を呼びたい。
class A { virtual func()=0; };
class B : public
168デフォルトの名無しさん:2009/02/02(月) 01:10:18
基底クラスのデストラクタから、派生クラスの仮想関数を呼びたかった。
class A { virtual func(){} ~A(){ func(); } };
class B : public A { func(){} };
どうして出来ない仕様なのか。
169デフォルトの名無しさん:2009/02/02(月) 01:56:00
派生クラスの実体(インスタンス)の寿命は、
派生クラス自身のコンストラクタで始まり、派生クラス自身のデストラクタで終わるというモデルのため。

基底クラスのデストラクタが呼ばれるとき、そこにあるのは基底クラス部分オブジェクト。
派生クラスのインスタンスがない以上、派生クラスの関数を呼べるわけがないという理屈。
170デフォルトの名無しさん:2009/02/02(月) 08:15:30
>>166
それならswitch文使うなよ
171デフォルトの名無しさん:2009/02/02(月) 11:16:23
>>162
ありがとうございます。
意味が分かってきました。
とりあえずコンパイルは通ったので、色々試してみます。
172デフォルトの名無しさん:2009/02/02(月) 16:11:24
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPSTR lpCmdLine ,int nCmdShow ) {
 MSG msg;
 GetMessage( &msg, NULL, 0, 0 );
 switch(msg.message){
   case WM_@
    <メッセージがWM_@だったときの処理>
   case WM_A:
    <メッセージがWM_Aだったときの処理>
 }
<その他の処理>
}

というプログラムを組んでみたのですが、何のメッセージも受け取ることができませんでした。
行ごとに「ShellExecute(NULL,"edit","a.txt",NULL,NULL,SW_SHOWNORMAL);」を入れて観察したところ、
やはり、GetMessage( &msg, NULL, 0, 0 );の行で待機状態になっているようです。
なんらかのウィンドウメッセージが送られていて次の行に進んでもおかしくないような気がするのですが、一体何が問題なのでしょう?
173デフォルトの名無しさん:2009/02/02(月) 17:31:07
ウィンドウ作ってないからでしょ。
174デフォルトの名無しさん:2009/02/02(月) 18:17:19
ありがとうございます。順序だてて調べてみます。
printfが使えないことに混乱したり、何かごちゃごちゃになっているようです。
175デフォルトの名無しさん:2009/02/02(月) 18:32:49
グローバル変数を動的に確保することってできますか
176デフォルトの名無しさん:2009/02/02(月) 18:37:43
グローバル変数でポインタつくっとけば。
177デフォルトの名無しさん:2009/02/02(月) 18:43:04
/*グローバル変数*/
int *abc;

sub(){
/*ここでabc配列を弄りたい*/
}

main(){
abc = (int *)calloc(10, sizeof(int));
sub();
}

こういうことってできますか?
178デフォルトの名無しさん:2009/02/02(月) 18:50:37
できるよ。
179デフォルトの名無しさん:2009/02/02(月) 18:54:29
んー、じゃあソースコードがわるいのか・・・
180デフォルトの名無しさん: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);
}

セグメンテーション違反が倒せません
181デフォルトの名無しさん:2009/02/02(月) 19:10:47
>>180
おまえのPCは64GBもメモリ積んでるのか。
182デフォルトの名無しさん:2009/02/02(月) 19:11:24
intだから、256GB?
183デフォルトの名無しさん:2009/02/02(月) 19:12:57
このような配列をCで実現するにはどんな方法が考えられますか
184デフォルトの名無しさん:2009/02/02(月) 19:14:55
256G
185デフォルトの名無しさん:2009/02/02(月) 19:16:34
メモリ使い過ぎワロタw
186デフォルトの名無しさん:2009/02/02(月) 19:20:24
メモリマップドファイル使え。 一つでは間に合わないと思うので複数同時使用。・
187デフォルトの名無しさん:2009/02/02(月) 19:22:08
うちの環境では、ファイルにマップしても4G程度しか作れなかった。
64個ほど同時に開いて[]をオーバーロードする。
188デフォルトの名無しさん:2009/02/02(月) 19:29:38
調べてみます、レスありがd
189デフォルトの名無しさん:2009/02/02(月) 19:41:02
つーか、そんな広大な領域を何に使おうとしてるのか気になる
190デフォルトの名無しさん:2009/02/02(月) 19:47:26
世界征服
191デフォルトの名無しさん: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
192デフォルトの名無しさん:2009/02/02(月) 19:51:48
実現できましたって・・・いい計算機だな。
193デフォルトの名無しさん:2009/02/02(月) 19:55:25
>>187
アドレス32bitなら、当然といえましょう。
194デフォルトの名無しさん:2009/02/02(月) 20:12:18
mainの再起って意味ある?
サンプル
>int main(void){
>--->static KEY = 0;
>--->switch(KEY++){
>--->--->case (0):
>--->---> --->puts("KEY 0ぜ");
>--->---> --->KEY = main();
>--->---> --->return main();
>--->---> case (1):
>--->---> --->puts("KEY 1ぜ");
>--->---> --->return (-1);
>--->---> case (-1):
>--->---> --->puts("これでいいのぜ");
>--->---> --->return KEY;
>--->}
>}
195デフォルトの名無しさん:2009/02/02(月) 20:18:43
>>191
ちゃんとmalloc()の戻り値がNULLかどうかチェックしてください。
NULL+262143*sizeof(int) がたまたまアクセスできる場所だっただけに
見える。
196デフォルトの名無しさん:2009/02/02(月) 20:25:12
>>194
なんで関数作らないんだ?
197デフォルトの名無しさん:2009/02/02(月) 20:27:19
>>191
実験か。コンパイラはなんですか?
198デフォルトの名無しさん:2009/02/02(月) 20:34:09
>>197
gcc4.1.2?
199デフォルトの名無しさん:2009/02/02(月) 20:47:36
mallocの戻り値をチェックすることは無意味だよ派がいると思った。
mallocの戻り値がNULLじゃないからといってそこが使用可能な領域かどうかが分からないから、だったかな。
200デフォルトの名無しさん:2009/02/02(月) 20:49:55
>>199
意味分からん。
NULLだったらダメなのには変わらないだろ。
201デフォルトの名無しさん:2009/02/02(月) 20:59:37
>>199
そんな派は見たことねー。
NULLのまま突っ走ったら予想外なところで落ちたりたまたま落ちずに誤
動作したりで良いことないので、malloc()の戻り値はNULLチェックする
以外あり得ない。

C++の例外はキャッチしても無意味派と勘違いしてない?

202デフォルトの名無しさん:2009/02/02(月) 21:01:07
>>199
違うよ。
203デフォルトの名無しさん:2009/02/02(月) 21:05:12
mallocの戻り値をチェックするならprintfの戻り値もチェックしないとな。
204デフォルトの名無しさん:2009/02/02(月) 21:08:03
Linuxのオーバーコミットと混同してるのかなぁ?
205デフォルトの名無しさん:2009/02/02(月) 21:08:50
(スコア:-1, フレームのもと)
206デフォルトの名無しさん:2009/02/02(月) 21:17:32
/.erキモ
207199:2009/02/02(月) 21:28:25
>>204
確かmallocのmanに、、、と思って見てみたらそれだったようでした。
お騒がせしました。

あと、>>180
abc = (int *)calloc(68719476736, sizeof(int));
ですが、size_tこえてない?
208194:2009/02/02(月) 21:31:23
>>196
mainの再起呼出を問うてるので、明示的に意味の無いプログラムを書いた。
プロセス途中でmainを使うメリット無いなら、それを回答欲しかった。
今、initとかがmainに置いてあると仮定すると
>void Othello(void){
>--->int i;
>--->for(i=0;i>=0;i++){
>--->--->/* turn(&i);など */
>--->}
>--->puts("リトライしますか? Y/N");
>--->if(getch() == 'y'){ main(); exit(1); } //scanfでも何でも
>}
>int main(void){
>--->static KEY = 0;
>--->//init();など
>--->Othello();
>--->return 0;
>}
こういう使い方は・・・・Othelloとかを再起する方が賢いだろうし
再起しないで、繰り返し文の方がいいのだろうね・・・・(C++じゃ使えないそうだし)
209デフォルトの名無しさん:2009/02/02(月) 21:33:30
ゲームが進めば進むほどスタックに積んでいくということ?
210208=194:2009/02/02(月) 21:37:40
>>209
全然洗練して無い、発想だけど、そうゆう事。
ゲームが進むと言っても、main呼び出すのは1ゲーム終わる度だし、回数はそんなに多くないと推測した上で。

簡易マルチタスクとか、なんかスゲー利用法とかないんかな?
211デフォルトの名無しさん:2009/02/02(月) 21:41:44
IOCCCでは常套手段ですな。
212デフォルトの名無しさん:2009/02/02(月) 21:51:45
別にmain()で再帰しても何も問題ないよ。
ただ、引数に制約があるから使いやすいとは思わないけど。
213デフォルトの名無しさん:2009/02/02(月) 22:02:01
C++って、今年、大幅に仕様が変わってしまうのだろ?
今、C++の勉強を必死にやって、意味ある?

新しいC++の仕様って、Cの最新の仕様みたいに
仕様はあるけど誰も使わない、みたいな感じになったりするのかな
214デフォルトの名無しさん:2009/02/02(月) 22:07:46
これは、問題ありますか?

wchar_t pop[]=L"漢字";
if(pop[0]==L'漢') 結果;
if(pop[1]==L'字') 結果;

あと、char 〜 wchar_Tに変換って難しいですか?
215デフォルトの名無しさん:2009/02/02(月) 22:09:13
C99よりは、待ち望まれていると思う。
C89で十分と言う人は多いだろうが、C++03で十分と言う人は少ないはず。
216デフォルトの名無しさん:2009/02/02(月) 22:09:29
>>214
変換はAPコールI一発でできるよ。
217デフォルトの名無しさん:2009/02/02(月) 22:11:21
>>214
それは9割9分問題ない。
charとwchar_tの変換は、文字列全体を一括してやるならそう面倒な話ではない。
1文字ずつとか数バイトずつとかだと死ねる。
218デフォルトの名無しさん:2009/02/02(月) 22:18:47
コンパイルの際、どうやら作業領域として環境変数で指定したTEMPフォルダが使われてるみたいなんですが、
もし長大なプログラムをコンパイルする際にこの環境変数で指定した領域が満タンになったら、どんなことになりますか?
219デフォルトの名無しさん:2009/02/02(月) 22:22:40
>>218
エラーでとまるんじゃね?
ただ落ちるだけかもしれんけど。
220デフォルトの名無しさん:2009/02/02(月) 22:25:48
VC++だとエラーで止まる。
そんなに大きくないRAMディスクをTEMPに割り当てているので稀に遭遇する。
221デフォルトの名無しさん:2009/02/02(月) 22:36:26
>194
C++ だと main の再帰呼び出しは規格で禁止されている。

>213
既に部分的に実装が始まっているので誰も使わないってことはないかと。
フルスペックで使えるまでには時間かかるかもしれんが。

変態ライブラリを書くような人間にとっては C++0x は大幅変更だろうが、
利用者側としてはいくつか便利な機能が追加されたくらいなもんだと思う。
少なくとも、勉強したことのほとんどはそのまま役に立つだろう。
222デフォルトの名無しさん:2009/02/02(月) 22:41:37
214です >>216 >>217さん サンクスです。(^ω^)
223デフォルトの名無しさん:2009/02/02(月) 22:46:08
char x[100];
で、文字配列を宣言
y と z をint型の変数として、
yに文字列の長さが代入
zに文字列中の数字の数が代入
されるようにするにはどうすればいいんでしょう?
224デフォルトの名無しさん:2009/02/02(月) 22:46:51
while文をif文とdo-while文を使って表現せよ

という問題なんですが…ifも使わなきゃいけないというところがわかりません
どうすればよいのですか??
225デフォルトの名無しさん:2009/02/02(月) 22:49:28
do-while と while の差が分かれば
あとは簡単だろう
226デフォルトの名無しさん:2009/02/02(月) 22:50:02
>>224
なんでこうばかばかしい問題だすんだろ。
227デフォルトの名無しさん:2009/02/02(月) 22:55:26
whileは条件しだいでは作業が1回も実行されない場合があるんですよね。

while(条件){式}
はどのように書き換えたらよいのですか?
初心者なんでわからなくて・・・
228デフォルトの名無しさん:2009/02/02(月) 23:01:01
>>227
if(cnd){
do{
...
}while(cnd);
}
みたいなこと?
229デフォルトの名無しさん:2009/02/02(月) 23:01:12
>whileは条件しだいでは作業が1回も実行されない場合があるんですよね。
そこまで分かってるなら、それを if で実現してやればいいだけだろう
230デフォルトの名無しさん:2009/02/02(月) 23:01:34
>>228
お前なあ・・・
231デフォルトの名無しさん:2009/02/02(月) 23:02:39
>>228 じゃだめなの?
232デフォルトの名無しさん:2009/02/02(月) 23:04:30
宿題スレ以外で答えをダイレクトに教えちゃダメだろ・・・
233デフォルトの名無しさん:2009/02/02(月) 23:04:31
do{
if(cnd){
...
}
}while(cnd);
234デフォルトの名無しさん:2009/02/02(月) 23:04:57
>>231
だめじゃないけど、空気読んでよw

>>227
判断材料はそろってるんだから、応用力の問題でしょ。
初心者かどうかはあまり関係ない。
235デフォルトの名無しさん:2009/02/02(月) 23:06:02
>>232
そういうことか。
236デフォルトの名無しさん:2009/02/02(月) 23:06:05
>>223
y = strlen(x);
z = atoi(x);
237デフォルトの名無しさん:2009/02/02(月) 23:06:48
>>232
そんなルール聞いたことねえよ
238デフォルトの名無しさん:2009/02/02(月) 23:11:28
mixiの宿題コミュとか、プロフィールに学校書いてるやつでも平気で質問してるもんな。
あれって、チクるやついないのだろうか。
239デフォルトの名無しさん:2009/02/02(月) 23:14:38
>>238
mixiはともかく、2chくらいチェックしてるだろ。
その旨、課題に書いてある学校もあるし。
240デフォルトの名無しさん:2009/02/02(月) 23:16:05
定期的に全大学の教務課に宿題スレや宿題コミュの注意情報を流しています
241デフォルトの名無しさん:2009/02/02(月) 23:17:18
>>236
おお、こんなのあったんですね。ありがとうございます。
242デフォルトの名無しさん:2009/02/02(月) 23:17:58
どうやらこのスレには答えられる人がいないようですね。
仕方ないので新しくスレたてようと思います!
243デフォルトの名無しさん:2009/02/02(月) 23:22:09
int test[0x7777]

これってどういう意味になりますか?
244デフォルトの名無しさん:2009/02/02(月) 23:23:41
int test[アドレス]
245デフォルトの名無しさん:2009/02/02(月) 23:24:22
配列の要素数だろwww
246デフォルトの名無しさん:2009/02/02(月) 23:42:19
>>243
define SIZE (7*16*16*16+7*16*16*+7*16+7)
int test[SIZE]
とか?

>>221
ノ 208
247デフォルトの名無しさん:2009/02/02(月) 23:48:13
0x7777 は3万ちょっとか
>>180見た後だと何の違和感も感じないな
248180:2009/02/02(月) 23:55:11
すいませんね!!
249デフォルトの名無しさん:2009/02/02(月) 23:55:34
>>219>>220
ありがとうございます。
私も>>220さんと同様にRamDisk(約2.7GB)をTempフォルダにしており、
フリーズしたりしないのかと思って聞いてみた次第です。

さっきまでOSが定めるTempフォルダを使ってると気付いてなかったのですが、
「Z:\Temp Files」のフォルダ名にスペースが入ってたのがまずかったらしく、
コンパイル時にZ:\Tempは存在しない的なメッセージが出て気付きました。
Temp領域が狭いと意外なプログラムで問題が出る可能性がありそうですね。
250デフォルトの名無しさん:2009/02/03(火) 00:06:45
>>249
インターネット一時ファイル置き場も小さいと時々問題が。
251デフォルトの名無しさん:2009/02/03(火) 00:08:54
>>250
何が起こりますか?
こちらは250MBしか設定してないけど今のところ大丈夫です。
252デフォルトの名無しさん:2009/02/03(火) 00:24:41
Cで行列演算をさせるために二次元配列を使って表現したのですが、
処理内容を別関数で実装して配列を引数として与えたところ、一行目の要素以外が0.0となってしまいました。
二次元配列A[][]を関数H()に引き渡す方法は
main{
...
H(A,y,m,n,i);
...
}
void H(double B[][n],double b[],int l,int w,int o){
...
}
で当たっているでしょうか?
nはグローバルで定義しています。
エラーは出ていないので値の引き渡し自体は問題ないと思うのですが…
253デフォルトの名無しさん:2009/02/03(火) 00:25:20
保存するじゃなくて、実行する?開く?を選んだときに問題があるんじゃね
遭遇したことがないからしらんけど
254デフォルトの名無しさん:2009/02/03(火) 00:31:12
>>252
nは#defineで定義してるの?
255デフォルトの名無しさん:2009/02/03(火) 00:33:49
グローバルで指定した変数にargvから与えています。
汎用性を持たせることが用件にあったので、行列のサイズはある程度可変にしたかったんです。
256デフォルトの名無しさん:2009/02/03(火) 00:36:12
コンパイルできないんじゃないの?
257デフォルトの名無しさん:2009/02/03(火) 00:38:21
普通に出来ましたが…
グローバル変数は値をあげてやらないと定義できないのでしょうか?
258220:2009/02/03(火) 00:41:10
>>249
2.7GBもあればまず大丈夫だろう。
俺んとこのRAMドライブ、96MBしか取っていないよ。

インターネット一時ファイルもそこだけど、
問題になりそうなときは別のダウンローダ使う。
スレ違いすまん。
259デフォルトの名無しさん:2009/02/03(火) 00:44:14
>>257
本当だ。コンパイルできな。

引数の配列のサイズ指定に変数使っても、エラーにならないんだな。
260デフォルトの名無しさん:2009/02/03(火) 00:49:23
>>259
コンパイラが無視してるんじゃないの?
c言語で、配列と言う考え方は軽んじられて、ポインタ格下げが主だし。
グローバル宣言や関数の引数でも実質意味無い部分は省略だし。
参考になるかな http://www.kouno.jp/home/c_faq/c6.html#0
261デフォルトの名無しさん:2009/02/03(火) 00:51:28
>>260
VC起動するのがめんどうだったから、codepadでコンパイルしたけど、
C99なのかなって気もする。
262デフォルトの名無しさん:2009/02/03(火) 00:51:46
配列のサイズ指定の方でしたか
サイズが可変ということでどうしても変数を使って指定せざるをえなかったので…
しかし、なぜか配列内の値がかわってしまっているんです
実行の前後で出力してみたので関数呼び出しの引数引き渡しが原因だとにらんでいるのですが…
263デフォルトの名無しさん:2009/02/03(火) 00:55:20
>>260
このページは調べている時に見たんですが、その時は関数への引き渡しでエラーを吐いていたときだったので
エラーが無くなった時点で解決した物としてスルーしていました。
もう一度熟読してみます。
264デフォルトの名無しさん:2009/02/03(火) 01:04:41
>>262
少なくとも、コンパイルできたって事は、何らかの方法で&A[0][0]は渡されているはず。
行列サイズに、変数が渡されたら、例えば初期化値が指定されてたり、
デフォルトのゼロ初期化で関数に通達されてれば、何が起こってもおかしくないのではないか。

>>263
c初級者(not初心者)〜 は読んで損ない、かなり現状を忠実に語ってる文献だと思う
265デフォルトの名無しさん:2009/02/03(火) 01:07:55
>>264
ようするに、引き渡しには問題はなく、むしろ関数Hの仮引数のサイズ指定がおかしくなっている可能性があるということであってますか?
そちらもにらんで改善策を考えたいと思います。
266デフォルトの名無しさん:2009/02/03(火) 01:10:54
>>259
C99だよ。可変長配列は自動変数だけでなく引数も対象。
http://seclan.dll.jp/c99d/c99d04.htm#dt19990719

>>252
このまま可変長配列の引数を使うなら、引数の順を並び替えて、
void H(double b[],int l,int w,int o,double B[][w])にしたほうが
グローバル変数使わずに済むのでいいと思う。

引数の順を変えたくなければ、K&Rスタイルで関数定義を書かないといけない。
void F(double B[][*], double b[], int l, int w, int o); //プロトタイプ宣言 アスタリスクもC99

void F(B, b, l, w, o) //関数定義
double b[];
int l;
int w;
int o;
double B[][w];
{
267デフォルトの名無しさん:2009/02/03(火) 01:14:16
解決しました!
やっぱりサイズ指定に変数を使っちゃうとエラーこそでないものの、正しく指定出来ないようです。
今回は配列のサイズ上限として50を指定していたので仮引数のサイズも50として、
実際に数値が入っている部分だけでなく全体を引き渡すようにしたら上手くいきました!

アドバイスをくれた方々、本当にありがとうございました!
またさんざん調べて解らないことがあったら訊きにきますw
268デフォルトの名無しさん:2009/02/03(火) 01:16:02
>>266
引数の順番を変えるだけで上手くいくのですか!
そっちもためしてみます!
269デフォルトの名無しさん:2009/02/03(火) 01:25:29
従来の方法なら、
A 先頭ポインタだけ指定して、関数内でポインタ処理する
B 2次元配列でなく、ポインタのポインタで渡せるようにする
270デフォルトの名無しさん:2009/02/03(火) 01:30:33
関数に直接配列は渡せないから、先頭要素のポインタを渡して参照するってことですよね。
関数に渡した時点で配列ではなくポインタになってしまうのなら始めからポインタ使えってことなんでしょうか?
271デフォルトの名無しさん:2009/02/03(火) 03:04:39
>>251
遅レスになったが、250MBを超えるファイルをダウンロードできないと思う
272デフォルトの名無しさん:2009/02/03(火) 06:02:32
そんなヘボな環境あるのけ?おれの環境ではでけたよ。
もしかしてWin?
273デフォルトの名無しさん:2009/02/03(火) 08:04:03
>>232
そんなルールない
勝手に作るな
274デフォルトの名無しさん:2009/02/03(火) 13:11:19
>>270
配列とポインタには相互に互換があると習いませんでした?

int array[10];
printf("%d %d\n", array[0], *array);
printf("%d %d\n", array[1], *(array+1));

逆も然り。

int buf[10];
int *array = buf;
printf("%d %d\n", array[0], *array);
printf("%d %d\n", array[1], *(array+1));

>>272
WinっていうかIEの仕様。
275デフォルトの名無しさん:2009/02/03(火) 13:29:25
>>274
>配列とポインタには相互に互換があると習いませんでした?
ネタか?ただ、同じくアドレス返すだけだわな。
int ATAI(int& i , int n) { return *(&i +n); }
この関数も行列と互換あるのか。初めて知ったわ。

因みに、2次元配列って知ってる? sizeofって知ってる?
276274:2009/02/03(火) 13:38:35
ごめん、流れを把握してなかったw スルーしてください。
277274:2009/02/03(火) 13:43:13
ちなみにintのサイズを考慮してなかったのは、俺がボケてただけですw
278デフォルトの名無しさん:2009/02/03(火) 16:52:05
>>271
いいや、一時ファイルの設定量を超えても、ディスクに空きがある限り大丈夫。
そうなったらたしか、ダウンロード終了後即座に削除されるはず。
279デフォルトの名無しさん:2009/02/03(火) 17:40:46
もうちょっとゆるいタイミングじゃなかったか?削除
280デフォルトの名無しさん:2009/02/03(火) 18:12:46
281デフォルトの名無しさん:2009/02/03(火) 18:16:11
>>278
話の流れで250MBのRAMディスクを想定してレスをしたよ。
282デフォルトの名無しさん:2009/02/03(火) 19:36:06
>>224その逆は良く使う
do-while嫌いだからif whileで書くことは良くある。俺は
283デフォルトの名無しさん:2009/02/03(火) 19:40:47
>>282
while(1){
...
if(!cnd)break;
...
}
条件の後にも処理が入れられるけど、どうかな・・・
284デフォルトの名無しさん:2009/02/03(火) 19:41:12
あー、たまにいるね、そういう人。
i=0;
while (i<10)
{
〜〜
i++;
}
とかみたいなね。
285デフォルトの名無しさん:2009/02/03(火) 19:42:13
if ( ) do {

} while ( );

じゃないの?
286デフォルトの名無しさん: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);
}
287デフォルトの名無しさん:2009/02/03(火) 19:45:46
全部forでいい。
288デフォルトの名無しさん:2009/02/03(火) 19:46:14
>>286
64ビットなコンピュータ使え。
そして載せられるだけメモリを載せろ。
289デフォルトの名無しさん:2009/02/03(火) 19:47:27
それが無理なら、自分のコンピュータの搭載しているメモリの量と
そのプログラムがいったい何バイト確保しようとしてるか、電卓でにらめっこすることだな。
290デフォルトの名無しさん:2009/02/03(火) 20:13:46
>>286
そんなに非常識に超巨大な配列で何がしたいの
気になるので教えてくれ
291デフォルトの名無しさん:2009/02/03(火) 20:14:44
292290:2009/02/03(火) 20:17:39
>>191
ただの実験かよ
つまんね
293デフォルトの名無しさん:2009/02/03(火) 20:21:03
>>286
for(i=0; i<262144; i++)
{
abc[i] = (int *)calloc(262144, sizeof(int));
if (abc[i] == NULL)
{
printf("%d個目でメモリなくなりました\n", i);
return 1;
}
}
294デフォルトの名無しさん:2009/02/03(火) 20:36:19
>>293
帰ってこないですねぇ・・・・
295デフォルトの名無しさん:2009/02/03(火) 20:50:50
そんな巨大配列より、超絶深度のポインタでええんでない?
メモリ領域をリニアに取るんだからメモリの空き容量じゃなくて、メモリの空き方が元凶だと思う。
int a[10][10][10][10][10]; の配列宣言や、 int *****a; からメモリ確保して
呼び出し関数で、擬似的に連結するなら、メモリの空き容量でかたがつくでしょ?
296デフォルトの名無しさん:2009/02/03(火) 20:55:50
3次元にしてみます
297295:2009/02/03(火) 21:07:39
訂正 : 配列宣言や → 配列宣言のように
int a[5][5]; の時、(*(a+6) == a[1][0])が常に真なのは絶対保障されてる?
普通に考えると、ただ3次元の配列にしても、1次元と大差なさそうだが。
298295:2009/02/03(火) 21:09:10
申し訳ない連続ミス : *(a+6) → *(a+5)
299デフォルトの名無しさん:2009/02/03(火) 21:16:42
intの配列で宣言するのと
intのポインタ配列で宣言するのと
intのポインタ配列へのポインタ配列(擬似2次元)では
まったく同じということですか?
300デフォルトの名無しさん:2009/02/03(火) 22:03:39
>>299
値を入れる入れ物の数は全部同じ。2次元配列char a[100][1024]を擬似的に扱うなら
1行目は全て100*1024バイト直線的にとって、aに1000個ずつ飛ばして値を読むように教える。
2行目は100個のポインタを定義したあと、1024バイトの領域を100回別に取って、それぞれのポインタに先頭アドレスを渡す。
3行目は、2のような100個のポインタが1列になってる状態の先頭アドレスをポインタのポインタが持つようにする。
(連続的に取るメモリの最大幅 , 入れ物(変数)の数) = 1行目(100*1024,100*1024) , 2行目(1024,100*1024+100) , 3行目(1024,100*1024+100+1)

問題は前者。a[100][100][10]なら、10個ずつ100×100回確保だから動的確保なら確保しやすいんじゃないかと。

厳密な説明じゃないけど。でも、昔4次元配列(50,50,3,3くらい?)を
ポインタで1次元と思って扱ってたら、データの最後の方上手くいかなかったし、
メモリのとり方も単純ではないと思う。
ポインタの概念でアセンブリ言語より融通効くってのは、1次元的なものはあんま関係ないよね?
301デフォルトの名無しさん:2009/02/03(火) 22:18:21
>>294
スワップアウトでもしてんじゃないの?
302デフォルトの名無しさん:2009/02/03(火) 23:20:23
>>301
彼なら今、256GBのメモリを積んだシステムを構築中だよ。
303デフォルトの名無しさん:2009/02/03(火) 23:22:55
>>301
俺の知り合いを思い出したw
「おせぇおせぇよ!フリーズしてんじゃないの?」

・・・・HDDのアクセスランプを見ていない彼。
304デフォルトの名無しさん:2009/02/04(水) 00:15:03
すみません、再度まだよく理解できないのですが
int test[0x7777]

これは、testの変数のアドレスを0x7777とする意味なのでしょうか?
305デフォルトの名無しさん:2009/02/04(水) 00:18:31
>>304
配列は分かる?
306デフォルトの名無しさん:2009/02/04(水) 00:26:49
>>305
はい。では配列にアドレス指定をする場合はどうすればよいのでしょうか?
307デフォルトの名無しさん:2009/02/04(水) 00:30:54
>>306
まずその質問の意味がよく分からん。
あるメモリ領域を配列として扱いたいなら、ポインタを使えばいい話。
308デフォルトの名無しさん:2009/02/04(水) 00:32:57
>>306
>>304 は配列のサイズを16進で書いてるだけで、アドレスとは関係ないよ。
309デフォルトの名無しさん:2009/02/04(水) 00:33:38
>>304
0x7777ってのはアドレスじゃないぞ
単なる16進法で書かれただけの数だ
ここでは配列の要素数を表す
310デフォルトの名無しさん:2009/02/04(水) 00:34:56
アドレスも数の一種だから16進で表すことはあるけど
16進の数だからってアドレスだとは限らない
311デフォルトの名無しさん:2009/02/04(水) 01:04:33
ここの人たちってやさしいよな。
いやされるぜ
312デフォルトの名無しさん:2009/02/04(水) 01:57:57
printf("iのアドレス16進%x,10進%d\n",&i,&i); を実行すれば同じ整数である事は分かるだろう。
配列名もアドレスになるが、配列名はポインタと違って変更できない。
因みに、0x0010 = 0010(16) = 16(10) = 普通の16 が理解できるだろうか?括弧は何進数かを表す数学的表記。
313デフォルトの名無しさん:2009/02/04(水) 06:53:43
>>286
先ずは必要な記憶容量と搭載メモリ容量とOSを教えてくれ。
314デフォルトの名無しさん:2009/02/04(水) 20:02:28
以下のようなクイックソートのプログラムを
INT版、FLOAT版で作ろうと思うのですが、どのようにオーバーロードすれば
コードが短くすみますか?

void QuickSort(int x[], const int nSize, int nLeftIndex, int nRightIndex )
void QuickSort(float x[], const int nSize, int nLeftIndex, int nRightIndex )

INT型のポインタをFLOAT型に型変換してFLOAT版の関数を呼び出すように設計したいのですが・・・
315デフォルトの名無しさん:2009/02/04(水) 20:16:04
> INT型のポインタをFLOAT型に型変換してFLOAT版の関数を呼び出すように
intとfloatではデータの形式が違うから、それは無理。
テンプレート使え。
316デフォルトの名無しさん:2009/02/04(水) 20:16:05
C標準のqsort関数みればよいよ。
void 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
317デフォルトの名無しさん:2009/02/04(水) 20:50:48
>>315-316 Thanks
318デフォルトの名無しさん:2009/02/04(水) 21:29:48
2バイトの文字が入っている配列の1要素を4バイトにキャストしたいとおもいます。

このとき、2バイトで0xAABBをキャストしてAABBAABBとキャストすることは可能でしょうか?

キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
319デフォルトの名無しさん:2009/02/04(水) 21:32:05
>2バイトで0xAABBをキャストしてAABBAABBとキャストすることは可能でしょうか?
キャストでは無理
>キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
うん
320デフォルトの名無しさん:2009/02/04(水) 21:33:49
>キャストしたら自動的に0x0000AABBと、0000と2バイトが先頭に付加してしまうものなのでしょうか
符号有りならFFFFが付加する場合もある
321デフォルトの名無しさん:2009/02/04(水) 21:39:31
ソースコード中に0x1111U とかある場合のUって何なのでしょうか?
あってもなくても動き的にはかわらないとみていいのでしょうか
322デフォルトの名無しさん:2009/02/04(水) 21:43:13
それは整数定数の型を指定する接尾辞
Uはunsigned型
他にもあるからググってみ
323デフォルトの名無しさん:2009/02/04(水) 21:45:11
整数定数のunsignedとかまったくよくわからないです
324デフォルトの名無しさん:2009/02/04(水) 21:45:57
じゃあそれもググれば
325デフォルトの名無しさん:2009/02/04(水) 22:04:13
ぐぐってもでてきませんでした
326デフォルトの名無しさん:2009/02/04(水) 22:38:05
ったく、世話が焼ける
ttp://www9.plala.or.jp/sgwr-t/c/sec13.html
327デフォルトの名無しさん:2009/02/04(水) 22:43:39
さすがに定数もぐぐれなかったら、パソコン使うのは不可能だろ
328デフォルトの名無しさん:2009/02/04(水) 23:59:40
以下のコードのnew演算子をmalloc関数に置き換えるとどのようなコードになるか教えてください。

int ** a = new int * [b];
329デフォルトの名無しさん:2009/02/05(木) 00:00:51
int ** a = (int **)malloc(b * sizeof(int*));
330328:2009/02/05(木) 00:11:43
>> 329
ありがとうございました。
331デフォルトの名無しさん:2009/02/05(木) 00:15:42
参考書(複数)にはファイル操作のルーチンはあるのですが、
ディレクトリ内にあるファイルのリストを"ディレクトリ名.txt"に
書き出すルーチンがありません。
"<" で指定したフォルダ内のファイル・リストを書き出すコードを
教えてください。
332デフォルトの名無しさん:2009/02/05(木) 00:19:50
dirent とか readdir とか scandir でググれ。
333デフォルトの名無しさん:2009/02/05(木) 00:51:23
ここはVC++の質問も可能なスレですか?
334デフォルトの名無しさん:2009/02/05(木) 01:31:18
はいどうぞ。
335デフォルトの名無しさん:2009/02/05(木) 07:28:49
std::vector<int>の配列オブジェクトって
vector<int> array(n);
for(int n=0;n<5;n++){array.push_back(n);}
こうやって
for(n=0;n<5;n++){cout << array[n] <<endl;}
こういうことは出来るんだけど
for(n=0;n<5;n++){if(n==array[n])cout<<array[n]*n<<endl;}
て感じで ↑
array[n]で'*''-''='は出来ても'>''<''=='とかは使えないんだよね
そうしたいときはarray.at(n)でないと出来ない.
なぜarray[n]でも'>''<''=='などの演算子を使えるようにしてないんだ?
まあできるように書き換えるか.at()すればいい話ではあるが

336デフォルトの名無しさん:2009/02/05(木) 07:52:33
できるよ
337デフォルトの名無しさん:2009/02/05(木) 10:20:59
最初の初期化の意味とその後のpush_backの意味勘違いしてるとか
338デフォルトの名無しさん:2009/02/05(木) 11:06:11
unsigned int p;
unsigned int *last = 0;

と宣言されているときに、
変数 i のループの中でこんなことをしているコードを見かけました。

*( uint ** )( p + i ) = last;
last = p + i;

特に最初のポインタ演算がわからないのですが、*( uint ** )( p + i ) の部
分はどう読めばいいんでしょうか??

339デフォルトの名無しさん:2009/02/05(木) 11:16:03
 pは、実は「unsigned を指すポインタ」の配列の
 先頭を指しているポインタなのさ!
 宣言するとしたら unsigned (*p)[] かな。
 だけど僕にも都合があるから unsigned にしてあるんだ。
 だから p[i] にループの一回前のポインタを入れるにも
 こんな苦労をしなきゃいけないのさ。

まあ、豚の肛門より汚いコードだわね。
340338: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 ) が頭の中でパーズできません。。。
341デフォルトの名無しさん:2009/02/05(木) 13:14:56
頭がわるい人はtypedefを使って複雑さを一段階下げるといいよ
342デフォルトの名無しさん:2009/02/05(木) 13:19:02
>>340
もし
uint **p = malloc(... * sizeof(uint*));
uint **last = 0;
となっていたら、

p[i] = last;
last = &p[i];
という意味。
343デフォルトの名無しさん:2009/02/05(木) 20:24:21
このスレで他人の質問に答えてたらCうまくなりますか?
344デフォルトの名無しさん:2009/02/05(木) 20:31:18
そりゃ人に教えようと思えば自然と深い知識が身に付くってもんだ
嘘書いたときのつっこみの嵐が怖いから調べる癖もつくしね
345デフォルトの名無しさん:2009/02/05(木) 21:07:51
俺いつも適当に答えてるwww
346デフォルトの名無しさん:2009/02/05(木) 21:27:49
>>319
operator()
347デフォルトの名無しさん:2009/02/05(木) 21:31:56
>>343
ここの低レベルな回答みれば程度がわかるだろ
348デフォルトの名無しさん:2009/02/05(木) 22:01:44
>>343
>>347を見れば程度が分かるだろ
349デフォルトの名無しさん: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の中にへんな文字がはいってしまいます。
初期化はどのようにやったらよいでしょうか
350デフォルトの名無しさん:2009/02/05(木) 22:37:13
C++ならコンストラクタ使えば?
351デフォルトの名無しさん:2009/02/05(木) 22:40:08
char なら memset で 0 で埋めれば
352デフォルトの名無しさん:2009/02/05(木) 22:48:45
static T t[N] = {0};でいいじゃない。
353デフォルトの名無しさん:2009/02/05(木) 22:50:01
>>349
よくみたら、static変数だな。
staticって、0で初期化されるんじゃなかったっけ?
354デフォルトの名無しさん:2009/02/05(木) 22:51:10
VC2008で確認したら0初期化されてた
355デフォルトの名無しさん:2009/02/05(木) 22:53:09
>>349
やってみたけど中身は空だったけど?
コンパイラは何よ?こちらはVS2008
356デフォルトの名無しさん:2009/02/05(木) 23:06:09
>>350-355
コメントありがとうございます。
>>355
g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
nameにはランダムな文字列を代入したいんですが
char c[63];
int k=0;
strcpy(c,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
strcat(c,"abcdefghijklmnopqrstuvwxyz");
strcat(c,"0123456789");
for(int i=0;i<n;i++){
k=rand()%62;
rc[i]=c[k];
}
のようにしてから
for(int i=0;i<N;i++){ cout << t[i].name << endl; }
すると変な文字が混ざっていたので初期化ができてないのかな
と思いました。自分には原因がわかりませんでした。
357デフォルトの名無しさん:2009/02/05(木) 23:07:03
ちょwwww
358デフォルトの名無しさん:2009/02/05(木) 23:10:00
>>356
なんだよ

>>349だけじゃねーのかよ
ならコンパイル通る形でよこせカス
359デフォルトの名無しさん:2009/02/05(木) 23:10:39
情報小出しにすんな
症状が再現する最小限のソースを貼れ
360デフォルトの名無しさん:2009/02/05(木) 23:13:54
これで大体全部です
361デフォルトの名無しさん:2009/02/05(木) 23:16:29
>>349 と >>356 の関連がわからない。
362デフォルトの名無しさん:2009/02/05(木) 23:18:45
rc[]がだいたいないじゃん
全部貼れと言ったんだ
363デフォルトの名無しさん:2009/02/05(木) 23:20:44
もう貼らなくてもいいよ。
364デフォルトの名無しさん:2009/02/05(木) 23:25:10
いつまでも一人で悩んでろ
365デフォルトの名無しさん:2009/02/05(木) 23:26:12
とか言いつつ、貼られたら大喜びで教えちゃうんだろ? おまえら。
366デフォルトの名無しさん:2009/02/05(木) 23:29:56
どうせrc[]もstaticにあってまだ呈示されてないソースでオーバーラン
してるだけちゃうんかと
367デフォルトの名無しさん:2009/02/05(木) 23:42:41
結局、変かどうかは主観に基づくからね
368デフォルトの名無しさん:2009/02/05(木) 23:48:10
>>362
rc[]は関係ないと思うんですよ

やはりこれだけでは分からないのでしょうか?
369デフォルトの名無しさん:2009/02/05(木) 23:49:04
>>368
分からないからレス付かないんだろうが
いいから全部貼れ!
大きいならロダ使え

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
370デフォルトの名無しさん:2009/02/05(木) 23:52:39
>>368
原因はオーバーランして、T[]の領域まで書き込んじゃってるだけだろ。

具体的に指摘して欲しかったら、コードを貼るしかないよ。
371デフォルトの名無しさん:2009/02/05(木) 23:53:51
俺はわかったよ
ただそれを書くには、ここは余白が狭すぎるんだよね
372デフォルトの名無しさん:2009/02/05(木) 23:55:35
>>371
>>369のロダに書いて貼ってみ
373デフォルトの名無しさん:2009/02/05(木) 23:57:29
>>360 >>368
は別人です。まず質問の仕方を勉強してきます。ありがとうございました。
374デフォルトの名無しさん:2009/02/06(金) 01:39:17
Microsoft Visual C++ 2008 Express Editionでソリューションを選択してソースを表示した時に
自動的に検索ウィンドウが開いている状態にする方法は何かあるのでしょうか?
375デフォルトの名無しさん:2009/02/06(金) 05:33:22
stringクラスに日本語をつっこんだときは日本語の2バイト文字として認識されているんじゃなくて
半角の1バイト文字列*2で認識されてるんですか?
376デフォルトの名無しさん:2009/02/06(金) 09:47:58
3バイトかもしれない
処理系依存
377デフォルトの名無しさん:2009/02/06(金) 10:01:39
>>375
ただのchar型整数の連続としか認識してないと思う
378デフォルトの名無しさん:2009/02/06(金) 10:05:53
>>375
「ナニ角だか知らんがcharが2バイト」
379デフォルトの名無しさん:2009/02/06(金) 11:39:21
C++で日本語処理は大変さー
#define T 3;
とかで決めた変数って"=="や">" "<"の演算子使えないの?
if(num==T)とかすると
error C2059: 構文エラー : ')'
error C2143: 構文エラー : ')' が ';' の前にありません。
ってエラーが出るんだけど

380デフォルトの名無しさん:2009/02/06(金) 11:42:39
#define T 3
381デフォルトの名無しさん:2009/02/06(金) 11:47:58
        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄
382デフォルトの名無しさん:2009/02/06(金) 12:02:38
あ、セミコロン要らないんですね。
回答ありがとうございます
383デフォルトの名無しさん:2009/02/06(金) 12:19:11
殺伐としていた気分がすっかり和んだ。
384デフォルトの名無しさん:2009/02/06(金) 14:08:32
下記の二次元配列を渡している処理をC++からCに直すにはどう修正すればよいか教えて下さい。
ABS関数の中の"?"とか":"とかが何をするのかすらわかりません…

/* 呼び出し元 */
if (ABS(a[I][iCol]) > ABS(a[iRow][iCol]))

/* 関数本体 */
template <class T> inline T ABS(T A)
{
return A >= (T)0 ? A : (-1) * A;
}
385デフォルトの名無しさん:2009/02/06(金) 14:11:27
?とか:はCにもあるだろ
386デフォルトの名無しさん:2009/02/06(金) 14:41:29
if(A >= (T)0)
return A;
else
return (-1) * A;
387デフォルトの名無しさん:2009/02/06(金) 14:51:19
型が int/float/double なら、わざわざ独自関数にするまでもない。
それぞれ abs()、fabsf()、fabs() 呼ぶだけ。
388384:2009/02/06(金) 15:17:16
>>386
そういう意味だったんですね。

>>387
配列の型はdoubleです。
fabs関数を呼ぶことにします。

勉強になりました。
ありがとうございました。
389384: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;
}
390デフォルトの名無しさん:2009/02/06(金) 15:43:56
>>389
std::swap

その呼び出し元でいけるかは、知らん
型知らんし
391389:2009/02/06(金) 15:50:48
>>390
型はdoubleです。
すみません、また書き忘れてました。
392389:2009/02/06(金) 15:55:53
Cではstd::swapにあたるものは無いみたいですね。
393デフォルトの名無しさん:2009/02/06(金) 18:58:21
for(; i > 0; )
{
〜〜〜〜
scanf("%d", &i);
}

試験で↑をdo文で書き換える問題を下のように答えたら減点されました。
何がいけないんでしょうか?
(iの初期化値は触れられていません)

if(i > 0)
{
do{
〜〜〜〜
scanf("%d", &i);
} while( i > 0)
}

394デフォルトの名無しさん:2009/02/06(金) 19:08:47
>>393
whileの後にセミコロンがないから?
395デフォルトの名無しさん:2009/02/06(金) 19:40:08
>>394
いや、付けてました。それは写し忘れです。具体的に言うとifの部分がばっさり×になってたんです。
if取ったら動作が違ってきますよね?iの初期化値が負だった場合とか。
396デフォルトの名無しさん:2009/02/06(金) 19:46:08
ということを先生に伝えてみたら?
397デフォルトの名無しさん:2009/02/06(金) 20:35:33
プログラミング教えてる先生なんて、
そうっとー てきとーだからなw
ほんとにてきとーだぞ 普通こんなミスするかよ・・・  やる気無いとしか・・・ ってミスをする。
おまいもてきとーにかんがえたほうが良い
398デフォルトの名無しさん:2009/02/06(金) 20:50:16
なんにせよ、試験の解答はすべて聞いた方がいいと思うぞ
勉強になるだろうし、センセってのは質問を受けると喜ぶ変態が多い
399デフォルトの名無しさん:2009/02/06(金) 20:51:03
>>398
解るw
目が輝いいらっしゃるよな
400デフォルトの名無しさん:2009/02/06(金) 20:58:53
std::stringは分かるんだけど、
std::wstringの使い方を解説してくれている
わかりやすいページない?
わかりやすいの基準は様々だろうけど俺の今の技量水準はSTLとかテンプレートとかは理解しているくらい。
ただしロケーションあたりの理解はだいぶ乏しい。
401デフォルトの名無しさん:2009/02/06(金) 21:27:11
セミコロンいらね
402デフォルトの名無しさん:2009/02/06(金) 21:30:25
std::wstringの使い方は・・・
std::stringと同じだよ。
403デフォルトの名無しさん:2009/02/06(金) 21:31:18
>>400
char string
wchar_t wstring
だろ。
対応からわかるだろ
404デフォルトの名無しさん:2009/02/06(金) 21:53:29
>>400
ないな。locale関係を解説してるサイトなんて俺の知る限り無い。
メンバ関数使うだけならstringから類推すればいいし
405デフォルトの名無しさん:2009/02/06(金) 21:58:40
locale はコンパイラがまともに対応してない事もあるしな・・・
406デフォルトの名無しさん:2009/02/06(金) 22:00:53
ロケーションってのはlocaleのことか
普通はたぶん↓のどっちかを最初に書いとけばOK

std::locale::global(std::locale("japanese"));
std::locale::global(std::locale("japanese", std::locale::ctype));

上は数字を入力した場合の3桁毎のカンマ文字あり、下はカンマ文字なし
あと、VC++の場合wcoutはバグが残ってるのかもしれんから気をつけろ
407デフォルトの名無しさん:2009/02/06(金) 22:03:53
内部の動作は、wcharつかっても入出力はcharにしとけよ。表示するときに
wchar -> charにする
408406:2009/02/06(金) 22:04:06
追記
カンマ文字ってのは
wostringstream wos;
wos<<1000;
とかやる場合の話でござる
409デフォルトの名無しさん:2009/02/06(金) 22:17:41
"japanese"じゃなくて""でお任せにしておけばいいじゃない。
あと、wcoutとかwcinなどにはimbueで明示的に指定しないとだめという話も。
410デフォルトの名無しさん:2009/02/06(金) 22:51:49
C始めたいんですが何をインストールすればいいんですか?
windowsのはインストールできません
411デフォルトの名無しさん:2009/02/06(金) 22:54:29
OS書けよw
412デフォルトの名無しさん:2009/02/06(金) 22:58:20
>>410
gccが入ってるだろ
413デフォルトの名無しさん:2009/02/06(金) 23:08:05
>>412
gccってなんですか?
414デフォルトの名無しさん:2009/02/06(金) 23:16:14
>>413
レスを漬けるまでもないC/C++の質問はここで H
ttp://pc11.2ch.net/test/read.cgi/tech_aho/990099/
415デフォルトの名無しさん:2009/02/07(土) 01:54:09
質問があります。

<と==を定義しているクラスMyClassがあって

 bool MyClass::operator<(const MyClass& m);
 bool MyClass::operator==(const MyClass& m);

これをstd::multimapに入れました。

 std::multimap<int, MyClass> mm;

このmmに対して、

mm.insert();  でoperator<()が呼ばれるのは確認できたのですが
mm.find();   でoperator==()が呼ばれません。

何故でしょうか?
416デフォルトの名無しさん:2009/02/07(土) 02:00:30
findの対象になるのはintの方
417デフォルトの名無しさん:2009/02/07(土) 02:56:55
>415
>416 の通りなんだけど仮に MyClass がキーだったとしても operator==() ではなくて、
!a.operator<(b) && !b.operator<(a) として判断が行われる。
418デフォルトの名無しさん:2009/02/07(土) 09:02:48
int numnum
#define RET numnum
#define GOU *(unsigned short*)(RET+0x123U)

というのがあって、
GOU = 10
とソース中に記述すると
どのような動きをするのでしょうか?
numunumのアドレスに対して+123を足しているのでしょうか?
numnumのアドレスが0x800000だったら0x800123番地に10がセットされるのでしょうか?
419デフォルトの名無しさん:2009/02/07(土) 09:04:59
hensu |= daisu

このとき、hensuとdaisuに最初1がはいってた場合、
hensuは2ではなくて1になるのでしょうか?
420デフォルトの名無しさん:2009/02/07(土) 09:29:13
>>419
1になる ビット演算勉強するとよろし
421デフォルトの名無しさん:2009/02/07(土) 09:34:01
>>415 等値と等価だね 詳しくは Effective STL 読んでくれ
422デフォルトの名無しさん:2009/02/07(土) 09:50:02
>>418
shortが2バイトなら、0x800123と0x800124に上位と下位に分けて格納されるか、バスエラーを起こす。
423デフォルトの名無しさん:2009/02/07(土) 10:53:31
P[i].nameに関数funcで得た文字列を代入して実行したときに
abcd-ABCDEFGHIJ abcd-ABCDEFGHIJ abcd-ABCDEFGHIJ ....
と出力されるようにしたいのですがどうしたらよいでしょうか
struct Person{ char name[16]; };
class Func{
public:
void func(const int&, char[]);
};
int main(void){
static Person P[10];
Func F;
char c[11];
for(int i=0;i<10;i++){
strcpy(P[i].name,"abcd-");
F.func(10,c);
strcat(P[i].name,c);
}
for(int i=0;i<10;i++){
cout << P[i].name <<" ";
}
cout << endl;
return 0;
}
void Func::func(const int& n, char c[]){
char tmp[11];
strcpy(tmp,"ABCDEFGHIJ");
for(int i=0;i<n;i++){
c[i]=tmp[i];
}
//cout << c << endl;
}
424デフォルトの名無しさん:2009/02/07(土) 11:09:55
F.func(11,c);
425デフォルトの名無しさん:2009/02/07(土) 11:59:35
void Func::func(const int& n, char c[])
なぜ、参照渡し? >>424みたいに直値でわたせるっけ?
426デフォルトの名無しさん:2009/02/07(土) 12:01:13
const int& は即値をバインドできる

正確には即値がコピーされて渡され関数終了後に消滅する
427デフォルトの名無しさん:2009/02/07(土) 12:06:49
でも組み込み型は普通const 参照にはしないな
428デフォルトの名無しさん:2009/02/07(土) 12:37:12
>>418
munmunのアドレスじゃなくて値
int munmun = 0x800000;
ならそうなる
429デフォルトの名無しさん:2009/02/07(土) 12:54:51
>>424
ありがとうございました。
>>426 >>427
void Func::func(int n, char c[])
のようにしたほうがよいということでしょうか
430デフォルトの名無しさん:2009/02/07(土) 13:52:01
>>427の通り、普通はしないってだけ
431デフォルトの名無しさん:2009/02/07(土) 14:32:07
>>416 >>417
ありがとう。

>>415は間違いでした。>>417の指摘の通り

×std::multimap<int, MyClass> mm; ではなく、

○std::multimap<MyClass, int> mm; の場合です。
432デフォルトの名無しさん:2009/02/07(土) 14:35:57
>>471
そう言うのは何を見ればわかりますか?

VC++のオンラインマニュアルには「Finds an element that matches a specified key.」としか書いてなく
どうやってmatchesを判定するのか書いていませんし、
「C++ STL multimap find」とか「std::multimap::find 比較」とかでググっても出てきません。
433デフォルトの名無しさん:2009/02/07(土) 14:36:54
>>421
Effective STL を読んでみます。ありがとうございます。
434デフォルトの名無しさん:2009/02/07(土) 15:28:42
>432
STL には色々と落とし穴も多いので Effective STL は読んどくべき。

で、君が見ているのは STL じゃなくて STL/CLR のオンラインヘルプではないかね?
STL はこっち。

ttp://msdn.microsoft.com/en-us/library/9987620f.aspx
> Remarks
> The member function returns an iterator that addresses an element in the multimap
> whose sort key is equivalent to the argument key under a binary predicate that induces
> an ordering based on a less than comparability relation.

これで分かれっちゅうのも酷な話だと思うが。

>そう言うのは何を見ればわかりますか?

今回は find に固有の挙動ではなくて associative container(set とか map) 一般の挙動についてなので、
set とか map の使い方を説明してるところでは書いてあるんじゃない?

最良の資料は規格だろうけど買えってのも厳しいとは思うので前の版の C++ 規格の最終 draft なんかも参考になる。
ttp://www.hep.wisc.edu/~pinghc/isocppstd/lib-containers.html#lib.associative.reqmts
435デフォルトの名無しさん:2009/02/07(土) 15:59:17
>>434
>STL はこっち。

そちらも見ましたよ。
「equivalent」がボールドになっていたのが意味不明だったのですが、これが>>421の「等価」ですね。

>set とか map の使い方を説明してるところでは書いてあるんじゃない?

日本語で記述されているところにはありませんでした。

最後のリンクを参考にしてみます。ありがとうございます。
436デフォルトの名無しさん:2009/02/07(土) 16:04:09
>>417
それならば、find()でoperator<()が呼ばれるはずですよね。

operator<()とoperator==()の先頭にブレークポイントを付けているのですが、
find()のときにはどちらも呼ばれません。

何故だろう。。
437デフォルトの名無しさん:2009/02/07(土) 16:06:31
まさかとは思うが、インライン展開されているなんて落ちはないよな。
438デフォルトの名無しさん:2009/02/07(土) 16:08:14
operator<()とoperator==()についてですが、
クラスの宣言の外で定義して、inline指定もしていませんので、
インライン展開はされていないと思います。
439デフォルトの名無しさん:2009/02/07(土) 16:23:24
インライン展開の判断はコンパイラが勝手にする。
ブレイクポイントを張るには、それを禁止してやらないといけない。
必要なら、ブレイクポイントではなく何かstd::cerrにでも出力してみればいい。
440デフォルトの名無しさん:2009/02/07(土) 16:43:00
まあ、VCならデバッグビルドすれば最適化オフが標準設定だけどな。
441デフォルトの名無しさん:2009/02/08(日) 01:48:07
未だに GCC 4.0.1 を使ってるんだけど、
setlocale すると必ず死ぬし、まともにワイド文字列も扱えない様子。
4.3.3 にしたらこのあたり改善されてるの?
442デフォルトの名無しさん:2009/02/08(日) 02:28:54
それホントにgccの問題か?
443デフォルトの名無しさん: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
444デフォルトの名無しさん:2009/02/08(日) 04:08:52
>443
locale 文字列で "japanese" が通るのは VC じゃないのか?
"" か "ja_JP.UTF-8" とかでどうだ?
445436:2009/02/08(日) 10:08:59
>>439
>>440の通りだと思いますが、念のためstd::cerrに出力するようにしましたが、やはりfind()でoperator<は呼ばれません。

なぜでしょう。
446439:2009/02/08(日) 10:25:06
私に聞かれても知らんよ。状況を再現する最低限のソースでもあればgccで追試くらいはしてもいいけど。
447436:2009/02/08(日) 10:32:46
>>446
intとMyClassが反対になってますが、それ以外は>>415の通りです。

完全なコードが必要であればあとで貼ります。
今出先なので。。
448デフォルトの名無しさん:2009/02/08(日) 11:12:49
mainの中でstaticに宣言した構造体のメンバーnが二重ループの中にある
funcによって書き換えられるプログラムです。
実際にはfuncの部分はもっと長いです。jに関するループを出た後、T.nが
-2147477599になってしまうことがあります。Tの寿命はmainが終わるまで
ずっとあってメンバーの値を参照渡しして変えると変更された値は保持さ
れていると考えたんですが間違いでしょうか
struct Temp{
int n;
};
class Func{
public:
void func(struct Temp&);
};
int main(void){
static Temp T;
Func F;
T.n=0;
for(int i=0;i<100;i++){
cout << "A" <<T.n <<" "<< &T.n << endl;
for(int j=0;j<100;j++){
cout << "B" << T.n <<" "<< &T.n << endl;
F.func(T);
cout << "C" << T.n <<" "<< &T.n << endl;
}
}
return 0;
}
void Func::func(struct Temp& T){
T.n=T.n+1;
}
449デフォルトの名無しさん:2009/02/08(日) 11:39:27
>>448
VS2005だとならないな
考え方も間違ってないので実際のfuncが間違ってるとか
450デフォルトの名無しさん:2009/02/08(日) 12:17:24
>>444
"" でも死ぬ。
451デフォルトの名無しさん:2009/02/08(日) 12:22:25
"ja_JP.UTF-8" でも死んだ。
Mac で最新の GCC 使ってる人がいれば、
このあたり大丈夫かどうか教えてもらえれば助かります。
GCC 更新するの時間かかるし、
それで効果無かったら泣けるしね・・・。
452デフォルトの名無しさん:2009/02/08(日) 13:50:10
#include<stdio.h>

int main(void )
{
 FILE* ofp;
 ofp = fopen( "test.txt", "w" );
 fprintf( ofp,"テスト\n");
 fclose( ofp );
 return 0;
}

こんな風に書いたプログラムをデスクトップ上でファイルをドラッグ&ドロップして実行した時だけ、
test.txtファイルが出力されないのはなぜですか?
普通にクリックしたりコマンドプロンプト上で動かすときはtest.txtファイルが出力されます。
自分用にファイルを変換するツールを作りたいのですが困っています。
453デフォルトの名無しさん:2009/02/08(日) 13:51:31
相対パスだから
454デフォルトの名無しさん:2009/02/08(日) 13:54:19
よく探してごらん、どっかに出来てるよw
455デフォルトの名無しさん:2009/02/08(日) 14:19:39
>>451
GCC4.3.2 でも死ぬ。
locale -a にある全てのロケールを試したけど、C と POSIX 以外通らない。
なんでこんなに腐ってるんだ。
456デフォルトの名無しさん:2009/02/08(日) 14:20:55
>>455
おお、ありがとうございます。
やはりGCCはロケール未対応と考えた方が良さそうですな・・・。
457デフォルトの名無しさん:2009/02/08(日) 14:22:14
難しい話をしているところ申し訳ないが、
そもそも、std::locale::globa()lって何の効果があるもんなの?

ググってサンプルをg++でコンパイルしてみたら、
wcoutはstdのメンバじゃないよ、的なエラーがでるし・・・
458デフォルトの名無しさん:2009/02/08(日) 14:22:22
って、CとPOSIXは通るんだ。
459デフォルトの名無しさん:2009/02/08(日) 14:25:14
ワイド文字で ? になるのは、
wchar_t ch; std::wcin >> ch; としても入力が UTF-8 で行われるから、
ということだと判明した。
どうすればいいんだ・・・。
460デフォルトの名無しさん:2009/02/08(日) 15:22:52
#include <clocale>

setlocale(LC_ALL, "");
wchar_t ch;
std::wcin >> ch;
std::wcout << ch << std::endl;

これなら一応正しく動くな。
461デフォルトの名無しさん:2009/02/08(日) 15:54:18
本当だ!
なんという盲点。
ありがとうございました。
462400です:2009/02/08(日) 16:52:20
遅レスでごめん。
お答えくださった方々有難うございます。
wchar_tってやっぱりカオスなんだねぇ。
なんかよくマルチプラットフォームの開発環境ってさまざまなエンコードに対応した
自前の文字列クラスを用意しているけど、これってまさかwchar_tが
あまりにもクソだからですかい?
463デフォルトの名無しさん:2009/02/08(日) 17:05:19
>>457
wcoutが使えない、ってCygwinか?
Cygwinは腐る以前にそもそも何もない。
464デフォルトの名無しさん:2009/02/08(日) 17:08:18
wchar_tで入出力しなければいい。 内部操作だけで使う。
2バイト、1バイト文字がそれぞれ1文字になる点、
ファイルアクセスで長いファイル名やJISなどで対応できない文字にアクセス出来る点
が便利。
465デフォルトの名無しさん:2009/02/08(日) 17:27:04
>>463
そう、Cygwin
gccならなんでも同じだろうと思ってたけど、違うものなのね・・・

>>464
charで入出力して、中でwchar_tに変換して使うのかな?
466デフォルトの名無しさん:2009/02/08(日) 17:30:33
すまん。APIで対応している場合はつかっていい。
しかし、言語を出力するときは、wchar_tだと予定通りにならない場合がある。
charなら一通りの出力しかない
467デフォルトの名無しさん:2009/02/08(日) 18:11:47
Cygwin の gcc ってバージョンいくつだっけ?
468デフォルトの名無しさん:2009/02/08(日) 18:13:27
手元のはこれ。最新かどうかは知らん。
--
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
469デフォルトの名無しさん:2009/02/08(日) 18:16:35
やっぱりまだ3.xだったか。
今は4.3.3だよ。
470デフォルトの名無しさん:2009/02/08(日) 18:18:03
インストーラで、4.3.xのバイナリも別途導入できるよ。
もちろん、libcが駄目なことに変わりは無いので、wchar_tが使えないのは変わっていないはず。
471デフォルトの名無しさん:2009/02/08(日) 19:43:10
2008-12-09
GCC 4.3.2 TDM-2 is now available. http://www.tdragon.net/recentgcc/
472デフォルトの名無しさん:2009/02/08(日) 23:47:17
a=1;
b=2;
c=3;
d=4;
のとき
a=b=c=d=0;
とするとa,b,c,d全てに0が代入されますか
473デフォルトの名無しさん:2009/02/08(日) 23:49:00
はい
474デフォルトの名無しさん:2009/02/08(日) 23:55:32
>>471
ああ、それは--input-charset=cp932もsetlocale(LC_ALL,"")+wcoutも使える優れ物だ。
boost::wsmatchの確認に重宝してるよ。
475デフォルトの名無しさん:2009/02/09(月) 11:31:51
コンパイラとライブラリの区別がついてない人がいるな。
476デフォルトの名無しさん:2009/02/09(月) 12:19:08
最近はコンパイラがライブラリの知識を持ってるぞ。
477デフォルトの名無しさん:2009/02/09(月) 13:21:47
それはない
478デフォルトの名無しさん: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の計算時間はいつもゼロです。
また全計算時間のつもりの二列目の数字も負になることがあります。
どうなおしたらよいでしょうか
479デフォルトの名無しさん:2009/02/09(月) 14:51:27
(double)((telaps1-telaps0) /

((double)(telaps1-telaps0) /
480デフォルトの名無しさん:2009/02/09(月) 15:02:35
>>478
hoge( )の処理が1秒以内で終わるからでしょ
clock( )の値はオーバーフローして0に戻ることもあるから負になっても不思議はないよ
そんなことよりさ
どうしてdouble型を使ってるの
481デフォルトの名無しさん:2009/02/09(月) 15:03:01
>>478
hoge()の中身はなになのよ
482デフォルトの名無しさん:2009/02/09(月) 15:08:53
ああ少数で表示したいからdoubleなのか
483デフォルトの名無しさん:2009/02/09(月) 15:28:54
>>480 >>481 hoge()は数分かかります。内容は質問に無関係だと
思いましたので省きました。
>>482
小数点ありで表示したいです。勉強不足でオーバフローがどうい
うことなのかわからないんですが絶対値をとるだけでもよいでし
ょうか
484デフォルトの名無しさん:2009/02/09(月) 16:09:31
>>483
hoge()の内容で違うよ
485デフォルトの名無しさん:2009/02/09(月) 20:02:05
ゼロになるのは処理時間が短すぎて計測できてないから。
負になる理由はオーバーフロー以外考えられないな。
486デフォルトの名無しさん:2009/02/09(月) 20:52:29
数分かかるってのがもし1000回の実行時間なら
>>479
と合わせて

>>480>>485
が原因でつじつまが合うな
487デフォルトの名無しさん: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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か&amp;nbsp;に置換しておくことをお勧めします。
488デフォルトの名無しさん:2009/02/09(月) 21:34:46
アンパサンドの実態参照が見えちゃってるよ
489デフォルトの名無しさん:2009/02/09(月) 21:39:12
そのまま貼れるようにしたんだよ
490デフォルトの名無しさん:2009/02/09(月) 21:48:00
>>487
もう合流でいいだろ
491デフォルトの名無しさん:2009/02/09(月) 21:49:16
C++の例外で手っ取り早くthrow元の関数名か行番号を表示させる方法ってある?

新たに例外クラス作ったりせず標準機能で
throw std::error_message("エラー");
みたいにすると勝手に関数名や行番号が付くと有難い。

linuxとwindowsでそれぞれよろしく。
492デフォルトの名無しさん:2009/02/09(月) 21:56:55
まず
__LINE__ __FUNC__は知ってるのか?

493デフォルトの名無しさん:2009/02/09(月) 22:00:38
>>492
もちろん知ってるよ。
そういうのを使って自分で書かなくてもいいように標準機能が用意されてないかなと思って。
同じようなこと皆するんだから、ありそうでしょ?
494デフォルトの名無しさん:2009/02/09(月) 22:32:13
ないんですよ。それが。
495デフォルトの名無しさん:2009/02/09(月) 22:33:01
VC++なら例外投げられた所で止まらなかったっけ?
デバッグ実行してたら
496デフォルトの名無しさん:2009/02/09(月) 23:24:44
>>484
hoge()

void hoge(x,y,z){....}
....の部分はいろいろな演算をしています。
....によっていろいろな値になるということでしょうか
プラスになるかマイナスになるかはどうやって見分けた
らよいのですか
497デフォルトの名無しさん:2009/02/09(月) 23:43:14
>>486
オーバーフローについて自分にわかっている範囲で原因を
考えると>>478 のループを繰り返す間にTelaps1がとりうる
値の範囲以外の値がはいってしまうということですか
大きな桁の数字がはいってオーバーフローだとするとこれ
をさけるために例えば
Telaps1=(double)(clock()/CLOCKS_PER_SEC)
のようにすれば回避できるんでしょうか
498デフォルトの名無しさん:2009/02/09(月) 23:47:55

doubleの位置指摘してくれてるのになんで直さないの?
499デフォルトの名無しさん:2009/02/10(火) 00:00:31
>>497
>>自分にわかっている範囲で
いいから言われたようにやってみろよ。キャストくらい分かれ…
…と言いたいところだが、なんかこのスレの住人達は妙にやさしいから
俺もそれに倣ってみる。
BohYoh.com−C/C++ FAQ 整数値の平均を実数で求めようとしてもうまくいかないのはどうしてですか。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00097.html
とりあえずこれを読んでから自分のコード見てみ。
万一これを読んでも分からないなら致命的だから今すぐヤメレ。
500デフォルトの名無しさん:2009/02/10(火) 00:04:23
どうでもいいけど、そのサイトの色使いひどいな。目が痛くなる。
501デフォルトの名無しさん:2009/02/10(火) 00:06:39
>>497
>>486で主に指摘してるのはオーバフローの件じゃない
まさか一回のfunc()に数分もかかってるわけ無いだろうから、1000回で数分だろ?
だとすれば一回は一秒以下だからお前の計算じゃ毎度0になって当然


502デフォルトの名無しさん:2009/02/10(火) 00:09:10
>>494
そうですかー。みんなで車輪の再発明大会ですか。。無駄だなー。

>>495
デバグならね。コールスタックが残ってるからわかるね。
でも、リリースでもわかるようにしたいんだ。
503499:2009/02/10(火) 00:09:28
柴田望洋さん(の後援会のHP)だったような。
標準C/C++の仕様を比較して教えてくれているところで、用語が正確だから俺は好きだった。
(今も好きだがもう見る機会がない。)

504デフォルトの名無しさん:2009/02/10(火) 00:11:03
結構好きなサイトだった。
多少上達してからは使わなくなったけど。
505デフォルトの名無しさん:2009/02/10(火) 00:21:38
質問1
int func(std::string str)とint func(const std::string& str)のそれぞれのメリットとデメリットを教えてください。
記述をすっきりさせるために出来れば前者だけを使いたいです。
506デフォルトの名無しさん:2009/02/10(火) 00:22:35
質問2
STLのコンテナにはコピーが入るのですか?参照が入るのですか?
参照を入れようとすると参照が2重になって怒られるので、きっと参照が入るのだと思うのですが
そうだとすると、クラスメンバーのstd::list<MyClass>にローカルオブジェクトを入れると関数から抜けたときにオブジェクトがなくなって問題になりそうです。
どちらなのか分からなくなったので、教えてください。
507デフォルトの名無しさん:2009/02/10(火) 00:24:14
>>505
前者はコピーのコストが生じるので後者に統一するのが無難
508デフォルトの名無しさん:2009/02/10(火) 00:27:11
>>506
コピーなので
コピーコンストラクタに従う

>参照を入れようとすると参照が2重になって怒られる
多分お前のコードが別の理由でおかしいんだろう
509デフォルトの名無しさん:2009/02/10(火) 00:30:41
>>508
>多分お前のコードが別の理由でおかしいんだろう

いや、
std::map<int, MyClass&> mm;
とかやると、エラーが出るでしょ?知らない?

510デフォルトの名無しさん:2009/02/10(火) 00:31:18
>>508
コピーなのね。ありがとう。
511505,506:2009/02/10(火) 00:34:11
>>507
わかりました。
STLのコンテナに入れる時もconst std::string&の方がいいですか?
512デフォルトの名無しさん:2009/02/10(火) 00:35:13
今年、C++の仕様が変わるらしいけど、
かなり勉強し直さなくちゃいけないの?

せっかく覚えた難解変態仕様が、無駄になるってこと?
513デフォルトの名無しさん:2009/02/10(火) 00:35:55
>>509
std::vector<X> v;
として
v.push_back(X())
とかやったときにX の参照が格納されるのかどうか、っていう意味だと思ったんだ

514デフォルトの名無しさん:2009/02/10(火) 00:47:12
>>512
いまのC++のどの辺が難解変態なの?
515505,506:2009/02/10(火) 01:06:28
>>513
その場合はどうなるの?
X()がスタックに生成されて、それがvector::push_back(const X& val)に渡されて
push_back()の中でvector::data[n] = valみたいな感じでコピーコンストラクタが呼ばれてヒープに格納されて、
最終的に呼び出し元のスタック上のXは居なくなっても大丈夫ってことでおk?
516デフォルトの名無しさん:2009/02/10(火) 03:17:04
>>514
ついていけてるプログラマが1割以下なんだから、全部ダメダメだろ
517デフォルトの名無しさん:2009/02/10(火) 03:31:13
プログラマが1割以下

どこでどうやって確率求めたよ?
518デフォルトの名無しさん:2009/02/10(火) 03:35:37
>>515
おk
519デフォルトの名無しさん:2009/02/10(火) 10:43:15
>>517
確率と割合の違いって知ってる?
520デフォルトの名無しさん:2009/02/10(火) 11:03:46
>>512
これまで通りに書いても問題ありません。
MS謹製言語じゃあるまいし。
521デフォルトの名無しさん:2009/02/10(火) 11:03:49
10年ちょっと前、オレがC++の独習していた頃は、
教科書に「テンプレートは用途がイマイチ不明だが、まあこんなのもあるよ」ってなことが書かれていた。
STLがネット上に公開されたより後だから、入門者がどれだけ付いていけてなかったの証左だと思う。
522デフォルトの名無しさん:2009/02/10(火) 11:33:19
まあ、初心者が書いたようなものを教科書にするなという査証にはなるな。
523デフォルトの名無しさん:2009/02/10(火) 12:25:00
>>522
デブでも喰ってろ
524デフォルトの名無しさん:2009/02/10(火) 13:22:19
そりゃそうだろ。世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
525デフォルトの名無しさん:2009/02/10(火) 13:23:50
そんな縛り儲けたらそれこそピアソンぐらいしか選択肢なくなるじゃん
526デフォルトの名無しさん:2009/02/10(火) 13:27:47
いや、入門書は初心が書いていると割り切って、とっとと卒業するくらいじゃないと使い物にならないってことだよ。
527デフォルトの名無しさん:2009/02/10(火) 13:31:57
>>524みたいな奴ほど、自分は出来ると思い込んでいて
まともな著書も出版できないんだぜw
528524:2009/02/10(火) 13:40:41
大丈夫、説明文書くのが苦手なのは自覚しているから、入門書を出版しようなんて妄想さえしていないから。
まぁ、雑誌の記名記事なら物したことがないわけじゃないけどね。
529デフォルトの名無しさん:2009/02/10(火) 13:45:27
>>527
>>524 に同意できないってことは
入門書未満ということか。
精進しろよ。
530デフォルトの名無しさん:2009/02/10(火) 14:57:09
C++じゃなくCだけど、マクロのundefみたいに変数宣言や関数のプロトタイプ宣言を
取り消す方法は無いの?

winsock2.hをincludeしてws2_32.dllを動的リンクで読み込んだ時に
本来の関数名(WSAStartupとかsocket)にアドレスをGetProcAddressで
取得したいんだけど、当然と言うか既に定義されてしまってる名前だから不具合が。

winsock2.hから定義部分を取り除いて使えば出来たけど
改変ヘッダファイルをソースに同梱して配布するのに問題は無いかとか
コンパイラ依存部はどうするかとかあるし。
531デフォルトの名無しさん:2009/02/10(火) 15:02:02
>>530
winsock2.hは良くできたヘッダだから、
#define INCL_WINSOCK_API_PROTOTYPES 0でプロトタイプ宣言消えるぞ。
INCL_WINSOCK_API_TYPEDEFSも便利だよな。
532デフォルトの名無しさん:2009/02/10(火) 15:09:58
>531
そんな機能があったとは!thx。
533デフォルトの名無しさん:2009/02/10(火) 15:45:21
そのクラスが継承される時を考えて。
前もってメンバ関数を全てvirtualにしておくべき
という考え方もアリ?
それともパフォーマンスが悪くなるから全部virtualだなんて止めろって考えるべき?
俺の思想はどっちにしたらいいの?
534533:2009/02/10(火) 15:49:06
そのクラスじゃなくて
ある自作のクラス
です。。。
535デフォルトの名無しさん:2009/02/10(火) 15:52:56
本当に継承なんてするの?
536デフォルトの名無しさん:2009/02/10(火) 15:54:51
>>535
しないかもしれません。
てかしない可能性のが高いです。
それでもメンバ関数を全てvirtualにしておくべきなのか、そんな極端なことは止めるべきなのですか?
537デフォルトの名無しさん:2009/02/10(火) 16:02:06
コードの上ではvirtual指定された関数は多態である可能性を示すよりむしろ
現時点のコードで多態であることが確定していることを示すんだから付けない方がいいんじゃないかなぁ
それにあるクラスの全メンバにvirtualを機械的に付けるより不要なvirtualキーワードを取り除く方が難しいし
538デフォルトの名無しさん:2009/02/10(火) 16:03:01
>>537
わかりやすい説明ありがとうございます!
危うく間違った変なコーディングの道に迷い込んでいくところでした。。。
539デフォルトの名無しさん:2009/02/10(火) 16:38:36
524 名前:デフォルトの名無しさん 投稿日:2009/02/10(火) 13:22:19
そりゃそうだろ。世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
世にあるC/C++入門書の殆どが初心者レベル以下の連中が書いたものなんだから。
初心者レベル以下の連中が書いたものなんだから。
初心者レベル以下の連中が書いたものなんだから。
540デフォルトの名無しさん:2009/02/10(火) 16:42:25
>>529
口ばかり達者で、お前の実力を示すものを世に公表していない
無名のクズが何ほざいてやがる?こんなスレで偉そうにしているお前が
どこの誰かこっちには分からないが、プログラム以前に、人間として
レベルが低いことが窺えますねw
541デフォルトの名無しさん:2009/02/10(火) 16:44:48
>>524は自分で言っておきながら、ものすごい勘違いをしている。
入門書、この時点で対象としている人のレベルのこともあるんだがw
頭の弱い奴って、結局 自分のこと や 主観 でしか話が出来ないから
他人から嫌われているって気づかないんだよねw
お前らが有名人なら、恐らくこんな場所ではなく、もっと別の場所で
活躍しているだろう。要するに、お前ら小物が言う発言なんて重みがない軽々しい
思いつきのようなもの。そこまで言うなら、お前がそうだと思う入門書を
具体的に示せ。まぁ、事実無根なら ただの名誉毀損 で、お前らが有名人だったら
逆に訴えられるよw
542デフォルトの名無しさん:2009/02/10(火) 16:46:18
×初心者レベル以下の連中が書いたものなんだから。
○初心者レベルの人に対して書いたものなんだから。
日本語って難しいでちゅねw
543デフォルトの名無しさん:2009/02/10(火) 16:49:56
初心者レベルより下ってないよな。
犬がキーボードたたいているような物ってことかwww
527==539==541
なことは誰が見ても明らかだから、おとなしく引っ込んでろよ。
とりあえず氷をなめると頭冷やせるよ。
544デフォルトの名無しさん:2009/02/10(火) 16:52:00
あっ、早速、口先だけで実力も著書も出版できないヘタレ初心者が必死にファビョりましたよw
お前に実力があるなら、言葉でなくてコードで示せ。まぁ、この世は所詮、商売、金儲けが
資本主義では勝負となるんで、ほいほいと商業用のコードなんて出せるわけねーよなw
だからあんな出版物も、初歩的なんだよ、分かったか、小僧?
簡単に手の内を見せる奴は、この勝負の世界では勝ち残れない。
545デフォルトの名無しさん:2009/02/10(火) 16:53:51
初心者レベルのタイプだけ早い糞が必死なスレはここですか?
546私は543:2009/02/10(火) 16:58:31
みなさんお見苦しいところをお見せして申し訳ございません。
///////////////////////////////////////////////////
527==539==541==544
火病の意味(正式な用語としても2ch用語としても両方とも)を調べて来い。
あとこれ以上汚したくないから、俺とおまえで一緒に書き込むの止めないか?
例えばおまえの読点(わかる?「、」って意味だよ?)が多い汚い書込が増えたらやだろ?
547デフォルトの名無しさん:2009/02/10(火) 17:13:45
似非中級者が初心者を見下すスレなんですね、ここは?w
548デフォルトの名無しさん:2009/02/10(火) 17:18:33
>>540
>どこの誰かこっちには分からない
けど
>口ばかり達者で、お前の実力を示すものを世に公表していない
>無名のクズ
だと思うのですね.
のうたりん? :)
549デフォルトの名無しさん:2009/02/10(火) 17:21:03
著書もない無名の雑魚が、必死に初心者を弄って楽しいかい?w
悔しかったら、1冊でも出版して、ここで報告しろよ?お前の著書が
へぼへぼだったら、こてんぱんに批判してやるからw
550デフォルトの名無しさん:2009/02/10(火) 17:26:49
>>547
>>549
悪いんだけど安価つけてやってくれない?連鎖あぼんできなくてうっとおしいんだ
551デフォルトの名無しさん:2009/02/10(火) 17:28:26
お、今日はここか。
552デフォルトの名無しさん:2009/02/10(火) 17:47:14
>必死に初心者を弄って楽しいかい?w
ああ、やっぱり初心者だったのか。
入門書は選ばないと、酷いのあるから気をつけろ。

推薦図書/必読書のためのスレッド 44
http://pc11.2ch.net/test/read.cgi/tech/1232206156/l50
553デフォルトの名無しさん:2009/02/10(火) 17:53:38
組み込み型⇔組み込み型: static_cast
値⇔ポインタ: reinterpret_cast
この二つはいいとして、ポインタ⇔ポインタはどちらを使えばいいのでしょうか?


reinterpret_cast<Base *>(derived_pointer)->ほにゃほにゃ

といった感じで使っていたのですが、
継承関係のクラスも含め、ポインタ関連は全てreinterpret_castでも問題ないのでしょうか?
554停止しました。。。:2009/02/10(火) 18:43:42
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
555デフォルトの名無しさん:2009/02/10(火) 18:48:42
再開
556デフォルトの名無しさん:2009/02/10(火) 19:59:58
>>553
ダウンキャスト・クロスキャストのように失敗する可能性のあるものはdynamic_cast。
ただし、絶対に成功するならstatic_castでも良い。
アップキャストは暗黙変換可能。

継承関係のない型同士(int*→char*など)はreinterpret_cast。
他のポインタ型からvoid*へは暗黙変換、void*から他のポインタ型へはstatic_castで良いが、
共にreinterpret_castを用いる流儀もある。

const/volatile外し(char const*→char*など)はconst_cast。付けるほうは暗黙変換で。

暗黙変換を明示したければ、static_castで置き換えられる。
557デフォルトの名無しさん:2009/02/10(火) 20:13:14
>>556
それを人間に使い分けさせるなんて危険だよなー

C++が如何に糞言語かがよく解る
558デフォルトの名無しさん:2009/02/10(火) 20:18:41
何言ってるんだ?
キャストミスったらコンパイルエラーになるから問題ない。
Cなんてキャストミスっても素通りだろw
559デフォルトの名無しさん:2009/02/10(火) 20:19:47
560デフォルトの名無しさん:2009/02/10(火) 20:22:44
「絶対に成功するなら」ってあるけど、絶対に成功するかどうかってコンパイラが判断してくれるの?
561デフォルトの名無しさん:2009/02/10(火) 20:24:19
それはユーザが判断する。

基本的にダウンキャストやクロスキャストは dynamic_cast で行うべきだが、
明らかに成功する場合(CRTP など)には、
速度を優先して static_cast を行う場合もある。
562デフォルトの名無しさん:2009/02/10(火) 20:26:11
しかしその明らかに成功するという根拠をコードで示せないのが悲しいところかな
0xはではそういうのも可能になるのかなぁ
563デフォルトの名無しさん:2009/02/10(火) 20:29:36
CRTP絡みで、仮想関数がないからdynamic_castが使えないという事情で使う場合もある。

どうしてもstatic_castでダウンキャストしたいというときには、
dynamic_castによるアサート付きのBoostのpolymorphic_downcastがお勧め。
564デフォルトの名無しさん:2009/02/10(火) 20:29:47
class X {
public:
virtual void show() {std::cout << "X" << std::endl;}
};
class Y: public X {
int x;
public:
virtual void show() {std::cout << "Y" << std::endl;}
};

class Z: public X {
public:
virtual void show() {std::cout << "Z" << std::endl;}
};

int main()
{
X *x;
x = new Z;
Y *y;
y = static_cast<Y*>(x);
y->show();
}

としたら、コンパイル通ってなんか動くんですが、
これはいわゆるたまたま動いてるだけという奴?
565デフォルトの名無しさん:2009/02/10(火) 20:31:18
GUIアプリケーションを作る際にどんなソフトをしたらよいでしょうか?
566デフォルトの名無しさん:2009/02/10(火) 20:34:03
>>565
Visual なんとか
567デフォルトの名無しさん:2009/02/10(火) 20:51:45
今なら何でも作れそうだけど、環境の縛りが少ない、Qt+Eclipse CDTが好きかな。
568デフォルトの名無しさん:2009/02/10(火) 21:03:37
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

for(int i = 0; i < 3; i++){
  srand( (unsigned)time( NULL ) );
  int A = rand() % 3;
  cout <<A;
}

forが回る度に違う乱数を取得したいのですが、
どうも同じ乱数を取得してしまいます(0と0と0など)。
どうすればいいでしょうかね?
569デフォルトの名無しさん:2009/02/10(火) 21:06:02
  srand( (unsigned)time( NULL ) );
for(int i = 0; i < 3; i++){

  int A = rand() % 3;
  cout <<A;
}
570デフォルトの名無しさん:2009/02/10(火) 21:14:25
>>569
できました。ありがとうございました
571デフォルトの名無しさん:2009/02/10(火) 21:18:31
>>561
ほら、やっぱり危険じゃんw
572デフォルトの名無しさん:2009/02/10(火) 21:19:20
バカに付ける薬は無い
573デフォルトの名無しさん:2009/02/10(火) 21:19:25
>>556, 559
ありがとうございます
根本から勉強し直します
574デフォルトの名無しさん:2009/02/10(火) 22:05:17
>>571
いやだから
絶対通るようなコーディングの場合は…で、
通るかどうか不確実な場合は…で
っていう使い分けだっつってんじゃん。
君は言語仕様に君のケツを拭いてもらわねばならない人なのかね?
575デフォルトの名無しさん:2009/02/10(火) 22:12:25
釣られてどうする
576574:2009/02/10(火) 22:21:27
>>575
ごめん(>_<)
以後気をつけます
577デフォルトの名無しさん:2009/02/10(火) 23:25:00
そもそも危険なキャストを行うようなコード書いてる事が問題だ
578デフォルトの名無しさん:2009/02/11(水) 00:28:37
>>502
それを車輪の再発明と言ってしまうのはちょっとひどいようにおもう
579デフォルトの名無しさん:2009/02/11(水) 00:33:02
WinAPI叩いてるとポインタと整数キャストの連続なんだが
これスマートに64bit化できんのかな
580デフォルトの名無しさん:2009/02/11(水) 01:15:36
>>578
おもうのは自由だけど、
プログラマが100万人いたら、100万同じようなコードが生成されるのは、車輪の再発明以外の何物でもないよ
581デフォルトの名無しさん:2009/02/11(水) 01:24:18
>>579
ポインタと同じ大きさの整数型を作るってのがWinAPIでもC/C++でもその他あちこちで流行。
(U)INT_PTRとかW/LPARAMにLRESULT、(u)intptr_tなどなど。Windows界隈ではsize_t/ptrdiff_tも該当。

ダイアログプロシージャの戻り値がBOOL→INT_PTRなど、ところどころ暴挙も見られるが。
582デフォルトの名無しさん:2009/02/11(水) 01:33:18
windowsはLLP64だから移植は楽そう
でもそのままだと効果薄そう
583デフォルトの名無しさん:2009/02/11(水) 02:21:10
>>582
レジスタが増えた分の効果を期待してもいいだろう。
584デフォルトの名無しさん:2009/02/11(水) 02:36:20
でもVC++なんかを見ると
まだレジスタ余ってんだから使えばいいのに
ってコードをx64で吐いてたりする
585デフォルトの名無しさん:2009/02/11(水) 02:40:01
気にスンナ。CPU内部でリマッピングされてるから何も変わらん。
586デフォルトの名無しさん:2009/02/11(水) 02:48:20
そうなの?
レジスタ間転送も消えてくれる?
587デフォルトの名無しさん:2009/02/11(水) 06:33:44
>>580
throw元の行番号を表示しようなんて酔狂な奴が100万人も居るとは思えないのだが。
588デフォルトの名無しさん:2009/02/11(水) 11:09:56
そうか?
589デフォルトの名無しさん:2009/02/11(水) 21:34:14
車輪の再発明をしなくなったら、
世のプログラマは、みんな失業しちゃうよ

車輪の再発明だとバレてないから、仕事になる
590デフォルトの名無しさん:2009/02/11(水) 22:14:56
既成の車輪を持っていくと、
ホイールの太さが気に入らないとか
うちで使ってる三輪車にはつけられないのかとか、
そんなお客が多いんです。
591デフォルトの名無しさん:2009/02/11(水) 22:55:48
車輪の再発明がどうとかもうどうでも良いじゃん。
ここは2chだぜ!?
真摯に議論してどーすんのさ
592デフォルトの名無しさん:2009/02/11(水) 23:12:14
車輪の再発明がどうとか言う奴は、既存のコードのコピペしかできない糞コーダーだからいらね
593デフォルトの名無しさん:2009/02/11(水) 23:49:35
独習デザインパターンC++は役に立った
594デフォルトの名無しさん:2009/02/12(木) 01:02:43
冬休み暇なんで何かしようと思うんですが、「30日でできる! OS自作入門」って
プログラミングの勉強になりますか?
595デフォルトの名無しさん:2009/02/12(木) 01:15:05
なにをすればいいか聞かなきゃならないレベルなのだろうから
なんでも勉強になるよ。

すぐOS作れ。
596デフォルトの名無しさん:2009/02/12(木) 02:23:21
車輪の再発明が良くないのは周知のとおりだが、今回のは車輪ですらないから突っ込まれたんでしょ
597デフォルトの名無しさん:2009/02/12(木) 11:48:34
ちょっと質問なんだけど、インクルードガードを使うか
#pragma once を使うか、どっちがいいのかな?
598デフォルトの名無しさん:2009/02/12(木) 12:00:02
従来は環境依存の#pragma onceは避けるべきといわれており、インクルードガードが推奨されていた。
しかし最近は多くのコンパイラが#pragma onceに対応してるっぽいので、気にせず使ってしまう手もある。

インクルードガードはマクロを使うため、名前の衝突のリスクが一応ある。
(インクルードガードに使うのと同じ名前のマクロが偶然、他の箇所でも定義されていたら……)

一部のコンパイラは、#pragma onceを使ったほうがコンパイルが速くなる。
(2度目以降、わざわざマクロとかの処理をせず、単純にヘッダファイルを読まなくなるため。)
しかし別のコンパイラには、インクルードガードを適切に認識して同様の最適化を行うものもある。
599デフォルトの名無しさん:2009/02/12(木) 12:22:27
詳しい説明ありがとう
基本#pragma 使ってコンパイラが対応してなかったらマクロにしてみる
600デフォルトの名無しさん:2009/02/12(木) 13:04:17
さらに今は、#pragma onceでは同じファイルを指すパスが
複数あるとダメなので、結局インクルードガードが推奨されてきている
601デフォルトの名無しさん:2009/02/12(木) 13:57:13
識別子にUUIDでも使えば衝突の可能性は減るんじゃないか?
602デフォルトの名無しさん:2009/02/12(木) 17:07:54
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
603デフォルトの名無しさん:2009/02/12(木) 20:39:10
#ifndef org.hogehoge.fugafuga.lib.superutility.specialstringconcat
#define org.hogehoge.fugafuga.lib.superutility.specialstringconcat
604デフォルトの名無しさん:2009/02/12(木) 22:37:59
質問です。
プログラムを使って、起動中のSkypeを強制終了させ、再びSkypeを再起動させたいのですが
Skypeを強制終了->再起動のプログラムは書けましたが
実行するとタスクトレイにSkypeのアイコンが2つ表示された状態になってしまいます。
カーソルで強制終了したSkypeアイコンを触ればアイコンは消えるのですが
カーソル操作なしで本プログラムのみで強制終了したSkypeアイコンを消したいです。
方法が分かる方がいらっしゃったら教えて下さい。
605デフォルトの名無しさん:2009/02/12(木) 23:03:45
強制終了にどのような方法を用いたのか書きなさい
606デフォルトの名無しさん:2009/02/12(木) 23:04:22
>>604
これじゃだめ?

http://pc11.2ch.net/test/read.cgi/win/1217738171/220
> Windows版Skypeにコマンドラインは使えますか?
> はい、以下のコマンドが使えます。
> * /nosplash:Skype起動時にスプラッシュスクリーンをスキップ
> * /minimized :起動時にSkypeをシステムトレイに最小化
> * /callto:名前か電話番号:指定したスカイプ名またはSkypeOutの電話番号に通話発信
> * /shutdown:Skypeを終了
607デフォルトの名無しさん:2009/02/12(木) 23:05:53
>>604
ここはSkypeのスレか?
608デフォルトの名無しさん:2009/02/13(金) 00:00:43
>>606
Skype以外のアプリも強制終了->再起動したいので他に方法ありませんか?
Skypeはそれでとりあえずやってみます。
609デフォルトの名無しさん:2009/02/13(金) 00:40:32
強制終了したら消すタイミングが無いからな
トレーにリドローさせるのがいいかと
610デフォルトの名無しさん:2009/02/13(金) 00:44:07
SendMessage
611デフォルトの名無しさん:2009/02/13(金) 01:25:06
CでGUIアプリケーションを作ることはできるのでしょうか?
またそういったソフトはあるのでしょうか?
612デフォルトの名無しさん:2009/02/13(金) 01:33:09
613デフォルトの名無しさん:2009/02/13(金) 01:33:36
可能です
あります
614デフォルトの名無しさん:2009/02/13(金) 01:44:17
>>61ありがとうございます
615614:2009/02/13(金) 01:44:49
616赤西仁:2009/02/14(土) 16:40:32
200年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
617晒し:2009/02/14(土) 17:05:33
えーと 伏垢
> 209 名前:赤西仁[] 投稿日:2009/02/13(金) 22:47:36
> 1年間悩んでます。お力をお貸しください。
> 616 :赤西仁:2009/02/14(土) 16:40:32
> 200年間悩んでます。お力をお貸しください。

18時間が199年に相当するわけだから・・・・・・・
考え始めたきっかけは、昨日の晩飯のおかずか? もやしを大量に入れたのがいけなかったか?
618デフォルトの名無しさん:2009/02/14(土) 18:52:29
どう見ても偽者
619デフォルトの名無しさん:2009/02/14(土) 23:20:36
C/C++とアークザラッドUじゃ
あまりにもスレ違いじゃね?
620デフォルトの名無しさん:2009/02/14(土) 23:22:09
てかよく見たら他のスレにもコピペしてるのか。
もうおまえ死ねよ
621デフォルトの名無しさん:2009/02/14(土) 23:23:31
本当に初歩で申し訳ないのですが、
C++で画面を消すにはどうしたら良いのでしょうか?
622デフォルトの名無しさん:2009/02/14(土) 23:26:37
どういう状況?
画面ってのは、コマンドラインのことじゃないよね?
623デフォルトの名無しさん:2009/02/14(土) 23:29:27
いえ、コマンドラインです。
clear();を試してみたのですが、エラーが出ちゃって
624デフォルトの名無しさん:2009/02/14(土) 23:32:09
コマンドプロンプトから実行ファイルを起動したの?
それとも、ダブルクリックで実行ファイルを起動したらそいつがコマンドプロンプトを開いたの?
(後者の場合は普通に閉じるよね?)
625デフォルトの名無しさん:2009/02/14(土) 23:35:16
すみません。完全に言葉が足りてませんね。
VCで書いてたのですが、
画面をクリアする関数が分からないのです。
626デフォルトの名無しさん:2009/02/14(土) 23:42:40
ごめn
俺にはわからね
だれか分かる方plz
627デフォルトの名無しさん:2009/02/14(土) 23:45:02
ご回答ありがとうございました。
なんとか試行錯誤してやってみます。
628デフォルトの名無しさん:2009/02/14(土) 23:47:38
だれか知ってるヤツいるんじゃね?
一晩待とう
629デフォルトの名無しさん:2009/02/14(土) 23:48:49
はい、VC弄りながら待ってます。
630デフォルトの名無しさん:2009/02/14(土) 23:50:48
キモイ
631デフォルトの名無しさん:2009/02/15(日) 00:05:15
> C++で画面を消すにはどうしたら良いのでしょうか?
画面をクリアするんなら、stdlibのsystem使って、

system("cls"); // 画面のクリア(clear screenかな)

コンソールゲームなら、'\r','\b'と共に、再描画とかに使う。
それとも、ウィンドウそのものを消すことが目的なの?
632デフォルトの名無しさん:2009/02/15(日) 00:10:50
なにがしたいのかも判らない状況だよな。
モニタの電源切りたいのか
ウィンドウを閉じたいのか最小化したいのか
コマンドプロンプト上に表示されている文字を消したいのか。

プログラマはいちいち細かいといわれるゆえんだが、選択肢がたくさんあって
超能力で相手の気持ちを読み取るプログラムも作れないのだから仕方のない話。
633デフォルトの名無しさん:2009/02/15(日) 00:21:36
>>631
system("cls");というのを使ってみたらできました。
有り難う御座いました。

>>632
すみませんでした
634デフォルトの名無しさん:2009/02/15(日) 01:05:05
いや、たんに考え方を伝えたかっただけなので誤られても。
回答したのも別の人だしね。
635631:2009/02/15(日) 02:10:06
自分は今まで、system("cls");多用だけでうまくいったのですが、
問1 systemの有用な使い方ってある? "ls"(dir)使ったり何したりと。(cdでカレントは動かなかったっぽい)
問2 エスケープシーケンスで色変えとかって、やっぱwinでは使えない代物?
問3 system使わないで、c言語内部で画面をクリアすることは可能?
636デフォルトの名無しさん:2009/02/15(日) 02:29:27
C/C++の固有の機能としてはなかったはず。
というわけで、その辺の話題はスレ違い気味ではなかろうか。
と思ったけどWindowsコンソールプログラミングの話ができるスレは無いみたいだな。
637デフォルトの名無しさん:2009/02/15(日) 03:47:57
環境依存スレとかWinAPIスレとか。

ダム端末以外の端末操作は言語仕様だけでは何もできないから、適宜必要なライブラリを使うことになる。
例えばsystem("cls")もOSに依存しているし、コンソールAPIも同じこと。

>>631
問1:
cdでカレントは動かないのではなくて、system()で起動したコマンドインタプリタで移動するだけだから
呼び出したプログラムに反映されないと言うこと。
system()のメリットは、比較的容易に他のアプリケーションを起動できるってことくらい。
木目細かい制御が必要なら、APIが必要になってくる。

問2:
コンソールAPIでできると思うが、エスケープシーケンスはデバイスドライバを組み込んでおく必要があるんじゃないだろうか。

問3:
繰り返しになるが、環境に依存しないでシンプルにやることはほぼ無理。汚い方法としては、100行くらい空行出力するくらいか。
638デフォルトの名無しさん:2009/02/15(日) 10:59:40
回答1,2,3にしろよ紛らわしい
639デフォルトの名無しさん:2009/02/15(日) 12:08:49
>>100行くらい空行出力するくらいか。
そう来たかwwww
640デフォルトの名無しさん:2009/02/15(日) 12:13:12
って、文字の多いところで、連続改行すると、どれくらい遅いか知ってるか
わずらわしす。あと、入力が最下段からになってしまうのも、
下手なコードだと、ゲームにはなってても、目を上下動かす必要がある。あbcでfgひあbcでfgひ
641デフォルトの名無しさん:2009/02/15(日) 12:20:06
>>640
そうなのか。知らんかった。
642デフォルトの名無しさん:2009/02/15(日) 13:32:31
それがいやなら環境に依存するコードを書けばいい。
643デフォルトの名無しさん:2009/02/15(日) 13:55:05
まぁすでに環境依存だけどな
644デフォルトの名無しさん:2009/02/15(日) 13:57:56
どうせならもうムッチャクチャ環境依存に。
645デフォルトの名無しさん:2009/02/15(日) 17:16:51
VC++2008で、folderBrowserDialogってどうやって使うんだっけな
ググっても思い出せれん。。。。
646デフォルトの名無しさん:2009/02/15(日) 17:29:19
あれユーザからするとひどく使いづらいからもう廃止して欲しいな。
647デフォルトの名無しさん:2009/02/15(日) 17:35:56
「思い出せれん」?
648デフォルトの名無しさん:2009/02/15(日) 17:37:37
ぶっちゃけいうと忘れました
649デフォルトの名無しさん:2009/02/15(日) 18:08:45
void Swaps(char *src, char *dst, int size)
{
int lp = size;
char tmp;
while(lp--) {
tmp = *(src + lp -1);
*(src + lp - 1) = *(dst + lp - 1);
*(dst + lp - 1) = tmp;
}
}

srcメモリとdstメモリの領域範囲size分、charデータを入れ替えたいと思います。
パフォーマンス的にこれ以上速くする方法はありますでしょうか?
C/C++どちらでもいいです。
650デフォルトの名無しさん:2009/02/15(日) 18:12:38
>>649
まとめて読んでからまとめて書く
651デフォルトの名無しさん:2009/02/15(日) 18:15:38
cスタイルのキャストってあるじゃん。
あれはプロのC++プログラマはもう全然使わないものなの?
多少打ち込むのが面倒でもC++スタイルのキャスト(static_cast等)でコーディングすべき?
652デフォルトの名無しさん:2009/02/15(日) 18:17:10
エディタの機能に頼るべき
653デフォルトの名無しさん:2009/02/15(日) 18:19:50
scasって打てばstatic_cast<>()って展開されるスニペットとか使うんですねわかります
654デフォルトの名無しさん:2009/02/15(日) 18:33:30
>>651
うん。何のためのキャストか明確だし、継承関係になくて明らかに変換できない場合はエラーになるから。
655デフォルトの名無しさん:2009/02/15(日) 18:42:37
>>649
うーん、x86だとしたらわざわざ手間を掛けて遅くなりそうで
読み難いだけのコードな気がするなぁ。

先ず最初に「普通に読み易い関数」を作るべき。
void Swaps(char *src, char *dst, int size)
{
for (int ic = 0; ic < size; ++ic) {
char tmp = src[ic];
src[ic] = dst[ic];
dst[ic] = tmp;
}
}
こいつを、条件を設定して実測してみて充分納得してから
高速化に取り掛かった方が結果として近道だと思う。
なんせ今のコンパイラは激しく強力だし、今のCPUは
激しくメモリ配置に依存するから。
例えばrestrictの意味を適切に考慮してくれるコンパイラなら、
それだけで速くなるかもしれない。
また、sizeが小さめなら作業領域をchar一個ではなく
size分丸々取ってしまった方がいいかもしれない。
# 大きいなら「適当に」取るという手もあることだし。

最初に戻って、凝って逆方向アクセスにしてみたんだろうが、
それによるwhileの条件判定のコスト削減よりも順方向じゃないことによる
コンパイラの最適化の妨げやCPUのキャッシュの利用効率を阻害する
可能性のほうが高いよ。
656651:2009/02/15(日) 19:13:42
ありがとう。
じゃあ俺もそうしよう。
せっかく導入されている機能なんだし、使わなきゃね。
657649:2009/02/15(日) 19:19:13
> 最初に戻って、凝って逆方向アクセスにしてみたんだろうが...
確かに遅くなってました。
for文よりもwhileの方が多少なりとも速くなるのかと自身の判断でした。

やっぱり入れ替え対象となる型をキャストして、まとめて処理を行う様にします。

658デフォルトの名無しさん:2009/02/15(日) 19:33:52
>>649
配列双方のswap後の使われ方を追ってみて可能ならばポインタ交換だけに留める。
部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2]
659649:2009/02/16(月) 00:11:39
>658
ポインタ自体の入れ替えだけでとどめる事は理解出来る。
それが出来れば、速くなる事も理解出来る。

> 部分配列 *s1(*d,len) *s2(*s,len) → *s1[*d0 *s1 *d2] *s2[*s0 *d1 *s2]
が、ここの言わんとする内容が高度過ぎて俺の安い頭では理解出来ない。
どなたか、もう少し噛み砕いて説明してくれない?
660デフォルトの名無しさん:2009/02/16(月) 00:30:06
連立方程式を解きたいのですがどのように記述すればよいのでしょうか?
661デフォルトの名無しさん:2009/02/16(月) 00:46:07
>>660
どのレベルの知識を求めているのか、よく分からんけど。やるだけならuBLASとかでできる。
ちゃんと知りたいなら数値計算と呼ばれる分野の参考書を読んでみるといい。
「他の言語ではできるけどC/C++でのやり方が分からん」というなら、それに沿っての助言はこのスレで出来る。
662デフォルトの名無しさん:2009/02/16(月) 00:46:51
ああ、>>661は連立一次方程式の話ね。
663デフォルトの名無しさん:2009/02/16(月) 00:52:08
簡単に言うと、
 { 2x + 3y = 5
 { x sin(x^2) + exp((x-u)^2/d) = 0
ってやつの解(not単一解)を導きたいのですね?
664デフォルトの名無しさん:2009/02/16(月) 00:53:03
それは簡単な方法は無い。
数値計算法の知識を使ってゴリゴリやるしかなさそう。
665デフォルトの名無しさん:2009/02/16(月) 00:54:40
説明不足ですみません
中学校で一番初めに習うような

2x + 3y = 5
5x + 2y = 10

こんなような連立方程式です(未知数の数は2つ固定)
666デフォルトの名無しさん:2009/02/16(月) 00:57:12
自分がどう解くか、その順番通りに処理を書けばいいだろ。
667デフォルトの名無しさん:2009/02/16(月) 01:01:06
>>665
それだったら、行列 (2,3; 5,2) の逆行列を 縦ベクトル (5;10) に掛ければいい。
行列式が-11だから、逆行列は -1/11 (2,-3; -5,2) だな。

この話が意味不明なら、高校数学の行列のところを学んでほしい。もしくは適当にググってほしい。
668デフォルトの名無しさん:2009/02/16(月) 01:07:13
>>667
ありがとう
なんとなくつかめてきました
669デフォルトの名無しさん:2009/02/16(月) 02:20:55
c言語で 750行ほどのプログラムを組んで、 visual c++ 2008 のコマンドプロンプト
でコンパイルして exe を起動しようとしたのですが、

Microsoft Windows ○○.exe は動作を停止しました

となってしまいます。
fatal error 、 error など何も出ていないため原因がわかりません。

プログラムが長いとエラーが出たりするんでしょうか?
思いつく理由だけでもいいので教えていただけないでしょうか?
670デフォルトの名無しさん:2009/02/16(月) 02:28:18
単にバグってるだけだろ
671デフォルトの名無しさん:2009/02/16(月) 02:48:57
ということはプログラムは長くてもエラーが起こったりはしないんですかね?

プログラム上のバグが原因ならとりあえず探してみます
教えていただきありがとうございます
672デフォルトの名無しさん:2009/02/16(月) 02:54:20
色々起動しすぎて重くなってるとかは?
673デフォルトの名無しさん:2009/02/16(月) 03:08:12
言われたとおりに余分なものを消したら一応そうならなかったんですが、

今度は 0x74696e69 でハンドルされていない例外が発生しました: 0xC0000005: Access violation

と表示されました
674デフォルトの名無しさん:2009/02/16(月) 03:41:28
それはアクセスしちゃいけないところにアクセスしようとしてる
ポインタとか配列使ってる辺りにバグがあるんじゃないの
675デフォルトの名無しさん:2009/02/16(月) 03:47:03
Visual C++ ならデバッグありで実行(F5)すれば
エラー出てるところ表示されない?
676デフォルトの名無しさん:2009/02/16(月) 03:47:34
ああ。コマンドプロンプトからか…。
677デフォルトの名無しさん:2009/02/16(月) 03:48:29
そうなんですか
面倒だけど、最初から確認してみます。

丁寧に教えてくださりありがとうございます。
また何か分からないことがありましたら質問させていただきます。
678デフォルトの名無しさん:2009/02/16(月) 10:22:58
日本語の配列の作り方がわからないのでお教え願います。
たとえば
はる、あき、なつ、ふゆ、さくら
というひらがなの配列を作りたいとき
char [6][7] = {"はる","あき","なつ","ふゆ","さくら"};
と宣言しているのですがgccでコンパイルしたときに
warning: initializer-string for array of chars is too long
という警告が出てしまいます。
どのようにすれば良いのでしょうか?
679678:2009/02/16(月) 10:24:03
sed 's/char /char foo/' 678
でお願いします。
680デフォルトの名無しさん:2009/02/16(月) 10:39:41
>>678
ソースの文字コードがUTF-8になってない?
"さくら"はUTF-8だと末端のヌル文字を含めて10バイトだよ。
681678:2009/02/16(月) 10:42:45
>>680
ありがとう御座います。
実は例題用にだした適当な配列だったのでできれば
UTF-8でのバイト数の計算方法を教えて頂けると幸いです。
682678:2009/02/16(月) 10:45:33
自決しました。
一文字が3または4バイトなんですね.
683デフォルトの名無しさん:2009/02/16(月) 11:12:45
自決しちゃったのかよ!
684デフォルトの名無しさん:2009/02/16(月) 15:14:10
自決フイタwwww
685デフォルトの名無しさん: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;
}
ただ、関数一つで十分なのですが・・・・なんとなく。
686デフォルトの名無しさん:2009/02/16(月) 16:42:42
>>685
なんというひどいコードだ。

>#define jp(STRING) array[ch(STRING)]
ローカル変数を参照するマクロ・・・最悪。

>enum{HARU,NATU,AKI,FUYU,SAKURA,GRA,NAMEOVER};
使われていない宣言。

>const char* jpname[NAMEOVER] = {"はる" , "夏" , "あき" , "冬" , "さくら" , "ごるぁ"};
>int ch(const char * str){
このソース内でしか使わないんだからstaticをつけろ。

>  for(int i = 0;i<NAMEOVER;i++) if(strcmp(str,jpname[i])) return i; exit(1);
バグってるし。if(!strcmp())だろ。
さらに、for()の行と同じ行に次のexit()を書くなんて嫌がらせとしか思えない。

>sprintf(jp("はる") , "はるのるららの〜");
ここも意味をなしてない。strcpyとでもしたかったのか?

687デフォルトの名無しさん:2009/02/16(月) 16:53:54
>>686
>このソース内でしか使わないんだからstaticをつけろ。
C++かもしれないじゃないか!
688デフォルトの名無しさん:2009/02/16(月) 16:56:23
>>687
???
689デフォルトの名無しさん:2009/02/16(月) 17:14:04
>>686
ひどいコードってのは同意

>使われていない宣言。
NAMEOVERは激しく使われてるが? (defineでOK)

>このソース内でしか使わないんだからstaticをつけろ。
こんなネタソースが、これ以上大きくなるわけないだろ

>ここも意味をなしてない。strcpyとでもしたかったのか?
printf("Hello World!\n); は、意味を成していない。putsとでもしたかったのか?
という意味?
690デフォルトの名無しさん:2009/02/16(月) 17:15:31
>>688
C++ と C で const つけたグローバル変数のリンケージ違うじゃん
691デフォルトの名無しさん:2009/02/16(月) 17:16:07
覚えたてでいろいろ添削したくなる年頃なんですよw
692デフォルトの名無しさん:2009/02/16(月) 17:19:39
>>689
sprintf(U, V); っておかしいだろ。(U, Vはともにchar*)
動かないわけじゃないけど、こういうコードを見ると、「ん?何か意味があるのか?」って考えてしまう。
strcpy(U, V); とするべきだ。

693デフォルトの名無しさん:2009/02/16(月) 17:22:41
#include <map>
#include <iostream>

int main()
{
std::map<std::string, std::string> array;
array["はる"] = "はるのるららの〜";
std::cout << array["はる"] << std::endl;
return 0;
}
694デフォルトの名無しさん:2009/02/16(月) 17:35:13
stringもincludeしようぜ
695デフォルトの名無しさん:2009/02/16(月) 17:42:00
わすれてたw
696デフォルトの名無しさん:2009/02/16(月) 17:54:28
当方、今現在Cの用語を覚えて簡単なプログラムを書く練習をしているレベルの者なんですが、
・Runge-Kutta法のプログラムの(ソースの)例
・gnuplot(導入済み)の使い方
の二つが分かる参考書が入用なのです(本当は今これを使えるレベルじゃなきゃいけない……)。情報をお願いします!
697デフォルトの名無しさん:2009/02/16(月) 17:59:37
ルンゲクッタとは懐かしい
Numerical Recipes in Cには乗っているよ
他の本にも載っているから、数値計算の本にはどれでも載ってると思う
gnuplotはwebか周りに聞いたほうがいい。本はいらない
698696:2009/02/16(月) 18:25:59
>697ありがとうございます。明日にでも本屋にあたってみます。
699696:2009/02/16(月) 18:36:54
連投失礼します。当方二重振り子の運動の概算値をルンゲクッタ法で求め、gnuplotで表示しなければなりません。
当方のスキルが低いため、助言を他にもいただけたならありがたいです(苦笑w)。
700デフォルトの名無しさん:2009/02/16(月) 18:40:01
>>699
素直に宿題スレ行け
701デフォルトの名無しさん:2009/02/16(月) 18:42:57
>700把握
702697:2009/02/16(月) 18:58:14
二重振り子ならルンゲクッタとかよりもsymplectic integratorとかを使った方が良いかも
2次ならテイラー展開+オイラーを解くだけなんで…と思ったけど難しいな
まあ、いい加減スレ違いっぽいんでこのへんで
宿題スレとか推奨書籍スレにも常駐しているんでそっちで聞いてくださいな
703デフォルトの名無しさん:2009/02/16(月) 19:05:41
>>699
松田先生のページ見れなくなっちゃったし・・・
704デフォルトの名無しさん:2009/02/16(月) 19:12:47
705699:2009/02/17(火) 13:48:36
>704 神支援サンクス!
706デフォルトの名無しさん:2009/02/18(水) 00:31:46
この課題…ちょっと前に見たな
宿題スレでボコボコにされてた人は結局どうなったんだろうか
707デフォルトの名無しさん:2009/02/19(木) 02:18:51
int a[3];
a[5]=0;

のように、添字の範囲外でもビルド時にエラーが出ませんが、
こういったエラーを知る方法が無いでしょうか?
708デフォルトの名無しさん:2009/02/19(木) 02:49:14
C#を使う
709デフォルトの名無しさん:2009/02/19(木) 02:52:20
配列すべてマクロ作って、
#define A(index) if( index > sizeof(a) ) printf("a error (%d,%d)",index,__LINE__); a[index]
で、デバッグとか? ゲロゲロコードだろ? やめとけ。
710デフォルトの名無しさん:2009/02/19(木) 03:02:41
高価なツールだとそういうのを検出する機能を備えたものもあると思う。
711デフォルトの名無しさん:2009/02/19(木) 03:40:31
vectorでatをつかえ
712デフォルトの名無しさん:2009/02/19(木) 11:01:37
大概のコンパイラにはデバッグモードの STL があって
デバッグモードなら operator [] を使ってても
ちゃんと範囲外エラー(もしくは警告)を出してくれる。

C を使っているならあきらめるしか。
っていうか、超プログラマの責任だし。
713デフォルトの名無しさん:2009/02/19(木) 12:58:48
gcc -fmudflapやcl /analyzeで検出できないか?
714デフォルトの名無しさん:2009/02/19(木) 12:59:36
>>709
>>配列すべてマクロ作って、
#define A(index) if(index>sizeof(a))printf("aerror(%d,%d)",index,__LINE__);a[index]
初めて知ったわ!へー、そうなんだ。
こういうアイディアって面白いよね。使う気はしないけど。
715デフォルトの名無しさん:2009/02/19(木) 15:05:07
>>713
libmudflapって言うのか?
使ったことない。
っていうか、セットアップの方法さえ・・・
716デフォルトの名無しさん:2009/02/19(木) 18:53:32
class 設計でちと聞きたいんだが、内部でメンバの型をtypedef したい場合はやっぱりpublic にすべきだよね?

class SomeThing
{
public:
typedef int value_type;
...
private:
value_type value_;
};
717デフォルトの名無しさん:2009/02/19(木) 19:04:20
SomeThing::value_typeをクラスの外側で絶対使わないっていうならprivateでもいいけど
<functional>ヘッダとかで見るとすべてpublicで宣言してる
718デフォルトの名無しさん:2009/02/19(木) 21:18:46
typedefとかってマクロだよね?
クラスの内部で宣言したからと言ってアクセス指定子の影響って受けるの?
719デフォルトの名無しさん:2009/02/19(木) 21:22:01
>>718
typedefをマクロと言うなら変数だって関数だって定義は全部マクロだろ。
720デフォルトの名無しさん:2009/02/19(木) 22:07:10
>>718
private部分にtypedefしてみ?
んで、他の関数とかで定義したT::value_typeの型宣言してみ?
偉大なるコンパイラさんがめっちゃ怒るよ
あとtypedefはマクロじゃなくて同義語の定義なんだぜ
721718:2009/02/20(金) 19:11:25
typedefは#defineみたいなプリプロセッサの1つなのかと思ってた。
全然違ったのか。
ありがとう。
722デフォルトの名無しさん:2009/02/21(土) 13:42:31
(BYTE**)&hensuu
ってどういう意味だっけ?
723デフォルトの名無しさん:2009/02/21(土) 14:15:51
BYTEというクラスのポインタへのポインタにhensuuという変数のアドレスをキャストする
って意味
724デフォルトの名無しさん:2009/02/21(土) 14:53:47
クラス?
725デフォルトの名無しさん:2009/02/21(土) 14:56:07
キャストをビットマスク的な意味で使うこともあるから混乱するんだよなー
同音異義語みたいなややこしさがある
726デフォルトの名無しさん:2009/02/21(土) 14:58:26
>>723
d
なんとなくわかりました
727デフォルトの名無しさん:2009/02/22(日) 22:10:02
vector<bool>
ってなんか嫌われているの?
問題点はC++0xで直る?
728デフォルトの名無しさん:2009/02/22(日) 22:24:06
Effective STL読むとわかるけど
vector< bool > はコンテナの用件を満たしていない。
にもかかわらずSTLに残されているのは過去への戒めだそうな。
729デフォルトの名無しさん:2009/02/22(日) 23:20:55
>>728
なるほど。
boolを1ビット扱いにしてメモリを節約しました的なことですよね。
もうC++0xで直せば良いのに。戒めとは。
730デフォルトの名無しさん:2009/02/22(日) 23:31:39
例によって、互換性のために直せないのではないだろうか?
どんな問題があるのか素人の自分には思い付かないが。
731デフォルトの名無しさん:2009/02/22(日) 23:42:05
vector<bool>は無くなるんじゃなかったっけ?非推奨なだけかな?
732デフォルトの名無しさん:2009/02/22(日) 23:43:58
>>730
ちょっといろいろ見てみたが、俺にも思いつかない。
まあ確かに互換性の維持は大事だな。うん。
…でもC++とC++0xは別の言語だぜ!的なスタンスでもいいじゃんか。
せめて3態Boolean(tribool)を追加し、vector<tribool>はコンテナの用件を満たすようにするとか。これなら互換性も問題ない!
733デフォルトの名無しさん:2009/02/23(月) 07:39:24
asm(nop) の文って何をやっているのでしょうか?
cなら基本的にasmというのは使えるのでしょうか
734デフォルトの名無しさん:2009/02/23(月) 10:34:29
処理系依存
nopはno operationの意味で何もしない
735デフォルトの名無しさん:2009/02/23(月) 12:20:58
>>733
最適化on時にブレークポインタかけたいときに使ってるな。
736733:2009/02/23(月) 21:25:18
>>734
処理系というのは、プログラム実行環境ということでしょうか?
使えない環境もあると。nopってのは別にnopって書く必要はないけど
それが一般的によくかかれるようになってるということでしょうか?

>>735
これでどうやって最適化on?するのでしょうか?
737デフォルトの名無しさん:2009/02/23(月) 21:29:22
処理系ってのはコンパイラのこと
nopはCPUの命令の一つ(何もしない命令)
最適化してもasm文は消えないからブレークポイントを置ける
738デフォルトの名無しさん:2009/02/23(月) 21:34:13
windowsで使用できるメモリアドレス空間の範囲ってどうすれば分かりますか?
プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
739デフォルトの名無しさん:2009/02/23(月) 21:38:13
自分でコンパイラやリンカでも作っているのか?
740デフォルトの名無しさん:2009/02/23(月) 21:49:52
741デフォルトの名無しさん:2009/02/23(月) 22:09:16
>>738
マルチ死ねよ
742デフォルトの名無しさん:2009/02/23(月) 22:12:31
>>737
ブレークポイント置く意味ってデバッグのためでしょうか?
nop自体はどんなCpuでも理解できる命令で、asmもそうなのかな
ただ、コンパイラするときにasmを認識しないものがあると
743デフォルトの名無しさん:2009/02/23(月) 22:19:02
asmはassemblerのasm
nopはx86系の命令だが、他のcpuでも同じかも
どっちにしても、asmはcpuの命令を直接書くためにあるし、当然cpuごとに内容は変わる
744デフォルトの名無しさん:2009/02/23(月) 22:27:22
何もしない命令でブレークポイントを置くが謎ですね・・・
745デフォルトの名無しさん:2009/02/23(月) 22:27:37
DWORD WINAPI OutputToSocket(Lunatia lpvoid)
{
LuDATA pthData = (LuDATA)lpvoid;

DWORD dwLen;
char szBuf[1024];
while(pthData->bThreadFlag){
Sleep(100);
BOOL bret = ReadFile(pthData->fd_write,
&szBuf, sizeof(szBuf), &dwLen, NULL);
if(bret == FALSE)
continue;
if(dwLen > 0)
send(pthData->sock, szBuf, dwLen, 0);
}
return 0;
}

このコードはどういう動作をするのでしょうか?
746デフォルトの名無しさん:2009/02/23(月) 22:27:59
ブレークポイントを置くのはデバッグのため以外にないだろう
747デフォルトの名無しさん:2009/02/23(月) 22:31:07
デバッグしたあとは、そのプログラムの部分だけを取り除くのでしょうか?
ていうか、別にnop使わなくてもデバッグできるのでは?
748デフォルトの名無しさん:2009/02/23(月) 22:31:21
>>745
受信したらその内容をそのままどっか送ってんだろう
749デフォルトの名無しさん:2009/02/23(月) 22:32:11
>>747
最適化で無くなってたらとまらないだろう
3歩歩くと忘れるニワトリかよ
750デフォルトの名無しさん:2009/02/23(月) 22:34:45
>>748
そうなんですか、ありがとうございます
とあるネットゲームのチートらしいのですが…なんかガセのようですね
751デフォルトの名無しさん:2009/02/23(月) 22:39:33
>>749
でも空命令なら最適化されてもいいのでは?
ただ、この分岐をとおっているかどうかとかで判断するためにいれるとかでしょうか?
752デフォルトの名無しさん:2009/02/23(月) 22:46:05
753デフォルトの名無しさん:2009/02/23(月) 23:13:14
つまりどういうことでしょうか?
754デフォルトの名無しさん:2009/02/23(月) 23:20:05
C++で二次元配列のポインタを関数に渡すのは無理でしょうか?
後、メンバ関数を同じクラスのメンバ関数内で使うことはできますか?
両者返答と合わせて多少解説を付けてくれると助かります
755デフォルトの名無しさん:2009/02/23(月) 23:33:54
>>754
前半
void proc(T (*array)[4][4]) { /* (*array)[0][0] などとアクセス */ }

後半
スタティックなメンバ関数からスタティックでないメンバ関数を呼ぶことはできないが、それ以外は可能
756デフォルトの名無しさん:2009/02/23(月) 23:34:05
>>754
二つともできる。
解説って「できる」以上になんかあるか?
757デフォルトの名無しさん:2009/02/23(月) 23:41:21
>>755 ありがとうございます!助かります
>>756 方法や注意点を等なにかあれば書いてくださいってことです
     言葉足らずですいませんでした
758デフォルトの名無しさん:2009/02/23(月) 23:46:16
windowsで使用できるメモリアドレス空間の範囲ってどうすれば分かりますか?
プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね

759デフォルトの名無しさん:2009/02/23(月) 23:51:17
長さが決まってない2次元配列は渡せないとか
760デフォルトの名無しさん:2009/02/24(火) 00:11:52
>>758
普通はコンパイラその他がよろしくやってくれるのだから、
なんでそういうことをやりたいのか詳しく書いてくれないと答えようがない。
761デフォルトの名無しさん:2009/02/24(火) 00:15:07
アドレスを振る必要がある場合があります
762デフォルトの名無しさん:2009/02/24(火) 00:17:20
>>758
ひじょうに大雑把に言って、32ビット版Windowsの場合0x0〜0x7fffffffぐらい。

ふつう、アセンブラで書くときでさえ、プログラムを書いた人が「変数
にアドレスを振る」なんてことはしない。何か特殊なことをしようとし
ているぞ。
763デフォルトの名無しさん:2009/02/24(火) 00:25:17
あ、質問の仕方がおかしかったぽいかな
windowsがosとかつかって使用するメモリ領域が0x7fffffffくらいということでしょうか?
空き領域にアドレス振らないと動かないですもんね

でも、実際0x7fffffffまでどったらほとんど空き領域ないですよね
0x07ffffff くらいじゃないでしょうか?
764デフォルトの名無しさん:2009/02/24(火) 00:36:07
カーネルは0x80000000-0xFFFFFFFFを使う。
0-0x7FFFFFFFがアプリ用だけど、
ここにもシステムDLLが読み込まれたり
0-0x7FFF(NTの場合)がぬるぽ検出用で予約されていたりして
実際使える分はもう少し少ない。

3GBモードとか64ビットだとまた違ってくるけど。
765デフォルトの名無しさん:2009/02/24(火) 00:39:50
いまだに763が何を言いたいのかさっぱりわからん
766デフォルトの名無しさん:2009/02/24(火) 00:45:08
>>764
でもその範囲あたりでも普通に使えるとこは使えました
767デフォルトの名無しさん:2009/02/24(火) 00:46:00
>あ、 質問の仕方 が おかしかった ぽい かな
>windows が os とか つかって 使用するメモリ領域 が 0x7fffffffくらい ということ でしょうか?
>空き領域 に アドレス 振らないと 動かない ですもんね

>でも、 実際 0x7fffffffまで どったら ほとんど 空き領域 ないですよね
>0x07ffffffくらい じゃないでしょうか?
768デフォルトの名無しさん:2009/02/24(火) 00:53:53
769デフォルトの名無しさん:2009/02/24(火) 00:56:22
>>766
「使う」って何だよ。どんなプログラムを書いて、何が疑問なのかもっと具体的に。

OSに要求してもらった領域以外は勝手に使ったらダメだぞ。

770デフォルトの名無しさん:2009/02/24(火) 00:59:20
変数を割り振るとしたら、osが実際他のアプリとかで使用してる領域はつかえませんよね
771デフォルトの名無しさん:2009/02/24(火) 01:02:13
だれが変数を割り振るの?
772デフォルトの名無しさん:2009/02/24(火) 01:05:14
変数のアドレスを指定して割り振るので自分でアドレスは割り振ります。指定したやつだけ。
その他はコンパイラが空いてるアドレスを適当に。
773デフォルトの名無しさん:2009/02/24(火) 01:06:42
>>770
プロセスごとにアドレス空間は独立しているから
他のアプリと衝突の心配なんて要らないぞ。
だからこそ仮想アドレスと言うくらいであって。
774デフォルトの名無しさん:2009/02/24(火) 01:06:55
何のために自分でアドレスを割り振るの?ハードウェア制御とか?
775デフォルトの名無しさん:2009/02/24(火) 01:07:44
>>772
C/C++で
char *p = (char*)0x70000000;
なんてことをしているってこと?
そんなこと、絶対にしてはいけないぞ。
776デフォルトの名無しさん:2009/02/24(火) 01:09:04
volatile char *p = (volatile char*)0x70000000;
777デフォルトの名無しさん:2009/02/24(火) 01:12:13
ハードウェア制御する奴がこんな質問はしないだろ…
778デフォルトの名無しさん:2009/02/24(火) 01:15:15
malloc()を知らないダケだったりして。
779デフォルトの名無しさん:2009/02/24(火) 01:16:51
どうやって割り振っているんだろう
780デフォルトの名無しさん:2009/02/24(火) 02:30:35
CreateThread関数で第三引数をクラスのメンバ関数にしたい場合はどういう記述をすればいいのでしょうか?
781デフォルトの名無しさん:2009/02/24(火) 04:25:05
>>780
例えば、クラスHogeのMemberFunctionを呼ぶとするなら、
次のような普通の関数(静的メンバでも可)を作って、これをCreateThreadに渡す。
ただし、CreateThreadの4つ目のvoid*の引数にHogeへのポインタを渡すこと。
(Hogeの中ならthisも可)

DWORD WINAPI ThreadEntry(void* p)
{
Hoge* pHoge = static_cast<Hoge*>(p);
return pHoge->MemberFunction();
}
782デフォルトの名無しさん:2009/02/24(火) 06:34:16
>>775
どうしてそれだとだめなのでしょうか?
783デフォルトの名無しさん:2009/02/24(火) 07:35:07
0x70000000にどこかの物理アドレスがマップされていて
その物理アドレスがアクセス可能であれば別にダメじゃないよ
784デフォルトの名無しさん:2009/02/24(火) 07:40:07
MS-DOS時代ならメモリ自由に使えたかもしれないが
785デフォルトの名無しさん:2009/02/24(火) 07:57:46
>>782
それがWindowsでのルールだから。(UNIXでも同じ)
たまたま使えるアドレスがあったとしても、それは他の目的でOSから割
り当てられた領域なので、使ってはダメ。

細かい理由とか書くと長くなるので、OSに関する本など読んで自分で調
べてくれ。
786デフォルトの名無しさん:2009/02/24(火) 08:07:46
>>783
マップする方法はどうすればよいのでしょうか?

>>785
>>783みたいなパターンなら可能なのかな
787デフォルトの名無しさん:2009/02/24(火) 08:23:16
>>786
特定のアドレスが必要なければ、malloc()やnewすればいい。
VirtualAlloc() で特定のアドレスを要求することもできるけど、普通は
そんなことする必要はない。

なんで特定のアドレスが必要なの?、という疑問に戻る。
788デフォルトの名無しさん:2009/02/24(火) 09:07:51
Embedded C++ の処理系ってあるんですか?
例外も名前空間もテンプレートも無いって……orz
789デフォルトの名無しさん:2009/02/24(火) 09:14:57
>>788
そんな猿が考えたモンキーC++なんて誰も使ってねーよ
790デフォルトの名無しさん:2009/02/24(火) 09:25:23
>>789
本当ですか?今は、どこの誰も使っていない?
サイトを調べても生きてるのか死んでるのかよく分かりませんし……。
それなら、Embedded C++ を考えなくて済むんですけど……。
正直、Embedded C++の事は考慮したくありませんよぅ。
だれか、公式に正式に Embedded C++ を破棄しないんでしょうか……。
791デフォルトの名無しさん:2009/02/24(火) 09:34:45
おーい通訳!
792デフォルトの名無しさん:2009/02/24(火) 11:08:24
通訳の必要は無い。
ただの愚痴だろ。
スルーしろ。
793デフォルトの名無しさん:2009/02/24(火) 17:54:21
class A{
public:
794デフォルトの名無しさん:2009/02/24(火) 18:17:24
>>793
ミスですorz

class A{
public:
int a;
int b;
};
class B:A{
public:
A *a[1][1];
void sam();
}
void B::sam(){
a[0][0]->a = 0;
}

例としてこのような形のaとbの要素を持つ配列a[1][1]を作って計算させようとしたところ
System.NullReferenceException' のハンドルされていない例外が発生しました。とでます
配列をポインタにしない場合で->を.に変えても処理の途中で同じようなエラーメッセージがでます
解決する方法はないでしょうか?
795デフォルトの名無しさん:2009/02/24(火) 18:20:32
A *a[1][1];
が領域確保されてないからだろう、コンストラクタで確保でもしたらいいだろう
そもそもなんでポインタにしてんの?
796デフォルトの名無しさん:2009/02/24(火) 18:21:46
>>794
記入忘れがありました
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
とエラーメッセージに記載されてます
797デフォルトの名無しさん:2009/02/24(火) 18:25:24
>>795
わかりましたやってみます
ポインタにした理由はいろいろ経緯があって後々便利かなと思ったんです・・・
798デフォルトの名無しさん:2009/02/24(火) 21:15:05
void main(){

int a = 15;
int map[a][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

}

なぜか実行できません。
エラー内容1:定数式が必要です。
エラー内容2:サイズが 0 の配列を割り当てまたは宣言しようとしました。
配列の要素数に変数を使うにはどうすればよいのでしょうか?
799デフォルトの名無しさん:2009/02/24(火) 21:30:13
>>798
C言語ならC99対応にする
C++なら a にconst つければ通る
800デフォルトの名無しさん:2009/02/24(火) 21:52:31
DLLの動的リンクがうまくいきません。
WinXP SP2+VC2008
---DLL作成プロジェクト---
[ファイル]→[新規作成]→[プロジェクト]→[Win32プロジェクト]
プロジェクト名 : DLL_TEST
アプリケーションの種類:DLL
共通ヘッダー ファイルを追加: MFC
-DLL_TEST.cpp 追記-
DLL_TEST_API int fnDLL_TEST(void){
return 1;
}
// DLL_TEST.h
//#define DLL_TEST_API extern "C" __declspec(dllexport)
//DLL_TEST_API int fnDLL_TEST(void);
------------------------
呼び出し側 Win32 コンソールアプリ
int _tmain(int argc, _TCHAR* argv[]){
HINSTANCE lib;
void *lpHr;
lib = LoadLibrary(_T("DLL_TEST.dllフルパス記入"));
if (lib == NULL){return -1;}
lpHr = (void *)GetProcAddress(lib,"fnDLL_TEST");
return 0;
}
----------------
GetProcAddress()の返り値がNULLとなってしまいます。
何が原因なのでしょうか?
801デフォルトの名無しさん:2009/02/24(火) 22:32:52
>>800
関数のシンボルが違ってるんじゃないか?DLLを確認してみれ
802デフォルトの名無しさん:2009/02/24(火) 22:58:53
>>800
1) GetLastError() の値を調べる
2) dumpbin /exports DLL名 でEXPORT関数名を確認する
803800:2009/02/24(火) 23:14:42
dumpbin /exportsで調べたら?fnDLL_TEST@@YAPA_WXZとなってました。

extern "C" を #define に含まず宣言に直接記述したらNULL以外を返すようになりました(なんで?)。

もうすこし色々試してみます。
どうもありがとうございました。
804デフォルトの名無しさん:2009/02/24(火) 23:49:25
コメントアウトしてるからじゃないの
805デフォルトの名無しさん:2009/02/25(水) 00:18:33
char *p = (char*)0x70000000;

これってなんでだめなのでしょうか?
806デフォルトの名無しさん:2009/02/25(水) 00:24:25
メモリはOSが管理するものだから

メモリ空間が4Gあっても実際にアプリで使える領域はOSが割り当てた一部のみ
勝手に任意のアドレスをポインタに代入してアクセスしようとしてもエラーになるだけ
807デフォルトの名無しさん:2009/02/25(水) 00:25:40
>>805
その領域が使用されていない&これからも未来永劫使用されないという保証がないから。
…というかそのくらいは初心者向けサイトで学ぶはずでは。
808デフォルトの名無しさん:2009/02/25(水) 00:25:55
volatile char *p = (volatile char*)0x70000000;

こんな風にすると大丈夫なのでしょうか?
809デフォルトの名無しさん:2009/02/25(水) 00:27:20
ダメ
810デフォルトの名無しさん:2009/02/25(水) 00:29:19
>>808
そんなコードをまともにかけるのはよっぽどすごい人だけ。一般のプログラマがそんなコードを使うシチュエーションはない。
volatileってなんだか知ってるのか?
まず猫のページとかいろいろ熟読した方が良いのでは。。。
811デフォルトの名無しさん:2009/02/25(水) 00:30:05
>>808
いいよ。
0x70000000にアクセス可能な物理アドレスがマップされていれば。
812デフォルトの名無しさん:2009/02/25(水) 00:30:54
>>811
いじめるなよwww
813デフォルトの名無しさん:2009/02/25(水) 00:31:10
>>811
逆にマップされていても
そのVOLATAILEをつけないとだめってことでしょうか?
814デフォルトの名無しさん:2009/02/25(水) 00:35:13
volatileは関係なく
0x70000000という定数をアドレスに変換してるのが根本的におかしい
これは基礎中の基礎なので、初心者向けのポインタの入門書をじっくりよんで
でなおすべき
ここで聞いて、2-3行の答えをもらって理解できるものでない
815デフォルトの名無しさん:2009/02/25(水) 00:35:51
>>813
CPUとは別のデバイスがそのアドレスを変更する可能性がある時に付ける必要があるよ。
コンパイラはCPUが変更しないと思ったら最適化で消しちゃうから。それが抑止される。
816デフォルトの名無しさん:2009/02/25(水) 00:37:43
>>811
アドレスとポインタについて相当勉強しない限り
C/C++でプログラミングがまともにできないまま。
>>815
この質問者がそんなハイレベルな話をしていると思うのか?
無駄に上の知識を与えると基礎がおかしくなる。
817デフォルトの名無しさん:2009/02/25(水) 00:41:44
>>816
かなり下位レベルの話をしてるよ。
デバイス制御するなら必要な知識でしょ。
818デフォルトの名無しさん:2009/02/25(水) 00:43:43
せっかくだから俺も質問するけど
何らかの特殊な理由がある人は、直接アドレスを指定して読み書きするようなコードを書くことも普通にあるわけ?
よく知らんけど、組み込みとか? あとOS自体のソースとかで使うのかな?
819デフォルトの名無しさん:2009/02/25(水) 00:46:02
>>818
ARM開発キットとかのヘッダファイルみるとよくわかるよ。
820デフォルトの名無しさん:2009/02/25(水) 00:47:20
>>817
だからそれが意地悪なんだってば。
816(=俺)がハイレベル・ローレベルをそういった意味で使っていないであろうことは想像付くだろ。
質問者がデバイス制御するような人の質問に見えるのか?
>>818
デバドラとか。
821デフォルトの名無しさん:2009/02/25(水) 00:47:40
ピント外れてたらすいません。
char *p = (char *)0x70000000;とかは組み込み系の
メモリマップドI/Oの環境ならありえるんじゃないでショッカー
(SHの開発環境のHewとか?)
で、volatileで最適化を抑制するのは、例えば
メモリマップドI/O環境で、pにはアドレスが入ってる場合に
*p = 0x01;
として最適化されると、その後に*pを使わない限り最適化されて
無視されるからで、なんかわかんないけど、volatileつけるってわけじゃないかと
822デフォルトの名無しさん:2009/02/25(水) 00:51:28
>>821
正しいよ。
823デフォルトの名無しさん:2009/02/25(水) 00:51:56
>>819-820
ありがと。やっぱりあるみたいだね。

例の質問者は、初心者というよりは、そういう方面の背景を持った人なのかな?
と何となく思ったんだけど、そういうわけでもないのだろうか。
824デフォルトの名無しさん:2009/02/25(水) 00:52:05
>>763
>>772
>>775
>>782
この流れを読んで、皆どう解釈したのか。
825デフォルトの名無しさん:2009/02/25(水) 00:53:19
もういいじゃん
お前らちょっと気持ちを抑えようぜ。

当の本人が置いてけぼりになってるぞ。
8261/2:2009/02/25(水) 00:53:38
大量のファイルを読み込むプログラムが必要な状況です。
boost::threadを使って,ファイル読み込みと処理の部分をマルチスレッド化しようと思っていますが,うまくいきません。

大量のファイルを読み込み,最初の一行をvectorに読み込む場合,下のようなプログラムになると思うのですが,何がだめなのでしょうか?


boost::mutex state_guard;


class FileOpener {
public:
FileOpener(std::string file_name, std::vector<std::string> *first_lines) : file_name(file_name), first_lines(first_lines) {
};
virtual ~FileOpener(){};
void run() {
boost::mutex::scoped_lock lk(state_guard);
std::fstream member_csv(file_name.c_str(), std::ios::in);
std::string str;
getline(member_csv, str);
first_lines->push_back(str);
member_csv.close();
}
private:
std::string file_name;
std::vector<std::string> *first_lines;

};

8272/2:2009/02/25(水) 00:54:24

int main(int argc, char **argv)
{
boost::filesystem::path order_path = "./log/";
std::vector<std::string> first_lines;

boost::thread_group th_gp;
for (directory_iterator it = directory_iterator(order_path); it != directory_iterator(); ++it) {
// ここでファイル名と,一行目を格納するvectorを渡しております。
FileOpener f(it->string(), &first_lines);
th_gp.create_thread(boost::bind(&FileOpener::run, &f));
}

th_gp.join_all();

}
828デフォルトの名無しさん:2009/02/25(水) 00:56:08
>>821
ポインタによる書き込みはコンパイラが要/不要の判断できないので
通常最適化の対象にはならない
それはそれとして、
volatile char *p
はポインタがvolatileの対象になるだけなので意味がない
829デフォルトの名無しさん:2009/02/25(水) 01:06:03
>>826
ぱっと見た感じでは fの寿命が問題なんじゃねーの?
830826:2009/02/25(水) 01:08:28
>>829
なるほど,つまりforループを抜けた時点でスコープから外れてfが無効になるということですね
それを考慮してやり直して見ます
831826:2009/02/25(水) 01:11:53
classではなく普通の関数を渡すようにするとうまく動くようになりました
ありがとうございました
832デフォルトの名無しさん:2009/02/25(水) 01:25:44
自作のクラスHogeがあったとして、int型の引数を取るコンストラクタがある時、
Hoge(42)

static_cast<Hoge>(42)
は同じになる?
前者はコンストラクタが呼ばれるのだろうが、後者がどうなるのかわからん。
833デフォルトの名無しさん:2009/02/25(水) 01:51:04
>>828
> ポインタによる書き込みはコンパイラが要/不要の判断できないので
> 通常最適化の対象にはならない

それはコンパイラや最適化オプションによる。
とても「通常」と言えるような動作ではない。

> volatile char *p
> はポインタがvolatileの対象になるだけなので意味がない

これの違い分かってる?
volatile char * p;
char * volatile p;

こっちでもいいや。
const char * p;
char * const p;
834デフォルトの名無しさん:2009/02/25(水) 02:35:00
一応ハードを直接いじるような仕事しているけど、それでも
char *p = (char *)0x70000000;
みたいなことはしない。
それ専用の命令やらで、結局はほとんどOSに任せる
835デフォルトの名無しさん:2009/02/25(水) 02:41:25
まあ、おぜん立てされてたら苦労せんわな。
836デフォルトの名無しさん:2009/02/25(水) 10:40:26
>>832
同じだよ どちらも一時オブジェクトがコンストラクタによって生成される
837デフォルトの名無しさん:2009/02/25(水) 10:41:04
VirtualAllocでアドレス指定できるから、いろいろ試してみそ
838デフォルトの名無しさん:2009/02/25(水) 11:29:42
>>834
PSPとかDSのプログラムやってるとしょっちゅう使うよ
まあマクロで定義されてるのを使うだけなんだが
#define DMA0_SRC (*(vuint32*)0x040000B0)
#define DMA0_DEST (*(vuint32*)0x040000B4)
#define DMA0_CR (*(vuint32*)0x040000B8)
839デフォルトの名無しさん:2009/02/25(水) 12:02:44
>>833
この違いも書いておかなくちゃw
volatile char * p;
char volatile * p;
840デフォルトの名無しさん:2009/02/25(水) 13:09:45
>>836
そっか。ありがとう!
841デフォルトの名無しさん:2009/02/25(水) 18:25:04
標準C/C++で
int n=42;
while(--n)
{/*nの値を変えない処理*/}

int n=42;
while(n--)
{/*nの値を変えず、例外も投げず、breakもしない処理*/}
とで、
前者だと確実に41回のループ、後者だと確実に42回のループが行われると考えていいですか?
初級C言語Q&A(7)
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
この古いページの副作用に関するところを読むと、いろいろ不安になることが書いてあるんですけど。
古いからですか?
842デフォルトの名無しさん:2009/02/25(水) 18:26:43
すみません。
前者の
{/*nの値を変えない処理*/}
も、要するに
nの値を変えず、例外も投げず、breakもせず、他のプロセスからnの値が変わることもなく、gotoとかもしない
ということです。
843デフォルトの名無しさん:2009/02/25(水) 18:38:08
while(--n) printf("%d", n);
while(n--) printf("%d", n);
を実行してみりゃすぐわかんだろ
844デフォルトの名無しさん:2009/02/25(水) 18:39:42
>>843
わかります。
が、標準の仕様で保証されているのでしょうか?
Q 【a[i] = i++;】
 配列に0から始まる整数の値を入れたい。次のコードはなぜうまく動かないか。
int a[10];
int i = 0;

while (i < 10)
a[i] = i++;


i++ という式を実行すると、 i の値が変化します。このような振る舞いのことを副作用と呼びます。ある変数に対して副作用が生じるような式においては、他の箇所でその変数を参照することはできません。その結果は未定義とされています。
 この式の場合、 i は i++ の他に、配列 a の要素を指定するために参照されているため、その結果は未定義となるのです。

 K&Rの記述を読むと、上の結果は不定であると解釈できるような記述がありますが、ANSI Cの規格では、不定ではなく未定義の扱いとすることになっています。

(参考 comp.lang.c FAQ 3.1)
ってなっているんですよね。。。
845デフォルトの名無しさん:2009/02/25(水) 18:42:49
>>841-842
君の質問は、そのページに書かれているような副作用関連のトラブルの話とは無関係に見えるけど。

> 二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
  (例えば a = b++ * b++;)
> 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトをアクセスしている場合。
  (例えば a[i] = i++;)
に、動作は未定義である。それ以外の場合はとりあえず問題ない。
846デフォルトの名無しさん:2009/02/25(水) 18:44:09
というか、「i++ は常に危険」とか変な勘違いしてる気がする。文章をよく読んでね。
847デフォルトの名無しさん:2009/02/25(水) 18:56:56
不安なら
while(n){
n--;//か--n;でも
}
すれば?
試せばわかるだよ
848デフォルトの名無しさん:2009/02/25(水) 19:12:34
そんな疑問を持っていいようなレベルじゃねーよw
849デフォルトの名無しさん:2009/02/25(水) 19:27:47
みなさんありがとうございます。
よーーーーく頭を冷やして考え直してきます。
850デフォルトの名無しさん:2009/02/25(水) 20:23:36
このスレ読んでる人間は経験則以外Cの知識は持ってないから
厳密な言語仕様なんて答えられないんだ。

ゴメンね。
851デフォルトの名無しさん:2009/02/25(水) 20:25:48
>>841
その通りだよ。
852デフォルトの名無しさん:2009/02/25(水) 20:48:28
>>850
言語仕様なんて現実のコンパイラの挙動の前では、なんの役にも立たないからなあ
組んだ事の無いと、間抜けなコンパイラのセールスマンは、仕様どうこうを宣わって、遊んでられるかもしれんが。
853デフォルトの名無しさん:2009/02/25(水) 21:10:36
プログラマだとしたら最悪の思考だな。
即刻クビにしたい。
854デフォルトの名無しさん:2009/02/25(水) 21:13:29
>>852
お前って#pragma濫用するタイプだろw
855デフォルトの名無しさん:2009/02/25(水) 21:17:32
まぁ#pragma自体は標準だけどなw
856デフォルトの名無しさん:2009/02/25(水) 21:20:40
そう言って使いまくっちゃうんだよなww
わかるわかる

うちに来てる使えない派遣が正にそんな感じwww
857デフォルトの名無しさん:2009/02/25(水) 21:22:01
>>852
死ね
858デフォルトの名無しさん:2009/02/25(水) 21:22:55
と、何も作ったことのない無能どもが申しております
859デフォルトの名無しさん:2009/02/25(水) 21:23:31
>>854
VCじゃあるまいしw
860デフォルトの名無しさん:2009/02/25(水) 21:25:14
>>856
派遣にバカにされてる正社員乙
861デフォルトの名無しさん:2009/02/25(水) 21:27:48
#ifndefを使う場合でもプリプロセッサシンボルに使える文字数とか気になるわぁ
しかもコメントも含めて#ifdefを一番最初にしないとうまくいかないとかそういう環境もあるらしいし
気にしてたらキリがないね
862デフォルトの名無しさん:2009/02/25(水) 21:28:07
>>853
無職に社員を首にする権限なんて無いから
863デフォルトの名無しさん:2009/02/25(水) 21:32:29
言語仕様よりコンパイラの挙動を優先するって、どんだけマヌケなんだよ。

まともな技術者ならコンパイラの挙動に影響されないように言語仕様に沿って開発するだろ。

>>852は真でいい。社会の害悪だ。
864デフォルトの名無しさん:2009/02/25(水) 22:04:08
一瞬
>>852 = true と見てしまったじゃないか!
865デフォルトの名無しさん:2009/02/25(水) 22:19:38
>>864
このスレ的にその勘違いは大問題。
866デフォルトの名無しさん:2009/02/25(水) 23:41:39
>>855
>>まぁ#pragma自体は標準だけどなw
あれ謎だよね。
挙動は環境依存だが存在することだけは確かってことでしょ。
867デフォルトの名無しさん:2009/02/26(木) 00:12:36
>>865
実社会でも大問題だけどな。
868デフォルトの名無しさん:2009/02/26(木) 01:05:50
volatile char * p;
char volatile * p;


この違いってなんでしょうか?
869デフォルトの名無しさん:2009/02/26(木) 01:07:57
同じ
870デフォルトの名無しさん:2009/02/26(木) 01:18:24
*の前なら同じ
871デフォルトの名無しさん:2009/02/26(木) 04:15:49
VisualC++ ダイアログベースでシステムを作成しているのですが
エディットコントロールなどをシステム実行中に動的に作成する方法はありますか?

たとえば
入力を求め3と入力されたら3つ縦に並べてエディットコントロールを作成する
のような動作をさせたいです
872デフォルトの名無しさん:2009/02/26(木) 04:17:02
スレチ
873デフォルトの名無しさん:2009/02/26(木) 04:31:42
>>871
あります。
874デフォルトの名無しさん:2009/02/26(木) 06:21:26
>>871
CreateWindowすればいいよ。あるいは、上限が決まっているなら、
リソース上でその数だけ作っておき、必要に応じて表示したり隠したりするという手も。
875デフォルトの名無しさん:2009/02/26(木) 08:38:42
ちょと聞きたいんだけど、
Visual C++ というと C++/CLI のことになるの?
それとも visual studio で使う C++ のことになるの?
876デフォルトの名無しさん:2009/02/26(木) 09:14:50
>>875
それは言語ではなく開発環境を示す
877デフォルトの名無しさん:2009/02/26(木) 09:24:41
>>875
  C++/CLI で .NET
  C++ & MFC
  C++ & API
どれか解らん。なので、その辺りを書かない質問
(大抵の場合、自分が何をしているかも解ってないので
スレ違いになる) は適当に答えられたり、スルーされたりしやすい。
>>871 の場合は MFC と予測。

>>876
C++/CLI は C++ 互換の言語。
878デフォルトの名無しさん:2009/02/26(木) 10:24:40
>>875
Visual StudioはVisual C++, Visual C#, Visual Basic, Visual Web Developer を総合したやつ
Visual C++では C++/CLIもC++もCも使える
879デフォルトの名無しさん:2009/02/26(木) 21:59:09
呼ぶたびに変数の中身が0〜2で循環する文はどう書くですか?
880デフォルトの名無しさん:2009/02/26(木) 22:08:14
staticかグローバルで変数取って3で割れ
881デフォルトの名無しさん:2009/02/26(木) 22:09:27
int foo()
{
static int n = 0;
n = (n + 1) % 3;
return n;
}
882デフォルトの名無しさん:2009/02/26(木) 22:12:01
これでいいじゃない。
++n;
if (n == 2) {
n = 0;
}
883デフォルトの名無しさん:2009/02/26(木) 22:12:17
int ask(int sw){
sw += 1;
sw &= 0x03;
return sw;
}
884デフォルトの名無しさん:2009/02/26(木) 22:12:57
>>883
あ、サンが来る失敗。
885デフォルトの名無しさん:2009/02/26(木) 22:17:05

static int NumLoop[]={1,2,0};
static int n = 0;

n=NumLoop[n];

return n;
886デフォルトの名無しさん:2009/02/26(木) 22:20:07
int ask(int sw){
sw += 1;
sw &= 0x03;
sw ^= sw << 1
return sw;
}
887デフォルトの名無しさん:2009/02/26(木) 22:32:05
sin使うと循環するよ
888俺!=879:2009/02/26(木) 22:51:04
>>881
が一番>>879のためになりそうなソースだな。
staticにも触れられるし。
889デフォルトの名無しさん:2009/02/26(木) 22:57:06
879でできました。
890デフォルトの名無しさん:2009/02/26(木) 23:09:52
n=n?n-1?2:1:0;
891デフォルトの名無しさん:2009/02/26(木) 23:11:37
n=n?n-1?0:2:1
こっちだ
892デフォルトの名無しさん:2009/02/26(木) 23:18:38
いい意味でキモイな
893デフォルトの名無しさん:2009/02/26(木) 23:30:13
>>892
キモイのは貴様だ
いい意味で
894デフォルトの名無しさん:2009/02/26(木) 23:31:40
>>891
条件演算子をループさせるなんて…。
895デフォルトの名無しさん:2009/02/26(木) 23:34:09
ゴルフじゃねーぞ
896890,891:2009/02/26(木) 23:38:43
帰宅中のiPhoneからだと長いコードは入力するのが大変なんだ。
897デフォルトの名無しさん:2009/02/26(木) 23:45:23
変態
898デフォルトの名無しさん:2009/02/27(金) 03:23:33
n = (1 << n)& 3;
899デフォルトの名無しさん:2009/02/27(金) 07:48:49
ひどいww
でも動くんだなwww
900デフォルトの名無しさん:2009/02/27(金) 10:12:49
C++ってSQL Server とかデータベースとの相性悪い?
それならC#使う方がよさげ?
901デフォルトの名無しさん:2009/02/27(金) 12:49:52
>>900
別に悪くないよ。
C#使うならそっちの方がいいけど。
902デフォルトの名無しさん:2009/02/27(金) 14:25:48
C++でpowなどの関数が内部でオーバーフローを検出した時にいちいちダイアログが出るのを止めたいんですが
どうすればいいでしょうか?
903デフォルトの名無しさん:2009/02/27(金) 14:34:22
#undef DEBUG
904デフォルトの名無しさん:2009/02/27(金) 16:38:36
事前にpowがオーバーフローするのを検出したいんですが、いい判定法知りませんか?
調べてもいいのがでてきません
905デフォルトの名無しさん:2009/02/27(金) 16:59:12
pow(n,m)のとき
log(DBL_MAX)/log(n) >= m;が真ならばオーバーフローしない
でどうか?
906デフォルトの名無しさん:2009/02/27(金) 17:01:43
log取ってlimits.hと比較すれば?
907デフォルトの名無しさん:2009/02/27(金) 17:16:07
>>904
釣り?

pow(x, y)はexp(log(x) * y)なので、log(x) * yがlog(DBL_MAX)に達するようならオーバーフローする。

って、>905と一緒だね。
908デフォルトの名無しさん:2009/02/27(金) 17:25:00
指数と対数がわかってないだけだろ
909デフォルトの名無しさん:2009/02/27(金) 18:46:06
>>908まぁ、そうです^^;
皆様、ありがとうございました。
910デフォルトの名無しさん:2009/02/27(金) 19:09:34
オーバーフローする可能性が高いならば事前に検査
オーバーフローする可能性が低いならば実行時にハードウェアで検出
の方が効率が良い。
911デフォルトの名無しさん:2009/02/27(金) 19:15:56
つーか、pow()がオーバーフローする可能性が高いってのは設計に問題があるだろ。
912デフォルトの名無しさん:2009/02/27(金) 19:31:10
32bitなら2^33とかでオーバーフローするんだからしかたないんじゃね
まあ、多倍長にすればいいんだろうけど
913デフォルトの名無しさん:2009/02/27(金) 19:36:01
いや、pow()はdoubleだから。整数でやりたいなら、尚のことpow()は使えないし。
914デフォルトの名無しさん:2009/02/27(金) 19:40:35
チラ裏。

#define square(x) ((x) * (x)) がダメな具体例を挙げろと言われた。
答えられなかったorz

ヤバいのは関数を突っこんだときとかだっけ?
915デフォルトの名無しさん:2009/02/27(金) 19:45:18
つ[square(x++)]
916デフォルトの名無しさん:2009/02/27(金) 20:05:08
>915
あー、それか。
なんで出てこなかったんだろう。
917デフォルトの名無しさん:2009/02/27(金) 20:49:29
>>914
マクロ関数で同じ引数が2個出るのはまずいのを覚えましょう
918デフォルトの名無しさん:2009/02/27(金) 20:55:11
int y = ...;
int z = square(++y);
919918:2009/02/27(金) 20:55:42
うわ、リロードしてなかった恥ずかしい
920デフォルトの名無しさん:2009/02/27(金) 21:59:16
>>914
仕様も提示せずにダメな例も何も無いだろ。

記述した通りに動く。何もダメじゃない。
921デフォルトの名無しさん:2009/02/27(金) 22:08:53
C++の新しい仕様って、本当に今年中にくるの?
くるまでC++の技術書とか買うの待ったほうがいい?
922デフォルトの名無しさん:2009/02/27(金) 22:10:30
>>921
待てるなら待ってそのまま買わなければお金を無駄にせずに済むよ。
必要ならすぐ買おう。
923デフォルトの名無しさん:2009/02/27(金) 22:16:29
C++0xか。
なにげに楽しみな俺がいる。
924デフォルトの名無しさん:2009/02/27(金) 22:42:39
>>921
買おう思ったなら今の本買えば?

C++0xの本はしばらくでないでしょ。
boost本あたりで少し先取りできるけど
これをよしとするか中途半端だと一蹴するか
925デフォルトの名無しさん:2009/02/27(金) 23:14:36
オーバーフローさせる時点でお前が阿保としか言いようがない
926デフォルトの名無しさん:2009/02/27(金) 23:37:56
亀レスすんならアンカぐらいつけろよ、阿呆w
927デフォルトの名無しさん:2009/02/28(土) 00:12:58
大規模プログラム設計に関する質問です。

C言語を始めて以来、徐々に規模の大きいものを組むようになりました。
はじめは関数化したり、グローバル変数をできるだけ作らないようにする、といったことを心がけることで
複雑なコードにならないようにしていたのですが、数千行になってくると、それでも
しんどくなってきました。

そこで、まとまった処理や変数をクラス化して、プログラムをモジュールに分割することを試みました。
ところが、キレイに分離できて扱い易くなったものもあるものの、かなり複雑に絡み合った処理部は
うまくモジュールに分離できず、ムリにクラス化すると、逆に分かり辛くなるという、本末転倒な
結果に陥ってしまいました・・・

やはり、初期の段階でモジュール構成など、設計をちゃんとした上で組まないと、大規模な
プログラムを効率的に組んでいくことは難しいと思いました。

そこで、このように、大規模なプログラムを組む上で気を付けることや、考え方、方針などが
書かれているWebサイトや書籍をご存知だったら教えていただきたいです。

ご助言、よろしくお願いします。
928デフォルトの名無しさん:2009/02/28(土) 00:19:55
デザインパターンでググれ
929デフォルトの名無しさん:2009/02/28(土) 00:24:52
930デフォルトの名無しさん:2009/02/28(土) 00:48:13
>>929
それはどうだろ・・・

>>928
まあ、そこから始めればいいのかな
931デフォルトの名無しさん:2009/02/28(土) 01:02:16
>>927
Code Complete 読め
932デフォルトの名無しさん:2009/02/28(土) 01:34:42
設計の問題だから code completeじゃ役者不足だろ
933デフォルトの名無しさん:2009/02/28(土) 06:03:04
期待通り動きゃ、何でもいいんだよ
934デフォルトの名無しさん:2009/02/28(土) 17:38:09
期待通り動いてるように見えちゃうから問題なんだろ?
935デフォルトの名無しさん:2009/02/28(土) 17:47:23
なんで動いてるかわかんないのも問題だな。
936デフォルトの名無しさん:2009/02/28(土) 20:11:49
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
937デフォルトの名無しさん:2009/02/28(土) 22:34:39
C言語始めようと思うのですが導入からまず挫折気味です

何を入れれば良いのでしょうか?
とりあえずコンパイラが必要なようですがそれも沢山あってどれが良いのか全くわかりません。
938デフォルトの名無しさん:2009/02/28(土) 22:36:07
>>937
Windows: Visual Studio 2008 Express Edition
Linux: gcc
939デフォルトの名無しさん:2009/02/28(土) 22:38:02
うむ、VisualC++2008expressで問題無かろう。
940デフォルトの名無しさん:2009/02/28(土) 22:39:14
>>937
俺的にはコンパイラはbccもオススメ。
あと
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
あたりを読むと完璧な初心者(というより入門者)の学習には評判が高いからいいんじゃない?
941デフォルトの名無しさん:2009/02/28(土) 22:53:59
>>937
bccはおすすめしない
942デフォルトの名無しさん:2009/02/28(土) 23:01:28
VisualStudio2005でC++コンソールAPPを作成しています。

トレース機能を使いたいのですが、
TRACE("test");とすると
'TRACE': 識別子が見つかりませんでした

と出てコンパイルエラーになります。
どうすればトレース機能が使えるようになるのでしょうか?
943デフォルトの名無しさん:2009/02/28(土) 23:11:05
マクロで即値を定義しちゃうといろいろと弊害が生じるから、
それはやめてstatic const hoge=42;の様に即値を定義しろと聞いたんだが、
可能な限り徹底する物なの?
正直いってまずかぶらないような長ったらしいマクロ名にすればマクロでも大丈夫だよね?
static constとかしてもヘッダーをインクルードしたら結局かぶるわけだし
944デフォルトの名無しさん:2009/02/28(土) 23:17:22
>>943
デバッガ動かすときに、名前が残るのでそれが良いという話がある
あと型が指定されるのでそれが良いこともある

Cだとしたらそもそもconstつけても定数扱いにはならないので、置換できないケースがある
そしてC++ならstatic より無名名前空間を勧めろよと
945デフォルトの名無しさん:2009/02/28(土) 23:20:11
>>942
afx.h
946デフォルトの名無しさん:2009/02/28(土) 23:35:42
>>945
afx.hをインクルードしたのですが、以下のエラーメッセージが・・・

1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
947デフォルトの名無しさん:2009/02/28(土) 23:36:24
>>944
無名名前空間ですか。
ちょっと勉強してきます
948デフォルトの名無しさん:2009/02/28(土) 23:36:37
質問なんですけど・・・

2ちゃんのスレで荒しが書き込んだレスが「あぼーん」では無く
番号ごと削除されてるんですけど・・・

こんな事が削除人ならできるのですか?
949デフォルトの名無しさん:2009/02/28(土) 23:39:19
>>945
#define _AFXDLL を書いたら動きました。ありがとうございました
950デフォルトの名無しさん:2009/02/28(土) 23:52:24
>>932

>役者不足だろ
>役者不足だろ
>役者不足だろ
951デフォルトの名無しさん:2009/03/01(日) 00:03:07
この後役者不足で正しいことを指摘されて大暴れするに1000点
952デフォルトの名無しさん:2009/03/01(日) 00:07:56
ん〜と、2chで議論するならWikipediaがソースでも十分でしょと思って
Wikipedia見てきた。
役不足
俳優などが自分の与えられた役に対して不満を抱くこと。転じて、その人の能力に対して役目が不相応に軽いこと。
→×自分の与えられた役目が重く、自分の力量に見合わないこと。
嫌味として使われていたものを本来の意味と取り違えたもの。[要出典]謙遜の意味で誤用されているケースが多いが、これも意味がほぼ逆に解釈されている。
力不足(力量を超える役割)と勘違いした結果である。「役者不足」という役不足に語幹の似た言葉が用いられることもあるが、これは造語であり「役者不足」は単純に役者の頭数が不足しているという意味であり、
個人の能力が不足しているという意味ではない(即ち力不足の意味で役者不足を用いる事も誤用である)。「役職は多いが役者不足である」は正用。
って書いてあるね。
953デフォルトの名無しさん:2009/03/01(日) 00:09:14
(・∀・)クスクス
954デフォルトの名無しさん:2009/03/01(日) 00:13:52
>>951
ゴチになりやす
955デフォルトの名無しさん:2009/03/01(日) 00:36:32
>>951
大暴れさせるに足る論拠マダー?
956デフォルトの名無しさん:2009/03/01(日) 01:01:57
辞書引き厨とかまだ存在してたんだw
957デフォルトの名無しさん:2009/03/01(日) 01:23:20
言うことはそれだけ?w
958デフォルトの名無しさん:2009/03/01(日) 01:40:42
(ノ ゚Д゚)ノ ==== ┻━━┻>>957
959927:2009/03/01(日) 01:52:06
>>928-930
ありがとうございました!
>>931
すごく良さそうな本ですね!
早速注文しました!

ありがとうございました!
960デフォルトの名無しさん:2009/03/01(日) 05:47:56
>>937
悪い事言わないからHSPにしとけ。
最新のじゃなくて、Ver2.xな

それで物足りなさを感じるようなレベルになったらdll作ってみるとか、
HSPで作った物をC++で作り直してみるとかしたほうが絶対いい
961デフォルトの名無しさん:2009/03/01(日) 05:51:03
HSPはオモチャ。 これ出来ても評価されない。 完成品ならウケる可能性はある
962デフォルトの名無しさん:2009/03/01(日) 08:55:10
釣りっぽいけど、初心者に進められる言語じゃないね
963デフォルトの名無しさん:2009/03/01(日) 12:48:11
2つのint型配列 a[M],b[N]はソートされているとします。
aとbに共通するデータをcに格納する計算量の少ない方法教えてください。
964963: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";
}
965デフォルトの名無しさん:2009/03/01(日) 13:19:06
Mはどこに消えたんだろう
966デフォルトの名無しさん:2009/03/01(日) 13:23:40
面倒なので、M=Nにしてます。 こうした所で計算時間を比較するのには問題ないです。
967デフォルトの名無しさん:2009/03/01(日) 13:29:50
>>966
アホか
968デフォルトの名無しさん:2009/03/01(日) 13:31:48
汎用アルゴリズム使うならmarge(線形)→unique(線形)だろうけど>>964の方が速い感じ?
969デフォルトの名無しさん:2009/03/01(日) 13:44:26
普通に考えて
set_intersection()が計算量が最小になるアルゴリズムになってるだろ。
比較や移動のコストは知らんが。
970デフォルトの名無しさん:2009/03/01(日) 13:59:37
set_intersectionはしりませんでした。
一定区間ごとbitsetで存在を表して、そのandを取れば速いかと思ったのですが964に負けました。
表面的には比較回数が減ってますが、裏の手間が掛かりすぎるようです。
971デフォルトの名無しさん:2009/03/01(日) 14:01:30
同値の含有率で・・
a{0 0 1 2}
b{0 1 1 2}
972デフォルトの名無しさん:2009/03/01(日) 14:36:37
>>969
おお、ほんとだ。そんなアルゴリズムがあった。
っていうか、STL標準講座はやっぱりダメな本だった
973デフォルトの名無しさん:2009/03/01(日) 14:45:37
>>972
どうダメな本なの?
974デフォルトの名無しさん:2009/03/01(日) 15:03:31
俺との相性が悪い
君にはいい本かもよ?
975デフォルトの名無しさん:2009/03/01(日) 15:29:33
>>973
入門書なのに読めば何でも出来るようになると思い込んでいる人間には向いていない
976デフォルトの名無しさん:2009/03/01(日) 16:41:37
そういう人間はプログラム自体が向いてないんじゃないかね
977デフォルトの名無しさん:2009/03/01(日) 17:06:00
新たにおねがいします。 

5つのint型配列a1[N],a2[N],・・・a5[N]はソートされているとします。
これらに共通するデータをbに格納する計算量の少ない方法教えてください。
978デフォルトの名無しさん:2009/03/01(日) 17:09:59
できれば5個限定でないやつおねがいします。
3個でも7個でも同じアルゴリズムで出来たらいいのですが
979デフォルトの名無しさん:2009/03/01(日) 17:11:37
a1とa2に共通するデータをbに抽出
a3とbに共通するデータをbに格納
980デフォルトの名無しさん:2009/03/01(日) 17:13:43
途中で書き込んじまった

a1とa2に共通するデータをbに抽出
a3とbに共通するデータをbに格納
これを繰り返してったらいいんじゃない
981デフォルトの名無しさん:2009/03/01(日) 17:16:52
全てのunsigned intが入る配列を確保して0で初期化
binソートのごとく数字が存在したらインクリメント
最後に5こでも7こでも元配列の数だけ増えてる奴を抽出
計算量は線形だ。
982デフォルトの名無しさん:2009/03/01(日) 17:27:41
トンクス! いいやつありがとうございます
983デフォルトの名無しさん:2009/03/01(日) 17:32:58
>>981
おいw
984デフォルトの名無しさん:2009/03/01(日) 17:36:59
おい、って何か?
985デフォルトの名無しさん:2009/03/01(日) 18:12:36
>unsigned intが入る配列
この部分がかなりアレだが範囲が決まってるならアリだな
986デフォルトの名無しさん:2009/03/01(日) 18:32:14
0-9999 10000-19999とする。
987デフォルトの名無しさん:2009/03/01(日) 19:38:31
それ重複があったらあったらダメじゃないの?
a1 にある数が5個入ってたら a2〜a5 に入ってなくてもヒットしちゃう
988デフォルトの名無しさん:2009/03/01(日) 20:22:39
ソートされているんだから特に問題にならないと思うが
989デフォルトの名無しさん:2009/03/01(日) 20:25:20
そうとも言い切れないと思うよ
990デフォルトの名無しさん:2009/03/01(日) 20:36:35
連続する所を一つと見なす
991デフォルトの名無しさん:2009/03/01(日) 22:22:31
>数字が"存在したら"インクリメント
っていってるから別に>>987の問題はないんじゃ
992937:2009/03/01(日) 22:30:08
>>938,>>940
ありがとうございます。
Visual Studio 2008というのを使ってみます。
993デフォルトの名無しさん:2009/03/01(日) 22:42:03
>>992
猫でも分かるはやめとけ。
まあ、猫でもいいけど、なにか引っかかったり疑問に思ったら
すぐ捨てて、ほかの入門書にあたれ。
994940:2009/03/01(日) 23:19:28
>>993
猫でも分かるは本当に最初だけだよ。
いつかは仕様について学ばなければならなくなるから、
そしたらその時にちゃんと初心者用の書籍を買って読むといい。
995デフォルトの名無しさん:2009/03/01(日) 23:28:19
っていうか、初心者は第1章でつまづくだろ。猫のC言語入門って。
996940:2009/03/01(日) 23:49:31
>>995
実は俺はある程度勉強してからその存在に知ったからなぁ。
…あれはインストール方法を省略してたっけ?
その辺はもう覚えとらん。
メインコンテンツの解説の部分しか覚えとらん。
997デフォルトの名無しさん:2009/03/02(月) 00:03:31
>>985
int配列だから範囲はintの範囲と決まってんじゃんw
998981:2009/03/02(月) 00:20:06
ネタで書いたんだが微妙に好評?だなw
999デフォルトの名無しさん:2009/03/02(月) 00:37:13
建てた

スレを勃てるまでもないC/C++の質問はここで 8
http://pc11.2ch.net/test/read.cgi/tech/1235921779/
1000デフォルトの名無しさん:2009/03/02(月) 00:38:22
get!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。