C++相談室 part44
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2005/10/05(水) 20:45:37ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
C++相談室 part43
http://pc8.2ch.net/test/read.cgi/tech/1124113879/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0159148
2005/10/11(火) 12:53:08sizeof(T) == 4
sizeof(S1) == 1
sizeof(S2) == 4
の間違いです
0160デフォルトの名無しさん
2005/10/11(火) 22:45:10もともと何も問題起きてないと思うんだが、つか、C++/class じゃなくて、
基本的には C言語でのこの種の理解をしてないだけじゃないかしら
0161デフォルトの名無しさん
2005/10/11(火) 23:03:38自分で作ってみたら?
サイズがシステムに最適化されるプリミティブなクラスでも。
0162デフォルトの名無しさん
2005/10/12(水) 02:14:41> 「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
これは規格からの引用?どこ?
9.6.1 だとしたら
「指定したビット数がオブジェクトの型表現のサイズより大きい場合」
の間違いじゃない?
sizeof(T) == sizeof(int) になることも
sizeof(T) == sizeof(short) になることも
確かだと言える根拠は無いでしょ?
全部処理系依存。
0163デフォルトの名無しさん
2005/10/12(水) 02:18:00C だと (signed|unsigned) int しか使えなくて、
C++ でその他の整数型と enum が許されるようになったみたいだから、
移植性を気にする人は使わないんだろうね。
0164デフォルトの名無しさん
2005/10/12(水) 03:00:210165デフォルトの名無しさん
2005/10/12(水) 03:59:19S1の T ってただの型宣言になってるぞ。
sizeof(S1) == 1 になって当たり前w
0166デフォルトの名無しさん
2005/10/12(水) 20:45:23どうすればよいのでしょうか?
普通にnew演算子を使って作るのはできるのですが
vectorを使った方が都合が良いです。
例えば
std::vector< std::vector<int> > matrix;
matrix.push_back(std::vector<int>(4));
…
という具合にmatrix[*][4]は作れますよね。
こんな感じで
matrix[*][9][4]のような物を作りたいのですが、
上手くいかなくて困り果てています…
0167デフォルトの名無しさん
2005/10/12(水) 21:09:28{
public:
int getInstance(){ /* なんちゃらかんちゃら */ };
};
int g_N = CSomething::getInstance();
int main()
{
return 0;
}
グローバル変数を↑こういう風に初期化するのって問題ないですか?
0168デフォルトの名無しさん
2005/10/12(水) 21:12:550169167
2005/10/12(水) 21:14:49class CSomething
{
public:
static int getInstance(){ /* なんちゃらかんちゃら */ };
};
0170デフォルトの名無しさん
2005/10/12(水) 21:14:53いいけどその例ではgetInstanceが静的メンバでないとCSomethisng::で修飾してのアクセスはできないよ。
0171デフォルトの名無しさん
2005/10/12(水) 21:30:14グローバル変数を初期化する意義が読み取れない。
だからまあ、設計に関しての常套文句が二つ三つ出てヤメレって言うしかないわけだが。
0172デフォルトの名無しさん
2005/10/12(水) 22:04:08動的な1次元のプロキシクラスを作って、それの配列クラスという形で、
2次元クラスを作るのが常套手段。
0173167
2005/10/12(水) 22:11:05コード・文法的に問題あるとかってことはないぽってことですね。
ありがとうございました。
>171
確かにサンプルコードだけ見ると、何しようとしてるんだって感じですね。
実際にはもう少し意義ある形なので、ここはお目こぼしを[・∀・]
0174デフォルトの名無しさん
2005/10/13(木) 03:10:23{
bzero(&a, sizeof(a));
}
なんで最初の要素しか0にならんのか
暫く気づかなかった
0175デフォルトの名無しさん
2005/10/13(木) 03:39:31うん。がんばろう。
>>174
なんでなん?orz
0176デフォルトの名無しさん
2005/10/13(木) 04:18:15class A { int i; };
std::cout << std::showbase << std::hex << &a << ' ' << std::noshowbase << sizeof(a) << std::endl;
俺の環境では
0x0023ff77 4
どう考えても最低4バイト初期化されるが・・・・・
0177デフォルトの名無しさん
2005/10/13(木) 04:20:07自分で作るのが面倒ならboost::multi_arrayがその目的まんまだから使ってしまえ
0178デフォルトの名無しさん
2005/10/13(木) 04:27:57>174はポインタを渡して配列を初期化するつもりだったんジャマイカ?
0179デフォルトの名無しさん
2005/10/13(木) 04:35:15なんだそういう事か。
0180デフォルトの名無しさん
2005/10/13(木) 05:08:27納得
0181hoge
2005/10/13(木) 13:58:22�AテンプレートってC++にしかないんですか?
0182デフォルトの名無しさん
2005/10/13(木) 14:04:31�@intに0か1を入れてbool代わりに使う という話ならどちらも大差ない
�Aジェネリクスの概念は他の言語にもある
0183デフォルトの名無しさん
2005/10/13(木) 18:35:13でもC++程強力なテンプレートは
0184デフォルトの名無しさん
2005/10/13(木) 18:44:430185181
2005/10/13(木) 18:52:040186デフォルトの名無しさん
2005/10/13(木) 18:58:120187デフォルトの名無しさん
2005/10/13(木) 19:01:11一応有る。Java Genericsでググるといっぱい出てくるよ。
JavaSDK1.5に入る予定だったけど、結局入ったのかどうかは知らない。
たしかC++程の強力さはないけど。
0188デフォルトの名無しさん
2005/10/13(木) 19:19:19Tになにを求められるか−たとえばTは++演算子が使えるインターフェイスでなければならない
ってのがよみとりにくくて不便じゃない?
0189デフォルトの名無しさん
2005/10/13(木) 19:53:04そこでC++ 0xではコンセプトを導入してそういうことをコードに書けるようにしようということになっている。
0190174
2005/10/13(木) 21:54:52int m1;
int m2;
};
A a;
a.m1 = 1;
a.m2 = 2;
foo(a);
cout << a.m1;
cout << a.m2;
ってな感じなわけですよ!!!!
0191デフォルトの名無しさん
2005/10/13(木) 22:46:58class abstract_status
{
};
class status : public abstract_status
{
string name;
map<set<char>,abstract_status*> transition_map;
};
class automaton
{
status *start;
status *accept;
status *current;
list<status*> status_list;
};
ってな感じで進めているのですが、transition_map の set<char>
のところは単なる char にしたほうが良いかどうか。。。
あるいは、全く別の構造にしたほうが良いのか。。。
アドバスお願いします。
0192デフォルトの名無しさん
2005/10/14(金) 01:44:17で、なんで最初の要素しか0にならんの?
0193デフォルトの名無しさん
2005/10/14(金) 01:45:43set<char> にした場合の使い方がわからない。
0194デフォルトの名無しさん
2005/10/14(金) 02:03:450195デフォルトの名無しさん
2005/10/14(金) 02:21:040196デフォルトの名無しさん
2005/10/14(金) 02:40:23おお、本当だ!ありがとう。
0197デフォルトの名無しさん
2005/10/14(金) 07:14:00あーなるほど。
>>192
sizeof(a)
0198デフォルトの名無しさん
2005/10/14(金) 07:30:17なにが「なるほど」なのやら。両方ともゼロになるだろ。
0199デフォルトの名無しさん
2005/10/14(金) 07:35:260200デフォルトの名無しさん
2005/10/14(金) 08:53:30ならない
0201デフォルトの名無しさん
2005/10/14(金) 09:20:31なるよ。
0202デフォルトの名無しさん
2005/10/14(金) 09:25:36それともC++関連だけか?
0203デフォルトの名無しさん
2005/10/14(金) 10:35:270204デフォルトの名無しさん
2005/10/14(金) 14:46:55sizeof(A) ならいいけど sizeof(a) だからダメって言うこと?
コンパイラがバグってるだけじゃない?
0205デフォルトの名無しさん
2005/10/14(金) 15:43:58って話しだべ?
参照はポインタみたいなもんだから。
どっちが正しいか知らんけど、
VC7.1 じゃ 8 だったな。
0206デフォルトの名無しさん
2005/10/14(金) 15:50:25ISO/IEC 14882:1998
5.3.3 sizeof
2. When applied to a reference or a reference type, the result is the size of the referenced type.
8になるのが正しい
0207デフォルトの名無しさん
2005/10/14(金) 21:38:040208デフォルトの名無しさん
2005/10/14(金) 22:54:12void automaton::tick(char input_char)
{
for(i=0; i<(current->second).size(); i++) {
if (((current->second)->first).count(input_char) > 0) {
current = (current->second)->second;
return;
}}}
0209デフォルトの名無しさん
2005/10/14(金) 22:55:510210デフォルトの名無しさん
2005/10/14(金) 23:01:35map<set<char>,abstract_status*>::iterator tmitr = (current->second).begin();
int i;
for(i=0;i<tmitr->size();i++) {
if ((tmitr->first).count(input_char) > 0) {
current = tmitr->second;
return;
}
tmitr++;
}}
0211デフォルトの名無しさん
2005/10/14(金) 23:02:482段に分けて記述しています。
0212デフォルトの名無しさん
2005/10/14(金) 23:24:04{
public:
CVal(int val, char * name)
{
v = val;
}
~CVal()
{
}
operator int ()
{
return v;
}
private:
int v;
char * n;
};
というクラスがあるのですが、このクラスを次のように使うとintにキャストされてうまくいきます。
CVal val(1, "なんか");
if(val == 1){...
しかし次のようにprintf系に渡すとおかしくなってしまうようです。この場合どう扱われてるのでしょう?
CVal val1(1, "foo");
CVal val2(2, "boo");
printf("%d, %d", val1, val2);
↑
最初の1は正しく出るがval2は変な値になる。
0213デフォルトの名無しさん
2005/10/14(金) 23:29:560214デフォルトの名無しさん
2005/10/14(金) 23:34:36printfでは自分でstatic_castすればとりあえず動く。
printf("%d, %d", static_cast<int>(val1), static_cast<int>(val2));
0215デフォルトの名無しさん
2005/10/15(土) 00:01:51ってことはほかの場所でも実はちゃんとintにキャストされずに動いてる可能性もあるわけですね。
ちょっと怖いですね。
0216デフォルトの名無しさん
2005/10/15(土) 00:15:060217デフォルトの名無しさん
2005/10/15(土) 19:47:40これC言語知ってる人がC++の補足として使えるかと思って書いたやつで
基本的に本から抜粋しただけのものですけど、
間違いとか不足してるところとかありませんか?
0218デフォルトの名無しさん
2005/10/15(土) 19:56:50書いた人ですか?
最初のほうを読んで一つ目だけ。
>高度な型 - C++の構造体
>メンバ関数を持つことができる。(実際のプログラミングでは、使わないこと)
括弧部分が大きなお世話。
関数オブジェクトではstructにメンバ関数を書くのが普通だったりする。
0219デフォルトの名無しさん
2005/10/15(土) 20:00:48標準C++ライブラリを使うには必須の機構だし、普通に使うものなので
今C++を語るなら書かないのは片手落ちだろうなあ。
0220デフォルトの名無しさん
2005/10/15(土) 20:32:11よってunsigned char a=b=200;のときunsigned char c = (a+b > 255) : 255 : a+b;と書いても、予期したとおり動く
Cでも同じなのかもしれんけど。
strstreamよりstringstream使うべき
0221デフォルトの名無しさん
2005/10/15(土) 20:44:13ダメすぎ。
総じて、よく判っていないながら実務経験だけはある香具師が、経験則から得たメモを書いているだけ。
書いた香具師のプロファイリングを楽しむにはいいが、参考にはならない。
0222デフォルトの名無しさん
2005/10/15(土) 20:47:14・参照
・メンバ初期設定リスト
・仮想基本クラス
あとこういうの書くときはC++の設計と進化を読んで書いて欲しい。
0223デフォルトの名無しさん
2005/10/15(土) 21:42:50つっこみどころが多すぎてつっこめません・・・
0224デフォルトの名無しさん
2005/10/15(土) 23:32:18wchar_tはCでもtypedefで用意されている。そしてC++では組み込み型になっている。
> 列挙変数を enum キーワードを使わずに宣言できる。Cでは必要だった
構造体と共用体も同じくstructとunionが不要になったことが書かれてない。
>if (x < 100)
> double g = sin(x);
>else
> double g = cos(x);
この後でgが使えないのは、ifとelseの中身はそれぞれブロックが作られているからのはず。
forの構文は正しくはfor (宣言文または式文 式 ; 式 ) 文 となる。
今はprotectedはC++固有ではない。JavaとかC#とかみんなC++由来だけど。
>基底クラスと派生クラスの代入
本文の基底と派生を入れ替えると正しくなるw。
続く
0225デフォルトの名無しさん
2005/10/15(土) 23:36:12<iostream.h>は古い。今は<iostream>。stdiostreamは非標準。
strstreamは標準にはあるが非推奨。<sstream>のistreamstream/ostringstreamがある。
iostream_with_assign類も非標準。
多重定義の解決には5番目に可変個引数 ... もある。
まあ、知らずとも大体想像通りに解決されるとでも書けばいい。
そういう目標でC++の多重定義解決の規則は作られた。
volatileはC由来。
ファイル内スコープの意味でのstaticは非推奨、無名名前空間が推奨されている。
使うべきでない機能として挙げるだけでなく理由も書け。
あと、本文中に1度もオブジェクト指向、ポリモーフィズムと言った言葉が出てこないのが異常。
テンプレート、名前空間、例外が全く出てこないのもどうかと。
しかしこれらを直しても所詮は付け焼き刃、根本的にお前自身がC++をよくわかっていないだろ。
0226デフォルトの名無しさん
2005/10/16(日) 03:30:30C++においてもintに昇格したのち演算が適用される
8行目にして間違っている解説はなかなかないが
それに気づかない人たちのなにやら難しいつっこみはいっそう無視してよい
0227デフォルトの名無しさん
2005/10/16(日) 07:51:170228デフォルトの名無しさん
2005/10/16(日) 09:47:43inlineも説明なしで使われている。
0229デフォルトの名無しさん
2005/10/16(日) 11:47:240230デフォルトの名無しさん
2005/10/16(日) 16:46:280231デフォルトの名無しさん
2005/10/16(日) 16:51:410232デフォルトの名無しさん
2005/10/16(日) 17:25:030233217
2005/10/16(日) 17:35:35オブジェクト指向の設計については省いた、
C++についてできるだけ簡素にまとめられたドキュメントありませんか?
できれば言語仕様とオブジェクト指向設計、STLやらライブラリがからむのは
分けてかかれたものがいいんですけど。
皆さんのバイブルを紹介してもらってもいいですけど。
0234デフォルトの名無しさん
2005/10/16(日) 17:37:04ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X
0235デフォルトの名無しさん
2005/10/16(日) 17:37:28JAVA使うならJAVAで使えないC++の仕様とか下手に覚えない方が楽ですよね?
0236233
2005/10/16(日) 17:44:00評価高くてよさそうですが、C++はなにもわからないんでやめときます。
> 個人的には、記述内容の間違いを読みながら補正できる
> 「プロ」レベルの人以外は読むべきではないと思います。
> 少なくともこの翻訳された内容を鵜呑みにするのは問題が多すぎると思います。
0237デフォルトの名無しさん
2005/10/16(日) 17:45:340238デフォルトの名無しさん
2005/10/16(日) 17:45:57じゃあ、これでも読んでろ。
ttp://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=0
0239デフォルトの名無しさん
2005/10/16(日) 18:00:54>>5
> http://www.kuzbass.ru/docs/isocpp/
0240デフォルトの名無しさん
2005/10/16(日) 18:05:070241デフォルトの名無しさん
2005/10/16(日) 18:35:59えーご�_
>>237
>Cを使っていて何故オブジェクト指向がいるのか?と思われる方向けです。
>他言語使いであれば買っても言い内容です。
>内容に若干古く臭さを感じる初級本と言える。
よさげですね。
ていうか憂鬱な・・・は昔から評価高いか。
C++の設計と進化
http://www.asahi-net.or.jp/~YD8S-HMD/others/bookshelf/bookshelf.htm
これなんかよさそうだな。
0242デフォルトの名無しさん
2005/10/16(日) 18:36:45D&EはC++の基礎をある程度知った上で読まないと意味がないかと
0243デフォルトの名無しさん
2005/10/16(日) 18:37:16それは読み物。
0244デフォルトの名無しさん
2005/10/16(日) 18:54:07これは?
ttp://www.seshop.com/detail.asp?pid=3236
0245233
2005/10/16(日) 22:17:40> C言語を勉強した人向けとなっておりますが、全くその通りです。
なるほど。
これも定番ですがよさそうですね。
0246デフォルトの名無しさん
2005/10/17(月) 12:27:09場合、何かいい方法はありますか?
0247デフォルトの名無しさん
2005/10/17(月) 12:40:120248デフォルトの名無しさん
2005/10/17(月) 14:37:071.0/pow(10, N);より高速に計算する方法はどうすればいいのでしょうか。
0249デフォルトの名無しさん
2005/10/17(月) 14:43:52環境によってやり方は違ってくるだろうなあ
0250248
2005/10/17(月) 16:33:18template <typename T, int N>
struct decimal_place {
static const T type = 1/std::pow(10, static_cast<T>(N));
};
template <> struct decimal_place<float, 1> { static const float type = 0.1f; };
template <> struct decimal_place<double, 1> { static const double type = 0.1; };
template <> struct decimal_place<long double, 1> { static const long double type = 0.1L; };
...(以下20まで)
としておいて、
double X = decimal_place<double, 1>::type;
のようにしようと考えてみました。これはウンコでしょうか(´д`)
0251デフォルトの名無しさん
2005/10/17(月) 16:38:49Nが整数で20程度ならテーブル参照がいい気がします
0252デフォルトの名無しさん
2005/10/17(月) 17:51:59何でもいいけどtypeじゃなくてvalueにしとけよ気持ち悪い
0253デフォルトの名無しさん
2005/10/17(月) 18:58:230254デフォルトの名無しさん
2005/10/17(月) 19:00:13既出
0255デフォルトの名無しさん
2005/10/17(月) 19:28:24それってコンパイルしなのでは。
0256255
2005/10/17(月) 19:43:54ttp://www.kuzbass.ru/docs/isocpp/class.html#class.static
0257デフォルトの名無しさん
2005/10/17(月) 21:47:37もういっそのこと
各型での結果をそれぞれ float.csv, double.csv, ldouble.csv にでも保存しといて
const float decimal_place_float[] = {
#include "float.csv"
};
const double decimal_place_doulbe[] = {
#include "double.csv"
};
const long double decimal_place_long_doulbe[] = {
#include "ldouble.csv"
};
とかってしたら?
0258248
2005/10/18(火) 00:34:50gccで-O3オプションをつければ、特殊化した1-20については
アセンブラファイルを見る限りコンパイル時に定数にしてくれるっぽいです。
テーブル参照も試してみます。
csvも面白いアイディアです。thxです。
■ このスレッドは過去ログ倉庫に格納されています