■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part36
251 名前:デフォルトの名無しさん :04/10/06 00:50:18
>>246=249
C++にヘッダとソースの区別なんか無いよ。

252 名前:デフォルトの名無しさん :04/10/06 00:52:42
ヘッダを#includeした先でusing namespaceしちゃうから迷惑

253 名前:デフォルトの名無しさん :04/10/06 00:53:01
>>250
なるほど!
たとえば、

usingnamespace std;

Unko::Unko() {



}

Unko::~Unko() {



}

これだと、コンストラクタだけ、usingnamespace std;が有効になるということか。
変な仕様だなぁ。


254 名前:デフォルトの名無しさん :04/10/06 00:54:57
頼むからヘッダファイルで using namespace しないで欲しい

255 名前:デフォルトの名無しさん :04/10/06 00:56:54
>>253
それじゃauto変数と一緒じゃないだろ

256 名前:デフォルトの名無しさん :04/10/06 01:01:03
{
using namespace std;
string hoge0;
}
std::string hoge1
string hoge2; //エラー


257 名前:デフォルトの名無しさん :04/10/06 01:03:42
エラー ;がありません。

258 名前:デフォルトの名無しさん :04/10/06 08:31:25
>>255
↓のように書いた場合は、どこまで有効になるの?

----Hage.cpp-----------
#include <stdio>

using namespace std;

Hage::Hage(){

}

Hage::~Hage(){

}

-------------------------



259 名前:デフォルトの名無しさん :04/10/06 08:40:51
>>255,>>253 ネタニマジレスイラネ

260 名前:デフォルトの名無しさん :04/10/06 10:04:23
>>257
ワラタ

261 名前:デフォルトの名無しさん :04/10/06 10:04:49
>>258
> #include <stdio>

そんなヘッダはない。


262 名前:デフォルトの名無しさん :04/10/06 10:45:26
class Date
{
protected:
static int year;
}

class DateDifference:public Date
{
public:
void getYear() {

do
{
cout<<"Enter a year between 1800 and 7000:";
cin>>year;
}while(year >= 1800 && year <= 7000);

}
という風にやりたいのですが、yearがDateDifferenceのほうで使えないのですが
どうすれば使えるようになるでしょうか?初心者なのでよくわからないのです。
教えてください。よろしくお願いします。



263 名前:デフォルトの名無しさん :04/10/06 11:03:43
>>262
int Date::year;

264 名前:デフォルトの名無しさん :04/10/06 11:08:38
>>262
Date::yearが定義されてないに10000ホゲー

265 名前:デフォルトの名無しさん :04/10/06 11:09:53
>>int Date::year;
262さんありがとうございます。これをどこに書けばいいのでしょうか?
わからなくてごめんなさい。。

266 名前:デフォルトの名無しさん :04/10/06 11:34:53
>>265
自分に礼を言ってどうする?
という突っ込みはさておき。

class Dateの定義の下にでも追加しときな。

あと、君にふさわしいのはこちら。
【初心者歓迎】C/C++室 Ver.9【環境依存OK】
ttp://pc5.2ch.net/test/read.cgi/tech/1094494997/l50

267 名前:デフォルトの名無しさん :04/10/06 12:05:28
#include <iostream>
#include <string>
using namespace std;
class A{
private:
int x, y;
public:
A(int a, int b){x = a; y = b;}
friend ostream& operator<<(ostream& stream, A& a);
friend istream& operator>>(istream& stream, A& a);
};
ostream& operator<<(ostream& stream, A& a){
stream << a.x << " : " << a.y << endl;
return stream;
}
istream& operator>>(istream& stream, A& a){
cout << "座標入力 => "; stream >> a.x >> a.y;
return stream;
}
int main(){
A a(10, 20), b(30, 40);
cout << a << b; cin >> a; cout << a;
    return 0;
}
このプログラムを実行すると、
cpp(16) : error C2248: 'x' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'x' の宣言を確認してください。
cpp(16) : error C2248: 'y' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'y' の宣言を確認してください。
cpp(23) : error C2248: 'x' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'x' の宣言を確認してください。
cpp(23) : error C2248: 'y' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'y' の宣言を確認してください。
cpp(31) : error C2593: 'operator <<' があいまいです。 cpp(32) : error C2593: 'operator >>' があいまいです。 cpp(33) : error C2593: 'operator <<' があいまいです。
というエラーが出ます。本に書いてある通りに書いたんですが、なぜなのかわかりません。
どうしたら、ちゃんとできるのか教えてもらえないでしょうか?

268 名前:デフォルトの名無しさん :04/10/06 12:23:29
>>267
特に問題なさそうだが?
ちなみに gcc, bcc55, VC7 では通ったぞ。
インライン定義(friend 宣言に関数の内容も一緒に書く)してもダメか?


269 名前:デフォルトの名無しさん :04/10/06 12:24:50
コンパイラが悪いのでは?

270 名前:デフォルトの名無しさん :04/10/06 12:25:55
>>267
VC はサービスパック必ずあてとけ
只でさえバグ(珍妙な仕様も含む)だらけだが、少しはマシになる

271 名前:デフォルトの名無しさん :04/10/06 12:35:14
いい加減VC6は(r

272 名前:デフォルトの名無しさん :04/10/06 12:42:26
C使いならVC6でもいいかもC++使うんならVC6じゃ話になんね

273 名前:デフォルトの名無しさん :04/10/06 12:44:46
operator <<, >>の定義が別ファイルにあってヘッダを読んでないとかじゃないの?

274 名前:デフォルトの名無しさん :04/10/06 12:47:43
ISO C++が策定されたの98年だっけ?
VC6もたしか98年だから対応して無くて当然だと思われ。
さっさと.NET2003に乗り換えれ。良いぞ。boostもLokiも動く。
コンパイラだけならただなんだろ?

275 名前:デフォルトの名無しさん :04/10/06 13:09:11
時代考証については >>274 が言っているのが正しい
VC6 は今でも思いっきり現役で、他に選択肢がなく ISO と違うと嘆いても始まらない場面が少なくない

276 名前:デフォルトの名無しさん :04/10/06 13:10:41
VC6軽いんだよ…

277 名前:デフォルトの名無しさん :04/10/06 13:27:45
VC6はC++ではない、と割り切って使えば構いません。
でも、C++スレで質問しないでね。

278 名前:デフォルトの名無しさん :04/10/06 13:44:42
>>277
__closureだの__propertyだのが大量に入ってるBCBのコードはどうしましょう

279 名前:デフォルトの名無しさん :04/10/06 13:47:40
窓から投げ捨てろ

280 名前:デフォルトの名無しさん :04/10/06 13:47:44
>>278
奴は構文がC++に似ているDelphiの一種だと思え。

281 名前:デフォルトの名無しさん :04/10/06 14:21:35
潔癖性が多いな

282 名前:デフォルトの名無しさん :04/10/06 15:20:09
>>277
まだ ISO が定義する「C++」は出荷されていないはず
VC6 は ARM C++ と理解すればいい

283 名前:デフォルトの名無しさん :04/10/06 16:49:46
>237 :デフォルトの名無しさん :04/10/05 14:44:36
> 特許ってうざいよね。
> アイデアを特許にする人たちは俺から見たらお気楽だけど。
> 実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
> なさなくなるんだからやってらんないのでわ。
> ま〜勝手にアイデアを使われて怒るのは分るけど
> だからといって、訴訟を起こしての損害賠償が高すぎ。
> 今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
> もしかしてガイシュツだったりする。

特許を誤解しているよ。特許ってのは役人と大企業のためにある。
そして損害賠償請求をする為に取得するんだ。


284 名前:デフォルトの名無しさん :04/10/06 18:12:54
C++で書かれたゲーム(出来ればSTG)のソースコードを公開されているゲームを探してるんだけど
もし知ってるのがあれば教えてくださいな

285 名前:284 :04/10/06 18:15:41
追記、3Dのゲームでお願いします

286 名前:デフォルトの名無しさん :04/10/06 18:30:21
cubeじゃダメかね?
http://www.cubeengine.com/

287 名前:284 :04/10/06 18:38:35
サンクス!英語が辛いけど、読んでみまっす
あとこれの置き場所を見てsourceforgeから探すことを思いつきましたですYo

288 名前:デフォルトの名無しさん :04/10/06 19:27:49
classや構造体の、メンバへのアクセスは遅いので、
ループの際はなるべく一時変数に取った方が良いそうですが、
これはやっぱり階層が深まるほど遅いのでしょうか。

A: temp = class->child->grandchild->great-grandchild->data;
B: temp = class->data;

それともAとBは、内部的には同じ速さになったりするのでしょうか。

289 名前:デフォルトの名無しさん :04/10/06 19:30:45
>>288
君が気にしなきゃならないほど遅くないからほっといていいよ。

290 名前:デフォルトの名無しさん :04/10/06 19:34:14
>>289
生成物の実行速度はほとんど変わらないが、
開発チームの保守速度は確実に低下する。

291 名前:デフォルトの名無しさん :04/10/06 19:40:28
>>288
計ってみましょうよ.
VC++だったらこのスレの上にrdtscを貼ってくれたひとがいるし,(型は__int64でいいの?)
Linuxだったら
#include <asm/msr.h>
にrdtscはある.


292 名前:デフォルトの名無しさん :04/10/06 19:46:56
間違えやすいし見にくいし横に長くなって鬱陶しいから保存しろ

293 名前:デフォルトの名無しさん :04/10/06 19:47:38
>>290
そんなこと聞いていない

294 名前:デフォルトの名無しさん :04/10/06 19:55:08
以下の関数は0~15のintをcharの0~9,A~Fにして出力させようとしたのですよ。
inttochar16(int)にint型の0~15を入れた場合はちゃんとcharの0~9,A~Fが返ってくるのですが
ポインタで回そうとすると失敗します。ボスケテ。

#include <iostream.h>
char inttochar16(int i,int intDefault){//intの0~15をcharの0~9,A~Fに変換します。
if((i<10)&&(i>-1)){
return i+48;
}else if((i<16)&&(i>9)){
return i+55;
}else{
return intDefault;
}
}//END inttochar16

int main(void){
int i[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *pi;
pi = &i[0];
while(*pi){
cout << inttochar16(*pi,36) << "\n";
pi++;
}
return 0;
}

295 名前:デフォルトの名無しさん :04/10/06 20:00:23
お前らは、プロもしくはノンプロのプログラマであって、断じてパスタ職人ではないはずだ。
誰ですか、スパゲッティコードを奨励している人は?

296 名前:288 :04/10/06 20:00:49
レスありがとうございます。
分かりやすくしようと、ちょっと大げさに書きすぎたかなw
実際はイテレータによるアクセス程度です

>>291
簡単なテストコードだと、吐いたアセンブラを見る限りどちらも
全く差は無いのですが、私が思いつかないような条件が重なったりすると
どうなのかなぁ…と思い質問お願いした次第なんです。

やっぱり皆さんのレスみても、まるっきり同じって感じでは無いですね。>ほとんど、〜ほど

297 名前:デフォルトの名無しさん :04/10/06 20:13:00
負の数に%を適用した結果ってどうなるんですか?不定?

298 名前:デフォルトの名無しさん :04/10/06 20:17:08
>>294
どう失敗したのか書けよ。
あとint配列の最後に0が入っているとは限らない。

299 名前:デフォルトの名無しさん :04/10/06 20:18:43
>>289 >>290
わずかでも遅くなるのか?

300 名前:デフォルトの名無しさん :04/10/06 20:20:28
>>298
つーか最初のループ条件で偽になるな、これ。

301 名前:294 :04/10/06 20:26:23
>298 最初に0が入ってるからループに入らないだけでした。Thx。

で、別な疑問が沸いたのですが、
int i[不定の自然数];
int *p;
p = &i[0]
で、iの終わりまで処理を行いたい場合、
whileループで回すにはどうすればいいでしょ。
while(*p == null){だとnullなんて知らんと怒られます。

302 名前:デフォルトの名無しさん :04/10/06 20:29:32
>>301
頼むから、あてずっぽうでコード書くな。
なんか知らんけど動いたからいいやっつー新人が一番手に負えない・・・。
while( *p == null )
pの指してる先の値が null?
いつ終端に null なんか入れた?
つーかそもそも null 定義して無いだろ?

303 名前:302 :04/10/06 20:30:20
つーかそれだと *p が null の間繰り返すだろ。

304 名前:294,301 :04/10/06 20:31:00
>302,303
少し頭冷やしてきます....すいません。

305 名前:デフォルトの名無しさん :04/10/06 22:05:30
>>301
#include <iostream>
#define ARRAYNUM(a) (sizeof (a) / sizeof (a)[1])
using namespace std;
int main(void) {
  int i[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  int *pi;
  pi = &i[0];
  while (++pi != i + ARRAYNUM(i)) {
    cout << inttochar16(*pi, 36) << "\n";
  }
  return 0;
}

306 名前:デフォルトの名無しさん :04/10/06 23:01:01
>>301
ARRAYNUM っていうマクロにするかどうかは別として、個数の定まった
配列に対してsizeof(T) / sizeof(T[0]) で個数を得るのはC / C++のイディオムの一つ。

307 名前:デフォルトの名無しさん :04/10/06 23:18:04
C++ではマクロでなくテンプレートだな
template <typename T> int arraynum( const T& t ){ return sizeof( t ) / sizeof( t[ 0 ] ); }

308 名前:デフォルトの名無しさん :04/10/06 23:27:18
template< typename T, size_t N > size_t arraynum( T (&)[N] ){ return N; }

だろ。


309 名前:デフォルトの名無しさん :04/10/06 23:43:14
template <typename T, std::size_t N> std::size_t arraynum( T (&)[N] ){ return N; }


310 名前:デフォルトの名無しさん :04/10/06 23:44:37
template <typename T, std::size_t N> inline std::size_t arraynum( T (&)[N] ){ return N; }
つかそもそも std::size_t でいいの?unsigned int じゃダメ?

311 名前:デフォルトの名無しさん :04/10/06 23:45:45
やっぱり気が狂ったようなところのある言語だな

312 名前:デフォルトの名無しさん :04/10/06 23:51:12
カットオペレータを追加すれば、そのまま Prolog になりそうだよね。

313 名前:デフォルトの名無しさん :04/10/07 00:17:09
俺は配列の要素数を求める式を見た時はふ〜ん、こんなこと出来るんだ。
ふつうにテンプレートってすごいなって具合に感動したけど、
char (&test(...))[2];
この式を見た時はマジC++に感動した。

314 名前:デフォルトの名無しさん :04/10/07 00:18:40
普通の人間なら typedef なりして見やすくしろと思うだろうけどな

315 名前:デフォルトの名無しさん :04/10/07 00:34:26
>301
sizeofで配列のサイズを測るか
その部分を関数化して、関数の引数に何文字操作するかをしてるするのかが普通。
まずは、配列と文字列の区別をしっかりした方がいいと思う。

あと>294のソースは
return i+48;
}else if((i<16)&&(i>9)){
return i+55;
この辺りは、頼むから、'0'や'A'って書いてくれ。

316 名前:デフォルトの名無しさん :04/10/07 01:37:13
>>288
階層が深まるほど評価に必要な命令数は当然増える。
でも、階層に比例して処理時間が増大するかどうかは
最適化に依存するので実測しないとわからない。

ループ前に一時変数に取っておくようにソースを書いておけば、
ほとんどの場合で無視できる差に抑えることができる。

317 名前:デフォルトの名無しさん :04/10/07 02:51:06
DLLで作ったクラスを、exe側で継承した場合、何か問題出る?

dll

EXPORT class DllClass{
・・
};
-----------------------

exe側
class ExeClass : public DllClass{
・・
}

exe側で派生クラスを使用
ExeClass *pExeClass = new ExeClass ;
delete pExeClass ;

問題なかったとしても、DLL変更したら、exe側もリビルド必要?
DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・


318 名前:デフォルトの名無しさん :04/10/07 02:56:44
>>317
> DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・

これが問題。わかってんじゃん。

319 名前:デフォルトの名無しさん :04/10/07 11:52:42
Cで構造体の中に構造体をいれてつかってんだけど
C+でクラスにしたいときってクラスの中のクラスってできる?

320 名前:デフォルトの名無しさん :04/10/07 11:54:25
出来るにょ

321 名前:デフォルトの名無しさん :04/10/07 11:55:40
1にょっき

322 名前:デフォルトの名無しさん :04/10/07 12:25:18
>>319
やってみてから聞けよ。

323 名前:デフォルトの名無しさん :04/10/07 12:27:33
http://pc5.2ch.net/test/read.cgi/tech/1094494997/811
こっちでも馬鹿な質問してるな。

324 名前:デフォルトの名無しさん :04/10/07 15:30:46
包含っていう。

325 名前:デフォルトの名無しさん :04/10/07 19:33:47
>>324
睾丸!?なんていやらしいお名前。

326 名前:悩める初心者 :04/10/07 21:23:58
g++とC++言語の話だけど、、、

strcmpとかの標準提供関数を、自前でC言語で実装して、ライブラリ作りました。

C言語で、strcmpを呼び出すプログラムかいて、gccでコンパイル、リンク
するとOKだけど、

C++でstrcmp呼び出すプログラム書いて、それをg++でコンパイル、リンクすると
NGがでちゃいます。なんかうまくリンクできる方法ってないですか?g++のバグかな?

なお、staticにしないとコンパイルは通ったんだけど、要件上staticじゃないと
だめなんです。

g++ -L/home/hoge/lib hello.cpp -o HELLO -lmylib -static
/lib/libc.a(strcmp.o)(.text+0x0): In function `strcmp':
multiple definition of `strcmp'
/home/hoge/lib/libmylib.a(strcmp.o)(.text+0x0): first defined here
collect2: ld returned 1 exit status


OS:RedHat
compiler:GCC
Lang:C++

327 名前:デフォルトの名無しさん :04/10/07 21:35:21
コアチームに入るしかないな。

328 名前:デフォルトの名無しさん :04/10/07 21:42:17
-z muldefs でりんくできないかなーー。
でも、どっちのstrcmpが使われるのかシラン。


329 名前:デフォルトの名無しさん :04/10/07 21:49:41
いや、これはコアになれという要件だよ。
間違っても namespace で逃げたりしちゃだめなんだよ

330 名前:デフォルトの名無しさん :04/10/07 21:50:42
>>326
free-standing environment に移植可能なコードを書こうとしているのか?

331 名前:デフォルトの名無しさん :04/10/07 21:54:33
// a.h ////////////////////
#include "b.h"

class A { void func(B b); };

// b.h ////////////////////
#include "c.h"

class B{ C *pc; };

// c.h ///////////////////
#include "d.h"

class C{ D d; };

// d.h //////////////////
#include "a.h"

class D : public A { ・・・ };

このように4つのファイルでインクルードのループができたような
状態のプログラムがあるのですが、コンパイルすると
d.hで 定義されていない基底クラスAが使われています。
みたいなエラーが出るのですが、原因がわかりません。

前方参照とかの関係かとおもったので、d.h のDクラスを定義する前に
class A; という行を追加してみてもエラーが消えません。
さらに c.h で class D; b.hで class C; a.hで class B; という
前方宣言をそれぞれいくら追加したり消したりしても直りません。
b.h の C *pC; と #include "c.h" をコメントアウトするとエラーがなくなります
が、それでは考えている動作をさせることができません。
どうすれば解決できるかわかる方がいましたら教えていただけないでしょうか。

332 名前:デフォルトの名無しさん :04/10/07 22:01:24
>>331
ありがちなパターンで、ヘッダの最後を改行してないってオチとか・・・

333 名前:デフォルトの名無しさん :04/10/07 22:01:51
>>331
根本的に設計見直せ。

と、それだけだとなんだから一応。
b.hの#include "c.h"を消して代わりにclass C;と書く。

334 名前:デフォルトの名無しさん :04/10/07 22:05:16
ここでpimpleイディオムですよ

335 名前:デフォルトの名無しさん :04/10/07 22:06:10
pimpl ダタorz

336 名前:デフォルトの名無しさん :04/10/07 22:11:24
>328
試してみます。

>330
ちょっとはしょってかきましたけど、組み込み向けCPUのバイナリ作ってるんです。
卒研である機器の制御用のプログラム書いてます。機器側にはライブラリ持ってないんで、staticなバイナリの生成が必要です。

337 名前:326=336=悩める初心者 :04/10/07 22:12:50
です。m(_ _)m

338 名前:デフォルトの名無しさん :04/10/07 22:13:55
てかそもそもここはgccに限定したスレじゃないのでスレ違い。
答えてる香具師も一緒にgccスレ逝け

339 名前:超絶Rubyhakka− :04/10/07 22:15:07
ハァ?

340 名前:デフォルトの名無しさん :04/10/07 22:18:29
>>339
ハァ?

341 名前:デフォルトの名無しさん :04/10/07 22:24:17
#include <iostream>
using namespace std;

int main(){
try{
throw "nullpo!";
}
catch(char *e){ cout << "GA!" << e << endl;}
return 0;
}

なぜか文字列をcatchできないんですが、なぜでしょうか?
Cygwinのgcc3.3.1です。

342 名前:デフォルトの名無しさん :04/10/07 22:25:06
Linux+sh3=Shnux

343 名前:デフォルトの名無しさん :04/10/07 22:28:26
>>341
gccのバグ

344 名前:デフォルトの名無しさん :04/10/07 22:28:37
C++の文字列リテラルは const char[N]型

345 名前:デフォルトの名無しさん :04/10/07 22:34:04
暗黙に const_cast がかかる特殊なケース

346 名前:デフォルトの名無しさん :04/10/07 22:37:14
>>331

//#include "b.h"

template <typename B>
class A { void func(B b); };


347 名前:デフォルトの名無しさん :04/10/07 22:42:47
>>341>>345
それがなぜかVC++ならcatchできるんです

348 名前:デフォルトの名無しさん :04/10/07 22:45:30
>>347
char*ではcatch出来ないのが正しい。const char*ではcatchできる。
ISO/IEC 14882:1998 15.1.3
The temporary object created for a throwexpression that is
a string literal is never of type char* or wchar_t*;that is,
the special conversions for string literals from the types
“array of const char” and “array ofconst wchar_t” to the types
“pointer to char” and “pointer to wchar_t”, respectively,
are never applied to a throwexpression.

349 名前:デフォルトの名無しさん :04/10/07 22:51:54
>>347
VC6とか言ったら死刑

350 名前:デフォルトの名無しさん :04/10/07 22:53:32
>>348
英語本当に読んだ?

351 名前:デフォルトの名無しさん :04/10/07 22:53:35
>>349
vc7.1でも死刑?ガクガクブルブル。

352 名前:デフォルトの名無しさん :04/10/07 22:56:04
>>350
「const char[N]→char*の変換は、throwに対しては適用されない。」
ということでしょ?

353 名前:悩める初心者 :04/10/07 22:57:00
328さん、

-z muldefsでやってみたら、コンパイル通過しました!
リンクの詳細しらべてみましたけど、ちゃんと自前の関数読んでるようです。
ほんとありがとうございます。

#まだまだ勉強不足ですね。。。

354 名前:デフォルトの名無しさん :04/10/07 23:14:14
試しに
catch(char *e){ cout << "GA!" << e << endl;}
catch(const char *e){ cout << "ga!" << e << endl;}
としてみると、
VC++では "GA!nullpo!"
GCCでは"ga!nullpo!"
となってしまう

355 名前:デフォルトの名無しさん :04/10/07 23:21:43
catch(const char *e){ cout << "ga!" << e << endl;}
catch(char *e){ cout << "GA!" << e << endl;}

とやったらVC++でも"ga!nullpo!"と吐くんだろうか

356 名前:デフォルトの名無しさん :04/10/07 23:24:28
だから規格の>>348を読めって。
『char*ではcatch出来ないのが正しい。const char*ではcatchできる。』
だからこの場合VC++は間違い。GCCが正しい。
Microsoftの中の人自体が誤って理解してるんじゃないのか?
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep061799.asp

357 名前:デフォルトの名無しさん :04/10/07 23:25:02
>>355
今度はコンパイルできなくなった
test.cc(9) : error C2312: 'char *' : is caught by 'const char *' on line 8


358 名前:357 :04/10/07 23:26:34

バージョンによる。

359 名前:デフォルトの名無しさん :04/10/07 23:27:09
2005 でも
error C2312: 'char *' : is caught by 'const char *'

360 名前:デフォルトの名無しさん :04/10/07 23:28:03
VC++ Toolkit 2003
error C2312: 'char *' : is caught by 'const char *' on line 10
やっぱりコンパイラを作るときにMicrosoftが規格を勘違いしてる。

361 名前:デフォルトの名無しさん :04/10/07 23:30:16
>>359
やられた。
つーか、発揮し言ってどうでもいい問題なんだけど。

362 名前:デフォルトの名無しさん :04/10/07 23:33:52
bccだと順b

あ、誰も聞いてない

363 名前:デフォルトの名無しさん :04/10/07 23:33:58
>>361
だな

364 名前:デフォルトの名無しさん :04/10/07 23:34:54
>>362
その先を知りたい。もしかして順番によって結果が変わる?

365 名前:デフォルトの名無しさん :04/10/07 23:35:43
>>361,363
よくないだろう、正しいはずのコードがコンパイルすらされないんだから。

366 名前:デフォルトの名無しさん :04/10/07 23:37:05
>>365
キチガイだね

367 名前:デフォルトの名無しさん :04/10/07 23:38:25
いや、char*がconst char*に先に捕まるのは当然だし、
コンパイルすらされないのはエラーレベルの設定の話でしょう。

368 名前:デフォルトの名無しさん :04/10/07 23:38:41
>>365
そもそも正しいはずのコードとはなんですか?

369 名前:デフォルトの名無しさん :04/10/07 23:45:26
お?なんか哲学的になってきたね

370 名前:デフォルトの名無しさん :04/10/07 23:50:23
char* p;
p = "literal";

こいつにVC++7.1もg++も文句言ってくれません。
仕様的には>>344なんですか?

371 名前:デフォルトの名無しさん :04/10/07 23:54:51
>>370
あまりに多くなされる書き方なので文句を言わないようになってる

372 名前:デフォルトの名無しさん :04/10/07 23:57:33
>>370
ISO/IEC 14882:1998 4.2 Array-to-pointer conversion -2による。

373 名前:デフォルトの名無しさん :04/10/08 00:03:32
#include <iostream>
int main(){
try{
throw "nullpo!";
}
catch(const char *e)
{
std::cout << "ga!" << e << std::endl;
}
return 0;
}
これならVC++は文句言わずにコンパイルするが…
char*をconst char*に変換してるだけなのではないか…

374 名前:デフォルトの名無しさん :04/10/08 00:03:59
>>366
365 は間違ったことを言っていないぞ?
例外が捕獲できるかどうかは、翻訳ではなく実行の問題。

375 名前:デフォルトの名無しさん :04/10/08 00:04:41
オプションでいいからエラーにしてほしいな・・・。
どっちにしろそんなコードまともに動かないし。

376 名前:デフォルトの名無しさん :04/10/08 00:08:47
>>374
残念ながら、確実な未来というのはあるのだよ。

377 名前:デフォルトの名無しさん :04/10/08 00:18:15
規格的にどうかはともかく、
>>370が規格的に正しいのなら、
>>354はVC++のほうが自然に感じる。
困った規格だ。

378 名前:デフォルトの名無しさん :04/10/08 00:20:15
禿はノーセンスだからね

379 名前:デフォルトの名無しさん :04/10/08 00:20:59
>>376
基準が明確化されていない洞察をしてはならないのが基本。
コピーコンストラクタが排除できても private ならはじくように。

380 名前:331 :04/10/08 00:23:01
>>333>>346
非常に参考になります
ありがとうございました

381 名前:デフォルトの名無しさん :04/10/08 00:25:55
catch(const char*)にchar*が捕まるのって明確化されてないの?

382 名前:デフォルトの名無しさん :04/10/08 00:55:57
>>377
>>370は規格的に正しくないよ

383 名前:デフォルトの名無しさん :04/10/08 00:57:53
>>382
「文字列リテラルはchar*に代入できる。」
プログラミング言語C++第3版 5.2.2より

384 名前:デフォルトの名無しさん :04/10/08 00:58:40
>>383
マジすか…
失礼しました

385 名前:デフォルトの名無しさん :04/10/08 01:11:13
文字列定数に書き込めたとしても、strchrで番兵法を使う
ときぐらいしかメリットが感じられなかった。バグ出しやすいし。
実用上は必ずコンパイルオプションで書き込めなくしてしまう。


386 名前:デフォルトの名無しさん :04/10/08 01:13:13
>>385
「文字列リテラルはchar*に代入できる。…(中略)…しかし、
このようなポインタを介して文字列リテラルを変更しようと
すると、エラーになる。」
プログラミング言語C++第3版 5.2.2より

387 名前:デフォルトの名無しさん :04/10/08 01:19:30
>>386
禿本いい加減だなw

388 名前:デフォルトの名無しさん :04/10/08 01:20:15
いや、厳密さは求めていないが・・・

389 名前:デフォルトの名無しさん :04/10/08 01:22:53
いや、Cとの互換を保つため…

390 名前:デフォルトの名無しさん :04/10/08 01:27:10
>>387
ISO/IEC 14882:1998 2.13.4 String literals -2
"The effect of attempting to modify a string literal is undefined."

391 名前:デフォルトの名無しさん :04/10/08 01:32:25
>>390
>undefined

392 名前:デフォルトの名無しさん :04/10/08 01:36:04
>>380
>d.hで 定義されていない基底クラスAが使われています。
だってこのままじゃAがどういう型か判らないもん。c.hでストップかけてんじゃん。
だから、
// c.h ///////////////////
class D;
class C{ D* d; };
にすればいいだけなのでは?
まっ。見てねーんだろーけど。

393 名前:超絶Rubyhakka− :04/10/08 01:37:51
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

394 名前:デフォルトの名無しさん :04/10/08 02:06:38
>>392
>>346

395 名前:デフォルトの名無しさん :04/10/08 02:08:36
class Base1 { protected : int x; };
class Base2 { protected : int x; };
class Foo {
  public:
  Foo(int x) : x(x);
}
曖昧だって言われた。(涙
不可能なのか・・。


396 名前:デフォルトの名無しさん :04/10/08 02:09:13
>>395
Base? にコンストラクタがない以上(ry

397 名前:デフォルトの名無しさん :04/10/08 02:14:44
>>395
>>396の前にFooにメンバー変数xがない。以上。

398 名前:デフォルトの名無しさん :04/10/08 02:18:35
>>397
それを言うなら曖昧(ry

399 名前:デフォルトの名無しさん :04/10/08 02:33:56
>>395
貴方は何かにつけて過剰な省略をする傾向が強いようですね。たとえば本を読むときに一度の何十ページもめくってみたり、
タバコを吸うとき一度に5本ぐらいくわえていたり、お好み焼きにはキャベツしか入れなかったり、食事のとき箸を一本しか持たなかったり、
してしまうタイプではないでしょうか?表現に不十分な部分がないか、チェックお願いします。

400 名前:395 :04/10/08 02:52:51
>>397
確かにそうでした。書き直します。

class Base1 { protected : int x; };
class Base2 { protected : int x; };
class Foo ; public Base1, Base2 {
  public:
  Foo(int x) : x(x);
}

で、これが曖昧だってのは、納得。
2つの派生元クラスの、それぞれの x を初期化する方法としては、
各派生元クラス (Base1, Base2) に、自クラスのメンバ x を初期化するコンストラクタをそれぞれ用意して、
それら2つのコンストラクタを Foo のコンストラクタから呼んでやる、ってことね。


401 名前:デフォルトの名無しさん :04/10/08 03:05:43
派生元のクラスがひとつでも同じ結果かと思うんですが…

402 名前:デフォルトの名無しさん :04/10/08 03:08:03
全角空白はいいとしても、スペルミスでエラーが出るソースを張るなよ
class Foo : public Base1, Base2 {
  public:
  Foo(int x) : x(x){};
};
そもそも曖昧以前に、基底クラスのメンバを直接初期化できん。

403 名前:デフォルトの名無しさん :04/10/08 03:08:20
-class Foo ; public Base1, Base2 {
+class Foo : public Base1, Base2 {

-Foo(int x) : x(x);
+Foo(int x) : x(x){}

全角もウザイ

404 名前:デフォルトの名無しさん :04/10/08 03:09:57
-class Foo : public Base1, Base2 {
+class Foo : public Base1, /*private*/ Base2 {


405 名前:デフォルトの名無しさん :04/10/08 03:11:59
>>400
最後のセミコロン忘れてるし・・・

406 名前:デフォルトの名無しさん :04/10/08 03:22:14
>>400
要するにダメダメ。

407 名前:デフォルトの名無しさん :04/10/08 12:28:37
全角はしょうがないだろ
この程度のちゃちなコードなら、実行よりパッと見の可読性重視でOK

2chブラウザ全盛の昨今、&nbsp;とかも厳しいのが多いしなぁ
ちと試してみるか…

    Hoge* p_hoge = new Hoge;

408 名前:407 :04/10/08 12:29:42
うん、やっぱりコピペするとついて来ちゃうな…

409 名前:デフォルトの名無しさん :04/10/08 14:28:01
質問させていただきます。
たびたび関数ポインタテーブルを使って処理してきたのですが、今度
クラスのメソッドでやろうと思ってプログラムを書いてみたのですが、

'int (__thiscall クラス名::*)(void)' から 'int (__cdecl *)(void)' に変換することはできません

とエラーがでてしまい、ダメなようです。
メソッドポインタでGoogleするとC++について語ってるところがさっぱり見当たりませんでした。
C++ではメソッドポインタを取得し、利用することはできないのでしょうか?

410 名前:デフォルトの名無しさん :04/10/08 14:33:16
まともな本読めばメンバ関数ポインタの使い方ぐらい載ってる。

411 名前:デフォルトの名無しさん :04/10/08 14:39:38
あ、なるほど。
メソッドではなくメンバ関数と呼ぶのですね。
メンバ関数ポインタでぐぐったら、色々出たのでがんばれそうです。
ありがとうございました^^

412 名前:デフォルトの名無しさん :04/10/10 15:15:22
regexって何の略?

413 名前:デフォルトの名無しさん :04/10/10 15:19:30
regular expression トカ

414 名前:デフォルトの名無しさん :04/10/10 19:06:11
以下のプログラムで、コンソールにwcoutで表示したい文字が表示されません。
stringとcoutを使ったら表示されるのですが・・・
何が悪いのでしょうか・・・・・・・・・・・・・・・・


#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

#include <conio.h>

int main(int argc, char* argv[])
{

wstring wstr;
wstr = L"こんにちわ世界!";
wcout << wstr << endl;

getch();

return 0;
}



415 名前:デフォルトの名無しさん :04/10/10 19:08:42
ロケールあってる?
あともしVC6だったら標準ライブラリがバグってるからまともに使えないよ。(.NETは未確認)

416 名前:>>414 :04/10/10 19:22:07
>>415
ΩΩΩナ...ナンダッテー

VC6です。バグなのですね・・・


417 名前:デフォルトの名無しさん :04/10/10 19:44:16
>>416
std::locale::global(std::locale("japanese"));

418 名前:超絶Rubyhakka− :04/10/10 19:45:29
C++は糞だとまたもや証明された!

419 名前:デフォルトの名無しさん :04/10/10 20:51:43
C++で2重のforループを使い実行結果が以下のようになるように
したいのですが・・・誰か教えて下さい。
A
AB
ABC
ABCD
ABCDE


420 名前:デフォルトの名無しさん :04/10/10 20:56:23
>>419
#include <iostream>

int
main()
{
    char str[] = "ABCDE";

    for( int i = 0; i < 5; ++i )
    {
        for( int j = 0; j <= i; ++j )
        {
            std::cout << str[ j ];
        }
        std::cout << std::endl;
    }

    return 0;
}


421 名前:デフォルトの名無しさん :04/10/10 20:57:36
>>419
for(;;){
for(int i=1;i<=5;i++)
printf("%.*s\n",i,"ABCDE");
break;
}

422 名前:デフォルトの名無しさん :04/10/10 21:02:34
ありがとうございました☆


423 名前:デフォルトの名無しさん :04/10/10 21:08:59
>>419-422
ここはいつの間に宿題請負のスレになったんだ?
しかも>>420間違ってるし。

424 名前:デフォルトの名無しさん :04/10/10 21:24:28
class mycls{
public:
static int x;
};
int main(){
mycls c;
c.x = 2;
return 0;
}
とするとgccのコンパイラに以下のように怒られるのですがなぜでしょうか.
hoge/hoge/hoge.o(.text$_...(略)...) undefined reference to mycls::x
collect2: ld returned 1 exit status

425 名前:デフォルトの名無しさん :04/10/10 21:26:08
int mycls::x;

426 名前:デフォルトの名無しさん :04/10/10 21:31:25
>>424
undefined reference to mycls::x
これくらい読めるようになっとけ。

427 名前:424 :04/10/10 21:35:02
それをどこで宣言するのでしょうか?
myclsのstatic int x;がint mycls::xじゃないんでしょうか?

428 名前:デフォルトの名無しさん :04/10/10 21:36:55
>>424
>undefined reference to mycls::x
mycls::xへの参照が未定義てす。
未定義については
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

429 名前:デフォルトの名無しさん :04/10/10 21:38:01
>>427
まずは宣言と定義の意味をきちんと調べること。

myclsのstatic int x; は宣言。これとは別に定義が要る。
これが定義になっちゃったら、このクラスを複数のファイルで使えないだろ。

430 名前:デフォルトの名無しさん :04/10/10 21:38:38
>>428 最悪

431 名前:デフォルトの名無しさん :04/10/10 21:46:13
要はこんな感じだ。
mycls.h
────────
class mycls{
public:
static int x;
};

mycls.cpp
────────
int mycls::x;

432 名前:デフォルトの名無しさん :04/10/10 21:53:07
>>425-431
ありがとうございました.
手元の本を読んで定義と宣言の違いを再勉強してきました.
static指定するからにはオブジェクトの生成と同時に変数を定義してしまっては
意味がないということですね.

ところで,int mycls::xをmain()関数内で宣言すると同じエラーが発生するのは
なぜでしょうか?

433 名前:432 :04/10/10 21:54:05
>>432
正確には定義ですね(訂正

434 名前:デフォルトの名無しさん :04/10/10 22:05:17
>>432
いや、あんた理解できてないよ。安心して出直せ。

> int mycls::xをmain()関数内で宣言すると同じエラーが発生
まともなコンパイラならそんな糞な挙動しないと思うんだが。
本当だと言いたいんなら、コンパイラとソースを貼ってみな。

435 名前:デフォルトの名無しさん :04/10/10 22:08:41
>>432
mycls a;

struct hoge
{
int y;
hoge() { y = a.x; }
};

hoge b;

main()
{
int mycls::x = 1234;
std::cout << b.y;
}


436 名前:デフォルトの名無しさん :04/10/10 22:10:04
>>434
> まともなコンパイラならそんな糞な挙動しないと思うんだが。
グローバルなスコープを持つクラス変数を、関数内で定義はできないと思うが。
こういうコードでしょ?

int main()
{
  int mycls::x;
}

C のグローバル変数もそうだが、グローバルスコープを持つものは関数の
外で定義しないと。

int mycls::x;
int main() {}

437 名前:デフォルトの名無しさん :04/10/10 22:13:14
>>434
ハズイヤツ。

438 名前:432 :04/10/10 22:13:32
>>436
そういうことでしたか.了解しました.
長々とありがとうございました.

# >>432 同じエラーが発生する
というのは間違いでした.まぎらわしいことしてすいません.
>>436 のようなコードで躓いていました.

439 名前:デフォルトの名無しさん :04/10/10 23:36:25
fstreamからstd::string strに一行を読み込みたいのですが
getline()は何故か知りませんがstd::stringで受け取れません。
そしてfstream >> str;とすると一行読み込みになりません。
>>で\nまで読み込む設定があるのかと探してみましたが見つかりませんでした。
char[]の一時変数にとりあえず読み込むしかないのでしょうか?

440 名前:デフォルトの名無しさん :04/10/10 23:40:22
>>439
std::getline

441 名前:デフォルトの名無しさん :04/10/10 23:42:15
>>439
std::getlineを調べてみてください。

442 名前:デフォルトの名無しさん :04/10/10 23:54:30
C++ で Java の final にあたるものってありますか?

443 名前:439 :04/10/11 00:02:21
<string>にて発見しました。どうもです。
中身は私には解読不可能でしたが。。。

444 名前:デフォルトの名無しさん :04/10/11 00:04:03
>>442
何をしたいのかもう少し具体的に書いた方が良い
それによって答えが変わってくると思う

445 名前:デフォルトの名無しさん :04/10/11 00:32:05
継承を制限したいんだろうとESPを駆使してみる

446 名前:デフォルトの名無しさん :04/10/11 00:40:00
コンストラクタをprivateにすれば?

447 名前:デフォルトの名無しさん :04/10/11 00:59:10
>>446
先生、コンストラクタをprivateにしてもメンバ関数の中のローカルクラスで継承できてしまいました。

448 名前:デフォルトの名無しさん :04/10/11 01:12:06
>>442
thisを見て、自分じゃなかったらエラー吐いて死ぬようにすりゃーいいかも。

449 名前:デフォルトの名無しさん :04/10/11 01:14:10
ん名門無理

450 名前:448 :04/10/11 01:14:12
コンパイル時の制限じゃないと意味無いか

451 名前:439 :04/10/11 01:16:11
続けての質問ですがお願いします。
一行読み込んでその先頭位置と一緒に出力するプログラムです。
\r\n区切りのテキストだと上手くいくのですが\n区切りのテキストだと無限loopに陥ってしまいます。

while ( !fs.eof() ) {
  std::streampos pos = fs.tellg();
  std::getline(fs,str);
  std::cout << pos << ":" << str << std::endl;
}
tellg()を実効しなければ上手く動作しますが、何がいけないのでしょうか?
環境はwindows2000とVC6SP6です。

452 名前:デフォルトの名無しさん :04/10/11 01:36:41
>>448
どの関数でチェックを入れる?
まさか全ての関数に入れるとか?

ちなみにコンストラクタじゃムリだよ

453 名前:439 :04/10/11 01:41:06
tellg bug VC6 で多数引っかかりましたorz

454 名前:デフォルトの名無しさん :04/10/11 01:47:33
>>453
もう解決しちゃったみたいだけど、一応。
Visual C++ Toolkit 2003では解決してたよ。

455 名前:デフォルトの名無しさん :04/10/11 02:55:05
グローバルスコープにあるポインタを使うのと
ポインタをコピーして同じオブジェクトを指すポインタを複数
使うのでは処理速度とか違うの?
スマートポインタ云々は抜きにして。


456 名前:デフォルトの名無しさん :04/10/11 02:58:36
>>455
前者と後者の違いをソースで示してください。

457 名前:デフォルトの名無しさん :04/10/11 03:10:44
前者は普通のグローバル変数(ポインタ)
後者はあるクラスのメンバであるポインタを別のクラスの
メンバにコピー(別のクラスのメンバの方はコピー用に作成)
//前者
class Global
{
public:
static LPDATA pData; //コピーは行わない
}

//後者
class A
{
public:
LPDATA pData; //こっちでオブジェクト作成
}
class B
{
public:
LPDATA pCopyData;
}
B::pCopyData = pData; //コピーして使いまわし


458 名前:デフォルトの名無しさん :04/10/11 09:41:35
>>457
メンバ変数は遅くなる。
const 修飾すれば速くなることがある。
どっちもループカウンタにでも使わない限り誤差の範囲。

459 名前:デフォルトの名無しさん :04/10/11 11:58:03
>>455
そりゃグローバルの方が速いだろ
コンパイラによるがグローバルは最適化がかかりにくかったりするが
1つで済むものを複数で管理する必要はない

ただし「本当に1つで済むんだな?」と、自分に小一時間問いただしてみることを薦める
後者を使うことになるケースは多いから

460 名前:デフォルトの名無しさん :04/10/11 11:58:59
メンバ変数はグローバル変数より更に最適化がかかりにくいよ

461 名前:デフォルトの名無しさん :04/10/11 12:00:39
そうでもないよ

462 名前:デフォルトの名無しさん :04/10/11 12:14:16
ここでも見たのか?
ここのは多分使ってるコンパイラが古いんだろ。
http://www.emit.jp/prog/prog_opt0.html

463 名前:デフォルトの名無しさん :04/10/11 12:24:21
自分の考えと違う事実をコンパイラが古いからで片付けようとする態度は
相手が携わっている分野を侮辱していることがあるから気を付けた方がいいぞ
もっとも煽り目的ならこの限りではないが

464 名前:デフォルトの名無しさん :04/10/11 12:32:51
VC++7.1 -O2
最適化前 0.991秒
最適化その 1.001秒
最適化その2 0.991秒
最適化その3 0.991秒

自分で試しもしないで個人サイトの情報を真に受けるバカはこれだから困るね。

465 名前:デフォルトの名無しさん :04/10/11 12:35:30
なるほどVC使いだったかw

466 名前:デフォルトの名無しさん :04/10/11 12:39:13
メンバ変数の最適化もかからないようなコンパイラよりはVC++の方がマシだろ

467 名前:デフォルトの名無しさん :04/10/11 12:43:24
あ? メンバ変数の最適化?? 何の話だ

468 名前:デフォルトの名無しさん :04/10/11 12:46:04
以下池沼だか上のサイトの盲信者だかよくわからん香具師は放置で

469 名前:デフォルトの名無しさん :04/10/11 12:52:37
最近もどっかのスレでfomit-frame-pointer論争があったし、
特に最適化関連の話は、Web上の情報が本当かどうか自分で確かめた方がイイね。

470 名前:デフォルトの名無しさん :04/10/11 13:16:08
自分で試した結果が絶対正しいと思い込んでる馬鹿がいるようなので補足しておくと、
そのサイトのサンプルコードがだめだめ。

VC++7.1 -O2 で実行すると、ループが展開されてしまって、

for(int i = 0; i < 100000; i++) test.SetValue(i);
の行が
for(int i = 0; i < 100000; i++);
test.SetValue(99999);
のように最適化されてしまう。
これではまともな速度比較が出来ない。
test.SetValue(int);を __declspec(noinline) 指定する必要がある。

次に、
>メンバ変数の値が書き換えられ、ループの条件が変わるかもしれない
と言っているにもかかわらず、ループカウンタ用メンバ変数が書き換えられていないことが自明なループをまわしている。
これではよほど馬鹿なコンパイラで無い限り最適化できてしまう。
m_pBuffer[m_nCounter] = n;
の行をメンバ変数にくくりだす必要がある。
void CTest::SetBuffer( int* pBuffer, int nCounter, int n );
もちろん __declspec(noinline) 指定することを忘れない。

んで、その結果。
最適化前:9.141秒
最適化後:4.860秒

倍近く速くなった。

471 名前:470 :04/10/11 13:18:10
- の行をメンバ変数にくくりだす必要がある。
+ の行をメンバ関数にくくりだす必要がある。

472 名前:デフォルトの名無しさん :04/10/11 13:21:59
>>464
どんな最適化がかかってその結果になるのか教えてください。

473 名前:デフォルトの名無しさん :04/10/11 13:25:18
> ループカウンタ用メンバ変数が書き換えられていないことが自明

m_pBuffer = &m_nCounter;
というケースをコンパイラは考慮しなくていいのか?

474 名前:デフォルトの名無しさん :04/10/11 13:32:19
__declspec(noinline) =関数内部の挙動が分からないわけで、
コンパイラどころか、人手でも勝手に最適化(というか、省略)してはダメだと思うんだが……。

475 名前:デフォルトの名無しさん :04/10/11 13:37:22
471訂正。
もうちょい調べてみたらSetValueの呼び出し自体が無くなってた。
これじゃ「まともな速度比較が出来ない」どころか、「まったく比較できない」

>>473
すまん。問題なかった。
# さっき試したときは同じ速度になってしまったんだが・・・。


476 名前:デフォルトの名無しさん :04/10/11 13:40:35
結局のところ小手先の最適化なんぞコンパイラにかかれば無意味ってことじゃないか。
どうやってコンパイラの最適化を抑止するかって話になってるぞ。

477 名前:デフォルトの名無しさん :04/10/11 13:47:49
int main(){
wstring w = L"あいうえお";

printf("w is %s", wstring.c_str());

}

以上のプログラムを実行すると、めちゃくちゃな文字が表示されます。
これはおそらくprintfがマルチバイト文字(Shift-Jis)に対応したものであると考えられますが、
printfに該当するようなワード文字に対応する関数はないのでしょうか?


478 名前:デフォルトの名無しさん :04/10/11 13:50:07
>>417
ロケールって具体的には何のためにあるのでしょうか?

wstringを使うには、その国の言語を指定しないと使えないってこと?


479 名前:デフォルトの名無しさん :04/10/11 13:50:41
>>476
それは飛躍しすぎ。
結論は、>>462のリンク先で最後に書いてある考察が適切。

480 名前:471 :04/10/11 13:50:45
>>473
いや、やっぱり必要だった。
メンバ関数にくくりださないと、最適化後、のやつがrep stosに最適化されてしまって、比較にならない。

>>474,476
事態を混乱させてすまん。m(_ _ )m

SetValue を noinline 指定しないと、ループが消えて rep stos になってしまう。
実際のコードで、これをしてくれればハッピーだが、
これはベンチ用のもっともシンプルなコードで、現実的にはそう期待通りには行かないだろ?

俺らが必要なのは、ブロックフィルの速度ではなくて、メンバ変数のアクセス速度だから

481 名前:デフォルトの名無しさん :04/10/11 14:09:25
>>477
%lsかwprintfとか。
ロケールも設定しないと駄目かも。

482 名前:デフォルトの名無しさん :04/10/11 14:13:06
C++歯糞なのですか?

483 名前:デフォルトの名無しさん :04/10/11 14:57:51
>>481
ありがとうございます!

int main(int argc, char* argv[])
{
locale::global(locale("japanese")); // ★


wstring wstr;
wstr = L"あいうえお";
wcout << wstr << endl;

getch();

return 0;
}

以上のプログラムコードで★の部分をコメントにすると、コンソールに何も表示されないのは、
なんででしょうか?


484 名前:デフォルトの名無しさん :04/10/11 16:36:25
>>442
http://www.freeml.com/message/cppll@freeml.com/0010658


485 名前:デフォルトの名無しさん :04/10/11 18:06:54
sscanfをistringstreamに置き換えたいんですが、
下記のような場合はどうすればいいですか?

string s = "0:1:2";
sscanf(s.c_str(), "%d:%d:%d", &n, &n1, &n2);


下記のように、charを挟むというのが考えられますが、
':'に限ることは出来ないのでしょうか。

char c, c1;
istringstream(s) >> n >> c >> n1 >> c1 >> n2;

486 名前:デフォルトの名無しさん :04/10/11 18:09:38
>>485
sscanf()でいいじゃん。

487 名前:デフォルトの名無しさん :04/10/11 18:46:01
ファイルのオープン,クローズについて意見をください☆

int main(){

  class Log log();

  //ループ
  for(int i=0;i<100;i++){
    /*
    処理
    */
    log.saveLog(i);
   }

  ~log();
  return 0;
}


案1
コンストラクターでfopen(),ディストラクターでfclose

案2
saveLog()で毎回fopen(),fclose

どちらでもいい気がするのですが,気になります!!
クラスの設計としてはどちらが優秀でしょうか?

488 名前:デフォルトの名無しさん :04/10/11 18:46:49
クラスの設計としてはfstream使った方が優秀です。

489 名前:デフォルトの名無しさん :04/10/11 18:52:01
文字の幅(setw)や精度(setprecision)を使うとソースが読みにくくなりませんか?
やはりfprintf(pfstr,"%15s,%15.5f","Great Class",someDoubleValue)の方が簡単で(^o^)



490 名前:デフォルトの名無しさん :04/10/11 18:54:03
fstreamならデストラクタで勝手に閉じてくれるのでfstreamの方が優秀です。

491 名前:デフォルトの名無しさん :04/10/11 19:06:53
>>487
そのログが、プログラム終了時まで必要のないものならどちらでもいいが、
作業終了時には書き込まれていることを保証しないといけない性質のものなら
毎回オープンクローズした方がいい。
で、streamよりもFILEに慣れているならそちらでもいいと思う。

492 名前:デフォルトの名無しさん :04/10/11 19:15:20
以下のプログラムコードで★の部分をコメントにすると、コンソールに何も表示されないのは、
なんででしょうか?


int main(int argc, char* argv[])
{
locale::global(locale("japanese")); // ★


wstring wstr;
wstr = L"あいうえお";
wcout << wstr << endl;

getch();

return 0;
}



493 名前:デフォルトの名無しさん :04/10/11 19:17:29
>>487です
488-491
ご意見ありがとうございましたm(__)m

通常はfstreamを使うのですが,今回はdouble型を多用するため
FILEで,saveLogで毎回open,closeにします
これで私の優秀なクラスがさらに優秀になります☆☆

494 名前:デフォルトの名無しさん :04/10/11 19:26:46
>>492
コンパイラーは g++ , vc7.1, vc7.0, bc++ or vc6 この中のどれ? 

495 名前:デフォルトの名無しさん :04/10/11 19:28:23
デストラクタのcloseに任せると、クローズの失敗が美味く処理できないぞ。

496 名前:デフォルトの名無しさん :04/10/11 19:29:44
クローズなんざ失敗しようがどうでもいい

497 名前:デフォルトの名無しさん :04/10/11 19:33:04
>>496
クローズの失敗だけならいいが、fclose()はバッファのフラッシュもするから要注意。
なんてことは当然承知の上で言ってるんだよね?

498 名前:デフォルトの名無しさん :04/10/11 19:42:49
fopenは失敗しても,fcloseが失敗するとは思えませんが,,,

499 名前:デフォルトの名無しさん :04/10/11 19:46:00
fcloseの戻り値使ってるプログラム見たこと無いな・・・

500 名前:デフォルトの名無しさん :04/10/11 19:48:20
仮に失敗したとして、ひ弱な人間どもにはどうすることもできまい。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.