スレを勃てるまでもな ..
[2ch|▼Menu]
749:デフォルトの名無しさん
07/11/15 03:23:46
A.cpp
CSample *Sample = 〜〜〜


B.cpp
Sample->Loop();

という風にしたいんですが
どうにかしてB.cppでSampleオブジェクトを使う方法はありませんか

750:デフォルトの名無しさん
07/11/15 04:30:17
>>749
グローバル変数


751:デフォルトの名無しさん
07/11/15 04:45:48
windowsでC言語の開発環境を整えようと思いbcpadをダウンロードしようとしたのですが、
ベクターでダウンロードできなくなっており、自身で探してみたのですが、ダウンロードできるサイトが見つかりません。
ご存知の方がいらっしゃいましたら教えてください。

752:デフォルトの名無しさん
07/11/15 10:28:55
>>751
シェアウェアにするとかなんとか書いてるから
フリーのVC++2005expとSDKでやれば?
ANSIIの関数で複数の関数が
警告で「安全性がなんたらかんたら・・・」って警告
でるけど、別に関数の使い方間違ってなかったら
問題無いし、C言語の開発環境としては
VC++2005で十分気軽に使えるでしょ

753:デフォルトの名無しさん
07/11/15 21:04:22
配列の要素数をsizeof演算子で得ることができるということは理解できるのですが
配列のポインタから、そのポインタが指す配列の要素数を得ることはできるのでしょうか?

754:デフォルトの名無しさん
07/11/15 21:22:21
>>753
できない。

755:753
07/11/16 02:27:16
ありがとうござました

756:デフォルトの名無しさん
07/11/16 19:26:34
WikibookのMore C++ Idiomsって更新されてるの?
10項目ぐらい聞いたことも無い名称が出ててとても気になるんだけど・・・

757:デフォルトの名無しさん
07/11/16 19:29:58
更新履歴みればいいじゃない

758:デフォルトの名無しさん
07/11/17 19:50:02
コンストラクタなんですが

クラス名::クラス名() : クラス変数名(値){
// 以下コード
}

みたいな宣言をされているのですが、「:」以降の文法の意味が分からないのですが・・・。
クラス変数の型は、インクルードしている他のクラスです。

759:デフォルトの名無しさん
07/11/17 19:52:17
初期化してるだけ
class A{
 int a;
 A();
};
A::A(): a(1) {
}
の場合、Aのメンバ変数aは1で初期化される

760:デフォルトの名無しさん
07/11/17 20:02:35
なるほどです。
手持ちの本では載っていなかったので。
ありがとうございます。


761:デフォルトの名無しさん
07/11/18 00:07:18
その本が入門書であるなら窓から投げ捨てたほうがいい。

762:デフォルトの名無しさん
07/11/18 03:02:02
未だにこんなコード載せてる本がたまにあるから困る
間違いだからなこれ
A::A(){
 a=1;
}

763:デフォルトの名無しさん
07/11/18 07:34:46
int a=1 ;
ってのも間違いで、
int a(1) ;
にしろってか?

764:デフォルトの名無しさん
07/11/18 07:40:24
どこが?

765:デフォルトの名無しさん
07/11/18 07:54:07
>>762
間違いってほどでもないな。効率が悪いってだけで。

効率の悪さよりも保守性のために、
あえて初期化リストを使わないという選択もあるよ。

多数のコンストラクタがある場合、
同じ初期化リストをコピペすることになる。

コンストラクタ内で代入するのであれば、
共通した代入をprivateなメンバ関数にできる。

766:デフォルトの名無しさん
07/11/18 08:00:24
>>765
それはクラス設計が悪い

同じように初期化するメンバで1つクラスにして、それを継承すべし

767:デフォルトの名無しさん
07/11/18 08:53:40
>>763
その2つは同値な表記
A::A():a(1){}とA::A(){a=1}は意味が違う
まあint型くらいなら大して変わらんけどさ

768:デフォルトの名無しさん
07/11/18 10:02:10
>>766
アンチパターン

769:デフォルトの名無しさん
07/11/18 11:01:06
>>766
継承はやりすぎ
包含で十分

770:デフォルトの名無しさん
07/11/18 11:02:24
>>767
意味が違うのなら、どちらが正しいかなんて言えないよな

771:デフォルトの名無しさん
07/11/18 11:04:58
クラスだとコンストラクタとコピー代入演算子が違う意味を持っているから初期化子に馴れておいた方がいい。
さらにstatic/constが絡んでくると初期化子の方が合理的だと思えるようになるよ。

772:デフォルトの名無しさん
07/11/18 11:14:04
説明がド下手

773:デフォルトの名無しさん
07/11/18 11:52:42
C++での質問です

EA001 80
EA002 60
EA003 100
EA004 0
EA005 50

みたいな感じに学籍番号と整数値が与えられているテキストファイルを読み込んで、
整数値をソートして行ごとに並べ替えるプログラムを作りたいのですが
どのようにテキストファイルを読み込めばいいのか教えてください。

774:デフォルトの名無しさん
07/11/18 11:56:49
#include <fstream>

std::fstream f("ファイルのパス.txtxtxtxt", std::ios::in | std::ios::binary);

void *buff new char[適当な数];

f.read((char*)buff, 読み込むサイズ);

775:デフォルトの名無しさん
07/11/18 11:59:31
>>774
バイナリで読み込む必要ない
あとソートはSTLのmapとかsetだと読み込めばソート完了する

776:デフォルトの名無しさん
07/11/18 15:32:20
Visual C++ 2005 Express Edition で、PCのイベントログをとってくるには
どうしたらいいんですか?

777:デフォルトの名無しさん
07/11/18 15:59:26
>>776
Win32API質問スレへどうぞ。

778:デフォルトの名無しさん
07/11/18 16:01:51
>>776
Win32APIのReadEventLogを使う。

WMIあたりにもっと便利なのがあると思うが、
その質問の仕方を見ていると使いこなせるか疑問。

779:デフォルトの名無しさん
07/11/18 19:28:29
>>777-778
すみません。ありがとうございます。
おっしゃる通り、C言語すら知らないド素人です。
Win32APIとやら・・・Cの基礎を知ってないと駄目なほどのものを使わないと
できませんか・・・Windowsのイベントログだから考えてみればそうですよね・・
ありがとうございました。

780:デフォルトの名無しさん
07/11/18 22:11:53
Cの基礎を知らないでVisual C++でまともなプログラムを作るのはそもそも無理だろWin32APIがどうこういう前に

781:デフォルトの名無しさん
07/11/19 11:13:10
>>779
とやらって…。Win32APIは別にCの基礎じゃない。

782:デフォルトの名無しさん
07/11/19 23:49:41
>>781
日本語読めない人ですか?
779は Win32API = Cの基礎を知ってないと駄目なほどのもの って言ってるんであって
Win32API = Cの基礎 だなんて一言も言ってないだろ。

783:デフォルトの名無しさん
07/11/20 00:15:24
そんな必死にならなくてもいいのに

784:デフォルトの名無しさん
07/11/20 00:17:31
と言う事にしたいのですね:-)

785:デフォルトの名無しさん
07/11/20 01:44:13
いいえ、事実です。

786:デフォルトの名無しさん
07/11/20 02:25:22
1,2、たくさんとしか数えられないから、三行以上の書き込みが必死に見えるらしい。

787:デフォルトの名無しさん
07/11/20 12:34:12
>>782
Win32APIがCの基礎を知ってないと駄目なほどのもの?
笑わせてくれるぜ。

788:デフォルトの名無しさん
07/11/20 13:19:02
Win32APIがCの基礎を知ってないと駄目なほどのものって言ってるのは782じゃなくて779だろ。
782は781の読み違いを指摘してるだけ(煽ってるともいう)なのに、なんで782に絡むんだよw

789:デフォルトの名無しさん
07/11/20 13:23:47
そんなことよりみんなで乱交パーティしようぜ

790:デフォルトの名無しさん
07/11/20 13:29:54
そんなどうでもい話で盛り上がってんなよ

791:デフォルトの名無しさん
07/11/20 13:42:43
新しいネタもないし別にいいんじゃね?
どうしても話題変えたかったらなんか質問でもしなよ

792:デフォルトの名無しさん
07/11/20 15:18:08
C++で、stringに入力した文字列をint型に変換する方法が分かりません。
atoi()を使うとエラーが出てしまいます。

793:デフォルトの名無しさん
07/11/20 15:19:08
string s="123456";

cout << atoi(s.c_str());

794:デフォルトの名無しさん
07/11/20 15:29:00
string s="123456";
int i;
istringstream(s) >> i;

795:デフォルトの名無しさん
07/11/20 15:39:01
代入演算子で、整数変数に浮動小数点をかけ算するとき、ワーニング出ないようにするにはどうすればいいの。
int value=10;
value *= 0.5;


796:デフォルトの名無しさん
07/11/20 15:45:22
整数演算に直す。
value /= 2;

797:デフォルトの名無しさん
07/11/20 16:15:33
WindowsAPI使えば、スタンバイとか自分の好きな風にカスタマイズできますか?

PCのスタンバイ設定が気に入らないので。

798:デフォルトの名無しさん
07/11/20 16:16:42
レジストリだろう

799:デフォルトの名無しさん
07/11/21 08:51:30
double型・float型っていくらの整数まで厳密に保持できると保証されてるんでしょうか?
(桁が上がっていくと1の位を保持できなくなるわけですよね)
具体的にはunsigned intの最大値までそれぞれ保証しているのか知りたいのです。

800:デフォルトの名無しさん
07/11/21 09:29:21
>>799
それぞれの仮数部のビット数を調べればいい。
結論から言えば、一般的にdoubleは53bit、floatは24bitとなる。
従って、一般的な4バイト整数と較べた場合、floatは精度が足りないと言うことになる。

801:デフォルトの名無しさん
07/11/21 12:50:50
>>800
なるほど、納得です!
ありがとうございました。

802:デフォルトの名無しさん
07/11/21 22:31:20
保障はされてなかった気がする

803:デフォルトの名無しさん
07/11/22 01:15:33
質問です。
今自分はCからFORTRANにする事をしていて、
wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/

drawrest(xps+50,50,200,200,yellow)

line(xp,250,xp,yp,white,0,0)
といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
これをFORTRANで表現するにはどうしたらいいのでしょうか?


804:デフォルトの名無しさん
07/11/22 01:24:43
>>803
我々はエスパーじゃない。

805:デフォルトの名無しさん
07/11/22 01:27:41
>>803
お前みたいなのを雇うなんて会社の程度が知れてるな

806:デフォルトの名無しさん
07/11/22 01:39:29
>>803
>といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
>これをFORTRANで表現するにはどうしたらいいのでしょうか?
それを調べるのがあんたの仕事だ。
調べずとも明らかなことだけなら猫にでもやらせればすむことだからな。

807:デフォルトの名無しさん
07/11/22 01:44:40
すみません超初心者なんですが質問いいでしょうか

1、ネットで見つけたあるサンプルをVisual C++ 2005 Express Editionというソフトで開くと
「古いバージョンのソフトで作ってあるから新しいソフトに書き直す」
というような内容のメッセージがでたのでOK、開けました

2、ビルドして実行しようとすると
”ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?”
というメッセージが出たのでOK

3、”プログラム’・・・.exe’を開始できません。指定したファイルが見つかりません。’
というメッセージが出てきて実行できません。

これってVisualC++2005だとこのソースはビルドできなくて結局使えないってことですか?
ゲームを作ろうとしたのにいきなり詰まってて困ってます。

808:デフォルトの名無しさん
07/11/22 01:47:35
>>807
2.の時点で間違っている。
ビルドエラーが発生してるのに実行しようとしているため。
ちゃんとビルドできるようにして来い。
わかんなかったらソースとエラー書いてくれ。
もしくは、そのサンプルがあるURLを書いてくれ。

809:デフォルトの名無しさん
07/11/22 02:02:47
CUIでのゲームプログラムを作ろうと思ってるんですが、
保存したデータ内容の編集はCの標準ライブラリのみで出来るのでしょうか。
追記は出来ても一部分のみ書き換えや削除等の方法が分からなくて。

810:809
07/11/22 02:04:00
説明不足でした。
ファイル処理の話です。

811:デフォルトの名無しさん
07/11/22 02:06:36
C以外でやった方が楽だし早いんじゃね?

812:デフォルトの名無しさん
07/11/22 02:08:50
>>809
ファイルの途中への挿入や削除は標準関数ではできない。
サイズが変わらないなら、方法はある。

813:デフォルトの名無しさん
07/11/22 02:09:58
>>811
仰るとおりですが、まだ授業でCの勉強しかしてなくて。
javaも独学で勉強してるもののいまいちピンと来ないんですよ…。

814:デフォルトの名無しさん
07/11/22 02:12:26
>>812
書き換えや削除するとサイズが変わってしまうのでは?

もし宜しければ参考のためにご教示願えますか。

815:デフォルトの名無しさん
07/11/22 02:12:50
テキスト操作したいならPerlとかPHPでいいんでない?
CとかJavaよりよっぽど楽に扱えるし、新しく勉強するに
してももそれほど時間かからないと思うよ

816:デフォルトの名無しさん
07/11/22 02:18:22
ファイルがそこまで大きくないなら起動時に一気にすべて読み込み、終了時に新規に出力しなおすとかじゃだめ?

817:デフォルトの名無しさん
07/11/22 02:18:59
// >>814
// for Example.
#include <stdio.h>
int main()
{
FILE * fp = fopen("foo", "w");
fprintf(fp, "a\nb\nc\n");
fclose(fp);

fp = fopen("foo", "r+");
fscanf(fp, "%*s");
fprintf(fp, "B\n");
fclose(fp);
return 0;
}

818:デフォルトの名無しさん
07/11/22 02:29:42
>>815
暇潰しにする程度なので、新たに勉強する気力がなくて…。
基本的に学校のPCでしてるので環境がないのもあるんですが。

>>816
その方法が一番確実そうですね。
内容はユーザ情報とスコアランキングくらいなので。

>>817
無知で申し訳ないんですが、%*sってどういう意味でしょうか。
*はワイルドカードって事ですか?
あと試しにコンパイル実行してみましたが特に変化が分からなかったです…。

819:デフォルトの名無しさん
07/11/22 05:37:26
>>803
> wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/

wgtinit関数に引数w, s1, inival, flagを渡して呼び出す、という意味。
セミコロンがあるはずだが、写し忘れか?
こういうのはキーボードでタイプし直したりせず、コピペしような。

> drawrest(xps+50,50,200,200,yellow)
> line(xp,250,xp,yp,white,0,0)

この2つも同様に、drawrestやlineという名前の関数を呼び出している。

820:デフォルトの名無しさん
07/11/22 05:38:12
>>807
ダイアログに表示されたメッセージの内容を理解せずにYesやOkを押すような人は、
プログラムを書くのに向いてない。やめたほうがいい。

821:デフォルトの名無しさん
07/11/22 05:40:51
>>818
気力がなかったら、暇潰しで頭を使うようなことをせず、酒でも飲んで寝てたらどうよ。

> 無知で申し訳ないんですが、%*sってどういう意味でしょうか。

読み飛ばす・・・だったような。
こういうのは覚えておくものではなく、都度scanfのリファレンスで確認刷るものだよ。

822:デフォルトの名無しさん
07/11/22 07:14:43
>>818
知らないことは調べるだけの話。
それをする気がないのは「無知」ではなく「無気力」。
刻苦を厭う怠惰は人を虎に変えてしまうのだよ。

823:デフォルトの名無しさん
07/11/22 07:51:59
怠惰には、
無気力な怠惰 = メンドクサイから、何もやらない
と、
前向きな怠惰 = メンドクサイことをしなくても良いように努力・工夫する
がある。


824:デフォルトの名無しさん
07/11/22 19:50:07
本当に怠惰な人間ならこんな便所の落書きに長文書いていつ来るとも知れぬ無責任な名無しの回答を待つ前に
さっさとグーグル先生でも聞いて済ますと思う

825:デフォルトの名無しさん
07/11/22 21:19:04
*は代入抑止文字ですか。
変数に格納されないって事ですね。

ご迷惑おかけしました。

826:807
07/11/22 21:43:11
すみません。実行できました
VBではよくプログラムをしてるんですがCの勝手がわからなくって。
まだよく分からないのですが、
SDKとかDXライブラリとかの設定をしてなかったから見たいです
出力に
DxLib.exe': 'なんとかかんとか' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
等など沢山でているのは大丈夫でしょうか?

827:デフォルトの名無しさん
07/11/22 21:51:04
>>826
「何が」大丈夫なのか否かを知りたいの?

828:デフォルトの名無しさん
07/11/22 22:38:53
>>827
すみません
プログラムが変な動作をしたりしないのか、とか
バグじゃないのか、とか

プログラムに問題があるというメッセージなのか、それとも
これらのメッセージが出ているのは普通で問題はないのか
そういう意味です
なんだかVBと全然違うんですね

829:デフォルトの名無しさん
07/11/22 22:44:39
>>828
> プログラムが変な動作をしたりしないのか

基本的には、しない

> バグじゃないのか

基本的には、バグではない

> プログラムに問題があるというメッセージなのか

基本的には、違う

> これらのメッセージが出ているのは普通で問題はないのか

基本的には、普通で問題ない

デバッグのための情報がないので、シンボルデバッグできないぞ、というメッセージ。

830:デフォルトの名無しさん
07/11/22 22:45:37
自分が作ったクラスを入れるlistをsortするため、operator<を定義してるんですが詰まっています。

class Data{
  int x;
  int y;
public:
  Data(int a = 0, int b = 0){ x = a, y = b };
  int getx(){ return x; };
  bool operator<(const Data&);
};

bool Data::operator<(const Data& obj){
  return x < obj.getx();
}

const Dataのobjからgetx()を呼び出しているせいか(?)、以下のコンパイルエラーが出ます。
passing `const Data' as `this' argument of `int Data::getx()' discards qualifiers
getx()はxを変更しないのに、objをconstにしたらダメなのでしょうか?

831:デフォルトの名無しさん
07/11/22 22:55:52
>>830
int getx() const { return x;}

832:デフォルトの名無しさん
07/11/22 23:04:43
>>831
ありがとうございます。
const int getx()は試したんですけどねぇ。
この辺ややこしくなってるので勉強し直します。

833:デフォルトの名無しさん
07/11/22 23:58:10
>>829
本当に親切に答えてくださってどうもありがとうございます。
凄く助かったし安心しました。
これからもっと精進して頑張ってゲームを作ります。

834:デフォルトの名無しさん
07/11/23 05:31:13
8bit以外のchar型の処理環境ってどんなのがあるの?

835:デフォルトの名無しさん
07/11/23 15:12:38
#include <iostream>
using namespace std;

class Base
{
public:
static int m_iVal;
void SetValue(int val) { m_iVal = val; }
void Show() { cout << "m_iVal: " << m_iVal << endl; }
};
class Hoge1 : public Base{ };
class Hoge2 : public Base{ };

int Base::m_iVal = 0;

void main()
{
Hoge1 hoge1;
Hoge2 hoge2;

hoge1.SetValue( 100 );
hoge2.Show();
}

このプログラムで hoge2.m_iVal = 100 となるんですが よかったでしょうかね?
確認のためですけど


836:デフォルトの名無しさん
07/11/23 15:48:08
>>834
Wikipedia項目リンク

837:デフォルトの名無しさん
07/11/23 15:48:32
良い。

838:デフォルトの名無しさん
07/11/23 15:55:53
charは少なくとも8ビットじゃなかったか?

あーsizeofが1になることが定義されてるだけだっけか

839:デフォルトの名無しさん
07/11/23 15:58:11
RISCだと、longからcharまで全部32bitってのがあるんじゃね?

840:デフォルトの名無しさん
07/11/23 16:15:40
確かに規格上 char ≦ short ≦ int ≦ long だから全部同じサイズでも許されるな

841:デフォルトの名無しさん
07/11/23 17:00:18
>>838
char は1バイト、1バイトが何ビットかって? そんなこと、好きに決めて良いよ

842:デフォルトの名無しさん
07/11/23 17:09:35
>>838
少なくとも8ビットだよ。

843:デフォルトの名無しさん
07/11/23 17:31:57
初心者ですが、質問です。

#include <stdio.h>

int main (void)
{
int i = 1000, j = 40, k = 3000;
printf ("iが%dで、\njが%dで、\nkが%dです。\n",i,j,k);
return 0;
}

こう書いた場合はエラーにならないのに、こうする↓と、
printf ("iが%dで、\n
jが%dで、\n
kが%dです。\n",i,j,k);

構文エラー : ')' が、識別子 'jが' の前に必要です。
と言われて、コンパイルでエラーになってしまいます。
C言語では、;を文末をみなすため、どこに改行を入れてもいいと聞いていたのですが、
入れる位置が決まっているのでしょうか?環境は Visual C++ 2005 Express Edition です。

844:デフォルトの名無しさん
07/11/23 17:38:55
printf ("iが%dで、\n"
"jが%dで、\n"
"kが%dです。\n",i,j,k);

845:デフォルトの名無しさん
07/11/23 17:45:07
>>844
実行されました!
printfの""の中だと改行するには一度"で終わらせてあげないといけないんですね。
ありがとうございました。

846:デフォルトの名無しさん
07/11/23 18:08:01
>>845
printfに限らず、文字列は1行ごとに""で終ってないといけない。

847:デフォルトの名無しさん
07/11/23 18:14:05
プログラムの初心者ですがSQLを書いていますが、C言語と似てると
思いますので、わかる範囲で答えて頂けると助かります

以下のようなプログラムを書いたのですが、パソコンに複数のメールが
送られてきます。 メール送ったら終了のように直したいのですが、
どのようにしたら良いでしょうか


if ((fasterLWMAnow > slowerLWMAnow) && (fasterLWMAprevious < slowerLWMAprevious) && (fasterLWMAafter > slowerLWMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
Alert(Symbol(), " hit ");
SendMail("Mail Alert", Symbol()+" hitdesu ");


848:デフォルトの名無しさん
07/11/23 18:22:20
>>847
―これは、新しい釣りですね…。

849:デフォルトの名無しさん
07/11/23 18:26:58
>>847
100どんだけぇを軽く超えてるよ

850:デフォルトの名無しさん
07/11/23 18:32:18
すいません。まじめに質問したつもりですが、何がいけなかったでしょうか?

851:デフォルトの名無しさん
07/11/23 19:05:38
>>846
分かりやすく教えていただき、ありがとうございました!

852:デフォルトの名無しさん
07/11/23 19:18:01
>>847
そうなっていたんですか!
疑問が解決してすっきりしました、ありがとうございます!!

853:デフォルトの名無しさん
07/11/23 20:01:54
C++ってCと比べてどれだけ遅いのですか?

854:デフォルトの名無しさん
07/11/23 20:05:15
午後のこーだの作者曰く話しにならんぐらいとのこと

855:デフォルトの名無しさん
07/11/23 20:11:12
そりゃ
午後は
アセンブラァばりばり

856:デフォルトの名無しさん
07/11/23 20:40:08
ただし、一般的には機能を使おうとすればそれに応じてオーバーヘッドがかかるようになる。
Cと全く同じコードを書けば、Cと全く同じ速度にはなる。

まずはアセンブリ出力を見比べてみたり、実測することから始めようか。

857:デフォルトの名無しさん
07/11/23 22:02:16
>>853
昔は、コンパイラが生成するコードがC++の場合は遅く、
同じことをするにしてもCで書いたほうが速かったのだろう。

C++で書いたコードを、手作業でCに変換しても、
速度的には大して変化しないと思うよ。

すべてのクラスにvtableを持たせるようなことをしなければ、ね。

858:デフォルトの名無しさん
07/11/23 22:09:20
Cの範囲で書いていたら、C++としてコンパイルしても、生成されるコードは同じだよ。昔から。

859:デフォルトの名無しさん
07/11/23 22:28:17
一歩C++の領域に踏み入ると劇的に変わるけどね
デストラクタ一つで激変

860:デフォルトの名無しさん
07/11/23 22:30:12
C++ は参照とかインライン関数とかテンプレートとか駆使したら、
C と同じ速度でより安全なプログラムが書けると思う。

861:デフォルトの名無しさん
07/11/23 22:32:01
std::sortは比較操作がインライン展開できるから、
qsortよりも速くなりやすいなんてのは有名だよね。

862:デフォルトの名無しさん
07/11/23 22:35:56
そうそう。
まあ、qsort をマクロ化すれば C でも速いの書けるんだろうけど。

863:デフォルトの名無しさん
07/11/23 22:36:29
C++は例外に備えないといけないので
Cと同じコードを吐ける場面は少ない

864:デフォルトの名無しさん
07/11/23 22:37:14
テンプレートとか、STLとかどのくらい手間掛けているか不明なやつ使うと鈍くなる
charやintを直接あやつる範囲ではアセンブラに匹敵する

865:デフォルトの名無しさん
07/11/23 22:40:22
アセンブリ言語っつっても、
速いコード書くノウハウ無かったら
コンパイラの最適化の方が速かったりするもんな。

866:デフォルトの名無しさん
07/11/23 22:59:52
とりあえず初心者が動かせる3Dライブラリを開発しますか

867:デフォルトの名無しさん
07/11/23 23:08:38
>>859
それは、
不必要にデストラクタをvirtualにする
という愚をやらかしているだけだろ。

>>863
それはどこの何というコンパイラ?

例外をthrowする、throwされたものをcatchする、それにはコストは要するが、
例外中立なコードにはオーバーヘッドかからないと思うが。

868:デフォルトの名無しさん
07/11/23 23:10:33
catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない
さっきg++で試してみた
virtualかどうかは関係ない

869:デフォルトの名無しさん
07/11/23 23:10:35
デストラクタから virtual を外すのは
どうしても必要な時だけにするのが無難だべ。

870:デフォルトの名無しさん
07/11/23 23:17:58
逆だろ? 仮想関数を使う必要がある時だけ付けるよな。

871:デフォルトの名無しさん
07/11/23 23:19:40
馬鹿が飛びつくつまらない話が出てきちゃった

872:デフォルトの名無しさん
07/11/23 23:22:00
あとから仮想関数が必要になった時に付け忘れても知らんべ。

873:デフォルトの名無しさん
07/11/23 23:24:00
JavaやC#みたいに継承禁止ができたら、安心してvirtualをはずせるけど。

874:デフォルトの名無しさん
07/11/23 23:24:09
使われ方によって、virtualをつける必要があったりなかったりするC++は糞言語。

875:デフォルトの名無しさん
07/11/23 23:29:11
final/sealed 欲しいよなあ。
Final ですってコメントつけて非仮想デストラクタにすることはあるけど、
コメントだけじゃ心もとないよな。

876:デフォルトの名無しさん
07/11/23 23:31:57
クラス設計時点で継承の有無はわかるだろ。
あとから必要になったら、その時点で必要な修正を行えばいいと思うが。

877:デフォルトの名無しさん
07/11/23 23:33:10
C++しか知らないと、そういう物の考え方するんだ

878:デフォルトの名無しさん
07/11/23 23:33:54
うん

879:デフォルトの名無しさん
07/11/23 23:35:06
そういう意味で言うと、後から必要になったときでも修正の必要がないように、
デストラクタは必ずvirtualで、っていうのも、あながち間違った選択ではないと思える。

880:デフォルトの名無しさん
07/11/23 23:35:29
一体誰がどう使うクラスの設計してるんだ?

881:デフォルトの名無しさん
07/11/23 23:36:14
とりあえず virtual を付けとけば、
どういう変更が必要になろうが何の心配も要らない。
virtual を付けてないと、後の変更でバグを発生させる可能性がある。
その変更を行うのが自分とは限らないわけで、
どっかのバカが変な事をするかもしれない。
そう考えると、デストラクタを非仮想にするのは、
よほど非仮想にするメリットがある場合じゃないと怖くてできない。

882:デフォルトの名無しさん
07/11/23 23:37:33
C++って、そういう本質的でないところにも気を使わせるのが、糞言語たる所以だね。

883:デフォルトの名無しさん
07/11/23 23:38:31
速度やデータサイズは本質的な問題だよ。

884:デフォルトの名無しさん
07/11/23 23:39:30
じゃ、Javaなんてとてもじゃないが使えないってわけだ。

885:デフォルトの名無しさん
07/11/23 23:39:57
そこが本質的な問題になることがあるから。

886:デフォルトの名無しさん
07/11/23 23:41:02
速度やデータサイズを気にする必要があれば
Java なんてとてもじゃないが使えないってわけだよ。
気にする必要がないなら使えばいい。

887:デフォルトの名無しさん
07/11/23 23:42:07
道具は選んで使うべきだ

888:デフォルトの名無しさん
07/11/23 23:42:50
Cで書けばいいのに(^^

889:デフォルトの名無しさん
07/11/24 00:13:35
>>868
> catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない

当たり前だろ。

正常にreturnする時にもデストラクタは呼ばれるのだから、
それは、例外のオーバーヘッドとは言わないだろう。

>>869
それなら、virtual なんて書かずとも全てがvirtual で、
nonvirtual などと書いたものだけがvirtual でなくなる、
そういう言語仕様になるだろうに。

890:デフォルトの名無しさん
07/11/24 00:15:24
>>889
色々とお話しにならない。

891:デフォルトの名無しさん
07/11/24 00:19:11
>>872
それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。

>>873
継承できないようにするハックはあるけど、まぁ、オススメしないわな。
もっと別の方法で、管理すべきだろうな。

>>874
使い方によって、だろ。

キャストしたポインタでdeleteするような使い方をする側が、
デストラクタがvirtualであることを確認し、そうでなければ、
継承するのではなくメンバに持つように実装すべきなんだ。

892:デフォルトの名無しさん
07/11/24 00:21:26
>>890
具体的に

893:デフォルトの名無しさん
07/11/24 00:21:33
>>891
> それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。
別にそんなこと言っとらんわ。

894:デフォルトの名無しさん
07/11/24 00:22:58
>>891
> 継承できないようにするハックはあるけど、まぁ、オススメしないわな。
何か特殊なクラスを継承して、結局仮想関数が必要だったような気がする。

895:デフォルトの名無しさん
07/11/24 00:25:12
C++が糞言語であることには、誰も異論はないだろう。

使っている道具を糞だと言っているだけで、
それを使う人間が糞だと言っているわけでもないのに。

C++が糞言語だと言われて顔を真っ赤にするのは、
Stroustrupだけで、いいんじゃないか。

896:デフォルトの名無しさん
07/11/24 00:26:07
>>893
話の流れを無視した独り言だったのか。

897:デフォルトの名無しさん
07/11/24 00:26:23
>>889
下記の f と h のコンパイル結果を比べてみるといい

struct S { ~S(); };

int g();

int f()
{
S s;
g();
return 0;
}

int h()
{
S s;
return 0;
}

898:デフォルトの名無しさん
07/11/24 00:28:39
そういう言語仕様になるだろうにとか言われても、
今実際にそうなってないんだから、そういう事言っても無駄だよな・・・。

899:デフォルトの名無しさん
07/11/24 00:32:50
>>894
URLリンク(article.gmane.org)
これかな。

それなりのコンパイラなら、
vtableは作られるが、使われないので、リンカによって削除されるだろう。

900:デフォルトの名無しさん
07/11/24 00:35:05
>>898
そういう言語仕様になっていない
ということは、
というのが言語仕様を決めた人達は、
基本的にvirtual で例外的にvirtualではなくする
というポリシーではなかった、ということだね。

互換性のために、そういうポリシーだという可能性もあるが。

901:デフォルトの名無しさん
07/11/24 00:36:20
>>899
あ、別に仮想関数は要らんかったか。

902:デフォルトの名無しさん
07/11/24 00:37:39
>>900
デストラクタはデフォで virtual な方がいいけど、
他の関数は virtual がデフォである場合も nonvirtual がデフォである場合も
一長一短なので何とも言えない。

903:デフォルトの名無しさん
07/11/24 00:46:09
>900

Stroustrupに聞いてみ、と言おうと思ったら、本人のページに書いてあったわ。
URLリンク(www.research.att.com)

「多くのクラスは、基底クラスとして使われるように設計されないから」だって。
基底クラスは、「基底クラス」と意識して最初から設計しろ、ってことか。


904:デフォルトの名無しさん
07/11/24 00:47:20
仮想関数が1つでもあれば自動的にデストラクタもデフォで仮想関数になってくれればいいのにね。

905:デフォルトの名無しさん
07/11/24 00:55:29
>>904
virtualなメンバ関数があるからといって、virtualなデストラクタが必要とは限らないしなぁ。
結局、どのようにdeleteするのかは、そのクラスを使う人が決めることだから。

使う人が決めることなのに、作る人が決めないといけないのは変だがね・・・。

906:デフォルトの名無しさん
07/11/24 01:18:27
>>897
何が言いたいのか理解した。

~S()の呼び出しコードがhでは1個なのに対して、fでは2個になるってことか。
たしかにコードサイズは肥大するが、正常系のルートの実行速度には影響しないだろう。

ちなみに、
struct S { ~S(); };
というのは、
struct S { ~S() throw() ; };
とすべきだろうな。
デストラクタで例外をthrowしちゃいかんよ。

実行速度のために例外を(部分的に)使わないという選択もC++では可能だぞ。
int g() ;

int g() throw() ;
とすれば、f()やh()内では例外のためのコードが生成されない。

907:デフォルトの名無しさん
07/11/24 01:21:06
結局、C++は遅い と言っている人は、
Cと同じことをするコードをC++で書いて遅いと言っているのではなく、
Cよりも複雑なことをするコードをC++で書いて遅いと言っているわけだ。


908:デフォルトの名無しさん
07/11/24 01:30:37
>>907
少なくとも自分はそう言ってる
で、Cよりも複雑なことをしないのは難しい
まあ、Cとしてコンパイルできるコードを書けばいいだけだけど

909:デフォルトの名無しさん
07/11/24 01:42:10
stlとか複雑な機能を簡単にするやつを使うとCで書いた方が速い
たとえばstringなどは確保したときにサイズは確保されない もし文字列の最大長が分かっていればchar[]で取っておいた方が速い

910:デフォルトの名無しさん
07/11/24 01:43:35
> int g() throw() ;
> とすれば、f()やh()内では例外のためのコードが生成されない。

そうするとg()側でコストが掛かる
g 内のコードが例外を投げないことが明確なときはコストはないけど
例外指定を書けないCのライブラリを呼んでたりするとお手上げ

例外関連のコストを避けるのは難しいね、ということでした

911:デフォルトの名無しさん
07/11/24 01:45:25
>>909
そもそもクラスである意義を忘れないで下さい。

912:デフォルトの名無しさん
07/11/24 01:46:51
実際はアセンブラもCもC++もたいして変わらないが、まれにCよりアセンブラのほうが速く、まれにC++よりCのほうが速い
まれが重なると細かい手入れが出来るアセンブラが良くなる

913:デフォルトの名無しさん
07/11/24 01:52:57
>>908
そうか・・・

>>909
STLの使い方が悪いと、そうなるね。

そのstringの例だと、
固定長の文字列のクラスを作ったらどうよ。

>>910
え? Cのライブラリは自動的に throw() として扱われるっしょ。
CのライブラリがC++の例外をthrowすることなんて、できないんだから。

914:デフォルトの名無しさん
07/11/24 02:02:27
> え? Cのライブラリは自動的に throw() として扱われるっしょ。
> CのライブラリがC++の例外をthrowすることなんて、できないんだから。

いつもコンパイラにわかるわけじゃない

915:デフォルトの名無しさん
07/11/24 02:05:26
別にC++は遅くないと思うよ。標準ライブラリやSTLも使わずに、
カリカリにチューニングして書けば。でも、標準ライブラリも
STLも使わないC++使う意味なぞない。

標準ライブラリはメモリコピーとメモリの動的確保・開放
を前提にしているから遅い。だがしかし、これはC++を使う大きな
利点であるので捨てられない。

速度と効率を求めるならCを使えばいい。

916:デフォルトの名無しさん
07/11/24 02:19:11
これをインストールしたいのですがメイクが出来ません BCC5.5.1です
URLリンク(www.vector.co.jp)
どうすればいいんでしょうか? エラー内容です

..\source\lib\remul.cpp:
エラー E2017 ..\source\lib\remul.cpp 38: メンバー名 'ctype_base::digit' が曖昧(関数 Mint::isRemUL(const unsigned long,int) const )
*** 1 errors in Compile ***
** error 1 ** deleting ..\BC5LIB\remul.obj

..\source\driver\berntbl1.cpp:
エラー E2367 D:\Programs\bcc\INCLUDE\constrea.h 41: 非 RTTI 基本クラス streambuf からは RTTI クラスを継承できない
エラー E2367 D:\Programs\bcc\INCLUDE\constrea.h 207: 非 RTTI 基本クラス ostream からは RTTI クラスを継承できない
エラー E2318 D:\Programs\bcc\INCLUDE\constrea.h 255: 'ostream' は多様性を持つクラスではない(関数 constream::isCon(ostream &) )
*** 3 errors in Compile ***



917:デフォルトの名無しさん
07/11/24 02:33:31
>>914
具体例は?

>>915
STLが遅いと言ってる人は、
実装が悪いSTLを使っているか、
コピーにコストがかかるオブジェクトを直にコンテナに格納するとかの使い方が悪いんじゃないか。

918:デフォルトの名無しさん
07/11/24 02:38:19
ヘッダファイルに

int g();

と書かれててコンパイラにわかる?

919:デフォルトの名無しさん
07/11/24 02:53:18
>>918
C++から、C++を考慮していないCのヘッダファイルを使う場合、

extern "C" {
#include "hoge.h"
}
とするのが普通だろ。

"C"なら、C++の例外をthrowしないということがわかる。

920:デフォルトの名無しさん
07/11/24 02:56:30
>>918
で、コンパイラ付属のC標準ライブラリをC++から使った場合に、
例外をthrowするものとして扱われてしまう、そういう具体例は?

具体例を挙げてもらったところで、
そんなダサいコンパイラを使うのはやめろ
なのだが・・・。

921:デフォルトの名無しさん
07/11/24 03:04:18
じゃあ、C++のヘッダファイルでCのヘッダをナイーブにインクルードしちゃってた場合は?

いいだしたらきりがないけど

922:デフォルトの名無しさん
07/11/24 03:07:44
ああそうか
インクルードパスの調整とかで回避できるか

923:デフォルトの名無しさん
07/11/24 03:08:31
>>920
はは、そんなことは言ってないよ

924:デフォルトの名無しさん
07/11/24 03:14:34
>>921
そのC++のヘッダファイルの責任だよ、Cのヘッダファイルをextern "C"の中でincludeするのは。

間違った使い方をしたときの話をしても、しかたあるまい?

925:デフォルトの名無しさん
07/11/24 03:17:27
いや、そういうことも含めてコストの話をしていたつもり
ほとんどのプログラムは完璧じゃないから

論点がずれてたね

926:デフォルトの名無しさん
07/11/24 03:27:21
>>917
いやいや。例えば、あるバッファがプログラムの中で必要だったとしよう。

myvec.assign(nlen, '\0');
func(&myvec[0], myvec.size());

というように、C++だとかけるし、スコープ外にでれば、myvecで確保した
メモリが自動解放されるので、メモリリークの心配も少ない。Cだときちんと開放
しないとメモリリークを起こす。んで、これはC++の大きな利点。

クラスを自分で実装しても、ちゃんとメモリリークしにくい実装という
のはできるけど、標準ライブラリで多くの機能が実装されているという
のがC++の利点だといっているわけで。

ただし、こういう利点を享受するためには、メモリの動的確保・開放
を受け入れなければならないって話ナ。

927:デフォルトの名無しさん
07/11/24 04:08:27
>>926
何を言いたいのか、わからないなぁ。

もしかして組込屋?

以前に電話の交換機のソースを見たが、ありゃぁ酷かった。
変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。

メモリの容量が足りないとか、
どれだけ長く動かし続けても決められた状態以外にはならないとか、
そういう特殊な事情があるというのは理解できるが、ありゃぁ別世界だよ。

928:デフォルトの名無しさん
07/11/24 04:14:23
>>927
別世界だが、そういう世界でなければCをワザワザ使わないって。
俺もC++スキダケドナ。使えないのよ。

929:デフォルトの名無しさん
07/11/24 04:15:30
>>927
>変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
>しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。

ちなみにこの発言は、もの知らなすぎるなw

930:デフォルトの名無しさん
07/11/24 04:21:57
ちなみに、メモリ制約の大きいところでは、そもそもメモリの
動的確保・開放は使えないからな。最終的に作り上げたアプリが
最大でいくつのメモリを必要とするかを提示できないといけないから。

931:デフォルトの名無しさん
07/11/24 04:24:47
>>929
ああ、その別世界の住人ではないからな。

たまたま機会があって、ちらっとソースを見て話を聞いて、
その彼らのコーディングルールにぶったまげただけだもの。


932:デフォルトの名無しさん
07/11/24 04:27:39
まぁ927は、コンピュータの基礎から勉強しなおすのを薦める。

933:デフォルトの名無しさん
07/11/24 04:33:23
>>932
話が繋がりませんが? どういうことよ。

マイコン = マイクロ・コントローラな人達の世界の常識なんて、いらないよ。

934:デフォルトの名無しさん
07/11/24 04:34:05
日本の時代錯誤的な作り方をしている携帯電話屋か。
過労で頭がどうにかしてしまったかい?

935:デフォルトの名無しさん
07/11/24 04:42:07
>>933,>>934

時代錯誤だと思い込んでるのは、幼稚な日本の技術者だけだよ。
自分の頭で普通に考えればわかることだ。

課題「なぜ、低級言語がなくなることは考えにくいか、1000文字以内で論じなさい」

936:デフォルトの名無しさん
07/11/24 04:44:32
>>935
三流大学の講師にでもなったら?

937:デフォルトの名無しさん
07/11/24 04:46:49
プッ

938:デフォルトの名無しさん
07/11/24 04:58:26
自分で理路整然と説明できないので、
学生たちにレポート書かせて、その中から優秀なのを見つけて自分のものにする
そんな人間だな。

携帯電話のアプリケーション用プロセッサの性能とメモリ容量は、
すでにSun4あたりの昔のUNIXワークステーション並で、
リブートせずに連続動作する時間は同じくらいなのに、ソフトの作りがまるで違う。
その理由は様々考えられるだろうけど、1つ言えるのは、
設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。

939:デフォルトの名無しさん
07/11/24 05:00:59
お前ら、スレタイも読めない馬鹿には、発言権なし!

940:デフォルトの名無しさん
07/11/24 05:05:39
>>938
君の発想では、もっとも低レベルのCPU、メモリを使用している
ものは携帯電話までだというようだけど、それって今後も
ホントウにそうなのか?

941:デフォルトの名無しさん
07/11/24 05:07:10
こういうタイプの人間は決まって自分から答えを言おうとしないんだよな。

942:デフォルトの名無しさん
07/11/24 05:38:45
>>940
スレタイも読めない馬鹿ですか?

943:デフォルトの名無しさん
07/11/24 05:40:53
>>941
言おうとしないのは、言えないからだよ。

944:デフォルトの名無しさん
07/11/24 05:47:33
>>941,943
思考停止は、成長を停めるぞ。

945:デフォルトの名無しさん
07/11/24 06:28:37
>>944
煽るだけかよ。
スレタイを見て適切な行動を取れ。
でなければ、お前が思考停止の老害だ。

946:デフォルトの名無しさん
07/11/24 07:26:39
>>916
なんか指定のコンパイラが古いね。
エラーメッセージも危険な香りがする。
あきらめて同等の他のものを探した方が早い気がするんだけど、だめかなぁ?

947:デフォルトの名無しさん
07/11/24 09:01:17
ループの中で行う処理の中に標準出力を入れたとき、
コンパイルして実行したらループの中の標準出力がでてこないときがあるのですが
どうすれば解決できるのですか?

948:デフォルトの名無しさん
07/11/24 09:07:18
>>947
ループと標準出力を結びつけないで考えるようにすればいいんじゃないかな?

949:デフォルトの名無しさん
07/11/24 09:18:33
>>947
現象を再現できる最小のコードを書いてうpしてみそ。

950:デフォルトの名無しさん
07/11/24 09:20:25
組込み屋だが・・
>>927が例に出してるような環境は組込みでも珍しいと思う。
10年以上やってるが、そんなコードは見たこともない。
スタックは昔から使えるから、auto変数ぐらいは使えるはずだが。
ただ、
>変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
>しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。
↑これはレジスタのような気がしなくも無い。

今ではmalloc/freeくらいは実装する場合が多いと思うよ。
動的確保でも、大体のメモリ見積はできるしね。
けどSTLとなると大概はオーバースペックだと思うな。

>>938
>設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。
↑これは別に否定しないが、仮想記憶が無いことがほとんど、というのがでかいと思うよ。
ちょっと前までやってた仕事では、メモリ1GBあっても「足りない」と言ってたし。


951:デフォルトの名無しさん
07/11/24 09:22:02
>>947

何らかの理由でループの中に入らないことがある、と言う事だろう。
そのあたりが多分バグ。


952:デフォルトの名無しさん
07/11/24 09:40:44
>>949
再現というか、一通りforループの中の計算の処理をしおわって、ループを抜けた後に
ループの中に書いた標準出力がワーッと出てくるような感じなんですよね

シェルスクリプトみたいに逐一でるようにはならないのかなあと考えているのですが
どうすればよいのかわかりませんです

953:デフォルトの名無しさん
07/11/24 09:43:05
>>952
ループの中にfflush(stdout);とか入れてみるとか。

954:デフォルトの名無しさん
07/11/24 09:44:28
>>905
まあ new しないで使うだけの事もあるし、
new したとしても常に元の型で delete する場合もあるだろうしな。
ただ、安全を考えるならとりあえず virtual にしといて、
それが速度に影響していた場合だけ変えればいいと思うよ。

仮想関数が1つでもあればどうせ仮想関数テーブルは存在するし、
delete 使わずにデストラクタが直接呼ばれる場合には
どのクラスのデストラクタを呼ぶか確定してるから普通のメンバ関数と同じ形で呼ばれるから
特別なコストは発生しないし。(インライン化も可能。)
つまり、仮想デストラクタが影響するのは delete 時のコスト変化だけだから、
既に仮想関数テーブルがあるような状況では、
常に元の型で delete する場合にしか影響は無い。
でも、delete のコストで普通はまぎれる。


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

4726日前に更新/260 KB
担当:undef