【初心者歓迎】C/C++室 Ver.43【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.43【環境依存OK】 - 暇つぶし2ch175:169
07/10/02 19:38:07
>>171
>>169 をちょっと訂正
要素数Nが4以上の時は

Nx4行列A (4列目の要素は常に1)
165 24 500 1
150 21 1000 1
180 18 200 1
100 120 0 1

4x1行列B
a
b
c
d

にしないといけない

176:163
07/10/02 20:36:22
>>169
追加どうもです。

例が悪かったですね。
あうかえおいきくけこさしすせそ以下順番どおりだとすると
47/50=94%となります。

177:デフォルトの名無しさん
07/10/02 21:18:47
例が悪いというか、希望する順列との差異を表したいわけでしょ?
そこで「あいうえお」を例にするから悪いわけじゃね?
普通の人が聞けば「あ」はあるかも知れんが「い」はないかもしれないと思う。

178:デフォルトの名無しさん
07/10/02 21:51:19
てことは「んあいうえおかきくけこ…を」だったら0%なわけね
そういう定義ならそれでいいけど目的としてはそれで大丈夫なの?

179:163
07/10/02 22:10:54
すみませんでした。

>>177
仰るとおりです。
>>178
大丈夫です。

180:デフォルトの名無しさん
07/10/02 22:21:34
C++でnewで生成した配列の要素数って求められないんでしょうか?
char* a = new char[5];
char b[5];
sizeof(a) は4(ポインタのサイズ) sizeof(b)は5になるのですが...
お願いします


181:デフォルトの名無しさん
07/10/02 22:23:10
>>163って、結果が必ず50音順になるわけじゃ無いよな。
効率よくやるのは結構ムズい気がする。
あいうえお順に近い並び方から順に、解があるかどうかを
1つずつ調べていくプログラムが作るの楽なんじゃないかなぁ。

182:デフォルトの名無しさん
07/10/02 22:30:25
>>180
char a[] = new char[5];
にすればおk

183:デフォルトの名無しさん
07/10/02 22:32:27
コンテナ使えやヴォケェ

184:デフォルトの名無しさん
07/10/02 22:33:54
スマソ >>182じゃ無理かも
C++ならvectorでもつかっておけば?
風邪なのに2chやってると判断力が鈍るな

185:デフォルトの名無しさん
07/10/02 22:43:23
コンテナなんてクソ

186:デフォルトの名無しさん
07/10/02 22:48:35
int hoge = 5;
char* a = new char[hoge];
でhoge見りゃいいじゃん

187:デフォルトの名無しさん
07/10/02 22:55:21
要素数とポインタをタプルにしよう☆

188:デフォルトの名無しさん
07/10/02 22:57:40
サイズは定数で無いと受け付けないから

189:デフォルトの名無しさん
07/10/02 22:59:25
じゃあboost::arrayもしくはそれに似たものを自作すればおk

190:182
07/10/02 23:05:56
レスありがとうございました. Vector使います.
もひとつ関連質問ですが、Cで関数に配列渡す場合同じことが起きるんですが
関数内で渡された配列の要素数が必要な場合、要素数も別に渡さないと
いけないということですか?
void hoge(char a[], int numOfFactor)みたいに

191:デフォルトの名無しさん
07/10/02 23:10:34
もちろんそうよ
ループの終了条件にしか使わないなら番兵置く手もあるけど

192:デフォルトの名無しさん
07/10/02 23:11:13
>>190
そうだよ。静的な配列ならsizeofで要素数を取得できるけど、そうでない場合は別に値を管理する必要がある

193:190
07/10/02 23:14:31
了解しました。重ね重ねありがとうございました。
要素はfactorじゃなくてelementでした。おまいらサンクス!!

194:デフォルトの名無しさん
07/10/02 23:23:50
どっちかと言うと、C++では先頭及び最後の1つ後を指すイテレータ
という2つの引数を取るほうが一般的だと思う。

template<typename Iterator>
void hoge(Iterator first, Iterator last);
要素数はポインタ的にfirst - lastと言いたいとこだが、
std::distance(first, last)で求める。

もうちょっと先進的なのが好みならBoost.Range。
template<typename Range>
void hoge(Range& r);
boost::size(r)で要素数が求まる。
boost::begin(r), boost::end(r)でイテレータ取得。
vectorその他コンテナ一般や配列などを引数に渡せる。

195:デフォルトの名無しさん
07/10/03 02:17:51
DWORD dwSize = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(dwSize));

これをNewを使って書き換えるとするとどんな風になりますか?

196:デフォルトの名無しさん
07/10/03 02:37:03
Happy New Year

197:デフォルトの名無しさん
07/10/03 04:24:39
んー。
std::vector<BYTE> buffer(GetFileSize(...));

198:デフォルトの名無しさん
07/10/03 06:57:09
DWORD New = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(New));


199:デフォルトの名無しさん
07/10/03 08:33:47
DWORD dwSize = GetFileSize(...);
//1 LPBYTE lpBuffer = new BYTE[(dwSize + sizeof(BYTE) - 1) / sizeof(BYTE)];
//2 LPBYTE lpBuffer = (LPBYTE)new char[dwSize]
//3 LPBYTE lpBuffer = new BYTE[dwSize]

200:デフォルトの名無しさん
07/10/03 09:03:51
//4 LPBYTE lpBuffer = new(nothrow) BYTE[dwSize];

malloc差し替えなら挙動が同じ(bad_alloc投げずにNULL返す)new(nothrow)最強

201:デフォルトの名無しさん
07/10/03 09:39:48
んなコードは窓から投げ捨ててFileMapping使え

202:デフォルトの名無しさん
07/10/03 11:11:39
WindowsServer2003x64上で、64ビットプロセスと32ビットプロセスのメモリ共有を行いたいと思っています。
調べてみるとメモリマップドファイルがあるのですが、これで実現可能でしょうか?単純な方法がありましたら教えていただきたいです。
また、64ビットプロセスでメモリ確保したものを32ビットプロセスでデータ参照するにはどうすればいいでしょうか?



203:デフォルトの名無しさん
07/10/03 13:30:07
>>202
可能。メモリマップドファイル経由。

204:デフォルトの名無しさん
07/10/03 14:54:08
独学で勉強中です。

ClassA a;
ClassA b = a;
ClassA c(a);
とした場合
bはメンバ変数が初期化され、
cは未初期化状態になります。
これは言語仕様でしょうか?環境依存でしょうか?

WinXP + Cygwin + gcc3.4.4

205:デフォルトの名無しさん
07/10/03 15:03:23
やってみたが

#include <iostream>
class ClassA {
public: int x;
};
int main()
{
  ClassA a;
  a.x = 42;
  ClassA b = a;
  ClassA c(a);
  std::cout << b.x << std::endl;
  std::cout << c.x << std::endl;
}

実行結果
42
42

どのへんが未初期化?

206:デフォルトの名無しさん
07/10/03 16:08:56
>>205
>ClassA c(a)
これは、どういうことをしてるの?

207:デフォルトの名無しさん
07/10/03 16:13:35
コピーコンストラクタによる初期化

208:デフォルトの名無しさん
07/10/03 16:19:21
>>207
コピーコンストラクタってどこに宣言・定義されてるの?
#include <iostream> <----ここの中?


209:デフォルトの名無しさん
07/10/03 16:22:39
>>208
>コピーコンストラクタってどこに宣言・定義されてるの?
あなたの心の中。

冗談さておき、特に自前で宣言しなかった場合は暗黙のコピーコンストラクタが用意される。
# なーに、メンバを全部(浅い)コピーに出すだけさ。

210:デフォルトの名無しさん
07/10/03 16:28:28
>>209
>暗黙のコピーコンストラクタ
ってこうしなさいとC++の仕様で決まってるんの?

211:デフォルトの名無しさん
07/10/03 16:55:28
そう。

212:デフォルトの名無しさん
07/10/03 17:46:41
浅いコピーっていうのは、単なるビットコピーってこと?

213:デフォルトの名無しさん
07/10/03 17:49:46
浅いコピーなんだから深く考えちゃだめ

214:デフォルトの名無しさん
07/10/03 17:50:38
そのメンバがコピーコンストラクタを持っていればそれを使うが、ない場合はそういうことになる。

215:デフォルトの名無しさん
07/10/03 19:47:41
>>205
すみません、説明不足でした。

> ClassA a;
> a.x = 42;
> ClassA b = a;
> ClassA c(a);

> a.x = 42;
を取ると
0
17~~~(-1のunsinged表記?)
のように表示されてます。

両方ともコピーコンストラクタによりインスタンスが生成されていますが
結果が異なっていたため気になった次第です。

216:デフォルトの名無しさん
07/10/03 19:56:40
そもそも元のメンバ変数を初期化していない時点で
まともな動作を期待するなよ

217:デフォルトの名無しさん
07/10/03 20:14:24
>>216 的確ワロスw

218:デフォルトの名無しさん
07/10/03 20:52:49
int x;
printf("%d\n", x);

219:デフォルトの名無しさん
07/10/03 21:09:32
>>216
int x;
int y;
x = y;
この場合, x, yは異なる可能性があるの?

220:デフォルトの名無しさん
07/10/03 21:19:33
>>219
マジで?

221:デフォルトの名無しさん
07/10/03 21:20:08
C++で使用対象のクラスが参照カウンタを実装している可能性があるので
ZeroMemoryなどでデータを初期化するのはご法度

と何処かで目にしか記憶があるのですが、同様の理由で構造体に対しても
ZeroMemoryを使うことはあまり好ましくないのでしょうか?

C言語では常套手段だったので。

222:デフォルトの名無しさん
07/10/03 21:24:57
#include <tr1/memory.hpp>
#include <cassert>

struct Base { virtual char f(void) =0; };

struct A : public Base {
char f(void) { return 'A'; }
};

struct B : public Base {
char f(void) { return 'B'; }
};

int main() {
std::tr1::shared_ptr<Base> p;
p.reset(new A);
assert( p->f() == 'A' );
p.reset(new B);
assert( p->f() == 'B' );
}
こういう実行時バインディングをCRTPを使って書きたいんですがどう書けばいいんでしょうか?

223:デフォルトの名無しさん
07/10/03 21:25:53
>>215
ローカル変数として定義したオブジェクトはデフォルト初期化される
組み込み型の場合のデフォルト初期化は不定値
どんな実装でどんな結果になろうが、考えること自体意味がない

224:デフォルトの名無しさん
07/10/03 21:27:02
>>221
その構造体・クラスがPODならZeroMemoryしても構わない。
PODになるには色々条件(コンストラクタ・デストラクタ、仮想関数禁止など)があるが、
概ねCでそのまま使えるような単純な構造体なら大丈夫と思っていい。

それでも、ZeroMemoryよりは初期化子などでゼロ初期化を促すほうが一般的だと思うけど。

225:221
07/10/03 21:29:51
>>224
素早い回答ありがとうございます。

226:デフォルトの名無しさん
07/10/03 21:44:15
そもそもコンストラクタで初期化させるように設計するものなのでは?

227:デフォルトの名無しさん
07/10/03 21:48:41
でも外部のライブラリなんかで、
そういうCと共通のヘッダを使うなんて機会もあるし。
#そういうのはラップしろというのは同意。

228:デフォルトの名無しさん
07/10/03 21:59:40
>219
>>215 の報告を信じるなら、クラスのメンバ変数の場合には異なることが
ありうるってことだねぇ。最適化の関係かな。

229:222
07/10/03 22:19:01
#include <cassert>

template <typename Derived>
struct base
{
  char interface() { return reinterpret_cast<Derived*>(this)->implementation(); }
  static char static_func() { return Derived::static_sub_func(); }
};

struct derived : base<derived>
{
  char implementation() { return 'A'; }
  static char static_func() { return 'B'; }
};

template <typename T>
char f(base<T>& t) { return t.interface(); }

int main() {
  derived d;
  assert( f(d) == 'A' );
}
英語版wikipediaを参考に書いてみましたがまだしっくりきません
というかあきらかに違うような気がします

230:202
07/10/03 22:46:03
>>203
ありがとうございます。メモリマップ先をファイルでなくメモリで可能ですよね?ただ、やはりメモリ幅の違いが気になります。実装は困難なのでしょうね・・・


231:デフォルトの名無しさん
07/10/03 23:17:09
>>229
reinterpret_castではなく、static_castにすべきだが、ほかは合っている。

232:デフォルトの名無しさん
07/10/03 23:19:59
>>230
自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単
#include<windows.h>
#include<stdio.h>

#define IS_PARENT // ←この行の有りと無しでコンパイルする
#define MEMMAP_ID "maptest"

int main(void){
HANDLE hmap;
char *ptr;

#ifdef IS_PARENT
hmap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, MEMMAP_ID);
if(hmap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS){
CloseHandle(hmap);
return 1;
}
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
ptr[0]='\0';
while(scanf("%255s", ptr)==1) ;
#else
hmap=OpenFileMapping(FILE_MAP_WRITE, FALSE, MEMMAP_ID);
if(hmap==NULL) return 1;
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
while(getchar()!=EOF) printf("%s", ptr);
#endif
UnmapViewOfFile(ptr);
CloseHandle(hmap);
return 0;
}

233:デフォルトの名無しさん
07/10/03 23:20:05
>>230
size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。
32ビットプロセス同士でやるのと同じ。

234:202
07/10/04 00:24:19
>>232, 233
ご返信ありがとうございます。
今メモリ共有を行いたいのは、unsigned char型の配列です。
この場合も普通に232さんの教えくださったサンプルで問題ない
という認識でよろしいでしょうか?

235:デフォルトの名無しさん
07/10/04 00:30:36
>>234
なぜ、やってみないのでしょうか?

>>232 はただの動作確認のためだけのサンプルです
サンプルで問題がないかどうかは使い方によります
使用しているAPIについて*自分で*調べて下さい

236:202
07/10/04 00:35:11
>>235
ご返信ありがとうございます。おっしゃるとおりです。
自分で調べずにすぐに質問してしまいました。
実装にトライします。
ありがとうございました。

237:デフォルトの名無しさん
07/10/04 01:12:29
>>103
enable_if 使う初心者w



238:デフォルトの名無しさん
07/10/04 10:11:51
そんなこと言われても、mplなんて使いこなせないんで…

239:デフォルトの名無しさん
07/10/04 10:42:45
stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?

240:デフォルトの名無しさん
07/10/04 11:02:01
>>239
標準ライブラリのソース内でしょう。

241:デフォルトの名無しさん
07/10/04 11:11:59
C++はヘッダファイルではなくヘッダをインクルードしますが
ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?

242:デフォルトの名無しさん
07/10/04 11:18:39
>>241
ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。

で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。

243:デフォルトの名無しさん
07/10/04 11:34:30
>>242 ものすげえわかり易くてワロスw

244:デフォルトの名無しさん
07/10/04 12:10:53
<iostream>ってヘッダファイルぢゃないの?

245:デフォルトの名無しさん
07/10/04 12:13:19
>>244
C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。

246:デフォルトの名無しさん
07/10/04 12:17:38
>>242
なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?

247:デフォルトの名無しさん
07/10/04 12:19:34
>>245
例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?

248:デフォルトの名無しさん
07/10/04 12:20:31
>>246
いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし

249:デフォルトの名無しさん
07/10/04 12:23:16
privateな仮想関数って意味ありますか?
派生クラスで上書きしても呼び出せないのに。

250:デフォルトの名無しさん
07/10/04 12:25:05
>>248
プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?

251:デフォルトの名無しさん
07/10/04 12:25:12
delphiのinterface節/impliments節ってよくできてると思う

252:デフォルトの名無しさん
07/10/04 12:27:47
>>249
Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。

253:デフォルトの名無しさん
07/10/04 12:32:52
>>250
ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。

そんなの俺に聞いてどう答えて欲しいの?

254:デフォルトの名無しさん
07/10/04 12:39:36
>>249
派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。

255:デフォルトの名無しさん
07/10/04 15:37:19
>>252
>>254
class B
{
public:
void mf(){ privmf(); }
private:
virtual void privmf();
};

class D : public B
{
private:
void privmf();
}

int main()
{
D objd;
objd.mf();

return 0;
}

このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、
D::privmf()になるのですがなぜですか?
ポインタか参照に対して呼び出されたときにポリモルフィズム機構
が働くと思うのですが。
void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、
このthisポインタが指している実際のオブジェクトの型がクラスDの
場合(上のプログラムの場合)はD::privmf()が呼ばれるということで
しょうか?

256:デフォルトの名無しさん
07/10/04 15:59:23
そのとおり

257:デフォルトの名無しさん
07/10/04 16:11:28
>>256
ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。


258:BOLT
07/10/04 18:19:42
自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。
URLリンク(ccplus.blog121.fc2.com)ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。

259:デフォルトの名無しさん
07/10/04 18:22:29
クソショボイブログだなw
誰も見ないしとっとと閉鎖しろよ

260:デフォルトの名無しさん
07/10/04 18:42:04
誰も見てくれないからこそ続けるんだ
最低1年くらいは毎週更新できるように努力しる

261:デフォルトの名無しさん
07/10/04 19:31:14
C++が全角なのが気にくわない

262:デフォルトの名無しさん
07/10/04 19:58:05
「全角ってなんですか?」
「"いわゆる全角"のことではないでしょうか」

263:デフォルトの名無しさん
07/10/04 20:40:46
いいえ、焼き肉屋のことです。

264:デフォルトの名無しさん
07/10/04 20:56:58
おまえら向上心のある奴はやさしくしてやれよ

265:デフォルトの名無しさん
07/10/04 21:34:20
どこぞのかわいがりよりはずっとやさしい。

266:デフォルトの名無しさん
07/10/04 22:32:21
可愛がってやらないと強くならないぞ!

267:デフォルトの名無しさん
07/10/04 22:37:51
C++でCSVからデータを読み込もうとしています。
普通は1文字ずつ変数に入れていくと思うのですが、
プログラム側で #define FILENAME "a.txt" と定義しておき、
CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。
よろしければお力添えをお願いいたします。

268:デフォルトの名無しさん
07/10/04 22:45:46
"FILENAME"があったら適当に置換でもしとけばいいじゃん

269:267
07/10/04 23:04:23
返信ありがとうございます。説明が不足していました。
defineが他にも多数あり、今後外部ファイルに定義を移して
defineの名前も変更できるようにするため、いい方法がないかと思っています。
FILENAME 1個だけなら置換で問題ないですね。

270:デフォルトの名無しさん
07/10/04 23:06:54
CreateProcessでWindows Services for UNIXのunzipコマンドを使うのは可能ですか?

271:デフォルトの名無しさん
07/10/04 23:07:08
>>269
よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?


272:デフォルトの名無しさん
07/10/04 23:19:35
>>270
createprocess 外部コマンド
で検索するぐらいしてから来れば?


273:267
07/10/04 23:28:39
>>271
すみません、cppでプリプロセスの理解ができませんでした。
私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。

274:デフォルトの名無しさん
07/10/04 23:29:59
クラスのメンバ変数に参照型を追加した場合の初期化の
方法はこれが正しい書き方でしょうか?

class Hoge{
private:
int &Test;
public:
Hoge(int &T):Test(T){}
~Hoge(){}
}

275:デフォルトの名無しさん
07/10/04 23:32:00
いえす
一番最後にセミコロン無いけど

276:デフォルトの名無しさん
07/10/04 23:35:30
>>267
その程度のこと会社で聞けよ
きみの会社の客はかわいそうだな


277:275
07/10/04 23:38:58
>>275
どうも。
参考書にもググっても全く見つからなかったので不安が解消できました。

278:274
07/10/04 23:39:49
>>277 は名前ミス。失礼。

279:デフォルトの名無しさん
07/10/05 07:21:23
質問です。

pure virtual な関数て、基底クラスで

class ClassA
{
public:
virtual void Test(void) = 0;
};

こんな感じに定義するのは普通なのですが、さっき間違って

class ClassA
{
public:
virtual void Test(void) = 0
{
}
};

と、中身を定義したら、コンパイルが通りました。気になったので、派生させてみて、
派生先の Test 関数で、ClassA::Test を呼んだら、呼べました。

pure virtual な関数は、実体を作れないと思いこんでいたのですが、それは間違いなのでしょうか?

vc++8.0 sp1
xp sp2

280:デフォルトの名無しさん
07/10/05 07:49:32
>>279
それは間違いです。

でもその書き方ってできないんじゃなかったっけ。
class ClassA{
public: virtual void Test(void) = 0;
};
void ClassA::Test(void) { }
って書く必要があったような・・・
記憶違いかね。

281:デフォルトの名無しさん
07/10/05 12:29:52
>>280
VC++はそういう書き方ができるんじゃなかったか。
pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか
お節介だったと思うが。


282:デフォルトの名無しさん
07/10/05 21:29:19
まあ勘違いしやすい所だよな
×pure virtual な関数は、実体を作れない
○pure virtual な関数を持つクラスは、実体を作れない

283:デフォルトの名無しさん
07/10/05 22:32:31
printf 系で "%10s" と指定している箇所が全て 12 に変更されることになって
数値を定数化してフォーマットに埋め込めないものかと思っているんですが、
#define した定数がそのまま表示されたりと期待した動作が得られません。

どなたか知恵を貸して頂けませんか。
(そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)

284:デフォルトの名無しさん
07/10/05 22:35:09
#define FMT "%12s"

printf(FMT,"hogehoge");

じゃダメなの?

285:デフォルトの名無しさん
07/10/05 22:39:10
こんな書き方も出来るかもー!!
printf("%*s", 10, "hogehoge");
printf("%*s", 12, "hogehoge");


286:デフォルトの名無しさん
07/10/05 22:40:16
#define FMT "12"
printf("%" FMT "s", "hogehoge");

とか

287:デフォルトの名無しさん
07/10/05 22:47:38
std::mapでキーワードを予め指定しておいた予約語以外は受け付けないように出来ますか?


"hoge""hage""hoji""haji" // 何らかの方法で指定した予約語

std::map<std::string , std::string> strmap

strmap["hoge"] = "これは成功する";

strmap["miss"] = "これは失敗する";


こんな感じで

288:デフォルトの名無しさん
07/10/05 22:49:15
C++で下みたいな方法ってよろしくないですかね・・・
配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが
要素毎にコンストラクタ呼び出しは冗長になるので
問題点が判らないので指摘をお願いします

#include <stdio.h>

float data[] = {1., 2., 3., 4., 5., 6.};

class Data
{
public: // use default ctor
 float x, y, z;
 Data& operator+=(const Data &right)
....省略...
};

int
main()
{
 Data *ptr;

 ptr = reinterpret_cast<Data*>(data);

 printf("%f %f %f\n", ptr[0].x, ptr[0].y, ptr[0].z);
 printf("%f %f %f\n", ptr[1].x, ptr[1].y, ptr[1].z);

 return 0;
}


289:デフォルトの名無しさん
07/10/05 22:53:53
>>287
勝手に追加されちゃうから無理じゃね?

std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない

290:デフォルトの名無しさん
07/10/05 23:00:43
>>289
stringの方をラッピングするのもアリじゃね?
書く量としてはその方が少なくなりそう。

291:デフォルトの名無しさん
07/10/05 23:00:58
>>289
そうですか、残念
ありがとうございました

292:デフォルトの名無しさん
07/10/05 23:15:10
>>288
>コンストラクタ呼び出しは冗長
といってもinlineであれば実質気にするほど変わらない気がする。

Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は?
virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。

293:デフォルトの名無しさん
07/10/05 23:36:17
assert(sizeof(Data) == sizeof(float[3])); を書いとくとか

294:デフォルトの名無しさん
07/10/05 23:43:21
>>292,293
Thx
対象がRAWなベタデータなので簡素に出来ないかと思ったのですが
素直な書き方をした方がよさげですね



295:デフォルトの名無しさん
07/10/06 03:46:16
>>284-286
フォーマットって普通に文字列なんだな。
>>285の方法は知らなかった。参考にさせて貰います。
色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。

296:デフォルトの名無しさん
07/10/06 03:51:51
>>288
× オーバーライド
○ オーバーロード

297:デフォルトの名無しさん
07/10/06 16:19:13
wcout はバグがありますか?
wcout を使うのは避けてますか?

WindowsXP Home + BCC

298:デフォルトの名無しさん
07/10/06 17:10:25
char *hogehoge(){
return "hogehoge";
}

文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?

299:デフォルトの名無しさん
07/10/06 17:11:10
有効なままです

300:デフォルトの名無しさん
07/10/06 17:11:56
リテラル返すならconst char*にした方がいいかも

301:デフォルトの名無しさん
07/10/06 18:41:45
inline const char *&

302:デフォルトの名無しさん
07/10/06 18:45:41
&はイラネーだろ
なんか違うのか?

303:デフォルトの名無しさん
07/10/06 18:47:11
inline const const char *&

304:デフォルトの名無しさん
07/10/06 18:52:50
C++超初心者です。
今まで動いていたのに、今日コンパイルすると、
(1029) invalid format string conversion
と表示されてしまいます。

原因が分からず、どのように変えたらよいのかも分かりません。
ご教授宜しくお願いいたします。
すごく長いプログラムなので、関係してそうなところだけ書き込んでます。


FILE *ottq;
ottq = fopen("ottq.dat", "w");
double chir,l
l=20.05e-3;
chir=0.0e-5;
fprintf(ottq, "l(m)=\t%le\t\n",l);
fprintf(ottq, "chir(%)=\t%le\t\n",chir*100.0);  ←1029行目ここです。
fclose(ottq);

305:デフォルトの名無しさん
07/10/06 18:54:02
%→%%

306:デフォルトの名無しさん
07/10/06 18:54:48
>>304
エラーメッセージのまんまだろ。

307:デフォルトの名無しさん
07/10/06 19:02:37
こえぇ
お前みたいなのが扱うもんじゃねぇだろ

308:デフォルトの名無しさん
07/10/06 19:09:25
変数名きめぇwwwww


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch