【初心者歓迎】C/C++室 Ver.63【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.62【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1229095398/l50

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2デフォルトの名無しさん:2009/01/09(金) 20:13:56
>>1 乙です

前スレが終わってしまったのでもう一度貼ります

997 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/09(金) 19:53:52
失礼します
コンストラクタについての質問なのですが
C → B → A の順で自身のコンストラクタを呼び出すことは可能でしょうか?
可能であればどのように書けばよいか教えてください

下の例は簡略化しているので全パターン書いても大したことはないですが
実際のものはもう少し引数が増えます

class hoge
{
int m_foo, m_bar;
public:
hoge(int foo, int bar) : m_foo(foo), m_bar(bar){} // A
hoge(int foo) : hoge(foo, 100-foo){} // B
hoge(void) : hoge(rand()){} // C
};
※これはコンパイルエラーになります
3デフォルトの名無しさん:2009/01/09(金) 20:21:17
C++0x ではできるようになるんだった気がするが、今は無理。
初期化用の関数を作るといいよ。
4デフォルトの名無しさん:2009/01/09(金) 20:49:00
そのパターンだけだったらこれで行ける
hoge(int foo = rand(), int bar = 100 - foo) : m_foo(foo), m_bar(bar){}
5デフォルトの名無しさん:2009/01/09(金) 20:54:17
>>3
無理なのですね
分かりました。ありがとうございます

ということは、代替手段としては
次のようにするしかないということですね
class hoge
{
int m_foo, m_bar;
void init(int foo, int bar) { m_foo=foo; m_bar=bar; }
void init(int foo) { init(foo, 100-foo); }
void init(void) { init(rand()%101); }
public:
hoge(int foo, int bar) { init(foo, bar); } // A
hoge(int foo) { init(foo); } // B
hoge(void) { init(); } // C
};
6デフォルトの名無しさん:2009/01/09(金) 20:58:21
まあ大体そうだな
わざわざinitをオーバーロードする必要はないと思うけど
7デフォルトの名無しさん:2009/01/09(金) 20:58:46
>>4
コンパイルエラーになりました
g++ -c -o hoge.o hoge.cpp
hoge.cpp:7: error: `foo' was not declared in this scope
make: *** [hoge.o] Error 1

コンパイラのバージョンはこれです
g++ (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
87:2009/01/09(金) 21:00:29
ソースファイル忘れてました
#include<cstdlib>

class hoge
{
int m_foo, m_bar;
public:
hoge(int foo = rand(), int bar = 100 - foo) : m_foo(foo), m_bar(bar){}
};
9デフォルトの名無しさん:2009/01/09(金) 21:04:32
あれ?本当だそこでfoo見えてないのか
知らんかった
10デフォルトの名無しさん:2009/01/09(金) 21:10:54
引数はデフォルト引数にはできんぞ
11デフォルトの名無しさん:2009/01/09(金) 21:20:11
もうひとつ質問です
下側のクラス hoge の三番目のコンストラクタを実現する方法はありますか?
あるとすれば、どのように書けばいいのでしょうか?

#include<cstdlib>

class base // このクラスは変更できないものとする
{
int m_foo, m_bar;
public:
base(int foo, int bar) : m_foo(foo), m_bar(bar) {}
};

class hoge : public base
{
public:
hoge(int foo, int bar) : base(foo, bar) {}
hoge(int foo) : base(foo, 100-foo) {}
hoge() : base(int tmp=rand()%101, 100-tmp) {} // このコンストラクタはどのように書けばよいですか?
};
12デフォルトの名無しさん:2009/01/09(金) 21:24:16
この場合は

hoge(int foo = rand() % 101) : base(foo, 100 - foo) { }

でいいと思う。
13デフォルトの名無しさん:2009/01/09(金) 21:28:20
>>12
できました
ありがとうございます
14デフォルトの名無しさん:2009/01/09(金) 22:20:08
私にc++の極意を教えてください
15デフォルトの名無しさん:2009/01/09(金) 22:29:11
__stdcall
16デフォルトの名無しさん:2009/01/09(金) 22:32:26
おぉ
17デフォルトの名無しさん:2009/01/09(金) 22:54:18
(int*)p->num;
(int*)(p->num);
((int*)p)->num);
これは全部同じですか?

if( a==b && a==c)
if( (a==b) && (a==c) )
これも同じですか?

18デフォルトの名無しさん:2009/01/09(金) 22:56:29
>>17
はい全部同じです
優先順位ぐらい自分で調べましょう
19デフォルトの名無しさん:2009/01/09(金) 22:57:44
>>18
おいw
違うじゃねぇかw
20デフォルトの名無しさん:2009/01/09(金) 22:59:26
>>18
ちげぇwwwwwwwwwwwwww w
21デフォルトの名無しさん:2009/01/09(金) 23:06:22
>>18
違うwwwww
3行目は明らかにエラーだろwwwwww
22デフォルトの名無しさん:2009/01/09(金) 23:41:18
23デフォルトの名無しさん:2009/01/10(土) 00:26:00
18の2行目と3行目が逆だったら理解できるのだが……。
24デフォルトの名無しさん:2009/01/10(土) 00:33:24
そもそも括弧のネスト壊れてるし
25デフォルトの名無しさん:2009/01/10(土) 01:01:57
strcmpの文字列比較の結果が0,1,-1以外の時ってありますか??
26デフォルトの名無しさん:2009/01/10(土) 01:05:04
新スレ早々ワロタw
27デフォルトの名無しさん:2009/01/10(土) 01:06:42
>>25
strcmp の戻り値は 正数 か ゼロ か 負数 かのいずれかなので
1 とか -1 であることは保証されてないです
28デフォルトの名無しさん:2009/01/10(土) 01:06:54
そもそもに、0,1,-1ではなく、0,正,負を返すとしか定義されてない?
29デフォルトの名無しさん:2009/01/10(土) 01:07:16
かぶった
30デフォルトの名無しさん :2009/01/10(土) 01:09:21
>>25
規格では無いよ。
31デフォルトの名無しさん:2009/01/10(土) 01:35:15
>>30 0,1,-1 しか無いとは書いて無いよ。
32デフォルトの名無しさん:2009/01/10(土) 02:04:23
最近新しい出会いがありません。
もっと勉強しなくてはと思わせるようなアルゴリズムを紹介してください。
33デフォルトの名無しさん:2009/01/10(土) 02:05:27
エラー訂正符号とか勉強すると面白いよ
34デフォルトの名無しさん:2009/01/10(土) 02:08:26
>>32
動画圧縮とか
35デフォルトの名無しさん:2009/01/10(土) 02:19:24
complex<double> x[num];
これどうやって宣言するんですか?
numを変数にしたいんです
36デフォルトの名無しさん:2009/01/10(土) 02:21:30
>>35
そのままでおk
37デフォルトの名無しさん:2009/01/10(土) 02:32:12
>>36
寝言は寝て言え。

>>35
std::vector< std::complex<double> > x(num);
3836:2009/01/10(土) 02:43:37
num を変数にするっていうのは
後でサイズを変えたいと言う意味か!
39デフォルトの名無しさん:2009/01/10(土) 03:21:28
>>38
寝言は寝て言え。
40デフォルトの名無しさん:2009/01/10(土) 03:30:50
>>39
コンパイルできるでしょ?
#include<complex>

int main(void){
int num=5;
std::complex<double> x[num];

x[0].real()=0.0;
x[0].imag()=1.0;

return 0;
}
41デフォルトの名無しさん:2009/01/10(土) 09:12:02
fgetsは処理ごとにメモリが動くので、一様な使い方ができません。
どのように切り抜けるか知っていますか。下記例。

#include<stdio.h>

int main(){
FILE *fp;
char a[256];
char *b[4];
char *c,*d;
int i;

if((fp=fopen("address.dat","r"))==NULL)exit(1);

c=fgets(a,256,fp);
printf("%s",c);
d=fgets(a,256,fp);
printf("%s",d);

fclose(fp);
}


これを
c=fgets(a,256,fp);
d=fgets(a,256,fp);
printf("%s",d);
printf("%s",c);

のような順序にすると同じ値が出てしまいます。(1行目が消えて、ファイルの2行目の出力になる)
42デフォルトの名無しさん:2009/01/10(土) 10:10:45
釣られないぞ
43デフォルトの名無しさん:2009/01/10(土) 10:20:14
>>40
C99に対応したコンパイラならできるかもね
44デフォルトの名無しさん:2009/01/10(土) 10:23:57
>>43
C99 ならテンプレートが使える?!
45デフォルトの名無しさん:2009/01/10(土) 10:27:06
いやC99の仕様も取り込んだC++コンパイラ
46デフォルトの名無しさん:2009/01/10(土) 11:24:56
g++ならできるよ
47デフォルトの名無しさん:2009/01/10(土) 14:22:04
それ g++ の拡張機能だろw
48デフォルトの名無しさん:2009/01/10(土) 14:29:01
C++0xにC99の可変長配列入るんだっけ?
49デフォルトの名無しさん:2009/01/10(土) 14:30:31
入らないはず。
std::vector の方が色々出来て便利だし。
50デフォルトの名無しさん:2009/01/10(土) 14:35:53
sizeofがコンパイル時に決まらなくなるから
色んなテンプレートが破綻するので入れられない
51デフォルトの名無しさん:2009/01/10(土) 15:00:34
>>48
vectorみたいなコンテナクラスで生成時可変長の配列なら入るんじゃなかったかと。
52デフォルトの名無しさん:2009/01/10(土) 15:06:51
質問させてください。
以下をコンパイルすると
17: error: class ‘Ext’ does not have any field named ‘Base’

17: error: no matching function for call to ‘Base<int, int>::Base()’

12: note: candidates are: Base<T1, T2>::Base(T1) [with T1 = int, T2 = int]

7: note: Base<int, int>::Base(const Base<int, int>&)

というエラーになるのですが、
テンプレートで指定したクラスをコンストラクタの引数に
指定してはいけないのでしょうか?
5352:2009/01/10(土) 15:07:27
template <class T1, class T2>
class Base {
protected:
    int num;
    T2 value;
public:
    Base(T1 val) : num(0), value((T2)val) { }
};

class Ext : public Base<int, int> {
public:
    Ext(int val) : Base(val) { }
};

int main(int ac, char *av[])
{
    Ext myext(1);
    return 0;
}
54デフォルトの名無しさん:2009/01/10(土) 15:08:49
>>51
そうなの?
もうvector::resize()しなくていいの?
55デフォルトの名無しさん:2009/01/10(土) 15:15:43
>>52
VC++2008では通る
5652:2009/01/10(土) 15:18:27
>>55
ありがとうございます。
g++ 4.2.4なんですが、コンパイラのせいですか orz

文法的には問題ないのですよね?
57デフォルトの名無しさん:2009/01/10(土) 15:18:35
>>51
もしかして、arrayのことを言っているなら、それは違うと言っておく。
中身はただの配列で、つまり固定長。
5851:2009/01/10(土) 15:21:28
あーごめん、boost::arrayがC++0xに入ったらいいなぁという話だった。
5952:2009/01/10(土) 15:36:36
自己解決しました
コンストラクタの定義が間違っていました。
60デフォルトの名無しさん:2009/01/10(土) 21:45:26
boost::anyってどんな型を入れられるの?どんな型を取り出せるの?
61デフォルトの名無しさん:2009/01/10(土) 21:57:16
>>60 any
62デフォルトの名無しさん:2009/01/11(日) 01:23:53
Cで組み込み開発、
C#でwindowsアプリ開発経験あり。
そんな俺がC++を学ぶとしたら何かお勧めの書籍とかサイトはありますか?
63デフォルトの名無しさん:2009/01/11(日) 01:31:41
64デフォルトの名無しさん:2009/01/11(日) 01:38:16
Cの文法は知ってて、C#でオブジェクト指向も知ってるんだな
だったら基本はすぐ理解して書けるだろうからC++特有の罠を勉強した方がいいな
とりあえずEffective C++を読むがいい
65デフォルトの名無しさん:2009/01/11(日) 01:48:06
>>64
d
明日本屋で探してきます。
66デフォルトの名無しさん:2009/01/11(日) 02:21:51
>>64
俺は、この正月にC,Java,ruby知っててC++に手を出したが
More Effective C++はわからんかった。英語のせいもあるけどw

結局、独習C++のお世話になってます。
コンストラクタの引数とかテンプレートとか
なかなか変態的だよね。
67デフォルトの名無しさん:2009/01/11(日) 14:52:30
Visual C++で可変引数リストの関数をDLLにエクスポートできるのでしょうか?

今、次のような関数をエクスポートしようとしているのですが、うまくできません

*.h部

__declspec(dllexport)
void
debug_message(
const TCHAR *format,
...
);

*.cpp部

__declspec(dllexport)
void
debug_message(

)
{
68デフォルトの名無しさん:2009/01/11(日) 14:56:16
>>67
extern "C"
とか?
69デフォルトの名無しさん:2009/01/11(日) 15:06:10
Cで三角関数のテーブルを作っているのですが、質問です。
以下はヘッダファイルの一部です。

/* テーブル化したsin() */
double sin_table(double radian);
……
#ifdef USE_TABLE
#define sin sin_table
#endif

上記のように、テーブルを使う際にUSE_TABLEを定義すればsin_table()をsin()と書けるようにしたいのですが、
こういう書き方は元々のsin()を隠してしまうのですべきでは無いのでしょうか?
70デフォルトの名無しさん:2009/01/11(日) 15:10:20
#ifdef USE_TABLE
#define SIN sin_table
#else
#define SIN sin
#endif

みたいに別のものを使うべきだな。
7169:2009/01/11(日) 15:13:43
>>70
なるほど。そう書くことにします。
ありがとうございました。
72デフォルトの名無しさん:2009/01/12(月) 13:26:30
ポインタを利用した二分探索木のデータ削除で質問なのですが、下のプログラムではデータが消えません。
どうしたらいいですか?? 子を2つ持つ場合です。
if(head->right!=NULL && head->left!=NULL){
y=head->left;
if(y->right==NULL && y->left==NULL)
{
strcpy(head->data,y->data);
free(y);
head->left=NULL;
}
w=head;
while(1){
if(y->right!=NULL){
w=y;
y=y->right;
}
else

break;}
strcpy(head->data,y->data);
if(y->left!=NULL)
{w->right=NULL;
w->right=y->left;
free(y);
}
else{
free(y);
w->right==NULL
}}
73デフォルトの名無しさん:2009/01/12(月) 13:37:51
PC shutdownすれば消えるよ
74デフォルトの名無しさん:2009/01/12(月) 14:11:35
初心者歓迎だったので失礼いたします。
Cを勉強しているんですが、ポインタと構造体が何を読んでも分からなくて
質問させてください。

http://codepad.org/rnSOFLEU

このようなソースで、とても皆さんにはお目汚しかも知れませんが
独学で色々とやっていて至らない点だらけなんですが、
実行してみると、main関数ではAA[0]とAA[1]に入って欲しい値が入っているのに
関数に飛ぶと、AA[0]にAA[1]がはいってしまうんです・・・

良ければどなたか教えていただけませんでしょうか・・・
75デフォルトの名無しさん:2009/01/12(月) 14:15:09
>>72
ソースはコンパイルできるように貼ってくれ。それだけ見ても、 head とか y とか data とか
わからんものが多すぎる。
76デフォルトの名無しさん:2009/01/12(月) 14:18:21
>>74
> ulint A[1]={0},B[1]={0};
...
> for(i=0;i<2;i++){
> A[i] = a & 0xffff;
> B[i] = b & 0xffff;

これだけで死亡確定だな。
77デフォルトの名無しさん:2009/01/12(月) 14:25:45
>>76さん
32bitを16bitにして別々に分けたかっただけなんですが・・・
一応printfでもちゃんと分けれたんですが・・・
なぜいけないんでしょうか・・・
78デフォルトの名無しさん:2009/01/12(月) 14:29:58
>>77
A は要素数 1 の配列だから A[0] まではアクセスできるけど A[1] はダメ。
79デフォルトの名無しさん:2009/01/12(月) 14:38:03
>>78さん
ありがとうございます!
A[2]だけどA[0]から始まるので、勘違いしてました。

後、ポインタと構造体なんですが、やはり色々試してみても
main関数でAA[0]の値としたの関数でのAA[0]の値が変わってしまうんですが・・・

こちらの原因は一体何なんでしょうか・・・
80デフォルトの名無しさん:2009/01/12(月) 14:54:09
C言語について質問させてください.
char型(1byte)の配列にデータを格納して,その配列4つ分のデータを
int型(4byte)の変数に代入するにはどういうコードにすれば良いでしょうか.

よろしくご教授お願いします.

C言語についての私のレベルはなんとかポインタを理解している程度です.
 
81デフォルトの名無しさん:2009/01/12(月) 14:55:48
ポインタを理解しているなら
ポインタを使えばできることも分かるはずだ。
それが分からないなら、ポインタを理解できてはいない。
あまり見栄を貼るものではない。

char hoge[4] = { 0x12, 0x34, 0x56, 0x78 };
int n = *(int*)hoge;
82デフォルトの名無しさん:2009/01/12(月) 14:59:04
それってエンディアンよって動き変わらないか?
83デフォルトの名無しさん:2009/01/12(月) 15:00:17
変わるけど、目的が分かんないからな・・・。
84デフォルトの名無しさん:2009/01/12(月) 15:03:18
>>74
正直、あんたにそのプログラムは未だ早すぎる。もっと配列について勉強してくれ。

>>81
それはやってはいけないコードの一例。
hogeがint境界に置かれる保証はないぞ。
# 大抵は大丈夫だが。
85デフォルトの名無しさん:2009/01/12(月) 15:08:35
>>84さん
締め切りが明日なんです・・・
今日中にどうにかしないとやばいんです・・・
しかも、17時からバイトで帰ってこれるのが0時過ぎなんで・・・
86デフォルトの名無しさん:2009/01/12(月) 15:11:28
81さん
ありがとうございます.
"*"を一つだけ使用するポインタについては動作を理解できるのですが,
例示して頂いたような"*"を2回使うポインタについては,内容を
理解できないのが実情です.

明解C言語入門編を教科書に勉強しているのですが,"*"二つ使いのポインタ
について理解するのにお勧めの本,又はwebを教えていただけないでしょうか?

>82,83さん
想定しているのはビッグエンディアンです

>84さん
確実に動作補償されるコードをよろしければ教えていただけないでしょうか?
87デフォルトの名無しさん:2009/01/12(月) 15:11:29
>>85
宿題は宿題スレへ。他のスレにも同じようなコード貼ってる同じ穴の狢がいるようだから、
同病相哀れむなり何なり、好きにしてください。
88デフォルトの名無しさん:2009/01/12(月) 15:12:10
>>86
確実に動作「補償」されるようなコードはありません。
89デフォルトの名無しさん:2009/01/12(月) 15:13:04
union使えばいいんじゃないの?
90デフォルトの名無しさん:2009/01/12(月) 15:13:15
>>79
46行目が嘘付いてる。kだけインクリメントしておいて、sはそのままだ。
91デフォルトの名無しさん:2009/01/12(月) 15:16:11
>88
確かに!!
動作保証するコードのことでした^^;
92デフォルトの名無しさん:2009/01/12(月) 15:16:28
>>86
>char型(1byte)の配列にデータを格納して,その配列4つ分のデータを
>int型(4byte)の変数に代入するにはどういうコードにすれば良いでしょうか.

そのまま書けば宜しい。
char foo[] = {0x12, 0x34, 0x56, 0x78}; //char型の配列にデータを格納
int bar; // int型の変数を確保し、
char * pBar = (char *) & bar; // その場所をchar *としてpBarにポイントさせる。
for (unsigned ic = 0; ic < sizeof(bar); ++ic) pBar[ic] = foo[ic]; //その場所に、配列をコピー
93デフォルトの名無しさん:2009/01/12(月) 15:21:42
>>87さん
聞きながらでも自分でどうにかしたかったので・・・

>>90さん
*s=k;
で*sのk番目って事じゃないのでしょうか・・・
何をやっても関数のAA[0]番目にmainのAA[1]が着てしまいます・・・
94デフォルトの名無しさん:2009/01/12(月) 15:25:06
>>93
s=F.AA; で、sはAA[0]をさしている。
*s=k; はAA[0]にkを代入する。
95デフォルトの名無しさん:2009/01/12(月) 15:31:20
>>94さん
では下の関数でs -> AA[0]で上でAA[0]に入れたところを指しているわけでは無いのですか?
mainでいれたAA[0]の値と下の関数で出てくるAA[0]の値が同じにならない原因が分からないのですが・・・
96デフォルトの名無しさん:2009/01/12(月) 15:33:43
さすがにいい加減うざいが・・・
*sっていうのは常にAA[0]と同じところを指している。
たぶんs[k]と書きたいのだと思われる。
97デフォルトの名無しさん:2009/01/12(月) 15:34:56
アドレス、データをダンプしながらやれば
いやでも解るようになるとおもうんだ
98デフォルトの名無しさん:2009/01/12(月) 15:37:44
>>95
> では下の関数でs -> AA[0]で上でAA[0]に入れたところを指しているわけでは無いのですか?
そうではない。
main内の*s = k;および2つの*s = c & 0xffff;は、すべてAA[0]に代入している。
sがAA[0]を指したままだからだ。
tas内でAA[0]を見たときは、2つ目の*s = c & 0xffff;で代入された値が入っている。
99デフォルトの名無しさん:2009/01/12(月) 15:37:46
マルチは放っておけばいいと思うんだ。
100デフォルトの名無しさん:2009/01/12(月) 15:42:50
>>92

>そのまま書けば宜しい。
>char foo[] = {0x12, 0x34, 0x56, 0x78}; //char型の配列にデータを格納
>int bar; // int型の変数を確保し、
>char * pBar = (char *) & bar; // その場所をchar *としてpBarにポイントさせる。
>for (unsigned ic = 0; ic < sizeof(bar); ++ic) pBar[ic] = foo[ic]; //その場所に、配列をコピー

詳しい解説ありがとうございます.
教えて頂いたコードで試してみました.
int barを出力してみたところ”2018915346”という値が入っていました.
ですが,intに入れたのは 0x12, 0x34, 0x56, 0x78なので,期待する値としては
”305419896”になると思います.

この違いは何故生じるのでしょうか?
101デフォルトの名無しさん:2009/01/12(月) 15:44:28
エンディアンでぐぐれ
102デフォルトの名無しさん:2009/01/12(月) 15:48:05
失礼しました.ビッグエンディアンと思っていた研究室のワークスペースが
リトルエンディアンでした.

助言頂いた皆様ありがとうございました.
103デフォルトの名無しさん:2009/01/12(月) 15:51:58
2018915346=0x78563412
305419896=0x12345678
104デフォルトの名無しさん:2009/01/12(月) 15:55:58
出直せといわれたので、初心者歓迎のところへ来て・・・
宿題なら宿題板行けといわれ・・・
世知辛いです・・・

>>96さん
理解力無くてすみません・・・
ということは、どこででもs[k]と書けば、そのアドレスの数値を取り出せるって事ですか?

>>98さん
なるほど!*sで指定したアドレスの順番に従ってk=0ならs=0番目のところ
k=1ならs=1になると思ってました。
分かりやすく説明してくださって有難うございます!

後、色々な板で詳しく丁寧に教えてくださった皆様有難うございます。
それぞれの板でお礼したかったですけど、マルチになっちゃうみたいなんで
ここでお礼させてもらいます。
有難うございました。
105デフォルトの名無しさん:2009/01/12(月) 17:16:59
.ccpのインクルードヘッダーは宣言が書いてある.hだけにしたほうがいいんですか?
それともstdafx.hで統一して問題ないんですか?
106デフォルトの名無しさん:2009/01/12(月) 17:18:16
それは既にC++の話ではなくなってる
107デフォルトの名無しさん:2009/01/12(月) 17:33:03
error LNK2019: 未解決の外部シンボル "public: virtual __thiscall CMyClass::~CMyClass(void)" (??1CMyClass@@UAE@XZ) が
関数 "public: virtual void * __thiscall CMyClass::`scalar deleting destructor'(unsigned int)" (??_GCMyClass@@UAEPAXI@Z) で
参照されました。

このエラーはなにがいけないんでしょうか?
108デフォルトの名無しさん:2009/01/12(月) 17:44:20
>>107
ソース内に構文としては正しそうに見える、勘違いによる間違いがある。
それ以上はソースを見ないとはっきりしないと思う。
# エスパーならどんな間違いかを推定できそうだけれど。
109デフォルトの名無しさん:2009/01/12(月) 17:46:19
デストラクタが宣言だけされて実装が書いてないんじゃないの。
virtualみたいだから、仮想デストラクタで=0でもつけただけだとか。
110デフォルトの名無しさん:2009/01/12(月) 18:05:17
よくわかるね・・・デストラクタの宣言だけで中身がなかった
ありがとう!
111デフォルトの名無しさん:2009/01/12(月) 19:39:55
>>108-110
エスパーワラタw
112デフォルトの名無しさん:2009/01/12(月) 19:42:55
コンパイルエラーとリンクエラーの違いが分かっているか、お兄ちゃんは心配だ
113デフォルトの名無しさん:2009/01/12(月) 19:44:27
いやわかるって。
リンカが「シンボルが見つからない」って言ってて
アンマングリングされた名前(デストラクタ)も示してくれてるんだから。

コンパイル通ってリンクエラーなら、宣言だけで実装がないとしか考えられない。
あと外部ライブラリでlibを指定してないとかもあるけどね。
114113:2009/01/12(月) 20:04:19
相変わらずタイミング悪いな俺。
>>113は108や111宛てだ。
質問者(おそらく初心者)はともかく、108がこの程度でエスパーとか言い出すのが不思議過ぎるよ。
115111:2009/01/12(月) 20:20:17
流れにワラタ、といえばよかったか
116デフォルトの名無しさん:2009/01/13(火) 04:43:57
自動変数は限りのあるスタックに置かれると書いてあったんだが、どのぐらいの容量までOKなのかどうやって知るの?
俺スコープ使うのばっかで、全くnewとかしてないんだけど、これからアプリがどんどんでかくなると思うと不安になってきた
117デフォルトの名無しさん:2009/01/13(火) 07:53:24
>>116
環境によるけど、コンパイラやリンカのマニュアルに何か書いてあることが多い。
118デフォルトの名無しさん:2009/01/13(火) 17:02:23
VCは1MB
119デフォルトの名無しさん:2009/01/13(火) 19:01:41
VCはデフォが1MB。コンパイルオプションでMB単位で指定可能。
120デフォルトの名無しさん:2009/01/13(火) 19:30:11
>>119
> MB単位で指定可能
おいおい。
121デフォルトの名無しさん:2009/01/13(火) 19:32:04
単位違ってたま
122デフォルトの名無しさん:2009/01/13(火) 22:38:12
スタックサイズって固定だっけ?
実行時に動的に増えたりしないの?
123122:2009/01/13(火) 22:43:24
VCで実験してみたら、余裕でスタックオーバーフローになった。
124デフォルトの名無しさん:2009/01/13(火) 22:53:19
>>122
WindowsやLinuxなどのOSの場合、初期サイズはうんと小さくて、
そこから増えていく(必要に応じて確保される)。その上限が>>119
125デフォルトの名無しさん:2009/01/13(火) 22:57:32
どんなにでかいソフトでもサイズオーバーするなんてありえない
int宣言100万個も保持するソフトなんて作ろうと思ってそうそうできるもんじゃない
126デフォルトの名無しさん:2009/01/13(火) 23:04:54
>>125
1MBなんだから、4バイトint換算で高高25万個だ。
うっかりヒープに取らずにスタックに取れば簡単に溢れるサイズでしかないよ。
127デフォルトの名無しさん:2009/01/13(火) 23:22:05


if (エラーチェック) {
 MessageBox(エラーメッセージ);
 func(); // 自分自身呼び出し
 return;
}

このまえ↑みたいなコードを見た。
エラーだったらメッセージ出して、再度処理させるみたいな。

まあ、ひらすたOKボタン押し続けるやつはいないだろうけど、これでいいのかって感じ。
128デフォルトの名無しさん:2009/01/14(水) 00:03:59
>>127
末尾再帰なら最適化で単純なループになる可能性は高い。
129デフォルトの名無しさん:2009/01/14(水) 00:11:34
文字列クラス使ってたから、末尾再帰にはなってなかった。
130デフォルトの名無しさん:2009/01/14(水) 12:30:35
引数を与えてないtemplate classに別名を付けることって可能でしょうか?
typedef std::vector localvector;
localvector<int> v;
というような書き方がしたいのですが。
131デフォルトの名無しさん:2009/01/14(水) 13:06:50
>>130
できません。

貼ってあるコードを見た感じだと意味無いんだけど、なんでそんなことがしたいの?
目的によっては代替方法があるかもしれない。
132デフォルトの名無しさん:2009/01/14(水) 14:05:52
C++のメンバ変数で公からの値の変更は受け付けずに、
自己クラス含め特定のクラスからのみの変更を受け入れるような場合、
アクセス関数を定義するしかないですか?

自己クラス以外から変更したいときは、アクセス関数をprivateにしておいてfriendを使うみたいな。
133デフォルトの名無しさん:2009/01/14(水) 16:41:19
>>131
引数にテンプレートクラスを受け取るテンプレートクラス
(例えばコンテナラップなテンプレートクラス)を書くときに
template<template<class> class T>な記述だと引数の個数などで
統一しにくい場合が多いので、何かもっと汎用性のある方法無いかと思いまして。
134デフォルトの名無しさん:2009/01/14(水) 17:29:43
template<typename T> struct localvector { typedef std::vector<T> type; };

みたいな感じで何とかするしかねぇんじゃねえの
135デフォルトの名無しさん:2009/01/14(水) 17:38:36
スレ違いだったら申し訳ないです。

IDirectMusicSegment8 *m_Segment[50];
質問@
これをクラス内のデフォルトコンストラクタで初期化する場合は
for(DWORD i = 0; i < 50; i++) {
m_Segment[i] = NULL;
}
以外にどんな方法がありますか?
-------------------------------------
質問A
クラスのprivate部分で
IDirectMusicSegment *m_Segment;
で宣言して
デフォルトコンストラクタ部分ではNULLで初期化

初期化する関数で
m_Segment = new ???[50]
メモリを確保できると思ったのですが???の部分をIDirectMusicSegmentにしても
できませんでした。
newでメモリを確保する場合はどうやればいいですか?
----------------------------------------------

先輩方レスよろしくお願いします
136デフォルトの名無しさん:2009/01/14(水) 17:50:57
>>135
つ[std::fill]
あと、ただ「できない」じゃなく、エラーが出たならエラーメッセージを貼れ。
137デフォルトの名無しさん:2009/01/14(水) 17:55:28
>>135
IDirectMusicSegment(というよりIUnknownとその派生すべて)は、
実装を持っていないインタフェース(C++的には抽象クラス)なのでnewできない。
どこかにIDirectMusicSegmentへのポインタを得る方法があるはずだから、それ使え。
138デフォルトの名無しさん:2009/01/14(水) 18:33:40
>>136 >>137

ありがとうございます

>どこかにIDirectMusicSegmentへのポインタを得る方法があるはずだから、それ使え。

探してみます〜
139デフォルトの名無しさん:2009/01/14(水) 20:59:51
多重継承のダウンキャストについて質問です。
---------------------------------------------
class BaseActor {
};
class MeshActor : virtual public BaseActor {
};
class SpriteActor : virtual public BaseActor {
};
class MainActor : public SpriteActor, public MeshActor {
};

int main() {
 MainActor* pActor = new MainActor();
 BaseActor* pBase = (BaseActor*)pActor;
 MainActor* p = (MainActor*)pBase; //エラー!!
 delete pActor;
}
-------------------------------------------------------------
で、コンパイルエラーメッセージは
..\src\cppTest.cpp:23: error: cannot convert from base 'BaseActor' to derived type 'MainActor' via virtual base 'BaseActor'
と出てしまいます。ですが、やりたいことは 「//エラー」の行のようなことなのです。

質問は、ひし形の基本クラスのポインタ(上記の例では pBase)のみがわかっている状況で、
そのポインタから、ひし形以降の派生クラスの型にダウンキャストできないのでしょうか、
上記の例では pBase から最初の pActor のようなポインタ変数がほしいのだが無理なのか。ということです。

いろいろ検索してみましたが、「どうやっても無理!」か否かが明確にわかりません。

どなたかご教授お願いいたいます。
140デフォルトの名無しさん:2009/01/14(水) 21:31:30
菱形って言うより仮想継承のダウンキャストができないってだけだと思うけど
141デフォルトの名無しさん:2009/01/14(水) 21:39:27
>>139
dynamic_cast しる。
ただし、仮想関数が最低でも1つは必要。
142デフォルトの名無しさん:2009/01/14(水) 21:40:20
普通はデストラクタが仮想関数だから
大して気にする必要はないがね。
143デフォルトの名無しさん:2009/01/14(水) 21:41:22
↓のソースで関数ポインタについて誰か助けて下さい
○ データ型 (void (*)(char*)) の観点からは (*p)() と p() とではどちらが自然な書き方ですか?
○ if 文以下で定数式を使って関数を呼び出すことはできませんか?可能ならば,関数の処理内容を16進でダンプしたいのです

#include <stdio.h>

void func(char* str) { printf("%s\n",str); }

int main(void)
{
void (*p)(char*) = func;

func("call func()"); // call func()
(*p)("call (*p)()"); // call (*p)()
p("call p()"); // call p()

printf("%x\n",func); // 実行するといつも 80483d4
printf("%x\n",p); // 上と同じ

if (func == (void (*)(char*))0x80483d4) {
0x80483d4("call 0x80483d4()"); // test.c:21: error: called object '134513620' is not a function
(*0x80483d4)("call 0x80483d4()"); // test.c:22: error: invalid type argument of 'unary *' (have 'int')
(void (*)(char*))0x80483d4("call 0x80483d4()"); // test.c:23: error: called object '134513620' is not a function
*(void (*)(char*))0x80483d4("call 0x80483d4()"); // test.c:24: error: called object '134513620' is not a function
}
}
144143:2009/01/14(水) 21:46:54
>>143
今やってみたら,後ろの方は↓であっさりコンパイルできました.すみませんOTL
(*(void (*)(char*))0x80483d4)("call (*(void (*)(char*))0x80483d4)()")
145デフォルトの名無しさん:2009/01/14(水) 21:47:32
>>143
C の規格では、関数呼び出し演算子は以下の2通りの使い方が可能であると規定されている。

関数(引数)
関数ポインタ(引数)

つまり、どちらでも構わない。
個人的には (*p)(); とか冗長で読み辛いので p(); の方が好きだが、
関数ポインタであることを強調した方が良いという考え方の人なら (*p)(); の方が好きだろうな。
146143:2009/01/14(水) 21:51:27
>>143
また,いまやってみると,↓もコンパイル通りました.
((void (*)(char*))0x80483d4)("call ((void (*)(char*))0x80483d4)()");

(*p)() と p() までは C の約束で同義として捉えていたのですが
((void (*)(char*))0x80483d4)() と (*(void (*)(char*))0x80483d4)() までもが同じというのは..どうもとっつけません...
147デフォルトの名無しさん:2009/01/14(水) 21:56:29
>>146
関数(引数)        →  (*(void (*)(char*))0x80483d4)()
関数ポインタ(引数)  →  ((void (*)(char*))0x80483d4)()

何か問題でもあるか?
148デフォルトの名無しさん:2009/01/14(水) 22:08:19
>>147
データ型が *(void (*)(char*)) → 関数(引数)
データ型が void (*)(char*)   → 関数ポインタ(引数)

ということですか?

だとすると func は関数なので,そのデータ型は *(void (*)(char*)) でいいんですか?


あと,

int* p = malloc((size_t) sizeof(int)); // 仮に 0xff が返ったとする
*p = 10;

のときに

*p(=10) と p(=0xff) は違うというのは,全く無関係な世界の話し..ということでいいのですか?
149デフォルトの名無しさん:2009/01/14(水) 22:11:11
ばかなの
150デフォルトの名無しさん:2009/01/14(水) 22:13:00
関数ポインタはいくらデリファレンスしても関数ポインタのまま。
151デフォルトの名無しさん:2009/01/14(水) 22:16:36
func の型は void (char*) だな。(配列型へのキャストが無理なのと同じく、この型への直接的なキャストは無理だが)
typedef すると分かるが、
typedef void foo(char*); とした時、
foo* は関数ポインタになる。
だから、foo は関数を表す型である。
もし foo が関数ポインタ型なら、
foo* は関数ポインタへのポインタ型となるからね。

>全く無関係な世界の話
まあそうだな。
関数型の値を関数ポインタ型の変数に代入しようとすると、
自動的に関数ポインタ型へと変換される。
このあたりは、配列とポインタの関係に似ている。
152デフォルトの名無しさん:2009/01/14(水) 22:30:08
>>151
処理系が関数呼び出し演算子 () を見つける

() の前にある式のデータ型を確認する

そのデータ型が「関数」かまたは「関数ポインタ」であれば,それに対応する関数を呼び出す

「関数」のデータ型      → void (char*) // キャスト不可
「関数ポインタ」のデータ型 → void (*)(char*)

ということですね

> 関数型の値を関数ポインタ型の変数に代入しようとすると、
> 自動的に関数ポインタ型へと変換される。
納得です.すっきりしました.どうもありがとうございます
153デフォルトの名無しさん:2009/01/14(水) 22:38:50
>>152
自分用のチラシの裏.スレ汚しスマソ

(*p)() // *p は関数型 void (char*)
p() // p は関数ポインタ型 void (*)(char*)

(*(void (*)(char*))0x80483d4)() は関数型へのキャスト?
((void (*)(char*))0x80483d4)() は関数ポインタ型へのキャスト
154デフォルトの名無しさん:2009/01/14(水) 22:39:43
>>150 によると *p も関数ポインタ型のようだが。
155デフォルトの名無しさん:2009/01/14(水) 22:41:44
C++ でチェックしてみた。

#include <iostream>
#include <typeinfo>

void foo() { }
void (*p)();

int main() {
std::cout << typeid(foo).name() << std::endl;
std::cout << typeid(p).name() << std::endl;
std::cout << typeid(*p).name() << std::endl;
}

出力
FvvE
PFvvE
FvvE

*p はやっぱり関数型じゃねえか。
156デフォルトの名無しさん:2009/01/14(水) 22:42:30
****p();
を試したらわかるんでないか
157デフォルトの名無しさん:2009/01/14(水) 22:43:27
関数型の値に * をつけると、
一旦関数ポインタ型に変換されてから
また * が作用して関数型に戻るんでないかい?
158デフォルトの名無しさん:2009/01/14(水) 23:11:45
以下の4つは全部同じ

printf("%p\n", func);
printf("%p\n", &func);
printf("%p\n", p);
printf("%p\n", *******p);

うろ覚えだけど、

関数型は値を評価すると自動的にアドレス(関数ポインタ型)に変換されるので、
関数ポインタ型を間接参照で関数型にしてもまた自動的にアドレスに変換される
(関数ポインタ型の間接参照は実質的に意味をなさない)

だったかな
159デフォルトの名無しさん:2009/01/14(水) 23:13:50
関数型の値は左辺値で、
右辺値に変換すると関数ポインタ型の値になる。
160デフォルトの名無しさん:2009/01/14(水) 23:28:38
>>155
C/C++の式の世界には「関数」は存在できない
生の関数が出現すると即座にその関数ポインタに変換される

だがsizeofとtypeidの中は関数が関数として存在できる数少ない例外的な場所になってる
だからtypeidすると「関数型」を見ることは出来るが、外でそれを使うことは出来ない
(ちなみにもう一つは「単項&演算子のオペランドになる時」=結局行き着く先はポインタ)
161デフォルトの名無しさん:2009/01/14(水) 23:32:37
>>160
いい加減な事を言うなよ。
関数は左辺値であるから、
左辺値を要求する所に使えば関数は関数のまま存在できるし、

typedef void hoge();
hoge& r = foo;

そもそも関数の使い方で最も代表的な関数呼び出しでは
関数が関数のまま扱われているだろう。規格的に考えて。
162デフォルトの名無しさん:2009/01/14(水) 23:39:40
>>161
そりゃ関数の参照だからだな。関数の参照は存在できるよ
hoge f = foo;みたいに関数そのものを作ろうとするとfは関数ポインタになるよ

あと関数呼び出し演算子のオペランドは関数ポインタだから
r()と呼び出せるのは関数の参照から関数のポインタに暗黙変換されるから
163デフォルトの名無しさん:2009/01/14(水) 23:41:07
>>162
規格読め。
関数呼び出し演算子のオペランドは関数あるいは関数ポインタと規定されている。
164デフォルトの名無しさん:2009/01/14(水) 23:41:48
左辺値と右辺値という言葉くらいは調べてから出直してこい。
165デフォルトの名無しさん:2009/01/14(水) 23:43:46
a.foo(); みたいなのもあるからな。
() のオペランドが関数ポインタだけとすると不都合がある。
166デフォルトの名無しさん:2009/01/15(木) 00:01:34
>>163
どこにそんなこと書いてあるんだ?

6.5.2.2 Function calls
The expression that denotes the called function shall have type pointer to function
returning void or returning an object type other than an array type.

で、注にはこう書いてる
Most often, this is the result of converting an identifier that is a function designator.

関数呼び出し演算子がさも「関数」に適用できてるかのように見えてるのは、
実際には関数から暗黙変換された関数ポインタに適用されてるんだ
167デフォルトの名無しさん:2009/01/15(木) 00:18:58
あー、C++では違うんだな
ごめん
168デフォルトの名無しさん:2009/01/15(木) 00:36:23
>>165
それって「a.foo()」で一つの構文じゃないの?
「a.foo」に関数呼び出し演算子を適用すると解釈するなら「a.foo」って何になるの
169デフォルトの名無しさん:2009/01/15(木) 07:14:41
C/C++ スレだから両者で違う点について話す時はややこしいな。
170デフォルトの名無しさん:2009/01/15(木) 18:14:35
char abc[]="ABC"; /* 文字列変数宣言 */
char *p; /* ポインタ変数宣言 */
char wk;

p = &abc[0];


p = abc;

は同じですか?
171デフォルトの名無しさん:2009/01/15(木) 18:45:01
同じです
172デフォルトの名無しさん:2009/01/15(木) 19:10:19
ビット演算?(16進数)がいまだによく分からないのですが
分かりやすいサイトなどご存じないでしょうか?

スレ違いでしたら申し訳ないです

(それと2月18日にC言語検定2級を受けるのですが
特に抑えておいたほうがいいポイントはありますか?)

173デフォルトの名無しさん:2009/01/15(木) 19:47:25
ビット演算がわからんというのもよくわからん
十六進数から二進数への変換はわかるよな?
その逆もわかるよな?
ANDとORとNOTの意味はわかるよな?
右シフト、左シフトもわかるよな?

全部わかってるならビット演算を全部わかってることになるから大丈夫
174デフォルトの名無しさん:2009/01/15(木) 20:14:08
16進数は2進数を4ケタまとめて1ケタで表す
それだけ
175デフォルトの名無しさん:2009/01/15(木) 20:14:32
孔子はこう言った

ならず者にはポインタを、聖なるものには列挙体を

アラベスクに幸あれ
176デフォルトの名無しさん:2009/01/15(木) 20:54:12
オブジェクト(内の変数の値)をファイルに保存・復元する
お手軽な方法ってないでしょうか?
.NetのXmlSerializerみたいな感じで。(別にXMLじゃなくても良いです)

環境はVC++2008 Expressです。
よろしくお願いいたします。
177デフォルトの名無しさん:2009/01/15(木) 20:58:18
>>176
参照だとかポインタだとか、他のオブジェクトの依存関係がどうなってるかは設計者しかしらんことだ。
一律に単純にやる方法は無いと思う。
178デフォルトの名無しさん:2009/01/15(木) 21:01:02
boost 導入してみるとか
179デフォルトの名無しさん:2009/01/15(木) 21:19:23
>>177
やっぱそうですか。自分でがりがり書くことにします。

>>178
serializationあたりでしょうか?
状況によって役に立つようでしたら使ってみます。


ともかくありがとうございます。
180デフォルトの名無しさん:2009/01/15(木) 21:44:51
ビット演算の~って

0xf003 だったら 0x0ffc ですけど

0 → f
f → 0
c → 3
3 → c

って感じでいいんですか?
181デフォルトの名無しさん:2009/01/15(木) 21:54:13
チルダは反転だな
0x0 = 0000b → 1111b = 0xF
0xC = 1100b → 0011b = 0x3

あってるけど、分からなきゃ一度2進数に変えた方がいい
182デフォルトの名無しさん:2009/01/15(木) 21:58:37
まあ4 bits 単位で見たらそういうことなんだけど、はじめは2進数に直して考えたほうがいいと思う。

都合よくCで説明されているので
http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97
183デフォルトの名無しさん:2009/01/15(木) 22:00:00
>>181 182

ありおがとうございます
184デフォルトの名無しさん:2009/01/15(木) 22:03:11
>>183
> ありおがとうございます

ありおwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
185デフォルトの名無しさん:2009/01/15(木) 22:29:37
istreamから前方反復子って作れないんですか?
186デフォルトの名無しさん:2009/01/15(木) 22:48:32
istream_iterator
187デフォルトの名無しさん:2009/01/15(木) 22:51:11
<iterator> に std::istream_iterator ってのがある。
だがしかし・・・ ++ の仕様が期待通りではないかもしれない。( >> で読み出しているので)
もし期待通りのものでなかったなら、
簡単に作れるので自分で作ってみてもいいかと。
188デフォルトの名無しさん:2009/01/15(木) 22:53:54
それって入力イテレータじゃないの?
189デフォルトの名無しさん:2009/01/15(木) 22:55:09
istream_iteratorは入力反復子だろ。

<boost/spirit/iterator/file_iterator.hpp>が読み取り専用でランダムアクセスできるという触れ込み。
http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/file_iterator.html
190デフォルトの名無しさん:2009/01/15(木) 22:58:05
char *st[] = { "ne", "ushi", "tora", "u", "tatu", "me", "uma", "hituji", "tori", "inu", "i" };

char *pt1, *pt2;

pt1 = *st;
pt2 = *(st + 7);

printf("%c\n", (*pt1) + 1);

出力される文字がoなのですが30分考えてもなんでか分かりません・・・

教えていただけませんか (*pt1) で nをさして + 1 で次のe だと思ったのですが・・
191デフォルトの名無しさん:2009/01/15(木) 22:59:38
>>187
つistreambuf_iterator
192デフォルトの名無しさん:2009/01/15(木) 23:01:01
アルファベット順(というか文字コードの順)に並べて、nの次の文字がoだったから。
*pt1の段階で、*を剥がしまくってもはやnという文字そのものと化している。
193デフォルトの名無しさん:2009/01/15(木) 23:01:45
>>192

そういうことだったのか!!!

ありがとうございました

かなりスッキリしましたw
194デフォルトの名無しさん:2009/01/15(木) 23:03:49
>>191
なるほど。いいものがあるんだな。
195デフォルトの名無しさん:2009/01/15(木) 23:09:46
入力反復子でアルゴリズムを適用すると、読み取った部分って捨てられてしまうよね?
普通は読み取った部分が欲しいはずなんだけど、これってどうなってるの?
196デフォルトの名無しさん:2009/01/15(木) 23:10:34
あほなの?しぬの?つけ忘れた。
197デフォルトの名無しさん:2009/01/15(木) 23:14:50
>>190
*pt1は'n'なので、'n'+1で'o'
198デフォルトの名無しさん:2009/01/15(木) 23:29:28
>>195
copyとかtransformとかfor_eachとか読み取ったのが捨てられて構わないアルゴリズムに活路を見出すんだ。
199デフォルトの名無しさん:2009/01/16(金) 05:01:52
再帰ってどこまで深くできるんですか?
戻ってこられるように元の場所を保持し続けたらいつかは限界がくると思うんですが
200デフォルトの名無しさん:2009/01/16(金) 05:20:28
スタックが溢れるまで
201デフォルトの名無しさん:2009/01/16(金) 05:23:02
場合によっては永遠に
202デフォルトの名無しさん:2009/01/16(金) 06:01:04
goto文を使うと最適化が無効になると書いてあったんですが
全体が無効になるんですか?それとも使用している関数内で無効になるんですか?
203デフォルトの名無しさん:2009/01/16(金) 06:05:20
迷路を再帰で脱出するプログラムがあったので、あまり大きな迷路は無理なのかなーと
保持するのに使うメモリ容量がわかりませんが、32bit使うとしたら、1Mまで再帰中に変数を使わなかったとして
250k階層まで深くできるってことですか?
204デフォルトの名無しさん:2009/01/16(金) 06:06:08
特定のコンパイラでそういうこともあるかもしれないが一般的な事象ではないな。
205デフォルトの名無しさん:2009/01/16(金) 06:09:31
例外処理は仕組みがわかってもどこで使えばいいのかわからず活用できないでいます。
例外が発生しそうな部分を囲むってあるんですが、場所がわかるなら1行をtryで囲めばいいですよね?
mainの次のネストで囲って全プログラムに適応した方が2か所以上例外が出る場合は面倒がないし、1回で書ける
とかいう理由で使えばいいんでしょうか?
206デフォルトの名無しさん:2009/01/16(金) 07:20:37
template<typename T>
typedef std::vector<T *> pointers<T>;

pointers<int> int_ptrs;

ということはできませんか?
207デフォルトの名無しさん:2009/01/16(金) 07:27:07
>>205
1行を囲むような try は、たぶん適切な使い方じゃない。
一般的なコンソールアプリケーションだと main() にひとつ try を
置くだけで十分なことがほとんど。
C++ FAQ "[17.13] I have too many try blocks; what can I do about it?"
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.13

こっちも参考になるかもしれない。
C++ FAQ "[17.12] Exception handling seems to make my life more difficult; clearly I'm not the problem, am I??"
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.12
208デフォルトの名無しさん:2009/01/16(金) 07:33:43
>>206
無理
209デフォルトの名無しさん:2009/01/16(金) 07:34:52
>>206 >>130-131

>>133
↓こんなのが使えるかもしれない。テンプレートメタ関数ってやつね。

template<typename T>
struct vector_of { typedef std::vector<T> type; };

vector_of<int>::type int_ptrs;
210デフォルトの名無しさん:2009/01/16(金) 08:31:07
>>205
×適応
○適用
211デフォルトの名無しさん:2009/01/16(金) 11:41:14
212デフォルトの名無しさん:2009/01/16(金) 14:32:59
#include <iostream>
class X {
public:
void show() { std::cout << "X" << std::endl; }
};

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

int main()
{
Y y;
y.show();
}
ってしたらこんぱいるできないんですがなんでですか?
213デフォルトの名無しさん:2009/01/16(金) 14:48:29
宣言にはセミコロン必要。
214デフォルトの名無しさん:2009/01/16(金) 15:04:49
>>212
オーバーライドされたから。
y.X::show();
215デフォルトの名無しさん:2009/01/16(金) 15:05:06
>>212
Y::show によって X::show が隠されるから。
両者は別物で、両方をまたがってオーバーロード解決はできない
216デフォルトの名無しさん:2009/01/16(金) 15:08:56
YのshowがXのshowを隠蔽するから。

class Y : public X {
public: using X::show;
 (略)
};
というように書けば、Yの中でshowがX::showを隠蔽していても、X::showが選択肢に追加される。

return 0;
217デフォルトの名無しさん:2009/01/16(金) 15:32:10
g++,cygwinです
1.ファイルの有無を確認する方法はありますか?
  Cでは読み込み専用のファイルオープンでファイルの存在確認した後上書き確認の表示してましたが、C++も同様(ifstreamで確認)ですか?

2.int型を16進バイナリで出力したい
  std::ofstream ofs_out( filename, std::ios::out | std::ios::binary );
  oofs_output << std::setw(4) << std::setfill('0') << std::hex << 0xFFFF;
  このコードでは出力先にFFFF(0x46464646)がそのまま表示されますが、どうすればファイルにバイナリで0xFFFFを出力できますか?

3.string->int でエラーを検出したい
  std::istringstream iss(str);
  int i;
  iss >> std::hex >> i;
    (または、i = boost::lexical_cast< int >( str ); )
  このコードで、str="123w"の場合、i=0x123となりそのまま実行されますが、エラーとして処理したいです。
  strtol関数の他に何か方法はありますか?

お願いします。
218デフォルトの名無しさん:2009/01/16(金) 16:25:14
>>217
1. それでもいいでしょう。
2. oofs_output << 0xFFFF;
3. if (!(iss >> std::hex >> i).eof()) { /* error handling */ }
219デフォルトの名無しさん:2009/01/16(金) 19:58:35
>>203
関数コールするたびに、引数の合計分と、関数を出たときに戻るアドレス分スタックが消費される。
220デフォルトの名無しさん:2009/01/16(金) 19:59:19
消費スタックサイズ量を保持する分もスタック使ったかも
221デフォルトの名無しさん:2009/01/16(金) 20:09:48
>>218
ありがとうございます。
1は実装してませんが後でやってみます。3はできました。
2は10進のテキスト(ASCII)で表示され、0xFFFFは出力されませんでした。
書き忘れてしまって申し訳ないのですが、欲しい出力形式はint型変数の下位2バイト、16進数4桁(0x0000〜0xFFFF)です。
  int var[10] = {0,1,2,3,4,5,(.....)}; //ここに出力したいデータが入っている
  std::ofstream oofs_output( "out.txt", std::ios::out | std::ios::binary );
  for(int i=0; i<5; ++i)
    oofs_output << std::setw(4) << std::setfill('0') << std::hex << var[i];
としたとき、
  > od out.txt -x
  0000000 0000 0001 0002 0003 0004 0005
という出力を得たいです。実際はASCIIコードでこうなってしまいます
  > od out.txt -x
  0000000 3030 3030 3030 3031 3030 3032 ...

下のように共用体で実装したら意図した結果が得られましたが、
代入のし直しは無駄な気がしてあまりやりたくないです。
  int var[10] = {0,1,2,3,4,5,(.....)};
  union test{
    char c[4];
    int i;
  }ut;
  for(int i=0; i<10; ++i){
    ut.i = var[i];
    oofs_output << ut.c[0] << ut.c[1];
  }
222デフォルトの名無しさん:2009/01/16(金) 20:24:38
write使え
223デフォルトの名無しさん:2009/01/16(金) 20:34:35
WindowsでVisual C++ 2005を使っています。

isgraphでsjisの2バイト文字も判定させるにはどうすればいいでしょうか。
他に有用なライブラリがあれば教えてください。
224デフォルトの名無しさん:2009/01/16(金) 20:48:17
>>222
char型にする必要はありますか、、
225デフォルトの名無しさん:2009/01/16(金) 20:55:40
>>223
_ismbb系
226デフォルトの名無しさん:2009/01/16(金) 20:56:43
板違いかもしれませんが、
C言語のライタとコンパイラの機能をもつGCC Developer Liteというソフトがインストールできません。
ファイルを開く、実行、言語選択まで進めるのですがその後エラーを知らせるメッセージが表示されインストールができません。
8.3filenameというフォーマットに私のPCが対応していないらしいのです。調べたところ、8.3filenameはMicrosoft の初期の
OSのフォーマットで、Windows XPも対応しているようなのです。
原因のわかる方、何か思いついた方、何かアドバイスをいただけたら非常に助かります。

・表示されたメッセージ
Your PC dose not support 8.3filename format.
Cannot continue installation of this program.

・インストールしようとしたファイル
GCC Developer Lite Ver.2.1.0.20r2 GDLFull2.1.0.20r2.exe (81Mb)
サイト
http://www.besttechnology.co.jp/download/

・私のPC環境
購入元
マウスコンピュータ
OS
Microsoft Windows XP Home Edition Version 2002 Service Pack 3
CPU
Intel(R) Core(TM)2 CPU T7200 2.00GHz
メモリ
2GB
227217:2009/01/16(金) 21:00:43
>>222
こうですね、スマートにできました、ありがとうございました。
oofs_output.write( (char*)&var[i], sizeof(int)/2);
228デフォルトの名無しさん:2009/01/16(金) 21:05:43
printfで表示するとき
%3.1fだとすると

3ケタで小数点は1ケタまで表示ですが

1.255とかだったら

1.2ですけど.も桁数にカウントするんですか?
229デフォルトの名無しさん:2009/01/16(金) 21:10:57
しません
230デフォルトの名無しさん:2009/01/16(金) 21:12:17
桁数って考か文字列の幅って考えだから
231デフォルトの名無しさん:2009/01/16(金) 21:52:12
1.255で"%3.1f"なら1.3だな。
232デフォルトの名無しさん:2009/01/16(金) 23:16:19
>>213
なんの話をしてるんですか?
>>215-216
ありがとうございました
233デフォルトの名無しさん:2009/01/16(金) 23:26:25
初歩的な質問ですが・・・
よく関数のオーバーヘッドと言うものを聞くのですが、これは
class A
{
void funcA();
void funcB();
void funcC();
}
とあった場合に、funcA〜funcCの中から呼ばれた関数を探し当てるのにかかる時間のことという理解でいいでしょうか?
つまりメンバ関数の数が増えるほどかかる時間は多くなる、、ということかと思っているのですが。
そしてそれを避けるためにinlineが存在すると。
234デフォルトの名無しさん:2009/01/16(金) 23:38:48
探すのなんてリンク時にやることだ。
実行時にそんなことしない。

関数呼び出し時には
・ リターンアドレスをスタックに積む
・ 命令の実行位置を関数のあるところに移動する
という処理が必須。
関数から戻ってくる際には
・ リターンアドレスを読み出す
・ 命令の実行位置をリターンアドレスに移動する
という処理が必須。
メモリアクセスとジャンプは両方とも遅い処理。
235デフォルトの名無しさん:2009/01/16(金) 23:39:38
>>233
探し当てる時間というのはまぁある意味あってるが、少し理解よくない感じに間違ってる

関数の呼び出し元には、どこに関数があるかが書いてあって、それを元に関数に飛ぶ感じに近い
つまりメンバ関数増えても探すのに時間がかかるようになることはない
236デフォルトの名無しさん:2009/01/16(金) 23:40:05
CやC++の場合、それはコンパイル時に決まる事柄。
オーバーヘッドとされるのは、実際の実行位置の変更や引数・戻り値の受け渡し。
237233:2009/01/17(土) 00:11:49
>>234,235,236さん、ありがとうございます。
こんなに早くわかりやすい返信が来ると思いませんでした。。

つまり関数を呼ぶときには、戻ってこないと駄目なので自分の位置を記憶してから
別の関数に飛ぶということですね。
それがinline関数だと直にその関数が呼ばれた場所におかれるので記憶も飛ぶ必要も
無くなるということがわかりました。
両方とも遅い処理なのでしたら、かなり実行速度を気にするプログラムを書く場合は
要所要所でinlineを使ったほうがいいということですか。。
238デフォルトの名無しさん:2009/01/17(土) 00:18:51
いいえ、関数を静的にしたら後はコンパイラに任せてしまいましょう。
239デフォルトの名無しさん:2009/01/17(土) 00:20:08
命令もメモリ上に置いてあって
命令を実行するのもメモリアクセスが必要だから、
キャッシュに載るくらいコンパクトな方が
キャッシュ効率は良くなる。
大きな処理を inline 化して、それが inline 展開されまくると、
逆に遅くなるなんてこともある。
あるいは、速くはなったけど、ファイルサイズが妙に肥大化したり。
まあ、実際には inline にしても inline 展開されるとは限らないけどね。

どんな処理を inline 関数にするのがベストなのかは難しいところだけど、
inline 関数の中身は短い1文かそこら程度で終わるもののみにするのが一般的。
240デフォルトの名無しさん:2009/01/17(土) 00:20:44
>>234
関数呼び出し時にリターンアドレスをスタックに積むとは限らない
リンクレジスタを持つCPUだったり
末尾の最適化で消されたり
241デフォルトの名無しさん:2009/01/17(土) 00:21:40
それを言ったら、inline じゃなくても最適化で inline 化されたり。
242デフォルトの名無しさん:2009/01/17(土) 00:22:51
>inline 関数の中身は短い1文かそこら程度で終わるもののみにするのが一般的。
アナクロな発想は身を滅ぼす典型ですね。
243デフォルトの名無しさん:2009/01/17(土) 00:26:54
inline 関数はヘッダに書かなきゃいけないから、
再コンパイル範囲が広くなってしまう。
だから複雑な処理を書いたら、
修正が必要になった時に場合によっては面倒臭いことになる。
そういった意味でも複雑な処理を書かないのは普通だ。
244デフォルトの名無しさん:2009/01/17(土) 00:32:46
>>243
>238
245デフォルトの名無しさん:2009/01/17(土) 00:34:20
全部静的とかありえねー。
趣味プロかよ。
246デフォルトの名無しさん:2009/01/17(土) 00:35:05
inline つけたら展開しちゃって遅くなるって実際ありうるの?
早くなりそうなら普通の関数を展開してもいいよっていうオプションがあるぐらいだし、
コンパイラがうまいこと判断してくれそうな気がなんとなくするんですが
247デフォルトの名無しさん:2009/01/17(土) 00:35:08
そんなときはオブジェクト間最適化を備えたコンパイラを使えばOK。
248デフォルトの名無しさん:2009/01/17(土) 00:35:47
テンプレートのせいでinlineの有無にかかわらずヘッダに書かざるを得ないことのほうが多い。
249デフォルトの名無しさん:2009/01/17(土) 00:37:17
>>246
gccの例だけど、インライン展開によってオブジェクトモジュールが大幅に大きくなってしまうケースで且つ、
インライン展開されたコードが殆ど実行されない場合に、ロード時間を含めて計測すると遅くなったことはある。
逆に言えば、余程の事がない限り遅くなるようなケースはないと考えていいと思う。
250デフォルトの名無しさん:2009/01/17(土) 00:41:12
テンプレートは仕方が無いよね。
面倒臭いからクラス宣言内で関数実装しちゃうから
全関数がinlineになっちゃう。
251デフォルトの名無しさん:2009/01/17(土) 01:55:06
>>246
関数がある程度の大きさを持っていて、
しかもその関数がありとあらゆるところで使われまくってると
出力コードが肥大化して、キャッシュヒット率が下がって遅くなるかも。
252デフォルトの名無しさん:2009/01/17(土) 01:56:10
>>251
あらゆるところで呼ばれる関数ならキャッシュに居つくんじゃねーの
253デフォルトの名無しさん:2009/01/17(土) 02:00:00
>>252
インライン化されたらコードが実行部分に分散する。
254デフォルトの名無しさん:2009/01/17(土) 02:00:16
>>252
inline展開されたら?
255デフォルトの名無しさん:2009/01/17(土) 02:12:51
速度が問題になるまでコンパイラに任せとけばおk
256デフォルトの名無しさん:2009/01/17(土) 07:33:41
みなさんありがとうございます
>>249
なるほど、そういうことがあるんですか
でもやっぱ基本コンパイラが判断してくれるんですね
>>251
関数大きかったら展開しないんじゃないの?
257デフォルトの名無しさん:2009/01/17(土) 08:33:51
関数が巨大でも、必要と判断したらインライン展開するのが今のコンパイラ。
但し、コードキャッシュが問題になる程度のプログラムでは殆ど影響が出ない。
258デフォルトの名無しさん:2009/01/17(土) 10:34:56
u_char array[] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}

という配列があったとするとarray[1]は0x34になりますが
array[1]を無理矢理u_intとして読み込むことは可能でしょうか?

つまり&array[1]のアドレスにあたかもu_intが格納されているように見なして
0x9A785634という値(リトルエンディアン)を取り出したいのです。

array[4]<<24 + array[3]<<16 + array[2]<<8 + array[1]

を計算すれば同じ値が得られますが
もう少し低レベルにメモリを直読みするような文法は
無いのかなということで質問させていただきました。
259デフォルトの名無しさん:2009/01/17(土) 10:35:08
>>253
勘違いしていた。
あらゆるところで呼ばれる関数コールがなぜコスト増になるんだ?って思っちまった。
インライン展開したら、か。
そりゃ無駄だな。
260デフォルトの名無しさん:2009/01/17(土) 10:36:53
>>258
*reinterpret_cast<u_int*>(&array[1])
261デフォルトの名無しさん:2009/01/17(土) 10:39:39
>>260
即レスどうもです!
262デフォルトの名無しさん:2009/01/17(土) 10:57:10
BOOL m_fLostDevice;

BOOLなどの場合fをつけることが多いですが

これは初期化する際にfalseということですか?
263デフォルトの名無しさん:2009/01/17(土) 11:04:41
flag?
264デフォルトの名無しさん:2009/01/17(土) 11:14:26
>>261
>260では環境によっては破綻するよ。
そうでない環境ならコンパイラが>258でも最適化で>260と同じコードにしてくれるかもしれないからお勧め。
厳密には環境依存になるけど、これもあり。
union {
u_char c[sizeof(u_int)];
u_int i;
} foo;
for (unsigned ic = 0; ic < sizeof(foo); ++ic) foo.c[ic] = array[1 + ic];

>>262
単にフラグ(flag)の意味じゃね?
265デフォルトの名無しさん:2009/01/17(土) 11:46:38
機能のinline展開の話題に乗っかって質問させてほしいんですが
FileA.cpp ,FileA.h
FileB.cpp ,FileB.h
という
二つのファイルとヘッダがあったとして、
FileA.cpp内部のClassAでは、FileB.cpp内部のClassBを持っていて、ClassAからは頻繁にClassBの
メンバ関数が呼ばれるとします。
そこで速度が気になりだしてClassBのメンバ関数をinline化したいとなったときはどうすればいいのでしょう?
単純にinlineをつけただけでは別のcppファイルのinline関数を予防とするとエラーになるのですが
266デフォルトの名無しさん:2009/01/17(土) 11:47:53
inline は内部リンケージ
267262:2009/01/17(土) 11:50:10
レスありがとうです

フラグという意味ですかw
268デフォルトの名無しさん:2009/01/17(土) 11:51:27
このスレの最近の流れはすばらしいなぁ
Win32APIスレにみせてやりたいわっ
269デフォルトの名無しさん:2009/01/17(土) 11:57:00
>>266
なるほど、、staticと同じという感じですね。
つまり別のcppファイルのinline関数を呼ぶためには
ヘッダーの宣言部ですでにinline関数だけでも実装しておかなくてはならないということか
270デフォルトの名無しさん:2009/01/17(土) 12:56:41
プロセス:君の全てを見せてくれないか
FILE *fp = fopen(”yome.conf”, “r+”);
ファイル:や、開かないで、開いちゃいや ///
プロセス:ほら、よーく見せてごらん
while( !feof(fp) ) printf( “%c”, (char)fgetc(fp) );
ファイル:見ないで、恥ずかしいよ ///
fseek( fp, 0L, SEEK_SET );
プロセス:君の設定を最後の1バイトまで書き換えてあげるよ
fprintf( fp, “[あなた好みの設定でおk]” );
ファイル:らめぇぇぇ ////
プロセス:ずっと一緒にいようね
ファイル:///
fclose( fp );
271デフォルトの名無しさん:2009/01/17(土) 13:04:41
(char) へのキャストは別に要らないんじゃね?
規格的にはどうなんだろう。
%c は char -> int で変換された(可変個引数の仕様により変換された)値しか受け付けないのか、
それとも fgetc の返す EOF 以外の値(つまり符号無しの値)をそのまま渡して良いのか。
272デフォルトの名無しさん:2009/01/17(土) 13:06:53
最後にゴミをプリントするけどいいのか?
273デフォルトの名無しさん:2009/01/17(土) 13:13:17
int ch; while( (ch = fgetc(fp)) != EOF ) printf( "%c", ch );

だぁな。
しかし、fopen の ( ) の中だけは空白入れてないのに何かポリシーあんのか?
274デフォルトの名無しさん:2009/01/17(土) 13:49:46
>>271
暗黙の型変換が行なわれるので、厳密に解釈するとfgetc()の戻り値を一旦charにしてから再びintにすることになる。
その影響を受けるのは、最後の1回だけではあるが。

>>270
つーか、先頭に戻すだけならrewind()を使えばいいのに。
275デフォルトの名無しさん:2009/01/17(土) 13:56:39
printf( “%c”, (char)fgetc(fp) );

(char)を入れると、符号拡張で値が変わる可能性あるな。
276デフォルトの名無しさん:2009/01/17(土) 14:28:06
大丈夫、どっちみち255だ。
277デフォルトの名無しさん:2009/01/17(土) 14:35:07
printf()の%cって、マイナス値が送られてきたらどうなるんだろう。
278デフォルトの名無しさん:2009/01/17(土) 14:37:32
>>277
大丈夫、最下位1バイトを送出するだけだ。
279デフォルトの名無しさん:2009/01/17(土) 15:07:07
次のような場合でXのメンバ関数testの中の変数をインスタンス生成時に初期化できませんか?
iをXのメンバ変数にして、コンストラクタで初期化すればいいんですが、iを使うのはtest関数の中だけなので・・。
class X{
public:
  void test(void){
    static int i=0;
    if(i==1) std::cout<< "i=1" << std::endl;
    i=1;
  }
};
int main(void){
  X objx;   objx.test;
  X objx2;  objx2.test; //i=0になってほしい
}
//結果
i=1
280デフォルトの名無しさん:2009/01/17(土) 15:10:47
メンバ変数にすべきだろ
インスタンスごとにiのインスタンスを別にしたいならstaticは使えない
そもそもiは何だ?
281デフォルトの名無しさん:2009/01/17(土) 15:22:02
iは色々処理をしてある条件の時に1になるフラグみたいなものです。
インスタンス生成時に0にしたいけれどtest関数でしか使わないからtestのメンバで・・って考えてました。

>インスタンスごとにiのインスタンスを別にしたい
確かにこの通りです。メンバ変数にするべきですね。
ややこしく考えすぎでした、ありがとうございました。
282デフォルトの名無しさん:2009/01/17(土) 15:22:12
>>278
規格でそうなってんの?
知りたいのはそこなんだが。
283デフォルトの名無しさん:2009/01/17(土) 16:08:10
じゃあなんで規格読まないの?
文盲なの?
284デフォルトの名無しさん:2009/01/17(土) 16:08:46
int型の配列をすべて0で初期化したいんですが、C++にmemsetと同じことができる関数はありますか?
285デフォルトの名無しさん:2009/01/17(土) 16:11:56
>>284
memset
完璧に同じ動作する
286デフォルトの名無しさん:2009/01/17(土) 16:13:06
>>284
std::fill を使っても良いが、
int なら memset で十分だとは思う。
287デフォルトの名無しさん:2009/01/17(土) 16:17:34
>>285-286
cstring (string.h)のインクルードですか?
ありがとうございます。
288デフォルトの名無しさん:2009/01/17(土) 16:30:00
int a[100] = {0};でいいのに
289デフォルトの名無しさん:2009/01/17(土) 16:34:39
static int a[100];でもいいね。
290デフォルトの名無しさん:2009/01/17(土) 16:39:53
>>288
以前gcc(C言語)でそれをやったとき怒られたのでそれはあまり気が進まなかったです
コンストラクタで初期化したいので、その書き方はできるんですかね、、

>>289
そうですね。ただ今回は静的にはできないですが・・。
291デフォルトの名無しさん:2009/01/17(土) 17:23:49
32ビットコンピュータで
参照渡し、int型変数の値渡し、ポインタ渡し
それぞれのオーバーヘッドって同じですか?
292デフォルトの名無しさん:2009/01/17(土) 17:29:47
>291
ふつうのx86などであれば、
値渡しが最速、参照とポインタは同じ
だと思われる。後者は実際の値を取るためにメモリアクセスが余計に必
要なので。
293デフォルトの名無しさん:2009/01/17(土) 17:36:14
>>292
なるほど、ありがとうございます
294デフォルトの名無しさん:2009/01/17(土) 17:43:10
>>290
あー、コンストラクタでは出来ないな
C++0xではm_a{0}って書けるようになるけど今は無理
295デフォルトの名無しさん:2009/01/17(土) 17:53:59
>>286
逆だろ。
memset を使っても int なら問題ないが、 std::fill のほうが見た目も安全で望ましい。
296デフォルトの名無しさん:2009/01/17(土) 17:54:44
>>291 速度は実測が基本。
297デフォルトの名無しさん:2009/01/17(土) 17:59:22
読みやすいコードの定義の1つに

例えばDWORDの変数を宣言するとき DWORD dwPoint; DWORD dwStack;
などdwをつけて分かりやすくするなどは入りますか?
298デフォルトの名無しさん:2009/01/17(土) 18:00:08
>>296
そうなんですが、理論上ではどうかと思いまして
299デフォルトの名無しさん:2009/01/17(土) 18:01:29
>>297
ハンガリアンでぐぐったらその辺の議論はでてくるかと
あまり意味がないとされることが多いと思うよ
300デフォルトの名無しさん:2009/01/17(土) 18:15:53
>>295
std::fill ってどこまで最適化されるのん?
301デフォルトの名無しさん:2009/01/17(土) 18:17:47
>>300
実装依存だから何とも言えんな。
気になるなら試せば?
302デフォルトの名無しさん:2009/01/17(土) 18:52:02
>>298
理論上は、コンパイラの実装や最適化の影響によってどうなるかわからないから同じとも違うとも言えない。
303デフォルトの名無しさん:2009/01/17(土) 18:52:29
MFCなんかはシステムハンガリアンそのものだもんなぁ
304デフォルトの名無しさん:2009/01/17(土) 18:52:52
まあ実測したところで明日には古い知識になるかもしれないってことだよな
気にしないのが一番だ
305デフォルトの名無しさん:2009/01/17(土) 19:02:38
#include<stdio.h>
void main(void);
void main(void)
{
char c='c';
printf("c='%c'\n",c);
if(c>='a' && c<='z'){
   printf("cは小文字です\n");
}
else{
   printf("cは小文字ではありません\n");
}

if(c>='0'&&c<='9'){
   printf("cは数字です\n");
}
else{
   printf("cは数字ではありません\n");
}

if(c=='+'||c=='-');{
   printf("cは符号です");
}
else{
   printf("cは符号ではないです\n");
}
}
をBCCでコンパイルしようとしたら
「elseの位置が誤っています」とエラーが出ます。
間違えをご指摘お願いします。
306デフォルトの名無しさん:2009/01/17(土) 19:08:40
if(c=='+'||c=='-');{
307デフォルトの名無しさん:2009/01/17(土) 19:12:48
指定された日付(2008/1/17)を
gettimeofday()関数で扱ってる
double型の数値に変換したいのですが
どうすればいいのでしょうか
308デフォルトの名無しさん:2009/01/17(土) 19:17:49
>>307
プログラムを書くといいよ。
309デフォルトの名無しさん:2009/01/17(土) 19:19:26
(double)
310305:2009/01/17(土) 19:19:52
>>306
ありがとうございます。
311デフォルトの名無しさん:2009/01/17(土) 19:29:56
キャスト演算子をオーバーロードした時に疑問に思ったのですが
これを使うと戻り値はコピーか参照かどっちでしょうか
312デフォルトの名無しさん:2009/01/17(土) 19:30:45
普通に代入するだけなら、原則全てコピー
313デフォルトの名無しさん:2009/01/17(土) 19:30:49
型が参照なら参照だし
参照でなければ値だ。
314デフォルトの名無しさん:2009/01/17(土) 19:32:36
(Foo)bar = foo;
とか無理なんだっけ
315311:2009/01/17(土) 19:37:50
>>312-313
光速の回答まことにありがとうです
316デフォルトの名無しさん:2009/01/17(土) 19:38:06
>>307
gettimeofday()はdoubleなぞ扱わない。
年月日から1970/1/1 00:00:00からの経過秒を作りたいならmktime()
317デフォルトの名無しさん:2009/01/17(土) 19:42:26
>>297
型をプリフィックスにするシステムハンガリアンには意味がない。役に立たない情報である上に、コードを修正するときの障害になる。型情報はコンパイラがチェックする方が正確。
意味をプリフィックスにするアプリケーションハンガリアンなら意味がある。カウンタだとか安全な値であるとか記憶クラスであるとかコンパイラがチェックできない情報を持たせると良い。

間違ったコードは間違って見えるようにする でググレ
318デフォルトの名無しさん:2009/01/17(土) 19:43:56
でもまあ C++ ならクラスでカプセル化するのも手だけどな。
319デフォルトの名無しさん:2009/01/17(土) 21:32:13
error C2664: 'fopen' : 1 番目の引数を 'LPTSTR' から 'const char *' に変換できません。

HRESULT FInit(HWND hWnd, LPTSTR filename);
FILE *fp = fopen(filename, "rb");

解決方法教えていただけませんか
320デフォルトの名無しさん:2009/01/17(土) 21:33:31
Win32API 使ってんなら CreateFile 使おうぜ。
fopen じゃ共有モードも指定できないし。
321デフォルトの名無しさん:2009/01/17(土) 21:35:27
LPTSTRを使ってるところを見るとUNICODEでビルドしてないか?
たぶん_tfopenみたいなマクロ関数があるはずだが、そっちを使うべきだろう
322デフォルトの名無しさん:2009/01/17(土) 21:37:17
>>320

なるほど 調べてみます

>>321

ありがとうございます!
323デフォルトの名無しさん:2009/01/17(土) 22:10:32
ファイルの読み込みをCreateFileで行ったら

今までやっていた
fseek()がCreateFileではどうやるのかが

アドバイスいただけませんか
324デフォルトの名無しさん:2009/01/17(土) 22:12:46
>>323
ttp://msdn.microsoft.com/en-us/library/aa364232.aspx
なんでMSDNを見ないの?
バカなの?
325デフォルトの名無しさん:2009/01/17(土) 22:14:02
Windows APIの話はWin32APIスレがあるのでそちらでやってください。
326デフォルトの名無しさん:2009/01/17(土) 22:14:44
327デフォルトの名無しさん:2009/01/17(土) 22:33:40
ftell 相当のものがなくて
fseek(fp, 0, SEEK_SET); 相当のものの戻り値で取得しないといけないとか
fprintf 相当のものが無くて
sprintf してから書き込まないといけないなど面倒臭いことも多い。

しかし、_tfopen だと別アプリから編集中のファイルを操作され放題。
_tfopen_s が使えるならそっちのがいい。
328デフォルトの名無しさん:2009/01/17(土) 22:45:09
>>323
細かいオープンモードを指定したいがためにCreateFileW()を使いたいが、
その後の読み書きはstdioで行いたいという場合は、
1. _open_osfhandle()でHANDLEからCRTのファイルディスクリプタを取得
2. _fdopen()でファイルディスクリプタからFILE*を取得
すればよいぞ

VC++の場合はね
329323:2009/01/17(土) 23:16:36
レスありがとうございます

これからはMSDNで調べてから質問します
330デフォルトの名無しさん:2009/01/17(土) 23:22:15
システムハンガリアン記法をやめてアプリケーションハンガリアン記法を使えというレスはよく見るのですが、
アプリケーションハンガリアン記法の一覧みたいなものは無いのでしょうか?
331デフォルトの名無しさん:2009/01/17(土) 23:25:04
>>330
そんなものはあるわけがない
アプリ独自のモデルに応じて設定するから「アプリケーション」ハンガリアンと
言ってるんだからさ

んでも、静的型の言語、特に型の別名をつけられるタイプの言語での
アプリケーションハンガリアンの重要性は、相対的に低いと思うよ

LispだのPerlだのPythonだの使ってるんなら、変数の名前で何者かを示すことが
ものすごく重要なことが多いと思うけどね
332デフォルトの名無しさん:2009/01/17(土) 23:36:05
マルチバイトとUnicodeどっちでビルドしたほうが有効性が高い?
333デフォルトの名無しさん:2009/01/17(土) 23:37:03
>>319
明示的にキャスト汁。
C++ではポインタの暗黙の型変換はvoid*にだけじゃなかったっけ。
334デフォルトの名無しさん:2009/01/17(土) 23:37:32
今ならUnicodeにしとけ
9x系なんて既にMSがサポート切ってるんだし
MSLUもある
335デフォルトの名無しさん:2009/01/17(土) 23:37:39
>>333 キャストして済ませようとすんじゃねーよボケ
336デフォルトの名無しさん:2009/01/17(土) 23:39:18
最適化なしビルドから最適化ありビルドに変更して出てきたエラーの原因はなんですか?
めちゃくちゃなんですけど
337デフォルトの名無しさん:2009/01/17(土) 23:41:01
>>331
名前はWindowsに採用されたシステムハンガリアンに対して、Officeに採用されたアプリケーションハンガリアンと呼ばれているんだと思うぞw

命名規則を設計で決めるのはその通りだけどさ
批判も多いけど、場合によってはシステムハンガリアンがいい場合もあるな
338デフォルトの名無しさん:2009/01/17(土) 23:42:02
>>333
これは酷い・・・
お前、地雷プログラマだろ
339デフォルトの名無しさん:2009/01/17(土) 23:45:01
340デフォルトの名無しさん:2009/01/17(土) 23:51:47
deleteについて質問なのですが
ObjectA の中に ObjectBがある場合
delete ObjectA
とする前に
delete ObjectB; delete ObjectA;
と中のものから消さなくてはいけないのでしょうか?
もうひとつ質問させていただきたいのですが
vecter<ObjectA> obje
とあった場合に
obje.clear()
ではObjectAのデストラクタは呼ばれますか?
341デフォルトの名無しさん:2009/01/17(土) 23:53:24
>>338
新人君がコンパイルエラーを無くすためになんでもかんでも
とりあえずキャストしてうまく動かないって言ってきたのを思い出したw
342デフォルトの名無しさん:2009/01/17(土) 23:54:30
Aの中でBをnewしているのであれば、Aのデストラクタの中でBをdeleteしとけば問題ない
343デフォルトの名無しさん:2009/01/17(土) 23:57:34
うへぇシステムハンガリアン記法思いっきりしてた
普段はやらないけど、グループでプログラム作るっていう課題があって
変数の命名方法決めようぜ!ってことで
あぁ
344デフォルトの名無しさん:2009/01/18(日) 00:02:22
Win32やMFC環境から始めた人は、システムハンガリアンに慣れてしまっても仕方ない気もするけどなぁ
345デフォルトの名無しさん:2009/01/18(日) 00:06:54
職場の規約で強制されてる人も多いはず
規約を変えたりするのって非常に面倒なんだよね
346デフォルトの名無しさん:2009/01/18(日) 00:07:28
_bstr_t にキャストするのであれば、あるいは
347デフォルトの名無しさん:2009/01/18(日) 00:10:16
メモリリーク検出したら鬼のように出てきなさった
{125} normal block at 0x003E7080, 352 bytes long.
Data: < ? > 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00
ここから、どこが原因かわかるの?
at 0x3E7080
とかいわれてもわからん・・
348デフォルトの名無しさん:2009/01/18(日) 00:11:50
_CrtSetBreakAlloc(125);
349デフォルトの名無しさん:2009/01/18(日) 00:13:55
std::stringと文字定数を大文字小文字区別せずに比較するにはどうすればいいですか?
350デフォルトの名無しさん:2009/01/18(日) 00:15:01
>>348
352バイトと、1.0f(00 00 80 3f)もヒントになるかもしれない。
351デフォルトの名無しさん:2009/01/18(日) 00:33:01
>>349
全部小文字(または大文字)に変換しながら(またはしてから)比較する。
352351:2009/01/18(日) 00:34:10
マルチバイト文字が入ってるなら wchar_t への変換が要るかもね。
353349:2009/01/18(日) 00:38:23
>>351
すみません、ASCII英数字のみです。
stricmp関数など、char型にする必要があるということですか?
==演算子か、compare関数など簡単にできないかなと・・
354デフォルトの名無しさん:2009/01/18(日) 00:40:25
stdにはNoCaseとかないんだっけ?
355デフォルトの名無しさん:2009/01/18(日) 00:42:07
c++には例外処理機構とかいうものがあるらしいですが、使い方がよくわかりません。

Ctrl+Cを検出してcatch節に処理を移したいのですが、下記のような操作は可能でしょうか?

try{
char *buffer = new char[1024]();
hFile = CreateFile(ほげほげ);
// ほにゃらら
}catch(なんちゃら){
delete []buffer;
CloseHandle(hFile);
// 後処理
}

Ctrl+Cが押されたら、いきなりプログラムを終了するのではなく、それまでに動的に確保したバッファを解放したりしたいのですが・・・
356デフォルトの名無しさん:2009/01/18(日) 00:43:03
>>353
stricmp() 使えるのか。
1文字の比較なら string の [0] 取ればいいし、文字定数が文字列定数のことなら
string の c_str() を stricmp() に突っ込めばいいだろ。

関数で簡単にしたいなら自分で定義すればいい。
357デフォルトの名無しさん:2009/01/18(日) 00:44:53
>>355
コンパイルできないコード貼って可能かどうか聞く意味がわからん。

例外使うなら動的配列には std::vector 使え。
ファイルについても RAII に沿ったラッパーにする必要がある。
358デフォルトの名無しさん:2009/01/18(日) 00:47:18
Ctrl+Cはイベントであって例外ではないだろう?
正常動作系を例外としてプログラムするのはちょっと
359349:2009/01/18(日) 00:57:02
>>356
すみません、文字列定数です。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200507/05070065.txt
こちらのサイトを参考にしたところ、やはりstricmpにしようと思います。
ありがとうございました。
360デフォルトの名無しさん:2009/01/18(日) 01:05:54
そもそも現代的なOSならCtrl+Cしたらメモリは開放される。
ただ、メモリ以外のリソースは知らないがな!!

Ctrl+C を検出するにはシグナルを使うことになるのかね。
361デフォルトの名無しさん:2009/01/18(日) 01:06:13
>>355
ctrl+CはC++の機能じゃない。例外というよりも割り込み処理になる。トラップしたいならOSの機能を調べた方が良い。
362デフォルトの名無しさん:2009/01/18(日) 01:47:53
WindowsならSetConsoleCtrlHandler
363デフォルトの名無しさん:2009/01/18(日) 01:53:51
>>337
ご名答
http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
> シモニイのハンガリアン記法のオリジナルのアイデアは、Microsoft内部ではアプリケーションハンガリアンと呼ばれ、それはアプリケーション部門で、すなわちWordとExcelで使われていたためだ。
364デフォルトの名無しさん:2009/01/18(日) 18:06:26
コンパイラはMINGW32でまさに今しがたプログラムの勉強を始めたばかりです

参考書に例題どおりの文字列(芭蕉の俳句)をメモ帳に
ソースコードを書きコンパイルしたら
error: syntax error before "printf"
というエラーメッセージが出ました。
ソースコードは参考書通り打ち込んだんですが・・・
365364:2009/01/18(日) 18:07:42
これが上記のソースコードです

#include <stdio.h>
int main(void)
{
printf("  夏\n")
printf(" 兵草\n")
printf("夢どや\n")
printf("のも\n")
printf("あが\n")
printf("と")
return 0;
}
366デフォルトの名無しさん:2009/01/18(日) 18:13:39
もう一回参考書と自分で書いたコードを見比べなさい。
367デフォルトの名無しさん:2009/01/18(日) 18:22:50
セミコロンは?
368364:2009/01/18(日) 18:47:43
>>366-367
うぎゃぁぁぁ
すいません、ありがとうございました。
369364:2009/01/18(日) 18:56:37
恥のついでにもうひとつだけ教えてください
>>365のソースコードからint、voidそしてreturn 0を
消してもMINGW上では正常にコンパイラされ実行もされます。
intやvoidを消しても大丈夫なのは理解できるのですが
return 0はソースコードの締めとして絶対必要なものではないのですか?
370デフォルトの名無しさん:2009/01/18(日) 19:11:14
C89 : 無くても警告で済む。
C99 : 無ければ return 0; が補填される。
371364:2009/01/18(日) 19:26:50
>>370
ありがとうございました
372デフォルトの名無しさん:2009/01/18(日) 20:42:28

大元の流出報告スレ

仁義なきキンタマ ウイルス情報 Part80
http://changi.2ch.net/test/read.cgi/download/1229742858/546
546 :[名無し]さん(bin+cue).rar :sage :2009/01/04(日) 00:24:59
報告する時は、詳しく的確に、一部だけ報告しないでお願いね

[殺人] Administrator(20081230-101522)のキンタマ.zip 2,263,376,860 09ed98f10653c3fc2555621ceeed6bc33e8f6228
[殺人] Administrator(20081230-101522)のメール.zip 59,426,579 4da9459b30eec31f58b86530dbb48d1cf86ef4be
[写真集][IV] Administrator(20081230-101522)のアルバム.zip 2,205,946,474 9d87cc0e08dc0e3afd959fcead6c48d569787cee

膨大な量のファイル数キンタマ ファイル数 13508 フォルダ数2381
以前勤めてた会社の資料など多数 独立行政法人情報処理推進機構などの資料など無いと思うが
有るかも知れない、あまりにも数が有り過ぎる、メールなどは、古いものばかりメルマガなど膨大な量
個人情報などは、披露宴主席者などの住所、名前、電話、メール 数十人分しかしエロばっかり落としてるな
ちなみに ハメ撮りscr 踏んだみたいね

早稲田実業学校中等部卒業
早稲田実業学校高等部卒業
早稲田大学政治経済学部政治学科卒業
卒論「知的財産権とインターネット技術」
当時の同大学理工学大学院の大川功 賞佳作を受賞
コンピュータ関連会社に入社ソフトウェア開発の仕事を経て
2005年に独立行政法人情報処理推進機構に入社
ソフトウェア・エンジニアリング・センター企画グループに配属
同グループ主任 岡○さん33歳
373デフォルトの名無しさん:2009/01/18(日) 20:43:06

Winnyの情報流出を管理・指導する国のIPA職員 岡○主任が違法ファイルDLしまくり感染して流出したドキュメント類。
嫁以外の女とのエッチ写真や違法ファイル所持証拠なども大量に流出。

★郵政省(今の総務省)、日立製作所、博報堂、味の素・・・と凄い流出規模!
http://mj.dip.jp/jlab-beer/s/test1232027394625.jpg
★本人は著作権無視で違法ファイルダウンしまくりのくせに、著作権を勉強して知的所有権管理資格持ってるw
http://mj.dip.jp/jlab-beer/s/test1232027429157.jpg
★全契約先でこの契約書結んでいるが、秘密保持、情報返還・処分義務の立派な契約違反。
http://mj.dip.jp/jlab-beer/s/test1232027468338.jpg
★西武百貨店社員6155名分の個人情報を違法に自宅に持ち帰り流出。
http://mj.dip.jp/jlab-beer/s/test1232027491803.jpg
★楽天ショップから個人情報データを違法に自宅に持ち去り大量に個人情報流出!
http://mj.dip.jp/jlab-beer/s/test1232027516194.gif
★大量のソニーやマイクロソフト等の大手企業勤務者の流出個人情報! 自民党とか衆議院とかもある。
http://mj.dip.jp/jlab-beer/s/test1232027555824.gif

★国の情報処理推進機構 IPA専門職員として違法アプリばら蒔きの大問題流出証拠。
 違法アプリやシリアルキーを周囲にわざとバラ蒔いている。(現在も違法ATOKを使用しており、長年違法アプリ等を日常的に使用していた可能性大)
 西武百貨店、日立製作所、博報堂、等の各企業向けに作っていたソフト類も違法アプリで作られていた可能性あり。
※Micro Soft VisualC++の違法シリアルキーを知人に教えたメール
http://mj.dip.jp/jlab-beer/s/test1232027624598.jpg
※メールソフトRimArts社 Beckyの違法シリアルキー等、内容から見ても長年かなり広範囲にバラ蒔いていたようだ
http://mj.dip.jp/jlab-beer/s/test1232027671365.jpg
★IPAは自身の流出は画像しか無いと断言しているが大嘘で、IPA役員資料とかも流出している。(IPA資料を無断で自宅に持ち帰り)
http://mj.dip.jp/jlab-beer/s/test1232027591091.jpg

★吉祥寺リ○ウス(株)の入居者の口座番号や入金金額等のデータベースもIPA岡○主任が流出
http://mj.dip.jp/jlab-beer/s/test1232106166528.gif
374デフォルトの名無しさん:2009/01/18(日) 20:43:43

IPA職員の報道記事まとめ1

★NHK
http://s02.megalodon.jp/2009-0105-1642-01/www3.nhk.or.jp/news/t10013365941000.html
★IPA職員のPCから業務情報などが漏えい - yahooニュース
http://headlines.yahoo.co.jp/hl?a=20090105-00000007-zdn_ep-sci
★IPA職員が情報流出 ― 私物パソコンでファイル交換ソフトを使用(RBB TODAY) - Yahoo!ニュース
http://s03.megalodon.jp/2009-0105-1955-03/headlines.yahoo.co.jp/hl?a=20090105-00000007-zdn_ep-sci
★IPA職員Winnyでファイル流出&嫁のブログ祭り - 探偵ファイル
http://www.tanteifile.com/newswatch/2009/01/05_01/index.html
★また早大!mixi 不正&変態行為自慢、卒業生は情報漏洩 - 探偵ファイル
http://www.tanteifile.com/newswatch/2009/01/04_01/index.html
★IPA職員がファイル交換ソフトでウイルスに感染、写真など流出 - ネットwatch
http://internet.watch.impress.co.jp/cda/news/2009/01/04/21994.html
★情報流出対策職員“赤恥”…自身半裸写真など流出 - zakzak
http://www.zakzak.co.jp/top/200901/t2009010510_all.html
★IPA職員がまさかの情報流出 - 「Share」の可能性も「現在本人に確認中」 - マイコミュ
http://journal.mycom.co.jp/news/2009/01/05/004/
★J-CASTニュース(情報セキュリティ専門家のはずのIPA男性職員の失態)
http://www.j-cast.com/2009/01/05033141.html
★時事通信社ニュース(古いソフトを探すためと、本人の虚偽と分かるコメント有り!組織ぐるみで隠蔽工作開始か?)
http://www.jiji.com/jc/c?g=soc_30&k=2009010500683
★CNET JAPAN わいせつ画像や児童ポルノ動画、違法かな漢字ソフトをダウンロード--IPA職員
http://japan.cnet.com/news/sec/story/0,2000056024,20386070,00.htm
★INTERNET WATCH  IPAが職員の情報流出で記者会見。
 昨日の組織ぐるみ隠蔽工作から、2ちゃんねらーの追撃で違法ファイルの使用と児童ポルノ動画を一転して認める!。
http://internet.watch.impress.co.jp/cda/news/2009/01/06/22018.html
375デフォルトの名無しさん:2009/01/18(日) 20:44:12

IPA職員の報道記事まとめ2

★CNET JAPAN 「IPAとして慙愧に堪えない」--仲田理事が会見で職員の情報流出事件を説明
http://japan.cnet.com/news/sec/story/0,2000056024,20386085,00.htm
★毎日.jp わいせつ画像やかな漢字ソフトをダウンロード--IPA職員、ファイル交換ソフトで
http://mainichi.jp/life/electronics/cnet/archive/2009/01/06/20386070.html?link_id=RLD03
★@IT IPA職員の私物PCからの情報流出、事実関係を説明
http://www.atmarkit.co.jp/news/200901/06/ipa.html
★IT PRO IPA職員がファイル交換ソフト利用で、個人情報含む1万6000件を流出
http://itpro.nikkeibp.co.jp/article/NEWS/20090106/322322/
★マイコミジャーナル IPA職員の情報流出で緊急会見 - 前職時代の取引先企業情報など1万件超
http://journal.mycom.co.jp/news/2009/01/06/055/
★IPA プレス発表 当機構職員の私物パソコンによる情報流出について
http://www.ipa.go.jp/about/press/20090106.html
★探偵ファイル IPA流出騒動職員の妻、不正転売と薬事法違反疑惑
http://www.tanteifile.com/newswatch/2009/01/06_01/index.html
★live doorニュース 「指導する側」のIPA職員がWinnyでウイルス感染、個人情報が流出。
http://news.livedoor.com/topics/detail/3962545/
★秒間SUNDAY IPA職員がファイル交換ソフトでウイルス感染!エッチ後画像など大流出
http://www.yukawanet.com/sunday/2009/01/ipawinny.html
★西武百貨店 IPA職員の自宅私物パソコンによる当社の情報の流出について(IPAに怒り爆発w)
http://www2.seibu.co.jp/common/images/pdf/20090107.pdf
★つこうたIPA職員 チャイルドポルノコレクターだった
http://www.technorati.jp/post/1S_jIJkf5a8hD3fMmxghB%2BYuGJfDPiYu%2BYizu8vv1oY%3D
376デフォルトの名無しさん:2009/01/18(日) 20:44:36

IPA職員の報道記事まとめ3 \(^o^)/ ついにアサヒ芸能 週刊誌に岡ちゃんと純子と仲良く堂々掲載 \(^o^)/

★ZAKZAK 流出事件のIPA職員ばかりか妻は薬事法に違反
http://www.zakzak.co.jp/top/200901/t2009010701_all.html
★探偵ファイル ポエムに企画書…IPA職員の情報流出事件続報!
http://www.tanteifile.com/newswatch/2009/01/07_01/index.html
★探偵ファイル IPA騒動に急展開、驚愕の流出情報の数々
http://www.tanteifile.com/newswatch/2009/01/08_01/index.html
★探偵ファイル IPA流出事件職員の妻の転売業者、薬事法違反が確定
http://www.tanteifile.com/diary/2009/01/08_02/index.html

★livedoorニュース(岡ちゃん用)  Winny利用の果て――家族崩壊した銀行マンの悲劇
http://news.livedoor.com/article/detail/3972416/

★アサヒ芸能 週刊誌 ネット情報セキュリティ相談窓口職員の裸画像が流出 恥写真!&島○純子も
http://mj.dip.jp/jlab-beer/s/test1232028437020.jpg

★楽天(ショップ) IPA職員のパソコンによる情報の流出について
http://www.rakuten.co.jp/stellina/946713/
377デフォルトの名無しさん:2009/01/18(日) 20:46:21
コピペ君って馬鹿だな、まで読んだ
378デフォルトの名無しさん:2009/01/18(日) 21:54:31
list<vector<int> > lst とやってイタテレータで
*lst[0] みたいにアクセスしたいのですが上手くいきません。
こういう場合はどういう使い方をすればよいのでしょうか。
379デフォルトの名無しさん:2009/01/18(日) 21:55:32
何がやりたいのか分からん。
380デフォルトの名無しさん:2009/01/18(日) 22:02:51
vector<vector<int> > lst;
vector<int> vct(2);
vct[0] = 1, vct[1] = 2;
lst.push_back(vct);
lst.push_back(vct);
vector<vector<int> >::iterator it, itEnd;
it = spMv.begin(), itEnd = spMv.end();
while(it!=itEnd) cout<<*it[0]<<","<<*ti[1]<<endl;

>>379
こんな感じな事がしたいのです。
381デフォルトの名無しさん:2009/01/18(日) 22:04:37
すみません、誤字がありました…。

vector<vector<int> > lst;
vector<int> vct(2);
vct[0] = 1, vct[1] = 2;
lst.push_back(vct);
lst.push_back(vct);
vector<vector<int> >::iterator it, itEnd;
it = lst.begin(), itEnd = lst.end();
while(it!=itEnd) cout<<*it[0]<<","<<*it[1]<<endl;
382デフォルトの名無しさん:2009/01/18(日) 22:05:02
(*it)[0]でいいんじゃね?動かしてないからわからないけど
383デフォルトの名無しさん:2009/01/18(日) 22:05:06
(*lst)[0]
384デフォルトの名無しさん:2009/01/18(日) 22:08:02
>>382
出来ました! 教えて下さりありがとうございました。
385デフォルトの名無しさん:2009/01/18(日) 22:08:16
(*it)[0] だな。
演算子の優先順位の問題だ。
386デフォルトの名無しさん:2009/01/19(月) 00:07:45
vectorみたいな連続したメモリのend()イテレータから実アドレスを得たい場合、
--itr; (&*itr) + 1;
とやるしか無いのでしょうか?
387デフォルトの名無しさん:2009/01/19(月) 00:14:50
vector みたいな、って、vecotr 以外で得る必要のある場合があるのか?
(vector 以外で得たとして、まともに使えるのか?)

vector のイテレータからなら、そうするしかないんじゃね。
イテレータからでなければ &v[0] + v.size() でいいと思うが。
388デフォルトの名無しさん:2009/01/19(月) 00:33:48
>>387
やっぱそうなりますか。

>vecotr 以外で
boost::array::iteraterとか。
boost::circular_buffer::iteraterなどでも制限があるけどまぁ意味あるかな。
389デフォルトの名無しさん:2009/01/19(月) 07:27:43
大抵の環境なら &*end() でできる気はするが
保証はされてないんだろうな。
390デフォルトの名無しさん:2009/01/19(月) 07:36:57
end()はデリファレンスしちゃダメ。begin()==end()の可能性もあるから無条件に>386してもダメ。
391デフォルトの名無しさん:2009/01/19(月) 10:11:28
>>232
ちくしょう>>214は無視かよ
392デフォルトの名無しさん:2009/01/19(月) 10:37:24
元の質問者ではないんですが、その場合もオーバーライドと言っていいのでしょうか?
393デフォルトの名無しさん:2009/01/19(月) 11:51:59
>>391
ネタだと思ってた。
394デフォルトの名無しさん:2009/01/19(月) 16:23:04
規格でも、*で逆参照するまではまだ平気で、その左辺値から右辺値を取りだしたり代入したりするときに
はじめてアクセスが起こるという考え方になっていなかったっけ?

もしそうだったら、operator *がreturn *p;で参照型を返すというような
単純な実装になっていれば平気だと言えるはず。
その保証がないだろうから、結局やめておくべきだろうけど。
395デフォルトの名無しさん:2009/01/19(月) 20:31:45
*が逆参照とは限らない
iterator::operator*が何をやってるかわからない以上しないのが無難
396デフォルトの名無しさん:2009/01/19(月) 20:32:04
ど素人です、質問です

#include <stdio.h>
main()
{
int k;
for (k=0;k<1000;k++);
printf("sunrise\n");
}

このソースコードをmingwで実行するとmingw上で”sunrise”が1000回
でると思ったんですが、そういうわけではないのですね
397デフォルトの名無しさん:2009/01/19(月) 20:38:34
"sunrise\n"が一回しか表示されないように書かれてるからな
398デフォルトの名無しさん:2009/01/19(月) 20:40:50
ど素人がぶら下がり構文なんか使おうとするんじゃありませんっ
399デフォルトの名無しさん:2009/01/19(月) 20:42:35
>>398

#include <stdio.h>
main()
{
  int k;
  for (k=0;k<1000;k++);
  {
    printf("sunrise\n");
  }
}
こうですね、わかります
400396:2009/01/19(月) 21:27:35
>>397
どういじればいいのでしょうか?
>>399でも一回しか表示されません
401デフォルトの名無しさん:2009/01/19(月) 21:29:39
#include <stdio.h>
main()
{
  int k;
  for (k=0;k<1000;k++)
  {
    printf("sunrise\n");
  }
}

おまえらあんまりおちょくってやるなよ
402デフォルトの名無しさん:2009/01/19(月) 21:36:28
いくら初心者でも、自分が参考書どおりに書けてるかのチェックできるでしょ。
403デフォルトの名無しさん:2009/01/19(月) 21:38:38
>>396
>>399
ワロッシュw
404デフォルトの名無しさん:2009/01/19(月) 21:48:04
forの行の;を削除
405396:2009/01/19(月) 21:54:16
ありがとうございました
406デフォルトの名無しさん:2009/01/19(月) 22:12:58
俺はパっと見、分からんかったwwwww
forの後ろにセミコロンとか、滅多に見ねーw
407デフォルトの名無しさん:2009/01/21(水) 00:13:43
初心者歓迎スレと聞いて飛んできました。
本当に初歩的な質問で申し訳ないのですが

struct kouzoutai{
int menbahensuu;
};

int kouzoutaihensuunokosuu=3;

struct kouzoutai kouzoutaihensuu[kouzoutaihensuunokosuu];

こうすると「定数式が必要」と出てエラーが出ます0。
構造体変数の個数を変数で管理したいのですが、無理なのでしょうか?
408デフォルトの名無しさん:2009/01/21(水) 00:16:17
>>407
それはC99から使えます
それ以前では使えません
409デフォルトの名無しさん:2009/01/21(水) 00:16:51
>>407
変数じゃだめだな。

C++なら、
const int kouzoutaihensuunokosuu = 3;

Cなら
#define kouzoutaihensuunokosuu 3

で。
410デフォルトの名無しさん:2009/01/21(水) 00:20:23
>>408
買った本の発行日が2006年なのでそんな古い規格では無い・・・と信じたい
>>409
前者です。動きました!
これで構造体変数の個数を変える時にそれに関わるfor文まで一々直さなくて済みます。
本当にありがとうございました!
411デフォルトの名無しさん:2009/01/21(水) 00:21:23
どうしても変数にしたいなら new するくらいしかないな
当然deleteが必要になるがw
412デフォルトの名無しさん:2009/01/21(水) 00:26:34
C99は最新のコンパイラでも対応してないことがザラだから
413デフォルトの名無しさん:2009/01/21(水) 00:40:09
>>410
> 買った本の発行日が2006年なのでそんな古い規格では無い・・・と信じたい
最新のgccだって、オプション付けなきゃ通らないだろ
414デフォルトの名無しさん:2009/01/21(水) 00:44:07
最近の現場でも、やっぱり主流はC89くらいか?
415デフォルトの名無しさん:2009/01/21(水) 00:48:53
>>412-413
そうなんですか
HSPから移ったばかりでそこら辺がどうにもよくわからず・・・
ありがとうございました
416デフォルトの名無しさん:2009/01/21(水) 00:53:55
大体C89/90が主流だろ
C99を積極的に使ってる話はほとんど聞いたことがない

それでも標準化委員会は懲りずにC1Xというのの策定を進めてるようだが
417デフォルトの名無しさん:2009/01/21(水) 00:55:32
あれ・・・C++0xは? ^^;
418デフォルトの名無しさん:2009/01/21(水) 00:56:44
そっちはC++の新規格だ
419デフォルトの名無しさん:2009/01/21(水) 01:00:47
FORTRAN77がそうであったように
最初の「標準規格」には皆こぞって準拠させようとするけど
それ以降の新規格にはベンダーの姿勢がまちまちな場合が多いよね。

書かれるコードも「最初の規格に準拠したものなら動かせる」ように努力するから
「動かすには最新規格に準拠した処理系が必要」なコードはなかなか生産されないし。
420デフォルトの名無しさん:2009/01/21(水) 01:05:51
>>419
FORTRANみたいに、おじいちゃん先生が教えてる言語は基準にならないだろ・・・
421デフォルトの名無しさん:2009/01/21(水) 01:13:56
こういうのがゆとりっていうんだろうね
422デフォルトの名無しさん:2009/01/21(水) 03:13:09
>>411
動的配列は new より先に std::vector を薦めるべきだ。
423デフォルトの名無しさん:2009/01/21(水) 14:48:37
C++のdynamic_castは型が不適当な場合0を返しますが、Cのようなキャストでは型テストは行われないのですか?
つまり、速度はCキャストの方が上ですか?
424デフォルトの名無しさん:2009/01/21(水) 15:14:02
dynamic_castはコンパイル時に静的に解決できるかどうか判断してくれるので、

お前の心配は無駄なことだといえる
425デフォルトの名無しさん:2009/01/21(水) 15:22:02
初歩的な質問です。
CSVのデータを1行づつ持ってきます。その後カンマで分割し、それぞれを全てバイナリでテーブル形式にします
とあるのですが、テーブル形式とはなんでしょう?バイナリとは?
教えてくださると助かります。
426423:2009/01/21(水) 15:27:01
ありがとうございました。
427デフォルトの名無しさん:2009/01/21(水) 15:52:29
>>425
テーブルは表のこと。配列を使うことが多い。

バイナリは内部表現形式のこと。"abc"のバイナリは(普通は)0x61, 0x62, 0x63, 0x00。
って説明しちゃうと混乱するかなぁ。
プログラムで扱うデータは全部バイナリなんで、その文章中の「バイナリで」はあまり意味がないよ。
それとも、数と解釈できる文字列は整数型か浮動小数点型にするって意味なのかな?
CSVデータとして扱ってる間はそんなことしない方がいいと思うけど。
428デフォルトの名無しさん:2009/01/21(水) 16:00:00
>>427
ありがとうございます。
とすると、バイナリというのは16進数ということですか?
それと、テーブルの指定で
31          0
 |データ1|データ2|
 |データ3|データ4|

というのが在ったのですが、この場合どう配列を作ればいいでしょうか?
ちなみに全て数値で、データ1のみ16進数です
429デフォルトの名無しさん:2009/01/21(水) 16:35:40
>>428
>とすると、バイナリというのは16進数ということですか?
16進を使うのは、バイト単位で区切られているものの列を人間が見易いようにするため。
コンピュータの内部は2進。だからバイナリという。binaryは本来は2進数という意味。
(以上わかってたならいいんだけど念の為説明。わかってたら無視して。)

> 31          0
>  |データ1|データ2|
>  |データ3|データ4|
うーん、うまく解釈できない。


あなたに要求を出した人に、あなたが要求の仕様を理解できるように説明してもらうべきです。
430デフォルトの名無しさん:2009/01/21(水) 16:48:31
>>429
すみません、ありがとうございます。
多分、short型にするということかな・・・?と思ったのですが、あまり詳しくないので聞いてみました。
そうですよね。忙しそうなので聞きづらかったのですが聞いてみます
431デフォルトの名無しさん:2009/01/21(水) 18:18:36
敢えてコミュニケーションの訓練のために仕様を曖昧にすることもあるけどねぇ。
まさか2chで聞くとは思ってもいないだろうよ。
432デフォルトの名無しさん:2009/01/21(水) 19:47:40
csvに入ってる数字を、int〜doubleで格納汁って事じゃないの?
atoiとか使ってさあ。どんなデータか知らないけど。
433デフォルトの名無しさん:2009/01/21(水) 19:49:43
バイナリっていってるからな
そのままダンプするともとれる
434デフォルトの名無しさん:2009/01/21(水) 20:01:37
ヌル文字の'\0'と0はいっしょなの?
よくchar型配列に文字列の終端として0を入れてるソース見るけど
ありえないだろうけどヌル文字が値0じゃない環境の為に常に'\0'でかくべき
っていうスタンスは要らぬ気遣い?
435デフォルトの名無しさん:2009/01/21(水) 20:11:09
>>434
\141 は何を表す?
\x61 は何を表す?
では \0 は?
436デフォルトの名無しさん:2009/01/21(水) 20:24:54
>>435
8進数の0ってこと?
それは説得力ないなぁ
437デフォルトの名無しさん:2009/01/21(水) 20:28:14
>>434
ヌル文字の文字コードは0であると規格で規定されている。
ただ、0 と書くより '\0' と書いた方が文字である事が分かりやすくはある。

>>436
本当に8進数の0です。
438デフォルトの名無しさん:2009/01/21(水) 20:35:39
CDXInputクラスのpublicにDirectInputを初期化する関数を作りました
その一部に

// 利用可能なゲームコントローラーの列挙関数を実行
if(FAILED(m_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY))) {
return E_FAIL;
}

という部分があるのですがビルドすると
error C3867: 'CDXInput::EnumJoysticksCallback': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CDXInput::EnumJoysticksCallback' を使用してください
とエラーが出るので指示通り引数の一部を&CDXInput::EnumJoysticksCallbackと変えたら
error C2664: 'IDirectInput8W::EnumDevices' : 2 番目の引数を 'BOOL (__stdcall CDXInput::* )(const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKW' に変換できません。
とエラーが出ます。 解決方法教えていただけませんか
ちなみにEnumJoysticksCallbackは同じクラス内のpublicにBOOL CALLBACK CDXInput::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance, void *pContext)
としてあります
439デフォルトの名無しさん:2009/01/21(水) 20:47:16
>>438
EnumJoysticksCallbackにstatic付けておけ。

おそらく、EnumDevicesでNULLを渡しているところにthis渡せばいい。
すると、EnumJoysticksCallbackのpContextから渡したthisが取り出せるという仕組みのはずだ。
440デフォルトの名無しさん:2009/01/21(水) 20:51:46
ヌル文字って英語でなんていうの?
441デフォルトの名無しさん:2009/01/21(水) 20:54:20
null character
442デフォルトの名無しさん:2009/01/21(水) 21:06:25
テリー伊藤 < ヌル文字って何?
443デフォルトの名無しさん:2009/01/21(水) 21:53:52
初心者ですいませんがC#なんですけども、10万個くらいの配列のデータの正規化をしたいのですが、どのようにすればいいのかまったくわかりません。誰かご教授いただけないでしょうか?
444デフォルトの名無しさん:2009/01/21(水) 21:54:27
スレ違い
445デフォルトの名無しさん:2009/01/21(水) 21:54:58
>>443
消えろカス
446デフォルトの名無しさん:2009/01/21(水) 22:45:01
77
447デフォルトの名無しさん:2009/01/21(水) 22:48:34
>>443
回線切っ(ry
448439:2009/01/21(水) 22:55:37
EnumJoysticksCallbackにstaticをつけたら>>438のエラーはなくなりましたが
その代りに
'->SetProperty' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
'->CreateDevice' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
静的でないメンバ 'CDXInput::m_pJoyDevice' への参照が正しくありません。
=======================================================================================
if(FAILED(m_pDInput->CreateDevice(pdidInstance->guidInstance, &m_pJoyDevice, NULL))) {
return DIENUM_CONTINUE;
}
=======================================================================================
と新たに3つエラーが出てきたので
クラスのprivateで宣言されている
LPDIRECTINPUT8 m_pDInput;
LPDIRECTINPUTDEVICE8 m_pJoyDevice;
にstaticをつけたらエラーはなくなりましたが
外部シンボル ""private: static struct IDirectInputDevice8W * CDXInput::m_pJoyDevice" (?m_pJoyDevice@CDXInput@@0PAUIDirectInputDevice8W@@A)" は未解決です。
外部シンボル ""private: static struct IDirectInput8W * CDXInput::m_pDInput" (?m_pDInput@CDXInput@@0PAUIDirectInput8W@@A)" は未解決です。
というエラーが発生しました

解決方法ご教授ください、宜しくお願いします

ちなみにスレ違いだったら申し訳ないです・・・

長文失礼しました
449デフォルトの名無しさん:2009/01/21(水) 22:56:24
お礼忘れてました><

>>439 レスありがとうです
450デフォルトの名無しさん:2009/01/21(水) 23:01:12
静的メンバ関数と普通のメンバ関数の違いを理解したうえで、>>439を読み直す。
451448:2009/01/21(水) 23:31:31
下調べ不足で申し訳ないです
静的メンバ関数とメンバ関数の違いを理解しました

実体を宣言していなかったので
LPDIRECTINPUT8 CDXInput::m_pDInput = m_pDInput;
LPDIRECTINPUTDEVICE8 CDXInput::m_pJoyDevice = m_pJoyDevice;
と宣言したら無事ビルドできました。

ありがとうございました
452デフォルトの名無しさん:2009/01/21(水) 23:40:19
#include <stdio.h>

int main()
{
int x = 0;
while( x < 10000 )
{
printf("ループ%d回目です\n", x );
x++;
}
printf("ループ終了");
return 0;
}


キー入力でこのループを止められるようにしたいんだが
これからどうすればいいのかわからん
助けてくれ
453デフォルトの名無しさん:2009/01/21(水) 23:42:40
>>452
ctrl+c
454デフォルトの名無しさん:2009/01/21(水) 23:42:53
>>452
環境依存になるから、環境書かないと。
455デフォルトの名無しさん:2009/01/22(木) 00:00:56
環境というのがいまいちわからんが
windowsXPでVisual Windows for BC++ってソフト使ってます
456デフォルトの名無しさん:2009/01/22(木) 00:07:17
>>448
その2つにstaticつけちゃ意味ないだろ。
457デフォルトの名無しさん:2009/01/22(木) 00:12:14
ID変わったか
>>452は俺ですよ
458448:2009/01/22(木) 00:28:50
>>456

staticをつけないでできる方法はどんな方法がありますか?
アドバイスください;;
459デフォルトの名無しさん:2009/01/22(木) 00:57:38
staticなEnumJoysticksCallbackをこうする。
BOOL CALLBACK CDXInput::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance, void *pContext)
{
return static_cast<CDXInput*>(pContext)->(pdidInstance);
}
んで、非staticなBOOL CDXInput::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance)を作る。
当然、この中では非staticなメンバにもアクセスし放題というわけだ。

そして、EnumDevicesの3番目の引数に必ずCDXInputのthisを渡すこと。
460デフォルトの名無しさん:2009/01/22(木) 02:00:16
struct **hogeをfreeする場合の正しい文法は

free(*hoge)でいいの?
461デフォルトの名無しさん:2009/01/22(木) 02:13:00
アロケートの仕方にもよるけど、それでいい場合もあるんじゃないかな
462デフォルトの名無しさん:2009/01/22(木) 07:23:01
BOOL CALLBACK CDXInput::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance, void *pContext)
{
return static_cast<CDXInput*>(pContext)->pdidInstance;
}
としたのですが
error C2039: 'pdidInstance' : 'CDXInput' のメンバではありません。gamelib.h(787) : 'CDXInput' の宣言を確認してください。
と出ます。

pContex->はCDXInputクラスの関数とメンバ変数が出るので詰まってしまいました
static_castなどでググっても解決しなかったので教えていただけませんか

宜しくお願いします

ちなみに
return static_cast<CDXInput*>(pContext)->(pdidInstance);
とするとエラーで出まくります
error C2059: 構文エラー : '('
error C2143: 構文エラー : ';' が '__stdcall' の前にありません。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
こういう感じのが30個くらい
463デフォルトの名無しさん:2009/01/22(木) 07:27:45
XMLのデータに日本語を使いたくてUTF-16にしたんですがIEで開けません。どうしてですか?
464デフォルトの名無しさん:2009/01/22(木) 07:54:54
>>462
何がしたいのかよく判らんが、CDXInputのメンバを参照したいのでなければそのキャストはおかしい。
逆に言うと、そのキャストはCDXInputのメンバを参照する目的に適っている。
pdidInstanceとやらがCDXInputのメンバでないのなら、そりゃぁエラーにもなるさ。
465デフォルトの名無しさん:2009/01/22(木) 08:11:45
>>459は間違ってるだろ。
staticなEnumJoysticksCallbackはこう。
BOOL CALLBACK CDXInput::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance, void *pContext)
{
return static_cast<CDXInput*>(pContext)->EnumJoysticksCallbackNonStatic(pdidInstance);
}
そして、非staticなEnumJoysticksCallbackNonStaticを作る。
BOOL CDXInput::EnumJoysticksCallbackNonStatic(const DIDEVICEINSTANCE *pdidInstance)
{
//メンバにアクセスし放題
}
466デフォルトの名無しさん:2009/01/22(木) 08:32:12
なんだ、継続してた話題だったのか。コテないから無視してしまった。
467デフォルトの名無しさん:2009/01/22(木) 15:58:14
int i = fread(buf, 1024, 1, fp);
if(i) fwrite(buf, 1024, 1, fp);

こういう風にするとデータが1024byte未満の場合、iが0になって書き込みがスルーされてしまいます。
1byteずつ読み書きするようにしてやれば意図通り動くのですが、遅くて使い物になりません。
C/C++で大きな容量を一度に読み書きするにはどうすればいいのでしょうか?
468デフォルトの名無しさん:2009/01/22(木) 16:00:17
int i = fread(buf, 1024, 1, fp);
if(i) fwrite(buf, 1024, 1, fp);
          ↑

469デフォルトの名無しさん:2009/01/22(木) 16:03:35
int i = fread(buf, 1, 1024, fp);
if(i) fwrite(buf, 1, i, fp);
470デフォルトの名無しさん:2009/01/22(木) 16:12:18
>>468-469
ありがとうございます

fread(buf, 1, 1024, fp)
fread(buf, 1, 1, fp) //*1024
この二つは同じことだと思い敬遠していましたが、全然違いますね
471デフォルトの名無しさん:2009/01/22(木) 17:02:13
>>470
前者は1回しか関数が呼び出されないが後者は1024回の関数呼び出しが行われるからな
472462:2009/01/22(木) 17:52:44
>>465
無事できました

ありがとうございます
473デフォルトの名無しさん:2009/01/22(木) 20:19:15
コマンドライン引数で受け取った複数のファイルをむにょむにょするコンソールプログラムを作っているのですが
ある一定の数以上渡すと(プログラム本体にD&D)アクセス権がないと表示されます。
なにか文字数等の制限でもあるんですか?
OSはWinXPです
474デフォルトの名無しさん:2009/01/22(木) 21:54:38
>>472
>464はスルーかい。
475デフォルトの名無しさん:2009/01/23(金) 01:25:35
>>473
32,768文字が限界だったと思う。
多分CreateProcessの制限なんじゃねーの?
ttp://msdn.microsoft.com/en-us/library/ms682425.aspx
476472:2009/01/23(金) 06:42:52
>>464 返事遅れて申し訳ありません

やりたいこととは
DirectInputを初期化して使用可能にするクラスを作っていたのですが
使用可能なコントーラーを列挙するCallback関数を作るときに>>438
のエラーが出たので質問したらstaticをつければいいってことなのでその方向で
やってました
477デフォルトの名無しさん:2009/01/23(金) 08:44:48
静的メンバ関数と静的メンバ変数は、クラス名前空間の中だけどクラスインスタンスの外側にあります。
ますそこを理解してから、どのようにすれば静的メンバ関数にクラスインスタンスの内容を渡せるのか考えてみてください。
何でも言われた通りにするだけではなく、きちんと意味を理解すべく自助勉強しましょう。
なお、このメッセージに対する返答は必要ありません。読み終えたら、ただちに自習を始めてください。
478デフォルトの名無しさん:2009/01/23(金) 10:04:39
LinuxでCやC++のプログラムを作る場合、
いまだにemacs上でシコシコやるのが一般的なの?

eclipse + cdt とか邪道?
479デフォルトの名無しさん:2009/01/23(金) 11:33:35
俺は jude とかで設計して emacs でシコシコ。
そういえば C++ なフリーソフトのプロジェクトって設計資料どうしてんだろ。
480デフォルトの名無しさん:2009/01/23(金) 12:04:49
静的メンバ関数から、静的でないメンバ関数を呼び出すことができません。
staticにする以外できないから。
481デフォルトの名無しさん:2009/01/23(金) 14:05:14
8000という10進数を

15                      0
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
  8     0     0     0

こんな感じで4バイト区切りで変数に格納したいのですがどうやるのでしょう?
格納後、1000|0000|0000|0000| となっていてほしいんです
482デフォルトの名無しさん:2009/01/23(金) 14:06:59
んなアホな
483デフォルトの名無しさん:2009/01/23(金) 14:07:01
インスタンスへの参照さえあればprivateメンバにだって自由にアクセスできるが
484デフォルトの名無しさん:2009/01/23(金) 14:07:42
483は>>480な。
てかお前ら書き込みすぎだろwww
485デフォルトの名無しさん:2009/01/23(金) 14:08:52
>>481
プログラムを書くと良いよ。
486デフォルトの名無しさん:2009/01/23(金) 14:09:47
>>481
とりあえず自分で書いたコードを貼ってくれ。意味がわからん。
487デフォルトの名無しさん:2009/01/23(金) 14:19:08
>>481
4「ビット」の間違いだよな?
BCDとかパック10進数とかでぐぐれ
488デフォルトの名無しさん:2009/01/23(金) 14:25:21
>>481
4バイト区切りじゃなくて4ビット区切りだよね。Packed BCDという形式。

ある数Aを10で割った余りは、Aの10進表記での1の位の数なんだ。
ある数Aを10で割った商は、Aの10進表記での1の位を除いた数なんだ。
これを繰り返すことでAの 1の位の数, 10の位の数, 100の位の数, ・・・ を得ることができる。
それらを収めたい位置にシフトして足せば終わり。
このシフトして足すのも、普通は割るのと同じループ内でやってしまう。
489デフォルトの名無しさん:2009/01/23(金) 14:32:23
マルチだが

c言語によるgmres法のプログラムがあったら教えてもらいたい。

今日どうしても必要なんだ。
490デフォルトの名無しさん:2009/01/23(金) 14:33:26
>今日どうしても必要なんだ。
急ぐならならマルチはやめるべきだね。
491デフォルトの名無しさん:2009/01/23(金) 14:59:12
以下のようなことがしたいのですが、
何か方法はありませんか?

typedef struct
{
int a;
int b;
}
structure;

void hoge( structure::int* p, structure* p0, structure* p1 )
{
printf( "%d %d\n", p0->*p, p1->*p );
}

void hogehoge( void )
{
structure a, b;
a.a = 0;
a.b = 1;
b.a = 2;
b.b = 3;
hoge( &structure::a, &a, &b );
hoge( &structure::b, &a, &b );
}
492デフォルトの名無しさん:2009/01/23(金) 14:59:56
>490
すみませんでした
反省します
493デフォルトの名無しさん:2009/01/23(金) 15:19:50
>>492
ぐぐったらそれっぽいコードが結構出てきたよ?
494デフォルトの名無しさん:2009/01/23(金) 15:21:44
>>491
配列にしてindexを指定するのはダメ?
495491:2009/01/23(金) 15:31:47
>>494
ポリゴンの座標や回転、拡縮などの値を
キーフレーム毎にグラフにしたいのですが、
既にクラスは使用されていてかつ、
intやfloatが入り混じっているため
templateで解決したいなぁ、と。
やっぱりunionあたりで解決すべきなのかなぁ・・・。
496デフォルトの名無しさん:2009/01/23(金) 20:21:48
>>491
メンバaを呼ぶ関数とメンバbを呼ぶ関数を作って、関数ポインタを使って切り替えるってのはどうかな
497デフォルトの名無しさん:2009/01/23(金) 21:25:39
そんなことしなくても、普通にメンバのオフセット使えば良いと思うよ
498デフォルトの名無しさん:2009/01/23(金) 22:21:26
>>491
C++を使う。

まさにそれ、メンバへのポインタと言う。
その中のstructure::int* pをint structure::* pにして
<stdio.h>をインクルードすればコンパイル通る。
499デフォルトの名無しさん:2009/01/23(金) 22:56:41
>>491
offsetofとかその手のマクロの利用で可能
500デフォルトの名無しさん:2009/01/23(金) 23:03:19
ってtemplateゆーことはC++か
じゃぁ出番無いわごめんね
501デフォルトの名無しさん:2009/01/24(土) 08:42:47
>>499
そんな危険なものを使ってはらめー
502デフォルトの名無しさん:2009/01/25(日) 12:30:40
SK法とソートどっちが重要ですか?
503デフォルトの名無しさん:2009/01/25(日) 12:57:46
>>502
お前が必要とする方が重要。
504デフォルトの名無しさん:2009/01/25(日) 23:28:33
Cのマクロでreturnっぽい動作ってできますかね?

できるはずなのですが、いまいち書き方がわからないです。
505デフォルトの名無しさん:2009/01/25(日) 23:30:25
#define MacroReturn return
506デフォルトの名無しさん:2009/01/25(日) 23:30:27
#define RETURN return
507デフォルトの名無しさん:2009/01/25(日) 23:31:01
508デフォルトの名無しさん:2009/01/25(日) 23:31:54
ワロタwww
509デフォルトの名無しさん:2009/01/25(日) 23:38:07
伝統芸能マクロリターンか
510デフォルトの名無しさん:2009/01/25(日) 23:42:40
マクローリンタンに見えた
511デフォルトの名無しさん:2009/01/25(日) 23:46:51
マクロリターン展開という奴か。
昔数学で習ったような。
512デフォルトの名無しさん:2009/01/25(日) 23:51:58
そろそろ飽きてきたよ
513デフォルトの名無しさん:2009/01/26(月) 00:20:51
win32apiスレでやれ
514デフォルトの名無しさん:2009/01/26(月) 00:26:42
なんでいきなりWin32APIなわけ?
515デフォルトの名無しさん:2009/01/26(月) 12:31:19
文字列へのポインタ
char* s
が与えられてるとき,これを標準ライブラリのstringに
変換するにはどうすればいいでしょうか?

string str = new string(*s)

とすると
「'char' から 'const std::allocator<_Ty> &' に変換できません。」
というコンパイルエラーが出ました。@VisualStudio2008EE
516デフォルトの名無しさん:2009/01/26(月) 12:36:42
string str = s;

string *str = new string(s); // これはあんまりやんね
517デフォルトの名無しさん:2009/01/26(月) 12:55:42
>>516
ああポインタそのまま使えるんですね
どうもありがとうございました><
518491:2009/01/26(月) 14:12:36
>>496-501
お礼が遅くなり申し訳ありません。

>>496
ゲッターをインスタンス化するのは
私個人のイメージ的によくないのです・・・

>>497
ありがとうございます。
自分なりに考え、以下のように実装してみました。
structure* p(0);
hoge( (int)&p->a, &a, &b );

>>498
そんな書き方があるのですね。
試してみます。
ありがとうございます。

>>499,501
offsetofというのは継承などが考慮されるのでしょうか?
519デフォルトの名無しさん:2009/01/26(月) 14:19:58
>>518
> structure* p(0);
> hoge( (int)&p->a, &a, &b );

よりによって最悪な方法を選んだな。
520491:2009/01/26(月) 14:29:47
>>498
できました。
ありがとうございます。

>>519
やっぱりなにかまずいのでしょうか?
以下のように使っているのですが・・・
void hoge( int ofs, structure* a, structure* b )
{
int valuea ( *( (int*)( (char*)a + ofs ) ) );
int valueb ( *( (int*)( (char*)b + ofs ) ) );
/*略*/
}
521デフォルトの名無しさん:2009/01/26(月) 14:33:01
>>520
ヌルポインタ p に -> を適用した時点で未定義動作。

offsetof() の典型的な実装ではあるけど、実際にそれをやっていいのは
動作保証のできるコンパイラ実装者だけ。
522491:2009/01/26(月) 14:38:03
>>521
そうなのですか・・・
ただ、VC上でテストしてみたところ、
想定していた値(オフセット値)が出てきたため
VCでメイクしている限りは大丈夫と
思っているのですがどうなのでしょうか?
VCのデバッガ上でもNULLポインタのメンバアクセス時は
オフセット値がthisポインタだったりしますし・・・
523デフォルトの名無しさん:2009/01/26(月) 17:48:11
if(){
}

if()
{
}
はどっちがいいと思いますか?
3年間自分の中で決着が付きません
524デフォルトの名無しさん:2009/01/26(月) 18:05:51
俺はどっちも好きではない
525デフォルトの名無しさん:2009/01/26(月) 18:31:46
質問ですAスライムとBゴブリンとCトロールをゲーム内で出現させたいとします

この場合は例えば
CMobA

CMobB

CMobC
というクラスを3つ作るのと

CMobというクラスを作り配列で一度にやるのはどちらがいいですか?
526デフォルトの名無しさん:2009/01/26(月) 18:46:05
>>525
そんなの考えるまでもないだろ
527デフォルトの名無しさん:2009/01/26(月) 18:53:23
なんのためのクラスだよ

CMobという抽象クラスを作って、それを継承したCSlimeとCGoblineとCTorolというのを作れ
AやBやCは、クラス名というより変数名だ
CMobがnameというメンバを持っているなら、そっちに保持してもいいけどな
528デフォルトの名無しさん:2009/01/26(月) 18:53:32
>>524
他にどう書くんだよw
529デフォルトの名無しさん:2009/01/26(月) 19:08:56
俺はifの行にブロックを書くな
つい最近だがelseは下のように書くようにした

// 1つ目のifの中に入る条件のコメント
if () {
// ifの中で行う処理のコメント
}
// 2つ目のifの中に入る条件のコメント
else if() {
// ifの中で行う処理のコメント
}

仮に間違ってelseより前に処理を記述しても、コンパイルエラーが起きてくれるからという理由
まぁ、所詮この辺は好みだよな・・・昔は違ったし
530デフォルトの名無しさん:2009/01/26(月) 19:15:08
if ()
{
}

VC使うようになってこうなった。
理由は、エディタの行間を広くできなくて、{で一行分あけたいから。
531デフォルトの名無しさん:2009/01/26(月) 20:34:01
俺もそのスタイル
理由は、目視でブロックを把握しやすいから
532デフォルトの名無しさん:2009/01/26(月) 20:39:42
そうやってブロックわけしたいんだけどdo whileだけは悩む
533デフォルトの名無しさん:2009/01/26(月) 21:16:50
C++だけでなく、Cも関係あるのですが、
stack overrun を検出するツールなどはありますでしょうか?

現在のテスト環境はlinux(kernel 2.6系), gcc(g++)です。
デバッグは主に、valgrindを使ってますが、coreをバックトレースすると、
スタックが壊れてるような感じになっています。
534デフォルトの名無しさん:2009/01/26(月) 21:21:57
移動するなら移動元に一言書いておかないとマルチと思われるよ。
まして、移動先でも何にも触れてないし。

で、valgrindで何が不満なの?
535デフォルトの名無しさん:2009/01/26(月) 21:22:52
スタックオーバーランてスタックオーバーフローと同じ?
536デフォルトの名無しさん:2009/01/26(月) 21:29:43
スタックオーバフローはスタックが溢れて戻り先やら何やらを壊すことで、
スタックオーバランはスタックが暴走してスタック外のエリアを壊すイメージなんだが。
537デフォルトの名無しさん:2009/01/26(月) 21:36:24
スタックが溢れると戻り先じゃなくてヒープが壊れない?
538デフォルトの名無しさん:2009/01/26(月) 21:37:04
スタックじゃなくてスタックフレームが溢れるんだろうな。
539デフォルトの名無しさん:2009/01/26(月) 21:52:03
>>536
スタックがあふれるも何か変だが、スタックが暴走するって意味不明すぎ
540デフォルトの名無しさん:2009/01/26(月) 21:52:04
>>534 すいません、一言入れておくべきでした。ご指摘ありがとうございます。

valgrindもstackを一応チェックしてるっぽいのですが、
検出されない場合もあるので、困っております。

例えば、以下のような場合です。
(スタックでこのようなエラーを検出するのは無理そうな気もしますが。)

int main(void) {
int arr[10];
int arr2[10];
arr[12] = 20;
return 0;
}

541デフォルトの名無しさん:2009/01/26(月) 21:56:21
void CClass::main()
{
 static UINT __cdecl thread(LPVOID pParam);
 BOOL flag = 0;
 AfxBeginThread(CClass::thread, this, THREAD_PRIORITY_NORMAL);
}

UINT CClass::thread(LPVOID pParam)
{
 While( flag == 0 ){
  ;
 }
}

flagが静的じゃないとコンパイルエラーが出ます。
While( ((CMainFrame*)AfxGetMainWnd())->m_Class.flag == 0 )
とするとコンパイルはできるんですが、電源切らないと何も操作できなくなるんです。
動的な変数を別スレッドの中で使うにはどうすればいいんですか?
542デフォルトの名無しさん:2009/01/26(月) 21:57:27
>>540
出来ないって書いてあるよ(FAQにも)
http://ja.wikipedia.org/wiki/Valgrind#.E5.88.B6.E7.B4.84
543デフォルトの名無しさん:2009/01/26(月) 21:59:00
>>522
なんで標準で用意されたoffsetofマクロ使わずに自分で再発明しようとするの?
話はそこからだ
544デフォルトの名無しさん:2009/01/26(月) 22:07:38
void CClass::main()
{
 static UINT __cdecl proxy(LPVOID pParam);
 UINT thread();
 BOOL flag = 0;
 AfxBeginThread(CClass::thread, this, THREAD_PRIORITY_NORMAL);
}

UINT CClass::proxy(LPVOID pParam)
{
 CClass *const this_ptr = (CClass *)pParam;
 return this_ptr->thread();
}

UINT CClass::thread()
{
 While( flag == 0 ){
  ;
 }
}
545デフォルトの名無しさん:2009/01/27(火) 00:11:44
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/

埋まった。
正直ここに合流でもいい気がするが。
546デフォルトの名無しさん:2009/01/27(火) 00:13:37
おk合流な
547デフォルトの名無しさん:2009/01/27(火) 00:24:02
>> 542
いや、なのでvalgrindでなく、他にstack overrunを検出できるようなツールはないかなーという質問でした。
548デフォルトの名無しさん:2009/01/27(火) 01:16:06
>>547
BoundsChecker
549デフォルトの名無しさん:2009/01/27(火) 01:59:53
ありがとうございます。
しかしlinux上のシステムなので、linux上で動くツールに関してはいかがでしょうか?
550デフォルトの名無しさん:2009/01/27(火) 08:02:00
>>544
ありがとうございました。2段階にしてできました!
551デフォルトの名無しさん:2009/01/27(火) 08:48:44
>>544
constはどういうことですか?はずしても動きますが、constを使ったことがないので教えてください
552デフォルトの名無しさん:2009/01/27(火) 09:22:38
>>551 聞く前に調べろよハゲ
553デフォルトの名無しさん:2009/01/27(火) 09:27:13
>>552
ここで訊くことこそ調べることです。
回答したくてしたくて仕方がない回答者に回答する機会を与えているのに
何がそんなに不満なんですか?
目の前のありとあらゆることに苛立ちを感じる青春真っ只中のボクちゃんですか?
554デフォルトの名無しさん:2009/01/27(火) 10:33:31
>>547
gcc4 の -fstack-protector
555デフォルトの名無しさん:2009/01/27(火) 10:46:41
>ここで訊くことこそ調べることです。
いいえ。
556デフォルトの名無しさん:2009/01/27(火) 11:02:50
>>553
やめてくれ
俺はここでconstを使う理由を知りたいだけなんだ
教えてくれた本人にスルーされたらお前のせいだぞ
557デフォルトの名無しさん:2009/01/27(火) 11:08:49
>>556
少なくとも、あんたが>551なのだとしたら「理由を教えてください」と書かないから混乱する。
それはさて、書き換えることが判っているオブジェクトじゃなければ、constをつけておくのはいい習慣だと思うが。
558デフォルトの名無しさん:2009/01/27(火) 11:18:28
thx。静的でとらぶったのでこのconstは重要なのかと思った。
はずしても動くから心配だった。thx
559デフォルトの名無しさん:2009/01/27(火) 11:35:37
BoundsCheckerって定期的に名前出てくるけどなんなわけ?
なんでメモリリークの追跡とかいう基本的な機能がVSにはないの?
560デフォルトの名無しさん:2009/01/27(火) 11:49:23
>なんでメモリリークの追跡とかいう基本的な機能がVSにはないの?
あるよ。
BoundsCheckerはそれだけに留まらず、例えば関数単体試験なら入力条件を自動生成したり、
パフォーマンス分析をしたりといった機能がある。

激しく重いし、決して使い易いとは言えないけどね。
561デフォルトの名無しさん:2009/01/27(火) 11:58:41
VSにあるやつってDEBUG_NEW?
STLのメモリリークとかClose忘れとかはどうしようもなくない?
562デフォルトの名無しさん:2009/01/27(火) 12:00:51
constを付ける習慣の無いヤツの書くソースは十中八九汚い。
563デフォルトの名無しさん:2009/01/27(火) 12:02:45
まぁ書き手によらずC++のソースは十中八九汚いんだけどな。
564デフォルトの名無しさん:2009/01/27(火) 12:06:24
必要だと思うまで絶対書かない
なるべく短い方が見やすい
565デフォルトの名無しさん:2009/01/27(火) 12:12:08
>>564 でたよwwwお前だお前
566デフォルトの名無しさん:2009/01/27(火) 12:15:46
>>564
変数名も基本は一文字だよな?
567デフォルトの名無しさん:2009/01/27(火) 12:29:52
>>564
constが正しく設定されてないソースを組み込むと、プロジェクト全体に波及してぐちゃぐちゃになるからしっかり書いてくれ。
568デフォルトの名無しさん:2009/01/27(火) 13:11:13
>>564
constが必要にならないプロジェクトは十中八九才能の無いヤツが関わっている。
569デフォルトの名無しさん:2009/01/27(火) 13:25:30
プロジェクトは十中八九才能の無いヤツが関わっている。
570デフォルトの名無しさん:2009/01/27(火) 16:20:18
君のレスなんて読まないよ
571デフォルトの名無しさん:2009/01/27(火) 16:23:35
>>567
> constが正しく設定されてないソースを組み込むと、プロジェクト全体に波及してぐちゃぐちゃになる

ソースレビューでしょんべんちびるくらい厳しく突っ込むといいよ。
それで直らないならリーダに文句言って変えてもらえ。
572デフォルトの名無しさん:2009/01/27(火) 16:42:36
引数の定義でのconstはちゃんと使おう。
ローカル変数へのconstはそれほどがんばらなくてもよいと思うぞ。
573デフォルトの名無しさん:2009/01/27(火) 17:10:21
>>572
C++の話だけど、引数だけでなくメンバ関数のconstもちゃんと使うべき。
574デフォルトの名無しさん:2009/01/27(火) 17:20:17
参照とポインタとメンバ関数にちゃんとついていれば
後はなんとかなりそうな気がする
575デフォルトの名無しさん:2009/01/27(火) 17:30:10
メンバ関数のvolatileのこと時々でいいから思い出してください
576デフォルトの名無しさん:2009/01/27(火) 17:56:13
>>570こっちくんなwwww
577デフォルトの名無しさん:2009/01/27(火) 20:25:19
前の会社の課長はconstを使おうという気が全く無かったな。
「メンバ関数にconstが付いてないからconstポインタから呼べないんですけど」
と言ったら、「constにしなきゃいいじゃん」と言われて唖然とした。
その課長のソースは>>562のように恐ろしいほど汚かったw
578デフォルトの名無しさん:2009/01/27(火) 20:36:15
BoundsChecker重いよなー
使ってたのは昔だから、今だとどうなんだろう
579デフォルトの名無しさん:2009/01/27(火) 21:53:57
volatile コンストラクタや volatile メンバ関数は罠だからなあ。
580デフォルトの名無しさん:2009/01/27(火) 22:05:43
OS:WindowsXP

malloc関数を呼び出すといきなりクラッシュします。
引数も間違ってはいません。
どうしてなのか教えてください。
581デフォルトの名無しさん:2009/01/27(火) 22:07:32
>>580
どっか、よそでヒープを壊してるんじゃね?
582デフォルトの名無しさん:2009/01/27(火) 22:26:27
>580
http://www.kouno.jp/home/c_faq/c7.html#19
まあ>581の言う通りだが
583デフォルトの名無しさん:2009/01/27(火) 22:51:24
>>581
kwsk

>>582
いきなりクラッシュしてしまうんですorz
584デフォルトの名無しさん:2009/01/27(火) 22:52:46
>>583
くわしくって、>>582に書いてあるじゃん。
585デフォルトの名無しさん:2009/01/27(火) 23:00:44
>>584,>>582
ありがとうございます。

この他の可能性は一応無いと考えても良いのでしょうか?
586デフォルトの名無しさん:2009/01/27(火) 23:04:35
ほぼ100%の確率でヒープを壊している。
しかしその間接的な原因は様々。
587デフォルトの名無しさん:2009/01/27(火) 23:05:50
>>585
そんな保障はできないけど
とりあえず単体でそのコードを動かして動くかどうかやってみるとか
ソースを全部コメントにしてみてそのコードを入れて動くのを確認してから
徐々にコメントをはずしていってエラー箇所を見つけるとか
エラートラップみたいなのがないなら地道な努力しかないな
そうやって考えうる原因を1つ1つ潰していくしかない
588デフォルトの名無しさん:2009/01/27(火) 23:07:11
mallocのオーバーライドみたいなのってできたっけ?
589デフォルトの名無しさん:2009/01/27(火) 23:09:21
自分で malloc の代わりになる関数を作ればいい
590デフォルトの名無しさん:2009/01/27(火) 23:12:18
でも各所で呼んである関数はmallocなんだなw
591デフォルトの名無しさん:2009/01/27(火) 23:14:49
#define malloc my_malloc
592デフォルトの名無しさん:2009/01/27(火) 23:16:30
オーバーライドというかラップになるな
メンバ関数じゃないし
593デフォルトの名無しさん:2009/01/27(火) 23:21:12
インターポジショニング
594デフォルトの名無しさん:2009/01/27(火) 23:23:09
同じ名前使うなよ。。。
親クラスの関数を任意に呼びだせるわけではないんだし
595デフォルトの名無しさん:2009/01/27(火) 23:24:32
標準で、ある程度チェックしてくれるのもあるよな。VCのデバッグ版とか。
596デフォルトの名無しさん:2009/01/27(火) 23:59:23
なるほど。
みなさんありがとうございますm(_ _)m
勉強になりました。
597デフォルトの名無しさん:2009/01/28(水) 01:24:28
俺が大昔組み込み向けに作ったデバッグ用の malloc()
はユーザから見える割り当て領域より前に呼び出し元情
報を置いて、領域末尾にアドレスから計算されるチェッ
クコード入れて適当なタイミングでチェックしてたな。
598デフォルトの名無しさん:2009/01/28(水) 14:05:09
kwgt!
599デフォルトの名無しさん:2009/01/28(水) 14:17:27
kbtms!
600デフォルトの名無しさん:2009/01/28(水) 14:51:59
kgnms!
601デフォルトの名無しさん:2009/01/28(水) 15:23:10
knbn!
602デフォルトの名無しさん:2009/01/28(水) 16:10:14
kms!
603デフォルトの名無しさん:2009/01/28(水) 18:02:15
void CApp::CTestStatic : public CStatic
{
public :
 double test[1] = {12};
}

これなんでコンパイルできないんですか?
604デフォルトの名無しさん:2009/01/28(水) 18:05:49
↑これなんでコンパイルエラー読まないんですか?
605デフォルトの名無しさん:2009/01/28(水) 18:07:01
コンストラクタ初期化子で初期化するようにデザインされた言語だから。
606デフォルトの名無しさん:2009/01/28(水) 18:14:00
なるほど
コンストラクタで一括で初期化する場合はどうかけばいいんですか?
test = {12};
とか
test[] = {12};
とかやってもコンパイルできません
607デフォルトの名無しさん:2009/01/28(水) 18:20:19
test[0] = 12;
608デフォルトの名無しさん:2009/01/28(水) 18:23:56
ようするに、配列の非静的なメンバ変数をコンストラクタで初期化する方法がまだ無いということだ。
609デフォルトの名無しさん:2009/01/28(水) 18:24:11
そらできんじゃろ。まずコンストラクタ書かないと。

CTestStatic() { test[] = { 12 }; }

みたく。そういえば、配列って初期化子使えたっけ?
610デフォルトの名無しさん:2009/01/28(水) 18:36:00
ちょっとまて
ふざけてるのかマジな分かりかねるんだが
611デフォルトの名無しさん:2009/01/28(水) 18:39:55
>607はマジだな。
612デフォルトの名無しさん:2009/01/28(水) 18:42:14
あーすまん。
「配列って初期化子使えたっけ?」じゃなくて
「配列って初期化子リスト使えたっけ?」の間違いであります。
つまり

CTestStatic() : test[] = { 0, 1, 2 } {}

みたいにかけたっけ?
613デフォルトの名無しさん:2009/01/28(水) 18:43:11
>609も>612もできない。
614デフォルトの名無しさん:2009/01/28(水) 18:45:29
やっぱできないですよね
コンストラクタでまとめて配列初期化するにはどうすればいいんですか?
615デフォルトの名無しさん:2009/01/28(水) 18:46:26
それってつまり、クラス内では test[] 自体が使えないってことかしらん♥
double *test か double test[0] にしろってこと?

っていうか、素直にコンパイラに聞いてみるか…むふん。
616デフォルトの名無しさん:2009/01/28(水) 18:48:28
>>614
>>608
コンストラクタ本体の中で代入を並べるしかない。
617デフォルトの名無しさん:2009/01/28(水) 18:54:12
>>603がPODならこれで行けるな
コンストラクタ作っちゃダメだけど
CTestStatic a = {12};

あとC++0xではこう書けるようになる予定
CTestStatic() : test{ 0, 1, 2 } {}
618デフォルトの名無しさん:2009/01/28(水) 19:01:13
static const な配列を作って、
コンストラクタでそれをコピーすればいい。
619デフォルトの名無しさん:2009/01/28(水) 19:04:53
急増品だけど動いたよ^o^

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

class hoge{
public:
hoge() { for ( int i = 0; i != 5; ++i ){ d[ i ] = i; }; }
void get() { copy( &d[ 0 ], &d[ 5 ], ostream_iterator< double >( cout, " " ) ); cout << endl; }
private:
double d[ 5 ];
};

class huga{
public:
huga() { d = new double[ 5 ] (); for ( int i = 0; i != 5; ++i ){ d[ i ] = i; }; }
void get() { copy( &d[ 0 ], &d[ 5 ], ostream_iterator< double >( cout, " " ) ); cout << endl; }
~huga() { delete [] d; }
private:
double * d;
};

int main(){
hoge h1; h1.get();
huga h2; h2.get();
return 0;
}
620デフォルトの名無しさん:2009/01/28(水) 19:09:32
ありえない・・・・・
621デフォルトの名無しさん:2009/01/28(水) 19:10:34
なんでnewしてんの?
622デフォルトの名無しさん:2009/01/28(水) 19:15:33
#include <iostream>

class Hoge {
public:
 Hoge() : d0(12), d1(4), d2(40), d(&d0) { }
 int get(int i) { return d[i]; }

private:
 int d0, d1, d2;
 int *d;
};

int main()
{
 Hoge hoge;
 for (int i = 0; i < 3; ++i) {
  std::cout << hoge.get(i) << std::endl;
 }
}
623デフォルトの名無しさん:2009/01/28(水) 19:21:24
boost assingn使えばいいんじゃない?
624デフォルトの名無しさん:2009/01/28(水) 19:22:42
クラス内で{ }を使って配列を初期化することはできないんだね^^;
625デフォルトの名無しさん:2009/01/28(水) 19:24:19
C++標準ライブラリにvectorあるんだから使え
626デフォルトの名無しさん:2009/01/28(水) 19:24:55
>>624
一時変数使ってもいいならもちろん出来るさ
627デフォルトの名無しさん:2009/01/28(水) 19:45:49
普通はこうする

#include <iostream>

class Hoge {
public:
 Hoge() {
  static const int d[3] = { 12, 4, 40 };
  memcpy(&m_d, d, sizeof m_d);
 }
 int get(int i) { return d[i]; }

private:
 int m_d[3];
};

int main()
{
 Hoge hoge;
 for (int i = 0; i < 3; ++i) {
  std::cout << hoge.get(i) << std::endl;
 }
}
628デフォルトの名無しさん:2009/01/28(水) 20:11:37
>>627
正解
初心者大杉
629デフォルトの名無しさん:2009/01/28(水) 20:13:05
PODじゃないのにmemcpyして大丈夫?
630デフォルトの名無しさん:2009/01/28(水) 20:13:54
>>629
PODじゃなかったらしちゃだめだな
631デフォルトの名無しさん:2009/01/28(水) 20:17:47
int m_d[3]; はどう見ても POD
632デフォルトの名無しさん:2009/01/28(水) 20:21:03
でもHogeはPODじゃないだろ
非PODのPOD部分をmemcpyって規格で許されてたっけ
現実的には問題ないことが多いと思うけど
633デフォルトの名無しさん:2009/01/28(水) 20:24:07
つ[std::copy()]
634デフォルトの名無しさん:2009/01/28(水) 20:26:23
>>632
全く問題ない
635デフォルトの名無しさん:2009/01/28(水) 20:26:43
copyは一個づつ入れるって決まってるじゃん、と思ったけど今は書き方の問題で別に速くしたがってるわけじゃないか
636デフォルトの名無しさん:2009/01/28(水) 20:26:54
>>633
セキュア関数を使えと文句を言われます!
637デフォルトの名無しさん:2009/01/28(水) 20:30:23
static const int d[3] = { 12, 4, 40 };
コンストラクタにこれを記述したらコンパイルできたのですが
使おうとするとdはないと言われますどうしてですか?
638デフォルトの名無しさん:2009/01/28(水) 20:35:26
static constだからグローバル変数だろ::dじゃね?
639デフォルトの名無しさん:2009/01/28(水) 20:38:13
>>637
>>627のように自分のメンバ変数へ複製している?
640デフォルトの名無しさん:2009/01/28(水) 20:45:22
>>638
寝言は寝て言え
641デフォルトの名無しさん:2009/01/28(水) 21:04:12
わかんね
もういいや一個一個いれる
642デフォルトの名無しさん:2009/01/28(水) 21:14:39
>>627
> int get(int i) { return d[i]; }

m_d いらねーじゃん(w
643デフォルトの名無しさん:2009/01/28(水) 21:15:55
>>642
すまん。ミスだ。
return m_d[i]; が正しい。
644デフォルトの名無しさん:2009/01/28(水) 21:17:19
>>627
おぉー、{ }を使って初期化できたー★
memcpyの代わりにcopyを使うと>>636の言うとおり警告が出たけど、でもちゃんと動いた。
>warning C4996: 'std::copy': Function call with parameters that may be unsafe
645デフォルトの名無しさん:2009/01/28(水) 21:21:44
VC++ だと stdext::checked_copy か stdext::unchecked_copy を使えと言われるんだよな
646デフォルトの名無しさん:2009/01/28(水) 21:50:50
std::copyでの警告を消すには_SCL_SECURE_NO_WARNINGSを定義するといい。
647デフォルトの名無しさん:2009/01/28(水) 21:52:23
移植を考えないなら
セキュア関数使った方がいいとは思うけどね
648デフォルトの名無しさん:2009/01/29(木) 00:13:06
vcは常に移植しづらいcodeを書かせようとするから嫌いだ
649デフォルトの名無しさん:2009/01/29(木) 00:36:06
MSがWindows以外で動くコードを書くのに協力するわけないだろ
650デフォルトの名無しさん:2009/01/29(木) 01:05:05
WindowsのプログラムでPostQuitMessageを呼び出した後に
CreateWindowでもう一度ウィンドウを作成して走らせるのはまずかったりするのでしょうか?
651デフォルトの名無しさん:2009/01/29(木) 01:15:17
ちゃんとメッセージ処理でそうしても動くようにしてさえいれば問題なし。俺なんかはウィンドウの数だけPostQuitMessageしてる。
652デフォルトの名無しさん:2009/01/29(木) 01:16:27
.NETもWindows専用のライブラリと化してるもんなw
653デフォルトの名無しさん:2009/01/29(木) 01:44:35
struct *hogeっていうのがあって
char *dataというのもあったとして

(char *) hoge = data

ってこんな変換おけなの?

654デフォルトの名無しさん:2009/01/29(木) 01:46:34
>>653
無理。
655デフォルトの名無しさん:2009/01/29(木) 02:06:20
memcpy的なことがしたいのか?
656650:2009/01/29(木) 02:15:08
>651
なるほど、安心しました。
ありがとうございます。
657デフォルトの名無しさん:2009/01/29(木) 02:20:34
>>645
memcpy() はスルーで std::copy() に警告出すの?ザルすぎる。
658デフォルトの名無しさん:2009/01/29(木) 03:43:33
if(){
  A;
  C;
}
else if(){
  B;
  C;
}

この場合Cのコードがダブってしまうけど,
関数にするほどの処理ではなくて,フラグ設定するのも返って読みづらくなる・・
という場合のうまい書き方って無いですか?

Cの処理はA,Bの結果を受け取るので処理の順番を変えることはできません。
659デフォルトの名無しさん:2009/01/29(木) 03:56:12
こういう風にはできない?
hoge x;
if() {
  x = A;
}
else if() {
  x = B;
}
C; //xを使う
660デフォルトの名無しさん:2009/01/29(木) 03:57:39
>>659
それだと両方の条件が偽になったときにダメだろ。
661デフォルトの名無しさん:2009/01/29(木) 04:19:39
>>659
レスどうもです。
xをあり得ない値で初期化しておいて
Cを実行する前にxの値をチェックするようにすればうまくいきますね。
がしかし,あり得ない値というのが将来あり得る値になるかもしれず
バグの元になりそうで怖い気がします。。

考え方はフラグと同じなのでおとなしくフラグ設定しておくのが無難なのでしょうか。
662デフォルトの名無しさん:2009/01/29(木) 04:27:38
A,B,Cを関数にすればそんなにひどいコードの膨らみ方はしないだろ
663デフォルトの名無しさん:2009/01/29(木) 08:19:46
>>658
最初のifの条件をaa、2番目をbbとしたとき、
if ((aa && A) || (bb && B)) { C; }
ただし、AとBは常に真のときに限る。

または、
if (aa) { A; }
else if (bb) { B; }
else { return; }
C;
ただし、問題の処理後にreturnするだけのときに限る。

まあどっちもアレなので、>>658のままでいいと思うが。
664デフォルトの名無しさん:2009/01/29(木) 08:53:04
もうひとつ
if (aa || bb) {
  if (aa) { A; }
  else { B; }
  C;
}
ただし、aaが副作用を伴わない場合に限る。
665デフォルトの名無しさん:2009/01/29(木) 10:54:56
クラステンプレートじゃなくて、コンストラクタにテンプレート指定させるにはどうすればいいんでしょうか
そもそもそんなこと出来ない?
666デフォルトの名無しさん:2009/01/29(木) 12:35:59
>>665
std::mem_fun と std::mem_fun_t みたいな関係にすればよかろう
667デフォルトの名無しさん:2009/01/29(木) 12:38:19
>>665
テンプレートクラスにすればいいんじゃないか?
668665:2009/01/29(木) 12:42:30
ありがとうございます。

クラステンプレートにしちゃうとそのクラスを引数で渡す関数なんかも
テンプレートにしなくちゃいけないからめんどいんですよね^^;
親クラスをテンプレートクラスにして基底クラスを渡せば出来そうですが・・・

コンストラクタ自体にテンプレート指定はできなそうですね^^;
mem_fun_tちょっと調べてみます
669デフォルトの名無しさん:2009/01/29(木) 16:17:21
すみません質問です
同じ構造体をそれぞれ別の関数で参照したいのですが、
その時、同じ名前の変数で宣言しても出来ませんでした。おそらくローカル変数になる(?)
ので同じ名前でも同じ物を参照できないということだと思うのですが、どうやればいいでしょうか?
670デフォルトの名無しさん:2009/01/29(木) 16:24:09
671デフォルトの名無しさん:2009/01/29(木) 16:27:15
>>669
グローバル変数にすればいい
672デフォルトの名無しさん:2009/01/29(木) 16:28:47
>>669
グローバル変数にするか
それぞれの関数の引数に構造体のポインタを渡せばいい
673デフォルトの名無しさん:2009/01/29(木) 16:31:56
>>670
うpしました
No.8779です。
他にも動的変数が〜と指摘されたのですがいまいち・・・
674デフォルトの名無しさん:2009/01/29(木) 16:34:12
>>671,672
やはりそうですか。ありがとうございます
675デフォルトの名無しさん:2009/01/29(木) 16:40:19
>>673
46行目で引数が無いってエラーはでるけど、変数名がどうのってのは出てないぞ。
676デフォルトの名無しさん:2009/01/29(木) 16:44:40
Visual C++でビルドした時も、確かにそこしかエラーはでないのですが、これでは動かないと言われたので
自分なりに考えたのですが解らなかったので聞いてみたのですが大丈夫でしょうか?
ついでですが、引数無しで別関数に移動ということは出来ないのでしょうか?
677デフォルトの名無しさん:2009/01/29(木) 16:49:43
>>676
Cはオーバーロード無いんじゃね?
C++ならオーバーロードが使える。
678デフォルトの名無しさん:2009/01/29(木) 16:49:47
今グローバル変数でやってんだろ?
関数の引数が無しならグローバルにする。
引数有りでいいならポインタ渡しする。
グローバル変数使うのがダメで引数使うのもダメならどうしようもない。
679デフォルトの名無しさん:2009/01/29(木) 17:04:22
struct kirokutb WRbuff;はグローバルとローカルの二つあるな。
write_tbにあるローカルなWRbuffの宣言は要らなくて
グローバルなWRbuffの方に書き込みたいんじゃないのか?
680デフォルトの名無しさん:2009/01/29(木) 17:08:16
ありがとうございます。やはりグローバルで宣言すればOKのようです。

すいません、write_tbにあるWRbuffは消し忘れです。お手数おかけしました。
681デフォルトの名無しさん:2009/01/29(木) 21:41:02
>653
cast as lvalue とも呼ばれるもので古い gcc では可能だった。
682デフォルトの名無しさん:2009/01/29(木) 21:45:54
C++なら(char *&)hoge = dataと書けるだろうな。
683デフォルトの名無しさん:2009/01/29(木) 22:16:28
まあ
*(char **)&hoge = data
で大抵の環境では動くだろ。
動かないのは
sizeof(char *) != sizeof(hoge *) な環境だけだと思う。
バスエラーがどうの、なんてのは、
同サイズならどっちのポインタでも一緒だし。
684デフォルトの名無しさん:2009/01/29(木) 23:44:44
C++のクラス宣言の中で
 char* states_[] = {"fine", "nomal", "sick"};
見たいな感じで、文字列のリストを定義したいんだけど、
そのまま書くとコンパイルエラーになります。
定石みたいのがあれば教えてください。
685デフォルトの名無しさん:2009/01/29(木) 23:48:24
>>684
staticにしたら、できなかったっけ?
686デフォルトの名無しさん:2009/01/30(金) 00:01:18
>>684
無理、あきらめてコンストラクタでやるしかない

近いのだと、コンストラクタで
static const char* tmp[] = {"fine", "nomal", "sick"};
を宣言してコピーするという手もある
687684:2009/01/30(金) 00:12:04
>>685
試してみましたが、無理でした
>>686
了解です
ありがとうございました
688デフォルトの名無しさん:2009/01/30(金) 00:15:03
内容変更しないのなら static const メンバ変数にすりゃええんでないの?
クラス宣言内で初期化する事はできないけど、
実体定義時に初期化できるよ
689デフォルトの名無しさん:2009/01/30(金) 00:21:20
>>687
class Hoge
{
public:
static char* states_[];
};

char* Hoge::states_[] = {"fine", "nomal", "sick"};

これでコンパイルできたけど、これじゃいかんの?
690684:2009/01/30(金) 00:30:06
>>688
>>689
なるほど。できました。
求めていた感じです。
ありがとうございました。
691デフォルトの名無しさん:2009/01/30(金) 00:30:25
char *str = L"hahaha";
という定義のLってなんですか?このLが無くても別に問題ないと思うんですけど。。
692デフォルトの名無しさん:2009/01/30(金) 00:31:49
Lがあったらコンパイルできないと思うんだが。
L付きの文字列はワイド文字列だ。
const wchar_t *str = L"hahaha"; が正しい。
693デフォルトの名無しさん:2009/01/30(金) 00:38:51
>>691
L'A'みたいに文字に付く事もあるぜ
694デフォルトの名無しさん:2009/01/30(金) 00:45:31
Lついてたらコンパイルできてませんでした。
wchar_tにしたらコンパイルできました。しかも出力するには
std::wcoutとかを使わないといけないなんて、
こんな変なの用途があるんですか?
695デフォルトの名無しさん:2009/01/30(金) 00:46:12
charとwchar_tは別物だ
696デフォルトの名無しさん:2009/01/30(金) 00:47:12
ユニコード対応に使う
697デフォルトの名無しさん:2009/01/30(金) 00:51:53
charだと256種類しか文字表せないから日本語とか入れられないだろ?
そのためのcharのでっかい版がwchar_t

まあwchar_tに日本語が入れられるとは限らないんだけどな
698デフォルトの名無しさん:2009/01/30(金) 00:52:08
charと違って、大抵wchar 1つに漢字も仮名も収まるのが便利。
Windowsみたいにそうでならない可能性が高いやつもあるけど。
699デフォルトの名無しさん:2009/01/30(金) 01:06:03
サロゲートペアの罠
700デフォルトの名無しさん:2009/01/30(金) 02:16:07
>>689 const 抜けてるぜ。
701デフォルトの名無しさん:2009/01/30(金) 03:09:53
リストコントロールでアイテムを選択するにはどうするの?
 1 aaa.txt
2 bbb.txt
3 ccc.txt
上で2を選択して削除→3を自動的に選択にしたいんだが、
2を削除するとどのアイテムも選択してない状態になる…。
リストボックスのSetCurSelみたいなのがあればいいんだけど。
702デフォルトの名無しさん:2009/01/30(金) 07:03:23
>>701
環境を書かないってことはどうせドザなんだろうけど、APIスレかMFCスレにでも隔離されててくれと思ってしまうな。
703デフォルトの名無しさん:2009/01/30(金) 18:10:59
現在、開発中のプログラム(C++)がメモリフラグメンテーションして、
freeなメモリは結構あるのに、allocationに失敗する(Out of Memory)現象に遭遇しています。

プロセスのメモリの使用状況を確認できるようなツール・コマンドはlinuxにありますでしょうか?
今は、googleperftoolsなどを使ってますが、フラグメンテーションしてるかどうかはわからない(?)
ので困っております。
どなたかわかりますでしょうか?

704デフォルトの名無しさん:2009/01/30(金) 19:34:45
・フラグメンテーションが原因であることは確定してるの?
 本当に「freeなメモリは結構ある」の?どうやって調べたの?
・本当にアロケーションに失敗してるの?mallocの引数がでかすぎになってないか
 ちゃんと確認したの?
・どのタイミングで失敗してるの?プログラムの起動直後?時間がたってから?
 起動直後に多めに確保して使い回すとかを考える方が先じゃないの?
・フラグメンテーションの発生を確認したとして、それからどうすんの?カーネル改造するの?
・なんでUNIXスレやLinux板じゃなくてここで聞くの?ばかなの?死ぬの?
705デフォルトの名無しさん:2009/01/30(金) 20:18:59
>>704
つっこみありがとうございます。

・フラグメンテーションが原因であることは確定してるの?
確定はしてないですが、たぶんそうです。valgrindをとおしてもリークはないですし、
top上のvirtualもrssも実メモリサイズに対してかなり余裕があります。(実メモリ4G、top上の表示は1Gぐらい)

・本当にアロケーションに失敗してるの?mallocの引数がでかすぎになってないか
 ちゃんと確認したの?
確認しました。

・どのタイミングで失敗してるの?プログラムの起動直後?時間がたってから?
 起動直後に多めに確保して使い回すとかを考える方が先じゃないの?
大きめのバッチで、起動後3時間ぐらいした後です。
mmap時にENOMEMが返ってきます。

・フラグメンテーションの発生を確認したとして、それからどうすんの?カーネル改造するの?
C++のSTLをかなり使っているためメモリ管理が不透明(自分があまりわかってないだけ)な部分がありますが、
メモリをpoolするallocatorを自作するなりして、フラグメンテーションが起きにくくなるように調整します。

・なんでUNIXスレやLinux板じゃなくてここで聞くの?ばかなの?死ぬの?
Linux板も見ましたがあまりいいのが見つからなかったので、ここで質問させてもらいました。
まあ、あとlinux上の話ですが、プログラムに関係するので。
いい板があったら教えてください。
706デフォルトの名無しさん:2009/01/30(金) 20:33:10
>mmap時にENOMEMが返ってきます。

あのー、これって要はアドレス空間が足りないってことだよね。
確かにフラグメントでもアドレス空間不足は起きるけどさ
munmapをちゃんとやってるか確認するほうがずっと先決だと思うんだけど。
707デフォルトの名無しさん:2009/01/30(金) 21:05:09
>>706

普通にSTL(vector, set)で大量(512Mぐらい)のメモリを確保してはclearして、
というのを繰り返してます。
mmapは領域拡大の時にmunmapして、領域拡大して、mmapするという動作をします。
munmapした後に拡大した領域をmmapする際に出ます。
(大きな連続領域がなくなっていると予測)

フラグメントを見るコマンドとかってないんですかね?
pmapで見れるメモリマップっていまいち見方がわからないのですが、
pmapでもわかりますか?
708デフォルトの名無しさん:2009/01/30(金) 21:13:33
vectorはclearしてもメモリ確保しっぱなしだけどそこは大丈夫なの?
709デフォルトの名無しさん:2009/01/30(金) 21:17:25
swapでClear-and-minimizesしてます。

いや、フラグメントを減らす方法もいくつかわかりますが、
それを確認する方法がないので困っています。
710デフォルトの名無しさん:2009/01/30(金) 21:19:35
64bitマシンでやる?
711デフォルトの名無しさん:2009/01/30(金) 21:27:31
>>707
メモリを効率的に使う技術を持っていないなら、64bitOSに助けてもらうこと
712デフォルトの名無しさん:2009/01/30(金) 21:28:16
めんどうだから別プロセスに確保して貰っちゃえ。
713デフォルトの名無しさん:2009/01/30(金) 21:29:42
32bitで512Mを取ったり貼ったりしてたら確かに辛いだろうなぁ
512Mの領域って普通の設定だと6枚しか取れないぞ
714デフォルトの名無しさん:2009/01/30(金) 22:26:58
むしろ512Mを解放して再確保するからフラグメントになるんだろ。
取ってそのまま再利用すればアドレスが足りなくなることはない。
複数確保なら知らんが。
715デフォルトの名無しさん:2009/01/31(土) 00:23:04
データ構造を見直して分割確保したら?
716デフォルトの名無しさん:2009/01/31(土) 02:59:02
つうか自作なら、自分で領域のアドレスをログれば良くね?
3時間で何回取り直してるのか知らないけど、最悪グラフ化すれば判るっしょ。
更にlifegame風に表示させたら面白そうだね。というよりdeflagツール風か。
717デフォルトの名無しさん:2009/01/31(土) 05:26:35
>>707
> munmapした後に拡大した領域をmmapする際に出ます。

vector の話だとすると、拡大した領域の mmap を先にしないと要素のコピーができないよ。
このとき瞬間的にメモリ使用量は倍近くになるよ。 top で見えるサイズが 1 G あるなら、
この瞬間に 2 G 近くになってアドレススペースが不足する可能性が十分考えられるよ。
718デフォルトの名無しさん:2009/01/31(土) 17:03:25
オープニングでアムロがコアファイターに乗るところなんだけど
なんでノーマルスーツの色が青いんだ?
719デフォルトの名無しさん:2009/01/31(土) 17:42:35
>>718
白い字幕が見難くなるから。
720デフォルトの名無しさん:2009/01/31(土) 17:43:52
なんで最後アスラン自爆したのに生きてんの?
721デフォルトの名無しさん:2009/01/31(土) 17:45:32
神龍に頼んで不老不死にしてもらったから。
722デフォルトの名無しさん:2009/01/31(土) 18:56:37
CDXDevice *device;
CDXDevice* device;

この2つはどう違うのですか?
723デフォルトの名無しさん:2009/01/31(土) 19:08:38
見た目
724デフォルトの名無しさん:2009/01/31(土) 19:39:26
C言語よこんにちは的な初心者が出会っておくと得な
C言語独習参考書と無料の統合開発環境を教えてください。
725デフォルトの名無しさん:2009/01/31(土) 19:40:43
CDXDevice *device1, device2;
CDXDevice* device1, device2;

この2つはどう違うのですか?  ><
726デフォルトの名無しさん:2009/01/31(土) 19:42:13
見た目
727デフォルトの名無しさん:2009/01/31(土) 19:59:47
>>719
おー
thx
728デフォルトの名無しさん:2009/01/31(土) 20:54:00
>>724
参考書=K&R
IDE
windows=VS EE、QtCreator、Code::Blocks、DialogBlocks、DevC++
Linux=Code::Blocks、emacs、…monoとかも?
macは知らん
勧めてないけど、borlandが初心者にはやさしいかもな
729デフォルトの名無しさん:2009/01/31(土) 21:12:15
>>725
*の回りにはいくら空白があってもいいんだってさ。
だから

CDXDevice * device1, device2;

こんな風に書いても一緒。見た目、掛け算と混同しちゃうけど。
730デフォルトの名無しさん:2009/01/31(土) 21:17:34
>>728
K&Rなんか初心者に薦めんなボケ
731デフォルトの名無しさん:2009/01/31(土) 23:00:38
>>730のオススメも是非教えてくれ。
732デフォルトの名無しさん:2009/01/31(土) 23:15:36
この手の話題は結論出ないからなぁw
そんなに答えが欲しいならスレ総力を挙げて本を作るのだ
733デフォルトの名無しさん:2009/01/31(土) 23:25:08
お前らの方が良い本作れそうだなw
あくまでも初心者対象としてだが
734デフォルトの名無しさん:2009/01/31(土) 23:33:36
それは2chねらーに夢見すぎだw

いかにも有能そうに、自分以上の存在を小馬鹿にする技術が
発達してるだけだよ、2chねらーなんてw
735724:2009/01/31(土) 23:33:52
結局独習Cにした。糞たかいが仕方ない。未来への投資と考えて・・・orz
736デフォルトの名無しさん:2009/01/31(土) 23:36:49
Cの本かあ。
C++の本読めばCの内容も内包してるようなもんだから
C++の本読めばいいと思うのは俺だけ?
737デフォルトの名無しさん:2009/01/31(土) 23:38:53
そんなこと言ってるとC++の常識がCに通じないから危険だぞw
初心者向けの本って掴みから、読者が学習する路線やら基本知識まで掌握しないといけないから、
多人数の意見が混じり合うと、頭がおかしくなって死にそうだ
738デフォルトの名無しさん:2009/01/31(土) 23:41:36
>>736
C++の勉強がしたいのならC++の本を読めばよいし
Cの勉強がしたいのならCの本を読めばいい
と俺は思います

「C++/CLIはC++を内包しているようなもんだから、全てのC++の学習者は
C++/CLIを学ぶべきだ」と考えますか?
考えないでしょう
739デフォルトの名無しさん:2009/01/31(土) 23:41:42
継承を勉強する手前までの知識なら
それほど大きな差はないと思うけど、
C不便って思われる点は大量にあるな。
740デフォルトの名無しさん:2009/01/31(土) 23:43:31
>>738
C++/CLIは標準化を蹴られた実質窓依存の言語だし
比較として適当ではない気が・・・
C++は覚えておいて損はないと思うよ
741デフォルトの名無しさん:2009/01/31(土) 23:44:34
>>740
ええと、「Cを学びたい」という学習者の意向や前提は無視するわけですか?
そうですね、Haskellは覚えて損は無いでしょう
742デフォルトの名無しさん:2009/01/31(土) 23:45:29
HaskellでCは学べんだろう・・・
743デフォルトの名無しさん:2009/01/31(土) 23:46:00
C++でもCは学べませんね
特にC99は
744デフォルトの名無しさん:2009/01/31(土) 23:46:52
C99なんて誰も使ってないし…
745デフォルトの名無しさん:2009/01/31(土) 23:47:19
でも、C++だけじゃないが、オブジェクト指向系の言語を勉強するなら
先にGoFあたりをガッツリ理解していた方が、クラスを変な解釈したりしないから良いと感じたことはある
まぁ、実際にコード書いて動いた方が楽しいし、独習ならそっちの方がモチベーションは確実に上になるだろうな
746デフォルトの名無しさん:2009/01/31(土) 23:48:07
で!俺のチョイスは間違ってるの!? おまえらだけで楽しそうに議論しないでおくれよ!
747デフォルトの名無しさん:2009/01/31(土) 23:49:19
CとC++の違いを解説してるC++の入門書もあるし、
C使いづれえええええええ!!!!となる可能性はあるけど
大は小を兼ねるを期待するのも1つの道だ。
別にCの入門書を買ってもいいけどさ。
748デフォルトの名無しさん:2009/01/31(土) 23:49:22
無難なところじゃないか
749デフォルトの名無しさん:2009/01/31(土) 23:49:23
なるほど、自分の身勝手な決め付けを相手に強要する訳ですね

Cではmalloc()の戻り値をキャストする必要は無いし
main()はただの関数で再帰可能だし
C++とCは結局のところ違う言語ですが、
Cを学びたいと言っている人間に、
「似たようなもんだからこっちにしとけ」とC++を無理やり教え込むのですか
750デフォルトの名無しさん:2009/01/31(土) 23:51:13
選択肢を提示しただけでこれだけ文句言われるとはなあ。
強要なんてした覚えないしw
751デフォルトの名無しさん:2009/01/31(土) 23:53:28
>>750
いやごめん
ちょっとヒステリックなおばさnごっこを
してみたくなったんだ
752デフォルトの名無しさん:2009/01/31(土) 23:55:57
モンスターペアレンツ恐いです><
753デフォルトの名無しさん:2009/02/01(日) 00:11:19
>>751
自意識ばっか膨れ上がった能無しのオタ男丸出しで、
ちっともおばさnごっこになってないよ。ただ誤読しただけでしょ。
754デフォルトの名無しさん:2009/02/01(日) 00:18:35
>>753
あらら、おこっちゃったの?
ごめんなさいねぇププ
755デフォルトの名無しさん:2009/02/01(日) 00:20:34
騙りって楽しいのかなあ
756デフォルトの名無しさん:2009/02/01(日) 00:22:50
>>755
さっきまでは楽しかったけど、不出来を指摘されてムカついちゃったらしい。
757デフォルトの名無しさん:2009/02/01(日) 00:22:51
たまにやると楽しいよ
君もやってごらん
758デフォルトの名無しさん:2009/02/01(日) 00:25:32
よく知らない人はC++が「最新のC」で、Cを「機能制限版の古いC++」だと思ってたりするからな
完全に名前のせいだが

そうじゃないことだけ理解してれば勉強する順番は自由
759デフォルトの名無しさん:2009/02/01(日) 00:39:25
ある程度わかったら、MSDNの仕様書で十分だけど。
760デフォルトの名無しさん:2009/02/01(日) 00:42:38
MSDN便利だよな
VC6くらいのchmが軽くて良い

ANSI C言語辞典は持ってるけど、こいつをchmファイル化して持っておきたいとはよく思う
761デフォルトの名無しさん:2009/02/01(日) 00:56:37
>>760
むしろANSI C言語辞典のノリで現代版ANSI C++辞典がほしい。
英数編と五十音編の2冊くらいでそこそこの厚さに収まってくれないかな。
762デフォルトの名無しさん:2009/02/01(日) 01:03:48
ANSI C言語辞典であの厚さだから
ANSI C++辞典だとどのくらいのページ数になるんだろうか
流石に2冊には納まるか?
763デフォルトの名無しさん:2009/02/01(日) 01:27:34
764デフォルトの名無しさん:2009/02/01(日) 01:29:52
この商品に興味がある人は、こんな商品にも興味をもっています。

ガラスの仮面(43巻)
チャンネルはそのまま!(1)
黒執事(6)
オバマ大統領就任演説
ジェネラル・ルージュの凱旋(上)

やだ・・・なにこれ・・・('Д')
765デフォルトの名無しさん:2009/02/01(日) 01:34:45
上の3つを持ってる俺に謝れ
766デフォルトの名無しさん:2009/02/01(日) 01:37:01
何でプログラムの本がないんだよw
767デフォルトの名無しさん:2009/02/01(日) 01:39:36
以前何かの本で、エロゲーが結構長いこと表示され続けたのがあったなぁ。
768デフォルトの名無しさん:2009/02/01(日) 01:42:21
vcprojっていう拡張子のファイルって何をするものですか?
769デフォルトの名無しさん:2009/02/01(日) 01:45:10
VC++ のプロジェクトに関する情報を記述したファイル
770デフォルトの名無しさん:2009/02/01(日) 01:45:44
>>768
Visual C++のプロジェクト。
どのファイルをどうコンパイルするかなどと言ったことが書かれている。
771デフォルトの名無しさん:2009/02/01(日) 01:56:22
どうやれば使えるんですか?
772デフォルトの名無しさん:2009/02/01(日) 01:59:50
vcbuildとmsbuildでぐぐれ
773デフォルトの名無しさん:2009/02/01(日) 02:06:23
>>771
Visual C++をインストールすれば、ダブルクリックして開けるようになる。
774デフォルトの名無しさん:2009/02/01(日) 02:09:21
>>772
調べてもよくわからなくて・・・無知ですいません

>>773
分かりました!ありがとうございます!
775デフォルトの名無しさん:2009/02/01(日) 02:12:51
辞典と言えば、Wikipediaももう少し何とかなってほしいな。
現状だと事典ではなく辞典レベルだ。
それ以前にスカスカだけど。
776デフォルトの名無しさん:2009/02/01(日) 02:13:41
お前が書けばいいじゃないか
777デフォルトの名無しさん:2009/02/01(日) 02:14:25
wikiはユーザーが育てるものだろ
文句あるなら自分で補完しろ
778デフォルトの名無しさん:2009/02/01(日) 02:14:43
英語のwikipediaの充実ぶりは凄いが、まあ編集可能な人口が違うからなあ。
でも、たまに日本語の方が詳しい事もあるんだよな。これとか。
ttp://ja.wikipedia.org/wiki/DDR3_SDRAM
779デフォルトの名無しさん:2009/02/01(日) 02:21:49
日本は、声優とかビデオ女優の情報量だけは豊富だからな
780デフォルトの名無しさん:2009/02/01(日) 02:36:18
wikipediaはCとかに偏った解説書くと「中立じゃないw」って言われて消されるからな
あらゆる言語を満遍なく知ってる人しか書けないから敷居が高い
781デフォルトの名無しさん:2009/02/01(日) 02:40:47
具体的にどの記事のこと?
782デフォルトの名無しさん:2009/02/01(日) 02:45:24
>>775-776
やっているよ。でも今のペースじゃ英語版に追いつけるわけがない。
Java関係は日本語版でも記事の数は多くて羨ましい(中身の量はともかく)。

>>780
過疎すぎて消す人すら来ないように自分は思っているんだけどな。
783デフォルトの名無しさん:2009/02/01(日) 02:50:02
constとか共用体とか、C特有の重要な概念の記事が抜けてるから書こうと思ったことはある
でもC/C++以外にも一応あるからそれも織り交ぜないと行けないのが面倒で面倒で諦めた
Dのinvariantとの違いとか調べたくねえよ
784デフォルトの名無しさん:2009/02/01(日) 02:58:50
そんなものこうしておけばいい。
==D言語==
{{節stub}}
785デフォルトの名無しさん:2009/02/01(日) 03:01:48
最終兵器スタブ
786デフォルトの名無しさん:2009/02/01(日) 03:03:31
誰でも編集可能なのだから、知っていることを書けばいい。
Cに偏ったことであればCと書いておけばいい。
Javaではそうならない!という人がJavaについて追加すればいい。
それだけのことなのにね。
787デフォルトの名無しさん:2009/02/01(日) 03:05:18
技術情報なんて日本語じゃなくてもいいじゃん。
英語編集に参加して後で翻訳すればいい。
788デフォルトの名無しさん:2009/02/01(日) 03:18:44
ようするに語弊は有るが、英語版Wikipediaをパクって翻訳すれば
789デフォルトの名無しさん:2009/02/01(日) 03:42:27
いつの間にか、翻訳記事の投稿時に、翻訳元の履歴から5人名前を拾って
要約欄に記載するという条件が無くなったので、前より少し楽になった。
790デフォルトの名無しさん:2009/02/01(日) 07:25:53
Javaを勉強したのはもう15年くらい前の話だけど
どの本もCまたはC++を知っていること前提に書かれていて
当時せいぜいVBしか使えなかった自分は面食らった記憶が…。
791デフォルトの名無しさん:2009/02/01(日) 09:39:47
http://www3.uploda.org/uporg1981412.zip.html

このファイルの構築方法わかりません・・・・誰かお願いできますか?
792デフォルトの名無しさん:2009/02/01(日) 09:40:17
>>791
PASSは kari です
793デフォルトの名無しさん:2009/02/01(日) 10:33:02
TalesWeaverのチートツール?
ここじゃ鼬害だからMMOsaloonで聞けば?
794デフォルトの名無しさん:2009/02/01(日) 10:44:10
まぁ何のツールかは言語の知識には関係ないんじゃないか?

>>791
何をお願いしたいのか分からん。
VC2008入れてビルドしたら良いんじゃない?
795デフォルトの名無しさん:2009/02/01(日) 14:08:12
>>791
それでは私がmmosaloonの該当スレで質問してきましょうw
796デフォルトの名無しさん:2009/02/02(月) 00:48:11
クラスや関数にもstaticは可能な限りつけた方がいいんでしょうか?
違うクラスで使う同じ関数がダブらないから効率がよくなるって解釈でいいんでしょうか?
797デフォルトの名無しさん:2009/02/02(月) 01:01:50
そりゃ効率のいいコードにはなると思うけど、
コードの形だけでは実行速度はわからない。
798デフォルトの名無しさん:2009/02/02(月) 01:04:03
メンバ変数を操作しないユーティリティ系のメンバ関数には付けるべき
799デフォルトの名無しさん:2009/02/02(月) 01:09:06
thx。やっぱつけた方がいいのか。一度も使ったことなかった
どのクラスのなかで宣言してようがstaticをつければグローバルになってどこからでも宣言なしで使えるようになるの?
800デフォルトの名無しさん:2009/02/02(月) 01:11:38
言いたいことはなんとなくわかるが、グローバルかどうかはpublicかどうかが基準だ
public staticであれば、クラスのインスタンスを作らなくても関数にアクセス出来るというだけ
801デフォルトの名無しさん:2009/02/02(月) 01:15:02
staticメンバ関数とstaticメンバ変数はただクラス名の名前空間に、関数と変数を宣言してるだけ。
アクセスできるかはアクセス修飾子によって決まる。
クラス内部で使うとかグローバルとか関係ない。
802デフォルトの名無しさん:2009/02/02(月) 01:23:38
thx!完全に理解しました。スコープがいらなくなるのかと思いました。
クラスのインスタンスを作っても、たとえばstatic関数だと、その部分の関数だけインスタンスが作られなくなるというだけですね。
803デフォルトの名無しさん:2009/02/02(月) 09:39:54
http://web.fuip.fukuyama-u.ac.jp/old/kenkyu/ozeki/member/h17/pdf/ota.pdf
ここの付録のプログラムを使いたいのですが、
gccでエラーが出てしまいました。
このエラーを解決したいのですが、みなさんにお答え頂くには、何を晒したらよいでしょうか。

ちなみに環境はXP sp3のcygwin 1.72です。
804デフォルトの名無しさん:2009/02/02(月) 10:07:02
>>803
C++でコンパイルする
ppm.h および関連ライブラリを探す
805デフォルトの名無しさん:2009/02/02(月) 13:38:24
>>803
エラーが出たならエラーメッセージを晒すのは基本。
今回の場合はソースをアップローダに上げるのは必須ではないが、
もし資料をそのままコピーしていないのなら上げた方が話が早い。

まぁ、今回は恐らく>804だろうな。
806デフォルトの名無しさん:2009/02/02(月) 23:59:46
質問させていただきます。
プログラムの中で
class Object
があった場合(メンバ関数に void func() を持つとします)
Objectクラスを使うときに

Object obj;
obj.func();

とするのと
Object* obj;
obj = new Object();
obj->func();
とするのとの違いは何でしょうか?
Object* で定義した場合はポインタなのでまだ実体が作られていないから
obj = new Object();
が必要なのがわかりますが、違いが今ひとつわからず質問させていただきました。
807デフォルトの名無しさん:2009/02/03(火) 00:01:12
mallocの必要性からやってきなさい。
808デフォルトの名無しさん:2009/02/03(火) 00:02:25
Object objは一時オブジェクトだから、定義したスコープから抜けると消える。
newしたのはfreeするまで残る。
809デフォルトの名無しさん:2009/02/03(火) 00:08:45
>>807,808 さん
返信ありがとうございます。
つまり特定のスコープの中だけで使う場合には new する必要はないということですね。
ありがとうございました。
810デフォルトの名無しさん:2009/02/03(火) 00:08:49
>>808
一時オブジェクトじゃなくて自動変数な
811デフォルトの名無しさん:2009/02/03(火) 01:40:53
>>808
free じゃなくて delete な
812デフォルトの名無しさん:2009/02/03(火) 10:13:15
下記のソースで i = 0;の行を削除すると100が表示されず
-8589....
といったようなでたらめな数値になります。
何か値を代入しないと変数の領域が取られないのでしょうか?
環境はVC++6.0です。

#include <stdio.h>

int main() {

int i;
int *p;

i = 0; /* この行を取ると結果が100にならない */

p = &i;

__asm {
mov ebx, p
mov [ebx], 100
}

printf("%d\n", i);

return 0;
}
813デフォルトの名無しさん:2009/02/03(火) 10:18:03
>>812
アセンブリ出力を読め。納得したら、最適化オプションを変更しろ。
814デフォルトの名無しさん:2009/02/03(火) 10:18:44
>>812
コンパイラの生成したアセンブリリストを比べるんだ。
「リストファイルの生成」とかそんなコンパイルオプションでいけるはず。
815デフォルトの名無しさん:2009/02/03(火) 10:21:58
アセンブリ出力というのはどこにあるのでしょう?
816デフォルトの名無しさん:2009/02/03(火) 10:26:07
何この間抜け。
817デフォルトの名無しさん:2009/02/03(火) 10:27:13
そもそもデバッグビルドなんですけど最適化とか
されちゃうんでしょうか?
818デフォルトの名無しさん:2009/02/03(火) 10:31:14
なんか /FAっていうオプションつけたら出ました。
819デフォルトの名無しさん:2009/02/03(火) 10:47:07
アセンブリを比較してみたんだけど
; Line 8
mov DWORD PTR _i$[ebp], 0
しか違わないです。なぜだー
820デフォルトの名無しさん:2009/02/03(火) 10:51:10
VC のインラインアセンブラって自動でレジスタ保存してくれる・・・んだよな?
821デフォルトの名無しさん:2009/02/03(火) 11:10:51
ごめんなさい。アセンブリが間違ってました。
下記のようにしたら100が出ました。
__asm {
mov ebx, p
mov DWORD PTR [ebx], 100
}
822デフォルトの名無しさん:2009/02/03(火) 20:31:59
int* a;
int *a;

どっちのほうが見やすいですか?
823デフォルトの名無しさん:2009/02/03(火) 20:34:35
コーディングスタイルにこだわるスレ
http://pc11.2ch.net/test/read.cgi/tech/1193554741/

こちらで聞いてみては?
824デフォルトの名無しさん:2009/02/03(火) 20:34:42
>>822
int *a; の方が好き
825デフォルトの名無しさん:2009/02/03(火) 20:37:02
Cではint *a;で、C++ではint* a;と書いている。
826デフォルトの名無しさん:2009/02/03(火) 20:53:28
>>822
その違いで ポインタの複数宣言を分けるべきかどうか悩んだことがある。
827デフォルトの名無しさん:2009/02/03(火) 21:01:02
レスありがとうです

int *aにします
828デフォルトの名無しさん:2009/02/03(火) 22:20:24
ポインタは int *a; なのに
参照は int& a = b; な俺
829デフォルトの名無しさん:2009/02/03(火) 22:22:50
俺も俺もw
830デフォルトの名無しさん:2009/02/03(火) 23:01:27
俺はint* a;派
831デフォルトの名無しさん:2009/02/03(火) 23:07:57
俺はカンペキにint *a;派だなぁ。
キャストも(int *)pって1マス開けちゃう。
もう癖だな。
832デフォルトの名無しさん:2009/02/03(火) 23:14:34
int* a;派だな。
int* a, b;でaもbもポインタになる言語出身なので。
とはいっても普段は複数行に分けて書いてるんだけどね。
833デフォルトの名無しさん:2009/02/03(火) 23:16:36
char* func( int num ){
static char *p =NULL;
static const char *pp = "ok";
if( num == 0 ){
p = "ng";
}
else{
p = pp;
}
return p;
}
怪しいコードなのですが、
"ng"と"ok"のアドレスはいつ無効になるのでしょうか?
両方とも関数を出ると無効になるのでしょうか。


834デフォルトの名無しさん:2009/02/03(火) 23:16:46
>>832
そのこころは?
835デフォルトの名無しさん:2009/02/03(火) 23:19:41
>>833
関数を出てもずっと有効
836デフォルトの名無しさん:2009/02/03(火) 23:21:09
データセグメントに置かれるから、"ng""ok"は関数を出ても残る。
なのでpを返しても大丈夫。
837デフォルトの名無しさん:2009/02/03(火) 23:28:40
>>834
どっちの言語でも問題が起きないからじゃないかな
838デフォルトの名無しさん:2009/02/04(水) 00:06:28
int *a; って書いてる人は
ポインタへの参照は int *&a; とかって書いてるのかな。
839デフォルトの名無しさん:2009/02/04(水) 00:07:57
ポインタの参照なんて書く機会がない。
840833:2009/02/04(水) 00:13:06
>> 835 836
ありがとうございます。
下記の場合
char *test2( )
{
//static char *p = "a....."; //←aを*1024*1024*50
char *p = "a....."; //←aを*1024*1024*50//変数pはなくなるが、参照していた所はのこるのでOK
return p;
}
ってやったらアプリを消すまで、そのメモリは残るということですね。

char *test3( char *temp )
{
char a[256];
strcpy( a , temp )
return a;//ちなみにこれはだめ
}
841デフォルトの名無しさん:2009/02/04(水) 00:15:06
ですよ
842デフォルトの名無しさん:2009/02/04(水) 00:25:39
>>839
あるよ
843デフォルトの名無しさん:2009/02/04(水) 00:47:21
>>838
ただの参照をint &r;のように書く人も周りにいる。
844デフォルトの名無しさん:2009/02/04(水) 00:49:24
int *a; は分かる
int **a; は分かる
int &a; もまあ分かる
int *&a; は少し分かり辛い
int **&a; は少し分かり辛い
845デフォルトの名無しさん:2009/02/04(水) 00:59:03
int *a;だな。言語仕様上可能な変数の複数宣言を、表記法で間違えさせる時点で、int* a;は誤っている。
これは間違いなくバカの仕業だ。
846デフォルトの名無しさん:2009/02/04(水) 00:59:40
複数宣言なんてまずしないし
847デフォルトの名無しさん:2009/02/04(水) 01:15:59
複数宣言はやめてコメントしっかり入れようぜ
848デフォルトの名無しさん:2009/02/04(水) 01:30:51
変なこだわり持ってると const 入れる時に挙動が変わって 面倒っしょ?
849デフォルトの名無しさん:2009/02/04(水) 01:33:50
俺は複数宣言は滅多にしないけど
それでも int *& i; なんて変数を使う回数より複数宣言する回数のほうがずっと多いな。
850デフォルトの名無しさん:2009/02/04(水) 01:34:55
あ、メンバは複数にはしないよ。
ただ、メンバに *& なんて、一度も使ったことないけどね。
851デフォルトの名無しさん:2009/02/04(水) 01:39:08
よく考えたら
for (XXX::iterator it = x.begin(), end = x.end(); it != end; ++it)
なんてのは最近結構使ってるな。

この手のはfor_eachとかにするのが読み手にも実行効率的にも良いのかもしれないが
現状、ローカルで宣言した関数オブジェクトが使えないのがすごく嫌なんだよな。
852デフォルトの名無しさん:2009/02/04(水) 01:44:25
メンバじゃなかろうが複数宣言なんて稀だな。
double x, y, z; (座標)みたいなのならなくはないが。
853デフォルトの名無しさん:2009/02/04(水) 01:51:09
俺は絶対にやらない主義
初期化も必ずするしなぁ
854デフォルトの名無しさん:2009/02/04(水) 01:53:53
いや、複数同時と初期化の有無は別よ。
>851だって、複数だけど両方初期化してるでしょ。
855デフォルトの名無しさん:2009/02/04(水) 02:13:52
>>851
ああ、そう書けるんだ。
気づかなかった。
856デフォルトの名無しさん:2009/02/04(水) 02:15:31
>>845
君他の言語やってる?
857デフォルトの名無しさん:2009/02/04(水) 02:36:48
>>854
話混ぜたらダメだろ
858デフォルトの名無しさん:2009/02/04(水) 02:37:09
(double,int,string( foo::(x,y,z) = (0.5,1,"abc")
みたいなのは欲しい
fooで組全体として参照、foo::xとスコープ付きでアクセスできて
さらに多重代入、初期化も可能でさらに最適化で単品と同じになる
でこれをforeach内で使うの
859デフォルトの名無しさん:2009/02/04(水) 02:41:47
括弧開きと閉じが対応してないからわかりにくい
860デフォルトの名無しさん:2009/02/04(水) 02:52:51
boostにそんなのなかったっけ?
861デフォルトの名無しさん:2009/02/04(水) 02:53:35
もちろん、言ってる内容全部満たしてるわきゃないが
862デフォルトの名無しさん:2009/02/04(水) 03:09:13
>>857
バカかおまえ
話混ぜてんのはその前の奴だろ
863デフォルトの名無しさん:2009/02/04(水) 07:16:20
1行で複数宣言と初期化とか、読みにくいって言うレベルじゃないんだが
864デフォルトの名無しさん:2009/02/04(水) 07:59:31
慣れの問題
LL言語じゃ普通に使われてるし、多値って概念で関数型言語では割と古くからあるもの
RAIIとかの方が遥かに複雑
865デフォルトの名無しさん:2009/02/04(水) 09:21:24
ポインタ操作を無理矢理に一行の式にまとめた C のコードに比べれば
おこちゃま
866デフォルトの名無しさん:2009/02/04(水) 11:34:42
int *a, *b;
と書くくらいなら、
int* a;
int* b;
と書く。
867デフォルトの名無しさん:2009/02/04(水) 11:40:03
俺は、場合によっては前者を書く「こともある」な。

まぁ、少なくともこうは書かないw
int* a, *b;
868デフォルトの名無しさん:2009/02/04(水) 14:44:08
どうでもいい
869デフォルトの名無しさん:2009/02/04(水) 14:46:43
870デフォルトの名無しさん:2009/02/04(水) 15:45:47
char hako[] = "aishite";

printf("%s", hako + 1);が`i`になるけど、&hako[0]と&hako[1]のアドレスを見ると
4bit?ずつ増えていますが、+1というのは自動的に宣言した型のサイズになるのでしょうか?
871デフォルトの名無しさん :2009/02/04(水) 15:50:16
>>870
そうです
872デフォルトの名無しさん:2009/02/04(水) 15:57:37
>>871
ありがとうございます
決まりごとのアドレスが連続している意味がわかりました
873デフォルトの名無しさん:2009/02/04(水) 16:03:56
関係ないけど"ishite"になりそうな。
874デフォルトの名無しさん:2009/02/04(水) 16:08:15
8bitじゃね?
875デフォルトの名無しさん:2009/02/04(水) 16:08:17
おっと
sではなくcですね
876デフォルトの名無しさん:2009/02/04(水) 16:36:21
>>870
自動的に、ポイントしている型の分アドレスは増えるはずです。つまり、あなたは何か勘違いをしています。
hako + 1は、aの次のiを指している筈ですね。
877デフォルトの名無しさん:2009/02/04(水) 21:00:06
gamemain.h(14) : error C2143: 構文エラー : ';' が 'enum [tag]' の前にありません。
このエラーを治す方法が分かりません;; 
アドバイスください
1//==========================================
2// CGameMain・各種クラスの定義
// 定義されているクラス
// CModel, CCollision
//==========================================

#ifndef _GameMain_h_
#define _GameMain_h_

//==========================================
// キーボード入力を受け取る変数
//==========================================
enum DIRECTION
14{
FOR, // 前に移動
BACK, // 後ろに移動
RIGHT, // 右に移動
LEFT, // 左に移動
STOP
};
878デフォルトの名無しさん:2009/02/04(水) 21:09:07
そのちょいちょい混ざる数字は行数をやさしく書いてくれたのか、それとも元のソースに含まれているのか
879877:2009/02/04(水) 21:10:32
行数を分かりやすいように書きました
880デフォルトの名無しさん:2009/02/04(水) 21:11:55
>>879
14行目じゃなくて、1行目と二行目も?
881デフォルトの名無しさん:2009/02/04(水) 21:12:56
>>880
そうです 元のソースです ↓

//==========================================
// CGameMain・各種クラスの定義
// 定義されているクラス
// CModel, CCollision
//==========================================

#ifndef _GameMain_h_
#define _GameMain_h_

//==========================================
// キーボード入力を受け取る変数
//==========================================
enum DIRECTION
{
FOR, // 前に移動
BACK, // 後ろに移動
RIGHT, // 右に移動
LEFT, // 左に移動
STOP
};
882デフォルトの名無しさん:2009/02/04(水) 21:14:50
#ifndefはどこで閉じてるの?
883デフォルトの名無しさん:2009/02/04(水) 21:21:05
GameMain.h
の一番最後の行です
884デフォルトの名無しさん:2009/02/04(水) 21:25:17
int* a, * b;
885デフォルトの名無しさん:2009/02/04(水) 21:27:46
そんじゃあGameMain.hの直前にインクルードしているヘッダになんか問題があるのかな。
問題とは全然関係ないけどFOR→FOREの方がいいと思う
886デフォルトの名無しさん:2009/02/04(水) 21:28:41
FORE
BACK
RGHT
LEFT
STOP
887デフォルトの名無しさん:2009/02/04(水) 21:28:49
>> 885

ありがとうございます
見直してみます
888デフォルトの名無しさん:2009/02/04(水) 21:32:18
>>877
gamemain.hの直前にincludeしているヘッダの一番最後のセミコロンが無いのでは?
889デフォルトの名無しさん:2009/02/04(水) 21:34:13
ヘッダなんて、所詮Cファイル内に展開してコンパイルしてるだけだからな
単体だけじゃ分からないかも
890デフォルトの名無しさん:2009/02/04(水) 21:44:42
>>888

そのようでした・・・・

#ifndef _Frame_cpp_
extern CFrame *_Frame;
extern HINSTANCE _hInstance;
extern CGameMain *_gamemain;
extern CGameTitle *_gametitle
#endif

#endif

セミコロンがなかったです。

ありがとうございました!
891デフォルトの名無しさん:2009/02/04(水) 23:01:49
void Foo::reset()
{
this->~Foo();
new (const_cast<Foo*>(this)) Foo();
}

これは偶然動いているだけですか?
892デフォルトの名無しさん:2009/02/04(水) 23:03:38
switch(m_sequence) {
case TITLE :
if(_gametitle) {
hr = _gametitle->Idle(m_device);
m_sequence = _gametitle->GetSeq();

}
break;
case GAME :
if(_gamemain) {
hr = _gamemain->Idle(m_device);
m_sequence = _gamemain->GetSeq();
}
default:
break;
}

キーを押してタイトルをゲームを切り替えるプログラムを作りました
m_sequence = _gametitle->GetSeq();

これでタイトルかゲームかの変数を取得して切り替えています
切り替えに成功するのですが一度切り替えるとボタンを押さないでずっと切り替えが続いてしまいます

対処方法教えていただけませんか;;
GetSeq()はgametitleクラスの入力処理で特定のボタンが押された瞬間にGAMEを返します
ボタンが押されなければTITLEを返します
893デフォルトの名無しさん:2009/02/04(水) 23:05:40
>>891
完全に合法
でも危ないからオススメしない
894デフォルトの名無しさん:2009/02/04(水) 23:08:11
基本クラスを継承クラスにキャストはできるんですが、
(継承クラス)基本クラス
継承クラスを基本クラスにキャストするにはどうすればいいんですか?
(基本クラス)継承クラス
インテリセンスが機能しないんです
895デフォルトの名無しさん:2009/02/04(水) 23:11:21
>>894
dynamic_cast
896デフォルトの名無しさん:2009/02/04(水) 23:11:37
ポインタなら、動こうか壊れようが可能だろ?
インスタンスなら、子クラスレベルにはキャスト無理
897デフォルトの名無しさん:2009/02/04(水) 23:20:08
>>893
ありがとうございます
まさか>>891が合法だとは思いませんでした
898892:2009/02/04(水) 23:21:07
ソースを上げるのでよかったらアドバイスください
http://www7.uploader.jp/dl/inoguma/inoguma_uljp00003.zip.html

Frame.cpp Idel関数 (入れ替え処理)

Titlle Main に入力処理が書いてあります

宜しくお願いします
899デフォルトの名無しさん:2009/02/04(水) 23:37:08
>>898
GetAsyncKeyStateの使い方じゃない?
ttp://homepage2.nifty.com/rleez/program_old/winapi/keystate.html
900デフォルトの名無しさん:2009/02/04(水) 23:48:10
昔適当に書いたファイルを分割するコンソールプログラムなのですが、処理速度が非常に遅いです。
恐らく、ソースが汚いせいもあるかと思うのですが、どうすれば高速に動作するようになるのでしょうか?
VC++2008EXPRESS EDITIONを使ってます。

↓ソース
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8818.cpp

ファイルを高速に扱える関数とかライブラリとか用意されてないのでしょうか?
901デフォルトの名無しさん:2009/02/05(木) 00:18:13
>>900
どれだけのサイズを何分割して何秒かかったのか示そう。
もしかしたらそれは遅くないかもしれない。
902デフォルトの名無しさん:2009/02/05(木) 00:19:55
>>900
長いんでよく見てないけど。
ReadFile/WriteFileじかに使ってるが読み書きの単位はどのくらい?
IOバッファが小さいとか無いかな?
903デフォルトの名無しさん:2009/02/05(木) 00:42:21
>>901さん、>>902さんレスありがとうございます。

977008640バイトのファイルを250MBづつ4つのファイルに分割するのに約2分半かかります。

一度に確保するメモリー領域は50MB程度でループ内部で確保→解放を繰り返してます。
非同期IOにしてみたこともありますが、処理速度は同じぐらいか、かえって遅くなったように思います。
正直、手詰まり感が否めません orz
904デフォルトの名無しさん:2009/02/05(木) 00:50:23
>>903
プログラム的に改善点はあるものの、ネックはHDDのアクセス速度だろう。
約900MBをreadしてwriteするのに150秒なので、転送速度は平均で約12MB/秒。
同一ドライブ間での転送なら、こんなものかもしれない。
別ドライブにwriteしたり、HDDがIDEならSATAにしたりすれば早くなるだろう。
もしメモリが少ない環境なら、バッファサイズを減らしたほうがいいだろう。
905デフォルトの名無しさん:2009/02/05(木) 01:14:11
>>903
これを動かすとどの程度時間がかかりますか?
動作としてはコマンドライン引数で与えられたファイルを 256MB 毎に hoge%04d.dat の名前で分割します
#include<stdio.h>
#include<stdlib.h>
#define BUFSIZE (1<<20) // 1MB
#define FILESIZE (1<<28) // 256MB
int main(int argc, char *argv[]){
FILE *fp_in, *fp_out;
char *filename_in="noname", filename_out[MAX_PATH], *buf;
long i, filesize, filesize_max=FILESIZE, readsize, writesize;
if(argc==2) filename_in=argv[1];
buf=malloc(BUFSIZE);
fp_in=fopen(filename_in, "rb");
if(fp_in==NULL) fprintf(stderr, "\nError : %s cannot open.\n", filename_in), exit(1);
for(i=1;;i++){
sprintf(filename_out, "hoge%04ld.dat", i);
fp_out=fopen(filename_out, "wb");
if(fp_out==NULL) fprintf(stderr, "\nError : %s cannot open.\n", filename_out), exit(2);
for(filesize=0,readsize=BUFSIZE;filesize<filesize_max;filesize+=readsize){
if(readsize>filesize_max-filesize) readsize=filesize_max-filesize;
writesize=fread(buf, 1, readsize, fp_in);
if(writesize<=0) break;
fwrite(buf, 1, writesize, fp_out);
}
fclose(fp_out);
if(writesize<=0) break;
}
fclose(fp_in);
return 0;
}
906905:2009/02/05(木) 01:16:21
>>905 のコードでは問題ないだろうけど
free 忘れてる orz
907デフォルトの名無しさん:2009/02/05(木) 01:17:03
同一ドライブ間でのREAD/WRITEです。
色々調べてみましたが、CFileクラスを用いた読み書きとかメモリーマップドファイルとか意味がわかりません。
ファイル破談+とかいうソフトを使ってみましたが、同程度の速度でした。
こんなもんかもしれませんねぇ。
>>904さんがおっしゃるように最終的にはHDDのアクセス速度がボトルネックになるのでしょうね。

初心者なりにですがもう少し頑張ってみます。レスくださった方々、ありがとうございました。
908デフォルトの名無しさん:2009/02/05(木) 01:21:10
プログラムでのコピーの場合、エクスプローラでのコピーの
2倍程度の時間で収まってれば合格なんじゃないの。
909デフォルトの名無しさん:2009/02/05(木) 01:30:33
>>903
非同期IOって何使った。
IO完了ポートは使った?
910デフォルトの名無しさん:2009/02/05(木) 01:31:10
>>905
2分50秒程かかりました。
これって何をテストするプログラムなんでしょうか?
911デフォルトの名無しさん:2009/02/05(木) 01:34:13
>>910
PATA 2.5" HDD で 700MB のファイルが一分程度だったので
ディスクIOが本当にネックになってるのかな?と確認して欲しかった次第です
912デフォルトの名無しさん:2009/02/05(木) 02:03:54
>>905
900MBのファイルで40秒弱だったよ。
HDDは今話題のSeagate1T(ST31000333AS)
913デフォルトの名無しさん:2009/02/05(木) 02:11:30
あるぇ?

いまプログラムをコンパイル&実行し直したら、30秒程早くなった。
ソースは手直ししてないのに。
その時のHDDの使用状況にもよるんだろうけど、こんなに差がでるもんか?
ますます訳がわからん。
914912:2009/02/05(木) 02:47:48
同じファイルでやったんじゃなくて?
ちなみに同じファイルの2回目は15秒強で終わったよ
915デフォルトの名無しさん:2009/02/05(木) 07:30:20
>>899レスありです
916デフォルトの名無しさん:2009/02/06(金) 02:54:07
TCHAR a[256];
これに””の空を設定するにはどう書けばいいんですか?
a = _T("");
とかだめなんですが
917デフォルトの名無しさん:2009/02/06(金) 03:07:26
TCHAR a[256] = {_T("")};
とか
_tcscpy_s(a,256,_T(""));
で。
918デフォルトの名無しさん:2009/02/06(金) 03:21:00
できました
どうもです。
919デフォルトの名無しさん:2009/02/06(金) 03:25:45
一度書いたプログラムは二度と書かないぐらいの意識でどんどんパッキングしていくのが普通なんでしょうか?
そんな徹底するようなものじゃないですか?
なんか自分しかわからないコードというか、一人一人が独自路線でいくのって空しくないですか?
920デフォルトの名無しさん:2009/02/06(金) 04:41:11
>>919
なるべく直さなくて済むように書くのがスタンダードなんじゃないの。
何れにしろ、初心者が心配することではないのでは?
921デフォルトの名無しさん:2009/02/06(金) 06:44:21
>>919
>一度書いたプログラムは二度と書かない
その方針は正しいから、それを目指すのはいいことだ。
空しいならオープンソースにすればいいんじゃないか。だけど、誰でも使えるライブラリを作るのは想像以上に難しい
だから自分の用途に応じた自分用のライブラリを作って二度書きを防ぐようにする。そしてそのライブラリは君の財産になる。
922デフォルトの名無しさん:2009/02/06(金) 07:17:46
後々微妙に共通化しづらいと分かる事もあるから
とりあえずコピペで作って後から共通化した方がいいこともある
923デフォルトの名無しさん:2009/02/06(金) 07:52:11
その理屈ならTipsとかをドキュメントで蓄積してるのって利口じゃないのかな
924デフォルトの名無しさん:2009/02/06(金) 08:53:41
記憶を頼りに全 grep 掛けるのが漢スペック。
925デフォルトの名無しさん:2009/02/06(金) 20:59:52
俺も良くそうするけど、上の奴が知識を共有できないからって怒るんだよw
あと、自分の手から離れたソースが見れないことがあるし
926デフォルトの名無しさん:2009/02/07(土) 15:13:05
LPTSTR string;

UINT code = (UINT)*string;

DWORD size = GetGlyphOutline(m_hdc, code, GGO_GRAY4_BITMAP, &GM, 0, NULL, &Mat);

このキャストは問題ないですか?
927デフォルトの名無しさん:2009/02/07(土) 15:15:15
LPTSTR、UINT、GetGlyphOutline()のそれぞれがどう宣言されている川からないから問題あるかどうか判断できない。
928デフォルトの名無しさん:2009/02/07(土) 15:18:35
Win32APIスレで。

多分 LPTSTR string = "abcdefg";
とかやるとわけのわからないことになりそう。
929デフォルトの名無しさん:2009/02/07(土) 15:22:25
>>927>>928

レスありがとうございます。
スレ違いでしたか、申し訳りません
930デフォルトの名無しさん:2009/02/07(土) 16:39:45
>>926-928
ここは環境依存OKなスレだよ。Win32APIと言いさえすれば、だけどね。

どちらかというと、(UINT)*stringよりは、(TBYTE)*stringまたは(UINT)(TBYTE)*stringのほうがお勧め。
というのは、LPTSTRがchar*で、かつcharが符号付きのとき、\x80から\xFFな文字が符号拡張されてしまうのを防ぐため。
それには、一旦unsigned charでキャストすればいいんだけど、TCHARがwchar_tの場合を考慮しないといけない。
ゆえに、wchar_t/unsigned charで切り替わるTBYTE型でキャストするのがいいということになる。
931デフォルトの名無しさん:2009/02/07(土) 17:15:59
まぁ、変数名にstringなんて付けるのはやめとけw
暗黙的に予約語だから
932デフォルトの名無しさん:2009/02/07(土) 22:52:59
文字列を表示するクラスがあるとします
そのクラスは表示したい文字を数えてその分だけメモリを確保します

例えばメンバ関数で宣言したクラスをほしい分だけnewで取得したいのですが

privateで

CModel *m_model; と宣言して

コンストラクタで

m_model = NULL;

初期化する関数で
m_model = new CModel();

と言う感じにすることはできたのですが

ほしい分だけ確保する場合は
CModel *m_model[100];
と多めに宣言しておいて

コンストラクタで
forループで全部初期化

初期化する関数で表示したい文字分だけ数えてnewするやり方でいいのでしょうか?

他にいいやり方があったら教えてください

長文失礼しました 読みにくいと思いますがすいません
933デフォルトの名無しさん:2009/02/07(土) 23:03:20
整理して書くと
CMyClass() : m_model(NULL) {}
~CMyClass() {
if (m_model!=null) {
 delete m_model;
  m_model = NULL;
 }
}
void initialize() {
 m_model = new CModel();
}

これだけなら有りがちなクラスだと思うけど、配列にするのは微妙かな
固定長でいいならそれもあるけど、どういう風な用途かも知らないから、何とも言えないが
934デフォルトの名無しさん:2009/02/07(土) 23:26:47
>>933 レスありがとうございます

質問が分かりにくくてすいません

最初から100個の配列を確保するのはメモリに負担がかかると思うので

初期化する前に何個確保すればいいか計算します

7個確保すればいい場合は

for(int i = 0; i < 7; i++) {
m_model[i] = new CModel();
}

でいいと思うのですが

宣言するときはどうすればベストですか?

用途は表示したい文字の数だけプリミティブとテクスチャを作り表示するクラスです
935デフォルトの名無しさん:2009/02/07(土) 23:42:52
mapとか使えばよさそうな気が
936デフォルトの名無しさん:2009/02/07(土) 23:52:18
>>934
CModel* m_model[100];とかではだめか?
あるいは、std::vectorの利用も検討するといいと思う。
937デフォルトの名無しさん:2009/02/07(土) 23:57:50
>>935 >>936

レスありがとうございます

とりあえずは100個領域確保してやってみます

処理に支障が出たらstd::vectorやmap?に変更してみます
938デフォルトの名無しさん:2009/02/07(土) 23:58:45
CModel **m_model;
でいいんじゃね?

>>935-936の通りSTLのコンテナの方がいいと思うけど

std::vector< CModel > v;
for( int i = 0; i < 7; ++i )
{
CModel * temp = new CModel();
temp->init();
v.push_back( *temp );
}
vの宣言のスコープを抜けたら自動的にデストラクタが呼ばれる
939デフォルトの名無しさん:2009/02/07(土) 23:58:48
ポインタの配列を動的に確保する。
std::vectorを使う。
boost::ptr_vectorを使う。
940デフォルトの名無しさん:2009/02/08(日) 00:03:25
そういやクラス名がモデルか
DBみたいなクラスでも作るのか?
941デフォルトの名無しさん:2009/02/08(日) 00:19:12
>>938 >>939 なるほど!その方法がありましたか
>>940 クラス名は適当につけただけです
ゲームに使おうと思っているクラスで
指定した文字列を1文字づつテクスチャに書き込んで板ポリで表示するクラスです
942デフォルトの名無しさん:2009/02/08(日) 00:27:46
>>938
このコードメモリリークしない?
for文の中でちゃんとdeleteしないと
943デフォルトの名無しさん:2009/02/08(日) 00:34:38
確実にリークするなw
944デフォルトの名無しさん:2009/02/08(日) 07:45:50
ループの1段階展開とか2段階展開ってどうやるんですか?
コードを見比べても何をしてるのかさっぱりわからないんですが
945デフォルトの名無しさん:2009/02/08(日) 09:05:13
例えばどんなコード?
946デフォルトの名無しさん:2009/02/08(日) 09:41:40
アンロールのことかな?
947デフォルトの名無しさん:2009/02/08(日) 10:02:29
>>944
その見比べていると言うソースを提示してみてくれ。
948デフォルトの名無しさん:2009/02/08(日) 10:06:35
再帰のことか?
949デフォルトの名無しさん:2009/02/08(日) 10:21:05
>>944

for (i=0; i< end; ++i){
 s[i] = f[i+1];
}

 ↓

i = 4;
if (end > 4)
 for (i = 0; i < end; i += 4){
  s[i]  = f[i+1];
  s[i+1] = f[i+2];
  s[i+2] = f[i+3];
  s[i+3] = f[i+4];
 }
for (i -= 4 ; i < end; ++i)
 s[i] = f[i+1];
950デフォルトの名無しさん:2009/02/08(日) 10:43:52
>>949
ちょっとやり方がキモイけど、endに適当な数字を入れて自分で処理を手書きしてみな
951デフォルトの名無しさん:2009/02/08(日) 10:52:27
endが5のときの動きをトレースすれば一目瞭然だな。

つーか、ループアンロールなんかコンパイラに任せておけばいいじゃん。
952デフォルトの名無しさん:2009/02/08(日) 11:03:26
どんな end が来るかはコンパイラには 100 か 10 かも判らん場合が多いから
展開前をコメントアウトし、ばらしたコードで記述する意味はある。
953デフォルトの名無しさん:2009/02/08(日) 11:33:14
endが4の倍数なら後段のforも要らないしな
そこまでカツカツの速度が要る場面も珍しいだろうけど
954デフォルトの名無しさん:2009/02/08(日) 11:51:07
ループの中に if文が挟まって毎回評価してるのを
大加算ループの中でswitch に置き換えるとか色々。
955デフォルトの名無しさん:2009/02/08(日) 14:17:18
>>949
展開ってそういうことか
ありがとう。
それは4段階展開ってことだよね
確かに読みにくくなるね・・・
956デフォルトの名無しさん:2009/02/08(日) 14:20:12
アンロールするかどうかのコンパイルオプションがあることもあるよ
957デフォルトの名無しさん:2009/02/08(日) 15:09:17
手作業でアンロールを始めるとvtuneが欲しくなるな。
958デフォルトの名無しさん:2009/02/08(日) 15:53:05
VSにはアンロールなんて無くね?
959デフォルトの名無しさん:2009/02/08(日) 16:05:35
iccなら>952のendをヒントとしてコンパイラに与えることもできる。
960デフォルトの名無しさん:2009/02/08(日) 16:18:10
アンロールってはじめてしった
961デフォルトの名無しさん:2009/02/08(日) 16:23:52
>>949
 for (i = 0; i < end + 4 ; i += 4){
ですな・・
962デフォルトの名無しさん:2009/02/08(日) 16:26:51
それじゃ台無しだ。
963デフォルトの名無しさん:2009/02/08(日) 16:30:00
>>961
 for (i = 0; i < end − 4 ; i += 4){
にはw
964デフォルトの名無しさん:2009/02/08(日) 16:54:39
whileの展開はどうなるの?
でも制御文事態のコストがforより軽いからやる意味ないのかな?
965デフォルトの名無しさん:2009/02/08(日) 19:01:04
whileでも同じ
966デフォルトの名無しさん:2009/02/08(日) 19:03:42
展開可能な文を while に詰め込むのは クソプログラム だと思うがね。
967デフォルトの名無しさん:2009/02/08(日) 20:20:39
アンロールもいいけどチョコロールもね
968デフォルトの名無しさん:2009/02/08(日) 20:50:10
>>966
???
969デフォルトの名無しさん:2009/02/08(日) 21:24:19
>>968

do と while どういう使い分けしてるの?
970デフォルトの名無しさん:2009/02/08(日) 22:07:06
>>969
???
971デフォルトの名無しさん:2009/02/08(日) 23:21:09
数値を変更もしないし、わかりやすく別名を付ける場合は
const int MAXDATA = 123;
#define MAXDATA 123
この2つはどっちが正しいんでしょうか?
なにか決定的な違いはありますか?どうでもいいですか?
972デフォルトの名無しさん:2009/02/08(日) 23:23:15
Cでは後者。

C++ではどちらも正しいが、前者が望ましい。
名前空間やスコープを無視するマクロはできるだけ無い方が良い。
973デフォルトの名無しさん:2009/02/09(月) 00:44:57
どうしても、処理が遅い場合、最後の手段はアセンブラを書きなおすっていうのをやってみたいんですが、
アセンブラの命令一覧はなにを参考にすればいいんですか?どこにあるんでしょうか?
CPUによってかわるんですか?
974デフォルトの名無しさん:2009/02/09(月) 00:47:56
>>973
命令一覧みたからって即できるようなもんじゃないとだけ言っておく
975デフォルトの名無しさん:2009/02/09(月) 00:59:41
アセンブラはマイコンで慣れてるのでたぶんできると思います。
物によって命令が違うのでWindowsで使える?VSで使える命令を知りたいんです
976デフォルトの名無しさん:2009/02/09(月) 01:08:42
>>975
ほぼ確実に遅くなるからやめておいたほうがいい。
パイプラインを阻害しないような命令配置とか人間が考えるよりコンパイラにやらせたほうがマシ。
SSEとか使うなら今のところコンパイラまかせよりは人間のほうがいいかも知れんけど。
977デフォルトの名無しさん:2009/02/09(月) 01:09:02
Windowsと言えば、x86だからIntelのウェブサイトにPDFが転がっている。まあAMDにもあるだろうけど。
http://www.intel.co.jp/jp/download/

この中でも、命令が載っているのは
32ビット(と16ビット)はIA-32 インテル
アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル。
上・中A・中B・下があって中2つが命令一覧。

大体同じだけど、64ビットがインテル エクステンデッド・メモリー 64
テクノロジー・ソフトウェア・デベロッパーズ・ガイドの1巻・2巻。

適当にググって予備知識を付けてから見たほうがいい気もするけど。
978デフォルトの名無しさん:2009/02/09(月) 01:12:49
>>973
とりあえずこのへん?
http://www.icnet.ne.jp/~nsystem/simd_tobira/index.html

独学でなんとかなんのかぁ?
MMXですら俺は誰かに教わらないと無理だった
しかも全然速くなんねーw
979デフォルトの名無しさん:2009/02/09(月) 01:14:09
命令だけ見てもダメじゃん。
Cの変数とやりとりする規約をコンパイラのマニュアルから探さないと。
980デフォルトの名無しさん:2009/02/09(月) 01:18:59
>>979
そんなのサンプルみて体で感じ取るぐらいじゃないと駄目
981デフォルトの名無しさん:2009/02/09(月) 01:25:08
if( a == b && a == c )
これは問題ないですか?
if( (a == b) && (a == c) )
こう書かないと結果がおかしくなる場合ってあるんですか?
あと、&&と書きさえすればショートサーキットになるんでしょうか?
コンパイラによって変わってきちゃいますか?VSなんですが
982デフォルトの名無しさん:2009/02/09(月) 01:27:49
インテルで調べればよかったんですね。
Windowsはハードの互換性がメリットだと思ったので
仮想アセンブラのようなものでCPUを統一しているのかと思いました。
ありがとうございました。
983デフォルトの名無しさん:2009/02/09(月) 01:29:16
>>982
> 仮想アセンブラのようなものでCPUを統一
うまいなあ。それは.NET Frameworkというやつだ。
984デフォルトの名無しさん:2009/02/09(月) 01:29:40
規約や引数その他はコンパイラにアセンブラの出力をさせりゃそれで充分。
問題は、
玄人のアセンブラ>>コンパイラの最適化>>>>素人のアセンブラ
なことだ。

確かIntelのpdf群の中に最適化マニュアルもあっただろ。
どんな命令がストールを起こすとかマイクロコードだから遅いとか
互換性を維持しながら最大限速度を取るにはとか、そんなのが載ってるはず。たぶん。

ただね、SIMDのような特殊な命令を利用して特定部分を、というのでない限り
普通は「分岐予測ミス」「メモリアクセス」によって、CPU時間のかなりの部分を食われるのよ。
Pen4とかと比べれば、最近のはそれでもマシになったけど、おそらく半分程度は浪費されるはず。
だから、いかに分岐を減らしてキャッシュミスを無くすか
そういうのをC/C++のレベルで考えながらコードを書いたほうが意味があったりするわけよ。
985デフォルトの名無しさん:2009/02/09(月) 01:45:31
ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、
玄人ががんばれば勝てるものなのか。
986デフォルトの名無しさん:2009/02/09(月) 02:05:11
>>985
コンパイラに勝つには、コンパイラの使わないSIMD命令を使い倒さないとだめだな。
でも、ほどほどの速さで良ければ、アセンブリ言語を使わなくても
コンパイラ組込関数を使えばいいという状況になりつつある。
987デフォルトの名無しさん:2009/02/09(月) 04:04:01
マルチスレッドで変数を同時にアクセスするのが危険な気がするので確実に安全をつくりたいんですが
ここからここまでの処理はこのスレッドに変数アクセス優先権をあたえて、
他のスレッドがアクセスしに来たらそのスレッドは変数を使い終わるまでそこでストップ
というような処理はできるんでしょうか?
988デフォルトの名無しさん:2009/02/09(月) 04:05:58
できるよ。一度に、あるコードに入れる回数を制限できる
989デフォルトの名無しさん:2009/02/09(月) 04:21:10
http://ameblo.jp/cpp-prg/

ここのミューテックスにサンプルのってる
990デフォルトの名無しさん:2009/02/09(月) 06:00:00
難し・・・がんばる
ありがとう!
991デフォルトの名無しさん:2009/02/09(月) 07:02:28
>>981
前者で全く問題ない
992デフォルトの名無しさん:2009/02/09(月) 07:12:43
マルチスレッドで変数のアクセスって
書き換えがメインスレッドだけでサブスレッドは
読み込みだけだったら問題ないですか?
993デフォルトの名無しさん:2009/02/09(月) 07:25:55
中途半端な状態ってのがないならそれでいいけど、
volatile はつけとけよ。
994デフォルトの名無しさん :2009/02/09(月) 09:06:55
まるで初心者だが、borlandC++5.5を使ってて、
Windows関数をつかって軽いアプリケーションを作りたいのだが
win関数を使うとコンパイルでエラーが出てしまう・・・
"外部シンボル 'WinMain' が未解決"
これはどういうことなのでしょうか・・・?おしえてくだしあ><
995デフォルトの名無しさん:2009/02/09(月) 09:11:03
"外部シンボル 'WinMain' が未解決"
でぐぐれ
996デフォルトの名無しさん:2009/02/09(月) 09:11:16
-W をつける。
997デフォルトの名無しさん:2009/02/09(月) 11:25:14
>>985
> ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、
> 玄人ががんばれば勝てるものなのか。

勝てるけどコストが合わない事が多い。
998デフォルトの名無しさん:2009/02/09(月) 12:37:45
>>993
volatile じゃ解決しねーよ。同期オブジェクト使わないと。
999デフォルトの名無しさん:2009/02/09(月) 14:19:14
んなこたぁない状況による
1000デフォルトの名無しさん:2009/02/09(月) 14:34:16
どこくらいの移植性を考えるかで変わってくるな。
メモリモデルをx86系Windowsに限定するならセーフ。
C/C++の言語的にはアウト。
専門的な話をしたいならマルチスレッドスレに行ったほうがいい。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。