【初心者歓迎】C/C++室 Ver.9【環境依存OK】

このエントリーをはてなブックマークに追加
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (html化待ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(html化待ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(html化待ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/l50

【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part14
http://pc5.2ch.net/test/read.cgi/tech/1093672937/l50

■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/l50

C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/l50

GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/l50

タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50

タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50

Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
【関連スレ(その他)】
C言語なら俺に聞け! Part 90
http://pc5.2ch.net/test/read.cgi/tech/1094025471/l50

C++相談室 part35
http://pc5.2ch.net/test/read.cgi/tech/1093958200/l50

C/C++の宿題を片づけ作戦指令 30代目
http://pc5.2ch.net/test/read.cgi/tech/1091954342/l50

【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/l50

C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/l50

C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/l50
【関連スレ(その他)】
★C言語で遊ぼう!★
http://pc5.2ch.net/test/read.cgi/tech/1028269762/l50

プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50

C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50

フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/l50

C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/l50

ラウンジでC言語
http://etc3.2ch.net/test/read.cgi/entrance/1093006298/l50
>>1
6前スレ976:04/09/07 08:21
>>990
>処でこの問題の場合、「手」をクラス化しました。
>しかし、コンピュータの手とオペレータの手を纏めてしまったために
>オペレータ同士の対戦にしたりコンピュータ同士の対戦にすることができません。
>このような改修に耐えられるように手はそれぞれ独立したオブジェクトとして扱えた方が面白いでしょうね。
言われたとおりに、それぞれの「手」を独立した形にしてみました。
が、やっぱりどうもゴチャゴチャしている様な気がします。。。
宜しければマズイ箇所などがあればご指摘の程をお願いします。
enum mode{ player_vs_comp = 0, player_vs_player = 1, comp_vs_comp = 2, };
enum judge{ win2 = 0, win1 = 1, even = 2, };

class cte{
protected:
  int m_type;
  bool m_playertype;
public:
  void select(void){
    if(m_playertype){
      cout << "player select ";
      m_type = getch() - 0x31; if(m_type > 2){ m_type = 2; }
      cout << endl;
    }else{
      cout << "comp select " << endl;
      m_type = rand() % 3;
    }
  }
  int type(void){ return m_type; }
  void playertype(bool playertype){ m_playertype = playertype; }
  cte(){ m_type = 0; }
  ~cte(){}
};
7前スレ976:04/09/07 08:22
class cjanken{
protected:
  string m_typestr[3];
  judge m_judgelst[3][3];
public:
  void mode(cte &te1, cte &te2){
    switch(getch() - 0x31){
      case player_vs_comp: te1.playertype(true); te2.playertype(false); break;
      case player_vs_player: te1.playertype(true); te2.playertype(true); break;
      case comp_vs_comp: te1.playertype(false); te2.playertype(false); break;
    }
  }
  void select(cte &te1, cte &te2){
    te1.select();
    te2.select();
  }
  void show(cte &te1, cte te2){ cout << m_typestr[te1.type()] << " vs " << m_typestr[te2.type()] << endl; }
  judge check(cte &te1, cte &te2){ return m_judgelst[te1.type()][te2.type()]; }

  cjanken(){
    srand((unsigned int)time(NULL));
    m_typestr[0] = "グー"; m_typestr[1] = "チョキ"; m_typestr[2] = "パー";
    m_judgelst[1][2] = m_judgelst[2][0] = m_judgelst[0][1] = win1;
    m_judgelst[0][0] = m_judgelst[1][1] = m_judgelst[2][2] = even;
    m_judgelst[2][1] = m_judgelst[0][2] = m_judgelst[1][0] = win2;
  }
  ~cjanken(){};
};
8前スレ976:04/09/07 08:22
int main(void)
{
bool flag = true;
cjanken janken;
cte te[2];

  cout << "1 = player vs comp, 2 = player vs player, 3 = comp vs comp\n" << endl;
  janken.mode(te[0], te[1]);
  
  cout << "グー = 1, チョキ = 2, パー = 3" << "\n" << endl;

  while(1){
    cout << "ジャンケン... " << endl;
    janken.select(te[0], te[1]);
    cout << "ポン !" << endl;
    janken.show(te[0], te[1]);

    switch(janken.check(te[0], te[1])){
      case win2: cout << "win2!\n" << endl; break;
      case win1: cout << "win1!\n" << endl; break;
      case even: cout << "even\n" << endl; break;
    }

    cout << "retry? y/n";
    if(getch() != 'y'){ break; }
    cout << "\n" << endl;
  }

  return 0;
}
>>8
class JankenHand {
public:
 enum Mode { MANUAL, AUTO };
 enum Te { GU, TYOKI, PA, RANDOM };
 enum Judgement { WIN_1, WIN_2, EVEN };

 static Judgement Judge(const JankenHand& player_1, const JankenHand& player_2) {
  Te t1 = player_1.get(), t2 = player_2.get();
  if( t1==t2 ) return EVEN;
  else if( (t1 == GU && t2 == TYOKI) || (t1 == TYOKI && t2 == PA) || (t1 == PA && t2 == GU) ) return WIN_1;
  else return WIN_2;
 }
 JankenHand(Mode mode = AUTO) : mode_(mode), te_(GU) { srand((unsigned int)time(NULL)); }
 void select() {
  if( mode_ == AUTO )
   te_ = static_cast<Te>(rand() % 3);
  else {
   cout << "ジャンケン... " << endl;
   te_ = static_cast<Te>(getch() - '1');
  }
 }
 Te get() const { return te_; }
 const char* show() const {
  static char* str[] = {"グー", "チョキ", "パー"};
  return str[te_];
 }
private:
 Mode mode_;
 Te te_;
};
int main(int argc, char* argv[])
{
 cout << "1 = player vs comp, 2 = player vs player, 3 = comp vs comp\n" << endl;
 int mode = getch() - '0';
 JankenHand p1(mode == 3 ? JankenHand::AUTO : JankenHand::MANUAL),
         p2(mode == 2 ? JankenHand::MANUAL : JankenHand::AUTO);

 cout << "グー = 1, チョキ = 2, パー = 3" << "\n" << endl;
 for(;;) {
  p1.select(); p2.select();
  cout << "ポン !" << endl;
  cout << "player_1=" << p1.show() << " player_2=" << p2.show() << endl;
  switch( JankenHand::Judge(p1, p2) ) {
   case JankenHand::WIN_1: cout << "win1!\n" << endl; break;
   case JankenHand::WIN_2: cout << "win2!\n" << endl; break;
   case JankenHand::EVEN: cout << "even\n" << endl; break;
  }

  cout << "retry? y/n";
  if( getch() != 'y') break;
  cout << "\n" << endl;
 }

 return 0;
}
11旅人達 ◆ahGjnhNBTw :04/09/07 13:14
>>1
乙です
12デフォルトの名無しさん:04/09/07 13:40
>>10
おれだったらこんな感じ
#include <iostream>
#include <map>
#include <string>
using namespace std;

void Play(int l, int r)
{
  enum janken{ goo = 0, choki, pahh};
  static map<int,string> gjmap;
  gjmap[goo] = "ぐー";
  gjmap[choki] = "ちょき";
  gjmap[pahh] = "ぱー";

  enum judge{ lose=0, win, even };
  static int judge_map[3][3] = {{even,win,lose},{lose,even,win},{win,lose,even} };

  switch(judge_map[l][r])
  {
  case win:
    cout<<gjmap[l]; break;
  case lose:
    cout<<gjmap[r]; break;
  case even:
    cout<<"Draw"<<endl; return;
  }
  cout<<" winner"<<endl;
}
13デフォルトの名無しさん:04/09/07 13:40
>>続き

int main()
{
  int r,l;
  cout << "グー = 0, チョキ = 1, パー = 2" << "\n" << endl;

  while(cin>>r>>l)
    if(r>=0 && r<3 && l>=0 && l<3) Play(r,l);
    else cout<<"なめきっとのかーコラー。お前、ひん剥いて、写真とって校内に晒すぞ!"<<endl;
  return 0;
}
14デフォルトの名無しさん:04/09/07 13:42
gjmapのgは気にしないでくれ
15デフォルトの名無しさん:04/09/07 15:28
strA[128][256];
strB[128][256];
という二つの文字列配列があるとして、
strAのLA列目のNA文字目を
strBのLB列目のNB文字目にコピーするにはどうしたらいいですか?
1615:04/09/07 15:38
すいません、書き忘れましたが普通のcharの文字列です。
17デフォルトの名無しさん:04/09/07 16:04
strB[LB][NB]=strA[LA][NA];
MFCで、2D描画が上手く行かずに困ってます

http://www.athomejp.com/goldfish/mfc/cobject/jpegview.asp
ここを参考に、ダイアログに描画はできてますが、
SDIで、同じ方法をもちいりましたが、view領域(?)に描画ができません

わかる人おしえてください
19旧979:04/09/07 17:51
全スレ、>> ttp://pc5.2ch.net/test/read.cgi/tech/1091264964/979 です。
>> ttp://pc5.2ch.net/test/read.cgi/tech/1091264964/991
>> ttp://pc5.2ch.net/test/read.cgi/tech/1091264964/986
typeof演算子というのですね。
C#とか、.Netとかが出てくる辺り、新しい事項っぽいですね。
勉強になりました。
ありがとうございました。
>>19
コンパイラによってはサポートしてたりします.
g++とか.検索してたら,どうやらVC++もそうなのかな?
21前スレ976:04/09/07 19:58
おおっ、色々コードをどうもです。

>>9
ずいぶんスッキリしましたね。
手のチェックメソッド(この場合judge())を手自体のstaticメソッドにしてるんですか。
ハッキリ言って僕のcjankenクラスは不要でしたね。。。

>>12
今回はそれぞれの「手」を独立したオブジェクトにしてのプログラムという事だったので。。。
でも、mapを使うのはより象徴的になってよさげですね。

やはり、人の書いたコードを見るのは勉強になります。
色々なご意見ありがとうございました。
2219:04/09/07 21:28
>>20
ありがとうございます。
VC++がサポートしているかもというのは、うれしい情報です。
Spokeを買えるお年頃なので、買ってみようかなと考えていたところです。
stlのvectorで vector< vector< int > >のように二次元配列として使用しています。
この配列の全要素に一括で同一の値を代入することってできますか?
今のところ、ループを回して逐次代入しているのですが。
>>23
#include <vector>
#include <algorithm>
void fill( std::vector< std::vector< int > >& v , int value )
{
 std::fill( v[0].begin() , v[0].end() , value );
 std::fill( v.begin() + 1 , v.end() , v[0] );
}

前提として
・!v.empty()
・v[0]〜v[v.size()-1] の全ての size() が v[0].size() と同じ(または処理後同じになってもいい)
ということが必要。

v.begin()〜v.end() のループを自前で回すと、
パフォーマンスを上げることができるかも知れない。
25デフォルトの名無しさん:04/09/07 23:46
Cの標準関数で文字列の差分を取得するにはどうしたらいいでしょうか。
例えばabcdefgとabcdを比較したらefgと帰ってくるようにしたいです。

もしくは、PHPでいうところのsubstrのような
文字列の〜文字目から〜文字目までを返すような関数ってないでしょうか。
std::string::substr
2725:04/09/07 23:54
std使わないで何とかなりませんでしょうか…
>v[0]〜v[v.size()-1] の全ての size() が v[0].size() と同じ(
n×mの単純な長方形的になっていれば良いということですね。問題ありません。

>v.begin()〜v.end() のループを自前で回すと、
>パフォーマンスを上げることができるかも知れない。
明日試してみます。

ありがとうございました。
28=23
>>25
char s1[] = "abcdefg", s2[] = "abcd";
printf("%s\n", strstr(s1, s2) + strlen(s2));
3125:04/09/08 00:39
>>30
ありがとう!できました。感謝します。
3230:04/09/08 00:40
>>31
本当にこれでいいの?
>>31 こういう事なんじゃないの?

char* delstr(char *s1, char *s2, char *buf)
{
strcpy(buf, s1);
*strstr(buf, s2) = '\0';
return strcat(buf, strstr(s1, s2) + strlen(s2));
}

int main(void)
{
char s1[] = "abcdefg", s2[] = "abc", s3[] = "bcd", s4[] = "efg";
char buf[8];

printf("%s\n", delstr(s1, s2, buf));
printf("%s\n", delstr(s1, s3, buf));
printf("%s\n", delstr(s1, s4, buf));
return 0;
}
34デフォルトの名無しさん :04/09/08 15:13
char buff[256];buff[0]='\0'
sprintf(buff,"%s","こんabcにdefgちはhi");
と定義された文字列があるとして、これを
char ln[256][256];
という文字配列に、nバイト以下ずつぎりぎりまで
詰め込んでいきたいのですがどうすればいいでしょうか。
例えば4バイトずつ詰め込むとしたら、
 :
 :
ln[5]'\0'
ln[4]こん'\0'
ln[3]abc'\0'
ln[2]にde'\0'
ln[1]ちは'\0'
ln[0]hi'\0'
という風になるようにしたいです。

まずln[0]に詰め込んでいき、4バイト分の「こん」まで入れたところで
まだbuffは続きがあるのでln[0]はln[1]に繰り上げます。
こんどはln[0]にabc・・と入れていき、「に」も入れたいところですが
2バイトなので次に持ち越すことにして、また繰り上げ、、、
というようにbuffを全部詰め込むまで続けたいです。
35デフォルトの名無しさん:04/09/08 16:33
すみません。お願いします!
http://www1.kcn.ne.jp/~robe/cpphtml/index.html
ココのサイトのプリグラムで、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094628792&res=1

ここの部分の解説をお願いしたいのですが、
お願いします。
できれば、詳しくお願いします。
>>34
なんか質問文が矛盾しまくってるのは気のせいか?
3734:04/09/08 18:00
>>36
どのへんでしょうか?
何バイト分詰め込みたいかは状況によって変わるので、
nバイト分ということで汎用性を持たせて組みたいのです。

文字列や文字列配列の容量は余裕を持たせていますが、
文字列配列の方は、列数が足りない場合
自動的に増減させたいのですが、そういう組み方が分かりません。。。

最後の5行は、こんな感じでやればいいのかなぁ・・・
とは思って書いたのですが、もっと効率の良い方法があるのかもしれません。
どうかよろしくお願いします。
3836:04/09/08 18:23
すまん勘違いしてたみたい。
>まだbuffは続きがあるのでln[0]はln[1]に繰り上げます。
繰り上げるって後ろにずらす事だと今気付いた。

>char ln[256][256];
C++ならstd::list<std::string>でpush_frontしていく方がいいんじゃね?

2バイト文字を考慮したコピーはこんな感じ。
void copyn(const char* src, char* dest, int n)
{
std::copy(src, src+n, dest);
if( isleadbyte((unsigned int)src[n-1]) )
dest[n-1] = '\0';
}
ちょい修正

int copyn(const char* src, char* dest, int n)
{
std::copy(src, src+n, dest);
if( isleadbyte((unsigned int)src[n-1]) )
dest[--n] = '\0';
return n; // コピーしたバイト数
}
4038:04/09/08 18:36
>>38-39
忘れて。copynは多分うまくいかない。
4134:04/09/08 18:41
どうもです。小出し小出しで申し訳ないのですが、
一応Cの標準の関数だけでやりたいのです。
stl使ってないので他の部分が動かなくなりそうです。
4234:04/09/08 22:53
何とか自己解決できました。レスいただけた方、ありがとうございました。
4334:04/09/09 13:32
度々すいません。
文字列を一文字ずつ走査し、全角か半角かを判別する処理を作っています。

IsDBCSLeadByteを使うと、ひらがなや全角アルファベット大文字は
問題なく全角として判定できているようなのですが、
漢字や全角アルファベット小文字などがうまく判定できていないようです。
isleadbyteを使った場合は、unsignedにキャストしてますが
全て0が帰ってきてしまいます。

単純にコーディングミスの可能性もあるかもしれませんが、
何かうまく判定する方法があったら教えて下さい。
よろしくお願いします。
>>43
なんのコンパイラ使ってるのか知らんけど、
VC++ならこんな関数があるよ。
_ismbbkana()
>>43
問題ないみたいだけど?
4634:04/09/09 13:55
>>44
どうもです。判定する文字列は半角全角問わず、
ひらがなカタカナローマ字など色々入っている可能性があって、
最終的には全角か半角かができればいいです。
_ismbbkanaは半角カタカナを判定できるみたいですが、
それ以外のものも一括で判定したいです。
_ismbbleadというのも発見したのですが、
IsDBCSLeadByteと同じ結果しか得られませんでした…

>>45
マジですか。でもコーディングミスだったら
こんなに規則的にならないような気がするんですよね。
並び順とか関係なく必ず全角小文字ローマ字のところは
変になってるみたいです。漢字はものによってって感じです。
ひらがなは絶対成功してるようです。
何が違うのかちょっと謎なんですが、もうちょっと検証してみます。
4734:04/09/09 13:57
すいません、書き忘れましたが環境はVC++6.0とW2kです。
>>46
assert(::IsDBCSLeadByte(*"a"));
...
assert(::IsDBCSLeadByte(*"z"));

アサーションに掛からないよ?
うちの環境 VC++6.0sp6 WinXPsp1
では、以下のコードで「multi byte string」とちゃんと表示される。

#include <iostream>
#include <mbstring.h>
int main(void)
{
char str[] = "c";
if(_ismbblead(str[0])){ cout << "multi byte string" << endl; }
return 0;
}
5048:04/09/09 14:11
VC6+2kSP4
VC7.1+XPSP1

で試した。
5134:04/09/09 14:22
>>48
わざわざすいません。ありがとうございます。
なんとなく原因が判明しました。
カウンタを進める処理に間違いがあったみたいで、
判定関数に全角文字の2バイト目を入れてしまった場合に
ひらがななどは0が帰ってくるのですが
全角ローマ字小文字などの今までうまくいっていなかった文字では
1が帰ってきていました。
そのため不具合が起きていたようです。

お騒がせしました。ありがとうございました。
52デフォルトの名無しさん:04/09/09 15:00
はじめまして,初めて書き込みします。現在,時間を読み取る精度として
1msの物を必要としています。time.hでは精度が悪く50msしかとれず,
マルチメディアタイマーを使用しようとしてもうまくいきません。
環境はBorland C++ を使用しています。
もしなにかいい方法を知っている方がいたら教えていただきたいのですが。
timeBeginPeriod(1);
timeEndPeriod(1);
の間でマルチメディアタイマーを使えば良い。
あとはQueryPerformanceCounterとかCライブラリのclockとかかな?
vectorの要素のコピー教えて下さいでつ。
std::copy
>>52
windows.hにGetTickCount、timeGetTimeがあるけど、
それでも10ミリ秒ぐらいかな。1ミリ秒は難しいかも。
>>43
setlocaleでデフォルトの"C"から変更していないとisleadbyteは常に0を返すよ。
初心者プログラマなんですが、C++勉強しています。
C++を使ってゲームを作ろうと思っているのですが、DirectXで苦労しています。
正直、ライブラリを自分で作るだけの能力が今はないので、
他で公開されているライブラリを利用して作ろうと思っています。
そこで、お勧めのライブラリがありましたら紹介していただきたいです。
よろしくお願いします。
>>58
「やねうらお」でぐぐってみそ
>>58
SDLとかAllegro
61デフォルトの名無しさん:04/09/10 14:35:00
//テキストの表示
HDC hdc;
  LPTSTR lptStr = TEXT("111");
hdc = GetDC(hWnd);
  TextOut(hdc , 0 , 0 , lptStr , lstrlen(lptStr));
  ReleaseDC(hWnd , hdc);

これだと111が表示されるのですが

変数Aの内容を表示させたい時はどうすればいいのでしょうか?
VC++.netです
62デフォルトの名無しさん:04/09/10 15:30:18
6361:04/09/10 15:47:12
>>62
sprintfや_stprintfかwsprintfを使って>>61をどのように変更すればよいのでしょうか?
64デフォルトの名無しさん:04/09/10 15:49:20
こういう奴って周りに迷惑しかかけない
65デフォルトの名無しさん:04/09/10 15:53:57
変数Aの内容を表示って16 進ダンプでいいのか?
66デフォルトの名無しさん:04/09/10 15:57:22
そもそも変数Aの型ってなんなんだろうな?
67デフォルトの名無しさん:04/09/10 16:00:32
>>65
>>66
マウスカーソルの座標を表示させたいんです
68デフォルトの名無しさん:04/09/10 16:11:57
Cヒストグラムを作るプログラムが完成しません。お願いします。1000 以下の素数が格納されているデータファイル prm1000.dat を読み込み素数の度数分布表を作成したいと思っています。作ったプログラムが下にあるものです。
#include <stdio.h>
#define N 50
int main( int argc, char *argv[] ) {
FILE *fp;
char *datafile;
int i, j, width, prime, count[N];
/* error*/    
if ( argc != 2 ) { printf( "error : Invalid Usage\n" );
exit( 1 );}
datafile = argv[1];
if ( ( fp = fopen( datafile, "r" ) ) == NULL ) {
printf( "error : can't open %s\n", datafile );
exit( 1 );}
/* initialize*/    
for ( i = 0; i < N; i++ ) count[i] = 0;
printf( "Enter the width => " );
scanf( "%d", &width );
/* read and count*/
j = 1;
while ( fscanf( fp, "%d", &prime ) != EOF ){ if ( prime < width * j )
count[j]++;
else
count[++j]++;}
fclose( fp );
putchar( '\n' );
for ( i = 1; i <= j; i++ )
printf( "%5d 〜 %5d : %3d\n", width*(i-1), width*i-1, count[i] );
exit(0); }
作ったプログラムをコンパイル実行するとerror : Invalid Usageと出てしまいます。
このプログラムのどこに何を足したら完成できるか教えてください。お願いします
69デフォルトの名無しさん:04/09/10 16:20:07
>>68
氏ねやマルチ
70デフォルトの名無しさん:04/09/10 16:57:13
文字列の長さを指定して出力するC++流の方法ってあるんでしょうか?

char str = "jpnkor";
printf("%.3s\n", str); //こんなんのC++流

std::cout << std::setw(3) << str << std::endl; //うまくいかない
71デフォルトの名無しさん:04/09/10 18:16:01
>>70
boost使っていいなら
#include <iostream>
#include <boost/format.hpp>
int main () {
char *str = "jpnkor";
std::cout << boost::format ("%.3s") % str << std::endl;
return 0;
}
72デフォルトの名無しさん:04/09/10 18:23:43
>>71
ってことは標準ではそんな都合のいいものは無いのか
レスdクス
73デフォルトの名無しさん:04/09/10 19:54:15
>>63
HDC hdc = GetDC(hWnd);
TCHAR szBuf[32];
wsprintf(szBuf, "%d", a);
TextOut(hdc, 0, 0, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);
7458:04/09/10 21:29:53
>>59-60
遅レスですが、ありがとうございます。
一通り検索してみます。
75デフォルトの名無しさん:04/09/10 23:57:35
>>70 std::string::substr() じゃだめ?
76デフォルトの名無しさん:04/09/11 00:22:26
>>73
レスありがとうございます
早速試してみます
77デフォルトの名無しさん:04/09/11 02:12:40
>>75
レスthx。stringクラスなら切り出しができるんですね
やっぱchar配列はむりぽ(´・ω・`)
printf群使いまつ
78errno84??:04/09/11 02:36:20
gccで日本語を表示するとerrnoが84になってしまうのはなぜですか?
また最適化オプションで回避してもprintfの戻り値をとるとerrno=84と
なってしまうのはどうしてなんでしょう。。。環境が間違っているのでしょうか?
////////// err84.c //////////
#include <stdio.h>
#include <errno.h>
int main()
{
int ret;
errno = 0;
printf("errno test1\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
printf("errno test2\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
printf("日本語で出力test\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval test1\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval test2\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval 日本語で出力 test\n");
printf("%d => %s\n", errno, strerror(errno));
return 0;
}
79errno84??:04/09/11 02:39:40
コンパイル方法
$ gcc err84.c -o t0 -O0
$ gcc err84.c -o t1 -O1
$ gcc err84.c -o t2 -O2
$ gcc err84.c -o t3 -O3

t0実行
errno test1
0 => Success
errno test2
0 => Success
日本語で出力test
84 => Invalid or incomplete multibyte or wide character
retval test1
0 => Success
retval test2
0 => Success
retval 日本語で出力 test
84 => Invalid or incomplete multibyte or wide character
80errno84??:04/09/11 02:40:05
t1実行
errno test1
0 => Success
errno test2
0 => Success
日本語で出力test
0 => Success
retval test1
0 => Success
retval test2
0 => Success
retval 日本語で出力 test
84 => Invalid or incomplete multibyte or wide character
///////////////////////////////
t2,t3はt1と同じ結果なので省略。
81デフォルトの名無しさん:04/09/11 02:53:51
>>78
gcc (GCC) 3.4.1 (cygming special) で実行してみたけど、全部 0 => No error になった。
というわけで環境きぼん。
82デフォルトの名無しさん:04/09/11 02:55:40
EUCやSJISやUNICODEとかの環境もな・・・
83デフォルトの名無しさん:04/09/11 03:16:12
ボキ gcc 3.3.4 で、euc-jp で >>78 と同じ結果。参考までに
84デフォルトの名無しさん:04/09/11 03:29:25
gcc先生のご意見:
nnn.c:8: 警告: implicit declaration of function 'strerror'
nnn.c:8: 警告: format '%s' expects type 'char *', but argument 3 has type 'int'

icc先生のご意見:
nnn.c(8): remark #981: operands are evaluated in unspecified order
printf("%d => %s\n", errno, strerror(errno));
85デフォルトの名無しさん:04/09/11 03:41:03
>>84
上(gcc)は #include <string.h> すると黙る
86デフォルトの名無しさん:04/09/11 08:08:23
GetCursorPosではマウスカーソルのスクリーン全体での座標が得られるんですが
ウインドウ内での座標(ウインドウの一番左上の座標を(0,0)とした座標)
を得るにはどうすればいいのでしょうか?
87デフォルトの名無しさん:04/09/11 08:10:33
ScreenToClient()
88デフォルトの名無しさん:04/09/11 08:29:58
>>87
レスありがとうございます
ScreenToClient() を検索してみましたが使い方いまいちわかりませんでした

GetCursorPosで得たスクリーン座標をウインドの座標に変換する時は
そのように使えばいいのでしょうか?
89デフォルトの名無しさん:04/09/11 08:43:20
>>88
考えろ。調べろ。
90デフォルトの名無しさん:04/09/11 09:01:48
POINT pos;
GetCursorPos(&pos);
ScreenToClient(hWnd, &pos);
91デフォルトの名無しさん:04/09/11 12:23:32
djgpp(gcc) ver2.7.1 で 10行程度の Hello,World をコンパイルしたら
実行ファイルが500kbにもなったんですが、もっとファイルサイズを抑えられませんか
92デフォルトの名無しさん:04/09/11 12:34:52
strip したら
93デフォルトの名無しさん:04/09/11 13:29:24
>>90
お返事ありがとうございました
おかげさまでちゃんとできました
94デフォルトの名無しさん:04/09/11 14:01:01
ヘッダファイル削ったら?
95errno84??:04/09/11 14:10:05
78です。
環境を書き忘れていました。すいません。
gcc (GCC) 3.2.3
ja_JP.eucJP
となっております。
96デフォルトの名無しさん:04/09/11 18:27:54
21÷5=4余り1ですが
この商の4の部分だけが欲しい場合どうすればいいのでしょうか
97デフォルトの名無しさん:04/09/11 18:31:28
21/5
98デフォルトの名無しさん:04/09/11 18:36:12
>>97
れすありがとうございます
21/5=4.2にならないのでしょうか
4の部分だけが欲しいんです
99デフォルトの名無しさん:04/09/11 18:36:53
>>98
自分で試してごらんなさい
100デフォルトの名無しさん:04/09/11 18:37:14
だいじょうぶ
101デフォルトの名無しさん:04/09/11 18:37:23
>>98
21/5だっつってんだから試すなりしろよ。
あと入門書嫁
102デフォルトの名無しさん:04/09/11 18:40:44
>>99
>>100
>>101
早速試してみます
ありがとうございました
103デフォルトの名無しさん:04/09/11 18:59:01
newを使わずに、仮想関数テーブルをセットする方法はありますか?

独自のalloc関数で確保したメモリにクラスを割り当てたいのですが、
newかローカル宣言するしか仮想関数テーブルをセットする方法が
ないみたいで、今はこうやっています。
{
//newでないので、この時点ではテーブルがセットされない。
ClassA* a = my_alloc();
  //ローカル宣言したオブジェクトをコピーすることでテーブルをセットする・・・
ClassA temp_a;
memcpy(a, &a, sizeof(a));
}
グローバルnewをオーバーロードするという手もありますが、大掛かりに
なってしまうので、仮想関数テーブル「だけ」をセットする
やり方があればご教授ください。
104103:04/09/11 19:00:18
>>103
memcpy(a, &a, sizeof(a)) → memcpy(a, &temp_a, sizeof(a))
でした。
105デフォルトの名無しさん:04/09/11 19:07:42
データコンバートプログラムをCで作っているのですが、
困った問題にぶつかってしまいました。

Mac OS X 10.2.8
cc (GCC) 3.1 20020420 (prerelease)
において、
fopen: Too many open files
というエラーが出ております。
正確に計算したわけではありませんが概ね1000ファイルを開いた当たりでエラーが出ているようです。

同じプログラムをcygwinで動かしていますが、今のところ問題はないようです。
念のため、cygwinでもたくさんのファイルを開いた場合どうなるかをただいまテスト中です。

質問としては、
このエラーはfcloseでファイルポインタを閉じていてもそのプログラム中
でfopenが開けるMAXファイルポインタ数というものは決まっているのでしょうか?
それとも、単にどこかでfcloseの忘れがあるのでしょうか?
#fopenで開いたファイルがちゃんとfcloseで閉じているかは確認済みなのですが...

よろしくお願いします。
106デフォルトの名無しさん:04/09/11 19:18:04
107デフォルトの名無しさん:04/09/11 19:23:10
>103
placement newじゃ駄目なの?
108デフォルトの名無しさん:04/09/11 19:25:37
std::get_temporary_buffer
std::uninitialized_fill
109デフォルトの名無しさん:04/09/11 19:30:09
>>103
解決にはならないかもしれないが
http://www.s34.co.jp/cpptechdoc/reference/memory/index.html
110デフォルトの名無しさん:04/09/11 19:31:33
>>106
ありがとうございました。
プログラムのバグではないようなので安心しました。
111デフォルトの名無しさん:04/09/11 19:35:49
>>110
1000ファイル同時に開くなんて,ものすごいプログラムですね.
112デフォルトの名無しさん:04/09/11 19:39:17
スクリーン座標(x、y)をScreenToClientを使ってクライアント座標に変換するには
どのようにすればいいのですか?
113デフォルトの名無しさん:04/09/11 19:40:09
>>111
そうか?socketだと大量に使うぞ?
114デフォルトの名無しさん:04/09/11 19:41:16
115デフォルトの名無しさん:04/09/11 19:44:57
>>111
同時じゃないぞ。つーか、普通無理。
116デフォルトの名無しさん:04/09/11 19:46:49
>>114
90 名前:デフォルトの名無しさん[sage] 投稿日:04/09/11 09:01:48
POINT pos;
GetCursorPos(&pos);
ScreenToClient(hWnd, &pos);

のどこをどう変更したらいいのかわかりません
117デフォルトの名無しさん:04/09/11 19:49:59
>>111
同時じゃありません。
開いて閉じての繰り返しです。

118106,111:04/09/11 20:05:24
>>117
すみません.106はハズしてますね.
以下のコードでどうですか? 因みにうちのgcc 3.3.4 on Linux 2.4.26だと大丈夫です.
#include <stdio.h>
#include <stdlib.h>
const size_t SIZE = 100000;
int main () {
size_t i;
for (i = 0; i < SIZE; ++ i) {
FILE *f = fopen ("test.dat", "w");
if (f == NULL) {
printf ("0\n");
exit (1);
}
if (fclose (f) == EOF) {
printf ("1\n");
exit (1);
}
}
return 0;
}
119103:04/09/11 20:08:55
>>107
クラスのアロケートを複数の方法から、動的に選択したいという都合があって。
グローバルnewの中でフックさせるしかないかなぁ。。
void* (*alloc_func)(size_t size);
void* operator new(size_t size)
{
return (*alloc_func)(size);
}
void set_alloc_func(void* (*newfunc)())
{
alloc_func = newfunc;
}
こんな感じかね。

>>109
配列を使う場合に使えるのかな?見てみますーthx.
120デフォルトの名無しさん:04/09/11 20:11:55
>>116
真面目に言ってる?
まず POINT の意味を調べてみれ。
それで分からなかったら知らん。
121106,111:04/09/11 20:12:08
>>117
因みに
gcc 3.1 20020420 on Darwin Kernel Version 6.8
でもエラーは出ません.

ひょっとして閉め忘れてませんか?
122デフォルトの名無しさん:04/09/11 20:49:24
>>120
早速調べてみます
ありがとうございました
123デフォルトの名無しさん:04/09/11 21:11:40
>>121
サンプルプログラムありがとうございます。
問題なく動作しました。

やはりプログラムに問題がありそうですね。
閉じ忘れも確認しましたが、大丈夫だと思います。
データの書き出しは他の汎用ライブラリに任せているので、そのライブラリの問題かもしれませんが
まだ、きり分けができておりません。

とりあえず、テストファイルを開くだけのプログラムを作成してみます。
124デフォルトの名無しさん:04/09/11 21:12:21
例えば、

CHoge hage;
printf("%s\n", hage);

のように記述してCHogeクラス中で持っている文字列を
printf()に渡して表示させることって可能でせうか?
125124:04/09/11 21:14:11
キャストを使わないで記述したいです
126デフォルトの名無しさん:04/09/11 21:31:04
>>124
できません。
prinf("%s\n", hage.getStr());
のようにするのが通常です。
getStr()は内部で持っている文字列を返すメソッド
127デフォルトの名無しさん:04/09/11 21:31:32
>>124
class CHoge {
char *lpString;
};
lpString が CHoge の最初のメンバでなきゃだめだし、
他のクラスを継承していてもだめだ。
とてもじゃないがお勧めできない。

コンパイラにも依存する…?
128デフォルトの名無しさん:04/09/11 21:31:45
>>124
持っている文字列をかえす関数をCHogeに装備。
129124:04/09/11 21:35:03
va_listの仕組みを良く理解していないので、
...に渡した変数がどういう型として扱われるのかが判れば
operator定義でなんとかならんかなぁとか思ったんですが、
やっぱむりぽ?
130デフォルトの名無しさん:04/09/11 21:38:36
>>129
この場合は va_list の仕組みというより printf の仕組みでしょ。
%s だから文字列ポインタとみなす、という。
131デフォルトの名無しさん:04/09/11 21:40:35
>>124
こんなかんじ?

#include <stdio.h>

class CHoge {
public:
CHoge(){}
~CHoge(){}

void setStr(char* str) {
m_str = str;
}

char* getStr() {
return m_str;
}
private:
char* m_str;
};

int main(void) {
char* str = "test";
CHoge choge;

choge.setStr(str);
printf("%s", choge.getStr());
}
132124:04/09/11 21:43:40
そういう意味でただ動けばいいというのなら>>127で良さそうなんですが、
C++の仕様的に動作が保証できる方法が無いかとちと考えてた訳です。

でも、やっぱムリぽですね。
レスくれた皆様ありがとうございました。
133124:04/09/11 21:45:07
>>131
いえ、記述的に
printf("%s\n", hage);
だけで済むようにできないかと
134デフォルトの名無しさん:04/09/11 21:45:45
>>132
そういう要求のために iostream が設計されたんだろうけどな。
135124:04/09/11 21:49:27
例えば
class CHoge{
public:
operator char* (void) { return m_pStr; }

protected:
char* m_pStr; // 文字列を保持してるメンバ変数
};

とかしておくと
printf("%s", (char*) hage);
でいいわけです。

つうことはデフォルトのキャストが判ればそれをoperatorで定義しとけば...?
てなことを考えてた訳です。
136デフォルトの名無しさん:04/09/11 21:51:21
>>124
class CHoge {
char mFoo[10];
public:
operator char *() {return mFoo;}
CHoge(const char * foo) {strcpy(mFoo, foo);}
};
// というようにキャストオペレータを用意して、
int main()
{
CHoge hage("abc");
// たとえば、
printf("%s\n", strcat(hage, ""));
// とか
printf("%s\n", static_cast<char *>(hage));
// するのが関の山。
return 0;
}
137デフォルトの名無しさん:04/09/11 21:51:35
>>121

お恥ずかしながらプログラムのミスでした。
opendir()
に対応する
closedir()を書き忘れいたことが原因のようです。

勝手な推測ですが、FILEとDIRの型は内部的には同じものを使っていて、
>>106の問題に当たってしまったものの
エラーがfopenだったため、closedirに気付かなかったという流れだと思います。

いろいろありがとうございます。
138デフォルトの名無しさん:04/09/11 21:52:23
ふつうに行儀良く書けばいいのになぁ
139デフォルトの名無しさん:04/09/11 21:57:36
>>135
それやるくらいなら普通にやった方が自然だね
140106,111:04/09/11 22:00:23
>>123
落ちる前に止めてみてfstatなんかで開いているファイル数確認してみてはどうでしょ?
141106,111:04/09/11 22:03:07
>>137
リロード怠ってました.失礼しました.
142デフォルトの名無しさん:04/09/11 22:18:21
>>141
ありがとうございます。
fstatやっていれば、もっと早く分かっていたっぽいですね。

ディレクトリを再帰で開いているところがあり、まだ問題が残って
いる可能性が高そうなので、一度確認してみます。
143デフォルトの名無しさん:04/09/12 01:21:55
sizeof(array)で配列のサイズが分かるのは何故なんでしょうか。
array配列の先頭ポインタを渡してるだけなのに。
例えば
int ReturnArraySize(int* array){
int size=sizeof(array)/sizeof(array[0]);
return size;
}
では、配列の要素数を返してくれないのは納得できるのですが...
ちなみにスコープ内で配列サイズが分かるということで合ってます?
144デフォルトの名無しさん:04/09/12 01:24:17
先頭ポインタ > &array

arrayはポインタと同じように使えるだけ。
145デフォルトの名無しさん:04/09/12 01:27:38
>>143
「コンパイラが コンパイルする時」は、その配列が確保したサイズはわかってるよね。
よく観察してみよう
146デフォルトの名無しさん:04/09/12 01:47:07
>>143
多分それ常に1が返ると思うぞ。
147143:04/09/12 01:51:02
つまり、スコープ内ではアドレスとして渡しているわけではなく
sizeof(array)はその配列全体サイズを返すという配列特有の
処理を施しているという事でしょうか。
スコープ外では必然的にポインタとして渡す事になるから...umm
148デフォルトの名無しさん:04/09/12 01:52:09
>>147
sizeofを関数だとでも勘違いしてないか?
149デフォルトの名無しさん:04/09/12 01:56:23
>>147
int a[100];//aが100ってわかってる
size = sizeof(a);//コンパイル時に size = 100;になる
size = sizeof(a[0]);//コンパイル時にintのサイズになる
150デフォルトの名無しさん:04/09/12 01:58:01
int a[100];
int* p = a;

size = sizeof(p); // pのサイズ==int*のサイズ==4になる
151デフォルトの名無しさん:04/09/12 02:00:15
実装者の裁量に任されてる
4とは限らない
152デフォルトの名無しさん:04/09/12 02:02:06
>>151
こういう場合はそういうつっこみはしない方がいいと思う。
>>143が混乱しそう
153デフォルトの名無しさん:04/09/12 02:03:48
>>152
そうかなあ、>149はちゃんと正しく書いてるのに。
int*が4と覚えられたらまずいと思うな。
154デフォルトの名無しさん:04/09/12 02:06:44
>>153
正しくないよ。

>size = sizeof(a);//コンパイル時に size = 100;になる
size = intのサイズ*100になる
155デフォルトの名無しさん:04/09/12 02:07:26
>>154
ほんとだ
156143:04/09/12 02:10:08
「静的次元配列に sizeof を使うと、配列全体のサイズを返します」
C解説サイトに書いてました。なんとなく腑に落ちたような。
int*が4とは限らないというのは一応知っているつもりですが。いちおう...
>>148
確かにそういう風に思ってたかも。でも、演算子ってなんなんだ
って逆に思ってしまった。なんだか、キリがないですね。すみません。
157デフォルトの名無しさん:04/09/12 02:17:56
アドレスからサイズを求めているのではなく、その変数の型情報からサイズを求めている
という感じかな?
だから

>int a[100];
>int* p = a;
>size = sizeof(p);

sizeof(p)はsizeof(a)ではなくsizeof(int*)と同じになる。
158デフォルトの名無しさん:04/09/12 07:08:05
配列とポインタを混同するな。
int a[100], *p; とあったとき、aとpは全然別物。
似たような使い方ができるだけであって、特別に何かをしているわけじゃない。
fooクラスをhogeクラスのメンバ(コンポジション)として使いたい時、

class hoge
{
private:
 int i;
 int j;
 foo myfoo(i,j);//エラー
public:
 hoge();
};

hoge::hoge()
{
 i=100;
 j=200;
}

のように、hogeオブジェクト生成時にそのメンバ変数を引数として
fooオブジェクトを作成することはできないのでしょうか。
上のような書き方ではエラーでコンパイルできませんでした。
引数を取らずにfoo myfoo();と定義すれば
うまくいくようなのですが、これでは別の場所でhogeのi,j値を
渡さないといけないので面倒くさいしなんかかっこ悪いです。
ですがそうしないといけないものなのでしょうか。
160デフォルトの名無しさん:04/09/12 09:11:00
ほげ::ほげ():i(100),j(200),まいふー(i,j){}
161デフォルトの名無しさん:04/09/12 09:11:32
age
162デフォルトの名無しさん:04/09/12 09:15:43
>>159
foo myfoo(); では、foo型のオブジェクトを返すmyfooという名前の関数の
宣言になってしまう。
163159:04/09/12 09:23:53
>>160
なんか見たことの無い書き方で
何がどうなってるのか分からないんですが
普通に整形したらどういう感じになるんでしょうか…
164デフォルトの名無しさん:04/09/12 09:36:41
>>163
constructorでのmember/base classの初期化構文。
165デフォルトの名無しさん:04/09/12 09:50:00
#include <iostream>

class foo {
 double i, j;
public:
 foo(double x = 0, double y = 0) : i(x), j(y) {}
 void printfoo() const { std::cout << std::fixed << i << ", " << j << std::endl; }
};

class hoge {
 int i;
 int j;
 foo myfoo;
public:
 hoge(int x = 100, int y = 100) : i(x), j(y), myfoo(i, j) {}
 void printfoo() { myfoo.printfoo(); }
};

int main()
{
 hoge h;
 h.printfoo();
}
166159:04/09/12 10:35:03
>>165
ありがとうございます。
度々申し訳ないのですが、↓のような感じの書き方はできないんでしょうか?
慣れてないものでシンプルな書き方じゃないとよく分からないのです。
試したらエラーがでましたが、>>165とは意味が違ってきてしまうのでしょうか。

class hoge{
private:
 int i;
 int j;
 foo myfoo;
bublic:
 hoge();
}

hoge::hoge()
{
 i=100;
 j=200
 myfoo(i,j);
{
167デフォルトの名無しさん:04/09/12 10:52:58
>>166
意味が違うからエラーが出るに決まってんじゃン。

>>165が正しい書き方なのでこれを理解して覚えること。
メンバの初期化に引数つきコンストラクタを呼ぶにはこうするしかない。
メンバ初期設定リストで調べてみ。
168デフォルトの名無しさん:04/09/12 10:53:56
少しは自分で調べろよ
検索語句も示されてるのに
知障か?
169デフォルトの名無しさん:04/09/12 11:01:53
>>166
何度もいいますようにmyfoo(i, j);というのは関数の呼び出しです。コンストラクタの
呼び出しではありません。そしてmyfoo(int, int)という関数が宣言されていないので
エラーになるのだと思います。

どうしても初期化リストではなくコンストラクタ内からコンストラクタを呼び出すので
あれば、newの配置構文(placement-new)を使うか、単純にfoo型の一時オブジェクト
を作って代入してやればよいです。

class hoge {
int i;
int j;
foo myfoo;
public:
hoge() {
i = 100;
j = 200;
  myfoo = foo(i, j); //foo型の一時変数を代入
// new (&myfoo) foo(i, j); //こちらでもよい
}
void printfoo() const { myfoo.printfoo(); }
};
170デフォルトの名無しさん:04/09/12 11:19:59
初めまして、学校の課題で摂氏を華氏に直すプログラムをC++で作ってるのですが
どうもうまくいかなくて行き詰ってしまったので助けてください><
#include<iostream>

using namespace std;

void CalcTemp(float, float,float&);

int main()
{
float tempCel,
float tempFahr,

CalcTemp(tempCel);

cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << "tempCel Celcius Degree = tempFahr Degree Fahrenheit ";


return 0;
}
void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
171デフォルトの名無しさん:04/09/12 11:24:56
>>170
void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
じゃなくて、
void CalcTemp(float* tempCel)
{
tempFahr = 9/5 * tempCel + 32 ;
}

CalcTemp(tempCel);
じゃなくて、
CalcTemp(&tempCel);
172デフォルトの名無しさん:04/09/12 11:34:33
#include<iostream>

using namespace std;

float CalcTemp( float );

int main()
{
float tempCel;
float tempFahr;

tempFahr = CalcTemp( tempCel );

cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";


return 0;
}

float CalcTemp(float tempCel)
{
return 9/5 * tempCel + 32 ;
}
173デフォルトの名無しさん:04/09/12 11:37:31
void Fahr911() { for(;;) puts( "NO MORE BUSH!" ); }
174デフォルトの名無しさん:04/09/12 11:55:39
>>171さん
>>172さん
レスありがとうございます。起動までこぎつけることができました。感謝感激です!
ただ、実際に数字を入れてみると-1.07e+008みたいな感じになってしまいます。
これはどうしたら直せますか?ご教授お願いします。
175デフォルトの名無しさん:04/09/12 12:03:09
std::setiosflags( std::ios::showpoint )
std::setiosflags( std::ios::fixed )
176デフォルトの名無しさん:04/09/12 12:15:21
>>174
ソースをもっとよく見直せ。いったい何を計算してるんだ?
cinから貰ったtempCel の値で tempFahr を求めるんだろうが。
177デフォルトの名無しさん:04/09/12 12:31:41
>>176さん
レスありがとうございます。
float CalcTemp(float&);
float CalcTemp(float& tempCel)
に変えてみたのですが同じような結果になってしまいました。
根本的に勘違いしてるところがあると思うのでもしよろしければ
教えて頂けませんか?
178デフォルトの名無しさん:04/09/12 12:38:00
>>177
cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
tempFahr = CalcTemp( tempCel );
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";
179デフォルトの名無しさん:04/09/12 12:40:08
>>169
> // new (&myfoo) foo(i, j); //こちらでもよい

よくねーよ。
180デフォルトの名無しさん:04/09/12 12:53:09
>>179
理由は?
181デフォルトの名無しさん:04/09/12 13:01:46
>>178さん
ありがとうございます!!できました。
つまりcinで数値を入れた後に計算するようになってなかったのが
原因と理解しましたが合ってますか?
182デフォルトの名無しさん:04/09/12 13:03:59
>>179
お前もしかしてplacement new構文を知らないんじゃないか?
もう一度よく勉強してみろ。
183デフォルトの名無しさん:04/09/12 13:04:16
>>180
すでにデフォルトコンストラクタで構築されたmyfooが解体されずに
新たに配置newでコンストラクトしてる。
だと思う。
184デフォルトの名無しさん:04/09/12 13:05:38
>>183
それはおかしい。myfooのデフォルトコンストラクタはいつ呼ばれているというんだ。
185デフォルトの名無しさん:04/09/12 13:07:23
>>184
hogeのコンストラクタが呼ばれる前だよ。
あるクラスのコンストラクタが呼ばれるときには、基底クラス・メンバの構築は完了してる。
186デフォルトの名無しさん:04/09/12 13:16:07
>>185
これやってみ。aがデフォルトコンストラクタで構築された後、解体されずにまた構築されるから。

struct A {
A() { cout << "A::A()" << endl; }
A(int) { cout << "A::A(int)" << endl; }
~A() { cout << "A::~A()" << endl; }
};

struct B {
A a;
B(int i) {
cout << "B::B()" << endl;
new(&a) A(i);
}
};

B b(10);
187186:04/09/12 13:17:29
× >>185
>>184
アンカー間違えた。
188179:04/09/12 13:26:32
>>183,>>185,>>186 フォロー感謝。
189デフォルトの名無しさん:04/09/12 14:07:45
(部分特別化の出来ない)VC6で使えるdelegateクラス誰か作ってください
190デフォルトの名無しさん:04/09/12 14:11:52
>>189 boost::function はダメだったっけ?
191デフォルトの名無しさん:04/09/12 14:12:05
>>189
いくらで買ってくれますか?
192デフォルトの名無しさん:04/09/12 14:39:47
>>190
function1とかfunction2と明示してやんないとダメみたいです。
193デフォルトの名無しさん:04/09/12 14:43:24
>>192
それは「使える」に入らないのか?
194デフォルトの名無しさん:04/09/12 15:32:23
>>193
入らない。
struct C{
 template<class T>
 void apply(boost::function<T> fn){ fn(); } };
3行で書けるものがfunctionの引数に応じたapplyのオーバーロードを書かなあかん。
それによって悪い悪臭を放つ。
195デフォルトの名無しさん:04/09/12 15:35:04
>>194
delegateとして使うなら引数の型と個数は静的に決定されてるんだから
そんな屁理屈が出てこないはずなんだが。 
196164:04/09/12 17:09:22
スルーかよ。アフォが。
197194:04/09/12 17:20:13
うっ。悔しいがあんたが大将さ。
漏れはおととい出直してくるわ。
198デフォルトの名無しさん:04/09/13 02:03:26
freadで読み込んだバイナリデータを
アスキーに変換csvに出力するにはどうしたらいいでしょうか?

199デフォルトの名無しさん:04/09/13 02:05:11
>>198
そんな仕様書じゃ作れません
200デフォルトの名無しさん:04/09/13 03:13:42
それはしようがないね
201デフォルトの名無しさん:04/09/13 05:12:38
”a=1かつb=2でないなら”

”!((a==1)&(b==2))”
でいいのでしょうか?
202デフォルトの名無しさん:04/09/13 05:16:01
>>201
いいえ。駄目です。
203デフォルトの名無しさん:04/09/13 05:16:45
>>201 曖昧。
204デフォルトの名無しさん:04/09/13 05:23:25
>>202
>>203
どうすればいいのでしょうか?
205デフォルトの名無しさん:04/09/13 05:26:00
>>204
!((a == 1) && (b == 2))
(a == 1) && (b != 2)
ご注文はどっち?
206デフォルトの名無しさん:04/09/13 05:29:33
>>205
!((a == 1) && (b == 2)) の方でした
&が二ついるんですねw
ありがとうございました
207デフォルトの名無しさん:04/09/13 07:55:04
ファイルの特定のアドレスにある情報を調べるにはどうすればいいのでしょうか?
例えば、ファイルの先頭から12 byte目の情報を調べたい時です
208デフォルトの名無しさん:04/09/13 07:56:57
>>207 open → seek → get
209デフォルトの名無しさん:04/09/13 08:24:24
>>208
レスありがとうございます
seekについて調べてみたのですが使い方が載っていませんでした
よろしければ使い方も教えてください
210 ◆FIcNi4f8js :04/09/13 08:30:16
載っていない訳がない
211デフォルトの名無しさん:04/09/13 08:43:15
>>210
「seek ファイル」で検索してみたのですがCのseekについては見つかりませんでした
212デフォルトの名無しさん:04/09/13 08:49:10
fseek
213デフォルトの名無しさん:04/09/13 08:58:33
>>212
fseekでヒットしました
これから読んできます

ありがとうございました
214フフフ:04/09/13 10:23:38
BorlandC++5,5をインストールし、DirectX9 SDKをインストールし、
コマンドラインからDirectXのサンプルプログラムをコンパイル
したのですがコンパイルエラーが出てしまいます。

リンカの設定をしないとダメだと聞いたので
bcc.cfgファイルに
-I"C:\DX90SDK\Include"
-L"C:\DX90SDK\Lib"
ilink32.cfgファイルに
-L"C:\DX90SDK\Lib"

と追加したのですが
Fatal: オプションが必要 :LC:\DX90SDK\Lib
と、コンパイルエラーが出てしまいます。
どうしたらいいのか教えてください。

215デフォルトの名無しさん:04/09/13 14:08:59
>>214 こっち
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50
216デフォルトの名無しさん:04/09/13 14:39:21
37のn乗{n=1,2,3,…}を計算する時、下3桁が示すパターン周期を求めよ。って問題があるんですが
どうすれば下3桁だけを比較できるのか全く検討がつきません。

どうすればいいか教えてくださいお願いします。
217デフォルトの名無しさん:04/09/13 14:47:41
>>216
long long int x;
x = 100100;
として
下三桁は x - x / 1000
218デフォルトの名無しさん:04/09/13 14:49:04
下三桁は x % 1000
219デフォルトの名無しさん:04/09/13 14:49:49
>>217


long long int tmp;
も宣言

tmp = x / 1000;
x - x * 1000;
220216:04/09/13 15:52:37
即レスありがとうございます。
がんばってみます。
221デフォルトの名無しさん:04/09/15 00:25:15
整数値の有効桁数を高速に求めるアルゴリズムってありますか?
何も考えないで書くとこんなのになるんですが・・・。

int x = 0x80000000;
int count = 0;
while (x) {
x >>= 1;
count++;
}
222デフォルトの名無しさん:04/09/15 00:48:15
桁数ってビット数?
int count = sizeof(int)<<3;
それとも最大整数値?
int count = ~(1<<((sizeof(int)<<3)-1));

int型って32bitCPUと64bitCPUで有効桁数変わったっけ?(うろ覚え
223デフォルトの名無しさん:04/09/15 00:49:10
対数とるんじゃ駄目?
224デフォルトの名無しさん:04/09/15 00:50:21
>>222
>>221のプログラムも見ずに聞き返すなよ
225デフォルトの名無しさん:04/09/15 00:51:14
>>221
sizeof(int)*8
226デフォルトの名無しさん:04/09/15 00:58:19
sizeof(int) * CHAR_BITS
だな
227221:04/09/15 01:04:42
すみません、文章がわかりにくかったですね。
>>221で言った有効桁数ってこういう意味でいっていました。
整数値 = 桁数
0x00000001 = 1
0x00000002 = 2
0x00000004 = 3
0x00000008 = 4
0x00000010 = 5
・・・
0x80000000 = 32
ようは立っているビットの最上位ビットの位置のことです。
言葉の使い方がわるかったです、スミマセン。
228デフォルトの名無しさん:04/09/15 02:17:27
229デフォルトの名無しさん:04/09/15 05:30:19
インラインアセンブリで BSR 命令を使うとか
230デフォルトの名無しさん:04/09/15 05:45:56
#include <stdio.h>

int log2(int arg)
{
int r;
__asm {
mov eax, -1;
bsr eax, arg;
inc eax
mov r, eax;
}

return r;
}

int main()
{
int testvalues[] = { 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010 };
int i, max = sizeof(testvalues) / sizeof(int);
for(i = 0; i < max; i++)
{
printf("%08X = %d\n", testvalues[i], log2(testvalues[i]));
}
getchar();
return 0;
}
231デフォルトの名無しさん:04/09/15 15:29:16
C言語で配列の個数の調べ方をおしえてください。
こんな感じの場合の配列aの個数です。

int i;
int a[] = {1,2,3,4};

for(i=0;i<aの配列の個数;i++){
}
232デフォルトの名無しさん:04/09/15 15:52:15
>>231
#include<stdio.h>
main(){
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)/4);
return 0;
}
233デフォルトの名無しさん:04/09/15 16:01:02
4ってのはどこからやってきたのだろうか
234デフォルトの名無しさん:04/09/15 16:01:40
int は4byteだから。
235デフォルトの名無しさん:04/09/15 16:10:08
>>234
あほか。アホか。阿呆か。
236デフォルトの名無しさん:04/09/15 16:12:22
sizeof (a)/sizeof(a[0])
237デフォルトの名無しさん:04/09/15 16:16:04
そういやどっかで
#define NUMOF( array ) ( sizeof( ( array ) ) / sizeof( ( array[ 0 ] ) ) )
なんていう糞マクロ見たっけなあ
238231:04/09/15 16:26:22
>>232-237
Σ(゚Д゚;≡;゚д゚)
どれが一番ポピュラーな方法なんでしょうか??
こんな感じですか??

int i;
nt a[] = {1,2,3,4};
int size = sizeof (a)/sizeof(a[0]);
for(i=0;i<size;i++){
}
239デフォルトの名無しさん:04/09/15 16:28:54
そうだよ
240デフォルトの名無しさん:04/09/15 16:34:46
>>237
有名なマクロだよ。
Cでは良く使われるし糞とは言えない。
C++だったらテンプレートでやるべきだけど。
241デフォルトの名無しさん:04/09/15 16:36:10
要素数を得るためのテンプレートなんてトリッキーすぎて
「べき」なんて言えないよ。
242デフォルトの名無しさん:04/09/15 16:41:51
どっちにしろ >>237 はエラーになる
243デフォルトの名無しさん:04/09/15 16:45:45
(sizeof(array)/sizeof(array)[0])
とかそういう話?
244デフォルトの名無しさん:04/09/15 16:53:08
>>243 (^Д^) キャハハ何言ってんのこいつ
245デフォルトの名無しさん:04/09/15 17:17:22
246デフォルトの名無しさん:04/09/15 17:24:34
>>231はC言語で、といってるが。
テンプレートの話はひとまず置いておいたほうが混乱させなくてよいとおもうぞ。
インタプリンタ系言語だと、a.countとかa.indexみたいな感じで配列の要素数一発で調べられたりするからね。
初心者さんにはつまずきやすいところではあるな。
247デフォルトの名無しさん:04/09/15 17:28:27
>>246
お前のレスのほうがよっぽど混乱させる文だな
248デフォルトの名無しさん:04/09/15 17:35:21
>>245
それは私が別スレで取り上げたのと同じやつ^^;
249デフォルトの名無しさん:04/09/15 17:46:52
でも、マクロはいろいろ取り扱いが危険なので、なるべく使うべきでは無いと思うよ。
マクロは結局単なる置き換えに過ぎないし、コンパイラの機能ではないから、
マクロでエラーが発生したときにエラーメッセージからどこが問題かを判断し
にくいということがある。
良くある間違いは置き換えであることを忘れて-つまり関数と勘違いして-
マクロを書いてしまうと括弧を付け忘れたりして予想もしない計算結果になること
もある。

具体的にどうすれば良いかと言うと、配列の要素数を求める計算自体は
それほど複雑でもないので、
o 配列を宣言したすぐ後で要素数を入れる変数を用意しておくか、
o その場その場でsizeof(array)/sizeof(array[0])を実行するか、
した方が良いと思う。
250デフォルトの名無しさん:04/09/15 18:07:25
マクロの中身を括弧でくくっておくのは普通にやる事じゃなかったのか?
そうすりゃ計算結果が狂うなんてまずないし。
251デフォルトの名無しさん:04/09/15 18:10:13
そういう問題じゃないだろ。
汎用マクロにしたら配列とポインタを混同してしまう危険があるだろ。
ポインタで渡してもエラーにならないし。
252デフォルトの名無しさん:04/09/15 18:11:59
有名なのだと
#define max(n, m) (n > m ? n : m)
c=max(++a, ++b);
みたいなのだな。numofマクロならそんな事はないだろうけど。
253デフォルトの名無しさん:04/09/15 18:12:59
テンプレートはconstantな要素数取れたっけ?
254デフォルトの名無しさん:04/09/15 18:14:04
>>252
そういう問題じゃないと何度(ry
255デフォルトの名無しさん:04/09/15 18:15:18
#define max(n, m) (n > m ? n : m) ×
#define max(n,m) (n > m ? n : m) ○

こんな初歩的ミス犯すような奴にマクロなど使えんわっ
256デフォルトの名無しさん:04/09/15 19:03:33
?
257デフォルトの名無しさん:04/09/15 19:04:32
>>255
そういう問題じゃないと何度(ry
258デフォルトの名無しさん:04/09/15 19:06:16
>>257
あれが問題ではないとでもいうのかな?
259231:04/09/15 19:49:56
けっこういろいろ流儀があるようですね。
当面、>>249さんのいわれるように、
その場その場でsizeof(array)/sizeof(array[0])を実行する
でやってこうとおもいます。

みなさま、どうもありがとうございました。
260デフォルトの名無しさん:04/09/15 19:53:59
>>259
鵜呑みにするな!
261デフォルトの名無しさん:04/09/15 20:45:13
その場その場でやるのが面倒だという考えからサブルーチンが生まれ、関数、マクロが生まれた……はず。
262デフォルトの名無しさん:04/09/15 20:54:25
>>261
でも、なれていない人がやるとバグの温床にならないかな
263デフォルトの名無しさん:04/09/15 21:09:36
マクロは、
どうしてもマクロじゃないと出来ない!
マクロで書いた方がスッキリ!
な時以外使わないなあ
264231:04/09/15 21:17:31
>>259
え?これじゃまずいんですか?(゚д゚lll)

うぅ、わからん...
265デフォルトの名無しさん:04/09/15 22:35:33
>>264
マクロは型情報などお構いなしだとかいった点で、
バグを追跡しにくくなるってのは昔から言われてることではあるけど、
その規模のマクロで追跡を困難にするほどの力はないと思う。
少なくとも「毎回書く」よりはマクロの方が上等な解決。
エラーメッセージが見やすいとかよりはまずソースの見易さを考えるべきで、
そのためには処理に名前をつけるってのは基本的なことがら。
というわけで私はマクロ賛成派。

結局は自分がやりやすいほうを選べばいい。どちらにもメリット・デメリットはある。
>>231氏はソース中に
sizeof(array)/sizeof(array[0])
と書かれてるのと
NUMOF( array )
と書かれているのとどっちが見やすいと思う?
266デフォルトの名無しさん:04/09/15 23:19:25
でも、もしC++を使える環境なら、インラインやテンプレートを使う方がお薦めできるけれどね
267265:04/09/15 23:52:51
>>266
そりゃそ〜だ。
普段Cしか使わないからC++のこと忘れてた。
268デフォルトの名無しさん:04/09/16 01:27:53
>>265
どう考えても、sizeof(array)/sizeof(array[0]) のままの方がいいでしょ。
269デフォルトの名無しさん:04/09/16 01:32:22
>268
どう考えてもって・・・発想力弱いんじゃ?
270デフォルトの名無しさん:04/09/16 01:55:40
関数にポインタ渡す代わりに参照演算子(&)使えば、
配列サイズの計算できるんだ...なるほど
C言語だったらどうすればいいんだろ
271デフォルトの名無しさん:04/09/16 02:05:07
>>270
できないでしょ(w
「配列」から「配列へのポインタ」に変数が変更されたりしたら、もうお手上げ。
コンパイルエラーが得られないのは相変わらず。

>>269
sizeof(a[])/sizeo(a[0])は、見るからに怪しいので、
メンテナンス時には誰もが注意を払ってくれる。
発想が弱いのは君だろ?認めろよ。
272271:04/09/16 02:12:51
帝政

sizeof(a[])/sizeo(a[0])

sizeof(a)/sizeo(a[0])
273デフォルトの名無しさん:04/09/16 02:43:37
>271
俺はケースバイケースだと思うんだけど。
274デフォルトの名無しさん:04/09/16 05:52:40
>>271
> sizeof(a[])/sizeo(a[0])は、見るからに怪しいので、
> メンテナンス時には誰もが注意を払ってくれる。
なんだ、「どう考えても」って、こんなのを考えただけのことなのか。
275デフォルトの名無しさん:04/09/16 07:47:24
すいません
構造体について教えてほしいのですが
struct render{
int a;
int b;
char c[32]
};
render rend={64,128,"まぐろ"};
はできるのに
render rend[128];

rend[0]={64,128,"まぐろ"};
と初期化以外でするとエラー吐きますよね。
初期化以外で関数事態を一括で代入する方法を知りたいのですが
知識をご教授お願いします。
276デフォルトの名無しさん:04/09/16 08:29:10
関数?
277デフォルトの名無しさん:04/09/16 08:57:38
>>275
関数でなくて構造体でしょ?Cには無いっぽい。
関数で強引にやる方法はあるが。

int main(void)
{
 ・・・
 rend[0] = InputRender(64, 128, "まぐろ");
 printf("%d %d %s\n", rend[0].a, rand[0],b, rand[0].c);
 ・・・
}

render InputRender(int a, int b, int c[32])
{
 render rend;

 rend.a = a;
 rend.b = b;
 strcpy(rend.c, c);

 return rend;
}
278デフォルトの名無しさん:04/09/16 08:57:56
>>275

struct render {
int a;
int b;
char c[32];
void set(int va, int vb, char * vc) {a = va; b = vb; sprintf(c, "%.31s", vc);}
};

render rend[128];
rend[0].set(64, 128, "まぐろ");
rend[1].set(32, 64, "はまち");
279デフォルトの名無しさん:04/09/16 08:59:31
ちっ、はまち書いてたら負けた
280275:04/09/16 10:05:31
できましたです。

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

    ちまき…(・∀・)イイ!!
281デフォルトの名無しさん:04/09/16 22:15:59
Cではコンパウンドリテラルを使うのが一般的だろうけど、
文字列はstrcpyでもつかわないと仕方ないな。
282デフォルトの名無しさん:04/09/17 20:21:38
構造体配列を丸々引数として参照型で自作関数に渡したいのですが、中々上手く行きません。
下の例で言えば、*に当たる部分でしばらく悩んでいます。
初心者故に初歩的な質問ですみませんが、どうか宜しくお願いします。

例(変数・関数名、型宣言は適当)
int CountNum( * );
struct NUMDATA { int data1, data2, ・・・(略) }
void main(){
    NUMDATA numdata[DATA_MAX] = { 10, 20,・・・(以後略)
    CountNum( * ); ←ここで「numdata[DATA_MAX]」の要素全てをまとめて渡したい
    ・・・(略)
}
int CountNum( * )
{
    ・・・(略)
}
283デフォルトの名無しさん:04/09/17 22:05:20
>>282
先頭ポインタと要素数を渡すようにしたらええやん。
int CountNum(NUMDATA* p, int length)
284デフォルトの名無しさん:04/09/17 22:11:48
そこはふつーvectorだろ?
285デフォルトの名無しさん:04/09/17 22:57:37
>>282
非現実的
template<unsigned N> int CountNum(NUMDATA(& hoge)[N]);
286デフォルトの名無しさん:04/09/18 22:01:16
初期化処理(環境設定ファイル読み込み処理)
環境設定処理を読み込み、環境設定情報を環境設定情報管理テーブルに
保持するとはどーゆーことですか?
プログラムを作る実習で初期化設定のモジュール作成
の担当になったのですが、何を作ればいいのかわからず、
困っています。

287デフォルトの名無しさん:04/09/18 22:04:11
>>286
実行環境は?Linux?Windows?MacOSX?設定内容は?
288デフォルトの名無しさん:04/09/18 22:04:38
Linuxです。
289デフォルトの名無しさん:04/09/18 22:05:30
すいせん。設定内容ってなんですか?
290デフォルトの名無しさん:04/09/18 22:07:13
>>288
そのプログラムではどんな初期化・設定が必要?
それがわからないと話にならないよ
291デフォルトの名無しさん:04/09/18 22:10:42
widestudioっては良いんですか?
292デフォルトの名無しさん:04/09/18 22:12:40
環境設定処理を読み込み、環境設定情報を環境設定情報管理テーブルに
保持する。
環境設定のフォーマットはあるんですが…

勤怠のプログラムを作ります
293デフォルトの名無しさん:04/09/18 22:14:19
>>291
超漢字ユーザにはお薦めできるけど。
WindowsやLinuxなら他にもっといいものがある。
294デフォルトの名無しさん:04/09/18 22:23:13
>>292
聞いていることとは違うんだけど、もういいわ。
例えば、
------------------------
key0=value0
key1=value1
key2=value2
------------------------
というような設定ファイルだとしたら、
これを一行ずつ読み込んで、1行目ではkey0,=,value0の様に部分部分に分けて、
(key0,value0),(key1,value1),(key2,value2)
というペアで
struct {
char* key;
int value;
};
のような構造体などに保存するということではないかな。
295デフォルトの名無しさん:04/09/18 22:34:55
てか、宿題スレに逝け。
296デフォルトの名無しさん:04/09/18 22:38:45
>>294
ありがとうございます.
今一度仕様を読んだのですが、理解できず、
何からはじめたらいいのかもわからず、
講師にも聞いちゃいけないのでどーすることもできずに
止まってしまってます…
297デフォルトの名無しさん:04/09/18 22:41:03
そうやって俺をイラつかせて、何をしたいんだ。
俺に恨みでもあるのか。それとも人をからかうのが好きなのか。
どちらにしても、お前は悪意をもって人を傷つけようとした。
こういう事はこれで最後にしろ。
298デフォルトの名無しさん:04/09/18 22:49:41
どーもすいませんでした

移動します。
299デフォルトの名無しさん:04/09/18 23:06:57
key0=value0
key1=value1
key2=value2
って変数ですか?
300デフォルトの名無しさん:04/09/18 23:10:19
300get
301デフォルトの名無しさん:04/09/18 23:26:10
>>299
設定ファイルに書かれているテキスト。
302デフォルトの名無しさん:04/09/18 23:47:42
>プログラムを作る実習で初期化設定のモジュール作成
>の担当になったのですが、

「もっと基本的な段階でまったく勉強せず、複数人での共同制作の段階になって
慌てて調べようとしたが、基礎が完全に抜け落ちていては何をどう調べたらよいの
か全く解らない」
ということでしょうか
303デフォルトの名無しさん:04/09/19 00:19:33
出てったやつを呼び戻すなよ。
304デフォルトの名無しさん:04/09/19 01:42:44
>>302
まさしくその通りでございます
305デフォルトの名無しさん:04/09/19 03:47:03
__FILE__とか__LINE__みたいな感じで関数名が取れるディレクティブ(orそれに変わるもの)
って無いでしょうか?ログ出力の際に関数名を出力したいので。
一応コンパイラはVC++6.0でお願いします。プラグマでもかまいません。
よろしくお願いします。

#でもプリプロセッサだから関数まで分らないだろうなぁ。。
306デフォルトの名無しさん:04/09/19 03:56:09
>>305
BOOST_CURRENT_FUNCTION
307306:04/09/19 03:59:08
ソースみたらVCには対応してないみたい
308デフォルトの名無しさん:04/09/19 04:02:25
プリプロセッサ自分で作ればいい
309デフォルトの名無しさん:04/09/19 04:02:38
>>306
ありがとうございます。
VC以外で機会があったら使ってみます。

310デフォルトの名無しさん:04/09/19 04:06:27
>>305
http://seclan.dll.jp/c99d/c99d07.htm#dt19990516
ただし今のVCでは無理だという罠。
311デフォルトの名無しさん:04/09/19 04:12:20
ありがとうございます。自分でその都度#defineすることにします。
312デフォルトの名無しさん:04/09/19 04:19:17
>>311
やめとけ。今は、__FILE__と__LINE__で忍耐しとくべきだ。
せっかく作った機能も、いずれコンパイラの対応で必要なくなってしまう。
313デフォルトの名無しさん:04/09/19 04:36:31
2005 Beta でも出来なかったけど、一体いつ対応するのやら
314デフォルトの名無しさん:04/09/19 04:42:11
いらないし。
315デフォルトの名無しさん:04/09/19 04:43:22
たのむから仕様変更はまとめてやってくれない?
316デフォルトの名無しさん:04/09/19 12:09:39
>>311
ファイル名と行番号で出力しておき、外部ツールで関数名に展開すればいいんでない?
317デフォルトの名無しさん:04/09/19 12:14:38
>>316
それが一番、影響小・低開発コストだね。
318デフォルトの名無しさん:04/09/20 01:19:19
C++学習中です。
boost::lambdaに関する質問があります。
list<メンバ関数・変数を持つオブジェクト>から、
特定の値にマッチする要素を取り出したい場合に、
(特定の値を持っている要素が複数存在することはありません)

return find_if(list.begin(),list.end(),(_1.data()==param));

としたいのですが、コンパイルエラーが以下の用に発生してしまします。

c:\~~~.cpp(13): error C2039: 'data()' : 'boost::lambda::lambda_functor<T>' のメンバではありません。
with
[
T=boost::lambda::placeholder<1>
]

そもそも、_1.data()という使い方はできないのでしょうか?
よろしくお願いします。
319デフォルトの名無しさん:04/09/20 01:39:16
いcう
320デフォルトの名無しさん:04/09/20 01:53:13
int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?
321318:04/09/20 02:00:17
int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?

int c=0;
>>320
こうでしょうか?
for(int i=0; i<sizeof(a); i++)
for(int j=0; j<sizeof(b); j++)
if (a[i]==b[j]) c++;
322318:04/09/20 02:01:10
すいません、なんか、アレでした・・
>>320
>int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?

int c=0;
for(int i=0; i<sizeof(a); i++)
for(int j=0; j<sizeof(b); j++)
if (a[i]==b[j]) c++;
323320:04/09/20 02:07:12
なんかfor文使わずに一行でできませんでしたっけ?
324デフォルトの名無しさん:04/09/20 02:11:04
memcmp()だね
325318:04/09/20 02:11:19
そうなんですか?
boost配列なら出来そうですけど、それ以外の方法で可能なら、漏れも知りたいです。
326デフォルトの名無しさん:04/09/20 02:13:40
>>324
memcmpは一致か不一致かしか判定できない罠
327318:04/09/20 02:15:57
>>324
一致個数とか、a[1]==4 と b[2]==4 の一致が検出でき
すいません、横槍でした
328320:04/09/20 02:18:23
うーん、できたような気がしたけど勘違いだったかな。
素直にfor文でやります。すいません。
329デフォルトの名無しさん:04/09/20 02:20:55
>>318 boost::lambda::bind
330318:04/09/20 02:48:32
>>329
ありがとうございます
bool compare(const obj& x,const obj& y)
{
return (x.data()==y.data());
}

obj V("hoge");
find_if(list.begin(),list.end(),bind(&compare,_1,V);

って感じですか?
やってみます.....
331デフォルトの名無しさん:04/09/20 03:17:55
C言語学習中の者です。
Windows系のCではconio.hをincludeしてgetch()関数を使用できるのですが、
UNIX系(私の場合はCygwinです)ではcurses.hをinclueしてgetch()を使用できる
ということでソースを書いてみましたが、コンパイルは通るのですが実行すると
「何かキーを押す。」まで表示された後
「Segmentation fault (core dumped)」と表示されて
正常に動作いたしません。

ソースは以下の通りです。
#include <stdio.h>
#include <curses.h>

int main(void)
{
char a;

printf("何かキーを押す。\n ");
a = (char)getch();
printf("何かキーが押された。 ");
return 0;
}

コンパイル時のコマンドラインはこのようにしています。
gcc ソース名 -lcurses

よろしくご教授おねがいします。
332デフォルトの名無しさん:04/09/20 04:25:10
素直にint a;でやればいいのに
333デフォルトの名無しさん:04/09/20 04:35:08
クラスを外部ヘッダやcppに分割してプログラムを作るとき、using namespace std;というのは外部cppには書かないほうがいいんですか?
main()のあるcppと外部クラスの定義のあるcppのどちらともでusing namespace std;をするのはとりあえずよくないみたいなことを聞いたのですが、理由がよくわかりません。
334デフォルトの名無しさん:04/09/20 06:21:32
335デフォルトの名無しさん:04/09/20 08:36:59
>>333
別にそんなことないよ。
書きたいのなら好きにusing書きなさい。
336デフォルトの名無しさん:04/09/20 09:07:01
>>333
名前空間が違うと言う恩恵を拒否し、アナクロニズムに浸りたいと言うのでしたらどうぞご自由に。
337デフォルトの名無しさん:04/09/20 09:19:44
>>336
あえてstd空間と衝突する名前を採用する挑戦的な関数・クラスを使わない限り、恩恵はない。
どこの世に、わざわざstdと衝突させたがる人がいると?
標準のC++は、建前が先行しすぎているきらいがある。
338デフォルトの名無しさん:04/09/20 09:48:36
てめえが知らない内に衝突してるかも知れねえだろ
特にalgorithmなんかは
339デフォルトの名無しさん:04/09/20 10:10:22
>>338
今まで経験ないし、今後もないと思う。
名前が重複したとしても、ほとんどの場合コンパイルエラーが出るだろ。
君は、algorithmと引数まで酷似するような凝った関数使ってるのかね?
340デフォルトの名無しさん:04/09/20 15:25:33
>>339
find()
341デフォルトの名無しさん:04/09/20 17:26:21
>>339
しら無い間にバグが出来ちゃったりするのが怖いから避けるんだろが
馬鹿かお前は
342333:04/09/20 18:08:00
std名前空間の中にある関数やクラスと自分で定義した関数やクラスが衝突する恐れがあるから、std名前空間はstdということをはっきりさせるために
using namespace std;をつかわずにstd::cout見たいな記述をして、見た目にわかりやすくしているってことですかね?
もしかしてmain()のあるファイルでもusing namespace std;を使わないのが普通なんでしょうか?
343マイク ◆yrBrqfF1Ew :04/09/20 18:46:14
>>337
標準やモロモロのライブラリの識別子と名前が被ってしまうことを恐れることから解放された
素晴らしいことだな。
344デフォルトの名無しさん:04/09/20 19:45:49
>>331
curses使ったことないんで外してるかもしれないですけど,
たぶん使う前に初期化関数とかを呼ばなければならないんじゃないでしょうか?

替わりに
#include <stdio.h>
int getchar(void);
でどうでしょ?

345デフォルトの名無しさん:04/09/20 20:23:52
今時CUIで一文字入力(≠1行入力)でもないと思うが…
346デフォルトの名無しさん:04/09/20 20:36:16
>>330
find_if (list.begin (), list.end (), boost::lambda::bind (&obj::data, boost::lambda::_1) == "hoge");
347デフォルトの名無しさん:04/09/20 21:59:13
C言語の基本的な文法は覚えたので
windows上で動くプログラムを作ろうかと思ってるのですが
参考になるお勧めな本を教えてくれませんか?
ソフトはVisualStudio2003を使ってます。(ソフトは関係ないと思うけど一応
348デフォルトの名無しさん:04/09/20 22:00:46
>>342
他は知らないが俺はファイルの先頭でこういう具合にいちいち並べている。
using std::cout;
using std::cerr;
using std::endl;
using std::fstream;
349デフォルトの名無しさん:04/09/20 22:36:21
>>348
なるほど、主によく使うものだけをnamespaceを使用しないで省略できるようにしておくのですね。。
参考になります。。。
350デフォルトの名無しさん:04/09/20 22:38:31
>>348
いい方法だな。
そのへんの名前はかぶりそうにないし。
351デフォルトの名無しさん:04/09/20 23:17:55
入力した文字列を逆から表示するプログラムのソースをオライリーあたりからパクって来てVC++.NETでコンパイル
して、動かそうとしたんですが、表示されるのは1行目だけで、しかも止まりません。
どうすればいいでしょうか?
#include<iostream>
#include<string>
using namespace std;

int main(int argc,char** argv){
      const string delims("\t,.;");
      string line;

      while(getline(cin,line)){
            string::size_type begIdx,endIdx;
            begIdx=line.find_first_not_of(delims);
            while(begIdx!=string::npos){
                  endIdx=line.find_first_of(delims,begIdx);
                  if(endIdx==string::npos){
                  endIdx=line.length();
                  }
                  for(int i=endIdx-1;i>=static_cast<int>(begIdx);--i){
                        cout<<line[i];
                  }
                  cout<<' ';
                  begIdx=line.find_first_not_of(delims,begIdx);
            }
            cout<<endl;
      }
}
352331:04/09/20 23:21:36
>>332
>>344

解答ありがとうございます。
残念ながら両方試してみましたがうまくいきませんでした。
今のところUNIX系OSを使う機会は無いので、
Windows系のC言語で学習を続けたいと思います。
353デフォルトの名無しさん:04/09/20 23:56:49
>>346
Argument-Dependent-Lookup(ADL)使うともうちょっと幸せ。
find_if (list.begin (), list.end (), bind (&obj::data, boost::lambda::_1) == "hoge");
354デフォルトの名無しさん:04/09/21 00:43:03
>>340>>341
どのような不具合が起こったのか、詳細うpキボンヌ。
でなければ、>>339の言い分が間違っているとは言い難い。
特に>>341の体験談を聞きたいものだ。
355デフォルトの名無しさん:04/09/21 01:31:44
階乗プログラムてどんなやつですか??
356デフォルトの名無しさん:04/09/21 01:41:21
>>355
こういうの?

template <int N> struct Factorial{ enum{ value = N * Factorial<N-1>::value }; };
template <> struct Factorial<0>{ enum{ value = 1 }; };
int
fact( int n )
{
    int fact = 1;
    for( int i = n; i >= 2; --i )
        fact *= i;
    return fact;
}
int
main()
{
    std::cout << Factorial<0>::value << std::endl;
    std::cout << fact( 0 ) << std::endl;
    return 0;
}
357デフォルトの名無しさん:04/09/21 01:49:11
>>356
まだ関数ちょっとかじったばっかまでしかわからない初心者なんですが
>>356のはわからないことが多すぎるんで
具体的にどうゆうのが階乗プログラムか教えていただければ幸いです・・・
358デフォルトの名無しさん:04/09/21 01:54:58
>>357
漏れは階乗プログラムなんて名詞知らないヘタレPGなんで
階乗を求めるプログラムを書いてみただけw
359デフォルトの名無しさん:04/09/21 02:00:49
>>358
そうですか・・・何とか自力でしらべまくってみます・・
わざわざ夜分遅くにご教授ありがとうございましたー
360 ◆FIcNi4f8js :04/09/21 03:17:43
n! = n・(n-1)!
361デフォルトの名無しさん:04/09/21 03:20:40
>>360
無限ループ
362デフォルトの名無しさん:04/09/21 03:42:49
n! = n・(n-1)!
だろ?

int
fact( int n )
{
if(n<=1) return 1;
return n*fact(n-1);
}
ぢゃねの?
※intでいいのか、とか、マイナスの場合どうすんの?とかがあるが
363デフォルトの名無しさん:04/09/21 03:46:35
n! = n・(n-1)! ... n >= 1のとき
n! = 1 ... n == 0 のとき

終了条件無いとだめだって
364デフォルトの名無しさん:04/09/21 03:56:46
数学的にも
n! = n・(n-1) (n>=1)
だな
ま、揚げ足取りだけどさw
365デフォルトの名無しさん:04/09/21 04:02:00
階乗を求めるプログラムは再帰の例としてよく出てくるが
別に再帰じゃなくて単なるループでもいいのよ

int fact(int n)
{
  int f = 1;

  for (int i = 1; i <= n; i++) {
    f *= i;
  }

  return f;
}
366デフォルトの名無しさん:04/09/21 04:04:13
再帰の例としては分かりやすいけど、駄目な使い方の例でもあるな
再帰を使わなくても簡単に書けるのならば、そう書くべき
367デフォルトの名無しさん:04/09/21 04:10:18
じゃあフィボナッチ数列とかにしたら?
これも反復で書けるけどね

fib(n) = fib(n-1) + fib(n-2) ... n >= 3
fib(n) = 1 ... n = 1,2
368366:04/09/21 04:50:12
>>367
再帰的定義だからといって、再帰がいいとは限らない
なんか、Efficient C++ を思い出しますなあ
(単一引数を取るinline再帰関数にリテラルを渡すことにより、
最適化によってはコンパイルタイムで計算されるというやつ)
369デフォルトの名無しさん:04/09/21 05:24:57
>>354
不具合なんか起きるもんかね。起きるのがイヤだから回避策をとってるのに。
転ばぬ先の杖って言葉知ってる?
370デフォルトの名無しさん:04/09/21 05:37:50
>>369
それはstdと同じ名前の関数・クラスは作らない、暗黙ルール的な解決策って意味かな?
371デフォルトの名無しさん:04/09/21 05:55:44
std::つけるって話だろ?
372デフォルトの名無しさん:04/09/21 05:58:08
>>370
プゲラ
373デフォルトの名無しさん:04/09/21 06:20:03
> プゲラ
頭悪そう
374デフォルトの名無しさん:04/09/21 06:37:09
なんだか知らないけどここにもウィルス置いときますね
ttp://pukapuka.s1.x-beat.com/img-box/img20040920215205.lzh
375デフォルトの名無しさん:04/09/21 20:16:09
>>351
自己解決しました。単なる写し間違いでした…orz
ちなみに下から5行目です。
×begIdx=line.find_first_not_of(delims,begIdx);
○begIdx=line.find_first_not_of(delims,endIdx);
376デフォルトの名無しさん:04/09/22 00:53:33
>>375
> 5行目
> 5行目
> 5行目
> 5行目
377デフォルトの名無しさん:04/09/22 00:57:01
>>376
なんだこいつ
378デフォルトの名無しさん:04/09/22 01:08:24
てんかん発作か何かでしょ。
379デフォルトの名無しさん:04/09/23 18:12:11
class A
{
virtual void func(const int& i) =0;
}
の、=0ってどういう意味があるんですか?
380デフォルトの名無しさん:04/09/23 18:13:37
>>379
キーワード 純粋仮想関数
381デフォルトの名無しさん:04/09/23 19:54:33
C++の勉強をしようと思ったら、友達に、「Javaの勉強してからC++をしなさい」って、言われました。
なぜですか?
382デフォルトの名無しさん:04/09/23 19:55:48
ヽ(`Д´)ノ友達に聞け!
383Ruby >>>>>>>>>>>>> C++:04/09/23 19:58:49
C++の勉強をしようと思ったら、友達に、「C++なんて問題外^^;;;;」って、言われました。
なぜですか?
384デフォルトの名無しさん:04/09/23 20:13:32
>383
その友達は「C++は問題外」でなくて、本当は「C++は理解の外」って意味でしょう。
頭の悪い友達を持って、君は不幸ですね。
385デフォルトの名無しさん:04/09/23 20:15:54
>>384
その子頭は確かに悪いんだけど、顔と体は最高なんです・・・
386デフォルトの名無しさん:04/09/23 20:20:11
>>385
そうですか。人はそれぞれ取り柄があるので、その子の長所を最大限に
引き出す事を考えれば君は幸せになれるでしょう。
387デフォルトの名無しさん:04/09/23 20:57:52
const なのに int を参照で渡す意味ってあるの??
388デフォルトの名無しさん:04/09/23 20:59:54
>>387
intが1280ビットほどあれば意味があるかも。ポインタのサイズ<<intのサイズでないと
だめだけど。
389デフォルトの名無しさん:04/09/23 21:34:41
何度聞いても「ブラック ロ・リ・コ・ン!」としか聞こえん……
390デフォルトの名無しさん:04/09/23 21:47:04
>>389
耳鼻科へ
391デフォルトの名無しさん:04/09/24 03:30:54
385はいかにその子の長所を伸ばすのか。気になる。
392デフォルトの名無しさん:04/09/24 10:04:01
C++での先行宣言?は、
class A;
class B { A a; };
class A { B b; };
でいいのでしょうか?
393デフォルトの名無しさん:04/09/24 10:15:06
いいよ
394392:04/09/24 10:18:56
>>393
ありがとうございます。
インテリセンスでのコード補完がB内のメソッドで効かなかったので心配でした。
395デフォルトの名無しさん:04/09/24 10:40:50
コンパイルできないだろう。
396デフォルトの名無しさん:04/09/24 12:03:50
ポインタをメンバにしろ。
class B { A* a; };
class A { B* b; };
インスタンスをメンバにしたらコンパイルできない。
397デフォルトの名無しさん:04/09/24 12:06:23
デフォルトコンストラクタ実行しちゃうもんね…
398デフォルトの名無しさん:04/09/24 12:29:48
そういう問題じゃない。
class A, Bが互いに相手のインスタンスをメンバにしたら
無限循環が起きるだろうが。

要は、「自分の型へのポインタ」はメンバに出来るが
「自分の型のインスタンス」はメンバに出来ないってのと同じ。
399デフォルトの名無しさん:04/09/24 13:34:03
仕事でC99準拠のコンパイラを作ることになったんですが
C99で書いたソースの拡張子は一般的に.cなんでしょうか?
400デフォルトの名無しさん:04/09/24 13:51:36
.c99
401392:04/09/24 15:52:19
>>395-398
ありがとうございます。
実際、コンパイルが通らなかったのですが、まったく違うところで、顔を真っ赤にして悩んでいました...orz
402デフォルトの名無しさん:04/09/24 17:56:56
>>400
ありえない
403デフォルトの名無しさん:04/09/24 19:34:21
.Ruby!
404399:04/09/24 21:28:56
>>400
まじっすか

たぶんC++も実装することになると思うんで追加でお聞きしますけども
C99のライブラリヘッダとC++の<c.*>ヘッダって共用できなくないですか?
無理に共用させるとすればrestrictとかマクロで逃げるよりほかないとか…
405デフォルトの名無しさん:04/09/24 21:39:58
>>404
おいおい。>>400はあからさまにネタだろうがよ。
それと普通のコンパイラに付属しているヘッダ類をみれば
わかると思うけど、たいていはマクロでC/C++の場合わけはしてる。

#ifdef __cplusplus
 extern "C" {
#endif

最低限必要なのは↑みたいにリンケージにかかわるところとか、
名前空間の違い(Cの標準関数は名前空間stdに配置)を
吸収する部分くらいかと思う。
406デフォルトの名無しさん:04/09/24 21:50:38
お前ら、「x^=y^=x^=y」でxとyの値を入れ換えることができるのは
どうしてかわかりやすく説明していただきたいのですが。
407デフォルトの名無しさん:04/09/24 21:55:53
>>398
ポインターに格納するのはアドレスというただの数値だもんね。
408デフォルトの名無しさん:04/09/24 21:58:39
>>406
未定義
409デフォルトの名無しさん:04/09/24 21:59:47
>>406
x^=(y^=(x^=y))
410デフォルトの名無しさん:04/09/24 22:04:06
>>409
ああなるほどそういうことか!さんくす!
411デフォルトの名無しさん:04/09/25 00:43:21
^x^=(^y^=(^x^=^y^))
412デフォルトの名無しさん:04/09/25 01:18:08
char型の文字列とString型の文字列の違いって何ですか?
また、変換する方法はありますか?
413デフォルトの名無しさん:04/09/25 01:25:45
s=(LPCTSTR)chstr
414デフォルトの名無しさん:04/09/25 02:06:31
>>412
CStringのことかAnsiStringのことかはたまたstd::stringのことか
はっきりせんが(てか、質問するときは環境をちゃんと書け)。

char配列は組込み型でStringはクラス。
よって前者は環境に依存しないが後者は環境依存。

また後者はメンバ関数が用意されているので

String hoge = "hoge"; //const char* → String
char hogetta[5];
strcpy( hogetta, hoge.c_str() ): //String → char*

てな具合に相互変換できる。
415デフォルトの名無しさん:04/09/25 02:16:11
>>414
すみません。stringはstd::stringの事だと思います(using namespace std;とやっていればstringはstd::stringになりますよね?)
char*→stringはそのままString型に代入、string→charはc_strを使えばいいんですね。
ありがとうございました。
416デフォルトの名無しさん:04/09/25 02:47:12
>>415
「だと思います」「stringはstd::stringになり」「char*→stringはそのままString型に」
↑ここらへんがプログラムに向いて無さそう。
文系の人なんだろうか。
417デフォルトの名無しさん:04/09/25 03:15:11
文系でも普通に頭のいい人は「質問するときは環境をちゃんと書け」を
読み落としたりしないし、キャピタライズにもちゃんと注意する。

文系理系よりも頭の良し悪しの方が遥かに重要って、当たり前の話だな。
418デフォルトの名無しさん:04/09/25 04:10:53
お前らアホか?
この場合頭の善し悪しじゃねーだろ
単に>>412がプログラミングに向いていないというだけのこと
頭のいい、悪いはまた別問題
419412:04/09/25 04:15:15
C++は始めたばかりでよくわからないんです。
環境といわれてもstringにいくつか種類があるなんて知りませんでしたし。
すみませんでした。
420デフォルトの名無しさん:04/09/25 04:24:57
スレタイの「初心者」っていうのは何処らへんまでが「初心者」として定義されるんだろう・・・・
421デフォルトの名無しさん:04/09/25 04:28:21
手厚く歓迎してるよ。みんな。
422デフォルトの名無しさん:04/09/25 06:27:25
少なくとも曖昧な質問の仕方をする辺りがプログラマに向いてないと。
423デフォルトの名無しさん:04/09/25 06:41:43
てか、「始めたばかり」の頃って、質問することなんか殆ど無くないか普通?
複雑さの無いシンプルな知識を本とかネットのリファレンスで吸収しまくる
単純作業っぽい学習の時期で、人に訊くことなんて何も無いと思うんだけど・・・。
424デフォルトの名無しさん:04/09/25 08:03:06
C++勉強し始めて日が浅いのですが、C++(Javaも)でクラス名を小文字から始めるのは
あまり勧められたものではない、となっているのかな?
hoge::ClassName object;
hoge::class_name object;
(hogeはnamespace)なんとなく大文字小文字ででこぼこするなぁ、と思ったもので。
非推奨スタイルならさっさと改めます。
std::系やboostなどは標準ないしそれに近いものとして例外とされるのかな。
425デフォルトの名無しさん:04/09/25 08:11:39
STL系のhoge_hoge、WinAPIのHogeHogeとスタイルがかぶらないように
Java系のhogeHogeという命名は結構使われてたりする
426デフォルトの名無しさん:04/09/25 13:50:13
当方、「これならわかるC++」小林健一郎著をみてプログラムしているものですが、
最初のコードすら実行できません。MS-DOSプロンプトで実行すると、
以下4つのエラーが発生してしまいます。
エラー E2209 hello.cpp 1:インクルードファイル'iostream'をオープンできない
エラー E2282 hello.cpp 2:名前空間名が必要
エラー E2451 hello.cpp 6:未定義のシンボル cout(関数 main())
エラー E2451 hello.cpp 6:未定義のシンボル end1(関数 main())
どなたか解決法をお教えくださらないでしょうか?
427デフォルトの名無しさん:04/09/25 13:59:49
>>426
bcc32.cfgにインクルードパスが設定されていない

ここ嫁
http://www.borland.co.jp/cppbuilder/freecompiler/faq/bccfaq4.html
428デフォルトの名無しさん:04/09/25 14:21:54
>>427
”インクルードファイルやライブラリファイルの場所を指定したBCC32.CFGを作成しなければなりません。”
どういう意味でしょうか?マイコンピュータ→システムのプロパティ→詳細設定
→環境変数でPathを選んで編集、既存の変数値に;C:\Borland\Bcc55\Binを付け加えたのですが
それとは違うんですか?
429デフォルトの名無しさん:04/09/25 14:28:05
> ”インクルードファイルやライブラリファイルの場所を指定したBCC32.CFGを作成しなければなりません。”

その直後に書いてあるだろ
430デフォルトの名無しさん:04/09/25 14:49:48
>>429
BCC32.CFGをどこにどうやって作るんですか?
431デフォルトの名無しさん:04/09/25 15:04:59
ホームラン級の無能
432デフォルトの名無しさん:04/09/25 15:15:46
何でそこまで言われなきゃいけないんだよ!
URL張ってくれてありがとな。
けどむかつくぜ!
433デフォルトの名無しさん:04/09/25 15:17:23
>>432
文章を読めないのが無能以外のなんだというのだ
434デフォルトの名無しさん:04/09/25 15:23:18
文章は読めるよ。何でお前に無能なんていわれなきゃいけないんだよ。
嫌な奴だな
435デフォルトの名無しさん:04/09/25 15:29:03
>>430
http://software.nikkeibp.co.jp/software/special/bcc_install/bcc_install.html

ひとを品定めするような書き方は良くないっすよ。
436430:04/09/25 15:54:41
>>435
上手く実行出来ました。有難うございます。
わざわざ手数のかかることをしてもらってすみません。
”ひとを品定めするような書き方”ってどういう意味です?
437デフォルトの名無しさん:04/09/25 20:25:48
>434みたいな書き方しておいて、マジで>436のように判っていないのだとしたら、
おこちゃまなんだろうな、とは思う。
#げ、読点多くて頭悪そw
438デフォルトの名無しさん:04/09/25 21:01:19
旧Cライブラリの関数を呼び出すときは ::HogeFunc() のように::を一つ一つ付ける方が良いですか?
439デフォルトの名無しさん:04/09/25 21:05:19
>>416 >↑ここらへんがプログラムに向いて無さそう。
>>418 >単に>>412がプログラミングに向いていないというだけのこと
>>431 >ホームラン級の無能
>>437 >おこちゃまなんだろうな、とは思う。
この辺の書き込みは質問者の弱い立場を利用した中傷でしかないので、しない方がいいですよ。
(421さんの言う「手厚い歓迎」?)
まぁ、みなさんなんやかんやでよく答えてるのでエライとは思います。
番号上げた方ごめんなさい。
440435,439:04/09/25 21:11:20
名前をメール欄に書いちまった。439は435です。
441デフォルトの名無しさん:04/09/25 21:15:23
>>439
プログラムに向いてない人がプログラマになったら、不幸だとは思わないのか?
好きならいいじゃないかと思うかもしれないけど、本人だけの問題じゃないんだぞ。
442デフォルトの名無しさん:04/09/25 21:26:27
>438
全部に付けるのはめんどくさいんで、
紛らわしいものだけに付けます(自分は)
443マイク ◆yrBrqfF1Ew :04/09/25 21:43:31
>本人だけの問題じゃないんだぞ。

どんな問題だ?
444434:04/09/25 22:25:43
>>437
わかるわけねーだろあほ。
何がおこちゃまだよ。俺は無能と言われたんだぞ。
目の前で言ったら殺されても仕方ないぐらいのことを言われてんだ。
黙ってられるかよ。俺の理解力が無くて教える気がなくなったんなら、
「これ以上簡単には教えようが無い」ぐらいの事を言って終わりにすれば
いいだろう。自尊心を傷つけられてなんで黙ってられるんだよ。
俺だって場所を考えて聞いてるんだ!
445デフォルトの名無しさん:04/09/25 22:38:54
まぁ、頭は悪いが自尊心はあると。
それで開き直れるのも2chだからだな。

いや、それでもなんでも、馬鹿にする人間が居る代わり
回答してくれる人間も居るんだからそれでいいじゃん。
実生活じゃこうはいくまい。
446デフォルトの名無しさん:04/09/25 22:55:15
だね。相手の顔が見えないからって粋がるなよ。
聞かれる前に答えるが、私はリアルでも言いたいことは言って生きてきているよ。
447デフォルトの名無しさん:04/09/25 22:58:36
>>446
いいたいこと言って生きてちゃだめだろ。
448デフォルトの名無しさん:04/09/25 23:15:08
お前は誰がどうみても無能と呼ばれるような聞き方をしてたぞ。
はっきり無能と指摘してくれるのもここならでは。
リアルでは誰もそんなことは言ってくれず、心の中で「こいつ無能だな」と思われるだけ。
これを機に自分を見直せ。
449デフォルトの名無しさん:04/09/25 23:20:46
横レスだが。

にっこり笑顔で「次の行に書いてあるよ」といいつつ青筋立ててしまいそうな未熟者の漏れ。
酒の席とか、本人の居ないところであいつは駄目だと上司/同僚に愚痴りそうだ。
450デフォルトの名無しさん:04/09/25 23:30:35
>>449
うむ。
お前はそういうタイプだ。
451434:04/09/25 23:34:51
>>448
ふざけるな
452デフォルトの名無しさん:04/09/25 23:38:24
>>448
しかし、2chなら堂々と言えるぞ。
>>448無能だなw
453デフォルトの名無しさん:04/09/25 23:52:30
教えて君が逆切れするスレはここですか。
454デフォルトの名無しさん:04/09/25 23:52:45
bccのパス設定が難しい人は、このツールを使うといいと思う。
http://www.vector.co.jp/soft/win95/prog/se149182.html
455434:04/09/26 00:04:04
>>445
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ
456デフォルトの名無しさん:04/09/26 00:09:44
>>455
手順がわからなくて2chで聞くのが無能以外の何者だというんだ?
C/C++の仕様とかなら膨大すぎるからキーワードくらいのヒントは聞くのはしかたないし、
このスレの存在意義はそこにあると思うけど、
長くも無い説明文に堂々と書いてることを聞くってのは日本語がわかってないとしか思えんじゃないか。
457デフォルトの名無しさん:04/09/26 00:09:55
>>455
自分の頭の悪さに気が付いてないって点で、既に頭が悪い。
将来悲惨だよな、お前。痛いよ。
458デフォルトの名無しさん:04/09/26 00:10:42
大部分の頭の良くない普通の人は
人に聞かなくても独力で手順を調べる事はできるんです
それが出来ないあなたは、頭が悪くないとしてもやや頭が悪いといわざるを得ないでしょう。
459デフォルトの名無しさん:04/09/26 00:10:46
>俺は頭悪くないから

「...お前、クスリやってるだろ?」
「や、やってねーよ」

みんな否定するんだよな
460434:04/09/26 00:19:36
もうええわ

461デフォルトの名無しさん:04/09/26 00:21:07
>>446
>>447
ワラタ

462434:04/09/26 00:43:55
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ

もうええわ
463デフォルトの名無しさん:04/09/26 00:44:36
>>455
手順がこと細かく書いてあるページを教えてもらってるのに、よく読まずに質問するから
無能と呼ばれるんだよ。
464434:04/09/26 00:45:13
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ

もうええわ
465デフォルトの名無しさん:04/09/26 00:46:15
板のレベルを考えなかったお前の負けだな。
あきらめろ。
質問するならもっと簡単なのにしとけ。
466デフォルトの名無しさん:04/09/26 00:59:31
>>465
だな
467デフォルトの名無しさん:04/09/26 01:07:02
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ

もうええわ
468デフォルトの名無しさん:04/09/26 12:31:36
2ちゃんはクソ
469デフォルトの名無しさん:04/09/26 12:45:17
Ruby以外は糞
470デフォルトの名無しさん:04/09/26 12:47:33
今さらあれだけど、確認しておくぞ。
2chには、人を不快にするのが好きな人間が屯している。
だから一般の香具師は、それを無視できなければならん。
耐えるしかないんだ。わかったな。

わかったら次の質問をしろ。
471デフォルトの名無しさん:04/09/26 13:05:11
2chにはスレ毎に雰囲気がある。
雰囲気は各人の投稿の集約だが各人の投稿が雰囲気に影響されるのもまた事実だ。
人を不快にする発言が憚れる雰囲気を作って行きましょう。
472デフォルトの名無しさん:04/09/26 14:33:45
今更な質問よかですか?

deleteとdelete[]の明確な違いってなんでしょう?
X *pX= new X[5];
delete pX;
ってやったらどうなんの?

もう一点。
それは処理系による違いってある?
473デフォルトの名無しさん:04/09/26 14:37:17
ttp://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/0805.html
>挿入子のオーバーロードは自動インラインである事が必要なのか?
なのでしょうか・・・・?
僕も同じところではまっています・・・・
よろしくお願いします。
474デフォルトの名無しさん:04/09/26 14:40:19
>472
pX[0]だけdeleteされて他は残る
475デフォルトの名無しさん:04/09/26 14:45:32
>>473
g++だと
クラス外で定義してもエラーは出ないですね.
規格では?

ところで「自動インライン」って言うんですか? これ.
476472:04/09/26 14:47:13
>474
え。。。
マジ!?

酷いな。。。
ありがd。
477デフォルトの名無しさん:04/09/26 14:55:33
>>476
コンパイル時にはエラーにならなかったりするので注意すべし。
不安だったらテストコード書いとけ。
ちょうどCマガ10月号にnew/deleteをオーバーライドして解放忘れがないかチェックするネタがあるぞ。
478473:04/09/26 14:59:29
>>475
ありがとうございます。
うーん、コンパイラオプションとかでしょうか・・・
VC.net2003で試しているんですが、エラーはきますorz
>自動インライン
インライン展開とかでしたっけ?
inlineキーワードつけないといけなかったんですよね、確か。違ったっけ。
479デフォルトの名無しさん:04/09/26 15:15:35
>>473
俺様用語満載で胡散臭いな。
480デフォルトの名無しさん:04/09/26 15:18:34
>>472
deleteは非配列形式のnewで生成されたオブジェクトの削除。
delete[]は配列形式のnewで生成されたオブジェクトの削除。

> X *pX= new X[5];
> delete pX;
未定義。
もちろん処理系による違いは有り得るが、飽くまで未定義。
>>474はどっかの処理系においての一例と見るべき。
481デフォルトの名無しさん:04/09/26 15:47:02
delete[] とするところを delete ってするのは未定義ですよ
482デフォルトの名無しさん:04/09/26 16:02:47
>>478
#include <iostream>
using namespace std;
class cls
{
int i;
public:
friend ostream &operator <<( ostream &s, cls o );
};
ostream &operator <<( ostream &s, cls o )
{
s << o.i << endl;
return s;
}
VC7.1でコンパイルできた。
>自動インライン
これはおそらく、クラス定義内にメンバ関数定義を記述することを指している。
このように定義されたメンバ関数はinline扱いになる。
483デフォルトの名無しさん:04/09/26 16:22:30
今思った
struct hoge{
    virtual void hogefunc(){}
}
ってやるのは virtual をインラインにしてるから良くないの?
struct hoge{
    virtual void hogefunc();
}
void
hoge::hogefunc(){
}
ってやるべき??
484デフォルトの名無しさん:04/09/26 16:30:36
別にvirtualをインライン化しても悪くないだろ。
展開できるところは展開されるかもしれないし、遅延束縛もちゃんと機能する。
485473:04/09/26 16:36:58
>>482
コンパイル通りますか・・・
うーん、どうも、違う部分で間違ってる感じですね・・・
ありがとうございます。
もう一度、ソース頭から眺めてみますorz
486デフォルトの名無しさん:04/09/26 17:01:34
rand()関数についてお尋ねします。
1と-1の乱数が欲しかったので,rand()を使い
(rand() % 2) *2 -1
として,取り出しました。
本当に散らばっているか,100個くらい表示させてみたのですが,
何度やっても交互に並んでしまいました。
srand(time(NULL))と種を与えた場合も,与えない場合も結果が変わりませんでした。
2種類の数字をランダムに得る方法は何かありませんでしょうか?
487デフォルトの名無しさん:04/09/26 17:07:39
rand() % nはあまり性質の良い乱数にならない。
rand() > RAND_MAX/2 ? 1: -1を試してみてくれ。
488デフォルトの名無しさん:04/09/26 17:08:17
>>486
最下位ビットは必ず交互に変わるアルゴリズムなのだろう。
なので、上位の方のビットを使えばましになるはず。
489デフォルトの名無しさん:04/09/26 17:18:16
#include <iostream>
#include <ctime>
#include <boost/random.hpp>

int
main()
{
    typedef boost::mt19937 myengine;
    typedef boost::uniform_int<> mydistribution;

    myengine mt( static_cast<boost::uint32_t>( std::time( NULL ) ) );
    mydistribution ui( 0, 1 );
    boost::variate_generator<myengine, mydistribution> myrand( mt, ui );

    for( int i = 0; i < 100; ++i )
        std::cout << myrand() * 2 - 1 << std::endl;

    return 0;
}
490デフォルトの名無しさん:04/09/26 17:31:46
>>487-488
教えていただいたようにしましたら,無事解決しました。
ありがとうございました。

# 教えていただいたことをヒントに少し調べてみましたら,
# Linuxのマニュアルには上位ビットを使うように,と書いてあるそうでした。
491489:04/09/26 17:34:40
漏れは参考のさの字にすらならなかったのか・・・(´・ω・`)
492C++勉強中:04/09/26 17:39:09
処理の内容でなく関数名の付け方についてなのですが、
もとの図形を拡大回転した新しい図形を返す関数としてrotozoom()を実装したとします。
Shape *rotated = source->rotozoom(1.0, PI * 3);
のような感じで使うとして、今度は自分自身を回転する関数名はどう付ければ???
shape->rotozoom() //rotate&zoom and set itself
のように使いたい。
source->set_hoge(source->rotozoom());
とやればいいやん、とは思ったものの、内部の処理の関係上できれば独立させたいなと。
rotozoom_self ???
493デフォルトの名無しさん:04/09/26 17:42:51
>>491 参考にして欲しくて書いたんじゃないだろ。
494デフォルトの名無しさん:04/09/26 17:44:12
495デフォルトの名無しさん:04/09/26 17:44:27
Ruby >>>>>>>>>>>>>>>>>>>>>>> らんd
496デフォルトの名無しさん:04/09/26 18:00:23
>>494
サンクス移動します。
497486:04/09/26 18:25:11
>>491
大変失礼致しました。
新着レスを調べずに,実験およびレス書きを行ったため,
アドバイスをいただいていたことに気がつきませんでした。
私如きでは今見ただけではよくわからないのですが,
いつか役立たせていただきたいと思います。
498デフォルトの名無しさん:04/09/26 18:29:20
>>497
今すぐにでも出来るよ
この辺でもご参考に
http://www.kmonos.net/alang/boost/
499デフォルトの名無しさん:04/09/26 19:56:02
C++で作られた.exeファイルのソースを表示するソフトみたいなのありますか?
500デフォルトの名無しさん:04/09/26 20:03:53
るby!!!!!!
501デフォルトの名無しさん:04/09/26 20:23:59
>>499 ありません。
502デフォルトの名無しさん:04/09/26 21:23:22
class Hoge{
 int n;
public:
 Hoge(){ n = 1; }
 int get(){ return n; }
};
int main(){
 Hoge h;
 return h.get();
}

こんな簡単なクラスでもget()を読んだ箇所の
アセンブラを見てみるとcallの字があるのですが、
これはたぶんインライン展開されて無いですよね?いやされてるんでしょうか。
503デフォルトの名無しさん:04/09/26 21:24:43
癒されてません
504502:04/09/26 21:31:54
コンパイラのスイッチが入ってないだけみたいでした
書きこんだ瞬間に気づく悲しさ
505デフォルトの名無しさん:04/09/26 21:32:17
コピーしてるからじゃないの
506デフォルトの名無しさん:04/09/26 21:55:15
>499
無ければ自分で作る!
507デフォルトの名無しさん:04/09/26 22:13:04
今独習CでCの基本を勉強しているんですが、それが終わったらC++の勉強を始めるべきでしょうか?
これからいろいろ利用していくことを考えるとC++の方を重点的に勉強しておいたほうがいいような気がするんです。
将来はWindows用の本格的なアプリケーションも作っていきたいと考えているので、
VCの解説でよく使われるC++の方がいろいろ便利な気がします。
しかし、せっかくCの基本を覚えたんだから、それを深く学んでいく方がいいのかもしれません。
皆さんの意見を参考にしたいのですが、どっちの方がいいと思いますか?
508デフォルトの名無しさん:04/09/26 22:42:43
>>507
将来的なことを考えたらC/C++以外の言語を習得したほうが良いかもしれん。
特にWindowsアプリの開発ならC++にこだわる必然性は無い。

ということを頭に入れた上で。

C++は純Cに比べて遥かに仕様が膨大で、その理解にはオブジェクト指向の
理解が不可欠。つまり習得するには非常に時間がかかる。

オレが勉強してたときはjavaなんて無い時代だから半ば必然的にC++の勉強したけど、
いまの若い人には正直あんまり勧める気はしない。

あ、Cの勉強は無駄にはならんぞ。
509デフォルトの名無しさん:04/09/26 23:50:41
>>490
遅レスだけど、線形合同法による乱数生成だとそうなる。
最近のライブラリはMT(メルセンヌツイスト)導入したものも多いので、
そういうのならそんな性質はないので興味があったら調べてみるのも一興。
510デフォルトの名無しさん:04/09/27 00:06:02
っていうかmanにちゃんと書いてある…
"If you want to generate a random integer between 1
and 10, you should always do it by using high-order
bits, as in

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

and never by anything resembling

j=1+(rand() % 10);

(which uses lower-order bits)."
511デフォルトの名無しさん:04/09/27 01:44:07
>>508
釣りか?
もしくは、スポーツ選手などと同様で40代前に引退する羽目になるのが嫌だから、
新規参入する若手を減らして競争率を下げたいのかwwwww?

>>507
今や、いきなりC++から入るべきだよ。
Cだけに触れるのは最初だけ。
C++のiostream系はほとんど覚える必要なし。というか時間の浪費。
ポインタ→構造体→自力リスト→自力クラス/MFC/STL→あとは人それぞれ
512デフォルトの名無しさん:04/09/27 02:20:12
>C++のiostream系はほとんど覚える必要なし。というか時間の浪費。
>ポインタ→構造体→自力リスト→自力クラス/MFC/STL→あとは人それぞれ

このレベルだと今時C++を使う意味は無いだろ。
513デフォルトの名無しさん:04/09/27 04:00:04
配列の引き算の結果について質問なんだけど
T arr[N];
(&arr[N]-&arr[0])ここの結果っていつも「N」になるのが仕様なんですか?
要素数を求めるには最近までsizeof(T*)で割らなきゃあかんと思っていたんだけど違ったんだね。
スレの住人さん仕様なのかどうか?教えてYo。
一応環境はVC7.1、W2KですYo。
514デフォルトの名無しさん:04/09/27 04:03:59
あと最近まで要素数求めてた方法はdefineかテンプレート使ってたから引き算なんて初めて挑戦したんですよね。
515デフォルトの名無しさん:04/09/27 04:14:40
>>513
仕様ですよ。
sizeof(T*)で割るのは、最適化が期待できないコンパイラでも
定数の畳み込みを期待できるからです。
516デフォルトの名無しさん:04/09/27 04:20:24
>>515
ありがとう。スッキリしたYo。
そうか、俺の脳内仕様が古かったのね。
517デフォルトの名無しさん:04/09/27 10:13:28
実行ファイルからソースプログラミングを見る方法ってありますか?
518デフォルトの名無しさん:04/09/27 10:16:39
_
519デフォルトの名無しさん:04/09/27 11:16:19
以前からの疑問なのですが
「リスト等を全検索して、一つも該当の対象が無ければ処理を終え、該当があれば処理を続ける」

というのを綺麗に実装する方法はあるのでしょうか

gotoを使ったり、小さい関数に分けるなら私にも思いつくのですが…
(useGoto()、及び useSmallFunc()は、配列に8があれば処理を続ける)

int array[10] = { 1, 3, 5, 8, 9, 2, 6, 0, 7, 4 };

void useGoto()
 for( int i=0; i < 10; ++i ){
  if( array[i] == 8 ) goto GOES_ON;
 }
 return; //処理中止
GOES_ON:
 printf( "処理を続ける" );
}

void useSmallFunc(){
 if( small_func( array, 10 ) )
  printf( "処理を続ける" );
 else
  return; //処理中止
}
bool small_func( int* array, int size ){ //順序が逆ですが
 for( int i=0; i < size; ++i ){
  if( array[i] == 8 ) return true;
 }
 return false;
}
520519:04/09/27 11:22:48
続きです

void useFrag(){
 bool flag = false;
 for( int i=0; i < 10; ++i ){
  if( array[i] == 8 ) flag = true;
 }
 if( ! frag ){
  return;
 }
 printf( "処理を続ける" );
}
521デフォルトの名無しさん:04/09/27 11:41:52
>>519
for(;;) {
 for( int i=0; i < size; ++i ) {
  if( array[i] == 8 )
   break; // ループから抜ける
 }

 // 処理
}

こう?
522519:04/09/27 12:12:17
>>521
レスありがとうございます
しかしすいません、私の理解が足りないせいか、それだと

・配列に該当の対象(数字の8)が有っても無くても、処理が続いてしまう
・無限ループになってしまう(処理でもう一度breakするのでしょうか)

様に思えてしまって。
523デフォルトの名無しさん:04/09/27 13:19:44
IDみたいなものを定義したいのですが,

enumでするのがいいでしょうか?
それとも#defineでするのがいいのでしょうか?

#define ID_A 100
#define ID_B 200

enum {
ID_A = 100;
ID_B = 200;
}

どっちでやるか迷います
524デフォルトの名無しさん:04/09/27 13:26:24
>>522

> しかしすいません、私の理解が足りないせいか、それだと

>>521の理解が足りないだけなので御気になさらずに
525デフォルトの名無しさん:04/09/27 13:26:37
>>523
IDだったらenumの方が良い。
ちなみに、定数にdefineを使う場合があれば、なるべくconst intに置き換えるべき。
526523:04/09/27 13:27:27
>>525
すばやいレスウンコー!(゚∀゚)!
527523:04/09/27 13:27:59
すいません
サンクスって書こうとしたらなぜか
間違った変換になりました
528521:04/09/27 13:28:50
>>521は忘れて
529デフォルトの名無しさん:04/09/27 13:52:49
>>526-527
ワロタ
さてはプロだな (界王様 風)
530デフォルトの名無しさん:04/09/27 14:15:13
>>526
これ、お前か?w

評価: 非常に良い 落札者です。評価者は mana_chiyo (819)
井上和香 DVD「和香物語」 美品( ^-^) (7月 3日 23時 0分)

出品者は「 非常に良い 」と落札者を評価しました。

コメント:商品が届き安心しました。この度は迅速な対応ウンコー!(゚∀゚)!ございました。
またの機会を楽しみにしています。 (7月 12日 18時 46分)

コメント:すみません。僕の辞書が勝手に変な変換をしてしまい、
不快感を与えるコメントをしてしまい大変申し訳ございません。
この度は迅速な対応ありがとうございました。 (7月 12日 19時 7分) (最新) [返答]
531デフォルトの名無しさん:04/09/27 15:09:22
>>530
ワラタ
532デフォルトの名無しさん:04/09/27 15:43:57
>>530
You are shine!
533デフォルトの名無しさん:04/09/27 16:15:37
ちょっとー笑いすぎて腹痛いんですけど
534デフォルトの名無しさん:04/09/27 16:25:20
質問があります。
C++でクラスを作る方針としてクラスは小さい方がいいと聞いたんですが、
クラスごとにファイルを作るとすると、
ファイルがめちゃくちゃたくさんになってしまいます。
皆さんは1つのクラスごとにソースファイルとヘッダファイルを作っておられますか?
535デフォルトの名無しさん:04/09/27 16:32:26
>>519
エレガントにか?
C++なら
if(std::find(array, &array[10], 8) != &array[10])
 見つかった時の処理
で一発きめれるけど(要するにusefuncかな)
Cなら単純に
for(int i=0; i<10; ++i){
 if(array[i]==8){
  見つかった時の処理
break;
}
cout<<i<<' ';
}
536535:04/09/27 16:34:57
ごめん間違った続き
Cなら単純に
for(int i=0; i<10; ++i){
 if(array[i]==8){
  見つかった時の処理
 break;
 }
}
でしょ。間違ってshift+Enter押しちゃった。
537デフォルトの名無しさん:04/09/27 16:46:03
>>534
作らない。
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/qid=1096270912/sr=1-1/ref=sr_1_18_1/249-7749404-9276354
この本読めばわかる。読まなくてもいいけど。
要するに自分がこのクラスとこのクラス(あるいは関数)は深く関連があるなと思えば一緒のヘッダで宣言するだけの話。
538デフォルトの名無しさん:04/09/27 16:57:41
>>537
> 作らない。

即レス、ご教授感謝します。
関連があるクラスは一つにまとめるんですか。
(まとめすぎてヘッダファイルが大きくなってしまう場合は、どうなるんでしょうか)

この本は早速買ってきますw
539519:04/09/27 16:58:47
>>524 >>528
なんだか今見返すと、嫌みっぽくて、すいませんでした。
本当に習いたてで、右も左も分からないだけですので…。

>>535-536
C/C++以前勉強してたのがBasic(VBではなく)だったので、
どうしてもGOTOによる流れが真っ先に念頭に浮かんでしまいました。

そのままifの条件文内で処理すれば良かったのですね。
STLも勉強してみます。レスありがとうございました。
540デフォルトの名無しさん:04/09/27 18:35:52
class Derived : public Base
{
public:
Derived() : Base() {} //これ
}
派生のコンストラクタに使うあの右の奴の事をなんて言うものですか。
コンストラクタ以外でも使えますか?
Derived() : Base::Init() {}
とか
541デフォルトの名無しさん:04/09/27 18:54:55
>>540 右の奴の事はコンストラクタ初期化子と呼ぶが、別に「派生の」
に限らない
542デフォルトの名無しさん:04/09/27 19:25:07
デフォルトコンストラクタとコピーコンストラクタがあればできなくは無い。
Derived() : Base(Base().Init()) {}

Derived() : {Base::Init()}
じゃいかんのか?
543デフォルトの名無しさん:04/09/27 22:10:36
ネームスペースが二文字というのは短すぎますか?

namespace xx;
namespace xxx;
namespace xxxx;
namespace xxxxx;
namespace xxxxxx;
544デフォルトの名無しさん:04/09/27 22:16:42
>>543
区別できるなら別に構わないと思います
545デフォルトの名無しさん:04/09/27 22:20:20
それに短い方が打ちやすい
5文字までなら許せるけど6文字以上からは毎回打つにはちとキツイし
546デフォルトの名無しさん:04/09/27 22:29:58
C++において宣言と定義について詳しく教えてくれませんか?

int a; は宣言で

int a = 0; は定義?
547デフォルトの名無しさん:04/09/27 22:31:47
>>546
ググれやカス
548デフォルトの名無しさん:04/09/27 22:42:13
>>546
マジレスすると宣言でつ
549デフォルトの名無しさん:04/09/27 22:42:11
>547
定義でもある宣言とか書いてあってよく分からないんです
550デフォルトの名無しさん:04/09/27 22:43:58
int a;
a=0;
と同義w
551デフォルトの名無しさん:04/09/27 22:45:40
int a=0,b=a,c=b;
552デフォルトの名無しさん:04/09/27 22:48:59
int a; が変数の宣言なのは分かったんですが
変数の定義はないんですか?
553デフォルトの名無しさん:04/09/27 22:51:16
ぬるw
554デフォルトの名無しさん:04/09/27 23:22:32
ぽw
555デフォルトの名無しさん:04/09/28 00:49:23
>>552
ない
556デフォルトの名無しさん:04/09/28 00:57:22
>>552
定義というのは宣言に内包されているもの。
しかし、
type name(type、・・・);
extern type name;
struct(class) name;
こういう形のものは定義と呼ばれることはない。
557デフォルトの名無しさん:04/09/28 02:32:13
宣言とは、コンパイラに認識可能な名前を導入する記述。
宣言の後であればコンパイラはその名前の意味を認識することができる。

定義とは、宣言された名前に対応する本体の記述。
定義は、それが対応する名前を確実に知るために、必ず宣言を含んでいる。
558デフォルトの名無しさん:04/09/28 03:08:20
下記のようなクラス階層の時、
class a
 ├class b
 │ └class c
 ├class d
 └class e
    └class f

class c から class d,e,f(階層上自分から見えないクラス) にアクセスしたい場合、
1.class c に class d,e,f のポインタを持たせてアクセスする
2.class c に class a のポインタを持たせてそれを経由する形でclass d,e,fにアクセスする
どちらが一般的なんでしょうか?

559デフォルトの名無しさん:04/09/28 03:47:26
>>558
2では所有関係の逆参照になってしまうので、それを嫌って1のほうがマシに思える。
そういう階層ができてるというのなら、アクセスしないのがもっと一般的だとは思うけど。
560デフォルトの名無しさん:04/09/28 04:06:33
コンストラクタで初期化に失敗した(ファイルを開くことができなかった、など)場合、
例外を投げるべきか、それとも取りあえず黙って受け入れて
bool Foo::valid() const { return handle_ != 0; }
のような関数で各自チェックしてくださいね〜とするのとどちらがよいのでしょう?
後者の場合、強制はできないので
int Foo::do_something() {
    if (!handle_)
        return -1; //とか、例外を投げるとか
    //何かする。
}
のように他の関数でもいちいちチェックしなければなりませんよね?
それとも、コンストラクタを全部private or protectedにして
Foo *Foo::create() {
    //いろいろチェック。ダメならすぐ0返す
    return new Foo(/* 全部OKなparameters */);
}
Foo *f = Foo::create(/* parameters */); //失敗したら0がかえってくる
f->do_something();
のようにするのとどっちが良いのでしょう?
561デフォルトの名無しさん:04/09/28 04:37:05
>>560
例外が問題なく使えるなら投げるのが正解。

事情があって例外を投げることができない場合の最善手は難しいが、
「それとも〜」以下の手法は有効だと思う。
戻り値を std::auto_ptr<Foo> にすると少し嬉しいかも。
562デフォルトの名無しさん:04/09/28 10:45:24
非常に分岐が多い場合、効率を上げるためにswitchの代わりに関数ポインタの
配列を使うのが有効ですが、これを通常の関数の代わりにinline関数で
行うことって可能でしょうか?

もしくはgotoのジャンプ先を、ifやswitchなどの分岐数の増加で効率が落ちる
制御命令を使わずに、動的に変更する方法ってないでしょうか?
563デフォルトの名無しさん:04/09/28 13:44:54
>>562
動的じゃないけどmap使うとか
あるいはこんなのとか
http://www.s34.co.jp/cpptechdoc/article/selforg/index.html
564デフォルトの名無しさん:04/09/28 15:11:23
質問です。
CreateProcessでコンソールプログラムを起動するときに、
リダイレクトの標準入力をしてする方法が分かりません。
標準出力に関するサンプルは多いのですが・・・
565デフォルトの名無しさん:04/09/28 15:41:46
>>562
C++の話として進めると
インライン関数より関数オブジェクトの方がいいこといっぱいだYo。
ttp://www.s34.co.jp/cpptechdoc/article/selforg/index.html
566デフォルトの名無しさん:04/09/28 15:44:01
あ、因みにvirtualにすると実行速度は遅いけどYo
567デフォルトの名無しさん:04/09/28 18:04:11
>>564
だいたい標準出力と同じだよ。
ところどころ引数を気をつければ平気。
568デフォルトの名無しさん:04/09/28 18:07:27
>>541 >>542
コピーコンストラクタはちょっと手間がかかりそうな気がしますが、
中括弧{}は便利ですね。switch文のcaseラベル内でも使えるし、
マクロでもまとめられるし何でも使えますね。
レスありがとうございました。
569Addicted to C++ ◆nrBjarne.g :04/09/28 18:07:36
こんなのを作ってみたので評価をお願いします。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1060403548_118/fvector.hpp
570デフォルトの名無しさん:04/09/28 18:12:49
>>569
手短に目的などを
571Addicted to C++ ◆nrBjarne.g :04/09/28 18:37:07
>>570
ファイルをベクタみたいに使ってみたかったので、
同じインターフェイスにしてみました。
572デフォルトの名無しさん:04/09/28 19:35:31
Win32ならメモリマップドファイルがあるんでそっちを使ったほうがいいと思うが。

目的が良くわからん。
たんなるオブジェクトの永続化か、メモリに常駐できないような巨大なデータを扱うのかで
より良い実装方法があると思うんで。

キャッシュの持ち方やファイルアクセスの仕方あたりをポリシー化してみたらどうかね?
573デフォルトの名無しさん:04/09/28 21:06:54
今日こそはconstを有効に使うぞと思いつつ
なんだかんだで断念する日々が続いております。

とか言うとネタみたいですが、実際皆さんconstをきちんと使ってるんでしょうか。
周りはなんか適当な人ばかりです。C++です。
574デフォルトの名無しさん:04/09/28 21:09:02
そりゃ使うだろ
適当な人との関わりはたった方がいいかもよ
575デフォルトの名無しさん:04/09/28 21:18:37
>>574
だとすると>>573は自分とのかかわりを絶たなきゃならんわけだな。
576デフォルトの名無しさん:04/09/28 21:20:15
>>573
その程度のプログラムだと、有効に使うことはできないよ。
577デフォルトの名無しさん:04/09/28 21:20:38
>>575
自分は自分自身に対してはいつでも的確だよ。
578573:04/09/28 21:32:54
レスサンクスです、曖昧な質問のせいで微妙に荒れちゃってすんません
最近はconstが無い言語も多いみたいなので、
こんなもんでもいいのかなと思ってました。

例えばメンバクラスを返すgetterがあった場合、
constと非constの両方用意した方が良いんでしょうか?
579デフォルトの名無しさん:04/09/28 22:36:25
>>561
ありがとうございます。疑問が晴れました。
580デフォルトの名無しさん:04/09/29 00:37:44
インライン関数はヘッダファイルのどこに書くのがよいですか?
・クラスの宣言内に。
・クラス宣言の外、その直後辺りに。
・どっちでもいい。
581デフォルトの名無しさん:04/09/29 01:12:53
582デフォルトの名無しさん:04/09/29 01:20:14
>>580
・クラス定義内に定義
・クラス定義内で宣言、クラス定義後に定義
・クラス定義内で宣言、別ファイルに定義してクラス定義後に #include

下に行くほど面倒になるのと引き換えに、
メンテナンス性などでメリットがある。
583デフォルトの名無しさん:04/09/29 02:09:25
>>563 >>565
現状がそもそも検索の必要もなく普通の関数ポインタの配列で
オーダー(1)で分岐先を判別できてまして(分岐条件の変数が
そのままインデックスになってる)、呼び出し回数の多い場所
だったので効率化のためにinline展開したかったので、折角教えて
もらったんですが自分のケースには使えそうにないです(´゚ω゚`)
asmでjmpの配列を作るのが現状にジャストフィットなんですが、
かなり面倒だったので似たようなことがCでもできないかな〜と
思ったんですが、関数ポインタの配列や関数オブジェクトの配列以外では
飛び先を配列化する方法は無さそうですね。。。
どうもでした。
584デフォルトの名無しさん:04/09/29 02:54:15
>>583
gccの拡張機能ならいけそう。
ttp://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
585デフォルトの名無しさん:04/09/29 05:00:16
>>584
ラベルのアドレスをポインタにできる。まさに今欲しい機能がそれっすよ。
gccだけなのかぁ。VCにも欲しい機能だった。
586デフォルトの名無しさん:04/09/29 09:01:49
>>585
関数の辺値を配列のインデックスに合わせれば言いだけの話のような・・・・
587デフォルトの名無しさん:04/09/29 09:05:00
関数の辺値?
588564:04/09/29 09:34:35
だれかサンプルソース書いてください。お願いします。
589デフォルトの名無しさん:04/09/29 09:41:36
>>588
STARTUPINFO dwFlags STARTF_USESTDHANDLES hStdInput
パーツを教えてやるよ。あとは自分で考えな。
590564:04/09/29 10:09:39
>>589
ありがとうございます。がんばってみます。
591564:04/09/29 10:40:17
// Set up the security attributes struct.
SECURITY_ATTRIBUTES sa;
sa.nLength= sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
//入力ファイルのハンドル
HANDLE hInputRead,hInputWriteTmp;
CreatePipe(&hInputRead,&hInputWriteTmp,&sa,0);
// 起動するウィンドウの状態
PROCESS_INFORMATION procInfo;
// 新しいプロセスの情報
STARTUPINFO startInfo;
GetStartupInfo( &startInfo);
startInfo.dwFlags = STARTF_USESTDHANDLES;
startInfo.hStdInput = hInputRead;
//起動
bool bret;
bret = CreateProcess(
"D:\\aaa.exe", // プロセスのパス(EXEのパス)
" < D:\\bbb.in",//"",// プロセスへのコマンドライン
NULL, // ハンドル継承(プロセスへのセキュリティ)
NULL, // ハンドル継承(スレッドへのセキュリティ)
TRUE, // ハンドル継承を行うか否か
CREATE_NEW_PROCESS_GROUP,// プロセスタイプおよび優先順位
NULL, // 環境ブロックのポインタ
NULL, // プロセスのパス
&startInfo, // 起動状態
&procInfo); // プロセスの情報
//開放
CloseHandle(hInputRead);
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);
592564:04/09/29 10:42:32
>>591が現在のソースです。exeは立ち上がりますが、標準入力されていない状態です。
どこを変更すればよろしいでしょうか?
昨日の朝からやっているんですが、どうにもだめな状態です。
ご指導お願いします。
593デフォルトの名無しさん:04/09/29 11:05:53
ウザ杉
594デフォルトの名無しさん:04/09/29 11:34:50
>>592
まずはどこでコケてるか絞り込め。
戻り値を調べたり、場合によってはGetLastError()でエラー詳細を調べるとか。
最低限これくらいやれ。
595564:04/09/29 12:07:24
>>594
こけはしません。
普通にexeが立ち上がるのですが、標準入力がされていない状態です。
どうするば標準入力されるかが分からない状態です。
596デフォルトの名無しさん:04/09/29 13:05:36
アフォ杉
597デフォルトの名無しさん:04/09/29 17:05:01
実際にどのようにコンパイルされているかを学ぼうと
今更アセンブラを勉強中です。

VC6の混合モードを使ってみたところ、シンボル付きで大変分かりやすく
これなら俺にも理解できるぜわーい、なんて思ってたのですが、
考えてみるとRelease時は最適化等で、全く別のコードになりますよね。

Release時のものを、シンボル付きで見る方法は無いのでしょうか。
思いっきり環境依存の質問ですがお願いします。
598デフォルトの名無しさん:04/09/29 17:19:29
>>591
おいおい、" < D:\\bbb.in"ってリダイレクトしちゃっているじゃないか。
599デフォルトの名無しさん:04/09/29 20:49:04
リダイレクトがシェルの仕事だということを理解して内容だな。

DuplcateHandleとかdupあたりを調べてから出直して来い
600デフォルトの名無しさん:04/09/29 22:16:09
>>597
VC6なら「プロジェクトの設定」の
C/C++タブ:
 カテゴリ「一般」の「デバッグ情報」を「プログラムデータベースを使用」
リンクタブ:
 カテゴリ「一般」の「デバッグ情報を出力する」をチェック
で Debug ビルドと同じように混合モードで見ることができる。

それか、
C/C++タブ:
 カテゴリ「ファイルリスティング」の
 「リスティングファイルタイプ」を「マシン語コードとソースを含む」
で、Release フォルダに生成される .cod ファイルを読む。
601597:04/09/29 22:48:56
>>600
ウヒョヒョヒョヒョヒョヒョヒョ
取り乱すぐらい上手くいきました。

これから色々試したり見たりするのが楽しみでならないです。
詳細なレスありがとうございました。
602デフォルトの名無しさん:04/09/30 02:24:30
atexit()で指定した関数が呼ばれるのと、クラスのstaticメンバのデストラクタが呼ばれるのと
どちらが先でしょうか?
gcc3.2.4では前者の方が先のようですが何かできちんと定められています?
603デフォルトの名無しさん:04/09/30 02:40:00
604デフォルトの名無しさん:04/09/30 02:51:34
ありがとうございます。よく分かりました。
605デフォルトの名無しさん:04/09/30 06:43:48
参考書でビットを左に回転するという問題で、int a = 0x8000やif(i & 0x8000)という表記があったのですが
0x8000は何進数の数字なのでしょうか。
Xが入っているところからして2進数でもないし、8進数でも10進数でも16進数でもなさそうですし
文字列だとしてもintは整数値の変数だから文字列は入れられないですし・・

コードです
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_36/code.txt




VC++6.0使用しています。
606デフォルトの名無しさん:04/09/30 06:53:55
0xと頭にくれば、16進数です。
607デフォルトの名無しさん:04/09/30 07:12:07
>>606
そういえばそんなのがあった気がしました、どうもです
608デフォルトの名無しさん:04/10/01 01:29:40
天然かよ
609デフォルトの名無しさん:04/10/01 02:34:35
だとしたらスゴイ
610デフォルトの名無しさん:04/10/01 08:48:49
>>608-609
たんに初心者なだけ
611デフォルトの名無しさん:04/10/01 11:17:49
c99に対応したコンパイラを教えてください
612デフォルトの名無しさん:04/10/01 11:22:44
>>611
VC++、BCC、GCC、いろいろ
613デフォルトの名無しさん:04/10/01 13:49:49
質問です。お願いします。
ファイル検索できるランチャ作ろうと思うんですけど何で作るか、何が作りやすいか教えてください。
一応候補はVBNET−c++−c−JAVA−です。
614デフォルトの名無しさん:04/10/01 14:26:30
>>613
HSPがいいが、その中ならVB.NET
615デフォルトの名無しさん:04/10/01 14:26:48
>>613
その中で>>613が良く知ってるもので。
616564:04/10/01 15:50:55
リダイレクト自己解決しました。

// 起動するウィンドウの状態
PROCESS_INFORMATION procInfo;
// 新しいプロセスの情報
STARTUPINFO startInfo;
GetStartupInfo( &startInfo);
//起動
bool bret;
bret = CreateProcess(
         "C:\\WINDOWS\\system32\\cmd.exe", // プロセスのパス(EXEのパス)
  "/C D:\\aaa.exe < D:\\input.txt >D:\\out.log",//"",// プロセスへのコマンドライン
     NULL, // ハンドル継承(プロセスへのセキュリティ)
     NULL, // ハンドル継承(スレッドへのセキュリティ)
     FALSE, // ハンドル継承を行うか否か
     CREATE_NEW_PROCESS_GROUP,// プロセスタイプおよび優先順位
     NULL, // 環境ブロックのポインタ
     NULL, // プロセスのパス
     &startInfo, // 起動状態
     &procInfo); // プロセスの情報

//開放
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);

最初と方向性が変わってしまいましたが、
なんとか出来ました。
皆さんありがとうございます。
617デフォルトの名無しさん:04/10/01 15:56:37
vbはやめとけ
どうしてもradがいいならc++builderつかえ

618デフォルトの名無しさん:04/10/01 15:56:40
system("D:\\aaa.exe < D:\\input.txt >D:\\out.log");
619デフォルトの名無しさん :04/10/01 19:42:08
cコンパイラの設定を行ってるのですが全て正しく行ったのに
【'D:\' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。】
と表示されてしまします。どなたか原因がわかる方いましたらお願いします。
620デフォルトの名無しさん:04/10/01 19:44:52
>>619
全て正しく行ってないから。
621デフォルトの名無しさん:04/10/01 20:22:50
>>619
D:\
というコマンドは存在しないから。
622デフォルトの名無しさん:04/10/01 20:34:31
>>619
D:かcd /d D:\のどちらか。
623デフォルトの名無しさん:04/10/01 20:39:58
D:\ではなくてD:\>bcc32です。
パスに【c:\Borland\Bcc55\bin】追加済み。
システム環境変数『Path』設定済み(変数+;c:\Borland\Bcc55\bin)
bcc32.cfgファイル、ilink32.cfgファイル作成済み。
これでエラーです。
どなたか原因解明お願い致します。
624デフォルトの名無しさん:04/10/01 20:41:38
>>623
bcc32
とだけ入力したあとでDOSの勉強しろ。
625デフォルトの名無しさん:04/10/01 20:51:22
>>624
できました!
どうもお手数かけましてすいません。。
ありがとうございます。
626デフォルトの名無しさん:04/10/01 21:06:04
コマンド プロンプトでC:\の後にDocuments and Settings\mikami>
と表示されてしまうんですが消せますか?
また消し方わかるかたいたらお願いします。
627shige:04/10/01 21:08:07
prompt
628デフォルトの名無しさん:04/10/01 21:51:58
>>626
Windows板かPC初心者板へどうぞ。

//help prompt
629デフォルトの名無しさん:04/10/02 01:53:36
class A {
public:
    A(int id): id_(id) {}
    A(int id) { id_ = id; }//ダメ
    ~A() {};
    void func() { id_++; } //ダメ
private:
    const int id_; //<--
};

メンバ変数のconstというのはコンストラクタで初期化したあとは
一切変更できない、という理解で良いですか?
自分の読んでいる本ではメンバ変数のconstについて何も触れていなかったので。
630デフォルトの名無しさん:04/10/02 02:02:43
>>629
そのとおり。
しかし、そんな本は読むだけ無駄。窓から捨てろ。
いや、これはマジな話。
入門書は定評のあるものを読んだ方が絶対に良いよ。
631デフォルトの名無しさん:04/10/02 02:09:55
メンバをconstにするとなると、コンストラクタの充実が必要だな。
さもなければ、そもそも何故staticにしないのかと突っ込まれそうだ。
632デフォルトの名無しさん:04/10/02 02:19:52
質問です。VC++で構築したプログラム(ただし、一般的な
関数しか使わない)をWinで動かした計算結果と、*.cppおよび*.h
だけをUNIXに持ってきてgccでコンパイルして作った実行ファイル
をUNIXで動かした計算結果が全く異なるということが起こった
のですが、考えられる原因は何かありますでしょうか?
633デフォルトの名無しさん:04/10/02 02:22:21
その聞き方でわかるやつは神
634デフォルトの名無しさん:04/10/02 02:22:25
>>632
どんな計算をしてるのかも分からないんじゃ
特別何といいようもないような
635デフォルトの名無しさん:04/10/02 02:24:10
実は浮動小数の書式化方法が違うだけで計算結果はまったく同じだったりしてな
636デフォルトの名無しさん:04/10/02 02:27:34
”一般的な関数”と”標準ライブラリ内の関数”じゃ大違いだぞなもし。
637629:04/10/02 02:37:43
>>630-631
ありがとうございます。読んでいるのはEssential C++です。
メンバ関数のconstや、mutableメンバ変数については解説されていたのですが。
「書いていない」というのは自分の勘違いかもしれないです。
使い道としては、何らかのID番号とか、生まれたときに一度決まったら
そのオブジェクトが無くなるまで終生変わらない属性、人間で言えば性別とか、に付けるべき、ということですね?

>メンバをconstにするとなると、コンストラクタの充実が必要だな。
>さもなければ、そもそも何故staticにしないのかと突っ込まれそうだ。
すみません。この部分がよく分からないのです。
638デフォルトの名無しさん:04/10/02 02:55:28
>>637
あー、Esseintial C++なら捨てる必要は無いわw
でも、こら、const変数の扱いなんか、読者は当然分かってるって
前提の本だからなぁ。
値は張るけど「プログラミング言語C++」は読んどいた方がいいよ。

constメンバ変数の役割についてはその理解でよいです。
static云々については俺も分からんw
639デフォルトの名無しさん:04/10/02 03:23:28
>>637
俺は>>631ではないけれども、おそらくstaticについて>>631の意図する
ところは、「例えばコンストラクタのイニシャライザで定数を代入して
いたりすると、そのようにしたい時にはstatic constメンバにするのが
普通だろうという突っ込みを受けるだろう」ということだと思う。
>>629についてはconstのまま(static不要)でいいだろうと思うが。
640デフォルトの名無しさん:04/10/02 05:21:44
>>638-639
ありがとうございます。捨てる必要が無くてホッとしました。
プログラミング言語C++は店頭で見かけたものの、1000ページ超という厚さに圧されスルーしていました。
今の本を読み終えたら、さっそく通読す・・・るのは大変そうだけど辞書代わりに使えそうですね。

>「例えばコンストラクタのイニシャライザで定数を代入して
>いたりすると、そのようにしたい時にはstatic constメンバにするのが
>普通だろうという突っ込みを受けるだろう」
#include <iostream>
class EssentialCplusplus {
public:
    EssentialCplusplus() :price_(3600) {}
    int price() const { return price_; }
private:
    const int price_; //再販制度?
};
//のように「コンストラクタのイニシャライザで定数を代入していたりする」よりも

class yaEssentialCplusplus {
public:
    int price() const { return PRICE; }
private:
    static const int PRICE = 3600;
};
//ya...の方がオブジェクト毎に無駄なメンバを持たないし、普通の書き方だ、という理解で良いですね?
//あまり良い例が思い浮かばなかった・・・。
int main(int argc, char *argv[])
{
    yaEssentialCplusplus book; //yaEssentialCplusplus book(); と書いて今までずっと悩んでいた。
    std::cout << "昨日の本代は、" << book.price() << std::endl;
    return 0;
}
641デフォルトの名無しさん:04/10/02 05:40:56
その例だと、オプティマイズによってメンバの実態は消えてなくなるけどね。
寧ろ、3600円が普遍的ではないので私ならstaticにはしないだろう。
642 ◆CEGOPxxn8s :04/10/02 06:33:55
>>632
それは乱数生成関数の値が違うから。
643デフォルトの名無しさん:04/10/02 06:37:39
C++は糞
つかてるやつも糞Ruby!!!!!!
Ruby >>>>>>>>>>>>>>>>>C++
Ruby!!!!!!!!!!!
Ruby >>>>>>>>>>>>>>>>>>>> Ruby!!!!!!!!!
Ruby!””””””””””””””””””###########3
644デフォルトの名無しさん:04/10/02 06:39:12
Rubyは最強言語!!!!
C++なんて論外^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Ruby >>>>>>>>>>>>>>>>>>>> C++++++++
645デフォルトの名無しさん:04/10/02 06:40:07
実行速度でもRuby .???????????>>>>>>>>>>>>>>>>>C++++++++
646デフォルトの名無しさん:04/10/02 06:46:11
Javamなんてうんjこいp!
Perlはもうメンテされてmせん。
Ruby誇らしい出宇sね。
647デフォルトの名無しさん:04/10/02 07:41:29
Rubyは超言語!
648デフォルトの名無しさん:04/10/02 10:56:31
>>642
エスパー降臨!
649デフォルトの名無しさん:04/10/02 12:22:34
int i=5;
int a[i]

はエラーがでるそうなのですが
配列のサイズに変数を指定する必要があるとき、エラーがでないように
する他の方法ってないのでしょうか?
変化するサイズの変化量を見越して多めにサイズとるしか方法はないのでしょうか?

iに5が代入されてるから定数と変わらないような気がするんですけど…
なんでなんだろう…
650デフォルトの名無しさん:04/10/02 12:25:16
>>649
C99かmalloc
651デフォルトの名無しさん:04/10/02 12:31:21
vector使う
652デフォルトの名無しさん:04/10/02 12:34:07
enum{ i=5 };
653デフォルトの名無しさん:04/10/02 12:36:37
>>649
> はエラーがでるそうなのですが
せめて自分でコンパイルして確認してから質問に来てください。
654デフォルトの名無しさん:04/10/02 12:42:53
#include <vector>
してから
int i=5;
std::vector<int> a(i);
655デフォルトの名無しさん:04/10/02 12:43:39
C++のメソッド内で起きたエラーの扱いに関してですが、
実行環境に依存するエラー(ex:ファイルが存在しない)を通知する場合

・メソッドの戻り値としてエラーが発生した事を返す
・std::runtime_errorを投げる
・std::exceptionから自前の派生クラスを定義してそれを投げる

などが考えられますが、どれを使うべきでしょうか?
656デフォルトの名無しさん:04/10/02 12:45:49
>>649
int i = 5;
int *a = new int[i];
delete [] a;
657デフォルトの名無しさん:04/10/02 12:53:36
>>655
返り値で通知するか例外投げるかは設計次第だが、そこでなんで
・std::runtime_error派生の独自例外クラス
という選択肢がない?
658デフォルトの名無しさん:04/10/02 12:57:36
ファイルが見つからないといった想定できるエラーケースでは戻り値で返すのが
いいんでないの?

ただ、コマンドパターンとかプロクシパターンとかの複雑な処理の中で、
中から呼び出し元に例外(エラー)を伝えるんだったら例外のほうがすっきり
する場合があるよね。

エラーするかしないかの二値しかない場合はエラーコードで。
エラーにバリエーションがあるけどコードで済む場合
(エラーの原因が渡したパラメータ*のみ*に依存する場合なんかね)もエラーコードで。
渡されたパラメータに依存しない(メモリ不足で継続不能とか)は例外で。
呼び出し元にエラーの詳細情報を送り付けたいときも例外で。
659デフォルトの名無しさん:04/10/02 13:12:34
原理主義すぎるかもしれないけど、エラーを返すのが目的の関数でもない限り、
戻り値にエラーコード入れるのは違うと思う。

C 系言語は関数のシグネチャで戻り値に名前をつかられるようになってないので、
戻り値は出来るだけ関数から自然に想像できる値だけにして、
それ以外は例外か、最悪ポインタ渡しにしたほうがいいと思う。
660デフォルトの名無しさん:04/10/02 13:15:47
errnoってのもあるし。
661デフォルトの名無しさん:04/10/02 13:18:08
C++ の STL は積極的に使うべきなの?
662デフォルトの名無しさん:04/10/02 13:26:55
使えるときはね
663661:04/10/02 13:32:42
>>662
サンクス。
通常の配列で処理可能のケースでも vector とか使うほうがエエの?
664デフォルトの名無しさん:04/10/02 13:32:57
>>650
調べてみます
>>651
調べてみます
>>652
iはいろいろな数字に変化するようにしたいので…
>>653
実際には構造体の配列変数でやってる時に”C2057定数式が必要です”というエラーがでまして
F1で調べて見ると簡単な例として>>649みたいな例が載ってたのでその例を元に質問をしてみました

実際には

struct a b[i]

みたいに使っててエラーがでました

>>654
調べてみます
>>656
調べてみます

レス下さった方々ありがとうございました
まだ初心者なので
皆さんのレスを参考に調べてわからないとこがありましたらまた質問するかもしれないので
その時もよろしくお願いします
665デフォルトの名無しさん:04/10/02 13:34:40
>>663
他の箇所でvectorなどを使っている場合は、一貫性を示すために使う場合もある。
一貫性が重要。
666デフォルトの名無しさん:04/10/02 13:35:03
vectorは遅い。
667デフォルトの名無しさん:04/10/02 13:38:03
窓の杜でいいじゃん。
668デフォルトの名無しさん:04/10/02 13:38:47
仕様の段階で固定個数であることが自明なら配列、
それが必要になった段階で個数が確定している状況ならnew、
そうでないならvectorだなぁ。
669デフォルトの名無しさん:04/10/02 13:42:25
標準ライブラリには auto_array がついてないので new 配列は使用禁止。
670661:04/10/02 13:52:43
>>665-669
ベリーサンクス!
vector の最大の利点は動的にサイズ拡張できる、ってことですかね?
VisualBasic の ReDim みたいな。

まだ勉強中なので >669 の言ってる意味がわかりません。スマソ
671デフォルトの名無しさん:04/10/02 14:02:10
vectorならdeleteする必要がない
newと違ってやりっぱなしでいい。
672デフォルトの名無しさん:04/10/02 14:03:57
boost::scoped_array
673デフォルトの名無しさん:04/10/02 14:06:39
それ標準じゃないしい
674655:04/10/02 14:25:25
やはりいろいろな思想があるようですね

>>657
ソレダ⊂(。Д。⊂⌒' つ
何で気づかなかったんだ
675デフォルトの名無しさん:04/10/02 17:40:40
boost::array
676デフォルトの名無しさん:04/10/02 19:13:17
また、「vectorは遅い」厨が湧いてきたか・・・。
知ったかぶりして恥ずかしくないのかねぇ。
677デフォルトの名無しさん:04/10/02 19:28:47
vectorはわりと速いよ
それは前に実証済みだったと思うけれど…
678デフォルトの名無しさん:04/10/02 20:03:59
正しい使い方しないと遅いけどな。
679デフォルトの名無しさん:04/10/02 20:56:59
vectorは生配列よりは要素アクセスも遅いよ。まあ常識だけど。
生のポインタアクセスと同じ速さにしたければ
T *ptr = &vec[0];
みたいにポインタを取ってからポインタ演算して使う。
これも常識だけど。
680デフォルトの名無しさん:04/10/02 21:02:09
脳内常識をムキになって披露しなくていいのに。
なにか嫌なことでもあったのかな。
681デフォルトの名無しさん:04/10/02 21:23:07
682デフォルトの名無しさん:04/10/02 21:31:43
>>681
やっぱそうだよな。常識だよな。
683デフォルトの名無しさん:04/10/02 21:32:56
コンパイラや実装にも依ると思うが
[]使ったアクセススピードは大抵の場合、全く同じかほぼ同じぐらいのレベルだろ

と思って書き込む前にリロードしたら>>681 …?
  測定:生配列 ポインタ 使用した時間 641
  測定:すべてをポインタにした vector 使用した時間 1903
なんでこんなに違うんだ?
明らかにおかしくないか
684デフォルトの名無しさん:04/10/02 21:36:32
本当かよ?って思ったから実際やってみたぞ。
VC7.1で、/O2付きSTLportだ。

>array:80.306[ms]
>vector:80.0303[ms]
だったぞ。全然かわらんではないか。
685デフォルトの名無しさん:04/10/02 21:36:49
まあ速度が重要ならこうアクセスするのはvectorの基本だよ。
int *p = &vec[0];
int s = vec.size();
for(int i = 0; i < s ; ++i)
{
p[i] = x;
}
686デフォルトの名無しさん:04/10/02 22:49:21
ポインタ値を直接増減させるよりp[i]のように
ポインタ値にインデックスを加算する方が早いらしいね。
687683:04/10/02 23:07:36
>>684の見て安心した

  測定:生配列 ポインタ 使用した時間 641
  測定:すべてをポインタにした vector 使用した時間 1903
の例とか見ても>>681のサイトは明らかにおかしいし、
大抵のコンパイラならvectorの実装を見てもそんなに遅くなる分けないし
688デフォルトの名無しさん:04/10/02 23:08:47
Ruby >>>>>>>>>>>>>>>>>>>>>>Vector
689デフォルトの名無しさん:04/10/02 23:11:35
Vector >>>>>>>>>>>>>>> 窓の杜
690デフォルトの名無しさん:04/10/02 23:59:37
>>685
vectorに関する勘違いの基本だな。
691デフォルトの名無しさん:04/10/03 05:09:15
大抵の実装を見ても、vectorが生ポインタより明らかに遅くなる要素は見あたらないからね。
配列と比較しての、生成/破棄のコストを除いて。

あえて違いを挙げるとすれば、
classのメンバは必ずメモリ上に置かれるので
レジスタに割り付けられる可能性の高い生ポインタより
ベンチ上は若干遅くなる可能性はあるかもしれないけど。
692デフォルトの名無しさん:04/10/03 09:27:52
struct a b[i];
をvectorを使って
std::vector<struct a> b(i);
と書き換えたのですが
0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。
というエラーが実行中に出て
xmemory internal header (from <memory>)
のoperator delete(_Ptr);という行が表示されました

どうすればうまくいくのでしょうか?

693デフォルトの名無しさん:04/10/03 09:46:08
>>692
うまく代入出来てないだけでは。
例えば、struct aのコビーコンストラクタとoperator=がうまく動いてないとか
694デフォルトの名無しさん:04/10/03 15:41:30
(お持ちの方がいればAccelerated C++、206ページの話です)
初歩的なことですがC++で質問です(現在、C++言語の基礎を学習中)。
vectorを大まかに再現したクラスを作成中です。
そのデストラクタを作っているのですが、それぞれのデータ要素の
破棄をした後にメモリを解放するのはなぜでしょうか?
というより、メモリを解放してもデータ要素は残るものなのでしょうか?
ちなみに、<memory>ヘッダにあるallocatorクラスの、destroyとdeallocateを
つかっています。
695デフォルトの名無しさん:04/10/03 16:02:56
>>694
構築されたデータは適切に解体されなければならない。
たとえばそのvectorに次のようなクラスを入れることを考える。
struct test
{
    test() :p(new int){}
    ~test(){delete p;}
private:
    int *p;
};
testのインスタンスが構築されるだけで解体されないとメモリリークが起こる。
一般に、クラスは正しく解体されることを前提として設計されているから、
コンテナを書くときは要素を破棄しないといけない。

>というより、メモリを解放してもデータ要素は残るものなのでしょうか?
std::allocator<test> alloc;
test *g = alloc.allocate();
alloc.construct(p);
alloc.deallocate(p);
*gのデストラクタが呼ばれないから、このコードはメモリリークを起こす。
696695:04/10/03 16:04:43
訂正。
>alloc.construct(p);
>alloc.deallocate(p);
alloc.construct(g);
alloc.deallocate(g);
697デフォルトの名無しさん:04/10/03 17:15:45
>>695
ありがとうございました。
クラスを入れる場合、破棄しないとそのデストラクタがさぼってしまう
てことですよね。ということは逆に考えると、
(再利用性や現実味は置いといて)組み込み型のみを入れ、初期化を
ちゃんとするなら破棄はあってもなくても問題は起こらないのでしょうか?
連続質問すいません。コンストラクタむずい・・・。
698デフォルトの名無しさん:04/10/03 17:35:21
>>697
その通り。
#include <cstdlib>
void f()
{
int *p = std::malloc(100 * sizeof(int));
/* ここでpをつかう */
std::free(p);
}
C言語ではこんな感じでよく使われる。(malloc/freeはallocator::allocate/deallocateに相当)
699デフォルトの名無しさん:04/10/03 17:37:12
>>697
たぶん問題ないんじゃない?
C++でもmalloc/freeは使えるんだから。
700692:04/10/03 17:37:31
>>693
レスありがとうございます
要素数がiしかないのにi+1個の要素を入れようとしてたためにエラーが起こったようです
おかげさまで無事解決しました
701デフォルトの名無しさん:04/10/03 17:37:34
>>697
オブジェクトの寿命と、オブジェクトを配置するメモリの寿命は分割し得るということ。
702デフォルトの名無しさん:04/10/03 17:44:48
>>695
>>699
>>701
当たっててよかった・・。理解できてるようです。
本当にありがとうございました。もう、まっすぐに感謝です。
703デフォルトの名無しさん:04/10/04 06:46:50
struct a {
float x1,y1,x2,y2;
};

std::vector<struct a> b(20);
b[1].x1=10;

としてもb[1].x1に10が代入されてないのですけど
なぜでしょうか?

704デフォルトの名無しさん:04/10/04 07:12:31
>>703
> b[1].x1に10が代入されてない
何を見てそう思ったの?
705デフォルトの名無しさん:04/10/04 07:14:37
>>704
         HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
wsprintf(szBuf, "%d", b[1].x1);
TextOut(hdc, 1, 1, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);

で画面にb[1].x1の内容を表示させたら0が表示されました
706デフォルトの名無しさん:04/10/04 07:21:46
>>705
代入と表示の間のコードはどうした?
なるべくソースを貼りたくない気持ちはわからんでもないが、
それじゃぁ何も知らない他人に教えてもらうことは期待できないぞ。
707デフォルトの名無しさん:04/10/04 07:25:08
>>705
> wsprintf(szBuf, "%d", b[1].x1);
floatじゃなかったのか?
708デフォルトの名無しさん:04/10/04 07:30:46
>>706
代入と表示の間のコードはこれだけなんですが…
b[1].x1=10;以降は配列bはいじってないです
709デフォルトの名無しさん:04/10/04 07:36:10
>>706
>>707
struct a {
float x1,y1,x2,y2;
};

struct a {
int x1,y1,x2,y2;
};
にかえたらうまいこといきました
レスありがとうございました

それと、初歩的な質問なんですけど
なぜfloatだと0が表示されるんですか?
710デフォルトの名無しさん:04/10/04 08:26:31
"%d"はint型を処理する。float, doubleを渡したときは何が起こるかわからない。
"%f"はfloat, double型を処理する。char, short, int, longを渡したときは何が起こるかわからない。
711デフォルトの名無しさん:04/10/04 08:59:34
>>710
丁寧にご説明ありがとうございます

floatを表示させたいので早速
struct a {
float x1,y1,x2,y2;
};
wsprintf(szBuf, "%d", b[1].x1);

struct a {
float x1,y1,x2,y2;
};
wsprintf(szBuf, "%f", b[1].x1);
に変更したところ
画面には”f”という文字が表示されてしまいました

なぜでしょうか?
712デフォルトの名無しさん:04/10/04 09:05:55
wsprintfが対応してないから
713デフォルトの名無しさん:04/10/04 09:09:01
sprintf使っとけ
714デフォルトの名無しさん:04/10/04 09:18:04
>>712
>>713
即レスありがとうございます

早速
wsprintf(szBuf, "%d", b[1].x1);

sprintf(szBuf, "%d", b[1].x1);
に変更したところちゃんと表示されました

レスのために貴重な御時間をさいてくださってありがとうございました
715デフォルトの名無しさん:04/10/04 09:30:19
>レスのために貴重な御時間をさいてくださってありがとうございました
こういうことを書かれても、ちょっと調べれば判ることを質問された後だけに
誠意の欠片も感じられない気がする恭子の頃。
716デフォルトの名無しさん:04/10/04 10:29:04
std::stringstream変数をクリアーしたいのですがどうすればいいのでせう?
717デフォルトの名無しさん:04/10/04 10:43:12
int h;
float x;
h=10;
x=h*10.0;
とすると
warning C4244: '=' : 'double' から 'float' に変換しました。データが失われているかもしれません。
という警告が出ます
x=h*float(10.0);
とすると警告がでなくなるのですが
10.0がdoubleだから警告がでるのでしょうか?
x=10.0;としても警告でないから10.0はdoubleじゃないような気もするし…

なぜ警告が出るのでしょうか?
718デフォルトの名無しさん:04/10/04 11:46:12
>>716
std::stringstream foo;
foo.str("");
719デフォルトの名無しさん:04/10/04 11:47:30
>>717
10.0 は doube。
10.0f が float。
720デフォルトの名無しさん:04/10/04 11:53:02
>>718
おーそんなふうに使うのか
レスありがとうございますです
721デフォルトの名無しさん:04/10/04 13:03:08
演算途中に倍精度型が含まれてると、その部分だけ式の両辺が倍精度型に
格上げされてから演算が行われる。

結果の格納先が単精度型だと、倍精度が単精度型に変換されるんで、
いちいち変換処理が入って無駄が多い。

どうしても単精度がよければ式に倍精度型が含まれないようにいちいち
気を配ってやらなきゃいけない。

データがでかすぎてメモリが足りなくて、かつこれ以上アルゴリズムの改善も
出来ないという場合でなければ、倍精度型を常用したほうがいいよ。
722デフォルトの名無しさん:04/10/04 13:51:39
>>719
なるほどx=h*10.0;をx=h*10.0f;とするとエラーが出ませんね
x=10.0;は右辺がdoubleなのになぜ警告が出ないんでしょうか?

>>721
どうしても単精度をつかわないといけないんです
>どうしても単精度がよければ式に倍精度型が含まれないようにいちいち
>気を配ってやらなきゃいけない。
x=h*10.0f;このようにfをつけて10.0を単精度に変換すればいいということでしょうか?

すごく勉強になりました
ご返答ありがとうございました


723デフォルトの名無しさん:04/10/04 14:25:54
質問です。
自作のプログラムですが、外部ファイルのデータを10MBほど読み込んで
そのデータに基づいてプログラムが動きます。
この外部ファイルデータをプログラムに埋め込みたいのですが
うまくいきませんでした。データを16進ダンプして0x00〜0xFFに置き換え、
以下のようにunsigned char配列に格納しようとしました。
unsigned char array[] = {
#include "data.h"
};
しかし、配列サイズが大きすぎて最大メモリ割り当てを超えてしまいました。
VC++.NETです。/Zmオプションも使いましたが変化ありませんでした。
こういう巨大データをプログラムに埋め込む場合、どうすりゃいいのでしょうか。
724デフォルトの名無しさん:04/10/04 14:32:27
staticにしる
725723:04/10/04 14:49:17
>>724
staticですか。試してみます。
しかし実は、この配列をプログラム内ではさらに構造体配列に
マップしようと思っています。そういうのはアリなんでしょうか。
sturct abc {
float xyz[3];
float col[4];
} *ddd;
のような構造体があったとき、
ddd = (struct abc *)array;
のようなことをしたいのです。本当はクラスをマップしたいのですが、
メンバ関数や継承データのことを考えると難しそうなので構造体にしました。
726デフォルトの名無しさん:04/10/04 14:51:24
>>725
試してから言え
727デフォルトの名無しさん:04/10/04 15:24:02
winapp error LNK2019: 未解決の外部シンボル _main が関数 _mainCRTStartup で参照されました。
winapp fatal error LNK1120: 外部参照 1 が未解決です。

このようなエラーが出てしまいます。初心者なのでどうやって解決していいか分かりません。
教えてください。
728デフォルトの名無しさん:04/10/04 15:28:41
>>727
"_main が関数 _mainCRTStartup で参照されました。"の文をGoogleで検索してみな・・・
729デフォルトの名無しさん:04/10/04 15:45:32
有難うございます。そこで、win アプリケーションでしたところ、ビルドは
できたのですがデバッグで、このようにでました。
'WinApp.exe': 'C:\WINNT\system32\NTDLL.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\KERNEL32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\USER32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\GDI32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\imm32.dll' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\ADVAPI32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\rpcrt4.dll' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
プログラム '[1760] WinApp.exe: ネイティブ' はコード 87 (0x57) で終了しました。

これはなんですか?
730デフォルトの名無しさん:04/10/04 15:49:30
>>729
"必要な DBG ファイルが見つからないか、開けません。"をGoogleで
っていいかげんにしろコラ
731デフォルトの名無しさん:04/10/04 16:04:06
732デフォルトの名無しさん:04/10/04 16:38:57
クラスをvecter使って管理しようと思うのですが
やっぱりポインタを使ってvecterで管理するのが一般的ですよね?
でもポインタで管理するとリークの心配があるかなぁ?
ポインタで管理と実態で管理、どっちがC++ではいいのでしょうか?

ポインタを使わないでやった事ある人いませんか?


733デフォルトの名無しさん:04/10/04 16:48:11
>>732
そのクラスがコピー不可orコピーにかかるコスト大ならポインタでやればよろし。
リークしたくないんならboost::shared_ptr使え。
734デフォルトの名無しさん:04/10/04 16:48:32
ポインタ面倒ならスマートポインタでも使え
735デフォルトの名無しさん:04/10/04 17:15:52
>>733-734
どうもです。
作りとしてはこれでいいのですよね?↓
#include <vector> // STL std::vector<>
class Data
{
public :
int a;
int b;
} ;

std::vector< Data > DataVecter ; // Dataを管理してあとで使いたい

int main()
{
{
Data X;
Data Y;
Data Z;
X.a = 100;
X.b = 100;
Y.a = 200;
Y.b = 200;
Z.a = 300;
Z.b = 300;
DataVecter.push_back(X);   //ここで入れてみる
DataVecter.push_back(Y);
DataVecter.push_back(Z);
}
int a = DataVecter[2].a;           //この辺で使ってみる
return 0 ;
}
736デフォルトの名無しさん:04/10/04 17:32:27
C++ as better Cかな?
737デフォルトの名無しさん:04/10/04 17:35:10
>>735
その目的なら、適切なコンストラクタを用意して、
DataVector.push_back(Data(100, 100));
DataVector.push_back(Data(200, 200));
DataVector.push_back(Data(300, 300));
でいいね。
738デフォルトの名無しさん:04/10/04 17:36:31
>>735
やってみて言ってるのか?
739デフォルトの名無しさん:04/10/04 17:38:37
つか、それなら

Data X;
X.a = 100;
X.b = 100;
DataVecter.push_back(X);
X.a = 200;
X.b = 200;
DataVecter.push_back(X);
X.a = 300;
X.b = 300;
DataVecter.push_back(X);

で良いんでは?
740デフォルトの名無しさん:04/10/04 17:42:15
>>737でいいじゃん
簡単に書けてRVOも効きそうだし
741デフォルトの名無しさん:04/10/04 17:45:26
>>737
あ、すんません
あくまで例でして
データが入ったクラスをvecterで管理がしたいのです。
742デフォルトの名無しさん:04/10/04 17:47:33
あ、そんでデータクラスの中身は
数値が少々と文字列
もしかしたらクラスも入るかもです。
743デフォルトの名無しさん:04/10/04 17:54:11
俺ならATLでCAutoPtrArray使っちゃう。
744デフォルトの名無しさん:04/10/04 22:21:48
Cで書かれたライブラリで関数ポインタを受け取るものに
インスタンスのメンバ関数を(上手く言えない・・・)呼び出させたいです。
例えば
#include <iostream>
//(例)この部分は自分でいじれない----------
typedef int (*pfunc)(void);
static void
hoge(pfunc p)
{
    std::cout << p() << std::endl;
}
//------------------------ここまで

class A {
public:
    A(int i) :i_(i) {}
    int foo(void) { return i_; }
private:
    int i_;
};

int
main()
{
    A a(100);
    hoge(?????); //aのメンバ関数foo()を呼び出させたい
    //Perlだと、aがリファレンスとして hoge( sub { a->foo() } );のような感じか・・・
}
745デフォルトの名無しさん:04/10/04 22:26:10
>>744
出来ません。
普通の関数ポインタと、メンバ関数へのポインタは型が違います。
746デフォルトの名無しさん:04/10/04 23:36:05
extern "C" と this渡しとメソッドのアドレス渡しでなんとかしれ
747デフォルトの名無しさん:04/10/04 23:51:18
>>744
A *p (NULL);
int hage () {return p ? p->foo () : -1;}
int main() {
A a(100);
p = &a;
hoge(hage);
return 0;
}
748デフォルトの名無しさん:04/10/05 00:00:02
質問です

継承したクラスの使い方がわかんなくなってきました
下のように、純粋仮想ベースクラスと、それを継承したものがあったとします

class CBasetest{
virtual int test() = 0;
};
class Ctest : public CBasetest{
int test(){return 0;}
};

で、気づいたらこんなソース書いてました

CBasetest *pBase = new Ctest;//1
delete pBase;//2

2の時にCBasetestのまま開放するのが正しいかどうかわかんなくなってしまって・・。
delete (CBasetest *)pBase;//3
みたいに、キャストしないといけないんですかね。正しい方法教えてください
749デフォルトの名無しさん:04/10/05 00:00:56
さすがC++スレ
糞みたいな質問と低レベルな会話ぷぷぷ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++++++++++
750デフォルトの名無しさん:04/10/05 00:13:49
>748
Ctest *pTest = new Ctest;
delete pTest;
という選択肢はないのかよ
751デフォルトの名無しさん:04/10/05 00:15:49
CBasetestに空の仮想デストラクタをつけとけば今後何かとOK
752デフォルトの名無しさん:04/10/05 00:22:34
>>748
class CBasetest{
public:
virtual int test() = 0;
virtual ~CBasetest () {}
};
class Ctest : public CBasetest{
public:
int test(){return 0;}
};
ノイローゼ?
753デフォルトの名無しさん:04/10/05 00:29:52
class A {
public:
    class B {
    };
};
のように(private,protectedでなく)publicにクラスをネストさせる意味とは何でしょうか?
754デフォルトの名無しさん:04/10/05 00:41:53
>>753
入れ子クラスにすることで、その入れ子クラスが単体では無意味であることをユーザに暗示できる。
言い換えると依存関係をユーザに暗示できる。
VisualStudioなどのIDEでクラスビューのトップツリーにクラスが乱立するのを抑止できる。
755デフォルトの名無しさん:04/10/05 01:56:04
>>753
class A固有のインタフェースないしプロキシであるところのclass B
756デフォルトの名無しさん:04/10/05 02:00:04
>>748
class CBasetest {
virtual ~CBasetest()=0;
};
これで delete pBaseで各派生クラスのデストラクタが呼び出される。
基底クラスにはvirtualなデストラクタを用意するというのは基本中の基本。
しっかり覚えときや。
757デフォルトの名無しさん:04/10/05 02:42:44
>756
>748は
CBasetest *pBase = new Ctest;//1
delete pBase;//2
ってやってるからデストラクタを純粋仮想関数にするのはまずくないか?
class CBasetest {
virtual ~CBasetest(){ /* 処理 */  };
};

758デフォルトの名無しさん:04/10/05 03:05:33
>>757
あっ、ホントだよ。デストラクタを純粋仮想にしてどうすんだよ。
空のデストラクタ用意しとかなまずいわな。
virtual ~CBasetest() { //中身なし };

酔っ払ってるとダメだなw
759デフォルトの名無しさん:04/10/05 03:54:25
↑さらにダメだなw
× { //中身なし };
○ { /*中身なし*/ };

もうねます。じゃねー。
760デフォルトの名無しさん:04/10/06 02:11:51
class CGlobal
{
public:
static int globalData;
};
グローバル変数代わりに使いたいんですが
ネームスペース使うだけで、外部参照を行うことってできないんですか?
CGlobal::globalData=10;みたいに他のファイルで操作したい。
エラーが起こったんですが、別の部分で間違ってる可能性もあるので。
761デフォルトの名無しさん:04/10/06 02:15:49
>>760
エラーが起こったならエラーメッセージを貼れ。
一番的確な情報だ。
762デフォルトの名無しさん:04/10/06 02:31:22
外部参照エラー出ました。しかもそのglobalDataに当たるモノ
が。貼る事はできません。違うPCでネットしてるので。すいません。
externすればいいのかな。
763デフォルトの名無しさん:04/10/06 02:51:46
>>762
class 定義内での static データメンバに初期化子が無ければ、それは宣言だけになる。
初期化子をつけて同時に定義とするか、クラス定義外に static データメンバの定義を追加しる。
764763:04/10/06 02:56:32
ごめん。
初期化子つけて同時に定義とできるのは、型が const 付きの整数か enum の時だけ。
>>760 は整数だけど const 付いてないから、初期化子つけて定義にはできない。

ってことで、
クラス定義外に static データメンバの定義を追加しる。
765デフォルトの名無しさん:04/10/06 03:09:41
その通りでした。。。
初期化忘れてました。
>>class定義内で...
でも、class定義内で初期化子つけて宣言ってできませんよね。?
初期化子つけないと定義されないというのは知らなかったです。
つけなきゃいけないってのは分かってた(つもり)でしたが...
ありがとうございました。
これで、extern無しでグローバルスコープだ。わぁい。
766762:04/10/06 03:26:50
>>764
入れ違いでしたね。レスありがとう
767デフォルトの名無しさん:04/10/06 05:17:31
以下のソースをVC6でコンパイルしようとしたところ、
#include <iostream>
class Display {
public:
    static Display& screen();
    void show() {}
private:
    Display() { std::cout << "Display()" << std::endl; }
    ~Display() { std::cout << "~Display()" << std::endl; }
    Display(const Display&);
    Display& operator=(const Display&);
};

Display&
Display::screen()
{
    static Display display;
    return display;
}

int
main()
{
    Display& display = Display::screen();
    display.show();
    return 0;
}
「error C2248: 'Display::~Display' : private メンバ (クラス 'Display' で宣言されている)にアクセスできません。
'Display::~Display' の宣言を確認してください。」
デストラクタをpublicにしたらコンパイルは通るのですが、privateではいけないのですか?
mingw/g++(3.2.3)では-Wall -Werror -g -O2で何も言われずにコンパイルできたのです。
どちらが正しいのか分からなくなrじょってきあたですす。
768デフォルトの名無しさん:04/10/06 05:41:26
>>767
g++。VC6はダメダメだからC++の勉強には向かないYO。
769デフォルトの名無しさん:04/10/06 08:17:44
VC6は窓から投げ捨てろ
770デフォルトの名無しさん:04/10/06 10:13:01
それ、本当にg++の挙動の方が正しいのか?
771デフォルトの名無しさん:04/10/06 11:41:16
>>767
デストラクタがprivateだったら誰も破棄できないやん。
staticなオブジェクトだって、プログラムが終了するときには
デストラクタが呼ばれるはずでしょ。
772デフォルトの名無しさん:04/10/06 11:53:08
deleteするときにprivateだとまずいのでは?
同じく、newするときもprivateだとエラーじゃなかったかな?
売る覚えスマソ。
773デフォルトの名無しさん:04/10/06 11:58:49
Display::screen から呼び出してるように見える。
private でもいけるように見える。
774デフォルトの名無しさん:04/10/06 12:00:32
>>771
>デストラクタがprivateだったら誰も破棄できないやん。
自分のクラス内なら破棄できる。
775デフォルトの名無しさん:04/10/06 12:09:39
メンバ関数であってもstatic変数にすると、廃棄する(デストラクタ呼ぶ)のがクラス外という扱いになるっぽい>cl&bcc32
仕様に詳しい人解説キボンヌ
776デフォルトの名無しさん:04/10/06 14:18:01
>>774
delete this;?
777デフォルトの名無しさん:04/10/06 14:25:33
C++のアクセス制御はオブジェクトではなくクラスに対して働く。
デストラクタがprivateでも同じクラスのメンバ関数内なら実体作れる。
778デフォルトの名無しさん:04/10/06 15:08:13
質問があります。
クラスメソッドのGet〜()やSet〜()で引数の範囲チェックを行っていると速度的に不安になるのですが、
普通こういうのはReleaseビルド時にはチェックを行わないようにしちゃうものなのでしょうか?
779デフォルトの名無しさん:04/10/06 15:26:27
なわけねえだろ
780デフォルトの名無しさん:04/10/06 15:34:20
>>779
ということはみんな我慢してチェックしてるんですね、レスどうもでした
781デフォルトの名無しさん:04/10/06 15:42:11
範囲チェックを関数側と呼び出し側のどっちに持たせるかとか
速度気になるなら範囲チェックしない版を用意するとか考えろや
デバッグ時とリリース時でコード変えたらデバッグの意味がねー
782デフォルトの名無しさん:04/10/06 15:54:04
>>781
あっなるほど、呼び出し側でチェックするわけですか。
勉強になりますた(・∀・)
783デフォルトの名無しさん:04/10/06 17:33:56
お願いします。わかりません。

*
* *
* * *
* * * *
* * * * *

次は、上のような表示を行うプログラムです。空欄を埋めて完成せよ。


#include <stdio.h>

int main( void )
{
int i ,j;

for(i=1; i<=5;i++){

  空欄

   return 0;
}
784デフォルトの名無しさん:04/10/06 17:37:39
>>783

puts("*\n**\n***\n****\n*****");
break;
785783:04/10/06 17:38:44
すみません。
         *
        * *
       * * * 
      * * * *
     * * * * *

でした。よろしくお願いします
786デフォルトの名無しさん:04/10/06 17:41:22
>>785

puts(" *\n * *\n * * *\n * * * *\n* * * * *");
break;
787デフォルトの名無しさん:04/10/06 17:46:58
______\/┏┏┏┓┛┗━━━━━┻┃┃┃
  パーツを教えてやるよ。あとは自分で考えな。
788デフォルトの名無しさん:04/10/06 17:51:02
>>783の上の詰まってるをどうやって書くか分かれば、後は左の空白をどうするかだろ
段々、空白が減ってるから
789デフォルトの名無しさん:04/10/06 17:57:50
790デフォルトの名無しさん:04/10/06 19:11:24
Cの質問じゃないだろ。アルゴリズムの問題。
CであろうがVB、Java、Perl、Ruby、Pascalであろうが関係ない。
よって、スレ違いかと思われる。
791デフォルトの名無しさん:04/10/06 19:17:56
それ以前に宿題スレ逝け
792デフォルトの名無しさん:04/10/06 19:21:30
>>785
int count=10;
{
int i=0;
for(; i<count; ++i){
  printf("% *s",count-i,"");
int j=i+1;
for(; j>0; --j)
  printf("*");
puts("");
}
793デフォルトの名無しさん:04/10/06 19:33:23
>>792
int i, jだけでやらなきゃ駄目なんじゃね?
794デフォルトの名無しさん:04/10/06 19:50:31
Borland C++ Builder + ADO (Not Express) でmdbをいじるなんてことやってますが
ADOを勉強しないことには進まない、位まで行き詰まってます

適切なスレ、掲示板、サイト等
いい所がありましたら、案内をお願いします
795デフォルトの名無しさん:04/10/06 20:24:32
>>785
int i=0,j=10;
for(; i<j; ++i)
printf("% *c%s\n",j-i,' ',&("**********"[(j-i-1)*2]));
796デフォルトの名無しさん:04/10/06 23:40:46
C++hakuso
Ruby >>>>>>>>>>>>>>>>>>>>> CCCCCCCCCCCCCC+++++++
797デフォルトの名無しさん:04/10/06 23:58:16
main.c test1.c test2.c のソースファイルがあるとします。
#gcc -c main.c test1.c test2.c
で main.o test1.o test2.o を作成します。

test1.oとtest2.oをまとめて1つのオブジェクトを作成し、
後でmain.oとくっつけて実行ファイルを作成するには
どうやれば良いんでしょうか?
#gcc -o subprogram test1.o test2.o
とやるとmain関数がありませんって怒られます。
798デフォルトの名無しさん:04/10/07 00:02:51
ar
799デフォルトの名無しさん:04/10/07 01:21:29
>>797
↓じゃないの?
#gcc -o subprogram main.o test1.o test2.o
800デフォルトの名無しさん:04/10/07 01:26:26
>>797
main.oは後からくっつけたいのです。

test1.oとtest2.oだけをくっつけたオブジェクトを作成し、
その後、作成したオブジェクトとmain.oをくっつけたい訳です。

801デフォルトの名無しさん:04/10/07 01:41:01
C言語で、
for( int i = ...; ...; ... ){ ... }
のように、for 内で int i のように変数宣言するのは大丈夫でしょうか?
802デフォルトの名無しさん:04/10/07 01:49:13
>>801
C99なら。
803デフォルトの名無しさん:04/10/07 01:57:28
>>800
何故くっつけたいのか聞かせてもらおうか。
#答は既に>798にあることだし。
こんばんは、VC++初心者です。

<質問内容>
リストビューのアイテム毎の背景色変更についてです。
*カスタムドローにて、【猫でもわかる〜】に記載されている
処理は実現できました。
 ttp://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm
応用として、一定時間毎にリストビューのアイテムが
上から順々に背景色を変更していく処理を実現したいのですが、
散々悩んだ挙句、できませんでした。
何卒、ご教授お願いいたします。

<開発環境>
OS : Windows XP
VC : VC++ 6.0 SDK ダイアログベースアプリ
805デフォルトの名無しさん:04/10/07 10:23:03
グローバル変数なら関数に引数として渡さないでもその関数内でも有効なんですか?
806デフォルトの名無しさん:04/10/07 10:25:48
>805
Yes! Yes! Yes!
807デフォルトの名無しさん:04/10/07 10:28:26
>>804
タイマー使ってできないのー?
808デフォルトの名無しさん:04/10/07 10:31:42
>>806
レスありがとうございます

関数に引数として渡す時はどういう時なんでしょうか?
グローバル変数化してしまえば引数として渡す必要がなくなると思うんですが…
809デフォルトの名無しさん:04/10/07 10:35:54
グローバル変数の弊害という面から調べてみろ
管理ができない・難しいという罠に陥る
コーディングという面から言うなら再帰だのが使えなくなる
810デフォルトの名無しさん:04/10/07 10:40:15
>>809
目から鱗が落ちました
お返事ありがとうございました
811デフォルトの名無しさん:04/10/07 11:06:13
質問なんですが
Cの構造体をC+のクラスになおしたいときのこつって
何かありますか?
812デフォルトの名無しさん:04/10/07 11:09:26
>>811
そのまま何もしなくていい
813デフォルトの名無しさん:04/10/07 11:11:33
public:
を先頭の行に書かなきゃ
814812:04/10/07 11:12:09
ああ、structからclassにしたいならpublic:が必要。
815デフォルトの名無しさん:04/10/07 11:12:12
C++でもclassではなくstructをそのまま使える。
単純にclassに書き換えるとアクセス制御がprivateになるけど、
structのままなら関係なし。
816デフォルトの名無しさん:04/10/07 11:33:19
ファイル操作とかしてるけどそれも直さないで平気かな?
817デフォルトの名無しさん:04/10/07 11:42:15
っつかC++勉強してから書き直せ
818デフォルトの名無しさん:04/10/07 11:44:11
>>817
初心者歓迎のスレじゃないのかよ〜
ぬるぽ
819デフォルトの名無しさん:04/10/07 11:44:20
C++以前に、お前のその質問を他人が読んで理解できると思うか。
「ファイル操作」とかじゃなく、もちっと具体的に書けや。
820アイナブリッジ代理人:04/10/07 12:33:03
>>819
ファイルのヘッダなどのバイト列をstructの構造体で読み出してるのだけど
C++に変更した時はCでの手順でまずいことありますか?
821デフォルトの名無しさん:04/10/07 12:40:21
Cでその手順が問題ないと思うなら、C++でも問題ないですよ。
822アイナブリッジ代理人:04/10/07 12:50:28
>>821
そうなんですか。thx。
823アイナブリッジ代理人:04/10/07 12:51:50
>>816はてな具合にことを運びたかったのでは。
824デフォルトの名無しさん:04/10/07 12:56:16
今回、WindowsのGUI上で文字のブリンク・リバースをさせたいのですが
可能でしょうか?
(DOSならばエスケープシーケンスを使って出来そうなのですが)
環境 2000+VC6です。




825デフォルトの名無しさん:04/10/07 12:56:41
無理にC++らしくする必要はないよ。
826デフォルトの名無しさん:04/10/07 13:07:55
好きに文字色と背景色設定して描画しろ
827デフォルトの名無しさん:04/10/07 14:38:11
プログラムがなかなか進まない…
プログラムの大まかなイメージができあがるまで
手は動かさないで頭の中で考えてる時間がすごく長い
こんなのでいいのかな?
一日20行程度しか進まないw
828デフォルトの名無しさん:04/10/07 14:38:52
全然OK
829デフォルトの名無しさん:04/10/07 15:29:19
作りたいプログラムを図にして見るとわかりやすい。
プログラム組む方がどんなプログラムを作りたいか考えるより
楽しい(という表現で正しいかは不明)のだがそんな私は
逝ってよし?
830デフォルトの名無しさん:04/10/07 15:33:01
それはゲーム脳だな
831デフォルトの名無しさん:04/10/07 17:00:27
なんでもゲーム脳にしてしまうこんな世の中じゃ…
832デフォルトの名無しさん:04/10/07 17:01:25
>>830
あなたはゲーム脳脳だな
833デフォルトの名無しさん:04/10/07 17:06:59
NO, ワタシはゲーム脳ではない
834デフォルトの名無しさん:04/10/07 17:20:20
Yes,Sir
835デフォルトの名無しさん:04/10/07 17:22:01
返事の前にはSirを付けろ
836デフォルトの名無しさん:04/10/07 17:31:55
        ,.,,..::;;:::;;;::,.、,
      ,:r'^       `ヽ
     /::          :::\
    ./::: ,,,-;;;;;;...,.....,...;;-;;;;...,.::::::i     ヽ人人人/
    i;;/'|i<_O_ヽ二( <O`゙iヽ;::::!    ノ    ゝ
    l;′ヽ二/⌒ミ、二ニノ ヽ::l    ヽ    (
   _,,l;    / ^` ^´ヾ、    :::l、   丿     (_
  i │  / ,r――-、 i    i" )  ̄ヽ      (_
  ゝ .l   l i.j" ̄ ̄`jl l   l゙ ;/   )      (
   `''';   l |.l-='''''=‐/    ,r''''"   丿      ゝ
    ヽ  ヽ,`'-―-" /  ,/l      ヽ     (
     ヽ ゝ   ̄  /   .|       )   (
     ,r| ヽ、ヽ::,,;;::: ゙,/  l,,     /⌒Y⌒Y⌒ヽ
  _,,,,/ ヽ,  `''-;;;;;;-'"   丿l
''"" /   ヽ i:   ;: _/  ヽー、、
   l     \   i/     l  `'''
   l_,,,=--‐''"゙゙;r-<゙,,,,,,,    /
         |O   ""゙''''″
         |
837デフォルトの名無しさん:04/10/07 17:35:27
Sir!Yes sir!
838デフォルトの名無しさん:04/10/07 17:44:59
>>835
Sir!Negative, Sir!
839デフォルトの名無しさん:04/10/07 18:45:06
VC++5.0 でhoge.libをリンクして、実行モジュールを作りたいのですが
やり方が分かりません。具体的にどうすれば良いのでしょうか?
840デフォルトの名無しさん:04/10/07 18:50:12
プロジェクトの設定でリンカのタブから登録
841デフォルトの名無しさん:04/10/07 18:59:56
リンクタブのオブジェクト/ライブラリモジュールに
追加すれば良いのでしょうか?
842デフォルトの名無しさん:04/10/07 19:34:13
ソースファイルといっしょに追加できなかったっけ
843デフォルトの名無しさん:04/10/07 20:04:09
std::stringに格納された文字列をstd::wstringに格納するにはどうすればいいのでしょうか。
wstringにchar*やstringの定義が見つからないのですが‥‥

mbstowcsなどを使用して変換するしか方法はないのでしょうか?
とりあえずstd::wstring = WideString(std::string.c_str()).c_bstr();でお茶を濁しているのですが。
(WideStringはVCL用のワイド文字列クラス)
844デフォルトの名無しさん:04/10/07 20:10:14
DVD-RAM書き込みや、メディア(DVD)の情報を取得するには、
どのようにすればいいのでしょうか?
ご存知の方いらっしゃいましたら、教えてください。
参考になるHPを教えていただけるだけでも構いませんので、よろしくお願いします。
OS:windows2000
言語:C言語(C+ではない)
コンパイラ:VC6.0
845デフォルトの名無しさん:04/10/07 22:08:47
>>843
割と最近そっくりな質問をどっかで見たな・・・。
C++関連のスレだった気がするので探してみると良い。
use_facet で codecvt 取得して・・後忘れた。
846デフォルトの名無しさん:04/10/07 22:38:28
847845:04/10/08 00:02:47
141俺ジャン
848843:04/10/08 00:35:15
>>845-846
ありがとうございます
やっぱりその方法ですか・・
関数書くかそのままWideStringで済ますか悩む・・・
849デフォルトの名無しさん:04/10/08 00:40:23
>>824 では不可能
850デフォルトの名無しさん:04/10/08 01:08:15
コンソール系の関数でできるんじゃないの?
と検索せずに言ってみる
851デフォルトの名無しさん:04/10/08 01:12:01
んなわけねえだろボケ
852デフォルトの名無しさん:04/10/08 01:34:42
あぁGUI上でか。
AllocConsole()してそこでやれ
853デフォルトの名無しさん:04/10/08 06:13:43
手元不如意で持ち合わせがなかったので、Exceptional C++を立ち読みしていたところ
pimplイディオムというものを見かけたのですが、これって一般的/頻繁に使われているのですか?
854デフォルトの名無しさん:04/10/08 07:20:17
>>853
ヘッダの依存関係が爆発してひどい目に遭ったC++プログラマなら大抵知ってる。
後付けで対応する手段としては手軽で効果が大きい。

最初から問題になるのが分かっていれば、
仮想関数と継承を使うようにしたほうがすっきりする。
855デフォルトの名無しさん:04/10/08 08:11:34
>>854
どうやら理解してない者がいるようだ。
856デフォルトの名無しさん:04/10/08 10:37:13
初心者用のcかc++の雑誌を教えてください
857デフォルトの名無しさん:04/10/08 17:01:27
ポインタをインクリメントすると、ポインタ分進みますが
ポインタ+=3とかでも、3ポインタ分進むことは保証されてましたよね?

確かめてもちゃんと3つ分進んでますが、なんか急に不安になってきて。
858デフォルトの名無しさん:04/10/08 17:07:41
石橋を叩いても渡らない香具師だな
859デフォルトの名無しさん:04/10/08 17:09:44
>>858
昔これで失敗した気がしてねぇ
というかポインタを飛ばして進ませる事は滅多に無くて
860デフォルトの名無しさん:04/10/08 17:14:54
>>859
それは配列をポリモフィズム的に扱っちゃったりするときのことじゃないの」?
861デフォルトの名無しさん:04/10/08 17:27:27
>>860
あーそうです配列絡みでした
レスありがとうございました、一安心
862デフォルトの名無しさん:04/10/08 19:29:50
>>856
Cマガでも読んでろ。
プラグラのいってることの意味がわかってきたら中級入りだ。
863デフォルトの名無しさん:04/10/08 20:22:11
>>859
あ〜、それ自分もあったわ。
結局配列じゃなくポインタ配列で回避したけど。
864デフォルトの名無しさん:04/10/08 22:18:51
おそらくFAQだと思うんですが

コールバックを引数に取る関数にメンバ関数のポインタを渡したいのですが

たとえばWindowsのウィンドウプロシージャなら
インスタンスのthisポインタを仕込んでおいたりできるんですが、

そういう真似ができない場合の汎用的な解決方法とかはあるんでしょうか
865ぬるぽ:04/10/08 22:24:13
はぁ〜はぁ〜
866デフォルトの名無しさん:04/10/08 22:39:02
>>864
EnumWindowsやスレッドのようにユーザー定義引数が存在する場合はそこにオブジェクトのポインタをつっこんでreinterpret_cast<>
867デフォルトの名無しさん:04/10/09 00:13:28
質問です。
最近オブジェクト指向(C++)に手を出している、C言語中級者です。

クラスのメンバ関数に触れたとき、
ふと関数ポインタという言葉を思い出しました。

実際関数ポインタというものを使いこなしているわけではないのですが、
関数ポインタという名前で想像できる通りの機能と解釈しています
(ここも指摘があればよろしくお願いします)

概念的には似たようなものなのでしょうか?
例え異なるとしても、この関数ポインタを利用すれば疑似メンバ関数のようになるのでしょうか?
あくまで知的探究心によるものですが、ご教授よろしくお願いします。
868デフォルトの名無しさん:04/10/09 00:24:16
>>867
実装的には、仮想関数など関数ポインタを使ってるわけですが、
概念的には別の範疇に属するものです。

なんつうか、Cからの移行組はオブジェクト指向を学習するのに
何かにつけ実装レベルの発想で理解しようとしますが、
それはあんまり良くないですよ。


むかし、前橋氏は(ry
869デフォルトの名無しさん:04/10/09 00:40:14
vtblってなんなのかを調べてみるとクラスの理解につながるかも。
あくまで実装面だけどね。
870デフォルトの名無しさん:04/10/09 00:42:33
gobjectとか、Cで無理矢理やっているのを眺めるのも良いかもしれない。
責任は持たんけど。
871デフォルトの名無しさん:04/10/09 00:53:23
>>868
返答ありがとうございます。

>概念的には別の範疇に属するものです。
そうですか…
現在パーツを作って組み合わせていく設計を極力用いて
C++でソースを書いたりしているのですが
オブジェクト指向を理解しているのか、
それともただの真似事でぜんぜん理解していないのか、自分では全く判断できず…^^;

>Cからの移行組は〜(中略)〜それはあんまり良くないですよ。
了解です。以後、念頭において学んでいきます。

>>869,870
早速参考させていただきます。
ありがとうございました。
872デフォルトの名無しさん:04/10/09 01:00:48
C++では、staticな外部変数は無名namespaceに置き換えるのが
推奨されるということですが、staticな外部変数のままだと、
具体的に問題が生じたりするのでしょうか?
873デフォルトの名無しさん:04/10/09 01:32:14
>>872
それは「staticにはいろんな意味があって紛らわしいから」
ということでしかない。
874デフォルトの名無しさん:04/10/09 01:33:13
>>871
本格的に知りたければこれを読めばいい
http://www.amazon.co.jp/exec/obidos/ASIN/0201834545
875デフォルトの名無しさん:04/10/09 02:15:27
>>871
例えばCでこんな構造体とそれを扱う関数があったとする。
typedef struct foo {
int Bar;
double Baz;
} Foo;
void fooSet(Foo * pFoo, int bar, double baz) {pFoo->Bar = bar; pFoo->Baz = baz;}
int fooGetBar(Foo * pFoo) {return pFoo->Bar;}
double fooGetBaz(Foo * pFoo) {return pFoo->Baz;}
これらはC++のクラスでこう書ける。
class foo {
int Bar;
double Baz;
public:
void set(int bar, double baz) {Bar = bar; Baz = baz;}
void getBar() {return Bar;}
void getBaz() {return Baz;}
最適化にも拠るが、実装上どちらもほぼ同じコードが出力される。
このように、「構造体とそれを扱う関数群」をまとめたものと捉えるのも一つのやり方。
#継承を考えない限り、Cからの移行にはこれでも充分有用。
#そのうちEffectiveC++辺りを読んで目から鱗を落とせばよろしい。
876875:04/10/09 02:17:56
ぎゃぁ。>875の
>void getBar() {return Bar;}
>void getBaz() {return Baz;}
はそれぞれ
int getBar() {return Bar;}
double getBaz() {return Baz;}
の間違い。
なお、constは敢えて省いたがきちんと書くならこうなる。
int getBar() const {return Bar;}
877デフォルトの名無しさん:04/10/09 03:18:18
初歩的な質問ですが、C、もしくはC++でディレクトリの作成や削除、ファイルの削除の仕方がわかりません。
エラい人、教えてください
878デフォルトの名無しさん:04/10/09 03:19:24
boost::filesystem
879デフォルトの名無しさん:04/10/09 03:38:08
なんでそういう回答しかしないの?
それで>>877が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
880デフォルトの名無しさん:04/10/09 03:48:04
お(ry
881デフォルトの名無しさん:04/10/09 03:53:59
>>875
仰るとおり、継承を考えず、という方法ならそれなりに実現できるかと思ったわけですが、
どうも安直に考えすぎてたようで、
メンバ変数とメンバ関数のパッケージングされたものを実現する方法が思い浮かびませんでした^^;

例えば
typedef struct _foo{
  int Bar;
  void (*BarSet)( int bar );
}Foo;

のようにパッケージングした上で bar の値を Bar へ代入することは可能なのでしょうか?

C++のレベルはまだまだなのですが、細かいことが好きな性分なため(?)、
C言語びいきで、C言語にこだわってしまいまして…^^;
助言よろしくお願いします。

>>877
邪道かもしれませんが system 関数はどうでしょう?
882デフォルトの名無しさん:04/10/09 04:02:10
>>877
結論から言う。
C/C++の規格にはそのような操作は含まれていない。
883デフォルトの名無しさん:04/10/09 04:04:53
なんでそういう回答しかしないの?
それで>>877が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
884デフォルトの名無しさん:04/10/09 04:06:50
>>882
偉そうに規格云々の話持ち出すなら
C言語またはC++言語には`操作'なんて含まれていない
885デフォルトの名無しさん:04/10/09 05:01:47
>>883
>>877=883じゃないならお前が答えてやると良さそう
886デフォルトの名無しさん:04/10/09 05:39:53
>877
ディレクトリの作成や削除→_mkdir(), _rmdir()
ファイルの削除→remove()
887デフォルトの名無しさん:04/10/09 06:37:46
ディレクトリの作成→boost::filesystem::create_directory
ディレクトリの削除→boost::filesystem::remove, remove_all
ファイルの削除→boost::filesystem::remove, remove_all
888デフォルトの名無しさん:04/10/09 06:49:12
Windows限定ならこれでOK

ディレクトリの作成→MakeSureDirectoryPathExists
ディレクトリの削除→RemoveDirectory
ファイルの削除→DeleteFile
889デフォルトの名無しさん:04/10/09 10:32:50
とにかく878はいっぺん死んでこい。
お前みたいなクズ二度と顔を見せるな。
890デフォルトの名無しさん:04/10/09 10:50:04
>>878叩いてる香具師=>>877??
891デフォルトの名無しさん:04/10/09 11:49:13
こんにちは。Boland C++ を使ってC言語で個人使用のツールを細々作っているものでs。
基本的なことですいませんが、ワイドキャラクタ用の関数群ってありますよね。これらは
どんな局面で使うのでしょうか? 「世界にはばたく」ソースを書くためには、これらの関数
を積極的に使おう、という雰囲気なのか?? よろしく m(_ _)m。
892デフォルトの名無しさん:04/10/09 11:53:19
>>891
あなたには必要の無い物です
893877:04/10/09 12:18:26
>>877です。
皆さんどうもありがとうござました。

>>885
>>883じゃないです。

>>886
多謝

>>888
ぐぐるとVCでのやり方は結構ヒットするんですけど、移植性の高い方法が見つからなかったもので

>>890
じゃないです

894デフォルトの名無しさん:04/10/09 12:52:10
>>877
実際のところboost::filesystemが一番移植性が高いんじゃないか。
そもそもファイル操作というものが存在しない環境もあるわけで、
CとC++自体は規格としてディレクトリという概念やファイルの削除
という概念を含んでいない。当然移植性のある標準的な操作も
存在しない。boost::filesystemについて調べてみるといい。
Boost: http://www.boost.org/
895デフォルトの名無しさん:04/10/09 13:12:20
いい加減にしろ878
896887 != 878:04/10/09 13:16:55
>>895
???
897デフォルトの名無しさん:04/10/09 13:17:32
必死で>>878を叩いてる奴は何がしたいんだよ
898デフォルトの名無しさん:04/10/09 13:22:37
全て注目して欲しい878の自作自演だろ。必死だな878。
俺はお前みたいなヤツが一番嫌いだ。
899デフォルトの名無しさん:04/10/09 13:24:51
そうやって俺をイラつかせて、何をしたいんだ。
俺に恨みでもあるのか。それとも人をからかうのが好きなのか。
どちらにしても、お前は悪意をもって人を傷つけようとした。
こういう事はこれで最後にしろ。
900デフォルトの名無しさん:04/10/09 13:33:39
>>894
removeは標準ですが何か
901デフォルトの名無しさん:04/10/09 13:36:48
Ruby >>>>>>>>>>>>>>>>>>>>>> ぼおst
902デフォルトの名無しさん:04/10/09 13:41:13
boost::filesystemな・・・ポータブルパスの書式は
ディレクトリの区切り文字が '/' になってややこすぃ。
"C:\Windows\system" は "C://Windows/system" とか。
うっかりネイティブ形式の放り込むと例外が飛んでくるんで注意!
でもディレクトリ移動が '/' 演算死を使って実装してあるのはちょっと感動した。
903デフォルトの名無しさん:04/10/09 14:13:28
>>900
標準関数として存在はしているが、
規格上はremoveはファイルを削除するように規定されてはいない。
そういう意味では>>894が正解。
あげあし取りでスマソ。

とりあえず参考ページ
http://www.bohyoh.com/CandCPP/C/Library/remove.html

実質的にはファイルの削除だ罠
904デフォルトの名無しさん:04/10/09 14:19:10
>>903
だから何?remove使って何か問題あるのかね?
905デフォルトの名無しさん:04/10/09 14:22:50
>>902
っつかWindows(DOS)って何でディレクトリの区切り文字を'\'にしたの?
ディレクトリはUNIXから拝借したんじゃないの?
906デフォルトの名無しさん:04/10/09 14:24:05
>>902
悪いオーバーロードの典型だな。
907デフォルトの名無しさん:04/10/09 14:30:46
http://pc5.2ch.net/test/read.cgi/tech/1096696253/
から来ました。

spawnlの使い方もしくは、外部のプログラムを実行して、そのプロセスを終了させないで、制御を元のプログラムに戻す方法を教えてください。

spawnl(_P_NOWAIT , "パス + 実行ファイル名" , "NULL");

としてもうまくいかず強制終了されてしまいます。
908デフォルトの名無しさん:04/10/09 14:32:45
>>907
なんで環境かかないかな
909デフォルトの名無しさん:04/10/09 14:34:38
>>905
オプションが'/'で始まる仕様だったから。

ファイルの概念の無い環境は知らんが、BTRONにはディレクトリの概念は無いよね。
#いやさ、リンクで擬似的に実現できるんだけど".."がお手上げでね。
910デフォルトの名無しさん:04/10/09 14:41:49
>>907
誘導したの漏れだけど、黙って移動するかな。おまけにこっちで環境書かないし。

で、改めて言うけどLSI-Cはやめとけ。ロングファイル名にも対応できないんだから。
911デフォルトの名無しさん:04/10/09 14:42:47
>>909
ほぅ
そこのボタンの掛け違いはいつ起こったんですか?
ご存知の方いるかな?
912デフォルトの名無しさん:04/10/09 14:43:25
> int getBar() const {return Bar;}

このconstってどういう意味?
913デフォルトの名無しさん:04/10/09 14:47:10
>>911
元々MS-DOSはUNIXじゃなくてCP/Mの真似だから。
つか、最初はディレクトリもなかったしな。
914デフォルトの名無しさん:04/10/09 14:48:11
mutable を見た PG を鬱にさせるおまじない
915デフォルトの名無しさん:04/10/09 14:48:44
>>913
CP/Mってオプションはやっぱ'/'だったんですかね?
916デフォルトの名無しさん:04/10/09 14:50:46
>>912
「getBarではメンバ変数(Barとか)に変更を加えない」という宣言
917907:04/10/09 14:54:00
黙っての移動すいませんでした。
以後気をつけます。

環境はボーランドのコンパイラです。
918デフォルトの名無しさん:04/10/09 14:54:59
>>916
おお、ありがと!
919デフォルトの名無しさん:04/10/09 14:55:16
>>915
CP-Mならよかったんだけどねぇ。
920デフォルトの名無しさん:04/10/09 17:11:11
絶対値を求める演算子を教えてください
調べても出てきませんでした
921デフォルトの名無しさん:04/10/09 17:15:15
文字列がatofで変換できるか調べるには
自前で関数用意するしかないですか?
922デフォルトの名無しさん:04/10/09 17:18:12
>>920
int型でいいならabs()関数
あとはMSDN見ればわかるだろう。
923デフォルトの名無しさん:04/10/09 17:20:10
>>922
MSDN使っていると言う前提は如何な最中。

>>921
「変換できるか」の定義に拠るが、strtod()を使えば文字列のどこまでを変換に使ったかは判る。

>>920
そういう演算子は無い。
924デフォルトの名無しさん:04/10/09 17:21:00
>>920
そういう関数でやれ。
<cstdlib>
int:abs
long:labs
long long:llabs

<cmath>
double:fabs
float:fabsf
long double:fabsl
925デフォルトの名無しさん:04/10/09 17:23:19
>>922
>>923
>>924
お返事ありがとうございます

abs()関数を使ってみます
926デフォルトの名無しさん:04/10/09 17:37:31
>>923
すいません、今携帯でかつ調べる手段がないのでその関数の詳細教えていただけますか?
因みに基準は文字列が数字とピリオド1つで構成されているかです。
927デフォルトの名無しさん:04/10/09 18:01:55
>>926
これなら携帯でも調べられるだろ。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtod.3.html
928デフォルトの名無しさん:04/10/09 18:28:01
>>923
927
解決しました。ありがとうございます。
929デフォルトの名無しさん:04/10/09 19:26:06
Kdevelop使ってる人いますか?
情報が少なすぎで困っています。
930デフォルトの名無しさん:04/10/09 20:06:35
関数の戻り値としてx座標とy座標の2つを指定できるのでしょうか?
いろいろな例をみていると1つしか指定できないみたいなので
(x、y)を戻り値として返すことはできるのでしょうか?
931デフォルトの名無しさん:04/10/09 20:11:51
void hoge(int *x, int *y);

or

class Point {
    int x_, y_;
    //blah, blah, blah
};

Point hoge();
932デフォルトの名無しさん:04/10/09 20:33:10
std::pair<int, int>とか
933デフォルトの名無しさん:04/10/09 20:40:41
>>930
C++だったら>>932がスマートだと思う。

Cだったら>>931の2つかグローバル変数しか方法はなさそう。
classじゃなくてstructしか使えないけど。
古いコンパイラだと構造体の実体は返せないので注意。
934デフォルトの名無しさん:04/10/09 20:49:34
>>931
>void hoge(int *x, int *y);
この方法は何という名の方法なんでしょうか
わからないので検索して調べてみたいのですが
なんて調べたらいいのかわからないもので…

>>932
調べてみます
>>933
c++.netなんですけどreturnで構造体をかえせるか試してみます

レスありがとうございました
935デフォルトの名無しさん:04/10/09 20:50:18
最近C++を学び始めたのですが二進数表示にするマニピュレータとかってないんでしょうか。
回転とかシフトなどビット単位で計算することってC++やCではよくあると思うのですが。
936デフォルトの名無しさん:04/10/09 20:53:55
返せないわけないだろ
937デフォルトの名無しさん:04/10/09 20:55:16
Cでint型をString型に変換するにはどうすればいいのでしょうか?
JavaでいうtoStringやParseIntみたいなAPIはあるのでしょうか?
938デフォルトの名無しさん:04/10/09 20:56:59
通は8進表示でビットデータを読みます
939デフォルトの名無しさん:04/10/09 20:58:11
>>937
sprintf関数?
940デフォルトの名無しさん:04/10/09 20:59:07
CにはString型はないんだけどsprintfでがんがれ

ほとんどの環境でitoaがあると思うけど。
941デフォルトの名無しさん:04/10/09 20:59:42
>>937
なんですか? String型って。
942デフォルトの名無しさん:04/10/09 21:00:57
>>940-941
多分managed C++のアレですよ。
943デフォルトの名無しさん:04/10/09 21:06:12
>>934
>void hoge(int *x, int *y);

「参照渡し」とかでぐぐれば見つかるんじゃない?
ポインタを理解してれば自動的に理解できると思うんだけど。
944934:04/10/09 21:19:47
>>936
安心して使ってみます
>>943
まだポインターは理解してないので
これから勉強しようと思います

レスありがとうございました
945デフォルトの名無しさん:04/10/09 22:50:19
>935
unsigned char型を2進表記しようとしてこんなん

unsigned char uchar = 'c';
for(short i=sizeof(unsigned char)*8-1; i>=0; --i){
if( (uchar>>i) & 1U ){
bset[index++] = 1;
}else{
bset[index++] = 0;
}
}

書いたことある。bsetはなんらかのbitsetのインスタンスね。
もっと簡潔にするなりテンプレート化するなりはだれか偉い人やって(;´Д`)
946デフォルトの名無しさん:04/10/09 23:07:18
charが8bitだと誰が決めたのか
947デフォルトの名無しさん:04/10/09 23:16:27
Rubuy ???????????????????????>>>>>>>>>>>>>>>
948デフォルトの名無しさん:04/10/09 23:36:05
>>945
こんなもんでどうよ。
コンパイラによっては警告くらいは出ちゃうかもしれんが。

unsigned char uchar = 'c';
_Bool bset[sizeof(unsigned char)*8];

for(int i=0; i<8; i++) bset[i++] = (((128>>i) & uchar)!=0);
949デフォルトの名無しさん:04/10/10 00:05:39
pppppuuuuuuuuuuuuuuuuuuuuuuuuuぷううううううううううううううううううううう
950デフォルトの名無しさん
>>935,945
…std::bitset::to_string()