トップページ⇒tech
1001コメント303KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2009/01/09(金) 20:07:31
エスケープシーケンスや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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん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
};
※これはコンパイルエラーになります
0003デフォルトの名無しさん2009/01/09(金) 20:21:17
C++0x ではできるようになるんだった気がするが、今は無理。
初期化用の関数を作るといいよ。
0004デフォルトの名無しさん2009/01/09(金) 20:49:00
そのパターンだけだったらこれで行ける
hoge(int foo = rand(), int bar = 100 - foo) : m_foo(foo), m_bar(bar){}
0005デフォルトの名無しさん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
};
0006デフォルトの名無しさん2009/01/09(金) 20:58:21
まあ大体そうだな
わざわざinitをオーバーロードする必要はないと思うけど
0007デフォルトの名無しさん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.
000872009/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){}
};
0009デフォルトの名無しさん2009/01/09(金) 21:04:32
あれ?本当だそこでfoo見えてないのか
知らんかった
0010デフォルトの名無しさん2009/01/09(金) 21:10:54
引数はデフォルト引数にはできんぞ
0011デフォルトの名無しさん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) {} // このコンストラクタはどのように書けばよいですか?
};
0012デフォルトの名無しさん2009/01/09(金) 21:24:16
この場合は

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

でいいと思う。
0013デフォルトの名無しさん2009/01/09(金) 21:28:20
>>12
できました
ありがとうございます
0014デフォルトの名無しさん2009/01/09(金) 22:20:08
私にc++の極意を教えてください
0015デフォルトの名無しさん2009/01/09(金) 22:29:11
__stdcall
0016デフォルトの名無しさん2009/01/09(金) 22:32:26
おぉ
0017デフォルトの名無しさん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) )
これも同じですか?

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

>>35
std::vector< std::complex<double> > x(num);
0038362009/01/10(土) 02:43:37
num を変数にするっていうのは
後でサイズを変えたいと言う意味か!
0039デフォルトの名無しさん2009/01/10(土) 03:21:28
>>38
寝言は寝て言え。
0040デフォルトの名無しさん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;
}
0041デフォルトの名無しさん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行目の出力になる)
0042デフォルトの名無しさん2009/01/10(土) 10:10:45
釣られないぞ
0043デフォルトの名無しさん2009/01/10(土) 10:20:14
>>40
C99に対応したコンパイラならできるかもね
0044デフォルトの名無しさん2009/01/10(土) 10:23:57
>>43
C99 ならテンプレートが使える?!
0045デフォルトの名無しさん2009/01/10(土) 10:27:06
いやC99の仕様も取り込んだC++コンパイラ
0046デフォルトの名無しさん2009/01/10(土) 11:24:56
g++ならできるよ
0047デフォルトの名無しさん2009/01/10(土) 14:22:04
それ g++ の拡張機能だろw
0048デフォルトの名無しさん2009/01/10(土) 14:29:01
C++0xにC99の可変長配列入るんだっけ?
0049デフォルトの名無しさん2009/01/10(土) 14:30:31
入らないはず。
std::vector の方が色々出来て便利だし。
0050デフォルトの名無しさん2009/01/10(土) 14:35:53
sizeofがコンパイル時に決まらなくなるから
色んなテンプレートが破綻するので入れられない
0051デフォルトの名無しさん2009/01/10(土) 15:00:34
>>48
vectorみたいなコンテナクラスで生成時可変長の配列なら入るんじゃなかったかと。
0052デフォルトの名無しさん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>&)

というエラーになるのですが、
テンプレートで指定したクラスをコンストラクタの引数に
指定してはいけないのでしょうか?
0053522009/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;
}
0054デフォルトの名無しさん2009/01/10(土) 15:08:49
>>51
そうなの?
もうvector::resize()しなくていいの?
0055デフォルトの名無しさん2009/01/10(土) 15:15:43
>>52
VC++2008では通る
0056522009/01/10(土) 15:18:27
>>55
ありがとうございます。
g++ 4.2.4なんですが、コンパイラのせいですか orz

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

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

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

*.h部

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

*.cpp部

__declspec(dllexport)
void
debug_message(

)
{
0068デフォルトの名無しさん2009/01/11(日) 14:56:16
>>67
extern "C"
とか?
0069デフォルトの名無しさん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()を隠してしまうのですべきでは無いのでしょうか?
0070デフォルトの名無しさん2009/01/11(日) 15:10:20
#ifdef USE_TABLE
#define SIN sin_table
#else
#define SIN sin
#endif

みたいに別のものを使うべきだな。
0071692009/01/11(日) 15:13:43
>>70
なるほど。そう書くことにします。
ありがとうございました。
0072デフォルトの名無しさん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
}}
0073デフォルトの名無しさん2009/01/12(月) 13:37:51
PC shutdownすれば消えるよ
0074デフォルトの名無しさん2009/01/12(月) 14:11:35
初心者歓迎だったので失礼いたします。
Cを勉強しているんですが、ポインタと構造体が何を読んでも分からなくて
質問させてください。

http://codepad.org/rnSOFLEU

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

良ければどなたか教えていただけませんでしょうか・・・
0075デフォルトの名無しさん2009/01/12(月) 14:15:09
>>72
ソースはコンパイルできるように貼ってくれ。それだけ見ても、 head とか y とか data とか
わからんものが多すぎる。
0076デフォルトの名無しさん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;

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

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

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

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

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

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

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

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

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

>84さん
確実に動作補償されるコードをよろしければ教えていただけないでしょうか?
0087デフォルトの名無しさん2009/01/12(月) 15:11:29
>>85
宿題は宿題スレへ。他のスレにも同じようなコード貼ってる同じ穴の狢がいるようだから、
同病相哀れむなり何なり、好きにしてください。
0088デフォルトの名無しさん2009/01/12(月) 15:12:10
>>86
確実に動作「補償」されるようなコードはありません。
0089デフォルトの名無しさん2009/01/12(月) 15:13:04
union使えばいいんじゃないの?
0090デフォルトの名無しさん2009/01/12(月) 15:13:15
>>79
46行目が嘘付いてる。kだけインクリメントしておいて、sはそのままだ。
0091デフォルトの名無しさん2009/01/12(月) 15:16:11
>88
確かに!!
動作保証するコードのことでした^^;
0092デフォルトの名無しさん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]; //その場所に、配列をコピー
0093デフォルトの名無しさん2009/01/12(月) 15:21:42
>>87さん
聞きながらでも自分でどうにかしたかったので・・・

>>90さん
*s=k;
で*sのk番目って事じゃないのでしょうか・・・
何をやっても関数のAA[0]番目にmainのAA[1]が着てしまいます・・・
0094デフォルトの名無しさん2009/01/12(月) 15:25:06
>>93
s=F.AA; で、sはAA[0]をさしている。
*s=k; はAA[0]にkを代入する。
0095デフォルトの名無しさん2009/01/12(月) 15:31:20
>>94さん
では下の関数でs -> AA[0]で上でAA[0]に入れたところを指しているわけでは無いのですか?
mainでいれたAA[0]の値と下の関数で出てくるAA[0]の値が同じにならない原因が分からないのですが・・・
0096デフォルトの名無しさん2009/01/12(月) 15:33:43
さすがにいい加減うざいが・・・
*sっていうのは常にAA[0]と同じところを指している。
たぶんs[k]と書きたいのだと思われる。
0097デフォルトの名無しさん2009/01/12(月) 15:34:56
アドレス、データをダンプしながらやれば
いやでも解るようになるとおもうんだ
0098デフォルトの名無しさん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;で代入された値が入っている。
0099デフォルトの名無しさん2009/01/12(月) 15:37:46
マルチは放っておけばいいと思うんだ。
0100デフォルトの名無しさん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”になると思います.

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

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

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

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

後、色々な板で詳しく丁寧に教えてくださった皆様有難うございます。
それぞれの板でお礼したかったですけど、マルチになっちゃうみたいなんで
ここでお礼させてもらいます。
有難うございました。
0105デフォルトの名無しさん2009/01/12(月) 17:16:59
.ccpのインクルードヘッダーは宣言が書いてある.hだけにしたほうがいいんですか?
それともstdafx.hで統一して問題ないんですか?
0106デフォルトの名無しさん2009/01/12(月) 17:18:16
それは既にC++の話ではなくなってる
0107デフォルトの名無しさん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) で
参照されました。

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

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


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

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

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

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

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

みたいな感じで何とかするしかねぇんじゃねえの
0135デフォルトの名無しさん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でメモリを確保する場合はどうやればいいですか?
----------------------------------------------

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

ありがとうございます

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

探してみます〜
0139デフォルトの名無しさん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 のようなポインタ変数がほしいのだが無理なのか。ということです。

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

どなたかご教授お願いいたいます。
0140デフォルトの名無しさん2009/01/14(水) 21:31:30
菱形って言うより仮想継承のダウンキャストができないってだけだと思うけど
0141デフォルトの名無しさん2009/01/14(水) 21:39:27
>>139
dynamic_cast しる。
ただし、仮想関数が最低でも1つは必要。
0142デフォルトの名無しさん2009/01/14(水) 21:40:20
普通はデストラクタが仮想関数だから
大して気にする必要はないがね。
0143デフォルトの名無しさん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
}
}
01441432009/01/14(水) 21:46:54
>>143
今やってみたら,後ろの方は↓であっさりコンパイルできました.すみませんOTL
(*(void (*)(char*))0x80483d4)("call (*(void (*)(char*))0x80483d4)()")
0145デフォルトの名無しさん2009/01/14(水) 21:47:32
>>143
C の規格では、関数呼び出し演算子は以下の2通りの使い方が可能であると規定されている。

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

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

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

何か問題でもあるか?
0148デフォルトの名無しさん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) は違うというのは,全く無関係な世界の話し..ということでいいのですか?
0149デフォルトの名無しさん2009/01/14(水) 22:11:11
ばかなの
0150デフォルトの名無しさん2009/01/14(水) 22:13:00
関数ポインタはいくらデリファレンスしても関数ポインタのまま。
0151デフォルトの名無しさん2009/01/14(水) 22:16:36
func の型は void (char*) だな。(配列型へのキャストが無理なのと同じく、この型への直接的なキャストは無理だが)
typedef すると分かるが、
typedef void foo(char*); とした時、
foo* は関数ポインタになる。
だから、foo は関数を表す型である。
もし foo が関数ポインタ型なら、
foo* は関数ポインタへのポインタ型となるからね。

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

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

ということですね

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

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

(*(void (*)(char*))0x80483d4)() は関数型へのキャスト?
((void (*)(char*))0x80483d4)() は関数ポインタ型へのキャスト
0154デフォルトの名無しさん2009/01/14(水) 22:39:43
>>150 によると *p も関数ポインタ型のようだが。
0155デフォルトの名無しさん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 はやっぱり関数型じゃねえか。
0156デフォルトの名無しさん2009/01/14(水) 22:42:30
****p();
を試したらわかるんでないか
0157デフォルトの名無しさん2009/01/14(水) 22:43:27
関数型の値に * をつけると、
一旦関数ポインタ型に変換されてから
また * が作用して関数型に戻るんでないかい?
0158デフォルトの名無しさん2009/01/14(水) 23:11:45
以下の4つは全部同じ

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

うろ覚えだけど、

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

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

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

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

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

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

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

p = &abc[0];

と
p = abc;

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

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

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

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

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

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

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

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

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


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

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

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

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

あってるけど、分からなきゃ一度2進数に変えた方がいい
0182デフォルトの名無しさん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
0183デフォルトの名無しさん2009/01/15(木) 22:00:00
>>181 182

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

ありおwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0185デフォルトの名無しさん2009/01/15(木) 22:29:37
istreamから前方反復子って作れないんですか?
0186デフォルトの名無しさん2009/01/15(木) 22:48:32
istream_iterator
0187デフォルトの名無しさん2009/01/15(木) 22:51:11
<iterator> に std::istream_iterator ってのがある。
だがしかし・・・ ++ の仕様が期待通りではないかもしれない。( >> で読み出しているので)
もし期待通りのものでなかったなら、
簡単に作れるので自分で作ってみてもいいかと。
0188デフォルトの名無しさん2009/01/15(木) 22:53:54
それって入力イテレータじゃないの?
0189デフォルトの名無しさん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
0190デフォルトの名無しさん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 だと思ったのですが・・
0191デフォルトの名無しさん2009/01/15(木) 22:59:38
>>187
つistreambuf_iterator
0192デフォルトの名無しさん2009/01/15(木) 23:01:01
アルファベット順(というか文字コードの順)に並べて、nの次の文字がoだったから。
*pt1の段階で、*を剥がしまくってもはやnという文字そのものと化している。
0193デフォルトの名無しさん2009/01/15(木) 23:01:45
>>192

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

ありがとうございました

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

pointers<int> int_ptrs;

ということはできませんか?
0207デフォルトの名無しさん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
0208デフォルトの名無しさん2009/01/16(金) 07:33:43
>>206
無理
0209デフォルトの名無しさん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;
0210デフォルトの名無しさん2009/01/16(金) 08:31:07
>>205
×適応
○適用
0211デフォルトの名無しさん2009/01/16(金) 11:41:14
>>209
>>134
0212デフォルトの名無しさん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();
}
ってしたらこんぱいるできないんですがなんでですか?
0213デフォルトの名無しさん2009/01/16(金) 14:48:29
宣言にはセミコロン必要。
0214デフォルトの名無しさん2009/01/16(金) 15:04:49
>>212
オーバーライドされたから。
y.X::show();
0215デフォルトの名無しさん2009/01/16(金) 15:05:06
>>212
Y::show によって X::show が隠されるから。
両者は別物で、両方をまたがってオーバーロード解決はできない
0216デフォルトの名無しさん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;
0217デフォルトの名無しさん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関数の他に何か方法はありますか?

お願いします。
0218デフォルトの名無しさん2009/01/16(金) 16:25:14
>>217
1. それでもいいでしょう。
2. oofs_output << 0xFFFF;
3. if (!(iss >> std::hex >> i).eof()) { /* error handling */ }
0219デフォルトの名無しさん2009/01/16(金) 19:58:35
>>203
関数コールするたびに、引数の合計分と、関数を出たときに戻るアドレス分スタックが消費される。
0220デフォルトの名無しさん2009/01/16(金) 19:59:19
消費スタックサイズ量を保持する分もスタック使ったかも
0221デフォルトの名無しさん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];
  }
0222デフォルトの名無しさん2009/01/16(金) 20:24:38
write使え
0223デフォルトの名無しさん2009/01/16(金) 20:34:35
WindowsでVisual C++ 2005を使っています。

isgraphでsjisの2バイト文字も判定させるにはどうすればいいでしょうか。
他に有用なライブラリがあれば教えてください。
0224デフォルトの名無しさん2009/01/16(金) 20:48:17
>>222
char型にする必要はありますか、、
0225デフォルトの名無しさん2009/01/16(金) 20:55:40
>>223
_ismbb系
0226デフォルトの名無しさん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
02272172009/01/16(金) 21:00:43
>>222
こうですね、スマートにできました、ありがとうございました。
oofs_output.write( (char*)&var[i], sizeof(int)/2);
0228デフォルトの名無しさん2009/01/16(金) 21:05:43
printfで表示するとき
%3.1fだとすると

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

1.255とかだったら

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

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

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

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

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

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

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

これは初期化する際にfalseということですか?
0263デフォルトの名無しさん2009/01/17(土) 11:04:41
flag?
0264デフォルトの名無しさん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)の意味じゃね?
0265デフォルトの名無しさん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関数を予防とするとエラーになるのですが
0266デフォルトの名無しさん2009/01/17(土) 11:47:53
inline は内部リンケージ
02672622009/01/17(土) 11:50:10
レスありがとうです

フラグという意味ですかw
0268デフォルトの名無しさん2009/01/17(土) 11:51:27
このスレの最近の流れはすばらしいなぁ
Win32APIスレにみせてやりたいわっ
0269デフォルトの名無しさん2009/01/17(土) 11:57:00
>>266
なるほど、、staticと同じという感じですね。
つまり別のcppファイルのinline関数を呼ぶためには
ヘッダーの宣言部ですでにinline関数だけでも実装しておかなくてはならないということか
0270デフォルトの名無しさん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 );
0271デフォルトの名無しさん2009/01/17(土) 13:04:41
(char) へのキャストは別に要らないんじゃね?
規格的にはどうなんだろう。
%c は char -> int で変換された(可変個引数の仕様により変換された)値しか受け付けないのか、
それとも fgetc の返す EOF 以外の値(つまり符号無しの値)をそのまま渡して良いのか。
0272デフォルトの名無しさん2009/01/17(土) 13:06:53
最後にゴミをプリントするけどいいのか?
0273デフォルトの名無しさん2009/01/17(土) 13:13:17
int ch; while( (ch = fgetc(fp)) != EOF ) printf( "%c", ch );

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

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

(char)を入れると、符号拡張で値が変わる可能性あるな。
0276デフォルトの名無しさん2009/01/17(土) 14:28:06
大丈夫、どっちみち255だ。
0277デフォルトの名無しさん2009/01/17(土) 14:35:07
printf()の%cって、マイナス値が送られてきたらどうなるんだろう。
0278デフォルトの名無しさん2009/01/17(土) 14:37:32
>>277
大丈夫、最下位1バイトを送出するだけだ。
0279デフォルトの名無しさん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
0280デフォルトの名無しさん2009/01/17(土) 15:10:47
メンバ変数にすべきだろ
インスタンスごとにiのインスタンスを別にしたいならstaticは使えない
そもそもiは何だ?
0281デフォルトの名無しさん2009/01/17(土) 15:22:02
iは色々処理をしてある条件の時に1になるフラグみたいなものです。
インスタンス生成時に0にしたいけれどtest関数でしか使わないからtestのメンバで・・って考えてました。

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

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

例えばDWORDの変数を宣言するとき DWORD dwPoint; DWORD dwStack;
などdwをつけて分かりやすくするなどは入りますか?
0298デフォルトの名無しさん2009/01/17(土) 18:00:08
>>296
そうなんですが、理論上ではどうかと思いまして
0299デフォルトの名無しさん2009/01/17(土) 18:01:29
>>297
ハンガリアンでぐぐったらその辺の議論はでてくるかと
あまり意味がないとされることが多いと思うよ
0300デフォルトの名無しさん2009/01/17(土) 18:15:53
>>295
std::fill ってどこまで最適化されるのん?
0301デフォルトの名無しさん2009/01/17(土) 18:17:47
>>300
実装依存だから何とも言えんな。
気になるなら試せば?
0302デフォルトの名無しさん2009/01/17(土) 18:52:02
>>298
理論上は、コンパイラの実装や最適化の影響によってどうなるかわからないから同じとも違うとも言えない。
0303デフォルトの名無しさん2009/01/17(土) 18:52:29
MFCなんかはシステムハンガリアンそのものだもんなぁ
0304デフォルトの名無しさん2009/01/17(土) 18:52:52
まあ実測したところで明日には古い知識になるかもしれないってことだよな
気にしないのが一番だ
0305デフォルトの名無しさん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の位置が誤っています」とエラーが出ます。
間違えをご指摘お願いします。
0306デフォルトの名無しさん2009/01/17(土) 19:08:40
if(c=='+'||c=='-');{
0307デフォルトの名無しさん2009/01/17(土) 19:12:48
指定された日付(2008/1/17)を
gettimeofday()関数で扱ってる
double型の数値に変換したいのですが
どうすればいいのでしょうか
0308デフォルトの名無しさん2009/01/17(土) 19:17:49
>>307
プログラムを書くといいよ。
0309デフォルトの名無しさん2009/01/17(土) 19:19:26
(double)
03103052009/01/17(土) 19:19:52
>>306
ありがとうございます。
0311デフォルトの名無しさん2009/01/17(土) 19:29:56
キャスト演算子をオーバーロードした時に疑問に思ったのですが
これを使うと戻り値はコピーか参照かどっちでしょうか
0312デフォルトの名無しさん2009/01/17(土) 19:30:45
普通に代入するだけなら、原則全てコピー
0313デフォルトの名無しさん2009/01/17(土) 19:30:49
型が参照なら参照だし
参照でなければ値だ。
0314デフォルトの名無しさん2009/01/17(土) 19:32:36
(Foo)bar = foo;
とか無理なんだっけ
03153112009/01/17(土) 19:37:50
>>312-313
光速の回答まことにありがとうです
0316デフォルトの名無しさん2009/01/17(土) 19:38:06
>>307
gettimeofday()はdoubleなぞ扱わない。
年月日から1970/1/1 00:00:00からの経過秒を作りたいならmktime()
0317デフォルトの名無しさん2009/01/17(土) 19:42:26
>>297
型をプリフィックスにするシステムハンガリアンには意味がない。役に立たない情報である上に、コードを修正するときの障害になる。型情報はコンパイラがチェックする方が正確。
意味をプリフィックスにするアプリケーションハンガリアンなら意味がある。カウンタだとか安全な値であるとか記憶クラスであるとかコンパイラがチェックできない情報を持たせると良い。

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

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

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

なるほど 調べてみます

>>321

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

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

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

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

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

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

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

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

命名規則を設計で決めるのはその通りだけどさ
批判も多いけど、場合によってはシステムハンガリアンがいい場合もあるな
0338デフォルトの名無しさん2009/01/17(土) 23:42:02
>>333
これは酷い・・・
お前、地雷プログラマだろ
0339デフォルトの名無しさん2009/01/17(土) 23:45:01
>>336
http://www.kouno.jp/home/c_faq/c16.html
0340デフォルトの名無しさん2009/01/17(土) 23:51:47
deleteについて質問なのですが
ObjectA の中に ObjectBがある場合
delete ObjectA
とする前に
delete ObjectB; delete ObjectA;
と中のものから消さなくてはいけないのでしょうか?
もうひとつ質問させていただきたいのですが
vecter<ObjectA> obje
とあった場合に
obje.clear()
ではObjectAのデストラクタは呼ばれますか?
0341デフォルトの名無しさん2009/01/17(土) 23:53:24
>>338
新人君がコンパイルエラーを無くすためになんでもかんでも
とりあえずキャストしてうまく動かないって言ってきたのを思い出したw
0342デフォルトの名無しさん2009/01/17(土) 23:54:30
Aの中でBをnewしているのであれば、Aのデストラクタの中でBをdeleteしとけば問題ない
0343デフォルトの名無しさん2009/01/17(土) 23:57:34
うへぇシステムハンガリアン記法思いっきりしてた
普段はやらないけど、グループでプログラム作るっていう課題があって
変数の命名方法決めようぜ!ってことで
あぁ
0344デフォルトの名無しさん2009/01/18(日) 00:02:22
Win32やMFC環境から始めた人は、システムハンガリアンに慣れてしまっても仕方ない気もするけどなぁ
0345デフォルトの名無しさん2009/01/18(日) 00:06:54
職場の規約で強制されてる人も多いはず
規約を変えたりするのって非常に面倒なんだよね
0346デフォルトの名無しさん2009/01/18(日) 00:07:28
_bstr_t にキャストするのであれば、あるいは
0347デフォルトの名無しさん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
とかいわれてもわからん・・
0348デフォルトの名無しさん2009/01/18(日) 00:11:50
_CrtSetBreakAlloc(125);
0349デフォルトの名無しさん2009/01/18(日) 00:13:55
std::stringと文字定数を大文字小文字区別せずに比較するにはどうすればいいですか?
0350デフォルトの名無しさん2009/01/18(日) 00:15:01
>>348
352バイトと、1.0f(00 00 80 3f)もヒントになるかもしれない。
0351デフォルトの名無しさん2009/01/18(日) 00:33:01
>>349
全部小文字(または大文字)に変換しながら(またはしてから)比較する。
03523512009/01/18(日) 00:34:10
マルチバイト文字が入ってるなら wchar_t への変換が要るかもね。
03533492009/01/18(日) 00:38:23
>>351
すみません、ASCII英数字のみです。
stricmp関数など、char型にする必要があるということですか?
==演算子か、compare関数など簡単にできないかなと・・
0354デフォルトの名無しさん2009/01/18(日) 00:40:25
stdにはNoCaseとかないんだっけ?
0355デフォルトの名無しさん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が押されたら、いきなりプログラムを終了するのではなく、それまでに動的に確保したバッファを解放したりしたいのですが・・・
0356デフォルトの名無しさん2009/01/18(日) 00:43:03
>>353
stricmp() 使えるのか。
1文字の比較なら string の [0] 取ればいいし、文字定数が文字列定数のことなら
string の c_str() を stricmp() に突っ込めばいいだろ。

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

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

Ctrl+C を検出するにはシグナルを使うことになるのかね。
0361デフォルトの名無しさん2009/01/18(日) 01:06:13
>>355
ctrl+CはC++の機能じゃない。例外というよりも割り込み処理になる。トラップしたいならOSの機能を調べた方が良い。
0362デフォルトの名無しさん2009/01/18(日) 01:47:53
WindowsならSetConsoleCtrlHandler
0363デフォルトの名無しさん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で使われていたためだ。
0364デフォルトの名無しさん2009/01/18(日) 18:06:26
コンパイラはMINGW32でまさに今しがたプログラムの勉強を始めたばかりです

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

#include <stdio.h>
int main(void)
{
printf("  夏\n")
printf(" 兵草\n")
printf("夢どや\n")
printf("のも\n")
printf("あが\n")
printf("と")
return 0;
}
0366デフォルトの名無しさん2009/01/18(日) 18:13:39
もう一回参考書と自分で書いたコードを見比べなさい。
0367デフォルトの名無しさん2009/01/18(日) 18:22:50
セミコロンは?
03683642009/01/18(日) 18:47:43
>>366-367
うぎゃぁぁぁ
すいません、ありがとうございました。
03693642009/01/18(日) 18:56:37
恥のついでにもうひとつだけ教えてください
>>365のソースコードからint、voidそしてreturn 0を
消してもMINGW上では正常にコンパイラされ実行もされます。
intやvoidを消しても大丈夫なのは理解できるのですが
return 0はソースコードの締めとして絶対必要なものではないのですか?
0370デフォルトの名無しさん2009/01/18(日) 19:11:14
C89 : 無くても警告で済む。
C99 : 無ければ return 0; が補填される。
03713642009/01/18(日) 19:26:50
>>370
ありがとうございました
0372デフォルトの名無しさん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歳
0373デフォルトの名無しさん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
0374デフォルトの名無しさん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
0375デフォルトの名無しさん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
0376デフォルトの名無しさん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/
0377デフォルトの名無しさん2009/01/18(日) 20:46:21
コピペ君って馬鹿だな、まで読んだ
0378デフォルトの名無しさん2009/01/18(日) 21:54:31
list<vector<int> > lst とやってイタテレータで
*lst[0] みたいにアクセスしたいのですが上手くいきません。
こういう場合はどういう使い方をすればよいのでしょうか。
0379デフォルトの名無しさん2009/01/18(日) 21:55:32
何がやりたいのか分からん。
0380デフォルトの名無しさん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
こんな感じな事がしたいのです。
0381デフォルトの名無しさん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;
0382デフォルトの名無しさん2009/01/18(日) 22:05:02
(*it)[0]でいいんじゃね?動かしてないからわからないけど
0383デフォルトの名無しさん2009/01/18(日) 22:05:06
(*lst)[0]
0384デフォルトの名無しさん2009/01/18(日) 22:08:02
>>382
出来ました! 教えて下さりありがとうございました。
0385デフォルトの名無しさん2009/01/18(日) 22:08:16
(*it)[0] だな。
演算子の優先順位の問題だ。
0386デフォルトの名無しさん2009/01/19(月) 00:07:45
vectorみたいな連続したメモリのend()イテレータから実アドレスを得たい場合、
--itr; (&*itr) + 1;
とやるしか無いのでしょうか?
0387デフォルトの名無しさん2009/01/19(月) 00:14:50
vector みたいな、って、vecotr 以外で得る必要のある場合があるのか?
(vector 以外で得たとして、まともに使えるのか?)

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

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

もしそうだったら、operator *がreturn *p;で参照型を返すというような
単純な実装になっていれば平気だと言えるはず。
その保証がないだろうから、結局やめておくべきだろうけど。
0395デフォルトの名無しさん2009/01/19(月) 20:31:45
*が逆参照とは限らない
iterator::operator*が何をやってるかわからない以上しないのが無難
0396デフォルトの名無しさん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回
でると思ったんですが、そういうわけではないのですね
0397デフォルトの名無しさん2009/01/19(月) 20:38:34
"sunrise\n"が一回しか表示されないように書かれてるからな
0398デフォルトの名無しさん2009/01/19(月) 20:40:50
ど素人がぶら下がり構文なんか使おうとするんじゃありませんっ
0399デフォルトの名無しさん2009/01/19(月) 20:42:35
>>398

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

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

struct kouzoutai{
int menbahensuu;
};

int kouzoutaihensuunokosuu=3;

struct kouzoutai kouzoutaihensuu[kouzoutaihensuunokosuu];

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

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

Cなら
#define kouzoutaihensuunokosuu 3

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

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

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

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

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

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

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


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

>>436
本当に8進数の0です。
0438デフォルトの名無しさん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)
としてあります
0439デフォルトの名無しさん2009/01/21(水) 20:47:16
>>438
EnumJoysticksCallbackにstatic付けておけ。

おそらく、EnumDevicesでNULLを渡しているところにthis渡せばいい。
すると、EnumJoysticksCallbackのpContextから渡したthisが取り出せるという仕組みのはずだ。
0440デフォルトの名無しさん2009/01/21(水) 20:51:46
ヌル文字って英語でなんていうの?
0441デフォルトの名無しさん2009/01/21(水) 20:54:20
null character
0442デフォルトの名無しさん2009/01/21(水) 21:06:25
テリー伊藤 < ヌル文字って何?
0443デフォルトの名無しさん2009/01/21(水) 21:53:52
初心者ですいませんがC#なんですけども、10万個くらいの配列のデータの正規化をしたいのですが、どのようにすればいいのかまったくわかりません。誰かご教授いただけないでしょうか?
0444デフォルトの名無しさん2009/01/21(水) 21:54:27
スレ違い
0445デフォルトの名無しさん2009/01/21(水) 21:54:58
>>443
消えろカス
0446デフォルトの名無しさん2009/01/21(水) 22:45:01
77
0447デフォルトの名無しさん2009/01/21(水) 22:48:34
>>443
回線切っ(ry
04484392009/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)" は未解決です。
というエラーが発生しました

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

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

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

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

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

ありがとうございました
0452デフォルトの名無しさん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;
}


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

staticをつけないでできる方法はどんな方法がありますか?
アドバイスください;;
0459デフォルトの名無しさん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を渡すこと。
0460デフォルトの名無しさん2009/01/22(木) 02:00:16
struct **hogeをfreeする場合の正しい文法は

free(*hoge)でいいの?
0461デフォルトの名無しさん2009/01/22(木) 02:13:00
アロケートの仕方にもよるけど、それでいい場合もあるんじゃないかな
0462デフォルトの名無しさん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個くらい
0463デフォルトの名無しさん2009/01/22(木) 07:27:45
XMLのデータに日本語を使いたくてUTF-16にしたんですがIEで開けません。どうしてですか?
0464デフォルトの名無しさん2009/01/22(木) 07:54:54
>>462
何がしたいのかよく判らんが、CDXInputのメンバを参照したいのでなければそのキャストはおかしい。
逆に言うと、そのキャストはCDXInputのメンバを参照する目的に適っている。
pdidInstanceとやらがCDXInputのメンバでないのなら、そりゃぁエラーにもなるさ。
0465デフォルトの名無しさん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)
{
//メンバにアクセスし放題
}
0466デフォルトの名無しさん2009/01/22(木) 08:32:12
なんだ、継続してた話題だったのか。コテないから無視してしまった。
0467デフォルトの名無しさん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++で大きな容量を一度に読み書きするにはどうすればいいのでしょうか?
0468デフォルトの名無しさん2009/01/22(木) 16:00:17
int i = fread(buf, 1024, 1, fp);
if(i) fwrite(buf, 1024, 1, fp);
          ↑

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

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

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

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

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

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

こんな感じで4バイト区切りで変数に格納したいのですがどうやるのでしょう?
格納後、1000|0000|0000|0000| となっていてほしいんです
0482デフォルトの名無しさん2009/01/23(金) 14:06:59
んなアホな
0483デフォルトの名無しさん2009/01/23(金) 14:07:01
インスタンスへの参照さえあればprivateメンバにだって自由にアクセスできるが
0484デフォルトの名無しさん2009/01/23(金) 14:07:42
483は>>480な。
てかお前ら書き込みすぎだろwww
0485デフォルトの名無しさん2009/01/23(金) 14:08:52
>>481
プログラムを書くと良いよ。
0486デフォルトの名無しさん2009/01/23(金) 14:09:47
>>481
とりあえず自分で書いたコードを貼ってくれ。意味がわからん。
0487デフォルトの名無しさん2009/01/23(金) 14:19:08
>>481
4「ビット」の間違いだよな?
BCDとかパック10進数とかでぐぐれ
0488デフォルトの名無しさん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の位の数, ・・・ を得ることができる。
それらを収めたい位置にシフトして足せば終わり。
このシフトして足すのも、普通は割るのと同じループ内でやってしまう。
0489デフォルトの名無しさん2009/01/23(金) 14:32:23
マルチだが

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

今日どうしても必要なんだ。
0490デフォルトの名無しさん2009/01/23(金) 14:33:26
>今日どうしても必要なんだ。
急ぐならならマルチはやめるべきだね。
0491デフォルトの名無しさん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 );
}
0492デフォルトの名無しさん2009/01/23(金) 14:59:56
>490
すみませんでした
反省します
0493デフォルトの名無しさん2009/01/23(金) 15:19:50
>>492
ぐぐったらそれっぽいコードが結構出てきたよ?
0494デフォルトの名無しさん2009/01/23(金) 15:21:44
>>491
配列にしてindexを指定するのはダメ?
04954912009/01/23(金) 15:31:47
>>494
ポリゴンの座標や回転、拡縮などの値を
キーフレーム毎にグラフにしたいのですが、
既にクラスは使用されていてかつ、
intやfloatが入り混じっているため
templateで解決したいなぁ、と。
やっぱりunionあたりで解決すべきなのかなぁ・・・。
0496デフォルトの名無しさん2009/01/23(金) 20:21:48
>>491
メンバaを呼ぶ関数とメンバbを呼ぶ関数を作って、関数ポインタを使って切り替えるってのはどうかな
0497デフォルトの名無しさん2009/01/23(金) 21:25:39
そんなことしなくても、普通にメンバのオフセット使えば良いと思うよ
0498デフォルトの名無しさん2009/01/23(金) 22:21:26
>>491
C++を使う。

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

できるはずなのですが、いまいち書き方がわからないです。
0505デフォルトの名無しさん2009/01/25(日) 23:30:25
#define MacroReturn return
0506デフォルトの名無しさん2009/01/25(日) 23:30:27
#define RETURN return
0507デフォルトの名無しさん2009/01/25(日) 23:31:01

>>505-506
0508デフォルトの名無しさん2009/01/25(日) 23:31:54
ワロタwww
0509デフォルトの名無しさん2009/01/25(日) 23:38:07
伝統芸能マクロリターンか
0510デフォルトの名無しさん2009/01/25(日) 23:42:40
マクローリンタンに見えた
0511デフォルトの名無しさん2009/01/25(日) 23:46:51
マクロリターン展開という奴か。
昔数学で習ったような。
0512デフォルトの名無しさん2009/01/25(日) 23:51:58
そろそろ飽きてきたよ
0513デフォルトの名無しさん2009/01/26(月) 00:20:51
win32apiスレでやれ
0514デフォルトの名無しさん2009/01/26(月) 00:26:42
なんでいきなりWin32APIなわけ?
0515デフォルトの名無しさん2009/01/26(月) 12:31:19
文字列へのポインタ
char* s
が与えられてるとき,これを標準ライブラリのstringに
変換するにはどうすればいいでしょうか?

string str = new string(*s)

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

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

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

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

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

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

よりによって最悪な方法を選んだな。
05204912009/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 ) ) );
/*略*/
}
0521デフォルトの名無しさん2009/01/26(月) 14:33:01
>>520
ヌルポインタ p に -> を適用した時点で未定義動作。

offsetof() の典型的な実装ではあるけど、実際にそれをやっていいのは
動作保証のできるコンパイラ実装者だけ。
05224912009/01/26(月) 14:38:03
>>521
そうなのですか・・・
ただ、VC上でテストしてみたところ、
想定していた値(オフセット値)が出てきたため
VCでメイクしている限りは大丈夫と
思っているのですがどうなのでしょうか?
VCのデバッガ上でもNULLポインタのメンバアクセス時は
オフセット値がthisポインタだったりしますし・・・
0523デフォルトの名無しさん2009/01/26(月) 17:48:11
if(){
}
と
if()
{
}
はどっちがいいと思いますか?
3年間自分の中で決着が付きません
0524デフォルトの名無しさん2009/01/26(月) 18:05:51
俺はどっちも好きではない
0525デフォルトの名無しさん2009/01/26(月) 18:31:46
質問ですAスライムとBゴブリンとCトロールをゲーム内で出現させたいとします

この場合は例えば
CMobA

CMobB

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

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

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

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

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

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

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

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

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

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

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

0541デフォルトの名無しさん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 )
とするとコンパイルはできるんですが、電源切らないと何も操作できなくなるんです。
動的な変数を別スレッドの中で使うにはどうすればいいんですか?
0542デフォルトの名無しさん2009/01/26(月) 21:57:27
>>540
出来ないって書いてあるよ(FAQにも)
http://ja.wikipedia.org/wiki/Valgrind#.E5.88.B6.E7.B4.84
0543デフォルトの名無しさん2009/01/26(月) 21:59:00
>>522
なんで標準で用意されたoffsetofマクロ使わずに自分で再発明しようとするの?
話はそこからだ
0544デフォルトの名無しさん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 ){
  ;
 }
}
0545デフォルトの名無しさん2009/01/27(火) 00:11:44
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/

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

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

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

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

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

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

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

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

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

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

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

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

あとC++0xではこう書けるようになる予定
CTestStatic() : test{ 0, 1, 2 } {}
0618デフォルトの名無しさん2009/01/28(水) 19:01:13
static const な配列を作って、
コンストラクタでそれをコピーすればいい。
0619デフォルトの名無しさん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;
}
0620デフォルトの名無しさん2009/01/28(水) 19:09:32
ありえない・・・・・
0621デフォルトの名無しさん2009/01/28(水) 19:10:34
なんでnewしてんの?
0622デフォルトの名無しさん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;
 }
}
0623デフォルトの名無しさん2009/01/28(水) 19:21:24
boost assingn使えばいいんじゃない?
0624デフォルトの名無しさん2009/01/28(水) 19:22:42
クラス内で{ }を使って配列を初期化することはできないんだね^^;
0625デフォルトの名無しさん2009/01/28(水) 19:24:19
C++標準ライブラリにvectorあるんだから使え
0626デフォルトの名無しさん2009/01/28(水) 19:24:55
>>624
一時変数使ってもいいならもちろん出来るさ
0627デフォルトの名無しさん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;
 }
}
0628デフォルトの名無しさん2009/01/28(水) 20:11:37
>>627
正解
初心者大杉
0629デフォルトの名無しさん2009/01/28(水) 20:13:05
PODじゃないのにmemcpyして大丈夫?
0630デフォルトの名無しさん2009/01/28(水) 20:13:54
>>629
PODじゃなかったらしちゃだめだな
0631デフォルトの名無しさん2009/01/28(水) 20:17:47
int m_d[3]; はどう見ても POD
0632デフォルトの名無しさん2009/01/28(水) 20:21:03
でもHogeはPODじゃないだろ
非PODのPOD部分をmemcpyって規格で許されてたっけ
現実的には問題ないことが多いと思うけど
0633デフォルトの名無しさん2009/01/28(水) 20:24:07
つ[std::copy()]
0634デフォルトの名無しさん2009/01/28(水) 20:26:23
>>632
全く問題ない
0635デフォルトの名無しさん2009/01/28(水) 20:26:43
copyは一個づつ入れるって決まってるじゃん、と思ったけど今は書き方の問題で別に速くしたがってるわけじゃないか
0636デフォルトの名無しさん2009/01/28(水) 20:26:54
>>633
セキュア関数を使えと文句を言われます!
0637デフォルトの名無しさん2009/01/28(水) 20:30:23
static const int d[3] = { 12, 4, 40 };
コンストラクタにこれを記述したらコンパイルできたのですが
使おうとするとdはないと言われますどうしてですか?
0638デフォルトの名無しさん2009/01/28(水) 20:35:26
static constだからグローバル変数だろ::dじゃね?
0639デフォルトの名無しさん2009/01/28(水) 20:38:13
>>637
>>627のように自分のメンバ変数へ複製している?
0640デフォルトの名無しさん2009/01/28(水) 20:45:22
>>638
寝言は寝て言え
0641デフォルトの名無しさん2009/01/28(水) 21:04:12
わかんね
もういいや一個一個いれる
0642デフォルトの名無しさん2009/01/28(水) 21:14:39
>>627
> int get(int i) { return d[i]; }

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

(char *) hoge = data

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

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

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

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

考え方はフラグと同じなのでおとなしくフラグ設定しておくのが無難なのでしょうか。
0662デフォルトの名無しさん2009/01/29(木) 04:27:38
A,B,Cを関数にすればそんなにひどいコードの膨らみ方はしないだろ
0663デフォルトの名無しさん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のままでいいと思うが。
0664デフォルトの名無しさん2009/01/29(木) 08:53:04
もうひとつ
if (aa || bb) {
  if (aa) { A; }
  else { B; }
  C;
}
ただし、aaが副作用を伴わない場合に限る。
0665デフォルトの名無しさん2009/01/29(木) 10:54:56
クラステンプレートじゃなくて、コンストラクタにテンプレート指定させるにはどうすればいいんでしょうか
そもそもそんなこと出来ない?
0666デフォルトの名無しさん2009/01/29(木) 12:35:59
>>665
std::mem_fun と std::mem_fun_t みたいな関係にすればよかろう
0667デフォルトの名無しさん2009/01/29(木) 12:38:19
>>665
テンプレートクラスにすればいいんじゃないか?
06686652009/01/29(木) 12:42:30
ありがとうございます。

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

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

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

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

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

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

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

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

0704デフォルトの名無しさん2009/01/30(金) 19:34:45
・フラグメンテーションが原因であることは確定してるの?
 本当に「freeなメモリは結構ある」の?どうやって調べたの?
・本当にアロケーションに失敗してるの?mallocの引数がでかすぎになってないか
 ちゃんと確認したの?
・どのタイミングで失敗してるの?プログラムの起動直後?時間がたってから?
 起動直後に多めに確保して使い回すとかを考える方が先じゃないの?
・フラグメンテーションの発生を確認したとして、それからどうすんの?カーネル改造するの?
・なんでUNIXスレやLinux板じゃなくてここで聞くの?ばかなの?死ぬの?
0705デフォルトの名無しさん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上の話ですが、プログラムに関係するので。
いい板があったら教えてください。
0706デフォルトの名無しさん2009/01/30(金) 20:33:10
>mmap時にENOMEMが返ってきます。

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

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

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

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

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

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

この2つはどう違うのですか?  ><
0726デフォルトの名無しさん2009/01/31(土) 19:42:13
見た目
0727デフォルトの名無しさん2009/01/31(土) 19:59:47
>>719
おー
thx
0728デフォルトの名無しさん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が初心者にはやさしいかもな
0729デフォルトの名無しさん2009/01/31(土) 21:12:15
>>725
*の回りにはいくら空白があってもいいんだってさ。
だから

CDXDevice * device1, device2;

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

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

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

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

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

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

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

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

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

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

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

>>791
何をお願いしたいのか分からん。
VC2008入れてビルドしたら良いんじゃない?
0795デフォルトの名無しさん2009/02/01(日) 14:08:12
>>791
それでは私がmmosaloonの該当スレで質問してきましょうw
0796デフォルトの名無しさん2009/02/02(月) 00:48:11
クラスや関数にもstaticは可能な限りつけた方がいいんでしょうか?
違うクラスで使う同じ関数がダブらないから効率がよくなるって解釈でいいんでしょうか?
0797デフォルトの名無しさん2009/02/02(月) 01:01:50
そりゃ効率のいいコードにはなると思うけど、
コードの形だけでは実行速度はわからない。
0798デフォルトの名無しさん2009/02/02(月) 01:04:03
メンバ変数を操作しないユーティリティ系のメンバ関数には付けるべき
0799デフォルトの名無しさん2009/02/02(月) 01:09:06
thx。やっぱつけた方がいいのか。一度も使ったことなかった
どのクラスのなかで宣言してようがstaticをつければグローバルになってどこからでも宣言なしで使えるようになるの?
0800デフォルトの名無しさん2009/02/02(月) 01:11:38
言いたいことはなんとなくわかるが、グローバルかどうかはpublicかどうかが基準だ
public staticであれば、クラスのインスタンスを作らなくても関数にアクセス出来るというだけ
0801デフォルトの名無しさん2009/02/02(月) 01:15:02
staticメンバ関数とstaticメンバ変数はただクラス名の名前空間に、関数と変数を宣言してるだけ。
アクセスできるかはアクセス修飾子によって決まる。
クラス内部で使うとかグローバルとか関係ない。
0802デフォルトの名無しさん2009/02/02(月) 01:23:38
thx!完全に理解しました。スコープがいらなくなるのかと思いました。
クラスのインスタンスを作っても、たとえばstatic関数だと、その部分の関数だけインスタンスが作られなくなるというだけですね。
0803デフォルトの名無しさん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です。
0804デフォルトの名無しさん2009/02/02(月) 10:07:02
>>803
C++でコンパイルする
ppm.h および関連ライブラリを探す
0805デフォルトの名無しさん2009/02/02(月) 13:38:24
>>803
エラーが出たならエラーメッセージを晒すのは基本。
今回の場合はソースをアップローダに上げるのは必須ではないが、
もし資料をそのままコピーしていないのなら上げた方が話が早い。

まぁ、今回は恐らく>804だろうな。
0806デフォルトの名無しさん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();
が必要なのがわかりますが、違いが今ひとつわからず質問させていただきました。
0807デフォルトの名無しさん2009/02/03(火) 00:01:12
mallocの必要性からやってきなさい。
0808デフォルトの名無しさん2009/02/03(火) 00:02:25
Object objは一時オブジェクトだから、定義したスコープから抜けると消える。
newしたのはfreeするまで残る。
0809デフォルトの名無しさん2009/02/03(火) 00:08:45
>>807,808 さん
返信ありがとうございます。
つまり特定のスコープの中だけで使う場合には new する必要はないということですね。
ありがとうございました。
0810デフォルトの名無しさん2009/02/03(火) 00:08:49
>>808
一時オブジェクトじゃなくて自動変数な
0811デフォルトの名無しさん2009/02/03(火) 01:40:53
>>808
free じゃなくて delete な
0812デフォルトの名無しさん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;
}
0813デフォルトの名無しさん2009/02/03(火) 10:18:03
>>812
アセンブリ出力を読め。納得したら、最適化オプションを変更しろ。
0814デフォルトの名無しさん2009/02/03(火) 10:18:44
>>812
コンパイラの生成したアセンブリリストを比べるんだ。
「リストファイルの生成」とかそんなコンパイルオプションでいけるはず。
0815デフォルトの名無しさん2009/02/03(火) 10:21:58
アセンブリ出力というのはどこにあるのでしょう?
0816デフォルトの名無しさん2009/02/03(火) 10:26:07
何この間抜け。
0817デフォルトの名無しさん2009/02/03(火) 10:27:13
そもそもデバッグビルドなんですけど最適化とか
されちゃうんでしょうか?
0818デフォルトの名無しさん2009/02/03(火) 10:31:14
なんか /FAっていうオプションつけたら出ました。
0819デフォルトの名無しさん2009/02/03(火) 10:47:07
アセンブリを比較してみたんだけど
; Line 8
mov DWORD PTR _i$[ebp], 0
しか違わないです。なぜだー
0820デフォルトの名無しさん2009/02/03(火) 10:51:10
VC のインラインアセンブラって自動でレジスタ保存してくれる・・・んだよな?
0821デフォルトの名無しさん2009/02/03(火) 11:10:51
ごめんなさい。アセンブリが間違ってました。
下記のようにしたら100が出ました。
__asm {
mov ebx, p
mov DWORD PTR [ebx], 100
}
0822デフォルトの名無しさん2009/02/03(火) 20:31:59
int* a;
int *a;

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

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

int *aにします
0828デフォルトの名無しさん2009/02/03(火) 22:20:24
ポインタは int *a; なのに
参照は int& a = b; な俺
0829デフォルトの名無しさん2009/02/03(火) 22:22:50
俺も俺もw
0830デフォルトの名無しさん2009/02/03(火) 23:01:27
俺はint* a;派
0831デフォルトの名無しさん2009/02/03(火) 23:07:57
俺はカンペキにint *a;派だなぁ。
キャストも(int *)pって1マス開けちゃう。
もう癖だな。
0832デフォルトの名無しさん2009/02/03(火) 23:14:34
int* a;派だな。
int* a, b;でaもbもポインタになる言語出身なので。
とはいっても普段は複数行に分けて書いてるんだけどね。
0833デフォルトの名無しさん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"のアドレスはいつ無効になるのでしょうか?
両方とも関数を出ると無効になるのでしょうか。


0834デフォルトの名無しさん2009/02/03(火) 23:16:46
>>832
そのこころは?
0835デフォルトの名無しさん2009/02/03(火) 23:19:41
>>833
関数を出てもずっと有効
0836デフォルトの名無しさん2009/02/03(火) 23:21:09
データセグメントに置かれるから、"ng""ok"は関数を出ても残る。
なのでpを返しても大丈夫。
0837デフォルトの名無しさん2009/02/03(火) 23:28:40
>>834
どっちの言語でも問題が起きないからじゃないかな
0838デフォルトの名無しさん2009/02/04(水) 00:06:28
int *a; って書いてる人は
ポインタへの参照は int *&a; とかって書いてるのかな。
0839デフォルトの名無しさん2009/02/04(水) 00:07:57
ポインタの参照なんて書く機会がない。
08408332009/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;//ちなみにこれはだめ
}
0841デフォルトの名無しさん2009/02/04(水) 00:15:06
ですよ
0842デフォルトの名無しさん2009/02/04(水) 00:25:39
>>839
あるよ
0843デフォルトの名無しさん2009/02/04(水) 00:47:21
>>838
ただの参照をint &r;のように書く人も周りにいる。
0844デフォルトの名無しさん2009/02/04(水) 00:49:24
int *a; は分かる
int **a; は分かる
int &a; もまあ分かる
int *&a; は少し分かり辛い
int **&a; は少し分かり辛い
0845デフォルトの名無しさん2009/02/04(水) 00:59:03
int *a;だな。言語仕様上可能な変数の複数宣言を、表記法で間違えさせる時点で、int* a;は誤っている。
これは間違いなくバカの仕業だ。
0846デフォルトの名無しさん2009/02/04(水) 00:59:40
複数宣言なんてまずしないし
0847デフォルトの名無しさん2009/02/04(水) 01:15:59
複数宣言はやめてコメントしっかり入れようぜ
0848デフォルトの名無しさん2009/02/04(水) 01:30:51
変なこだわり持ってると const 入れる時に挙動が変わって 面倒っしょ?
0849デフォルトの名無しさん2009/02/04(水) 01:33:50
俺は複数宣言は滅多にしないけど
それでも int *& i; なんて変数を使う回数より複数宣言する回数のほうがずっと多いな。
0850デフォルトの名無しさん2009/02/04(水) 01:34:55
あ、メンバは複数にはしないよ。
ただ、メンバに *& なんて、一度も使ったことないけどね。
0851デフォルトの名無しさん2009/02/04(水) 01:39:08
よく考えたら
for (XXX::iterator it = x.begin(), end = x.end(); it != end; ++it)
なんてのは最近結構使ってるな。

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

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

printf("%s", hako + 1);が`i`になるけど、&hako[0]と&hako[1]のアドレスを見ると
4bit?ずつ増えていますが、+1というのは自動的に宣言した型のサイズになるのでしょうか?
0871デフォルトの名無しさん 2009/02/04(水) 15:50:16
>>870
そうです
0872デフォルトの名無しさん2009/02/04(水) 15:57:37
>>871
ありがとうございます
決まりごとのアドレスが連続している意味がわかりました
0873デフォルトの名無しさん2009/02/04(水) 16:03:56
関係ないけど"ishite"になりそうな。
0874デフォルトの名無しさん2009/02/04(水) 16:08:15
8bitじゃね?
0875デフォルトの名無しさん2009/02/04(水) 16:08:17
おっと
sではなくcですね
0876デフォルトの名無しさん2009/02/04(水) 16:36:21
>>870
自動的に、ポイントしている型の分アドレスは増えるはずです。つまり、あなたは何か勘違いをしています。
hako + 1は、aの次のiを指している筈ですね。
0877デフォルトの名無しさん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
};
0878デフォルトの名無しさん2009/02/04(水) 21:09:07
そのちょいちょい混ざる数字は行数をやさしく書いてくれたのか、それとも元のソースに含まれているのか
08798772009/02/04(水) 21:10:32
行数を分かりやすいように書きました
0880デフォルトの名無しさん2009/02/04(水) 21:11:55
>>879
14行目じゃなくて、1行目と二行目も?
0881デフォルトの名無しさん2009/02/04(水) 21:12:56
>>880
そうです 元のソースです ↓

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

#ifndef _GameMain_h_
#define _GameMain_h_

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

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

そのようでした・・・・

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

#endif

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

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

これは偶然動いているだけですか?
0892デフォルトの名無しさん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を返します
0893デフォルトの名無しさん2009/02/04(水) 23:05:40
>>891
完全に合法
でも危ないからオススメしない
0894デフォルトの名無しさん2009/02/04(水) 23:08:11
基本クラスを継承クラスにキャストはできるんですが、
(継承クラス)基本クラス
継承クラスを基本クラスにキャストするにはどうすればいいんですか?
(基本クラス)継承クラス
インテリセンスが機能しないんです
0895デフォルトの名無しさん2009/02/04(水) 23:11:21
>>894
dynamic_cast
0896デフォルトの名無しさん2009/02/04(水) 23:11:37
ポインタなら、動こうか壊れようが可能だろ?
インスタンスなら、子クラスレベルにはキャスト無理
0897デフォルトの名無しさん2009/02/04(水) 23:20:08
>>893
ありがとうございます
まさか>>891が合法だとは思いませんでした
08988922009/02/04(水) 23:21:07
ソースを上げるのでよかったらアドバイスください
http://www7.uploader.jp/dl/inoguma/inoguma_uljp00003.zip.html

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

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

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

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

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

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

一度に確保するメモリー領域は50MB程度でループ内部で確保→解放を繰り返してます。
非同期IOにしてみたこともありますが、処理速度は同じぐらいか、かえって遅くなったように思います。
正直、手詰まり感が否めません orz
0904デフォルトの名無しさん2009/02/05(木) 00:50:23
>>903
プログラム的に改善点はあるものの、ネックはHDDのアクセス速度だろう。
約900MBをreadしてwriteするのに150秒なので、転送速度は平均で約12MB/秒。
同一ドライブ間での転送なら、こんなものかもしれない。
別ドライブにwriteしたり、HDDがIDEならSATAにしたりすれば早くなるだろう。
もしメモリが少ない環境なら、バッファサイズを減らしたほうがいいだろう。
0905デフォルトの名無しさん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;
}
09069052009/02/05(木) 01:16:21
>>905 のコードでは問題ないだろうけど
free 忘れてる orz
0907デフォルトの名無しさん2009/02/05(木) 01:17:03
同一ドライブ間でのREAD/WRITEです。
色々調べてみましたが、CFileクラスを用いた読み書きとかメモリーマップドファイルとか意味がわかりません。
ファイル破談+とかいうソフトを使ってみましたが、同程度の速度でした。
こんなもんかもしれませんねぇ。
>>904さんがおっしゃるように最終的にはHDDのアクセス速度がボトルネックになるのでしょうね。

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

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

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

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

レスありがとうございます。
スレ違いでしたか、申し訳りません
0930デフォルトの名無しさん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型でキャストするのがいいということになる。
0931デフォルトの名無しさん2009/02/07(土) 17:15:59
まぁ、変数名にstringなんて付けるのはやめとけw
暗黙的に予約語だから
0932デフォルトの名無しさん2009/02/07(土) 22:52:59
文字列を表示するクラスがあるとします
そのクラスは表示したい文字を数えてその分だけメモリを確保します

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

privateで

CModel *m_model; と宣言して

コンストラクタで

m_model = NULL;

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

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

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

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

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

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

長文失礼しました 読みにくいと思いますがすいません
0933デフォルトの名無しさん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();
}

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

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

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

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

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

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

でいいと思うのですが

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

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

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

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

処理に支障が出たらstd::vectorやmap?に変更してみます
0938デフォルトの名無しさん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の宣言のスコープを抜けたら自動的にデストラクタが呼ばれる
0939デフォルトの名無しさん2009/02/07(土) 23:58:48
ポインタの配列を動的に確保する。
std::vectorを使う。
boost::ptr_vectorを使う。
0940デフォルトの名無しさん2009/02/08(日) 00:03:25
そういやクラス名がモデルか
DBみたいなクラスでも作るのか?
0941デフォルトの名無しさん2009/02/08(日) 00:19:12
>>938 >>939 なるほど!その方法がありましたか
>>940 クラス名は適当につけただけです
ゲームに使おうと思っているクラスで
指定した文字列を1文字づつテクスチャに書き込んで板ポリで表示するクラスです
0942デフォルトの名無しさん2009/02/08(日) 00:27:46
>>938
このコードメモリリークしない?
for文の中でちゃんとdeleteしないと
0943デフォルトの名無しさん2009/02/08(日) 00:34:38
確実にリークするなw
0944デフォルトの名無しさん2009/02/08(日) 07:45:50
ループの1段階展開とか2段階展開ってどうやるんですか?
コードを見比べても何をしてるのかさっぱりわからないんですが
0945デフォルトの名無しさん2009/02/08(日) 09:05:13
例えばどんなコード?
0946デフォルトの名無しさん2009/02/08(日) 09:41:40
アンロールのことかな?
0947デフォルトの名無しさん2009/02/08(日) 10:02:29
>>944
その見比べていると言うソースを提示してみてくれ。
0948デフォルトの名無しさん2009/02/08(日) 10:06:35
再帰のことか?
0949デフォルトの名無しさん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];
0950デフォルトの名無しさん2009/02/08(日) 10:43:52
>>949
ちょっとやり方がキモイけど、endに適当な数字を入れて自分で処理を手書きしてみな
0951デフォルトの名無しさん2009/02/08(日) 10:52:27
endが5のときの動きをトレースすれば一目瞭然だな。

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

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

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

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

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

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

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

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

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