5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2009/07/19(日) 22:32:32
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
http://pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
http://pc12.2ch.net/test/read.cgi/tech/1235921779/
スレを勃てるまでもないC/C++の質問はここで 9
http://pc12.2ch.net/test/read.cgi/tech/1240022781/
スレを勃てるまでもないC/C++の質問はここで 10
http://pc12.2ch.net/test/read.cgi/tech/1242300936/
スレを勃てるまでもないC/C++の質問はここで 11
http://pc12.2ch.net/test/read.cgi/tech/1245059383/

2 :デフォルトの名無しさん:2009/07/19(日) 22:33:48
まんこしゃぶり虫乙

3 :デフォルトの名無しさん:2009/07/19(日) 23:02:47
                          刀、           , ヘ
                  /´ ̄`ヽ /: : : \_____/: : : : ヽ、
              ,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
               /: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
     ,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
    /: :.,.-ァ: : : |: : : : : : : : :    :\: : : : :: : : :ヽ  \   /: : : :/
    ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i  / /: : : : :/
     /: :     ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/  /: : : : :/         、
.    /: : /  . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : |  /: : : : :/            |\
   /: : ィ: : : : :.i: : |   \!___/ ヽ:: : : : : : :\|:.:.:.:/:!  ,': : : : /              |: : \
   / / !: : : : :.ト‐|-    ヽ    \: : : : : l::::__:' :/  i: : : : :{              |: : : :.ヽ
   l/   |: : :!: : .l: :|            \: : : l´r. Y   {: : : : :丶_______.ノ: : : : : :}
      l: : :l: : :ト、|         、___,ィ ヽ: :| ゝ ノ    '.: : : : : : : : : : : : : : : : : : : : : : /
      |: : :ト、: |: :ヽ ___,彡     ´ ̄´   ヽl-‐'     \: : : : : : : : : : : : : : : : : : イ
        !: :从ヽ!ヽ.ハ=≠' , ///// ///u /           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      V  ヽ|    }///  r‐'⌒ヽ  イ〉、
              ヽ、______ー‐‐' ィ´ /:/:7rt‐---、       こ、これは>>1乙じゃなくて
                  ィ幵ノ ./:/:./:.! !: : : : :!`ヽ     ポニーテールなんだから
              r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\   変な勘違いしないでよね!
               /: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\

4 :デフォルトの名無しさん:2009/07/20(月) 17:32:48
テンプレートやマクロやらを使ったりして、クラスの変数名を変更する事ってできますか。

class point {
  double x, y, z;
 コピー等の処理
  point特有の処理
}
class color {
  double r, g, b;
 コピー等の処理
  color特有の処理
}
というのを
class Bass {
 a, b, c ← この名前を継承先のクラスに応じて動的に変化させたい
 コピー等の処理
}
class point : public Bass {point特有の処理}
class color : public Base {color特有の処理}

一応、取り敢えず現在の実装では
class point : public Bass {
 GetX(), SetX(...)
 point特有の処理
}
とかやってます。これをp.SetX(100)とやってるのをp.xとできたらうれしいなと。

5 :デフォルトの名無しさん:2009/07/20(月) 18:19:38
>>4
参照でいけないかな

class base {
protected:
double a, b, c;
};

class point : public base {
public:
double &x, &y, &z;
point() : x(base::a), y(base::b), z(base::c) { }
};

class color : public base {
public:
double &r, &g, &b;
color() : r(base::a), g(base::b), b(base::c) { }
};

6 :デフォルトの名無しさん:2009/07/20(月) 18:45:06
>>5
ありがとうございます。
なるほど、テストしてみたらいけました。
データ量は、かなり増えてしまいそうですね;

ついでに、速度に関して実験してみました。
point p;
base b;
for(int i=0;i<1000000;i++)
 for(int j=0;j<1000;j++)
  p.x = tmp[j]; または b.a = tmp[j];

で比較したら、5%ほどオーバーヘッドがあるようです。思ったよりも速かった。
VSで実験してますが、最適化オプションつけると、b.aが全部最適化で
省略されてしまうのでDebugモードでの比較です。

コンパイル時に、この辺を上手く置き換えてくれる技とかがあると面白いのですが。

7 :4:2009/07/20(月) 19:42:03
個人的には、こんなのを作ってはいるのですが。
ちょっとソースが汚いのとがちょっとアレなんです。

#define SET_BASE(name, a, b, c) \
template <class Ty> \
class base_ ## name { \
public: \
 base_ ## name () {\
  static_cast<Ty&>(*this).##a = 10; \
  static_cast<Ty&>(*this).##b = 10; \
  static_cast<Ty&>(*this).##c = 10; \
 } \
};

SET_BASE(point, x, y, z)
SET_BASE(color, r, g, b)

class point : public base_point<point> {
public:
 double x, y, z;
};

class color : public base_color<color> {
public:
 double r, g, b;
};

8 :デフォルトの名無しさん:2009/07/20(月) 19:50:35
個人でやってるプログラム?チームでやるなら保守を妨げる要因にしかならんと思うんだけど。
colorクラスにalphaが加わったらどうすんのよ?まぁ同じ事をそこらに書くのが面倒くさいってのは分かるけど。

9 :デフォルトの名無しさん:2009/07/20(月) 19:59:33
個人です。実用性というより、単なる趣味ですねw

10 :デフォルトの名無しさん:2009/07/20(月) 20:15:11
メンバ変数のアクセサ書くの面倒だったらGET_SET_ACCESSORをパクるってのは?

11 :デフォルトの名無しさん:2009/07/20(月) 20:46:17
>>10
カプセル化置いてけぼりのアクセサ書くなら
もうオブジェクト指向やめれ。


12 :デフォルトの名無しさん:2009/07/20(月) 20:58:15
つーか、大量にそういうの使うってことかね?
やり方自体を変えた方が良さそうだけど。

13 :デフォルトの名無しさん:2009/07/20(月) 21:08:34
>>11
えっ?GET_SET_ACCESSORはメンバ変数へアクセス(set/get)するためのメンバ関数を作るマクロですけど?

14 :デフォルトの名無しさん:2009/07/20(月) 21:10:42
だ か ら

>>13
カプセル化置いてけぼりのアクセサ書くなら
もうオブジェクト指向やめれ。



15 :デフォルトの名無しさん:2009/07/20(月) 21:13:27
>>13
カプセル化知らないん?

カプセル化とは 【encapsulation】 - 意味/解説/説明/定義 : IT用語辞典
ttp://e-words.jp/w/E382ABE38397E382BBE383ABE58C96.html


16 :デフォルトの名無しさん:2009/07/20(月) 21:14:20
普通に考えたら、colorクラスのa,b,cとポイントクラスのx,y,zは
たまたま現在の実装がdoubleなだけで、意味するところは別物だから
同じにしようとは思わないと思うがなー

17 :デフォルトの名無しさん:2009/07/20(月) 21:15:13
setで引数のチェックしたり、getで何か処理するならGET_SET_ACCESSORは使えないけど、
単純に代入、returnするだけならGET_SET_ACCESSORでいいんじゃないの?

18 :デフォルトの名無しさん:2009/07/20(月) 21:18:47
>>17
>単純に代入、returnするだけ
それがカプセル化置いてけぼりにしてるってことなんじゃ

19 :デフォルトの名無しさん:2009/07/20(月) 21:22:19
>>17
頼むから、カプセル化のことも思い出してあげてください。


20 :デフォルトの名無しさん:2009/07/20(月) 21:24:43
単純に代入/returnするなら構造体でもいいけど
class使ったほうが利便性が良いならメンバ変数をprivateにしてアクセサを用意してあげれば良いんじゃないの?
で、いちいちset〜、get〜書くのが面倒ならGET_SET_ACCESSOR使えばって話なんだけど?

>>15
知ってるわ。

21 :デフォルトの名無しさん:2009/07/20(月) 21:33:20
>>20
じゃあ重要性を知らないって事?


22 :デフォルトの名無しさん:2009/07/20(月) 21:37:11
>>20
もう構造体とかクラスとか語る資格なさすぎる。
どこの言語使いだった人?


23 :デフォルトの名無しさん:2009/07/20(月) 21:38:59
あんまりいじめるなよ。

24 :デフォルトの名無しさん:2009/07/20(月) 21:39:54
>>22
C/C++/C#、Javaとか色々。カプセル化は情報隠滅も含むもんじゃないの?
本来は別々のものらしいけど、調べてもほぼ等価みたいな扱いしてるところ多いし。
たしか前スレでもそういうこと言ってたと思うけど。

25 :デフォルトの名無しさん:2009/07/20(月) 21:39:57
エスペラント語一級です。

26 :デフォルトの名無しさん:2009/07/20(月) 22:36:56
隠滅はマズいんじゃね?

27 :デフォルトの名無しさん:2009/07/20(月) 22:39:55
隠蔽は良くないよ

28 :デフォルトの名無しさん:2009/07/20(月) 22:42:07
なんだよ隠滅って隠滅はないわ。
○隠蔽
×隠滅
だねorz

29 :デフォルトの名無しさん:2009/07/20(月) 22:54:07
OS:XP
VisualStudio 2005 C++

バイナリファイルから文字列を抽出しようとしているのですがうまくいきません。
文字列は "amai_skin.dds" です。 直前にint型の文字数+null文字(14)が入っています。
抽出直前のブレークポイントでファイルポインタを覗くときちんとこの文字列が入っています。


int len;
fread(&(len), sizeof(int), 1, fp);

↓パターン1
char* tests = 0;
fgets(tests, len, fp); // 実行時エラー(Expression: (string!=NULL) || (cout==0))

↓パターン2
char* tests = 0;
fread(tests, len, 1, fp); // 実行時エラー(Expression: (buffer!=NULL))

↓パターン3
string tests;
fread(&(tests), len, 1, fp); // エラーは出ないが "n.dds" とだけしか格納されない

30 :デフォルトの名無しさん:2009/07/20(月) 22:56:55
>>29
ファイル入出力以前の問題。
http://www.kouno.jp/home/c_faq/c6.html
6.2や6.8を参照のこと。

31 :デフォルトの名無しさん:2009/07/21(火) 00:01:27
↓パターン4
vector<char> tests;
tests.resize(len);
fread(&(tests[0]), len, 1, fp);

で、無事取り出せました。多謝!

32 :デフォルトの名無しさん:2009/07/21(火) 01:49:52
文字を入れる領域が確保できてないよ。

× char* tests = 0;
○ char tests[256];

33 :デフォルトの名無しさん:2009/07/21(火) 13:57:47
いまさらですが、メンバを変更しないメンバ関数にはconstをつけるようにし始めました。
ただ、メンバを参照すらしない、ただの便利関数みたいなのがあるのですが、
これについてはconstではなく、staticメンバにするのがスジでしょうか?
便利関数を分類してまとめてライブラリにするのがまっとうな流れだとも思いますけど…

34 :デフォルトの名無しさん:2009/07/21(火) 14:01:40
>>33
static関数にするとクラス名に依存することになるので、
仮令そのインスタンスを参照していなくても密接に関わる関数ならconstメンバでいいと思う。
また、クラスそのものにも関係ないような関数ならそもそもメンバにしておかない方がいい。

35 :デフォルトの名無しさん:2009/07/21(火) 14:02:51
privateなstaticメンバ関数ならよく作ってるよ
もちろんstaticな便利関数をユーティリティクラスにまとめることもある
要するにどっちもアリ

36 :デフォルトの名無しさん:2009/07/21(火) 14:11:44
ご意見ありがとうございました。
クラスとの関係が強いものについてはconst、そうではないものについてはprivateなstaticにしようと思います。

メンバに入れるべきでは無いというのは重々承知しておりますが、当方、メンテのため。。やむを得ずです。

37 :デフォルトの名無しさん:2009/07/21(火) 19:49:05
#include <iostream>
using namespace std;
int x = 0;
class B {
public:
    B() : b(::x) {};
    virtual ~B() {};
    void func() {cout << __FUNCTION__":" << b << endl;};
    virtual void vfunc() {cout << __FUNCTION__":" << b << endl;};
private:
    int b;
};
class D : public B {
public:
    D() : d(::x) {};
    virtual ~D() {};
    void func() {cout << __FUNCTION__":" << d << endl;};
    virtual void vfunc() {cout << __FUNCTION__":" << d << endl;};
private:
    int d;
};
int main(void) {
    B& r = D();
    r.func();
    r.vfunc();
    x = 100;
    r = D();
    r.func();
    r.vfunc();
    return 0;
}

38 :デフォルトの名無しさん:2009/07/21(火) 19:49:46
B::func:0
D::vfunc:0
B::func:100
D::vfunc:0

2回目のD::vfuncが0になるのはどうして?

39 :デフォルトの名無しさん:2009/07/21(火) 20:15:55
まず、B& r = D();がコンパイルエラーにならない時点でダメ。もし、VCなら必ず/W4か/Zaを付けろ。

仮に、D d; B& r = d;だとして話を進める。
r = D();は左辺の型がB&だから、クラスBの暗黙に生成されるoperator =(const B&)が呼ばれる。
それは当然Bのメンバを代入するだけなので、r.dの値は変化しないというわけ。

40 :デフォルトの名無しさん:2009/07/21(火) 20:24:07
なるほど!d!

41 :デフォルトの名無しさん:2009/07/21(火) 22:27:54
すごいことかんがえたぞ!ぼくてんさい!あいちゃん!
もうたんじゅんなせったげったをかくひつようはないよ!
class Accessor {
protected:
template <typename T> class Proxy {
private:
T m_val;

public:
Proxy() : m_val() {}
Proxy(const T& val) : m_val(val) {}
Proxy(const Proxy& rhs) {m_val = rhs.m_val;}
Proxy& operator=(const Proxy& rhs) {m_val = rhs.m_val; return *this;}
operator T() const {return m_val;}
};
};

class Foo : public Accessor {
public:
Proxy<int> m_bar;
Proxy<double> m_baz;
};

int main(void) {
Foo foo;
foo.m_bar = 100;
foo.m_baz = 1.23;
cout << foo.m_bar << endl;
cout << foo.m_baz << endl;
return 0;
}

42 :デフォルトの名無しさん:2009/07/22(水) 19:24:57
OPENGL(c++でコーディング)の描画処理のなかの、
「(A型の変数) = (A型の変数)」(×約6000ループ)
という処理をわけあって、
「(A型の変数) = (vector< vector< A > >型の変数)」(×約6000ループ)
という処理に変えただけで滅茶苦茶重くなりました

データ量だけでなく、代入処理でも速度に違いが出てくるものなのでしょうか?

43 :デフォルトの名無しさん:2009/07/22(水) 19:33:00
A型の変数にvector< vector< A > >型の変数をいれられるの?

44 :デフォルトの名無しさん:2009/07/22(水) 19:34:40
代入演算子さえ書けば・・・

45 :デフォルトの名無しさん:2009/07/22(水) 19:50:56
書き方が悪かった・・・実際にはこんな感じです

// 軽いバージョン
A vertex;
A vertex_data[n];
B face[n];
for(int i=0;i<6000;i++){
for(int j=0;j<3;j++){
vertex = vertex_data[(face[i].v_index[j])];
}
}



// 重いバージョン
A vertex;
vector< vector<A> > vertex_data;
vector< vector<B> > face;
for(int i=0;i<1;i++){ // 必須の記述
for(int j=0;j<6000;j++){
for(int k=0;k<3;k++){
vertex = vertex_data[i][(face[i][j].v_index[k])];
}
}
}

46 :デフォルトの名無しさん:2009/07/22(水) 19:51:06
毎週ジャンプ1冊買って帰ってたのを
わけあって100冊買って帰るように
しただけで滅茶苦茶筋肉痛になりました

冊数だけでなく、歩き方でも体の負担に違いが出てくるものなのでしょうか?

47 :デフォルトの名無しさん:2009/07/22(水) 19:54:05
それだとそんなに重くならないような気がするなぁ
役に立てそうにない

48 :デフォルトの名無しさん:2009/07/22(水) 19:55:55
またデバッグバージョンとかいうオチじゃ・・

49 :デフォルトの名無しさん:2009/07/22(水) 20:06:12
アッー!

どっちもデバッグモードでした(・ω・)
ループ外の初期処理が相当重くなったんですが、
デバッグモードだとループ内の処理速度にも影響を及ぼすということでしょうか・・・?

50 :デフォルトの名無しさん:2009/07/22(水) 20:07:48
ちなみにリリースにするとどっちも速度はほぼ同じになりました(´д`;)

51 :デフォルトの名無しさん:2009/07/22(水) 20:11:45
ループ外が重くなったというのはさておき、
ループ内の処理速度が相当遅くなってることは明らかだったの?

52 :デフォルトの名無しさん:2009/07/22(水) 20:15:23
明らかでした。
1秒30フレームで動いていたものが1秒1フレームくらいになりました

53 :デフォルトの名無しさん:2009/07/22(水) 20:20:10
そっか。変なこと言ってスマソ。
リリースビルドでがんばれ?

54 :デフォルトの名無しさん:2009/07/22(水) 20:20:19
あ、ループ内の処理速度が遅くなった・・・のではなく、
実行時はループ外は関係ないので、ループ内の処理が重くなってるんだろう・・・と考えたのです

実際、ループ内の処理速度に違いがあるかはよくわかりません。
ただ、ループ外で大幅に処理を追加したので、そいつがデバッグモードだと実行時に常に影響を与え続けるのかな?という疑問です

55 :49:2009/07/22(水) 20:24:42
あ、言うの忘れてしましたが環境はXP、Visual Studio 2005です
念のため。

56 :デフォルトの名無しさん:2009/07/22(水) 20:26:47
vectorとかデバッグ時にはありがた迷惑なエラーチェックをたくさん入れてくれて遅くなるかもしれない
リリース時にはきれいさっぱり消え去ってあんまり影響ない

57 :デフォルトの名無しさん:2009/07/22(水) 21:40:22
>>56
VCだとReleaseでも有難迷惑なコードが大量にorz...


58 :デフォルトの名無しさん:2009/07/23(木) 00:50:22
Releaseでなんか残ったっけ?

59 :デフォルトの名無しさん:2009/07/23(木) 01:18:49
>>58
VC8から、Debug/Releaseの指定にかかわらず、
もれなくvector/dequeのoperator []やイテレータに範囲チェックが入るようになった。
それが要らないなら_SECURE_SCLを0と定義する。
http://msdn.microsoft.com/en-us/library/aa985896.aspx

60 :デフォルトの名無しさん:2009/07/23(木) 06:25:17
中身が同じ2つのメンバ関数が必要なんだがどうすればいい?
const T* hoge() const;
T* hoge();
それなりに長いんでコピーしたくない

61 :デフォルトの名無しさん:2009/07/23(木) 06:28:34
const_castして呼び出せ

62 :デフォルトの名無しさん:2009/07/23(木) 06:30:15
>>60
Effective C++くらい読もうよ。

63 :デフォルトの名無しさん:2009/07/23(木) 06:43:58
>>61 トン
>>62 前見たときこれは無理と思ったけどそろそろ読めるかも


64 :デフォルトの名無しさん:2009/07/23(木) 07:03:04
>>63
要するにthisをconst_castな
Effective C++の初版の21項
「使える時は、必ずconstを使おう」を読むと良い

65 :デフォルトの名無しさん:2009/07/23(木) 12:55:48
Effective C++は邦訳の改訂第2版しか持ってないんですが
初版の古本とか見たら買ったほうがいいですか

66 :デフォルトの名無しさん:2009/07/23(木) 15:05:34
>>65
改訂2版でいいよ
俺が言ったのは第3版との区別を付けるため

67 :デフォルトの名無しさん:2009/07/23(木) 15:18:33
こんな感じかえらい汚いなあ

template <class T>
class Test {
T i;
public:
Test(T t) : i(t) {}
T* func() {
return &i;
}
const T* func() const {
return const_cast<const T* const>(const_cast<Test<T>* const>(this)->func());
}
};

int main()
{
Test<double> t(123);
const Test<int> t2(456);

std::cout << *t.func() << std::endl;
std::cout << *t2.func() << std::endl;
}

68 :デフォルトの名無しさん:2009/07/23(木) 15:58:53
釣りか素か知らんが黙っとれ

69 :デフォルトの名無しさん:2009/07/23(木) 16:01:38
>>68
お馬鹿?

70 :デフォルトの名無しさん:2009/07/23(木) 17:09:54
釣り・・・だよなw

71 :デフォルトの名無しさん:2009/07/23(木) 17:32:59
iterator it;

(*it).guhehe();


なんで皆これを

it->guhehe();

にしないの?

72 :デフォルトの名無しさん:2009/07/23(木) 17:34:31
皆ってどの範囲の皆?

73 :デフォルトの名無しさん:2009/07/23(木) 17:51:33
>>71
エスパー回答すると、以前のSTLのイテレータは後者の
書き方ができなかった

74 :デフォルトの名無しさん:2009/07/23(木) 17:56:49
ファクトリメソッドに関してなんですけど、独習デザインパターンという本に
class FooFactoryBase {
    public: virtual Foo* create() = 0;
};
class HogeTypeFooFactory {
    public: virtual Foo* create() {return new HogeTypeFoo();}
};
int main(void) {
    FooFactoryBase* factory(new HogeTypeFooFactory());
    Foo* foo(factory->create());
    foo->vfunc();
    delete foo;
    delete factory;
}
とするとクライアントのほうの変更も少なくて便利だよ、みたいな事が書いてあったんですが
なぜこんなまどろっこしいことをするんでしょうか?関数ポインタを使って
typedef Foo* (*createFoo)();
HogeTypeFooFactory {
    public: static Foo* create() {new HogeTypeFoo();}
}
int main(void) {
    createFoo create(HogeTypeFooFactory::create);
    Foo* foo(factory->create());
    foo->vfunc();
    delete foo;
}
と、書いたほうがnew/deleteも少ないし、コードも短いし、仮想テーブルの分メモリも少なくてすむし
再コンパイルするのは新規のファクトリとそれを使うクライアントだけだし、いろいろと優れてるように思えます
継承を使って新しいファクトリを作る利点ってほかに何かあるんでしょうか?

75 :デフォルトの名無しさん:2009/07/23(木) 18:19:31
答えは簡単、Javaには関数ポインタがないからさ

76 :デフォルトの名無しさん:2009/07/23(木) 18:28:43
んー、どっちでもいいような気もするねぇ。
ところで、関数ポインタ版の
Foo* foo(factory->create());は
Foo* foo(create());じゃないの?

77 :デフォルトの名無しさん:2009/07/24(金) 14:22:04
>>66
回答ありがとうございます。ちょっと安心しました。

Efecctive C++第3版も買いたいと思ってますけど、
Amazonレビューみるかぎり翻訳がよくないらしいですね…

78 :デフォルトの名無しさん:2009/07/24(金) 14:44:16
そお?悪くはなかったよ。
改定第2版を訳してる吉川邦夫先生に比べると落ちるというだけで。
少なくともMore Effective C++よりは数段いいし、
Effective STLと比べても良く出来てる。

79 :デフォルトの名無しさん:2009/07/24(金) 15:14:25
>>77
翻訳はそこまで悪くない。
Amazonのレビューは鵜呑みにしないほうが良いと思う。

80 :デフォルトの名無しさん:2009/07/25(土) 11:36:01
#include <iostream>

namespace name1 {
void func() {std::cout << __FUNCTION__ << std::endl;}
};

namespace name2 {
void func() {std::cout << __FUNCTION__ << std::endl;}
};

int main(void) {
using name1::func;
func();
func();
func();

using name2::func;
func();
func();

return 0;
}

こんな感じでusingを使いたいんですが、名前が競合していけませんよといわれました
前回のusingをキャンセルする、上書きする方法はありませんか?

81 :デフォルトの名無しさん:2009/07/25(土) 12:02:02
>>80
int main(void) {
{
using name1::func;
func();
func();
func();
}
{
using name2::func;
func();
func();
}
return 0;
}
これじゃ駄目なの?

82 :デフォルトの名無しさん:2009/07/25(土) 12:09:49
その手がありましたか!
関数ポインタ使うところまでは考えたんですがこれのほうがわかりやすくていいですね

83 :デフォルトの名無しさん:2009/07/25(土) 17:42:12
class Point{
double m_x,m_y;
Point():m_x(0.0),m_y(0.0){};
};
Triangle{
Point m_p[3];
Triange():((m_p(){Point()});
};
上のような感じで、Triangleのコンストラクタでm_p[]の初期化を行いたいのですが、
やり方がよくわかりません。m_p[]をうまく初期化する方法はないでしょうか

84 :デフォルトの名無しさん:2009/07/25(土) 17:53:36
C++にて

double型の変数xが
確実に正の数(0でないことも負でないこともわかっている)であるとき、
それを10進表示した整数部分の桁数を求める
最も良い(簡単&速い&標準C++準拠)な方法は何でしょうか?



85 :84:2009/07/25(土) 17:55:48
追記
  文字列表示させる方法もありで。


86 :デフォルトの名無しさん:2009/07/25(土) 18:09:17
10以下になるまで10で割って割った回数を計ったりするのが一般的
データの分布がdoubleの表現範囲で一様なら二分探索のほうが早いかな

87 :84:2009/07/25(土) 18:18:42
>>86
俺はいつも(って程でもないが)
std::log10でやったりしているんだけど
そっちの方が速いのかね?


88 :デフォルトの名無しさん:2009/07/25(土) 18:22:25
%sで文字列にして.までの数を数える。

89 :84:2009/07/25(土) 18:24:11
>>86
ありがとうございます。
それが一般的なのですね。

>>87
参考にさせていただきますが、
なりすましはご遠慮ください。

>>88
それもありですね。
ありがとうございます。

90 :デフォルトの名無しさん:2009/07/25(土) 18:28:38
>>86
それって一般的なのかね。

91 :デフォルトの名無しさん:2009/07/25(土) 20:22:11
>>86 は無いだろう
そんなコード書いてきたら突っ返す

92 :デフォルトの名無しさん:2009/07/25(土) 21:01:41
>>84
浮動小数点の指数部を取り出して0.3を掛ける。


93 :デフォルトの名無しさん:2009/07/25(土) 21:27:25
>>92
標準C++準拠だとして、それで行けるの?

94 :デフォルトの名無しさん:2009/07/25(土) 22:13:22
1000までの数で5a+7b+11c+13d+17e(aからeは0以上の整数)で表せる
全ての数のリストを求めるにはどうすれば良いですか


95 :デフォルトの名無しさん:2009/07/25(土) 22:25:04
LinuxでC++のプログラム開発するときって、
今は、どうするのが普通?

Eclipseとか使うものなのか?

俺が、大昔にやったときは、Emacs上で全てをシコシコ
してたが、時代は変わってない?

96 :デフォルトの名無しさん:2009/07/25(土) 22:26:20
>>94
深さ優先探索の考え方でできるよ

97 :デフォルトの名無しさん:2009/07/25(土) 22:26:21
>>83
現在は残念ながら一般的には無理。
ただし、デフォルト初期化で良ければ、Triange(): m_p() {}とは書ける。

>>93
std::frexpが使えると思う。

98 :デフォルトの名無しさん:2009/07/25(土) 22:32:18
>>94
表せない数が1 2 3 4 6 8 9だけじゃねーかw

99 :デフォルトの名無しさん:2009/07/25(土) 22:42:21
まじっすか
実際は問題がもっと複雑で、5,7,11,13,17が
数千個の合成数になります
ただ、考え方は一緒かと思って簡略化してしまったもので

とりあえず深さ優先探索で頑張ってみます


100 :83:2009/07/25(土) 23:01:22
>>97
int型の配列を初期化しているサンプルを見つけたので
似たようにして初期化できないか苦しんでました。デフォルト値では初期化できるんですね
とりあえず諦めます。ありがとうございました。

101 :デフォルトの名無しさん:2009/07/25(土) 23:02:16
数千個・・・って逆に表せない数字減るんじゃねーか?
一回表せた数字の整数倍は全部表せるから
幅優先でやって倍数をチェックしたほうが早くなると思う

102 :デフォルトの名無しさん:2009/07/25(土) 23:02:29
>>100
現行のC++では無理。
ごまかしで良ければboostで出来たと思う。

103 :デフォルトの名無しさん:2009/07/25(土) 23:20:07
#include <iostream>

class hoge {
private:
    struct fuga {
        fuga(int num[3], int v1, int v2, int v3) {num[0] = v1; num[1] = v2; num[2] = v3;}
    };

    fuga m_fuga;
    int m_num[3];

public:
    hoge(int v1, int v2, int v3) : m_fuga(m_num, v1, v2, v3) {
        std::cout << v1 << std::endl;
        std::cout << v2 << std::endl;
        std::cout << v3 << std::endl;
        };
};

int main(void) {
        hoge h(1, 2, 3);

        return 0;
}

なんか使うのが不安なコードだ・・・
コンストラクタ1回分無駄にするのを承知で素直に{}のなかで代入したほうがいいってことかな
つーか配列の数わかってて数も少ないならint num1, num2, num3;とかで十分だよね

104 :デフォルトの名無しさん:2009/07/25(土) 23:45:48
    struct fuga {
        fuga(int num[3], int v1, int v2, int v3) {num[0] = v1; num[1] = v2; num[2] = v3;}
    };

の num[3] はどこから拾ってきたのかしら

105 :94:2009/07/25(土) 23:59:15
やっと出来た
現時点でlimit=10000で50秒ぐらいかかるのでこれじゃ解けなさそう(しかもlimit周辺の値は若干不正確)
幅優先探索って、エラトステネスの篩みたいなやり方?

void solve(VI& v,set<int>& r,int limit){
VI tmp;
int m=*max_element(r.begin(),r.end());
int n=*min_element(v.begin(),v.end());
copy(r.begin(),r.end(),back_inserter(tmp));
for(int i=0;i<v.size();++i){
transform(tmp.begin(),tmp.end(),inserter(r,r.begin()),bind1st(plus<int>(),v[i]));
}
if(n+m<limit){solve(v,r,limit);}
}

//vは{5,7,11,13,17}
//rに結果が入る
solve(v,r,1000);

106 :デフォルトの名無しさん:2009/07/26(日) 00:03:31
追記:rの初期値も{5,7,11,13,17}

107 :デフォルトの名無しさん:2009/07/26(日) 06:41:59
>>95
プロジェクトによるけど、viとmakeでやってるところも普通にあるよ。
開発にEclipse使うばあいでも、Eclipseインストールしてなくても
ビルドできるようにしておくことが多い。

108 :デフォルトの名無しさん:2009/07/26(日) 12:28:08
>>94
なんか題意を正しく把握できてるか不安だが、こんなんでどうよ?

#include <stdio.h>

#define N 1000

char list[N+1];
int num[5] = {5,7,11,13,17};

void f(int n, int pos)
{
int i;

list[n] = 1;
for(i=pos; i<5; i++) {
int temp = n + num[i];
if(list[temp]) continue;
if(temp > N) return;
f(temp, i);
}}

int main(void)
{
int i;

f(0,0);

for(i=0; i<=N; i++) if(list[i]) printf("%d ", i);

return 0;
}

109 :デフォルトの名無しさん:2009/07/26(日) 12:46:35
>>108
>>99
数千個らしいよ

110 :デフォルトの名無しさん:2009/07/26(日) 19:34:33
なんでもかんでもクラス化するのって逆に害ですよね?
ビットフラグとかむき出しのほうがいいと思うんですけど

111 :デフォルトの名無しさん:2009/07/26(日) 19:55:16
>>110
確かに
> なんでもかんでもクラス化
は害になることもあるよ。

でも「なんでもかんでもクラス化すべきでない」っていう人の
大概は、「適切な対象でもクラス化できる技量がない」人だったりするんだよね。

112 :デフォルトの名無しさん:2009/07/26(日) 20:11:44
>>110 何でもかんでもクラス化するべきですよ。ビットフラグなんか特に。

113 :デフォルトの名無しさん:2009/07/26(日) 21:36:50
1次元で確保された配列を二次元とみなして使うとして
このとき配列Aの(x1, y1)から(x2, y2)のデータを配列Bの(X, X)から(X+(x2-x1), Y+(y2-y1))にコピーしたい時は
ループまわしてひとつひとつコピーするしかないでしょうか

114 :デフォルトの名無しさん:2009/07/26(日) 21:51:27
>>113
基本的にはそう。
環境によってはSIMD使って16byteまとめて転送
の様な高速化はできるけど。

115 :デフォルトの名無しさん:2009/07/27(月) 13:25:52
>>113
せめてX方向1ライン分くらいmemcpyしたら?

116 :デフォルトの名無しさん:2009/07/27(月) 13:43:11
>>113
x方向にデータが連続していると言う条件はつくけど、std::copyでも使えばいいんでない。
# cなら>115で。

117 :デフォルトの名無しさん:2009/07/27(月) 13:50:18
そうですね組み込み以外でもつかうんでstd::copyします
>>115,>>116どうもでした

118 :デフォルトの名無しさん:2009/07/27(月) 19:18:23
C++
コンソールで、カーソルの位置を一行上に挙げたいのだが。
エスケープシーケンスは使えん。
使えるように設定できるのは知ってるが、別の方法で頼んだ。

119 :デフォルトの名無しさん:2009/07/27(月) 19:21:34
で、その結果は?

120 :デフォルトの名無しさん:2009/07/27(月) 20:32:20
shared_ptrって

(*p).hoge() と p->hoge();ってどっちがいいの?

121 :デフォルトの名無しさん:2009/07/27(月) 21:01:46
p->hoge();


122 :デフォルトの名無しさん:2009/07/27(月) 21:46:51
>>120
何のためにアロー演算子があると思っているのだ。
p->hoge()
が望ましい。

123 :助けて:2009/07/27(月) 22:16:07
10進数から2進数に変える時、2進数を補数表現で表すプログラムを教えて下さい。

ドシロウトなんで、お願いします。

124 :デフォルトの名無しさん:2009/07/27(月) 22:19:51
>2進数を補数表現で表す
???????????????

125 :デフォルトの名無しさん:2009/07/27(月) 22:39:30
>123

十進数 -10 を変換したとして
-1010 ではなく 1111111111110110 と表示したいのか?

126 :デフォルトの名無しさん:2009/07/27(月) 22:49:21
補数って、1の補数とか2の補数ってやつだよな。
もう忘れた。

127 :デフォルトの名無しさん:2009/07/27(月) 22:53:44
>>123
signed intなりsigned longに代入したあとに1ビットずつビット演算で取り出す

128 :助けて:2009/07/27(月) 22:54:36
>125

はい。その通りです。

129 :デフォルトの名無しさん:2009/07/27(月) 23:05:28
class hoge {
private:
int *p;

public:
hoge(int x) : p(new int[x]) {}
~hoge() {delete [] p;}
void fuga() {・・・}
};

int main(void) {
try {
std::cin >> x;
hoge h(x);
}
catch(std::bad_alloc& e) {
std::cout << e.what() << std::endl;
}

h.fuga();

return 0;
}

↑スコープが外れちゃうからh.fuga()でコンパイルエラーになってしまう
自動変数に対してtry-catchする場合はtryスコープを伸ばすしかない?
保守性を考えて自動変数からスマートポインタに変えるのがいいのかな?

130 :デフォルトの名無しさん:2009/07/27(月) 23:18:10
>>128
#include <bitset>
#include <iostream>

using namespace std;

int main() {
const unsigned long value = 10;

bitset< 16 > b( value - 1 ), result;
result = ~b;
cout << result.to_string() << endl;
}

131 :デフォルトの名無しさん:2009/07/27(月) 23:23:38
>>129
君が try しているのは hoge オブジェクトじゃないのか?
それなのに、どうして try の外でそのオブジェクトを使おうとするのだ…。

132 :デフォルトの名無しさん:2009/07/27(月) 23:41:46
tryしたいのは生成だけなのに延々としたまでスコープを伸ばしたくないんです
tryスコープの中って処理重くなりそうだし、できるだけ短くしたほうがよかないですかね?

133 :デフォルトの名無しさん:2009/07/27(月) 23:44:25
catchは下のほうにまとまってたほうがよかないか?

134 :デフォルトの名無しさん:2009/07/27(月) 23:46:42
tryの中だから遅くなるなんてことはない。
実装にもよるが、tryに入るとき、抜けるとき、throwするとき、(catchして)catch節を抜けるときなど
基本的に要所要所でしかコストはかからないとみていい。

135 :デフォルトの名無しさん:2009/07/27(月) 23:47:17
>>132
わかるわかる。
自転車がパンクしてるかどうかをチェックしたいし、その結果は大事だけど、その後はもちろん自転車に乗るってことだよね

136 :デフォルトの名無しさん:2009/07/27(月) 23:51:54
あ、あんまし遅くならないんですね
ずっと中の人が監視してなにか操作するたびチェックしてるのかと思ってた・・・
とすると
void func() {
    try{
        // 全処理
    }
    catch(ex1 &e) {
        // 〜
    }
}
    catch(...) {
        // 〜
    }
}
みたいにやるほうがいいのか
どうもどうも。すっきりしました

137 :助けて:2009/07/28(火) 00:01:45
>130

ありがとです

138 :デフォルトの名無しさん:2009/07/28(火) 09:48:09
なんでC++の標準ライブラリのヘッダって、.h って統一的なファイル名の
つけ方をやめちゃったの?
拡張子ついてないから、扱いつらくない?

139 :デフォルトの名無しさん:2009/07/28(火) 10:27:12
>>138
多分苦肉の策だと思う

140 :デフォルトの名無しさん:2009/07/28(火) 11:01:49
>>138
標準化委員会に言ってくれ。

まあ一応 統一的に(一様に).h付いてないから
俺は許せるけど。

141 :デフォルトの名無しさん:2009/07/28(火) 11:17:45
>>138
それがファイルでなくても構わないから。

142 :デフォルトの名無しさん:2009/07/28(火) 11:23:14
タイプ量が減ってありがたいじゃないか。

143 :デフォルトの名無しさん:2009/07/28(火) 11:35:21
>>141
その点は、Cの.hも同じですがね。

144 :デフォルトの名無しさん:2009/07/28(火) 14:02:41
.hppが一番クール

145 :デフォルトの名無しさん:2009/07/28(火) 14:20:10
>>138
Effective C++の49項を見る限りは、.hと差別化する最も単純な方法として
拡張子を無くす案が採られたみたいだね。

146 :デフォルトの名無しさん:2009/07/28(火) 15:03:46
hxxじゃだめだったんかな

147 :デフォルトの名無しさん:2009/07/28(火) 15:08:47
画面に指定した座標の点をプロットしたいのですが、
そういったことが出来る簡単なC++ライブラリはありますか?


148 :デフォルトの名無しさん:2009/07/28(火) 15:11:05
DXライブラリを使いましょう

149 :デフォルトの名無しさん:2009/07/28(火) 15:11:10
Win32API

150 :デフォルトの名無しさん:2009/07/28(火) 15:13:10
ありがとうございます。
DirectXスレかAPIスレに逝ってきます

151 :デフォルトの名無しさん:2009/07/28(火) 15:39:11
>147がLinux使いだったら大笑いだな。まさしく、井蛙の愚だ。

152 :デフォルトの名無しさん:2009/07/28(火) 15:44:43
>>151
敢えて触れない方がいいと思ったけど、とっても気になったので理由を聞かせてもらおうか

153 :デフォルトの名無しさん:2009/07/28(火) 16:05:34
>>151
何で?


154 :デフォルトの名無しさん:2009/07/28(火) 16:18:05
DXライブラリもWinAPIもWindows用だからだろ。JK

155 :デフォルトの名無しさん:2009/07/28(火) 16:22:26
MACかもしれないといってみるテイスト

156 :デフォルトの名無しさん:2009/07/28(火) 17:14:57
それがなんで井蛙の愚につながるの?
誰も井の中の蛙ではなくないか?

157 :デフォルトの名無しさん:2009/07/28(火) 17:17:58
自身の環境を書かない>147や、Windowsだと決めて掛かる>148-149をからかったんだろうけれど、
顧みすれば>151自身が井の中の蛙になっている罠。

158 :デフォルトの名無しさん:2009/07/28(火) 17:22:37

井(い)の中の蛙(かわず)大海(たいかい)を知らず

自分の狭い知識や考えにとらわれて、
他の広い世界のあることを知らないで
得々としているさまをいう。
井蛙(せいあ)。

まあ・・・なんかどうでも良くなってきた。

159 :デフォルトの名無しさん:2009/07/28(火) 17:24:58
PC
デバイスA デバイスBでシリアル通信する。

PCからはデバイスA,Bに対して交互に1S間隔で
リードコマンドを発行している。
AまたはBがある状態になるとリードコマンドに対して
1バイトの'b'を返すようになる。
デバイスA、Bともには電源立ち上げ時バージョン情報等を
PCに送るがその文字列の中に'b'が含まれている。
PC側はリードコマンドに対する応答の'b'だけを判断したい。
デバイスA,Bの電源立ち上げ時の情報は固定ではく、'b'が
含まれているとする。
このような内容だとどのようにコマンドに対する応答の'b'
であると判断するのがよいでしょうか?

160 :デフォルトの名無しさん:2009/07/28(火) 17:32:02
PCのリードコマンドを出す前にPCの受信バッファを空にしておくとか?

161 :デフォルトの名無しさん:2009/07/28(火) 17:36:31
>>157
決めてかかったわけじゃないですよ
質問者が使う環境じゃなきゃ質問者は勝手に捨て置くでしょ

162 :デフォルトの名無しさん:2009/07/28(火) 18:21:09
掛け声みたいだな
「無礼者め手打ちにしてくれる、井蛙(せいあー)!!」

163 :デフォルトの名無しさん:2009/07/28(火) 19:43:24
DXライブラリでゲームを作り始めたのですが、
メインループの書き方がおかしくないか不安です ><

#include "GV.h"

int WINAPI WinMain(
HINSTANCE hI,HINSTANCE hP,
LPSTR lpC,int nC
)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;

Flame* T = new Flame;
SetDrawScreen(DX_SCREEN_BACK);
while(!(ProcessMessage()) && !(CheckHitKey(KEY_INPUT_ESCAPE))
&& (T -> MainLoop()) && !(ScreenFlip()) && !(ClsDrawScreen()));

DxLib_End();
return 0;
}
こんな感じなんですが・・・・


164 :デフォルトの名無しさん:2009/07/28(火) 19:48:27
もしかして: Frame

165 :デフォルトの名無しさん:2009/07/28(火) 19:50:52
うわぁ・・・・
勢いだけで作成中なので英語力のなさが出た結果だとしか・・・
orz(それでもゲームを作りたいんです)

166 :デフォルトの名無しさん:2009/07/28(火) 19:54:48
Yahoo!辞書 - flame
ttp://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=Flame&dtype=1&dname=1na&stype=0&pagenum=1&index=02737600


167 :デフォルトの名無しさん:2009/07/28(火) 20:03:24
殻っていみのフレームのつもりがフレイムになってたなんて・・・
もしかしてこの質問ってスレチってやつでしょうか?

168 :デフォルトの名無しさん:2009/07/28(火) 20:26:56
ゲームプログラムなら俺に聞け ってスレがあるよ

169 :デフォルトの名無しさん:2009/07/28(火) 20:28:48
ゲ製の方を紹介してやれよ

170 :デフォルトの名無しさん:2009/07/28(火) 20:46:04
ここより雰囲気のいいスレッドが見つけられないオ↓レ↑は、
専ブラで2chを覗く程度の初心者です。

171 :163:2009/07/28(火) 21:31:24
とりあえず
ttp://pc11.2ch.net/test/read.cgi/gamedev/1238429676/
こっち行ってみます。ふんいきこわいけど・・・

スレチすマソでしたー。



172 :デフォルトの名無しさん:2009/07/28(火) 23:21:22
classの全部のメソッドで通常の例外チェック再スローと
STLなどの外部ライブラリが出すかもしれない把握できない例外用のcatch(...){throw UnknownException();}
をやってるんですが、やりすぎでしょうか?
例外ってドキュメントが少なくてどうやればいいのかなかなか方針が定まりません

173 :デフォルトの名無しさん:2009/07/28(火) 23:51:33
>>172
どう考えるかによるんじゃね?
例えばSTLの投げる例外ならそのままthrow;で外に再送してあげた方が
むしろ親切では?


174 :デフォルトの名無しさん:2009/07/29(水) 00:33:01
カプセル化の事を考えて例外も隠蔽して
指定したもの以外出さないほうがいいかなぁと思ったんですが・・・

175 :173:2009/07/29(水) 07:23:08
>>174
例外クラスは知ってるよね?
例えば
C++編(標準ライブラリ) 第27章 例外クラス
ttp://www.geocities.jp/ky_webid/cpp/library/027.html
std::exceptionクラスを継承したものについては
そのまま投げてあげた方が。。
まあ再送しなくても内部で処理できる問題だったらいいけど、
そうでなくて全部例外を飲み込んでUnknownException();にしちゃうのは
どうだろう?

だれか他の方も意見くださいな。

176 :デフォルトの名無しさん:2009/07/30(木) 19:50:12
shared_ptr<> でnew deleteがほんとに1対1になってるか確かめたいんですけど
グローバル変数を用意してコンストラクタで++、デストラクタで--とすればいいのかなと思うんですが
これだと組み込み型のカウントをするのに困ります。どうすれば良いでしょうか?

177 :デフォルトの名無しさん:2009/07/30(木) 21:00:36
>>176
グローバルなoperator newとoperator deleteを定義すればいいと思う。

178 :デフォルトの名無しさん:2009/07/30(木) 21:08:40
>>176何故?何のため?


179 :デフォルトの名無しさん:2009/07/30(木) 22:07:31
コードを重複して書くのがいやなのでtemplateで書いた
けど公開するのは、例えば<int>と<double>だけに限定したい
こんなときはどうすればいい?

class Hoge {
private:
template <typename T> class Fuga {};

public:
typedef Fuga<int> _IntFuga;
typedef Fuga<double> _DoubleFuga;
};

typedef Hoge::_IntFuga IntFuga;
typedef Hoge::_DoubleFuga DoubleFuga;

これよりいい方法あったら頼む!

180 :デフォルトの名無しさん:2009/07/30(木) 22:13:07
明示的な実体化をした実装を別ファイルに移して、
クライアントコードから見えなくする

181 :デフォルトの名無しさん:2009/07/30(木) 22:54:19
>>180
いまいちわからないんだけど、

hoge.h
template < typename Type > class Hoge ;
template <> class Hoge< int > ;
template <> class Hoge< double > ;

hoge.cpp
#include "hoge.h"
template <> class Hoge< int > {} ;
template <> class Hoge< double > {} ;

main.cpp
#include "hoge.h"
int main( void ) { Hoge< int > ihoge ; Hoge< double > dhoge ; /* 〜 */ ; return 0 ; }

みたいな感じ・・・?
これだと結局重複したコードを書いてるから意味無いような
やりかたが間違ってるのかな?

182 :デフォルトの名無しさん:2009/07/30(木) 22:58:33
ていうか↑コンパイルできないですね
もうちょっと勉強してきます

183 :デフォルトの名無しさん:2009/07/30(木) 23:01:13
template関連はごちゃごちゃしてるので記憶が曖昧だが許してくれ。

hoge.h
template < typename Type > class Hoge;

hoge.cpp
template < typename Type > class Hoge { } ;
template class Hoge < int > ;
template class Hoge < double > ;

main.cpp
(同じにつき略)

184 :デフォルトの名無しさん:2009/07/31(金) 02:13:34
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a(20);
public:
};

class内で固定長のclass型の配列を作りたいのですが
VC++で
error C2059: 構文エラー : '定数'
というエラーを吐かれてしまいます
このような場合どうすれば良いのでしょうか

185 :デフォルトの名無しさん:2009/07/31(金) 02:22:50
>>184
コンストラクタ初期化子
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a;
public:
hoge() : a(20) {}
};

186 :デフォルトの名無しさん:2009/07/31(金) 02:23:01
vectorはそもそも配列じゃないですし
可変長なので固定長にもなりません。^^
vectorではなく、配列を使ってください。
hoge_sub a[20]; のようにするのです。

187 :デフォルトの名無しさん:2009/07/31(金) 02:52:31
>>185,186
ありがとうございます
class型の配列を扱いたいなと思った時に調べましたところ
vectorを使う方法が紹介されてましたので、誤って認識していました


188 :デフォルトの名無しさん:2009/07/31(金) 07:17:30
>>187
せめて入門書一冊分くらいは基礎を学んでおいた方がいいとおもうぞ。

189 :デフォルトの名無しさん:2009/07/31(金) 22:45:01
>>188
入門書として適切なものを教えてください。
いや、手元には独習がありますが、ぜんぜん足りないような気がしているのです。

190 :デフォルトの名無しさん:2009/08/01(土) 00:53:20
ハーバートシルト先生に教えてもらっておいてまだ足りないとな?

191 :デフォルトの名無しさん:2009/08/01(土) 08:06:09
独習C++なんて捨ててaccelerated C++とexceptional C++を読むんだ

192 :デフォルトの名無しさん:2009/08/01(土) 10:16:59
独習C++半分ぐらい読んで、EffectiveC++、More〜を全部読んで、独習デザインパターンも半分ぐらい読んで、ゲーム作る程度にはそれで十分だった

193 :デフォルトの名無しさん:2009/08/01(土) 10:36:12
あまりの糞さに独習(ryは半分で飽きたということですね…わかります

194 :デフォルトの名無しさん:2009/08/01(土) 11:42:47
マナたん(藁)→ロベールの次に読めるまともな本を教えて下さい

195 :デフォルトの名無しさん:2009/08/01(土) 18:27:53
#include <iostream>

class hoge {
private:
int x;

private:
class in_hoge {
public:
in_hoge() {std::cout << x << std::endl;}
};

in_hoge ihoge;

public:
hoge() : x(100), ihoge() {}
};

int main(void) {
hoge h; // output: 100

return 0;
}

コンパイルできないんだけど、どうやれば実装できるかな?

196 :デフォルトの名無しさん:2009/08/01(土) 18:36:36
>>195
in_hogeのコンストラクタにxを渡せばいいんじゃね?

197 :デフォルトの名無しさん:2009/08/01(土) 18:51:33
in_hogeの配列を確保する予定なので、コンストラクタに引数を渡せないのです・・・

198 :デフォルトの名無しさん:2009/08/01(土) 18:57:14
配列使うかわりにvector使えばいいんじゃね?

199 :デフォルトの名無しさん:2009/08/01(土) 21:48:17
stringのreserve()ってメモリをここでいっぺんに確保して後の操作で動的確保をなるべくしないようにってことでいいの?
resize()との違いがようわからん

200 :デフォルトの名無しさん:2009/08/01(土) 21:48:44
http://d.hatena.ne.jp/Isoparametric/20080117/1200575103

忍法ししちょびれ。

201 :デフォルトの名無しさん:2009/08/01(土) 21:50:28
>>199
Yes, 高洲クリニック。
reserveは指定したサイズになるように「空き容量」を増やす。
resizeは指定したサイズになるように要素の数を増やすか減らす。
増えた要素は例えば0で埋められるし、減らされた要素は削除される。

202 :デフォルトの名無しさん:2009/08/02(日) 18:41:23
VS C++ 2008 EE で コマンドラインから cl をつかってコンパイルする方法はないものですか?
パスをとおし、バッチファイルvcvers32.bat を実行しただけはうまくいかないようです。

203 :デフォルトの名無しさん:2009/08/02(日) 18:45:50
>>202
それだけでできると思うけど、スタートメニューの中に
Visual Studio 2008 コマンドプロンプトとかいうのがあるはず。そっちが確実。

204 :202:2009/08/02(日) 18:49:23
自己解決です。
http://msdn.microsoft.com/ja-jp/library/ms235639.aspx
に詳細がありました。でも専用のcmd を使わないとダメなようです。cygwin プロンプトから実行というわけにはいかないようです。


205 :202:2009/08/02(日) 18:50:11
>> 203
ありがとうございます。

206 :デフォルトの名無しさん:2009/08/02(日) 19:01:09
Javaスレ、 C++スレ迷いましたが、上のほうの板は荒れ気味なのでここで質問させてください。宜しくお願いします。
g++ (GCC) 4.2.4 です
java からC++ で作ったプログラムを使いたいのですが、どのような手順で作成すれば良いのでしょうか、
参考になるHP とかがあれば教えてもらえませんか。

207 :デフォルトの名無しさん:2009/08/02(日) 19:01:53
>>204
Cygwin上で使いたいのなら、自分で環境変数INCLUDEとLIBとPATHを設定すればいい。
C++/CLIを使うならLIBPATHも。
内容はVisual Studioコマンドプロンプトの丸写しでいい。

あるいは、Visual Studioコマンドプロンプト上でCygwin.batを呼んで起動するという手もある。

208 :デフォルトの名無しさん:2009/08/02(日) 19:02:37
>>206
まずはJNIでググるんだ。
よく分からなかったら、どこがどう分からないかを書き添えてもう1度聞きに来るといい。

209 :デフォルトの名無しさん:2009/08/02(日) 19:16:43
>>208 さん、早速の回答ありがとうございます
やはりやり方といいますかjava で呼び出すことができるんですね、よく分かりました
Windows でもLinux でもdll を作成してJava Native Interface 機能を用いて呼び出すことができるんですね、どうもありがとうございました。

210 :デフォルトの名無しさん:2009/08/02(日) 23:29:35
質問です。
C++でソケット使ったメール送信プログラム組んでます。

ループ内でコネクト・ライト・シャットダウン、クローズを
繰り返して複数メールの送信をしているのですが、
データ量が有る場合に送信されずにクローズしてしまいます。
送信バッファの指定・リンガ設定もしたのですが、変わりませんでした。
ソケット内での解決法やロジックでの解決法があれば
教えて下さい。。

211 :デフォルトの名無しさん:2009/08/02(日) 23:32:05
ソースを晒さないとなんとも

212 :デフォルトの名無しさん:2009/08/03(月) 00:54:59
>>210
パケットダンプ追えば、何がおきてるかわかるんじゃね?

213 :デフォルトの名無しさん:2009/08/03(月) 01:47:48
関数の終了コード(errnoとか)は見てる?

214 :デフォルトの名無しさん:2009/08/03(月) 16:07:40
msdnのドキュメントなんだが、関数別に投げる可能性のある例外とか書いてあるページって無いものかな?
知りたかったらいちいちソース読まないといけないんだろうか・・・

215 :デフォルトの名無しさん:2009/08/03(月) 16:18:48
ないよー

ちなみに何の関数について知りたい?

216 :デフォルトの名無しさん:2009/08/03(月) 16:36:11
>>215
今回知りたいのはtr1のmt19937とuniform_intですけど、ほかのも結構頻繁に気になります

217 :デフォルトの名無しさん:2009/08/03(月) 18:19:23
最近の SDK には boost が含まれてるのか?

218 :デフォルトの名無しさん:2009/08/03(月) 20:18:14
0xだろ

219 :デフォルトの名無しさん:2009/08/03(月) 21:48:05
>>217
0xの先取りTR1
randomのほかshared_ptr, regex, unordered_map/setなんかのライブラリが入っている。

VC++では2008に拡張パックまたはSP1で導入できる。
http://msdn.microsoft.com/ja-jp/library/bb982198.aspx

220 :デフォルトの名無しさん:2009/08/03(月) 21:52:33
VC++のSTLのソースってすごい見づらい

221 :デフォルトの名無しさん:2009/08/04(火) 17:33:29
関数オブジェクトとかよくいうけど関数ポインタでいいじゃんっておもう
なにがすごいのこれ?

222 :デフォルトの名無しさん:2009/08/04(火) 17:44:50
インライン展開できる

223 :デフォルトの名無しさん:2009/08/04(火) 19:34:41
インスタンスが持てる

224 :デフォルトの名無しさん:2009/08/04(火) 21:34:17
operator =ってコピコンみたいに継承元のコピー勝手に呼んでくれる、みたいな思いやりの精神は無いの?

225 :デフォルトの名無しさん:2009/08/04(火) 21:47:11
コピコンにそんな機能あったのか

226 :デフォルトの名無しさん:2009/08/04(火) 21:51:21
ないはず
勝手に呼ばれるのは継承元のデフォコンでは?

227 :デフォルトの名無しさん:2009/08/04(火) 22:12:57
おまえら普通にコピコンとかデフォコンとかやめてください

228 :デフォルトの名無しさん:2009/08/04(火) 22:13:45
Base::operator=を最初に呼ばないといかんのかめんどくさいな

229 :デフォルトの名無しさん:2009/08/04(火) 22:15:28
じゃあシスコンで

230 :デフォルトの名無しさん:2009/08/04(火) 22:18:21
デスコンとか超強そう

231 :デフォルトの名無しさん:2009/08/04(火) 22:22:29
デスコン使うとか必死ですねwww

232 :デフォルトの名無しさん:2009/08/05(水) 13:07:10
例外って難しいです・・・

233 :デフォルトの名無しさん:2009/08/05(水) 16:30:13
さじを投げてるだけじゃん。
誰かが拾って続きやるかもしれないけど、そいつもさじ投げるかもね。

234 :デフォルトの名無しさん:2009/08/05(水) 22:01:09
Enterを押したら処理が進むようにするにはどのようにすれば良いのでしょうか?
char dammy;
cin >> dammy;
cout >> "Hit";

のようにしてもEnterだけだと入力を受け付けられず、
なにか文字をいれてEnterをおさないと進みません。
よろしくおねがいします。

235 :デフォルトの名無しさん:2009/08/05(水) 22:47:39
int dummy;
dummy = cin.get();
cout << "Hit";

236 :デフォルトの名無しさん:2009/08/05(水) 23:00:53
>>235
ありがとうございます。
ぶじかいけつできました。!!

237 :デフォルトの名無しさん:2009/08/06(木) 01:24:15
20個ものclassのインスタンスがあるのですが、
rand()%20 +1でせいせいした1~20までの数に合わせて
それぞれのインスタンスにメソッドを適用したいです。
classのインスタンスを引数にわたしてメソッドを実行する関数を書いたので
classの配列をつかってその関数にclassを渡したいです。Web検索で
vectorを使うとかの説明は1つだけ出てきたのですが詳しくわからないのでよろしくおねがいします。

具体的にいうと
class Hoge
{
public:
Hoge() {}
void fuga() {}
};

void foo(Hoge h)
{
h.fuga();
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;
class_array = なんらかのほうほうでa,b,cの配列
foo(class_array[hit]);
return 0;
}
と言う風にかけないかと思っています。
よろしくおねがいします。

238 :デフォルトの名無しさん:2009/08/06(木) 01:29:08
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;

じゃなくて

Hoge class_array[3];
hit = rand()%3;

じゃだめ?

まあfooは参照かアドレスで渡すべきというのは置いておいて。


239 :デフォルトの名無しさん:2009/08/06(木) 01:31:37
>>238
すみません、大事な部分を忘れていました。
a,b,cのコンストラクタにはいくつかそれぞれ別の引数を渡したいのですが、
それもふまえた上でよろしくおねがいします。(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

240 :デフォルトの名無しさん:2009/08/06(木) 01:36:19
こら。

Hoge *class_array[3];
にして、それぞれ new すれば良いでしょ。

>それもふまえた上でよろしくおねがいします。
>(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

どんだけ上目線なの。



241 :デフォルトの名無しさん:2009/08/06(木) 01:38:35
>>240
なるほど、なんとなくわかってきました。
ありがとう御座います。
>どんだけ上目線なの。
すいませんでした、いま自分の望んでいる動作を日本語にするのが難しくて
変な日本語になっていました。すいません。

242 :デフォルトの名無しさん:2009/08/06(木) 01:40:17
実際はインスタンスが100個以上あるので、できればもう書いて生成してしまったインスタンスを
けしてそれぞれnewし直す事なく修正したかったのですが、無理なようですね。
とりあえずがんばろうと思います。

243 :デフォルトの名無しさん:2009/08/06(木) 01:43:27
ポインタ知ってる?

244 :デフォルトの名無しさん:2009/08/06(木) 01:49:11
どうやったらコンテナじゃないインスタンス100個とか糞みたいなコード書けるんだ

245 :デフォルトの名無しさん:2009/08/06(木) 01:57:56
>>244
すいません、まだC++についてよくわかっていないのです..
おなじ種族に属する物で名前やジャンルが違うものを
100個の内50個はデフォルトでひつようで残りの50個は条件の違いによって
生成時に与えられるパラメータが違うという妙な仕様になっていて
しかも100個どれが使用されるかはわからないという変なプログラムなんですよ。
まあ簡単にいうと動物園みたいなものです。

246 :デフォルトの名無しさん:2009/08/06(木) 02:03:37
配列にするのが嫌ならswitchでも使えばいいでしょ。
Hoge& selectHitTarget(Hoge& a, Hoge& b, Hoge& c)
{
switch(rand() % 3)
{
case 0: return a;
case 1: return b;
case 2: return c;
}
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
Hoge& hit = selectHitTarget(a, b, c);
foo(hit);
return 0;
}

247 :デフォルトの名無しさん:2009/08/06(木) 02:08:50
246は何の解決にもなってないので却下として、

生成時に与えられるパラメータでインスタンスの生成方法が変わるものを
100個分書いた時点でなんかもう…。ま、書き直しを勧めます。
普通はパラメータは外部配列にしておくか、アルゴリズムで与えて、
オブジェクトが100個だろうが100000個だろうがループで回して配列に
入れながら new するでしょうね。
#スケーラビリティと言います。

この後はアドレス渡しではまって、継承ではまって仮想関数ではまって…
となるのね。出題者は「わん」とか「にゃー」とか呼び分けたいだけなのに、
その手前で悩んでるパターンですかね。。。



248 :デフォルトの名無しさん:2009/08/06(木) 02:25:46
static変数にパラメーターリストを入れて
デフォルトコンストラクタでそれを参照しながら初期化するとか
でもなんか気持ち悪いな・・・

249 :デフォルトの名無しさん:2009/08/06(木) 02:30:53
オレだったらコンストラクタをテンプレート関数にして個々のメソッドの中にconstメンバを基にSTATIC_ASSERT吐く様にする

250 :デフォルトの名無しさん:2009/08/06(木) 02:32:32
モンスターのパラメータ
ランダムエンカウント時のモンスター決定
かと思った

251 :デフォルトの名無しさん:2009/08/06(木) 11:49:18
ttp://racanhack.sourceforge.jp/rhdoc/codepre.html

このページのコードを実行したいのですがGlibはどうやって導入すればいいんでしょうか
WindowsXPでVisual Studio 2008 Expressを使ってます

252 :デフォルトの名無しさん:2009/08/06(木) 13:37:37
>>251
GTK+の本家サイトでWin32版がダウンロードできるみたいだよ
http://www.gtk.org/download.html

253 :253:2009/08/06(木) 21:02:01
CもしくはC++でウェブ上の画像をURLを指定してhttpでダウンロードしたいのですが
できなくて困っています。

環境は下の通りです。
OS:windows XP
開発環境:Visual C++ 2008 ExpressEdition(win32プロジェクト)

htmlファイルならwininetを使ってダウンロードできたのですが、
画像だとできません。htmlファイルと同様に画像もできないのでしょうか?
また、wininet以外でいい方法があるなら教えてください。

サンプルプログラムは次に書きます。


254 :253:2009/08/06(木) 21:06:00
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead;
int nTotal = 0;
HGLOBAL hMem;
//目的のURLの入力
char szUrl[] = "http://hogehogehgoe.co.jp/hoge.jpg";
hInet = InternetOpen("hoge",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
if (hInet == NULL) return -1;
hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0);
if (hUrl == NULL) return -1;
//lpszSrcに1バイトのみ確保
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char *)GlobalLock(hMem);
while (1) {
InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
//読み出す物がなくなったのでループ脱出
if (dwRead == 0)break;
//必要バイト数の計算
nTotal += dwRead;
//確保領域の大きさ変更
hMem = GlobalReAlloc(hMem, nTotal, GMEM_MOVEABLE);
if (hMem == NULL) break;
lpszSrc = (char *)GlobalLock(hMem);
if (lpszSrc == NULL) break;
strcat_s(lpszSrc, nTotal+1, szBuf);
}

続く

255 :デフォルトの名無しさん:2009/08/06(木) 21:07:14
strcat?
画像の途中に 0x00 があったら、そこで切れない?

256 :253:2009/08/06(木) 21:07:18
//ファイル出力処理
std::ofstream fileout;
fileout.open("D:/hoge.jpg"); // 出力ファイルをオープン
if (!fileout){
MessageBox(NULL , TEXT("エラー!出力ファイルをオープンできません") ,TEXT("") , MB_OK);
return -1;
}
fileout << lpszSrc <<'\n';
fileout.close();

//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);

以上です。
すいませんがアドバイスください、お願いします


257 :253:2009/08/06(木) 21:21:11
>>255
そうなんですか?
じゃあ画像ファイルの場合どうしたらいいのでしょうか?

258 :デフォルトの名無しさん:2009/08/06(木) 21:30:44
どこまで格納したか覚えておいて、memcpyで

memcpy(&lpszSrc[現在の位置], szBuf, dwRead);
現在の位置 += dwRead;

みたいな感じで

259 :253:2009/08/06(木) 21:51:36
>.258さん、ありがとうございます。

>>254のサンプルプログラムのwhileループの前で
int nowI = 0;
と宣言して
whileループの最後のstrcat_sをコメントアウトして下の二行を追加しました。
memcpy(&lpszSrc[nowI], szBuf, dwRead);
nowI += dwRead;

でもできませんでした。なにか間違ってますでしょうか?
ファイルは作成されてるんですけどデータがほとんど入っていないようで
画像ファイルとして開けません。


うう・・・
別にwininetにこだっているわけではありません。
C/C++(VC+ EE)でweb上の画像をダウンロードする方法が他にあるのなら
wininetじゃなくてもいいです。

260 :デフォルトの名無しさん:2009/08/06(木) 22:20:19
おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
話はそれからだ。

261 :デフォルトの名無しさん:2009/08/06(木) 22:37:57
fprintfで書いてるんじゃなかろうな

262 :253:2009/08/06(木) 22:51:10
>>おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
うぅ、できません・・・
どうやら全然基礎が足りないみたいです。
もう一度勉強しなおします。
スレ汚してすいませんでした。

263 :デフォルトの名無しさん:2009/08/07(金) 00:21:20
今時ポインタがあるプログラミング言語なんてゴミ
らしいのですが
いまどき一番需要のあるプログラミング言語は何でしょうか?

264 :デフォルトの名無しさん:2009/08/07(金) 00:30:01
>>263
スレタイ読め

・・・っとただの釣りだったか。

265 :デフォルトの名無しさん:2009/08/07(金) 02:05:25
char (*a)[10];
a = malloc(10 * n * sizeof(char*));

とすれば、n行10列のメモリ領域を確保できると思います。
しかし、実際にこの領域に格納したいデータは、
hoge0、hoge1、…、hoge100、… のように、添え字がついており、長さがどんどん長くなります。
極端な話、char (*a)[100]; のように、十分に大きい値に設定しておけば問題ないのですが、
何かメモリ領域をうまくとる方法はありませんか。

266 :デフォルトの名無しさん:2009/08/07(金) 03:06:38
char (*a)[10];
a = malloc(n*sizeof(char [10]));

sizeof(char *)で何をしようと思ったのか理解できないのだが
もう少し詳しく書いてくれると良い情報が聞き出せるかもね

267 :デフォルトの名無しさん:2009/08/07(金) 04:37:52
reallocしたいとか
vector使えとか
そういう話じゃないかね

268 :デフォルトの名無しさん:2009/08/07(金) 05:15:11
ジャグ配列が欲しいって話だろ

269 :デフォルトの名無しさん:2009/08/07(金) 12:06:41
explicitをコピコンに使うと値渡し・返しができなくなるんだけどそういうもんなの?

270 :phenix:2009/08/07(金) 16:16:32
>>269
hoge a=b;で渡せないって意味ならそう。
hoge a(b);で渡せる。



271 :デフォルトの名無しさん:2009/08/07(金) 18:47:28
フェニックスさんキタ!!

272 :デフォルトの名無しさん:2009/08/08(土) 12:24:01
関数の仮引数名に悩む場合
(どうすれば分かりやすくなるかな?とか)
どう考えて付ける?

273 :デフォルトの名無しさん:2009/08/08(土) 12:32:22
変数名と同じ扱いでいいんじゃない?

274 :デフォルトの名無しさん:2009/08/08(土) 12:36:32
>>273
俺は
同じ型の引数を持つ場合、
void foo(hoge_1, hoge_2)
の様にしているんだが、
果たしてこれで分かりやすいと言えるのだろうか。
void foo(hoge_lhs, hoge_rhs)
とどっちが分かりやすいだろう?

と言うか分かりやすい引数って何だろう?


275 :デフォルトの名無しさん:2009/08/08(土) 12:56:01
ユニークな名前付ける方がいいよ
file_copy(file1, file2) より file_copy( src, dst ) みたいに

276 :デフォルトの名無しさん:2009/08/08(土) 13:01:10
判り易くしようとすると変数名が長くなりがちだから、
そこらへんのバランスをどうするかが難しいな。

277 :272:2009/08/08(土) 13:06:24
みんなありがとう。
指針とさせてください。


278 :デフォルトの名無しさん:2009/08/08(土) 16:23:05
windows xp でファイルの存在を確認したい
プログラムを書きたいのですができなくて困っています。
開発環境はVC++ 2008 Express Edition(win32 プロジェクト)でやっています。

下のプログラムのように、LPCWSTR型にファイルパスを直接代入すれば
できるのですが、ファイルパスはstd::string型の変数で扱いたいです。
LPCWSTR lpszFilePath = TEXT("test.jpg");
if( PathFileExists( lpszFilePath ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

std::stringからLPCWSTRへの型変換の問題になると思うのですが
これがわかりません。




279 :デフォルトの名無しさん:2009/08/08(土) 16:34:08
LPCWSTR は Long Pointer to Const Wide String なので
C++標準に置き換えると const wchar_t *になるよね?
なので、std::stringでは扱えません。

std::string を使う場合は LPCSTR を使いましょう。

280 :デフォルトの名無しさん:2009/08/08(土) 16:50:05
>>278
AとWを相互に変換するライブラリがあるらしいよ。使ったことないけど…
http://msdn.microsoft.com/ja-jp/library/87zae4a3(VS.80).aspx

#include <atlstr.h>
std::string s = "test.jpg";
LPCWSTR lpszFilePath = CA2W(s.c_str());

281 :デフォルトの名無しさん:2009/08/08(土) 16:55:57
俺も>>279だな
LPCWSTR → LPCSTR
PathFileExists → PathFileExistsA

282 :デフォルトの名無しさん:2009/08/08(土) 17:03:47
Standard Edition 以上なら CString ですんじゃうんだけどねぇ。
MFCは嫌い? あ、そう。

283 :278:2009/08/08(土) 17:06:36
>>279-281
ありがとうございます、できました。

string hogeStr = "test.jpg";
LPCSTR lpszFilePath2 = hogeStr.c_str();
if( PathFileExistsA( lpszFilePath2 ) ) {
cout << "指定されたパスにファイルが存在" << endl;
} else {
cout << "no file!!!!!!!!!!!!!!!!!" << endl;
}

ちなみに>>280さんのATL(#include <atlstr.h>)は
Express editionでは使えないみたいです。
ttp://www.microsoft.com/japan/msdn/vstudio/2008/product/express/aboutexpress.aspx

もう、やりたいことができたのでいいんですけど・・・
ともかく皆さんありがとうございました。

284 :278:2009/08/08(土) 17:09:20
更新しわすれた・・・
>>282
そうですね、Cstringも同じですね。
嫌いというか今はただお金をかけたくないんだけなんですけどね・・・



285 :デフォルトの名無しさん:2009/08/08(土) 17:18:30
ナロー文字とワイド文字の混在は厄介だね。

char、wchar_t のかわりに TCHAR マクロを
"文字列", L"文字列"のかわりに _T("文字列") マクロを使い、
さらに
プロジェクト→プロパティ→構成プロパティ→全般→文字セットで
「設定なし」を選んでプロジェクト全体をshift-JIS標準に。
そうすればlocaleとかwstringとかwcoutとかostream_iterator< wchar_t >とか
いちいち考えなくてすむ。

286 :デフォルトの名無しさん:2009/08/08(土) 19:16:17
いやいや、stringのほうを両対応に変えようよ。
typedef std::basic_string<TCHAR> tstring;

tstring filePath = TEXT("test.jpg");
if ( PathFileExists( filePath.c_str() ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

287 :デフォルトの名無しさん:2009/08/08(土) 20:20:47
でもその tstring は cout に渡せるときには wcout には渡せず、
wcout に渡せるときは cout に渡せないというような厄介なことになるよ。
Win APIやMFC、ATL側はひとつの名前で char と wchar_t に破綻なく処理を分岐してくれるけど
C++ 標準で同じことやろうとすると膨大なマクロなりtypedefなりを組むことになる。
その上、結局プログラマに「それはcharなのかwchar_tなのか」ということを意識させることに。

…と、思う。素直にMicrosoftの標準に従っといたほういい。
Windowsの開発環境は特殊だから。

288 :デフォルトの名無しさん:2009/08/08(土) 20:44:49
toutを作ればいいじゃない

289 :デフォルトの名無しさん:2009/08/08(土) 20:56:39
Microsoft標準に従うというのはプロジェクト全体をshift-JIS標準にすること?

290 :デフォルトの名無しさん:2009/08/08(土) 21:07:05
汎用テキストマッピング(_T()とかTCHARとか使うやつ)なんて破綻してるから使わないほうがいいよ。
実際の現場で、文字列の編集のある処理で、ワイド文字とマルチバイト文字の両方で
動くように書いてるやつなんて、すごい少数だろ。
さらに、両方でテストしてるところなんて皆無だろうし。
(テスト以前に両方でコンパイルを通してるところもなさそう)

汎用テキストマッピングを使っても、実際には片方でしか動かないコードしかできないし、
いまさらwin9x系に対応する意味とかないし、最初からワイド文字きめうち問題ないよ。
問題ないっていうか、変にワイド、マルチ文字両たいおうしたつもりのコードのほうが
問題おこしそう。

291 :デフォルトの名無しさん:2009/08/08(土) 21:16:41
つーか、相当処理がカツカツじゃなければ、一旦なんらかの内部コードに変換して統一した方がいいと思う。
まぁ、扱う入力データの種類にもよるが。

292 :デフォルトの名無しさん:2009/08/08(土) 22:49:27
>変にワイド、マルチ文字両たいおうしたつもりのコードのほうが問題おこしそう。

まったくそのとおりだと個人的にも思うが
tstring のようにC++標準を両対応にするくらいなら
まだTCHARとか使っておいたほうが安全だと思う。

293 :デフォルトの名無しさん:2009/08/09(日) 00:45:30
C言語で動画処理をしようと思っています

aviファイル読み込み→キャプチャ→RGBに対してフィルタ処理→表示
というようにしたいのですが、キャプチャしたときにRGBをしまう配列を指定できないでしょうか?
具体的には unsigned char を四つ持つ構造体に対して、ひとつメンバを余らせて一画素ずつ入れたいです
現在OpenCVで試しているのですが、RGBはunsigned char型の配列に自動的にしまわれてしまい、
キャプチャの値を構造体に入れなおすと時間がかかってしまいます

これができればOpenCVでなくてもかまわないので、誰かお知恵をお貸しください

294 :デフォルトの名無しさん:2009/08/09(日) 01:17:04
なぜ「ひとつメンバを余らせ」たいのか、OpenCVがキャプチャしてくれた
配列じゃなぜダメなのか?C言語が良いのか?

その辺をもう少し詳しく。
でないとDirectShowって言っちゃう。


295 :デフォルトの名無しさん:2009/08/09(日) 02:58:51
293です、詳しく説明します
実はCUDAというものでGPUを使った画像処理を行っているのですが、それを動画に応用したいのです
簡単にいえばCUDAでは4バイトずつデータにアクセスすると高速化する特性があります
そこでひとつ空きを作って無理やり4バイトにし、構造体単位でアクセスを行っています
これを空きなしの3バイトにしたところ10倍近く遅くなったので、1バイトのchar型だとさらに遅くなる可能性があります
C言語がいいのはCUDAがC言語を拡張したものだからです

296 :デフォルトの名無しさん:2009/08/09(日) 03:28:51
>>295
OpenCVを使うのであれば
IplImageを作るときにIPL_DEPTH_8Uにするのではなく
IPL_DEPTH_32S又はIPL_DEPTH_32Fにして宣言すれば4Bになるんじゃないでしょうか?

imageDataのR,G,Bは8bit*4なのに注意してください。
参考にどうぞ
http://rest-term.com/contents/other/technote/index.php/OpenCV#content_1_6

297 :293:2009/08/09(日) 12:55:44
ありがとうございます!
ためしてみます

298 :デフォルトの名無しさん:2009/08/09(日) 15:08:07
引き数にだけ文字列を使いたい時でもconst string&使ったほうがいいの?


299 :デフォルトの名無しさん:2009/08/09(日) 15:12:42
>>298
何を言っているのかわからん。

300 :デフォルトの名無しさん:2009/08/09(日) 15:21:28
>>298 もしかしてこういうことか?

void foo(const string& s) { cout << s << endl; }

void bar(const char* s) { cout << s << end; }

int main() {
foo("footest"); // リテラル文字列をstring&に渡す
bar("bartest"); // char*に渡す
}

こういう話だったら、const char* でもいいだろうけど
char*とstringが混在すると面倒だから俺は全部stringに統一

301 :デフォルトの名無しさん:2009/08/09(日) 15:55:20
そんなかんじですね
ヘッダ解析のコストもあるしchar*でわたして必要ならソースでstringにかえればいいかなと・・・

302 :デフォルトの名無しさん:2009/08/09(日) 16:01:04
C++ code - 21 lines - codepad
ttp://codepad.org/ADzqt4PN

struct Animalのstatic constなメンバであるweight = 10;
を、Animalを継承したHumanで別の数字に変更したい場合、
このような方法でよろしいでしょうか?



303 :デフォルトの名無しさん:2009/08/09(日) 16:25:57
>>302
それでおk。

あと
struct Animal
{
static const int weight = 10;
};
が他人が作った物である場合、
struct Human : Animal
{
enum{ weight = 50 };
};
こうやって書き換えた方が良い。
互換性が高い。

304 :デフォルトの名無しさん:2009/08/09(日) 20:06:43
>>303
互換性ってなんの?

305 :デフォルトの名無しさん:2009/08/09(日) 20:14:18
>>303
enum って何の略か分かってる?

306 :デフォルトの名無しさん:2009/08/09(日) 20:18:36
>>305
enumハックしらないの?

307 :デフォルトの名無しさん:2009/08/09(日) 20:20:52
互換性って古めのコンパイラだと前者を配列の宣言に使用できないとかそういうこと?

308 :デフォルトの名無しさん:2009/08/09(日) 22:27:30
いまさらenumハックを自信ありげに言われてもなあ

309 :302:2009/08/09(日) 23:18:20
ありがとうございます。
enumハックで行かせていただきます。


310 :デフォルトの名無しさん:2009/08/09(日) 23:40:46
よせ、あくまでハックはハックだ
正攻法には劣る

311 :デフォルトの名無しさん:2009/08/09(日) 23:57:49
>>308
いくつかの環境で開発をしたことがあるなら当たり前の知識である
enumハックのコードを見て、enumが何の略かなんて問うのもどうかと思うよねw

312 :デフォルトの名無しさん:2009/08/10(月) 00:04:28
>>305
enumハックをしらないやつがなんでまた偉そうにw

313 :デフォルトの名無しさん:2009/08/10(月) 00:06:07
>>310
劣るかなぁ?どう劣る?

読みづらいとか?

314 :デフォルトの名無しさん:2009/08/10(月) 01:22:44
たびたびすみません、293です
296さんのサイトを見てみたのですが、どうやらこちらの説明不足だったようです
一つのチャンネルを4バイトで表したいのではなく、ピクセルそのものを4バイトで表したい
つまり、cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 4);
このようにしたかったのです
それで実際に試してみたのですが、うまくいきません
キャプチャを cvQueryFrame で行っているのですが、おそらくここでメモリを取り直されているのだと思います
実装部分を探して改良しようとも思ったのですが見つかりませんorz
半分スレ違いみたいな内容ですが、解決方法があったらご教授ください

315 :デフォルトの名無しさん:2009/08/10(月) 01:55:20
>>314
Grabが3yte/pixelで行われる限り、一度は3byte/pixelから 4byte/pixelへの
拡張をしてやらないといけないと思うよ。
OpenCVでやるか(cvCopy?)、自前の関数でやるかは別として。

316 :デフォルトの名無しさん:2009/08/10(月) 02:06:10
>>314
「cuda rgba」でググったらぴったりのものが出てきた。
http://wiki.livedoor.jp/mikk_ni3_92/d/OpenCV::RGBA%B2%E8%C1%FC%BA%EE%C0%AE

317 :デフォルトの名無しさん:2009/08/10(月) 04:48:35
生成と同時にコンストラクタに値を与えたいオブジェクトがあるので、

CTest* ctest[10];
for(int i=0;i<10;i++){
ctest[i] = new Ctest();
}

と統一してるんですが、最初に要素数を決めなきゃいけないのと、
newとdeleteを使う分、かったるいので

vector<CTest*> ctest;
for(int i=0;i<10;i++){
ctest.push_back( ? );
}

って風にしようとしてるんですが、ここで「?」になにも入れないと
「0個の引数は指定できない」と怒られます

この場合「?」の部分はCTestコンストラクタに渡す引数になると思ってたんですが、
引数がない場合はどうすればいいでしょう?
やはりnewとdeleteを使わなきゃいかんのでしょうか

318 :デフォルトの名無しさん:2009/08/10(月) 05:46:18
vector<CTest*> ctest(10);
でいけたような。

319 :デフォルトの名無しさん:2009/08/10(月) 06:17:46
>>317
CTest*のvectorでしょ
push_backするのはCTest*じゃないの?
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか・・・


320 :デフォルトの名無しさん:2009/08/10(月) 07:05:40
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか
ctest.resize(i+1);
ctest[i] = new ctest();
とか試してみたけど、

error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です
error LNK2019: 未解決の外部シンボル __CrtDbgReportW が
関数 "public: class Ctest * & __thiscall std::vector<class Ctest *,class std::allocator<class Ctest *> >::operator[](unsigned int)"
(??A?$vector@PAVCtest@@V?$allocator@PAVCtest@@@std@@@std@@QAEAAPAVCtest@@I@Z) で参照されました。 Main.obj

なにこれ(゜д゜)

321 :デフォルトの名無しさん:2009/08/10(月) 07:59:13
失礼、ランタイムライブラリをマルチスレッド(/MT)から
マルチスレッドデバッグ(/MTd)に変えたら解決しました。
理屈はわかりませんが・・・

CTest.push_back( new CTest(引数) );
でいけそうですが、この場合、指定のオブジェクトを破棄するとき
deleteで指定のアドレスを破棄してから、vectorのポインタを破棄する、
というクドいコードになりますね・・・

かといって、vector<CTest>と、ポインタで持たずにnewを使わなければ
引数付きコンストラクタでの初期化がややこしくなりますし・・・
しかたないですかね

322 :デフォルトの名無しさん:2009/08/10(月) 11:36:10
>>321
それは仕方がない。というかnewした以上、deleteするのは当たり前。
vectorにオブジェクトのポインタをプールするなんてまぁよく聞く話だし。
デストラクタに全要素deleteするコード書いとけ。

323 :デフォルトの名無しさん:2009/08/10(月) 11:38:19
>>321
>引数付きコンストラクタでの初期化がややこしくなりますし・・・
そもそも、ここが判らん。

324 :デフォルトの名無しさん:2009/08/10(月) 12:46:32
>>321
boost::ptr_vectorで解決

325 :293:2009/08/10(月) 14:50:51
>>315
確かにキャプチャ部分がこうなっている以上コピーするしかないですよね
Grabを自前で実装できればよいのですが、キャプチャ自体がどのように行われているかさえ
まだ理解していないので当分コピーで済ませていこうと思います
ありがとうございました

>>316
このようなページを知らなかったとはまだまだ勉強不足のようですorz
もうちょっと自分で調べてみようと思います
ありがとうございました


326 :デフォルトの名無しさん:2009/08/10(月) 15:59:01
>>321
それなら
std::vector<boost::shared_ptr<CTest> > ctest;
ctest.push_back(boost::shared_ptr<CTest>(new CTest()));

コンパイルして書いてるわけじゃないから何か変だったら適当になおして

327 :デフォルトの名無しさん:2009/08/10(月) 18:40:28
const char * const p= "有効な文字列p";
const char * const q= "有効な文字列q";

このようなpとqに格納されている文字列が等しいかどうかを調べる場合、

strcmp
を使う方法と
std::string(p)==q

std::string(p)==std::string(q)
とする方法と、どちらが望ましいでしょうか?

328 :デフォルトの名無しさん:2009/08/10(月) 19:14:12
そら、態々メモリ割り当てずに strcmp が速いでしょ。

329 :327:2009/08/10(月) 19:17:27
>>328
ありがとうございます。

330 :デフォルトの名無しさん:2009/08/10(月) 20:26:59
男キャラを担当する女声優はわんさかいるけど、
女キャラを担当する男声優なんて聞いたことない

331 :デフォルトの名無しさん:2009/08/10(月) 20:27:39
超誤爆

332 :デフォルトの名無しさん:2009/08/10(月) 20:36:20
どのスレだよw


333 :デフォルトの名無しさん:2009/08/10(月) 21:40:42
class Aからclass Bへの暗黙の型変換が許されている状況で、
A hoge;
として

B piyo = hoge;
B piyo(hoge);
B piyo = (A)hoge;
B piyo = static_cast<A>(hoge);

これら4つは全く等価だと考えてよろしいですか?


334 :デフォルトの名無しさん:2009/08/10(月) 23:27:55
少なくとも一番目と二番目は全く違うような。

335 :デフォルトの名無しさん:2009/08/10(月) 23:36:36
>>334
違いますか?
どのあたりが違いますか?


336 :デフォルトの名無しさん:2009/08/11(火) 02:15:35
同じだよ。どれもコピーコンストラクタが呼ばれる。
ときおり初心者が1番目の式を代入と勘違いするけど
普通の教科書にはそれは代入じゃねぇンだよって説明が書いてあるので
それを知らないのは教科書をよく読んでいない証拠。

もし書いてないなら、その教科書は資源ごみにでも出したほうがいい。

337 :デフォルトの名無しさん:2009/08/11(火) 05:33:53
すんごい初歩的な質問だと思うんですけど、
deleteで解放をし忘れしているプログラムを何度も動かした場合、
不要なデータはPC上に残り続けるんでしょうか?

溜まったそれらのデータをなんとか解放、削除したい場合は
どうすればいいんでしょ?

338 :デフォルトの名無しさん:2009/08/11(火) 06:04:39
一度プログラムを終了させれば

まともなOSなら
deleteしていなくても問題ない。

少なくとも、普通の方法で確保したメモリを
プロセスが終了しても解放しないものはまず無い。
メモリ以外のリソースはそうでもない場合もある。

339 :337:2009/08/11(火) 06:10:01
多謝

340 :333:2009/08/11(火) 10:32:22
>>336
やっぱり全く等価ですよね。

どうもありがとうございます。


341 :デフォルトの名無しさん:2009/08/11(火) 10:37:12
explicitを付けて(1)を使えなくしてやるー

342 :デフォルトの名無しさん:2009/08/11(火) 10:53:55
>>334
こいつ恥ずかしいなwww

>>338
メモリ管理問題
ttp://kmaebashi.com/programmer/c_yota/malloc.html
熟読せよ

343 :デフォルトの名無しさん:2009/08/11(火) 11:17:26
>>342
言いたいことがあるなら自分の言葉でどうぞ。

344 :デフォルトの名無しさん:2009/08/11(火) 11:24:16
共用体について質問です

union AB{
A a;
B b;
};

void init(union AB ab){
union AB ans;
ans = ab;
}

void main(){
init( (A)10 ); // 10をA型にキャストして引数に与える
init( (B)10 ); // 10をB型にキャストして引数に与える
}

・・・このソースでなにがしたいかと言うと、
引数に与えた型を判別して、A型ならans.aに、B型ならans.bに
自動的に代入してほしいのです。

考え方が間違えてるのか「AからABに変換できません」とエラーが出ます
この場合、どうしたらいいのでしょうか?

345 :デフォルトの名無しさん:2009/08/11(火) 11:27:14
共用体にA用とB用のコンストラクタを設ける

346 :デフォルトの名無しさん:2009/08/11(火) 11:28:05
>>344
>引数に与えた型を判別して
C++ でも使いましょう。

347 :デフォルトの名無しさん:2009/08/11(火) 11:29:05
>>344
まて、その前にクラスはまともに使えるのか?
例えば
>>333
この様なclass Aとclass Bを記述することは出来るだけの技量はある?

348 :デフォルトの名無しさん:2009/08/11(火) 11:36:51
クラスは普通に使ってます。
というかこの質問が、同じクラスのメンバ変数が2タイプに分かれる場合があって、

2つ変数を設けて片方を空っぽにするのが気持ち悪いので、共用体を使おうとしてるのです
(初期化関数を統一したいのもあります)

ただ「共用体にコンストラクタを設ける」といわれるとなんのことやら・・・
共用体がクラスのように扱える、ということでしょうか

349 :342:2009/08/11(火) 11:39:39
>>343
こいつ(は無知なのに「全く違う」という強い否定を使い
それが全くの初歩の話題であったことを知り)
恥ずかしい(とさぞかし思っているだろう)なwww

で満足?

350 :343:2009/08/11(火) 11:41:05
>>349
あ、いや、後段の方。

351 :デフォルトの名無しさん:2009/08/11(火) 11:41:40
>>348
クラスと同じように共用体もコンストラクタやデストラクタを持てる

union AB{
....
AB(A a){ this->a = a; }
AB(B b){ this->b = b; }
};

352 :347:2009/08/11(火) 11:41:42
>>348
>クラスは普通に使ってます。
じゃあとりあえず、
自分のコードのunionになっている場所をclassに単純に書き換えて
実現してみてよ。

それがすぐ答えにつながる。


353 :デフォルトの名無しさん:2009/08/11(火) 12:06:41
>>342
理屈上はそうかも知れんが、
free()しないとメモリを管理できてないような気がする。
特にdeleteしないとデストラクタがどう動くかよく分からん。

354 :デフォルトの名無しさん:2009/08/11(火) 12:11:00
つーか、共用体にする意味があるのか?
気持ち悪いと言う理由だけでは意味がなさ過ぎる。
どちらかだけ有効だと言うのであれば、boost::optionalでも使って有効性をチェックすればいいだけの気もするが。

355 :342:2009/08/11(火) 12:12:23
いや俺はfree()しないことに反対な人だから。
ただこういう意見な人も居るよっていいたかっただけだ。



356 :デフォルトの名無しさん:2009/08/11(火) 12:12:23
>>353
deleteしなければデストラクタが動くわけないじゃん。
OSは、クラスの管理までしてくれるわけじゃないよ。

357 :デフォルトの名無しさん:2009/08/11(火) 12:13:11
>>354
boost::optional
の使いどころおかしくねぇか?
valiantじゃなくて?


358 :デフォルトの名無しさん:2009/08/11(火) 12:23:55
>>357
元質の趣旨が判らんから勝手に推測した。valiantを使うべきならそうしてくれ。

359 :デフォルトの名無しさん:2009/08/11(火) 20:28:12
class hoge {
public: static fuga();
};

これって普通の関数と比べてなんかいいことあんの?


360 :デフォルトの名無しさん:2009/08/11(火) 20:35:16
>>359
静的メンバ関数でググれ

361 :デフォルトの名無しさん:2009/08/11(火) 20:38:17
>>359
1・それがいいか悪いかは別として、似たようなstatic関数が100個くらいあったとき
  まとめて他のクラスのfriendにできる

2・hogeのstaticじゃないprivateなメンバに触れる

362 :デフォルトの名無しさん:2009/08/11(火) 20:55:02
あぁプライベートメンバに触れるのかそれは便利そうだ
二項演算しとかに使えそう

363 :デフォルトの名無しさん:2009/08/11(火) 20:59:09
とおもったらオペレーターは静的にできなかった・・・
ぬかよろこびだったでござる


364 :デフォルトの名無しさん:2009/08/11(火) 21:33:44
てか、コンストラクタをprivateにしてstaticなファクトリ作るくらいじゃない?

365 :デフォルトの名無しさん:2009/08/11(火) 21:44:24
>>359
コールバック関数に使える。

366 :デフォルトの名無しさん:2009/08/11(火) 22:04:07
ttp://codepad.org/84SNOtSp

std::numeric_limits< double >::quiet_NaN()==std::numeric_limits< double >::quiet_NaN()
の部分はfalseとなるようですが、
これは言語仕様そうなるものですか?

それとも実装依存でしょうか?

367 :366:2009/08/11(火) 22:05:34
なお、
g++, VC++2008に食わせた後実行したらttp://codepad.org/84SNOtSpと同じ結果でしたが、
bccに食わせた後実行したらその実行ファイルは不正終了しました。
> これは言語仕様そうなるものですか?

368 :デフォルトの名無しさん:2009/08/11(火) 22:22:22
ttp://codepad.org/LEWBiHCD

VC++だと実行結果が100になる
この記述でコピコンが呼ばれるかどうかは仕様で決まってないのかな

369 :367:2009/08/11(火) 22:26:58
>>368
私の環境のg++ 4.4.0では100になりましたよ。
bcc 5.5.1でも100になりましたよ。
codepadが100にならないのは不思議ですね。


370 :デフォルトの名無しさん:2009/08/11(火) 22:33:58
>>342の知ったかバカ

>>337の質問が
>deleteで解放をし忘れしているプログラムを何度も動かした場合、
>不要なデータはPC上に残り続けるんでしょうか?
という内容で、

>>338の回答が
>一度プログラムを終了させれば
という、限定された条件なんだけど、わかってるのかね?

371 :デフォルトの名無しさん:2009/08/11(火) 22:36:28
>>366
TがNaNである値nを持つとき、
型Tの値nがNaNである ⇔ すべてのTの値xに対してx ≠ nである
ゆえにNaN ≠ NaNである

quet_NaNは型がNaN値を持つとき、
LIA-1(ISO/IEC 10967-1)の要求を満たすとあるので(ISO/IEC 14882:1998 18.2.1.2.45)
恐らく規格準拠だと思うよ
詳しくはC++98とLIA-1をあたってくれ
多分NaNに関してはLIA-1に1段落目で書いたことのようなものが載ってる筈

372 :366:2009/08/11(火) 22:39:12
>>371
ありがとうございます。
助かりました。

373 :デフォルトの名無しさん:2009/08/12(水) 00:12:29
http://codepad.org/oRku7d6S
http://www1.axfc.net/uploader/Img/so/55595

二回目のバイナリ書き込みがなぜかテキスト書き込みになってしまいます
なぜでしょう?

374 :デフォルトの名無しさん:2009/08/12(水) 01:52:18
>>373
おおざっぱに言うと、式の中にcharが出てくるとint型に拡張される。「汎整数昇格」で検索すると解説が出てくるかも。
だから2回めの書き込みは、cout << (int)(ch * 2) と同じこと。

375 :デフォルトの名無しさん:2009/08/12(水) 02:03:11
>>370
どうした?
>>337 >>338 >>342の流れはfreeしなくていいよ派の滞りない流れではないか?

376 :デフォルトの名無しさん:2009/08/12(水) 03:10:30
もしかして、単に優越感に浸りたいだけの基地外さん?
もしかして、単に優越感に浸りたいためだけに、自分に都合の良い解釈しかしない人?

377 :デフォルトの名無しさん:2009/08/12(水) 03:19:45
バカは相手にすんな

378 :デフォルトの名無しさん:2009/08/12(水) 03:41:01
>>375
342はfreeしろ派じゃねーの?

379 :デフォルトの名無しさん:2009/08/12(水) 04:04:11
freeしろ派があのリンク先を持ってくるかなあ?
リンク先を見た上で、しかしこういう考えのもと、やはりfreeすべきだという内容がレスにあるわけでもないし

380 :デフォルトの名無しさん:2009/08/12(水) 04:41:00
いい加減freeの話題で荒れるのは勘弁してくれないかな。

381 :デフォルトの名無しさん:2009/08/12(水) 05:16:11
今までの話を纏めると
結論:必ずfreeすべし

382 :デフォルトの名無しさん:2009/08/12(水) 05:47:53
この話は明示的なメモリの解放を行うことができる言語がある限り繰り返されると思うよ
片手間で作ったちょっとしたツールでせっせと例外捕捉して必死でメモリ解放するとかやってられんしょ

383 :デフォルトの名無しさん:2009/08/12(水) 09:44:43
>>374
その解釈はおかしい。
何故ならば、ch * 2が既にintだと言っているのだから(int)(ch * 2)は(int)(int)....(ch * 2)と言う位意味がない。
敢えてその顰に倣って書くのなら、(int)ch * 2と言った処だろう。

384 :デフォルトの名無しさん:2009/08/12(水) 12:38:32
ていうかバイナリモードで開いてるのになんで文字としての数字が保存されてんの?
って聞きたかったんすけど・・・

385 :デフォルトの名無しさん:2009/08/12(水) 12:40:27
>>384
std::cout << '0'としても、std::cout << 0としても出力が同じなのと同じ理由。
バイナリモードかどうかは全く関係ない。ついでに言えば、大抵のOSではテキストモードとバイナリモードの違いさえない。

386 :デフォルトの名無しさん:2009/08/12(水) 12:45:57
テキストモードでオープンすると '\032' から先を読まない処理系が昔あったなあ。

387 :デフォルトの名無しさん:2009/08/12(水) 16:59:09
class Hoge
{
operator double(){return 1.0;}
};
というクラスがあるとき

Hoge e;
printf("%f\n", e );

と言うコードはコンパイルが通りますが、表示されるのは1.0ではありませんでした
eは何型にキャストされてからprintfに渡されているんですか?

388 :デフォルトの名無しさん:2009/08/12(水) 17:07:20
>>387
キャストされないで、Hogeのままスタックに詰まれる。
それみたいにメンバ変数のないクラスのでやるとどうなるかしらないけど。

389 :デフォルトの名無しさん:2009/08/12(水) 17:10:58
正確には、もうひとつのインスタンスが
(コピーコンストラクタを使って)スタック上に作られる、ってことだね。

390 :デフォルトの名無しさん:2009/08/12(水) 17:27:39
>>388-389
ということは、やりたいようなことはたぶん出来ないんですね
面倒でも(double)eとするしかないと

ありがとうございました

391 :デフォルトの名無しさん:2009/08/12(水) 18:02:12
>>386
\032って何ですか?


392 :デフォルトの名無しさん:2009/08/12(水) 18:14:04
>>391
Control-Z。MS-DOSやCP/MのEOF文字

CP/MというOSではファイルサイズを128の倍数でしか管理できなかったので、
データの最後にEOFをつける必要があった

393 :デフォルトの名無しさん:2009/08/12(水) 18:29:35
>>384
じゃあ何が保存されればいいの?

394 :デフォルトの名無しさん:2009/08/12(水) 19:00:57
>>392
ありがとうございます。

395 :デフォルトの名無しさん:2009/08/12(水) 21:04:36
安西先生、引き数と返り値の型も隠蔽したいです


396 :デフォルトの名無しさん:2009/08/12(水) 22:00:45
c++で2重起動を防止する方法を教えてください。
環境linux+gccです

397 :デフォルトの名無しさん:2009/08/12(水) 22:18:02
セマフォを使う

398 :デフォルトの名無しさん:2009/08/13(木) 01:43:06
mutex


399 :デフォルトの名無しさん:2009/08/13(木) 22:13:12
class hoge {
public:
class foo {...};
foo fuga();
};

こんな場合って普通fooの定義は外にだすもん?


400 :デフォルトの名無しさん:2009/08/13(木) 22:21:56
>>399
クラスのネストくらいふつーだと思う。

401 :デフォルトの名無しさん:2009/08/13(木) 22:28:08
クラス内クラス定義はpimplイディオムなんかの時に普通につかうよ

402 :デフォルトの名無しさん:2009/08/13(木) 22:30:13
>>401

403 :デフォルトの名無しさん:2009/08/13(木) 22:45:43
>>399
そういうことをやり始めたあたりから楽しくなってくるんだぜ(笑)


404 :デフォルトの名無しさん:2009/08/13(木) 23:10:16
前スレで登場したテンプレートを
適当に貼り付けてみる。
template<typename T, std::size_t N>
inline std::size_t numberof(T (&)[N]) {return N;}
まだまだ納得できない俺がいる。


405 :デフォルトの名無しさん:2009/08/13(木) 23:15:13
http://ray.sakura.ne.jp/template/ccgen.html

これのバブルソートのテンプレート化も面白いな

406 :デフォルトの名無しさん:2009/08/13(木) 23:35:31
>汎用性の為に速度が犠牲になつてしまふことは、なんとしても避けなければならない。
執念が感じられるな(笑)



407 :デフォルトの名無しさん:2009/08/13(木) 23:37:24
メンテ性悪すぎワラタ

408 :デフォルトの名無しさん:2009/08/13(木) 23:47:03
何かあったんだろうなw

409 :デフォルトの名無しさん:2009/08/14(金) 00:10:52
C/C++で書くのは実行速度気にするからで間違った方向じゃないと思うがね
アセンブラやFORTRANでブイブイ云わせてるオッチャンは失笑するかもしれんけど

410 :デフォルトの名無しさん:2009/08/14(金) 04:13:44
同じ関数にわたす引数が場面によって違う場合、どうするのが一般的ですか?

パターン1:
if( case == 1 )
test( a, c, d, e, f);
else
test( b, c, d, e, f );

パターン2:
if( case == 1 )
temp = a;
else
temp = b;
test( temp, c, d, e, f );


このどちらかでいいじゃん、と思われたかもしれませんが
パターン1の場合、引数リストが10行近くに渡る場合、
引数1つの違いのために10行余計に食うハメになります・・・

パターン2の場合は、1つの引数のためにわざわざ
tempを用いてるのが醜いです

引数リストの中でif文を使えるようなら、
それが一番いいイメージなのですが・・・

411 :デフォルトの名無しさん:2009/08/14(金) 04:40:19
3項演算子でググれ

412 :412:2009/08/14(金) 06:01:09
できました。ありがとうございます

413 :デフォルトの名無しさん:2009/08/14(金) 09:17:37
>>412
自己完結乙。

414 :デフォルトの名無しさん:2009/08/14(金) 17:24:44
privateなstaticメンバ変数と
無名名前空間内の変数ってどうちがうんでさ?


415 :デフォルトの名無しさん:2009/08/14(金) 17:36:16
>>414
どういうソースのこと?

416 :デフォルトの名無しさん:2009/08/14(金) 17:42:44
Cの勉強を始めたばかりなんだけど、メモ帳に、参考書にある通りのソースプログラムを書いてリターンキーを押しても実行結果が表示されません。
原因を教えてください。

417 :デフォルトの名無しさん:2009/08/14(金) 17:45:13
>>416
釣り?マジ?

418 :デフォルトの名無しさん:2009/08/14(金) 17:48:21
>>417
マジです。

419 :デフォルトの名無しさん:2009/08/14(金) 17:53:50
俺は、ちゃんと実行されるけど、
不正コピーのWindows使ってるから、動かないのじゃね?

420 :デフォルトの名無しさん:2009/08/14(金) 18:04:20
普通のXPを使ってます。
リターンキーを押しても改行されるだけなんですが(T_T)

421 :デフォルトの名無しさん:2009/08/14(金) 18:08:58
その糞参考書を晒せ

422 :デフォルトの名無しさん:2009/08/14(金) 18:14:42
これはたしかに参考書が気になる

423 :デフォルトの名無しさん:2009/08/14(金) 18:20:25
以前もさらっと「コンパイルが必要です」ってある参考書ではまってた奴がいたような。

424 :デフォルトの名無しさん:2009/08/14(金) 18:42:14
>>415
class pool {
private: static map m;
(ry
};

みたいなコード
これだと無名グローバル変数でもいいように思えるんだけど・・・


425 :417:2009/08/14(金) 18:44:07
codepad
ttp://codepad.org/

ここで実行しろ。

426 :415:2009/08/14(金) 18:44:58
>>424
poolの外からmにアクセス出来なくね?

427 :デフォルトの名無しさん:2009/08/14(金) 18:57:08
『明解C言語 入門編』
です。
これって名著と聞いてますが。

428 :デフォルトの名無しさん:2009/08/14(金) 19:06:43
良く売れてますよ。

でも、C言語の入門書でK&R第2版を超えるものはひとつもありません。
特にUNIXシステムインタフェースの章は重要で、
システム依存のコード(システムコールを用いるコード)とどのように折り合いをつけるか、
平易に説明してくれる入門書はこれくらいのものでしょう。
結局、C言語はアセンブラに近しいところで利用されるので
このような低水準の話題は避けて通れないのです。
でも日本人が書いた入門書はそのへん全部無視しやがってアホか。

429 :デフォルトの名無しさん:2009/08/14(金) 19:17:12
>>428
ありがとうです。
K&Rの正式な書名をよかったら。書店で探してみます。

430 :デフォルトの名無しさん:2009/08/14(金) 19:19:56
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)

431 :デフォルトの名無しさん:2009/08/14(金) 19:34:26
>>430
ありがとうです。
明日さっそく書店へ行きます。

432 :デフォルトの名無しさん:2009/08/14(金) 19:54:38
>>416
入力した c ソースをコンパイルして、実行ファイルを指定して実行していますか?
意味がわからなければ、さわりでコンパイルの方法が書いてある書籍をさがすか、人にきいてみてください。

433 :デフォルトの名無しさん:2009/08/14(金) 19:55:53
>>431
最初の最初に読む書籍ではないことに注意してください。ある程度の経験が必要です。

434 :デフォルトの名無しさん:2009/08/14(金) 20:13:44
最初の最初に読むのにいい本があったら教えて、誰かエロい人!

435 :デフォルトの名無しさん:2009/08/14(金) 20:18:29
書籍スレへどうぞ。

436 :デフォルトの名無しさん:2009/08/14(金) 20:18:39
もともとC言語を他の言語の経験なしに最初に学ぼうという時点で無謀だ。w
せいぜいテキストファイルを読み込んで集計する程度のプログラムしか書かないなら
C言語を使う理由など皆無に等しく、そんなものはBASICで十分だろう。

C言語は(BASICに比べれば)難解で保守しにくく、
それでもなおC言語を使うのはC言語には低水準固有のパワーが備わっているからだ。

そういうプログラムを書きたいと望むものが
K&Rの内容も読めないなら、
実際にプログラムをしようとしたとき、
C言語よりも遥かに難解なハードやOSを前にして
ただただ途方にくれるだけだろう。

437 :デフォルトの名無しさん:2009/08/14(金) 20:19:09
入門レベルならWebでいいんじゃねぇの

438 :デフォルトの名無しさん:2009/08/14(金) 20:28:47
BASICってVisualBasic?
Cより難解で複雑で混沌としてんじゃねーか

439 :デフォルトの名無しさん:2009/08/14(金) 20:30:36
最初にC習って特に問題なかった俺は天才ということだな

440 :デフォルトの名無しさん:2009/08/14(金) 20:44:06
>>439
俺もだ、天才同志よ。

441 :デフォルトの名無しさん:2009/08/14(金) 20:45:19
C言語だとファイルの削除はremove(fileName)でできましたが、
C++だとどうやってファイルを削除しますか?

442 :デフォルトの名無しさん:2009/08/14(金) 20:50:55
std::remove(fileName)

443 :デフォルトの名無しさん:2009/08/14(金) 20:52:40
>>442
ありがとうございます。
チュ♥

444 :デフォルトの名無しさん:2009/08/14(金) 21:13:13
STDMETHODってなんでしょうか?

445 :デフォルトの名無しさん:2009/08/14(金) 21:23:40
COMで使われるマクロです

446 :デフォルトの名無しさん:2009/08/14(金) 21:27:03
そんな用語はないよ?



447 :デフォルトの名無しさん:2009/08/14(金) 21:31:45
俺も秀才なんで、Cから始めます。

448 :デフォルトの名無しさん:2009/08/14(金) 22:12:18
俺おくてだから、勇気を出してCから始めます。

449 :デフォルトの名無しさん:2009/08/14(金) 22:20:34
vecterとかmapのデフォルトコンストラクタってメモリ確保しないよね?

450 :デフォルトの名無しさん:2009/08/14(金) 22:58:41
実装依存だから確実ではないけど、普通は確保しないよ。

451 :デフォルトの名無しさん:2009/08/15(土) 00:08:57
stlportって何ですか?
ググってみると良いことずくめに書いてあるんですが。


452 :デフォルトの名無しさん:2009/08/15(土) 00:33:47
演算子のオーバーロードを勉強中です。
コンパイルエラー出ます。本のサンプルプログラムなんですが。

a.c:17: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
string.h:21: note: candidate 1: char& String::operator[](size_t)
a.c:17: note: candidate 2: operator[](char*, int) <built-in>

です。原因は何でしょうか?エラーメッセージがよくわかりません。

もし、ソースコードが必要なら乗せます。

453 :デフォルトの名無しさん:2009/08/15(土) 00:34:37
>>438が釣りなのかどうか判断つかん

454 :デフォルトの名無しさん:2009/08/15(土) 08:02:56
>>452
必要に決まってるじゃん。
codepad
ttp://codepad.org/

ここで。

455 :デフォルトの名無しさん:2009/08/15(土) 14:37:26
C++のサンプルコードが載ってるデザインパターンの本で良書あります?

456 :デフォルトの名無しさん:2009/08/15(土) 15:43:32
>>451
VC6のころは必須だった。 今は別になくてもいい。

457 :デフォルトの名無しさん:2009/08/15(土) 17:39:41
ゲーム内に存在するユニット(プレイヤー、モンスター、障害物など)にユニークIDを付けたいんだけど
アドレスをintにして返すだけの基底クラスを継承させれば問題ないかな?


458 :デフォルトの名無しさん:2009/08/15(土) 17:48:24
アドレスをハッシュにするのはよくある手段だな
ポインタ型のサイズが変わったときにちょっとハマるかもしれんから
ハッシュ同士を==,!=で比較する以外の使い方をするときには注意が必要になるだろう
できれば専用の型でラップして使うべきだろうな

459 :デフォルトの名無しさん:2009/08/15(土) 17:56:05
intptr_tなりUINT_PTRなりをtypedefしてxxx_IDとして用いれば大丈夫だろうね。

460 :デフォルトの名無しさん:2009/08/15(土) 18:26:48
>>455
独習C++デザインパターンかなぁ。この手の本は殆どがJavaで書かれてるからC++の本は少ないな。

461 :デフォルトの名無しさん:2009/08/15(土) 19:14:22
「Java謎+落とし穴」という書籍の中でC++はリフレクションが弱い、との記述があったのですがこれは事実でしょうか?
かなり古い本なので最近のC++のリフレクション周りについて知りたいです。
できればJava、C++、C#辺りのリフレクションの違いについて教えて頂けると有り難いです。
よろしくお願いします。

462 :デフォルトの名無しさん:2009/08/15(土) 20:03:39
>>461
弱いどころか無いに等しいよ。
リフレクションが必要ならインタプリタ言語にまかせよう。

463 :デフォルトの名無しさん:2009/08/15(土) 20:06:02
C/C++で、
 aa(), bb(), cc()
とした場合、この式の評価順序は
 aa()が最初で次がbb()で次がcc()
ということは仕様で保証されていますか?


関数の引数の評価順序は保証されていないということだそうで。

464 :デフォルトの名無しさん:2009/08/15(土) 20:15:32
>>463
この場合はコンマ演算子だから、左から右へ評価されることは保障されており、かつ値は最後に評価したものですね。

465 :463:2009/08/15(土) 20:53:28
>>464
ありがとうございます。
ではそれに依存してコーディングしていきたいと思います。

466 :461:2009/08/15(土) 21:07:09
>>462
ありがとうございます。
クラスやメソッドを実行時に決定したい場合などは諦めるしかないのでしょうか?
あるいはそういう需要があること自体、設計がおかしいという判断になるのかな

467 :デフォルトの名無しさん:2009/08/15(土) 21:11:00
>>466
> クラスやメソッドを実行時に決定したい場合などは諦めるしかないのでしょうか?
C++には継承と仮想関数がありますからそれをうまく使ってください。

> あるいはそういう需要があること自体、設計がおかしいという判断になるのかな
if(flag)
{hoge.foo();}
else
{hoge.bar();}
こんなことは良くやりますけど。

あとはC++には関数ポインタもありますねぇ。

468 :デフォルトの名無しさん:2009/08/15(土) 21:21:59
場合分けはさすがに無いだろw
まぁJavaでもClassクラスなんて使うのは最終手段だし設計を見直すのが吉だろうな

469 :デフォルトの名無しさん:2009/08/15(土) 21:36:03
>>466
ポリモーフィズムがあるんだから利用しない手はないだろ。
実行時に型を決定したいなんて結構あるんじゃないか?
それがあってるのかどうかは知らんが。

470 :デフォルトの名無しさん:2009/08/15(土) 22:20:55
C++プログラミングの筋と定石 (新紀元社情報工学シリーズ)

この本を読むのじゃ。
お前様のほしい情報が載っておるぞ。
あたら高度だけど。

471 :デフォルトの名無しさん:2009/08/15(土) 22:33:03
滅茶苦茶古い本だぞそれ

472 :デフォルトの名無しさん:2009/08/15(土) 22:57:12
古いけどナイスガイ

473 :デフォルトの名無しさん:2009/08/15(土) 22:58:16
宣伝は他でやれ

474 :デフォルトの名無しさん:2009/08/15(土) 23:01:16
宣伝だと思うなら無視すればいいじゃない。
宣伝しなくても名著だからみんな知ってるだろうし。
MoreEffective C++でも推薦されてたくらいの本だから
もちろん、君も知ってるよね?

475 :デフォルトの名無しさん:2009/08/15(土) 23:23:04
あぁ原書は有名だけど翻訳が糞過ぎて読む気無くなったなそれ

476 :デフォルトの名無しさん:2009/08/15(土) 23:25:28
どう見ても宣伝だわw

477 :デフォルトの名無しさん:2009/08/16(日) 19:02:57
Baseクラスと、Baseをpublic継承したDerivedクラスがあります。

Derived hoge;
void foo(const Base&);//1
void foo(const Derived&);//2

となっている時、
foo()//1にhogeを渡したいのですが、どうすればよいでしょうか?

foo(static_cast<Base>(hoge));
だと無駄なテンポラリオブジェクトができてしまいますか?



478 :デフォルトの名無しさん:2009/08/16(日) 19:41:38
// 値型のキャストだとコピーになるが、参照型でキャストすればコピーは発生しない
foo(static_cast<Base&>(hoge));

479 :477:2009/08/16(日) 20:00:14
>>478
ありがとうございます。

ということは
Derived hoge;

const Derived& hoge = ...
であった場合は
foo(static_cast< const Base& >(hoge));
であっていますか?

480 :デフォルトの名無しさん:2009/08/16(日) 20:01:39
C++でもassertって使うの?

481 :デフォルトの名無しさん:2009/08/16(日) 20:15:06
#include <iostream>
using namespace std;
class Base{};
class Derived : public Base {};

void foo(const Base&){cout << "Base" << endl;}
template<class T>
void foo(const T&){cout << "T" << endl;}

int main()
{
Derived hoge;
foo(hoge);
return 0;
}

これでTが表示されるのは、
基底クラスへキャストするよりもテンプレートの方が優先される
ためだと思いますが、
この動作はC++の仕様でしょうか?

482 :デフォルトの名無しさん:2009/08/16(日) 20:37:48
>>480
使うよ。用途はCと一緒でしょ。

483 :デフォルトの名無しさん:2009/08/16(日) 21:28:27
C++です。

ヘッダファイルに書かれた関数テンプレートを
どんなときにinline宣言すべきか分かりません。
明らかに短い時はinline宣言しますが、
どのあたりの長さからしない方がよくなるのでしょうか?

484 :デフォルトの名無しさん:2009/08/16(日) 21:35:07
ほっとけばinline

485 :483:2009/08/16(日) 21:38:31
>>484
ええと、ヘッダファイルに書かれた関数テンプレートでも
明示的にinlineと書かない限り
(コンパイラによる最適化以外では)
inlineにはならないと思っているのですが。


486 :デフォルトの名無しさん:2009/08/16(日) 21:50:02
異なるcppファイルに同じヘッダを読み込んで、各々のオブジェクトファイルで実体化されたら
リンク時にカチ合うじゃないか。

487 :デフォルトの名無しさん:2009/08/16(日) 21:51:34
>>485
Efficient C++(Effectiveじゃないよ)の9章と10章に載ってなる。
具体的には130ページに、行数(命令数か)と呼び出し頻度で決めなさいと書いてある。
あと、見た目のコード自体は短くても実際はそうでもないことがあるから注意な。

まあ、コンパイラの判断でインライン展開されるからinlineと書いたところで
必ずインラインになるとは限らんしな。

488 :デフォルトの名無しさん:2009/08/16(日) 21:52:23
すみませんが構造体配列の初期化で全てを同じ値にしたいのですが上手くいきません
どこが間違っているのでしょうか?

struct Piece_t {
int Kind;
int State;
};

struct Piece_t Piece[(MAX_MASS + 2) * (MAX_MASS + 2)]={3,0};


489 :デフォルトの名無しさん:2009/08/16(日) 22:01:08
初期値は必要な数だけ与えてやらんとだめ

struct Piece_t Piece[5] = { {3,0}, {3,0}, {3,0}, {3,0}, {3,0}, };

490 :デフォルトの名無しさん:2009/08/16(日) 22:09:04
では要素数が可変の場合にはそれを上回る数を
あらかじめ用意するしかないのでしょうか?

491 :デフォルトの名無しさん:2009/08/16(日) 22:14:24
forで回すなり、memsetするなりあるだろう。配列なら要素数も分かるだろ?

492 :デフォルトの名無しさん:2009/08/16(日) 22:17:25
ああ…forで回せば良いのか…
疲れてたみたいです
アドバイス有難うございました

493 :483 :2009/08/16(日) 22:50:53
>>486
普通の関数ではそうですが、
関数テンプレートの場合はその限りではないと
記憶しています。



>>487
ありがとうございます。
Efficient C++は読んだこと無いので、
今度探ってみます。


494 :デフォルトの名無しさん:2009/08/17(月) 00:31:52
いつもデバックなしで実行しているのですが、
リリースモードで実行するにはどうしたらいいですか?

495 :デフォルトの名無しさん:2009/08/17(月) 00:35:43
まず、使っているコンパイラーを(ry

496 :デフォルトの名無しさん:2009/08/17(月) 01:33:32
Intel C++コンパイラです。

497 :デフォルトの名無しさん:2009/08/17(月) 10:20:38
>>496
使っているIDEのマニュアルでも読んでください。

498 :デフォルトの名無しさん:2009/08/17(月) 11:07:11

if(flag_1)
return val_1;
else if(flag_2)
return val_2;
else if(flag_3)
return val_3;
これと
if(flag_1)
return val_1;
if(flag_2)
return val_2;
if(flag_3)
return val_3;
これはどちらが速いのでしょうか?

499 :デフォルトの名無しさん:2009/08/17(月) 12:04:51
>>498
return文を使って関数から抜け出しているので、前者も後者も比較回数は同じになる。
また、return文を使って関数から抜け出しているので、前の条件が偽であるときしか後の条件を判断されないことになる。
よってelseを使う必要はない。
よって後者でおk。

ただ、速さが変わるかどうかは俺にはわかんね。

500 :デフォルトの名無しさん:2009/08/17(月) 12:15:09
繰り返し文でその都度printfで結果を表示させたいのですが
古いほうから消えていきます。結果を全部残すにはどうすればいいですか

501 :デフォルトの名無しさん:2009/08/17(月) 12:16:12
>>500
リダイレクトする。

502 :デフォルトの名無しさん:2009/08/17(月) 12:28:15
>>498
少なくとも私は後者の方が速くタイプできました。

503 :デフォルトの名無しさん:2009/08/17(月) 12:36:21
>>501
なるほど。それでググったら出来ました。ありがとうございます

504 :498:2009/08/17(月) 12:45:18
>>499
ありがとうございます。

速さは・・・elseがない方がむしろ速いとか、
あった方が処理が分かりやすくて最適化しやすいとか
同一のasmに落ち着くから関係ないとか色々と考えられそうです。

ま、あまり気にしないのが正解なのでしょうか。

BoostやGCCの実装とかで同じような物があるかどうか探してみたいです。

505 :デフォルトの名無しさん:2009/08/17(月) 13:32:44
>>504
こっちに似たような話があるから気になるなら参加したら?
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1247937958/

506 :504:2009/08/17(月) 14:21:07
>>505
みんな同じようなこと考えるんですね。
行ってみるかもしれません。
ありがとうございます。

507 :デフォルトの名無しさん:2009/08/17(月) 14:43:09
えっ?

508 :デフォルトの名無しさん:2009/08/17(月) 15:13:20
タイピングを楽にする為だけの#defineもtypedefにしたほうがいいのかな
テンプレートっぽいことができるのと#undefがある分有利な気がするんだけど


509 :デフォルトの名無しさん:2009/08/17(月) 15:56:43
>>508
typedefに代えていけるならお薦め。

> テンプレートっぽいことができるのと
そりゃtypedefに代えていけないってことじゃん。

> #undefがある分有利な気がするんだけど
どうして?むしろ不利だろ?
typedefなら同名の物とかち合ったらコンパイルエラーになれる。


510 :デフォルトの名無しさん:2009/08/17(月) 21:16:01
非同期ファイル読み書きには
Win32APIのCreateFileしか方法ないの?

511 :デフォルトの名無しさん:2009/08/17(月) 21:20:56
スレッドを使ってみるとか

512 :デフォルトの名無しさん:2009/08/17(月) 22:33:25
>>498
gccでコンパイルすると同じになったからどっちも同じ

513 :デフォルトの名無しさん:2009/08/19(水) 09:21:13
C++でCGIをはじめました。POSTで日本語を受け取った場合URIエンコードされますがデコードのやり方が分からず困っています。
例えば あ であれば
%82%A0になりますが
どのようにすれば元の文字に戻せるのか
わかる方いましたらよろしくお願いします。
ソースを頂けたらなおありがたいです。

514 :デフォルトの名無しさん:2009/08/19(水) 09:37:31
スレチな気もするが…
http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html

515 :デフォルトの名無しさん:2009/08/19(水) 10:20:59
.lib+.hで提供されているライブラリをまとめて適当な名前空間に入れたいんですが
なにかいい方法はないでしょうか


516 :デフォルトの名無しさん:2009/08/19(水) 11:26:18
>>515
.libだと真っ当な方法では無理。
せいぜいがDLLに隔離して新しいインターフェースを丸ごと書き直すぐらいかと。

517 :デフォルトの名無しさん:2009/08/19(水) 12:10:07
514さん
大変参考になりました。
私もスレチかと思いましたがそれでも 教えて頂けて本当に感謝しております。ありがとうございました。

518 :デフォルトの名無しさん:2009/08/19(水) 14:18:30
インターフェースに宣言されているメンバ関数をコンストラクタのように連鎖的に呼び出したい場合
スコープ解決して普通に呼び出しを繰り返すすほかになにかやり方はありますか?


519 :デフォルトの名無しさん:2009/08/19(水) 16:37:47
>>518
具体的にどういうコードで問題になってるのかわからん。
インタフェースって抽象クラスのことか?

520 :デフォルトの名無しさん:2009/08/19(水) 17:19:45
pthreadについて。

pthread_createで作成したスレッドを、スレッド外から終了させたいのだが。
名前的にはpthread_t指定してpthread_killぽいと思ったんだが、うまくいってないぽ...

どうすればいいの\(^o^)/

521 :デフォルトの名無しさん:2009/08/19(水) 17:25:29
signal(pthread_killの第二引数)は何を指定した?
まさか0じゃないだろうな?
int pthread_cancel(pthread_t)じゃ駄目?

522 :デフォルトの名無しさん:2009/08/19(水) 18:31:55
0さーせんwwwwww

cancelで終了した!
さんくす

523 :デフォルトの名無しさん:2009/08/19(水) 20:17:23
ofsream.flush()でファイル出力時に
ディスクの容量オーバーの場合エラーにする事てできます?
例外がスローされずにフリーズしてしまいます…

524 :デフォルトの名無しさん:2009/08/19(水) 20:22:21
>>523
OSなどの環境は?

525 :デフォルトの名無しさん:2009/08/19(水) 21:40:41
>>524
すいません、linux + c++ + gcc です。

プログラムからシェルコマンドでディスク容量の結果とって調べる
とかは可能です?

526 :デフォルトの名無しさん:2009/08/19(水) 22:27:51
>>523
ofstreamの bad()/fail()/good()あたりのメンバ関数で判断できるんじゃないかな。

527 :デフォルトの名無しさん:2009/08/19(水) 22:43:20
APIを探してくるしかなさそうだな。

528 :デフォルトの名無しさん:2009/08/19(水) 23:56:33
>>523
C++のストリームクラスで例外が投げられるようにするには、
予めメンバ関数exceptionsで例外を投げるよう指定する必要があるよ。

529 :523:2009/08/20(木) 14:19:06
レスおそくなりすみません。
一応解決しました、ブロックが全て埋まりますが、
>>526のfail()で判定できました。
ありがとうございました。

530 :デフォルトの名無しさん:2009/08/20(木) 18:46:59
メンバ関数の名前ってインスタンスが主語になるように名付けたほうがいいですか?

531 :デフォルトの名無しさん:2009/08/20(木) 20:10:13
大抵そうじゃない?

532 :デフォルトの名無しさん:2009/08/20(木) 20:18:46
>>530
is_invalid()
とかね。
むしろそうじゃないのってなに?


533 :デフォルトの名無しさん:2009/08/20(木) 20:36:17
getter/setterとしてのgetName()は、
インスタンスを主語にするんなら、returnName()じゃね?

534 :デフォルトの名無しさん:2009/08/20(木) 21:01:57
>>533
あーなるほど。


535 :デフォルトの名無しさん:2009/08/20(木) 21:50:52
itsName()

536 :デフォルトの名無しさん:2009/08/20(木) 23:50:26
>>533
インスタンスに対する命令語だから、Set / Get でいいのでは?
そうなるとこの場合、主語は無しだけど。

protected / private メンバ関数だと自動詞、
public メンバ関数だと他動詞になりやすくない?


537 :デフォルトの名無しさん:2009/08/20(木) 23:58:53
>>536
命令だとしてもインスタンスに対してGetってのは
やっぱおかしくない?
ちなみに英語では命令文の主語は通例省略されるだけでありyouだ。

とりあえず標準C++で考えて見ると
C++文字列(std::string)
ttp://www.cppll.jp/cppreference/cppstring.html
C++ ベクタ(std::vector)
ttp://www.cppll.jp/cppreference/cppvector.html

例が悪い気がしてきた(笑)


538 :デフォルトの名無しさん:2009/08/21(金) 00:17:06
イテレータが分からなかった時の
begin()とかend()とかの怖さといったら。

539 :デフォルトの名無しさん:2009/08/21(金) 02:53:16
C++の設計について質問です。

たとえば、ゲームの当たり判定を計算する関数郡を内包した「当たり判定計算クラス」を作り、
その計算クラスを扱う「当たり判定制御クラス」を作ったとして、
当たり判定制御クラスに計算クラスのオブジェクトアドレスを渡す際に、
生成もすべて任せるべきでしょうか? それとも、生成はまた別のクラスで行い、その後に渡すべきですか?

どうも調べていると、「生成は別にすべき」とよく目にするのですが、
この場合、「計算クラス」を使うのは「制御クラス」以外にありえず、
いちいち別で生成するメリットが見出せません。

オブジェクトを生成するファクトリクラスなる概念が出てくるのですが、
これというのは自機や敵機という具体的なオブジェクト以外にも、
こういった計算クラスのオブジェクトの生成も担うべきなのでしょうか

540 :デフォルトの名無しさん:2009/08/21(金) 03:17:07
>計算クラスのオブジェクトアドレスを渡す際に、生成
何を生成?

541 :539:2009/08/21(金) 05:09:32
説明不足でした、すみません

CAtari* a; ←アドレスなので宣言の時点では生成されていない
a = new CAtari( 引数 ); // コンストラクタを呼び出してオブジェクト生成
↑これを、制御クラスで行うか、生成クラスを作って行うか?

制御クラスで行う場合、
CControlAtari* b;
b = new CControlAtari( a, 他引数 ); // コンストラクタに計算クラスオブジェクトを渡す
↑このようにして、bのコンストラクタでaの生成を行います
 aの解放もbのデストラクタで行います

542 :デフォルトの名無しさん:2009/08/21(金) 08:58:05
特別な理由でもない限りオブジェクトファクトリー使う必要はないよ

ただ、newしてないポインタを渡すぐらいなら
呼び元でnewしたほうがいいのでは

543 :デフォルトの名無しさん:2009/08/21(金) 09:03:57
どうしたらここで言ってることが理解できるようになりますか?

544 :デフォルトの名無しさん:2009/08/21(金) 09:21:39
コードを沢山書いて、人のコードも沢山読んで、
んで頑張る。

545 :デフォルトの名無しさん:2009/08/21(金) 09:43:44
当たり判定なんて座標渡して結果を受け取るだけでいいんじゃないのか?

546 :デフォルトの名無しさん:2009/08/21(金) 12:32:25
private:int m_xがあるとして
get_x()よりpublic:const int& xのほうがクライアントコードも短いしいいんじゃないですか?


547 :デフォルトの名無しさん:2009/08/21(金) 12:46:48
それするならpublic: int xでいいじゃない

548 :デフォルトの名無しさん:2009/08/21(金) 12:57:07
>>546
const_castで値が変更できそうなのは見なかったことにしても
メモリの無駄じゃないかな

549 :デフォルトの名無しさん:2009/08/21(金) 13:35:25
実行中に自身のクラス名(C++の)を取得する簡単な方法ってある?

550 :デフォルトの名無しさん:2009/08/21(金) 13:39:28
typeid(*this).name()

551 :デフォルトの名無しさん:2009/08/21(金) 13:41:00
template<int i> 〜〜
ここでi=1〜8までならコンパイル可能
それ以外だとエラー(できればメッセージつきで)
という具合にできますか?


552 :549:2009/08/21(金) 13:50:47
>>550
ありがとう。

553 :デフォルトの名無しさん:2009/08/21(金) 13:58:23
>>551
boost::mplとかテンプレートメタプログラミングとかBOOST_STATIC_ASSERTで検索。

554 :デフォルトの名無しさん:2009/08/21(金) 14:16:09
>>551
#include <boost/mpl/int.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/comparison.hpp>

namespace mpl = boost::mpl;

template <int X>
struct S {
BOOST_MPL_ASSERT_MSG
((mpl::and_<
mpl::less_equal< mpl::int_<1>, mpl::int_<X> >,
mpl::greater_equal< mpl::int_<X>, mpl::int_<8> > >::value),
X_SHOULD_BE_GE_1_AND_LE_8, (mpl::int_<X>));
};

int main()
{
// S<9> s9;
// S<8> s8;
S<0> s0;
return 0;
}

ASSERT_MSGがそのものズバリですな
最後の引数に任意の型を放り込めるんで、
型タプル(?)と併用して複数の型を一括inspectとかお手のものです

555 :デフォルトの名無しさん:2009/08/21(金) 15:18:43
テンプレートメタプログラミングって
本当に使える人って天才だと思うんだけど。

すごくね?
俺だったら気が狂いそう。


556 :デフォルトの名無しさん:2009/08/21(金) 15:44:25
シングルトンって継承しない前提のものなの?


557 :デフォルトの名無しさん:2009/08/21(金) 20:19:35
>>539
別にするべきって言うか、別にしないと当たり判定クラスが
何のクラスか分からなくなってくると思うよ。
当たり判定クラスしかオブジェクト持ってないと
たとえば、自キャラの入力受付とか、敵キャラの生成・死亡管理とかも
当たり判定クラスでやらざるを得なくなる。

558 :デフォルトの名無しさん:2009/08/21(金) 20:31:02
>>557
え?
入力受付オブジェクトとか、敵キャラオブジェクトをどこかで持てばいいだけじゃないの?
当たり判定オブジェクトが入力受付オブジェクトとか、敵キャラオブジェクトを持つ意味ないでしょ?

559 :557:2009/08/21(金) 20:49:28
あー、ごめん。完全に勘違いしてた。
自機、敵機のオブジェクトのことだと思ってた。

計算クラスと制御クラスの違いが良く分からん。
計算クラスは関数オブジェクトか何かか?
だとすれば計算クラスは別の生成で良いんじゃない?
計算クラスの関数そのモノを継承して処理方法かえれるし。
当たり判定による難易度調整もできるんでない?

560 :デフォルトの名無しさん:2009/08/21(金) 21:17:01
メディエータにcreateHogeColleagueみたいなメソッドを作るべきかどうかってことなら
それよりファクトリクラスをほかに作って、そのインスタンスをメディエータにもたせればいいんじゃないかな

561 :デフォルトの名無しさん:2009/08/21(金) 21:50:14
なるほど。生成を別にしとけば、処理のさし替えをする際に
生成クラスにだけ注目できるメリットがありますね

562 :デフォルトの名無しさん:2009/08/22(土) 22:54:54
http://www1.axfc.net/uploader/File/so/29467.txt

こういうことって安全なの?

563 :デフォルトの名無しさん:2009/08/22(土) 23:05:55
大丈夫だよ。
#include っていうのは単にそこに文字列が展開されるだけだから

IntListクラスの宣言
IntListクラスの利用
IntListクラスの定義

っていう順番になってるだけ。

564 :デフォルトの名無しさん:2009/08/23(日) 21:12:28
staticメンバ変数は静的メンバ変数と言いますが、
constメンバ変数は何メンバ変数と言えばよろしいでしょうか?


565 :デフォルトの名無しさん:2009/08/23(日) 21:31:56
白米を指して麦の種類を聞いているみたいな

566 :デフォルトの名無しさん:2009/08/23(日) 21:40:18
>>565


567 :デフォルトの名無しさん:2009/08/23(日) 21:54:01
“変”数


568 :デフォルトの名無しさん:2009/08/23(日) 22:41:21
変なの

569 :デフォルトの名無しさん:2009/08/24(月) 00:25:11
仮に const を定数メンバ変数などと名前をつけたとして
では static const なメンバ変数はなんと呼べばいいのか。
それはつまり性的定子メンバであり
愛のコリーダである、と。

570 :デフォルトの名無しさん:2009/08/24(月) 00:29:16
今作っているプログラムからffmpegを呼び出したいのですが
なんてググればいいですか?

571 :デフォルトの名無しさん:2009/08/24(月) 00:32:29
system

572 :デフォルトの名無しさん:2009/08/24(月) 01:10:51
どうもです

573 :デフォルトの名無しさん:2009/08/24(月) 02:23:05
ShellExecuteEx()の方がいいだろ

574 :デフォルトの名無しさん:2009/08/24(月) 02:37:30
なにその非標準関数。

575 :デフォルトの名無しさん:2009/08/24(月) 06:52:17
>>573
すげー環境依存w
まあsystemも同じようなものか。

576 :デフォルトの名無しさん:2009/08/24(月) 11:59:27
template<class T>
class C {
};

template<>
class C<int> {
void F() {
}
};

としたときC<int>::F()でint直記述ではなくTの値を使いたいのですが、方法はありますでしょうか?
よろしくお願いします

577 :デフォルトの名無しさん:2009/08/24(月) 12:24:16
typedef int T;

578 :デフォルトの名無しさん:2009/08/24(月) 14:23:34
特殊化しといてT使いたいとか意味がわからんですよ

579 :デフォルトの名無しさん:2009/08/24(月) 14:37:37
興味のない方はすみません(スルーお願いします。)
新しくコンテストを来年開きたいと思っています
プログラマー(ゲーム・ツール・)の方は
http://pc12.2ch.net/test/read.cgi/tech/1221701297/l50
のスレに来てもらえるとうれしいです。
運営も募集しています。
↓のような感じでコンテストを開始する予定です。
http://219.113.110.143/


580 :デフォルトの名無しさん:2009/08/24(月) 17:50:57
template<typename T>void F(){}
template<typename T>class C{template<>friend void F<T>();};
template<>class C<int>{template<typename T>friend void F();};

みたいな事したいって話?

581 :デフォルトの名無しさん:2009/08/24(月) 19:31:36
クラスAのインスタンスの参照をもっているクラスBのインスタンスが複数あるとき
Aの寿命がすべてのBより長いことを保障したい
shared_ptr以外にいい方法はありますか


582 :デフォルトの名無しさん:2009/08/24(月) 21:18:06
>>581
なぜshared_ptrじゃ不満なのだい?

583 :デフォルトの名無しさん:2009/08/24(月) 22:06:32
>>578
複数箇所に同じ定数値を記述する手間を省きたかったので

>>580
目的としてはそれに近いですがfriendは使いたくないです


アクセスする方法はなさそうですね、ありがとうございました

584 :デフォルトの名無しさん:2009/08/25(火) 18:00:06
32ビットマシンでコンパイルしたバイナリは16 64ビットマシンだと動かないんですか?

585 :デフォルトの名無しさん:2009/08/25(火) 18:16:06
動くか動かないかは、コンパイルしたマシンで決まるわけではありません

586 :デフォルトの名無しさん:2009/08/25(火) 21:53:02
>>581スタティックに保障したいということならば、構造化を考えればいい。
スコープの外側で宣言した変数の参照をスコープ内だけで使用するのであれば
寿命の関係はスコープの外側>スコープの内側になる。C++の参照はこれに則っている。




587 :デフォルトの名無しさん:2009/08/25(火) 23:43:19
質問っす
double d;
〜dを使った計算〜
int i = (int)(d * 32767.0);
てな計算があったんですけどこれの意味わかる方いらっしゃらないでしょうか?
32767という数字からしてただのかけ算じゃない気がするのです。

588 :デフォルトの名無しさん:2009/08/25(火) 23:50:06
http://www.google.co.jp/search?q=32767.0
でパッと眺めて使われているのはRAND_MAX関係での割り算と
あとは座標関係が多いようだが、さて。

589 :デフォルトの名無しさん:2009/08/25(火) 23:52:49
>>587
その行だけ見たら「ただのかけ算」としか言いようがないぞ。


590 :デフォルトの名無しさん:2009/08/26(水) 00:09:11
何かイデオムでもあるのかと思ったのですがそういう訳でもないみたいですね
もう少し自力で調べてみます

591 :デフォルトの名無しさん:2009/08/26(水) 01:28:09
文字変数aに『b』という文字、文字変数bに『c』という文字を代入して、変数aとcを使って、『db』と出力するプログラムを作成せよ




#include<iostream>
using namespace std;

int main() {

char a = 'b';
char c = 'd';

cout << "db" << '\n';

return 0;
}

この問題これじゃダメなんですか?

592 :デフォルトの名無しさん:2009/08/26(水) 01:45:18
g++先生に聞いてみたら、
> db.cpp: In function ‘int main()’:
> db.cpp:6: warning: unused variable ‘a’
> db.cpp:7: warning: unused variable ‘c’

unusedだって。

593 :デフォルトの名無しさん:2009/08/26(水) 09:25:46
>>591
#include <iostream>
int main()
{
char a = 'b';
char c = 'd';
std::cout << char(a + 2) << char(c - 2) << std::endl;
return 0;
}

594 :デフォルトの名無しさん:2009/08/26(水) 10:58:16
>>591
つ[変数aとcを使って]

595 :デフォルトの名無しさん:2009/08/26(水) 11:08:55
> 文字変数bに『c』という文字を代入
これが
> 文字変数cに『d』という文字を代入
の誤記として

#include<iostream>
using namespace std;

int main() {
char a
char c;

a = 'b';
c = 'd';

cout << "db" << '\n';

return 0;
}

とすればどうだろうか

596 :デフォルトの名無しさん:2009/08/26(水) 11:52:14
>文字変数aに『b』という文字、文字変数bに『c』という文字を代入して、
ふんふん。
>変数aとcを使って、
あれcどっから出てきてんねん。
>『db』と出力するプログラムを作成せよ
おいぃぃぃーーー!

という突っ込み待ち問題w

597 :デフォルトの名無しさん:2009/08/26(水) 12:45:53
class foo{public:typedef shared_ptr<foo> sp;}

typedef shared_ptr<foo> spfoo;

どっちがいい?

598 :デフォルトの名無しさん:2009/08/26(水) 18:39:31
namespace使おうぜ

599 :デフォルトの名無しさん:2009/08/26(水) 19:37:45
namespaceとtypedefが関数内で使えるなんて
おじさん知らなかったよ

600 :デフォルトの名無しさん:2009/08/26(水) 22:14:02
int main {
namespace A { enum U { a, b, c }; }
}

ってやったらエラーでたよ?

601 :デフォルトの名無しさん:2009/08/26(水) 22:29:31
そりゃ出るだろ

602 :デフォルトの名無しさん:2009/08/26(水) 22:33:50
>>599が「namespaceは関数内で使える」って言ってるのに
main関数内では使えないなんて!

603 :デフォルトの名無しさん:2009/08/26(水) 23:48:29
>>595
ありがとうございます。つまり、>>594さんが言ってるのと合わせると、aとcっていうのを変数である、としてから、
作るって事なんでしょうか?

604 :デフォルトの名無しさん:2009/08/27(木) 00:17:26
「何か質問してください」って泣いて頼むんだったら質問してやってもいいよ( ・ω・)y─┛〜〜

605 :デフォルトの名無しさん:2009/08/27(木) 00:24:55
消えてください(´;ω;`)

606 :デフォルトの名無しさん:2009/08/27(木) 00:58:12
関数の引数で要素数の分からない二次元配列を受け取るにはどうすればいいですか?
決まった要素数でなく、様々な要素数の二次元配列に対応させたいんですが

607 :デフォルトの名無しさん:2009/08/27(木) 01:03:30
template<typename T,size_t T0,sizet T1>T func(T x[T0][T1]);

608 :デフォルトの名無しさん:2009/08/27(木) 01:19:04
ごめんなさいCなんでテンプレートなしで

609 :デフォルトの名無しさん:2009/08/27(木) 01:39:19
タスクシステムってようはコマンドパターンのリストみたいなもん?

610 :デフォルトの名無しさん:2009/08/27(木) 02:27:50
配列とSTLリストについての質問です。

配列を配列のままアクセスする場合と、ポインタ型のリストに入れてアクセスする場合
かなりの差が出てしまうのでしょうか?


<具体例>
あるクラス Aがあるとします。
A a[1000]; //A型の配列a
list<A*> list; //Aのポインタ型リスト list

と配列とリストを作り、listには配列aを1000個すべて入れていきます。(順序は関係なく)
配列aとリストlistをそれぞれ始めから終わりまでアクセスする。






611 :デフォルトの名無しさん:2009/08/27(木) 02:30:34
日本語が不十分でした。

かなりの差が出てしまうのでしょうか?

かなり速度において差が出てしまうのでしょうか?


追記:低スペックにおいての場合です。


612 :デフォルトの名無しさん:2009/08/27(木) 03:40:15
実際にやってみて比較すればいいだけじゃん。

613 :デフォルトの名無しさん:2009/08/27(木) 06:46:01
>>610
その単純な使い方なら、配列のほうが早いだろう。
しかし、実際に使うときは、使い方と処理方法により変わる。
いわゆる、適材適所だ。

614 :デフォルトの名無しさん:2009/08/27(木) 11:47:43
>>606
せめて C FAQ くらい読もうか。
ttp://www.kouno.jp/home/c_faq/c6.html#19

615 :デフォルトの名無しさん:2009/08/27(木) 12:08:51
先に書き込まれていたでござる
typedef unsigned long int size_t;

#if __STDC_VERSION__ == 199901L
int do_something_array(size_t row, size_t column, int array[][column]) {
for ( size_t i = 0; i < row; ++i )
for ( size_t j = 0; j < column; ++j )
(void)array[i][j];
return 0;
}
#else
int do_something_array(size_t row, size_t column, void *array) {
int *ary = array; size_t i, j;
for ( i = 0; i < row; ++i )
for ( j = 0; j < column; ++j )
(void)ary[i*column + j];
return 0;
}
#endif /* __STDC_VERSION__ == 199901L */

#define numberof(a) (sizeof(a)/sizeof(a[0]))

int main(void) {
int array[][3] = {
{1, 2, 3},
{4, 5, 6}
};
do_something_array(numberof(array), numberof(array[0]), array);
return 0;
}
行数詰めたのでめちゃくちゃ見にくい

616 :610:2009/08/27(木) 12:25:36
>>612
比較してみたのですが、かなりの差が出てしまい…
(iが1000ほどで 配列が1ms、リストが9msほど)
どこか間違いでもあるのかと疑っていましたので…


>>613
具体的には a[i].Exec などのように同じ処理をさせるのです。
配列、リスト、共に順序に意味など持たず
できるだけ処理速度(始めから最後まで)を重視したいと思っています。
また、頻繁にアクセスさせます(ゲームなので16msに一度程度)

このような単純な場合では配列の方が適切なのでしょうか?
for(int i=0;i<1000;){ a[i].Exec; }

617 :デフォルトの名無しさん:2009/08/27(木) 12:29:28
>>616
本当はlistじゃなくてvectorを使うべきなんじゃないの?

618 :610:2009/08/27(木) 12:59:54
>>617
Vectorも一度考えたのですが、まだ検証してみてはいません。
listで実装してしようと思った理由は、サンプルでそのような処理を行っていたためです。
(要素数の少ない処理でしたので差は体感できなかったのです)


>>610などの例では要素数が一定なのですが、
配列ではflagでExec()を実行するか否かを管理、リストでは実行するか否かを
EnableListとDisableList間で追加削除のやり取りをして、管理しています。
list<A*> EnableList; //実行したい配列のポインタのリスト
list<A*> DisableList; //実行したくない配列のポインタのリスト


Vectorが静的配列と同じくらいの処理速度でアクセスできれば
この処理について(追加削除などもあるので)適切だと思うのですが…
試していませんので分からない状態です。

619 :デフォルトの名無しさん:2009/08/27(木) 17:48:18
constつきのメンバー関数への関数ポインタってどう宣言するんでしょうか?



620 :デフォルトの名無しさん:2009/08/27(木) 17:49:29
すいません自己解決しました

621 :デフォルトの名無しさん:2009/08/27(木) 18:52:55
個数が分かってるならリザーブしとけば十分速いんでないの?

622 :610:2009/08/27(木) 22:27:21
Vectorで試してみました。

アクセスするだけならば、かなり早かったのですが
削除のために、iteratorをインクリメントしたりすると負荷が大きいみたいです・・・
iterator絡みの処理は負荷が高いんですね・・・初めて知りました。


>>621
リザーブすれば、速かったです。
ただ、削除・追加を行うには負荷が大きいようで
この事を考えると静的配列の方がいいのかなと・・・


623 :デフォルトの名無しさん:2009/08/27(木) 22:37:42
>>610
もうなでもいいから静的配列でやれ

624 :デフォルトの名無しさん:2009/08/27(木) 23:13:23
VC++ならvectorのiteratorはポインタ実装じゃなかったっけ
debugでやってないか?

625 :610:2009/08/27(木) 23:24:20
>>624
>VC++ならvectorのiteratorはポインタ実装じゃなかったっけ
VC++ですが、勉強不足で理解できませんorz
削除は、iteratorが指しているものしかできないようなのでインクリメントしてました。

debugでやってます。Releaseとの違いがよくわからず、ずっとdebugでやってきているのですが
処理速度などの違いがでるものなのですか?

626 :デフォルトの名無しさん:2009/08/27(木) 23:30:20
debugモードの時のSTLはエラーチェックがかかりまくるので相当遅い
releaseにするとコンパイル結果がiterator使ったときとポインタ使ったときで同じになる

まあ、なんだ、やってみろ
そしてEffectiveSTLでも読んでろ

627 :610:2009/08/27(木) 23:38:06
>>626
やってきました。吊ってきますorz
でも、こんな恥ずかしい事を早めに教えてもらって助かりました。リアルじゃなくてよかった・・・
EffectiveSTL買って読んでみます。



628 :デフォルトの名無しさん:2009/08/28(金) 02:26:31
なにこの<int>とかいうやつ。
適当に自前でリスト作って動かしたら速かったので変えたよ!

と、いう事態を何度か目の当たりにしたわ

629 :デフォルトの名無しさん:2009/08/28(金) 03:05:28
上底を入力してください(単位cm)
3
下底を入力してください(単位cm)
4
高さを入力してください(単位cm)
5.0
台形の面積は17.5平方センチです

こんな感じのプログラムを作りたいんですが、

#include <iostream>
using namespace std;

int main() {

int input1,input2,input3;

cout << "上底(cm)を入力してください\n";
cin >> input1;
cout << "下底(cm)を入力してください\n";
cin >> input2;
cout << "高さ(cm)を入力してください\n";
cin >> input3;


return 0;
}

cin >> input3;から下が分かりません。

630 :デフォルトの名無しさん:2009/08/28(金) 03:19:06
1つはfloatにするの忘れました。すみません

631 :デフォルトの名無しさん:2009/08/28(金) 03:43:27
ほー、台形の面積の求め方というのは、ゆとり教育と関係があったのか。
http://www.google.co.jp/search?q=%91%E4%8C%60%82%CC%96%CA%90%CF

632 :デフォルトの名無しさん:2009/08/28(金) 19:35:59
>>587
固定小数点にしたかったんじゃないの?

633 :デフォルトの名無しさん:2009/08/28(金) 19:49:13
>>632
俺もそれは思ったけどやるなら32768じゃない?
32767だとどうなるんだろ・・・

634 :デフォルトの名無しさん:2009/08/28(金) 20:49:40
>>633
ここのベクトル演算のヨタ話みたいなことじゃない?
http://www.flightinfo.jp/tmurakam/scatut2/fdinmen.html

635 :デフォルトの名無しさん:2009/08/28(金) 23:58:08
#if PROTOTYPES
#define P(p) p
#else
#define P(p) ()
#endif
int func P((int x, int y));

こんな気持ち悪いプリプロセッサを見つけたんですが、
これは何事でしょうか?

636 :デフォルトの名無しさん:2009/08/29(土) 00:01:06
プリプロセッサを見つけたのかよ

637 :デフォルトの名無しさん:2009/08/29(土) 00:22:15
>>635
ヘッダファイル見たことないのか?
見れば、似たようなものがあちこちで使われだろう
ANSI-C形式のプロトタイプ宣言をサポートしてないCコンパイラのため

638 :デフォルトの名無しさん:2009/08/29(土) 01:26:49
int x = 3;
int* x = new int(3);
ってさ後者がヒープ領域で、前者はどこに領域確保されてるの?

似たような質問で
クラスのオブジェクトの宣言で(仮にStudentというクラスにnameというメンバがあったとして)
Student sato("佐藤");
Student* sato = new Student("佐藤");
ってできるけど、これってどう使い分けるの?
メンバにアクセスするとき 前者は sato.name ってできるけど
後者は (*sato).name or sato ->name じゃなきゃできないらしい本読む限り。
視覚的に前者の「sato.name」の方がわかりやすいんだけど。使い分けを教えてください。
よろしくお願いします。

639 :デフォルトの名無しさん:2009/08/29(土) 01:34:33
>>638
ヒープを知ってるならスタックを知ってても良さそうにおもうけど、スタック領域。

newはヒープ領域に確保、単なる宣言はスタック領域に確保

640 :デフォルトの名無しさん:2009/08/29(土) 01:36:09
スタックには置きたくなく、どうしてもアロー演算子がいやな場合はtypedefまたはエイリアスを作ればよいかな

641 :デフォルトの名無しさん:2009/08/29(土) 01:37:17
typedefうそでした!

642 :デフォルトの名無しさん:2009/08/29(土) 01:59:30
>>638
Studentのインスタンスを不定個作りたいときは後者じゃないと。

643 :デフォルトの名無しさん:2009/08/29(土) 10:56:55
みなさんありがとう。
>>642
どういうこと? Student型の配列として扱い
Student* satous[] = {new Student("佐藤一郎") , new Student("佐藤次郎") };
ってやるためということ?


644 :デフォルトの名無しさん:2009/08/29(土) 11:07:59
>>638 インスタンスの寿命で考えると分かる。

{
Student sato("佐藤"); //ここでインスタンスが作られる。
}  //ここでインスタンスが自動的に消滅する。


Student* sato;
{
sato = new Student("佐藤");//ここでインスタンスが作られる
}//ここではインスタンスは消滅されない。
delete sato; //ここでインスタンスを消滅させる。


645 :デフォルトの名無しさん:2009/08/29(土) 11:15:33
>>643
インスタンスを不定個作るということは、インスタンスを作る時と削除する時を
コンパイル時ではなく実行時に決めるから。

646 :デフォルトの名無しさん:2009/08/29(土) 11:31:41
すみません
演算子のオーバーロードをした場合(例えば、operator()(int a)みたいな感じで)
クラス内部でアクセスするときは、operator()(10)とするのが良いのでしょうか?
それとも、(*this)(10)とするのが良いのでしょうか?

非常にくだらない質問だとは思いますが、よろしくお願いします


647 :デフォルトの名無しさん:2009/08/29(土) 14:37:45
(*this)は式のままの書式で書けるメリットがある。
でも()は関数の形式だからどっちで書いても大差がないね。

thisを使うと最適化にはどういう影響が出るのかな?知ってる人教えて!


648 :デフォルトの名無しさん:2009/08/29(土) 15:20:47
どっちでも変わらんように思うけど、識者に任せる

649 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 06:26:10
>>634
そういうことならありえるね
参考になったわありがとう



650 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 08:42:11
C++でJavaみたいにfinalメソッドを作ることはできませんか?

651 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:51:27
>>650
virtualをつけなかったら、finalになるんじゃないの?

652 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:54:12
継承エラーなクラスを作ることはできますよ

653 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:38:26
>>651-652
親クラスのポインタに子クラスを代入してるときにvirtualつけてないメンバ関数を呼べば
確かにそうなるかも知れないけど。
そうじゃなくて継承はさせたいけど特定のメンバ関数は上書きして欲しくない。
こういうのはC++では無理っぽいですか?

654 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:39:31
Boostにそれっぽいのはあったような

655 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:15:46
>>651
お・・・おまw

知ったかぶりするなよ。


656 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:30:44
>>647-648
ありがとう
取りあえずは見た目優先でも問題なしと言うことでいいんすかね?


657 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:11:22
変数を使う直前で宣言した場合よりも、スコープの先頭で宣言したほうが処理速度が速くなって
びっくりしました。
これって一般的なことなんでしょうか?
条件によっては速くなったり遅くなったりするものですか?
コンパイラ次第なんでしょうか?

今、使っているコンパイラはVC++コンパイラです。

658 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:14:09
一概には言えないが、そんなはずはないはず。
releaseでコンパイルしてCtrl+F5で実行しても?


659 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:18:18
while(true){
ClassA a;
}
とかやってるんじゃない?

660 :657:2009/08/30(日) 18:30:52
>>658
Releaseコンパイルでそうなるんです。(DLLですので、実行時に別のアプリでそれを動かしてます)

>>659
いえ、forループには入っていますが、static intやstatic boolです。
クラスや大きな構造体を毎回初期化というようなことではないです。

不思議です^^;

661 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:37:27
とりあえずコードを(ry

662 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:38:54
>>660 ちょっとまて、おぬしスタティックと申したか?

663 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:59:19
座標について質問です
5*5マスの座標の一行目の一番左を(x1,y1)、右へ行くほど数字を大きくして一番右が(x5,y1)
二行目の一番左が(x1,y2)、一番右が(x5,y2)・・とします
そして自分が(x3,y3)にいて、前方を向いていれば
前方に2、左へ1の座標は(x2,y1)になりますが、右を向くと(x5,y2)になり、
後方を向くと(x4,y5)になります
一箇所だけならifやselectで条件分岐させるのですが、量が大きいのです
こういう時、この座標はどう計算すればよいのでしょうか?

664 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:06:48
三角木馬関数を使いなさい。

665 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:16:30
>>664
ありがとうございまかす


666 :657:2009/08/30(日) 19:18:44
>>661
すみません、ちょっと複雑ですw

>>662
あ、はい、staticです・・・(?)

667 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:31:56
>>663
class Hoge
{
int x;//位置X
int y;//位置Y
int x0://向きx
int y0;//向きy
public:
void Hoge()
:x(0),y(0)
,x0(1),y0(0) //初期値は右向き
{
}
void forward()//進む
{
x+=x0;y+=y0;
}
void right()//右に回転
{
int atmp=x0;
x0=y0;
y0=-atmp;
}
void left()//左回転
{
int atmp=x0;
x0=-y0;
y0=atmp;
}
};


668 :デフォルトの名無しさん:2009/08/30(日) 21:07:05
Stateパターンの方がよくね?

669 :デフォルトの名無しさん:2009/08/30(日) 21:35:57
C#のインデクサと同じことをC++でやるテクニックってありますかね?

670 :デフォルトの名無しさん:2009/08/30(日) 21:39:01
operator[]


671 :デフォルトの名無しさん:2009/08/30(日) 21:56:30
>>666
ソースを貼れないなら自分で調べるしかない。
該当箇所にブレークポイントを打ってF5。止まったところでALT+8して逆アセンブルを比較する。
処理速度が気になるときは逆アセンブルを見るのが近道



672 :663:2009/08/30(日) 22:25:34
>>664
すいません、ダメでした
>>663の前方に2、左に1のy座標を求めるために計算してみました

(120*π/180)でラジアンをだし、それを半径の長さ(1^2+2^2=5 ピタゴラスの定理でsqrt(5))
のsqrt(5)で割ってsinを出してみたところうまくいきません。どこが問題なのでしょうか?
↓のコードの結果は0.805573になります

#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
int main()
{
double deg = 120;
double rad = (deg * PI / 180.0)/sqrt(5.0);
cout <<sin(rad) ;
return 0;
}
>>667
ありがとうございます
アクションRPGに導入するとものすごいコードが短縮できました!
が、マスメ状ではうまく動きませんでした・・

673 :デフォルトの名無しさん:2009/08/30(日) 22:56:24
>>672
高校から数学をやり直せ
中学かもしれん

674 :デフォルトの名無しさん:2009/08/30(日) 23:00:36
sin()じゃどうあがいても1を超える事はないだろww

675 :663:2009/08/30(日) 23:12:24
すいません、三角関数は当時理解してたつもりでしたがいざ使うとなるとロクに使えませでした
おとなしくifで分岐させつつやります
ありがとうございました。

676 :デフォルトの名無しさん:2009/08/30(日) 23:14:34
>>675
いやまてまて、
三角関数とか忘れるものじゃないだろ。
数学の基礎中の基礎だぞ?
15歳のガキでも(理解しているかどうかは別として)一応ならうんだぞ??


677 :デフォルトの名無しさん:2009/08/30(日) 23:20:33
いや公式も覚えてるんですよむしろ忘れるはずも無い
半径が1で
筆記体のsin・cos・tanの頭文字を使って
始点が分母終点が分子
ttp://www1.axfc.net/uploader/Img/so/57580.jpg
この覚え方で忘れるはずも無いでしょう

ただこれを応用する力がなくなった、のか最初から無かったのか
前者だったはずなんだけどなぁ

678 :デフォルトの名無しさん:2009/08/30(日) 23:26:51
90度ずつしか回転しないうちはif文でいいけど
将来3DCGを使っていろんな方向に微妙に角度を変えるときは必須だよ^^

679 :デフォルトの名無しさん:2009/08/30(日) 23:28:02
>>677
>>672の問題点は、120degがどこから来たかだ。



680 :デフォルトの名無しさん:2009/08/31(月) 00:00:17
こんな感じじゃよ。たぶん。これで、いかなる角度への移動も可能。

http://codepad.org/QASgM33C

681 :デフォルトの名無しさん:2009/08/31(月) 00:08:20
ああなんだ回転行列か

682 :デフォルトの名無しさん:2009/08/31(月) 00:13:25
>>680
お前何でそんなに優しいんだ!
惚れるぜ

683 :657:2009/08/31(月) 01:48:19
>>671
分かりました。
ありがとうございます!

684 :デフォルトの名無しさん:2009/08/31(月) 01:51:57
回天行列です。

685 :デフォルトの名無しさん:2009/08/31(月) 10:07:38
そんな行列いやだー

686 :デフォルトの名無しさん:2009/08/31(月) 17:01:07
10年ぐらい前に売られていたバージョンのC言語って今のプログラム組むのに使える?
対応できてるものかい?

687 :デフォルトの名無しさん:2009/08/31(月) 17:15:08
C言語は10年前と何も変わってないよ

688 :デフォルトの名無しさん:2009/08/31(月) 17:29:43
>>687
分かりました。
では、10年前のVisual C++で色々プログラム組んでみます。
ありがとうございます。

689 :デフォルトの名無しさん:2009/08/31(月) 17:39:22
C言語とVisual C++が同じものだと思ってるのか? めでたいやつ

690 :デフォルトの名無しさん:2009/08/31(月) 17:49:23
>>689
なんだ?
10年前のVisual C++と今の環境は同じじゃないのか?


691 :デフォルトの名無しさん:2009/08/31(月) 17:58:03
こりゃまた、ずれたレスがきたな。日本語でOK な文だが。
まともに翻訳すると。
10年前の 「Visual C++」 と 「今の環境」 は同じか?
対象が違いすぎて俺には答えられないぜw

692 :デフォルトの名無しさん:2009/08/31(月) 18:06:31
>>691
答えられないなら書くなよ。
日本語で丁寧に書くと
10年前のVisual C++の環境や扱い方と今のVisual C++の環境や扱い方は、同じじゃないのか?
だ。

693 :デフォルトの名無しさん:2009/08/31(月) 18:10:41
ちがう

694 :デフォルトの名無しさん:2009/08/31(月) 18:12:04
>>692
お前な、自分が間違ってる上に開き直ってえらそうだな、おいw

695 :デフォルトの名無しさん:2009/08/31(月) 18:17:13
やっぱりソフトの購入からか。

>>694、どこが間違ってたんだ?

696 :デフォルトの名無しさん:2009/08/31(月) 18:18:03
Cというプログラミング言語自体はそんなに変っちゃいないが、
Visual C++というMS製のアプリケーションは大幅に変わっている

697 :デフォルトの名無しさん:2009/08/31(月) 18:23:10
>>696
アプリケーションがかなり変わってるのか、じゃソフトの買い替えからしないとダメだな。
サンクス。

698 :デフォルトの名無しさん:2009/08/31(月) 18:24:52
10年前のVC++で作っても今の環境で動くよ、問題ない
しかし最新のVC++は無料版もあるからそっちのがいいと思うんだ

699 :デフォルトの名無しさん:2009/08/31(月) 18:28:51
>>698
無料版のVisual C++なんてあるのか。
相当変わってるんだな。
試してみる。
色々ありがとう。

700 :デフォルトの名無しさん:2009/08/31(月) 18:34:46
何にも知らないで何も調べないでプログラムを組むとか早速高いソフトを買うとか

絶対釣りだろ

701 :デフォルトの名無しさん:2009/08/31(月) 18:42:14
>>700
10年前にC言語でプログラム組んだことあるし、その当時のプログラムの本は今でもあるよ。
しばらくの間お蔵入りになっててC言語の内容少し忘れてはいるけど。


702 :デフォルトの名無しさん:2009/08/31(月) 18:47:08
10年前のOSで開発するなら、10年前の処理系が最適かも。

703 :デフォルトの名無しさん:2009/08/31(月) 18:53:20
>>702
当時のバージョンのソフトがあるから今のPCにインストールして使ってみる。
あと、無料版も試してみる。

704 :デフォルトの名無しさん:2009/08/31(月) 18:54:53
DLLでnewする場合はDLLでdeleteしないといけないらしいんですが
DLLでfactoryをnewしてそのインスタンスからcreateする場合もやっぱりDLLでdeleteしないとだめですか?

705 :デフォルトの名無しさん:2009/08/31(月) 19:15:39
DLLとアプリケーションで、メモリ源が2つあると考えろ。
そして、その2つは扱い方は同じだが、返すべきところが違う。

DLL内のoperator deleteとアプリケーションのoperator delete、
どちらを呼び出して返却すべきかは、自分で考えろ。

706 :デフォルトの名無しさん:2009/08/31(月) 19:47:44
メモリはもらったところへ返す
DLL側のnewでもらったメモリはDLL側のdeleteへ返す
EXE側のnewでもらったメモリはEXE側のdeleteへ返す
DLLもEXEもみんな別々にメモリ管理してる (場合がある) から
ごっちゃにするとメモリ管理が混乱して落ちる (かもしれない)
それはウチで管理してるメモリじゃないぜ、とかそんな感じ
EXEもDLLもみんな、使うメモリはどっか一個所で一元管理してやれば済む話なんだが
みんな自分勝手だからな

707 :デフォルトの名無しさん:2009/08/31(月) 20:26:35
boost::shared_ptrを使うとカスタムデリータが確保した側のdeleteで自動的に開放してくれるから便利。


708 :デフォルトの名無しさん:2009/08/31(月) 21:01:23
shared_ptrの類を使うとインスタンス管理で負けた気がする。
全くの個人的な了見で、使う人を批判する気は全くないが。

709 :デフォルトの名無しさん:2009/08/31(月) 21:13:01
>>708
そんなこと言っていると
本当にインスタンス管理に(つーか他人の技術に)負けるぞ。

何事も新しいことは受け入れづらいものなのは分かるが。

710 :デフォルトの名無しさん:2009/08/31(月) 21:16:38
shared_ptrを普通のポインタみたいに記号ひとつで使えればいいのに。Foo@ foo;とか
typedef std::tr1::shared_ptr< foo > sp_foo_t;とかするのめんどくさい

711 :デフォルトの名無しさん:2009/08/31(月) 21:27:12
>>708安心しろ。それは杞憂だ。
shared_ptrを使うには循環参照を避けるクラス設計が必要になる。
それこそがインスタンス管理の勝利ではないか。

一度使い始めると雪崩的に使うようになるから。

712 :デフォルトの名無しさん:2009/08/31(月) 21:29:52
>>710
そういうことはC++0xの設計段階で提唱するべきだったな。


713 :デフォルトの名無しさん:2009/08/31(月) 22:49:07
>>710
using std::tr1::shared_ptr とすれば楽になる。

C++0xにはtemplate typedefができるらしいから sp<T>にでもtypedefすればいいんじゃないか


714 :デフォルトの名無しさん:2009/08/31(月) 22:59:08
using sp = std::tr1::shared_ptr;
sp<hoge> sp_hoge;
0xだと↑みたいにできるらしいね。typedefより見やすいし良いと思う

715 :デフォルトの名無しさん:2009/09/01(火) 14:25:43
inline int func(int x){
return x * x;
}

みたいなinline関数があるとすると、
a = func((int)(b - c));

a = ((int)(b - c)) * ((int)(b - c));
みたいになるんですか?
それとも、
int x = (int)(b - c);
a = x * x;
みたいになるんですか?

716 :デフォルトの名無しさん:2009/09/01(火) 14:40:29
後者
マクロ展開と違って引数は1度しか評価されない

717 :デフォルトの名無しさん:2009/09/01(火) 15:07:27
>>716
ありがとうございます。

718 :デフォルトの名無しさん:2009/09/01(火) 17:58:52
>>713
彼はそんな程度は知っているだろ、たぶん。
彼が言いたいのはもうもっと言語仕様に
組み込んじゃえよってことじゃねぇか?


719 :デフォルトの名無しさん:2009/09/01(火) 18:01:01
>>717
>>716の言う通り、一度である。
よって、例えばmaxテンプレートとmaxマクロでは
max( ++a, b );
がどうなるかが変わってくる。

720 :デフォルトの名無しさん:2009/09/01(火) 18:24:52
>>719
715です。
これは確かにどちらなのかによって全然違いますね。

721 :デフォルトの名無しさん:2009/09/01(火) 18:37:59
>>720
というかマクロで作ったら未定義の動作だろ。
*未定義の動作=インターネットのニュースグループ、comp.std.cやcomp.lang.cでは、未定義のコードを実行した結果「鼻から悪魔が飛び出しても仕様に反しない」というjoke が流行したことがありました。今でもたまにこのような表現を見ることがあります。
初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html


722 :デフォルトの名無しさん:2009/09/02(水) 00:36:29
数字を四捨五入するにはどうすればいいんでしょうか?


723 :デフォルトの名無しさん:2009/09/02(水) 00:38:06
JIS, ISO式四捨五入なら専用の関数がいる

724 :デフォルトの名無しさん:2009/09/02(水) 00:40:44
四捨五入の意味を辞書で調べて、その通りにすればいいと思います

725 :デフォルトの名無しさん:2009/09/02(水) 00:51:54
CをまともにやらずにC++をやろうとするのは無謀?
それなりに努力はするつもりなんだが、どうなんですか?

726 :デフォルトの名無しさん:2009/09/02(水) 01:13:18
別にいいと思うよ。
Cでポインタを理解しておけば、C++でポインタを勉強する必要がなくなるとかそんな程度だし。

727 :デフォルトの名無しさん:2009/09/02(水) 01:14:01
先にC++に慣れ切ってしまうと、後からではCではプログラムを組めなくなるんじゃないかという危惧がある
ゆとり教育とかいうと聞こえが悪いけど、なんかそんな感じ
でもいまどきC++が使えない環境ってのもそうそうないだろうとも思うわけで、
まぁ別にいいんじゃないか
無謀というほどのことはない
むしろSTLとか便利なライブラリのおかげでポインタをやたら使わずに済む分つまづくポイントは減ってるかもしんない

728 :デフォルトの名無しさん:2009/09/02(水) 01:30:28
>>726 >>727
返答ありがとうございます

729 :デフォルトの名無しさん:2009/09/02(水) 02:15:29
>>725
いやいきなりC++をやる事をオススメする
禿もそう言っているし

730 :デフォルトの名無しさん:2009/09/02(水) 06:50:19
>>725
> それなりに努力はするつもりなんだが
この覚悟があるならC++で良いと思うよ。


731 :デフォルトの名無しさん:2009/09/02(水) 06:55:07
Accelerated C++やC++プライマーを使うと良いでしょう。

732 :デフォルトの名無しさん:2009/09/02(水) 12:33:11
ビジュアルCとビジュアルCじゃないCはどの程度の違いがありますか?

733 :デフォルトの名無しさん:2009/09/02(水) 13:04:47
「ビジュアルCじゃないC」 とかじゃなくて具体的な製品名をあげてくれ

734 :デフォルトの名無しさん:2009/09/02(水) 13:35:26
try catchで配列[]の添え字範囲外の例外をキャッチ出来る?
メモリのアクセス違反のキャッチと言うべきかな

735 :デフォルトの名無しさん:2009/09/02(水) 13:42:33
>>734
これ?
http://msdn.microsoft.com/ja-jp/library/5z4bw5h5(VS.80).aspx

736 :デフォルトの名無しさん:2009/09/02(水) 13:50:10
>>735
それっぽいけど
エラーの種類の判別方法がわからんね
調べてみます

737 :デフォルトの名無しさん:2009/09/02(水) 14:16:12
>>733
ずびばせん……
例えばボーランド?というやつではどういう違いがありますか?

738 :デフォルトの名無しさん:2009/09/02(水) 15:14:59
Borland C++Builder と Borland C++Compiler の2種類があるけど・・・

Borland C++Builder と Visual C++ はまったく異なる。
Borland C++Builder は Visual Basic みたいに部品ポトペタで開発していくスタイル。
Visual C++ はエディタでごりごりコードを書く開発スタイル。

Borland C++Compiler と Visual C++ はごりごりコードを書く点では変わらないけれど、
Borland C++Compiler には開発環境が付いておらず、
普通のテキストエディタ(メモ帳とか)でコードを書き、コマンドラインからコンパイラを使うことになる。
(いちおうベクターあたりを探せばフリーの開発環境がいくつか見つかる)
Visual C++ には豪華な開発環境が付いていて、ボタン一発でコンパイルでき、デバッガも組み込まれている。

ちなみにボーランド(の開発製品群)はエンバカデロに買収されました。
なので、たぶん Embacadero C++Builder とか呼ぶべき。

739 :デフォルトの名無しさん:2009/09/02(水) 15:18:25
>>738
で、そのコードはCなの?

740 :デフォルトの名無しさん:2009/09/02(水) 15:22:47
そもそも Visual C というのは無いから
Visual C++ のことだろうと推測した (C#のことだったらすまんね)
説明したのは書いてるとおり Visual C++ とボーランドなんとかというやつの比較

741 :デフォルトの名無しさん:2009/09/02(水) 17:07:20
ははあ……なるほど
Cプラが使えるのには違いはないんですね!?
ありがとうございました!

742 :デフォルトの名無しさん:2009/09/02(水) 21:45:07
hoge f(int a, int b, int c)
{
return hoge(a, b, c);
}

hoge h(f(1, 2, 3));

これだとコピーコンストラクタが無視されて、あたかも
hoge h(1, 2, 3);
のような挙動になるのは仕様で決められてる?
それともたまたまコンパイラの中の人が親切だっただけで?

743 :デフォルトの名無しさん:2009/09/02(水) 21:57:59
>>742 仕様で許可されている。返り血最適化RVOという。
許可されているだけなので最適化されるかどうかは中の人次第。



744 :デフォルトの名無しさん:2009/09/02(水) 22:08:24
下記の書についてです。
  (1).ANSI C/C++辞典(ttp://www.amazon.co.jp/exec/obidos/ASIN/4320027973/)
  (2).新ANSI C言語辞典(ttp://www.amazon.co.jp/exec/obidos/ASIN/4774104329/)

CだけでなくC++についても調べたいので(1)は買う予定でいます。
(2)は色々と評判に上がることが多いようなので迷ってるのですが、
・ (2)は(1)と重複している部分が結構あったりするのでしょうか。
・ (2)ではC++についてはまったく触れられていないのでしょうか。
・ 両方とも割と昔の本ですが、仕様の変更などで現在と異なる点はあるのでしょうか。
ご存知の方がいましたら教えていただきたいです。

745 :デフォルトの名無しさん:2009/09/02(水) 22:29:39
C++は1998と2003年に改正されてるけど1996年の本でいいの?
いいんだ。あ、そう。

746 :デフォルトの名無しさん:2009/09/02(水) 22:54:35
新のつかないほうのANSI C言語辞典を持っているけど、これは今でも使える。
まあ古い本なので、ワイド文字関係と誰も使っていないC99に関する事柄が抜け落ちているけど。
だから、新のほうもおそらくおすすめできると自分は思っている。

ANSI C/C++辞典は分からない。初版は図書館で見たことあるけど、これ3版だからノーコメント。
個人的には、C++の内容を辞典的に網羅するにはページ数が少なすぎるだろうというのが気掛かり。
そのアマゾンによれば590ページらしいが、C言語辞典ですら500ページ近くある。
(初版でもC言語辞典より小さな字で詰めて配置してあったとはいえ)

747 :744:2009/09/03(木) 00:22:24
情報ありがとうございます
最近の本も探してみたのですが、評価が芳しくないものやパッとしないものが多くて…
古い本なので逆に図書館にあるかも知れませんね
近所の図書館をあたってみて、もしあれば中身を確認してみようと思います


748 :デフォルトの名無しさん:2009/09/03(木) 02:00:47
今まで文字列の取り扱いは char * を使ってたのですが、そろそろ汎用性を考えたコードも
意識して書かないといけないかなとか思い始めてます。
ところがなんか TCHAR だの wchar_t だの LPTCSTR だのと色々とあって、どういう時に
どれを使えばいいというのが判りません

どういう考えで、どういう型を使うのが一般的なのでしょうか

749 :デフォルトの名無しさん:2009/09/03(木) 02:38:19
char*でおk。

750 :デフォルトの名無しさん:2009/09/03(木) 02:47:38
蒸し返すようだけどGET_SET_ACCESSORって要するに
「今は何もしない素通し処理にしておくけど、将来的に別の処理が入った時に
クライアントコードの書き換えが必要になるとまずいからとりあえずアクセサ
になってますよ」って意味じゃね?
必要になったら普通に書き直せばいいし、何もしてないです、ってのが一目で
分かるし、悪くないマクロだと思うが。
まぁ俺はマクロ嫌いだから極力使わないんで、これも使わないけど。

751 :デフォルトの名無しさん:2009/09/03(木) 04:09:28
・いつか処理が変わるかもしれないからアクセサは常に作るべき
・次のフェーズで変更されることが分かっているからアクセサを作るべき
・必要になってから作るべき

という感じで意見がいつも割れるんだよ

752 :デフォルトの名無しさん:2009/09/03(木) 04:24:39
ハイ!先生
「メンバは原則 public しといてゲッタセッタ必要になったら private に異動で十分」派です。

753 :デフォルトの名無しさん:2009/09/03(木) 05:40:12
それ呼び出し側のコードが変わるじゃん

754 :デフォルトの名無しさん:2009/09/03(木) 05:51:34
で?

755 :デフォルトの名無しさん:2009/09/03(木) 05:54:39
>>752
それだとメンバ変数名を変えたくなっても変えられないな。
Get/Setでポリモーフィズムが使えないな。

>>750
単純な代入とかだったらGET_SET_ACCESSORでいいと思うし、
頑なに拒否する人を見て何が悪いのかと思ってたけど、
デバッガで見れないって言うのがね、ちょっと嫌かな。

756 :デフォルトの名無しさん:2009/09/03(木) 06:26:37
そうやってアクセサとメンバ名の乖離が起こるわけですね。

ポリモーフィズムが使えないという点は全く理解できないので追加説明をしていただけると助かります。

757 :デフォルトの名無しさん:2009/09/03(木) 06:46:09
>>753
変わって何か問題ある?

758 :デフォルトの名無しさん:2009/09/03(木) 07:12:09
別に問題ないよ

759 :デフォルトの名無しさん:2009/09/03(木) 10:22:49
書き換えるのが面倒
プロジェクト内の全ファイルから問題の箇所を一発で全部置換できるエディタを持ってるのなら気にする必要はない

760 :デフォルトの名無しさん:2009/09/03(木) 12:47:14
wrproperty使ったほうがクライアントがすっきりうんこ

761 :デフォルトの名無しさん:2009/09/03(木) 15:06:03
汎用的なライブラリでそんな作業しようと思うとぞっとする。
変数書き換えのタイミングも追いづらいし。

762 :デフォルトの名無しさん:2009/09/03(木) 15:10:09
a* [2]
a[0] = new b[2]
これって可能?アクセス方法ってどうやるの?

763 :デフォルトの名無しさん:2009/09/03(木) 15:31:20
不可能

764 :デフォルトの名無しさん:2009/09/03(木) 17:50:35
プラスとマイナスをひっくりかえす関数ってありますか?
例えば5なら-5に、-9なら9に変えてくれる関数です

765 :デフォルトの名無しさん:2009/09/03(木) 17:55:16
関数にするまでもない
a = -b;
とかで十分

766 :764:2009/09/03(木) 18:00:34
本当だ、できました
ご親切にありがとうございました

767 :デフォルトの名無しさん:2009/09/03(木) 19:31:38
1.f←これってfloatとして扱うってことですよね?

いま呼んでいる本に

double r = srcR * srcA + ( 1.f - srcA ) * dstR;

というコードがあるんですが
「1.0」(double型)じゃなくて「1.f」(float型)をつかう意味ってありますか?
srcR、srcA、dstR、はどれもdouble型です。


768 :デフォルトの名無しさん:2009/09/03(木) 19:46:22
>>767 ありません。

769 :デフォルトの名無しさん:2009/09/03(木) 20:02:16
もともと全部floatで書いていたコードを何かの理由でdoubleに直したときに
そこだけ修正し忘れた、とか

770 :デフォルトの名無しさん:2009/09/03(木) 20:06:08
>>768-769
わざわざfloatにしてるから
何かしらメリットがあると思ったんですが
何もないんですね。
ありがとうございます。

771 :デフォルトの名無しさん:2009/09/03(木) 20:19:58
>>767
何か勘違いしてそうだから念のためにいっておくと、
 double の 1.0 は 1. と書くこともできる
 float の 1.0f は 1.f と書くこともできる

772 :デフォルトの名無しさん:2009/09/03(木) 20:23:02
shared_ptrに確保されたインスタンスがあったとして
そいつのweak_ptrを返すメンバ関数とかってどうやって実装してるの?

773 :デフォルトの名無しさん:2009/09/03(木) 20:26:22
>>756
変数がpublicだったらアクセサを経由した取得にならないからだろ。

774 :デフォルトの名無しさん:2009/09/03(木) 20:58:14
>>771
0付けなくても良かったんですね
ありがとうございます

775 :デフォルトの名無しさん:2009/09/03(木) 21:13:34
>>772
shared_ptrとweak_ptrはインスタンスを直接保持するのではなく、インスタンスを管理するオブジェクトを経由して保持している。
weak_ptrは管理オブジェクトを参照すればインスタンスが有効かどうかが分かる。



776 :デフォルトの名無しさん:2009/09/03(木) 22:08:14
wktk_ptr
kwsk_ptr
sneg_ptr

777 :デフォルトの名無しさん:2009/09/03(木) 22:08:39
いや、なんていうか
sp->getThisWeakPtr();
みたいなことしたいんですけど無理なんですかね?

778 :777:2009/09/03(木) 22:46:10
あ、自己解決したわ

779 :デフォルトの名無しさん:2009/09/03(木) 23:32:43
使いたくもない敬語を無理に使ってるってことがよく分かる

780 :デフォルトの名無しさん:2009/09/04(金) 02:37:31
?

781 :デフォルトの名無しさん:2009/09/04(金) 13:18:09
1: char a[20];
2: char a[20]={0};
3: char *a = new char[20];
これらのうちでは
動作が軽い順で言うとどうなりますでしょうか?


782 :デフォルトの名無しさん:2009/09/04(金) 13:40:41
1が最も軽く、3が恐らく最も重い

783 :デフォルトの名無しさん:2009/09/04(金) 14:00:22
3は
delete[]a;もセットで考えないといけない。

784 :デフォルトの名無しさん:2009/09/04(金) 14:18:13
>>782
なるほど。
1と2では、
初期化する場合としない場合とでやはり速度差があるのですね。

>>783
ありがとうございます。そうすると3は重そうですね。

ありがとうございました。

785 :デフォルトの名無しさん:2009/09/04(金) 14:20:44
1.のコストは0なのだ。


786 :デフォルトの名無しさん:2009/09/04(金) 15:20:48
C++のisoが定めた規格が
無償で(英語でもいいので)見られる
サイトを教えていただけますでしょうか?


787 :デフォルトの名無しさん:2009/09/04(金) 15:39:02
C++のqueueについてなんですが、
queueで作ったデータ列を配列みたいに見るってできないんでしょうか?
front()で頭を見る以外の方法が分かりません…

788 :デフォルトの名無しさん:2009/09/04(金) 16:00:37
>>787配列のように扱えないのがstd::queueのメリット。
配列のように使えるキューが欲しいならstd::dequeを使う。


789 :デフォルトの名無しさん:2009/09/04(金) 16:02:12
>>786
iso 14882 2003 pdf - Google Search
http://www.google.com/search?name=f&hl=en&q=iso+14882+2003+pdf

790 :デフォルトの名無しさん:2009/09/04(金) 16:04:58
>786
C++についてはC言語ほど詳しいわけではないけど
ドラフトなら無償で手に入れることができたはずだったんだけど、なんか本家死亡中?
規格書の正式名称をどうたらこうたらで手に入れることができる

791 :786:2009/09/04(金) 16:08:13
>>789-790
丁寧にありがとうございました。
助かりました。

792 :デフォルトの名無しさん:2009/09/04(金) 16:14:52
>>788
分かりました。どうもです

793 :デフォルトの名無しさん:2009/09/04(金) 17:11:55
全然別人ですが、
C99の規格は英語でいいのでどこかで手に入りませんか?

ググろうにも何でググればいいのか悩みます。

794 :デフォルトの名無しさん:2009/09/04(金) 17:17:06
JISの規格票じゃだめなのか?

795 :デフォルトの名無しさん:2009/09/04(金) 17:34:38
JISの規格は閲覧するのにとても苦労するので。
(標準のpdfリーダがadobeじゃ無いためです。)

796 :デフォルトの名無しさん:2009/09/04(金) 17:50:34
n1124.pdfとか

797 :デフォルトの名無しさん:2009/09/04(金) 17:55:47
>796
それはC0x Draft, N1124, 6 May 2005だな

798 :デフォルトの名無しさん:2009/09/04(金) 17:57:26
どの版がいいの

799 :デフォルトの名無しさん:2009/09/04(金) 18:09:13
ええと、一番普遍的な版がいいのですが。
そんな最先端のプログラミング技法には深入りするつもりもないので。


800 :デフォルトの名無しさん:2009/09/04(金) 18:27:02
テンプラメタプログラミングなんてやってなんか得したことあった?

801 :デフォルトの名無しさん:2009/09/04(金) 18:41:44
知的好奇心が満たされるw

802 :デフォルトの名無しさん:2009/09/04(金) 18:49:15
>>800 似たような重複コードを書かなくてすむ用になる。




803 :デフォルトの名無しさん:2009/09/04(金) 19:05:32
(プラシーボで)実行速度が速くなった

804 :デフォルトの名無しさん:2009/09/04(金) 19:48:32
C++でスレッドをやってみたら思いのほか簡単にできた。
それでも複数の値渡しはいちいち構造体を定義しないといけないなんてどうしてこんな回りくどいやり方でないといけないのか
もっとすっきりしたやり方考えろよ

805 :デフォルトの名無しさん:2009/09/04(金) 19:50:41
自分で好きなように作ればいいじゃないか?

806 :デフォルトの名無しさん:2009/09/04(金) 21:25:36
>>804
スレッド開始時の関数に引数を渡すときのことを言っているなら、boost::threadはどう?
bindと組み合わせれば何引数でもいけるよ。

もちろん、それ以外のAPIでもbind使えるようにできるけど。

807 :デフォルトの名無しさん:2009/09/04(金) 23:34:38
テンプレートメタプログラミングは定数のコレクションを生成するとき便利だよ。
その数が万単位になると劇的に速度が変わる。

808 :デフォルトの名無しさん:2009/09/04(金) 23:37:14
テンプレートメタプログラミングは
天才がライブラリを作るときに便利だと思うよ。

凡人が挑戦すると死亡するだけ。

809 :デフォルトの名無しさん:2009/09/05(土) 05:58:07
ちょっとやってみたけどコードがぐちょんぐちょんになった

810 :デフォルトの名無しさん:2009/09/05(土) 15:50:47
C言語における、ダブルクォートで囲んだ文字列と、
シングルクォートで囲んだ文字列は、どういう違いがあるのでしょうか?

明確に違って、ダブルクォートで囲んだほうは文字列の最後に何か追加されたような気がする、まではおぼえているのですが…

どなたかご教授いただけませんでしょうか

811 :デフォルトの名無しさん:2009/09/05(土) 15:52:34
>>810
シングルクォートで囲んだ文字列
の意味が分からん。

そんなもの存在しない。


812 :デフォルトの名無しさん:2009/09/05(土) 15:56:35
>>811
ごめんなさい
文字列という言葉ではおかしかったかもしれません
っていうか、シングルクォートで囲んだものは文字列ではなくて、文字、でしたっけ

"aaa" == 'aaa' ではないことは覚えているのですが
あえて
"aaa"をあえてシングルクォートで囲んで表現したらどう表記するのでしょう、といった質問です

813 :811:2009/09/05(土) 15:58:56
>>812
"aaa" -> 言語仕様として存在する
'aaa' -> 言語仕様として存在しない

というこれ以上ないほどの違いがあるぞ。



814 :デフォルトの名無しさん:2009/09/05(土) 15:59:51
つーか、どんなC使ってるのか知らんが、
'aaa'
はCでは出来ないよ。

815 :デフォルトの名無しさん:2009/09/05(土) 15:59:52
{ 'a', 'a', 'a', '\0' }
こんな感じか?

816 :811:2009/09/05(土) 16:01:13
それとも
"aaa" -> C/C++ではcharないしconst char型の配列型で、その数は4である。(終端にヌル文字が付く。)
"a" -> C/C++ではcharないしconst char型の配列型で、その数は2である。(終端にヌル文字が付く。)
'a' -> const char型の文字型変数。
であることを言いたいのか?



817 :デフォルトの名無しさん:2009/09/05(土) 16:01:55
char *p = malloc(3);
p[0] = p[1] = p[2] = 'a';

818 :810:2009/09/05(土) 16:02:24
過去ログを読み直していたらこんなコードにぶつかったので質問した次第です
文字とか文字列とかそういう問題で捉えたのがいけなかったんですかね

624 :デフォルトの名無しさん[sage]:2008/01/30(水) 00:58:29
#include <iostream>

int main(void)
{
    const int max_str = 50 + 1;
    char str1[max_str], str2[max_str];    
    std::cout << "数値a入力>";
    std::cin >> str1;
    std::cout << "数値b入力>";
    std::cin >> str2;

    int len1, len2;
    for( len1 = 0; len1 < max_str; ++len1 ){
        if( str1[len1] == '\0' )
            break;
    }
    for( len2 = 0; len2 < max_str; ++len2 ){
        if( str2[len2] == '\0' )
            break;
    }

819 :810:2009/09/05(土) 16:05:44
>>816
ヌル文字!

文字数!

それです、私が思い出したかったと思われるキーワードはそれです!
あとは自力で調べられそうです
ありがとうございましたー


820 :デフォルトの名無しさん:2009/09/05(土) 16:07:04
たぶんシングルクォートの文字列は
char foo[] = {'f', 'o', 'o', '\0'}; /* '\0'は'\000'または'\x00'などと同じnull character(JISではNULと表記される)を表す */
だと思う、シングルクォートは文字定数を表記するときによく使われる、そのほかの目的でも使うことはある

ダブルクォートの例は
char bar[] = "bar"; /* {"baz"};とかくこともできる */
char *baz = "baz";
ダブルクォートで囲んだ場合、文字列リテラル(文字列定数)と呼ばれる
この場合、コンパイラは気を利かせてnull characterを付けてくれる
したがって、sizeof(bar)は4となる

しかしながら
char hog[3] = "hog";
の場合、コンパイラは気を利かせてnull characterを追加しない、つまり
char hog[] = {'h', 'o', 'g'}; /* char hog[3] でもよい*/
とした場合と同じ結果となる

と長々書いているうちに解決していたでござるの巻

821 :810:2009/09/05(土) 16:08:38
>>820
ありがとうありがとう
大感謝です

822 :デフォルトの名無しさん:2009/09/05(土) 16:22:47
どうでもいいけど、
結局何を疑問に思っていてどう解決したのかさっぱりわからん。

823 :デフォルトの名無しさん:2009/09/05(土) 16:30:04
要はかなりのうろ覚えだからどう検索すりゃいいのかも分からなかったんだろ。

824 :デフォルトの名無しさん:2009/09/05(土) 17:20:19
>>820
char *baz の sizeof は勘違いしたらいかんよ。

825 :デフォルトの名無しさん:2009/09/05(土) 17:28:41
>824
例が悪かったか
ほとんどの環境ではsizeof(char *)も4だったね

826 :デフォルトの名無しさん:2009/09/05(土) 17:33:44
記号関係で検索しようと思ったら確かに詰むわな。どうにかならんかな。

827 :デフォルトの名無しさん:2009/09/05(土) 17:46:40
>>825
例えが悪いっていうか、同列に並べたら混同しちゃうだろw
char bar[] = "bar"; とchar *baz = "baz"; じゃ意味が全然違うのに。

828 :デフォルトの名無しさん:2009/09/05(土) 17:49:24
>>813-814
いや、'aaa'のように中に文字が複数ある場合、その値は処理系定義。
仕様にないとかできないとかはちょっと言い過ぎだと思う。
まあ、実際問題使わないからそういう認識でも構わないと俺も思うけどさ。

829 :デフォルトの名無しさん:2009/09/05(土) 17:52:12
シングルクォートの中には文字が一つのはずと理解していたのに
'\0'をみて、まるで2つの文字からなる文字列が入っていると勘違いしたんじゃないのだろうか。

830 :デフォルトの名無しさん:2009/09/05(土) 17:56:07
VC++は'aa'と二つはできたな。
三つ以上は試したことがない。

831 :デフォルトの名無しさん:2009/09/05(土) 17:59:36
>>828
マジックナンバー表すのによく使われる。3文字は見たこと無いけど。

832 :デフォルトの名無しさん:2009/09/05(土) 18:01:31
>>831
ちょっとマジックナンバーについて簡単に説明してもらえますか?

833 :デフォルトの名無しさん:2009/09/05(土) 18:06:18
VC++ならchar c = '??/n';とかできるな

834 :デフォルトの名無しさん:2009/09/05(土) 19:57:38
問題を整理しよう。
・>833はトライグラフ。
・シングルクォートで囲える文字数は(トライグラフやエスケープ文字を処理した後の)4文字程度(環境依存)。
・その場合のエンディアンも環境依存。

ということで宜しいかと。
で、例えばint foo = 'abcd'としてprintf("%d\n", foo)としたときの出力が、所謂マジックナンバー。

835 :デフォルトの名無しさん:2009/09/05(土) 20:06:54
多文字リテラルはC90でもあるだろうに

836 :デフォルトの名無しさん:2009/09/05(土) 21:49:37
なんだかんだいって、もう本人は解決しちゃったんだろうぜ。

837 :デフォルトの名無しさん:2009/09/05(土) 22:10:10
>>834
もう一度聞くけど、マジックナンバーについて簡単に説明してもらえますか?
どうも一般的に使われているものと異なるように思うので。

838 :デフォルトの名無しさん:2009/09/05(土) 22:25:51
やだね、こういう言いたいことを裏に覗かせつつ質問する馬鹿って。

>>837
マジックナンバーと呼ばれるものには私の知る限り3種類ある。
・野球のマジックナンバー。詳細は知らん。
・コード中に埋め込まれた由来不明の値。何故その数字か判らんが兎に角動くと言う皮肉を込めて、マジックナンバーと呼ぶ。
・主にバイナリファイルの先頭に置いて、ファイルの種別を明示するために使われるバイト列。或いはそれを数値化したもの。
Unix使いなら/usr/share/file/magic辺りにあるから覗いてみるといい。

839 :デフォルトの名無しさん:2009/09/05(土) 22:29:20
馬鹿とまで言われるとは思っていませんでした。
> ・コード中に埋め込まれた由来不明の値。何故その数字か判らんが兎に角動くと言う皮肉を込めて、マジックナンバーと呼ぶ。

僕もこれだと思っていたのですが、>>834さんは出力がマジックナンバーといっているので、
いったいどういう事だろうかと思ったんです。

840 :デフォルトの名無しさん:2009/09/05(土) 22:33:47
質問しただけで荒れるってジャスティスののか

841 :デフォルトの名無しさん:2009/09/05(土) 22:34:25
>>837
http://en.wikipedia.org/wiki/Magic_number_(programming)
まぁファイルフォーマットとかを直接触らない人には関係ないかもね。

842 :デフォルトの名無しさん:2009/09/05(土) 22:40:05
>>841
・an unnamed or ill-documented numerical constant value;
これを言いたそうな気配はするんだが、なんか違った意味で使ってるよな
そりゃ質問もされるだろうよ

843 :デフォルトの名無しさん:2009/09/05(土) 22:52:03
元素か

844 :デフォルトの名無しさん:2009/09/05(土) 23:05:49
Linuxでは出力もマジックナンバーと呼ぶんだけどな。
ドザは頭が悪くて困る。

845 :デフォルトの名無しさん:2009/09/05(土) 23:09:48
C言語でプログラムを作成してる際にわからないことがあったので質問させてください
3次元座標(-0,5、0,5、0)を
(sin(t)、t、cos(t))
みたいな形で現したいと思ってるんですがどのように現すのか教えてください

よろしくお願いします

846 :デフォルトの名無しさん:2009/09/05(土) 23:16:03
どうも使い方の間違いを肯定したくなくてすり替えばかりしているように見える
よくあることだけどな

847 :デフォルトの名無しさん:2009/09/05(土) 23:17:38
>>845
sin(0.5)は-0.5ではないし、cos(0.5)も0ではないが・・・
どういう意味なので?

848 :デフォルトの名無しさん:2009/09/05(土) 23:19:00
>>845
double point_3d[3];
point_3d[0] = sin(t);
point_3d[1] = t;
point_3d[2] = cos(t);

とか?

849 :845:2009/09/05(土) 23:25:39
DrawLine関数で
(-0,5、0、0)から(-0,5、0,5、0)までの直線をひきたいんですが、その後にその線を変数θを使用して回転させたいと思ってるのでsincosで座標を現したいと思ったのですが
可能でしょうか?

850 :デフォルトの名無しさん:2009/09/05(土) 23:35:32
Linuxでも
>例えばint foo = 'abcd'としてprintf("%d\n", foo)としたときの出力が、所謂マジックナンバー。
なんていったりはしないよ。
もし言うというなら、Linux板にコピペしてきてそのスレで1000人の同意があったら認める^^

851 :デフォルトの名無しさん:2009/09/05(土) 23:43:12
>>849
直交座標系と極座標系の変換を知りたいの?
もし単に回転させたいならアフィン変換すればいいだけだけど。

852 :デフォルトの名無しさん:2009/09/05(土) 23:48:39
>>851
よくわかりません
x座標が-0,5なので-cos(60)でいいのかと思ってやってみてもうまくいかなくて…

3次元での座標を表すときのsinθcosθというのは単に数値を入れるのとは全く別物なんでしょうか?

(0,5、1、0)の座標をsincosの座標で現したいと思ったときに(cos(60)、1、sin(0))と表してもまったく別の位置に表示されるんですけど

853 :デフォルトの名無しさん:2009/09/05(土) 23:51:36
sin,cosの引数はラジアン。

854 :デフォルトの名無しさん:2009/09/05(土) 23:52:08
sin、cosの引数は度じゃなくラジアンだから *3.14/180 しないとだめ

855 :デフォルトの名無しさん:2009/09/05(土) 23:59:56
ありがとうございます
わかりました

856 :デフォルトの名無しさん:2009/09/06(日) 00:29:07
こないだからC++以前に数学がわかってないやつが多いな

857 :デフォルトの名無しさん:2009/09/06(日) 00:34:46
というか、本にせよリファレンスにせよ、どっかで説明読めば
引数がラジアンだってことくらい書いてあるはず
理論に基づいて組み上げるんじゃなく
カンでプログラミングしてるんじゃないか

858 :デフォルトの名無しさん:2009/09/06(日) 00:52:37
普段からsmartポインタって乱用してる?
複雑な管理が必要になる部分以外は余分なコストがかかるから使わないほうがいいのかなって思ったんだけど

859 :デフォルトの名無しさん:2009/09/06(日) 01:02:17
RAIIとかPimplイディオムを実現するには必要不可欠だろうが

860 :デフォルトの名無しさん:2009/09/06(日) 01:05:49
RAIIとpimplってほんとによく出てくるなぁ。
RAIIはさておき、pimplは目の当たりにしたことがないから実感がわかない

861 :デフォルトの名無しさん:2009/09/06(日) 01:06:50
使わなかったところで、それと同様のコードを自分で書く羽目になるだけ、自分へコストが跳ね返ってくる。

まあ、最も単純かつ実行時の負荷が低コストでしかも標準のauto_ptrが残念な出来なのは仕方がない。
unique_ptrに期待しましょう。

862 :デフォルトの名無しさん:2009/09/06(日) 01:07:24
Exceptional C++を読みなせえ

863 :845:2009/09/06(日) 01:51:30
すいません
さっき教えていただいた通りにラジアンで線を引けたのですが、for文で線を何本も引いて円を書こうと思い
(sin(θ×t)、1、cos(0))
とし、tの値を少しずつ大きくしていきました。
そうするとx軸に沿って円がかけるはずだとおもうのですが45度から130度くらいまでの扇形みたいな形しかできません

まったく理由がわかりません

どなたかアドバイスをください
お願いします

864 :デフォルトの名無しさん:2009/09/06(日) 01:59:23
自己解決しました

865 :デフォルトの名無しさん:2009/09/06(日) 02:01:44
質問の文章考えてるヒマがあったらトライ&エラーやってた方が有意義じゃないか?

866 :デフォルトの名無しさん:2009/09/06(日) 08:28:07
>>858 乱用してるよ!!

スマポのメリット>>>>>>>>>>>>ほんのわずかなコスト


867 :デフォルトの名無しさん:2009/09/06(日) 09:05:17
>>858
スマポの評価はboostのスマポ、特にshared_ptrを使ってからしたほうがいい。
マジお勧め。


868 :デフォルトの名無しさん:2009/09/06(日) 11:04:43
確かにboostのshared_ptrはその利便性からいって鬼。
これ以上ないほどの。


869 :デフォルトの名無しさん:2009/09/06(日) 11:12:58
FFTで求めた実部データと虚部データから振幅スペクトルを求めるにはどうしたらいいですか?
パワースペクトルだと大きすぎるのでさけたいです

870 :デフォルトの名無しさん:2009/09/06(日) 11:19:21
>>869
帰れ

871 :デフォルトの名無しさん:2009/09/06(日) 12:08:14
>>869
mag=hypot(real,image)


872 :デフォルトの名無しさん:2009/09/06(日) 12:19:02
>>870だが断る

873 :デフォルトの名無しさん:2009/09/06(日) 14:29:57
グローバル変数を使う時は、関数プロトタイプ宣言より前じゃないとダメなんでしょうか?


874 :873:2009/09/06(日) 14:30:42
日本語おかしかったです、すいません
グローバル変数を使う時は、関数プロトタイプ宣言より前にグローバル変数の宣言をしないとダメなんでしょうか?

875 :デフォルトの名無しさん:2009/09/06(日) 14:32:20
グローバル変数の宣言と関数プロトタイプは何の関係もなくね?

876 :デフォルトの名無しさん:2009/09/06(日) 14:33:31
そうでしたか、ありがとうございます

877 :デフォルトの名無しさん:2009/09/06(日) 15:45:55
かかわるプロジェクトでは必ず三項演算子は目の敵になってるんですがgotoみたいな存在なんですか?

878 :デフォルトの名無しさん:2009/09/06(日) 15:48:40
そんなことないよ。
記述の仕方を統一したかっただけじゃない?

879 :デフォルトの名無しさん:2009/09/06(日) 15:51:37
行数稼げないからって理由だったら嫌だなw

880 :デフォルトの名無しさん:2009/09/06(日) 15:54:15
>>877
なんでだろね。
どうも三項演算子を理解できないレベルに合わせろってことらしいんだが、まじかね。

881 :デフォルトの名無しさん:2009/09/06(日) 16:26:07
理解なんて数秒で済むと思うんだけど

古いコンパイラで条件演算子にバグがあって禁止されていた事はあった

882 :デフォルトの名無しさん:2009/09/06(日) 16:58:04
>>880

構造化プログラミングから逸脱する場合には不可ってことだと
思うんだけど、本質が理解されないまま全部NGになってること
はよくあるね。

参考演算子そのものの理解は当然だれでもできる。


883 :デフォルトの名無しさん:2009/09/06(日) 17:01:43
ゴメン、「三項」ね。


884 :デフォルトの名無しさん:2009/09/06(日) 17:02:09
三項演算子は()を下手に省略するとアレ?って挙動になってバグ取り高い壁になる

885 :デフォルトの名無しさん:2009/09/06(日) 17:10:05
>>882
構造化プログラミング?
逸脱する場合としない場合kwsk。
逸脱するというのであればすべて逸脱では。

886 :デフォルトの名無しさん:2009/09/06(日) 17:14:19
どんな用途か知らんが、三項演算子は特に問題ないと思うがw

887 :デフォルトの名無しさん:2009/09/06(日) 17:17:26
>>882
三項演算子どころか、ポインタもろくに理解せずに仕事してるやつ多数。
それが現実。

888 :デフォルトの名無しさん:2009/09/06(日) 17:23:23
int x = 0;
int y = 0;
bool b = なにかを代入;
//逸脱しないとき
if (b)
{
x = 123;
}
else
{
x = 456;
}
これは、x = b ? 123 : 456; とできるけど、bの意味する内容とか局所性によってはまぁ許容かな…。

//逸脱するとき
if (b)
{
x = 123;
y = 234;
}
else
{
x = 456;
y = 789;
}

こっちは
x = b ? 123 : 456;
y = b ? 234 : 789;
で書けるけど、b の真偽値に応じた代入処理のセットだと言うことが分からない。
elseifの節が後で現れるともう保守性までNG。>>885 の指摘通り、逸脱するかと
言えば全部逸脱だと思う。ちなみにオレは三項演算子は、ほぼNGにしたい派。

889 :デフォルトの名無しさん:2009/09/06(日) 17:27:37
>>888
そもそもそんなコード書かないだろというか例が悪すぎるw

890 :デフォルトの名無しさん:2009/09/06(日) 17:32:20
何とも都合のいい主観判断をするものだ

891 :デフォルトの名無しさん:2009/09/06(日) 17:33:21
>>888
なんでNGかkwsk。
2つ目みたいな書き方はめったにしないと思うが、その最初の例でNGにしたい理由は?

892 :デフォルトの名無しさん:2009/09/06(日) 17:36:16
class HogeString
{
private:
  char* str;
public:
  bool isEmpty()const{ return (name == NULL) ? true : false; }
  // これをifで書いたら
  bool isEmpty()const{
    if(name == NULL){
      return true;
    }
    return false;
  }
};

ifだと冗長的な感じがする。こういうのは三項演算子でも良いと思うんだけどな。

893 :デフォルトの名無しさん:2009/09/06(日) 17:38:30
return name == NULL;

894 :デフォルトの名無しさん:2009/09/06(日) 17:41:46
ですよねぇ〜。書いた後で気づいたわ。

895 :デフォルトの名無しさん:2009/09/06(日) 17:43:47
ワロタ

896 :デフォルトの名無しさん:2009/09/06(日) 18:54:01
string, int, int, int の4つのデータをまとめて扱いたいのですが、
mapだと2つ以上の値のセットを扱うとエラーが出てしまいました。
こういう2つ以上の値のセットを扱うためのコンテナってありますか?

897 :デフォルトの名無しさん:2009/09/06(日) 18:56:27
keyとなるものだけを残して他の3つは構造体かクラスにすれば良いじゃん。

898 :デフォルトの名無しさん:2009/09/06(日) 20:36:57
namespaceってプロジェクトにひとつぐらいで十分?もっと細かく分けたほうが良いかな

899 :デフォルトの名無しさん:2009/09/06(日) 20:37:19
CからC++に来たけど&が参照だったりアドレスだったりして気が狂いそうです

900 :デフォルトの名無しさん:2009/09/06(日) 20:39:40
>>898
好き好き。
>>899
狂ってろ。

901 :デフォルトの名無しさん:2009/09/06(日) 20:52:05
*がポインタ宣言だったり参照はがしだったり掛け算だったりする
Cから来たなら大丈夫よ

902 :デフォルトの名無しさん:2009/09/06(日) 21:07:11
>>899
使い方が全然違うじゃん。
・・・それぐらい分からないと他言語でも無理だろ。

903 :デフォルトの名無しさん:2009/09/06(日) 21:08:13
>>898
俺は2階層ぐらいだけど。
一番大きいプロジェクトの根幹のnamespaceと、
namespace implementationとか。


904 :デフォルトの名無しさん:2009/09/06(日) 21:37:13
C++のSTLに含まれているstringのメンバ関数に、
find_first_not_ofというものがありますが、
この関数を
find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789")
という風に使って、アルファベットと数字とアンダーバー以外の文字数が
最初に出現する文字数を調べようとしたのですが、うまく働いてくれません。
(;や+などを感知してくれません)

これはなぜでしょうか?

905 :デフォルトの名無しさん:2009/09/06(日) 21:46:43
>>904
とりあえずソースかけ。
話はそれから。

906 :デフォルトの名無しさん:2009/09/06(日) 21:49:20
>>904
codepad
ttp://codepad.org/

ここで。

907 :デフォルトの名無しさん:2009/09/06(日) 21:53:17
>アルファベットと数字とアンダーバー以外の文字数が最初に出現する文字数
文字数が出現する文字数ってなんだ?

908 :デフォルトの名無しさん:2009/09/06(日) 22:12:22
ちょっとぐらい間違ってる日本語を補正する頭もないのかお前は

909 :デフォルトの名無しさん:2009/09/06(日) 22:25:16
>>908
2か所間違ってるけどな。
まあなんにせよ>>906にあるところに貼ってくれるのをまとう。

910 :デフォルトの名無しさん:2009/09/07(月) 19:31:24
CあるいはC++でSQLサーバに接続するにはどうしたらいいのでしょうか?
検索しても.NETFrameworkを使ったやり方しかなく困っています
どなたかご教授お願いします

911 :デフォルトの名無しさん:2009/09/07(月) 19:32:59
sage忘れすまそ('A`)

912 :デフォルトの名無しさん:2009/09/07(月) 19:48:12
質問です。
32ビットのWindowsの場合malloc()で確保出来るメモリサイズは2Gほどだったと思いますが、
これは、1プロセスあたりの制限ですか?
1つのプログラムで、malloc()を2カ所で呼び出すと、それぞれの箇所で2G確保できるのでしょうか?


913 :デフォルトの名無しさん:2009/09/07(月) 19:54:23
>>910
ODBCでよければ、
ODBC C++とか、ODBC VC++で検索。

914 :デフォルトの名無しさん:2009/09/07(月) 20:11:32
>>912
プロセスごとに2GB

915 :デフォルトの名無しさん:2009/09/07(月) 20:40:05
>>912
どんだけ激しいメモリ消費なんだw

916 :デフォルトの名無しさん:2009/09/07(月) 20:44:44
>>914
THX
困ったなぁ・・・。ディスクアクセスしながらちびちびやるか。

>>915
48Gほどのテキストデータを木構造に展開して色々やらないといけないのよ。
う〜む、もう少しダイナミックにオンメモリでやりたかった・・・


917 :デフォルトの名無しさん:2009/09/07(月) 20:45:33
>>916
You, 64ビットに移行しちゃいなYO!

918 :デフォルトの名無しさん:2009/09/07(月) 20:48:57
BDが真っ青

919 :デフォルトの名無しさん:2009/09/07(月) 20:53:13
>>916
64bitしかあるまいw
どのみちそんなにメモリ詰めないだろw

920 :デフォルトの名無しさん:2009/09/07(月) 20:59:40
サーバ用でもない限りマザーボードの上限に引っかかるな

921 :デフォルトの名無しさん:2009/09/07(月) 21:25:21
>>916
アルゴリズムを検討してメモリの消費量を抑えるのが手っ取り早い。そのほうがいろいろ高速化できる。
それでも解決しないなら最後の手段として64bitOSと64bitコンパイラの採用を考える事になると思うよ。
どんなにメモリがあってもアルゴリズムを改良しないと演算時間がとてつもなくかかりそうな予感。




922 :デフォルトの名無しさん:2009/09/07(月) 21:43:58
48GBのテキストデータって何ぞ?
漏れのおかずフォルダでもそんなにねーぞ。

923 :デフォルトの名無しさん:2009/09/07(月) 21:59:47
>>922
そうか、本当に無いのか検証の必要があるな。よし、どっかにアップロードしろ。

924 :デフォルトの名無しさん:2009/09/07(月) 22:00:23
ゲーム作っててつまずいたので質問します
struct Test{
TEST1 b[2];
省略
}
std::list< Test > lstTest;
こうやって使ってるんですが、このTEST1の配列を動的に確保することってできますか?
リストの中にリストとかしてみたんですが、同じような動きにならなくて困ってます。(ポインタの問題?

925 :デフォルトの名無しさん:2009/09/07(月) 22:10:58
リストの中にリスト、大丈夫なはずだが

926 :デフォルトの名無しさん:2009/09/07(月) 22:11:14
64Gって、研究かな?
今は、64Gのテキストデータなんてのを普通に使うようになったのか・・
恐ろしい時代だ・・・。

927 :デフォルトの名無しさん:2009/09/07(月) 22:12:01
>>924
struct Test {
std::vector<TEST1> b;
};
でいいと思う。
あと解説サイトを見てlistとvectorの使い分けを覚えよう。

928 :デフォルトの名無しさん:2009/09/07(月) 22:14:01
list -> 知的でおしゃれな感じを出したいときに使う
vector -> スマートなやり手プログラマを演出したいときにはコレ
deque -> 研究者気取りのあなたに

929 :デフォルトの名無しさん:2009/09/07(月) 23:22:48
48GBとかのデータを扱うなら、クラスタ上でMPIとか使って並列プログラミングってのが筋かなあ

930 :デフォルトの名無しさん:2009/09/07(月) 23:54:41
buf[10] = 0xff
buf[11] = 0x32
...


int kansu(u_1 *buf){`

i = 10;
printf("test buf[i] %d", i, buf[i])


このようなプログラムで、引数で配列を渡したとき
printfでbuf[10]等の中身を見ようとしたとき、表示がおかしな値になるのですが
どうしてでしょうか?

%d, %s, %x 等もおかしかったのですが

931 :デフォルトの名無しさん:2009/09/07(月) 23:55:52
"test buf[%d] %d" では?

932 :デフォルトの名無しさん:2009/09/08(火) 00:14:45
>>931
すみません、ここに書き方間違ってました。
実際のプログラムではそうかいてます。申し訳ありません。
そう書いて、表示がおかしかたtのです


933 :デフォルトの名無しさん:2009/09/08(火) 00:23:39
%x

934 :デフォルトの名無しさん:2009/09/08(火) 00:34:53
ソースを張るなり上げるなりしてください

935 :デフォルトの名無しさん:2009/09/08(火) 00:40:31
u_1が何なのかわからないとなぁ

typedef unsigned char u_1;
だったらprintf()はスタック破壊してるだろうし
typedef unsigned long double u_1;
だったら表示がおかしいとかの次元じゃないし

936 :デフォルトの名無しさん:2009/09/08(火) 00:47:23
>>935
u_1は、unsignede char です

スタック?どの辺がおかしいのでしょうか?

937 :デフォルトの名無しさん:2009/09/08(火) 01:06:55
>>930
断片だけ書かれてもわからん。
おかしな値が再現するソースを見せてくれ。

938 :デフォルトの名無しさん:2009/09/08(火) 01:11:54
>>937
すみません、今手元にないのでそのままお見せできないんですが
下のような感じです。とはいってもさっきと一緒で分かりにくいでしょうが・・


buf[50] ;
buf[1] = 0; buf[2] =5 等代入
void kansu(buf);

void kansu(u_1 *buf){`

i = 10;
printf("test buf[%d] %d", i, buf[i])

printf以降でbuf[i]の中身を別のバッファにコピーしてるのですが、
それを確認しようと思い、printfで確認しようとしたところ
まずその確認以前にうまく表示できなかったもので・・・

939 :デフォルトの名無しさん:2009/09/08(火) 01:18:12
そもそも、bufの型はなんなんだ?
メモリは確保されてるのか?

940 :デフォルトの名無しさん:2009/09/08(火) 01:18:36
>>939
malloc関数でかくほしております

941 :デフォルトの名無しさん:2009/09/08(火) 01:19:31
>>939
bufは、unsigned char です

942 :デフォルトの名無しさん:2009/09/08(火) 01:23:51
mallocで確保するんならbuf[50]は変な気がするけどな。

943 :デフォルトの名無しさん:2009/09/08(火) 01:40:27
>>941
> i = 10;
> printf("test buf[%d] %d", i, buf[i])
別に表示がおかしくなることはないと思うがな。
この部分の、期待している表示と実際の表示を書いてくれ。

944 :デフォルトの名無しさん:2009/09/08(火) 07:33:43
>>943
期待しているのは、buf[i]に代入した値が表示したいのですが、
全く関係ない数字が表示されてしまいます。4桁とか

945 :デフォルトの名無しさん:2009/09/08(火) 07:47:07
部分だけじゃ、どこがおかしいかわかんねえよw

946 :デフォルトの名無しさん:2009/09/08(火) 08:04:01
いくら間違っても4桁になるのはありえなさそうなんだが。。


947 :デフォルトの名無しさん:2009/09/08(火) 08:31:55
>>938
まだコードが断片すぎる。コンパイルできるぐらいのまとまったものが
ないと他の人には問題は発見できないよ。



948 :デフォルトの名無しさん:2009/09/08(火) 09:21:13
printf("%d", (unsigned char) 0xff)が何を表示されるのかって問題に帰結するのかな?
それだったら255だ。これがもしprintf("%d", (char) 0xff)ならば、-1かもしれないが。
それ以外の結果になるというのであれば、他の何かがおかしいのだろうよ。

949 :デフォルトの名無しさん:2009/09/08(火) 18:03:25
fopen()でファイルを開くコストって結構かかる物なのでしょうか?
今実装してるプログラム、メモリ的な制限から探索範囲を狭めるために、ファイルを結構細分化するつもりなんですが・・・


950 :デフォルトの名無しさん:2009/09/08(火) 18:15:34
>>949
ベンチマーク取ればいいが、
どんだけ多くても数百個だろ?一瞬。
むしろそれを超えると、OSの最大ディスクリプタ数にひっかかる。

951 :デフォルトの名無しさん:2009/09/08(火) 18:16:48
>>949
まあストレージの種類によるんじゃないかな。ハードディスク上のファイルだと、
ファイルが分散しててディスクヘッドが頻繁に移動するのはハード的にきつい

952 :デフォルトの名無しさん:2009/09/08(火) 18:30:14
>>949
48Gテキストの人か

953 :デフォルトの名無しさん:2009/09/08(火) 18:59:52
頻繁にファイル開いて読み込んでってやってたらかなり遅くなるな。
一回読み込んだ内容はメモリ上にキャッシュして、キャッシュあふれたら
使用頻度低いほうから解放して…みたいな戦略は考えといたほうがいいと思うね。

954 :デフォルトの名無しさん:2009/09/08(火) 20:04:30
>>949
ファイルのオープンクローズよりも、開いたファイルでシークしたほうがはるかに軽い。

ファイルの一部分をメモリにマップする手法としてメモリマップドファイルがあるよ。
ディスクキャッシュをメモリにマップするんで大きなデーターを効率的にアクセスできる。


955 :デフォルトの名無しさん:2009/09/08(火) 20:08:25
Hoge::operator[](A,B,C);
hoge[a][b][c];
みたいなことができればいいのになんでできないんだよ

956 :デフォルトの名無しさん:2009/09/08(火) 20:25:33
>>955
それでオーバーロードを許したらambiguous多発で大変じゃないか

957 :デフォルトの名無しさん:2009/09/08(火) 20:44:33
まあ仕方ないからhoge[make_tuple(a,b,c)];
とかやってるんだけどもっとクールアンドホットなハック的テクはないわけ?

958 :デフォルトの名無しさん:2009/09/08(火) 20:46:37
>>957
プロキシーオブジェクト

959 :デフォルトの名無しさん:2009/09/08(火) 20:53:26
>>955 ちょっと工夫すればできるから。

960 :デフォルトの名無しさん:2009/09/08(火) 21:02:07
やろうと思えばそりゃできるけどさ
コストとか範囲チェキとか考えると[][][]・・・でできるいいほうほうが浮かばないんだよ

961 :デフォルトの名無しさん:2009/09/08(火) 21:02:39
>>955,958
ちとめんどいができるじゃんと思ったら
あれプロキシーオブジェクトっていうのか
初めて知った。さんくすw


962 :デフォルトの名無しさん:2009/09/08(火) 21:02:51
>>957
operator()じゃ駄目なのか?

963 :デフォルトの名無しさん:2009/09/08(火) 21:03:31
>>962
見た目がまずダサいのでアウト

964 :デフォルトの名無しさん:2009/09/08(火) 21:07:57
make_tupleにダサイって言われると地味に凹むな

965 :デフォルトの名無しさん:2009/09/09(水) 11:35:00
同意

966 :デフォルトの名無しさん:2009/09/09(水) 23:13:55
ある本の息抜き用の演習問題に、「++CではなくC++と名付けられた理由を考えよ」ってのがあったのですが
正解は何なのでしょうか?

967 :デフォルトの名無しさん:2009/09/09(水) 23:19:55
Cの互換性を保つため

968 :デフォルトの名無しさん:2009/09/09(水) 23:26:45
あ、なるほど。前置インクリメントだともはやCではないものを意味するってことですね。

969 :デフォルトの名無しさん:2009/09/09(水) 23:49:38
まあ、今適当に考えただけなんだけどねw
トンチ的な問題だろうから、たぶんそんなに的はずれでもないと思う

970 :デフォルトの名無しさん:2009/09/10(木) 04:17:25
へんなコストがかかるところ

971 :デフォルトの名無しさん:2009/09/10(木) 11:40:42
>>970
深いな。

972 :デフォルトの名無しさん:2009/09/10(木) 13:58:48
//beginコード1
for(int i=0; i<5; i++){
  // コード
}

int i;
for(i=0; i<5; i++){
// コード
}

C++で上か下、どちらのループの方が良い(皆さん使われている)のでしょうか?

973 :972:2009/09/10(木) 13:59:57
1行目の
//beginコード1
は間違いです、すみません

974 :デフォルトの名無しさん:2009/09/10(木) 14:03:33
i の中身がループの外でも意味を持つなら後者、持たないなら前者で十分。
どっちが良いとか悪いとかじゃなく。

975 :デフォルトの名無しさん:2009/09/10(木) 14:35:18
>>974
なるほど、ありがとうございます。

976 :デフォルトの名無しさん:2009/09/10(木) 15:45:51
>>966
C++ : Cを評価してからインクリメントする
++C : Cをインクリメントしてから評価する

C++ は、まずCを評価してから機能を加えたんだよ。

977 :デフォルトの名無しさん:2009/09/10(木) 17:13:48
baseクラスがいくつかの仮想メンバ関数を持っています(たとえば、void f1(), void f2())
f1の実装は2パターン、f2の実装も2パターンあります
subクラス側で外部ファイルを参照してそのデータからf1,f2の組み合わせを決定したいです
この場合4種類のsubクラスを作るほかやり方はありますか?

978 :デフォルトの名無しさん:2009/09/10(木) 17:16:35
仮想関数f1だけのクラスと仮想関数f2だけのクラスをそれぞれ作って2パターンずつ実装し、
subのf1, f2は単にそっちを呼び出す

979 :デフォルトの名無しさん:2009/09/10(木) 17:17:02
>>977
f1 なり f2 の中で条件分岐すればできる

980 :デフォルトの名無しさん:2009/09/10(木) 17:27:46
>>978
つまりこういうことでしょうか?
class hoge
{
private:
only_f1_impl *f1_;
only_f2_impl *f2_;

public:
void f1(){f1_->f1();}
void f2(){f2_->f2();}
};
メンバ変数へのアクセスで一手間かかりそうですが、よさそうなので使わせてもらいます
ありがとうございました

>>979
条件分岐は後で大変そうなのでちょっと・・・

981 :デフォルトの名無しさん:2009/09/10(木) 19:56:01
##ってどういう意味か教えてください

982 :デフォルトの名無しさん:2009/09/10(木) 20:01:49
そのトークンが現れる位置によって意味が異なるので一概に答えることはできない

983 :デフォルトの名無しさん:2009/09/10(木) 20:38:19
インスタンスがshared_ptr(かweak_ptr)の形でしか生成できなくすることってできる?

984 :デフォルトの名無しさん:2009/09/10(木) 21:07:22
>>983
コンストラクタをプライベートにして、ファクトリメソッドを書くとか。

232 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)