【初心者歓迎】C/C++室 Ver.59【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.59【環境依存OK】 - 暇つぶし2ch262:デフォルトの名無しさん
08/04/02 23:05:52
ある型がクラス/構造体かどうか調べる方法はありますか?
あと、クラスのメンバ関数を列挙する方法はありますか

template<typename T> void enum_functions() {
  if (T::is_class()) {
    for (int i = 0; i < T::func_count(); ++i) {
      std::cout << T::func_name(i) << '\n';
    }
  }
}
みたいな感じで。

263:デフォルトの名無しさん
08/04/02 23:22:54
>>231
嘘はいかんよ。

>>235
>char a[]="test";とchar *b="test";
 *a='T';    /* OK */
 a[0]='w';   /* OK */
// *b='T';   /* NG */
 b=a;     /* OK */
 *b='T';    /* OK */
 b[0]='w';   /* OK */
// a=NULL; /* どうだったっけ?*/

264:238
08/04/02 23:28:59
>>262
どんな実装だよ。
せめてclass Tにしようぜ

265:デフォルトの名無しさん
08/04/02 23:30:32
// *b='T';   /* NG */
 *b='T';    /* OK */
どっちだよ

266:253,260
08/04/02 23:32:01
>>261
初めて知った単語なので非常に有難いです。
結局クラスをライブラリにするのはcppファイルの中身が見えなくなるだけで(ビルドが早くなったりもしますが)
いかにヘッダ部分をcppに移せるかで使用先(メインプロジェクト)での可変性が変わると言うことでしょうか。


267:デフォルトの名無しさん
08/04/02 23:34:28
>>262
思い描いている形とは違うかもしれないけど、
BoostまたはTR1にType Traitsに、is_classというものがある。
かなりコンパイラを選ぶだろうけど。

さすがにメンバの列挙はない。

268:デフォルトの名無しさん
08/04/02 23:35:43
>>259
すいません。
"クラスA::関数()",referenced from:
クラスB::関数() in クラスB.o
symbol(s) not found
collect2:ld returned 1 exit status
とあります。

269:デフォルトの名無しさん
08/04/02 23:40:16
>>265

// *b='T';     /* NG */
 b=a; *b='T';   /* OK */

分かりにくくてスマソ


270:デフォルトの名無しさん
08/04/03 00:43:38
>>268
クラスB.o の中に入っている クラスB::関数() から参照されている "ク
ラスA::関数()" というシンボルが見付かりません、
とリンカー様(ld)が怒ってらっしゃる。

つまり、クラスA::関数() をコンパイルした .o ファイルやそれが入っ
ているライブラリをコマンドラインに指定する必要がある。


271:デフォルトの名無しさん
08/04/03 04:53:36
文字コードの問題です。
wchar_t buff[3];
とあって
SHIFT-JISで書かれたテキストから、fgetwsで読み込む事で
例えば、
「もじ」
ならば
buff[0]<=も
buff[1]<=じ
と、入る事を望みます。

このような処理をする場合、どのようにすればいいのでしょうか?
ちなみに、fgetwsで読むと、buff[0]とbuffr[1]で"も"が入ってしまいます。
fgetwsはsjisで書かれたテキストを自動で変換して読み込んでくれると聞いたのですが・・・。

272:デフォルトの名無しさん
08/04/03 05:00:49
あ、一応自己解決しました。
テキストを、UTF16のBOMなしにして
setlocale(LC_CTYPE, "");を設定し、バイナリモードで読めばよかったんですね。

出来れば、SJISから変換されるとありがたいんですが・・・。


273:デフォルトの名無しさん
08/04/03 08:16:33
std::vector<int> vec;
という変数があるとして、
for (int i = 0; i < vec.size(); i++) {.....}
とか書くとintとunsigned intを比較してるという警告がでて嫌なのでstatic_cast<int>(vec.size())
とかやってるのですが、これもいやです。どうすればいいですか?

274:デフォルトの名無しさん
08/04/03 08:28:55
1.iをstd::vector<int>::size_typeにする。
2.iteratorを使う。
3.STLのアルゴリズムを使う。

275:デフォルトの名無しさん
08/04/03 08:43:33
>>273
4.iをunsignedにする。

276:デフォルトの名無しさん
08/04/03 08:51:22
ありがとうございます。
STLのアルゴリズムを使うというのは、for文の中でやりたかったことがSTLのアルゴリズムで
表現できる必要がありますよね?常にできるということではないですよね?



277:デフォルトの名無しさん
08/04/03 08:55:56
>>271-272
まずは環境を書こう。


278:デフォルトの名無しさん
08/04/03 08:59:30
>>276
{...}の内容によってはちょっと面倒かも知れんので、その場合は2.かな。

279:デフォルトの名無しさん
08/04/03 12:04:46
class complex {
public:
double re;
double im;
};
こういうクラスがあるときに、operator>>(istream &, complex &a) を定義するとすると、
どういう風にやるのがよいでしょうか?

280:デフォルトの名無しさん
08/04/03 12:07:17
そんなクラスは作らずに、標準ライブラリのcomplexを使う。

281:デフォルトの名無しさん
08/04/03 14:05:47
windows2k MinGW を入れたいのです
MinGWインストーラがネット無いので使えません
ソースフォージからどれを落とせば良いでしょうか
またそれは全て同じフォルダに上書きで良いでしょうか
binフォルダなどかぶっているものがおおいんです
使いたいのはC、C++、SDL、OpenGLです
パスは適当に通そうと思っています

282:デフォルトの名無しさん
08/04/03 15:08:36
>>281
大陸へカエレ

283:デフォルトの名無しさん
08/04/03 15:10:11
専用スレで聞いた方がいいんじゃない。自分はDev C++の日本語版で入れたけど

284:281
08/04/03 15:20:11
>>283
ではMinGWスレに移動したいと思います
レス㌧でした

285:デフォルトの名無しさん
08/04/03 15:47:08
C/C++ってつおいですか

286:デフォルトの名無しさん
08/04/03 15:48:47
>>285
未定義です

287:デフォルトの名無しさん
08/04/03 15:52:35
BCBの__propertyはVCでも使えますか。VCで書いてみたら、色が変わったので。

288:デフォルトの名無しさん
08/04/03 15:54:42
MFCを使ってCMainFrameから継承されたウィンドウとCDialogから継承されたダイアログを
MTI(Multiple Top Level Window)風に同時に取扱たいです。

何か参考となるキーワードやソースやwebpageを教えて頂けないでしょうか。

289:デフォルトの名無しさん
08/04/03 16:00:47
>>287
VC入ってるのならF1押してヘルプを見るのだ

290:デフォルトの名無しさん
08/04/03 16:43:19
>>288
キーワード:
モードレスダイアログ
タイマー

291:デフォルトの名無しさん
08/04/03 17:14:42
VCのどっとねっとでないやつでVBやC#みたいなプロパティを作るものはありますか?

292:288
08/04/03 17:16:36
>>290
モードレスダイアログだとダイアログが子になってしまって、ちょっと欲しいものじゃないんです。
親子関係はなし、もしくはCMainFrameを子にしたいんです。

293:デフォルトの名無しさん
08/04/03 17:16:39
ATL

294:デフォルトの名無しさん
08/04/03 17:44:43
>>279
comlex& operator>>(istream & a)


295:デフォルトの名無しさん
08/04/03 17:52:31
>>292
ウィンドウ無か非表示の親からメインフレームとダイアログ作れば兄弟になる

296:デフォルトの名無しさん
08/04/03 17:59:36
_declspec(dllexport)

こういうのって、Cの仕様なんでしょうか? それともコンパイラの方の仕様なんでしょうか?
まとまった文章や文献をご存知の方がいらしゃいましたらよろしくお願いいたしますm(_ _)m

297:デフォルトの名無しさん
08/04/03 18:05:31
DLLはWindows用語

298:デフォルトの名無しさん
08/04/03 18:09:02
文献はMSDNにある

299:デフォルトの名無しさん
08/04/03 18:12:00
>>291
URLリンク(msdn2.microsoft.com)

>>296
独自
URLリンク(msdn2.microsoft.com)

300:デフォルトの名無しさん
08/04/03 18:20:47
先頭にアンダースコアが2つ付いたのは
一部の組み込みマクロを除いて、他は全て処理系の拡張仕様。

301:デフォルトの名無しさん
08/04/03 18:21:29
>>297
>>299
ありがとうございます。勉強してみます。

302:300
08/04/03 19:09:12
俺は無視か・・・。まあいいけどさ。

303:デフォルトの名無しさん
08/04/03 19:19:55
>>302
ばかじゃねぇのw

304:デフォルトの名無しさん
08/04/03 19:31:24
>>302 質問者がレス読んでから投稿ボタン押すまでに書き込むとスルーされる
アフリカではよくあること

305:デフォルトの名無しさん
08/04/03 19:45:47
>>302
すみません、気づきませんでした^^; ありがとうございます。
同じWindows環境でも、処理系に依存する部分は結構ありそうなので、頑張って調べてみます><

306:デフォルトの名無しさん
08/04/03 21:15:07
template<class T>
class A{
public:
void put( T t )
{
std::cout << t << std::endl;
}

};

このようなテンプレートを用意したとして、

A<int> a;

のようにintとして定義した場合に、put()にint以外の引数を
入れるとコンパイルエラーになるようにしたいんですが

a.put( 1.0f ); // 例えばこの場合コンパイルエラーが出るようにしたい

307:デフォルトの名無しさん
08/04/03 21:21:19
A<float>().put(1.0f);

308:デフォルトの名無しさん
08/04/03 21:34:58
template<class T>
class A{
public:
template<class T2>
void put( T2 t )
{
BOOST_STATIC_ASSERT(boost::is_same<T, T2>::value);
std::cout << t << std::endl;
}

};

309:デフォルトの名無しさん
08/04/03 22:00:35
C言語から自作したAPIを呼び出すにはどうすれば良いのでしょうか?
Windows APIは、#include <windows.h>で呼び出すことができるようなのですが、
ソフトウェア屋が作ったAPIをCのソースから呼び出す方法がさっぱり。

ググっては見たのですが具体的な書き方が見つかりませんでした。
参考になるサイト、もしくはソースがあれば教えてください。

310:デフォルトの名無しさん
08/04/03 22:02:40
extern "C"

311:デフォルトの名無しさん
08/04/03 22:04:05
>>309
DLLを動的に呼び出すか、ソースなら#include ""だろ

312:デフォルトの名無しさん
08/04/03 22:06:51
operator<<()の定義の中で、宣言なしにwsという変数を使ってwhite spaceを読み込んでいるものをみたのですが、
これが一体なになのかわかりません。コンパイルは出来ているのでつかえるみたいなのですが、、
ググってもいいのがひっかかりません。どうか教えてください。



313:デフォルトの名無しさん
08/04/03 22:20:15
>>310-311
ソフトウェア屋が用意したAPI(恐らくDLL)を手元のCソースから利用したいんですが…
いまいちわからないです。C言語をやるのは初めてで。

314:デフォルトの名無しさん
08/04/03 22:22:13
恐らくとか言われても・・・。
.lib をリンクして提供されてるヘッダファイルインクルードすればいいだけじゃね?

315:デフォルトの名無しさん
08/04/03 22:23:48
LoadLibrary

316:デフォルトの名無しさん
08/04/03 22:35:46
>>312
空白を読み飛ばすマニピュレータのstd::ws

317:デフォルトの名無しさん
08/04/03 22:36:49
>>297
OS/2やTOWNS-OSでもDLLだったけど生き残ったのはWindowsだけか

318:デフォルトの名無しさん
08/04/03 22:40:25
OS/2はNTの元ネタみたいなもんだし

319:デフォルトの名無しさん
08/04/03 22:40:38
>>314
なるほど…APIを触ったことがないのでどういうものかわかりませんでした。
ライブラリと同じような扱いでインクルードできるんですね。
ありがとうございました。

320:デフォルトの名無しさん
08/04/03 22:43:17
OS/2 って何?そんな子はいませんでしたよ!

321:デフォルトの名無しさん
08/04/03 22:45:56
API
URLリンク(e-words.jp)

322:デフォルトの名無しさん
08/04/03 23:42:51
std::mapのinsert()で戻ってくるiteratorとboolのpairな型はどこかに定義されていないの?

323:デフォルトの名無しさん
08/04/03 23:43:33
c++のcomplexのoperator>>の実装を見たのですが、4+5i という複素数があったとすると、
(4,5) という文字列で入力するようになっていました。実装は()とかの括弧やコンマをみて
ちゃんと処理やってたのですが、普通に考えたら、4+5iとかの文字列の入力の方が自然なような
気がするのですが、(4,5)の方がよいという理由がありますか?
よろしくお願いします。



324:デフォルトの名無しさん
08/04/03 23:47:48
C言語が(,)の入力に対応している点
a+biはC言語が対応していない

325:デフォルトの名無しさん
08/04/04 00:44:30
他人の書いた CやC++ソースが大量にあったとして、
コード解析するときってどうやってる?

Linux 環境で grep や vim + ctags で解析 → gdb で動作確認なんて
やり方してる俺は激しく時代遅れな希ガス

326:デフォルトの名無しさん
08/04/04 00:51:17
>>325
動作させられるなら、動作させてみて、どの関数が一番頻繁に呼び出されてるかをみてみる。
全体の20%のコードが80%の時間を使ってるというしな。

327:デフォルトの名無しさん
08/04/04 01:06:04
>>324
c言語が対応してないというのは、どういう意味ですか?
scanf()で一文字づつ読み込んで解析すればできませんか?



328:デフォルトの名無しさん
08/04/04 01:14:47
>>327
文字列を解析すればできるよ
しかし、直接プログラム内で kansuu(x,y)とかけるのとは違う

329:デフォルトの名無しさん
08/04/04 01:15:14
>>327
何がいいたいのかよくわからんが・・・
>complex x = 3 + 2i;
って使い方がしたいんじゃないのか?そいつぁ無理だ。(少なくともおれの知識じゃ)
なぜそこでscanfが出てくるのがさっぱりわからんが
>complex x = "3 + 2i";
なら、実装は可能だ。
ただ、種々の書式に対応するとめんどくさそうなことこの上ない実装になりそう。

330:デフォルトの名無しさん
08/04/04 01:15:48
プログラム内では、(x,y)の形にするか複素数型に変換するしか無い

331:デフォルトの名無しさん
08/04/04 01:22:17
scanf("%d+%di", &x, &y);
みたいな?w

332:デフォルトの名無しさん
08/04/04 01:35:28
いや、入力は文字列で扱ってるんだが、
"1+2i"じゃなくて、"(1,2)"みたいに、実装してあるのは何で?
って質問だと思われw

333:デフォルトの名無しさん
08/04/04 01:54:54
C++標準のcomplexって使ったことないんだけどそういう仕様なの?
仕様なら仕方ないが信じがたいんだがw

334:デフォルトの名無しさん
08/04/04 01:58:38
C++はこうだろ?

std::complex<double>(1, 3)

335:デフォルトの名無しさん
08/04/04 02:10:39
complexをiostreamで出力するときに、
"1+2i"じゃなくて"(1,2)"となっているのは何で?
ってことだろ。

336:335
08/04/04 02:12:00
× complexをiostreamで出力するときに、
○ complexをiostreamで入出力するときに、

337:デフォルトの名無しさん
08/04/04 02:23:09
コピペして使えるようにじゃね?

338:デフォルトの名無しさん
08/04/04 02:41:24
335の人が言っているのが、こっちの意図です。でも最初の人がC言語ではサポートしていない、
というのがどういう意味だったのかはわかりました。
文字列で扱うんなら、4+5iとかでも問題ないと思ったのですが、(,)で実装してしまったし、、、
4+5iとかはちょっと面倒くさそう。



339:デフォルトの名無しさん
08/04/04 07:40:38
iだったりjだったりするからじゃねw

340:デフォルトの名無しさん
08/04/04 12:05:27
テンプレートクラス作って、
そのポインタをlistにつっこんで
イテレータで走査しようとしたら怒られる

//Error
list<Hoge<T>*>::iterator it;

expected `;' before "it"

テンプレートクラスを
テンプレートのままぶち込むのがいけないのか、
それとも別のところがいけないのかでいいんで教えてください

341:デフォルトの名無しさん
08/04/04 12:30:31
- list<Hoge<T>*>::iterator it;
+ typename list<Hoge<T>*>::iterator it;

342:デフォルトの名無しさん
08/04/04 12:34:55
ああ、そういうことだったのね(´・ω・`)

ありがとー

343:デフォルトの名無しさん
08/04/04 12:35:00
>>340
そりゃ型決まってないと無理でないか?
list<Hoge<int>*>::iterator it;
とかならいけると思うけど。


344:デフォルトの名無しさん
08/04/04 12:41:23
gccだとちゃんとエラーはいてくれるがVCだと通るから困る

345:デフォルトの名無しさん
08/04/04 15:28:40
を、2ページ目にも修正入ったみたいだな。

346:デフォルトの名無しさん
08/04/04 16:45:18
教えて!!
言語を勉強したいのだが何がお勧め??
C++??Java??

347:デフォルトの名無しさん
08/04/04 16:46:17
目的は?
趣味なら何でもいいと思うよ。

348:デフォルトの名無しさん
08/04/04 16:47:57
>>346
BASIC

349:デフォルトの名無しさん
08/04/04 16:51:06
>>347
>>348
仕事でUNIXのオペレータをしています。
言語を覚えてスキルアップしたい。と思っています。
でも色んな言語がありすぎて何を始めればいいのか
分かりません。今の時代にあっていてこれからも使っていけそうな
言語を教えて下さい。お願いします。

350:デフォルトの名無しさん
08/04/04 16:53:20
>>346
スレタイが読める程度の日本語。

351:デフォルトの名無しさん
08/04/04 16:53:45
UNIXならまずはシェルスクリプトからはじめてみては?
で、awk&sed、perl、python or rubyと進むとか。

352:デフォルトの名無しさん
08/04/04 16:57:41
C/C++のスレで訊かれたなら、やっぱりC/C++と答えるべきか

353:デフォルトの名無しさん
08/04/04 16:58:14
C#といってみる

354:デフォルトの名無しさん
08/04/04 16:59:02
C++では簡単に出来てJavaでやりにくい事
その逆などを教えて下さい。

355:デフォルトの名無しさん
08/04/04 17:03:38
その手の質問はぐぐったほうが丁寧な解説出てくるよ
ここで聞いてもすれ違いのうえ端的だったり極端すぎる答えしか返ってこないよ

356:デフォルトの名無しさん
08/04/04 17:15:06
初心者のためのプログラミング言語ガイド Part7
スレリンク(tech板)

357:デフォルトの名無しさん
08/04/04 20:28:22
初心者はまずこれを読んで
ポインタを理解すること

URLリンク(builder.japan.zdnet.com)


これができない奴はC/C++いじるの辞めろ
適正が0かマイナスだ

358:デフォルトの名無しさん
08/04/04 20:58:48
>>94

359:デフォルトの名無しさん
08/04/04 21:22:45
それ1週間前のネタ

360:デフォルトの名無しさん
08/04/04 21:50:48
C++にポインタ排卵だろ

361:デフォルトの名無しさん
08/04/04 21:57:43
まあ大部分は排除できるな。

362:デフォルトの名無しさん
08/04/04 22:21:10
constメソッドからでもポインタ型メンバの参照先なら操作し放題とか駄目活用している

363:238
08/04/04 22:32:21
protectedでstaticな独自クラスの配列の参照の初期化で他のクラスのメンバ変数を与えたいんですが
無理ですよね・・・?
もし他のクラスのstatic変数なら大丈夫でしょうか?

364:デフォルトの名無しさん
08/04/04 22:36:38
RTTIは実際にどういう場面で使われるんですか?

template<typename T> void hoge(const T &a) {
  if (typeid(a) == typeid(int)) { ... }
}

とかやるんですかね

365:デフォルトの名無しさん
08/04/04 22:37:35
クラスのインスタンス自身への参照ならいくらでも可能だと思うが、
その中のメンバ変数と言われると難しいというか、
そもそもそんな怪しい事しようとしている事にまず疑問を持たざるを得ない。

366:デフォルトの名無しさん
08/04/04 22:38:45
>>364
dynamic_cast も RTTI を利用してる。
typeid はあまり使う事は無いな。

367:デフォルトの名無しさん
08/04/04 22:54:27
dynamic_castなら、よくこういう状況で使いたくなる。
1. ライブラリの用意した基底クラスBから派生した自作クラスDを作る。
2. Dのインスタンスをライブラリに渡す。
3. ライブラリからのコールバックで2で渡したものがB型への参照・ポインタで与えられる。
この例だと結局boost::polymorphic_downcastにするんだけどね。

>>364
その例だったら特殊化で十分。

368:デフォルトの名無しさん
08/04/04 23:00:11
配列の参照のスタティックなクラス変数のクラス定義外での宣言って
Hoge Piyo::(&foo)[][100];
じゃないの・・・?

369:デフォルトの名無しさん
08/04/04 23:05:51
とりあえずコンパイルの通るコードを頼む

370:デフォルトの名無しさん
08/04/04 23:09:04
>>360

多態とか

371:デフォルトの名無しさん
08/04/04 23:09:50
スマートポインタでいい。

372:デフォルトの名無しさん
08/04/04 23:58:47
でいいというか、ポインタ使えないなら、ポインタもどきを使うしかない。
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、
嫌でもポインタ使わなきゃならないと思うんだけど。



373:デフォルトの名無しさん
08/04/05 00:07:58
大体ポインタを理解できないならスマートポインタも理解できないかと
360は何を言いたかったのだろう

374:デフォルトの名無しさん
08/04/05 00:08:53
スマートポインタはアドレス演算とかやらないから
scoped_ptr くらいなら何とかなるんじゃね?

375:デフォルトの名無しさん
08/04/05 00:15:57
ダメな奴は、やり方が言語仕様に引っ張られる。

376:デフォルトの名無しさん
08/04/05 00:17:42
いやイテレータ使うならアドレス演算と大して変わらないんじゃないか
ポインタわからないようではC++できないというのは真実だと思うけど

377:デフォルトの名無しさん
08/04/05 01:24:51
排卵日

378:デフォルトの名無しさん
08/04/05 03:16:18
メンバ変数の文字列の一部を新しい文字列として返したいんですが
どういう方法がありますか?

こういうのです

class Test {
private:
 char data[256];
public:
 char * getStr()
 {
  char *ret = new char[3];
  ret[0] = data[0];
  ret[1] = data[1];
  ret[2] = data[2];
  
  return ret;
 }
};

これを

std::string str = getStr();

このように使った場合retのデリートができないので
メモリリークしますよね?何かいい方法ありませんか?

379:デフォルトの名無しさん
08/04/05 04:35:02
const std::string getData() const { return std::string( data ); }

380:デフォルトの名無しさん
08/04/05 06:48:36
終端に '\0' を追加するのも忘れずに

381:デフォルトの名無しさん
08/04/05 08:04:56
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、

382:デフォルトの名無しさん
08/04/05 08:49:39
void getStr(std::string& str) const {
 str.assign(data, 3);
}
std::string getStr() const {
 return std::string(data, 3);
}

後者は代入する時にコピーが発生するので場合によっては効率悪いが
(初期化の場合は大抵のコンパイラなら戻り値最適化してくれるので大抵コピーは発生しない)、
かといって前者は必ず変数用意しないといけない。

どっちにするか、あるいは両方用意するかはお好きなように。


まあ、string にどんなメンバがあるかくらい見とけ。
URLリンク(www.wakhok.ac.jp)

383:デフォルトの名無しさん
08/04/05 10:43:49
>>381
参照のようなconstなメンバー変数を持つとコピーコンストラクタが書けない
一方ほとんどのコンテナはメモリ確保を自動でするからコピーが発生する
常識だと思ってたんだけどどこかおかしいのか

384:デフォルトの名無しさん
08/04/05 10:53:24
デフォルトコンストラクタが書けないと言った方が正しいか

385:デフォルトの名無しさん
08/04/05 11:06:11
コピコンは書けるだろ?
書けないのは代入演算子。

386:デフォルトの名無しさん
08/04/05 12:09:51
終了文字の\0って入れなきゃいけないんでしょうか。
サンプルで\0を使っているコードを\0消しても正常に動作するんですが。

387:デフォルトの名無しさん
08/04/05 12:14:40
BCCで「異なる ~型へのポインタが混在している」って出るんですが、
これってどうすれば解決できるんでしょう?
箇所は
vsprintf(unsigned char*,const char*,va_list);
って使ってるところなんですが、unsignedのポインタからsignedのポインタにはキャストできないって言われたし・・・

388:デフォルトの名無しさん
08/04/05 12:14:41
>>386
コードによる。サンプル晒せ。
実はどこかで\0が付いているだけかもしれない。

389:386
08/04/05 12:28:09
>>388
これです。
int CreateSave() {
HANDLE hFile;
SYSTEMTIME st;
TCHAR szTime[128];
TCHAR *lpszBuf;
DWORD dwAccBytes;
DWORD dwSize = 0L;
       HGLOBAL hMem;
DWORD dwLen;

GetLocalTime(&st);
wsprintf(szTime,_T("\r\nファイル作成時: %d年%02d月%02d日%02d時%02d分%02d秒"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

dwLen = (DWORD)lstrlen(szTime);


390:386
08/04/05 12:28:48
続き

hFile = CreateFile(_T("ファイルログ.txt"),GENERIC_READ, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
dwSize = GetFileSize(hFile, NULL) + dwLen;

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';
hFile = CreateFile(_T("ファイルログ.txt"), GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf), &dwAccBytes, NULL);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);

return -1;
}

391:デフォルトの名無しさん
08/04/05 12:30:09
>>387
(const signed char *)にキャスト

392:デフォルトの名無しさん
08/04/05 12:50:12
>>390
よく読んでないけどstrcat(lpszBuf, szTime);この時点で¥0がついてると思われ

393:デフォルトの名無しさん
08/04/05 12:58:53
>>391
constってことは第2引数にですよね?やったら同じエラーが2個に増えたんですけど・・・

394:デフォルトの名無しさん
08/04/05 12:59:59
constを破るキャストがあるんですが、あれがあったらconstの意味なくないですか?

395:デフォルトの名無しさん
08/04/05 13:04:11
constは破るためにある
だから const const charがあるだろ

396:デフォルトの名無しさん
08/04/05 14:33:43
>>390
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';

このあたりか。
何か無茶苦茶危険なコードに見えるんだけど。

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);  ← dwSize 文字分のメモリを確保してるつもりのようだが、+1 の位置がおかしい(TCHAR が2バイトの時に領域が足りない)
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);  ← dwSize 読み込む
CloseHandle(hFile);
lstrcat(lpszBuf, szTime); ← '\0' を付けないまま lstrcat は危険というか、szTime の文字数分領域がさらに必要なんだけどその領域を確保すらしていない
lpszBuf[dwSize] = '\0'; ← lstrcat の前に行う

397:デフォルトの名無しさん
08/04/05 14:35:01
しかも、lpszBuf[dwSize] = '\0'; じゃなくて lpszBuf[dwAccBytes] = '\0'; だな。

398:デフォルトの名無しさん
08/04/05 14:41:08
Unicodeビルドかどうかで、ファイルの文字コードまで
影響を受けるというのは良くない場合のほうが多いと思うけど、
それはいいのか?

399:デフォルトの名無しさん
08/04/05 15:57:43
何もひねらずに考えるとこうですが

if( n % 2 )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );

奇数か偶数か調べるもっともスマートなコードってどんなんですかね?


400:デフォルトの名無しさん
08/04/05 15:59:38
int isOdd(int n){ return n % 2; }

if( isOdd(n) )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );

401:デフォルトの名無しさん
08/04/05 16:00:21
スマートってのが読みやすいって意味ならそれでいいんじゃね?
スマートが短いって意味なら、いろいろあるだろうけど。

402:デフォルトの名無しさん
08/04/05 16:00:43
inline bool isOdd(int n) { return n % 2 != 0; }

403:デフォルトの名無しさん
08/04/05 16:07:03
下位1bitでも調べればいいんじゃね
スマートといえるかわからんけど

404:デフォルトの名無しさん
08/04/05 16:08:36
最下位ビット調べて0なら偶数

405:デフォルトの名無しさん
08/04/05 16:09:05
かぶった><

406:デフォルトの名無しさん
08/04/05 16:10:52
この程度なら最適化されないのかな?

407:デフォルトの名無しさん
08/04/05 16:23:00
まともなコンパイラならするよ。

408:デフォルトの名無しさん
08/04/05 17:00:52
std::string のfind()とfind_first_of()の違いって何ですか?
どちらも最初の位置を返すと思うんですが

409:デフォルトの名無しさん
08/04/05 17:04:02
findはコンテナから特定の要素を見つける。
find_first_ofはコンテナから特定のコンテナの要素を見つける。

410:デフォルトの名無しさん
08/04/05 17:21:25
std::string str("hogefugapiyo");
std::string::size_type find = str.find_first_of("abc");

"abc"のうち一番最初に見つかった要素の位置を返す
コンパイルが通るかは試してないのでわからん

411:デフォルトの名無しさん
08/04/05 18:17:44
質問です。
以下のような二つのコードの時間を計ってみたら、
コードBの方が早く、コードAはすさまじく重くなりました。
なぜでしょうか?
あと、コードAの方で、変数aをデバッグで値を見ると、
1.731e-040#DEN のように表示されます。
#DENとは何なんでしょうか?
よろしくお願いします。

環境はVisual c++ 2005です。

//コードA
for(int i =0; i< 5000; i++){
float a = 1.731e-040f;
float b = 1.731e-040f;
float the_test = a*b;
}

//コードB
for(int i =0; i< 5000; i++){
float a = 0.1f;
float b = 0.1f;
float the_test = a*b;
}

412:デフォルトの名無しさん
08/04/05 18:31:22
>>411
DENormal number (非正規化数)

FPUによっては非正規化数の演算をサポートしてなくて、
これをソフトウェア側でエミュレートしてる場合がある。
すると、パフォーマンスが落ちる原因になる。

413:じじ
08/04/05 18:57:43
MFCをつかったマルチスレッドプログラミングを仕事で要求されているの
ですが、APPクラスの子レッドとしておくのがいいのでしょうか?

414:デフォルトの名無しさん
08/04/05 19:17:30
enum は ビットマスクしてもいいですか?

415:デフォルトの名無しさん
08/04/05 20:03:42
どうやったらうまくコーディングできるんだろう?
すぱげってぃーなコードになってしまう。やっぱり慣れるしかない?

以下サンプル

void binary_search(double x,double y,double *z)
{
int i;
double c,j;
j = 0.0000001;

for(i=0;y*y - 2 > j;i++)
{

if(x*x - 2 < 0 && y*y - 2 > 0)
{
c = (x+y)/2;
if(c*c - 2 > 0) y = c; else x = c;
}
binary_search(x,y,z);
}

*z = x;

}

再帰しまくりでサーセン。でもどうやったら再帰せずに実現できるだろう?
考えるのが面倒&考えても良く分からないので再帰に走る今日この頃。

416:デフォルトの名無しさん
08/04/05 20:04:37
無理に再帰を使わない方がスパゲティ化する。

417:デフォルトの名無しさん
08/04/05 20:11:04
再帰はスタックで実現している。

418:デフォルトの名無しさん
08/04/05 20:12:39
>>415
何がしたいんだよ?

binary_search(x,y,z);

//binary_search(x,y,z);

419:デフォルトの名無しさん
08/04/05 20:21:12
バイナリサーチをバイナリデータのサーチと勘違いしてたりして
変数一文字でコメントもなくて通じると思ってるんだろうか

420:デフォルトの名無しさん
08/04/05 20:29:23
binary search じゃなくて bisection method の間違いだったわ
恥ずかしい。。。。鬱だしのう orz

421:デフォルトの名無しさん
08/04/05 22:55:05
これが日本のITレベルだ


スレリンク(prog板:43-44番)

くずばっかw

422:デフォルトの名無しさん
08/04/05 23:05:51
>>421
すまん、記事のコメントと同じ事をいいたいのか
それとも、2ページ目の解説についていいたいのか
さっぱり分からないから、ちゃんと説明してくれないか?


423:デフォルトの名無しさん
08/04/05 23:06:44
x 日本
o IBM

424:デフォルトの名無しさん
08/04/05 23:37:02
内部に二次元配列をもつクラスから、instance[0][0]みたいな書き方で値を取得したいと思ってます。
double operator[][](int x, int y)
のような書き方は出来ないみたいなので、(コンパイル失敗しました)、
この場合どうすればいいでしょうか?



425:デフォルトの名無しさん
08/04/05 23:47:13
要素数が100万くらいあるvectorを半分にして50万要素のvector2つにしたいのですが、
50万番目のiteratorを取得するのにiterator++ を50万回呼ぶ以外の方法はないのでしょうか。
vector<int>::iterator it=vec.begin()+vec.size()/2
とかいう感じだと演算子+は定義されていない、とかでダメなもんで。
この辺がポインタとの違いかなとは思うのですが。

426:デフォルトの名無しさん
08/04/05 23:50:06
επιστημη ってこんなところにも出没するんだな

427:デフォルトの名無しさん
08/04/05 23:54:19
>>425
std::advance

というか、+ は定義されているはずなのだが、
どんなコンパイラ使ってるの?

428:デフォルトの名無しさん
08/04/05 23:54:52
>>425
コンパイラ何使ってるの?
vector のイテレータはランダムアクセスイテレータのはずだから、
コンパイラの実装がおかしいだろ、それは。

429:デフォルトの名無しさん
08/04/05 23:55:08
>>425
vector<int>::iterator it= &vec[vec.size()/2];
みたいな感じでできないか?

430:デフォルトの名無しさん
08/04/06 00:01:24
>>429 それはダメ。ポインタとごっちゃになってる。

431:デフォルトの名無しさん
08/04/06 00:08:31
PCSX2というソフトをコンパイルしたいんですがやり方がわかりません。
プログラムについての知識0です。
勉強したいとかではなくこのソフトがほしいだけです。

Microsoft Visual C++ 2008をとりあえずインストールしましたがやり方がまったくわかりません。
サルにも判るように教えてくれる方がいれば幸いです。

URLリンク(www.pcsx2.net)

URLリンク(pcsx2.svn.sourceforge.net)

432:425
08/04/06 00:10:23
すみません。できました。どこかで間違った思い込みしてたみたいです。

433:デフォルトの名無しさん
08/04/06 00:23:40
>>430
ランダムアクセスイテレータはポインタ互換だと勘違いしてた
そういう実装が多いだけか

434:デフォルトの名無しさん
08/04/06 00:25:07
>>433
使用可能な演算子はポインタと同じだが、
ポインタとの間で相互変換することはできない。

435:デフォルトの名無しさん
08/04/06 00:26:14
ただし、ポインタもランダムアクセスイテレータの一種だけどね。

436:デフォルトの名無しさん
08/04/06 01:01:40
>>424
プロキシクラスを返す。
class A
{
public:
class Proxy
{
public:
double operator[](int y);
};
Proxy operator[](int x);
};

437:デフォルトの名無しさん
08/04/06 01:06:20
ポインタ返せるならそれでいいと思う。
範囲チェックしたければ何かクラス返すことになると思うけど。

438:デフォルトの名無しさん
08/04/06 10:48:56
>>431
スレ違いだということ、サルでも分かるかな?

439:411
08/04/06 12:00:53
>412
回答ありがとうございます。
遅くなる原因がわかり、勉強になりました。

ありがとうございました。

440:デフォルトの名無しさん
08/04/06 12:57:53
>>436-437
ありがとうございます。
以下のような実装でいいですか? (あまりスッキリしてないような、、)
class test {
public:
test(int arg_size);
struct Proxy {
Proxy(int arg_size) : size(arg_size) {
vec.assign(size, 0.0);
}
double &operator[](int y) {
return vec[y];
}
std::vector<double> vec;
int size;
};
Proxy &operator[](int x) {
return proc_vec[x];
}
std::vector<Proxy> proc_vec;
int size;
};



441:デフォルトの名無しさん
08/04/06 13:36:20
ていうかよっぽどの理由が無いなら()演算子のでいいじゃん

442:デフォルトの名無しさん
08/04/06 14:08:59
クラスの中身の先頭にusing namespace ~;は書けないの?

443:デフォルトの名無しさん
08/04/06 14:11:20
>>441
なるほど、たしかに全然すっきり書けますね。
メンテもしやすそうだし、こっちにします。
ありがとうございます。

class Matrix {
public:
Matrix(int arg_size) : size(arg_size) {
vec.assign(size, std::vector<double>(size));
}
std::vector< std::vector<double> > vec;
int size;
double &operator()(int x, int y) {
return vec[x][y];
}
};



444:デフォルトの名無しさん
08/04/06 14:18:34
>>443
440でもそうだったけど、size変数って不要じゃね?

445:デフォルトの名無しさん
08/04/06 15:13:16
>>443
更にで何だけど、要素数のパターンが少なくて、定数でしか使わないなら要素数テンプレートにしちゃうと
ベクターも使わずに済むが・・・
用途分からんからしらね

446:デフォルトの名無しさん
08/04/06 15:15:45
エラー 1 error LNK2001: 外部シンボル ""private: static int Forms::Application::nCmdShow" (?nCmdShow@Application@Forms@@0HA)" は未解決です。 main.obj
ってどういう意味のエラーですか?

447:デフォルトの名無しさん
08/04/06 15:21:22
>>446
宣言だけされてて関数が定義されていない。


448:デフォルトの名無しさん
08/04/06 15:34:25
>>445
どうやるんですか?
要素は、二次元ベクトルなんですが、1000×1000要素くらいです。



449:デフォルトの名無しさん
08/04/06 15:36:35
>>446
プロジェクトのリンクするライブラリの設定で
必要な関数入ったLIBファイルを設定しわすれてるんじゃない

450:デフォルトの名無しさん
08/04/06 15:37:08
>>444
その通りですね。
size変数は消します。

451:デフォルトの名無しさん
08/04/06 15:46:43
>>448
vectorの要素数って変わるの?

452:デフォルトの名無しさん
08/04/06 16:25:26
>>448
横レスだが、こういうことだと思う。
template<int size_x, int size_y> class Matrix {
public:
double& operator()(int x, int y) { return v_[x][y]; }
private:
double v_[size_x][size_y];
};

1000×1000は大きいので、スタックには置けないけど。

453:デフォルトの名無しさん
08/04/06 16:43:03
よくみるLPクラス名って、そのクラスのポインタ型って事?

454:デフォルトの名無しさん
08/04/06 17:00:20
>>453 そういう名前付けの規則が昔はやってたんだよ。

455:デフォルトの名無しさん
08/04/06 17:02:13
ある天気予報サイトの三重県の天気情報の文字列だけを抽出して自分のホームページに乗せるプログラムを書きたいのですが、どういったことを勉強すれば良いのかご教示願えないでしょうか。宜しくお願いします。

456:デフォルトの名無しさん
08/04/06 17:13:54
>>455
・サイトにアクセスしてページを入手する
・ページを加工する
・自サイトに貼り付ける
WebProg板へどうぞ。

457:デフォルトの名無しさん
08/04/06 17:32:48
エラー 1 error C2143: 構文エラー : ';' が 'Forms::Application::frm' の前にありません。 application.cpp 7
エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 4 error C2371: 'frm' : 再定義されています。異なる基本型です。 application.cpp 7
>>449
>>447
解決しました。
が、今度はこんなエラーが。
定義はしたんですが、今度は定義した場所でエラー吐くようになりました。

458:デフォルトの名無しさん
08/04/06 17:52:08
>>457

>>54-

459:デフォルトの名無しさん
08/04/06 19:44:31
ありがとうございました。
名前空間をちゃんと指定してなかったのが原因でした。

460:デフォルトの名無しさん
08/04/07 02:21:47
ヘッダに定義とか書けちゃうんだけど、
分けた方がええの?

分ける理由ってなんですか?

461:デフォルトの名無しさん
08/04/07 02:41:53
>>460
定義のほうをあらかじめコンパイルしてオブジェクトにしとける
小さいなら定義も一緒でいいだろ
boostとかにもそういうのあるよ

462:デフォルトの名無しさん
08/04/07 02:46:51
>>460
プログラムサイズが増えたり重複オブジェクトができたりコンパイルが通らなかったりする

463:デフォルトの名無しさん
08/04/07 02:49:17
ヘッダに関数書くならstaticつけるかファンクタにするかテンプレートにしとけよ。

464:デフォルトの名無しさん
08/04/07 02:54:18
こういう質問をする人のレベルだと、一番掴みやすいのはコンパイル時間の問題かなぁ。

>>460
たとえば、計10万行くらいあるソースファイル群のすべてが
直接or間接的にhoge.hppというヘッダファイルをincludeしているとして、
hoge.hppが実装まで全部書いてあるモノだったとすると、
その実装部分をほんの1行変更しただけで、10万行のソースファイル群が
すべて再コンパイルされることになる。
定義を別ファイルにしておけば、変更したときに再コンパイルするのはそのファイルだけで済む。

465:デフォルトの名無しさん
08/04/07 04:53:14
LinuxにおいてHDDの容量を取得したいのですがどの様にすればよいのでしょうか?

466:デフォルトの名無しさん
08/04/07 04:59:01
ただのグローバル変数とstaticをつけたグローバル変数って同違うんですか?

467:デフォルトの名無しさん
08/04/07 06:43:59
>>465
Linux板へどうぞ。ulimitでできるでしょ。

>>466
前者は文字通りGlobal。後者はファイルスコープなので違う翻訳単位からは見えない。
どちらにしても、可能な限り使わないに越したことはない。

468:デフォルトの名無しさん
08/04/07 07:14:53
>>464
>>463
>>462
>>461
ありがとう。
なんとなくわかった。

469:デフォルトの名無しさん
08/04/07 07:45:15
>>463
ヘッダに関数書くときに、static付けたり、ファンクタにしたり、テンプレートにしたりすると、
どういう点でいいですか?全然考えてませんでした。



470:デフォルトの名無しさん
08/04/07 07:59:53
関数が複数実体化されることを抑制できる。

471:デフォルトの名無しさん
08/04/07 12:23:30
★ 今世紀最大の大祭り!聖火を巡る障害物リレー 日本イベント来たる! ★

【目的】
 街中をオニが駆け巡ります。
 オニは聖火を持って移動します。これを消すのが目的です。

 ただし、今回は参加者が多いため難易度がはね上がりました。
 今回のみ、オニは壁役に守られながら走ります。
 壁役を突破して聖火を消せばゲームクリアとなります。

【ルール】
~勝ち~
 オニが持っている聖火を消すとその時点でゲームクリアとなります。
~負け~
 オニが若里公園まで逃げ切るとその時点でゲームオーバーとなります。

【日時    】 2008年4月26日(土)8:30スタート
【場所    】 長野県長野市
【ルート地図】 URLリンク(www.city.nagano.nagano.jp)
【詳細情報 】 URLリンク(www.joc.or.jp)
-------------------------------------------------------------
イギリスで行われたイベントの様子
URLリンク(jp.youtube.com)
フランスで行われたイベントの様子(1分30秒から)
URLリンク(jp.youtube.com)

『2ch大規模OFF会場』
スレリンク(offmatrix板)
スレリンク(offmatrix板)

『各国の競技結果』
URLリンク(ja.uncyclopedia.info)

472:デフォルトの名無しさん
08/04/07 18:43:10
四則演算ってさ、
char でも int でも double でもしてくれるが、
それってコンパイル時に適切にマシン語に変換してくれてるんですか?

CPUが持ってる算術演算の機能を使えるように
置き換えてるのであってCPUが int なのか char なのか判断して
処理してるわけではないですよね?

473:デフォルトの名無しさん
08/04/07 18:51:06
>>472
そうだよ
ないです

474:デフォルトの名無しさん
08/04/07 19:12:35
ただし格上げされて計算されるので種別はそんなに多くないです。

475:デフォルトの名無しさん
08/04/07 20:03:56
格上げ、というか汎整数拡張あたりじゃないのかな

476:デフォルトの名無しさん
08/04/07 22:26:22
とりあえず宿題スレの方で提出が終わったので、
自分なりに作ろうと思っているのですが、いきなり行き詰ってしまいました;
整数の場合8桁、負数の場合9桁、エラー仕様など、問題が山積みですが、
どうかご教授お願いします。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

477:476
08/04/07 22:28:20
#define buffersize 10ですね;

478:デフォルトの名無しさん
08/04/07 22:41:06
>>476
何がしたいんだ?宿題をといて自分なりに課題を拡張して勉強しようとしたのか?
そのテキストファイルを見せられても、課題を丸投げされているようにしか見えないが。

とりあえずバッファオーバーフローしてたり、いろいろまずいぞ。

479:デフォルトの名無しさん
08/04/08 10:55:17
URLリンク(www.nicovideo.jp)

この動画でやっている、画像ファイルをテキスト(AA)に変換は
どのようにやっているのですか?

480:デフォルトの名無しさん
08/04/08 11:03:12
動画にコード出てるじゃないか……

481:デフォルトの名無しさん
08/04/08 11:08:11
画像の輪郭抽出→予めこのパターンにはこの文字を使うというデータを登録しておく→
画像の上から順にパターン解析と文字割り当てを行う。

って感じしか思い浮かばん

482:デフォルトの名無しさん
08/04/08 11:08:35
>>480
初心者なもので・・・
画像を読み込んで、テキストに変換してさらにそれの色を判別してつけるのは
どの辺のコードを見たら良いのでしょうか?

483:デフォルトの名無しさん
08/04/08 11:19:20
今動画見てきたぜ。想像してたのと違ったぜ。とりあえずBMPを配列にするとこからはじめたら?
BMPのフォーマット↓凄く簡単だからすぐできるはず。
URLリンク(www.kk.iij4u.or.jp)
後は色に合わせて<font color="色">■</font>をひたすら出力すればできるだろ。
中級入門くらいじゃね?動かしたいならJavaScriptの解説かじればおk


484:デフォルトの名無しさん
08/04/08 12:38:37
>>476
とりあえず、どのあたりで困ってるのかな。?

mainに全部書くのではなく関数を作ってみよう。
引数をまとめれば、何をするべきかわかるんじゃないかな。


485:デフォルトの名無しさん
08/04/08 12:43:09
昔、先輩が「コンストラクタではnew使うな」と言っていたのを思い出したのだけど、
これってどういう意図なのでしょう。
一般的なルールなのか、特定の状況で有効な話だったのか……。

486:デフォルトの名無しさん
08/04/08 12:47:03
>>485
コンストラクタ内で例外が発生すると、デストラクタは呼ばれない (仕様)
→ new でコケたらリーク!

じゃね?
コンストラクタ内の例外は漏れなくコンストラクタ内で処置すれば無問題。

487:デフォルトの名無しさん
08/04/08 13:04:20
>>479
お絵かきとかでもあるネタだけど、むしろどうやって動画にしてる
のかの方が気になる。コーディング中ずっと録画してあとで編集
してるんだろうが…根性あるなw

488:デフォルトの名無しさん
08/04/08 13:17:33
コーディング中のキータイプを記録、編集

動画を取りながら記録したキータイプをマクロで動かす

(`゚'Д`゚')

489:デフォルトの名無しさん
08/04/08 13:24:03
>>479
画像を読み込んで表示するところから始めたらいい
結構親切っぽいから彼のサイトの掲示板で聞いてみれば
講座の方はかなり酷いスパゲティコードだからお勧めしないw

490:デフォルトの名無しさん
08/04/08 16:01:19
この講座、どんな感じ?

URLリンク(weblearningplaza.jst.go.jp)

491:デフォルトの名無しさん
08/04/08 18:21:58
cinからdoubleを1つまたは複数入力させます。入力されたのが1個なのか、複数なのか判定したいのですが、
以下のコードでよいですか?Macだとうごくのですが、windowsでもこれでいいのかわかりません。
double a;
std::cin >> a;
if (std::cin.peek() == '\n') {
// 数字は一個だった
}
else {
// 一個じゃなかった。
}


492:デフォルトの名無しさん
08/04/08 18:48:09
>>491
やってみりゃいいじゃない。

493:デフォルトの名無しさん
08/04/08 19:06:50
>>492
ありがとうございます。今手元にwindowsがないのです。
また、自分のところのwindowsでやってみて動いても、ほかの人のwindowsでは
どうなるかわからないし…
その、規格的に入力の文字列末判定はこれでいいのかどうか、知り痛いです。

494:デフォルトの名無しさん
08/04/08 19:10:04
>>485
VC8で大量にメモリの確保しているとコンストラクタの中のnewで「メモリが不足しています。」とエラーがでる。
理由が分からずallocにしたら問題なかった。
というか今も原因が掴みきれない件。

495:デフォルトの名無しさん
08/04/08 19:20:20
使う型がある程度限定できるテンプレートだったら
MyTemplate<型名>をtypedefしてしまえば良いような気がするけど
これってありなんですかね?


496:デフォルトの名無しさん
08/04/08 19:38:16
まさにstringとwstring

497:デフォルトの名無しさん
08/04/08 20:08:28
>>493
つボラギノール

498:デフォルトの名無しさん
08/04/08 21:56:33
>>495
あり。

499:デフォルトの名無しさん
08/04/08 21:59:56
ありあり。

500:デフォルトの名無しさん
08/04/08 22:04:32
ありありありあり。

501:デフォルトの名無しさん
08/04/08 22:05:12
ありが十匹で

502:デフォルトの名無しさん
08/04/08 22:14:19
さよならだ

503:デフォルトの名無しさん
08/04/08 22:23:50
アリーヴェデルチ

504:476
08/04/08 22:28:39
>>478
ですよね、失礼しました;

>>484
エラー仕様を作ろうとしたのですが、
【整数の場合最大8桁までを有効とし、9桁以降を無視する。
 負数の場合は、最大9桁までを有効とし、10桁目以降は無視する。】とあり、
【『-』のみ、または改行のみ入力されたらエラーメッセージを表示し、終了】
というのもあるので、
エラーとしては if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
みたいなのを使えばいいのかなぁ、程度で考えてるのですが、
どこに入れればいいのかなどイマイチ判らないのです;

505:デフォルトの名無しさん
08/04/08 22:34:19
ひょっとしてその数え方だと、「-1」は2桁なのか?

506:476
08/04/08 22:53:28
>>505
私的にはそういう風に考えてます;

507:デフォルトの名無しさん
08/04/08 22:54:05
>>486
なるほどー例外ですか。それは思い浮かばなかった。
newしたときの初期化の処理が無駄だったりするのかとか当時考えたのを思い出した。

508:デフォルトの名無しさん
08/04/08 23:02:41
>>504
whileを抜けて
>if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
の場合にreturnで終わればOK
returnの前にprintfで適当にエラー出せば目的のものになるだろ。
>どこに入れればいいのかなどイマイチ判らないのです;
どこに入れてダメだったんだ?

509:デフォルトの名無しさん
08/04/08 23:09:47
classのなかにnamespaceは作れますか?

510:デフォルトの名無しさん
08/04/08 23:19:28
muri

511:デフォルトの名無しさん
08/04/09 03:14:20
質問なのですが、(VC++ 2008 EE を使用しています。)

以下のコード。

COORD coord;
HANDLE hConsoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleStdOut, coord);

は、<windows.h>をインクルードして使える、というのは判断できますが、
これはwindowsプログラミングなのでしょうか?
WinMain()関数も無いし、DOSで表示されるのですが、
こういったコードの総称は何と呼ばれているのですか?

説明下手で申し訳ないです。

512:デフォルトの名無しさん
08/04/09 03:17:27
WindowsのAPIに依存してるならどう考えてもWindowsプログラミングだと思うが…。

513:デフォルトの名無しさん
08/04/09 03:39:45
WindowSystem(≒GUI)プログラミングではないが、
(MS-)Windowsプログラミングだな。
ついでに言えば、コンソールウィンドウはDOSではない。

514:デフォルトの名無しさん
08/04/09 04:02:03
>>512
>>513

ありがとうございます。
この「COORD coord;」や「HANDLE」の意味が解らず、
じゃあ総称が判ればネットで検索できる、と思い至ったのですが、
ネットを見ても、C言語による(MS-)Windowsプログラミングが掲載されていないんですよね。
はぁ。。。

515:デフォルトの名無しさん
08/04/09 05:19:59
>>514
日本語訳は無いけどMSDNに載ってるよ。

516:Alexander The Great WAS ALBANIAN, the PROOF by Flamuri
08/04/09 06:53:32
URLリンク(www.youtube.com)

517:デフォルトの名無しさん
08/04/09 07:30:25
>>507
ちゃんと delete すれば問題ない。
例外を一旦コンストラクタ内でキャッチして delete するのもいいが、
スマートポインタに入れておけばあとはデストラクタが勝手に何とかしてくれる。

コンストラクタ内で例外が発生した場合に呼ばれないデストラクタは
構築中のオブジェクトのデストラクタだけだからね。
既に構築されたオブジェクトのデストラクタは全て呼ばれる。
例えば基底クラスのデストラクタとか
構築されたメンバ変数のデストラクタとかは全て呼ばれる。

new に関して気をつける必要があるのは事実だけど、
使っていけないってことはあり得ない。
まあ、初心者は使わない方が無難ってこと程度の話じゃないのかな。

518:デフォルトの名無しさん
08/04/09 09:01:29
いいえ、newを生で使っている人はちゃんとスキンをつけるようにしてください。

519:デフォルトの名無しさん
08/04/09 09:26:43
newに限らず例外を投げる可能性のある関数をコンストラクタ内で
呼び出すときはstack unwindを考えて対応する。

520:デフォルトの名無しさん
08/04/09 09:32:36
コンストラクタ内でnewが例外吐いたのをキャッチしたとして、
そのあと何をすれば良いのですか?

521:デフォルトの名無しさん
08/04/09 09:38:26
>>520
ケースバイケース
スワップが頻発してるなどメモリ不足でシステムがヤバイ状態なら
終了してシステム全体のシステムの再考。
そのエラーを無視してでも少しでも長く生き続ける必要が条件なら
ログにでも吐いて続行。

522:デフォルトの名無しさん
08/04/09 11:47:43
VC++2008EE
ListBoxの1行削除ができたので、今度は削除前に
メッセージボックスを出して見ようとしたのですが、
エラーがものすごい数出てしまいました。

System::Windows::Forms::DialogResult result;
result = MessageBox::Show("削除しますか?","DELETE CHECK",MessageBoxButtons::YesNo);
Debug::WriteLine(result);
if(result != System::Windows::Forms::DialogResult::Yes)){
return;
}
if文全体を削除すると問題なく動作し、
また、出力ではYes,No確認できるので、
if文のSystem::Windows::Forms::DialogResult::Yesが、
問題なのかと思い、"Yes"とかにしてみたのですがやはりエラーが出てしまいます。
これはなぜエラーが出てしまうのでしょうか

523:デフォルトの名無しさん
08/04/09 11:56:41
>>519
それコンストラクタ関係ないだろ。

524:デフォルトの名無しさん
08/04/09 12:00:08
>>522
それ.netじゃん
AfxMessageBoxかAPIのMessageBox使うべし

525:デフォルトの名無しさん
08/04/09 12:03:48
>>520
コンストラクタ内で catch なんて書かないでいいように RAII を徹底したほうがいい。

526:デフォルトの名無しさん
08/04/09 12:14:47
>>524
ひと目でわかる Microsoft Visual C++ 2008 アプリケーション開発入門
という本を読みながらやっていて、
本書はC++/CLIで書いてある。とあるので、たぶん.netというやつだとおもいます。

この本の通りにやるとエラーが出てしまい、
エラーの内容見てもよく分からなくて、
いろいろ試してたのですが、結局原因が分からず聞いてみました。

この本で使っているMessageBoxにはなにか問題があったりするんでしょうか

527:デフォルトの名無しさん
08/04/09 12:21:41
>>526
C++/CLIてのはC++でなんとか.net使いましょうよ・・・っていう仕様
.netだけならC#の方がいいし、速度的にC++ならC++/CLIしないでMFCかAPI使った方がいい

528:522
08/04/09 12:30:18
申し訳ありません。もの凄く下らないミスでした。
if(result != System::Windows::Forms::DialogResult::Yes)){
かっこが一つ多かったです・・・スレ汚しすみませんでした。

>>527
うう、本まで買って気合い入れてしまったため再スタートは辛いです。
とりあえずこの道進んで、あとから徐々に方向転換してみます。
ありがとうございました。

529:デフォルトの名無しさん
08/04/09 12:33:15
>>528
C++/CLIなら↓の方で聞いた方がいいよ

C++/CLI part3
スレリンク(tech板)

530:デフォルトの名無しさん
08/04/09 15:29:32
>>528
甘いな。俺は最初どの本買ったらいいかわかんなくて結局3冊目まで買ったぞ

531:デフォルトの名無しさん
08/04/09 15:36:05
MFCってまだ使われてるのか?

532:デフォルトの名無しさん
08/04/09 15:44:23
>>531
きみのPCのMFC関連のDLL等を全て削除して使用してみればきみの環境での依存度が分かる

533:デフォルトの名無しさん
08/04/09 15:46:40
>>532
滑ってるよ

534:デフォルトの名無しさん
08/04/09 15:52:50
マジレス

535:デフォルトの名無しさん
08/04/09 17:07:16
MFC関連のDLL、スタティックリンクするから無くても動いちゃうよ
(俺のアプリは)

536:デフォルトの名無しさん
08/04/09 17:14:37
CString m_combo = "notepad.exe";
WinExec((LPCSTR)(LPCTSTR)m_combo,SW_SHOW);
これアプリが起動しないんですけどなんでですか


537:デフォルトの名無しさん
08/04/09 17:23:00
LPCTSTRをLPCSTRに変換しているのが限り無く怪しい。
LPCTSTRを引数に取るShellExecuteか何かを使え。

538:デフォルトの名無しさん
08/04/09 17:30:01
WinExecが好きなんですけど変換は不可能ですか?

539:デフォルトの名無しさん
08/04/09 17:33:34
なら(LPCSTR)(CStringA)m_comboでどうだ。
あと、引数の少なさなら<tchar.h>の_tsystemがいいぞ。

540:デフォルトの名無しさん
08/04/09 17:35:33
っていうかWinExecはdeprecatedな扱いのAPIのような気がする。

541:デフォルトの名無しさん
08/04/09 17:37:24
struct hoge_a{
int a;
int b;
};

struct hoge_b : public a{
int c;
int d;
};

としたとき、hoge_aのメンバのメモリ上の並び順はabとなるのは保証(規定)されていると
どこかで見た記憶があるのですが、hoge_bの場合、abcdとなることは保証されるのでしょうか?

542:デフォルトの名無しさん
08/04/09 17:54:09
>>539
動いたwお前すごいわ
どこにも乗ってなかったぞこんなの

543:デフォルトの名無しさん
08/04/09 18:27:43
srandのseedが同じ場合、マシンやOSが変わっても同じ乱数を発生させることができるのでしょうか?

544:デフォルトの名無しさん
08/04/09 18:32:25
>>543
No

545:デフォルトの名無しさん
08/04/09 18:42:27
そうすると何に依存するのでしょうか?
コンパイラですか?それともOSですか?
AMDとintelのようにCPUが変わっただけでもダメですか?

546:デフォルトの名無しさん
08/04/09 18:44:58
libcの実装次第?
時間と空間を使えばかなりランダムになりそうだけどなぁ。

547:デフォルトの名無しさん
08/04/09 19:10:37
>>543
移植性を考えるなら同じ種で同じ乱数列の出力を保証するにはライブラリに頼らず乱数発生器も実装してしまう

548:デフォルトの名無しさん
08/04/09 19:46:10
C++について質問なのですが、
オブジェクトを作らずにメンバ関数を呼び出すことは可能でしょうか。

549:デフォルトの名無しさん
08/04/09 19:49:19
静的メンバ関数なら。

550:デフォルトの名無しさん
08/04/09 19:54:24
>>548
できる。

struct a{ void f(){} };
reinterpret_cast<a*>(NULL)->f();

551:デフォルトの名無しさん
08/04/09 20:06:20
なるほど。勉強になりました。
レスありがとうございました。
#include <stdio.h>

class A
{
public:
static A* make_obj(void);
void my_puts(void){ puts("Hello\n"); }
};

A* A::make_obj(void){
A* a = new A;
return a;
}

int main()
{
A* a = A::make_obj();
a->my_puts();
return 0;
}

552:デフォルトの名無しさん
08/04/09 20:12:24
>>550
やめなさい

553:デフォルトの名無しさん
08/04/09 20:36:54
>>551
わかってると思うけど生ポではなくスマポに入れて返しとけよ

554:デフォルトの名無しさん
08/04/09 21:09:35
using namespace ~;
は取り消せますか?

555:デフォルトの名無しさん
08/04/09 21:16:28
永遠に取り消す事が出来ない呪いです。
using は計画的に。

556:デフォルトの名無しさん
08/04/09 21:24:07
namespaceをusingすると、そのnamespace内のusingまで見えてしまうのには泣く。意味ねーじゃん


557:デフォルトの名無しさん
08/04/09 21:27:35
だからヘッダにusing書いちゃ駄目ってママ言ったでしょ

558:デフォルトの名無しさん
08/04/09 21:30:57
>>550
staticメンバ関数が無い時代の苦肉の策ですなあ。
ただ非静的メンバーは参照できない。

559:デフォルトの名無しさん
08/04/09 21:31:50
turboPascalのusing見たいな使い方したかったのに。

560:デフォルトの名無しさん
08/04/10 00:22:01
VC++ 2008 EE でWindowsアプリケーションを作成したいのですが、
そのまま<windows.h>をインクルードしてもエラー表示なので、
どのような設定が必要なんですか?

561:デフォルトの名無しさん
08/04/10 00:24:06
>>548
なんのためのメンバ関数なんだか。

562:デフォルトの名無しさん
08/04/10 00:33:29
>>561
いや、他人の書いたコードを解読してるんだ。。

563:デフォルトの名無しさん
08/04/10 00:39:03
>>560
[ファイル]-[追加]-[新しいプロジェクト]
[Visual C++]-[Win32]-[Win32プロジェクト]-[プロジェクト名]-[OK]
[次へ]-[Windowsアプリケーション]-[■空のプロジェクト]-[完了]
[ソースファイル]-[追加]-[新しい項目]
[Visual C++]-[コード]-[C++ファイル]-[ファイル名]-[追加]

564:デフォルトの名無しさん
08/04/10 01:46:59
>>563
ありがとうございます。3行目まではうまく設定できたのですが、
4行目の「ソースファイル」?が何を指しているのかわからず、
そのまま5行目の作成を行いました。
結果はやはりビルドエラーです。
コードは以下です。

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
   //処理

return ;

}

/* ウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//処理
}
return DefWindowProc(hwnd,message,wparam,lparam);
}

565:デフォルトの名無しさん
08/04/10 01:50:01
エラーの内容は?

566:デフォルトの名無しさん
08/04/10 01:54:31
ファーストへの悪送球。

567:デフォルトの名無しさん
08/04/10 01:54:45
1>------ ビルド開始: プロジェクト: C800, 構成: Debug Win32 ------
1>コンパイルしています...
1>MJ_1.cpp
1>.\MJ_1.cpp(26) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\MJ_1.cpp(41) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>C800.cpp
1>.\C800.cpp(28) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\C800.cpp(43) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>コードを生成中...
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\C800\Debug\BuildLog.htm" に保存されました。
1>C800 - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

です。

568:デフォルトの名無しさん
08/04/10 02:02:15
>>567
なぜコンパイルエラーの部分を省略する。
ググればいろいろ見つかる。
URLリンク(www.google.co.jp)

569:デフォルトの名無しさん
08/04/10 02:21:14
>>568
ありがとうございます。
文字変換だったのですね。
しかしググっても出てこないので最後に嘆きます。

1>------ ビルド開始: プロジェクト: GAME, 構成: Debug Win32 ------
1>マニフェストを埋め込んでいます...
1>.\Debug\GAME.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\GAME\Debug\BuildLog.htm" に保存されました。
1>GAME - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

なるエラーが出るのですが、まったく意味不明です。

570:569
08/04/10 18:46:06
申し訳ないです。
自己解決しました。
ありがとうございます。

571:デフォルトの名無しさん
08/04/10 21:45:49
VC++2005で、ADOでSQLSERVER2005に接続して、binary型のフィールドに
1000byte程のバイナリデータを保存したいのですが、
long型の配列にデータをmemcpyし、それをrs->Updateしようとすると、
コンパイルで「bool値に変換します」というような警告がでて、データを転送できません。
バイナリデータを転送するにはどのようにすればいいのでしょうか?
(配列には正常にデータがコピーされていることはファイル出力で確認できております)


572:デフォルトの名無しさん
08/04/11 00:26:01
>>571
URLリンク(support.microsoft.com)

573:デフォルトの名無しさん
08/04/11 06:15:26
vector〈基底クラス*〉に数種類の派生クラスをプッシュバックしてオーバーライドした関数を実行するようなことはできますか?

574:デフォルトの名無しさん
08/04/11 06:18:09
>>573
virtualなメンバ関数を実行ということなら、可能です。

575:デフォルトの名無しさん
08/04/11 06:33:22
もちろん仮想関数にしてあります
&の付け忘れでした

解決できましたありがとうございます

576:デフォルトの名無しさん
08/04/11 06:38:48
>>573=>>574=>>575

577:デフォルトの名無しさん
08/04/11 06:50:20
573=574=575=576

578:デフォルトの名無しさん
08/04/11 07:17:15
>>575
メモリリークに気をつけような。
boost::ptr_vector の使用も検討してみるといい。

579:デフォルトの名無しさん
08/04/11 12:34:50
動的に二次元配列を確保するにはどうすればよいですか?
int x=10; int y=10;
double a[x][y];
という風に書くのは、xyが小さい間は出来たのですが、newで確保しようとすると
yを変数にできません。vectorを使わずに上記のようなことができるでしょうか?
よろしくお願いします。


580:デフォルトの名無しさん
08/04/11 12:37:06
double **a;

*a = new double[x]

for( int i = 0; i < x; ++i )
 a[x] = new double[y]

こんなん

581:デフォルトの名無しさん
08/04/11 12:47:33
boost::multi_arrayオススメ。

582:デフォルトの名無しさん
08/04/11 12:52:43
>>580
ありがとうございます。
確保した二次元配列をほかの関数に渡すにはどうすればよいですか?

あと、boost::multi_arrayは速いですか?
今書いているのは、std::vectorもあまり知らない人に見せるためなので、
boostなんてとてもだめです。


583:デフォルトの名無しさん
08/04/11 12:57:05
アセンブリ言語のコンパイラのCソースプログラムを持っているのですが、
アセンブリ言語をコンパイルするには、このソースをコンパイルしてから
どうすればいいのでしょうか?

584:デフォルトの名無しさん
08/04/11 12:58:11
void func( int **a );
これでわたせるんじゃね、多分

585:デフォルトの名無しさん
08/04/11 13:06:03
>>582
そういう初心者には、素直に一次元配列を仮想化して使う方がいい。
こんな関数でも用意すればアクセスするのも割と簡単だ。
static unsigned offset(unsigned x, unsigned y, unsigned w)
{
return x + y * w;
}
勿論、メモリ確保はこうなる。
double * a = new double[w * h];
あー、ついでに言えば>580はバグだらけだから要注意で。
つーか、>584もかすだわ。

586:デフォルトの名無しさん
08/04/11 13:06:38
>>583
Cソースをコンパイルしてできた実行ファイルを実行してアセンブルすれ
ばいいのでは。



587:デフォルトの名無しさん
08/04/11 13:19:33
>アセンブリ言語のコンパイラ
有り得ない間違いだな。

588:デフォルトの名無しさん
08/04/11 13:29:33
>>580
これは酷い。

589:デフォルトの名無しさん
08/04/11 13:34:19
mbscmp
wcscmp
などの違いがわからない・・・・
あと、lstrcmp とか strcmp みたいなのもあったような気がするけど気のせい?
誰か、これらの関数の違いについて分かり易く教えてください。

590:デフォルトの名無しさん
08/04/11 13:40:56
文字として wchar_t を使うとき -> wcscmp
文字として char で mbcs を使うとき mbscmp
文字として char で sbcs を使うとき strcmp
文字として TCHAR を使うとき lstrcmp

ドキュメント読まずにまず2chで聞くという態度では、わからなくて当たり前。


591:デフォルトの名無しさん
08/04/11 13:49:11
>>590
すみません。それがいまいちよくわからないんです。
charを使うときとか、tcharを使うときと言われても抽象的すぎて???
具体的に、どういう処理をするときにmbscmp や strcmp などを使い分けるのでしょうか?
同じ文字列比較でも、mbscmp を使っていたり、 strcmp を使っていたりと、訳が分りません。

592:デフォルトの名無しさん
08/04/11 13:52:17
>>587
確かに…ご指摘ありがとうございます
アセンブリ言語を実行するものの意味で使いました

593:デフォルトの名無しさん
08/04/11 13:52:50
>>591
それは抽象的だからわからないんじゃなくて、勉強しないからわからないのです。
mbcs と sbcs の違いなんか、Google で 「mbcs と sbcs の違い」を(カッコははずして)
検索すればいくつもそれらしい説明のページが出てくるのです。

もし手抜きじゃなくてホントのホントに何もしないで知識が身に付くと思ってるのなら、
そもそもバカなので勉強しても無駄なので止めるべきです。

594:デフォルトの名無しさん
08/04/11 14:04:17
>>592
それは普通、アセンブラと呼ばれる。
いや、厳密に言えば「アセンブリ言語を翻訳するもの」だが。

595:デフォルトの名無しさん
08/04/11 14:05:02
>>593
なんか嫌なことでもあったのか?

596:デフォルトの名無しさん
08/04/11 14:05:03
なんとなく分ったような分らないような・・・・

同じ英数字からなる文字列比較でもプログラムによって使っている関数が違うのは
書き手(プログラマー)の意識の違いによる?
さらにワイド文字とマルチバイト文字の違いがよく分らん。。。。

出直してきます。スレ汚してすみません。

597:デフォルトの名無しさん
08/04/11 14:06:53
すまん
*a = new double[x]
じゃなくて
a = new double*[x]


598:デフォルトの名無しさん
08/04/11 14:20:42
>>597
それだけじゃねーだろ。

599:デフォルトの名無しさん
08/04/11 15:19:15
>>595
593じゃないけど、あえて言うなら「投げっぱなしの馬鹿を見てしまったこと」が
「嫌なこと」なんだろう。

600:デフォルトの名無しさん
08/04/11 20:21:49
deleteで落ちちゃうんだけど、原因わかりません><
このコードで落ちます・・・。

int i;
char *lpary[4];

for (i = 0; i < 4; i++){
lpary[i] = new char[256];
}

for (i = 0; i < 4; i++){
delete [] lpary[i];
}

誰か教えてください。

601:デフォルトの名無しさん
08/04/11 20:23:53
落ちる要素は特に見当たらないが・・・。
多分、他で色々やってる部分でマズいことやってんじゃないかと。

602:デフォルトの名無しさん
08/04/11 20:24:46

for (i = 0; i < 4; i++){
delete lpary[i]
}

delete[] lpary;

603:デフォルトの名無しさん
08/04/11 20:25:53
>>602
おいおい^^;

604:デフォルトの名無しさん
08/04/11 20:26:53
よく見てなかった
すまん忘れてくれ

605:600
08/04/11 20:29:44
すいません。原因わかりました。
newとdeleteの間でやってる処理で確保したポインタに別のポインタ
渡してしまってた・・・。

まじごめん;;

606:デフォルトの名無しさん
08/04/11 20:30:25
悪い事いわないから、vector 使え。

607:デフォルトの名無しさん
08/04/11 23:28:52
>>596
>さらにワイド文字とマルチバイト文字の違いがよく分らん
それを調べるのが先だということに気づかないの?

608:デフォルトの名無しさん
08/04/11 23:30:06
出直してくるって言ってるんだからほっとけよ

609:デフォルトの名無しさん
08/04/12 00:33:20
変数をStringだとかChar型で指定することってできますか?

610:デフォルトの名無しさん
08/04/12 00:34:10
????????

611:デフォルトの名無しさん
08/04/12 00:56:30
静的なメモリを確保をしたクラス内に動的に確保したクラスがあるとします
この場合exit(0)が実行された時に正しく破棄が行われますでしょうか?

612:デフォルトの名無しさん
08/04/12 00:59:02
>>611
だいたいOSがうまく解放してくれる・・・かもね。
そんな保障はどこにもない。ちゃんと解放するかJava等に移行しましょう。

613:デフォルトの名無しさん
08/04/12 01:14:07
ぬるぽ

614:デフォルトの名無しさん
08/04/12 01:15:38
>>611
ライブラリの仕様によるけど、
・静的なオブジェクトのデストラクタ⇒呼ばれる
・main()から辿ってその時点までのスタック上にあるオブジェクトのデストラクタ⇒呼ばれない
つまりスタックの巻き戻しは行われないが通常のクリーンアップルーチンは呼ばれる、
が一般的なのでは。何か重要な後処理が必要なら atexit でも書いとくべきだな。

615:デフォルトの名無しさん
08/04/12 01:34:05
atexitを使うことにします
ありがとうございます

616:デフォルトの名無しさん
08/04/12 02:10:32
constポインタpDataのメンバstd::deque<Log> LogDataを参照するpastLog

const std::deque<Log>& pastLog = pData->LogData

を上のように作ってそのiteratorを使用したいのですが
const std::deque<M3Log>::iterator itr = pastLog.begin();
とすると

左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

と怒られます

何処をどうしていいのかわかりません、アドバイスをいただけないでしょうか

617:616
08/04/12 02:12:31
訂正
const std::deque<M3Log>::iterator itr = pastLog.begin();

const std::deque<Log>::iterator itr = pastLog.begin();

618:デフォルトの名無しさん
08/04/12 02:12:40
c++ は良く知らないけど、
std::deque<Log>::const_iterator itr = pastLog.begin();
じゃないの?

619:デフォルトの名無しさん
08/04/12 02:19:58
>>618
ありがとうございます
無事コードがコンパイルを通るようになりました

const_iteratorなんてあったのか・・・

620:デフォルトの名無しさん
08/04/12 03:41:33
>>619
>const_iteratorなんてあったのか・・・
超ワロタじゃないかよ


621:デフォルトの名無しさん
08/04/12 04:19:52
静的確保と動的確保でプライベートメンバ関数の実行に違いが出るようなことは有るでしょうか?

622:デフォルトの名無しさん
08/04/12 09:55:51
外から借りない限り終了すれば仮想プロセス空間ごと消滅するかと。

623:デフォルトの名無しさん
08/04/12 11:01:31
さあて。delete thisするんでない限りは、まー無いんでないかね。

624:デフォルトの名無しさん
08/04/12 12:57:40
#define sucide delete this

625:デフォルトの名無しさん
08/04/12 14:40:30
suicide

626:デフォルトの名無しさん
08/04/12 14:49:06
oh misu superu

627:デフォルトの名無しさん
08/04/12 14:50:30
ifの条件部で変数を宣言したい時に、boolとして評価できない型だとコンパイルエラーになりますよね

std::set::const_iterator it = hoge.find(....);
if (it != hoge.end()) {
// ここで it を使う
}
のようなことをするときにifのブロック内にitのスコープを限定して
if ((std::set::const_iterator it = hoge.find(...)) != hoge.end()) {
のようなことをしたいんですけど無理ですか?


628:デフォルトの名無しさん
08/04/12 15:23:43
無理

629:デフォルトの名無しさん
08/04/12 15:39:39
for ( std...it = hoge.find(...); it != hoge.end(); ) {
 break;
}

おすすめはしない

630:デフォルトの名無しさん
08/04/12 15:40:03
{ std::set::const_iterator it; if(...){...} }

631:デフォルトの名無しさん
08/04/12 15:40:50
あるいは空スコープを使うとか。

{
 std...it = ...:
 if(){
 }
}


632:デフォルトの名無しさん
08/04/12 15:54:26
無理やり
template<typename T, template<class> class Comp> class eval_lapper
{
public:
    eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {}
    operator bool() const { return Comp<T>()(obj_, target_); }
    T& obj() { return obj_; }
    const T& obj() const { return obj_; }

private:
    T obj_;
    T target_;
};

int main()
{
    std::set<int> s;
    //s.insert(123);
    if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) )
        std::cout << *(it.obj()) << std::endl;
    return 0;
}

633:デフォルトの名無しさん
08/04/12 15:57:33
ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?

634:デフォルトの名無しさん
08/04/12 15:58:44
してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。

635:デフォルトの名無しさん
08/04/12 16:00:12
if 文だけでそう解釈されて欲しい場合は、
普通には使われないようなポインタへのキャスト演算子を
オーバーロードするのが一般的。
メンバポインタとか。

636:デフォルトの名無しさん
08/04/12 16:41:51
>>632
面白いなやり方だな
でも、lapper => wrapper じゃね

637:デフォルトの名無しさん
08/04/12 16:53:02
//test.h
struct test{
 int a;
 test(int a_) : a(a_){}
};

//instance.cpp
#include "test.h"
test obj(1024);

//program.cpp
#include <iostream>
#include "test.h"
extern test obj;

int main(){
 std::cout << obj.a << std::endl;
 return 0;
}

別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの?
VC8ではコンパイル通った。

638:デフォルトの名無しさん
08/04/12 17:01:05
そりゃ通るだろ

同じヘッダインクルードしてるんだし

639:デフォルトの名無しさん
08/04/12 17:01:59
メンバ変数が一部が#ifdefあたりで囲んであると
場合によっては非常に愉快な話になるけどね

640:デフォルトの名無しさん
08/04/12 17:09:35
愉快なというかバグな話だろ

641:デフォルトの名無しさん
08/04/12 22:59:36
中々原因が掴めず笑うしかないとかそういうアレだろう
鼻から悪魔が出たらもっと愉快だな

642:デフォルトの名無しさん
08/04/13 22:40:49
String name;

String^ name;
の違いはなんですか?ハンドルの意味がわかりません

643:デフォルトの名無しさん
08/04/13 22:48:53
>>642
C++/CLI はスレ違いなのです。

C++/CLI part3
スレリンク(tech板)

644:デフォルトの名無しさん
08/04/13 22:50:41
>>642
とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。
それで分からなかったら、もう一度おいで。

# CLIってちょい過疎気味の本スレしか無いのな

645:デフォルトの名無しさん
08/04/14 01:32:44
コピーコンスタクタ辺りで質問です。

template <bool M> struct P {
int* _p;

P(int* v=NULL) : _p(v) {}
P(P& v) : _p(v.release()) {} // (1)
~P() { if(M && _p) delete _p; }

void reset(int* v=NULL)
{ if(M && _p && _p != v) delete _p; _p = v; }

int* release()
{ int* temp = _p; _p = NULL; return temp; }
};

P<true> pf(int n) { return P<true>(new int(n)); }

int main() { P<true> a = pf(3); }

上記だと
error: no matching function for call to ‘P<true>::P(P<true>)’
とコンパイルエラーがでます。 しかし (1) を

template <bool _M> P(P<_M>& v) : _p(v.release()) {}

にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。


646:デフォルトの名無しさん
08/04/14 01:43:50
>>645
コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。

647:デフォルトの名無しさん
08/04/14 01:46:07
>>645
よく分からんけど、VC8だとどちらもコンパイル通ったぞ

648:デフォルトの名無しさん
08/04/14 01:49:12
>>647
エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで
P<false> oldObj;
P<true> newObj(oldObj);
とでもしているんだろう。

649:645
08/04/14 01:52:20
>>646
テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと
いけない理由が分かりません。
途中で P<false> に変換されているのも確認できませんでした。

>>647
gcc だけで起きる問題なんでしょうか…

>>647
いやしてないのです。上記のソースのみです。

650:デフォルトの名無しさん
08/04/14 02:17:53
質問です。4桁の乱数を取得する関数なのですが
if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが
原因を教えていただけませんか?
void random::gt(){
srand((unsigned) time(NULL));
num[0] = rand() % 10;
if(num[0] <= 0){
do{
num[0] = rand() % 10;
}while(num[0] <= 1);
}
//その他乱数取得
for(i=0;i<4;i++){
if(i <= 4){
for(j=1;j<4;j++){
num[j] = rand() % 10;
if(num[i] == num[j]){
do{
num[j] = rand() % 10;
system("PAUSE");
}while(num[i] != num[j]);
}
};
}
};
}

651:デフォルトの名無しさん
08/04/14 02:47:43
>>649
Pは接頭語みたいなもので一部の例外を除いて単独では使えない
この場合だとP<true>とP<false>が型
たとえばP<true>を定義したとき、もしP(P&)の記述が許されると
コピーコンストラクタP(P<true>)か
引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる

652:>650
08/04/14 03:22:48
日本語でおk

dowhileは必ず1回はループ内の処理を実行するが?
あと、その貼ったソースはそのままか?変更して貼ってない?



653:645
08/04/14 03:33:40
>>651
あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。
P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが

P<true> -> P<true> OK
P<true> -> P<false> OK
P<false> -> P<false> OK
P<false> -> P<true> NG
の時に

template <bool M>
struct P {
template <bool _M> P(P<_M>& v);
...
};

template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {}
//template <> template <> P<true>::P(P<false>& v); // NG
template <> template <> P<false>::P(P<false>& v) : _p(v._p) {}
template <> template <> P<false>::P(P<true>& v) : _p(v._p) {}

みたいにもできるってことですね!ありがとうございました。


654:デフォルトの名無しさん
08/04/14 03:33:47
あああ、すいません

if(num[i] == num[j]){のところで
変数num[i]とnum[j]が違っていても処理をしてしまう原因

を知りたかったのです
ソースは特に変えてないと思うのですが
どこかおかしいでしょうか

655:645
08/04/14 03:36:18
違った。P<false> -> P<true> が嫌だった。です。


656:650
08/04/14 03:39:19
またもすいません
>>654は>.650です・・・

657:デフォルトの名無しさん
08/04/14 09:29:44
>>650
i が 0 から 3 をとりながら動き、
そのループのなかで j が 0 から 3 をとりながら動くんですよね。
すると, i = j ならば, num[i] == num[j] となって、system("pause") がかならず
実行されることになります。

なさりたいことは、こんなのでしょうか?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

658:650
08/04/14 11:06:42
>>657
まさにそんな感じです
ありがとうございます

659:657
08/04/14 11:24:42
>>658
バグってました。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

660:デフォルトの名無しさん
08/04/14 14:51:59
set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに
remove_ifなんかのアルゴリズムでスマートに書けますか?

661:デフォルトの名無しさん
08/04/14 15:06:05
operator^

662:デフォルトの名無しさん
08/04/14 16:59:15
>>660

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

int main() {
  namespace bll=boost::lambda;
  std::set<int> a,b;
  a.insert(1);
  a.insert(2);
  a.insert(3);
  b.insert(2);
  b.insert(3);

  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      bll::bind(std::find<std::set<int>::iterator, int>,
                                b.begin(),
                                b.end(),
                                bll::_1 ) == b.end());

  return EXIT_SUCCESS;
}

uu-n...

663:デフォルトの名無しさん
08/04/14 17:49:02
huninnkidearuboost::egg::lazywotukattemitayo

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/egg/lazy.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/assign/std/set.hpp>
struct base {
  template< class Myself, class Arg0, class Arg1, class Arg2 >
  struct apply {
    typedef Arg0 type; };
  template< class Result, class Arg0, class Arg1, class Arg2 >
  Result call(Arg0 begin, Arg1 end, Arg2 value) const {
    return std::find(begin, end, value);
  } };
typedef boost::egg::function<base> op;
boost::egg::result_of_lazy<op>::type
  const find_lazy = BOOST_EGG_LAZY({});
int main() {
  namespace bll=boost::lambda;
  using boost::assign::operator+=;
  std::set<int> a,b;
  a+=1,2,3; b+=2,3;
  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      find_lazy(b.begin(), b.end(), bll::_1) == b.end());
}

uuu-nnn...

664:デフォルトの名無しさん
08/04/14 17:52:02
p_stade乙

665:デフォルトの名無しさん
08/04/14 18:01:20
>>660
a = bはだめなの?
だめだから聞いているんだろうけど。

666:デフォルトの名無しさん
08/04/14 18:06:40
>>665
横からだけど

a : 10,20,30,40
b : 20,50

この場合多分望む結果は

a : 20

だろうけど、>>665だと間違った結果を返す。

667:デフォルトの名無しさん
08/04/14 18:37:09
vectorやらlistで

vector<int>の要素が

1 2 (空白) 3 4 (空白) 
の様に途中に空白をいれることはできるのでしょうか?


668:デフォルトの名無しさん
08/04/14 18:46:45
VC++でPC情報を取得するPGを作成します。
プロジェクト作成は(Win32とか)どれを選ぶのが
適当でしょうか?

669:デフォルトの名無しさん
08/04/14 19:40:07
>>668
Linux+GCCがお勧め

670:デフォルトの名無しさん
08/04/14 19:42:55
.exe が出来るならどれでもいいと思う。

671:デフォルトの名無しさん
08/04/14 20:02:18
とあるクラスに関数を一個追加しようとしたところ

.hファイルに関数の本体を書き出すと正常にコンパイルが通るのに
.cppファイルに書き出すと
C2039 'foo' : 'hoge' のメンバではありません。

となってしまいます
これはどういう事でしょうか・・・

672:デフォルトの名無しさん
08/04/14 20:05:04
ソースを見せれ

673:デフォルトの名無しさん
08/04/14 20:10:42
      f´'´      ノ     ヽ  l  、 \!
       l /  / //  ,.ィ´   !', ト、 ヽ. ヽ
.      レ′, / //_,..イ// ,|   l |lλぃ  い. ',
      } / { ‐7Ζ_∠!イ 〃  /リ,}/┤!」l 小 !
     ノ i| 八//'゛ -`l 〃 /ノ'´  j ! |l/| iイ/
     ヽ|l//イ ャ''Tェ歹''`y゙/  'ヾ歹¨リ`イ!ノ//   まさか、ロリコンじゃないわね・・・
      ) 〃A ``''''"´ '^ r;   `'''"´/クK/
      Y/ !トヘ. ////    //// /.ィi| ;|
        |i( l|`Ti\,___  '⌒)   ,∠lj_|iリ
       {い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」!
       ``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、



674:デフォルトの名無しさん
08/04/14 20:13:11
>>671
>.cppファイルに
しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。

675:デフォルトの名無しさん
08/04/14 20:14:56
>>672
仕事でのデータが含まれてるのでちょっとソースは公開できないですorz

>>674
インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います


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