テンプレここまで。あと続けたい人は好きにして。
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
おつ
>>7は根強い人気だな
そう言えばランタイムライブラリのDLLって
テンプレートでも std::vector<int> とか基本的なものくらいは
含んでたりするんだろうか?
テンプレートはないだろ
本当にテンプレートを使ったことがあれば、
exportが無謀って事はすぐにわかるだろ。
friendクラスとクラス内クラスってどういった違いがあるんでしょうか
class Hoge {
friend class FactoryA;
class FactoryB;
private:
Hoge(int init);
// ry
};
class FactoryA {
private:
int i;
public:
FactoryA(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};
class FactoryB {
private:
int i;
public:
FactoryB(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};
パッと見どちらとも同じような気がするのですが
コンパイル通らんだろそれ
静的に関数を呼びだせば体が空の関数は最適化によって
何も無いようになりますか?
C++0xに関数を定数にする機能あったじゃないですか?
それ使えば出来ませんか?
factoryをテンプレート型として
体が空のときはその機能を使い
factory.a()は右辺値の定数だから
何もすることが無いみたいなこと
なりませんか?
constexprはコンパイルタイムにガーッと計算して結果を埋め込む機能だけど。
小さい関数はインライン展開を期待したほうがいいんじゃないか?
>>15,17
最適化するもなにも、空の関数はそもそも何もしないので、
ちょっと何言ってるかわからないですね。
空の関数はスタックに引数を詰んだりするんですよ?
くだらないこと言ってないでさっさとアセンブラコード見ればいいと思うの
tmp> g++ -S test.cc && cat test.s
struct A{
typedef int type;
};
struct B : A{
type a;
} b;
&bと&(b.a)が同じアドレスをさしてほしいのですが
データメンバのないクラスを継承したときに
サイズが増えないようにする方法はありませんか?
24 :
23:2011/12/27(火) 13:55:22.69
>>23 Aは空クラスなのでサイズ1
Bは変数があるからそのサイズになる
なのでサイズは必ず増える
あと、Aは継承時にはサイズ0として扱われるはずなので、
&b == &b.a
になると思うんだが
0にするかどうかはコンパイラの最適化次第じゃなかったか
>>23 template <class Derived> class A {
protected:
~A(void) { }
public:
typedef int type ;
} ;
class B : public A<B> {
public:
type a ;
} ;
とりあえずこう書いてあとはコンパイラの気分しだい
29 :
23:2011/12/27(火) 15:34:12.73
空クラスであるにもかかわらず
継承時にサイズが0として扱われない条件というのがあるのでしょうか。
情報の後出しになってしまい申し訳ないのですが
template<typename T>
struct ptr_convertable{
operator T*(){
return *(T**)this;
}
};
struct my_int_ptr : ptr_convertable<int>{
int *p;
};
int a;
my_int_ptr b;
b.p = &a;
int *c = b;
こういう感じのことをやろうとしています。
30 :
23:2011/12/27(火) 15:47:37.76
struct A{};
struct B : A{};
struct C{ operator int(){} };
struct D : C{};
struct E : B, D{};
struct F{int a;};
struct G : F{};
struct H : E, G{};
struct I : G, E{};
int a = sizeof(A); //1
int b = sizeof(B); //1
int c = sizeof(C); //1
int d = sizeof(D); //1
int e = sizeof(E); //1
int f = sizeof(F); //4
int g = sizeof(G); //4
int h = sizeof(H); //5
int i = sizeof(I); //5
クラスの内容にはあまり関係ないようです。
31 :
23:2011/12/27(火) 15:55:00.89
すいません、更新せずに書き込んでしまいました。
>>27 >>28 protectedデストラクタを書いてみましたが結果は変わりませんでした。
変換対象のクラスが多いので、こうすれば1行で書けるかと思ったのですが
なんか別の方法はないでしょうか。
マクロであきらめようかな。
まさか関数ってvirtualの?
それだと仮想関数テーブルの分どんどん増えると思うけど。
>>20 最適化してバックトレースとってみ。
リンケージが同じなら消失するから。
>>32 > 多重継承で親が重なる場合に増えてるね
全ての基底クラス部分を区別できる形で表現できる必要があるからな。
struct B {};
struct D1 : B {};
struct D2 : B {};
struct D12 : D1, D2 {};
D12 * pd12 = new D12; // 1
D1 * pd1 = pd12; // 2
D2 * pd2 = pd12; // 3
B * pbd1 = static_cast<D1 *>(pd12); // 4
B * pbd2 = static_cast<D2 *>(pd12); // 5
1と2,3は型が違う。4,5は型が同じなのでアドレスを変えて違いを出す。
何かトリッキーな事でもしたいんじゃね
C++はどうしてもCより抽象度が高くなるからアドレス関係をいじると
あまり無茶は出来ないよな
平松邦夫/民主党
大阪市役所・自治労・大阪市労働組合・日教組・大阪市教育委員会・自民党・共産党・社民党・関西電力・住友グループ
・毎日放送・毎日新聞・関西経済連合・日本原子力発電株式会社 ・ 週刊文春・週刊新潮・NHK・朝日新聞・読売新聞
・部落解放同盟・朝鮮総連・在日本大韓民国民団・日本遊技関連事業協会・全日本遊技事業協同組合連合会・日本弁護士連合会・生活保護受給者・反日左翼・9条の会・革マル派・中核派
VS
橋下徹/維新の会
大阪市民・みんなの党・国民新党・亀井静香・石原慎太郎・東国原英夫
様子見:公明
>>12 exportじゃなくて明示的実体化の話だよ
>>39 それとDLLだけとじゃさっぱり分からんのですけど。
>>40 明示的な実体化を行うと、別リンケージに関数の実体が生成される。
DLLでも同じ話。実体がある以上他のDLLやEXEで使用できる。
てか、このへんは初歩的な話じゃ・・・
>>29 それ、結局派生側の指定位置に生の T* をメンバで持つことを強要してんじゃん。
ptr_convertable が T* 持てば全て自然に解決する話じゃないの?
>>37 CにできてC++にできないアドレス操作なんて無いだろ。
>>43 いやそういう意味じゃない
Cだと構造体の中に何かを入れて後から伸ばすとか割りと見えやすかったけど
C++のクラスで同じ事をしようとすると仮想関数やら大きさ最低1バイトの縛りやら
あと継承なんかしていたら伸ばそうとした途端に他のメンバが壊れたり
いろいろ気を使うという事を言いたかった
>>44 配列以外のアドレス(ポインタ)加減算がCなら安全なことがあると思ってるんなら
おおかたただの勘違い。規格上認められる操作は大差ない。
たまたまプログラマの間違った期待どおりに動いてしまうことがCのほうがいくらか
多い(C++のほうがいくらか少ない)というだけのこと。
実際の違いと言えるところとして可変長配列と構造体中の 0 長配列メンバがあるけど、
それらも「抽象度」がどうのこうのではない。
http://seclan.dll.jp/c99d/c99d04.htm
そうなのか
vtableとかどこにくっついているか実装依存なので扱いにくいのではと思ったんだけど
>>46 vtable以外にも、オブジェクトのレイアウトに関して実装依存なことはパディングやら
アライメントやらCの範囲でもいくらでも考えられるからね。
http://www.kouno.jp/home/c_faq/c16.html#5 > 16.5: このプログラム、あるマシンではうまく走るのに、別のマシンだと変 な結果を返す。もっと変なことに、デバッグ用の出力を付けたり外し たりすると症状が違ってくる。
> A: おかしくなる可能性のあるものはたくさんある。以下に可能性の高い ものをいくつか示す。
...
> 対象となる具体的なシステムで コードの生成されかたを決 め付けて、こういう使いかたを考え付くとは俺って頭がいい なと思っていることはなんでも
Cは継承や仮想継承、仮想関数がないからそれだけでもC++よりは扱いやすい
構造体だと思ったんだが
>>47のリンクは知ってる
トリッキーな事をすると必ずリスクは付いて回る
しかしC++はそのトリッキーな事が致命的な結果をもたらす率が高いと思う
>>45 反応する所が違うだろ
クラスに対してトリッキーな事(強制キャストが必要な操作)を
すんなってのが要点なんだから。
別にPODなコードは絶対安全とかそんな話を
してるわけじゃないだろ。
>>49 まあいいだろ
俺は前スレからの流れで書いたつもりだったんだが汲んでもらえなかったようなので
クラスはPODにいろいろ厄介な物が(もちろんメリットの方が遥かに大きいが)付いているので
あまり変な事はしない方がいいよって意味で書いた
PODも規格外の事をすれば当然危ない
当たり前の事だよな
無茶なキャストやアドレス操作をすることを前提にして
問題を起こす率の高い低いを考える意味がわからんな。
まぁ「思う」のは自由だよね。
>>10 文字列関係は大体入ってた。complexやnumeric_limitsなんかも入ってることはあるな。
>>51 いやだから「規格外」である事は承知で、Cで無茶をして動かしている例はいくらでもある
プログラム組んだ事ないのか?
でもC++でそれをやろうとするとほとんど不可能になると言いたいだけの話
お前アスペだろ
C++でも規格外なコードは書けるし書かれまくってるだろ
ラップするから見えないだけで
駄目だこいつ
相手しないでおこう
56 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
57 名前:チンカス[sage] 投稿日:臭い
>>47 そういや、vtableなんてポインタじゃ無くても実装できるしな。
動的リンクを考えなきゃ、コンパイラが全てのクラスのvtableを
直列した配列にして、オブジェクトには、その配列のオフセットを
持たせるだけってのでもいいわけだしな。
仮想関数のテンプレート化はできないんでしょうか?
class Hoge {
public:
template <class Iterator>
virtual void Func1(Iterator begin, Iterator end) = 0 ;
template <class Inserter>
virtual void Func2(Inserter inserter) const = 0 ;
} ;
class HogeEx : public Hoge {
std::vector<int> v;
public:
template <class Iterator>
void Func1(Iterator begin, Iterator end) { v.assign(begin, end); }
template <class Inserter>
void Func2(Inserter inserter) { inserter = v.front(); }
}
みたいな感じで主にイテレーター関係やファンクタを引数に取る関数で使いたいんですけど
ああそれね。そういうのウチはやってないから。
>>62 それっぽくできました
ありがとうございます
相談
C++(C)でdllのリソースファイルとして.txtファイルを埋め込んで、そこから文字列を取り出すにはどうしたらよいですか?
検索しても出てこないのはもしかして当たり前のこと過ぎるからでしょうか・・・
C/C++にそのような機能はないのでなんらかのAPIを使う
WindowsならWin32スレいけ、っていえるほどあそこいいところじゃないからとりあえずはっとく
BOOL CALLBACK 探すコールバック( HMODULE hModule, LPCWSTR lpType, LPWSTR lpName, LONG_PTR lParam )
{
HRSRC hrsrc = FindResource( hModule, lpName, lpType );
if( hrsrc ) {
void* data = LoadResource( hModule, hrsrc );
if( data ) {
hoge* pwork = (hoge*)lParam;
strcpy( pwork->hage, data );
}
}
return TRUE;
}
void 探す関数()
{
hoge work;
HMODULE hModule = LoadLibrary( "dllのパス" );
if( hModule ) {
EnumResourceNames( hModule, RT_STRING, 探すコールバック, (LONG_PTR)&work );
FreeLibrary( hModule );
}
}
あぁ、ファイル埋め込みならRT_STRINGじゃなくてRCDATAか
ありがとう
>>65-67 ありがとうございます
なるほど、やはり一発でポンというのはないのですね
またわからないことが出来たらよろしくお願いします
複数の配列を合併してひとつの配列をつくりだすことに
もっとも適したデータ構造をおしえてください。
配列とそのポインタの配列。
RopeかFingerTreeあたりか
std::vector<std::vector<>>
2重配列のやつだと同じ要素が2つあるやつの合併は処理が困っちゃいますよね。
それは重くなる。
std::vector<std::vector<>*>にしとくべき。
ポインタだけならサイズ変更しても負荷は小さい。
普通、連結と言ったら要素は重複しても、単に前か後ろにつなげるだけだ。
>>71 vectorのリストがいいよ
先頭のベクタの長さをNとする
先頭を除いたベクタのリストの長さが合計で2Nに達したら
先頭を倍+αに伸ばしてそこに先頭を除いたベクタの内容をコピーして先頭以外を解放する
union-find木
要素の重複は削り、順序は無視して良いならstd::setに入れとけ。
mapで使えるやつがないな。
メモリ食いすぎる。
STLportがマシだが。
Googleとか頻繁に更新してるのにSTLportのメモリと速度に追いつけず。
同条件で比較したmapの性能。stlport_std::hash_mapが全てにおいて優れて他のやつ使う余地がないな。
stlport_std::hash_map
Insert Time: 8.859 sec. Search Time: 2.875 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB
stlport_std::map
Insert Time: 12.265 sec. Search Time: 14.953 sec.
ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB
std::map VC9
Insert Time: 14.078 sec. Search Time: 13.953 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB
stdext::hash_map VC9
Insert Time: 10.109 sec. Search Time: 7.5 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB
google::sparse_hash_map ver.1.12
Insert Time: 51.921 sec. Search Time: 9.407 sec.
ページフォールト数: 11949 最大ワーキングセットサイズ: 48664.6KB
google::dense_hash_map ver.1.12
Insert Time: 10.14 sec. Search Time: 5.375 sec.
ページフォールト数: 29635 最大ワーキングセットサイズ: 82599.9KB
自分の環境はスペックであることは書いておかなければいけなかった。物理メモリが1ギガしかない。
消費メモリサイズには影響は無いと思うが、ページフォールトによる速度低下はあり得る。
google::dense_hash_mapなどはメモリ食うから、容量が大きいマシンでつかったら速度は一番になり得る。
これがコピペだと気付くのに時間かかった
コピペだけど自作データだが。
再試+テストコード公開よろ
ここに貼るのが無理でもblogの方にでも貼っていただければ
こんなのだが。map部分は書き換える。
#include <string>
#include <time.h>
#include <unordered_map>
#include <windows.h>
#include <psapi.h>
#pragma comment (lib, "psapi.lib")
using namespace std;
int InsertNum=500000, SearchNum=4000000; double timer();string strgen();void meminfo();
int main() {
tr1::unordered_map<string,int> hmap; int i; timer();
for(i = 0; i < InsertNum; i++) hmap.insert( make_pair( strgen(), i ) );
printf("Insert Time: %fsec.\n", timer());
timer(); for(int n=0; n<100; n++) {
string find = strgen();
for(i = 0; i <= SearchNum/100; i++) hmap.find(find); }
printf("Search Time: %fsec.\n", timer());
meminfo(); }
double timer() { static int n=-1; static unsigned int cl[2];
if(n==-1) { n=0; cl[0]=clock(); return 0; }
n=1-n; cl[n]=clock(); return (cl[n] - cl[1-n]+0.0)/CLOCKS_PER_SEC; }
unsigned int randxor() { static unsigned int t, x=123456789,y=362436069,z=521288629,w=88675123;t=x^(x<<11); x=y; y=z; z=w; return w^=(w
>>19)^t^(t
>>8); }
string strgen() { string str; for(int j = 0; j < 1+randxor()%4; j++) {
int r=randxor(); for(int n=0; n<32; n+=2) str+=(char)('a'+(r>>n)%4); }
return str; }
void meminfo() { PROCESS_MEMORY_COUNTERS memInfo = {0};
GetProcessMemoryInfo( GetCurrentProcess(), &memInfo, sizeof(memInfo) );
printf("ページフォールト数: %d\n", memInfo.PageFaultCount);
printf("最大ワーキングセットサイズ: %0.1fKB\n", 0.001*memInfo.PeakWorkingSetSize);
printf("最大ページングファイル使用サイズ: %0.1fKB\n", 0.001*memInfo.PeakPagefileUsage);}
stlportのhash<string>はあんまり質が良くないから気をつけたほうがいいかも
たまに衝突してもいいというマップだと省メモリ・高速にできるな。
listのmergeって内部のデータを盗むやつだから
新たにデータをつくりませんよね?
あと順序を維持したままというのはmergeすると
ソートが勝手に行われるということですか?
単純に後ろにくっ付けたいときはどうしたらいいですか?
あとdequeやvectorで2つのやつを新たなデータを作らずにマージできますか?
listはデータ構造的にたまたまそういうことができるだけ
STLのほかのコンテナでは無理
setやmapならできそうな気もするけどSTLには残念ながらそういう機能はない
ソートせずにくっつけたいだけならspliceを使う
配列のポインタを保持してそれでつなげ。
そしたら低負荷だ。
派生クラスのコンストラクタを自動でprotectedにするテクニックってありますか?
派生可能かつ生成関数を通じてのみ生成可能なクラス群を書きたいのだけど
いちいち全クラスにprotectedコンストラクタを書くのが面倒です
(例)
class X {
protected:
// CTORS
virtual ~X(void) {};
public:
static X * Create(void) { return new X; }
};
class Y : public X {
protected:
// CTORS
public:
static Y * Create(void) { return new Y; }
};
class Z : public Y {
private: // final的な意味で
// CTORS
public:
static Z * Create(void) { return new Z; }
};
配列の配列がdequeってかいてあったからマージできるとおもったけど
出来ないんですね。
おとなしくvector型の配列つくりますね。
>>94 無理じゃね
そもそも何でコンストラクターはダメで
Createならいいの?
>>96 enable_shared_from_thisとかその他のフックがついてる時
あるいはCreateでマネージャに登録などの他の処理もしてる時
とかですかね
寿命の管理の責任ははっきりしているけれど共有したいポインタがあるから
unique_ptrのweak_ptrみたいなものが欲しいのだけどそういうイディオムとかって有りませんか?
unique_ptrを参照渡しする
#include <memory>
#include <iostream>
#include <stdexcept>
template<typename T> void f(std::unique_ptr<T> const& p) {
if (p.get()) {
std::cout << *p << std::endl;
} else {
throw std::invalid_argument("no ownership");
}
}
int main() {
std::unique_ptr<int> p(new int(0));
f(p);
std::unique_ptr<int> q = std::move(p);
try { f(p); }
catch (std::invalid_argument const&) {
std::cerr << "p lost ownership" << std::endl;
}
f(q);
}
こんな使い方していいのだろうか・・・
参照だけではウニポが無効になったことを検知できない
unique_ptrがscope outしたらそもそも見えない
std::moveで他のunique_ptrに所有権が移ればget() == nullptrになる
それ以外で無効になるときってどういうのがありますか?
明示的に開放した場合
>>104 なるほど明示的な開放ですか、確かに弱参照っぽく使うとなるとそういうケースも当然考えられますね
そこでこの操作をunique_ptrのデストラクタにおける所有権放棄+リソースの解放を手作業で行うものと見做して
rp = p.release();とした後にp.get_deleter()(rp);としましたが、その直後のpはreleaseの仕様よりp.get() == nullptrとなり
unique_ptrの参照から無効となったことを検出できているようですが、これでは駄目なのでしょうか?
これ以外にはdelete p.get();のような対処不可能なものしか考えられないんですが、他にも見落としがあるという気もします
ユニポに割り当てられていたメモリが最利用されて他のオブジェクトで上書きされた時
なるほど、やはり排他付きのshared_ptrとweak_ptrでやった方が楽そうですね
便乗してshared_ptrに関する質問なんだけど、
void SetValue(const shared_ptr<Value> & value) { ... }
みたいな引数のconst参照渡しは認められているけど、
const shared_ptr<Value> & GetValue() const { ... }
みたいなconst参照返しは認められていないのはなぜ?
べつに認められてないことはないよ
>>108 それでも、問題ないと思うけど、
shared_ptrは自身のコピーを作るときにカウント増やすのであんまり参照返しにする意味はないと思う。
なるほど、大丈夫なのか
shared_ptrを参照返しするばあい、
shared_ptrのポインタ(参照)を取得→参照返し→呼び出し側の処理
だから、呼び出し側の処理で参照カウントのインクリメントをする前に、
参照カウントが0になるような処理が他のスレッドとかで発生する(するのか?)とまずいと思ったんだけど・・・
shared_ptrを値返し(shared_ptr<Value> GetValue() const)するばあい、
参照カウントのインクリメント→値返し→呼び出し側の処理
だから、途中でカウントが0になることはあり得ないという考え
値返しでも
・GetValue呼び出し
・他スレッドで内部スマポを破棄
・GetValueの戻り値コピー(空スマポが返る)
という順番になる可能性はある。
おお、確かにあるわな
つまるところ微妙に大きい構造体のメンバ変数を値返しするか、参照返しするかの違いか
スレッドAにスマポを保持
スレッドBにスマポを保持
この時点でカウントは2
スレッドA内のスマポ保持者が同じスレッドにスマポを参照で返そうが値で返そうが問題ない
返してる途中でスレッドB内のスマポが破棄されてもカウントは1以上と保証されてる
やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
まあそんなことする奴はいないと思うが
std::list<int[2}>は作れますか?
作れなければどうしたら好いですか
struct a { int a[2]; }
list<a>
>>115 なんでstd::list<int[2]>なんですか?
std::list<int>じゃダメなんですか?
そこはstd::list<std::pair<int, int>>で
boost::arrayなら入れられる
>>144 >やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
参照返しはダメだとして、値返しならスレッドセーフになる?
あと、スレッド間の参照渡しも危ない?
BOOST_SP_DISABLE_THREADSを宣言したばあい、スレッド間での
・値渡し
・参照渡し
・値返し
・参照返し
の動作はどうなりますか?
class Base{
コンストラクタとデストラクタ
}
class Super:Base{
コンストラクタ1
コンストラクタ2
}
コンストラクタ1:Baseコンストラクタ{
(コンストラクタ2をオーバーロード)
}
コンストラクタ2:Baseコンストラクタ{
...
}
こうすると、コンストラクタ1を呼び出した時、多分そのスコープを抜けるときにBaseのデストラクタを呼び出して
困ったことになるんですが回避方法はありますか?
122 :
121:2012/01/03(火) 12:39:01.09
ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね
コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
>122
>コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
多分、対処はそれで正しい。が、
・オーバーロードって用語、意味間違ってるんじゃね?
・Super→Sub あるいは Base→Derived なので Base、Super って書かれるとはぁ?って感じがする
・コンストラクタの中で他のコンストラクタを呼び出すことは出来ない。多分、一時オブジェクトを生成してるだけ。
struct Derived : Base
{
Derived() : Base() {}
Derived(int n) : Base()
{
Derived(); // 一時オブジェクトを生成してるだけ
}
};
・「ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね」
標準ライブラリでも普通にオーバーロードしてると思うが。
C++ 11
delegating constructor
ちょっと質問です。
char c[4] = {'a','\0','*','*'};
c は文字列を表していますが、実際は 4byte 固定のバイナリデータで、\0 の後ろにはゴミが入っています。
3文字以下の場合は \0 終端が保証されていますが、4文字ちょうどの場合は \0 終端されていません。
この c を std::string に変換するにはどうすればいいでしょうか。
案1:
std::string s = std::string(c);
これだと、\0 終端していない場合はうまく変換できません。
案2:
std::string s = std::string(c, 4);
これでうまく行くと思ったのですが、続けて s += "def"; とすると、
s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
理想では a d e f \0 となってほしいです。
自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
よろしくお願いします。
>>125 これくらいしか思いつかん
std::string s = std::string(c, 4);
s.resize(strlen(s.c_str()));
string s(string(c, 4).c_str());
>>127 ああーーそれだ!
うまく行きましたありがとうございます!!
>>125 std::string s(c, std::find(c, c + 4, '\0'));
string自体に超最適化されたfindメンバがあるのに、どうして効率の低いアルゴリズムをわざわざ使いまんのや。
stringのfindメンバとやらで>129をもっと効率よくできるの?
C++ Coding Standards
「時期尚早の最不適化をしてはならない」原則に反する。
要するに糞コードを書くなってことだろ。
それとも Effective STL の「アルゴリズムより同名のメンバ関数を優先して使おう」だろうか。
どっちにしてもそんな初心者向けのルールすら無視して糞コード書いちゃだめだな。
どれを指して糞コードって言ってるの?良いコードはどんなの?
同名とはいえ可換じゃない関数でそんなこと言われても
当たり前すぎて議論するようなレベルの話じゃないが
理由を知りたいなら Effctive STL にも C++ Coding Standards にも載ってるからそれ読めれ。
っていうか、回答者なんだから知ってて当然だと思うんだけどどーなの?
>>131 大して変わらないと思うけど例えば
char c[4] = {'a', '\0', '*', '*'};
std::string s = std::string(c, 4);
std::cout << s << " length: " << s.size() << std::endl;
s.resize(s.find('\0'));
std::cout << s << " length: " << s.size() << std::endl;
それじゃ\0が含まれないとき死ぬだろ
あそっか、string::nposをチェックしないと行けないのか
s.resize((s.find('\0') == std::string::npos) ? s.size() : s.find('\0'));
なんか格好悪いなあ
if文で単純に分岐させた方がいいな
std::string::size_type si = s.find('\0');
if (si != std::string::npos)
s.resize(si);
すみません。以前こちらで仮想デストラクタについて質問したものです。
簡単な参照カウンタつきnew/delete を実装したく、Web ページをあさっていたのですが、delete/new の演算子オーバーロードのサンプルをみるかぎり、
class A {
static void *operator new(size_t size) { malloc(size); }
static void operator delete(void *p) { free(p) }
};
という感じで、new/delete の中身は malloc()/free() になっているものしか見当たりませんでした。
これを <cstdlib> を使わずに c++ だけで完結させたいのですが、どうすればいいでしょうか。new/delete をオーバーロードした以上、malloc()/free() 呼び出しは不可避なのでしょうか。
キーワードをいただければありがたいです。よろしくお願いいたします。
::newとか
プログラム系の質問とは若干離れてますが、
ここで議論してる事ってかなり高度な事ですよね
プログラマ目指したいのですがここの話に参加できる位にならないと話にならない感じですか?
>>141 OSのメモリ関連のAPIを直接呼び出してもいいし(WinならVirtualAllocとかHeapAllocとか)
そんなに大きな領域が必要でないならstatic char mempool[10000]とか確保しといてメモリプールとして少しずつ割り当てていくとかある
>>143 そうかもしれないしそうでないかもしれない精進あるのみ
>>145 そうですね
学校で無双して気持ち良くなってるレベルじゃダメですねw
精進しないとダメだとわからされました><
あ、今docのバグを発見した
boost::poolのリンクが間違ってる
boost/libs/pool/doc/index.html
じゃなくて
boost/libs/pool/doc/html/boost_pool/pool.html
だ
boost/libs/pool/doc/html/index.html
だった
150 :
デフォルトの名無しさん:2012/01/04(水) 09:36:17.54
>>143 できないと話にならないブラック企業もあるし
ずぶのド素人でも研修でちゃんと使い物にしてくれる優良企業もある
しかし、3ヶ月でC++が物になるとはちょっと思えんなぁ…
Javaなら3ヶ月でも十分だけど。
3日で経験3年とかいって放り込むのはよくあることでした
デストラクタでメモリを解放するとき、まだ参照しているところが残っていたら削除しないようにすねにはどうしたらできますか。
vector<クラス> a(100,クラス(5));
とすると初期化時に呼び出したクラスが解放処理してしまいます。
つ[コピーコンストラクタ]
サンクス
156 :
片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 13:30:50.40
>>156 名前空間内でoperator newなどを定義するなと言ってくるんだが
..\New_test2.cpp:26:82: error: 'void* mzc::operator new(size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:43:62: error: 'void* mzc::operator new [](size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:47:34: error: 'void mzc::operator delete(void*)' may not be declared within a namespace
..\New_test2.cpp:70:36: error: 'void mzc::operator delete [](void*)' may not be declared within a namespace
..\New_test2.cpp:74:58: error: 'void mzc::operator delete(void*, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:91:60: error: 'void mzc::operator delete [](void*, const mzc_debug_t&)' may not be declared within a namespace
規格票は§3.6.2だな
159 :
片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:12:04.44
>>159 ..\New_test3.cpp: In function 'void* operator new(size_t, const mzc_debug_t&)':
..\New_test3.cpp:26:37: error: 'malloc' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*)':
..\New_test3.cpp:56:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*, const mzc_debug_t&)':
..\New_test3.cpp:66:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'mzc_debug_t MzcNew(const char*, int)':
..\New_test3.cpp:77:26: error: 'strcpy' was not declared in this scope
std:: と <cstdlib> <cstring> を忘れているだけだと思うが
>>137-140 効率悪くなってんじゃねーか。読みやすくもないし。どこも良くなっるように見えない。
>>161 だからどれでもいいんだって
find()を使えと言われたから使っただけの話
stringはメモリ効率悪いよ。
char*なら終端は1バイトだけ。
stringは最低でも長さを表すのに4バイト(32ビット)使っている。
それ以上に無駄がある可能性あり。
stringに変換するなら、
string s = ch; もしくは string s = (string) ch;
でいいだろ。
>>164 お前さあ
>>125を良く読んでないだろ
>案1:
>std::string s = std::string(c);
>これだと、\0 終端していない場合はうまく変換できません。
これを回避したいと言っているんだけど
stringはサイズの他にcapacityも持ってるんじゃないかなあ?
>>166 char*を渡されたとき終端は\0で判別するしかないだろう。
それかchar*と一緒にサイズを渡せば解決。
string(ch, size);
>>165 BCCのバージョンは?
俺のは最新のEmbarcadero6.43で問題なし
ところでバグあるんじゃね?このソース
CodeGuard掛けると何か言ってくるぞ
Error 00003. 0x400000 (r) (Thread 0x1200):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new1.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new1.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new1.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new1.exe:0x01:0016F4) operator_new1.cpp#49
0x00403535(=operator_new1.exe:0x01:002535) operator_new1.cpp#62
0x0040D19F(=operator_new1.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new1.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
>>168 だからそれは
>>125に既に書いてあるから
ちゃんと読んでから書け
>案2:
>std::string s = std::string(c, 4);
>これでうまく行くと思ったのですが、続けて s += "def"; とすると、
>s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
>理想では a d e f \0 となってほしいです。
>自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
>よろしくお願いします。
stringの一時オブジェクト作ってる時点でどうやっても
>>129より効率よくなんてならないよ。
テンプレートでTemplate N、 char[N]のようにサイズとれるか?無理だったか?
174 :
170:2012/01/04(水) 14:37:32.23
>>170 それはゴミも渡しているんだよ。サイズは1だろが。
>>173 template <int N>
void func(double (&a)[N]);
みたいな奴か?
>>175 だからゴミを取り除く議論をしてるだろうが
お前全然人のレス読まないのな
>>176 いやそれは関係ないと思う
まだエラーが出るぞ
Error 00003. 0x400000 (r) (Thread 0x0E18):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new2.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new2.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new2.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new2.exe:0x01:0016F4) operator_new2.cpp#49
0x00403535(=operator_new2.exe:0x01:002535) operator_new2.cpp#62
0x0040D19F(=operator_new2.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new2.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
>>178 ゴミを取り除くためにはstring s = ch;でいいだろ。
charのポインタを渡されたらサイズ不明で処理して\0を終端と見なすしかない。
それを自動でやってくれるのがstring s = ch;
もういい、しゃべるな。
g_mapのメソッドとnewとdeleteがどこからどういう順番で
呼ばれてくるかが分からない。
自作関数に限らず、標準関数でも終端は\0として処理するぞ。
4バイト以内に\0が現れなければそれ以降に\0が出るところまでを一文と見なす。
これが正常動作。
最初に\0を付加しないのがバグ。
いまは固定長でサイズが4だと判明してるから、min( \0が現れる位置、4 )でいいがサイズ不明なら、\0が現れる位置という情報しか取れない。
g_mapのメソッドがコンストラクタよりも前に呼び出される
ということ? どうすればいいんだ。。。
>>187 このコードを見て皆様はどう思いますか?
>>184 バグじゃなくて、わざと'\0'終端でない場合どうするかって話をしてるんだが・・・文盲?
>>187 何これ
Error 00001. 0x350010 (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECC0)
| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()
The object array (0x00BAECC0) [size: 1 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)
Error 00003. 0x350010 (r) (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECE0)
| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()
The object array (0x00BAECE0) [size: 5 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)
Error 00004. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xBA05A0) was never freed
The memory block (0x00BA05A0) [size: 48 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;
Error 00005. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xB99270) was never freed
The memory block (0x00B99270) [size: 540 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;
______
r〃〃〃 f7⌒ろ)
l‖‖‖ || f灯
|‖‖‖ || | |
|儿儿儿._」⊥厶
〔__o____o_≦ト、
. i / ⌒ ⌒ ヽ )
!゙ (・ )` ´( ・) i/
| (_人__) | \
\ `ー' / / ー- 、
. ,ィ(⊆≧リ≦⊇)〃 / rク\
. / | ̄r少}¨ ̄〃 / /′ ヽ
〃 l | l| | l| 〃 / / └ヽ
/ l |l | |l/″ / ! 厂 \
く, Y ! l」fレト! / | / 1
丿 | | 丿} じ’ / | / |
/ l | `¨ / レ′ |
真の思考停
(在位 2009年9月16日〜2010年6月8日)
民主朝の初代考停、言行不一致、虚言、脱税、
そして外交において巨大な負の遺産を築いた。
>>190 関数の引数ではchar[]を渡せずchar*になることが多い。サイズ不明になる。
>>197 話をそらすなよ
関数の引数の話なら別パラメータでsize_tを渡せばいいし
199 :
141:2012/01/04(水) 21:02:54.35
class Object {
ObjectManager * pObjMng;
// ry
};
class ObjectManager {
Container<Object *> cpObj;
// ry
};
こんな感じの相互参照があるんだけど
スマポにするならどっちがshared_ptrでどっちがweak_ptrにするのが一般的ですか?
所有権を持たない場合にweak_ptrを使う
集約してるならsp
参照しているならwp
ということでしょうか
戻り値にするようなモノはsp
というか削除する責任者が
居なくなりそうならsp
自分は削除に感知しないと思う
オブジェクトはwpだろ
204 :
デフォルトの名無しさん:2012/01/05(木) 06:45:42.41
STLの安全性は保障されていないということでよろしいでしょうか?
C系列で保証なんて何も無いよ
中身の短いメンバ関数って、積極的にヘッダでインライン化するべきですか?
それとも、大した恩恵は無く、ソース内に入れておくべきですか?
>>206 呼び出す回数に凄く依存する。
インライン化されずに時間掛かったとして、全体0.01%だったらしなくても変わらず。
出来上がってから実測。
>>206 自分はコンパイラさんにお任せするのでinlineキーワードを使ったことがない。
クラス定義内に書いたらinline付いてるのと同じ。
どんなに短くても、ループ内で何回呼び出されようと
自動的にインライン化されることはほとんどないので
自分でインラインにするべきかどうか判断した方がいい。
短ければ関数呼び出しよりもサイズ小さくなる場合もあるし。
210 :
208:2012/01/05(木) 15:57:58.20
>>209 あれ?そうなの??
昔最適化で勝手にインラインになるから気にするなって言われたのをずーっと信じてたんだけど。
まー、個人的にはカリカリチューンはきらいだからねぇ。。。
むむむ・・・。
ボトルネックが確定してから変更すれば良い。
それまでは自分の書きやすい方法で。
212 :
208:2012/01/05(木) 16:17:14.64
おk!
昔はコンパイル単位をまたがる最適化とか一般的じゃなかったけど
GCCは4.5からVCは8から出来たと思う
だから今は関数に別名を付けたいときやヘッダで完結させたいときしかinline使わないな
インライン使うと、同じ関数が他所に分断され配置されキャッシュの効果が薄まる。
なるべく使わない方がメモリと速度に良い。
AMDがVC++ならO2よりO1使ってキャッシュに詰め込めと言ったり大変な世界だな
プライベートメンバのラッパとか
関数呼び出しよりも軽い処理は積極的に
インラインにすればいいんじゃねーの
Javaとc++どっちやろうか迷ってます。
プログラミングは初めてです。
両方やったことある人に聞きます。
最初はどっちから手を出した方がいいですか?
>>217 初見でC++は死ぬと思うがな
割と適当でもなんとかなるJavaにしたら?
まぁホント言うならC#(ry
C++はマルチパラダイムかつ値のセマンティクスがある言語だから、初心者がやると(プログラムが)爆死しやすい。
オブジェクト指向一本に絞ってるJavaのが無難。
メモリ上の扱いとか覚える気ならC++。
実用面で、PHP(C++のスクリプト言語化のようなもの)
Groovy(JAVAのスクリプト言語化のようなもの)
C#
をすすめてみた。
>>213 ヘッダだけで完結させるならstaticじゃね
どちらでも内部結合になるし、
そんな場合は大して長くない処理を書くことが多いからinlineでも
全然問題ないと思うけど
C++からやれよ。AOJとかの結果見ると、Javaがどんだけメモリバカ食いで実行速度遅いか、がく然とするぞ。
>>225 普通の関数の話だった
セッターゲッターはstaticの意味が変わってしまうがな
てか下駄雪駄の意味がわからずしばらく考えたじゃないか
内部結合のstaticはC++11で廃止されたから使わない
229 :
206:2012/01/05(木) 19:03:11.22
みなさんどうもです。
セッタやゲッタの中にも数行必要なものもありますし、
そうなるとますますソースとヘッダどちらに書くかの境界線が判断できない上に、
「このセッタはヘッダ」「このセッタはソース」みたいになると、
個人的には読みにくいと感じるため、
>>211さんの言われるように、
ボトルネックだと感じるまではすべてソースに書いておこうと思います。
>>218 べつにC++からでいいだろ。
Java勉強しなくても、C++知ってりゃ書ける。
その逆はない。
オブジェクト指向言語からやるとC++の変なところを学習しにくい
C++を便利に使ってしまう
>>214 それはない。インライン展開しまくったとしても、
今時のキャッシュメモリなら1次キャッシュに収まるからな。
それと、96bit画像の描画したときは、インライン展開した方が、
関数外と関数内の式が結合され7割まし早かった。
OO勉強したいなら、PythonやSmalltalkから入ったほうがマシだろ。
参考書の大半が引数書き換えを邪気に扱ってるし、
オブジェクトの委譲によって、オブジェクトを組み立て、
オブジェクトの振る舞いを作ることによりプログラムの動作を
決めるというOOの基本を実践してるサンプルが少ない。
SwingでGUIをつくるのにJFrameを継承するとかバカな解説ばっか。
実はオブジェクト指向ってしっくりこないんです!
そうですか。それはスパゲティですね。
私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか?
皆さん生きていけないですよ!
優柔不断なのが悪い
他の女とどうなるか解からんが
素直にシャルルを選んどけ
>>236 >私に嫌われたらどうなりますか?
おまえの仕事をする奴がいなくなるだけじゃない?
みながわさんはいまだにオブジェクト指向の話で持ち出されるのか
>>223 inline に内部結合にするなんて効果は無いよ。
241 :
デフォルトの名無しさん:2012/01/06(金) 02:07:20.94
すみません、C++初心者です
例えば、Objクラス型のオブジェクトを、引数なしで作成・初期かする場合、
Obj obj;
とするだけで、デフォルトコンストラクタがよばれるのでしたっけ?
それとも、
Obj obj();
でないといけないのでしょうか。
>>241 なんで試さないんだよ
ちなみに前者が正解。後者はアウト。
243 :
241:2012/01/06(金) 02:12:05.64
>>242 すみません。。
どうもありがとうございます。
デフォルトコンストラクタに、適当なpublicメンバ変数aに定数を代入する
操作が入ったHogeクラスを作って、
Hoge obj;
のあと、obj.aの内容をみて確かめてみます。
>>228 見たけど別に廃止されてなかったが (3.5-3)
C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
>ある程度アクセス制御されたグローバル変数
具体例頼む。
class shared {
protected:
static int n;
};
class hoge : public shared {};
class fuga : public shared {};
みたいに丸出しよりましかな程度のものだけど
関係ないけどこれの方がnをcppで定義しなくていいから楽。
class shared{
protected:
static int &n(){ static int value; return value; }
};
>C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
どっちでもいいんじゃない?マルチパラダイムなんだし。
>>246 「いい」の基準が不明だな。どっちにも文句を付けられるだろう。
>>248 どっちも無し。
int n;
new hoge( &n );
new fuga( &n );
で十分
template<typename T>
struct temp_type{ typedef const T &t; };
template<typename T>
struct temp_type<T*>{ typedef T *t; };
template<>
struct temp_type<int>{ typedef int t; };
template<typename T>
void hoge(typename temp_type<T>::t v){}
int a = 1;
int *b = &a;
struct HOGE{} h = {};
//C2783
hoge(a);
hoge(b);
hoge(h);
テンプレートで指定された型に応じて
値を渡すか、const参照を渡すかを決めたいのですが
「テンプレート 引数を 'T' に対して減少できませんでした」
となります。
関数hogeでは引数を書き換える予定はないです。
テンプレートでない関数の場合は
例えばconst int &やint *const &など渡さないと思うし
参照を関数内でデリファレンスするのも無駄だと思うので
アドレスとおなじサイズの整数やポインタを渡す場合は
値渡し選択したいのですが、どのように書いたらいいですか?
hoge<int>( 10 ); // おそらくOK
>>253 template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
template<typename T> void hoge(int v);
これでは何故ダメなのか?
複数のクラスが互いに参照しあって連携してるケースは難しいね
メディエーターパターンを使ってシステムの連絡路を一本化するのがいいと言われてやってみたけど
メディエーターのインターフェースが凄まじく大きくなってしまった
それはどういう意味があるコードなの?
オーバーロードとは何が違うの?
>>254 型を書けばいけました。でも呼び出し側の書き方は変えたくないです。
>>255 hogeの処理は共通なので定義は1つにしたいです。
hogeのような関数がたくさんあって、呼び出しも多いので
関数を型の個数分書いたり、呼び出し部分の記述量を増やすことなく
実現するにはどのようにしたらよいですか?
条件後出しですいません。
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
処理の内容が同じならこの2つでいいよ。
後者は、前者を呼び出すだけでいい。
速度はコンパイラが勝手に最適化するから気にすんな。
うんな事より、プログラムを1つ完成させることに力を入れろ。
どうしても気になるなら最適化後のアセンブリコード見て確認してみ。
>>257 Mediatorを分割すりゃよかったんじゃね。
別に1つの依頼者クラスが1種類の調停者にだけ
依頼せにゃならんわけでもないだろう。
そもそも何をしてるのか知らんから
Mediatorが適した課題かどうか怪しいが
@
bool Load()
{
return false;
}
A
void Load()
{
new throw Exception()
}
関数のエラーをboolかthrowどっちで検知すればいいのだろうか
1
正解: optional
X x {} って気色悪いな
C#ではよくある事。
class IHoge {
public:
virtual ~IHoge(void) { }
virtual void Method(void) = 0;
};
class HogeBase : public IHoge {
public:
void Method(void) { }
};
class HogeEx : public HogeBase { };
こうやっていちいち分けるのが流行ってるのはなんで?
どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし
class HogeBase {
public:
virtual ~HogeBase(void) { }
virtual void Method(void) { }
};
class HogeEx : public HogeBase { };
でいいじゃないですか?
>>268 IHogeって事はCOMか?COMは実体を持てないからな。
それは別として、最上位に完全抽象化クラスを置いとくのは、
HogeBaseの全てをオーバーライドするクラスを作ったとき、
HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。
>>262 Function( source.Load() ); // Loadはsourceから読み出した情報を返す
こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。
>>262 Loadが失敗する状況がふつうにありえそうなら1。
(プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。
bool Load(...) {
// ファイルフォーマットエラーなど
return false;
// ハードウェアエラーなど
throw unko();
// 成功
return true;
}
これで決まりや
東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
もろに北朝鮮と繋がっているテレビ局が1つ
年寄はまだまだテレビという外国人に騙され続ける
例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。
一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。
事前に書いたフローチャートに書いてないことは例外
例外ってフローチャートに書いてないの?
普通は書かない
書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断
二重キャストって意味あるんだね
はまって痛い目見たよ
こんなん
template<class T> struct Base {
Base(){ unko = reinterpret_cast<__int64>(this); }
void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); }
void NG(){ T *t = reinterpret_cast<T *>(unko); }
__int64 unko;
};
struct Derived : Base<Derived> {};
int main()
{
Derived d;
}
void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが?
reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの?
void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
オフセットが違うから位置がずれて異常が起きる。
>>280 >void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
>オフセットが違うから位置がずれて異常が起きる。
ありがとう、目から鱗だわ
ポインタ値とアドレス値は同じものだと思ってたけど違うのか
>>245 廃止ってのはexportみたいなのを言うんだ
C++の関数のポインター型は参照渡しですよね?
では仮引数の型がA*&は何を表しますか?
言葉が足りなすぎて意味が解らない
>>283 ポインタだろうが値渡しです
A*&はポインタの参照になる
void f(A *x){
delete x;
A* c=new A;
x=c
}
void main(){
A* a=new A;
f(a);
delete a;
}
上みたいなコード書いて実験したんですよ。
そうしたらmain関数の最後のところでaはcになってました。
これはC++の関数が参照渡しというしょうこじゃないんですか?
仮引数の型ををA*&に変えてみても同様の結果になりました。
>>287 それは f内でdelete xをして new Aしたときにたまたま同じメモリ空間を使用しただけにすぎない
fの中でdeleteされてaの示す先のメモリ空間がなくなったので fを呼び出した後はaのポインタを使ってはいけない
有難うございました。
日本語でおk
286 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
289 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
ウィンドウやコントロールなどのクラスを作ってるんだけど、
子コントロールのクリッピング領域の設定は親がするべき?
それとも、子が必要に応じて設定するべき?
>>262 例外が発生するParseの後にbool TryParseメソッドができた
つまり分かるな?例外は糞だってことよ
C++によるWindowsプログラミングで、送出した例外をコールバック関数内で処理せず流すと死ぬんだよな
最高に使いづらえめんどくせえもう使うなってことだろう
ワイド文字に対応していないところからも、やる気のなさが感じられる
使いこなせない人間にとっては毒となる
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩
この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?
>>296 例外をC++の枠組みの外に流すなよアホが
>>297 例外は C の setjmp()/longjmp() の焼き直しだという珍説を読んだことがあるがいまいち
例外はCでは完全に実装出来ないというのが常識
効率を度外視すれば実装できるんでね?
むしろ実装できない例が知りたい。
C#のInnerExceptionみたいなのは欲しいな
二重例外で即死亡ってのどうにかならんのか
>>301 馬鹿は引っ込んでろ
setjmp()/longjmp()だけで例外が書けるならトランスレータで十分なはず
例外は基本的に違うんだよ
知ったかで物を語るな
トランスレータ無理だねって事になったのが例外だったのは周知の事実だが
トランスレータが書ける事とトランスレータで十分な事はイコールではないと思うの
例外処理はCで可能。というか例外というもの
自体C以前からある概念なので当然可能。
ただしtry-catchはC単体で実装できない。
正常系実行時にはゼロコストになるよう、
例外ハンドラのアドレス埋め込みが
必要になるからな。
アセンブリを使えばできるが、それは最早Cの範疇じゃない
try-catchも例外処理の一部じゃないか
ボケてんの?
>>306 トランスレータが書ける事とトランスレータで十分な事はイコールではないと思うの
>>308 バカはホントに人の書き込み見ないのな。
>正常系実行時にはゼロコストになるよう、
>>303
>>309 例外処理じゃなくただの構文だろ
例外処理に使わなきゃならんという義務も無い
そう使うかどうかは別として初期の使用例として
qsortの脱出とかあったしな
>>310 Qはまだ馬鹿言ってるよ
トランスレータが書けないという事はCで実現出来ない機能が例外処理にはあるわけだ
QはC万能だと思いたいんだろうけど実はそうではない
windowsに限るならOSの機能として構造化例外というC++標準の例外より遥かに強力な仕組みがあるから
それを叩くならCに限定しても例外処理機構に関してはC++と同等のものがあるといえないことも無い
>>314 > Cで実現出来ない機能が例外処理にはあるわけだ
具体的にどういう機能?
>>314 否定したいなら、トランスレータが書ける事とトランスレータで十分な事がイコールだと示せばいい。
この話はもう結論出てるから終了
イコールで示せない
>>314は馬鹿ということで、結論
>>316 言えない。
言語拡張を言い出せばきりがなくなる。
>>317 Cの呼び出し規約を維持したまま
スタックを巻き戻す機能
>>321 言語拡張じゃないよ単にAPI呼び出すだけだから
コールバックの方か
Qがコテを外して必死です
物凄く保守しにくくて読みにくく、パフォーマンスも低くてもいいならCで出来ない事もないだろうが
実用に耐える物ではない
少なくとも業務用には使える代物ではとてもない
よく知らないんだけど、
例外への対応って具体的に何やってんの?
昔逆アセンブルしてみると
関数先頭でfsかgsかのレジスタ使ってた気がするけど
CでOOPやったり仮想関数まで実現している例はWeb上にいくらでも転がっている
でもとても仕事に使える物ではない
趣味の範囲を超えない
まあ実際C++トランスレータでは仮想関数やclassは楽々実現出来るんだけどな
とにかくvtableの部分がまともにソース上に出てきているので危険極まりない
どんなイタズラをされるか分かったもんじゃない
>>325 >Qがコテを外して必死です
被害妄想乙
>>329 ようQ
お前はC言語だけ触ってろ
C++は素人同然
>>331 やっつけられた事は一度もないが?
Qが醜態を晒して馬鹿みたいに見えた事は何回でもあるけど
>>332 その馬鹿にやっつけられた馬鹿がいてね。
すっごい粘着なんだ。醜態ばかり晒してる。
今でもいるんじゃないかな?
馬鹿みたいに見えるなんてものじゃなく、馬鹿そのもの。
香ばしいなお前ら。。
>>328 吐き出したコードなんて見ないだろ
プリプロセス済みコードと同じだぞ
C++のコードを書き換える度処分されるんだぞ
>>330 Q の C を認めるのか?頭沸いてない?
setjmp()/longjmp()の存在が消えてなくなればいいのに
>>337 QのCを認めちゃいけないな
ありゃ仕事でCをやってない素人のコードだとすぐに分かる
てか2chのコードの大半が仕事じゃ使えんだろ
templateはおろか、ハンドリング目的のクラスすら作らせちゃもらえん
構造体の延長線みたいな使い方ばかりさせられるのが仕事
vectorすら禁止だからなw
STLのアルゴリズムとか以ての外
仕事レベルのコードを2chに書かれたら質問者も迷惑だろ。
便所の落書きの横に、お前らのコードは云々って書き足す方もその程度ってことだな。
つまり、ここでの話は仕事とは何の関係もないってことだね?
何でことさら「仕事」って言葉を使いたがるんだろうか?
>>344 そりゃ無職の奴が書いたコードが一目で分かるからさ
Qみたいにな
ステマ()
企業内失業者も大して変わらないけどな
>>347 いや全然違うから世間の見る目が
Qみたいに無職でしかも性格がねじれ切っていると、誰でも「あいつは変質者だ」と思う罠
>>348 おまえが企業内失業者だからか?
無職と何処が違うんだ?
Qにつきまとっている奴も、性格がねじ曲がった変質者だぞ。
せっかくNGにしてるんだからQZって呼んでください。お願いします
>>322 setjmp( ) / longjmp( ) でダメな理由は?
>>349 給料もらってる
職質された時に堂々と仕事先を言える
無職とは違うんだよ
職質は職務質問であって
職業を質問される事とは違うんだよ
震災前
/::::::::::::::::::::::::::::::;;::ノ ヽ;::\
/::::::::;;;;;;;;;,,,;;...-‐''"~ ヽ:;::l
|:::::::::::| 岡田 異音 |ミ|
|:::::::/ ,,, ヽ,、 '|ミ|
'|:::::::l '''"" ゙゙゙゙` |ミ|
|:::::|. ,,r ‐、 ,, - 、 |/
,/⌒| ノ ・ _), (. ・ `つ|
| ( "''''" |"'''''" |
ヽ,,. ヽ |
| ^-^_,, -、 |
| _,, --‐''~ ) | マニフェストもう守れない。どうしよう・・・・
'ヽ ( ,r''''''‐-‐′ /
震災後
|:::::::::/ |ミ|
|::::::::| ,,,,, ,,,,, |ミ|
|彡|. '''"""'' ''"""'' |/
/⌒| -=・=‐, =・=- |
| ( "''''" | "''''" |
.ヽ,, ヽ .| キリッ
| ^-^ |
. | ‐-===- | 大震災が起こったのだからマニフェストの破綻も致し方ありません
,\. "'''''''" /
朝鮮民主党
おわり
>>340,
>>341 なぜ業務では、STL ですら使わせてもらえないのでしょうか?
>>353 もう気がすんだでしょう?そろそろあきらめたら‥‥‥。
全員が使えるものでないといけないからな
他の言語との最大公約数的な使い方ばかりさせられる
担当代わっても潰しが効くからだそうな
ただ、無駄だと思うがな。C++詳しくない人間が
C++を求められる案件なんてできない。
必然的にC++の案件担当者はC++経験者になる。
359 :
デフォルトの名無しさん:2012/01/08(日) 19:46:54.53
参入障壁素晴らしい
C++のSTLは、サイズがでかくなったりする
テンプレート
STLはメモリの断片化が致命的
>>362,364 何年前からタイムスリップしてきたんだw
テンプレのサイズなんて大して問題にならねえよ
単にジェネリックな使い方だと未使用テンプレートが
実体化されずむしろ軽くなることもある
テンプレの問題は他の言語ユーザが
うわっつらしか理解できない事。
>>361 ジジイ、ジジイか
それじゃあお前は何だ、このガキが
俺はお前さんがこの世に落っこってくる前からコードを書いてんだ
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
使い方次第でパフォーマンスは悪くならない。
たとえばファイルから改行区切りでvector<string>へ格納するのは効率が悪い。
ファイル内容が一度にメモリに乗せられるとして、char *bufやstring bufへ一括で読み込んでから
行頭のポインタをvector<char*>へ格納すれば読み込みも書き換えも速く済む。
>>366 PCじゃないがRAMは32KBぐらいはある環境でしか仕事したこと無いな。
標準ライブラリは普通に使えるだけ使うが。
断片化が致命的ってのは、RAMが8KBとか4KBとか?
そんな環境でC++とか・・・
Cかアセンブラだろ普通
STLがメモリ容量を拡張するとき、工夫なくメモリ大移動を起こすから効率は悪い。
メモリーが少なくてテンプレが重い重いって
言う人ってよく出てくるけど怪しいんだよな
まずJavaすら動かない環境なら大抵開発環境は
Cで提供中されるじゃん。
逆にJavaも実行可能な環境ならg++改造したような
C++環境が提供される。こういう環境だと
実行コードのサイズなんて微々たるもんで気にされないだろ。
>>375 そりゃstd::vectorの話だな。
工夫が必要ならreserve()なりstd::dequeなり使う選択肢がある状況で
そんな効率の悪いことをしてるならプログラマの責任だろ。
stringなどメモリ拡張するとき必要容量の倍を確保して、余裕を持たせて再確保を起こしにくくするだろ。
STLは必要容量の倍のメモリを消費する可能性があるというだ。
なんでこいつPC環境の処理系で組み込み語ってんの
>>374 コンパイラの改変が手前。っうか殆ど機能しないC++のために
コンパイラを保守すんのがオーバースペック。
>>378 必要量が分かってるならそんなことする必要ないから、質の良い実装ではそんなことにはならない。
余裕を持たせた再確保が必要なのは push_back() だけ。計算量の要求のためね。
なんで"STL"とか十把一絡げにしたがるの?
>>380 へぇそりゃ大変だね。でもそれって「普通」なのかい?
組み込みだとよくある事
そんな非効率なことしてないで、もうみんなg++使おうぜ・・・
allocaterという概念がありましてですね、貴方の任意に沿ったアロケータ書けばいいじゃない。
>>382 picやRX向けに作ってる
コンパイラベンダーの姿勢としちゃ普通だろ
C++も提供してるという変わり種も居るが
実装不十分でC++と呼べるもんじゃないし
>>361 同じことってw
お前社会経験がないの?
Embedded C++とかテンプレートないしな
>>389 職質って何だか位は誰でも知っているが。
職業に関しての質問だと思う人はまずいない。
そもそも組み込み環境でテンプレをマトモに実装してる
とこ少ないからな、組み込み屋がテンプレの話に
食らいついて来る事自体変なんだよな
>>390 職質って言う名前は知ってるけど、具体的になにを聞かれるかは知らないよ。
まあ、名前・職業あたりは聞かれると想像するが。
STLはテンプレだけじゃなく
std::bad_alloc例外も前提だな
>>394 俺もそんな感じ
職質されたことないと具体的な内容なんて分からないよね
>>361 は無職で職務質問でひどい目にあったのだろう、がんばって就職してね
おい自称貧困メモリプログラマはどこ行ったんだよ
リアルな話が出てきたからって職質で話題濁してんじゃねぇぞ
>職務質問を適法に行うことのできる要件は、以下のとおり、警察官職務執行法2条1項に細かく定められている。
>1.異常な挙動その他周囲の事情から合理的に判断して何らかの犯罪を犯し、若しくは犯そうとしていると疑うに足りる相当な理由のある者
>2.既に行われた犯罪について、若しくは犯罪が行われようとしていることについて知っていると認められる者
職質する相手に、「お勤め先は?」なんてより、もっと重要な質問をするだろ。
勤め先が犯行現場なんだよ
昼間うろついてたらまず職業聞くと思う
スレ違いな話はよそでやってくれないか?
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩
この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?
ところでQは今PhenomU6とCore2Duoを使ってるらしいんだけど、CPU-Zのスクショを
貼れと言うと頑なに拒否するんだなよあww
嘘がバレバレですよQさん
まだPenVの850MHzで頑張ってるんだろ
見栄は良くないね
テンプレはメモリーガー、メモリーガーって言ってた奴
結局どんな環境で開発してたんだ?
なんちゃって業界人くさいし、
せめてマイコンの種類とメモリー容量、
成果物の種別を書いてもらわんとな。
もうやだこの流れ
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人
野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
どのスレに行っても害しかもたらさないQ
また金魚とその糞かよ…
金魚じゃなくて腐った水死体
ソースコードのコメント欄に「おまんこ」って書いてチェックインしてみたい。
やるだけならいくらでもできますよ?
その後のことは知らないけどね。
デザイナーなかじまかおるは関係ないだろ
>>418 DBのカラム名にしろ
INSERT INTO
チェックインしてすぐにコメント修正すればいい
__________ | 見ろよ! |
./::::::::::::::::::ノ、ヽ | 民主党支持者がいるよ!w |
./:::::::;;;-‐‐''"´ |:::| \____ ________/
|:::::::| 。 .|:::| ノ´⌒ V _____
.|::::/ ⌒ ⌒ ヽ:| γ⌒´ ヽ, / _____)
|:::| /・\ /・\|| // ""⌒⌒\ ) | / ヽ
げひひw .|´ ⌒_ ヽ⌒ | . i / ⌒ ⌒ヽ ) | 〉 ⌒ ⌒ |
.| :::⌒(__人_)⌒| !゙ /・\ /・\i/ |/. /・\ /・\ヽ
⊂ ̄ヽ___ ヽ \__| ⊂ ̄ヽ_ | :::⌒(__人_)⌒⊂ ̄ヽ_ | ::::⌒(__人_)⌒:: |
<_ノ_ ヽ_ _/ <_ノ_. \ \__| / .<_ノ_ \ ´ \__| ノ い〜ひっひw
listでvectorのようにreserve的なことをしたいのだけど解決法はあるだろうか
static list<sumapo<X> > XL;
static list<sumapo<Y> > YL;
static list<sumapo<Z> > ZL;
void Func(void) {
sumapo<X> x(new X);
sumapo<Y> y(new Y);
sumapo<Z> z(new Z);
XL.push_back(x);
try { YL.push_back(y); } catch(...) { XL.pop_back(); throw; }
try { ZL.push_back(z); } catch(...) { YL.pop_back(); XL.pop_back(); throw(); }
}
↑こういう処理があるんだけど、せっかくスマポにしたのにtry-catchが乱立してうっとおしい
try-catchを一つにしてみた
size_t sizeX = XL.size(), sizeY = YL.size(), sizeZ = ZL.size();
try {
XL.push_back(x); YL.push_back(y); ZL.push_back(z);
} catch (...) {
if (XL.size() != sizeX) XL.pop_back();
if (YL.size() != sizeY) YL.pop_back();
if (ZL.size() != sizeZ) ZL.pop_back();
throw;
}
spliceは例外投げないので
void Func(void) {
sumapo<X> x(new X);
sumapo<Y> y(new Y);
sumapo<Z> z(new Z);
list< sumapo<X> > tmpx(1, x);
list< sumapo<Y> > tmpy(1, y);
list< sumapo<Z> > tmpz(1, z);
XL.splice(XL.end(), tmpx);
YL.splice(YL.end(), tmpy);
ZL.splice(ZL.end(), tmpz);
}
427 :
デフォルトの名無しさん:2012/01/11(水) 20:23:20.70
ついでにXL,YL,ZLをメンバーとしてまとめあげた一つのオブジェクトを用意すりゃいい
なるほどサンクス
>>424 中身はどうでもいいが、
マクロ以外で全大文字の名前を使うな
全大文字は、マクロと他のシンボルが衝突しないよう
マクロのみで使うものと予約されてる
詳しくはハゲのFAQ読んでこい
>>424 エラー復帰目的じゃないなら
全体をTryすれば良いじゃん
MSはわざとやってる確信犯だからな
確信犯の使い方が間違ってる件。
>>436 正しいと思ってやってるんだから
使い方おかしい分けじゃないと思う
いやでも
マクロは全部キャピタルで書いた方が良いと思う
つか、
マクロなんか使うな
確信犯(確信犯罪)とは、「自分が行うことは良心に照らし合わせて正しく、周囲(社会)や政府の命令、議会の立法こそが
間違っていると信じて」行った犯罪である。本人は自らの正当性を確信していることがポイントであり、立法や命令に違犯
(「違反」ではない)しているとの認識を持っているかどうか、あるいは処罰を予想しているかどうかは関係ない。
「確信犯」という語は、「倫理的に非難されるべき行為を、意図的に行う」という故意犯罪や常習犯罪の意味で一般化して
用いられがちだが、これは誤用である。社会正義や良心といった内心の動機部分が確信犯を理解する上で重要である。
規格上は特に予約とかされてない
いい加減スコープ持ったマクロ規格に入れろよ糞標準委員ドモ
マクロは出来る限り使うなと言う事なのだろう
http://www2.research.att.com/~bs/bs_faq2.html#Hungarian > Never use names with all capital letter (e.g., BEGIN_TRANSACTION)
> because that's conventionally reserved for macros.
> Even if you don't use macros, someone might have littered
> your header files with them.
規格上は知らんが、禿的には全部大文字の名前は
マクロのために予約されてるので使うなってさ
規格上は知らんがと言う前に規格を読め
C++では_で始まる名前と__を含む名前が予約されてたはず
質問失礼します。
デザインパターンの勉強をしているのですが、
下記のコードがよく分かりません。
http://www.netobjectives.com/resources/books/design-patterns-explained/cpp-code-examples/chapter10/#10-3Client ●質問1
CircleとRectangleは、Shapeを継承していますが、
継承先でCircle::drawCircle()およびRectangle::drawLine()が純粋仮想関数にされています。
これらはShapeには実装があります。
継承先で純粋仮想関数としてオーバーライドするものをはじめて見たのですが
これによって何を実現することができるのですか?
使用不可にするために純粋仮想関数にしているのでしょうか?
●質問2
サンプルコードなので仕方が無いですが、
Factory::getShapes()はほとんど空です。
ここにはどのようなコードが書かれることを期待しているのでしょうか?
ちゃんとデータを入れて返してやろうと思って次のコードを書きましたが、
Circleが抽象クラスなのでうまくいきません。
Shape **myShapes = new Shape*;
*myShapes = new Circle[10];
長くなってしまって申し訳ありませんが、
よろしくお願いします。
クラスのポインタ配列をreallocで動的に拡張して代入していきたいのですが、実行時に
0 [0xbf8ba364] size=12
1 [0xbf8ba364] size=12
2 [0xbf8ba364] size=12
3 [0xbf8ba364] size=12
*** glibc detected *** ./a.out: realloc(): invalid next size: 0x08776008 ***
と表示され、停止してしまいます。途中まではうまく動いているようなんですが、
どうしたらいいでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
class hoge { };
int main(int c,char** v)
{
hoge** p = NULL;
int i;
for (i=0; i<10; i++) {
if ( (p = (hoge**)realloc( p, sizeof(hoge*)*i )) == NULL) return 1;
printf("% 2d [0x%08x] size=%d\n", i, &p, malloc_usable_size(p));
hoge* ptr_hoge = new hoge();
p[i] = ptr_hoge;
}
free(p);
return 0;
}
newとmallocを混ぜるな
おいおい、C++なのになんでnewつこうとるんや
たこるぞほんまに
453 :
450:2012/01/12(木) 01:51:28.49
>>450 ありがとうございます。ご指摘のとおり、以下のようにしてみるとうまく行きました。
- hoge* ptr_hoge = new hoge();
- p[i] = ptr_hoge;
+ *p[i] = hoge();
newつかうのは、C#とJavaだけにしとけ
455 :
450:2012/01/12(木) 01:55:26.10
>>452 すみませんでした。たこるのだけはかんべん
>>454 勉強になりました。肝に命じておきます。
>>450 #include <vector>
class hoge { };
int main(int c,char** v)
try
{
std::vector<hoge> p;
for (int i=0; i<10; i++) {
p.push_back(hoge());
}
return 0;
}
catch (...)
{
return 1;
}
>>447 グローバル スコープを持ち、_ で始まる名前
_ で始まり、その次が大文字の名前
__ を含む名前
の3種類か。グローバルは小文字も駄目だったんだな、知らなかった。
458 :
450:2012/01/12(木) 02:13:25.61
>>456 ありがとうございます。std::vectorを一通り調べ使ってみて覚えることができました。
>>448 他のサイトに変えたら?
そのサイトのコードが高尚すぎるのか
単に間違ってんのか分からんが、
デザパタの分かりやすい例なら他のサイトにも色々あるし、
他を調べて後で見直すのも手よ。
個人的には、不審な点が多々あるんで
単に間違ってるだけだと思う
仮想関数の存在を忘れた訳じゃないです中身が空なんですよってことを後で読んだ人にアッピルするためじゃないかな
2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた
>>460,461
レスありがとうございます。
CircleとRectangleはそのまま使うものではなかったみたいです。
純粋仮想関数にしているのはCircleとRectangleを更に継承させるためのようです。
・質問1について
純粋仮想関数した方を使用不可にするのではなく、
されなかった方が使用不可になります。
Circleでいうと、Circleを継承したクラスではdrawCircleを実装しなければならず、
drawLineが使用不可になります。
Shapeを限定した使い方になります。
Shapeは一般的な「形」を定義した側面になります。
・質問2について
これも同じく、Circle、Recltangleを継承したクラスのインスタンスをnewすることになります。
ただしgetShapeはShape**なので、これを使うクラスからは
drawCircleを直接使うことはできず、drawのみ使うことができます。
drawの内容はCircleクラスにあるので、
インスタンスの型によってdrawの実装が与えられます。
Bridgeパターンを説明するよいコードだという印象を受けました。
>>463 納得してるのに言う事でもないか知れないけど、
このサンプルは変だよ。
完全仮想関数によってCircleで有れば、
ShapeのdrawCircle実装が使われなくなる。
使おうと思えば使えるが、C++でも滅多に
使わない機能だし、それを読む人が使用することを
期待して書いてるとも考えられない。
なので、Shapeの内容はdraw関数以外存在意義がなくおかしい。
そもそもShapeにdrawCircleや、
drawLine、
myDrawingがあるのが変だし。
myDrawingはCircleとRectangleが個々に持ってりゃ済む。
これあれだろ。デザインパターンで学ぶオブジェクト指向のこころに出てきた奴。
2つの描画システムDP1とDP2が存在していて、それぞれに円と四角形の描画機能が乗っかってる。
この2つのシステムを一つのインタフェースで使うために
アダプタとファサードとブリッジの3つのパターンを使う。
Circleクラスに純粋仮想関数があるのはそのため。
本書を読んでるとつるっと入ってくるけど、そうでないならわかりにくっ。
段階を経て説明してくれるからな
オブジェクトの差分を表現するクラスはどんなふうに書くの?
class this_is_sabun{};
class Diff_A_And_B{}:
470 :
デフォルトの名無しさん:2012/01/13(金) 22:07:16.56
>>439 #ifdef __cplusplus
#error hasta la vista baby!
#endif
471 :
デフォルトの名無しさん:2012/01/13(金) 22:12:12.20
例えば char bur[100] となる構造体を使って、この構造体に含まれる数字の
四則演算をするときに、小数を扱うにはどうしたらいいんでしょうか?
どこが構造体なんだ?
473 :
デフォルトの名無しさん:2012/01/13(金) 22:20:28.83
すいません、配列だったかも
まず他人に分かるように詳細に説明してくれ
何がやりたいのか全く分からん
475 :
デフォルトの名無しさん:2012/01/13(金) 22:38:03.58
>>471 文字型(char)の配列では、少数は使えません
477 :
デフォルトの名無しさん:2012/01/13(金) 22:47:13.02
>>476 やっぱそこですか・・・
charを小数に変換するような関数使うんですか?
なんで小数なのにintで受けてんだ
doubleで受けろよ
479 :
デフォルトの名無しさん:2012/01/13(金) 22:51:24.67
>>478 貼ったのは元のコードでdoubleにしたりlfにしてみたんですがやっぱり上手くいきませんでした・・・
intをdoubleにするだけで普通に動くけど
stdio.hとstdlib.hをインクルードはしてるんだろうね?
atof()とかも知らんようなCがまだの童貞が、C++に入ってくるなよ。
atof()は、Anal to Fuckの略な、
482 :
デフォルトの名無しさん:2012/01/13(金) 23:03:55.04
ああああああ、やっとできました!ありがとうございます
素人童貞ですいません
>>470 アンダーバー付きならコンパイラ屋の領域だから
ユーザーは使えないし、小文字使おうが何使おうが問題ない
486 :
デフォルトの名無しさん:2012/01/14(土) 17:00:21.07
ユーザーは使えないし、
ユーザーは使えないし、
ユーザーは使えないし、
489 :
デフォルトの名無しさん:2012/01/14(土) 18:13:45.88
ところ構わず政治の話する奴は社会人失格
>>488 デバッガとか使えばすぐ分かると思うが
× for(int i=0;i<size;i++){
○ for(int i=1;i<=size;i++){
>>491 突っ込み所満載でごめん
わざわざありがとう
494 :
デフォルトの名無しさん:2012/01/14(土) 22:54:33.77
コンパイラ屋は「自らの領域」を守らないけどね
で、禿をしばきにでも行くのか? がんばれなw
>>494 なんでpragmaとか使わず
拡張キーワード使うんだろうな
MSは死ねばいいのに
#pragmaは文法上出来る事限られてるし
>>497 omp みたいなやり方でいくらでも出来るじゃん
ちゃんと先頭に __ つけてんだから処理系の好きにさせてくれ
やだよpragmaみたいに他のコンパイラに持って行ったら
勝手に消えてくれる訳じゃないし
その手のものに依存した処理は
どっちみち他のコンパイラにそのまま持って行けないんじゃないのか
あと#pragmaだと#defineに含められないのがな
(_Pragma演算子で解決はされるけど、
_Pragma演算子の無いコンパイラに持って行けないな)
502 :
デフォルトの名無しさん:2012/01/15(日) 19:22:16.97
pragmaってどういう英語から来てるの?
plug的なものを連想したが関係ないよね
504 :
デフォルトの名無しさん:2012/01/15(日) 23:54:54.27
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人
野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな
条件分けして処理を行う場合、テンプレートを使ってうまい事書くことはできますか?
たとえば以下のようなコードで、Unko はクラステンプレートにせず、
処理部のみをテンプレート化する、といった具合です
struct Unko {
void Func() {
if(条件) 処理A;
else 処理B;
}
処理A用データ dataA;
処理B用データ dataB;
};
template<bool b>
void Func() {
if (b) A;
else B;
ってこと?
>>506 条件は内部で生成でき、且つ外部では同じコードで記述したいため、Unko のみで操作できるのが望ましいです
>>507 そうです。
AやBは関数でもメンバ関数でも何でも
テンプレートに渡せる引数は定数のみだが
条件は定数でいいのか?
条件は非定数です
やはりテンプレート化するにはハードコーディングするしかないのでしょうか
そらそうじゃろ。
そうですか、そうですよね
今まで
class X { static const whcar_t A = L"a"; };
ができると思っていたのですが CGG 4.5 だとリンク時に A
が無いと言われました。
whcar_t を int にするとリンクできたのですが static const
メンバ変数をクラス内で初期化できるのは int 型だけですか?
intだけです
そもそも型がまちがってるんじゃ
>>515 すみません。whcar_t ではなく wchar_t でした。
>>514 bool を使用しているのをよく見かけるのですがそれは間違いでしょうか?
くそVC++ではbool及びBOOLは中身intだからねー。でも規格違反。まぁ、マイコリソフトに何を言っても無駄。
intに限らず整数型ならクラス内で初期化出来なかったっけ?
>>517 あれ?boolの規格は1Byte以上じゃなかったっけ?
しかも2008からは1Byteになってたと思うんだけど
521 :
デフォルトの名無しさん:2012/01/18(水) 15:38:43.35
VC++5から既に1バイト
http://msdn.microsoft.com/library/tf4dy80a 規格違反だとほざくならちゃんと規格読めバカ
5.3.3 Sizeof
[Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.(69)]
69) sizeof(bool) is not required to be 1
>>519 すみません。これも間違っていました。L"a" ではなく L'a' でした。
boost 1.42.0 のソースを見ても普通にクラス定義の中で
static const bool value = false のように初期化していますね。
static const wchar_t A = L'a';
ならvcではコンパイルできた。
L"a"じゃintでもリンクの以前にコンパイルできないだろ。
よく見たらCGGってなんだ。
突っ込みどころが多くて釣りの練習に見えてきた。
リテラル文字列と一般的なchar配列の区別ってつかないの?
アドレスみてヒープ領域か判断すればいけるんじゃね
>>523 すみません。CGG ではなく GCC の間違いでした。
以下のコードを g++ main.cpp でコンパイルすると undefined reference to `X::Y'
が出ますが、wchar_t を int に変えるとエラーが出ません。
----
#include <vector>
class X { public: static const wchar_t Y = L'a'; };
int main() {
std::vector<wchar_t> v;
v.push_back( X::Y );
return 0;
}
だからintしか無理つってんだろが
>>527 JIS X3014:2003 の 9.4.2 静的データメンバの 4 段落目に
静的データメンバが const 付き汎整数型又は const 付き列挙型の場合、
クラス定義内の静的データ宣言には、《定数初期化子》を指定することができる。
とあるので int 型以外でもできるのではないでしょうか?
wchar_tが汎整数型だとは書いてない
>>529 JIS X3014:2003 の 3.9.1 基本型の 7 段落目に
bool 型, char 型, wchar_t 型, 符号付き整数型及び符号なし整数型をまとめて、
汎整数型と呼ぶ。
とあるので wchar_t 型も汎整数型ではないでしょうか?
v.push_back( wchar_t(X::Y));
凡変数だろ
東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
もろに北朝鮮と繋がっているテレビ局が1つ
年寄はまだまだテレビという外国人に騙され続ける
NHKか
>>526 push_back() の引数 wchar_t const& で Y への直接の参照が使われてるから、
定義が必要になってる。
↓の定義を追加すればおk。
const wchar_t X::Y;
int にしてエラーが出なくなるのは、 push_back() の引数として wchar_t const& に
暗黙変換の結果が使われることで Y への直接の参照が使われなくなるからだね。
>>535 なるほど。
仕様書をよく読んだら JIS X3014:2003 の 9.4.2 静的データメンバの 4 段落目の最後に
そのメンバは、それがプログラム内で使われるとき、やはり名前空間有効範囲内で定義し
なければならないし、名前空間有効範囲内の定義の中に《初期化子》を含んではならない。
とあるので、その static const 変数を使用するときは参照やポインタを得るかどうかに
かかわらず定義も追加しないとダメなようですね。
ただ、その場合はコンパイル時定数ではなくなるから
かなり意味変わってくるんだがな。
マクロをマスターしたいんですけど
なんでもいいのでマクロに詳しいやつ教えてください。
マクロの極意を教えてやろう
マクロを使わずに書く方法を考えることだ
gccのマニュアルにマクロについて書いてあるよ。
gcc拡張についても触れてるから注意ね。
プリプロセッサっつーかコンパイラのマニュアルが一番詳しいと思う。
マクロマスターの終着点は、マクロ無しだ。
それを目指してマクロを大量に使うことから始めよう。
使わない関数をソースから消さないで消去するときとかどうするんだ?
コンパイルしたら使わない関数のためにメモリーが消費されるんだぞ。
ばーかそういう時はDLL使うんだよ
定数とかは変数にしたほうが効率いいよな。static constの。
マクロだと定数はマジックナンバーと同等の感じで埋め込まれるから微妙すぎる。
545 :
デフォルトの名無しさん:2012/01/19(木) 19:01:03.72
enum と マクロは真の定数になるけどstaic constはならないんじゃなかったっけ?ぬんぱら。
キャストして普通の変数にできるし
>>546 7.1.5.1 The cv-qualifiers
2 An object declared in namespace scope with a const-qualified type has internal linkage unless it is explic-
itly declared extern or unless it was previously declared to have external linkage. A variable of non-
volatile const-qualified integral or enumeration type initialized by an integral constant expression can be
used in integral constant expressions (5.19). [Note: as described in 8.5, the definition of an object or subob-
ject of const-qualified type must specify an initializer or be subject to default-initialization. ]
549 :
デフォルトの名無しさん:2012/01/19(木) 21:51:49.95
日本語でよろ
constにstaticは要らん
staticを外すと所属が変わるよ
linuxでマルチプロセス間の同期がしたいのですが,
windowsのCreateEvent&WaitFor...Object的な
簡単なものはありませんか.
共有メモリにmutexとかセマフォを乗っけるしかないのでしょうか.
554 :
552:2012/01/20(金) 00:37:01.92
> 553
質問が適切ではなかったです.
起動順等が不定で,異なるアプリケーション同士のプロセス間通信が必要です.
あと,これらのアプリではそれぞれ別の仕事をしてるので,
プロセスを勝手に終了するわけにもいきません.
WaitforSingle…みたいに許可が出るまでsleepしたいのですが…
(各プロセス内ではマルチスレッドになっています^^;)
プロセス間ならパイプかソケット
558 :
デフォルトの名無しさん:2012/01/20(金) 08:05:42.97
>>557 グローバルの場合はconstだけでいいが
クラスメンバーの場合、staticを付けないと、
オブジェクトのメンバーとみなされ、
外部からアクセスできないし、定数扱いもされない。
>>544 static constで定義したマジックナンバーが埋め込まれるのと
変数のアドレスというマジックナンバーが埋め込まれるのの
どっちが効率いいか考えてみろ。
static constはファイルスコープで初期化後変更できない変数なのか
コンパイル時定数なのか区別が付かないからめんどいな。
>544も>559も何を言いたいのか判らない。
もしかして、static constな整数は定数と同じ扱いをされるから最適化によって消えることさえあるのを知らないのだろうか。
>>561 >整数は定数と同じ扱いをされるから
されない場合があるのを知らないのか?
static const int hoge1 = 1 + 1;
のように書くとコンパイル時定数になって、アセンブリには2が埋め込まれる。
static const int hoge2 = func();
のように書くと、ただのconst変数になって、配列の添字などにも使えない。
アセンブリにはhoge2のアドレスが埋め込まれる。
>消えることさえある
どちらの場合も、数値が消えたらプログラムの動作かわるから、消えるわけないだろ。
class Hoge {
Hoge(int v) : v(v) {}
const int v;
};
>>563 引数とメンバの名前がおなじでも、ちゃんと意図通りに動いてびっくり
static const int foo = 1;
if (foo) {
...;
}
こんなのだと1は消え去るな。
>>559,562
initialized by an integral constant expression が読めないバカはお帰りください
constexprもっと広まれ
C++11 なら constexpr 使えば const 変数がコンパイル時定数か実行時定数かなんてことは気にする必要がなくなる。
VC++10はもちろんVC++11でも実装されない予定じゃなかったっけ?>constexpr
VCは当分ダメだろうな
2chにC++プログラミング実況スレとかないですか?
VisualStudioは次のWindows8で大幅に強化される.NETの方に大きく開発リソース咲いてるから
VCのC++2011対応は遅れ気味になるのも仕方ないんじゃないか、と。
代わりにC#はさらに使いやすくなって窓プログラム開発は一層のRAD化が進行すると期待される
MSから見捨てられたWinForms
糞重いWPF
オワコンのSilverlight
Windows8でしか使えないWinRT
C#ってこんなんしかないんだけど
577 :
デフォルトの名無しさん:2012/01/20(金) 19:58:47.14
>>570 clangとgccさえ対応してくれりゃ問題ない
いつまでゴミを使う気だ?
gccさんもそろそろ隠居しないかな
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
581 :
デフォルトの名無しさん:2012/01/20(金) 20:17:42.57
>>569 バカ言え
気にするからこそ使うものだよ
やっぱり、現在の const は final に置き換えて、新しい const は関数とか何が書いてあっても
強引にコンパイル時解決 (できなければコンパイルエラー) にするべきだよ
>>582 >強引にコンパイル時解決 (できなければコンパイルエラー) にするべきだよ
それがconstexprでは?
何のために定数と不変変数を区別しなきゃならんのか解からん
定数になれるならなる、なれないなら、ならないって方が
テンプレートの融通が効くのに
>>580 ありがとうございます。
それとは別スレになりますが、VC++の質問板見つけたのでそっちいって質問してみます。
紹介有難うございます。
C++の最新仕様ってもうみんな仕事で使ってんの?
>>581 constexpr 理解できてる?
コンパイル時定数は constexpr,実行時定数は const を使う、と明確に使い分ければ
const int i = func(); // コンパイル時定数? 実行時定数?
↑のような文脈依存の違いを気にする必要がなくなるってこと。
constexpr int j = func(); // コンパイル時定数
ちなみに上の例の i は、func() が constexpr 指定されていればコンパイル時定数、でなければ実行時定数になる。
お前が文脈を理解してない
誰も聞いちゃいないのに覚えたての知識を披露したがる人っているよね
だってしょうがなーいじゃなーい。
ニートだもん。
うすっぺらい知識で上から目線になるくらいしか
自尊心保てないんだもーん。
ぷげらっちょー。
const time_t hoge = std::time();
static const time_t piyo = std::time();
time_t も std のにしようz
595 :
デフォルトの名無しさん:2012/01/21(土) 22:03:50.17
>>589 ほう、では
const int i = 5;
は実行時定数なんだな?
constexprt と、その点で使い分けるんだったな
どうなんだ?
596 :
デフォルトの名無しさん:2012/01/21(土) 22:04:40.63
>>589 ほう、では
const int i = 5;
は実行時定数なんだな?
constexprt と、その点で使い分けるんだったな
どうなんだ?
どうでもいいけど、
const DWORD WM_MY_MESSAGE = WM_APP + 1;
が実行時定数になるのは勘弁して欲しかったな
#define から離れられない理由だった
template <class T, T val> struct const_integer { static T const value = val ; } ;
typedef const_integer<DWORD, WM_APP + 1> MyMessage;
これでいいじゃん
>>598 それswitchに食わせられるのかい?
間違ってたな
const DWORD WM_MY_MESSAGE1 = WM_APP;
const DWORD WM_MY_MESSAGE2 = WM_MY_MESSAGE1 + 1;
だった
いずれにせよ、switch に書けないのは問題だったな
VC6とか最早C++でもなんでもないし。
>>603 もはやじゃなくて昔の話をしてたんだが
あと、このコード VC2008 で通らないから何とかしてくれ
#include <stdio.h>
#include <windows.h>
const DWORD WM_MY_MESSAGE1 = WM_APP;
const DWORD WM_MY_MESSAGE2 = WM_MY_MESSAGE1 + 1;
template <class T, T val> struct const_integer { static T const value = val ; };
typedef const_integer<DWORD, WM_MY_MESSAGE1 + 1> MyMessage2;
int main(void)
{
DWORD msg = 0;
switch(msg)
{
case WM_MY_MESSAGE1:
break;
case WM_MY_MESSAGE2:
break;
case MyMessage2.value: // C2226
break;
}
printf("%u\n", MyMessage2.value); // これは OK
getchar();
return 0;
}
typedef const_integer<DWORD, WM_APP> MyMessage1;
typedef const_integer<DWORD, MyMessage1::value + 1> MyMessage2;
switch(msg) {
case MyMessage1::value: fack(); break;
case MyMessage2::value: fuck(); break;
}
VC6とかVC2010とかは主にIDEを指す言葉だろ。
VC6のコンパイラにMSVCの最新コンパイラを使うことも可能では。やってはない。
しかしVC6まではコンパイラの内部バージョンも6で一緒だから違うかもしれんが。
VC6以降ではこのようにバージョンアップしてる。一部動作しなくなるかもしれないがコンパイラの基本的動作は変わってないはず。
Visual C++.NET2002 付属コンパイラバージョン7.0
Visual C++.NET2003 付属コンパイラバージョン7.1
Visual C++ 2010 付属コンパイラバージョン10.0
enum {
MyMessage1 = WM_APP,
MyMessage2,
};
> Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
> Copyright (C) Microsoft Corporation. All rights reserved.
えっ
w
>>608 MS-Cからの通し番号
Visual C++の製品バージョンは、バージョン6.0までは内部バージョンと同じ番号が付けられていたが、
2002以降は内部バージョンではなくリリース予定年を冠するようになった。
なお、Visual C++にはコンパイラのバージョンを表す _MSC_VER というプリプロセッサ シンボルが存在するが、
これはVisual C++の前身であるMS-DOS用C/C++コンパイラ(通称MS-C)からの通し番号となっており、
コンパイラ本体である cl.exe のファイルバージョンを表している。
(このようにユーザーを混乱させかねない複数のバージョン表記は、Windowsと共通するものがある。)
Microsoft Visual C++ - Wikipedia
>>606 VC6 とか VC2010 とかは主にコンパイラの名前だろ
VC6 でコンパイルしろとか、よく言うだろ
その時 CL.EXE のバージョンが違ってたら 「VC6 でコンパイル」 の意味無いだろうよ
それとも、普通は 「Visual C++ 6 付属コンパイラバージョン6.0 でコンパイル」 とでも言うのか
IDE を指すのは VC じゃなくて VS だと思うが
>>608 VC6で同じ表示をしてみればver 12.0くらいになってるはず。
Visual C++ 6.0 製品バージョン 6.0 内部バージョン 6.0 _MSC_VER 1200 リリース 1998年
Microsoft Visual C++ - Wikipedia
>>611 いやそれは統合環境、製品名だよ。
VCではコンパイラだけすげ替えるやつが滅多にいないだけ。
他では、コンパイラとIDEは別個で、コンパイラだけ入れ替えとか普通にできる物もある。
Windows SDK 、Platform SDKでコンパイラ本体だけをインストールできるが
そのコンパイラ名をVC2010などとは言わないだろ。
Microsoft Visual C++ Compilers 2010 Standard - enu - x86
GCC環境とVC++環境で切り替えたいコードがあるため、
GCCであるのか、またはVC++であるのかをマクロによって判断したいと思うのですが、
そのようなマクロはありますか?
例えば、_VCPP_ 、_GCC_ のような。
よろしくお願いいたします。
_MSC_VER
__GNUC__
__GNUG__ (C++で使ったときに定義)
boostのヘッダとか見ると詳しいな
flacのタグの取得の仕方教えろください
libFLAC++使えよ色々と捗るぞ
622 :
616:2012/01/22(日) 16:33:49.34
こういう言語仕様外の知識を集めた本とかないのかな
業種によって求められる知識が違いすぎるからなあ
http://d.hatena.ne.jp/gothedistance/20120122/1327208557 富士通、余剰SE変身作戦
富士通がグループで抱える約3万人のシステムエンジニア(SE)の大がかりな職務転換に乗り出した。
一つのシステムを複数の企業などが利用するクラウドサービスがこのまま普及すれば、顧客の要望を
聞いて個別システムを作り込むSEは仕事がなくなり、余剰人員問題が顕在化するからだ。野副州旦元
社長の急進的な改革路線を修正した富士通はSE余剰問題で軟着陸を目指すが、クラウドの奔流にの
み込まれる危うさもはらむ。
--
↑クラウドのせいでSE三万人が職務転換だってよ。
自分の見る目の無さを恥じろ!
この業界って頑張れば頑張るほど全体の仕事少なくなっていってね?
クラウドって自社の機密リソースを他社サーバに保管するシステムの事でしょ!
クラウディアちゃんかわいすぎる
それは外部データサーバ
クラウドってのは機密を外部が指定したフォーマットに整形して渡し外部がこねくり回す仕組み
例えばGmailのメールの中身はローカルには置かれとらんで
クラウド関係なし。
そういう名目で余剰人員整理なだけ。
いままでも既製品のマイクロソフトオフィスとかが存在していて
それを使う企業ではソフト開発は必要なかった。
クラウドのGoogle docsに切り替えたところで、シェアには差はない。
ソフト開発を必要とする会社ではクラウドが進んでも依然として必要。
そう考えると大幅削減になるのは、サーバーの保守・点検をしている人では。
これがクラウドになれば要らなくなる。
ソフトウェア開発者はたいした被害はないだろう。
プログラミングとサーバーの保守・点検を兼務しているおいらが来たよ
従量制課金になったらクラウドなんて海のもずく
ロックインしたら値上げだよー
日本ではオンラインの需要はもうなくなるよ
政府がネット潰そうとしてるからね
ロベール読んでいたら以下のコードに出会ったのですが…
int iostream::* null = 0;
cout << (ptrdiff_t&)null << endl;
これは、ヌルポインタは必ずしもアドレスが0にはならないよっていう
確認のコードのようですが、キャストの部分(ptrdiff_t&)の&はどういう
意味ですか?こんなキャストは見たことありません。普通にアドレスを
表示させるなら(ptrdiff_t)で良いような気もしますが、&を取るとエラーが
出てしまいますね。
参照
参照型にキャストするってのはどういうこと?
coutに対応したoperator overloadについてptrdiff_tのコピーを発生させずに引数に渡す事
つまり&を外すとコピーを生成して引数に渡すんですよね?
しかし、このケースでそれをやるとエラーが出るのはなぜですか?
>>639 式中に現れた null は(略)メンバへのポインタへの参照となる。
(略)メンバへのポインタから ptrdiff_t への変換は、エラーが出るとおり、
できない。
参照から参照へのCスタイルキャストなら、 reinterpret_cast と同様に大抵の
型を無視して変換できる。変換の結果を使って実際にアクセスしちゃうと、
そのコードを含めてほぼ未定義動作になるんだけどね。
(ptrdiff_t&)null == *((ptrdiff_t*)&null)
解説どうもです。
おぼろげながら理屈はわかったような気がしますが
完全に理解するには、もう少しC++の理解が必要だと
思いますた。
メンバへのポインタから整数型への直接変換は
行えないと規格で決まっているから
環境によってはメンバへのポインタって多重継承や仮想継承の有無で
サイズが変わる事もあるし
○○型の参照へのキャストというのは、対象値を無理矢理○○型で再解釈するというテクニックの1つということかな?
未定義動作の結果をテクニックというのならそうかもしれない。
std::mapにはstd::vectorにあるreserveのようなメンバは無いんですか?
あるいは代替する方法はありますか?
>>650 >std::mapにはstd::vectorにあるreserveのようなメンバは無いんですか?
ありません
>あるいは代替する方法はありますか?
アロケータを自作して下さい
>>651 比較演算子を向きを反対にしたコンテナを作成して
イテレータでコピーするしかないな
比較演算子が違う時点で別のコンテナとみなされるからoperator=も使えない
mapをreverseって意味が分からない
reverse_iteratorで逆からアクセスすればいいだけじゃね?
reverseじゃなくて、reserveな。
あらかじめ必要な領域を確保しておくこと。
すまん
素で見間違えてた
mapはノードを追加していく感じだからリザーブないんだろうな。
657 :
デフォルトの名無しさん:2012/01/23(月) 22:03:11.49
>>604 マクロ以外を大文字だけで書くな。
お前や、MSみたいなマクロと、Cの識別子を
ごっちゃにする奴がいるから、
外部ライブラリの導入が面倒になる。
658 :
デフォルトの名無しさん:2012/01/23(月) 22:10:00.24
>>614 Microsoft? C/C++ Optimizing Compilerが正式名称だよな
いまでも、コマンドラインから確認できる
>>656 単純にプールしておけばいいだけではあるけど
普通は削除するとメモリ開放して欲しいからねえ
プールするかどうかのフラグでもあればいいんだが
このスレでなんどか出てたろ。
マクロと識別子が衝突すると、マクロが勝つんだよ。
んで、例え名前空間に識別子が入ってても問答無用でマクロが勝つ。
だから、マクロとの衝突を避けるために、マクロは全て大文字で書き、
識別子は、小文字を混ぜることがマナーになってる。言語設計者も、
絶対に識別子を全て大文字で書くのはヤメロと言っている。
この決まりを破ってトラブった有名な例に、MSのmin,maxマクロがある。
このマクロのせいで、std::min, std::maxを使ったコードが
コンパイルエラーを起こす。
(std::min)(a, b) でいいだろ
そういう問題じゃないだろ
そこまでして大文字で書きたいのか?
あと、boostとか外部ライブラリに飛び火してたら、全部直すのか?
例としては不適切だろと言っただけ
あっそ
struct v{int x,y,z;};
v a=(v){0,0,0};
こういう書き方を見たのですが標準なんですか?
(v)が気になるの?
キャストだよ。
explicitなコンストラクタではないので引数が合ってればキャストできるよ。
いやいや
C99の複合リテラルだから
C++じゃ無理
C++ 2011 なら v{0,0,0} でいけるだろ。
デフォルトコンストラクタしかないから無理じゃね
initializer_listを取るコンストラクタ持ってないと
>>667って出来なかったような
PODだから出来るのか?
C++の式じゃないって指摘もう出てるじゃん
c99や独自拡張を並存させて667 を通すコンパイラはあるけどさ
下記の()内のようなvector型の配列を使っているのですが
(std::vector test[6][6][6]; このようなもの)
vector内の指定した位置の要素の値を書き換えたいときはどうすればいいのでしょうか?
普通なら位置の添え字を[]内に書けばいいと思いますが、配列の場合は単純に配列の添え字の後にもうひとつ[]をつければいいんですか?
例えば配列test[1][2][1]のvectorの13番目の要素ならtest[1][2][1][12]でいいんでしょうか?
できるけどそんなコード書いた時点で終わってるな
既存データ構造が配列だったの?大変だね。
お互い頑張ろう。
こんなコードを見た瞬間に俺なら捨てて1から実装し直す。
毎回128個のvector組み立てて壊してんのか・・・
スゲーコスト高なスコープだな
216
680 :
674:2012/01/26(木) 00:23:17.62
みなさんレスありがとうございます.
そんなひどいんですね、これ・・・
私が書いたコードではないんですが、私もこのひどさに気付かないほどの初心者です.
ちなみに一般的にvectorの集合を管理する場合はどういったものを使うのでしょうか?
集合ってのが分からないけどvector<vector>とか、
要素数が変わらないなら配列とかreserve遣って決めうちにする。
データ構造を見直す。
3次元以上は使わない。
もちろん必要なら使うことになるが・・・
3次元テンソルでも扱ってんのかい?
きっとそれ遅いから計測してホットスポット見つけたりでアルゴリズムの見直しも必要だろう。
実測しろ。基本的に実データをvectorに配置して更新すると遅い。
vector処理側ではメモリ大移動が起こりまくる。
ベクトル使うならこれ使え。
C++行列ライブラリ Eigen
多多次元配列を動的に確保する場合、
実際には一次元配列を確保して、
添字を自分で求めて使う場合が多いかな
std::vector<double> test(6 * 6 * 6 * size); と作って、
test[i][j][k][l] じゃなく、
inline int Index(int i, int j, int k, int l, int size) {
return (((i * 6) + j) * 6 + k) * size + l;
}
とした上で test[Index(i, j, k, l, size)] と使う
return i * 6 * 6 * size + j * 6 * size + k * size + l;
とどちらが速いかは実測してくれ
(バラにした方が同時計算可能になるので速くなるかもしれないし、
size が複数出ると遅くなるかもしれない)
・・・まずstd::vectorがどういうものか理解していないんじゃね
a=1, b=2みたいな文字列から1とか2を抜き出すsscanfみたいな操作ってC++だと何を使うべき?
boost::spiritもそうだけどboost::lexical_castも必要じゃね?
int xに対するint yの割合を計算する必要があるとき、何も考えずに
double r = static_cast<double>(x) / static_cast<double>(y);
って書いてたんですが、キャストを使わない方法なんてあります?
Casts really are mostly avoidable in modern C++.
というビャーネ先生からすると避けられるものなのかとふと思いまして。
分数クラスを作る
>>690 double r = 1.0 * x / y;
そう思うと演算子に対する単元とかtraitsでほしいよねー。
分数クラスはちょっと大げさすぎないすかね・・・。
1.0 * x / y はそれ明示してないだけでキャストしてるじゃないですかー。
とはいえどうもありがとう。
>演算子に対する単元とかtraitsでほしいよねー。
ほしいですね。あってもよさそうに思うけど無いって事はなんか問題
あるんでしょうけど。
禅問答か
アップキャストは安全だから無問題
・インラインアセンブラで書く
・固定少数点で計算してからdoubleを作る
・xyと答えの変換テーブルを用意する
・xとy全組み合わせのif文を書く
xとyの組み合わせのテーブルを作つっておく
r=d[x][y];
発送の転換で
・x,yを最初からdoubleにする
お前らってほんとに無駄な議論すきだよな
重要な部分だと思うぜ
703 :
デフォルトの名無しさん:2012/01/28(土) 14:16:52.51
初心者な質問ですみません.
string型で X = "文字列"; を格納し,
その文字列をif文に使うことってできますか?
たとえば本来
if(a>0 && b=0) というのを
std::string X="a>0 && b=0";
if(X) としても大丈夫ですか?
大丈夫なわけがない
stringじゃなくてインタープリタだったらいいんじゃないかな
evalのある言語を使っとけ
お前ら不親切だな。コンパイル型言語とスクリプトの違いから説明してやればいいのに。
俺は面倒だからやだ。
>>703 そういう処理がしたいなら、文字列として入力された条件式を構文解析して解釈するコードを書かねばならない。
boost::spiritあたりで割と簡単に実装出来るっぽいからやってみたら?
lua使おうぜlua
まじluaちゃんかわいい
質問するバカは死ぬべき。
712 :
デフォルトの名無しさん:2012/01/28(土) 21:00:09.17
>>690 少数桁(1の位置)を100とか1000という事にしとけば、
intだけでも小数点演算は出来る。
オーバーフローを考慮すれば
余に限って適用すべきだな
std::string型の"123"をint型に変換するにはどうすれば良いんでしょうか?
また、std::string型の"false"をbool型に変換するにはどうすれば良いんですか?
>>714 boost::lexical_cast
文字列から数値なら以下のものから好きなのを選べ
atoi
strtol
sscanf
istringstream
>>715-716 ありがとうございます。
boolに変換することは不可能なんでしょうか・・・
>>714 それ位自分で関数作れなくない?
bool Tobool (std::string str) {
if (str == "false") {
return false;
} else if (str == "true") {
return true;
} else {
return false; //バグ止め
}
標準関数にありそうな気もするが…
連レスすまん
上のに1と0がきた時の処理もいれといたらより汎用的になるかもね。
ソースコード中にnewせずにクラスをインスタンス化したオブジェクトがあるんですけど
こいつも逐一削除したほうが良いんでしょうか?
こういったオブジェクトってdeleteじゃ消せないんですか?
消したら死ぬぞ
自動変数と同様にスコープから外れれば自動的にデストラクタが呼ばれて解放される
自動変数と同様にというか、自動変数そのものなんじゃないの?
これで実は
Class *obj = Class.Create();
みたいなことだったりして
>727がClass::Create()と言いたいのなら、
そいつを作った奴に聞けとしか。
Class::Deleteを呼ばせる場合もあるしな
シェアポ返せばNoMore悩み無用
悩み無用がNoMoreなのか。大変だな。
C++/CLIから使う場合はあまり役に立たない事もあるシャアポ
ref classではメンバに直接持てないのでシェアポをnewするという意味の無い事に
(自動変数として使う分には役に立つけど)
733 :
デフォルトの名無しさん:2012/01/30(月) 22:26:22.25
CreateServiceでサービス停止を制御するためのイベントを
非シグナル状態で作成しましたが、
その直後にイベントがシグナル状態になってます。
ほんとにCreateService直後にはシグナル状態になるんですが。
なぜでしょーか??
736 :
デフォルトの名無しさん:2012/01/31(火) 00:57:47.86
C++の標準ライブラリにCreateServiceなんてあったか?
>>735 スレ違いだし、そもそも「CreateServiceでイベントを作成しました」が意味不明。
738 :
デフォルトの名無しさん:2012/02/01(水) 18:05:05.08
ふと疑問に思ったんだが、
setter,getterを書くのめんどくさくなったので、
BigData & getRef(){
return &mNum;
}
でよくね。大してめんどくささは変わらないか
メリット
publicよりはカプセル化してる
コピーのコスト化からない。
デメリット
使い方間違うといやらしいバグが起きそう
他に何かある?
>>738 アドレス返してどうすんの?w
それはまぁ冗談として、値の範囲チェックとかが仕込みにくくなるんじゃないかな
740 :
デフォルトの名無しさん:2012/02/01(水) 18:31:21.24
>>739 バグの特定がしづらいってのが最大にして最高の欠点だな。
セッターでチェックしてない関数が大半とはいえ、
この実装にすると、後々実装の変更もしにくいね。
あと結局、const メンバー関数も欲しくなるだろうから手間は変わらないか。
まあ、パブリックよりはましって程度か
パブリックの方がまだましだろ
742 :
デフォルトの名無しさん:2012/02/01(水) 19:36:39.49
>>740 別にメンバ野ざらしでも拡張するのに問題はないでしょ
744 :
デフォルトの名無しさん:2012/02/01(水) 20:04:32.35
>>743 getRefの中身を他のオブジェクトの関数呼出に
変えたくなったらどうすんの?
特にオーバーライドによって子クラスでの実装が違う場合。
Tの2次元配列から、T**への変換が失敗する理由を教えて下さい
どうして、↓の6行目でエラーになるんでしょうか?
どのように書けば(できればスマートに)、意図したとおりに動くんでしょうか。。
ttp://ideone.com/IDuWo
747 :
デフォルトの名無しさん:2012/02/01(水) 20:39:31.33
>>746 理由はおまえさんが [] と * が同じだと思い込み強力なバイアスを持っていることだよ
C++ じゃなく C ネタだな
748 :
デフォルトの名無しさん:2012/02/01(水) 20:50:24.33
>>745 getRefじゃ説明しづらいんで、
仮にGetPriceとしておく。
GetPriceをクラスAは、連想配列から値を取り出す形で実装する。
クラスBは、DBのレコードセットから値を取り出す形で実装する。
変数外出しじゃこんな事できん。
単にDBと相性悪いだけでは?
>>748 void Print(int i) ;
// 古いコード
struct Hoge {
int price ;
} ;
// 古いクライアントコード
Hoge hoge ;
Print(hoge.price) ;
// 新しいコード
struct IPrice {
virtual int Get(void) const = 0 ; // 継承して連想配列やDBを扱うように実装
} ;
class Price {
SP<IPrice> body ;
public:
Price(SP<IPrice> body) : body(body) { }
operator int (void) const { return body->Get() ; }
} ;
struct Hoge {
Price price ;
Hoge(void) : price(CreateDefaultPrice()) { }
Hoge(Price price) : price(price) { }
} ;
// 新しいクライアントコード(変更なしで動く。拡張は成功だ!)
Hoge hoge ;
Print(hoge.price) ;
751 :
738:2012/02/01(水) 21:02:07.31
>>748 thx
すいません。そこまで考えてませんでした。
関数でラップしてある分だけ何か出来るってことか
自分が考えてたメリットとしてはコピー時のコストぐらいしか考えてなかった
752 :
738:2012/02/01(水) 21:10:07.01
>>746 たぶん意図した実装と違うような?
ヒープでもスタックでもいいからメモリを確保してmemcpyだ
#include <iostream>
int main()
{
int ia[ 2 ][ 4 ] = { { 1, 3, 5, 7 }, { 2, 4, 6, 8 } };
int* ip;
ip=reinterpret_cast<int*>(ia);
for ( int i = 0 ; i < 2 ; ++i )
{
for ( int j = 0 ; j < 4 ; ++j )
{
std::cout << *(ip+i*j+j) << ' ';
}
std::cout << std::endl;
}
return 0;
}
753 :
デフォルトの名無しさん:2012/02/01(水) 21:17:02.84
>>750 Cash &operator = (const Base &source)
{
price = source.GetPrice();
label = source.GetLabel();
}
こういう関数がある時どうすんの?
テンプレートである程度何とかなるけど、
operator=が抽象化された関数だったら詰むよね。
>>754 struct IPrice {
virtual int Get(void) const = 0 ;
virtual void Set(int value) = 0 ;
} ;
class Prince {
SP<IPrice> body ;
public:
Price(SP<IPrice> body) : body(body) { }
operator int (void) const { return body->Get(); }
Price & operator = (int value) { body->Set(value) ; return *this ; }
} ;
// 以下略
757 :
746:2012/02/01(水) 21:50:35.60
int ia[ 2 ][ 4 ]; をどのような配置で、コンパイラがスタックに配置するのか
一般的なルールはあるんでしょうか?
ia
↓
ia[0] → ia[0][0] … ia[0][1] … ia[0][2] … ia[0][3]
:
ia[1] → ia[1][0] … ia[1][1] … ia[1][2] … ia[1][3]
みたいな、配置とは異なる?
a[ i ] が *( a + i ) の糖衣構文である辺りが、妙に突っかかって分かりません…
int** ip = reinterpret_cast<int**>( ia );
した後に、逆参照するとセグメ違反で落ちるし、よく分かりません…
ia[ 2 ][ 4 ] ⇒ *( ia + 2 )[ 4 ] ⇒ *( *( ia + 2 ) + 4 )
ip[ 2 ][ 4 ] ⇒ *( ip + 2 )[ 4 ] ⇒ *( *( ip + 2 ) + 4 )
ia の型が int (*)[ 4 ] … 最も外側の添え字以外は固定
ip の型が int**
どうして、ia ⇒ ip の型変換が規格で許可されていないんでしょうか?
やはり、コンパイラによるメモリ確保とその配置ルールに関係があるんでしょうか…
759 :
デフォルトの名無しさん:2012/02/01(水) 22:01:48.43
>>752にバグがあることに気づく
jが4ね。
ia[2][4]とia[8]はメモリ上は同じだ
ここで聞くよりぐぐるか本見たほうが早いよ
>>756 ん?どうやって使う気だ?
例えば下のコードはどう置き換わる?
Cash cash;
DBSource db(略);
MapSource map(略);
cash = db;
cash = map;
int** ip = (int**)ia;
>>757 int a[8];とメモリー上は全く同じ。
>>760 struct ICash {
virtual void Set(DBSource const & db) = 0 ;
virtual void Set(MapSource const & map) = 0 ;
} ;
struct Cash {
Cash & operator = (DBSource const & db) { body->Set(db) ; return *this ; }
Cash & operator = (MapSource const & map) { body->Set(map) ; return *this ; }
// 以下略
何が有難いのかわからん
765 :
746:2012/02/01(水) 22:26:36.30
ttp://ideone.com/R8ENM スタックに詰まれた2次元配列は、配列の配列として1次元状に並べられるんですね
だから、最も外側以外の添え字は固定じゃないといけないのか…
ia の型が、要素数4の配列へのポインタだから、a[ i ] と *( a + i ) の糖衣構文のうち
( a + i ) では sizeof(int) * 4 * i だけポインタが進むんですね
sizeof( ia ) == 20
sizeof( ip ) == 4
ここが、異なるんですね!
>>758 リンク先にある多次元配列の解説が、分かりやすかったです
ありがとうございます
767 :
746:2012/02/01(水) 23:43:04.96
>>765 の一部訂正
std::cout の出力が16進のままになっていました
誤:sizeof( ia ) == 20
正:sizeof( ia ) == 32
int ia[ 2 ][ 4 ]; の ia の型は int (*)[ 4 ] つまり、要素数4のint型配列へのポインタ、なので
素直にこの型の変数を使うと、スマートに書けることに気づきました
初期の目的を達成できました!みなさんありがとうございます!
int (*)[N] とか int (&)[N] とかの使い道って結構おもしろいかも…
ttp://ideone.com/21MPf
実際はa[x + y * width];てな手動管理の
2次元配列の使用が多くて、あんまり固定2次元は使わないけどね。
数学のベクトルの内積なんですが
Vector3 v1, v2 ;
float dot = <v1, v2> ;
こういうオペレーターは定義できないんですか?
あるいはdot = (v1, v2);とか
言語仕様的に無理だろ
1月末で会社やめて、昨日一昨日からC++勉強して、再起を図るつもり。
C++ってどのくらいで就業できるレベルになるの?
前は社内のシステム管理とミドルウェアでエクセルいじっていた程度。
いくら言語単体で覚えても開発未経験を中途では採らんだろ。
派遣でベテランと抱き合わせならわからんけど。
年齢次第じゃね?若ければ第二新卒扱いで就職できるかも
C++覚えてる暇があったら就活した方が良さそうだけど
そんなものか
つんだ、おわた、ってやつだな
おれ、
>>711 ね
ベテランが年下になりそうだな。もう40間近だ。
障害者枠で採用してもらえないかと思っている。
合同説明会が来月あるからね。
21歳くらいからずっと病気を抱えていて、
去年良くなってきてようやく就業できた感じ。
>>771 C++使う所は大抵言語知識はC+クラスレベルでよくて、
数学知識やOSの知識を求めてる。
言語知識が有ったって
名前空間すら使わせてくれない環境にイラつくだけ。
35までに上級職に昇格できてないと厳しいんだろ。
40の未経験のオッサンには向いてない。
もし才能あると思ってるなら、商業的な成功は別にして
フリーでもシェアでも良いから作ってアピールすれば。
ただし自分はプログラマーでない。
プログラミング技術は進歩が激しく、技術の陳腐化も著しいため、常に新しい技術に目を向け習得していくバイタリティや、
場合によっては永年の努力によって培ってきた技術を捨て去る柔軟性が必要である。
また、年功序列的賃金体系のもとでは、高年齢のプログラマはコストが高すぎると考える企業がある。
俗にIT土方とも呼ばれデスマーチとなった場合は徹夜が続いたり体力が必要となってくる。
現在では経験豊かなプログラマにも一定の需要があり、プログラマ定年説はもはや過去のものとなっているが、
コストの観点からは、一定年齢に至ったプログラマに、より単価の高いシステムエンジニアや営業へ転向がすすめられることがある。
労働者たるプログラマ
如何なる職業に就いた経緯があろうとも、資本家によって頭数の一つとして利用されるがままに生涯を終える。
頭数として利用される立場である以上、プログラマ自身のアイデンティティに対する価値は最初から全く期待されておらず、
肉体の能力や精神的な意欲の低下が顕著となる30代後半以降の局面を以って職業を継続する事が困難な状況に陥る傾向がある。
本来は知的労働者であるべきプログラマが、そのアイデンティティを無視されたままに、年齢や怪我による主に肉体的な能力の低下を理由として
簡単に使い捨てられる日本の常識的な産業構造を揶揄する意味でIT土方という言葉や新3Kという言葉はあまりにも有名である。
プログラマ - Wikipedia
780 :
デフォルトの名無しさん:2012/02/02(木) 19:37:12.19
>>777,778
わざわざ40間際のおっさんにありがとね。
コンピュータは好きなんだよね。飽きが来ない。
フリーソフト世界に飛び込むかな。死ぬまでの趣味として。
収入が必要なので、寒いけど郵便局の配達でもしているか。
乗りたいクルマナンバーワンのスカイラインとか、一生買えない・乗れないだろうな。
C++は使いこなせればかっこいいだろうなと思うから、
エリック・レイモンドが一にPython、二にJAVAと言っても、初めからC++で始めたわけですよ。
あと数学やOS(カーネルとかファイルシステムとかデバイスドライバかな?)が必要なら、また勉強か。
まあLinuxでもイジるしかないと思うけども、
Ubuntuとか仕掛けを見せないようにしているから、Debianでもインストールするかな。
長くなってすまない。御返事有難う。
C++使いこなすような高度な仕事は
IT後進国の日本にはありません
C++ ⇒ C言語 ⇒ アセンブラ と進むほど重労働になるのでないか。年齢いってたら逆方向の言語をねらっていけば。
783 :
デフォルトの名無しさん:2012/02/02(木) 19:38:49.74
>>779 なんだか大学時代のアジ演説みたいだな。
784 :
デフォルトの名無しさん:2012/02/02(木) 19:40:36.11
>>781 日本ってIT後進国だったのか。
ソフトのインターフェイスがださいとは思っていたが。
785 :
デフォルトの名無しさん:2012/02/02(木) 19:40:56.55
786 :
デフォルトの名無しさん:2012/02/02(木) 19:43:48.76
親戚が来て、思わず酒呑んだ。
ちょっとクラスまでは今日の勉強は進めないな。
一部のPGを除けば職業PGになるのは不幸だよ
ほかの仕事探して趣味で書いてるほうが幸せになれる
788 :
デフォルトの名無しさん:2012/02/02(木) 19:49:36.27
>>787 なるほどねぇ。趣味か。
プログラミングじゃなくて、ネットワークとかデータベースを狙うかな。
経験とかを問う前に、年齢聞かれそうだけども。
職歴の方が問題だろ
スカイラインは宝くじで狙って下さい
幸せになれる職業PGの仕事は
IT後進国の日本にはありません
インドから出張、出稼ぎにくる技術者よりメリット無いと駄目だな。
792 :
デフォルトの名無しさん:2012/02/02(木) 20:52:48.23
日本人がやることに意味のある仕事を知らないアフォは勝手に消えてくれ、そのほうが楽だ
市場規模が小さくて外国企業が参入しないニッチな市場だけだろ
IT後進国の日本人が通用する仕事は
794 :
デフォルトの名無しさん:2012/02/02(木) 21:22:27.45
自己紹介しなくていいよ
おまえのスコープは先刻見通したうえで言ってるんだから
そもそも日本人がやった意味ある仕事なんてないだろ
ですね
どうせガラパゴス的な仕事だろ
世界的には何の意味もない
FEP
よく言われる半導体や車なども、別に日本がいなくても市場規模は同じだったし
実際、今のトップ3に日本は入っていない
たとえ日本が今すぐに消えてなくなっても、明日も世界は何も変わらない
日本のニッチ市場でちょっと売れただけで
勘違いした人たちが海外に進出してたりしたけど
数年で日本に逃げ帰ってきてるよな
半導体も車も過去には売れていた時期があったろ
ソフトウェアは一度もそういう時期がない
802 :
デフォルトの名無しさん:2012/02/02(木) 22:19:07.38
ゲームもソフトウェアだろ
売れてるじゃん
昔は
エロゲの海外ファンは確実に増えているが、売れる気配は全く無いな
HENTAI外人は割れが基本だからなぁ
805 :
デフォルトの名無しさん:2012/02/03(金) 03:20:45.73
どうも病気持ちです。
C++から始まって、業界情報を提供してくれてありがとう。
思うんですよ。学部は化学だったから情報とは関係がない。
じゃあ、技術をみっちり教えてくれるオーストラリア大学大学院留学とかどうかなって。
40間際ではもう無理だ、詰んだ・オワタ、社会の落伍者の貧困層で生きろとか言われるかもしれません。
学費・生活費も1000万かかるでしょう。
それで留学するカネがないのですよね。
前ネットゲームやっていた時に、人の嫌がる仕事を日に3件入れて2年で2000万貯めた人がいた。
その人は当時FXの種金2000万からスタートしたれしい。
俺にFXの種金はないけども、コンピュータをみっちりやりたいなぁ。
40間際にして人生賭けてみるか。
体を動かす仕事なら、気が楽で良いかなってね。。。
オーストラリア大学って何ぞ?
コンピュータの勉強なんざ大学いかないでも出来ると思うけど
ここ人生相談室ちゃうで
というか
とりあえずsageろや
>>805 宿題スレにすでに終わった奴がいるよ
勉強とやらをしてるみたいだが迷惑でみんな困ってる
いま暴れてる
PC教室でパソコンマスターするぞと意気込む中年とおなじ原理だな。
ぶっちゃけ、歳行ってから新たに始めようという時に、まず学校という人は、そこ以外で学ぼうとしてこなかった、学び方を知らない人間だろう
そんな人は、もう今世は諦めて、来世に学ぶしかない気がするわ
ネットも参考書も溢れてるこの時代、自分からやろうという気概のないやつに、新たなことが学べるかっての
C++なんてtemplateとかメタい事をし始めるくらいまでは参考書とか定番書揃ってるんだから自力で勉強するのが一番早いよな……
>>805 C++の設計者のホームページ見てみたら?
>>805 海外の大学を金銭的な面で諦めるってことは英語できるの?
そっち方面で就職したら?
>>812 C++だけ出来るようになってもしょうがないだろ
日本語覚えたら物書きで食ってけますか?ってのと同じだぞ
>>777の言うように言語以外の知識の方が重要なんだよ
ソフト作れと言われてから、下調べに何ヶ月もかかったり
分からないので作れませんでしたじゃマズイだろ。特に中途採用者は
プログラマとしての実用レベルと、言語研究やコンパイラ開発のレベルは全く違うな。
とりあえずThrun教授のネット講義でも受けてみたら
Pythonだけど
if (x == 0 && y == 0) z = 0;
else if (x == 0 && y == 1) z = 2;
...
というひたすら条件を羅列する処理が続くのだけれど、
条件の抜け漏れが見つけにくいし良くないと思って、
map[make_pair(0, 0)] = 0;
map[make_pair(0, 1)] = 2;
z = map.at(make_pair(x, y));
としてみた。
ただ、この処理を行うオブジェクトが何度も生成されるので、
そのたびにmapが作成されるのは非効率だな、と。
mapをstaticにするか、とか短絡的に考えたんだが、一方で、
auto lambda = [&](int a, int b, int c) -> bool {
if (x == a && y == b) { z = c; return true; }
return false;
};
lambda(0, 0, 0) ||
lambda(0, 1, 2) ||
...;
というのを考えたんだが、どうだろうか?
なんか結局最初のif, else ifが一番見やすいような気がしてきて・・・
自分ならこうする、とかあれば是非お願いします。
配列や関数のよびだしよりも、実値をifしたほうが高速。
多分岐するんだったら、自分はこれ使うが。
do {
if() { ・・・ break; }
if() { ・・・ break; }
・・・
} while(1);
elseを何度もつづけたり、カッコの中にカッコがいくつも入ってくると自分はわかりにくい。
インデントも好きでない。
breakやらreturnを有効活用したら便利だ。
>>81の do { } while(1);全体を関数化して、分岐が確定したらreturnで戻すというのもある。
xとyとzには、どの様な規則性があるの?
変に工夫するより、if () else if() ・・・ってシンプルにやったほうが、
後で見たとき分かりやすいかもしれない。
2次元の表をルックアップ出来ないの?
うむ。 整数値に収まるなら
switch (x+y*X_MAX){
#define PAIR(a,b) a+b*X_MAX
case PAIR(0,0):break;
case PAIT(0,1):break; }
だな
const int table[2][3] = {
{
1, // x=0 y=0
5, // x=0 y=1
3, // x=0 y=2
},
{
9, // x=1 y=0
2, // x=1 y=1
6, // x=1 y=2
},
};
int z = table[x][y];
827 :
818:2012/02/03(金) 22:20:12.25
xやyは実際にはenumで、zもまた別のenumによるステータスコードです。
xがこの状態でyがこの状態ならzは「待機中」みたいな。
なので、xとyの値から一定の規則性に従ってzを自動計算させる、というのは
ちょっと難しいです。
819,820氏のシンプルさがやはり可読性の観点からも良いと思いましたので、
821氏指摘も加えてスクリプトで生成させることにしたいと思います。
825氏の方法はなるほどと思いましたがマクロはなるべく避けたいなぁ、
ということで・・・。
826氏のは・・・あとで拡張しようとしたときにtable[2][3]の部分の
変更ミスとかやりそうなので、自分にはまだ早いようです。
ともあれ皆さん色々と回答ありがとうございました。
struct Hoge {
Hoge(/* 引数たくさん */);
};
// A
struct HogeEx : Hoge {
HogeEx(void) : Hoge(/* 引数固定 */) {}
};
// B
Hoge HogeEx(void) { return Hoge(/* 引数固定 */); }
Hoge hoge(HogeEx());
コンストラクタの引数を利用ケースに合わせて固定省略したい場合にはAとBどっちを使うべき?
Hogeそのものは弄れんのか
>>829 いじれるんですが
あくまで文脈に依存したパラメーターなのでHogeクラスには書きたくないんです
B
どうせExのパターンが増えるんだろ
引数なしのコンストラクタは下手に意味を持たせるより未設定状態になるようにしたほうがいいんじゃないか?
>>828 型である必要があるかを考えりゃいい
結果が型でないならジェネレータークラスでもいいし
class gen_hoge {
Hoge operator()();
あとわかるよな?
}
コンストラクタである必要性ないよな
{
ObjectManager om;
om.add(new Object());
om.add(new Object());
// 以下略
} // ObjectManagerのデストラクタでObjectをdelete
このように生成と破棄の場所が異なるようなコードは避けるべきなんですか?
{
Object o;
ObjectManager om;
om.add(&o);
}
みたいに書かれると問題ですし
そもそも、引数にnewを直に書くのが問題?
あまり良くないね
それでは内部でdeleteしているという実装の都合で利用者にnewを強制してしまう
オブジェクトの寿命は外部で管理してManager内では削除する代わりにNULLポインタの代入か内部コンテナの縮小で済ませるべき
836 :
834:2012/02/04(土) 16:26:16.21
>>835 ありがとうございます
やはりそうですよね。
ただManagerは、プログラム中にけっこう現れるので
できれば全部任せたいんですよね
そこで、
add(Object* obj) {
// list は list<Object*>
list.push_back(obj);
}
を
add(const Object& obj) {
// list は list<Object>
list.push_back(obj); // 代入
}
または
add(const Object& obj) {
// list は list<Object*>
list.push_back(new Object(obj)); // コピーコンストラクタ
}
にしてコピーするようにして
{
ObjectManager om;
om.add(Object());
}
のように利用するのはどうでしょう
コピーのコストがかかる場合が心配ですけど
コンテナに元の型以外で突っ込む場合は、
あくまでも、参照させてやってるだけ
という捉え方が良いと思う。
役割によって複数のコンテナを用意し、
一つのオブジェクトを複数のコンテナに所属させる
なんてよくある事だから。
>>836 そもそもObjectManagerってなにするクラスよ。
オブジェクト管理つって言われても、
どういう結果を得るために作ってんのか分からん。
839 :
834:2012/02/04(土) 17:19:14.29
>>838 ObjectManagerというのは適当につけた名前で
実際はAnimationGraphicというクラス名です
役割として、画像とそのアニメーション(パラパラアニメ)を管理させてます
時間経過による変化を考慮して、描画すべき画像を返す。または描画する
管理しているオブジェクトについては、
画像:
画像。IDをつけてmapに入れてます(map<id,graphic>)
アニメーション:
どの画像をどのタイミングで切り替えるかを定義します。
今回の質問はこの管理。
アニメーション自体はAnimationGraphicクラスだけでしか
使われることがないと予想されるので、
アニメーションの仕方だけを通知させればよいと考えています(
>>836 の add(obj))
>>839 add(std::shared_ptr<Object> obj)
で寿命管理はシェアポに投げることを明示したらいかんの?
そういう場合はモデルへの共有ポインタと姿勢・時刻をもたせて一つのオブジェクトにする
ポインタを受け入れるインターフェースにスマポを使うのに抵抗感を感じる
管理クラスの実装の都合でスマポを使ってるだけなのにそれを利用者に押し付けて特定のスマポを強制するのがいやだ
>>837のようなケースで管理クラス間で使うポインタの互換性が厳しく制限されるのも困るし
843 :
834:2012/02/04(土) 17:54:37.68
>>840 スマポは勉強中でして、よくわかってなかったので…
特に使ってはいけないわけではないので、検討してみます。
>>841 アニメーションは複数持つことができ、場面に応じて切り替えて使おうと考えています
同じ画像に対して、アニメーションが定義されることもあるので
結局
>>841 のオブジェクトでも管理が必要に感じるのですが
(といいますかAnimationGraphicがそれに当たるような)
解釈間違ってたらすいません。
>>843 イマイチアニメーションがどう画像に作用するのか分からん。
アニメーション自体がどう言うものかも分からん。
アニメーションが画像に対する操作を格納しており、
多態によって操作を切り替え用途するなら
コピーしちゃいかんだろ。
あと、マップのidって誰が何をするタイミングで使うの?
時系列でAnimationがAnimationGrphicsに格納されてて、
Animationが画像の入ったmapを参照してるとか?
846 :
834:2012/02/04(土) 18:42:24.46
>>844 アニメーション(Animationクラス)は
listで 画像IDの変化パターン と 切り替えタイミング をもっている
変化パターン{3,4,5,6}切り替えタイミング{12,12,24,12}であれば
画像3―12fおいて→画像4―12f→画像5―24f→画像6―12f→ループ
画像とは直接やり取りはなく
AnimationGraphicが橋渡しに
anime.tick(); // 時間経過
// 描画タイミングで
int id = currentAnimation->getDrawGraphID(); // 描画すべき画像のIDを受け取る
Graphic* g = graphList.at(id); // 画像と結びづけて
g->draw(x,y); // 描画。または上の階層にGraphicを返す
アニメの切り替えは↑のcurrentAnimationに割り当てるだけで
多態性を使ったものは考えていなかったので
コピーしてもいいやと(保守、拡張性に乏しいですが)
847 :
834:2012/02/04(土) 18:51:38.43
今思えば、Animationに画像(Graphic)の参照を持たせてもよかったのかも
無駄にIDで管理しようとしてますね
(あまりいろんな所で参照をもたせるのが嫌だったのでしょう)
出なおしてきます。
メモリ管理を統合するか、メモリ管理をしないかまず決めろ。
stringなどは動的なメモリ管理するクラスだ。
namespace AAA{
int bbb;
}
こんな感じのをグローバルで作った時に、これを他のファイルでも使いたいときは
extern namespace AAA;
でちゃんと中の変数が全部使えるようになるんでしょうか?
namespace AAA{
extern int bbb;
}
こっちみたいにするんでしょうか?
それともnamespaceはextern不要でしょうか?
自分の想定する使い方ができるのかテストしろ
namespace AAA{ extern int bbb; }
ですよ。
何故試さないのか
間違えても爆発したりせんぞ
知識として知っておきたいなら試しても無駄。
なんせC++の規格に合致するコンパイラなんかこの世に一つも存在しないから
己が今作っているプログラムで動けばいいというのなら試すのもひとつの手
でも、一番簡単なのはリファレンス読むこと
ラムダクラスみたいなのがあればいいのに
std::function<T>?
>>853 どのコンパイラでもOSでも同一機能が実現できるように作成するといい。
if (map.count(key)) process(map[key]);
と書いてきたんですが、
try {
process(map.at(key));
} catch(...) { }
のような記述の方がいいんでしょうか?
keyがmap内に存在しないことをロジック上想定していない、
というのであればまさしく「例外」だと思いますが、
keyがmap内にあってもなくてもいい、というのであれば
「例外」ではないような。
ロジック上の条件分岐を実現するのに例外を持ち出すのは
なんとなく間違った使い方な気がしていますが、どうでしょうか?
>>857 何が例外で何が例外でないか、なんて基準は時と場合によるから人に聞いても無駄だよ。
その2択で言うと値が存在したときの効率は後者のほうがいいんだけど、
例外無しで同等の効率にしたければ find() を使えばいいわけで、おそらくそれが
一番やりたいことを素直に表現できるんじゃないかな?
>>858 確かにfind使えば検索は一度で済みますね。
了解です。どうもありがとう。
DWORD dwNumber = 0x00000000;
BYTE *pPtr = (BYTE*)&dwNumber + 3;
*pPtr = 0xFF;
(BYTE*)とか使ってて何か気持ち悪いです
良い書き方ありませんか?
BYTE dwNumber = 0x00000000;
BYTE *pPtr = &dwNumber + 3;
>>860 エンディアンに依存するような気持ち悪いコード書いてるからしょうがない、諦めろ。
>>861 それ、pPtr が全然関係ない情報指してたりするかもよ。
っていうか、C++的になしだろ^^;
BYTEがキモいのかCキャストがキモいのか
はたまたMSBを書き換えてるのがキモいのか
865 :
デフォルトの名無しさん:2012/02/08(水) 23:02:30.24
static_cast
866 :
デフォルトの名無しさん:2012/02/08(水) 23:05:00.57
まずリビルドって単語をぐぐってこいよ
いきなり、どうした?
868 :
デフォルトの名無しさん:2012/02/08(水) 23:26:38.58
float(a/b)と(float)a/bって同じなの?
ちがうだろ
aの型による。
>>860 匿名共用体おすすめ
union {
DWORD d;
BYTE b[4];
};
d = 0x00000000;
b[3] = 0xFF;
なるほど
そのunionあまり意味ないよ。
キャスト使いなさい
気持ち悪いと思うことと同じ処理をしているのに
気持ち悪さが緩和されるのは怖いね。
カプセル化しろよ胸糞悪い
こういう時に共用体使うのは常道だろ?
>>875 DWORDのサイズを確信してるなら意味ないね。
共用体以外の方法で済むときはわざわざ共用体にしなくていい。
共用体が混ざると継承や委譲が発展していくうちに、
初期化子の書きにくさが後々余計な束縛になる。
C++でないならどうでもいいが。
共用体は文字通りメモリ領域を共用したいときに使う
それ以外ではあまり使わない(使うことが全く無い訳でもない)
>860
何がしたいのか分からんけど
dwNumberの特定のバイトだけを0xFFで埋めたいなら
dwNumber |= 0x0000ff00;
特定のバイトを任意の値(例えば0xa3)にしたいなら
dw = dwNumber & 0xffff00ff;
dwNumber = dw ^ 0x0000a300;
[&](size_t a,BYTE b)->{assert(a<sizeof(DWORD));reinterpert_cast<BYTE*>(&dwNumber)[a]=b;}(3,0xff);
881 :
デフォルトの名無しさん:2012/02/09(木) 05:29:51.06
何でこのスレはゴミしかいないの?
むしろ外面重視のこれで
auto dw2b4=[&]()->char(&)[sizeof(DWORD)]{return*reinterpret_cast<char(*)[sizeof(DWORD)]>(&dwNumber);};
dw2b4()[3]=0xff;
くだらない
やっぱ括弧バカ言語だな
>>878 確かに規格で動作保証はされてなかった気はするけど
実際には開発環境側がそういった共用体を提供していたりする
(レジスタ共用体やら、LARGE_INTEGER やら)
886 :
デフォルトの名無しさん:2012/02/09(木) 08:28:46.51
だからなに?
馬鹿には無理
class my_uint32_t {
DWORD d ;
public:
my_uint32_t() {}
my_uint32_t(DWORD d) : d(d) {}
operator DWORD const & () const { return d; }
BYTE get(int i) { assert(0 <= i && i < 4); return (d & (0xFF << (i * 8))) >> (i * 8) ; }
void set(int i, BYTE b) { assert(0 <= i && i < 4); d = (d & ~(0xFF << (i * 8))) || (b << (i * 8)) ; }
} ;
特定のnamespace内の型のみを受け入れるテンプレート関数を書くことは出来ますか?
namespace A { class Hoge {}; class Fuga {}; class Piyo {}; }
template <class X> void func(X const & obj);
// A::Hoge, A::Fuga, A::Piyo以外の型をエラーにしたい
// 実際には3つの型だけでなく非常に多くの型があるのでオーバーロードで解決することは難しい
890 :
デフォルトの名無しさん:2012/02/09(木) 11:49:02.43
馬脚には無理
>>889 funcをそのnamespaceの中に置けばいいんじゃないの
namespace N {
class X {};
template<class T> void func(T t) {};
}
int main(int argc, char **argv) {
N::X x;
func(x); // ok
func(0); // error
return 0;
}
namespace A { class Hoge {}; class Fuga {}; class Piyo {};template<typename T>void ck_habitant_A(T&){} }
template <class X> void func(X const & obj){ck_habitant_A(obj);…};
馬鹿には無理ゆうてるやつには無理なのはわかった
日本語で
初めてnamespaceを使ってみようと試行錯誤してるけど、
理解する能力が非常に欠落してる模様。
こんな事は出来ますか?
//B.cpp
namespace A{#include "a.h"}
namespace B{
B::B(){A::a();}
B::z(A::z());
}
//a.h
class a{
public:
a(){val=0};
int z(){return val+1;};
private:
int val;
protected:
};
同じ名前のメソッドがあった場合、どれを呼び出すかを
指示してやるのがnamespaceですよねぇ。。
>>897 その中身は
> namespace B{
> B::B(){A::a();}
> B::z(A::z());
> }
となんら関係ないよねw
スコープの概念すら分かってないみたいだから
Cから始めたほうがいいかも
ありがとうございます。
900 :
デフォルトの名無しさん:2012/02/10(金) 19:58:34.56
すれ違いだったら、誘導してください。
#include <GameLib/Framework.h>
namespace GameLib{
void Framework::configure( Configuration* c ){
}
void Framework::update(){
}
}
void f(){
//int *p=new int;
}
void main(){}
エラー 2 error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
エラー 1 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に LIBCMTD.lib(dbgdel.obj) で定義されています。GameLib_d.lib(MemoryManager.obj)
コメント取るとエラーがでるんですが、何が原因と推測します?
後学のため教えてください。
ちなみに、リンカ→システム→サブシステム コンソールに変更した場合、コメント取らなくてもコンパイルできます。
/verbose:lib オプションで見る限り、両方ともLibcmtd.libはリンクしてると思うのですが…
再現させようと自分で何もしない void operator delete(void*);のlib作ったけど、再現出来ませんでした。
C/C++→コード生成→ランタイムライブラリ
902 :
デフォルトの名無しさん:2012/02/10(金) 20:04:20.47
>900
>コメント取るとエラーがでるんですが、何が原因と推測します?
間違えました。
コメントを取るとエラーが消えるんですが、何が原因と推測しますか?
903 :
デフォルトの名無しさん:2012/02/10(金) 20:10:01.23
>>901 GameLib_d.libはマルチスレッドデバッグ(MTd)で作ってあって、合わせたほうがいいと思うのですが
MDDに変えると、
警告 11 warning LNK4098: defaultlib 'libcmtd.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。MSVCRTD.lib(cinitexe.obj)
やエラーが山ほど出てきます。
ちなみにリリースビルドだと上手くいきます。
MSVCRTD.libを無効にすればいい。
>>904 ランタイムライブラリをMDd、特定ライブラリを無視 MSVCRTD.lib にするとこんな感じです
エラー 2 error LNK2001: 外部シンボル "__RTC_InitBase" は未解決です。 main.obj
エラー 1 error LNK2001: 外部シンボル "__RTC_Shutdown" は未解決です。 main.obj
エラー 3 error LNK2001: 外部シンボル "_WinMainCRTStartup" は未解決です。
GameLib_d.libのなかにWinMainが入っているので、MTdかMDd、どちらかのランタイムのlibは欲しいと思われます。
自分はこの現象が起こる原因はlibの読み込み順序にある気がしてるのですが、
なんでnewとかdeleteといったmemoryManager.hの中にある関数使うと、リンク順序が正しくなるのか謎です。
なんで、delete演算子オーバーロードがコンソールにすると上手くいくのかはCRTとMFCの関係性がなくなるからの気がします。
自分で再現できないのが非常に気持ち悪い 。
バグだとしても、たいしたバグではないんだけど、何時間も苦しめられたのでむかつくというか…
もしかして、lib内にwinMainのエントリポイントもなければ、再現できないのか?
とにかく、レスくれた人、ありがとうございました。
ストリームの状態を調べる関数に、eof()やfail()がありますが
関数の仕様を確認したところ、EOFを入力ストリームが検出した場合
eof()は真になりますが、fail()は真にはならないとのことでした。
しかしVC++2010で以下のコードを試してみると
int i;
cin >> i; //ここでCtrl+Zを押してEOFを入力
if( cin.eof() ) cout << "eof" << endl;
if( cin.fail() ) cout << "fail" << endl;
出力は
eof
fail
となり、EOFを検出するとfailbitも立ってしまっているようなのですが
これはなぜでしょうか?
>>906 > eof()は真になりますが、fail()は真にはならないとのことでした。
仕様って、どこ見たの?
指定した入力が得られなければ failbit は当然立つよ。
failbit 無しで eofbit だけ立つ状況はかなり限られている(あるいは存在しない)と思う。
レスどうもです。
どうやら勘違いしたようです。
EOFの検出と、入力が得られなかったことが同時に起こるために
eofbitとfailbitが立つという解釈だと、仕様通りみたいですね。
いろいろやっていたら、eofbitだけを立てる方法を見つけました。
先ほどのコードを変更して
string s;
cin >> s;
if( cin.eof() ) cout << "eof" << endl;
if( cin.fail() ) cout << "fail" << endl;
とします。
そしてcin>>sのところで次のように入力してリターンを押します。
abc[Ctrl+Z]
そうすると、読み取りは1回のはずなのに、なぜかまだ入力が促されるので再度
[Ctrl+Z]
と入力すると、出力は
eof
だけとなりました。いったい何が起きてるんかちんぷんかんぷんです。
>>909 string の入力は EOF を読んだ時点で入力語の終わりとして成立するから、
eofbit が立って入力は成功する( failbit は立たない)んだろう。
なるほど、そういう意味ではintの入力も同じみたいですね。
@コンテナに入れた順序を保っている
Amapのように素早く検索できる
@Aを満たすようなデータ構造ってありますか?
>>912 class { list<mapped_type>; map<key_type, list<mapped_type>::iterator> }
メインのアプリケーションから
ファイル移動用のスレッドを生成して、
下記の様なソースで共有フォルダから
ローカルへのファイル移動を行っています。
しかし、大量のファイルを移動中に
アプリを終了すると、ファイル移動失敗時の
ログ出力に失敗し、エラーになります。
アプリを終了したら、ファイルの移動も
止める様にする良い方法はないでしょうか?
CStringList strlFileList;
CString strMoveFileName;
CString strOldFilePath;
CString strNewFilePath;
BOOL bRet = FALSE;
// ファイルリスト取得
GetFileList(strlFileList);
for(int iCount=0; iCount<strlFileList.GetCount(); iCount++)
{
// 移動ファイル名取得
strMoveFile = strlFileList.GetAt(strlFileList.FindIndex(iCount));
// 移動先
strNewFilePath = 移動先フォルダ + strMoveFile;
// 移動元
strOldFilePath = 移動元フォルダ + strMoveFile;
for(int iRetry=0; iRetry<リトライ回数; iRetry++)
{
//ファイル移動
bRet = MoveFile(strOldFilePath, strNewFilePath);
if (bRet == FALSE)
{
ログ出力
Sleep(中断時間);
}
else
{
// 移動成功
break;
}
}
if (bRet == FALSE)
{
ログ出力
}
}
>>915 メインスレッドの方でスレッドが終了するのを待たせないとダメ
const char* test(const char* s) { return s; }
int main() {
string s = test("abc");
cout << s;
}
試したところ動くのですが、たまたま動いているだけな気もしています。
なんとなく"abc"はtestを抜けたら消滅してもおかしくない気がして・・・
実際には、
const char* x = "abc";
string s = test(x);
と上記のコードは同じなのでしょうか?
>>918 文字列リテラルの生存期間はプログラム開始から終了まであるから。大丈夫。
そのコードの変数はスコープ的にはmainの中では死なないような気がする。
で、関数の戻り値はstringに食われるので、sにコピーされてsのスコープに移譲する。
で、あってるかな??あんまり詳しいことは知らないけど、問題ないと思う。
921 :
918:2012/02/13(月) 01:10:06.04
>>919,920
文字列リテラルの生存期間はプログラム開始から終了までなんですね・・・。
基本的な話ですみません。どうもありがとうございました。
>>918 > "abc"はtestを抜けたら消滅してもおかしくない気がして
test()の呼び出しが終了した後に"消滅"するとして、動作に違いが出るとは思えない
非同期プログラミングの設計について書かれた本ありますか?
コンソール画面にアスキーアートのようなもので書かれたウインドーを
で操作するGUIライブラリーみたいなものありますか?
TurboC++
ターボシープラスプラスのようなGUIを作るライブラリーです。
Qt
>>928 TurboC++に付いてるOWLのCUI版があるよ
>>926 定番といえばcursesだけど
それが使えない環境ではAPIに組み込まれていたり
代替えのライブラリがあったりするので
環境明記したほうがいいかも
管理クラスに渡すポインタの型をどうするか迷ってるんですがなにかいい解決法は無いでしょうか
class Mng1 {
void register(boost::shared_ptr<IObj1> p);
// ry
};
これだと利用者にIObj1インターフェースだけでなくboost::shared_ptrの利用まで押し付ける事になるので利用しづらくなります
さらに
class Mng2 {
void register(boost::intrusive_ptr<IObj2> p);
// ry
};
という管理クラスが存在した場合IObj1とIObj2の両方を継承したクラスがあった場合ポインタの型が競合してしまいます
struct Elem : IObj1, IObj2 { ... };
Mng1 m1;
Mng2 m2;
ElemPtr p; // ElemPtrの型は???
Mng1.register(p);
Mng2.register(p);
また管理クラスはMng1とMng2だけとは限りません
生ぽにしてunregisterを追加する
>930
ターボビジョンなんてもう誰もしらねーよ。
おっさんは帰れ!
ありがとうございます。
色々あると知ってよかったです。
アスキーアートのウインドーは無いみたいですね。
Cライブラリーだけでつくれるものですか?
実行時にエラー出ます。これって間違ってんの?
void func(char **dst){
int size=sizeof(int)*8;
*dst=(char *)malloc(size+1);
*dst[size]='\0';←ここでエラーでる
for(int i=size-1;0<=i;i--)*dst[i]='1';
return;
}
int main(){
char *dst;
func(&dst);
free(dst);
}
間違ってる
>>936 sizeはintが8個分。つまり、sizeof(int)が4なら32になる。
* dst[size] は即ち * dst[32]なのだから当然、領域外アクセスになる。
そもそも、何故最後にナル文字を入れようとしているのか理解できない。
*より[]のほうが優先順位が高いから
(*dst)[size] = '\0';
(*dst)[ i ] = '1';
とするといいかもしれない
つーか、そもそもC++ならmalloc()なんぞ使うなや。
>>938 malloc(size+1)で一個大きくとってるじゃん。
C言語スレに行けという話でFA
>>941 言葉遣いを直してから聞けアホ
32+1は4で割れるのか?
ツッコミどころだらけでどこからツッコめばいいんだww
>>943 お前はなにを言ってるんだ。
正解は
>>939だろ?
ろくにコードも読めないのにえらそうに口だけはききたいんだな。
偉そうに言ったことが間違ってて、引けなくなった人が暴れてますね。
char *にキャストするくらいなら、calloc使えばよかったのに
メンバにvectorがあるのですが、アクセサをどう書くべきかで悩んでいます。
Getterは問題ないんですが、Setterをどう書いたらいいものかと。
PushBackVector, AtVector等、いちいちvectorのメソッドを書いていたら
きりがないですし・・・。
代入等のリスクを考えるとpublicにvectorを置くのは良くないですし。
どう書くのが無難でしょうか?
どういう操作をしたいかによるだろそんなもん
MC使いたい→セッタ無しでアクセッサ(戻り値 vector &)を用意する
push_back()、at()等を使用した設定、size()ぐらいしか使わない→各種メンバ関数を用意する
前者のばあい、俺は
ゲッタ: const vector & Hoge::GetPiyos() const
アクセッサ: vector & Hoge::AccessPiyos()
という、しっかり名前を分けたconst版、非const版の関数を用意する
機密性?お前は何を(ry
>>952 push_back, find, at, size, empty, clearが最低限必要な操作になります。
>>953 >しっかり名前を分けたconst版、非const版の関数を用意する
非constと明示して公開ですか。了解です。
今回はまだアクセサの数もたかが知れているので、一つずつ関数を用意
してやることにします。
どうもありがとうございました。
>>932 所有権を共有するなら shared_ptr 強制で妥当だろ。
struct Wrapper1: IObj{
intrusive_ptr<Elem> p;
Wrapper1(const intrusive_ptr<Elem> &p): p(p){}
// デリゲーターを書く
};
Mng1 m1; Mng2 m2;
intrusive_ptr<Elem> p(new Elem);
m1.register(shared_ptr<Wrapper1>(new Wrapper1(p)));
m2.register(p);
こうだろJK
効率?知るかボケ
stringstreamの状態でios_base::badbitが立つときってあるのでしょうか?
あるならそれはどういう状況ですか?
>>939 ありがとう、知らなかった。すごく助かりました
struct HogeImpl {
HogeImpl(void): c(0) {}
void func(void) { std::cout << "hello: " << c << std::endl; ++c; }
int c;
};
class Hoge {
HogeImpl * pImpl;
public:
Hoge(void) : pImpl(new HogeImpl) {} ~Hoge(void) { delete pImpl; }
void func(void) const { pImpl->func(); }
};
HogeのほうのメソッドはHogeImplのconstに合わせるべきか
それとも基本的に全部constにするべきなのか
現在キー入力で複数のパターンを選んで動くというプログラム
を組んでいます(switch文)
このキー入力をwindwsFormのbuttonを使ってそれぞれボタンごとに
割り当てたいと考えています
buttonにそれぞれのパターンを割り当てる方法を教えてください
もうどこからツッコめばいいのかわからなくてめんどくさい
ケツから突っ込めばいいよ