【初心者歓迎】C/C++室 Ver.43【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.43【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
07/09/27 11:39:04
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
スレリンク(tech板)l50
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)


2:デフォルトの名無しさん
07/09/27 12:05:39
         _,rr-―''''¨゙゙゙ ̄ ̄ ̄ ̄ ̄`゙゙゙゙゙゙゙゙''ヘi、、   ,,,,-―---、
      ,r‐'″    ._,,,,             `'lri,!'''″     ゙l
     .,,,″    ,,r'"`  ゙゙l,               ゙ヘ,     |
     !アr,   .l°.ェ'ニ,コ .|                ゚ヘ、    |
       `'i、  .く_,、vr''″ .,                  ゙'i、 .,,/
         ゙X、        ト                   ゙!,゛    .,,r‐--、
   ,、_,、 .,,,,r‐'″        |                    } .,,r‐'^’   .|゜
   め゙゚“゙゙~゛           |                     ̄`     .,l゙
   |                ,i´                       ,l゙
   ゙!、                ,i´                       ,ノ
   .'┐              ,,-°  '=,,                   /`
    .゚!,          ,,,,r'″     ゙┐                 ,l゙
      ゚'r,    .''''"`         │    .,,-''i、          /
       `''x,      .|        |  .,,r'"  .゙┐           ,i´
         ~'ヘi,,,   |           |_,r・″    'ヘ,、         l゙
           `¬--|i,,,,,,,,,,,,,,,,v、r',广        ゙ヘ〟    ,l゙
                `゙'ーぃ--r'″           `'―、,,,,/

3:デフォルトの名無しさん
07/09/27 13:00:37
前スレ
>>999

'CFuncHolder::SetFunc' : 1 番目の引数を 'boost::_bi::bind_t<R,F,L>' から 'void (__cdecl *)(char *)' に変換できません。

って怒られました。

4:他板37
07/09/27 13:03:35
どなたかご教授お願いします。
↓の掲示板に書いてしまって、こちらの掲示板の皆様には申し訳ないのですが・・・。
URLリンク(pc11.2ch.net)
37なんですけど、継承方法がわからず困っています。
なんとなく、このままスルーされそうなので焦っています。


5:デフォルトの名無しさん
07/09/27 13:14:25
>>前007
とりあえずこんな感じにすると動いた

#include <boost/function.hpp>
#include <boost/bind.hpp>

#include <windows.h>

void g_func(const char* str) {
MessageBoxA(NULL, str, "", NULL);
}

class Cfunc {
public:
void func(const char* str) { MessageBoxA(NULL, str, "", NULL); }
void (Cfunc::* GetFuncPtr()) (const char*) { return &Cfunc::func; }
};

class CHolder {
public:
template <typename T> void set(const T& f) { func = f; }
boost::function<void(const char*)> func;
};

int main()
{
CHolder hold;
Cfunc cf;
hold.set( boost::bind(&Cfunc::func, &cf, _1) );
hold.func("text");
}


6:5
07/09/27 13:15:03
007→997
typo typo

7:デフォルトの名無しさん
07/09/27 13:20:30
セットするところを↓にしたら>>998でいけたよ!

void SetFunc(boost::function1<void, char*> func){m_func = func;}

8:デフォルトの名無しさん
07/09/27 15:58:29
unsigned longの値を入れる配列無いでしょうか?
CStringListみたいなやつで

9:デフォルトの名無しさん
07/09/27 16:03:28
std::vector<unsigned long>

10:デフォルトの名無しさん
07/09/27 16:18:11
好きなコンテナに入れな

11:デフォルトの名無しさん
07/09/27 16:52:33
ところで↓って何やってるのか意味が分からないんだが、
誰か噛み砕いて教えてくれないだろうか。

boost::bind(&Cfunc::func, &cf, _1)


12:デフォルトの名無しさん
07/09/27 17:04:05
boost::bind(&Cfunc::func, &cf, _1)(hogr)⇔cf.func(hoge)

13:デフォルトの名無しさん
07/09/27 17:20:35
>>1

14:デフォルトの名無しさん
07/09/27 17:29:12
boost::functionはグローバル関数へのポインタや関数オブジェクトなどを統一的に保持できるってのは分かった。
で、boost::bindはなにやら拘束とかいうのをして2引数の関数を1引数の関数として扱える?のだとかなんとか・・・

>>5でいうところの、
普通のグローバル関数g_funcへのポインタというかアドレスはg_funcで、
メンバ関数CFunc::funcのアドレスは&Cfunc::func?
でもそれだけだとどのインスタンスのfuncかわからんから、
Cfunc cfっていうインスタンスの情報もどうにか渡す必要があるってのはわかる。

が、それらを拘束するっていうのの意味が分からない。拘束ってなんですか?
リファレンスの日本語訳読んでも全然分からない・・・


15:デフォルトの名無しさん
07/09/27 17:46:30
ポインタうんぬん、インスタンスうんぬんという実装よりも、
まず概念を理解せんことにはな。
Haskellあたりで勉強してきたら?


16:デフォルトの名無しさん
07/09/27 18:06:02
>>14
STL の bind1st と bind2nd を調べてくればわかるんじゃない

17:デフォルトの名無しさん
07/09/27 18:11:30
例えば↓みたいな場合、gfunc2のiかjを
なにかしら定数として固定して、引数が1変数の関数としてCFuncHolderのm_funcにしまえる?
ってことですか?

class CFuncHolder{
private:
boost::function1<void, int> m_func;
public:
CFuncHolder(){};
void SetFunc(boost::function1<void, int> func){m_func = func;}
void RunFunc(int i){m_func(i);}
};

void gfunc1(int i){ printf("%d\n",i); }

void gfunc2(int i, int j){ printf("%d\n", i+j); }

void main(){
CFuncHolder fh;

fh.SetFunc(gfunc);
fh.RunFunc(1);
}


18:デフォルトの名無しさん
07/09/27 18:12:54
>>14
拘束じゃなくて束縛だと思うが
関数型言語の束縛とも意味が違うので紛らわしい

どっちかっつーと「部分適用」だわな

19:17
07/09/27 18:57:49
bindの最初の引数がメンバ関数へのポインタのとき、第二引数はインスタンスのアドレスを渡すのが
そういう場合の決まった書き方ってことでとりあえず解決した。

20:デフォルトの名無しさん
07/09/27 19:52:13
_beginthread()
でスレッドを生成し、そのスレッドが無限ループしている場合、
プログラム終了時にそのスレッドも終了してくれるのでしょうか?

21:デフォルトの名無しさん
07/09/27 20:03:00
はい

22:デフォルトの名無しさん
07/09/27 20:10:52
Σ(・ω・ノ)ノエッ

23:デフォルトの名無しさん
07/09/27 20:11:34
終了しなかったら欠陥OSだろw

24:デフォルトの名無しさん
07/09/27 20:29:24
main() {
char *buf = new char[1024];
}

上のコードでbufはプログラム終了時に解放されますってのと同レベルだな


25:デフォルトの名無しさん
07/09/27 20:54:17
んー・・・「終了される」と言われると違和感あるなぁ。
「破壊される」?

まぁ言葉遊びか

26:デフォルトの名無しさん
07/09/28 12:04:40
よくclassではなくstructで表現されたものを見ますが
何か違いがあるのでしょうか?

メリット、デメリットを教えてください

27:デフォルトの名無しさん
07/09/28 12:06:47
( ゚д゚)ポカーン

28:デフォルトの名無しさん
07/09/28 12:10:26
classはデフォルトでprivate
structはデフォルトでpublic

class A : X { // <-- private 継承
 int x;          // <-- private メンバ
};
struct B : Y { // <-- public 継承
 int x;           // <-- public メンバ
};

それだけ

29:デフォルトの名無しさん
07/09/28 12:12:40
>>26
C++においては特に無いんじゃね?
メンバ関数を持たずある用途のためにまとめた”変数のセット”
って言う意味を強調したいときに
俺はあえてstructを使うけど。


30:デフォルトの名無しさん
07/09/28 12:35:52
>>28-29
ありがとうごさいました

31:デフォルトの名無しさん
07/09/28 14:16:18
>>11>>19
boost::bind(&Cfunc::func, &cf, _1)は、
boost::bind(boost::mem_fn(&Cfunc::func), &cf, _1)相当。

mf = boost::mem_fn(&Cfunc::func)とすると、
mf(a, b)は、a.func(b)と同じ。
つまり、mem_fnはメンバ関数を通常の関数呼出の構文で
呼び出せるようにするアダプタと言える。

>>12へ続く。


32:デフォルトの名無しさん
07/09/28 14:34:34
std::string str

switch( str )
{
  case "あいうえお"
    funcA();
    break;

  case "かきこくけこ"
    funcB();
    break;

  (同様に続く・・・)
}

のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?

if文でゴリゴリ書くしかない?

33:デフォルトの名無しさん
07/09/28 15:12:10
一般的じゃないかもしれないけどこういう手が楽っぽい

#include <map>
#include <string>
#include <iostream>

void funcA() { std::cout << "invoke func A\n" ; }
void funcB() { std::cout << "invoke func B\n" ; }

int main(void) {
 std::map< std::string, void(*)(void) > funcs ;
 funcs[ "あいうえお" ] = funcA ;
 funcs[ "かきこくけこ" ] = funcB ;

 std::string str = "あいうえお" ;
 void(*f)(void) = 0;
 f = funcs[str];
 if ( !f )
  // default: の処理
 else
  f();

 return 0;
}
要は条件をキー、呼び出す関数を値にするmapだな
値をboost::functionへの参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能

34:デフォルトの名無しさん
07/09/28 15:40:21
>>33
ありがとうございました

35:デフォルトの名無しさん
07/09/28 16:53:01
C++初学者です。
std::fstream等を使い、テキストファイルの中身をstd::stringのオブジェクトに格納したいと思います。
テキストファイルtext.txtはShift_JISで書かれ、空白や改行、マルチバイトの文字を含みます。サイズは不明です。
この改行などは、可能な限り保持するとします。

自分は、以下のようなコードを記述しました。

std::string str;
std::ifstream ifs;

ifs.open("text.txt",std::ios::in);
if(!ifs.is_open()) return; //オープン失敗

while(!ifs.eof())
{
 std::string line;
 std::getline(ifs,line);
 str += line + "\n";
}

1.getlineや>>を使って、少しずつ読み込むという方法で良いのか分かりません。一括読み込みの方法はあるのでしょうか。
2.getlineを使う場合、一時的にlineを用意し、それからstrに格納する方法を採っています。何となく冗長な気もしますが、こんなもんなのでしょうか。
3.最後に改行コードを付加する時、+"\n" という書き方をしていますが、std::endlを使う方法、もしくはそれに似たような方法はあるのでしょうか。


36:デフォルトの名無しさん
07/09/28 17:00:48
ファイルの中身を全部読み取りたかったら、istreambuf_iterator使えばいい。
typedef std::istreambuf_iterator<char> isb_it;
str.assign(isb_it(ifs), isb_it());

37:デフォルトの名無しさん
07/09/28 17:20:14
C++ってキモk

38:デフォルトの名無しさん
07/09/28 17:26:59
>>35
> 2.
大体皆そういうコードを書く
> 3.
stringstreamを使えばよい

39:デフォルトの名無しさん
07/09/28 17:27:12
プログラムからMSXMLを使用してローカル(C:\.....\foo.xml)のXMLファイルを読み込みたいのですが
どうもload関数で失敗してしまいます。

#import "msxml.dll" named_guids raw_interfaces_only
using namespace MSXML;

MSXML::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument);
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOL f;
hr = pDoc->load(_variant_t(L"C:\\Documents and Settings\\.........\\foo.xml"), &f);

このXMLファイルのパスに実際Web上に存在するファイルを指定したらloadは正常にXMLを取得出来ました。(URLリンク(......)
ローカルにあるXMLファイルを読み込むには何か特殊な事をしなければいけないのでしょうか?
環境はWinXPでVisual Studio 2005 Pro Editionです。

40:35
07/09/28 17:32:10
>36>38
ありがとうございます、助かりました

41:デフォルトの名無しさん
07/09/28 18:05:32
>>35
2.についてだが、普通はこう書く。

std::string line;
while (std::getline(ifs, line)) {
  :
}

しかし、>>35のコードでは結局行読みすることに何の意味もないコードに
なっている。
そもそもそういう場合はstd::getline()を使うべきではないだろう。

42:デフォルトの名無しさん
07/09/28 18:07:12
>>39
load()でローカルファイルを普通によめたと思うが。
MSXMLのバージョンにもよるのかも知れんが。

それとそのパスはなにやら胡散臭いな。
argvでも渡して、カレントのパスや相対パス、絶対パス、漢字を含むもの
含まないもの、色々実験汁。

43:デフォルトの名無しさん
07/09/28 18:09:05
マジWindowsアプリとか詳しい奴尊敬するぜ
あんな分かりにくいもん C++の難しさよりも
ライブラリ覚えるだけで大変そう

44:デフォルトの名無しさん
07/09/28 18:13:44
>>42
"C:\\foo.xml"で試してみましたが無理でした。
SetCurrentDirectory()でxmlのあるディレクトリに移動して相対パスでの指定も試してみました。
バージョンによる違いも一応調べてみます。

45:デフォルトの名無しさん
07/09/28 18:19:26
>>43
あんなに膨大にあるAPIを全部暗記してる奴はいないだろう
関数の名前覚えてたって、引数の並び順だの何だの覚えきれねえよ

それに良く使いまわす処理は俺ライブラリ化するなりコピペするなり
いちいち一から書かんだろ

46:デフォルトの名無しさん
07/09/28 18:19:58
file:// とかは?

47:デフォルトの名無しさん
07/09/28 18:22:42
>>43
今はほとんどどの世界に行っても、言語仕様よりライブラリ覚える方が大変だよ

48:デフォルトの名無しさん
07/09/28 18:25:17
>>46
file://の書き方は
file:///C:/foo.xmlであってるでしょうか?あまり詳しくないもので・・・。
フォルダのアドレスバーにfile://と入力して出てきたやつをそのまま使ってみました。
でも、やはりロードで失敗してしまいます。xmlファイル自体に問題があるか、MSXMLのバージョンの問題なのか・・・

49:デフォルトの名無しさん
07/09/28 18:26:47
>>48
ファイルに問題があるかどうか切り分けたければ、URL越しでロードできた
ファイルをローカルに落として試せばいいだろ。

50:デフォルトの名無しさん
07/09/28 18:33:30
>>49
Webからxmlファイル落としてローカルで試したところloadすることが出来ました。
どうやら自分のxmlファイルに問題があったようです。
xmlファイルの中身を見比べてみて原因を探ってみます。

51:デフォルトの名無しさん
07/09/28 18:33:49
>>47
オープン系はそうですね
組み込みはそうでもなくて、純粋にC++に集中できそう

52:デフォルトの名無しさん
07/09/28 18:34:53
IXMLDOMDocument::loadは、IStreamなんぞも受け付けるらしいから、
SHCreateStreamOnFileでも使ってストリーム化したらどうだろう?

53:デフォルトの名無しさん
07/09/28 18:35:42
どうやら文字コードが原因だったみたいです。
自作のxmlはShift_JISで、正常に読み込める方のxmlはUTF-8で保存されたものでした。
なんでShift_JISでダメなのかはよく分かりませんが、とりあえずUTF-8で書くことでやっていきたいと思います。
ありがとうございました。

54:デフォルトの名無しさん
07/09/28 18:38:16
XML宣言でエンコーディングを指定すれば、
Shift_JISは受け付けてくれると思う、MSXMLなら。

55:デフォルトの名無しさん
07/09/28 18:39:41
>>53
既にC/C++の話題でも何でもないが


XMLファイルで↓のようにちゃんとエンコーディングは指定してるか?
<?xml version="1.0" encoding="Shift_JIS"?>

56:デフォルトの名無しさん
07/09/28 18:42:11
環境依存とかマジわかんねえ
XMLなんて言葉しか知らん

57:デフォルトの名無しさん
07/09/28 18:50:03
>>53
HRESULTの判定をしてないのがいかんのだな。
その辺が出来ないなら raw_interfaces_onlyは使うなよ。

58:デフォルトの名無しさん
07/09/28 19:17:04
>>54-55
対象のXMLファイルにはちゃんと
<?xml version="1.0" encoding="Shitf_JIS" ?>
と先頭に記述はしていました。ますます分からないですけど、
もしかしたら俺の環境がどこか特殊なのかもしれないので(または全然関係ないところのエラー)、
あまり悩まれない方がいいかもしれませんw

59:デフォルトの名無しさん
07/09/28 19:43:41
>>58
MSXMLがちゃんとエラーメッセージが返してるからそれみりゃわかるって。
エラーメッセージの取り出し方わかってる?

60:デフォルトの名無しさん
07/09/28 19:50:46
>>58
Shitf_JIS
しとふ・じす

61:デフォルトの名無しさん
07/09/28 20:01:36
>>60
天才じゃね?

62:デフォルトの名無しさん
07/09/28 20:27:36
爆弾クラスのデストラクタに壁を壊す処理を入れてるんですが
こういう使い方は良くないと聞きました
どうしてですか?
だとしたら自分を壊して壁を壊すような処理はどこに書けばいいんですか?
よくわからなくなったので教えて下さい

63:デフォルトの名無しさん
07/09/28 21:07:08
>>62
通報しますた

64:デフォルトの名無しさん
07/09/28 21:26:46
いやいやいや
ゲームのアイテムの話ですよ?

65:デフォルトの名無しさん
07/09/28 21:44:40
>>62
理由:クラスの柔軟性が損なわれる

「インスタンスの破壊時に必ず呼ばれる」
→爆発させずに爆弾を消去するときも破壊判定させる気?

「デストラクタは引数とれない」
→わざわざ破壊対象の壁の情報を他のクラスに問い合わせるわけ?

それなら自分が爆発(explodeメソッド)するって情報だけ他のクラスに送って
それ以外の処理は他に任せるようにした方が責任の所在が明確になって
まだ良い設計になると思わない?

俺が思いつくのはとりあえずこんな所

66:682
07/09/29 00:47:46
001.ppm
002.ppm


xyz.ppm
という内容のファイルリストからgetlineで画像名を読み込み、
それぞれの画像のカラーヒストグラムを書き出していくという
プログラムを作成しています。

一度に処理する画像枚数が約200枚までならば正常に動作するのですが、
一度に処理する画像が300枚前後になると、OSが急に固まりコンソールに
強制終了と表示されて、プログラムが終了してしまいます。

以下、メインのソースの一部
ifstream filelist
While(!filelist.getline(filename, sizeof(filename)).eof()) {
Image24 test_image;
ここらへんで様々な処理
}

この例の場合、ループでtest_imageが宣言される度に
デストラクタは呼び出されるのでしょうか?(デストラクタでメモリを解放する処理は書いてます)

長文ですがよろしくお願いします。

67:デフォルトの名無しさん
07/09/29 00:54:53
>>66
デストラクタは呼ばれます。
実験してみりゃ一発なのに・・・

68:デフォルトの名無しさん
07/09/29 01:18:09
>>66
とりあえずアップしてるソースの範囲は問題なし。
デストラクタの開放処理に漏れや誤りがあるか、
「ここらへんで様々な処理」 に問題があると思う。
LoadImageしてDeleteObjectしてないとか、LD_SHAREDしてるとか。

69:66
07/09/29 01:54:27
>>67, >>68
ありがとうございます。
メモリ周りの処理をもう一度徹底的に見直してみます。

70:デフォルトの名無しさん
07/09/29 02:26:26
int型を文字列の型に変換する関数ってありますか?

71:デフォルトの名無しさん
07/09/29 02:33:56
Cならsprintf, snprintf
C++なら(関数ではないが)std::ostringstream. boost::lexical_cast

72:デフォルトの名無しさん
07/09/29 02:41:40
ありがとうございます

73:デフォルトの名無しさん
07/09/29 20:18:04
class string_ex : public std::string
{
  funcA();
  funcB();
}

のようにstd::stringを拡張してstd::stringの機能をそのままに
文字列操作を行う関数を新たに追加したクラスを作りました

string_ex ex;
std::string str;

ex = str;

という操作を期待したのですがコンパイルエラーが出てしまいます
何か良い方法はありませんか?

74:デフォルトの名無しさん
07/09/29 20:51:03
代入演算がないだけでは?

75:デフォルトの名無しさん
07/09/29 20:55:57
確かstd::stringは継承される事を前提に作られてないはず
やめといた方がいいんじゃね

デストラクタも仮想じゃないし

76:デフォルトの名無しさん
07/09/29 21:06:33
>>74-75
ありがとうございます

そうですか、スッキリして良いと思ったのですが残念です

77:デフォルトの名無しさん
07/09/29 21:08:52
コンストラクタがないからstd::stringからstring_exに変換できない。
ただし、>>75の指摘通り使用に際しては注意が必要。

78:デフォルトの名無しさん
07/09/29 21:14:51
コピー代入演算子とコピーコンストラクタが無いのが原因だな

#include <string>

struct A : public std::string {
  A(){}
  A(const A&){}
  A& operator=(const A&) { return *this; }
  A& operator=(const std::string&) { return *this; }
};

int main() {
  A a;
  std::string b;
  a = b;
}

とりあえずこんな感じでそれらを用意してやれば通る、けどやっちゃいけないよこんな事
basic_stringのカオスさ加減をどうにかしたい気持はわからんでもないけど

79:デフォルトの名無しさん
07/09/29 21:32:11
どうやらstd::stringを弄るのは禁じ手のようですね

無理にメンバ関数にしないでフリーの文字操作関数にします
いろいろとありがとうございました

80:デフォルトの名無しさん
07/09/29 21:57:56
俺も同じことやってる。
コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。

でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。

81:デフォルトの名無しさん
07/09/29 22:21:44
>>73
仮想デストラクタを持たないstringやコンテナなどから
派生クラスを作る誘惑に負けるな by スコット・メイヤーズ

82:デフォルトの名無しさん
07/09/30 08:03:16
#include <stdio.h>

main()
{
int i;
int b;
int c;
int d;
printf("最初の数字を入れてください(半角)=>");
scanf("%d", &i);
printf("なに算をするか入れてください( / * - + )=>");
scanf("%s", &b);
if(b = /){
printf("割る数を入れてください=>");
scanf("%s", &c);
d = i / c;
}else if(b = *){
printf("賭ける数を入れてください=>");
scanf("%s", &c);
d = i * c;
}else if(b = +){
printf("足す数を入れてください=>");
scanf("%s", &c);
d = i + c;}else{
printf("引く数を入れてください=>");
scanf("%s", &c);
d = i - c;}
printf("%d\n",d);}
これでものすごい勢いでコンパイラエラー吐かれます><
初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない
のでどこがおかしか教えてくださるとうれしいです

83:デフォルトの名無しさん
07/09/30 08:06:56
何算するかというところで、
+-/*という数値でないものを入力しようと言うのに
intという数値を扱う型で読み込もうとしているのがいけない。
bはchar型にし、%cで読み込めばいい。
そして、if (b == '/') {のようにする。

84:デフォルトの名無しさん
07/09/30 08:08:30
>>83
intは数値だったんですか;
いろいろがんばってみます

85:デフォルトの名無しさん
07/09/30 08:11:39
intはintegerの略。

86:デフォルトの名無しさん
07/09/30 10:06:21
>>82
・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。
・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。
・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。

87:デフォルトの名無しさん
07/09/30 10:43:22
>84まず入門書か入門サイト嫁www

88:デフォルトの名無しさん
07/09/30 11:42:09
_typeof, __typeof
みたいに前にアンダーバーを1つ2つ付けるのは
予約キーワードと衝突するおそれがあるので避けるべきらしいですが、
typeof_, typeof__
みたいに後ろに付けるならおkでしょうか?

89:デフォルトの名無しさん
07/09/30 12:23:07
アンダースコアが2個続くのは先頭でも途中でも最後でもだめ

90:デフォルトの名無しさん
07/09/30 12:49:51
template<typenamt t, typename sig> class test;
template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg)>{ result r; };//resultがvoidだとエラーになるので
template<typenamt t, typename arg> class test<t, void (t::*)(arg)>{};//特殊化したい

んですが、コンパイラからは「特殊化できない」とエラーになります。

引数の数が被ってるのがダメなのかと思い、
template<typenamt t, typename sig, typename dammy1, typename dammy2> class test;
template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg), void, void>{ result r; };
template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{};
としてもやはりダメでした。

91:(90)
07/09/30 12:50:52
ちなみに上下共に同じエラーで弾かれます。

92:(90)
07/09/30 13:03:41
後者にしたうえで、
template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{};

template<typenamt t, typename arg> class test<t, void, arg>{};
としtemplate<typenamt t, typename result, typename arg> class testの特殊化を狙っても
「テンプレート引数の数が少なすぎます」とダメでした。

93:デフォルトの名無しさん
07/09/30 13:04:35
ちょっと質問。

ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、
インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか?

ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。
他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。
ちなみにヘッダファイルの移動はないことを前提としています。


94:デフォルトの名無しさん
07/09/30 13:04:48
int main(){
(処理)
return 0;
}

何で0を返すんですか?
1ではダメなのですか?

95:デフォルトの名無しさん
07/09/30 13:20:19
>>94
いいよ~
終了コードの使い方は処理系依存だけど、一般的には
0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。

96:デフォルトの名無しさん
07/09/30 13:25:37
>>90
gcc 3.4.4 だと通った。 詳しいことは解らんけど、それだけ報告。

#include <stdio.h>
template<typename t, typename sig> class test {
public: static void foo(){ printf("foo\n"); }
};
template<typename t, typename arg> class test<t, void (t::*)(arg)> {
public: static void foo() { printf("bar\n"); }
};
class X{};
int main()
{
test<int,int>::foo();
test<X, void(X::*)(int)>::foo();
}

97:デフォルトの名無しさん
07/09/30 13:48:55
>>93
適材適所。
そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。
そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して
残りはファイル名で記述すればいいだろう。
例えば、こんな感じ。
--
/home/who/someProject/include/catA/inc1.h
/home/who/someProject/include/catA/inc2.h
/home/who/someProject/include/catA/inc3.h
/home/who/someProject/include/catB/inc4.h
/home/who/someProject/include/catC/inc5.h
こんなインクルードファイルがあるなら、
#include "catA/inc1.h"
#include "catA/inc2.h"
#include "catA/inc3.h"
#include "catB/inc4.h"
#include "catC/inc5.h"
と記述してパス指定に$HOME/someProject/includeを追加。


98:デフォルトの名無しさん
07/09/30 14:07:02
>>90
コンパイラは何を使っている。
また、そもそも何をしたい?それ次第では別の手段があるかもしれない。

99:デフォルトの名無しさん
07/09/30 14:16:00
>>90
#include <stdio.h>
#include <boost/type_traits.hpp>

class test1 {
public: static void foo() {printf("test1\n"); }
};
template<typename t, typename result, typename arg>
class test2 {
public: static void foo() {printf("test2\n"); }
};
template<typename t, typename arg>
class test3 {
public: static void foo() {printf("test3\n"); }
};

namespace detail {
template<typename t, typename sig> struct selector {
 typedef test1 type;
};

template<typename t, typename result, typename arg> struct selector<t, result (t::*)(arg)> {
 typedef typename boost::mpl::if_<boost::is_void<result>, test3<t,arg>, test2<t,result,arg> >::type type;
};
}

int main(int argc, char *argv[]) {
 detail::selector<test1,void>::type::foo();
 detail::selector<test1,int(test1::*)(int)>::type::foo();
 detail::selector<test1,void(test1::*)(int)>::type::foo();
 return 0;
}

100:デフォルトの名無しさん
07/09/30 14:18:29
そもそも>>90のresult r;って、
コンパイラさえ問題なく、しかもrがvoid型なら、
<t, void (t::*)(arg)>なんて特殊化は
不要だと思ったのだが違うのか?

101:デフォルトの名無しさん
07/09/30 14:20:32
>>93
インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。
インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。

行儀のいいやりかたは、>>97のように、インクルードパス直下にヘッダを
置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に
ヘッダを入れることだ。
そうすることで、汚染する名前をディレクトリ名だけに限定でき、
名前の衝突を回避しやすくなる。
勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる
というメリットもある。

102:デフォルトの名無しさん
07/09/30 14:28:50
boostみたいに実装詳細のヘッダをhoge/datail に入れておくと
外部公開するヘッダとプライベートなヘッダを分けられてうれしい

103:デフォルトの名無しさん
07/09/30 14:32:36
svnのboost::function_typesなら関数の型から、戻り値や引数を取りだせるから
それとenable_ifで特殊化してやる方法もある

#include <iostream>
#include <boost/function_types/result_type.hpp>
#include <boost/type_traits.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/utility.hpp>

void func_v() {}
int func() { return 0; }

template <
  typename sig
 , class Enable = void
> struct C { void f() { std::cout << "func\n"; } };

template <typename sig>
struct C< sig
    , typename boost::enable_if<
       typename boost::is_same<
         typename boost::function_types::result_type<sig>::type
        , void>::type>::type
     >
{ void f() { std::cout << "void func\n";} };

int main() {
  C< BOOST_TYPEOF(func_v) >().f();
  C< BOOST_TYPEOF(func) >().f();
}

104:デフォルトの名無しさん
07/09/30 14:34:33
うへ

仕事では出会いたくないタイプのコードだな……
だからC++は(ry

105:デフォルトの名無しさん
07/09/30 14:34:45
boost厨多過ぎ

106:デフォルトの名無しさん
07/09/30 14:39:40
boostは順調に使えてる時点ではいいんだけど、
バグったりするともうお手上げ

107:デフォルトの名無しさん
07/09/30 14:45:56
そのバグを自力で直して公式に反映できたり、
そこから新しい使い方を発見できる程になりたひ

108:デフォルトの名無しさん
07/09/30 17:23:09
>>97
>>101
レスありがとうございます。

自分も正直ごちゃごちゃしたインクルードパスを書くよりは
プロジェクトのルートパスを一つ指定するような書き方が望ましいと思っているので、
その方向で調整して行きたいと思います。

ただ、好みの問題程度にあしらわれないか不安ではありますが。

109:(90)
07/09/30 17:29:01
使っているコンパイラはvisual C++ 2005です。
メンバ関数を特殊化で返り値、クラス、引数をそれぞれ特殊化した後に
内部に作っておいたクラスを使い間接的に返り値を特殊化したらコンパイルが可能になり解決しました。

110:デフォルトの名無しさん
07/09/30 17:40:52
オーバーロードについて質問

int Func(int a=NULL);
string Func(string a="");

こんな感じで引数が無い場合に戻り値の型によって
関数がオーバーロードされるのを期待してみましたが
コンパイルエラーが出てしまいました

このような場合関数名を変えるしか無いのでしょうか?

111:デフォルトの名無しさん
07/09/30 17:45:01
>>110
戻り値の型でオーバーロードはできません。

ポインタじゃないものに NULL を使っちゃだめです。

112:デフォルトの名無しさん
07/09/30 17:54:37
>>111
ありがとうございます

113:94
07/09/30 18:43:55
>>95
ありがとうございました。

114:デフォルトの名無しさん
07/10/01 02:02:40
int x = 4896;
int y = 1406;

double z = y/x;

でzが0になってしまうのですが、
これを0.28....
とやるにはどうすれば良いのでしょうか?

115:デフォルトの名無しさん
07/10/01 02:04:23
z = (double)y / x;

116:デフォルトの名無しさん
07/10/01 02:47:24
わぁ、ありがとうございます。
ところで、double>intなのに
なんで代入変換されないのでしょうか?

117:デフォルトの名無しさん
07/10/01 02:51:35
z=y/xという式は、まずy/xが実行される。
int/intなので結果はint、この時点で結果が0になる。
int型の0をdouble型に代入しても当然0になる。
(double)y/xとすることで、yがdoubleになりこの式の結果もdoubleになる。

118:デフォルトの名無しさん
07/10/01 02:51:59
int同士の/演算はint -> int -> intだから、代入する時点ですでに(intの)0なんだよ。
それをdoubleに変換したところで、0.0になるだけさ。

119:デフォルトの名無しさん
07/10/01 02:55:02
なるほど、ありがとうございました!

120:デフォルトの名無しさん
07/10/01 03:47:41
演算子の優先順位って奴だな

= よりも / の方が優先順位が高い

121:デフォルトの名無しさん
07/10/01 03:54:49
=の優先度がたかかったら使いにくくてしょーがねー。
(z=y)/x は欲しい結果じゃないだろ?除算結果捨ててるしなw


122:デフォルトの名無しさん
07/10/01 12:09:57
メンバ変数をpublicメンバにして公開せずに入出力関数を用意すべきと言いますが
その際に入力用と出力用と2種類作った方が良いのでしょうか?

class Choge
{
private:
 std::string memo_;
public:
 std::string memo(const std::string& data = "")
 { return (data.empty() ? memo_ : memo_ = data); }
}

上のように入出力をまとめちゃった方がスッキリしそうな気がするのですが
少しトリッキーなようで、こんな事をしても良いのか迷ってます

123:デフォルトの名無しさん
07/10/01 12:12:09
>>122
そのメンバを空にしたいときにはどうするんだ?
そんな癖のある仕様にするくらいなら、別々に作った方がいいことは自明だ。

124:デフォルトの名無しさん
07/10/01 12:25:17
>>122
そもそも、メンバを参照するだけのmemo()がconstメンバ関数じゃないから使い難い。
設定用に非constメンバ関数、取得用にconstメンバ関数を用意するなら、最初から別々に作ればいい。
# 例えば、void func(Choge const & hoge)なんて関数からhoge.memo()を呼べないのは面倒だぞ。

125:デフォルトの名無しさん
07/10/01 12:54:48
>>123-124
なるほど。
やっぱり別々にすべきですね。
ありがとうございました。

126:デフォルトの名無しさん
07/10/02 07:37:48
ff5a_analyzer_src.zip (53 KiB)
ff5a_analyzer のソースコードです。まだ未完成です。文字コードは EUC-JP、改行コードは LR となっています。
とあるのですが
URLリンク(x11.s11.xrea.com)

このソースのコンパイルの仕方はどうやるのでしょうか
OSはXPです

127:デフォルトの名無しさん
07/10/02 07:38:20
はじめまして、すいませんが質問させてください。

Linux(Turnolinux Fuji)でsys/systeminfo.hを
includeしてSI_HOSTNAMEを使用したい< sysinfo(SI_HOSTNAME~を対処したい >のですが、
コンパイル時にsys/systeminfo.hがないとエラーが出力されてしまいます。

どうすればよいのでしょうか?ご教授ください。


128:デフォルトの名無しさん
07/10/02 07:44:19
探す。includeする。



129:デフォルトの名無しさん
07/10/02 07:44:46
>>126
ちゃんとmakefileまでついてるじゃないか
gccみたいだけど別にほかのコンパイラでも大丈夫だろ

130:デフォルトの名無しさん
07/10/02 07:46:26
>>126
cygwinを入れて、makeではどうでしょう。

>>127
systeminfo.hを探してみたらどうでしょう。

131:デフォルトの名無しさん
07/10/02 08:12:04
>>129
>>130
ありがとうございます
がんばってみます

132:デフォルトの名無しさん
07/10/02 12:48:32
質問です。
INT_MIN~INT_MAXの範囲を超える整数の計算をしたいんですけど
どうしたらよいのでしょうか?

133:デフォルトの名無しさん
07/10/02 13:02:56
>>132
URLリンク(search.vector.co.jp)

134:デフォルトの名無しさん
07/10/02 13:03:45
>>132
intよりも大きい値を扱える型を使いなさい。

135:デフォルトの名無しさん
07/10/02 13:34:03
ありがとうございます

>>133
多倍長っていうんですね。
ググってみます。なるべく自作したいので。

>>134
ちょっと思いつかないんですが、例えばどんな型がありますか?
符号付の値が扱えるのがいいです。
こちらの環境はVC6です。

136:デフォルトの名無しさん
07/10/02 13:41:24
>INT_MIN~INT_MAXの範囲を超える整数の計算をしたいんですけど

大きく超えないのなら vc6 なら __int64 が使えないこともない。
(なんか加算でバグった経験あって個人的には嫌だけど)

137:デフォルトの名無しさん
07/10/02 13:43:20
>>135
C99ならlong longも使えるし、そうでなくてもint64_tなどの型があるかもしれない。
それに、doubleでもlong doubleでもいいかもしれない。
要は、INT_MAXを超えると言われても大きさも必要精度も判らなければなんともしようがない。

138:デフォルトの名無しさん
07/10/02 15:38:16
>>135
Windowsだと__int64 / unsigned __int64

139:132
07/10/02 16:13:46
>>136
そういえばそんなものがありましたね。試してみます。どうもです。
(バグってどんなバグだろう)

>>137
VC6なのでC99なんて対応してません。
精度は64ビットも要らないけど32ビットじゃ足りません。

__int64で試してみます。


140:132
07/10/02 16:14:33
>>138もありがとう

141:デフォルトの名無しさん
07/10/02 16:23:33
>>139
32<必要ビット数<64なら、doubleが丁度手頃じゃないか。
非標準の型を使わなくて済むし。

142:デフォルトの名無しさん
07/10/02 16:31:10
hoge.h hoge.cpp とわざわざ2つのファイルに分けるのはどうしてですか?
後でヘッダファイル見て理解しやすいようにしてるだけ?

ヘッダに実装部も含めてclassを記述しちゃった方が楽だと思うのですが

143:デフォルトの名無しさん
07/10/02 16:34:35
そう思うのなら、そうすればよろしいでしょう。
実際私も、クラスの実装はインクルードファイルに書くことが多くなっています。

144:デフォルトの名無しさん
07/10/02 16:46:54
>>143
何か問題はないのでしょうか?

145:デフォルトの名無しさん
07/10/02 16:58:17
>142に提示された条件だけでは問題があるともないともいえません。

146:デフォルトの名無しさん
07/10/02 17:03:12
ヘッダに実装コードを書くのはおかしい

147:デフォルトの名無しさん
07/10/02 17:05:19
単にprivateなメンバ変数の値返すだけとかならヘッダに書いちゃう。

148:デフォルトの名無しさん
07/10/02 17:12:10
>>144
やってみて問題なければいいんじゃない

149:デフォルトの名無しさん
07/10/02 17:13:53
全てを宣言内に書いてしまうというのは、分割コンパイルの利点の放棄に等しい。
まぁマシン速くなったから、それもいいんじゃない?

150:デフォルトの名無しさん
07/10/02 17:17:49
>>145-149
ありがとうございます

>分割コンパイル

そういう意味もあるんですね

151:デフォルトの名無しさん
07/10/02 17:18:11
>>147
そうゆうのはインライン何とかの範囲だからいいと思う

152:デフォルトの名無しさん
07/10/02 17:22:43
インラインは早いけどたくさん使うと実行ファイルが大きくなるみたい

153:デフォルトの名無しさん
07/10/02 17:26:40
どうせ今のコンパイラはオブジェクト間最適化で無理矢理インライン展開したりもするんだから、気にするほどのことじゃないだろ。
ついでに言えば、テンプレートクラスだとどうせ実装はインクルードファイルに書かないといけなくなるわけで。

154:デフォルトの名無しさん
07/10/02 18:38:32
switch - case と do - while について質問

下記のコードで処理がどのような順番で行われるのか教えてください。
よろしくお願いします。

int width = 15;
int n = (width + 3) / 4;
switch(width & 0x03) {
case 0: do { *buffer++ = 0
case 3: *buffer++ = 0;
case 2: *buffer++ = 0;
case 1: *buffer++ = 0;
} while(--n > 0);
}


155:デフォルトの名無しさん
07/10/02 18:42:26
>>154
ざっくり言うと、widthを4で割った回数だけループする作りになっている。
実際には、4で割った余りも処理しないといけないのでその分を最初の
switchからのcaseへの飛び込みで賄っている。
つまり、その例では15でスタートするから初回はcase 3に飛び込むわけだ。

156:デフォルトの名無しさん
07/10/02 18:45:00
各行にprintfでも挟んでみれば?

157:154
07/10/02 18:51:37
>> 155
どうもありがとうございます。
初回に case 3 に飛び込むのは理解しました。
2回目以降はどうして case 0 ~ case 1 まですべての処理を通るのでしょうか。
すいませんが、もう少し詳しく解説してください。

>> 156
printf を挟んで動作は確認しました。
ただ、どうして >> 155 さんのような挙動になるのか理解できません。


158:デフォルトの名無しさん
07/10/02 18:54:16
最初に switch でどれかの case ラベルに飛んだ後、 while で条件が偽だった場合 do に戻る

159:デフォルトの名無しさん
07/10/02 18:57:26
もしかして、break が無いとそのまま次の case が実行されるってことを知らない?

160:デフォルトの名無しさん
07/10/02 18:58:11
ちなみにこれはDuff's deviceという名で有名。

161:デフォルトの名無しさん
07/10/02 19:02:16
まあただの興味で聞いてるだけだと思うが一応
caseの後には必ずbreak付けろ
使わなくてもdefaultは書け
caseはswitchスコープの直下に置け、ループの途中に挟むなんて言語道断
以上

162:155
07/10/02 19:08:41
>>154
ヒントを一つ。caseラベルはswitch以外からは只のラベルにしか見えない。
つまり、switchから飛び込んだ後は存在しないも同然。
各caseラベルを渡り歩く理由については>159にも書かれている通り、breakしないとスルーするわけだ。

163:デフォルトの名無しさん
07/10/02 19:12:30
アルゴリズムの質問なんですが
カオリ、165cm、24歳、年収500万
サキ、150cm、21歳、年収1000万
タカシ、180cm、18歳、年収200万
グレイ、100cm、120歳、年収0etc
というデータがあってa*身長+b*年齢+c*年収の値が一番大きい順にソートしたとき
最もあいうえお順に近い並び方になるa,b,cの値を探すプログラムを書きたいのだが
如何組めばいいか見当がつきません。
教えてください。

164:デフォルトの名無しさん
07/10/02 19:15:26
全通りの並べ方試してみてそれぞれあいうえお順に近いかどうか調べりゃいいじゃん
ところであいうえお順に対する近さって何?

165:154
07/10/02 19:20:26
>>159
それは理解してます。

>>160
ありがとう。色々調べてほぼ理解できました。

>>161
自分で書く場合はそうしています。
なので、逆に今回のコードが理解できませんでした。

>>162
最初の case 0: do { ...; case 1: ... の時点で理解不能でした。
switchが単なるcaseラベルへのジャンプだと理解すれば
それ以降は do{ } while() だけに注目すればよく、その中ではcaseラベルに意味はないのですね。


166:デフォルトの名無しさん
07/10/02 19:21:51
あうかえお
○××○○
3/5=60%
という感じでこの値を100に近づけたいんです。
パラメータの全通りとはどのような感じですか?

167:デフォルトの名無しさん
07/10/02 19:22:07
さらにgotoを加えて混乱させればいいのに…

168:デフォルトの名無しさん
07/10/02 19:23:45
>>166
なんで「う」が×なんだ?

169:デフォルトの名無しさん
07/10/02 19:24:51
>>163
Nx3行列A
165 24 500
150 21 1000
180 18 200
100 120 0

3x1行列B
a
b
c

Nx1行列C
6 ← 50音順で何番目か
11
16
8

とするとき
A・B=C
を満たす行列Bを決定すればよい
このとき行列Aの逆行列をPとするとき(上付き文字が使えないので^^;)
両辺に左からPを掛けると
P・A・B=P・C
B=P・C
となり求めることが出来る
逆行列の求め方は本(Numerical Recepies in C/C++ みたいなやつ)に
書いてあるのでそれを見ればおk

170:デフォルトの名無しさん
07/10/02 19:27:48
>>161
URLリンク(ja.wikipedia.org)'s_device


171:163
07/10/02 19:28:46
>>168
本来その位置は「い」だからです。
>>169
どうもありがとうございました。
さっそくやってみます。

172:デフォルトの名無しさん
07/10/02 19:34:26
本来って何だ
「あ」「う」「か」「え」「お」のソートに何で「い」が出てくるんだ?
じゃあデータが「さ」「し」「す」「せ」「そ」ならこうなるのか?

さ        し       す      せ       そ
×(本来あ) ×(本来い) ×(本来う) ×(本来え) ×(本来お)
0%

変なの

173:168
07/10/02 19:35:26
>>172 は俺じゃないぞw
俺はもう諦めた

174:172
07/10/02 19:37:07
いや、168を騙るつもりはないが
なんか致命的な勘違いをしてる予感がしたから聞いてみたんだがもう見てないかな

175:169
07/10/02 19:38:07
>>171
>>169 をちょっと訂正
要素数Nが4以上の時は

Nx4行列A (4列目の要素は常に1)
165 24 500 1
150 21 1000 1
180 18 200 1
100 120 0 1

4x1行列B
a
b
c
d

にしないといけない

176:163
07/10/02 20:36:22
>>169
追加どうもです。

例が悪かったですね。
あうかえおいきくけこさしすせそ以下順番どおりだとすると
47/50=94%となります。

177:デフォルトの名無しさん
07/10/02 21:18:47
例が悪いというか、希望する順列との差異を表したいわけでしょ?
そこで「あいうえお」を例にするから悪いわけじゃね?
普通の人が聞けば「あ」はあるかも知れんが「い」はないかもしれないと思う。

178:デフォルトの名無しさん
07/10/02 21:51:19
てことは「んあいうえおかきくけこ…を」だったら0%なわけね
そういう定義ならそれでいいけど目的としてはそれで大丈夫なの?

179:163
07/10/02 22:10:54
すみませんでした。

>>177
仰るとおりです。
>>178
大丈夫です。

180:デフォルトの名無しさん
07/10/02 22:21:34
C++でnewで生成した配列の要素数って求められないんでしょうか?
char* a = new char[5];
char b[5];
sizeof(a) は4(ポインタのサイズ) sizeof(b)は5になるのですが...
お願いします


181:デフォルトの名無しさん
07/10/02 22:23:10
>>163って、結果が必ず50音順になるわけじゃ無いよな。
効率よくやるのは結構ムズい気がする。
あいうえお順に近い並び方から順に、解があるかどうかを
1つずつ調べていくプログラムが作るの楽なんじゃないかなぁ。

182:デフォルトの名無しさん
07/10/02 22:30:25
>>180
char a[] = new char[5];
にすればおk

183:デフォルトの名無しさん
07/10/02 22:32:27
コンテナ使えやヴォケェ

184:デフォルトの名無しさん
07/10/02 22:33:54
スマソ >>182じゃ無理かも
C++ならvectorでもつかっておけば?
風邪なのに2chやってると判断力が鈍るな

185:デフォルトの名無しさん
07/10/02 22:43:23
コンテナなんてクソ

186:デフォルトの名無しさん
07/10/02 22:48:35
int hoge = 5;
char* a = new char[hoge];
でhoge見りゃいいじゃん

187:デフォルトの名無しさん
07/10/02 22:55:21
要素数とポインタをタプルにしよう☆

188:デフォルトの名無しさん
07/10/02 22:57:40
サイズは定数で無いと受け付けないから

189:デフォルトの名無しさん
07/10/02 22:59:25
じゃあboost::arrayもしくはそれに似たものを自作すればおk

190:182
07/10/02 23:05:56
レスありがとうございました. Vector使います.
もひとつ関連質問ですが、Cで関数に配列渡す場合同じことが起きるんですが
関数内で渡された配列の要素数が必要な場合、要素数も別に渡さないと
いけないということですか?
void hoge(char a[], int numOfFactor)みたいに

191:デフォルトの名無しさん
07/10/02 23:10:34
もちろんそうよ
ループの終了条件にしか使わないなら番兵置く手もあるけど

192:デフォルトの名無しさん
07/10/02 23:11:13
>>190
そうだよ。静的な配列ならsizeofで要素数を取得できるけど、そうでない場合は別に値を管理する必要がある

193:190
07/10/02 23:14:31
了解しました。重ね重ねありがとうございました。
要素はfactorじゃなくてelementでした。おまいらサンクス!!

194:デフォルトの名無しさん
07/10/02 23:23:50
どっちかと言うと、C++では先頭及び最後の1つ後を指すイテレータ
という2つの引数を取るほうが一般的だと思う。

template<typename Iterator>
void hoge(Iterator first, Iterator last);
要素数はポインタ的にfirst - lastと言いたいとこだが、
std::distance(first, last)で求める。

もうちょっと先進的なのが好みならBoost.Range。
template<typename Range>
void hoge(Range& r);
boost::size(r)で要素数が求まる。
boost::begin(r), boost::end(r)でイテレータ取得。
vectorその他コンテナ一般や配列などを引数に渡せる。

195:デフォルトの名無しさん
07/10/03 02:17:51
DWORD dwSize = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(dwSize));

これをNewを使って書き換えるとするとどんな風になりますか?

196:デフォルトの名無しさん
07/10/03 02:37:03
Happy New Year

197:デフォルトの名無しさん
07/10/03 04:24:39
んー。
std::vector<BYTE> buffer(GetFileSize(...));

198:デフォルトの名無しさん
07/10/03 06:57:09
DWORD New = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(New));


199:デフォルトの名無しさん
07/10/03 08:33:47
DWORD dwSize = GetFileSize(...);
//1 LPBYTE lpBuffer = new BYTE[(dwSize + sizeof(BYTE) - 1) / sizeof(BYTE)];
//2 LPBYTE lpBuffer = (LPBYTE)new char[dwSize]
//3 LPBYTE lpBuffer = new BYTE[dwSize]

200:デフォルトの名無しさん
07/10/03 09:03:51
//4 LPBYTE lpBuffer = new(nothrow) BYTE[dwSize];

malloc差し替えなら挙動が同じ(bad_alloc投げずにNULL返す)new(nothrow)最強

201:デフォルトの名無しさん
07/10/03 09:39:48
んなコードは窓から投げ捨ててFileMapping使え

202:デフォルトの名無しさん
07/10/03 11:11:39
WindowsServer2003x64上で、64ビットプロセスと32ビットプロセスのメモリ共有を行いたいと思っています。
調べてみるとメモリマップドファイルがあるのですが、これで実現可能でしょうか?単純な方法がありましたら教えていただきたいです。
また、64ビットプロセスでメモリ確保したものを32ビットプロセスでデータ参照するにはどうすればいいでしょうか?



203:デフォルトの名無しさん
07/10/03 13:30:07
>>202
可能。メモリマップドファイル経由。

204:デフォルトの名無しさん
07/10/03 14:54:08
独学で勉強中です。

ClassA a;
ClassA b = a;
ClassA c(a);
とした場合
bはメンバ変数が初期化され、
cは未初期化状態になります。
これは言語仕様でしょうか?環境依存でしょうか?

WinXP + Cygwin + gcc3.4.4

205:デフォルトの名無しさん
07/10/03 15:03:23
やってみたが

#include <iostream>
class ClassA {
public: int x;
};
int main()
{
  ClassA a;
  a.x = 42;
  ClassA b = a;
  ClassA c(a);
  std::cout << b.x << std::endl;
  std::cout << c.x << std::endl;
}

実行結果
42
42

どのへんが未初期化?

206:デフォルトの名無しさん
07/10/03 16:08:56
>>205
>ClassA c(a)
これは、どういうことをしてるの?

207:デフォルトの名無しさん
07/10/03 16:13:35
コピーコンストラクタによる初期化

208:デフォルトの名無しさん
07/10/03 16:19:21
>>207
コピーコンストラクタってどこに宣言・定義されてるの?
#include <iostream> <----ここの中?


209:デフォルトの名無しさん
07/10/03 16:22:39
>>208
>コピーコンストラクタってどこに宣言・定義されてるの?
あなたの心の中。

冗談さておき、特に自前で宣言しなかった場合は暗黙のコピーコンストラクタが用意される。
# なーに、メンバを全部(浅い)コピーに出すだけさ。

210:デフォルトの名無しさん
07/10/03 16:28:28
>>209
>暗黙のコピーコンストラクタ
ってこうしなさいとC++の仕様で決まってるんの?

211:デフォルトの名無しさん
07/10/03 16:55:28
そう。

212:デフォルトの名無しさん
07/10/03 17:46:41
浅いコピーっていうのは、単なるビットコピーってこと?

213:デフォルトの名無しさん
07/10/03 17:49:46
浅いコピーなんだから深く考えちゃだめ

214:デフォルトの名無しさん
07/10/03 17:50:38
そのメンバがコピーコンストラクタを持っていればそれを使うが、ない場合はそういうことになる。

215:デフォルトの名無しさん
07/10/03 19:47:41
>>205
すみません、説明不足でした。

> ClassA a;
> a.x = 42;
> ClassA b = a;
> ClassA c(a);

> a.x = 42;
を取ると
0
17~~~(-1のunsinged表記?)
のように表示されてます。

両方ともコピーコンストラクタによりインスタンスが生成されていますが
結果が異なっていたため気になった次第です。

216:デフォルトの名無しさん
07/10/03 19:56:40
そもそも元のメンバ変数を初期化していない時点で
まともな動作を期待するなよ

217:デフォルトの名無しさん
07/10/03 20:14:24
>>216 的確ワロスw

218:デフォルトの名無しさん
07/10/03 20:52:49
int x;
printf("%d\n", x);

219:デフォルトの名無しさん
07/10/03 21:09:32
>>216
int x;
int y;
x = y;
この場合, x, yは異なる可能性があるの?

220:デフォルトの名無しさん
07/10/03 21:19:33
>>219
マジで?

221:デフォルトの名無しさん
07/10/03 21:20:08
C++で使用対象のクラスが参照カウンタを実装している可能性があるので
ZeroMemoryなどでデータを初期化するのはご法度

と何処かで目にしか記憶があるのですが、同様の理由で構造体に対しても
ZeroMemoryを使うことはあまり好ましくないのでしょうか?

C言語では常套手段だったので。

222:デフォルトの名無しさん
07/10/03 21:24:57
#include <tr1/memory.hpp>
#include <cassert>

struct Base { virtual char f(void) =0; };

struct A : public Base {
char f(void) { return 'A'; }
};

struct B : public Base {
char f(void) { return 'B'; }
};

int main() {
std::tr1::shared_ptr<Base> p;
p.reset(new A);
assert( p->f() == 'A' );
p.reset(new B);
assert( p->f() == 'B' );
}
こういう実行時バインディングをCRTPを使って書きたいんですがどう書けばいいんでしょうか?

223:デフォルトの名無しさん
07/10/03 21:25:53
>>215
ローカル変数として定義したオブジェクトはデフォルト初期化される
組み込み型の場合のデフォルト初期化は不定値
どんな実装でどんな結果になろうが、考えること自体意味がない

224:デフォルトの名無しさん
07/10/03 21:27:02
>>221
その構造体・クラスがPODならZeroMemoryしても構わない。
PODになるには色々条件(コンストラクタ・デストラクタ、仮想関数禁止など)があるが、
概ねCでそのまま使えるような単純な構造体なら大丈夫と思っていい。

それでも、ZeroMemoryよりは初期化子などでゼロ初期化を促すほうが一般的だと思うけど。

225:221
07/10/03 21:29:51
>>224
素早い回答ありがとうございます。

226:デフォルトの名無しさん
07/10/03 21:44:15
そもそもコンストラクタで初期化させるように設計するものなのでは?

227:デフォルトの名無しさん
07/10/03 21:48:41
でも外部のライブラリなんかで、
そういうCと共通のヘッダを使うなんて機会もあるし。
#そういうのはラップしろというのは同意。

228:デフォルトの名無しさん
07/10/03 21:59:40
>219
>>215 の報告を信じるなら、クラスのメンバ変数の場合には異なることが
ありうるってことだねぇ。最適化の関係かな。

229:222
07/10/03 22:19:01
#include <cassert>

template <typename Derived>
struct base
{
  char interface() { return reinterpret_cast<Derived*>(this)->implementation(); }
  static char static_func() { return Derived::static_sub_func(); }
};

struct derived : base<derived>
{
  char implementation() { return 'A'; }
  static char static_func() { return 'B'; }
};

template <typename T>
char f(base<T>& t) { return t.interface(); }

int main() {
  derived d;
  assert( f(d) == 'A' );
}
英語版wikipediaを参考に書いてみましたがまだしっくりきません
というかあきらかに違うような気がします

230:202
07/10/03 22:46:03
>>203
ありがとうございます。メモリマップ先をファイルでなくメモリで可能ですよね?ただ、やはりメモリ幅の違いが気になります。実装は困難なのでしょうね・・・


231:デフォルトの名無しさん
07/10/03 23:17:09
>>229
reinterpret_castではなく、static_castにすべきだが、ほかは合っている。

232:デフォルトの名無しさん
07/10/03 23:19:59
>>230
自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単
#include<windows.h>
#include<stdio.h>

#define IS_PARENT // ←この行の有りと無しでコンパイルする
#define MEMMAP_ID "maptest"

int main(void){
HANDLE hmap;
char *ptr;

#ifdef IS_PARENT
hmap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, MEMMAP_ID);
if(hmap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS){
CloseHandle(hmap);
return 1;
}
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
ptr[0]='\0';
while(scanf("%255s", ptr)==1) ;
#else
hmap=OpenFileMapping(FILE_MAP_WRITE, FALSE, MEMMAP_ID);
if(hmap==NULL) return 1;
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
while(getchar()!=EOF) printf("%s", ptr);
#endif
UnmapViewOfFile(ptr);
CloseHandle(hmap);
return 0;
}

233:デフォルトの名無しさん
07/10/03 23:20:05
>>230
size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。
32ビットプロセス同士でやるのと同じ。

234:202
07/10/04 00:24:19
>>232, 233
ご返信ありがとうございます。
今メモリ共有を行いたいのは、unsigned char型の配列です。
この場合も普通に232さんの教えくださったサンプルで問題ない
という認識でよろしいでしょうか?

235:デフォルトの名無しさん
07/10/04 00:30:36
>>234
なぜ、やってみないのでしょうか?

>>232 はただの動作確認のためだけのサンプルです
サンプルで問題がないかどうかは使い方によります
使用しているAPIについて*自分で*調べて下さい

236:202
07/10/04 00:35:11
>>235
ご返信ありがとうございます。おっしゃるとおりです。
自分で調べずにすぐに質問してしまいました。
実装にトライします。
ありがとうございました。

237:デフォルトの名無しさん
07/10/04 01:12:29
>>103
enable_if 使う初心者w



238:デフォルトの名無しさん
07/10/04 10:11:51
そんなこと言われても、mplなんて使いこなせないんで…

239:デフォルトの名無しさん
07/10/04 10:42:45
stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?

240:デフォルトの名無しさん
07/10/04 11:02:01
>>239
標準ライブラリのソース内でしょう。

241:デフォルトの名無しさん
07/10/04 11:11:59
C++はヘッダファイルではなくヘッダをインクルードしますが
ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?

242:デフォルトの名無しさん
07/10/04 11:18:39
>>241
ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。

で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。

243:デフォルトの名無しさん
07/10/04 11:34:30
>>242 ものすげえわかり易くてワロスw

244:デフォルトの名無しさん
07/10/04 12:10:53
<iostream>ってヘッダファイルぢゃないの?

245:デフォルトの名無しさん
07/10/04 12:13:19
>>244
C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。

246:デフォルトの名無しさん
07/10/04 12:17:38
>>242
なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?

247:デフォルトの名無しさん
07/10/04 12:19:34
>>245
例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?

248:デフォルトの名無しさん
07/10/04 12:20:31
>>246
いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし

249:デフォルトの名無しさん
07/10/04 12:23:16
privateな仮想関数って意味ありますか?
派生クラスで上書きしても呼び出せないのに。

250:デフォルトの名無しさん
07/10/04 12:25:05
>>248
プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?

251:デフォルトの名無しさん
07/10/04 12:25:12
delphiのinterface節/impliments節ってよくできてると思う

252:デフォルトの名無しさん
07/10/04 12:27:47
>>249
Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。

253:デフォルトの名無しさん
07/10/04 12:32:52
>>250
ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。

そんなの俺に聞いてどう答えて欲しいの?

254:デフォルトの名無しさん
07/10/04 12:39:36
>>249
派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。

255:デフォルトの名無しさん
07/10/04 15:37:19
>>252
>>254
class B
{
public:
void mf(){ privmf(); }
private:
virtual void privmf();
};

class D : public B
{
private:
void privmf();
}

int main()
{
D objd;
objd.mf();

return 0;
}

このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、
D::privmf()になるのですがなぜですか?
ポインタか参照に対して呼び出されたときにポリモルフィズム機構
が働くと思うのですが。
void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、
このthisポインタが指している実際のオブジェクトの型がクラスDの
場合(上のプログラムの場合)はD::privmf()が呼ばれるということで
しょうか?

256:デフォルトの名無しさん
07/10/04 15:59:23
そのとおり

257:デフォルトの名無しさん
07/10/04 16:11:28
>>256
ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。


258:BOLT
07/10/04 18:19:42
自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。
URLリンク(ccplus.blog121.fc2.com)ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。

259:デフォルトの名無しさん
07/10/04 18:22:29
クソショボイブログだなw
誰も見ないしとっとと閉鎖しろよ

260:デフォルトの名無しさん
07/10/04 18:42:04
誰も見てくれないからこそ続けるんだ
最低1年くらいは毎週更新できるように努力しる

261:デフォルトの名無しさん
07/10/04 19:31:14
C++が全角なのが気にくわない

262:デフォルトの名無しさん
07/10/04 19:58:05
「全角ってなんですか?」
「"いわゆる全角"のことではないでしょうか」

263:デフォルトの名無しさん
07/10/04 20:40:46
いいえ、焼き肉屋のことです。

264:デフォルトの名無しさん
07/10/04 20:56:58
おまえら向上心のある奴はやさしくしてやれよ

265:デフォルトの名無しさん
07/10/04 21:34:20
どこぞのかわいがりよりはずっとやさしい。

266:デフォルトの名無しさん
07/10/04 22:32:21
可愛がってやらないと強くならないぞ!

267:デフォルトの名無しさん
07/10/04 22:37:51
C++でCSVからデータを読み込もうとしています。
普通は1文字ずつ変数に入れていくと思うのですが、
プログラム側で #define FILENAME "a.txt" と定義しておき、
CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。
よろしければお力添えをお願いいたします。

268:デフォルトの名無しさん
07/10/04 22:45:46
"FILENAME"があったら適当に置換でもしとけばいいじゃん

269:267
07/10/04 23:04:23
返信ありがとうございます。説明が不足していました。
defineが他にも多数あり、今後外部ファイルに定義を移して
defineの名前も変更できるようにするため、いい方法がないかと思っています。
FILENAME 1個だけなら置換で問題ないですね。

270:デフォルトの名無しさん
07/10/04 23:06:54
CreateProcessでWindows Services for UNIXのunzipコマンドを使うのは可能ですか?

271:デフォルトの名無しさん
07/10/04 23:07:08
>>269
よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?


272:デフォルトの名無しさん
07/10/04 23:19:35
>>270
createprocess 外部コマンド
で検索するぐらいしてから来れば?


273:267
07/10/04 23:28:39
>>271
すみません、cppでプリプロセスの理解ができませんでした。
私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。

274:デフォルトの名無しさん
07/10/04 23:29:59
クラスのメンバ変数に参照型を追加した場合の初期化の
方法はこれが正しい書き方でしょうか?

class Hoge{
private:
int &Test;
public:
Hoge(int &T):Test(T){}
~Hoge(){}
}

275:デフォルトの名無しさん
07/10/04 23:32:00
いえす
一番最後にセミコロン無いけど

276:デフォルトの名無しさん
07/10/04 23:35:30
>>267
その程度のこと会社で聞けよ
きみの会社の客はかわいそうだな


277:275
07/10/04 23:38:58
>>275
どうも。
参考書にもググっても全く見つからなかったので不安が解消できました。

278:274
07/10/04 23:39:49
>>277 は名前ミス。失礼。

279:デフォルトの名無しさん
07/10/05 07:21:23
質問です。

pure virtual な関数て、基底クラスで

class ClassA
{
public:
virtual void Test(void) = 0;
};

こんな感じに定義するのは普通なのですが、さっき間違って

class ClassA
{
public:
virtual void Test(void) = 0
{
}
};

と、中身を定義したら、コンパイルが通りました。気になったので、派生させてみて、
派生先の Test 関数で、ClassA::Test を呼んだら、呼べました。

pure virtual な関数は、実体を作れないと思いこんでいたのですが、それは間違いなのでしょうか?

vc++8.0 sp1
xp sp2

280:デフォルトの名無しさん
07/10/05 07:49:32
>>279
それは間違いです。

でもその書き方ってできないんじゃなかったっけ。
class ClassA{
public: virtual void Test(void) = 0;
};
void ClassA::Test(void) { }
って書く必要があったような・・・
記憶違いかね。

281:デフォルトの名無しさん
07/10/05 12:29:52
>>280
VC++はそういう書き方ができるんじゃなかったか。
pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか
お節介だったと思うが。


282:デフォルトの名無しさん
07/10/05 21:29:19
まあ勘違いしやすい所だよな
×pure virtual な関数は、実体を作れない
○pure virtual な関数を持つクラスは、実体を作れない

283:デフォルトの名無しさん
07/10/05 22:32:31
printf 系で "%10s" と指定している箇所が全て 12 に変更されることになって
数値を定数化してフォーマットに埋め込めないものかと思っているんですが、
#define した定数がそのまま表示されたりと期待した動作が得られません。

どなたか知恵を貸して頂けませんか。
(そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)

284:デフォルトの名無しさん
07/10/05 22:35:09
#define FMT "%12s"

printf(FMT,"hogehoge");

じゃダメなの?

285:デフォルトの名無しさん
07/10/05 22:39:10
こんな書き方も出来るかもー!!
printf("%*s", 10, "hogehoge");
printf("%*s", 12, "hogehoge");


286:デフォルトの名無しさん
07/10/05 22:40:16
#define FMT "12"
printf("%" FMT "s", "hogehoge");

とか

287:デフォルトの名無しさん
07/10/05 22:47:38
std::mapでキーワードを予め指定しておいた予約語以外は受け付けないように出来ますか?


"hoge""hage""hoji""haji" // 何らかの方法で指定した予約語

std::map<std::string , std::string> strmap

strmap["hoge"] = "これは成功する";

strmap["miss"] = "これは失敗する";


こんな感じで

288:デフォルトの名無しさん
07/10/05 22:49:15
C++で下みたいな方法ってよろしくないですかね・・・
配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが
要素毎にコンストラクタ呼び出しは冗長になるので
問題点が判らないので指摘をお願いします

#include <stdio.h>

float data[] = {1., 2., 3., 4., 5., 6.};

class Data
{
public: // use default ctor
 float x, y, z;
 Data& operator+=(const Data &right)
....省略...
};

int
main()
{
 Data *ptr;

 ptr = reinterpret_cast<Data*>(data);

 printf("%f %f %f\n", ptr[0].x, ptr[0].y, ptr[0].z);
 printf("%f %f %f\n", ptr[1].x, ptr[1].y, ptr[1].z);

 return 0;
}


289:デフォルトの名無しさん
07/10/05 22:53:53
>>287
勝手に追加されちゃうから無理じゃね?

std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない

290:デフォルトの名無しさん
07/10/05 23:00:43
>>289
stringの方をラッピングするのもアリじゃね?
書く量としてはその方が少なくなりそう。

291:デフォルトの名無しさん
07/10/05 23:00:58
>>289
そうですか、残念
ありがとうございました

292:デフォルトの名無しさん
07/10/05 23:15:10
>>288
>コンストラクタ呼び出しは冗長
といってもinlineであれば実質気にするほど変わらない気がする。

Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は?
virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。

293:デフォルトの名無しさん
07/10/05 23:36:17
assert(sizeof(Data) == sizeof(float[3])); を書いとくとか

294:デフォルトの名無しさん
07/10/05 23:43:21
>>292,293
Thx
対象がRAWなベタデータなので簡素に出来ないかと思ったのですが
素直な書き方をした方がよさげですね



295:デフォルトの名無しさん
07/10/06 03:46:16
>>284-286
フォーマットって普通に文字列なんだな。
>>285の方法は知らなかった。参考にさせて貰います。
色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。

296:デフォルトの名無しさん
07/10/06 03:51:51
>>288
× オーバーライド
○ オーバーロード

297:デフォルトの名無しさん
07/10/06 16:19:13
wcout はバグがありますか?
wcout を使うのは避けてますか?

WindowsXP Home + BCC

298:デフォルトの名無しさん
07/10/06 17:10:25
char *hogehoge(){
return "hogehoge";
}

文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?

299:デフォルトの名無しさん
07/10/06 17:11:10
有効なままです

300:デフォルトの名無しさん
07/10/06 17:11:56
リテラル返すならconst char*にした方がいいかも

301:デフォルトの名無しさん
07/10/06 18:41:45
inline const char *&

302:デフォルトの名無しさん
07/10/06 18:45:41
&はイラネーだろ
なんか違うのか?

303:デフォルトの名無しさん
07/10/06 18:47:11
inline const const char *&

304:デフォルトの名無しさん
07/10/06 18:52:50
C++超初心者です。
今まで動いていたのに、今日コンパイルすると、
(1029) invalid format string conversion
と表示されてしまいます。

原因が分からず、どのように変えたらよいのかも分かりません。
ご教授宜しくお願いいたします。
すごく長いプログラムなので、関係してそうなところだけ書き込んでます。


FILE *ottq;
ottq = fopen("ottq.dat", "w");
double chir,l
l=20.05e-3;
chir=0.0e-5;
fprintf(ottq, "l(m)=\t%le\t\n",l);
fprintf(ottq, "chir(%)=\t%le\t\n",chir*100.0);  ←1029行目ここです。
fclose(ottq);

305:デフォルトの名無しさん
07/10/06 18:54:02
%→%%

306:デフォルトの名無しさん
07/10/06 18:54:48
>>304
エラーメッセージのまんまだろ。

307:デフォルトの名無しさん
07/10/06 19:02:37
こえぇ
お前みたいなのが扱うもんじゃねぇだろ

308:デフォルトの名無しさん
07/10/06 19:09:25
変数名きめぇwwwww


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