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


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

C++相談室 part7
501 名前:499 :02/06/04 18:59
すいません。以下が省略なしです。
Could not intialize installation.File size expected=48049450.size returned=20408929.パラメータが正しくありません。


502 名前:デフォルトの名無しさん :02/06/04 19:03
アーカイブが壊れてるんだろ、串をはずして落とし直せ

503 名前:499 :02/06/04 19:43
OpenWatcom落とせなくなったんですが・・・
自分だけですか?

504 名前:デフォルトの名無しさん :02/06/04 19:44
C++のわかりやすいお勧め本ってないですか?

505 名前:デフォルトの名無しさん :02/06/04 19:49
ほんとだ落とせない。

506 名前:499 :02/06/04 19:56
ANSI対応の他のおすすめコンパイラってないですか?
エディタも一緒のがいいのですが・・・

507 名前:デフォルトの名無しさん :02/06/04 20:23
個人的にはダイテルさんの「C++プログラミング vol.1〜3」を
推してみたい>>504


508 名前:デフォルトの名無しさん :02/06/04 20:25
C++を学習できるサイトを教えてください!

509 名前:デフォルトの名無しさん :02/06/04 20:26
>>508
「猫でもわかる」でぐーぐってみ?

510 名前:デフォルトの名無しさん :02/06/04 20:34
>>504
柴田望洋著「プログラミング講義C++」などはいかが?

511 名前:デフォルトの名無しさん :02/06/04 20:34
>>509
ありがとうございました。今から勉強します。

512 名前:デフォルトの名無しさん :02/06/04 20:38
猫はC/C++の勉強に向いてないと思うが

513 名前:デフォルトの名無しさん :02/06/04 20:48
>>511
http://www.sist.ac.jp/~suganuma/learn/learn.html
なんか割とわかりやすいと思うんだが。

514 名前:デフォルトの名無しさん :02/06/04 22:22
boost::mem_fn あげ。

515 名前:デフォルトの名無しさん :02/06/04 23:35
>>514
mem_fn に何かあったの?

516 名前:デフォルトの名無しさん :02/06/05 15:15
ある enum の一部を抜き出して別の enum を定義し、その抜き出した部分に
ついては同一視して扱いたい、という場合があります。次の enum Foo; と
enum Hoge; のような感じ。

enum Foo { a, b, c, d };
enum Hoge { B = b, C = c };

void foo( Foo x ) { }
void hoge( Hoge x ) { foo( (Foo)x ); }
int main() { hoge( B ); }

ここでは、関数 hoge() から foo() を呼び出すときにどうしても
キャストが必要になってしまうのですが、このように同一視して扱いたい
複数の enum がある場合に、キャストを使わずにすむような、もっと
スマートなやり方はないでしょうか。

517 名前:516 :02/06/05 15:44
とりあえず、キャストを
inline Foo convertToFoo( Hoge x ) { return (Foo)x; }
みたいな変換関数に閉じ込めることで対処してみた。
ふつう、このインラインは何もコードを生成しないよね?

518 名前:名無し募集中。。。 :02/06/05 16:44
C++でこの本が分かりやすいっていうのは
ありますかね???

519 名前:デフォルトの名無しさん :02/06/05 16:45
C++で理解する本は無いな

520 名前:名無し募集中。。。 :02/06/05 16:46
>>519
C++の分かりやすい解説書

521 名前:デフォルトの名無しさん :02/06/05 16:53
独習C++

522 名前:デフォルトの名無しさん :02/06/05 16:54
わかりやすい解説書というか、一番最初に読むと良い本

523 名前:名無し募集中。。。 :02/06/05 16:55
>>522
ありがとう
それよく売ってるね

524 名前:デフォルトの名無しさん :02/06/05 16:57
独習が終わったら、アスキーのでかい本やEffective/More〜/Exceptional等お好きな物をどうぞ

525 名前:名無し募集中。。。 :02/06/05 17:00
>>524
一応友達に企業から依頼されてる人がいて
その人から色々学んで
めちゃくちゃ簡単な事なら出来るけど
すごく簡単な関数ぐらいならどうにか出来る
あと何となくクラスとポインタも分かる

とりあえず親切にありがとう

526 名前:デフォルトの名無しさん :02/06/05 17:02
>>525
むぅ?

527 名前:名無し募集中。。。 :02/06/05 17:04
>>526
分からなかった(^^ゞ
すんまそm(__)m

528 名前:デフォルトの名無しさん :02/06/05 22:17
ちょっと確認させてください。
「プロテクトコンストラクタを持ってるクラスのオブジェクトは定義できない。この
クラスは継承されるためのクラスである。継承されるためのクラスという点では純粋仮想
関数を持ってるクラスと同じである。」

という風に理解しているのだが、いいだろうか?

529 名前:デフォルトの名無しさん :02/06/05 22:21
良くない

530 名前:デフォルトの名無しさん :02/06/05 22:30
手段と目的を逆にしちゃいかんよ。

勝手にインスタンスを生成されたくない場合に、
コンストラクタをprivateにすることがある(例:シングルトン)
この場合、staticなメソッドあるいはfriend関数/クラスから作成する。

531 名前:528 :02/06/05 22:43
>>530
う〜〜む、俺がプロテクトコンストラクタを使いたい理由はこのクラスはこのまま
使っても意味がないから(インスタンスを生成されたくない)継承して機能を
拡張してから使え・・・ということなのだが。 
こういう使い方はダメなの?

532 名前:デフォルトの名無しさん :02/06/05 22:49
>>531
だめ、というか意味がないでしょ。
継承したって何もオーバーライドしなかったら元のクラスのオブジェクトをそのまま作ったのと何の違いもないもん。

533 名前:デフォルトの名無しさん :02/06/05 22:49
>>531
いいんでないの

534 名前:デフォルトの名無しさん :02/06/05 22:50
>>531
そういう場合は抽象クラスにすると思う

535 名前:デフォルトの名無しさん :02/06/05 22:51
>>532
そうね。純粋仮想関数用意したほうが実装を強制できるね。

536 名前:528 :02/06/05 23:04
>>532
             ○ ←基本クラス
            /\
           ◯  ◯ ←プロテクトコンストラクタのクラス
            \/    (仮想派生)
             ◯
という継承の時にもプロテクトコンストラクタは意味ないだろうか?


537 名前:デフォルトの名無しさん :02/06/05 23:10
>>536
無い

538 名前:デフォルトの名無しさん :02/06/05 23:27
ModernC++ではポリシークラスにプロテクトコンストラクタを使用してる。
Mixinするので生成してほしくないが仮想関数も必要ないという場合。
もっともMixinして使うクラスを単体で作成できたからといって
大して害はないんだが。

539 名前:デフォルトの名無しさん :02/06/05 23:30
何のために派生を強制したいかによるなあ。
派生は強制させたいがconstrucgor以外は何も変更しなくてよい、というシチュエーションがあるのなら
protected constructor方式にも意味あるのかもしれない。

540 名前:デフォルトの名無しさん :02/06/05 23:41
>>539
派生させたい理由が思いつかないけどね。
class Class: public Base{};
するだけでインスタンス作れるようになっちゃうし。

541 名前:528 :02/06/06 00:45
なんとなくプロテクトコンストラクタについて理解できたような気がします。


542 名前:デフォルトの名無しさん :02/06/06 11:16
リッチテキストにEM_AUTOURLDETECTを使用してURLを自動でハイパーリンクにしてるんだけど、
ファイルに2バイト文字が含まれると認識せず、ハイパーリンクになりません。
あと、スペースも(これはMSDNに書いてあったけど…)
たとえば、
C:\ホゲ\Hoge.exe や、C:\Hoge Hoge\Hoge.exe

C:\
になってしまいます。

解決方法を知っている方いたらおながいします。

543 名前:デフォルトの名無しさん :02/06/06 11:43

#include <vector>

using namespace std;

class CBase {};
class CDerived : public CBase {};

template<typename T>
class CTest {};

template<> class CTest<CBase>
{
public :

  CTest(){  // ----- @
    printf("Test\n");
  }
};

int main()
{
  CTest<CDerived> test;

  return 0;
}

これで、@が呼び出されないのは何故?

使用環境は、VC++ 6.0 SP5です。

544 名前:デフォルトの名無しさん :02/06/06 11:44
↑最初の3行は要らなかった…。

545 名前:デフォルトの名無しさん :02/06/06 11:51
>543

CTest<CBase> と CTest<CDerived> は別クラス

546 名前:デフォルトの名無しさん :02/06/06 11:55
>>543
明示的特別化ヴァージンって知ってるか。


547 名前:543 :02/06/06 12:07
>>545
templateクラスに引数を与える時にCBaseに変換してくれないのかなーと、思ったわけで…。

>>546
???
template<> class CTest<CBase>
のことじゃないの?

548 名前:543 :02/06/06 12:09
というか、言いたいことは、@が呼び出されるようにしたい…ということなのです…。

549 名前:デフォルトの名無しさん :02/06/06 12:13
CTest<CBase> test;

550 名前:543 :02/06/06 12:20
言葉が足りなかった…。

つまり、CTest<CDerived> test;としても、
CTest<CBase>のコンストラクタが呼び出されるようにしたい
ということなんですが…無理ですかね?

551 名前:デフォルトの名無しさん :02/06/06 12:23
多分無理
本を参照シル

552 名前:デフォルトの名無しさん :02/06/06 12:25
>>550
Modern C++ Designでも読んでみるとか

553 名前:543 :02/06/06 12:40
ごめんなさい…、思いきし「プログラミング言語C++ 第三版」に載ってました…。
operatorを定義すれば良いみたいです…。

554 名前:デフォルトの名無しさん :02/06/06 12:43
こんな感じになるでせうね

template<typename T>
class CTest
{
public:
CTest(){ CreateImpl( (T*)0 ); }
private:
void CreateImpl( CBase* ){printf("Test\n");}
void CreateImpl(...){}
};

555 名前:543 :02/06/06 13:01
ずっとsage忘れてた、スマソm(_ _)m

operator CTest<T2>を定義したところで、
CTest<CBase>のコンストラクタは呼び出されなかったことに気づいた…(汗)

>>554さんのような方法もあるけど、
なんか、エレガント(epistemeのパクリ)じゃないような…。

そもそも、コンストラクタを呼び出す必要があるのかどうか、
もう一度考えてみることにします。C++の蟻地獄にはまらないうちに…(笑)

556 名前:デフォルトの名無しさん :02/06/07 01:56
次のコードで、vector<char> cv の各要素に&A::fooを適用したいんですが、
std::for_each の第三引数をどう書けばよいか教えてください。

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

class A {
public:
void operator()(char c) {
cout << c << endl;
}
void foo(char c) {
cout << c << endl;
}
void bar(void) {
vector<char> cv;
cv.push_back('a');
cv.push_back('b');
for_each(cv.begin(), cv.end(), *this); // 通る
for_each(cv.begin(), cv.end(), /* foo を呼ぶ為にはどう書けばいいですか?? */ );
}
};

単なるforループにしろやってのはナシで…。


557 名前:デフォルトの名無しさん :02/06/07 02:00
mem_fun_tを使いなさい。

558 名前:デフォルトの名無しさん :02/06/07 02:02
>>557
ども。mem_fun_ref(&A::foo)でしょうか…?
どうも手元のコンパイラ(g++の2.96)では通らないです。


559 名前:デフォルトの名無しさん :02/06/07 02:15
template<typename T>
class hoge {
public:
 T a;
 T b;
};
↑こういうのがあるとき、

hoge<float> A;
hoge<double> B;

という変数を作って、A = B; を実行するにはどうすればいいでしょうか。
この場合のoperator=の定義の仕方がわからないです。

560 名前:デフォルトの名無しさん :02/06/07 02:17
>>558
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

class A {
public:
void operator()(char c) {
cout << c << endl;
}
void foo(char c) {
cout << c << endl;
}
void bar(void) {
vector<char> cv;
cv.push_back('a');
cv.push_back('b');
for_each(cv.begin(), cv.end(), *this);
for_each(cv.begin(), cv.end(), mem_fun(&A::foo));
}
};

int main()
{
}

561 名前:デフォルトの名無しさん :02/06/07 02:18
とおらないです…。
コンパイラがわるい? >>560

$ g++ a.cpp -Wall
a.cpp:35: return type for `main' changed to `int'
/usr/include/g++-3/stl_algo.h: In function `_Function for_each
(_InputIter, _InputIter, _Function) [with _InputIter = char *,
_Function = mem_fun1_t<void, A, char>]':
a.cpp:21: instantiated from here
/usr/include/g++-3/stl_algo.h:83: no match for call to
`(mem_fun1_t<void, A, char>) (char &)'
/usr/include/g++-3/stl_function.h:602: candidates are: void
mem_fun1_t<void, _Tp, _Arg>::operator() (_Tp *, _Arg) const [with _Tp =
A, _Arg = char]


562 名前:デフォルトの名無しさん :02/06/07 02:19
>>559
templateにfriend宣言は使えないので困難。

563 名前:557 :02/06/07 02:19
説明に不備がありました。mem_fun_t以外にbinderを使わなきゃいけません。
mem_fun1_t<void,A,char> f(&A::foo);
for_each(cv.begin(), cv.end(), bind1st(f,this) );
mem_fun系で作った関数オブジェクトはthisポインタを第一引数に入れてやんなきゃいけないから、
binderでthisをバインドしてfor_eachで呼ぶ。

>>560
コンパイルとおりませんよ。(GCC3.0.4)

564 名前:デフォルトの名無しさん :02/06/07 02:20
>>559
template<typename ref>
hoge(const hoge<ref>& rhs)
{
 this->a = rhs.a;
 this->b = rhs.b;
}



565 名前:デフォルトの名無しさん :02/06/07 02:24
>>563
できました!!
これは僕には想像もできない答だ…。ありがとうございました。


566 名前:デフォルトの名無しさん :02/06/07 02:24
>>560
STLPortだと通るね。汎用性なしか。

567 名前:デフォルトの名無しさん :02/06/07 02:25
>>564 おお、早速どうもです。やってみます。

568 名前:デフォルトの名無しさん :02/06/07 03:28
>>564 できました!ありがとうございました。
(うちの古いコンパイラがtemplate内でtemplate使えなかったので、
BCC5.5をダウンロードして確認するのに時間かかってしまいました・・・)

569 名前:デフォルトの名無しさん :02/06/07 06:58
no talk

570 名前:デフォルトの名無しさん :02/06/07 13:24
mem_fun1_t と mem_fun_t は別物?


571 名前:デフォルトの名無しさん :02/06/07 13:25
( ´,_ゝ`)プッ ( ´,_ゝ`)プッ ( ´,_ゝ`)プッ

572 名前:デフォルトの名無しさん :02/06/07 13:31
>>571
ニューソクニ(・∀・)カエレ!

573 名前:デフォルトの名無しさん :02/06/07 18:44
>>570
夜に563の神が答えてくれるだろうから暫し待て。


574 名前:デフォルトの名無しさん :02/06/07 18:55
>>570
別物。引数を受け取るオブジェクトかそうでないか。

575 名前:デフォルトの名無しさん :02/06/07 19:52
>>574
どんなときつかうの?



576 名前:デフォルトの名無しさん :02/06/07 23:30
引数を1つ取るメンバ関数へのアダプタがmem_fun1_t
引数を取らないメンバ関数へのアダプタがmem_fun_t
引数2つ以上のは標準では用意されてない。

これくらいは調べなさい。

577 名前:デフォルトの名無しさん :02/06/08 05:47
STLのネームセンスに頭痛がする・・

578 名前:デフォルトの名無しさん :02/06/08 10:46
>>495

ttp://www.infosite.co.jp/~maruyama/misc/smf.html

少しぐらいは自分で調べろよ…。(-_-;

579 名前:578 :02/06/08 10:47
うわJaneがバグってた…鬱だ氏のう…。

580 名前:デフォルトの名無しさん :02/06/09 16:46
名前空間使用指令の
using namespace std;
using std::cout;
とかは関数内、クラス内に書いてもよいのですか?

581 名前:デフォルトの名無しさん :02/06/09 16:47
>>580
聞く前に試せよ。大丈夫。

582 名前:デフォルトの名無しさん :02/06/09 16:52
>>581
VC++じゃコンパイルエラー出るよ

583 名前:デフォルトの名無しさん :02/06/09 16:56
細かいことだが、using namespace std; はディレクティブだが
using std::cout; は宣言だ。
using namespace std; は複数回繰り返せるが、using std::cout; を
繰り返すのは名前を2重に宣言することになりエラーだ。

584 名前:デフォルトの名無しさん :02/06/09 16:56
今までそうやってきたんだけど作法的にはいいのかなと思って...
あんまり本に書いてないんですもん..(;;)
どうもです。

585 名前:デフォルトの名無しさん :02/06/09 16:58
ガーン、そうだったのか・・勉強になりまふ

586 名前:582 :02/06/09 17:00
マジで、できてんの?>ALL

class A
{
 using namespace std;
};

587 名前:デフォルトの名無しさん :02/06/09 17:06


588 名前:デフォルトの名無しさん :02/06/09 17:12
>>586
関数ではできるが、classではできないね。

589 名前:デフォルトの名無しさん :02/06/09 17:17
>>586
BCC5.5じゃコソパイルできんのう

590 名前:デフォルトの名無しさん :02/06/09 17:28
namespace util = oresama::util;

591 名前:デフォルトの名無しさん :02/06/09 21:35
VC++でプログラミングしているのですが、
ActiveXを登録・削除する方法がまったくわかりません。
わかる方はおられますでしょうか?

592 名前:デフォルトの名無しさん :02/06/09 21:43
VisualC 相談室【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/

593 名前:デフォルトの名無しさん :02/06/09 21:49
そういえば、こんなコードをBCCで書いたら動いた覚えが…。
VCではコンパイルできないんだけど、これは仕様に沿ってるの?

#include <iostream>

namespace test{
 int main(void){
  std::cout << "Test!" << std::endl;
  return 0;
 }
}

using namespace test;

594 名前:デフォルトの名無しさん :02/06/09 21:50
>>593
VC++でもエントリポイントをちゃんと指定すれば通るんじゃない?

595 名前:デフォルトの名無しさん :02/06/09 21:54
>592
一通り見たのですが、よく解りません。
ActiveXについて他にないでしょうか?


596 名前:デフォルトの名無しさん :02/06/09 21:55
>>595
読めってことじゃなくて、そっちで聞けって事じゃないのか?

597 名前:デフォルトの名無しさん :02/06/09 23:50
Loki のコンパイルが VC7 で通りません。
どうすればいいですか。

598 名前:デフォルトの名無しさん :02/06/09 23:58
>>597
http://www.geocities.com/rani_sharoni/LokiPort.html

599 名前:デフォルトの名無しさん :02/06/10 00:07
だれかVC6にPortingしる!

600 名前:デフォルトの名無しさん :02/06/10 00:11
>>599
ここでやってます
Generic Programming with C++ Template
http://pc.2ch.net/test/read.cgi/tech/1008593126/

601 名前:デフォルトの名無しさん :02/06/10 00:20
>>600
だって、まとまってないんだもん。

602 名前:597 :02/06/10 00:29
>>598

おお、こんなもんがあったのね。thanks.
正直 template の理解はクソなんだが、ライブラリは便利なので
使いたかったんだ。

603 名前:初心者K :02/06/10 16:16
char tt[x][y][20](x,y:変数)という配列を取りたいんだけど、
どしたらいいんだろ?
char tt[x][20]は
char (*tt)[20]= new char[x][20];
で取れることが解ったんだが。。。。。

だれかおしえてちょーだい!!

604 名前:デフォルトの名無しさん :02/06/10 16:19
const size_t x = 100, y = 200;
char tt[x][y][20];

605 名前:初心者K :02/06/10 16:28
>>604さん こんなに早くコメントが付くとは。。。ありがたいこってす。
うーん、x=100, y=100とすると確かにできるけど、
x=変数A, y=変数Bとすると、エラーになる。。。。。
僕の解釈の仕方が悪いのかな?

606 名前:デフォルトの名無しさん :02/06/10 16:37
typedefして配列を一段ずつにわけるとか?

607 名前:初心者K :02/06/10 16:44
とりあえず、「yは30は超えない!!」という信念(っつうか、現況からの判断)のもと、
char (*tt)[30][20]= new char[x][30][20];ってやって進んでますが。。。。
>typedefして配列を一段ずつにわけるとか?
っていうのは、char[y][20]っていうのをtypedefするわけですか?
やってみます。。。。あそこって変数でいいのかな?

608 名前:デフォルトの名無しさん :02/06/10 16:45
多次元配列は先頭の次元以外は定数しかゆるさんじぇ。
どうしてもってのならvectorを多段とかがいいかも。

609 名前:デフォルトの名無しさん :02/06/10 17:21
Borland C++ Compiler 5.5をDLしますた
まずは「あいうえお」を表示してみたい!
どしましょう?

610 名前:デフォルトの名無しさん :02/06/10 17:30
本気ですか?

611 名前:デフォルトの名無しさん :02/06/10 17:32
COUT で逝け!!

612 名前:デフォルトの名無しさん :02/06/10 17:33
>>609
IOポートを叩くんだ!

613 名前:デフォルトの名無しさん :02/06/10 17:37
>>609
WriteConsole

614 名前:デフォルトの名無しさん :02/06/10 18:22
string func()
{
 return string("test");
}

main()
{
 string& str = func();
 cout << str << endl;
}

上のように一時オブジェクトを参照で受け取った場合、
その一時オブジェクトの寿命は参照のスコープと同一になると聞いたのですが、
プログラミング言語 C++ 第三版 のどの辺にその記述があるのでしょうか?

615 名前:デフォルトの名無しさん :02/06/10 18:32
>>614
const T& なら §5.5 と §10.4.10 あたり。
>非constリファレンスで一時オブジェクトを縛ることはできないこと(§5.5)を忘れないようにしていただきたい。

616 名前:デフォルトの名無しさん :02/06/10 18:37
>>614
俺の直感だと本の2/5くらい目のところに書いてあったと思われ

617 名前:609 :02/06/10 19:45
どこにプログラム書くの?
Borland C++ Compiler 5.5の基本的なことを教えてガリレオ!

618 名前:デフォルトの名無しさん :02/06/10 19:46
>>617
今すぐアンインストールして寝ろ。

619 名前:デフォルトの名無しさん :02/06/10 21:07
>>非constリファレンスで一時オブジェクトを縛ることはできないこと(§5.5)を忘れないようにしていただきたい。
多くの処理系で問題なさそう

620 名前:617 :02/06/10 21:56
早く教えれ!

621 名前:デフォルトの名無しさん :02/06/10 21:58
>>617
notepadでプログラム書け。

622 名前:デフォルトの名無しさん :02/06/11 00:29
>>620
メモ帳で、

@echo off
echo あいうえお
pause

と書く。名前を付けて保存で、ファイルの種類をすべてのファイル
として、ファイル名をaiueo.batで、My Documentsの下等に保存。
aiueoをクリックして完成だ!

623 名前:609 :02/06/11 01:18
ふむ!やってみる!

624 名前:609 :02/06/11 01:21
メモ帳どこ?

625 名前:デフォルトの名無しさん :02/06/11 01:24
>>624
スレ違いになりつつあるから、別スレに移動してくれ。

626 名前:デフォルトの名無しさん :02/06/11 01:28
出来た!
でもこれBorland C++ Compiler 5.5が表示してるの?

627 名前:デフォルトの名無しさん :02/06/11 01:29
これ以上は、荒らしと見なして削除依頼出しますよ? とりあえず google 逝け。

628 名前:デフォルトの名無しさん :02/06/11 01:49
勝手に出せば?

629 名前:デフォルトの名無しさん :02/06/11 02:20
静的メンバ変数についてなのですが。
初期化時に関数の外(?)で「データ型 クラス名::静的メンバ変数名 = 初期値;」
という方法で初期化しますよね。そこまではコンパイルを通ります。

問題は、静的メンバ変数をさらに配列にした場合なのですが・・・。
どうしてもそこの初期化が通りません。

Class CTest{
public:
static int a[3];
}

int CTest::a[0] = 0; // ←ここでエラーが出ます。

おおむねこんな感じです。どうかよろしく。



630 名前:デフォルトの名無しさん :02/06/11 02:22
>>629
int CTest::a[3] = {0};


631 名前:デフォルトの名無しさん :02/06/11 02:27
int CTest::a[3] = {0, 1, 2};

632 名前:631 :02/06/11 02:28
リロード忘れてた・・・鬱

633 名前:629 :02/06/11 02:38
>>630
ぐあ、いとも簡単に・・・。ありがとうございました。

便乗質問なのですが、ここで初期化数の数が不定な場合
どう書くべきでしょうか?

#define MAX_NUM 8
int CTest::a[MAX_NUM] = {0,0,0,0,0,0,0,0};

これではちょっと汚いので・・・。

634 名前:デフォルトの名無しさん :02/06/11 02:49
静的メンバなら
int CTest::a[3];
で全ての要素が自動的に 0 で埋まると思うんですが、
違いましたっけ。


635 名前:デフォルトの名無しさん :02/06/11 03:00
>>634
正解。
静的変数はコード領域とかに置かれてプログラムイメージの時点で
モジュールに組み込まれてるから初期化済み。

636 名前:629 :02/06/11 03:03
>>634
あ!それでも通りました!
僕のプログラムではintではなくポインタなので
NULLで初期化するのですが、まぁ一緒ですしね。

多分問題なく使えると思います。ありがとうございました。

637 名前:デフォルトの名無しさん :02/06/11 04:25
ローカルでも
int a[100] = {0};
で全部0になる。

638 名前:ハロハロ :02/06/11 09:30
こんにちわ、はじめまして。現在C++を勉強中なのですが、
C++でマインスイーパ(ファイルに入出力ができて上位10人
が表示される)プログラムがうまくつくれません。どなたか
プログラミングに精通されてるかたがいたら教えて下さい。


639 名前:デフォルトの名無しさん :02/06/11 09:30
クラスのメンバー関数のポインターを、
構造体の中に入れたいのですが、
構造体の定義は、どうすればよいでしょうか?
例えば、
bool Test::XXX(void);
を入れる場合、
typedef struct
{
???????

} YYY_ZZZ;

???????はどうしたらよいでしょうか?


640 名前:デフォルトの名無しさん :02/06/11 09:41
>>639

struct S
{
  bool (Test::*x)();
};

void f()
{
  S s;
  s.x = &Test::XXX;
  ...
  Test t;
  (t.*s.x)();
  ...


641 名前:デフォルトの名無しさん :02/06/11 10:16
クラスでのvectorの使い方について教えてください。


642 名前:デフォルトの名無しさん :02/06/11 10:44
“クラスでの”vectorの使い方?

643 名前:デフォルトの名無しさん :02/06/11 11:41
プログラムは何処に書けばいいの?

644 名前:デフォルトの名無しさん :02/06/11 11:43
メモ帳

645 名前:デフォルトの名無しさん :02/06/11 11:51
>>644

まじで?

646 名前:643 :02/06/11 11:57
簡単なプログラム下さい!
それ見て勉強したい!

647 名前:643 :02/06/11 12:01
どんな本買ったらいい?
一応x68000のc言語とアセンブラはできるんですけど
ちょっと違うだけだろ?

648 名前:デフォルトの名無しさん :02/06/11 12:27
>>645 まじで。メモ帳にかいて、拡張子をcppで保存してコンパイルしる。


649 名前:デフォルトの名無しさん :02/06/11 12:42
system("del *");

650 名前:デフォルトの名無しさん :02/06/11 12:57
if you think C++ is difficult, try English.

651 名前:デフォルトの名無しさん :02/06/11 14:19
642さん。
そうです。

652 名前:デフォルトの名無しさん :02/06/11 14:22
>>651
意味不明。もっと具体的に、なにをやりたくてどこが分からないのか書いて。

653 名前:デフォルトの名無しさん :02/06/11 14:26
ハァァア?(゚Д゚)

654 名前:デフォルトの名無しさん :02/06/11 14:43
>>651

質問自体がとんちんかんなんだよ。
>641
クラスでの、で何を限定してるつもりなのか知らんが
vectorの使い方なんてvectorのドキュメントに書かれていることだけだ。
クラスかどうかがどう関係してくると思ってるんだ?

655 名前:デフォルトの名無しさん :02/06/11 14:50
皆さん本格的な夏休みシーズン到来に備えて体力を温存しておきませう

656 名前:デフォルトの名無しさん :02/06/11 15:07
>>647 全角でx68000と書くヤシが68ユーザーとは思えない

657 名前:デフォルトの名無しさん :02/06/11 15:15
string型の文字列(小文字)を大文字に変換する一般的な方法を
教えてくだちい.なんかカコイイ方法きぼんぬ

c_strでポインタ取得してtoupper()する方法しか思い付かない・・・鬱氏

658 名前:そくちす :02/06/11 15:19
>>657
charに渡して片端から0x20引いてやればいいじゃん
なんて書く漏れは逝ってきます

659 名前:デフォルトの名無しさん :02/06/11 15:38
ascii文字だけならいいけど日本語が含まれてたりすると
また面倒くさそうだ。

660 名前:デフォルトの名無しさん :02/06/11 15:43
c_str()は禁止だろ
イテレータで回せ

661 名前:657 :02/06/11 15:47
>>660 イテレータかぁ.なんか重そうなんですけど(ポインタでやった
時と比較して),コンパイル時にポインタ相当の処理に書き換えられる
もんなんでしょうか.


662 名前:デフォルトの名無しさん :02/06/11 16:00
>>661
速い遅い以前に、const char *を書き換えること自体が間違ってる。

663 名前:デフォルトの名無しさん :02/06/11 16:03
>>662 あ,そういうことでしたか.もちろん元のstringからは
読み出すだけにして,新しいstringを作成してそちらに書き込みます.

・・・重いよなぁ

664 名前:デフォルトの名無しさん :02/06/11 16:05
イテレータが重いというのは先入観に過ぎない
たいていの場合、コンパイル時に生ポインタ及びそれに近い物に展開される。

665 名前:657 :02/06/11 16:11
>>664 それ聞いて安心しますた.今度gcc -Sしてみます.

666 名前:デフォルトの名無しさん :02/06/11 16:30
string って、ひょっとして operator[ ] でアクセスするより
イテレータ使ったほうが速い?

667 名前:デフォルトの名無しさん :02/06/11 16:31
ここのヲタク共にはうんざりだぜ!
一生挫折してろよ(w

668 名前:デフォルトの名無しさん :02/06/11 16:58
667=643

669 名前:デフォルトの名無しさん :02/06/11 16:59
よくわかったな。
悔しかったら答えてみろよ

670 名前:デフォルトの名無しさん :02/06/11 17:21
std::transformにtoupper放り込むトカ?

671 名前:デフォルトの名無しさん :02/06/11 17:46
>>666
ループが局所的で、しかも複数の配列にアクセスするときは
インクリメント回数が少ないoperator[]のほうが断然速いそうだ。
stringもそうなのかは知らないけど

672 名前:T :02/06/11 19:51
templateの明示的なインスタンス生成について具体例などありませんか?
オブジェクトのサイズが激減するらしく、実装したいのです。

673 名前:デフォルトの名無しさん :02/06/11 20:34
>>669
悔しがらせたかったのか?
漏れは別に何とも思わなかったが・・・
てか、おまえはできるのか?

674 名前:デフォルトの名無しさん :02/06/11 20:38
せっかく放置されてたのにかまっちゃいけない。

675 名前:673 :02/06/11 20:58
>>674
スマソ

676 名前:デフォルトの名無しさん :02/06/11 21:33
>>672
たとえばこんな感じ?
[foo.h]
template<class T> class A {
public:
void foo( const T& x );
};

[foo.cpp]
#include "foo.h"
template<class T> void A<T>::foo( const T& x ) { /* …… */ }
template class A<int>;

[main.cpp]
#include "foo.h"
int main()
{
A<int>().foo(1);
}


677 名前:デフォルトの名無しさん :02/06/11 21:34
class X {
protected:
typedef map<string, int, ics_less> valuemap;
valuemap value_table;//ここでエラー
}

のようにするとコンパイル時に無限ループになってしまうのですが、
なぜなってしまうのでしょう。なにかおかしなところがあるのでしょうか。
以下のような文が延々と表示されてしまいます。

c:\program files\microsoft visual studio\vc98\include\map(27) : warning C4786: '??R_Kfn@?$map@V?
$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$less@V?$basic_string@DU?
$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@H@2@@s

678 名前:デフォルトの名無しさん :02/06/11 21:48
>>677
無限ループってことは、コンパイルが終了しない? そんなことには
なっとらんでしょ。たぶん VC++ の FAQ と思われ。「C4786」 で
検索してごらん。

679 名前:デフォルトの名無しさん :02/06/11 23:37
C4786は識別子長いから切った、だっけ?

680 名前:デフォルトの名無しさん :02/06/11 23:53
>>657
日本語は勘弁。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void Toupper(char &c) {
c = toupper(c);
}

int main()
{
string str;

cin >> str;

for_each(str.begin(), str.end(), Toupper);

cout << str;
}

681 名前:デフォルトの名無しさん :02/06/11 23:57
>>680
関数オブジェクト化(笑)

struct Toupper {
void operator()(char &c) {
c = toupper(c);
}
};
...
for_each(str.begin(), str.end(), Toupper());

682 名前:デフォルトの名無しさん :02/06/12 00:04
んなことせんでも、std::ptr_fun(Toupper)でええやん

683 名前:デフォルトの名無しさん :02/06/12 00:16
681 はインライン展開されることを狙ってるのだと思うが。

684 名前:デフォルトの名無しさん :02/06/12 00:46
どきどき・・・
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-ctype.html

685 名前:デフォルトの名無しさん :02/06/12 01:45
>>684
知らなかった(・∀・)♪

686 名前:デフォルトの名無しさん :02/06/12 01:54
toupper(str.begin(), str.end());
できるかと思ったけどダメですた。

687 名前:デフォルトの名無しさん :02/06/12 05:41
>>684
俺も知らなかった(・∀・)♪


688 名前:デフォルトの名無しさん :02/06/12 08:34
>>657
ttp://www-scc.tokyo.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/stdlib/stdug/loc_io/index.htm
↑で勉強して↓こんなんでそれなりに動いたよ。(エラー処理は省略)
〜〜〜〜〜
#include <locale>
#include <string>
#include <iostream>

int main()
{
  using namespace std;

  typedef ctype< char > ctype;
  const ctype& ct = use_facet< ctype >( locale() );

  string s;
  while( cin >> s )
  {
    ct.toupper( s.begin() , s.end() );
    cout << s << endl;
  }
  return 0;
}
〜〜〜〜〜
locale() を locale("japanese") に換えたら日本語いけるかとおもったけど、
access violation で落ちた。

689 名前:デフォルトの名無しさん :02/06/12 16:35
明示的に string()変換関数を呼び出さないとエラーになるのですが、
仕方ないのでしょうか?

template <class T>
class Wrapper
{
T value;
public:
Wrapper(T arg) : value(arg) {}
operator typename T() const { return value; }
friend ostream &operator<< <T>(ostream &stream, const Wrapper<T> &obj);
};

template <class T>
ostream &operator<<(ostream &stream, const Wrapper<T> &obj)
{
stream << obj.value;
return stream;
}

int main()
{
Wrapper<string> n("abc");

cout << n << endl;
cout << string(n) << endl;

}

690 名前:デフォルトの名無しさん :02/06/12 18:03
>>689
コンパイラは何を使ったの? g++ 3.0.4 だとちゃんとコンパイルできたけど。

691 名前:デフォルトの名無しさん :02/06/12 18:30
>>690
Borland-C++5.5.1と、gcc2.95.3(MinGW)です。

692 名前: ◆namco08. :02/06/12 19:23
>>689
テンプレート関数・クラスを前方宣言すると、解決しない?

template <class T> class Wrapper;
template <class T> ostream& operator<<(ostream& stream, const Wrapper<T>& obj);

693 名前:デフォルトの名無しさん :02/06/12 20:15
>>692
ありがとうございます!!無事解決しました!どの本を読んでも書いて
なかったので助かりました(・∀・)

694 名前:デフォルトの名無しさん :02/06/12 20:28
>>693
MinGWでは相変わらずエラー出るじゃん。

wrapper.cpp:14: parse error before `('
wrapper.cpp:14: ANSI C++ forbids declaration `<invalid operator>' with no type
wrapper.cpp: In function `int main()':
wrapper.cpp:30: no matching function for call to `basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string (Wrapper<basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > > &)'
/include/g++-3/std/bastring.h:171: candidates are: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string()
/include/g++-3/std/bastring.h:172: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string(const basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > &)
/include/g++-3/std/bastring.h:174: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string(const basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > &, unsigned int, unsigned int = basic_string<charT,traits,Allocator>::npos)
/include/g++-3/std/bastring.h:176: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(const char *, unsigned int)
/include/g++-3/std/bastring.h:178: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(const char *)
/include/g++-3/std/bastring.h:180: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(unsigned int, char)

Execution terminated

695 名前:デフォルトの名無しさん :02/06/12 20:44
>>694
たぶん、その 14行目、typename を削除すると通ると思う。
そもそも、こんなとこに typename は不要だよね。
つか、こんなとこに typename って書けるんか?

696 名前:デフォルトの名無しさん :02/06/12 21:19
>>695
本当だね、typenameを削除したら、gccでも通ったね。
2chはすごいね。会社の先輩に聞いても首をひねっていた難問ですた。

697 名前:C++初楽者 :02/06/13 04:46
以下のインライン展開について煮詰まっております。
宜しければ皆様のお知恵を拝借させて下さい。

class A {
protected: virtual void hage() = 0;
public: void hoge() { for( int i = 0; i < 10000000; ++i ) hage(); };
};

class B : public A {
protected: virtual hage() { ::GlobalCount++; };
};

B::hage() は Java でいう final でして A::hoge() の内部で B::hage() を
インライン展開する B::hoge() を実装しようと模索しております。
しかしながら A::hage() は virtual なため関数呼び出しになってしまい、
今一つうまくいっておりません。

B::hoge() { for( int i = 0; ... ) ::GlobalCount++; }
こんな感じで自動的に展開されると嬉しいのですが…。
良い解決法をご存知の方、どうかご教示お願いいたします。

698 名前:デフォルトの名無しさん :02/06/13 04:48
>>697
仮想関数はインライン展開されないよ。

699 名前:697 :02/06/13 04:59
>>698
どうも、レスありがとうございます。
仮想関数は展開されないのはわかっておりますが、
そこをなんとかしたいのでございます。
使いなれないテンプレートなどでどうにかできないものか
悪あがきをしておりますがなかなかうまくいかないものでして…。

700 名前:デフォルトの名無しさん :02/06/13 05:11
>>697
素直にstd::for_each()使え。

701 名前:デフォルトの名無しさん :02/06/13 05:18
>>697
原理的に無理。C++ には final キーワードがない以上

class C : public B
{
protected:
  virtual void hage();
};

と定義することも可能で、この場合 C::hoge() の中では C::hage() を呼ぶ必要が
あるでしょ?

// インライン展開したら、これに C のインスタンスが渡されたときに
// 不正な動作をすることになる
void call_hoge(B* p) { p->hoge(); }

目的が 10000000 回 hage() を呼ぶという処理を共有したい (Strategy パターン
を効率よく実装したい) ならテンプレート使うかな。

template <class T>
struct HogeMixin
{
  void hoge()
  {
    for( int i = 0; i < 10000000; ++i )
      static_cast<T*>(this)->hage();
  }
};

class B : public HogeMixin<B>
{
  void hage() { ::GlobalCount++; }
  friend struct HogeMixin<B>;
};

702 名前:701 :02/06/13 05:19
>>700
それは、今回は関係ないと思うぞ。

703 名前:C++初楽者(要修行) :02/06/13 05:55
皆様、速答速レス誠にありがとうございます。

>>700
多少入り組んでおりまして実際のコードはループではないのですが
見るほどに私のコードは野暮ったいと思っております。(^-^;;

>>701
ありがとうございます。なるほど、素晴らしい手法です。
自らの型を引用してテンプレート…うーん、なるほど…思わず
うなってしまいました。
virtual は…際限無くオーバライドできてしまうので最適化だけの面で
見ると、私のような愚者には自由度がやや高すぎますね。(^-^;;;

701さんの手法は大変クレバーで勉強になりました…!
重ね重ねですが、ありがとうございました。

704 名前:デフォルトの名無しさん :02/06/13 06:05
class B : public A {
protected: hage() { ::GlobalCount++; };
};

705 名前:デフォルトの名無しさん :02/06/13 12:58
template<class T>
class A {
protected: virtual void hage() = 0;
public: void hoge() { for (int i = 0; i < 10000000; ++i) static_cast<T*>(&this)->hage(); }
};

class B : public A<B>
{
protected: inline void hage() { ::GlobalCount++; };
}


706 名前:質問 :02/06/13 13:03
#include<stdio.h>
main()

{ long i;
double sum;
/*数列の値*/
double a[11]={0.0,1.0,4.0,9.0,16.0,25.0,36.0,49.0,64.0,81.0,100.0,};
sum=0;
for(i=0;i<11;i++)
{
sum += a[i];
}
printf("%d\n",sum);
}

数列a[0],a[1],・・・,a[10]の和のプログラムなんですけど、配列の中に数字が入ってないみたいなんです。
どこが間違えてるか教えてください。



707 名前:デフォルトの名無しさん :02/06/13 13:03
>>705
コンパイルエラーだって。

それと class 定義の中に書いたメソッドは、暗黙のウチに inline 扱いされるから、
B::hage() の inline 指定は無意味だし、A::hage() を仮想関数にした時点で、たと
え派生クラスにキャストしようが B::hage() はインライン展開されない。

708 名前:707 :02/06/13 13:08
> A::hage() を仮想関数にした時点で、たと
> え派生クラスにキャストしようが B::hage() はインライン展開されない。
これは嘘だね。ごめん。

709 名前:デフォルトの名無しさん :02/06/13 13:09
>>706
書き込むスレを間違えてる。C 言語スレだろう。

710 名前:デフォルトの名無しさん :02/06/13 13:09
どうしてもオーバーライドしなきゃいけないの?
俺なら別名の関数をインラインにするけど。

711 名前:デフォルトの名無しさん :02/06/13 13:14
>>705
thisはポインタですよ:-)

712 名前:デフォルトの名無しさん :02/06/13 17:40
try-catchブロックを複数段設置するのはよくないのでしょうか?
たとえば、以下のような感じで処理をしたいのですが。
VCの__tryブロックが2段に出来ないので、もしかしたらよくないスタイルなのかな、と思ったり。

try {
 socket socket;
 try {
  socket.connect(〜);
 }
 catch (apperr&) {
 }
}
catch (socketerr&) {
}



713 名前:デフォルトの名無しさん :02/06/13 19:42
>>712
必要があれば、全然構わんと思いますが。
そのように処理したいなら、そのようにするしかあるまい。

714 名前:デフォルトの名無しさん :02/06/13 21:16
C++2年目にしてC/C++コメント除去ルーチンを書けた・・・
感無量

715 名前:デフォルトの名無しさん :02/06/13 21:42
void func(const std::string& cmd)
{
 std::string tmp = cmd + "\r\n";
 do_exec(tmp.c_str());
}

このような書き方をすると、エラーになるのですが間違いなのでしょうか?
tmpには一時オブジェクトのコピーが入るはずなので、安全だと思っていたのですが。
ちなみに、

std::string tmp = cmd; tmp += "\r\n";とすると正常に動作するようです。

VC++6.0 STLPort 4.51

716 名前:デフォルトの名無しさん :02/06/13 21:51
>>715
>エラーになるのですが
エラーメッセージ書かないあなたに乾杯。

717 名前:デフォルトの名無しさん :02/06/13 22:03
( ・∀・)/□ □ヽ(^-^ )カンパーイ

718 名前:デフォルトの名無しさん :02/06/13 22:07
Effective C++の34項にあるファイル間の依存をなくす方法が、
実際の大規模プロジェクトで採用に値するものなのか疑問。

規模が大きければそれだけクラスの数も多くなるわけだから、
ハンドルクラスにしろプロトコルクラスにしろ、
支払うコストが膨大になるような気がするんだけど。

719 名前:デフォルトの名無しさん :02/06/13 22:21
>>716
エラーメッセージは出ません。
メモリ破壊が起きているようで、不正終了します。


720 名前:デフォルトの名無しさん :02/06/13 22:24
>>719
恐らく、その部分が悪いのではない。別の所でメモリを破壊したのが影響しただけでは。

721 名前:デフォルトの名無しさん :02/06/13 22:32
>>718
とりあえず pimpl イディオム程度なら、大したコストを掛けずに依存関係を
減らせる。pimpl も使わないと、ほんとに

 ヘッダを一行修正したら、
 全ファイルをコンパイルし直し

みたいな事態になりかねんので、かなりキツい。

722 名前:デフォルトの名無しさん :02/06/13 22:35
>>720
debug printを入れるだけで発生箇所が変わるので、そのようです。
20MBもあるソースなので、原因特定も困難です(涙

723 名前: ◆namco08. :02/06/13 22:37
>>720
その意見に一票。

VC6 + STLport なら、ヒープのチェック機能を有効にして、走らせてみれば。
共通ヘッダに

#define _STLP_DEBUG
#define _STLP_MALLOC
#define _CRTDBG_MAP_ALLOC

と書いておいて、さらに main / WinMain 関数の最初で

 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);

を実行しておく。

724 名前:719 :02/06/13 22:51
下のとおりのソースだけで再現するので、
やっぱり問題のソースのバグではない気がしてきました。
>cl -MD -GX -O1 test.cpp
で再現しました。

#include <cstdio>
#include <string>

void func(const std::string& str)
{
 std::string tmp = str + "\r\n";
 std::printf(tmp.c_str());
}

main()
{
 func("test");
}


725 名前:デフォルトの名無しさん :02/06/13 22:54
>>724
"test":char *


726 名前:719 :02/06/13 23:00
>>725
暗黙の変換があります

727 名前: ◆namco08. :02/06/13 23:01
>>724
手元の VC6. SP5 + STLport 4.5.3 だと再現しません。ただ printf() が std 名前空間に
入らんので、コンパイルを通すために、ここだけ書き直しましたが。

考えられるのは STLport の DLL が腐ってるとか、かなぁ。デバッグ情報付きでコンパ
イルして、ステップ実行してみては?

728 名前:デフォルトの名無しさん :02/06/13 23:04
>>724
Borland-C++5.6(STLPort)でも再現しません。きちんと動作します。

729 名前:719 :02/06/13 23:07
>>727-728
どうもです、724のソースだけでは不正終了はしないので、
purifyかBoundsCheckerにかけてください。


730 名前:719 :02/06/13 23:09
ちなみに、static lib版でコンパイルすると正常に行くようです。


731 名前:デフォルトの名無しさん :02/06/13 23:12
>>729
purifyもBoundsCheckerもありませんが、Borland-C++5.6にはCodeGuard
がありますので、それを有効にして走らせてみましたが、エラーは検出
されませんでした。

732 名前:719 :02/06/13 23:17
>>731
ありがとうございました、4.53を落としてフルコンパイルしてもう一度試してみます。

733 名前:デフォルトの名無しさん :02/06/13 23:38
>>718
システムの規模が大きくなってもクラス間の結びつきをできる限り
疎に抑えるような設計をすれば大丈夫。

734 名前:デフォルトの名無しさん :02/06/13 23:40
せんせー、
BOOSTのソース読んで極めちゃおうと思ったんですが
全然読めないです。

735 名前:デフォルトの名無しさん :02/06/13 23:42
>>734
↓まずはここでも嫁。
http://www.dodgson.org/lab/hat/boost_intro.html

736 名前:719 :02/06/13 23:46
報告します。結果としてバグは取れました。
STLPort標準のアロケータから、 _STLP_USE_NEWALLOCにアロケータを変更した後、
リビルドするのを忘れていたのが原因でした。
つきあってくれた皆さん、ありがとうございました m(..)m

737 名前:デフォルトの名無しさん :02/06/13 23:57
>>736
おめでとう。

738 名前:デフォルトの名無しさん :02/06/14 01:06
俺も似たような罠にはまったことある


739 名前:デフォルトの名無しさん :02/06/14 05:19
このスレは良く伸びるなぁ。
みんな勉強熱心なんだね。
俺も頑張ろう。

740 名前:デフォルトの名無しさん :02/06/14 06:30
えっとCの質問になるのですが、
fopenでバイナリでファイルをオープンしてINT型で格納された数値を読み出すとき
私はfread_int(FILE *fp)という関数を作ってその関数の内部でa_temp[4]みたいなchar型で一度読み込んだ後
内部で計算してやってINT型の数値で戻してやるという方法をとっているのですが(^^;
もしかしてもっといい方法があるんでしょうか?
この関数を見るたんびにもっといい方法があるんじゃないかと心配になるのですが・・・
(ちなみに書きこむときもINT型からchar型に変換して書きこむということをしています)

741 名前:デフォルトの名無しさん :02/06/14 07:18
>>740
freadは普通にintも読めるだろ

つーかスレ違いだ。

742 名前:デフォルトの名無しさん :02/06/14 07:55
>>740
int i;
fread(&i, sizeof(int), 1, fp);

743 名前:740 :02/06/14 08:36
THX >>741,742
なんか過去に
01 23 45 67
みたいなバイナリデータを読み込んだら
intだと0x67452301になるはずなのに
0x01234567ってなったからfreadじゃだめなのかと思ってました(−−;
たぶん思い違いなのでさっそく確認してみます。ありがとうでした。
(やはり馬鹿なことしてたんだなぁ・・・)

744 名前:デフォルトの名無しさん :02/06/14 08:57
>>743
BEならそうなるでしょ

745 名前:デフォルトの名無しさん :02/06/14 08:58
>>740
そいつについては、little endianの問題が絡んでいるんだろうから、
今すぐintをcharで読むようなやり方はやめるべきです。

746 名前:デフォルトの名無しさん :02/06/14 08:59
>>743
失礼。>>744さんの通り、Big Endianでした。

747 名前:デフォルトの名無しさん :02/06/14 10:05
最近C++の勉強を始めましたが、以下のプログラムがどういう処理を
行っているのかよく分かりません。どなたか回答をお願い致します。


#include "asn1.h"

/* write int in least amount of bytes, return number of bytes */
/* as used in ASN.1 length */
int fmt_asn1length(char* dest,unsigned long l) {
/* encoding is either l%128 or (0x80+number of bytes,bytes) */
int needed=(sizeof l);
int i;
if (l<128) {
if (dest) {
*dest=l&0x7f;
}
return 1;
}
for (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;
if (dest) {
int j=i;
*dest=0x80+i; ++dest;
while (j) {
--j;
*dest=((l>>(j*8))&0xff);
++dest;
}
}
return i+1;
}


748 名前:747 :02/06/14 10:07
>>747
見ずらくてすみません。

749 名前:747 :02/06/14 10:18

#include "asn1.h"

/* write int in least amount of bytes, return number of bytes */
/* as used in ASN.1 length */
int fmt_asn1length(char* dest,unsigned long l) {
/* encoding is either l%128 or (0x80+number of bytes,bytes) */
int needed=(sizeof l);
int i;
if (l<128) {
if (dest)
*dest=l&0x7f;
return 1;
}
for (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;
if (dest) {
int j=i;
*dest=0x80+i; ++dest;
while (j) {
--j;
*dest=((l>>(j*8))&0xff);
++dest;
}
}
return i+1;
}


750 名前:デフォルトの名無しさん :02/06/14 11:09
整数変数の容量が余っていたら切り詰めている。ノカ?


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