C++相談室 part56
..
446:デフォルトの名無しさん
07/08/23 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry
447:デフォルトの名無しさん
07/08/23 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか
448:デフォルトの名無しさん
07/08/23 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。
449:印字ケータ
07/08/23 14:31:20
バイナリエディタでファイルを開くと
保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、
コレを読込んで、配列に入れると-109と-6となります。
16進数で表示させたいので、変換する方法を教えてください。
お願いします。
450:デフォルトの名無しさん
07/08/23 14:35:18
unsignedにキャストすればいいんじゃね。
451:デフォルトの名無しさん
07/08/23 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6
そのまま16進にすれば同じ
気にしないで突き進め
char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい
452:印字ケータ
07/08/23 14:42:15
>>450
返答ありがとうございます。
早速やってみましたが、変換後に4294967187というデカイ数値になりました。
ちなみに、unsignedの変数にキャストして代入してみました。
もしかして私のやり方が間違ってますか。
453:デフォルトの名無しさん
07/08/23 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。
454:デフォルトの名無しさん
07/08/23 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011
455:デフォルトの名無しさん
07/08/23 15:04:05
char ch = 93;
int n = (unsigned char)ch;
456:デフォルトの名無しさん
07/08/23 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。
457:デフォルトの名無しさん
07/08/23 22:36:57
2005SP1で直ってるっぽいが
458:デフォルトの名無しさん
07/08/30 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?
459:デフォルトの名無しさん
07/08/30 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?
460:デフォルトの名無しさん
07/08/30 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。
461:sage
07/08/30 10:25:41
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます
462:デフォルトの名無しさん
07/08/30 11:47:47
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?
基本はauto_ptr戻しだと思うけど。
463:デフォルトの名無しさん
07/08/30 23:55:27
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。
仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。
で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。
464:デフォルトの名無しさん
07/08/31 00:49:22
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。
最後の場合は「可能性が低い」じゃなくて RVO は不可能。
465:デフォルトの名無しさん
07/08/31 00:52:15
>>464
Named RVOはVC8がやってるらしいですぜ
URLリンク(msdn2.microsoft.com)(vs.80).aspx
466:デフォルトの名無しさん
07/08/31 00:55:03
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?
467:デフォルトの名無しさん
07/08/31 01:09:49
URLリンク(gcc.gnu.org)
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。
468:464
07/08/31 01:23:50
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。
469:デフォルトの名無しさん
07/08/31 01:35:07
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz
470:デフォルトの名無しさん
07/08/31 01:48:21
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?
471:デフォルトの名無しさん
07/08/31 03:13:32
>>469
こんな感じ?
struct A {
template <typename T> T foo(int);
};
void bar() {
A a;
char c = a.foo<char>(0);
short s = a.foo<short>(1);
// ...
}
472:デフォルトの名無しさん
07/08/31 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?
473:デフォルトの名無しさん
07/08/31 15:13:39
f - floor(f)
474:デフォルトの名無しさん
07/08/31 16:14:22
>>472
modf
>>473は負数のとき正しくない
475:デフォルトの名無しさん
07/08/31 17:35:42
f = f - (float)((int)f);
とかじゃ駄目?
476:デフォルトの名無しさん
07/08/31 18:59:33
f > -1 ? f - floor(f) : aaaaaaaaa
477:デフォルトの名無しさん
07/08/31 19:19:41
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。
478:デフォルトの名無しさん
07/08/31 23:01:01
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな
とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ
479:デフォルトの名無しさん
07/08/31 23:31:14
unsigned longにキャストは駄目なのか
480:デフォルトの名無しさん
07/09/01 00:05:17
fmod(f, 1.0)
481:469
07/09/01 00:26:15
>>470,471
レスdクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...
struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};
void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}
もう少し探したらそれらしいのが見つかりました
URLリンク(homepage2.nifty.com)
やりたかったことはこんな感じ↓
URLリンク(anond.hatelabo.jp)
482:デフォルトの名無しさん
07/09/02 00:02:07
vector<char> v;
for (int i=0; i<v.size(); i++)
{
.....
}
というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?
483:デフォルトの名無しさん
07/09/02 00:07:42
うん
警告も消すのが良い作法
484:デフォルトの名無しさん
07/09/02 00:11:18
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。
485:デフォルトの名無しさん
07/09/02 00:12:08
これが規格厨を黙らせる、完璧に正しい方法。
for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )
486:デフォルトの名無しさん
07/09/02 00:16:44
そこでautoとか未来を先走るわけですよ。カモンC++0x
487:デフォルトの名無しさん
07/09/02 00:23:34
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。
こういうことできるの?
decltype( v.size() ) i ;
sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。
なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。
488:デフォルトの名無しさん
07/09/02 00:27:02
さすがにバカ過ぎるだろ
489:486
07/09/02 00:30:15
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)
490:デフォルトの名無しさん
07/09/02 00:40:25
>>483-489
なるほど。さんくすです。
>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。
>> 485
感動しました。
491:デフォルトの名無しさん
07/09/02 01:34:22
何でイテレータ使わないの? >482
i++使う意味も判らん……
492:デフォルトの名無しさん
07/09/02 01:50:17
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ
for (int i = 0; i < v.size(); i++) v[i] = i;
みたいな。
493:デフォルトの名無しさん
07/09/02 01:59:53
>>491
初心者だからだろ。
そのくらいわかれよ。
494:デフォルトの名無しさん
07/09/02 08:40:18
>>487
できるよ。
495:デフォルトの名無しさん
07/09/02 12:06:53
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。
>>492
ブロック内部でローカル変数作れば解決できそうですね。
またひとつ勉強になりました。
ありがとうございます。
496:デフォルトの名無しさん
07/09/02 13:35:18
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。
497:デフォルトの名無しさん
07/09/02 13:47:29
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて
498:デフォルトの名無しさん
07/09/02 13:50:09
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?
499:デフォルトの名無しさん
07/09/02 13:55:44
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。
500:デフォルトの名無しさん
07/09/02 13:57:46
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。
501:デフォルトの名無しさん
07/09/02 14:26:23
list.assign(map.begin(), map.end()) だろ。
502:デフォルトの名無しさん
07/09/02 14:42:28
>>499
っ アダプタパターン
503:デフォルトの名無しさん
07/09/03 01:48:49
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
public:
typedef T hogeT;
struct fuga {
} m_fuga;
}
main()
{
hoger<int> Hoge;
hoger<型>::fuga &Fuga = Hoge.m_fuga;
}
みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。
504:デフォルトの名無しさん
07/09/03 01:53:00
>>503
うん。
何回も書くようなら typedef しとく。
505:デフォルトの名無しさん
07/09/03 02:01:24
>>500-502
ありがとうございます。もう少し勉強してみます。
506:デフォルトの名無しさん
07/09/03 02:03:57
現状だとtemplateに逃げるしかないな。
507:503
07/09/03 13:52:09
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。
こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。
508:デフォルトの名無しさん
07/09/03 14:09:43
ここも将来的には auto で解決するところかな。
509:デフォルトの名無しさん
07/09/03 20:01:18
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>
510:デフォルトの名無しさん
07/09/03 20:10:05
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり
511:デフォルトの名無しさん
07/09/03 20:26:45
いまさら誰がautoなんて使ってるんだ?
512:デフォルトの名無しさん
07/09/03 20:33:24
俺だよワリオだよ
513:デフォルトの名無しさん
07/09/03 22:17:40
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。
514:デフォルトの名無しさん
07/09/03 22:20:45
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。
515:デフォルトの名無しさん
07/09/03 22:21:25
思いっきりかぶりましたとさ。
516:デフォルトの名無しさん
07/09/03 23:35:13
一つのキーワードに複数の意味なんてstaticで経験済みさ
517:デフォルトの名無しさん
07/09/04 04:09:37
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,
518:デフォルトの名無しさん
07/09/04 04:13:24
>>517
マルチしないでさっさとイネ
519:デフォルトの名無しさん
07/09/04 04:26:42
>>517
setlocale
520:デフォルトの名無しさん
07/09/04 05:33:02
>>519
ありがとう。
調べてみる。
521:デフォルトの名無しさん
07/09/04 07:51:20
>>520
死ねカス
522:デフォルトの名無しさん
07/09/05 00:48:40
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る
523:デフォルトの名無しさん
07/09/05 01:04:21
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。
524:デフォルトの名無しさん
07/09/05 02:36:54
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。
525:デフォルトの名無しさん
07/09/05 10:39:58
わっかたああああああああああああああああああああああ
526:デフォルトの名無しさん
07/09/05 11:00:35
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。
527:デフォルトの名無しさん
07/09/05 15:00:58
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);
C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。
528:デフォルトの名無しさん
07/09/05 15:19:45
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?
529:デフォルトの名無しさん
07/09/05 15:25:51
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。
530:デフォルトの名無しさん
07/09/05 15:51:51
止まるってアプリが強制終了するって事か?
531:デフォルトの名無しさん
07/09/05 16:20:55
入力待ちなんだと思うけどな
532:デフォルトの名無しさん
07/09/05 20:33:36
>>530
vectorの実行するところでループしている感じです
>>531
入力のcinの部分は実行されていました
533:デフォルトの名無しさん
07/09/05 20:48:31
>>527
私の環境では動きましたよ。
534:デフォルトの名無しさん
07/09/05 22:48:50
たまにはexportを思い出してあげて下さい……。
535:デフォルトの名無しさん
07/09/05 22:57:19
C++0xスレにお越し下さい
536:デフォルトの名無しさん
07/09/06 12:02:54
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);
…
}
こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。
わかる方宜しくお願いします
537:デフォルトの名無しさん
07/09/06 12:12:44
>>536
>>531
538:デフォルトの名無しさん
07/09/06 12:19:41
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。
539:デフォルトの名無しさん
07/09/06 12:47:03
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ
540:デフォルトの名無しさん
07/09/06 18:03:38
>>537-539
ありがとうございました。
何とか解決しました
541:デフォルトの名無しさん
07/09/06 18:14:10
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。
542:デフォルトの名無しさん
07/09/06 18:22:47
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。
543:デフォルトの名無しさん
07/09/06 18:35:01
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。
544:デフォルトの名無しさん
07/09/06 18:47:54
と自分へメッセージ
545:デフォルトの名無しさん
07/09/06 19:32:13
>>542=544
プログラマとしても人間としても糞以下だね
546:デフォルトの名無しさん
07/09/06 20:11:09
と糞未満のものが申しております
547:デフォルトの名無しさん
07/09/06 20:37:28
真性だな可哀想に
548:デフォルトの名無しさん
07/09/06 20:58:04
ビクンビクン・・・!!
549:デフォルトの名無しさん
07/09/09 23:45:03
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...
550:デフォルトの名無しさん
07/09/09 23:47:30
>>545
あと、自演乙
551:デフォルトの名無しさん
07/09/10 00:19:22
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな
552:デフォルトの名無しさん
07/09/10 00:58:09
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?
553:デフォルトの名無しさん
07/09/10 01:10:26
肯定的な形でreinterpret_castの
554:デフォルトの名無しさん
07/09/10 01:55:41
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。
555:デフォルトの名無しさん
07/09/10 02:02:42
僕の肛門からも悪魔が出そうです><
556:デフォルトの名無しさん
07/09/10 02:03:29
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?
A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.
557:デフォルトの名無しさん
07/09/10 02:04:32
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。
558:デフォルトの名無しさん
07/09/10 02:08:24
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。
559:デフォルトの名無しさん
07/09/10 02:16:34
メンバポインタは
560:デフォルトの名無しさん
07/09/10 02:20:11
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ
561:デフォルトの名無しさん
07/09/10 02:21:32
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?
無名namespace( namespace { げふげふ } )とかじゃダメなの?
562:デフォルトの名無しさん
07/09/10 02:26:30
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。
563:デフォルトの名無しさん
07/09/10 03:40:05
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。
564:デフォルトの名無しさん
07/09/10 07:42:42
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."
でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."
"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?
565:デフォルトの名無しさん
07/09/10 10:43:59
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える
566:デフォルトの名無しさん
07/09/10 10:56:38
>>564
それだ! 凄いわ。ありがとう。
567:デフォルトの名無しさん
07/09/10 11:03:16
人権擁護委員会が在日を擁護する時
URLリンク(www.kajisoku-f-2.com)
URLリンク(www.kajisoku-f-2.com)
568:デフォルトの名無しさん
07/09/11 11:27:29
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。
//using namespace std;
//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);
list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);
しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?
569:デフォルトの名無しさん
07/09/11 12:01:45
実際にどこが遅いのかを特定するところから始めたらどうだ
570:デフォルトの名無しさん
07/09/11 21:41:35
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください
0x00と"\x00"って何が違うんですか?
571:デフォルトの名無しさん
07/09/11 21:44:53
>>570
数値と文字(列)の違い
572:デフォルトの名無しさん
07/09/11 22:01:11
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;
573:デフォルトの名無しさん
07/09/11 22:13:32
文字は整数です。
574:デフォルトの名無しさん
07/09/11 23:16:31
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
575:デフォルトの名無しさん
07/09/12 00:32:31
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。
576:デフォルトの名無しさん
07/09/12 01:03:12
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。
577:デフォルトの名無しさん
07/09/12 03:26:38
"\x00" == { 0x0, 0x0 }
578:デフォルトの名無しさん
07/09/12 03:40:04
ノ| ,ノ|
( 0x0)b
ノ| ,ノ|
(; 0x0)a
579:デフォルトの名無しさん
07/09/12 19:55:32
>>575
int だったり wchar_t だったりもするけど
580:デフォルトの名無しさん
07/09/12 21:41:34
質問よろしいでしょうか?
/* main.cpp */
#inlucde "test.h"
main()
{
int a=1,b=2;
inlinetest(a,b);
}
/* test.h */
inline void inlinetest(int x,int y);
/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}
上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。
581:デフォルトの名無しさん
07/09/12 21:55:52
> inlineの使い方が間違っているのでしょうか
そうです。
582:デフォルトの名無しさん
07/09/12 23:14:20
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?
583:デフォルトの名無しさん
07/09/12 23:20:50
インライン関数は、普通ヘッダに定義を書く。
584:デフォルトの名無しさん
07/09/12 23:24:30
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。
585:580
07/09/12 23:40:58
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。
丁寧な説明ありがとうございます。
586:デフォルトの名無しさん
07/09/12 23:53:53
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。
587:register
07/09/12 23:56:06
おいらのこともたまには思い出してくれないか?
588:デフォルトの名無しさん
07/09/13 00:25:43
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
589:デフォルトの名無しさん
07/09/13 16:50:41
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。
590:,588
07/09/13 21:06:23
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。
591:デフォルトの名無しさん
07/09/13 22:26:55
>>590
いいえ。
592:デフォルトの名無しさん
07/09/13 23:33:35
それはトムです。
593:デフォルトの名無しさん
07/09/13 23:43:15
tomcat
594:デフォルトの名無しさん
07/09/14 00:01:10
わろた
595:デフォルトの名無しさん
07/09/14 00:03:35
べ、別にわろてなんかいません!勘違いしないでください!
596:デフォルトの名無しさん
07/09/14 11:29:42
トムも仏も無い
597:デフォルトの名無しさん
07/09/15 19:56:06
ところで作りかけのソースあっぷしたら虐めてくれますか?
598:デフォルトの名無しさん
07/09/15 21:39:52
うん
599:デフォルトの名無しさん
07/09/17 03:19:16
あるテキストファイルを行の順番を逆にして出力したいんだけど、
スマートなやり方が思いつきません。
今は
vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;
こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?
600:デフォルトの名無しさん
07/09/17 03:29:23
ファイルを分割して読み込む
601:599
07/09/17 03:41:50
>>600
あーなるほど!
それも一つの手ですね!
602:599
07/09/17 04:01:35
>>600
お礼を言い忘れました。
どうもありがとうございました。
603:デフォルトの名無しさん
07/09/17 05:15:30
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。
同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
604:デフォルトの名無しさん
07/09/17 07:14:59
数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。
このスレの範疇からは外れるが。
605:デフォルトの名無しさん
07/09/17 08:23:03
>>604
でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。
普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし
606:デフォルトの名無しさん
07/09/17 09:16:07
つ[tail -r]
607:デフォルトの名無しさん
07/09/17 12:10:29
$ tail -r
tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.
608:デフォルトの名無しさん
07/09/17 13:31:44
つか、テキストファイルを逆順に表示する必要があるのか?
609:デフォルトの名無しさん
07/09/17 13:34:05
実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては
手ごろな内容なんじゃないかな。
610:デフォルトの名無しさん
07/09/17 13:35:00
tail -f /var/log/messages でいいでね?
611:デフォルトの名無しさん
07/09/17 14:05:18
馬鹿はすっこんでろ
612:デフォルトの名無しさん
07/09/17 14:18:17
言語の勉強ならなぜにstd::vectorを使う?
613:デフォルトの名無しさん
07/09/17 14:26:42
C++の勉強ならSTLが適当だろう。C++スレだし
614:デフォルトの名無しさん
07/09/17 14:32:09
勉強が目的なんでしょ?
615:デフォルトの名無しさん
07/09/17 14:35:55
「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ
616:デフォルトの名無しさん
07/09/17 15:17:22
c++の質問じゃないかもしれないけど
0x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが
617:デフォルトの名無しさん
07/09/17 15:27:26
明らかにC++じゃないしプログラムの質問でもないぞ
0x00000F00は10進数の3840だ。
618:デフォルトの名無しさん
07/09/17 15:29:33
.
619:デフォルトの名無しさん
07/09/17 15:31:05
>>616 数値のリテラルを16進数で書きたいときの書き方。
その数値自体の意味までは判らんよ。
620:デフォルトの名無しさん
07/09/17 15:37:41
3840ってことはF00ってことでおk?
621:デフォルトの名無しさん
07/09/17 15:39:47
>>620
何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。
622:デフォルトの名無しさん
07/09/17 15:44:17
>>617
一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。
623:デフォルトの名無しさん
07/09/17 15:50:12
いやー、どこの言語でも0xか\xのプリフィックスが付いたら
16進数だと思うけど。
624:デフォルトの名無しさん
07/09/17 15:56:26
"0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな
625:デフォルトの名無しさん
07/09/17 15:58:36
数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。
626:599
07/09/17 16:00:52
>>603-615
どうも、ありがとうございました。
勉強になります。
学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。
627:デフォルトの名無しさん
07/09/17 16:04:36
>>625
17進数〜36進数という可能性も。
628:デフォルトの名無しさん
07/09/17 16:13:47
1バイト文字コードなら256進数までありうる
629:デフォルトの名無しさん
07/09/17 16:52:10
>>616
死ね
630:デフォルトの名無しさん
07/09/17 16:57:01
そこは気を利かせて
0xDEAD
とか書かないと
631:デフォルトの名無しさん
07/09/17 17:01:14
>>630
0xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…
632:デフォルトの名無しさん
07/09/17 17:29:46
0xDEADBEEF
633:デフォルトの名無しさん
07/09/17 19:23:11
0xBADCAFFE
634:デフォルトの名無しさん
07/09/18 19:51:52
0xBACA
635:デフォルトの名無しさん
07/09/18 19:54:44
0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA
636:デフォルトの名無しさん
07/09/18 20:19:58
どうせなら CPLUSPLUS ってかけよ
637:デフォルトの名無しさん
07/09/18 20:21:27
>>635
C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。
638:デフォルトの名無しさん
07/09/18 20:25:01
>>636
気づかなかったわ
>>637
okそうするよ
639:デフォルトの名無しさん
07/09/18 22:36:41
そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」
というのはかなり納得した。特にC++のはそうだよな。
640:デフォルトの名無しさん
07/09/18 22:40:04
定義なんぞどうでもいい
641:デフォルトの名無しさん
07/09/18 22:43:20
定義?定義じゃネーヨ
概念だろ
642:デフォルトの名無しさん
07/09/19 00:03:17
テンプレート関数にテンプレートクラスを渡したいのですが、可能でしょうか
具体的には
std::list<int> a;
std::list<double> b;
func( a );
func( b );
のようにしたいです
643:642
07/09/19 00:12:49
自己解決しました
644:デフォルトの名無しさん
07/09/19 00:17:08
template <typename T> void func(std::list<T> x)
{
};
こんな感じ?
645:デフォルトの名無しさん
07/09/19 00:17:59
そんなちょっと考えたら解決するようなことをいちいち・・・
646:デフォルトの名無しさん
07/09/19 00:30:38
馬鹿だからなんだぜ?
647:デフォルトの名無しさん
07/09/19 12:05:47
KODE
648:デフォルトの名無しさん
07/09/19 12:15:12
氷結しよっ!
649:デフォルトの名無しさん
07/09/19 12:43:44
>>639
それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・
650:デフォルトの名無しさん
07/09/19 20:34:13
>>649
それは呼び出される側の再利用でなくて?
651:デフォルトの名無しさん
07/09/19 21:28:47
今ポインタの宿題をしていて 数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
652:デフォルトの名無しさん
07/09/19 21:48:45
その質問を訊く身にもなってください。
今流行りのアスペルガーですか?
653:デフォルトの名無しさん
07/09/19 21:48:59
意味がわからんし、C言語スレへ池
654:デフォルトの名無しさん
07/09/19 21:49:31
俺に免じて許してやってくれ。彼は5歳なんだ。
655:デフォルトの名無しさん
07/09/19 21:54:15
俺アスペルガーだけどこんな奴と一緒にしないで欲しい
656:デフォルトの名無しさん
07/09/20 05:03:48
「数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?」
とはどういういみですか?
657:デフォルトの名無しさん
07/09/20 05:09:02
数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
What abhorring is of of display of the value before it executes it by the guy of
exchanging numerical values it?
憎悪が交換数値の奴でそれを実行する前の価値の表示のものであること、それ?
(゚Д゚)?
658:デフォルトの名無しさん
07/09/20 06:20:59
>>651
お前があほという意味じゃ
659:デフォルトの名無しさん
07/09/20 07:09:57
ある仮想関数が、メンバ変数を書き換えないと想定されている場合、constを付けた方がいいんでしょうか?
例えばこんな感じ↓
class A {
public:
virtual int GetX() const = 0;
};
class B : public A {
public:
virtual int GetX() const { return x_; }
private:
int x_;
};
const A*型を使う場面があるのかが気になります。
660:デフォルトの名無しさん
07/09/20 07:20:55
>>659 そうですね。
661:デフォルトの名無しさん
07/09/20 07:31:21
>>659
つけられるconstは全てつけるべき。
非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。
662:659
07/09/20 07:36:33
ありがとうございます。
663:kkptcnZciZ
07/09/20 12:34:39
KOMUgI <a href="URLリンク(vunuddokfscm.com) [url=URLリンク(pliwysnvpdex.com) [link=URLリンク(uquzjkpzhomt.com) URLリンク(hukythasnspn.com)
664:マターリ ◆AbENcvTP5o
07/09/20 14:27:35
いきなりですみませんがこのスレに協力してくれる人を探しています。
スレリンク(entrance2板)l50
665:デフォルトの名無しさん
07/09/20 14:57:12
>>664
マルチすんな。
666:デフォルトの名無しさん
07/09/20 15:16:10
>>650
ん?
プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。
呼び出される方の利用の仕方がまちまちだと、
呼び出す側はいちいちそれに合わせなくてはならないわけだけど、
インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、
呼び出し側を変更せずに機能を追加してゆくことができる。
もちろん呼び出される側を再利用する仕組みでもあるんだけど、
呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。
667:デフォルトの名無しさん
07/09/20 16:37:16
template<class T> class A
{
public:
void (A<T>::*func)();
};
template<class T> class B
{
public:
static void (B<T>::*func)();
};
template<class T> void (B<T>::*B<T>::func)() = NULL;
template<class T, class U> class C
{
public:
void (U::*func)();
};
template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (D<T, U>::*U::func)() = NULL;
クラスDのようにしたいんですけど、どなたかわかる方いませんか?
Visual Studio2005 SP1
668:デフォルトの名無しさん
07/09/20 16:38:31
ちなみにクラスD以外はビルドOKです
669:デフォルトの名無しさん
07/09/20 16:49:48
template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (U::*D<T, U>::func)() = NULL;
こうだろ?
670:デフォルトの名無しさん
07/09/20 17:19:20
うぉ、ビルドとおった〜
ありがとう!!
昨日からずっと考えてたよ。
671:デフォルトの名無しさん
07/09/20 18:48:48
横からごめん
template<class T, class U> void (U::*D<T, U>::func)() = NULL;
ってどういう意味?
672:デフォルトの名無しさん
07/09/20 19:04:46
>>671
単なる、staticなメンバー変数funcの定義だよ。
NULLで初期化してるだけ。
673:デフォルトの名無しさん
07/09/20 19:05:53
void (U::*)() 型のstaticメンバ変数 D<T, U>::func を定義して NULL で初期化している
674:デフォルトの名無しさん
07/09/20 20:44:48
最近某入力デバイス共有ソフトのソースと某モデリングソフトのプラグインサンプルのソースと
見る機会があったんだけど
そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない
javaだったらfinalがついてもおかしくないクラスのメンバで
継承元の仮想関数をオーバーライドしている関数にvirtualがついてた
薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう
暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな?
それともvirtual修飾子の意味をほとんどの人が誤解している?
675:デフォルトの名無しさん
07/09/20 20:51:49
かなり昔から流行ってるよね。
676:デフォルトの名無しさん
07/09/20 20:56:41
C#のvirtual, overrideキーワードを見るよろし
677:デフォルトの名無しさん
07/09/20 20:58:33
>>676
C# なんか存在しない頃から流行ってるよね。
678:デフォルトの名無しさん
07/09/20 21:24:07
別にはやってないだろ
679:デフォルトの名無しさん
07/09/20 21:26:07
文法的にはどっちでもいいんだっけ?
680:デフォルトの名無しさん
07/09/20 21:27:37
多分継承元のクラスから関数宣言コピペして、面倒だからvirtual削除してないだけだろ。
681:デフォルトの名無しさん
07/09/20 21:40:33
virtualつけてもoverrideかどうかは分からない
ということに最近気づいた
682:デフォルトの名無しさん
07/09/20 21:41:32
overrideする側はvirtual要らないんだっけ
俺はいつもコメントにoverrideって書くけど
C#がうらやましいぜ
683:デフォルトの名無しさん
07/09/20 21:53:43
基本クラスがvirtualなら十分でそれ以降は任意だったと思うがドキュメントが出てこない。
継承が深くなるとvirtualかどうか確認するのにいくつもヘッダーファイルを遡ることになるから、
overrideしたところにもvirtualがあるとわかりやすい。
いま基本クラスと書いたが途中からvirtualっていうのもありなんだよな。
#include <iostream>
using namespace std;
class A { public: void Say() { cout << "hello A" << endl; }};
class B : public A { public: virtual void Say() { cout << "hello B" << endl; }};
class C : public B { public: void Say() { cout << "hello C" << endl; }};
int main(){
A *a = new C(); a->Say();
B *b = new C(); b->Say();
return 0;}
結果
hello A
hello C
684:デフォルトの名無しさん
07/09/20 21:59:49
一度virtual付ければ後は無くておk。
俺はドキュメントなんか鼻から探すつもりもありませんがw
685:デフォルトの名無しさん
07/09/20 22:01:01
あ、でもvirtualはいつも付けてる。
理由は>>683と一緒。
686:デフォルトの名無しさん
07/09/20 22:01:12
sealedが欲しい。途中から隠蔽w
687:デフォルトの名無しさん
07/09/20 22:06:18
#define public protected
688:デフォルトの名無しさん
07/09/20 22:26:15
とにかく、C#なんかより前から流行ってるよね。
689:デフォルトの名無しさん
07/09/20 22:35:25
>>686
sealedは継承禁止じゃね?
690:デフォルトの名無しさん
07/09/20 22:36:54
void func(const T& param)
{
T.Hoge();
}
っておかしい?
型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?
691:デフォルトの名無しさん
07/09/20 22:37:32
void func(const T& param)
{
param.Hoge();
}
の間違いでした
692:デフォルトの名無しさん
07/09/20 22:38:24
継承される事を前提に作ってないクラスはデフォルトでsealed(final)
って仕様だとうれしいんだけど
小規模で作ってる分にはいらないけどさ
693:デフォルトの名無しさん
07/09/20 22:42:09
大規模開発なら「派生型を作らないこと」とドキュメントに書けばいいような・・・
オープンソース物みたいにソースがドキュメントって感じのだと、
そういう言語によるディレクティブは役に立つとは思うけど。
694:デフォルトの名無しさん
07/09/20 22:56:14
>>689
メソッドに対するシールド。
class A { public virtual void Say() { .. ; }}
class B : A { public override sealed void Say() { .. ; }}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5382日前に更新/205 KB
担当:undef