【初心者歓迎】C/C++室 Ver.47【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.47【環境依存OK】 - 暇つぶし2ch511:デフォルトの名無しさん
08/01/27 04:34:30
ありがとう。読み方によるのね
できれば\nが格納される読み方の例教えていただきたい

512:デフォルトの名無しさん
08/01/27 04:35:07
fgets

513:デフォルトの名無しさん
08/01/27 04:38:01
ファイルの開き方も重要じゃないか

514:デフォルトの名無しさん
08/01/27 04:42:08
>>512
ありがとうございます。
fgetsって\nの手前までしか格納されないかと思ってたけど\nもちゃんと入るんですね
とりあえず色々試してみることにします

515:デフォルトの名無しさん
08/01/27 04:44:40
gets以外なら大体¥nもコピーする。fgets、fgetln、テキスト指向ですらないfreadも勿論。というかgetsは絶対使わない方が良い。
C++は…誰かお願い。

516:デフォルトの名無しさん
08/01/27 07:26:38
C++でWindowsでのDLL作成に関して質問です。
C++のクラスをエクスポートする場合、純粋仮想クラスを利用するようですが、この際、
多重継承は可能なのでしょうか。具体的には以下のようなことをしたいのです。
class IFoo{
public:
virtual void fooFunc() = 0;
};

class IBar: public IFoo{
public:
virtual void barFunc() = 0;
}

class CFooFunc{
public:
virtual void fooFunc(){ /*...*/ }
};

class CBarFunc{
public:
virtual void barFunc(){ /*...*/ }
};

class CExport: public IBar, CFooFunc, CBarFunc{
};

__declspec(dllexport) IBar* createIBar(){
return new CExport();
}
__declspec(dllexport) IBar* deleteIBar( IBar* p ){
delete p;
}

517:デフォルトの名無しさん
08/01/27 09:21:25
>>511
istream& istream::get(char& c)
istreambuf_iterator
unsetf ios::skipws and istream_iterator

518:デフォルトの名無しさん
08/01/27 09:55:57
>>516
DLL でクラスを公開したいなら COM

519:デフォルトの名無しさん
08/01/27 12:57:31
COM なんて使いにくいもんじゃなくて
__declspec(dllexport) と __declspec(dllimport) を使おうぜ。
DLL と EXE で自動的に切り替えるマクロもあったけど忘れた。

520:デフォルトの名無しさん
08/01/27 14:30:07
C++の初心者向けサイトを教えてください


521:デフォルトの名無しさん
08/01/27 14:33:05
#ifdef PROJECTNAME_EXPORTS
# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endif

522:デフォルトの名無しさん
08/01/27 15:45:56
そういうやつ、自分で作らなくてもあったと思うけど、
自分で作った方が細かい制御ができていいかもしれん。

523:デフォルトの名無しさん
08/01/27 17:48:38
dllexportは所詮同じヴァージョンのコンパイラ相手でしか使えないからね。

524:デフォルトの名無しさん
08/01/27 18:11:43
しかし、COM は COM で色々と不便だからなあ・・・。
IA ← A の機能強化版として IB と B を別途作るとして、

 IA
↑ ↑
IB A
↑ ↑
 B

こういう継承したいけど無理っしょ?
仮想継承がないから・・・。

525:デフォルトの名無しさん
08/01/27 18:27:47
ATLみたいに実装をテンプレートに分離すれば解決しない?

526:デフォルトの名無しさん
08/01/27 23:15:08
wchar_t(unsigned char) に入ったUTF16の日本語を
ShiftJISに変換してxharに突っ込む処理を
STLだけで書くにはどう書けばいいですか?

527:デフォルトの名無しさん
08/01/27 23:26:27
std::codecvt使う例が
URLリンク(hw001.gate01.com)
にあるけど、UTF16、ShiftJISと指定した
std::codecvtをどう取得するのかは知らない

528:デフォルトの名無しさん
08/01/27 23:48:39
>>525
テンプレートは解決策の1つだとは思うけど、
ヘッダファイルに実装するのはどうもね・・・。
コードいじったときのコンパイル範囲が広くなると困るし。

529:デフォルトの名無しさん
08/01/28 00:07:40
OSに頼ったほうが安全

530:デフォルトの名無しさん
08/01/28 00:09:31
>>524
そのIAをIUnknown、Aを適当なインタフェースに置き換えれば、そんな例は山ほどある。

Aの実装をソースコードの形で手に入れられるなら、
普通にIBとAを多重継承して、細かいところを整えればいける。

531:デフォルトの名無しさん
08/01/28 00:28:36
>>530
むむっ。詳しくお願いします。

532:デフォルトの名無しさん
08/01/28 01:31:57
>>530
要は、本来Bでオーバーライドする必要のない関数も、B内から手動でAの実装を呼ぶようにすればいい。
インタフェースはメンバ変数ないから、キャスト関係くらいしか仮想継承の有無の違いはないといっても過言ではない。
struct IA : IUnknown {virtual HRESULT STDMETHODCALLTYPE FnA() = 0;};
struct A : IA {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**) {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE AddRef() {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE Release() {/*実装*/}
    virtual HRESULT STDMETHODCALLTYPE FnA() {/*実装*/}
};
struct IB : IA {virtual HRESULT STDMETHODCALLTYPE FnB() = 0;};
struct B : A, IB {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**);
    virtual ULONG STDMETHODCALLTYPE AddRef() {return A::AddRef();}
    virtual ULONG STDMETHODCALLTYPE Release() {return A::Release();}
    virtual HRESULT STDMETHODCALLTYPE FnA() {return A::FnA();} //オーバーライドしない気なら
    virtual HRESULT STDMETHODCALLTYPE FnB() {/*実装*/}
};
HRESULT STDMETHODCALLTYPE B::QueryInterface(IID& riid, void** ppv) {
    if (ppv == 0) {
        return E_POINTER;
    } else if (riid == IID_B)     {
        *ppv = static_cast<IB*>(this);
        AddRef(); //直接A::AddRef()でも可
        return S_OK;
    } else {
        return A::QueryInterface(riid, ppv);
    }
}
Javaのインタフェースの仕様だとBでのAddRef以下のようなことを書く必要がなかった気がする、ちょっとうらやましい。


533:デフォルトの名無しさん
08/01/28 01:34:43
委譲するわけですか。
うーん。委譲のコストが少し気になってしまいますね。
そんなもんなんでしょうか。

534:デフォルトの名無しさん
08/01/28 13:31:23
自分クラスに大小比較の演算子を定義して、<=を使おうと思ったら、
<と==の2つを定義するのではなく、<=を定義しないとだめだったのですが、
そういうものなのですか?


535:デフォルトの名無しさん
08/01/28 13:33:46
そういうものです。
そもそも、'<='が「小なりイコール」であると言う意味から再定義するわけですから。

536:デフォルトの名無しさん
08/01/28 13:35:16
>>534
つ[boost::operators]

537:デフォルトの名無しさん
08/01/28 14:14:23
>>534
以下は違う関数だからねえ
operator<()
operator=()
operator<=()
<=を使うということはoperator<=()をコールするわけで。

538:デフォルトの名無しさん
08/01/28 16:23:28
>>535-537
ありがとうございます。じゃあ自分クラスについては、なるべく「<=」は使わずに
<と==でなんとかするようにします。
boost::operatorsは、<と==をconst関数で定義して、publicでboost::operatorsを
継承すれば動きました。かなり便利そう。
ありがとうございました。

539:デフォルトの名無しさん
08/01/28 18:45:01
typedef struct { .... } hoge_struct;

#define TARGET_STRUCT hoge_struct
#define TARGET_STRUCT_STR ????????????

printf("type: %s\n", TARGET_STRUCT_STR );
printf("size: %d\n", sizeof(TARGET_STRUCT) );

表示
type: hoge_struct
size: 40

TARGET_STRUCTにあるhoge_struct部分は、任意の構造体名です。(色々変化します)
TARGET_STRUCT_STRが "hoge_struct" に(文字列)なるようにしたいのですが、
どんなマクロにすればいいのでしょうか?

540:デフォルトの名無しさん
08/01/28 18:52:07
言葉足らずでした。
型名であるTARGET_STRUCTを元に、文字列なTARGET_STRUCT_STRを作りたいという意味です。

541:デフォルトの名無しさん
08/01/28 18:58:47
# TARGET_STRUCT

542:デフォルトの名無しさん
08/01/28 19:11:51
>>541 ありがとうございました。

543:デフォルトの名無しさん
08/01/28 19:28:58
>>538
なんとかするとかじゃなくて「<」と「==」から「<=」を作ればいいじゃんか。
「<」と「==」が定義されてるならば「<=」は↓のようになる。
return A < B || A == B;
boost::operatorsは内部でそういうことをやってるだけ。


544:デフォルトの名無しさん
08/01/28 21:53:36
 よろしくお願いします。
 項書き換えを行うシステムを作るにあたって、今式の構造を木構造で表すことを考えています。
式は中値記法で書かれているので、基本的には一般的な構文木のように作ろうと思っています。
具体的には、ある内部ノードには演算子を格納し、その左と右の子供に項を格納するような2分木です。
 2項演算を表現するのにはこれで十分なのですが、 (X, Y, Z) のような三つ組みも表現しなければならないのです。
子供を3つ持つような木を作って、三つ組みを表現するときだけ3つ目の子供に項を格納すれば表現は可能になるのですが、
頻繁に三つ組みが現れるわけではないので、余分な子供はあまり持たせたくないと思っています。
 2分木で三つ組みを表現するうまい方法はないでしょうか。


545:デフォルトの名無しさん
08/01/28 21:56:16
演算子 A を考える場合に

   A1
   ∧
   X A2
    ∧
    Y Z

みたいにすればいいんじゃない?

546:デフォルトの名無しさん
08/01/28 22:00:04
単項演算子で無駄なノードが発生するのは別に構わんのん?

547:デフォルトの名無しさん
08/01/28 22:01:13
各ノードはふたつのポインタをもち、
それぞれは、
・自分の子供のひとつ(長男)
・自分のすぐ下の弟
を指すようにすれば2分木でいくらでも子供を持てる。
これは木構造を作るのに定番の方法なので覚えておくといいよ。

548:デフォルトの名無しさん
08/01/28 22:44:46
Visual Studio 2005なんですが、vector型の変数で名前をarrayにしたら、変数名が青くなってました。

intみたいに予約語なのかなとも思ったんだけど、特に問題なく動くんですが、青くなるのはなんでなんでしょう?

549:デフォルトの名無しさん
08/01/28 22:50:10
>>548
arrayはCLR配列の予約語だからじゃない?

550:デフォルトの名無しさん
08/01/28 22:59:40
>>549
即レスありがとうございます!
ほうほう、CLR配列で調べると確かに予約語っぽいですね。でも問題なしと考えてよいんでしょうか。

ついでにうかがいたいんですが、ちょい前までVC++6.0でつくっていたソースコードがあって、関数の引数にbool型をつかっていました。

そのソースを2005でダイアログベースで作っているプロジェクトで利用しようと思ったんですが、チェックボックスのValueがBOOL型になってまして、そのまま関数の引数にぶち込むと、次のように怒られました。

>warning C4800: 'BOOL' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)

これはどうすればよいんでしょう?

551:デフォルトの名無しさん
08/01/28 23:02:56
BOOL変数?true:false
とか。BOOLってintだからなー。
TRUE/FALSEの代わりに「エラー値」が入ってたりするし。

552:デフォルトの名無しさん
08/01/28 23:09:57
>>551
うわぁお!!

すげー、通りました、感動しています。

しかし6.0から2005にするといろいろ戸惑いますね。作業効率が半分くらいになった感じです。

553:デフォルトの名無しさん
08/01/28 23:37:08
>>545
 そうですね、こちらでも考えましたが、このような木の構造にするしかなさそうですね。

>>547
 アドバイス有り難うございます。
処理系を作るときに、こういう形で構文木を作るとネストされたリストも簡単に表現できるということで、
勉強したことがありました。確かに自分もよく使います。

 お二方、どうも有り難うございました。

554:デフォルトの名無しさん
08/01/29 00:09:40
>>552
6.0から2005だと色々変えないといけないところが出てくるだろうな。
new 失敗した時デフォで NULL 返すような古いコンパイラだからなあ。
まあ、変更が終われば大した違いはなくなると思うぜ。

555:デフォルトの名無しさん
08/01/29 00:46:03
LONG a=適当;
LONG b=適当;
LONG c=適当;

if(a*a + b*b > c*c) {
}

とした時に、
a*a等がLONGに収まる範囲を超えてしまったら、
どうなるのでしょうか?

556:デフォルトの名無しさん
08/01/29 00:56:45
>>555
LONGがlongのtypedefなら未定義

557:デフォルトの名無しさん
08/01/29 01:22:40
STLでウィンドウへ作ったり絵を描くクラスはどこにありますか?

558:デフォルトの名無しさん
08/01/29 01:23:49
ありません
gilを使ってください

559:555
08/01/29 01:32:29
>>556
Win32APIを使ったプログラムで、
LONGは<windows.h>に定義されているモノです。たぶん。
未定義というのは、どうなるか分からないということですか。

560:デフォルトの名無しさん
08/01/29 01:33:46
世界ランク14位おめw
URLリンク(2chcity.myminicity.com)

ランク   国名      街             人口  (前日比)  前日
--- 1   US1      LUELand         326354 (+211)   326143
--- 2   US2      GoonTown        179482 (+711)   .178771
--- 3   Germany1  .isnichwahr.de       119091 (-654)   119745
--- 4   US3      CreateMyCity Forum  .87380  (+1982)   85398
--- 5   Poland1    #debian.pl         79594  (+1043)   .78551
--- 6   Germany2  upOTia             52443  (+399)    52044
--- 7   France1    Reze'Les Nantes     .41960  (+246)    41714
--- 8   Canada1   J-C Satanas & CO   .40995  (+721)    40274
--- 9   US4      retromundi        .40604  (+788)    39816
--- 10  France2    FanaZ           .39902  .(+1268)   38634
2↑ 11  Germany3   deluxebits         38770  .(+3199)   35571
1↓ 12  US5      .isnichwahr.at        .38234  (+78)    38143
1↓ 13  France3    gravure-news       .37204  .(+765)    36439
2↑ 14  Japan1     2ch_city          35637  .(+1970)   33667
1↓ 15  Spain1     Media-Vida         .35205  .(+686)    34519
1↓ 16  France4    Sguy            .35083  .(+1456)   33626
2↓ 17  Ireland1    .prapikilty          .35067  .(+871)    34196
--- 18  Spain2     benidaver         .34505  .(+914)    33591
--- 19  Germany4   directupload       ..32490  .(+82)    .32408
-↑ 20  Slovakia1    Legionar City       32056

561:デフォルトの名無しさん
08/01/29 01:36:39
>>559
そういうことです。

562:デフォルトの名無しさん
08/01/29 05:15:49
doubleとintの丸め誤差について質問しているものです。
SSE2命令で計算するとどうして3.55*100が355になるのか、どうしてもわかりません。
IEEEの仕様どおりの浮動小数点の計算方法だと、レジスタのサイズが52でも80でも128でも
doubleの3.55は実際には2.54999999...となってしまうと思うのですが、、、
gccでSSE2命令を有効にして作成したバイナリの逆アセンブルの結果をみると、
<元ソース>
int main(void) {
double d = 3.55;
int n = d * 100;
printf("%d", n);
}

<続く>

563:デフォルトの名無しさん
08/01/29 05:17:36
<続き>
<main関数の逆アセンブル結果>
80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c8: 83 e4 f0 and $0xfffffff0,%esp
80483cb: ff 71 fc pushl -0x4(%ecx)
80483ce: 55 push %ebp
80483cf: 89 e5 mov %esp,%ebp
80483d1: 51 push %ecx
80483d2: 83 ec 24 sub $0x24,%esp
80483d5: dd 05 d8 84 04 08 fldl 0x80484d8
80483db: dd 5d e8 fstpl -0x18(%ebp)
80483de: dd 45 e8 fldl -0x18(%ebp)
80483e1: dd 05 e0 84 04 08 fldl 0x80484e0
80483e7: de c9 fmulp %st,%st(1)
80483e9: dd 5d e0 fstpl -0x20(%ebp)
80483ec: f2 0f 2c 45 e0 cvttsd2si -0x20(%ebp),%eax
<以下はprintfを呼んでいるだけと思うので略>
をみてもなんでこうなるのか全然わかりません。
cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
中でどういう動作をしてるのだろう。誰かご存知ありせんか?

長々とすいませんどうかよろしくお願いします。


564:デフォルトの名無しさん
08/01/29 05:26:47
When a conversion is inexact, a truncated (round toward zero) result is returned.
と書いてあるから3.54になるはずなのに変だねえ。

565:デフォルトの名無しさん
08/01/29 08:06:51
>>563
逆アスじゃなく、gccのアセンブリ出力を載せてくれ。0x080484d8なんてアドレス書かれてもなんだか判らん。

566:デフォルトの名無しさん
08/01/29 09:06:52
>>565
すいません。Cのコードは先のものと同じです。
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
fldl .LC0
fstpl -24(%ebp)
fldl -24(%ebp)
fldl .LC1
fmulp %st, %st(1)
fstpl -32(%ebp)
cvttsd2si -32(%ebp), %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
<以下略>


567:デフォルトの名無しさん
08/01/29 09:35:25
だから、どうして.LC0とか.LC1の定義も省略するのかなぁ……

568:デフォルトの名無しさん
08/01/29 10:46:51
>>563
> cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
> コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
> 中でどういう動作をしてるのだろう。誰かご存知ありせんか?

ここまでくるとCPUアーキテクチャマニュアル見ないとわからん。
Intelのサイトにあると思うが、日本語であるかどうかわからん。


569:デフォルトの名無しさん
08/01/29 11:03:35
CVTTSD2SI--Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer

F2 0F 2C /r  xmm/m64 切り捨てを使用して、xmm/m64の 1 つの倍精度浮動小数点値を r32 の 1 つの符号付きダブルワード整数に変換する。

説明
ソース・オペランド(第 2 オペランド)の 1 つの倍精度浮動小数点値を、デスティネーション・
オペランド(第 1 オペランド)の 1 つの符号付きダブルワード整数に変換する。ソース・オペ
ランドは、XMM レジスタまたは 64ビットのメモリ・ロケーションである。デスティネーショ
ン・オペランドは汎用レジスタである。ソース・オペランドが XMM レジスタの場合は、倍精
度浮動小数点値はレジスタの下位クワッドワードに置かれる。
変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。変換の結果が
符号付きダブルワード整数の最大値より大きくなる場合は、整数不定値(80000000H)が返さ
れる。

570:デフォルトの名無しさん
08/01/29 12:08:40
本当にありがとうございます。

自分もマニュアル見てみました。
結局動作としては、
1)3.55を80bitのレジスタ上で表現する。レジスタ上では3.55よりもわずかに小さい数として存在
2)fmulp命令を使って、1)の結果と100の積を計算する。
3)上の2)の結果をcvttsd2si命令を使ってint型に変換
になると。
>変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。
354.99999..からintへの変換はどう考えても「変換が不正確な場合は、」に該当すると思うのですが、
切り捨てると、354になると思うんですが、、、


571:デフォルトの名無しさん
08/01/29 12:54:22
何度もすいません。

-msse2付きでコンパイルしても、不正確になってしまうケースがありました。
int main(void) {
double d = 32.55;
int n = d * 100;
printf("%d\n", n);
return 0;
}
あとは、512.55, 513.55とか、8192.55, 8193.55とか。(これ以外にもかなり多い)
SSE2を使ったところで完全ではないようだし、なんだか不毛な感じもしてきた。
3.55については、たまたまSSE2で上手く計算できたケース、ということかな、と。


572:デフォルトの名無しさん
08/01/29 13:05:19
>>571
>567
手元の多桁演算処理に喰わせてみようと思うのだが……

573:デフォルトの名無しさん
08/01/29 13:12:09
私の所でOptimization(最適化)レベルを切り替えて実験してみた所
-O0で354、-O1で355になりました。
コンパイラはg++3.4.5です。

ソースコードをのぞいてみると、-O0は律儀に計算していましたが、
-O1の方はいきなり定数355をロードして終了していました。

574:デフォルトの名無しさん
08/01/29 13:12:41
.file "IEEE1.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC2:
.ascii "%d\12\0"
LC3:
.ascii "pause\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $16, %eax
call __alloca
call ___main
movl $355, 4(%esp) ←これ
movl $LC2, (%esp)
call _printf
movl $LC3, (%esp)
call _system
movl $0, %eax
leave
ret
.def _system; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef

575:デフォルトの名無しさん
08/01/29 20:52:37
std::vectorを使った場合で指定した添え字番号のオブジェクトを消す方法ってありますか?

576:デフォルトの名無しさん
08/01/29 20:58:18
vec.erase(vec.begin() + i);

577:デフォルトの名無しさん
08/01/29 22:19:04
C言語って1から覚えるとなると難しいでしょうか?

プログラム関係の職(未経験可)どうしてもやってみたくて
就こうと思ってるんだけど理系学校出てないから無謀かな…

スレ違いだったら凄くすいません…

578:デフォルトの名無しさん
08/01/29 22:21:27
まぁアレだ。プログラマ板で聞けばいいんじゃね

579:デフォルトの名無しさん
08/01/29 22:22:16
>>577
どんな人も1から覚えるわけだが。

580:デフォルトの名無しさん
08/01/29 22:26:36
パソコンとインターネット環境持ってるなら、ただでプログラミングの
勉強できるから、やってみればいいんじゃないか。

難しいかどうかは、人によるからなんとも言えない。

また、理系かどうかは思ったより関係ない。

ただし、数字アレルギーとか英語まったく読む気ないですぅとか言うなら、
やめた方がいいと思う。

581:デフォルトの名無しさん
08/01/29 23:00:31
でも、ひでーアルゴリズムのコードを見ると、
理系ってのも大事だなあと思う。

582:デフォルトの名無しさん
08/01/29 23:06:11
>>578
プログラマ板か…、予備知識無くここにカキコんじゃったからな…
次からそっちで聞いてみます

>>579
まぁそうなんですよね…<どんな人も1から
それを承知で聞いてみたんで

>>580
色々サイト巡りして知識付けようとはしてます
数字アレルギーは全く無いけど、英語が学校成績で常に2付近だったから
それが不安材料でヤバイってのは承知済み…orz

今度からプログラマ板でも行ってカキコしてみます

レスどうもでしたm(__)m



583:デフォルトの名無しさん
08/01/29 23:12:35
プログラミング関係の英語ドキュメントなんて複雑な文法とか表現使ってないから学校の成績はほとんど関係ない

584:デフォルトの名無しさん
08/01/29 23:14:29
俺も数学と英語は毎回赤点だったが今では必要なだけは出来るようになったぞ。
まあ相性と経験次第。

585:デフォルトの名無しさん
08/01/29 23:44:01
>>581
理系でもひでー奴はいくらでもいる。

>>582
> 英語が学校成績で常に2付近だったから

>>580 をよく読んでくれ、英語ができないんじゃなくて、
「英語をまったく読む気がない」ならって書いてあるだろ。

君が必要に迫られたら何とかするタイプなら、心配はない。

>>583-584 が言うように、そんなに高レベルの英語が出て
くるわけじゃないし、しかもラッキーなことにここ数年で
機械翻訳がそれなりに進化して、技術文書ならなんとなく
意味が理解できるぐらいなってきたから、あまり心配しな
くても大丈夫だよ。

586:デフォルトの名無しさん
08/01/29 23:44:45
質問させてください。以下のソースをコンパイルしたところ、エラーが吐かれたのですが、その理由が良く分かりません。

#include <fstream>
#include <TCHAR.h>
#include <string>
#include <sstream>

using namespace std;
class zantei{
private:
  // 行動データ構造体
  class Action
  {
  public:
   int No; // 行動番号 (無しなら0)
   LPTSTR Type; // 行動種類 (無しなら0)
   LPTSTR Detail; // 行動詳細 (無しなら0)
   int Damage; // ダメージ(無しなら100)
   LPTSTR Color; // 色 (無しなら0)
   int X; // マルチプレイ用の遠距離行動(無しなら0)
  };
  Action action[32];
public:
  BOOL LoadAction();
};

587:デフォルトの名無しさん
08/01/29 23:45:15
エラー:
・error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
・以下、変数Typeが認識されないためと思われるエラー他たくさん(24個)

全角スペースや、Typeが実は予約語だったんじゃないかとも疑いましたが、
空白はすべて半角スペースとタブ入力でしたし、TypeをiやNumに変えても同じエラーが出ました。
…ということは、完全に知らないことか、思い至っていないことによるエラーだと思われる、ということまでは考えることはできました。
どなたかご教授いただけないでしょうか。

588:デフォルトの名無しさん
08/01/29 23:45:50
ほほう
何というコンパイラで、何というメッセージが吐かれたのだい?

589:デフォルトの名無しさん
08/01/29 23:50:01
コンパイラは、Visual Studio 2005 Academic Editionです。
エラーは、>>587以外もかくとすると…、ちょっと多いので、少々お待ちください。

590:デフォルトの名無しさん
08/01/29 23:51:06
>>586
そのコピペは全角だらけやな

591:デフォルトの名無しさん
08/01/29 23:51:32
このエラーだと、通常は Type の直前にある物がおかしいんだが、
tchar.h はインクルードしてあるしな・・・。
TCHAR が大文字でも何か起きると思えないし。

592:デフォルトの名無しさん
08/01/29 23:54:24
もしかすると、
#include <windows.h>
が無かったりだったりとか?


593:デフォルトの名無しさん
08/01/29 23:54:26
>>587
全角が入ってる。間違いない。絶対だ。

594:デフォルトの名無しさん
08/01/29 23:54:56
エラー 2 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 4 error C4430: 型指定子がありません - int と仮定しました。
エラー 5 error C2146: 構文エラー : ';' が、識別子 'Detail' の前に必要です。
エラー 6 error C4430: 型指定子がありません - int と仮定しました。
エラー 7 error C4430: 型指定子がありません - int と仮定しました。
エラー 8 error C2146: 構文エラー : ';' が、識別子 'Color' の前に必要です。
エラー 9 error C4430: 型指定子がありません - int と仮定しました。
エラー 10 error C4430: 型指定子がありません - int と仮定しました。
エラー 11 error C2146: 構文エラー : ';' が、識別子 'LoadAction' の前に必要です。
エラー 12 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 13 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
警告 14 warning C4183: 'LoadAction': 戻り値の型がありません。'int' を返すメンバ関数とみなします。

これよりしたのエラーは、LoadAction()の実装部分で吐かれているエラーです。

595:デフォルトの名無しさん
08/01/29 23:55:00
>>592
そうか。撤回する。

596:デフォルトの名無しさん
08/01/29 23:55:42
>>594
全角入りのソースでそれと同じエラーを見たぞ。

597:デフォルトの名無しさん
08/01/29 23:56:36
全角はチェックしてるって書いてあるだろw

598:デフォルトの名無しさん
08/01/29 23:57:21
まず、LPTSTR を char* にしてコンパイルは通るか?
それをチェックしてみようぜ。

599:デフォルトの名無しさん
08/01/29 23:57:31
うーん、それじゃ、ちょっとソースをあっぷしてみますね

全角半角スペースを表示させても全角はは行っているようにみえないですが…
見落としかもしれないですし

600:デフォルトの名無しさん
08/01/29 23:57:43
あ、いや、wchar_t* か。

601:デフォルトの名無しさん
08/01/29 23:58:03
>>598
あ、はい、分かりました

602:デフォルトの名無しさん
08/01/30 00:01:02
マルチバイト文字セットに変えてchar*型、一応w_char*型にしてみても、
同じエラーが吐かれました(確認したのは大体のエラーの見た目と数だけですが)

ソースをアップする作業に入りますね

603:デフォルトの名無しさん
08/01/30 00:01:27
w_char じゃなくて wchar_t だぜ

604:デフォルトの名無しさん
08/01/30 00:17:01
お待たせしました。
URLリンク(www.youlost.mine.nu)
の、2968.zipです。

うp用に、配置しなおしたら、エラーが増えて涙目になってました(汗
他のアプリケーション用に書いてたものを、エラーはかれていたソースファイルを別プロジェクトでテストしながらなおそうとしたため、
プロジェクト別フォルダから読み込む方式になっています。
ヘッダがプロジェクトに入っていないのは、…えー、ごめんなさい、忘れました、試行錯誤の過程です。
いずれヘッダも戻すつもりではいました。
…ごめんなさい。

605:デフォルトの名無しさん
08/01/30 00:28:00
zantei の最後にセミコロンがない。

606:デフォルトの名無しさん
08/01/30 00:29:01
game.h の方のやつね。

607:デフォルトの名無しさん
08/01/30 00:31:11
「最大50文字で自然数を2つ入力し、その大小を求めるプログラムを作成せよ」
って問題なんですが、プログラム作ってみたけどわかりません
文字数が同じときの結果がめちゃくちゃになりました
誰かこのおしえてください(><)
cout << "文字数a:" << a_count << endl ;
cout << "文字数b:" << b_count << endl ;
if(a_count > b_count){
cout << "a>b" << endl ;
}else if(a_count < b_count){
cout << "a<b" << endl ;
}else if(a_count == b_count){
cout << "文字数が一緒なので一桁ずつ判断します" << endl ;
for(int i=0 ; i < a_count ; i++){
if(a[a_count-i] == b[a_count-i]){
cout << a[a_count-i] << "=" << b[a_count-i] << endl ;
}else if(a[Max_Length-i] != b[Max_Length-i]){
break ;
}
}
if(a[a_count-i] > b[a_count-i]){
cout << "a>b" << endl ;
}else if(a[a_count-i] < b[a_count-i]){
cout << "a<b" << endl ;
}
}
}

608:デフォルトの名無しさん
08/01/30 00:32:38
a[a_count-i-1]

609:デフォルトの名無しさん
08/01/30 00:33:17
(><)

610:607
08/01/30 00:34:08
#include <iostream.h>
#include <iomanip.h>
const int Max_Length = 50 ; // 入力できる文字数の最大値
main()
{
char a[Max_Length] ; // 最初に入力する文字列
char b[Max_Length] ; // あとに入力する文字列
cout << "2つの自然数(最大50桁)を入力し、" << endl ;
cout << "その2数の大小を判定するプログラムです" << endl ;
cout << "数値を入力してください(最大50桁)" << endl ;
cout << "a>>" ;
cin.getline( a , Max_Length ) ;
cout << "b>>" ;
cin.getline( b , Max_Length ) ;
int a_count , b_count ; // 文字カウンタ
int i , j ;
a_count = 0 ;
b_count = 0 ;
i = 0 ;
j = 0 ;
// 文字数をカウントする
while(a[i] != '\n' && a[i] != '\0'){
a_count++ ;
i++ ;
}
while(b[j] != '\n' && b[j] != '\0'){
b_count++ ;
j++ ;
}

611:デフォルトの名無しさん
08/01/30 00:34:14
iostreamマジ見にくい

612:607
08/01/30 00:35:02
610が先で、607が続きです(><)

613:デフォルトの名無しさん
08/01/30 00:35:21
入力できる文字数の最大値が 50 なら、バッファは 51 以上必要だね。

614:デフォルトの名無しさん
08/01/30 00:40:17
std::lexical_compare使え

615:デフォルトの名無しさん
08/01/30 00:44:48
すみません、元からこんなに早くリアクションがくれると思っていなかったので、
質問してすぐ風呂に入る予定だったため、
アップロードしてしばらく返事がなかったので、急いでお風呂に入っていたため、反応が遅れました。
申し訳ありません。

>>605-606
ありがとうございます!

セミコロンを直し、game.hをプロジェクトを追加し、gamemain.cppにgame.hをインクルードし、
gamemain.cppのクラス宣言部分をコメントアウトしてコンパイルしましたが、
結局
error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
がヘッダで吐かれてしまっています…
ここの部分を改善する、考えられるミスはありませんでしょうか…

616:デフォルトの名無しさん
08/01/30 00:50:24
>>607
ヘッダファイルは <iostream.h> や <iomanip.h> ではなく
<iostream> や <iomanip> を使用する事が推奨されている。
cout とかが std::cout とかになっちゃうのが嫌なら、
この程度のプログラムなら using namespace std; と書いておけば std:: を略せる。
古いコンパイラなら知らんがね。

最大 50 文字なら、a のサイズは Max_Length + 1 にする。

cout の後 cin をする際には、cout を flush した方がいい。
cout << "a>>" << flush;
でないと、表示されない事もある。

getline は改行文字を格納しない。改行との比較は無駄。
50 文字以上入力したら次の cin.getline が失敗するのは無視してもいいのかな。宿題程度なら。
cin.clear(); して、改行まで読み飛ばすか構わず cin.getline するか・・・。

文字数カウントは strlen で可能だが、まだ習ってないのかな。
i と j という変数を作らなくても、直接 a_count と b_count 使えばいい。
while 文より for 文使った方がすっきりする。

i が 0 ~ a_count - 1 のループでは、
a_count - i は a_count ~ 1 になる。
これは意図する所ではないはず。
そして、a[Max_Length-i] != b[Max_Length-i] で何をやろうとしているのか分からないし、
このあたり全体的にちとおかしいと思う。
もうちょっとよく考えよう。

617:デフォルトの名無しさん
08/01/30 00:51:00
>>615
TCHAR.h → tchar.h

618:デフォルトの名無しさん
08/01/30 00:51:46
全角だろ。間違いない。全角なんだ。

619:デフォルトの名無しさん
08/01/30 00:53:17
>>615
風呂の予定なんかどうでもいい。
しかも二回も風呂って書きやがって。
風呂はゆっくり入れ。


620:デフォルトの名無しさん
08/01/30 00:54:03
インクルードガードがないのもすげー気になるが、
これだけのヘッダファイルだと BOOL は定義されてなくね?

621:デフォルトの名無しさん
08/01/30 00:54:56
#include <cstddef>
#include <tchar.h>

622:デフォルトの名無しさん
08/01/30 00:55:17
>>616
たくさんありがとうございます!
考え直してもういっかい来ます

623:デフォルトの名無しさん
08/01/30 00:58:12
>>615
とりあえず windows.h をインクルードしとけ。

624:デフォルトの名無しさん
08/01/30 00:58:29
#include <iostream>

int main(void)
{
    const int max_str = 50 + 1;
    char str1[max_str], str2[max_str];    
    std::cout << "数値a入力>";
    std::cin >> str1;
    std::cout << "数値b入力>";
    std::cin >> str2;

    int len1, len2;
    for( len1 = 0; len1 < max_str; ++len1 ){
        if( str1[len1] == '\0' )
            break;
    }
    for( len2 = 0; len2 < max_str; ++len2 ){
        if( str2[len2] == '\0' )
            break;
    }


625:デフォルトの名無しさん
08/01/30 00:59:29
    std::cout << "数値a 文字数:" << len1 << std::endl;
    std::cout << "数値b 文字数:" << len2 << std::endl;
    if( len1 == len2 ){
        std::cout << "文字数が一緒なので一桁ずつ判断します" << std::endl;        
        for( int i = 0; i < max_str; ++i ){
            if( str1[i] == str2[i] )
                continue;
            else if( str1[i] > str2[i] )
                std::cout << "a > b" << std::endl;
            else
                std::cout << "a < b" << std::endl;                
            break;
        }
    }else if( len1 > len2 )
        std::cout << "a > b" << std::endl;
    else
        std::cout << "a < b" << std::endl;

}

>>612
総書き直しすれば簡単

626:デフォルトの名無しさん
08/01/30 00:59:38
>>617
提案ありがとうございます。すみません、でもとおりませんでした
>>618
エディタでトリプルチェックしましたが、やはり全角はありませんでした…
>>619
う…(苦笑)。すみません、お気遣いありがとうです。
>>620
windows.hをインクルードすれば定義されるでしょうか?
>>621
これは、BOOLのヘッダでしょうか。すみません、レスを先にして、試してきます。

627:デフォルトの名無しさん
08/01/30 01:00:18
>>624
std::cin >> str1;

バッファオーバーフロー一直線!!!

628:デフォルトの名無しさん
08/01/30 01:02:38
>>625
無茶苦茶やな・・・。

629:デフォルトの名無しさん
08/01/30 01:04:36
>>621
試してみたら、エラーが13に減りました!
でも、
>>623
windos.hをインクルードしたら、もっと減りました(10)!

あとは、game.hに、using namespace std;をかけば、通りそうな雰囲気です。
ありがとうございました。
一応、最後に通るか確認してきますね。 

630:デフォルトの名無しさん
08/01/30 01:05:22
>>629
ヘッダファイルで決して using しないと俺と約束してくれ。

631:デフォルトの名無しさん
08/01/30 01:08:29
>>630
ごめんなさい。
gamemain.cppの方でした。
そして、通りました!皆さん本当にありがとうございました。そして、お騒がせしました!

ちなみに、ヘッダファイルでusingすると、どんな弊害がおきるのでしょう?
ちょっと考えれば分かるかもしれない気はするので、失礼な質問でしたらすみません。

あと、<TCHAR.h>より、<tchar.h>をお勧めになった理由もお教えいただけないでしょうか?

632:デフォルトの名無しさん
08/01/30 01:10:41
本来 tchar.h という名前のファイルだから気になっただけ。

ヘッダで using して、色々インクルードしまくってると、
どこで using されているかさっぱり分からない状態になる。
using されては困る状況が現れた時、どの using が原因で困ってるか分からない。

633:デフォルトの名無しさん
08/01/30 01:12:45
触っちゃダメよと言われてるヘッダファイルで using されてると泣くしかない。

634:デフォルトの名無しさん
08/01/30 01:16:32
usingされているヘッダファイルをインクルードすると、
その名前空間がインクルードしたファイルにもusingされてしまう、ということでしょうか?

それとも、usingされてると、呼び出すときに、どの名前空間に所属しているのが分かりにくくなり、
数が膨大になったときに、エラーからたどりにくくなる、ということでしょうか?

…後者ですよね?

635:デフォルトの名無しさん
08/01/30 01:17:47
両方。

636:デフォルトの名無しさん
08/01/30 01:21:19
おあ、両方ですか。
前者も、ということになると、確かに本当にヘッダファイルでusingしてしまう(されてしまう)と、困ってしまいますね。
絶対にヘッダファイルでusingしないと、>>630さんと指きりしてお約束します。

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

637:デフォルトの名無しさん
08/01/30 01:24:53
namespace isolate { // isolate using directives and declarations
#include "hoge.h" // has using directives or declarations
}
using isolate::Hoge; // declared in hoge.h, and want to use in this source

と無理矢理隔離してみたり。

638:デフォルトの名無しさん
08/01/30 01:28:40
なるほど

639:デフォルトの名無しさん
08/01/30 01:46:32
STLとATLではどちらを覚えたほうがいいですか?

640:デフォルトの名無しさん
08/01/30 01:50:28
STL: どの環境でも使える
ATL: Windows でしか使えない

641:デフォルトの名無しさん
08/01/30 01:54:30
STL: 誰も使ってない
ATL: 90%くらいの環境で使える

642:デフォルトの名無しさん
08/01/30 01:57:43
両方覚えろよ

643:デフォルトの名無しさん
08/01/30 03:04:22
Windowsでプログラミングするなら両方。
そうじゃないならSTL。

644:デフォルトの名無しさん
08/01/30 03:39:23
>>642に一票

645:デフォルトの名無しさん
08/01/30 05:46:40
てゆーか二者択一するようなもんじゃないだろwwwww

646:デフォルトの名無しさん
08/01/30 07:02:37
関数内でnewでchar型の動的確保をしたいんだけど、他の全ての関数でもその宣言した
char型のを使えるようにするにはどうすればいい?

647:デフォルトの名無しさん
08/01/30 07:06:10
ごめん文章が変だったので追記
要するに関数内でnewで宣言したcharをグローバル変数みたいな感じで使いたい

648:デフォルトの名無しさん
08/01/30 07:07:01
外部変数にchar*型のポインタ用意してそこに代入すれば?

649:デフォルトの名無しさん
08/01/30 07:16:06
>>648
ああそうか。それでいけたw
staticみたいなので全範囲で使えるようになるのないかなって探してたよ
ありがとう

650:デフォルトの名無しさん
08/01/30 07:31:28
C++で開発をする際、他言語以上にいつもクラス設計で悩まされます

何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?

651:デフォルトの名無しさん
08/01/30 15:11:37
ATLにSTLのコンテナ使う仕掛けが合ったよな。

652:デフォルトの名無しさん
08/01/30 15:12:25
有った

653:デフォルトの名無しさん
08/01/30 15:30:11
C言語の質問です。コンパイラはgccです。

while(fgets(buffer,filesize,fp)){
flug=strstr(buffer,str);
if(flug!=NULL)puts(flug);
}

これでなぜ出力文字列が検索できないのでしょうか。
教えてくださいませんか?

私の頭の中ではまず改行までのファイルの一行をbufferに読み込む。
その後、bufferに格納されている文字列とstr(検索したい文字列)を比較して検索。
その返り値がflugに入るので、NULLポインタ以外(失敗)のflugは出力。
これで検索した値からの文字列が出力されると思っておりました。

654:デフォルトの名無しさん
08/01/30 15:40:40
cin.getline
って文字列を入力させるときに使うの?
普通に50桁の配列に数字を入れたいときって
cin >> a[50]
でいいのかな??

655:デフォルトの名無しさん
08/01/30 15:43:25
きもい

656:デフォルトの名無しさん
08/01/30 15:49:42
>>653
その部分だけじゃわからん。
つーか、その部分に問題は無い。

657:デフォルトの名無しさん
08/01/30 15:50:58
>>653
・flugという変数名がキモい
・filesizeは本当にbufferが指すバッファのサイズ?

buffer, filesize, str の宣言や初期化などを詳しく開示しましょう。


658:デフォルトの名無しさん
08/01/30 17:03:00
>> 654
getlineの使い方(ファイルからの一行単位の読み込み)
string line;
ifstream ifs(filename);
while (getline(ifs, line)) {
lineには一行がはいってる。
}

> cin >> a[50];
これでは配列aの51番目の要素に代入してるだけでは?



659:デフォルトの名無しさん
08/01/30 18:54:56
>>658
やっぱりだめなんですね・・
cin>>a[50]
だと50桁も入力できないんです
ありがとうございました

660:デフォルトの名無しさん
08/01/30 19:19:46
例外がcatch{}の中では生存していると仮定して
関数でnew | malloc した文字列を返して
デストラクタでdelete[] | freeするのはありですか?

661:デフォルトの名無しさん
08/01/30 19:29:05
言っている意味が分からん。
コードで書いてくれ。

662:デフォルトの名無しさん
08/01/30 19:47:17
エスパーな俺が翻訳すると、

catch内で作ったインスタンスでもデストラクタは呼ばれるのか?

ではないかと。

663:デフォルトの名無しさん
08/01/30 19:59:41
ふつうにわかるだろ

664:デフォルトの名無しさん
08/01/30 20:03:22
>>660
文字列クラス返せば?

665:デフォルトの名無しさん
08/01/30 21:42:46
>>659
「桁」が何のことか分からん
配列のサイズのことならfor引数足してまわせばいいだけ
50桁の数値(10の50乗とか)を扱いたいなら普通には無理

666:デフォルトの名無しさん
08/01/30 21:43:28
引数じゃなかった添え字だ

667:デフォルトの名無しさん
08/01/30 22:27:02
自作クラス内に、CreateWindowというメソッドを作りたいんですが、エラーが出てしまいます。
エラーメッセージを見るとどこかで定義されてるようなんですが、
クラス内は独立した名前領域で、同じ関数名を使えるのではないのですか?
どなたか、回答をお願いします。

668:デフォルトの名無しさん
08/01/30 22:29:10
>>667
windows.h から同名のマクロが include されているのかも知れない

669:デフォルトの名無しさん
08/01/30 22:32:01
回答ありがとうございます。
windows.hは確かにインクルードしていました。
windows.hをインクルードしないわけにはいかないし、
CreateWindowという名称を使うのはあきらめたほうがよさそうですね。

670:デフォルトの名無しさん
08/01/30 23:10:41
すみません、質問です.
C++言語のソースを読んでいて、疑問に感じた所があります。
struct Hoge{
unsigned Wakeup(void) const { return wakeup_time; }
Hoge(Container& container);
~Hoge();
private:
unsigned int hoge_time;
Container& fuga;
};

これ構造体ですよね?クラスみたいですけど・・・。
本を読んだりしてクラスと構造体はまったく別物と認識していたんですが。
混乱しています。

671:デフォルトの名無しさん
08/01/30 23:12:12
C++では同じ
違いはデフォルトのアクセスがpublicな事

672:デフォルトの名無しさん
08/01/30 23:19:54
>>670
実装は同じだけど、考え方としては区別したほうが良いんじゃないかな、

673:デフォルトの名無しさん
08/01/30 23:21:02
>>671
もうちょい違うっしょ。

674:デフォルトの名無しさん
08/01/30 23:21:53
メンバ変数を public にした方が何かと便利そうなのは構造体に、
そうでないのものはクラスに。
そう考えると、自然と構造体を使う状況は限定される。

675:デフォルトの名無しさん
08/01/30 23:23:22
>>673
デフォルトで public 継承になる、というやつのことか?

676:デフォルトの名無しさん
08/01/30 23:30:12
テンプレート絡み。

677:デフォルトの名無しさん
08/01/30 23:32:36
最近どこかで目にした流れだな

678:デフォルトの名無しさん
08/01/30 23:36:09
はい、STLスレの受け売りです。

679:デフォルトの名無しさん
08/01/30 23:38:38
だからテンプレート引数の話とここの話とは
ちょっと違うんじゃないか、と。

680:670
08/01/30 23:43:33
C++だと若干の違いはあるにせよ、classの代わりにstructと書くこともできるんですね。
ありがとうございました。

681:デフォルトの名無しさん
08/01/31 00:26:32
newで多次元配列分の確保ってできない?
char *c;
int p=20;
c=new char[p][255];
こんな感じでしたいんだけどこれだとエラーでる

682:デフォルトの名無しさん
08/01/31 00:26:53
char (*c)[255] = new char[p][255];

683:デフォルトの名無しさん
08/01/31 00:32:46
>>682
ありがとうございます。原理はよく分からないけどできました
勉強してきます

684:デフォルトの名無しさん
08/01/31 00:36:46
配列へのポインタを使ってる。
typedef 使うと多少分かりやすいかと。

typedef char BUF[255]; // BUF は char 型 255 要素の配列型
BUF *c = new BUF[p];

やっぱそうでもないか。

685:デフォルトの名無しさん
08/01/31 00:40:26
つまり、char 型 255 要素の配列を p 個確保して、
c[i] とすると i 個目の配列が得られ、
c[i][j] とするとその配列の j 番目の要素にアクセスできる、と。

686:デフォルトの名無しさん
08/01/31 00:53:06
>>684-685
分かり易くありがとうございます。何となく分かったような気がする
とりあえずもう一度newについて再勉強してきます

687:デフォルトの名無しさん
08/01/31 01:23:02
newでもmallocでも同じだよ

688:デフォルトの名無しさん
08/01/31 04:56:35
template <int N, typename T>
struct array_str {
T array[N];
T &operator[](int n) {
return array[n];
}
};
int p = 20;
const int ssize = 255;
vector< array_str<ssize,char> > c(p);
として、以下のように使う方法は?
c[1][1];


689:デフォルトの名無しさん
08/01/31 05:15:04
>>688 使い方を示しながら使い方を聞く意味がわからん。

690:デフォルトの名無しさん
08/01/31 05:19:04
proxy classの話かな?

691:デフォルトの名無しさん
08/01/31 05:37:32
this->template func<type>(arg); という書き方を見たんですが、
this->func<type>(arg); との違いを教えてください。

692:デフォルトの名無しさん
08/01/31 05:48:03
>>691
template付けないとエラーでコンパイルできない場合がある。
.演算子、->演算子、::演算子の後ろにメンバテンプレート特殊化の
名前があり、それがテンプレート仮引数に属している場合がそう。

693:デフォルトの名無しさん
08/01/31 05:52:19
>>691
テンプレート内で、 this の型がテンプレート引数に依存するとき、前者のように
template を明示しないと、コンパイラは this->func<type という部分を
(this->func) < (type) のような比較式と認識してしまう。

694:デフォルトの名無しさん
08/01/31 08:21:51
"ab"でaとbの間に「"」を入れたい場合って「"a""b"」でおk?

695:デフォルトの名無しさん
08/01/31 08:23:28
>>694
"a\"b"

696:デフォルトの名無しさん
08/01/31 08:23:51
\"

697:デフォルトの名無しさん
08/01/31 08:29:43
ありがとう。あぶなく間違って使うところだった

698:デフォルトの名無しさん
08/01/31 09:05:56
まぁやったところで別に問題はないけどね、表示されないだけで

699:デフォルトの名無しさん
08/01/31 09:07:00
確かになw

エスケープを "" で表現するのって、どこの文化だっけ?
どっかで見た気はするんだが。

700:デフォルトの名無しさん
08/01/31 09:46:44
昔のBASICだろ

701:デフォルトの名無しさん
08/01/31 09:50:26
だっけか。全然覚えてないや。

702:デフォルトの名無しさん
08/01/31 10:45:56
試しにVBでやってみたら通ったわ。""

703:デフォルトの名無しさん
08/01/31 11:36:23
演算子の優先度と結合規則がいまいちよく分かりません。
下の式を意味が変わらない範囲でカッコを外すとどうなりますか?

a = ( b *= ( ( c+d ) << e ) )

( ( * ( a[b] ) ) . c ) -> d

( a - ( ( b-c ) * d ) ) - e

( + ( ++a ) ) + ( ( b&c ) << ( d+e ) )

( ( ( * ( a.b ) ) . c ) -> d ) ++

あと下の4つは順序を明確にするためにカッコを付ける問題です。

a + b * c - d

a <<= b << c <= d

a = b &= c ==d

* a . b * c


参考になるサイトとかありますか?アドバイスお願いします。

704:デフォルトの名無しさん
08/01/31 11:39:36
参考になるのは優先順位表
高低だけじゃなくて、右左にも注意

705:デフォルトの名無しさん
08/01/31 13:06:37
テスト問題とか、与えられた式を最適化するようなプログラムを作っているのでなければ
素直にカッコをつけておくというのはどうだろうか。

前提無視ですね、すみません。

706:デフォルトの名無しさん
08/01/31 13:40:09
言語仕様とはちょっと違うけど今でもDB2のSQLは文字列中の"を""で表すぞ

707:デフォルトの名無しさん
08/01/31 15:44:34
>>703
そんなの、K&Rにかいてあるだろ

708:デフォルトの名無しさん
08/01/31 19:40:40
ビット演算の優先順位をちゃんと把握してる人なんてそんないないわ。

709:デフォルトの名無しさん
08/01/31 20:09:03
>>703
優先順位がわかりにくいときは括弧つければいいと思うよ。別にかっこ悪くないと思うよ
括弧減らしてもバグが増えたら意味が無いしな。


710:デフォルトの名無しさん
08/01/31 21:35:35
VC++8使ってるんですけど、グローバルスコープの関数ってやっぱり
::CreateWindowEx とかスコープ演算子つけた方が良いのですか?
ネットにあるサンプルコードだと、両方見かけますが…

711:デフォルトの名無しさん
08/01/31 21:42:54
boostを使わずにstringの文字列を小文字の文字列に変換するにはどうすればよいですか?


712:デフォルトの名無しさん
08/01/31 22:06:34
>>711
string str("HeLLo");

for (int i = 0; i < str.size(); i++) {
str[i] = tolower(str[i]);
}
cout << str.c_str() << endl;
 あまりよろしくないかも。

713:デフォルトの名無しさん
08/01/31 22:12:35
std::transform(str.begin(), str.end(), str.begin(), tolower);

714:デフォルトの名無しさん
08/01/31 22:20:35
ざんねん、あなたのじっそうでは、tolowerは、「まくろ」だった

715:デフォルトの名無しさん
08/01/31 22:30:15
hoge.hで
// 構造体
struct POI{
int n;
float x;
};

// クラス
class hoge
{
public:
hoge(void ); // コンストラクタ
~hoge( void ); // デストラクタ
private:
POI poi[4];
};

と書き、
hoge.cppの
hogeコンストラクタ上で
poiの初期化を行いたいのですがうまくいきません。
今下のようにやっているのですがどのように直せばいいのでしょうか、どうぞよろしくお願いします。

poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};



716:デフォルトの名無しさん
08/01/31 22:30:29
そ、そんな実装もあるのか・・・。

717:デフォルトの名無しさん
08/01/31 22:31:24
for(int i = 0; i < sizeof poi / sizeof *poi; ++i) {
poi[i].n = 1;
poi[i].x = 0.5;
}

718:デフォルトの名無しさん
08/01/31 22:37:12
>>710
好きなほうでどーぞ

719:デフォルトの名無しさん
08/01/31 22:40:15
>>715
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
その形式が使えるのは宣言時だけなので
>>717
みたいにしないといけません

720:715
08/01/31 22:40:59
>>717
できれば
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};

こういう風に一括でやりたいのですがこれは無理なのでしょうか?

721:715
08/01/31 22:42:07
>>719
すいません、見逃しました。

そうですか、わかりました。ご丁寧にありがとうございます。

722:デフォルトの名無しさん
08/01/31 22:43:14
>>720
POI poi_src[] = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
std::copy(poi_src, pos_src + sizeof poi_src / sizeof *pos_src, poi);

723:デフォルトの名無しさん
08/01/31 22:44:45
POI poi_src[sizeof poi / sizeof *pos] = { ... };

とサイズ指定してた方が安全か。

724:デフォルトの名無しさん
08/01/31 22:45:24
それでもC++0xなら、C++0xならなんとかしてくれる……

725:デフォルトの名無しさん
08/01/31 22:47:00
static const POI poi_src[sizeof poi / sizeof *pos] = { ... };

とした方がいいか。

726:デフォルトの名無しさん
08/01/31 23:06:46
>>713
ありがとうございます。でもコンパイル通りません。
下のソースだと、
char my_tolower(char s) {
return tolower(s);
}
int main() {
string s = "Hello world";
transform(s.begin(), s.end(), m.begin(), toupper); // コンパイル通らない
transform(s.begin(), s.end(), m.begin(), my_tolower); // コンパイル通る

下のような結果になります。
test.cpp:14: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
<unresolved overloaded function type>)'


727:デフォルトの名無しさん
08/01/31 23:08:32
>>726
>>714 ということか。

728:デフォルトの名無しさん
08/01/31 23:10:03
何かオーバーロードされてるのか・・・

729:デフォルトの名無しさん
08/01/31 23:12:44
>>726
transform(s.begin(), s.end(), m.begin(), static_cast<int(*)(int)>toupper);

730:デフォルトの名無しさん
08/01/31 23:20:45
>>714
両方あるんじゃなかったっけ?

731:デフォルトの名無しさん
08/01/31 23:26:50
インクルードするヘッダによって違わなかったっけ

732:デフォルトの名無しさん
08/01/31 23:46:02
両方あるなら (tolower) でいいってことか

733:デフォルトの名無しさん
08/01/31 23:46:41
#undef tolowerじゃだめなの?

734:デフォルトの名無しさん
08/02/01 00:00:42
>>732
括弧無くても大丈夫だな。
後ろに ( ) がついてないから。

それにしても、うちの gcc じゃ >>726 みたいなエラーでないんだがなあ。
バージョンが違うのか。

735:デフォルトの名無しさん
08/02/01 00:11:15
tolower(int)のほかに、tolower(char)とかtolower(wchar_t)とかあるんでしょ。

736:デフォルトの名無しさん
08/02/01 00:20:07
Cとの互換関数だから、規格的にオーバーロード出来ないと思うが。

737:デフォルトの名無しさん
08/02/01 00:20:08
なら static_cast<int(*)(int)>(tolower) とかしないといけないのか。
面倒臭いな。

738:デフォルトの名無しさん
08/02/01 00:43:56
<locale>かどこかに、第2引数にロカールをとるバージョンがあったと思う。

739:デフォルトの名無しさん
08/02/01 00:45:47
古いヘッダ .h なら通るんだよな
謎だ

740:デフォルトの名無しさん
08/02/01 01:22:21
>>730
Cでは、関数に加えてマクロを用意しても良かったが、
C++だとそれは認められていない。
(JIS X3014:2003では17.4.1.2の6段落目。更に注(159)で明確に指摘されている)

741:デフォルトの名無しさん
08/02/01 01:28:39
double pai(){
double i,imax,n;
double x,y,pi;

n=0.0;
imax=10000000.0;
for(i=0;i<=imax;i++) {
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<1.0) {
n+=1.0;
}
}
pi=n/imax*4.0;
return pi;
}
double px(double t){
double pi=pai();
double x,ans;
ans=exp(-x*x/2t)/sqrt(2*pi*t);
return ans;
}
としたら
エラー E2121 kadai1.c 27: 関数呼び出しに ) がない(関数 px )
と出ましたorz
誰か解決策わかるようでしたら教えてください(;´Д`)

742:デフォルトの名無しさん
08/02/01 01:34:28
exp(-x*x/2t)/sqrt(2*pi*t);

2t?

743:デフォルトの名無しさん
08/02/01 01:43:52
あとx初期化してないよね。

744:デフォルトの名無しさん
08/02/01 01:44:15
c++でswitch文のcaseの中では変数宣言できないですか

745:デフォルトの名無しさん
08/02/01 01:46:26
case HOGE:
{ int t = 0;}
break;

ブロックで囲めばいいんじゃね


746:741
08/02/01 01:58:11
>742
解決しましたw
あざす!!

747:デフォルトの名無しさん
08/02/01 03:31:40
>>745
こっちも解決しました。ありがとう酢。



748:デフォルトの名無しさん
08/02/01 18:16:42
空を自由に飛びたいな
はーい つLSD

749:デフォルトの名無しさん
08/02/01 19:11:19
LoadLibraryでもらったHMODULEはCloseHandleで処分できますか?


750:デフォルトの名無しさん
08/02/01 19:24:52
どこで質問すればいいのかわからないほどくだらない質問なのですが、
よく引数であるchar* pszMessageのpszってどういう意味ですか?
Pointer Stringはわかるんですが、Zがいったいなんなのか・・・

751:デフォルトの名無しさん
08/02/01 19:27:11
zはzero、szはヌル終端文字列のこと。

752:デフォルトの名無しさん
08/02/01 19:29:52
pointer string zero-terminated

753:749
08/02/01 19:30:06
間違えました。

754:デフォルトの名無しさん
08/02/01 19:31:13
>>751-752
なるほど・・ゼロでしたか
謎がとけました、ありがとうございます!

755:デフォルトの名無しさん
08/02/01 21:29:40
c++のプログラムを書いてます。
コンソールからstringを入力させたいのですが、getline()とcinを併用すると
何回目かのcinがユーザの入力待ちにならずにそのまま長さゼロの入力を受け取った
と誤解して処理が先に進んでしまうようです。何かフラッシュとかの処理が必要なので
しょうか?

756:デフォルトの名無しさん
08/02/01 22:01:29
エラーが発生したなら
cin.clear(); するまで関数に失敗するが、
そういうわけではなくて?

757:デフォルトの名無しさん
08/02/02 01:13:42
Pointer to a String terminated by Zero

758:デフォルトの名無しさん
08/02/02 01:38:32
std::map<CString, CComPtr<ID3DXFont>> fonts;
に問題はありますか?

759:デフォルトの名無しさん
08/02/02 01:39:47
エラーが出なければ問題は無い。
エラーが出るなら問題。

760:デフォルトの名無しさん
08/02/02 01:41:21
質問させてください.
c言語でscanfで入力を受けるプログラムをつくりました.
バッチファイルとかシェルスクリプトで入力してやりたいのですが、つまづいています.
要するに、
(実行ファイル)enter(入力)enter
では無く、
(実行ファイル)(入力)enter
のような感じに書く方法がありますか?ということです.


761:デフォルトの名無しさん
08/02/02 01:46:08
int argc, char* argv[]
でググれ。

762:デフォルトの名無しさん
08/02/02 01:48:35
>>760
そのレベルは……ぐぐるとかじゃなくて、本を読んできちんとした知識を身に付けた方が良いよ。
いや、マジで……

763:デフォルトの名無しさん
08/02/02 01:54:08
>>758
STLのこんてなにオートポインタの類入れると

764:デフォルトの名無しさん
08/02/02 01:59:29
とりあえず>>だとコンパイルエラーになったりするので> >にしとけ。

765:デフォルトの名無しさん
08/02/02 02:37:31
760です.確かに知識は無いです.
実は数値計算だったので簡単に済ませたかったんです.
リダイレクトでパラメータをいれる代わりに、
そのまま数値を書く方法があるのかなと思って質問してみたんですが.

どうやら場違いでした.

766:デフォルトの名無しさん
08/02/02 03:34:39
ウィンドウつくったり図を表示したりするのってWin32API勉強しないとできない?

767:デフォルトの名無しさん
08/02/02 03:49:03
>763
std::aut_ptrが例外的にダメなオートポインタで、
大抵のスマートポインタは入れても大丈夫じゃねーの。

768:デフォルトの名無しさん
08/02/02 12:09:24
VC6 だが、std::vector に CComPtr 入れると
resize でアサーションエラーが出た。

769:デフォルトの名無しさん
08/02/02 12:31:21
intrasive_ptr?だっけ?
まさにCOMみたいに自前でカウントしてるクラス用のスマポ

770:デフォルトの名無しさん
08/02/02 12:46:10
string型の変数の中身をlistコンテナに一文字ずつ移そうとしてます。
for_each(string.begin(), string.end(), XXXX);
みたいにfor_eachを使って書けないでしょうか?


771:デフォルトの名無しさん
08/02/02 12:49:16
push_backとmem_fun_ptr

772:デフォルトの名無しさん
08/02/02 12:50:12
mem_fun_refだったorz

773:デフォルトの名無しさん
08/02/02 13:03:58
これはだめ?
std::list<char> l;
std::copy(string.begin(), string.end(), std::back_inserter(l));

774:デフォルトの名無しさん
08/02/02 14:48:54
std::list<char> l(s.begin(), s.end());
または
l.assign(s.begin(), s.end());
だろ。

775:デフォルトの名無しさん
08/02/02 15:35:03
for_each(s.begin(), s.end(), mem_fun_ref(v.push_back));
ということですか?
でもこれはコンパイルできなかった。

776:デフォルトの名無しさん
08/02/02 16:06:20
>>775
>>773は正しい処理だが、
効率が悪いということじゃないの?

初期化の話だよな?

>>775
そりゃ、あらゆる点で無理だ。

777:デフォルトの名無しさん
08/02/02 16:16:22
v.push_backではなくて&std::list<char>::push_backだろ
まあstd::back_inserterを使うのが最適なわけだが

778:デフォルトの名無しさん
08/02/02 16:18:57
最適は774だって。 EffectiveSTL嫁。

779:デフォルトの名無しさん
08/02/02 16:20:27
元の質問は for_each が使いたいらしいから、 >777 でも間違いではない。

780:デフォルトの名無しさん
08/02/02 16:51:44
>>777
それでもダメ。引数の数が一致しない。
せめてbind1stを使えといいたいところだが
ほとんどの実装でunary_functionで参照の参照が
発生してはじかれる。


781:デフォルトの名無しさん
08/02/02 16:55:14
>>778
範囲指定のイテレータか

782:デフォルトの名無しさん
08/02/02 17:07:39
ぶっちゃけ、メンバ関数をforeachみたいな連中に渡すのは
面倒くさいのでboost使おう、という話になるw

783:デフォルトの名無しさん
08/02/02 17:11:23
だからfor_each使わずに>>774でいいって。

784:784
08/02/02 19:38:53
質問です。

//正規分布を求めるメソッド
float BestFitInfo::norDis(float x, float mean, float var){

return 1 / ( sqrt( 2 * 3.14 ) * sqrt(var) ) *

exp( - (x - mean) * ( x - mean ) / ( 2 * var ) );
}

//BestFitInfoというクラスを作って、
//正規分布を求めるメソッドを書いたところ、

warning C4244: 'return' : 'double' から 'float' への変換です。データが失われる可能性があります。

と言われました。すべて引数は float だし、
exp や sqrt の戻り値もそれに合わせて float のはずなので、
どこで double 型が発生しているのかわかりません。

なぜこのようなエラーとなっているのでしょうか?
分かる方がいらっしゃいましたら教えてください。
よろしくお願いします。

785:デフォルトの名無しさん
08/02/02 19:45:47
>>784
>exp や sqrt の戻り値もそれに合わせて float のはずなので、
本当か?
floatのはsqrtfとかexpfじゃないのか?
あと、3.14はdouble型だ。float型リテラルは3.14fと書く。

786:784
08/02/02 19:59:47
785さん、お返事ありがとうございます。

3.14fと書いたら「データが失われる可能性があります」と言われなくなりました。

sqrtについて調べたところ、

double sqrt(
double x
);
float sqrt(
float x
); // C++ only
long double sqrt(
long double x
); // C++ only
float sqrtf(
float x
);

このように sqrt は多重定義されているようです。
sqrtf はC言語のときの名残のようですね。

解決しました。みなさまありがとうございました。

787:デフォルトの名無しさん
08/02/02 22:11:07
質問です
僕はインクルードガードシンボルにuuidを含ませる事があるんですが
Cのプリプロセッサで処理するシンボルは最大何文字までいけるんでしょう?
#define HOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE
ぐらいのものは処理できるならまぁ十分なんですが気になります
あと変数名や名前空間名も何文字までいけるか気になります
ADLバリアを使うと結構文字数増えますし、
もしあまりに少ない文字数(例えば31文字)だったとしたら怖いんで

788:デフォルトの名無しさん
08/02/02 22:23:36
プリプロセッサの制限はわからんけど、
C89までは厳密には識別子は先頭6文字位じゃなかったっけ
C99で32文字になったような気がしないでもない

789:デフォルトの名無しさん
08/02/02 22:39:22
プリプロセッサの制限はわからんけど、

内部識別子は最低32
外部が8くらいだったと思う。6かもしれん。
VC6なんかでは外部256とかで、複雑なtemplateとかで警告が出るね。

790:デフォルトの名無しさん
08/02/02 22:40:07
あ、これはC89ね

791:デフォルトの名無しさん
08/02/02 23:21:31
完全にうろ覚えだけど、マクロ名などの内部識別子は、
C89が31文字で、C99は63文字だったと思う。

792:791
08/02/02 23:50:16
C++98ではCにはあったtranslation limitの既定がなくなって、長さに制限はないと明記されているね。
付録のBで内部外部ともに1024文字以上を推奨ってことになってる。(これは一応調べてきた

793:デフォルトの名無しさん
08/02/03 00:14:52
クラスあったら構造体いらないと思うんですが、構造体で宣言する利点って何ですか?

794:デフォルトの名無しさん
08/02/03 00:20:15
メッセージループ(DispatchMessage)に入る前にウィンドウプロシージャにメッセージが飛んでしかも処理されてるっぽいんですが
当たらしく作られた別スレッドで動いてるんですか?このウィンドウプロシージャってやつは

795:デフォルトの名無しさん
08/02/03 00:26:14
ある種のAPIは、直接プロシージャを呼び出して配送する。
有名なのは、UpdateWindowのWM_PAINTなど。

796:デフォルトの名無しさん
08/02/03 00:32:13
ほかにもWM_CREATEやそれより前にやってくるメッセージはCreateWindow(Ex)内部で呼ばれるし、
Send系で送る場合も同一スレッドなら直接呼ばれる。

797:デフォルトの名無しさん
08/02/03 00:33:50
>>795
ああ、なるほど、そういうことですか
そういうパターンをすっかり見落としてました

798:デフォルトの名無しさん
08/02/03 00:37:05
>>793
ただの構造体が欲しいときかな。
たとえば
APIにパラメータを渡したいとき。
ハードウェアをアクセスするとき
オフセットをがっちりあわせたいとき



799:デフォルトの名無しさん
08/02/03 00:37:18
>>793
しかしだね、
class Hoge { public: int id; double data; };
に対して
hogeInst.id = 1;
hogeInst.data = M_PI;
なんて操作をするのは背筋がぞわぞわしないか?

800:デフォルトの名無しさん
08/02/03 00:59:29
char* str = "aあいう"
みたいに日本語とアルファベットが混在した文字列の、
文字数を数えるにはどうすればいいのでしょうか?
strlen(str);
とすると7になってしまいます。

環境はWindows XPでWin32APIを使ってプログラミングをしてます。

801:デフォルトの名無しさん
08/02/03 01:04:38
wchar_t* str = "aあいう";
wcslen(str);

802:デフォルトの名無しさん
08/02/03 01:05:10
L"aあいう"; だた

803:デフォルトの名無しさん
08/02/03 01:12:01
すいません、少し説明が足りませんでした。

そもそも何がやりたいかというと、
char*からwchar_t*への変換をしたいのですが、

char*変数のstrに'L'をつけて、L(str);とするとエラーになってしまいます。

そこで、MultiByteToWideCharで変換しようと思ったのですが、
wchar_t* wstr = new wchar_t[len];
というふうに、変換後文字のためのバッファをとろうとして、
その長さのlenをどう数えたらいいか分からなくなりました。

804:デフォルトの名無しさん
08/02/03 01:16:44
>>803
MultiByteToWideCharの仕様をMSDNで良く見直すこと。
とくに戻り値の説明を。

805:デフォルトの名無しさん
08/02/03 01:22:44
>>798-799
ありがとう。構造体で出来るなら構造体で済ました方が楽ってことですね

806:803
08/02/03 01:25:33
>>804
ありがとうございます!

len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);

これで長さがとれました。

807:デフォルトの名無しさん
08/02/03 01:30:13
ある関数の返り値を配列でほしいのですが
関数の返り値にvectorやらlistを返すのってありですか?
それとも引数から参照渡しで変更させたほうがよいですか?

808:デフォルトの名無しさん
08/02/03 01:36:04
コストを気にしなければあり。

809:デフォルトの名無しさん
08/02/03 02:08:30
参照渡しで変更させたほうがいいなぁ。
要素数一桁だとか、RVOが可能な記述が出来るならともかく。
どうしても戻り値がいい場合はshared_ptrで包む。

810:デフォルトの名無しさん
08/02/03 02:31:06
バイナリでのファイル入出力って普通のと何がちがうの?
バイナリ形式で保存したのをメモ帳で開いても普通に出力したのと変らないんだけど

811:デフォルトの名無しさん
08/02/03 02:53:33
>>799
C++ にもプロパティがあればいいんだけどね。
拡張機能で用意されてる事もあるが。

812:デフォルトの名無しさん
08/02/03 02:59:27
>>807
配列の先頭アドレスを返す、じゃダメなのかな

>>810
普通のっていうのはテキストモードのことだよね
テキストモードだと改行文字をいじったりしてる

詳しく知りたい場合は「fopen テキストモード」とかでググれば出てくると思う

813:デフォルトの名無しさん
08/02/03 03:15:45
C++の参照渡しって、結局中ではアドレスが渡されてるんですか?

そうじゃないとしたら一体どうなってるんでしょうか?

814:デフォルトの名無しさん
08/02/03 03:21:35
結局中ではアドレスが渡されてる実装しかないだろうな。

815:デフォルトの名無しさん
08/02/03 03:29:27
>>812
ありがとうございます
「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」みたいな文字化けしたような感じで
書き込まれるのかと思ってたけど違うのね
こんな文字化けしたようなdatファイルとかってどうやって作ってるの?

816:デフォルトの名無しさん
08/02/03 03:36:58
文字以外を書き込めばなりやすいな

817:デフォルトの名無しさん
08/02/03 03:44:10
>>815
書きたい内容をそのまま書けばいい。

static const unsigned char data[] = {
0xBF, 0x83, 0xC3, 0x32, 0x3A, 0xCE, 0x53, 0x53,
0xB6, 0xA2, 0x38, 0x8A, 0x49, 0x4D, 0xC0, 0xD7,
0x92, 0x6A, 0xD5, 0xD1, 0xA9, 0x74, 0x6E, 0x8C,
0x7B}; // 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」

FILE* fp = fopen("test.dat", "wb");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);

818:デフォルトの名無しさん
08/02/03 03:47:54
そのデータだと

FILE* fp = fopen("test.dat", "w");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);

でも同じ物が書き込まれるがね。

バイナリモードとテキストモードの違いは
メモリ上で 0x0D('\n') となるバイトを
ファイル上でその環境の改行コードに変換するか否かしかない。

819:デフォルトの名無しさん
08/02/03 08:05:56
>>817-818
ありがとう。でも全然分からない
おれにはまだ早かったみたいです
とりあえずテキストとバイナリモードの違いは\nとかが違うだけで文字は変わら
ないんですね
勉強してきます

820:デフォルトの名無しさん
08/02/03 09:13:33
>>811
なければ自分で作ればいいじゃん。
俺は処理系非依存のプロパティ変数クラスを作った。

821:デフォルトの名無しさん
08/02/03 11:00:39
>>819
結果はメモ帳で見るよりバイナリエディタで見た方が分かりやすいかと思う。

何かバイナリモードとテキストモードでもの凄く違うと考えてるみたいだが、
動作的には大した違いはない。
普通は fprintf はテキストモードで、fwrite はバイナリモードで使うが、
別にそう使わないといけないという決まりはないんで、
バイナリモードとテキストモードで同じ物を書き込んで
それぞれどうなるか実験してみればいい。

822:デフォルトの名無しさん
08/02/03 11:25:33
>>820
プロパティリストではなくて、delphiのプロパティ宣言みたいなものが作れるの?


823:デフォルトの名無しさん
08/02/03 12:01:34
>>820
初期化が必要なのは面倒臭い。

824:デフォルトの名無しさん
08/02/03 12:57:16
複数のソースで使うヘッダファイルの変数や関数が、
多重に宣言されないように、externの宣言がありますが、
ヘッダファイルに↓みたいな多重インクルードガードをつけたときも、
externは必要なのでしょうか?

#ifndef AAA_H
#define AAA_H
//ヘッダの内容
#endif

825:デフォルトの名無しさん
08/02/03 13:01:13
extern はリンク時の多重宣言を回避するための物。
インクルードガードはコンパイル時の多重宣言を回避するための物。
全く別の物。

826:デフォルトの名無しさん
08/02/03 13:26:37
>>824
必要。


827:824
08/02/03 13:32:45
>>825
>>826
ありがとうございます。

今は、複数ソースで共有する変数/関数にはextern、
全ヘッダにとりあえずインクルードガードをつけてます。

違いがよくわからず、不安なんですが、
こんなんでいいのでしょうか?

ちなみに、関数の方はexternをつけなくても動きました。

828:デフォルトの名無しさん
08/02/03 13:42:54
関数はデフォルトでextern

829:デフォルトの名無しさん
08/02/03 13:45:22
コンパイルとリンクの違いを調べるといいよ

830:デフォルトの名無しさん
08/02/03 13:51:38
c++で、int [] hoge(適当な引数)
みたいに、配列を返す関数って定義できますか?
上記はできなかったので、結局int []を持つstructを定義して、それを返すように
したのですが、、

831:デフォルトの名無しさん
08/02/03 13:54:14
普通は効率を考えて配列を渡してそこに書き込むようにする。

832:824
08/02/03 13:54:51
>>828
そうなのですか。一つ大きな疑問が解決しました。
ありがとうございます。

>>829
勉強してみます。

833:デフォルトの名無しさん
08/02/03 13:58:36
>>827
関数でも、関数定義を複数書けばエラーになるよ。
エラーにならないのは関数定義は1つしか書いてなくて、
他は関数プロトタイプしか書いてないから。

834:デフォルトの名無しさん
08/02/03 14:30:12
>>825
うそん。
>extern はリンク時の多重宣言を回避するための物。
多重宣言どうこうっていうか、外部結合を明示するだけの物じゃないのか?
そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?

突っ込み入らないってことは俺が誤解してるんだろうか。

835:デフォルトの名無しさん
08/02/03 14:37:54
>>834
>そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?
そのとおりだよ。
extern指定子の無い宣言は仮の宣言。
コンパイル単位に定義が見つかったら、仮の宣言は冗長な定義として
無視される。そうでなければ0で初期化される単一の定義になる。

と思ってる。

836:デフォルトの名無しさん
08/02/03 14:38:09
C は仮定義があるから初期化しなけりゃ
複数の記憶クラス指定子のない変数宣言があっても大丈夫。
C++ は仮定義が廃止されたので
複数の記憶クラス指定子のない変数宣言があるとエラー。

837:デフォルトの名無しさん
08/02/03 14:40:39
gcc用で配布されているコードを,
VisualStudio2005でコンパイルしたところ,
エラー 1 error C2143: 構文エラー : '{' が ':' の前にありません。 c:\program files\microsoft visual studio 8\vc\include\cmath 18
エラー 2 error C2059: 構文エラー : ':' c:\program files\microsoft visual studio 8\vc\include\cmath 18

といった無数のエラーが出ました.

ちなみにcmathはインクルードしておらず,
#include<stdio.h>

#include<stdlib.h>


#include<math.h>

#include<complex>
だけです.

どなたかアドバイス頂けませんでしょうか?

838:デフォルトの名無しさん
08/02/03 14:45:22
>>831
ありがとうございます。
参照渡しとかですね。

すいません、あと1つ質問させてください。
stringを継承して、[]をつかって[-1]と[サイズ+1]の要素にアクセスに行ったときだけ
動作の異なるクラスを定義できますか?自分でやろうとしたのですが、コンストラクタ
は継承されないから自分で定義しなおさないとダメなのですよね。そうすると、コンストラクタ
を書くのが結構大変なような気がしたので。


839:デフォルトの名無しさん
08/02/03 14:49:14
>>838
コンストラクタだけじゃなくて演算子だって定義する必要があるんだぜ。
戻り値の型が変わるから。

at 関数を使うと範囲チェックして out_of_range 例外投げるから
それ使えばいいんじゃね?

840:デフォルトの名無しさん
08/02/03 14:51:57
a.exe から LoadLibrary で b.dll を呼び出すんだけど、
b.dll から右側では .NET を使いたい。

 a.exe → b.dll

このような場合、b.dllをC++/CLIで作成することになるのかしらん?

841:デフォルトの名無しさん
08/02/03 14:54:13
>>839
なるほど、それでやってみます。
サンクス!


842:デフォルトの名無しさん
08/02/03 14:58:05
>>838
stringは仮想デストラクタを定義していないから
public継承するのはどうかと思うけど、コンストラクタ
の呼び出しに関しては、stringのコンストラクタ
を派生クラスのコンストラクタ初期設定リストで
指定すればいいだけじゃないの。


843:デフォルトの名無しさん
08/02/03 14:58:47
>>840
a.exeからC++/CLIでどぞ

844:デフォルトの名無しさん
08/02/03 15:01:44
>>840
C#でもVB.NETでもお好きにどうぞ

845:840
08/02/03 15:16:22
>>843
a.exeは他所で作ったものだから、漏れはいじれないんだ。

>>844
LoadLibraryでもマネージDLLを呼び出すことができるってこと?

846:デフォルトの名無しさん
08/02/03 15:31:59
>>808>>809>>812
返答ありがとうございます

色々とやり様があるみたいですが、c++的にはやはり生の配列を返すよりコンテナを返したほうがよいのでしょうか?
そうするとやはりlistを引数に取る関数に参照渡しが無難なのかなぁ・・・?

847:デフォルトの名無しさん
08/02/03 15:33:16
class Hoge1
{
 void hatena(void)
 {
  Hoge2 ht;
  ht.nazo(*this);
 }
};

class Hoge2
{
 void nazo(const Hoge2 &rho){}
};

みたいなのがあって

ht.nazo(*this);のところでエラーになります。

どうす

848:デフォルトの名無しさん
08/02/03 15:36:10
>>847
nazo(const Hoge1・・・にす

849:デフォルトの名無しさん
08/02/03 15:37:13
&rho

850:デフォルトの名無しさん
08/02/03 15:37:17
>void nazo(const Hoge2 &rho){}

nazoは引数にHoge2を取るようだが
thisポインタってhoge1のアドレスを示してるんじゃないの?

851:837
08/02/03 15:38:34
>>837
の質問はVC++スレに書き直しました.
マルチポストすいませんでした.

852:デフォルトの名無しさん
08/02/03 15:41:31
Hoge &rho

853:デフォルトの名無しさん
08/02/03 15:41:53
化けるのね。

854:デフォルトの名無しさん
08/02/03 15:42:31
hoge piyo fuga

855:デフォルトの名無しさん
08/02/03 15:45:11
&

856:デフォルトの名無しさん
08/02/03 15:46:57
&a

857:デフォルトの名無しさん
08/02/03 15:51:34
&rh

858:デフォルトの名無しさん
08/02/03 15:53:17
&abcd

859:デフォルトの名無しさん
08/02/03 15:55:04
&rho

860:デフォルトの名無しさん
08/02/03 18:14:16
なぜか、参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます。

#include <stdio.h>

int main(void)
{
int i, j, ln;

printf("何段ですか:");
scanf("%d", &ln);

for (i=1; i<=ln; i++); {
for (j=1; j<=i; j++)
putchar('*');
putchar('\n');
}

return (0);
}

ちなみにOSはVistaです。どこか違っていたら教えてください。



861:デフォルトの名無しさん
08/02/03 18:19:32
for (i=1; i<=ln; i++);

これ。
「;」という何の処理もしない文をforでループさせることになってる。

862:デフォルトの名無しさん
08/02/03 18:21:39
>>860
正解が何か知らんからわからんが
改行の位置がおかしいんじゃないか?

863:デフォルトの名無しさん
08/02/03 18:23:03
>>861
スマソ
そうだね
改行は問題ないわ

864:デフォルトの名無しさん
08/02/03 18:23:08
test

865:デフォルトの名無しさん
08/02/03 18:25:57
>>860
>参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます

このスレを見ている人はその参考書のことなんてしらない。
どのような結果を求めているのかを提示しないと、どこが違っているのか答えられないよ。

明らかにおかしいコードだから答えは>>861の通りだろうけど、もうちょっと質問の仕方を考えたほうがいいよ。


866:デフォルトの名無しさん
08/02/03 18:26:15
>>861
サンクス
無事実行できました。

867:デフォルトの名無しさん
08/02/03 18:26:28
861に書かれていることと
その下の行の { が足りないことで
たまたま{ }の対応がうまくいってコンパイルは通ってるんだな。
なので2ヶ所修正

868:デフォルトの名無しさん
08/02/03 18:26:51
C言語でのアルゴリズムの質問をさせて下さい。

現在以下のようなプログラムを作ろうと思っています。

0~65535までの数字をIDとしてユーザに割当てる。
ユーザが割当てられたIDを使わなくなったときはそのIDを返却し、
返却されたIDは回収されて他のユーザに割当てられる。

最も簡単なやり方は、user_id[65536]などの大きな配列を作って、
使用状況を配列の中身の0か1で判断する、といったものかと思います。

しかしこのやり方よりもっと効率的なものはないでしょうか?
このような大きな配列を作るのは実装としてまずいのかな…と感じています。

初心者で申し訳ありませんがアドバイスよろしくお願いします。

869:867
08/02/03 18:27:59
あ、違った。
ごめん

870:デフォルトの名無しさん
08/02/03 18:29:28
とはいえ入門書で{}略すのはイクナイと思う。

871:デフォルトの名無しさん
08/02/03 18:29:56
>>868
64Kなら、オンメモリで処理してもいいんじゃね?
ビットで処理したら、8Kで収まる。

872:デフォルトの名無しさん
08/02/03 18:31:50
>>868
更に上限を増やさなければならない可能性があるなら、
別のやり方を考えたほうがいいと思うけど、
それぐらいなら問題ないと思うね。

873:デフォルトの名無しさん
08/02/03 18:32:16
>>870
ぜんぜんOK

874:デフォルトの名無しさん
08/02/03 18:36:59
>>868
その、配列やり方でいいと思うよ。
ランダムに返却され再利用されるならそれしかない。>>871のようにビットマップで配列は小さくできる。

連続の範囲でとりますとか特徴があれば、それを使って効率的に管理することもできる。



875:デフォルトの名無しさん
08/02/03 18:37:36
ある静的メンバ変数を含むクラスをテンプレート化しました。
この場合、静的メンバ変数は、テンプレート引数ごとに別々の実体が
作られるということで、このことは確認できました。
で、質問なのですが、この静的メンバ変数の初期化は、
いつ行われるのでしょうか?
テンプレート化してない場合は、mainが始まる前ということで、
これは手元の本にも載っているのですが、
テンプレート化した場合、実際にどんなテンプレート引数で
クラスが作られるかわからない段階で初期化ってできるのか、と
思ったものですから。
実際、mainの最初で、静的メンバ変数の値を見てみてみても、
なぜかちゃんと初期化した値が入っているように動きます。
なぜなのでしょうか。

876:デフォルトの名無しさん
08/02/03 18:41:47
コンパイル終わったときにはわかってるから。

877:デフォルトの名無しさん
08/02/03 18:43:13
テンプレートはビルド時に、
初期化コードも含めてすべて実体化されるだろ。

878:デフォルトの名無しさん
08/02/03 18:44:51
>>876
>>877
むむむ、そういうことですかーーー。
考えが至りませんでした。
ありがとうございました。

879:868
08/02/03 18:56:06
>> 871,872,874

アドバイスありがとうございます。
特に問題がないようですので、このやり方で続行します!

880:デフォルトの名無しさん
08/02/03 19:14:04
C++だとbitsetでやるのが楽なんだろうけどな

881:デフォルトの名無しさん
08/02/03 19:20:13
それだとフリー探索がO(N)になるから、vector<unsigned short>(65536)という
手もよくあるパターンではある。

882:デフォルトの名無しさん
08/02/03 19:23:17
set<>は使えんの?

883:デフォルトの名無しさん
08/02/03 19:24:46
>>881
なんでunsigned shortなの?

884:デフォルトの名無しさん
08/02/03 19:32:59
intよりは節約できるし、IDは0~65535なんだろ?

885:デフォルトの名無しさん
08/02/03 19:37:16
サンプルコード見ながら勉強してるのですが

this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide;
#pragma endregion
private:

の、->、::、#、:、の意味がよくわかりません
調べたいのですが、記号はGoogleで検索できないので、この記号の名称を教えてください


886:デフォルトの名無しさん
08/02/03 19:42:26
サンプルコードを見る域に達してないな

887:デフォルトの名無しさん
08/02/03 19:45:39
だから質問しているんです

888:デフォルトの名無しさん
08/02/03 19:45:51
それどころか勉強すら始まってないな

889:デフォルトの名無しさん
08/02/03 19:46:37
なんか本買えよ。
というか、そんな変態言語じゃなくて、普通のC++から勉強しろ

890:デフォルトの名無しさん
08/02/03 19:50:40
>>887
無料で見れる情報、無料で協力してくれる人だけをあてにして勉強する気?

独学で身につけるだけの基礎的な力をもっているならまだしも、
まったく何も持っていないなら勉強するための最低限の準備くらいはしたら?

891:デフォルトの名無しさん
08/02/03 19:52:27
>>885
何でも良いからCの入門書を読んでからにしようぜ


892:デフォルトの名無しさん
08/02/03 20:00:57
質問ていうか相談なんだけど
TXTファイルの文字列置換ツール作たいんだけどさ
置換箇所だけ更新かけたいんだよ
でもさ、fopenでファイル開くと一箇所変えると全部上書きしないといけないじゃん
置換箇所だけ更新かける方法ない?

893:デフォルトの名無しさん
08/02/03 20:07:34
C++/CLIの文法はアレだからなー。

894:デフォルトの名無しさん
08/02/03 20:07:49
一旦、別のファイルに書き出す。
その後、元ファイルを削除し、
さっき書き出したファイルの名前を元の名前に変える。

895:デフォルトの名無しさん
08/02/03 20:08:21
文字数変わらないなら、fseekとかfwriteあたりを駆使して
上書きすりゃいいじゃん。 ずれるのならご愁傷様。

896:デフォルトの名無しさん
08/02/03 20:29:30
>>892
ファイルの途中でサイズが増減しても、局所的な更新だけですむような
ファイルシステムを実装する。

897:デフォルトの名無しさん
08/02/03 21:08:44
>>874
> ランダムに返却され再利用されるならそれしかない。

そんなことはないだろ。

組み込み用途だと、8KB なんて言うテーブルなんてとんでもないと言う
こともあるだろうし、PC でも ID を 32bit にしたいとか言われたら、
どうするんだよ。(w

>>868
ID の範囲に比べて、同時使用ユーザ数が極端に少ないなら普通にリニア
サーチして管理することもできるし、同時使用ユーザ数がそれなりで
ID の割り当て・回収の処理コストが問題になるならハッシュとかBツリー
を使うこともできる。

898:デフォルトの名無しさん
08/02/03 21:09:38
stl::map<stl::string, Animal> animals;
Animal &a = animals["cat"];

この時点で、aに入る物は出来ていますか?

899:デフォルトの名無しさん
08/02/03 21:13:50
stlの定義による。
stlがstdの間違いなら、aは正しく要素を指している。

900:デフォルトの名無しさん
08/02/03 21:16:27
>897
「何」を、リニアサーチするんだ?

901:デフォルトの名無しさん
08/02/03 21:16:42
>>897
また組み込み厨がでたよ。
特殊な環境を持ち出して、いちいち反論するヤツ。

902:デフォルトの名無しさん
08/02/03 21:25:25
>>897
ランダムに返却されれば、2^65536の組み合わせが発生する。それを記録処理するには65536bit必要になる。すなわち8Kバイトだ。
それ以下にするには、IDの消費が均一ではなく偏らせる必要がある。
たとえば、連続してIDを取得する。そういう特徴があれば、それに応じた処理にして節約すればいい。しかし、それはランダムとは言えない。


903:デフォルトの名無しさん
08/02/03 21:29:51
>>897
どこに極端に少ないと書いてある?

904:デフォルトの名無しさん
08/02/03 21:31:54
その次に「なら」ってかいてあるがな

905:デフォルトの名無しさん
08/02/03 21:33:18
>>884
いまさらだけど、配列の中身は0か1って書いてあるんだからshortは必要ないだろ

906:デフォルトの名無しさん
08/02/03 21:34:05
そこかしこのレスから揚げ足を取りたがってるオーラを感じるのは俺だけでいい

907:デフォルトの名無しさん
08/02/03 21:34:51
文章構成がアレだね。
前半は、「パターンがランダムでも、メモリ8KBも取る必要はない」って言ってて、
後半は、「パターンがランダムでなければ、節約する方法がある」みたいな。

908:881=884
08/02/03 21:37:43
えと、つまり、vectorのvがあるとして、
初期値として、(65535~0)を入れとくわけね
で、こうするとO(N)で触れる、ってだけの話。
要求(){ return v.pop_back() }
解放(id){ v.push_back( id ); }


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