【初心者歓迎】C/C++室 Ver.43【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/09/27(木) 11:39:04ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/09/27(木) 12:05:39,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'″ `'―、,,,,/
0003デフォルトの名無しさん
2007/09/27(木) 13:00:37>>999
'CFuncHolder::SetFunc' : 1 番目の引数を 'boost::_bi::bind_t<R,F,L>' から 'void (__cdecl *)(char *)' に変換できません。
って怒られました。
0004他板37
2007/09/27(木) 13:03:35↓の掲示板に書いてしまって、こちらの掲示板の皆様には申し訳ないのですが・・・。
http://pc11.2ch.net/tech/index.html#10
37なんですけど、継承方法がわからず困っています。
なんとなく、このままスルーされそうなので焦っています。
0005デフォルトの名無しさん
2007/09/27(木) 13:14:25とりあえずこんな感じにすると動いた
#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");
}
00065
2007/09/27(木) 13:15:03typo typo
0007デフォルトの名無しさん
2007/09/27(木) 13:20:30void SetFunc(boost::function1<void, char*> func){m_func = func;}
0008デフォルトの名無しさん
2007/09/27(木) 15:58:29CStringListみたいなやつで
0009デフォルトの名無しさん
2007/09/27(木) 16:03:280010デフォルトの名無しさん
2007/09/27(木) 16:18:110011デフォルトの名無しさん
2007/09/27(木) 16:52:33誰か噛み砕いて教えてくれないだろうか。
boost::bind(&Cfunc::func, &cf, _1)
0012デフォルトの名無しさん
2007/09/27(木) 17:04:050013デフォルトの名無しさん
2007/09/27(木) 17:20:350014デフォルトの名無しさん
2007/09/27(木) 17:29:12で、boost::bindはなにやら拘束とかいうのをして2引数の関数を1引数の関数として扱える?のだとかなんとか・・・
>>5でいうところの、
普通のグローバル関数g_funcへのポインタというかアドレスはg_funcで、
メンバ関数CFunc::funcのアドレスは&Cfunc::func?
でもそれだけだとどのインスタンスのfuncかわからんから、
Cfunc cfっていうインスタンスの情報もどうにか渡す必要があるってのはわかる。
が、それらを拘束するっていうのの意味が分からない。拘束ってなんですか?
リファレンスの日本語訳読んでも全然分からない・・・
0015デフォルトの名無しさん
2007/09/27(木) 17:46:30まず概念を理解せんことにはな。
Haskellあたりで勉強してきたら?
0016デフォルトの名無しさん
2007/09/27(木) 18:06:02STL の bind1st と bind2nd を調べてくればわかるんじゃない
0017デフォルトの名無しさん
2007/09/27(木) 18:11:30なにかしら定数として固定して、引数が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);
}
0018デフォルトの名無しさん
2007/09/27(木) 18:12:54拘束じゃなくて束縛だと思うが
関数型言語の束縛とも意味が違うので紛らわしい
どっちかっつーと「部分適用」だわな
001917
2007/09/27(木) 18:57:49そういう場合の決まった書き方ってことでとりあえず解決した。
0020デフォルトの名無しさん
2007/09/27(木) 19:52:13でスレッドを生成し、そのスレッドが無限ループしている場合、
プログラム終了時にそのスレッドも終了してくれるのでしょうか?
0021デフォルトの名無しさん
2007/09/27(木) 20:03:000022デフォルトの名無しさん
2007/09/27(木) 20:10:520023デフォルトの名無しさん
2007/09/27(木) 20:11:340024デフォルトの名無しさん
2007/09/27(木) 20:29:24char *buf = new char[1024];
}
上のコードでbufはプログラム終了時に解放されますってのと同レベルだな
0025デフォルトの名無しさん
2007/09/27(木) 20:54:17「破壊される」?
まぁ言葉遊びか
0026デフォルトの名無しさん
2007/09/28(金) 12:04:40何か違いがあるのでしょうか?
メリット、デメリットを教えてください
0027デフォルトの名無しさん
2007/09/28(金) 12:06:470028デフォルトの名無しさん
2007/09/28(金) 12:10:26structはデフォルトでpublic
class A : X { // <-- private 継承
int x; // <-- private メンバ
};
struct B : Y { // <-- public 継承
int x; // <-- public メンバ
};
それだけ
0029デフォルトの名無しさん
2007/09/28(金) 12:12:40C++においては特に無いんじゃね?
メンバ関数を持たずある用途のためにまとめた”変数のセット”
って言う意味を強調したいときに
俺はあえてstructを使うけど。
0030デフォルトの名無しさん
2007/09/28(金) 12:35:52ありがとうごさいました
0031デフォルトの名無しさん
2007/09/28(金) 14:16:18boost::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へ続く。
0032デフォルトの名無しさん
2007/09/28(金) 14:34:34switch( str )
{
case "あいうえお"
funcA();
break;
case "かきこくけこ"
funcB();
break;
(同様に続く・・・)
}
のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?
if文でゴリゴリ書くしかない?
0033デフォルトの名無しさん
2007/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への参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能
0034デフォルトの名無しさん
2007/09/28(金) 15:40:21ありがとうございました
0035デフォルトの名無しさん
2007/09/28(金) 16:53:01std::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を使う方法、もしくはそれに似たような方法はあるのでしょうか。
0036デフォルトの名無しさん
2007/09/28(金) 17:00:48typedef std::istreambuf_iterator<char> isb_it;
str.assign(isb_it(ifs), isb_it());
0037デフォルトの名無しさん
2007/09/28(金) 17:20:140038デフォルトの名無しさん
2007/09/28(金) 17:26:59> 2.
大体皆そういうコードを書く
> 3.
stringstreamを使えばよい
0039デフォルトの名無しさん
2007/09/28(金) 17:27:12どうも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を取得出来ました。(http://....../foo.xml)
ローカルにあるXMLファイルを読み込むには何か特殊な事をしなければいけないのでしょうか?
環境はWinXPでVisual Studio 2005 Pro Editionです。
004035
2007/09/28(金) 17:32:10ありがとうございます、助かりました
0041デフォルトの名無しさん
2007/09/28(金) 18:05:322.についてだが、普通はこう書く。
std::string line;
while (std::getline(ifs, line)) {
:
}
しかし、>>35のコードでは結局行読みすることに何の意味もないコードに
なっている。
そもそもそういう場合はstd::getline()を使うべきではないだろう。
0042デフォルトの名無しさん
2007/09/28(金) 18:07:12load()でローカルファイルを普通によめたと思うが。
MSXMLのバージョンにもよるのかも知れんが。
それとそのパスはなにやら胡散臭いな。
argvでも渡して、カレントのパスや相対パス、絶対パス、漢字を含むもの
含まないもの、色々実験汁。
0043デフォルトの名無しさん
2007/09/28(金) 18:09:05あんな分かりにくいもん C++の難しさよりも
ライブラリ覚えるだけで大変そう
0044デフォルトの名無しさん
2007/09/28(金) 18:13:44"C:\\foo.xml"で試してみましたが無理でした。
SetCurrentDirectory()でxmlのあるディレクトリに移動して相対パスでの指定も試してみました。
バージョンによる違いも一応調べてみます。
0045デフォルトの名無しさん
2007/09/28(金) 18:19:26あんなに膨大にあるAPIを全部暗記してる奴はいないだろう
関数の名前覚えてたって、引数の並び順だの何だの覚えきれねえよ
それに良く使いまわす処理は俺ライブラリ化するなりコピペするなり
いちいち一から書かんだろ
0046デフォルトの名無しさん
2007/09/28(金) 18:19:580047デフォルトの名無しさん
2007/09/28(金) 18:22:42今はほとんどどの世界に行っても、言語仕様よりライブラリ覚える方が大変だよ
0048デフォルトの名無しさん
2007/09/28(金) 18:25:17file://の書き方は
file:///C:/foo.xmlであってるでしょうか?あまり詳しくないもので・・・。
フォルダのアドレスバーにfile://と入力して出てきたやつをそのまま使ってみました。
でも、やはりロードで失敗してしまいます。xmlファイル自体に問題があるか、MSXMLのバージョンの問題なのか・・・
0049デフォルトの名無しさん
2007/09/28(金) 18:26:47ファイルに問題があるかどうか切り分けたければ、URL越しでロードできた
ファイルをローカルに落として試せばいいだろ。
0050デフォルトの名無しさん
2007/09/28(金) 18:33:30Webからxmlファイル落としてローカルで試したところloadすることが出来ました。
どうやら自分のxmlファイルに問題があったようです。
xmlファイルの中身を見比べてみて原因を探ってみます。
0051デフォルトの名無しさん
2007/09/28(金) 18:33:49オープン系はそうですね
組み込みはそうでもなくて、純粋にC++に集中できそう
0052デフォルトの名無しさん
2007/09/28(金) 18:34:53SHCreateStreamOnFileでも使ってストリーム化したらどうだろう?
0053デフォルトの名無しさん
2007/09/28(金) 18:35:42自作のxmlはShift_JISで、正常に読み込める方のxmlはUTF-8で保存されたものでした。
なんでShift_JISでダメなのかはよく分かりませんが、とりあえずUTF-8で書くことでやっていきたいと思います。
ありがとうございました。
0054デフォルトの名無しさん
2007/09/28(金) 18:38:16Shift_JISは受け付けてくれると思う、MSXMLなら。
0055デフォルトの名無しさん
2007/09/28(金) 18:39:41既にC/C++の話題でも何でもないが
XMLファイルで↓のようにちゃんとエンコーディングは指定してるか?
<?xml version="1.0" encoding="Shift_JIS"?>
0056デフォルトの名無しさん
2007/09/28(金) 18:42:11XMLなんて言葉しか知らん
0057デフォルトの名無しさん
2007/09/28(金) 18:50:03HRESULTの判定をしてないのがいかんのだな。
その辺が出来ないなら raw_interfaces_onlyは使うなよ。
0058デフォルトの名無しさん
2007/09/28(金) 19:17:04対象のXMLファイルにはちゃんと
<?xml version="1.0" encoding="Shitf_JIS" ?>
と先頭に記述はしていました。ますます分からないですけど、
もしかしたら俺の環境がどこか特殊なのかもしれないので(または全然関係ないところのエラー)、
あまり悩まれない方がいいかもしれませんw
0059デフォルトの名無しさん
2007/09/28(金) 19:43:41MSXMLがちゃんとエラーメッセージが返してるからそれみりゃわかるって。
エラーメッセージの取り出し方わかってる?
0060デフォルトの名無しさん
2007/09/28(金) 19:50:46Shitf_JIS
しとふ・じす
0061デフォルトの名無しさん
2007/09/28(金) 20:01:36天才じゃね?
0062デフォルトの名無しさん
2007/09/28(金) 20:27:36こういう使い方は良くないと聞きました
どうしてですか?
だとしたら自分を壊して壁を壊すような処理はどこに書けばいいんですか?
よくわからなくなったので教えて下さい
0063デフォルトの名無しさん
2007/09/28(金) 21:07:08通報しますた
0064デフォルトの名無しさん
2007/09/28(金) 21:26:46ゲームのアイテムの話ですよ?
0065デフォルトの名無しさん
2007/09/28(金) 21:44:40理由:クラスの柔軟性が損なわれる
「インスタンスの破壊時に必ず呼ばれる」
→爆発させずに爆弾を消去するときも破壊判定させる気?
「デストラクタは引数とれない」
→わざわざ破壊対象の壁の情報を他のクラスに問い合わせるわけ?
それなら自分が爆発(explodeメソッド)するって情報だけ他のクラスに送って
それ以外の処理は他に任せるようにした方が責任の所在が明確になって
まだ良い設計になると思わない?
俺が思いつくのはとりあえずこんな所
0066682
2007/09/29(土) 00:47:46002.ppm
・
・
xyz.ppm
という内容のファイルリストからgetlineで画像名を読み込み、
それぞれの画像のカラーヒストグラムを書き出していくという
プログラムを作成しています。
一度に処理する画像枚数が約200枚までならば正常に動作するのですが、
一度に処理する画像が300枚前後になると、OSが急に固まりコンソールに
強制終了と表示されて、プログラムが終了してしまいます。
以下、メインのソースの一部
ifstream filelist
While(!filelist.getline(filename, sizeof(filename)).eof()) {
Image24 test_image;
ここらへんで様々な処理
}
この例の場合、ループでtest_imageが宣言される度に
デストラクタは呼び出されるのでしょうか?(デストラクタでメモリを解放する処理は書いてます)
長文ですがよろしくお願いします。
0067デフォルトの名無しさん
2007/09/29(土) 00:54:53デストラクタは呼ばれます。
実験してみりゃ一発なのに・・・
0068デフォルトの名無しさん
2007/09/29(土) 01:18:09とりあえずアップしてるソースの範囲は問題なし。
デストラクタの開放処理に漏れや誤りがあるか、
「ここらへんで様々な処理」 に問題があると思う。
LoadImageしてDeleteObjectしてないとか、LD_SHAREDしてるとか。
0070デフォルトの名無しさん
2007/09/29(土) 02:26:260071デフォルトの名無しさん
2007/09/29(土) 02:33:56C++なら(関数ではないが)std::ostringstream. boost::lexical_cast
0072デフォルトの名無しさん
2007/09/29(土) 02:41:400073デフォルトの名無しさん
2007/09/29(土) 20:18:04{
funcA();
funcB();
}
のようにstd::stringを拡張してstd::stringの機能をそのままに
文字列操作を行う関数を新たに追加したクラスを作りました
string_ex ex;
std::string str;
ex = str;
という操作を期待したのですがコンパイルエラーが出てしまいます
何か良い方法はありませんか?
0074デフォルトの名無しさん
2007/09/29(土) 20:51:030075デフォルトの名無しさん
2007/09/29(土) 20:55:57やめといた方がいいんじゃね
デストラクタも仮想じゃないし
0076デフォルトの名無しさん
2007/09/29(土) 21:06:33ありがとうございます
そうですか、スッキリして良いと思ったのですが残念です
0077デフォルトの名無しさん
2007/09/29(土) 21:08:52ただし、>>75の指摘通り使用に際しては注意が必要。
0078デフォルトの名無しさん
2007/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のカオスさ加減をどうにかしたい気持はわからんでもないけど
0079デフォルトの名無しさん
2007/09/29(土) 21:32:11無理にメンバ関数にしないでフリーの文字操作関数にします
いろいろとありがとうございました
0080デフォルトの名無しさん
2007/09/29(土) 21:57:56コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。
でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。
0081デフォルトの名無しさん
2007/09/29(土) 22:21:44仮想デストラクタを持たないstringやコンテナなどから
派生クラスを作る誘惑に負けるな by スコット・メイヤーズ
0082デフォルトの名無しさん
2007/09/30(日) 08:03:16main()
{
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);}
これでものすごい勢いでコンパイラエラー吐かれます><
初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない
のでどこがおかしか教えてくださるとうれしいです
0083デフォルトの名無しさん
2007/09/30(日) 08:06:56+-/*という数値でないものを入力しようと言うのに
intという数値を扱う型で読み込もうとしているのがいけない。
bはchar型にし、%cで読み込めばいい。
そして、if (b == '/') {のようにする。
0084デフォルトの名無しさん
2007/09/30(日) 08:08:30intは数値だったんですか;
いろいろがんばってみます
0085デフォルトの名無しさん
2007/09/30(日) 08:11:390086デフォルトの名無しさん
2007/09/30(日) 10:06:21・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。
・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。
・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。
0087デフォルトの名無しさん
2007/09/30(日) 10:43:220088デフォルトの名無しさん
2007/09/30(日) 11:42:09みたいに前にアンダーバーを1つ2つ付けるのは
予約キーワードと衝突するおそれがあるので避けるべきらしいですが、
typeof_, typeof__
みたいに後ろに付けるならおkでしょうか?
0089デフォルトの名無しさん
2007/09/30(日) 12:23:070090デフォルトの名無しさん
2007/09/30(日) 12:49:51template<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>{};
としてもやはりダメでした。
0091(90)
2007/09/30(日) 12:50:520092(90)
2007/09/30(日) 13:03:41template<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の特殊化を狙っても
「テンプレート引数の数が少なすぎます」とダメでした。
0093デフォルトの名無しさん
2007/09/30(日) 13:04:35ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、
インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか?
ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。
他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。
ちなみにヘッダファイルの移動はないことを前提としています。
0094デフォルトの名無しさん
2007/09/30(日) 13:04:48(処理)
return 0;
}
何で0を返すんですか?
1ではダメなのですか?
0095デフォルトの名無しさん
2007/09/30(日) 13:20:19いいよ〜
終了コードの使い方は処理系依存だけど、一般的には
0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。
0096デフォルトの名無しさん
2007/09/30(日) 13:25:37gcc 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();
}
0097デフォルトの名無しさん
2007/09/30(日) 13:48:55適材適所。
そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。
そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して
残りはファイル名で記述すればいいだろう。
例えば、こんな感じ。
--
/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を追加。
0098デフォルトの名無しさん
2007/09/30(日) 14:07:02コンパイラは何を使っている。
また、そもそも何をしたい?それ次第では別の手段があるかもしれない。
0099デフォルトの名無しさん
2007/09/30(日) 14:16:00#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;
}
0100デフォルトの名無しさん
2007/09/30(日) 14:18:29コンパイラさえ問題なく、しかもrがvoid型なら、
<t, void (t::*)(arg)>なんて特殊化は
不要だと思ったのだが違うのか?
0101デフォルトの名無しさん
2007/09/30(日) 14:20:32インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。
インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。
行儀のいいやりかたは、>>97のように、インクルードパス直下にヘッダを
置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に
ヘッダを入れることだ。
そうすることで、汚染する名前をディレクトリ名だけに限定でき、
名前の衝突を回避しやすくなる。
勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる
というメリットもある。
0102デフォルトの名無しさん
2007/09/30(日) 14:28:50外部公開するヘッダとプライベートなヘッダを分けられてうれしい
0103デフォルトの名無しさん
2007/09/30(日) 14:32:36それと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();
}
0104デフォルトの名無しさん
2007/09/30(日) 14:34:33仕事では出会いたくないタイプのコードだな……
だからC++は(ry
0105デフォルトの名無しさん
2007/09/30(日) 14:34:450106デフォルトの名無しさん
2007/09/30(日) 14:39:40バグったりするともうお手上げ
0107デフォルトの名無しさん
2007/09/30(日) 14:45:56そこから新しい使い方を発見できる程になりたひ
0108デフォルトの名無しさん
2007/09/30(日) 17:23:09>>101
レスありがとうございます。
自分も正直ごちゃごちゃしたインクルードパスを書くよりは
プロジェクトのルートパスを一つ指定するような書き方が望ましいと思っているので、
その方向で調整して行きたいと思います。
ただ、好みの問題程度にあしらわれないか不安ではありますが。
0109(90)
2007/09/30(日) 17:29:01メンバ関数を特殊化で返り値、クラス、引数をそれぞれ特殊化した後に
内部に作っておいたクラスを使い間接的に返り値を特殊化したらコンパイルが可能になり解決しました。
0110デフォルトの名無しさん
2007/09/30(日) 17:40:52int Func(int a=NULL);
string Func(string a="");
こんな感じで引数が無い場合に戻り値の型によって
関数がオーバーロードされるのを期待してみましたが
コンパイルエラーが出てしまいました
このような場合関数名を変えるしか無いのでしょうか?
0111デフォルトの名無しさん
2007/09/30(日) 17:45:01戻り値の型でオーバーロードはできません。
ポインタじゃないものに NULL を使っちゃだめです。
0112デフォルトの名無しさん
2007/09/30(日) 17:54:37ありがとうございます
0114デフォルトの名無しさん
2007/10/01(月) 02:02:40int y = 1406;
double z = y/x;
でzが0になってしまうのですが、
これを0.28....
とやるにはどうすれば良いのでしょうか?
0115デフォルトの名無しさん
2007/10/01(月) 02:04:230116デフォルトの名無しさん
2007/10/01(月) 02:47:24ところで、double>intなのに
なんで代入変換されないのでしょうか?
0117デフォルトの名無しさん
2007/10/01(月) 02:51:35int/intなので結果はint、この時点で結果が0になる。
int型の0をdouble型に代入しても当然0になる。
(double)y/xとすることで、yがdoubleになりこの式の結果もdoubleになる。
0118デフォルトの名無しさん
2007/10/01(月) 02:51:59それをdoubleに変換したところで、0.0になるだけさ。
0119デフォルトの名無しさん
2007/10/01(月) 02:55:020120デフォルトの名無しさん
2007/10/01(月) 03:47:41= よりも / の方が優先順位が高い
0121デフォルトの名無しさん
2007/10/01(月) 03:54:49(z=y)/x は欲しい結果じゃないだろ?除算結果捨ててるしなw
0122デフォルトの名無しさん
2007/10/01(月) 12:09:57その際に入力用と出力用と2種類作った方が良いのでしょうか?
class Choge
{
private:
std::string memo_;
public:
std::string memo(const std::string& data = "")
{ return (data.empty() ? memo_ : memo_ = data); }
}
上のように入出力をまとめちゃった方がスッキリしそうな気がするのですが
少しトリッキーなようで、こんな事をしても良いのか迷ってます
0123デフォルトの名無しさん
2007/10/01(月) 12:12:09そのメンバを空にしたいときにはどうするんだ?
そんな癖のある仕様にするくらいなら、別々に作った方がいいことは自明だ。
0124デフォルトの名無しさん
2007/10/01(月) 12:25:17そもそも、メンバを参照するだけのmemo()がconstメンバ関数じゃないから使い難い。
設定用に非constメンバ関数、取得用にconstメンバ関数を用意するなら、最初から別々に作ればいい。
# 例えば、void func(Choge const & hoge)なんて関数からhoge.memo()を呼べないのは面倒だぞ。
0125デフォルトの名無しさん
2007/10/01(月) 12:54:48なるほど。
やっぱり別々にすべきですね。
ありがとうございました。
0126デフォルトの名無しさん
2007/10/02(火) 07:37:48ff5a_analyzer のソースコードです。まだ未完成です。文字コードは EUC-JP、改行コードは LR となっています。
とあるのですが
ttp://x11.s11.xrea.com/ff5a_analyzer_src.zip
このソースのコンパイルの仕方はどうやるのでしょうか
OSはXPです
0127デフォルトの名無しさん
2007/10/02(火) 07:38:20Linux(Turnolinux Fuji)でsys/systeminfo.hを
includeしてSI_HOSTNAMEを使用したい< sysinfo(SI_HOSTNAME〜を対処したい >のですが、
コンパイル時にsys/systeminfo.hがないとエラーが出力されてしまいます。
どうすればよいのでしょうか?ご教授ください。
0128デフォルトの名無しさん
2007/10/02(火) 07:44:190129デフォルトの名無しさん
2007/10/02(火) 07:44:46ちゃんとmakefileまでついてるじゃないか
gccみたいだけど別にほかのコンパイラでも大丈夫だろ
0130デフォルトの名無しさん
2007/10/02(火) 07:46:26cygwinを入れて、makeではどうでしょう。
>>127
systeminfo.hを探してみたらどうでしょう。
0131デフォルトの名無しさん
2007/10/02(火) 08:12:04>>130
ありがとうございます
がんばってみます
0132デフォルトの名無しさん
2007/10/02(火) 12:48:32INT_MIN〜INT_MAXの範囲を超える整数の計算をしたいんですけど
どうしたらよいのでしょうか?
0133デフォルトの名無しさん
2007/10/02(火) 13:02:56http://search.vector.co.jp/search?query=%91%BD%94%7B%92%B7+%83%89%83C%83u%83%89%83%8A&x=14&y=14
0134デフォルトの名無しさん
2007/10/02(火) 13:03:45intよりも大きい値を扱える型を使いなさい。
0135デフォルトの名無しさん
2007/10/02(火) 13:34:03>>133
多倍長っていうんですね。
ググってみます。なるべく自作したいので。
>>134
ちょっと思いつかないんですが、例えばどんな型がありますか?
符号付の値が扱えるのがいいです。
こちらの環境はVC6です。
0136デフォルトの名無しさん
2007/10/02(火) 13:41:24大きく超えないのなら vc6 なら __int64 が使えないこともない。
(なんか加算でバグった経験あって個人的には嫌だけど)
0137デフォルトの名無しさん
2007/10/02(火) 13:43:20C99ならlong longも使えるし、そうでなくてもint64_tなどの型があるかもしれない。
それに、doubleでもlong doubleでもいいかもしれない。
要は、INT_MAXを超えると言われても大きさも必要精度も判らなければなんともしようがない。
0138デフォルトの名無しさん
2007/10/02(火) 15:38:16Windowsだと__int64 / unsigned __int64
0139132
2007/10/02(火) 16:13:46そういえばそんなものがありましたね。試してみます。どうもです。
(バグってどんなバグだろう)
>>137
VC6なのでC99なんて対応してません。
精度は64ビットも要らないけど32ビットじゃ足りません。
__int64で試してみます。
0141デフォルトの名無しさん
2007/10/02(火) 16:23:3332<必要ビット数<64なら、doubleが丁度手頃じゃないか。
非標準の型を使わなくて済むし。
0142デフォルトの名無しさん
2007/10/02(火) 16:31:10後でヘッダファイル見て理解しやすいようにしてるだけ?
ヘッダに実装部も含めてclassを記述しちゃった方が楽だと思うのですが
0143デフォルトの名無しさん
2007/10/02(火) 16:34:35実際私も、クラスの実装はインクルードファイルに書くことが多くなっています。
0144デフォルトの名無しさん
2007/10/02(火) 16:46:54何か問題はないのでしょうか?
0145デフォルトの名無しさん
2007/10/02(火) 16:58:170146デフォルトの名無しさん
2007/10/02(火) 17:03:120147デフォルトの名無しさん
2007/10/02(火) 17:05:190148デフォルトの名無しさん
2007/10/02(火) 17:12:10やってみて問題なければいいんじゃない
0149デフォルトの名無しさん
2007/10/02(火) 17:13:53まぁマシン速くなったから、それもいいんじゃない?
0150デフォルトの名無しさん
2007/10/02(火) 17:17:49ありがとうございます
>分割コンパイル
そういう意味もあるんですね
0151デフォルトの名無しさん
2007/10/02(火) 17:18:11そうゆうのはインライン何とかの範囲だからいいと思う
0152デフォルトの名無しさん
2007/10/02(火) 17:22:430153デフォルトの名無しさん
2007/10/02(火) 17:26:40ついでに言えば、テンプレートクラスだとどうせ実装はインクルードファイルに書かないといけなくなるわけで。
0154デフォルトの名無しさん
2007/10/02(火) 18:38:32下記のコードで処理がどのような順番で行われるのか教えてください。
よろしくお願いします。
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);
}
0155デフォルトの名無しさん
2007/10/02(火) 18:42:26ざっくり言うと、widthを4で割った回数だけループする作りになっている。
実際には、4で割った余りも処理しないといけないのでその分を最初の
switchからのcaseへの飛び込みで賄っている。
つまり、その例では15でスタートするから初回はcase 3に飛び込むわけだ。
0156デフォルトの名無しさん
2007/10/02(火) 18:45:000157154
2007/10/02(火) 18:51:37どうもありがとうございます。
初回に case 3 に飛び込むのは理解しました。
2回目以降はどうして case 0 〜 case 1 まですべての処理を通るのでしょうか。
すいませんが、もう少し詳しく解説してください。
>> 156
printf を挟んで動作は確認しました。
ただ、どうして >> 155 さんのような挙動になるのか理解できません。
0158デフォルトの名無しさん
2007/10/02(火) 18:54:160159デフォルトの名無しさん
2007/10/02(火) 18:57:260160デフォルトの名無しさん
2007/10/02(火) 18:58:110161デフォルトの名無しさん
2007/10/02(火) 19:02:16caseの後には必ずbreak付けろ
使わなくてもdefaultは書け
caseはswitchスコープの直下に置け、ループの途中に挟むなんて言語道断
以上
0162155
2007/10/02(火) 19:08:41ヒントを一つ。caseラベルはswitch以外からは只のラベルにしか見えない。
つまり、switchから飛び込んだ後は存在しないも同然。
各caseラベルを渡り歩く理由については>159にも書かれている通り、breakしないとスルーするわけだ。
0163デフォルトの名無しさん
2007/10/02(火) 19:12:30カオリ、165cm、24歳、年収500万
サキ、150cm、21歳、年収1000万
タカシ、180cm、18歳、年収200万
グレイ、100cm、120歳、年収0etc
というデータがあってa*身長+b*年齢+c*年収の値が一番大きい順にソートしたとき
最もあいうえお順に近い並び方になるa,b,cの値を探すプログラムを書きたいのだが
如何組めばいいか見当がつきません。
教えてください。
0164デフォルトの名無しさん
2007/10/02(火) 19:15:26ところであいうえお順に対する近さって何?
0165154
2007/10/02(火) 19:20:26それは理解してます。
>>160
ありがとう。色々調べてほぼ理解できました。
>>161
自分で書く場合はそうしています。
なので、逆に今回のコードが理解できませんでした。
>>162
最初の case 0: do { ...; case 1: ... の時点で理解不能でした。
switchが単なるcaseラベルへのジャンプだと理解すれば
それ以降は do{ } while() だけに注目すればよく、その中ではcaseラベルに意味はないのですね。
0166デフォルトの名無しさん
2007/10/02(火) 19:21:51○××○○
3/5=60%
という感じでこの値を100に近づけたいんです。
パラメータの全通りとはどのような感じですか?
0167デフォルトの名無しさん
2007/10/02(火) 19:22:070168デフォルトの名無しさん
2007/10/02(火) 19:23:45なんで「う」が×なんだ?
0169デフォルトの名無しさん
2007/10/02(火) 19:24:51Nx3行列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
0170デフォルトの名無しさん
2007/10/02(火) 19:27:48http://ja.wikipedia.org/wiki/Duff's_device
嫁
0172デフォルトの名無しさん
2007/10/02(火) 19:34:26「あ」「う」「か」「え」「お」のソートに何で「い」が出てくるんだ?
じゃあデータが「さ」「し」「す」「せ」「そ」ならこうなるのか?
さ し す せ そ
×(本来あ) ×(本来い) ×(本来う) ×(本来え) ×(本来お)
0%
変なの
0174172
2007/10/02(火) 19:37:07なんか致命的な勘違いをしてる予感がしたから聞いてみたんだがもう見てないかな
0175169
2007/10/02(火) 19:38:07>>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
にしないといけない
0177デフォルトの名無しさん
2007/10/02(火) 21:18:47そこで「あいうえお」を例にするから悪いわけじゃね?
普通の人が聞けば「あ」はあるかも知れんが「い」はないかもしれないと思う。
0178デフォルトの名無しさん
2007/10/02(火) 21:51:19そういう定義ならそれでいいけど目的としてはそれで大丈夫なの?
0180デフォルトの名無しさん
2007/10/02(火) 22:21:34char* a = new char[5];
char b[5];
sizeof(a) は4(ポインタのサイズ) sizeof(b)は5になるのですが...
お願いします
0181デフォルトの名無しさん
2007/10/02(火) 22:23:10効率よくやるのは結構ムズい気がする。
あいうえお順に近い並び方から順に、解があるかどうかを
1つずつ調べていくプログラムが作るの楽なんじゃないかなぁ。
0182デフォルトの名無しさん
2007/10/02(火) 22:30:25char a[] = new char[5];
にすればおk
0183デフォルトの名無しさん
2007/10/02(火) 22:32:270184デフォルトの名無しさん
2007/10/02(火) 22:33:54C++ならvectorでもつかっておけば?
風邪なのに2chやってると判断力が鈍るな
0185デフォルトの名無しさん
2007/10/02(火) 22:43:230186デフォルトの名無しさん
2007/10/02(火) 22:48:35char* a = new char[hoge];
でhoge見りゃいいじゃん
0187デフォルトの名無しさん
2007/10/02(火) 22:55:210188デフォルトの名無しさん
2007/10/02(火) 22:57:400189デフォルトの名無しさん
2007/10/02(火) 22:59:250190182
2007/10/02(火) 23:05:56もひとつ関連質問ですが、Cで関数に配列渡す場合同じことが起きるんですが
関数内で渡された配列の要素数が必要な場合、要素数も別に渡さないと
いけないということですか?
void hoge(char a[], int numOfFactor)みたいに
0191デフォルトの名無しさん
2007/10/02(火) 23:10:34ループの終了条件にしか使わないなら番兵置く手もあるけど
0192デフォルトの名無しさん
2007/10/02(火) 23:11:13そうだよ。静的な配列ならsizeofで要素数を取得できるけど、そうでない場合は別に値を管理する必要がある
0193190
2007/10/02(火) 23:14:31要素はfactorじゃなくてelementでした。おまいらサンクス!!
0194デフォルトの名無しさん
2007/10/02(火) 23:23:50という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その他コンテナ一般や配列などを引数に渡せる。
0195デフォルトの名無しさん
2007/10/03(水) 02:17:51LPBYTE lpBuffer = (LPBYTE)malloc(dwSize));
これをNewを使って書き換えるとするとどんな風になりますか?
0196デフォルトの名無しさん
2007/10/03(水) 02:37:030197デフォルトの名無しさん
2007/10/03(水) 04:24:39std::vector<BYTE> buffer(GetFileSize(...));
0198デフォルトの名無しさん
2007/10/03(水) 06:57:09LPBYTE lpBuffer = (LPBYTE)malloc(New));
0199デフォルトの名無しさん
2007/10/03(水) 08:33:47//1 LPBYTE lpBuffer = new BYTE[(dwSize + sizeof(BYTE) - 1) / sizeof(BYTE)];
//2 LPBYTE lpBuffer = (LPBYTE)new char[dwSize]
//3 LPBYTE lpBuffer = new BYTE[dwSize]
0200デフォルトの名無しさん
2007/10/03(水) 09:03:51malloc差し替えなら挙動が同じ(bad_alloc投げずにNULL返す)new(nothrow)最強
0201デフォルトの名無しさん
2007/10/03(水) 09:39:480202デフォルトの名無しさん
2007/10/03(水) 11:11:39調べてみるとメモリマップドファイルがあるのですが、これで実現可能でしょうか?単純な方法がありましたら教えていただきたいです。
また、64ビットプロセスでメモリ確保したものを32ビットプロセスでデータ参照するにはどうすればいいでしょうか?
0203デフォルトの名無しさん
2007/10/03(水) 13:30:07可能。メモリマップドファイル経由。
0204デフォルトの名無しさん
2007/10/03(水) 14:54:08ClassA a;
ClassA b = a;
ClassA c(a);
とした場合
bはメンバ変数が初期化され、
cは未初期化状態になります。
これは言語仕様でしょうか?環境依存でしょうか?
WinXP + Cygwin + gcc3.4.4
0205デフォルトの名無しさん
2007/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
どのへんが未初期化?
0206デフォルトの名無しさん
2007/10/03(水) 16:08:56>ClassA c(a)
これは、どういうことをしてるの?
0207デフォルトの名無しさん
2007/10/03(水) 16:13:350208デフォルトの名無しさん
2007/10/03(水) 16:19:21コピーコンストラクタってどこに宣言・定義されてるの?
#include <iostream> <----ここの中?
0209デフォルトの名無しさん
2007/10/03(水) 16:22:39>コピーコンストラクタってどこに宣言・定義されてるの?
あなたの心の中。
冗談さておき、特に自前で宣言しなかった場合は暗黙のコピーコンストラクタが用意される。
# なーに、メンバを全部(浅い)コピーに出すだけさ。
0210デフォルトの名無しさん
2007/10/03(水) 16:28:28>暗黙のコピーコンストラクタ
ってこうしなさいとC++の仕様で決まってるんの?
0211デフォルトの名無しさん
2007/10/03(水) 16:55:280212デフォルトの名無しさん
2007/10/03(水) 17:46:410213デフォルトの名無しさん
2007/10/03(水) 17:49:460214デフォルトの名無しさん
2007/10/03(水) 17:50:380215デフォルトの名無しさん
2007/10/03(水) 19:47:41すみません、説明不足でした。
> ClassA a;
> a.x = 42;
> ClassA b = a;
> ClassA c(a);
の
> a.x = 42;
を取ると
0
17〜〜〜(-1のunsinged表記?)
のように表示されてます。
両方ともコピーコンストラクタによりインスタンスが生成されていますが
結果が異なっていたため気になった次第です。
0216デフォルトの名無しさん
2007/10/03(水) 19:56:40まともな動作を期待するなよ
0217デフォルトの名無しさん
2007/10/03(水) 20:14:240218デフォルトの名無しさん
2007/10/03(水) 20:52:49printf("%d\n", x);
0219デフォルトの名無しさん
2007/10/03(水) 21:09:32int x;
int y;
x = y;
この場合, x, yは異なる可能性があるの?
0220デフォルトの名無しさん
2007/10/03(水) 21:19:33マジで?
0221デフォルトの名無しさん
2007/10/03(水) 21:20:08ZeroMemoryなどでデータを初期化するのはご法度
と何処かで目にしか記憶があるのですが、同様の理由で構造体に対しても
ZeroMemoryを使うことはあまり好ましくないのでしょうか?
C言語では常套手段だったので。
0222デフォルトの名無しさん
2007/10/03(水) 21:24:57#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を使って書きたいんですがどう書けばいいんでしょうか?
0223デフォルトの名無しさん
2007/10/03(水) 21:25:53ローカル変数として定義したオブジェクトはデフォルト初期化される
組み込み型の場合のデフォルト初期化は不定値
どんな実装でどんな結果になろうが、考えること自体意味がない
0224デフォルトの名無しさん
2007/10/03(水) 21:27:02その構造体・クラスがPODならZeroMemoryしても構わない。
PODになるには色々条件(コンストラクタ・デストラクタ、仮想関数禁止など)があるが、
概ねCでそのまま使えるような単純な構造体なら大丈夫と思っていい。
それでも、ZeroMemoryよりは初期化子などでゼロ初期化を促すほうが一般的だと思うけど。
0226デフォルトの名無しさん
2007/10/03(水) 21:44:150227デフォルトの名無しさん
2007/10/03(水) 21:48:41そういうCと共通のヘッダを使うなんて機会もあるし。
#そういうのはラップしろというのは同意。
0228デフォルトの名無しさん
2007/10/03(水) 21:59:40>>215 の報告を信じるなら、クラスのメンバ変数の場合には異なることが
ありうるってことだねぇ。最適化の関係かな。
0229222
2007/10/03(水) 22:19:01template <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を参考に書いてみましたがまだしっくりきません
というかあきらかに違うような気がします
0230202
2007/10/03(水) 22:46:03ありがとうございます。メモリマップ先をファイルでなくメモリで可能ですよね?ただ、やはりメモリ幅の違いが気になります。実装は困難なのでしょうね・・・
0231デフォルトの名無しさん
2007/10/03(水) 23:17:09reinterpret_castではなく、static_castにすべきだが、ほかは合っている。
0232デフォルトの名無しさん
2007/10/03(水) 23:19:59自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単
#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;
}
0233デフォルトの名無しさん
2007/10/03(水) 23:20:05size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。
32ビットプロセス同士でやるのと同じ。
0234202
2007/10/04(木) 00:24:19ご返信ありがとうございます。
今メモリ共有を行いたいのは、unsigned char型の配列です。
この場合も普通に232さんの教えくださったサンプルで問題ない
という認識でよろしいでしょうか?
0235デフォルトの名無しさん
2007/10/04(木) 00:30:36なぜ、やってみないのでしょうか?
>>232 はただの動作確認のためだけのサンプルです
サンプルで問題がないかどうかは使い方によります
使用しているAPIについて*自分で*調べて下さい
0236202
2007/10/04(木) 00:35:11ご返信ありがとうございます。おっしゃるとおりです。
自分で調べずにすぐに質問してしまいました。
実装にトライします。
ありがとうございました。
0237デフォルトの名無しさん
2007/10/04(木) 01:12:29enable_if 使う初心者w
0238デフォルトの名無しさん
2007/10/04(木) 10:11:510239デフォルトの名無しさん
2007/10/04(木) 10:42:450240デフォルトの名無しさん
2007/10/04(木) 11:02:01標準ライブラリのソース内でしょう。
0241デフォルトの名無しさん
2007/10/04(木) 11:11:59ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?
0242デフォルトの名無しさん
2007/10/04(木) 11:18:39ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。
で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。
0243デフォルトの名無しさん
2007/10/04(木) 11:34:300244デフォルトの名無しさん
2007/10/04(木) 12:10:530245デフォルトの名無しさん
2007/10/04(木) 12:13:19C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。
0246デフォルトの名無しさん
2007/10/04(木) 12:17:38なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?
0247デフォルトの名無しさん
2007/10/04(木) 12:19:34例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?
0248デフォルトの名無しさん
2007/10/04(木) 12:20:31いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし
0249デフォルトの名無しさん
2007/10/04(木) 12:23:16派生クラスで上書きしても呼び出せないのに。
0250デフォルトの名無しさん
2007/10/04(木) 12:25:05プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?
0251デフォルトの名無しさん
2007/10/04(木) 12:25:120252デフォルトの名無しさん
2007/10/04(木) 12:27:47Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。
0253デフォルトの名無しさん
2007/10/04(木) 12:32:52ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。
そんなの俺に聞いてどう答えて欲しいの?
0254デフォルトの名無しさん
2007/10/04(木) 12:39:36派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。
0255デフォルトの名無しさん
2007/10/04(木) 15:37:19>>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()が呼ばれるということで
しょうか?
0256デフォルトの名無しさん
2007/10/04(木) 15:59:230257デフォルトの名無しさん
2007/10/04(木) 16:11:28ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。
0258BOLT
2007/10/04(木) 18:19:42http://ccplus.blog121.fc2.com/ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。
0259デフォルトの名無しさん
2007/10/04(木) 18:22:29誰も見ないしとっとと閉鎖しろよ
0260デフォルトの名無しさん
2007/10/04(木) 18:42:04最低1年くらいは毎週更新できるように努力しる
0261デフォルトの名無しさん
2007/10/04(木) 19:31:140262デフォルトの名無しさん
2007/10/04(木) 19:58:05「"いわゆる全角"のことではないでしょうか」
0263デフォルトの名無しさん
2007/10/04(木) 20:40:460264デフォルトの名無しさん
2007/10/04(木) 20:56:580265デフォルトの名無しさん
2007/10/04(木) 21:34:200266デフォルトの名無しさん
2007/10/04(木) 22:32:210267デフォルトの名無しさん
2007/10/04(木) 22:37:51普通は1文字ずつ変数に入れていくと思うのですが、
プログラム側で #define FILENAME "a.txt" と定義しておき、
CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。
よろしければお力添えをお願いいたします。
0268デフォルトの名無しさん
2007/10/04(木) 22:45:460269267
2007/10/04(木) 23:04:23defineが他にも多数あり、今後外部ファイルに定義を移して
defineの名前も変更できるようにするため、いい方法がないかと思っています。
FILENAME 1個だけなら置換で問題ないですね。
0270デフォルトの名無しさん
2007/10/04(木) 23:06:540271デフォルトの名無しさん
2007/10/04(木) 23:07:08よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?
0272デフォルトの名無しさん
2007/10/04(木) 23:19:35createprocess 外部コマンド
で検索するぐらいしてから来れば?
0273267
2007/10/04(木) 23:28:39すみません、cppでプリプロセスの理解ができませんでした。
私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。
0274デフォルトの名無しさん
2007/10/04(木) 23:29:59方法はこれが正しい書き方でしょうか?
class Hoge{
private:
int &Test;
public:
Hoge(int &T):Test(T){}
~Hoge(){}
}
0275デフォルトの名無しさん
2007/10/04(木) 23:32:00一番最後にセミコロン無いけど
0276デフォルトの名無しさん
2007/10/04(木) 23:35:30その程度のこと会社で聞けよ
きみの会社の客はかわいそうだな
0279デフォルトの名無しさん
2007/10/05(金) 07:21:23pure 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
0280デフォルトの名無しさん
2007/10/05(金) 07:49:32それは間違いです。
でもその書き方ってできないんじゃなかったっけ。
class ClassA{
public: virtual void Test(void) = 0;
};
void ClassA::Test(void) { }
って書く必要があったような・・・
記憶違いかね。
0281デフォルトの名無しさん
2007/10/05(金) 12:29:52VC++はそういう書き方ができるんじゃなかったか。
pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか
お節介だったと思うが。
0282デフォルトの名無しさん
2007/10/05(金) 21:29:19×pure virtual な関数は、実体を作れない
○pure virtual な関数を持つクラスは、実体を作れない
0283デフォルトの名無しさん
2007/10/05(金) 22:32:31数値を定数化してフォーマットに埋め込めないものかと思っているんですが、
#define した定数がそのまま表示されたりと期待した動作が得られません。
どなたか知恵を貸して頂けませんか。
(そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)
0284デフォルトの名無しさん
2007/10/05(金) 22:35:09printf(FMT,"hogehoge");
じゃダメなの?
0285デフォルトの名無しさん
2007/10/05(金) 22:39:10printf("%*s", 10, "hogehoge");
printf("%*s", 12, "hogehoge");
0286デフォルトの名無しさん
2007/10/05(金) 22:40:16printf("%" FMT "s", "hogehoge");
とか
0287デフォルトの名無しさん
2007/10/05(金) 22:47:38"hoge""hage""hoji""haji" // 何らかの方法で指定した予約語
std::map<std::string , std::string> strmap
strmap["hoge"] = "これは成功する";
strmap["miss"] = "これは失敗する";
こんな感じで
0288デフォルトの名無しさん
2007/10/05(金) 22:49:15配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが
要素毎にコンストラクタ呼び出しは冗長になるので
問題点が判らないので指摘をお願いします
#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;
}
0289デフォルトの名無しさん
2007/10/05(金) 22:53:53勝手に追加されちゃうから無理じゃね?
std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない
0290デフォルトの名無しさん
2007/10/05(金) 23:00:43stringの方をラッピングするのもアリじゃね?
書く量としてはその方が少なくなりそう。
0291デフォルトの名無しさん
2007/10/05(金) 23:00:58そうですか、残念
ありがとうございました
0292デフォルトの名無しさん
2007/10/05(金) 23:15:10>コンストラクタ呼び出しは冗長
といってもinlineであれば実質気にするほど変わらない気がする。
Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は?
virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。
0293デフォルトの名無しさん
2007/10/05(金) 23:36:170294デフォルトの名無しさん
2007/10/05(金) 23:43:21Thx
対象がRAWなベタデータなので簡素に出来ないかと思ったのですが
素直な書き方をした方がよさげですね
0295デフォルトの名無しさん
2007/10/06(土) 03:46:16フォーマットって普通に文字列なんだな。
>>285の方法は知らなかった。参考にさせて貰います。
色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。
0296デフォルトの名無しさん
2007/10/06(土) 03:51:51× オーバーライド
○ オーバーロード
0297デフォルトの名無しさん
2007/10/06(土) 16:19:13wcout を使うのは避けてますか?
WindowsXP Home + BCC
0298デフォルトの名無しさん
2007/10/06(土) 17:10:25return "hogehoge";
}
文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?
0299デフォルトの名無しさん
2007/10/06(土) 17:11:100300デフォルトの名無しさん
2007/10/06(土) 17:11:560301デフォルトの名無しさん
2007/10/06(土) 18:41:450302デフォルトの名無しさん
2007/10/06(土) 18:45:41なんか違うのか?
0303デフォルトの名無しさん
2007/10/06(土) 18:47:110304デフォルトの名無しさん
2007/10/06(土) 18:52:50今まで動いていたのに、今日コンパイルすると、
(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);
0305デフォルトの名無しさん
2007/10/06(土) 18:54:020306デフォルトの名無しさん
2007/10/06(土) 18:54:48エラーメッセージのまんまだろ。
0307デフォルトの名無しさん
2007/10/06(土) 19:02:37お前みたいなのが扱うもんじゃねぇだろ
0308デフォルトの名無しさん
2007/10/06(土) 19:09:250309304
2007/10/06(土) 19:30:54自分がいやになる
皆さんありがとうございました・・・
0310TiIetvqQLZ
2007/10/06(土) 19:33:020311デフォルトの名無しさん
2007/10/06(土) 20:33:16この人にメールしたら50万円振り込んでくれたよ
0312デフォルトの名無しさん
2007/10/06(土) 20:40:22くじけるなよ、皆誰でも最初は初心者だ
0313デフォルトの名無しさん
2007/10/06(土) 20:50:17マクロについて聞かせてください。
#define GET_FRAGMENT_PARAM(name) \
myCgFragmentParam_##name = \
cgGetNamedParameter(myCgFragmentProgram, #name); \
checkForCgError("could not get " #name " parameter");
このようなマクロがあったときに \ で複数行にすることはわかったのですが
その後の##nameと#nameの違いと意味について教えてください。
0314デフォルトの名無しさん
2007/10/06(土) 21:02:40トークン連結演算子と文字列化演算子。
0315デフォルトの名無しさん
2007/10/06(土) 21:22:19#define A(x, y) x##y
#define B(x) #x
というのがあったとき、
A(foo, bar) → foobar
B(foo) → "foo"
に展開される
0316デフォルトの名無しさん
2007/10/06(土) 21:25:450317デフォルトの名無しさん
2007/10/06(土) 21:28:32ありがとうございます。
わかりやすい例で理解できました。ほんとに助かりました
0318デフォルトの名無しさん
2007/10/06(土) 21:32:59略
for(i=0; i <hoge.size(); i++)
{
略
}
例えばforに入る段階でhoge.size()が5だったとして、
forの中でもなにもhogeに対して操作をしてないのに
出てきた段階でiが5を指してるんですが、いったいどういうことですか?
01234で出てくるはずですよね?
0319デフォルトの名無しさん
2007/10/06(土) 21:35:45i=5になって、ようやく i<hoge.size() が成立しなくなって、ループから抜けれる。
つまり出るときは i=5
0320デフォルトの名無しさん
2007/10/06(土) 21:35:460321デフォルトの名無しさん
2007/10/06(土) 21:37:090322デフォルトの名無しさん
2007/10/06(土) 21:37:11{
std::sting buf;
buf = "hogehoge";
return buf;
}
こんなんもアリですか?
0323デフォルトの名無しさん
2007/10/06(土) 21:40:350324デフォルトの名無しさん
2007/10/06(土) 21:41:220325デフォルトの名無しさん
2007/10/06(土) 21:41:230326デフォルトの名無しさん
2007/10/06(土) 21:42:020327デフォルトの名無しさん
2007/10/06(土) 21:43:00bufに対して何らかの処理を加えたものを格納してると仮定した上で・・・
0328デフォルトの名無しさん
2007/10/06(土) 21:43:54なるほど
どうもです
0329デフォルトの名無しさん
2007/10/06(土) 21:44:19そっか。そうでした。
forの{}の中でとりうるiの値は01234ってことですね。
0330デフォルトの名無しさん
2007/10/06(土) 22:28:20これ通ってビックリしたんですけど
*っていくつまで行けるんですか?
0331デフォルトの名無しさん
2007/10/06(土) 22:29:13つけるだけならいくらでも。
0332デフォルトの名無しさん
2007/10/06(土) 23:02:46p[0];
p[0][1];
p[0][1][2];
p[0][1][2][3];
p[0][1][2][3][4];
p[0][1][2][3][4][5];
p[0][1][2][3][4][5][6];
p[0][1][2][3][4][5][6][7];
p[0][1][2][3][4][5][6][7][8];
p[0][1][2][3][4][5][6][7][8][9];
p[0][1][2][3][4][5][6][7][8][9][10];
p[0][1][2][3][4][5][6][7][8][9][10][11];
p[0][1][2][3][4][5][6][7][8][9][10][11][12];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28][29];
p[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28][29][30];
0333デフォルトの名無しさん
2007/10/06(土) 23:04:000334デフォルトの名無しさん
2007/10/06(土) 23:05:30いちおう規格で最低限の数値が示されている。
ISO C 5.2.4.1 Translation limits より
"12 pointer, array, and function declarators (in any combinations) modifying an
arithmetic, structure, union, or incomplete type in a declaration"
ISO C++ Annex B Implementation quantities より
"Pointer, array, and function declarators (in any combination) modifying an arithmetic, structure, union,
or incomplete type in a declaration [256]."
C なら 12 まで、 C++ なら 256 までがポータブルってことね。
ふーん。
0335デフォルトの名無しさん
2007/10/06(土) 23:13:19手書きだぜ、これ
0336332
2007/10/06(土) 23:18:180337デフォルトの名無しさん
2007/10/06(土) 23:22:46「綺麗だろ…
手書きなんだぜ、これ」
>>332ちゃん…
0338デフォルトの名無しさん
2007/10/06(土) 23:24:430339デフォルトの名無しさん
2007/10/06(土) 23:29:090340デフォルトの名無しさん
2007/10/06(土) 23:35:290341デフォルトの名無しさん
2007/10/06(土) 23:49:030342デフォルトの名無しさん
2007/10/07(日) 00:11:190343デフォルトの名無しさん
2007/10/07(日) 01:50:17規格上は要素数は 0 より大きくないと駄目って書いてある。
空の構造体の場合、C では 0、C++ だと 1 になった。C++ では complete な class type のサイズが 0 に
ならないことは規格上明記されてるけど、C では軽く見た限り記述はなかった。
0344デフォルトの名無しさん
2007/10/07(日) 01:55:19みたいな記述なかったっけ?
0345デフォルトの名無しさん
2007/10/07(日) 10:40:26new する時に値が 0 かどうかチェックしないとダメってこと?
0346デフォルトの名無しさん
2007/10/07(日) 10:43:07しているのは俺だけでいい
0347デフォルトの名無しさん
2007/10/07(日) 10:56:33あほのお前だけでいい
0348デフォルトの名無しさん
2007/10/07(日) 10:58:530349デフォルトの名無しさん
2007/10/07(日) 11:51:56普通に配列の宣言/定義をするときに、という意味。
new するときは要素数 0 を渡すことができて(確保が成功すれば)他の(有効な=deleteされていない) new の戻り値と
かぶらないポインタが返ってくることが保証されている。(14882:2003 3.7.3.1/2)
なお、C99(9899:1999) だと要素なしの struct が認められてなかった。
> 6.7.2.1/7
>If the struct-declaration-list contains no named members, the behavior is undefined.
> 6.2.6.1/2
>Except for bit-fields, objects are composed of contiguous sequences of one or more bytes,
とも書いてあるし、sizeof が 0 返すのはなさそげ。
C89/C90 がどうなってるかは分からないけど、gcc の -Wall -std=c89 -pedantic の結果からすると C99 と同じだと思われる。
0350デフォルトの名無しさん
2007/10/07(日) 13:52:110351デフォルトの名無しさん
2007/10/07(日) 13:53:21なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。なさそげ。
0352デフォルトの名無しさん
2007/10/08(月) 02:38:47仮に空の構造体の大きさが0でよければ、
空メンバ最適化 (EMO)なんて言葉も出来なかったよね。
0353デフォルトの名無しさん
2007/10/08(月) 02:43:260354デフォルトの名無しさん
2007/10/08(月) 07:26:570355デフォルトの名無しさん
2007/10/08(月) 10:09:380356デフォルトの名無しさん
2007/10/08(月) 10:11:280357デフォルトの名無しさん
2007/10/08(月) 10:19:380358デフォルトの名無しさん
2007/10/08(月) 11:03:38Windows なら MultiByteToWideChar() が使えそうだけど、ほかの環境もあるなら
やっぱり iconv か?
0359デフォルトの名無しさん
2007/10/08(月) 11:14:480360デフォルトの名無しさん
2007/10/08(月) 11:25:44一発では出来そうもありませんね
自作するしかない?
レスありがとうございました
0361デフォルトの名無しさん
2007/10/08(月) 12:25:39私としては分かりやすいので使ってます。
で、静的メンバって頭になんてつけるのが通例?
普通のメンバにはm_ってつけてたのですが、
これってホントは静的メンバにつけるもの?
0362デフォルトの名無しさん
2007/10/08(月) 12:36:56>普通のメンバにはm_ってつけてたのですが、
それはハンガリアンではない。
0363デフォルトの名無しさん
2007/10/08(月) 12:44:56そうなの?じゃあ別になんでもいいけど、
よくメンバってm_ってつけるじゃないですか。
分かりやすいし。グローバルにはg_とか。
で、静的メンバはなんて付けとくのが通例?
感覚的にはsm_とかでいいのかな。
でも見たこと無い。
0364デフォルトの名無しさん
2007/10/08(月) 12:57:39好きにしろ。
0365デフォルトの名無しさん
2007/10/08(月) 12:58:130366デフォルトの名無しさん
2007/10/08(月) 13:00:45だったらどうすりゃいいんだよwww
0367デフォルトの名無しさん
2007/10/08(月) 13:02:130368デフォルトの名無しさん
2007/10/08(月) 13:09:210369デフォルトの名無しさん
2007/10/08(月) 13:15:050370デフォルトの名無しさん
2007/10/08(月) 13:18:390371デフォルトの名無しさん
2007/10/08(月) 13:21:52m_
s_
見たことあるのはこの3つくらいだな
0373デフォルトの名無しさん
2007/10/08(月) 13:30:440374デフォルトの名無しさん
2007/10/08(月) 13:38:470375デフォルトの名無しさん
2007/10/08(月) 13:50:49質問してる分際で何だ
死ね
0376デフォルトの名無しさん
2007/10/08(月) 13:52:11趣味…わが道を行く
でいいんじゃね
仕事で変数名を順にa,b,c,d,e,...と付けてあるソースを見たときはブチ切れた
0377デフォルトの名無しさん
2007/10/08(月) 13:58:56m9(^Д^)プギャー
0378デフォルトの名無しさん
2007/10/08(月) 14:24:50スマンそれ漏れだわ
当時彼女とうまくいってなくて怒りを仕事にぶつけちまった
0379デフォルトの名無しさん
2007/10/08(月) 14:41:420380デフォルトの名無しさん
2007/10/08(月) 15:01:540381デフォルトの名無しさん
2007/10/08(月) 15:03:21どれもこれも直接string<->wstringの変換はできんが、ラッパーを書くのは
大した手間でもないだろう。問題は、どれもこれも何がしかの問題があるように
見えることだ。
mbtowc(): リエントラントでないんで多分非推奨。
mbrtowc(): 上のリエントラント版で、しかも標準だが
使えない環境もあるかも?どっちみちグローバルロケール依存なので用途が
限られるかも?
codecvt<>: C++標準で、wstreamの変換に使われているが、
実装が貧弱(バグもち、遅い)であることも多いかも?
iconv: Unixでは標準的でWindowsにもGNUのが移植されているが、
エラーケースの実装がまちまちだったり色々変種があったりパッチが
あったり無かったり、罠も多いかも?
ICU: Unicode絡みでは決定版とも言えるライブラリだが、巨大すぎるかも?
MultibyteToWideChar(), MLang: Windows専用。
_bstr_t, A2W, CA2W: VC++専用。
0382デフォルトの名無しさん
2007/10/08(月) 15:04:00誰が上手いことを言えと(ry
と、いってほしかったんでしょ
0383デフォルトの名無しさん
2007/10/08(月) 15:04:00はにゃ〜ん
て書いてあった事がある
0384デフォルトの名無しさん
2007/10/08(月) 15:17:17へ?
もしかして 私事 を しごと と読んでるのか?
0385デフォルトの名無しさん
2007/10/08(月) 15:20:010386デフォルトの名無しさん
2007/10/08(月) 15:20:040387デフォルトの名無しさん
2007/10/08(月) 15:20:310388デフォルトの名無しさん
2007/10/08(月) 15:20:40もちろん違う。
並べると、そう読ませるシャレになってんのかなと思っただけだよ。
0389デフォルトの名無しさん
2007/10/08(月) 15:23:090390デフォルトの名無しさん
2007/10/08(月) 15:24:220391デフォルトの名無しさん
2007/10/08(月) 17:08:56class f;
0392デフォルトの名無しさん
2007/10/08(月) 22:09:22レスが遅れました
これは丁寧な解説ありがとうございました
参考にさせて貰います
0393デフォルトの名無しさん
2007/10/08(月) 22:41:52sample.c: can't open: stdio.h: No such file or directory
とか言われてどうしたらいいかわかんなくなった
0394デフォルトの名無しさん
2007/10/08(月) 22:43:30てかstdio.h入れてないとかどんな設定で環境入れたんだ
何か走らんが
0395デフォルトの名無しさん
2007/10/08(月) 22:44:17OS コンパイラ の環境書けってば
0396デフォルトの名無しさん
2007/10/08(月) 23:07:26死ねってば
0397デフォルトの名無しさん
2007/10/08(月) 23:08:55http://pc11.2ch.net/test/read.cgi/tech/1190342593/625
0398デフォルトの名無しさん
2007/10/08(月) 23:09:42始めたばかりでもそのレベルじゃやめといた方がいい
0399デフォルトの名無しさん
2007/10/08(月) 23:20:40public:
int mA;
virtual FuncA();
};
があったとします。このクラスをBというクラスが継承した場合、
クラスAのメンバにアクセスするには普通にmA、FuncA()でアクセスできます。
これを、”この変数はクラスAのだよー”と、明示的に示したい場合、A::mAとすべきでしょうか?this->mAとすべきでしょうか?
0400デフォルトの名無しさん
2007/10/08(月) 23:23:570401デフォルトの名無しさん
2007/10/08(月) 23:46:340402399
2007/10/08(月) 23:57:59まじですか。ありがとうございました。
0403デフォルトの名無しさん
2007/10/09(火) 17:17:46たとえば前方反復子は入力反復子の操作を全て持ってるわけだから
継承すればいいと思います。
イテレータータグ(iterator_category)で型の区別はできますが。
0404デフォルトの名無しさん
2007/10/09(火) 17:23:13int a[10];
std::fill(a, a+10, 42);
とかできなくなる。
0405デフォルトの名無しさん
2007/10/09(火) 17:34:39仮想関数はC++の標準ライブラリに
遅いか、あるいは必要ないか、の理由で拒否されている
ソースからvirtualを検索すれば分かる
だからC++はオブジェクト指向言語ではない
C++はHaskellとLispをまぜた何か。だ
0406デフォルトの名無しさん
2007/10/09(火) 17:36:10つまり、それがiterator_traits<Iter>の組み込みポインタ(ランダムアクセス反復子)
用の特殊化バージョンを定義してることと関係してるのですか?
0407デフォルトの名無しさん
2007/10/09(火) 17:38:10仮に継承したとしても各演算子をオーバーライドしたり仮想にする必要は
ないと思いますがいかがでしょう?
0408デフォルトの名無しさん
2007/10/09(火) 17:54:43ポインタをランダムアクセス反復子として扱いたいので、そうできるようにしている。
0409デフォルトの名無しさん
2007/10/09(火) 23:16:00Cだと「ただのビットのコピー」で、C++だと「メンバ変数ごとに operator= を呼び出す(もしくはコピーコンストラクタ?)」で合ってますか?
(C++は、構造体にoperator=を自分で実装してない場合です
0410デフォルトの名無しさん
2007/10/09(火) 23:33:47はい。
同じような質問を、何か最近見たような気がする。
0411デフォルトの名無しさん
2007/10/10(水) 03:28:01hoge[25]とhuga[25]みたいな感じで、
25個の配列を比較しなければならなくなりました。
hoge[25]のほうは値が固定なのですが、配列宣言で
const double hoge[] = {0,1,2,…24};
とやるのはなんかダサイ気がします。
なにか、うまい解決方法は無いでしょうか?
それと、もし宣言する場合はconst double hoge[] = {0,1,2,…24};を
グローバル変数として宣言した方が処理が早いでしょうか?
それともmainのローカル変数で宣言して、参照渡し(const付けた意味なし)
した方が早いでしょうか?
それとも配列の比較をする関数の中で宣言した方が処理が早いでしょうか?
0412デフォルトの名無しさん
2007/10/10(水) 04:01:220413デフォルトの名無しさん
2007/10/10(水) 04:02:38C++ならstd::generate_n()も使える。
0414デフォルトの名無しさん
2007/10/10(水) 04:57:30書き捨てなので
>>413
for文で代入とは?配列に代入される値は固定ですが、線形ではないです。
ちなみにCです。
やりたい事は簡単に言えば、統計処理で
X Y X*Y X^2
1 5 5
3 9 27
4 6 24
5 8 40
6 3 18
みたいな感じで(この場合Xの値は固定でYを引数)。
んでXの配列をべた書きでも良いんですが(ファイルで読み込みだと遅いし)、
ダサイなと。
0415デフォルトの名無しさん
2007/10/10(水) 05:26:39Yを引数に他の値が決まるなら、それをfor文で代入すればいい。
何がダサいのかはしらんが。
0416デフォルトの名無しさん
2007/10/10(水) 05:48:35お前のセンスがダサい
0417デフォルトの名無しさん
2007/10/10(水) 05:54:020418デフォルトの名無しさん
2007/10/10(水) 06:02:48ソースの中に配列が、
hoge[] = {1,4,65,7,....}
みたいな感じでダラダラ書いてあったら、イラッとしません?
ところで、
「それと、もし宣言する場合はconst double hoge[] = {0,1,2,…24};を
グローバル変数として宣言した方が処理が早いでしょうか?
それともmainのローカル変数で宣言して、参照渡し(const付けた意味なし)
した方が早いでしょうか?
それとも配列の比較をする関数の中で宣言した方が処理が早いでしょうか?」
はどうなんですか?
0419デフォルトの名無しさん
2007/10/10(水) 06:08:310420デフォルトの名無しさん
2007/10/10(水) 06:20:300421デフォルトの名無しさん
2007/10/10(水) 06:29:05書き方さえしてなければどれでもいいだろ。
グローバルだろうと参照渡しだろうと速度は変わらん。
プログラムの規模と関数の汎用性をどうしたいのか考えてから
あとで保守するときに一番楽が出来そうなやり方でやればよろし。
0422デフォルトの名無しさん
2007/10/10(水) 06:30:310423デフォルトの名無しさん
2007/10/10(水) 07:12:290424デフォルトの名無しさん
2007/10/10(水) 07:50:44「なんかダサイ」「イラッとしません?」なんて主観でしか語らないやつには
どんな方法で答えても後付けで文句が返ってきそうだから、答えたくない。
あと、速度は実測が基本。
0425デフォルトの名無しさん
2007/10/10(水) 08:11:43>「なんかダサイ」「イラッとしません?」なんて主観でしか語らないやつには
>どんな方法で答えても後付けで文句が返ってきそうだから、答えたくない。
プゲラッチョ
じゃ、お前さんはインデントがむちゃくちゃなソースの読みにくさを
どうやって数値(客観的な方法)で表すんだい?
後学のために教えて頂戴。
このソースコードの奇麗さや汚さを数値で表してみせてよ。
0426デフォルトの名無しさん
2007/10/10(水) 08:13:430427デフォルトの名無しさん
2007/10/10(水) 08:20:460428デフォルトの名無しさん
2007/10/10(水) 08:57:31>イラッとしません?
個人的な話でよければ、hoge[25] = {1,4,65,7,....} な書き方で、
5個ずつなり10個ずつなりで改行してあれば気にならない。
25個全部が1行で書いてあるとイラっとする
0429デフォルトの名無しさん
2007/10/10(水) 09:02:130430デフォルトの名無しさん
2007/10/10(水) 10:02:11読みにくさを客観的に表すのは簡単。
何故イラっとするのか、何故ダサイと思うのかを正確に記述すればいいだけ。
何か大きな勘違いをしているみたいだけど、「主観的な考え方」と「主観的な表し方」はまるで別物。
>>418が言われているのは、
「お前の感覚の原因を客観的に表せ。原因がわからなければ、原因を取り除いた書き方も提供できない」
ということだと理解しよう。
究極的には主観で好みが分かれる、というのをいくら興奮しながらまくしたてたところで、
その詳細を表現するのに「なんかダサイ」「イラッとしません?」といったレベルの低い主観的表現しか
出てこなかったから回答しようがない、という間抜けな状況の言い訳にはならない。
0431デフォルトの名無しさん
2007/10/10(水) 10:08:420432デフォルトの名無しさん
2007/10/10(水) 10:29:180433デフォルトの名無しさん
2007/10/10(水) 10:30:260434デフォルトの名無しさん
2007/10/10(水) 11:08:200435デフォルトの名無しさん
2007/10/10(水) 11:17:050436デフォルトの名無しさん
2007/10/10(水) 11:44:27CUIメニューでカーソルキーが押されたら何らかのアクションをしたいのですが、
カーソルキーの押下を拾う方法がわかりません。何か参考になるサイトとかありますか?
0437デフォルトの名無しさん
2007/10/10(水) 11:49:490438デフォルトの名無しさん
2007/10/10(水) 18:36:360439デフォルトの名無しさん
2007/10/10(水) 19:39:42kbhit + getch
WaitForSingleObject + ReadConsoleInput
0440デフォルトの名無しさん
2007/10/10(水) 21:27:34#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NULLPO NULL
#define WALL 0
#define FLOOR 1
#define WIDTH 15
#define HEIGHT 13
#define S_WALL "■"
#define S_FLOOR " "
int main(int argc, char **argv){
char maze[HEIGHT][WIDTH];
int y, x;
memset(maze, WALL, HEIGHT * WIDTH);
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; y < WIDTH; ++x) {
printf("%s", (maze[y][x] == WALL) ? S_WALL : S_FLOOR);
}
printf("\n");
}
return 0;
}
ニコニコ動画のプログラムを真似てみたのですが■が大量発生して強制終了してしまいます
0441デフォルトの名無しさん
2007/10/10(水) 21:31:26>for (x = 0; y < WIDTH; ++x) {
この行!
0442デフォルトの名無しさん
2007/10/10(水) 21:31:32a[1]=0
a[2]=1
のとき、これの逆関数というか
f(2) = 0, f(0) = 1, f(1) = 2
って感じで、2を与えられたら「a[?] = 2となる?は"0"なので0を返却する」ようなことって簡単にできますかね?
やっぱりfor文で要素を一個々々調べるしかない?
0443デフォルトの名無しさん
2007/10/10(水) 21:32:41C++ なら map 使えば?
0444デフォルトの名無しさん
2007/10/10(水) 21:35:08なんという凡ミスありがとうございます
0445デフォルトの名無しさん
2007/10/10(水) 21:35:44ほう、mapってのを使えばできそうですか。調べてみます。どうもです
0446デフォルトの名無しさん
2007/10/10(水) 23:57:17どれ位の事を言うものでしょうか?
int hoge[1000][1000] とかやっても良い?
0447デフォルトの名無しさん
2007/10/10(水) 23:57:33#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NULLPO NULL
#define WALL 0
#define FLOOR 1
#define WIDTH 15
#define HEIGHT 13
#define S_WALL "■"
#define S_FLOOR " "
void dig(char maze[HEIGHT][WIDTH], int x, int y);
int main(int argc, char **argv){
char maze[HEIGHT][WIDTH];
int y, x;
memset(maze, WALL, HEIGHT * WIDTH);
srand(time(NULLPO));
dig(maze,1,1);
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; x < WIDTH; ++x) {
printf("%s", (maze[y][x] == WALL) ? S_WALL : S_FLOOR);
}
printf("\n");
}
return 0;
} すいません又ご指導いただきます
0448デフォルトの名無しさん
2007/10/10(水) 23:58:04static const int vector_x[] = {0, 0, -1, 1};
static const int vector_y[] = {1, -1, 0, 0};
int directions[] = {0, 1, 2, 3};
int direction_count;
maze[y][x] = FLOOR;
for (direction_count = 4; direction_count > 0; --direction_count) {
int direction_index = (int) ((double) direction_count) * rand() / (RAND_MAX + 1.0);
int direction = directions[direction_index];
int moved_x = x + vector_x[direction] * 2;
int moved_y = y + vector_y[direction] * 2;
if (moved_x > 0 && moved_x < WIDTH && moved_y > 0
&& moved_y < HEIGHT
&& maze[moved_y][moved_x] == WALL){
maze[y + vector_y[direction]][x - vector_x[direction]]
dig(maze, moved_x, moved_y);
}
directions[direction_index] = directions[direction_count - 1];
}
return;
}
0449デフォルトの名無しさん
2007/10/11(木) 00:01:24それが自動変数ならスタックサイズを指定してコンパイルすればいい。
そうでないなら、今時MiBオーダ位で気にすることはないだろ。
寧ろ問題は、本当に固定長でいいのかってことだ。
0450デフォルトの名無しさん
2007/10/11(木) 00:03:21int hoge[0x8000000]とかは辞めた方がいい
0451デフォルトの名無しさん
2007/10/11(木) 00:16:30何を指導して欲しいんだ?
>>448のソースはひどいね。何をしたいのか分からん。
(二次元に配置したWALLをランダムで掘ってFLOORの道を作りたいんだろうけど。)
とりあえずソース貼り付けてから質問文を作ってるなら、先にテキストエディタにでもまとめてから貼り付けたほうがいい。
0452デフォルトの名無しさん
2007/10/11(木) 00:19:20OSはLINUXでCです。
0453デフォルトの名無しさん
2007/10/11(木) 00:21:35できるっちゃぁできるけど、どうせシステムコールするだけなのになんでインラインアセンブラを使うの?
どうしてもアセンブラでやりたいならわざわざCのインラインにする必要もないだろうし。
0454デフォルトの名無しさん
2007/10/11(木) 00:21:42環境によっては、1KBでも止めた方がよい
一般にとか言うのは難しい
0455デフォルトの名無しさん
2007/10/11(木) 00:26:46どうもです
>>454
確かにそうですけど
そりゃ極端する・・・
0456デフォルトの名無しさん
2007/10/11(木) 00:41:31#ifdef NULLPO
#undef NULLPO
#define GA
#endif
0457デフォルトの名無しさん
2007/10/11(木) 01:01:59できるかといえばできるんでしょうけど、何のために、って感じる
あと、最近のコンパイラの最適化は結構優秀なので、
思いのほかインラインアセンブラに近い出力を、Cで出せることもある
0458デフォルトの名無しさん
2007/10/11(木) 01:04:340459デフォルトの名無しさん
2007/10/11(木) 01:05:530460デフォルトの名無しさん
2007/10/11(木) 01:28:37すいませんものすごく説明不足で
ソースを書いたので見てくださるとうれしいです
0461デフォルトの名無しさん
2007/10/11(木) 01:47:36あちこち写し間違えてるだけ。
動画に正解が書いてるんだから、めんどくさがらずに一時停止しながら一字一句見直せ。
そのソースはコンパイルすればエラーメッセージが出てるはず。
何を間違えたか自分で考えたり調べたりした?
自分ではプログラムを理解しようともせずに、見よう見まねで打ち込んだら間違ってて分からない。
それを誰かに調べて欲しいというの? そんなのはここでは誰も助けてくれないと思うよ。
0462デフォルトの名無しさん
2007/10/11(木) 08:04:59C言語です。
配列同士の引き算って出来ないのでしょうか?
array1[] = {1,2,3,4,5};
array2[] = {5.4.3.2.1};
hoge = array1[2] - array2[2];
とやりたかったのですが、
invalid operands to binary -
と出でしまいます。
0463デフォルトの名無しさん
2007/10/11(木) 08:06:39array1, array2 の要素型は何?
勝手に省略せずに、問題の発生するひととおりのソースを貼ったほうがいいよ。
0464デフォルトの名無しさん
2007/10/11(木) 08:11:070465デフォルトの名無しさん
2007/10/11(木) 08:14:53構造体同士の引き算は出来ません
構造体の要素毎に計算しませう
0466デフォルトの名無しさん
2007/10/11(木) 08:33:58>>464
>>465
すいません。
int i;
double hoge;
double array1[] = {1,2,3,4,5};
double array2[] = {5,4,3,2,1};
for(i = 0;i < 5;i++){
hoge = array1[i] - array2[i];
}
と言うことをやりたいと思います。
double tmp1;
double tmp2;
for(i = 0;i < 5;i++){
tmp1 = array1[i];
tmp2 = array2[i];
hoge = tmp1 - tmp2;
}
とやるしかないのでしょうか?
0467デフォルトの名無しさん
2007/10/11(木) 08:35:04>と言うことをやりたいと思います。
それで動くはずだよ
0468デフォルトの名無しさん
2007/10/11(木) 08:39:38std::vector<int> v2 = oven::initial_values(5,4,3,2,1);
assert( boost::size(v1) == boost::size(v2) );
std::vector<int> vo( boost::size(v1) );
foreach (e, boost::tie(v1,v2,vo) | oven::zipped)
e.get<2>() = e.get<0>() - e.get<1>();
C++なら意図したものと同じような構文でできるよ^^
0469デフォルトの名無しさん
2007/10/11(木) 08:40:460470デフォルトの名無しさん
2007/10/11(木) 08:40:470471デフォルトの名無しさん
2007/10/11(木) 08:46:42原因追及したいけれど、学校に行かなければならなくなりました。
帰ってきてから、デバッガで調べます。
どうもありがとうございました。
0472デフォルトの名無しさん
2007/10/11(木) 08:49:160473デフォルトの名無しさん
2007/10/11(木) 10:30:09良い参考書ってありますか?
0474デフォルトの名無しさん
2007/10/11(木) 10:32:360475デフォルトの名無しさん
2007/10/11(木) 10:33:57わざわざ難解にするなよw
0476デフォルトの名無しさん
2007/10/11(木) 12:44:49oven使いとかお前はなにもんだよw
あれ使ってるのまだpstadeさんくらいじゃなかったの
0477デフォルトの名無しさん
2007/10/11(木) 12:52:540478デフォルトの名無しさん
2007/10/11(木) 12:57:390479466
2007/10/11(木) 13:02:43グローバル変数の配列と構造体の名前が同じで、
構造体-配列という状態になっていました。
お恥ずかしい。
0480デフォルトの名無しさん
2007/10/11(木) 13:03:170481デフォルトの名無しさん
2007/10/11(木) 16:37:06初期化と破棄はどのように書くものでしょうか?
一応動くのですが、これでいいのかがいまいち理解できないです。
class hoge:public age
{
:
char* mMagicCookie;
std::deque<uint_t> packetSize;
};
hoge::hoge()
:
mMagicCookie(NULL),
packetSize()
{
:
}
hoge::~hoge()
{
}
0482デフォルトの名無しさん
2007/10/11(木) 17:08:05メモリの確保と解放という意味で言ってるなら、それは考えなくていいです。
そういうのを自動でやらせるためのコンテナなんだから。
hogeのインスタンスが出来た時点でdequeの中に必要な値が入っている必要があって、
その意味で初期化と言っているのならば
hogeのコンストラクタの初期化リストで値を入れてやるか
コンストラクタの中でassignしてやればよろしいかと。
0483デフォルトの名無しさん
2007/10/11(木) 17:15:12なるほど、道理で何も指示しなくてもエラーにならないのですね。
初期割当サイズを変えるにはコンストラクタのなかでreserve()をよべば、
・・・と思ったら、vectorと違ってdequeではreserveがないのか・・・
0484デフォルトの名無しさん
2007/10/11(木) 19:41:47nunits = (nbytes + sizeof(Header) - 1) /sizeof(Header) + 1;
の-1や+1はどういう意味なんでしょうか?
0485デフォルトの名無しさん
2007/10/11(木) 21:01:05最後の +1 は分けて考える。
(nbytes + sizeof(Header) - 1) /sizeof(Header) は、
nbytes を収めることができる最小の sizeof(Header) バイトの個数(用語難しいな)。
類例: n 円をm円玉で支払う場合に必要な最小の枚数は (n + m - 1) / m 枚。
ここまで説明されてもここの -1 の意味がわからないとこの先かなりつらい。
最後の +1 はヘッダそのものを収めるための sizeof(Header) 1コ分の領域。
0486デフォルトの名無しさん
2007/10/11(木) 21:46:00とてもよくわかりました。ありがとうございます
0487デフォルトの名無しさん
2007/10/12(金) 17:11:07a[0] = 0;
a[1] = 0;
for (int i=0; i<5 ;i++)
{
if( a[i] == NULL ) // 値が入っていなければ・・・
a[i] = 1;
}
こんな感じで配列に値が入っていなければ値を入れるように出来ますか?
0488デフォルトの名無しさん
2007/10/12(金) 17:17:44整数のゼロを先に入れていて、
ゼロのままだったら、ということをしたければ、
せめてif (a[i] == 0) のほうが素直では。
0489デフォルトの名無しさん
2007/10/12(金) 17:19:500490デフォルトの名無しさん
2007/10/12(金) 17:24:39配列に値が入っていれば何もせずに飛ばして
値が入っていなければ値を入れるようにしたいのですが・・・
0491デフォルトの名無しさん
2007/10/12(金) 17:27:14場合によってできます。
配列の要素の型において、「絶対に代入されない値」が決められる場合は
その値のどれかを「配列の空値」として、配列作成時にかならず
その値で初期化しておくことにより可能です。
例えば、配列にはかならず1以上の整数を入れると決めているならば、
0や-1などを空値として定義して、その値で配列を初期化すれば良いです。
もし配列の要素が全域を取りうる場合(例えば、signed int で
INT_MIN〜INTMAX の値をとりうる場合)「絶対に代入されない値」は
ありませんので「配列の空値」は定義できませんので上記のような
処理は無理です。
その場合、同じサイズの配列を用意したり、ビットマップを用意したりして、
空かどうかを別途管理する必要があります。
0492デフォルトの名無しさん
2007/10/12(金) 17:28:550493デフォルトの名無しさん
2007/10/12(金) 17:30:27詳しい説明ありがとうございます
前者の方法で試してみます
0494デフォルトの名無しさん
2007/10/12(金) 17:31:02ビットマップ?
0495デフォルトの名無しさん
2007/10/12(金) 17:38:170496デフォルトの名無しさん
2007/10/12(金) 17:45:140497491
2007/10/12(金) 17:49:00適当な型の配列を用意して、それが連続したビット列とみなします。
そして、そのビット位置と管理したいもののIDを対応付けて、
ビットのオン/オフで状態管理する方法をビットマップっていいます。
通常は、最初の要素の最下位ビットをID:0とします。
こうすると、char ひとつで8要素の未初期化状態を管理できます。
例えば、以下のビットマップでは 32bit x4 で 128要素の状態を管理できます。
int32_t bitmap[4];
0498デフォルトの名無しさん
2007/10/12(金) 17:54:24同要素数のunsigned charの配列で充分だって。
0499デフォルトの名無しさん
2007/10/12(金) 18:11:24#include<stdio.h>
#include<limits.h>
#define BITMAP_BIT(bitmap) (sizeof(bitmap[0])*CHAR_BIT)
#define BIT_GET(bitmap, idx) ((bitmap[idx/BITMAP_BIT(bitmap)]>>(idx%BITMAP_BIT(bitmap)))&1)
#define BIT_SET(bitmap, idx) (bitmap[idx/BITMAP_BIT(bitmap)]|=1<<(idx%BITMAP_BIT(bitmap)))
#define BIT_RESET(bitmap, idx) (bitmap[idx/BITMAP_BIT(bitmap)]&=~(1<<(idx%BITMAP_BIT(bitmap)))) // 注意!
int main(void){
unsigned char map[10]={0};
int number[30];
int i;
number[5]=123;
BIT_SET(map, 5);
number[25]=1234;
BIT_SET(map, 25);
for(i=0;i<sizeof(number)/sizeof(number[0]);i++)
if(!BIT_GET(map, i)) number[i]=i, BIT_SET(map, i);
for(i=0;i<sizeof(number)/sizeof(number[0]);i++)
printf("%3d : %d\n", i, number[i]);
return 0;
}
0500デフォルトの名無しさん
2007/10/12(金) 18:13:550501デフォルトの名無しさん
2007/10/12(金) 18:26:08値がない状態(初期化すらされていない状態)を表現できる仕組みです。
0502test
2007/10/12(金) 18:26:390503デフォルトの名無しさん
2007/10/12(金) 22:03:46T *p = new T; などでの一般のnew演算子は
void* operator new(size_t) throw (bad_alloc)
の呼び出しとなりますが、この引数が一つのoperator new関数は
必ずヒープに領域を確保するということでしょうか?
一方、配置構文newで使用される
void* operator new(size_t, void* p) throw ( ) { return p; }
では、ヒープの領域の確保はしないということでしょうか?
よろしくお願いします。
0504503
2007/10/12(金) 22:14:07明らかでした。要は定義内容によるということですね。
前半の
void* operator new(size_t) throw (bad_alloc)
については言語仕様として関数定義内でメモリ確保
が行われているということですよね?
0505503
2007/10/12(金) 22:19:04前半の
void* operator new(size_t) throw (bad_alloc)
についてもクラス内でオーバーロードして隠蔽してしまえば
ヒープに領域を確保しないような定義も可能になるんですよね?
(要はやろうと思えばどんな定義でもできる)
そんなことをする意味があるかないかは別としてですが。
0506デフォルトの名無しさん
2007/10/12(金) 23:04:1414882:2003 ではデータ構造としてのヒープしか出てこなくて、場所としてのヒープは出てこない。
適切にアラインメントされたメモリが返されることだけ規定されていてどこに確保されるかは規定されていない。
>についてもクラス内でオーバーロードして隠蔽してしまえば
クラス内どころかグローバルの operator new も置き換え可能と規格で明言されている。
ただし、上記のように適切にアラインメントされたメモリを返す必要がある。
0507503
2007/10/12(金) 23:35:07規格ではヒープかどうかは別として、必ずどこかに領域が
確保されるということは間違いないということですね。
ありがとうございました。
0508デフォルトの名無しさん
2007/10/13(土) 02:09:26これは凄い便利だな
デバッグ時に値が解らなくて不便な点も
autoexp.datを書き換えることで解決するみたいだし
0509デフォルトの名無しさん
2007/10/13(土) 05:36:19常考なんてお前阿呆だろう。
0510デフォルトの名無しさん
2007/10/13(土) 10:16:13{
public:
A( ) { }
~A( ) { }
} ;
A *p = new A ;
delete p ;
とした場合、Aのデストラクタが呼ばれオブジェクトが解体された後に動的記憶
領域の開放が行われると思いますが、以下のように明示的にデストラクタを呼び
出した場合はどのような動作になるのでしょうか?
オブジェクトは解体されると思うのですが、newで確保された動的記憶領域は
正しく開放されるのでしょうか?
A *p = new A ;
p->~A( ) ;
0511デフォルトの名無しさん
2007/10/13(土) 10:44:43public:
Widget( ) : { std::cout << "Widget::Widget()" << std::endl; }
~Widget( ) { std::cout << "Widget::~Widget()" << std::endl; }
};
int main()
{
using namespace std;
Widget *p = new Widget(3);
operator delete(p);
return 0;
}
のように delete p ; ではなく delete p ; で呼び出される operator delete (void*)
を直接呼び出したところ、Widgetオブジェクトのデストラクタが呼び出されません
でした。以下の理解で正しいでしょうか?
1. デストラクタの明示的呼び出しのみ p->=Widget( ) ;
pの指す型のデストラクタが呼ばれるが、領域は開放されない。
2. operator delete ( p ) ; の明示的呼び出し
デストラクタは呼ばれずに、領域が開放される。
3. delete p ;
デストラクタが呼ばれた後、operator delete ( p ) が呼ばれる(領域が
開放される)。
つまり、delete p ; と operator delete ( p ) ; は動作が違い、後者では
領域の開放のみが行われる。
0512デフォルトの名無しさん
2007/10/13(土) 10:48:10結局、
delete p ;
は
p->~Widget( ) ;
operator delete ( p ) ;
と同じと考えてよいのでしょうか?
0513デフォルトの名無しさん
2007/10/13(土) 11:04:30そういうこと。
0514デフォルトの名無しさん
2007/10/13(土) 11:37:49ありがとう。すっきりしました。
0515デフォルトの名無しさん
2007/10/13(土) 11:46:58たまにメンバも派生もpublicだけなのにclass使ってるソース見るけど違和感がある。
0516デフォルトの名無しさん
2007/10/13(土) 11:58:030517デフォルトの名無しさん
2007/10/13(土) 13:31:28ちょっと便利な構造体程度の使い方ならstruct、
後々隠したいメンバを追加する可能性があるならclassに、とか。
0518デフォルトの名無しさん
2007/10/13(土) 13:31:57OO言語の実装論からだろ?
意味論から見れば、
クラスではないはずの単なる構造体が
どうしてクラスの概念を持っているのかが不思議。
0519デフォルトの名無しさん
2007/10/13(土) 13:42:28一時ファイルとして使ってるんですが、自前のデフラグで前に積めた時、
後ろのゴミを消したいので。
0520デフォルトの名無しさん
2007/10/13(土) 13:45:36p の指すクラスが、クラス独自の operator delete () を提供している場合は違いが出てくる。
0521デフォルトの名無しさん
2007/10/13(土) 14:07:17正確に書くと
p->~Widget( ) ;
::Widget::operator delete ( p ) ; //グローバルスコープのもの
で
Widget クラスで operator delete(void*) が定義
されていた場合は
delete p ;
は
p->~Widget( ) ;
Widget::operator delete ( p ) ; //クラス独自のもの
となるということですよね?
0522デフォルトの名無しさん
2007/10/13(土) 14:10:26>511 の例で言えばそうだけど、デストラクタが virtual になってるクラスを
指してるときは動的な型の operator delete () が適用される。
0523デフォルトの名無しさん
2007/10/13(土) 14:24:30ISOにはない。POSIX準拠でよければftruncate()が使えると思う。
0524デフォルトの名無しさん
2007/10/13(土) 14:28:15なるほど。そこまで想定してませんでした。
class Widget
{
public:
~virtual Widget( );
} ;
class Derived : public Widget
{
public:
~Derived( ) ;
static void operator delete ( void* ) ;
}
Widget *p = new Derived ;
省略して書きましたが、上のような場合
delete p ;
は
D::~D( ) ;
Widget::~Widget( ) ;
Derived::operator delete ( p ) ;
ということですね。
0525デフォルトの名無しさん
2007/10/13(土) 14:34:380526デフォルトの名無しさん
2007/10/13(土) 14:44:34effective C++ではそのようになっていたのでそうしてます。
0527デフォルトの名無しさん
2007/10/13(土) 14:46:08> D::~D( ) ;
> Widget::~Widget( ) ;
> Derived::operator delete ( p ) ;
おかしいだろ。
↓このほうが正解に近いかな。
p->~Widget( ) ; // virtual だから実際は ~Derived() が実行される。
Derived::operator delete ( static_cast<Derived*>( p ) ) ;
0528デフォルトの名無しさん
2007/10/13(土) 14:54:11D::~D( ) ;
Widget::~Widget( ) ;
は
p->~Widget( ) ; // virtual だから実際は ~Derived() が実行される。
のつもりでした。派生クラスDerivedのデストラクタの実行による
派生クラス固有部分と基底クラス部分の解体。いずれにしてもD
はDerivedの間違いです。
Derived::operator delete ( static_cast<Derived*>( p ) ) ;
ここまで注意してませんでした。pの動的な型という
ことですね。
0529デフォルトの名無しさん
2007/10/13(土) 17:59:21で、(デフォルト)コンストラクタAが例外を投げた場合、newで確保されたメモリ
が開放されることは保障されていますか?
0530デフォルトの名無しさん
2007/10/13(土) 18:16:380531デフォルトの名無しさん
2007/10/13(土) 22:10:05(略)
void Lock() throw(MutexException);
void Unlock() throw(MutexException);
};
こんなクラスがあらかじめ用意されてて、
こいつをラップするクラスを自作しています。
class ScopedLock{
private:
Mutex* _m;
public:
ScopedLock(Mutex* m): _m(m){
_m->Lock();
}
~ScopedLock(){
_m->Unlock();
}
}
さて、デストラクタから例外を送出してはいけないらしいですが
そうなると、ScopedLockみたいなRAIIパターンを使う場合は
Unlock失敗は無視するほかないですか?
0532デフォルトの名無しさん
2007/10/13(土) 22:16:56基本的にはそう。
後処理の失敗で分岐が発生するような場合は、明示的な呼び出しも
使えるようにしとくといいかもね。 std::ofstream の close() とか。
0533デフォルトの名無しさん
2007/10/13(土) 22:47:340534デフォルトの名無しさん
2007/10/15(月) 00:11:380535デフォルトの名無しさん
2007/10/15(月) 00:27:560536デフォルトの名無しさん
2007/10/15(月) 01:25:04typedef double (*f_x)( double ); /* f(x)関数 */
↑上のような記述があるサンプルソースを見ていたのですが
コレまで構造体やtypedef int SIZEといった使いか確かしておらず
このような記述は初めてでした。
すいませんが、これはどういうことをやっているのか教えていただけませんか?
0537デフォルトの名無しさん
2007/10/15(月) 01:28:07よくわからないなら関数ポインタでぐぐってみれ
0538デフォルトの名無しさん
2007/10/15(月) 01:35:270539デフォルトの名無しさん
2007/10/15(月) 01:41:49使い方としてはこんな感じ
typedef BOOL (WINAPI *ENUMPROCESSMODULES)(HANDLE, HMODULE*, DWORD, LPDWORD);
ENUMPROCESSMODULES pEnumProcessModules;
hPsapi = LoadLibrary("psapi.dll");
pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hPsapi, "EnumProcessModules");
pEnumProcessModules(hProcess, &hModule, sizeof(hModule), NULL);
0540デフォルトの名無しさん
2007/10/15(月) 09:00:200541デフォルトの名無しさん
2007/10/15(月) 09:17:40phi_xとf_xは引数としてdoubleを一つ持ち、doubleを戻す関数へのポインタ型
}
0542デフォルトの名無しさん
2007/10/15(月) 11:40:49みなさんありがとうございます
関数ポインタについて、なんとなくでしか理解していなかったので
この機会にちゃんと理解をします。
ありがとうございました
0543デフォルトの名無しさん
2007/10/15(月) 20:19:10WindowsのEnumProcessのようなものですが、Linuxの構造に関しての知識はほとんどないため、相当のAPIを探しています。
0544デフォルトの名無しさん
2007/10/15(月) 21:58:13Linux板に逝ったほうがいいとおもうが、ヒント。
- psコマンドをstraceしてみる
- psコマンドをltraceしてみる
- psコマンドのソースを読む
0545デフォルトの名無しさん
2007/10/15(月) 23:03:01どうやってやればいいんですか?
0546デフォルトの名無しさん
2007/10/15(月) 23:04:58MSDN を読んでやればいいです。
0547デフォルトの名無しさん
2007/10/16(火) 00:29:56class X {
public:
//省略
private:
struct XImpl *pimpl ;
} ;
//ソースファイル x.cpp
#include x.h
struct X::XImpl {
//省略(いろいろな定義)
};
ソースファイルx.cppのコンパイルができません。
X::での修飾が悪いみたいなエラーが出ますが
原因はなんでしょうか?
0548デフォルトの名無しさん
2007/10/16(火) 00:33:01structはヘッダーファイルに入れたら?
0549デフォルトの名無しさん
2007/10/16(火) 00:34:330550デフォルトの名無しさん
2007/10/16(火) 00:36:31エラーメッセージをなるべくそのまま貼れ。
0551デフォルトの名無しさん
2007/10/16(火) 00:37:25ググってでてきたところコピペしてみれば?
0552デフォルトの名無しさん
2007/10/16(火) 00:43:58より詳しく言うならヘッダファイルのstruct XImpl *pimpl;
よりも前でXImplを宣言する必要がある。
それにインナークラス(クラス内でのクラス)なら親クラスであるクラスXの中に書かないといけない
//ヘッダーファイル x.h
class X {
public:
class XImpl {
//省略(いろいろな定義)
};
//省略
private:
struct XImpl *pimpl ;
};
//ソースファイル x.cpp
#include x.h
// メンバ関数の実装
// 例…クローン関数(似非)
X::XImpl X::XImpl::operator() (void)
{ return X::XImpl(*this); };
0553デフォルトの名無しさん
2007/10/16(火) 00:45:410554デフォルトの名無しさん
2007/10/16(火) 00:54:020555デフォルトの名無しさん
2007/10/16(火) 01:00:32>>552
private部をコンパイル依存から切り離したいので
publicなインナークラス定義はおきたくないです。
struct XImplは別ファイルに定義したいです。
ちなみに以下のようにしたらコンパイルは通りますが
理由がわかりません。コンパイラはg++です。
//ヘッダーファイル x.h
class X {
public:
//省略
private:
struct XImpl ; //これを追加(前方宣言?)
struct XImpl *pimpl ;
} ;
//ソースファイル x.cpp
#include x.h
struct X::XImpl {
//省略(いろいろな定義)
};
0556デフォルトの名無しさん
2007/10/16(火) 01:04:00はstruct XImplの宣言も兼ねてるのではないんでしょうか?
0557デフォルトの名無しさん
2007/10/16(火) 01:12:02struct XImpl *pimple; のように他の宣言の一部として現れた場合は、その宣言を
囲む名前空間スコープに宣言される。クラスや関数のスコープはすっとばされるわけね。
単品で struct XImpl; とした場合は、クラスでも関数でもそのスコープに宣言される。
規格の 3.3.1p5 参照。
たぶん C との互換性のためなんじゃないかな、と。
0558デフォルトの名無しさん
2007/10/16(火) 01:30:49enum Fruit {
Apple,
Orange,
....
}
とあるとき、これらの列挙子をそのままC++の文字列として出力する方法はないでしょうか。
標準出力にそのまま"Apple"とやりたいのですが。
0559デフォルトの名無しさん
2007/10/16(火) 01:40:13できません。
プリプロセッサを駆使して変換テーブルや変換関数を enum と同期させる手段が
ないこともない。
0560デフォルトの名無しさん
2007/10/16(火) 11:28:04---------------
AAA(Apple)
AAA(Orange)
....
---------------
#define AAA(aaa) aaa,
enum Fruit {
#include "Fruit.tbl"
}
#undef AAA
#define AAA(aaa) #aaa,
const char *FruitString[] = {
#include "Fruit.tbl"
};
0561デフォルトの名無しさん
2007/10/16(火) 11:37:18面白い方法だ
sed などを前提にしなくていいのがイイ!
0562デフォルトの名無しさん
2007/10/16(火) 11:40:13つ[ls /proc]
0563デフォルトの名無しさん
2007/10/16(火) 12:27:00× const char *FruitString[] = {
○ const char * const FruitString[] = {
0564デフォルトの名無しさん
2007/10/16(火) 21:51:06興味深い。
0565デフォルトの名無しさん
2007/10/16(火) 23:03:580566デフォルトの名無しさん
2007/10/16(火) 23:07:53このconstが2こついてるのがイマイチ意味が解らない
解りやすく教えてくれませんか?
0567デフォルトの名無しさん
2007/10/16(火) 23:12:53const char *p; // ポインタの指す先がconst
char *const q; // ポインタ自体がconst
const char *const r; // 両方const
*p = x; // NG
p = x; // OK
*q = x; // OK
q = x; // NG
*r = x; // NG
r = x; // NG
0568デフォルトの名無しさん
2007/10/16(火) 23:21:41なるほど。
簡潔な回答ありがとうございました
0569デフォルトの名無しさん
2007/10/16(火) 23:35:56配列になってる>>563のときはどうなるの?
配列の要素のポインタ全てがconstってことかな?
FruitString[0]
FruitString[1]
・
・
・
が指す先を変えられないってこと?
FruitString[1] = x; //NG ?
0570デフォルトの名無しさん
2007/10/16(火) 23:40:30そういうこと
0571デフォルトの名無しさん
2007/10/17(水) 02:23:04Cと同じように構造体を準備してするものですか?
構造体の代わりにクラスを準備しておいて
作るものですか?
0572デフォルトの名無しさん
2007/10/17(水) 02:24:05標準ライブラリの std::list を使います。
0573デフォルトの名無しさん
2007/10/17(水) 02:36:51早速のレスありがとうございます。
確認してみます。
0574デフォルトの名無しさん
2007/10/17(水) 15:28:23しかしコンストラクタが例外を投げても、配置構文deleteが呼ばれず
いきなりアボートしてしまいます。これは実装がC++標準に準拠してい
ないからでしょうか?Fedora Core4のg++とBorland bcc32です。
class Widget {
public:
//コンストラクタ(故意に例外を投げている)
Widget(int i = 0):mi(i){ cout << "Widget::Widget(int)" << endl; throw "reigai"; }
~Widget(){ cout << "Widget::~Widget()" << endl; }
//配置構文new
void* operator new(size_t s, int) throw(bad_alloc)
{
cout << "Widget::operator new(size_t, int)" << endl;
return ::operator new(s);
}
//対応する配置構文delete
void operator delete(void *p, int) throw()
{
cout << "Widget::operator delete(void *p, int)" << endl;
::operator delete(p);
}
};
int main()
{
Widget *p = new (1) Widget(3);
return 0;
}
0575574
2007/10/17(水) 15:55:56try catch構文で例外をキャッチしたら正しく呼ばれて
いました。表示のタイミングの問題だったようです。
VCとg++はOKでしたが、bccはやはりNGでした。
0576デフォルトの名無しさん
2007/10/18(木) 16:14:30bool F(bool b)
{
if(b){
return true;
}else{
return false;
}
//★
}
もれなくどちらかのreturn文が実行されることが確実な場合に、
★の位置にreturn文は書く必要はありますか?
(機能的に考えれば普通は書く必要は全く無いが、全ての処理系に対して
言語仕様の作法としてはどうあるべきかってことです)
0577デフォルトの名無しさん
2007/10/18(木) 16:37:19ない
むしろコンパイラの警告が出て鬱陶しくなる
0578デフォルトの名無しさん
2007/10/18(木) 17:05:45--
bool F(bool b)
{
if(b){
return true;
}
return false;
}
--
こうとか
--
bool F(bool b)
{
return b;
}
--
こう書かないか?
0579デフォルトの名無しさん
2007/10/18(木) 17:06:530580576
2007/10/18(木) 20:16:32なるほど。確かに優れたコンパイラであれば実行されないことに関して
ワーニングが出るかもしれないですね。
>>578
一番単純なサンプルコードを示しただけで戻り値がbool以外も考えてます。
前者の例でいくならelseでつなぐ方がコードの統一性が保たれるが良い気もしますが、
特に問題が無いということなので、あとはその辺りは個人次第ということですかね。
ありがとうございました。
0581576
2007/10/18(木) 20:17:30編集ミス。
0582デフォルトの名無しさん
2007/10/18(木) 23:21:36一時停止するのにgetchar()を使ってましたが、同様のことをC++でも
したいのですが、
int buf;
cin >> buf;
以外に良い方法はありますか?
0583デフォルトの名無しさん
2007/10/18(木) 23:49:56getchar();
0584デフォルトの名無しさん
2007/10/18(木) 23:54:49cin.get();
でいいよ。
0585デフォルトの名無しさん
2007/10/19(金) 00:23:22class CBase
{
public:
/** new */
void* operator new(std::size_t aSize) throw(std::bad_alloc);
/** delete */
void operator delete(void* aMemory) throw();
/** placement new */
void* operator new(std::size_t aSize, void* aPtr) throw();
/** placement delete */
void operator delete(void* aMemory, void* aPtr) throw();
};
Effective C++にあった配置newを試そうと上のクラスを作ってみたのですが、
BCBでコンパイルすると下記のエラーが出てしまいます
E2238 'CBase::operator delete(void *) throw()' の宣言が複数見つかった
ボス助けて
0586デフォルトの名無しさん
2007/10/19(金) 08:08:04#include <iostream>
#include <map>
#include <string>
class human{
private:
std::string name;
int age;
public:
human(std::string name, int age){ this->name=name; this->age=age; }
int getAge(void){ return age; }
std::string getName(void){ return name; }
};
typedef std::map< char* , human > clsmap_t;
int main(void){
clsmap_t clsmap;
human yosida("吉田", 21), mitui("三井", 20);
char buf[100];
clsmap.insert(clsmap_t::value_type("よっちゃん", yosida));
clsmap.insert(clsmap_t::value_type("みっちゃん", mitui));
std::cout << "あだ名を入力して下さい : ";
std::cin.getline(buf, sizeof(buf));
clsmap_t::iterator n = clsmap.find(buf);
if( n == clsmap.end() ) std::cout << buf << " not found." << std::endl;
else std::cout << n->second.getName() << " " << n->second.getAge() << std::endl;
return 0;
}
0587デフォルトの名無しさん
2007/10/19(金) 08:16:35○ typedef std::map< std::string , human > clsmap_t;
0588デフォルトの名無しさん
2007/10/19(金) 08:19:11http://pc11.2ch.net/test/read.cgi/tech/1190745673/366
0589デフォルトの名無しさん
2007/10/19(金) 08:22:410590586
2007/10/19(金) 08:26:50ありがとうございます
どうにか char* のままでできる方法を探しています
すみません。解決したかもしれません
下のように変更したら動作はしました
typedef std::map< char* , human > clsmap_t;
↓
typedef std::map< char* , human , bool (*)(const char *a, const char *b) > clsmap_t;
bool cmp(const char *a, const char *b){
return strcmp(a, b)<0;
}
clsmap_t clsmap;
↓
clsmap_t clsmap(cmp);
>>588 >>589
それは自分がしたものではないです
0591デフォルトの名無しさん
2007/10/19(金) 08:34:28std::string buf;
std::getline(std::cin, buf);
のほうが簡潔じゃね?
0592デフォルトの名無しさん
2007/10/19(金) 08:36:430593デフォルトの名無しさん
2007/10/19(金) 08:44:37出たw
0594デフォルトの名無しさん
2007/10/19(金) 13:12:31「オリジナルです」
「ジョンレノンという人は知りません。たまたま同じことを書いたのなら仕方ありませんね」
とか言い張る中学生を思い出した。
0595デフォルトの名無しさん
2007/10/19(金) 13:44:00なんでそんなことしたのか知らんけど
0596デフォルトの名無しさん
2007/10/19(金) 14:32:220597デフォルトの名無しさん
2007/10/19(金) 14:59:320598デフォルトの名無しさん
2007/10/20(土) 21:01:17void mprintf(const char*str,...)
{
char tmp[256];
va_list ap;
static int i=0;
va_start(ap,str);
vsprintf(tmp,str,ap);
sprintf(tmp,"%d,%s",i++,tmp);
printf("%s",tmp);
va_end(ap);
}
上記の関数を定義しmprintf()を任意の引数で呼び出すと、printfで出力する
ところの%s部分、tmpが表示されないです。若しくはバグってしまいます。
デバッガでtmpの内容を確認してみると、ゴミが混入しているらしいのですが、
どこか使い方間違っていますでしょうか?
0599デフォルトの名無しさん
2007/10/20(土) 21:04:39間違っています
tmp の指す領域を書き換えながら読み込んではいけません
0600598
2007/10/20(土) 21:15:25こんなことで一夜考えてました。
ありがとうございます。
0601デフォルトの名無しさん
2007/10/20(土) 22:23:30演算子でも予約語でもないですよね?
0603デフォルトの名無しさん
2007/10/20(土) 22:44:48; とか { } とかも別に演算子でも予約語でもないが普通に使ってるだろう
0604デフォルトの名無しさん
2007/10/20(土) 23:14:07可変個引数を使うための書式
catchやオーバーロード関数時は他の場合のどれにも当てはめていく場合
これを用いた物が最後になる。
Cにもあるんだけどな...
0605デフォルトの名無しさん
2007/10/21(日) 00:11:19...がdefineされてたような気がする
0606デフォルトの名無しさん
2007/10/21(日) 00:36:10#defineで?
マクロとして定義できるのって通常の識別子とおなじ形式だけじゃなかったっけ?
0607デフォルトの名無しさん
2007/10/21(日) 00:39:260608デフォルトの名無しさん
2007/10/21(日) 00:49:38void funcA(a&);
void funcB()
{
...
func(a(100));
...
}
このaのインスタンスの生存範囲はfuncBを抜けるまでという理解で正しいですか?
0609デフォルトの名無しさん
2007/10/21(日) 00:53:41func(a(100)); が終わるまで
0610デフォルトの名無しさん
2007/10/21(日) 00:54:03aのインスタンスはfuncAの呼び出しが終了すると同時に解体されます。
0611デフォルトの名無しさん
2007/10/21(日) 00:54:390612574
2007/10/21(日) 00:58:520613デフォルトの名無しさん
2007/10/21(日) 01:05:200614574
2007/10/21(日) 01:08:00JAVAの本見ると凄く簡単に見える
0615デフォルトの名無しさん
2007/10/21(日) 01:10:17class foo{
...
};
class bar{
foo f;
...
};
このような場合、barのfooに対する依存性が強いと考えられますが、OOP的には望ましくないのでしょうか?
特にfooがbarでしか用いられないような場合、fooをbarのインナークラスとして定義するべきなのでしょうか?
もしくは、この設計は全くもって適当でない、と判断すべきなのでしょうか。
0616デフォルトの名無しさん
2007/10/21(日) 01:16:04has a で is implemented in terms of 関係を実装するなら
普通にある形だと思いますけど。
0617デフォルトの名無しさん
2007/10/21(日) 01:23:00それだけの情報で何か判断できると思ってるのが間違い。
0618デフォルトの名無しさん
2007/10/21(日) 01:25:14ありがとうございます
特にfooがbarでしか用いられないような場合でも、わざわざインナークラス化する必要はないのでしょうか?
それと、答えてもらってなんなのですが、よく見直したら私の悩んでいることと先程の質問が少しずれていました……
すみませんが質問を訂正させていただきます
class bar;
class foo{
...
public:
void function(bar &b);
};
class bar{
foo f;
...
pubilc:
void dosome(){f.function(*this);}
};
このような場合、foo、barともに互いの存在を前提にしているわけですが、
やはり問題無いのでしょうか?
0619618
2007/10/21(日) 02:09:47曖昧な質問ですみません……
悩んでいるのは>>618の例で、
barがfooを持つことを前提とし、
fooがbarに持たれること(少なくともbarを関数の引数として受け取ること)を前提としている場合、
これは果たしていいのかどうか、ということです。
自分としてはそれぞれの独立性が損なわれるような気がして気持ち悪かったので、以下のような方法を考えました。
1.単純に、それぞれのクラス設計を適切に変更して独立性を確保する
2.fooクラスを分解してbarの実装として取り入れる
3.fooクラスをbarのインナークラスとする
1については適切な設計が思い浮かびませんでした
2については、クラスの分解ということでむしろOOPに逆行しているのでは、という躊躇いがありまして、
3はインナークラスを安易に用いるべきではないのでは、と考えて、やはり躊躇しています。
ここまで考えて、そもそもこれは直す必要があるのか、と考えて質問させていただいた次第です。
少なくとも>>618のような関係性だけでは、やはり「何とも言えない」程度なのでしょうか?
あれだけで不味いということは、ないのでしょうか。
0620デフォルトの名無しさん
2007/10/21(日) 02:13:07foo <-> hage <-> bar
0621デフォルトの名無しさん
2007/10/21(日) 02:36:37何とも言えない。そういう関連が必要になる実際の仕様があまり
思い浮かばないんだけど、仕様を見ずに否定もできない。
具体的な情報が出せないんなら相談は無理だと思われ。
0622618
2007/10/21(日) 02:46:17あ、その方法でちょっと関係性を練り直せば、何とかなるかもしれません
そんな方法すら思いつかなかった自分が恥ずかしい……
ありがとうございます。
>>621
イメージとしては、bar has a foo.で、
持ち物(メンバ)としてのfooが持ち主のbarに対して何らかの効果を及ぼす、って感じなんですが、あんまりないんですかね。
とりあえずなんとかなりそうなんで、質問を打ち切らせていただきます。
0623デフォルトの名無しさん
2007/10/21(日) 07:38:21言うは易し(ryだが、これに尽きるかと
0624デフォルトの名無しさん
2007/10/21(日) 09:04:03何かマジで仕事で書いてるプログラムじゃないか?
こんなとこで相談するんじゃなくて経験ある先輩に
聞けよ
0625デフォルトの名無しさん
2007/10/21(日) 12:22:060626デフォルトの名無しさん
2007/10/21(日) 12:23:570627デフォルトの名無しさん
2007/10/21(日) 13:19:18改善によってムダがなくなることが工数削減となり、金銭面で不利になることを嫌い改善を認めないのもよくある話。
そういう環境下では相談できる相手なんていないので独りぼっちになる。
0628618
2007/10/21(日) 13:30:280629デフォルトの名無しさん
2007/10/21(日) 13:33:590630デフォルトの名無しさん
2007/10/21(日) 14:19:35class B {
public:
~B( );
};
class D : public B {
public:
~D( );
};
のように基底クラスのデストラクタを仮想にしなくても
tr1::shared_ptr<B> にDクラスの動的オブジェクトを
格納すると、オブジェクトの解放時に正しくDのデストラクタが
呼ばれるのですがそういうものなんでしょうか?
コンパイラはg++です。
0631デフォルトの名無しさん
2007/10/21(日) 15:22:36T obj;
const T& ref = obj;
となっている場合、&refの型は const T* なのか、T* なのか
どちらでしょうか?
0632デフォルトの名無しさん
2007/10/21(日) 15:43:26参照はポインタではない。参照の挙動は実体と同じ。よってconst T
0633デフォルトの名無しさん
2007/10/21(日) 15:54:04int main()
{
int *p = malloc(sizeof(int));
return 0;
}
Cだとコンパイルできますが、C++だと型変換エラーで
コンパイルできませんでした。
mallocはvoidのポインタを返し、voidポインタは任意のポインタ
に代入可能なはずですが、何が違うのでしょうか?
0634デフォルトの名無しさん
2007/10/21(日) 15:56:26&refとすると、refが参照しているオブジェクトのアドレスを取得できる
と記憶してたのですが違いますか?
&refの型は少なくともポインタであるはずなのですが。
0635デフォルトの名無しさん
2007/10/21(日) 15:57:23voidポインタが暗黙のうちに型変換されて代入できてただけ
0636デフォルトの名無しさん
2007/10/21(日) 16:06:39ごめん、631の「 &ref 」を 「 T&ref 」と間違えて読んでいた。
ref の型は const T と同じ挙動だから const T*
0637デフォルトの名無しさん
2007/10/21(日) 17:01:39驚くべき事に shared_ptr<void> にしても正しいデストラクタが呼ばれる。
キーワードは deleter。
shared_ptr 生成時に正しいデストラクタを呼ぶ deleter も作成して shared_ptr の中で保持し、破棄時に呼び出している。
0638デフォルトの名無しさん
2007/10/21(日) 17:11:47なるほど。refの型に依存するわけですね。
ありがとうございました。
0639デフォルトの名無しさん
2007/10/21(日) 17:11:58そのデストラクタを記憶してるって事?
0640デフォルトの名無しさん
2007/10/21(日) 17:18:05CでもC++でも、仕様ではvoidポインタから任意のオブジェクトポインタへの
暗黙の型変換が可能だと思っていたのですが、Cでは認められていて
C++では認められていないということでしょうか?
(ANSI CとC++では仕様が異なる?)
0642デフォルトの名無しさん
2007/10/21(日) 17:28:120643デフォルトの名無しさん
2007/10/21(日) 18:29:07そうですよ。
0644デフォルトの名無しさん
2007/10/21(日) 18:34:01仕様が違うんですか。勉強になりました。
EffectiveのとおりだとするとC++ではstatic_castを使うわけですね。
int *p = static_cast<int*>(malloc(sizeof(int))
0645デフォルトの名無しさん
2007/10/21(日) 18:34:420646デフォルトの名無しさん
2007/10/21(日) 18:37:470647デフォルトの名無しさん
2007/10/21(日) 18:41:170648デフォルトの名無しさん
2007/10/21(日) 18:56:140649デフォルトの名無しさん
2007/10/21(日) 18:57:090650デフォルトの名無しさん
2007/10/21(日) 19:13:470651デフォルトの名無しさん
2007/10/21(日) 19:16:330652デフォルトの名無しさん
2007/10/21(日) 19:18:20wstring w = _T("青野晃です");
L Tの意味わかりますかか?
0653デフォルトの名無しさん
2007/10/21(日) 19:19:39_T() はVC++のマクロ。どう展開されるかは設定による。
0654デフォルトの名無しさん
2007/10/21(日) 19:20:020655デフォルトの名無しさん
2007/10/21(日) 19:24:090656デフォルトの名無しさん
2007/10/21(日) 19:25:37引用元に書いてあるだろ。
0657デフォルトの名無しさん
2007/10/21(日) 19:26:120658デフォルトの名無しさん
2007/10/21(日) 19:31:45やはり業務でC++を使いまくっているんですか?
0659デフォルトの名無しさん
2007/10/21(日) 19:32:490660デフォルトの名無しさん
2007/10/21(日) 19:33:160661デフォルトの名無しさん
2007/10/21(日) 19:35:47> 2ちゃんねらーなのに
麻生元幹事長も2ちゃんねらーだそうだよ。
>>645
wchar_tは実装依存なので、今のところはstd::string+UTF-8は
案外悪くないかもしれない。
UTF-16ベースのWindowsワールドでは微妙だけどな。
0662デフォルトの名無しさん
2007/10/21(日) 19:38:26#include <string>
#include <iostream>
using namespace std;
main(){
wstring w = L"青野晃です";
wcout << w << endl;
}
0663デフォルトの名無しさん
2007/10/21(日) 19:43:46あ、そう。よかったね^^
0664デフォルトの名無しさん
2007/10/21(日) 19:44:38wcoutって何?
0665デフォルトの名無しさん
2007/10/21(日) 19:46:43アホはだまっとけ
0666デフォルトの名無しさん
2007/10/21(日) 19:46:530667デフォルトの名無しさん
2007/10/21(日) 19:51:300668デフォルトの名無しさん
2007/10/21(日) 19:53:15std::wcout.imbue( std::locale("japanese") );
gccなら
::setlocale( LC_ALL, "ja_JP.utf-8" );
をoperator<<を使う前に実行すればできたようなできなかったような
0669デフォルトの名無しさん
2007/10/21(日) 19:54:000670デフォルトの名無しさん
2007/10/21(日) 19:56:110671デフォルトの名無しさん
2007/10/21(日) 19:56:30ワイド文字、文字セット、ロケールの関係?
僕もこのあたりよくわかりませんね。
0672デフォルトの名無しさん
2007/10/21(日) 19:58:33プログラムで別のものを指定すれば、環境変数LANGがja_JP.eucでも
問題ないのですか?
0674デフォルトの名無しさん
2007/10/21(日) 20:01:11環境変数LANGやLC_CTYPEに応じて設定して欲しい(WinならACPを見て欲しい)
んなら、単に空文字列を指定すればよいよ。
それが一番普通の使い方。
0675デフォルトの名無しさん
2007/10/21(日) 20:01:510676デフォルトの名無しさん
2007/10/21(日) 20:02:220677デフォルトの名無しさん
2007/10/21(日) 20:02:36もちろんシェルで表示できるロケールじゃないと当然のように文字化けはするがね
0678デフォルトの名無しさん
2007/10/21(日) 20:05:24読み込む文字種に依存しない、不都合がおこりにくい
0679デフォルトの名無しさん
2007/10/21(日) 20:09:20素直にそう思ってくれた方がここが安定する
一応標準なんだから素直に受け入れてみては如何?
0680デフォルトの名無しさん
2007/10/21(日) 20:12:320681デフォルトの名無しさん
2007/10/21(日) 20:15:070682671
2007/10/21(日) 20:25:29>>674
>>677
::setlocale(LC_ALL, "ja_JP.UTF-8");
wstring str = L"こんにちは";
wcout << str << endl;
これでうまく表示されました。よくわかってないですが感動しました。
0683デフォルトの名無しさん
2007/10/21(日) 20:43:39C++の標準に従うと、
locale loc("ja_JP.UTF-8");
locale::global(loc);
wstring str = L"こんにちは";
wcout << str << endl;
とするらしいですが(プログラミング言語C++)、
Linux環境(LANG=ja_JP.UTF-8)では正しく表示されました。
ソフトのローカライズ作業などでは、このようなこともするのでしょうか?
0684デフォルトの名無しさん
2007/10/21(日) 20:45:470685デフォルトの名無しさん
2007/10/21(日) 20:46:39ま、それなりにマルチプラットフォームに対応したければ、
バグだらけの実装の地雷を踏みまくることを覚悟汁。
cygwinのようにあまりにロケールまわりがヘボくて、
wstringは使えないという環境もあるよ。
そういうgochaを避けたければ、残念ながら現状ではstd::stringを
使ったほうがいい気もする。
0686デフォルトの名無しさん
2007/10/21(日) 20:49:18gotchaか?だとしても意味がよくわからないけど。
0687デフォルトの名無しさん
2007/10/21(日) 20:58:59ローカライズは難しい問題があるようですね
stringだけを使う場合はbasic_string<char>だから日本語は諦める
しかないですね。
0688デフォルトの名無しさん
2007/10/21(日) 21:01:31文字の区切りを自分で判定しないとダメだが、日本語を格納してはだめってことにはならんだろ。
0689デフォルトの名無しさん
2007/10/21(日) 21:02:59日本語のみならstringでもいいんじゃない?
0690デフォルトの名無しさん
2007/10/21(日) 21:09:13MSDOSで上位ディレクトリや自分のディレクトリを 点や点点で表現すると思うのですが、これを点「.」で比較すると一致しません
どんな文字と比較したら点と一致しますか
0691デフォルトの名無しさん
2007/10/21(日) 21:10:39一致しないプログラム貼りつけるとすぐ答えが返ってくると思う
0692デフォルトの名無しさん
2007/10/21(日) 21:12:38==ではなく、!strcmp()で比較しましょう。
とエスパー。
0693690
2007/10/21(日) 21:19:18#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std;
main(){
HANDLE hd;
WIN32_FIND_DATA fd;
system("mkdir test");
hd = FindFirstFile(".\\test\\*", &fd);
char ch[]=".";
do {
if(fd.cFileName!=ch){
printf("ファイル名: %s", fd.cFileName);
if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) printf("(ディレクトリ)");
printf("ファイルサイズ: %d\n", fd.nFileSizeLow);
}} while(FindNextFile(hd, &fd));
FindClose(hd);}
0694デフォルトの名無しさん
2007/10/21(日) 21:21:11プログラムなんて覚えようと思って始めた次の日には理解出来ずに止めてしまうのに
0695デフォルトの名無しさん
2007/10/21(日) 21:21:17>>692 の通りです
>>692
ビンゴ!
0696デフォルトの名無しさん
2007/10/21(日) 21:23:36お前には向いてなかったんだ。他のものを頑張れ
0697690
2007/10/21(日) 21:24:050698デフォルトの名無しさん
2007/10/21(日) 21:40:13そう言う時は嘘でも良いから励ませよ
それが心意気ってもんだろ、あばよ
0699デフォルトの名無しさん
2007/10/21(日) 21:42:37人間のリソースなんて限られてるんだから無駄遣いしちゃダメだってことさ
0700デフォルトの名無しさん
2007/10/21(日) 21:52:07「プログラムなんて」に微妙な上から目線を感じる。
0701デフォルトの名無しさん
2007/10/21(日) 22:01:19励ましたつもりだが?アホだから覚えられないんだよが本音
0702デフォルトの名無しさん
2007/10/21(日) 22:04:000703デフォルトの名無しさん
2007/10/21(日) 22:16:15chの文字列長を計るには、ループか、標準関数か、size()のどれが速いですか?
0704デフォルトの名無しさん
2007/10/21(日) 22:17:46コンストラクタに任せたらあかんの?
0705デフォルトの名無しさん
2007/10/21(日) 22:18:430706デフォルトの名無しさん
2007/10/21(日) 22:18:540707デフォルトの名無しさん
2007/10/21(日) 22:23:17まずはstd::stringにどういうコンストラクタがあるか調べて来い。
0708デフォルトの名無しさん
2007/10/21(日) 22:27:19シリアライズを使わない方法をやっているのですが、SetModifiedFlag();をしたときだけなぜかシリアライズのほうが実行されるのですが
回避する方法はありますか?
0709デフォルトの名無しさん
2007/10/21(日) 22:27:23sizeof(ch)/sizeof(char)
ってそういう話じゃないか……
strlenでも使えば?
0710デフォルトの名無しさん
2007/10/21(日) 22:31:33>>707 やり方わからないですがコンストラクタk速いですか?
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
#define N 10000
#define M 300000000
main(){
char c[N];
int n,x,k,cl;
for(n=0;n<N-1;n++)c[n];c[N]='\0';
string s=(string)c;
x=0;cl=clock();for(n=0;n<M;n++)x+=strlen(c);cl=clock()-cl;cout<<cl<<endl;
x=0;cl=clock();for(n=0;n<M;n++)x+=s.size();cl=clock()-cl;cout<<cl<<endl;
x=0;cl=clock();for(n=0;n<M;n++){for(k=0;c[k]!='\0';k++);x+=k;}cl=clock()-cl;cout<<cl<<endl;
}
0711デフォルトの名無しさん
2007/10/21(日) 22:31:38strcmpとかってつかえないんだっけ?
あとは.Formatとかは?
0712710
2007/10/21(日) 22:32:420713デフォルトの名無しさん
2007/10/21(日) 22:47:34スタティックテキストの背景だけデフォルトの色のままです。
スタティックテキストの背景も同じ色になってほしいのですが、
透明にする方法はないでしょうか??
0714デフォルトの名無しさん
2007/10/21(日) 22:59:58OnCtlColor関数をオーバーライドしたら、できそうです。
0715デフォルトの名無しさん
2007/10/22(月) 00:09:48実はプログラミングがあまり好きではない人いる?
0716デフォルトの名無しさん
2007/10/22(月) 00:13:50好きなのじゃなけりゃ、勉強でも仕事でも
そう長続きはしないだろうけど
0717デフォルトの名無しさん
2007/10/22(月) 00:18:55時間忘れて勉強できますか?自分は30分くらいで休憩
してしまいます。
0718デフォルトの名無しさん
2007/10/22(月) 00:21:290719デフォルトの名無しさん
2007/10/22(月) 00:23:45自分は30分単位で休憩をはさむと覚えられない
本読んで、書いてみて、動作させて、弄って、また動作させてだから
始めると 1 時間は続ける
0720デフォルトの名無しさん
2007/10/22(月) 00:29:570721デフォルトの名無しさん
2007/10/22(月) 00:37:29年齢にもよるだろうけど、若いうちはうっかり20時間くらい
飲まず食わずで続けちゃったりしない?
0722デフォルトの名無しさん
2007/10/22(月) 00:43:15集中の仕方は人それぞれだと思うんだが、30分はちと短いな。
ふつうは集中してフロー状態に入るまでにそれなりの暖気運転=時間を要する
ものなので、それだと効率が悪すぎる。
多分君は、そこまで行っていないんだろうね。
夢中になれるほど好きでなければやっていけない、というものでも無いとは
思うが、好きなほうが有利なことは確かだねえ……。
0723デフォルトの名無しさん
2007/10/22(月) 00:44:05さすがにトイレには行ったけど、学生時代にそんな感じでやってたことあるよ。
三十路を過ぎた今ではもう無理だorz
というか働くようになると、趣味としてのプログラミングに避ける時間が少ない。
0724デフォルトの名無しさん
2007/10/22(月) 00:44:520725デフォルトの名無しさん
2007/10/22(月) 01:10:510726デフォルトの名無しさん
2007/10/22(月) 06:27:000727デフォルトの名無しさん
2007/10/22(月) 07:05:090728デフォルトの名無しさん
2007/10/22(月) 07:18:490729デフォルトの名無しさん
2007/10/22(月) 07:38:28ttp://marupeke296.com/DXCLS_Impliment_Smart_ptr.html
のソースを読んでいてデフォルトコンストラクタの引数の"=NULL"の部分が理解できません
変な質問ですみません
0730デフォルトの名無しさん
2007/10/22(月) 08:54:48デフォルト引数
0731デフォルトの名無しさん
2007/10/22(月) 09:21:36ガッ
なんか ごめん
0732デフォルトの名無しさん
2007/10/22(月) 10:46:17理解できましたありがとうございます
>>731
PO
0733デフォルトの名無しさん
2007/10/22(月) 18:09:41嫌いでも楽に理解出来るから仕方なくやってる奴だって居るけどな
好きな事をやってる奴なんてこんな世界には殆ど居ないよ
0734デフォルトの名無しさん
2007/10/22(月) 18:23:20まず自分にとって心地よいかどうか。
次に心地悪くても、論理的に自分にとっての利益となるなら我慢する。
心地よいことも続けてるとそうではなくなる。
我慢できてることも続けてるとそうではなくなる。
バランスが変わると行動の代わり時。
0735デフォルトの名無しさん
2007/10/22(月) 18:36:17自分より下だと思った奴を見下したい
自分と同レベルのキモオタと馴れ合って現実逃避したいから2chやってるんだろ
上を見る奴は2chなんか来ないし
0736デフォルトの名無しさん
2007/10/23(火) 01:26:05それは君の信念であって、他の人間がどういう風に2chと接しているかはわからないよ。
君もプログラマの端くれなら、データも取らずに「大きな結論」に走っちゃいけないよ。
0737デフォルトの名無しさん
2007/10/23(火) 23:31:50長いからソースほとんど省くけど、
#define BYTE_SLIDE(a,n) *((char*)(a)+(n))
int x[100];for(i=0; i<M; i++) x[i]=0x01010101;c = clock();
for(i=0,y=0; i<10000; i++) //Test1
for(j=0; j<100*sizeof(int); j++) y+=BYTE_SLIDE(x,sizeof(char)*j);
c = clock() - c;
printf("Test1-A:%d*%d*%d=%u,time=%.4f\n",10000,100,sizeof(int),y,(double)c/CLOCKS_PER_SEC);
y=0x01010101;c = clock(); //Test2
for(i=0,z=0; i<1000000*sizeof(int); i++) z+=BYTE_SLIDE(&y,sizeof(char)*(j%sizeof(int)));
c = clock() - c;
printf("Test2-A:%d*%d=%u,time=%.4f\n",1000000,sizeof(int),z,(double)c/CLOCKS_PER_SEC);
こんな感じのをそれぞれの方法について。以下結果。むらがあったんで1000回平均。
Test1-A:Average is 0.012961. //上記
Test1-B:Average is 0.012788. //((char*)x)[j]
Test1-C:Average is 0.025887. //ビットシフト
Test2-A:Average is 0.016863.
Test2-B:Average is 0.020827.
Test2-C:Average is 0.024504.
Test2-D:Average is 0.015565. //剰余でなく繰り返しで。方法はBと一緒。
当たり前なのかもしれないけど、わざわざビットシフトするよりポインタアクセスのが速いんだね。
(Test1-Cは添字アクセス経由してるから当たり前としても)
それと剰余よりも単純繰り返しのが速い。もしかして常識?
0738デフォルトの名無しさん
2007/10/24(水) 18:27:12scanfで数値を読み込む動作を他の入力関数で置き換えようと思っているのですが
stdinからfgetsで読み込んでから数値等に変換しようと思っています。
もっと良い方法はありますでしょうか?
0739デフォルトの名無しさん
2007/10/24(水) 19:32:13どんな入力なのか内容について詳しく
1行について一つの数値だけなのか、複数あるのか
数値ではないものが来た時に読み飛ばして続けるのか、終了するのか
などなど
0740デフォルトの名無しさん
2007/10/24(水) 20:48:51fgetsが最善の方法です
0741デフォルトの名無しさん
2007/10/24(水) 21:49:44Always , "getchar()" is the best way!!
いいえ!
常に、"getchar()"が最良の方法です!!
0742デフォルトの名無しさん
2007/10/25(木) 13:46:13文字リテラル中のダブルクォーテーションも\でエスケープすべきなのでしょうか?
0743デフォルトの名無しさん
2007/10/25(木) 14:05:520744デフォルトの名無しさん
2007/10/25(木) 14:22:48了解です。
レスありがとうございました。
0745デフォルトの名無しさん
2007/10/26(金) 13:48:04変化しないパラメータをbindを使って固定しようとしました
IDirect3D9 *pD3D = /**/;
// 固定するパラメータ
HWND hwnd = /**/;
D3DPRESENT_PARAMETERS* param = /**/;
IDirect3DDevice9** dev = /**/;
// bind
boost::bind/*<UINT>*/
(&IDirect3D9::CreateDevice, pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, param, dev)();
これだとなんかうまくいかないので上のコメント部分を外して戻り値の型を明示的に指定してやると
>error C2064: 7 引数を取り込む関数には評価されません。
どうにかうまくできませんかね?
0746745
2007/10/26(金) 14:01:46またD3DVTYPE_REFやD3DCREATE_SOFTWARE_VERTEXPROCESSINGは
boost::lambdaのプレースホルダにする予定です。
「このようにパラメータを与えたbindから生成される関数オブジェクトに、
D3DTYPE_やD3DCREATE_等の定数を放り込んで、
環境に合わせて適切なDirect3Dデバイスを生成するルーチンを簡単に書きたい」
というのが目的です。
0747デフォルトの名無しさん
2007/10/26(金) 14:18:46こんな感じだけど入社できる会社はありますか?
0748745
2007/10/26(金) 14:28:33ttp://boost.cppll.jp/HEAD/libs/bind/bind.html#stdcall
ここ参考に定数を#defineしてやれば通りました
0749デフォルトの名無しさん
2007/10/26(金) 20:40:44マジレスすると技術しだい
0750デフォルトの名無しさん
2007/10/27(土) 10:02:47Visual C++ 2008のβを入れてみました。
APIをやりつつMFCも触ってます。
そこで、6.0はMFCプロジェクトを
新規作成→MFC APP(exe)
で作れたのですが2008では
windowsコンソールアプリ
API32コンソールアプリ
どちらにすればいいのか・・・・
二つの違いがサッパリ分かりません!!
こんな初心者に違いを教えて下さい
0751デフォルトの名無しさん
2007/10/27(土) 10:44:000752デフォルトの名無しさん
2007/10/27(土) 10:59:030753デフォルトの名無しさん
2007/10/27(土) 17:12:57//WARNING: This will destroy the contents of the input array
//This function assumes input.length=2^n, n>1
int[] output = new int[input.length];
for(int length = input.length >> 1; ; length >>= 1){
//length=2^n, WITH DECREASING n
for(int i = 0; i < length; i++) {
int sum = input[i*2]+input[i*2+1];
int difference = input[i*2]-input[i*2+1];
output[i] = sum;
output[length+i] = difference;
}
if (length == 1)
return output;
//Swap arrays to do next iteration
System.arraycopy(output, 0, input, 0, length<<1);
}
}
ここで聴いていいのかアレなのですが
このJAVAのソースをCに直したいのです、、、俺に力を!!!!!!!!11
0754デフォルトの名無しさん
2007/10/27(土) 17:25:46int[] をCではどう書けばいいのかわかりません、って話ならmalloc使えって話だし、
arraycopy の代わりは?って話ならmemcpyでも使ってみたら、とかかな。
Cってなんですか?ポインタってなんですか?なら無理すんなとしか言えない。
0755デフォルトの名無しさん
2007/10/27(土) 17:27:48そうじゃないなら具体的にどこがわからないのか書くべきだな
0756デフォルトの名無しさん
2007/10/27(土) 17:28:38>arraycopy の代わりは?って話ならmemcpyでも使ってみたら、とかかな。
まさしくそのとおりです!!!!
int[]って何よ?おいしいの?JAVAシネやって感じでした!!!
> for(int length = input.length >> 1; ; length >>= 1){
このfor文もなにやってんだかさっぱりです!
C最高!!!わかりやすいのに!JAVAしねやJAVAくそまんこ!!!
0757デフォルトの名無しさん
2007/10/27(土) 17:29:21でもこっちでも回答ください!!!!みんな大好き!
0758デフォルトの名無しさん
2007/10/27(土) 17:35:120759デフォルトの名無しさん
2007/10/27(土) 17:35:19マルチ野郎
0760デフォルトの名無しさん
2007/10/27(土) 17:37:160761デフォルトの名無しさん
2007/10/27(土) 17:58:240762デフォルトの名無しさん
2007/10/27(土) 18:18:18GCC4です。コンパイラ、リンカはg++を使っています。
そのままCの共有ライブラリをリンクしようとしてもうまくいかないの
ですが、なにか手順が必要なのでしょうか?
0763デフォルトの名無しさん
2007/10/27(土) 18:19:230764デフォルトの名無しさん
2007/10/27(土) 18:24:07C++の共有ライブラリにあるシンボルが、未定義であるっていう
エラーメッセージです。例えば、libmy.soがCのライブラリで、
myfuncという関数があるとして、nmでlibmy.soのシンボルを
表示させても、きちんとmyfuncというのがあります。
libmy.soはgccでコンパイル、アーカイブしています。
で、c++のソースコードをg++でコンパイル、リンカ指定で
-lmyすると、リンクするときに
"undefined reference to symbol myfunc"となります
0765デフォルトの名無しさん
2007/10/27(土) 18:28:31どうせ extern "C" が抜けてるんだろ。
0766デフォルトの名無しさん
2007/10/27(土) 18:29:28エラーメッセージもコンパイル時のコマンドラインもコピペしろ。
手で書くと余計な解釈や思い込みが混ざる。
0767デフォルトの名無しさん
2007/10/27(土) 18:30:13おっしゃるとおりでした!
ありがとうございました。
0768デフォルトの名無しさん
2007/10/27(土) 18:35:39オブジェクトファイルが作成されるんではなかったっけ?
ライブラリなら#ifdef __cplusplus マクロの指定が必要とか
0769デフォルトの名無しさん
2007/10/27(土) 18:37:48extern "C" が原因なら undefined reference で表示されるシンボルは
myfunc じゃなくてもっとキモイやつだったはずだ。
0770769
2007/10/27(土) 18:38:570771デフォルトの名無しさん
2007/10/27(土) 21:20:55なってるはず
0772デフォルトの名無しさん
2007/10/27(土) 21:43:48gcc「ごめんよ。母さん、お前のためを思って、頑張っていい名前を考えたんだけど…。ゴメンね。」
ln「お前の名前には、ちゃんと立派な意味があるんだ。『人』には理解されにくいかもしれないが、いつかきっと分かってもらえる。
父さんたちを信じて、もっと自信を持て。」
0773デフォルトの名無しさん
2007/10/27(土) 21:49:510774デフォルトの名無しさん
2007/10/27(土) 22:05:30例外処理外してコンパイルしないとパフォーマンス落ちないか?
0775デフォルトの名無しさん
2007/10/27(土) 22:08:47巻き戻しの処理入るんだから
0776デフォルトの名無しさん
2007/10/27(土) 22:12:59いいよなぁ羨しいよ
0777デフォルトの名無しさん
2007/10/27(土) 22:16:020778デフォルトの名無しさん
2007/10/27(土) 22:44:23newは失敗してもbad_alloc投げなくなりますか?
0779デフォルトの名無しさん
2007/10/27(土) 22:44:44速度は実測が基本。
例外を実際に投げない限りは速度にペナルティの無い実装もある。
0780デフォルトの名無しさん
2007/10/27(土) 22:45:46標準の動作じゃないから、コンパイラのマニュアル嫁。
0781デフォルトの名無しさん
2007/10/27(土) 23:03:17第三者が横から質問ですが、vc2005の場合はその速度に影響のない実装なんでしょうか?
0782デフォルトの名無しさん
2007/10/27(土) 23:18:59実測しろよw
0783デフォルトの名無しさん
2007/10/27(土) 23:20:240784デフォルトの名無しさん
2007/10/28(日) 00:30:59gccの場合、-fno-exceptionsでコンパイルしてもnewは例外投げるよ。
例外が投げられると即死する実行ファイルができるだけ。
0785デフォルトの名無しさん
2007/10/28(日) 01:33:02bool b[1000]={false};
で、要素0以外の値がfalseで初期化されることは保障されていますでしょうか?
0786デフォルトの名無しさん
2007/10/28(日) 01:35:34false==0だろうから問題無いと思うけど
0787デフォルトの名無しさん
2007/10/28(日) 01:38:29心配ならBOOST_STATIC_ASSERT(false == 0); でも入れておけば。
0788デフォルトの名無しさん
2007/10/28(日) 12:54:06配列の要素の指定されていない部分が0で補完される仕様と、
bool型のfalseがint型の0と互換性がある仕様二つから保障されているということですね。
>>787
BOOSTライブラリですか。検討してみます。
ありがとうございました。
0789デフォルトの名無しさん
2007/10/28(日) 14:05:04それで、各ノードにポインタ配列を用意して、各文字列別の遷移先を作りました。
しかし、そこの遷移先のチェックのif(prevNode->next[c]==NULL)で実行時にエラーが出てしまいます。
NULLかどうかのチェックも確認出来ないのでしょうか?ポインタ配列として宣言してるので、ポインタそのものの領域はあるはずなのですが…。
ソースはこんな感じです。
typedef struct NODE{
char c;
int *p_freqList;
NODE *next[MAX_CHAR];
}NODE;
typedef struct{
NODE *root;
int freqList[MAX_WORD];
}GLOBAL_DATA;
GLOBAL_DATA g_data;
void initFreq(){
memset(g_data.freqList, -1, sizeof(int)*MAX_WORD);
g_data.root=(NODE *)malloc(sizeof(NODE));
}
NODE *addNode(unsigned char c, NODE *prevNode){
if(prevNode->next[c]==NULL){ ←ここで問題発生
prevNode->next[c]=(NODE *)malloc(sizeof(NODE));
memset(g_data.root->next,NULL,sizeof(NODE*)*MAX_CHAR);
}
return prevNode->next[c];
}
0790789
2007/10/28(日) 14:05:54if(prevNode->next[0]==NULL){
prevNode->next[0]=(NODE *)malloc(sizeof(NODE));
prevNode->next[0]->c='\0';
for(int i=0; i<MAX_WORD; i++){
if(g_data.freqList[i]==-1){
prevNode->next[0]->p_freqList = &g_data.freqList[i];
break;
}
}
}
*(prevNode->next[0]->p_freqList)++;
return prevNode->next[0];
}
void addStr(char *str){
int i=0;
NODE *node=g_data.root;
while(*(str+i)!='\0'){
node=addNode(*(str+i), node);
i++;
}
addLeaf(node);
}
Cは、久しぶりに触ったので、色々忘れてる部分も多く、問題が多いと思いますが
どうぞ、よろしくお願いします。
0791デフォルトの名無しさん
2007/10/28(日) 14:54:330792789
2007/10/28(日) 15:01:43レスありがとうございます。
とりあえず、>>789-790は、trie.hと言うファイルに記述されていて
main.cppに
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "trie.h"
int main(void){
char str[1024];
initFreq();
while(1){
scanf("%s", str);
if(str[0]=='q')
break;
addStr(str);
}
}
と言う形でTrieへの追加の実験コードを書きました。
例えば、"abc"と入力した所
bの追加の処理中に、NULLとの比較でエラーが出ます。
よろしくお願いします。
0793デフォルトの名無しさん
2007/10/28(日) 15:08:54#define MAX_CAHR 255?
#define MAX_WORD ???
この辺りが不明だけど、
ま、いいでしょう。
で、問題の箇所だが、2文字目ってのがわからん。
普通に1文字目からエラーが出るはずだが・・・
1.今のノード=ルート
2.今のノードの次のノードを参照し、入力文字を辿る←この時点で、次のノードの領域確保なんてしてるの?
0794デフォルトの名無しさん
2007/10/28(日) 18:29:17class Foo;
struct Bar;
あとこれとか
void function(class FooClass *ptr);
とあるけど,これなんと呼ぶのでしょう?
ある名前が,こいつはクラス・構造体だぜって宣言してるのは判るんですが
0795デフォルトの名無しさん
2007/10/28(日) 18:32:040796デフォルトの名無しさん
2007/10/28(日) 18:32:56class Foo;
は前方宣言。
class FooClass だけだと elaborated-class-name とかいうんだけど、
日本語での呼び方はしらない。
0797デフォルトの名無しさん
2007/10/28(日) 18:35:180798デフォルトの名無しさん
2007/10/28(日) 18:36:220799デフォルトの名無しさん
2007/10/28(日) 18:38:14ドンマイ
0800デフォルトの名無しさん
2007/10/28(日) 18:38:18うほ早!サンクス
呼び方が判らなくて正しい使い方が調べられなかったのです.
0801デフォルトの名無しさん
2007/10/29(月) 00:23:41struct Bar{
typedef Foo_ Foo;
};
こういうことは出来ないのでしょうか?
enumじゃなくてstructならできるんですが…
0802801
2007/10/29(月) 00:24:500803801
2007/10/29(月) 00:52:38namespace NA{
enum Foo{A,B,C};
struct Inner{
Foo_ foo;
};
}
namespace NB{
struct Bar{
typedef NA::Foo Foo;
typedef NA::Inner Inner;
void test(){
Inner f;
f.foo = NA::A;//←本当は、Aと書きたい
}
};
}
この願いは、無理でしょうか?
Visual C++ 2005 で試しました。
0804デフォルトの名無しさん
2007/10/29(月) 01:10:41using namespace NA;
0805801
2007/10/29(月) 01:19:47using namespace NA;
(略)
};
だとエラーになってしまいます。
namespace NB{
using namespace NA;
struct Bar{
(略)
};
}
だとOKですがこれでは名前空間を分けた意味がありません。
無理ってことですかね…
0806デフォルトの名無しさん
2007/10/29(月) 01:21:30using NA::Foo;
using NA::A;
using NA::B;
using NA::C;
using NA::Inner;
0807デフォルトの名無しさん
2007/10/29(月) 13:33:200808デフォルトの名無しさん
2007/10/29(月) 13:55:56usingディレクティブをクラス定義のなかに入れることは違反。
クラス定義のなかのusing宣言は基底クラスの識別子に対してのみ使用可能
namespace NB{
//ここに>>806のusing宣言
struct Bar{
(略)
};
}
で可能。
0809デフォルトの名無しさん
2007/10/29(月) 20:50:41汎整数拡張
でググるんだ
0810デフォルトの名無しさん
2007/10/30(火) 01:05:38としたときに、
なんで int*じゃなく、intのみが全ての変数名a,b,cに係るのですか?
0811デフォルトの名無しさん
2007/10/30(火) 01:10:11int* は一つの予約語じゃなくてintと*の二つからなるから。
0812デフォルトの名無しさん
2007/10/30(火) 01:12:00です
0813デフォルトの名無しさん
2007/10/30(火) 01:12:360814デフォルトの名無しさん
2007/10/30(火) 01:40:42そういう構文規則になっているから。
0815デフォルトの名無しさん
2007/10/30(火) 02:45:150816デフォルトの名無しさん
2007/10/30(火) 02:46:40intp a,b,c;
0817810
2007/10/30(火) 03:06:39全てに係るXXXってどんなの?
組み込み型は該当するのは知っています。
0818デフォルトの名無しさん
2007/10/30(火) 06:20:52>>811が言うように「2つからなる」のがこの場合の原因だから、
「1つからなる」ものは何であれすべてにかかるよ。
0819デフォルトの名無しさん
2007/10/30(火) 09:17:07とするとtype_infoのポインタが取れますが、
そのアドレスが一意であるかは処理系依存でしょうか?
0820デフォルトの名無しさん
2007/10/30(火) 12:24:44メールのcharsetがISO-2022-JP(つまりはJISなのかな)のようで、
strstrで文字列検索を行いたいのですが、うまくマッチしません。
Visual C++ 2005の標準charsetはShift_JISなのでしょうか。
#define MOJI "マッチさせたい文字"
void Myfunction(〜){
char c_text[MAX_TEXT];
bka.GetText(c_text, 65536); //メール本文のテキストを得る
LPSTR sjtext;
sjtext = bka.ISO_2022_JP(c_text, FALSE); //メール本文のテキストをShift_JISに変換
if (strstr(sjtext, MOJI) != NULL){
//マッチしたときの処理
}else{
//マッチしないときの処理
}
}
MOJIを含むメール本文の場合にも、マッチしないときの処理になってしまいます。
どうかお力をお貸し下さい。
0821デフォルトの名無しさん
2007/10/30(火) 12:33:03UTF-8だと思う。
0822デフォルトの名無しさん
2007/10/30(火) 12:56:51ソースコードのエンコーディングは?
日本語版のVC++なら、デフォはシフトJIS(CP932)だよ。
BOMつきならUnicode(UTF-8, UTF-16)のソースも食える。
それ以外は駄目だ。
VC++にはgccのexec-charsetオプションのようなものは無いので、
非ワイド文字リテラルは、ソースのエンコーディングそのままに
メモリに格納される。
よって、文字列をリテラルと直接比較したいのなら、リテラルの
エンコーディング=ソースコードのエンコーディングに合わせなければ駄目だ。
0823820
2007/10/30(火) 13:31:20ほんとにごめん。
bka.GetTextにおいて、メールが選択されてなかった…。
きちんと選択してShift_JIS1に統一したらマッチしました。
ほんとにごめん。
0824デフォルトの名無しさん
2007/10/30(火) 19:01:21#include <stdio.h>
struct data{ int a[25]; }d;
int main(void)
{
struct data *ptr;
int i;
ptr=&d.a[0]; //ptr にa[0]のアドレスを格納
for(i=0;i<=25;i++)
{
scanf("%d",ptr);
ptr++;
}
for(i=25;i>=0;i--)
{
printf("%d \n",ptr->a[i]);
}
return 0;
}
上記のソースをコンパイルしようとすると一応コンパイルできるのですが、警告がでます。
出来上がった実行ファイルを実行すると途中でエラーが出てしまいます (;´Д`)
自分ではどこがおかしいのか分かりません。というか、構造体やポインターがイマイチよく分かってません;;
お手数かとは思いますが、エラーがでる原因や誤り等を教えて下さい。よろしくお願いします。
OS: WindowsXP HomeEdition , コンパイラー: bcc32
0825デフォルトの名無しさん
2007/10/30(火) 19:04:28○ ptr=&d; //ptr にdのアドレスを格納
× for(i=0;i<=25;i++)
○ for(i=0;i<25;i++)
× scanf("%d",ptr);
× ptr++;
○ scanf("%d",&ptr->a[i]);
× for(i=25;i>=0;i--)
○ for(i=24;i>=0;i--)
0826デフォルトの名無しさん
2007/10/30(火) 19:04:28struct data *ptr;
↓
int *ptr;
0827デフォルトの名無しさん
2007/10/30(火) 19:18:33ありがとうございます!!
0828デフォルトの名無しさん
2007/10/30(火) 19:25:400829デフォルトの名無しさん
2007/10/30(火) 19:27:14->と同じだと思うんで。
0830デフォルトの名無しさん
2007/10/30(火) 20:13:48GetCurrentDirectoryだと、現在作業しているディレクトリを返してしまい、
自身のディレクトリが返ってきません。
なにか取得する方法はないものでしょうか?
0831デフォルトの名無しさん
2007/10/30(火) 20:20:04少なくともおいらのライブラリにはあるぞw
0832デフォルトの名無しさん
2007/10/30(火) 20:22:38FAQレベルの質問だからググれ
0833デフォルトの名無しさん
2007/10/30(火) 20:23:59つまり貴方はこう仰りたいのですね。
--
自分の環境も書かずに質問するんじゃねぇよこの馬鹿!
0834デフォルトの名無しさん
2007/10/30(火) 20:25:180835デフォルトの名無しさん
2007/10/30(火) 20:35:46>少なくともおいらのライブラリにはあるぞw
0836デフォルトの名無しさん
2007/10/30(火) 20:39:350837デフォルトの名無しさん
2007/10/30(火) 20:40:460838デフォルトの名無しさん
2007/10/31(水) 02:50:14#include <string>
#include <iostream>
struct {
std::string operator()() {
return "aaa";
}
} aaa;
struct {
std::string operator()() {
return "bbb";
}
} bbb;
int main(int ac, char** av) {
std::cout << aaa() << bbb() << std::endl;
return 0;
}
main.obj : fatal error LNK1179: ファイルが無効か、または壊れています: COMDAT '??R<unnamed-tag>@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ' を複製します。
0839デフォルトの名無しさん
2007/10/31(水) 02:52:180840デフォルトの名無しさん
2007/10/31(水) 03:11:27VC m9(^Д^)プギャーーーッ
0841デフォルトの名無しさん
2007/10/31(水) 03:11:39VC8.0でも同様のエラーになった。
C++の規格書を読まないと詳しい事は分からないけど、無名の
構造体(この場合はクラス)を2つ以上作ると出るリンカエラーみたいだね。
0842デフォルトの名無しさん
2007/10/31(水) 03:13:320843デフォルトの名無しさん
2007/10/31(水) 03:17:320844デフォルトの名無しさん
2007/10/31(水) 03:20:38本当?俺の所はだめだったぞ
0845デフォルトの名無しさん
2007/10/31(水) 03:36:010846デフォルトの名無しさん
2007/10/31(水) 04:21:561行目を全部読み込まないと出来ませんか?
0847デフォルトの名無しさん
2007/10/31(水) 04:25:271行が16000文字以下あったとして、初めの20文字読んだら次の行へ移動したいとき
1行目を全部読み込まないと出来ませんか?
0848デフォルトの名無しさん
2007/10/31(水) 04:25:28C++ならseekg
0849デフォルトの名無しさん
2007/10/31(水) 04:26:07そりゃ無理だ
次の行へのオフセットでも記録してあれば別だけど
0850デフォルトの名無しさん
2007/10/31(水) 05:14:53となると高速で読み込んで、\nを探すしかないですかね
0851デフォルトの名無しさん
2007/10/31(水) 05:17:390852デフォルトの名無しさん
2007/10/31(水) 05:26:23aaa, bbb に static つけたらどうなる?
0853デフォルトの名無しさん
2007/10/31(水) 06:08:39通常の配列の代わりにvector使うとアクセスにオーバーヘッドかかるもんでしょうか?
malloc時間は無視するとして。
関数に配列を渡すときはvectorでスッキリさせたいとこですが、
効率を最優先する場合はCプログラミング的なコーディングが結局は最良ですかね?
0854デフォルトの名無しさん
2007/10/31(水) 06:33:29ところどころでチェック入れられる可能性が怖いんなら
吐かれたコードを比較して検討すればよろし。
0855デフォルトの名無しさん
2007/10/31(水) 06:39:440856デフォルトの名無しさん
2007/10/31(水) 07:24:46確保する時点でサイズが判明しているならnewで
あまりに確保するサイズ小さいときは配列でもvectorでもnewでもいい
0857デフォルトの名無しさん
2007/10/31(水) 07:26:15かなりでかいサイズ、たとえば200M程度とかなら210Mほどnewで確保する
0858853
2007/10/31(水) 08:02:20ちょっと簡単に比較用のプログラム書いてみたんですが、
うーん、はっきり差はわかりませんねぇ。
必要な配列サイズはたかだか30kbくらいなんですが、
頻繁にアクセスが必要で処理速度も重要になる部分でしたので、
効率がどんなものか気になってました。
ソースの他の部分は基本的にvectorで渡しているので、
できるだけ統一させたいというのもあって、さて、どうしようか・・・という感じです。。
まぁ、ほとんど変わらないならvectorにしとこかな。
0859デフォルトの名無しさん
2007/10/31(水) 08:06:21実測が
基本
0860デフォルトの名無しさん
2007/10/31(水) 08:06:220861STLは時間かかる
2007/10/31(水) 08:09:10#include <string>
#include <time.h>
using namespace std;
string qq="bfhbtfbhfgbhfww\nqqqq";
char pp[]="bfhbtfbhfgbhfww\nqqqq";
inline int f(){ return qq.find("\n");}
int g(){ return qq.find("\n");}
int h(){ int i; for(i=0;pp[i]!='\0';i++)if(pp[i]=='\n')break;return i;}
main(){
int n,N,c;
N=0;c=clock();for(n=0;n<70000000;n++)N+=f();
c=clock()-c;cout<<"STL+インライン関数call "<<c<<"m秒\nsum= "<<N<<endl;
N=0;c=clock();for(n=0;n<70000000;n++)N+=qq.find("\n");
c=clock()-c;cout<<"STL+埋め込み "<<c<<"m秒\nsum= "<<N<<endl;
N=0;c=clock();for(n=0;n<70000000;n++)N+=h();
c=clock()-c;cout<<"char型自作関数call "<<c<<"m秒\nsum= "<<N<<endl;
N=0;c=clock();for(n=0;n<70000000;n++){
int i; for(i=0;pp[i]!='\0';i++)if(pp[i]=='\n')break;N+=i;}
c=clock()-c;cout<<"char型自作埋め込み "<<c<<"m秒\nsum= "<<N<<endl;}
0862デフォルトの名無しさん
2007/10/31(水) 08:37:360863デフォルトの名無しさん
2007/10/31(水) 08:39:47あーmsvc用のコマンドラインプロファイラが欲しいなぁ。。。
0864デフォルトの名無しさん
2007/10/31(水) 09:12:27プログラムの実行速度を計ってみたいのですが
Linux環境でのプロファイラってありますか?
0865864
2007/10/31(水) 09:16:07Linuxでフリーのプロファイラってありますか?
0866デフォルトの名無しさん
2007/10/31(水) 09:21:340867デフォルトの名無しさん
2007/10/31(水) 10:03:30FILE_FLAG_NO_BUFFERINGっていうオプション付けると書き込めるサイズが決まってしまうのですが、
書き込む配列が余分に取ってあったらその部分も書き込まれてしまうと思うのですが、バイナリデータの終端ってわかるものなんですか?
HANDLE fq = CreateFile("D:\\datafile", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS ,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING , NULL);
0868デフォルトの名無しさん
2007/10/31(水) 10:06:01中に入っているデータは先頭の100個だとします
このとき4096バイト出力したら未定義の部分も書き込まれてしまいますよね?
FILE_FLAG_NO_BUFFERING付けると書き込みが速くて良いんですけど、解決方法ありますか?
0869デフォルトの名無しさん
2007/10/31(水) 10:06:46vc8.0のコンパイラでobj作ってvc9.0betaのリンカでリンクしたらいけるかと思ったのですが
同じエラーでました たぶんvc8.0はコンパイラの段階でだめなんだと思います
0870デフォルトの名無しさん
2007/10/31(水) 10:07:170871デフォルトの名無しさん
2007/10/31(水) 10:18:12パフォーマンスを取って仕様変更をするか、仕様を厳守してパフォーマンスを犠牲にするか。
>>865
gprofがgccとセットでインストールされていると思う。
尚、>861みたいに小さいデータで較べることは余り意味がないと思う。
当然ながら、自分が扱うデータサイズに近いものでテストすること。
# つーか、それだけでなくそれ以外の点でも>861はカスだが。
0872デフォルトの名無しさん
2007/10/31(水) 10:20:594096バイトのNO_BUFFERINGでの書き込み10回より
40960バイトの書き込み1回の方が10倍近く速いんだけど
その辺をわかった上で「速くて良い」と言ってるのかね?
で、確かに4096バイトを1回書き込むだけならその方が速いんだけど
その1回の書き込みはそれほど重要なのかね?
つまり、4096バイトだけ書き込む(それ以上同時に書き込んではいけない)タスクが多数あるとか
どうしても4096バイトのファイルを数百個作る必要があるとかで
かつ、メモリマップドI/Oや非同期処理等の、他のもっと有効な手段すらとれないと。
0873デフォルトの名無しさん
2007/10/31(水) 10:24:10べつに4096に限定されているわけではなくて、40960でもいいんですけど・・・
ボリュームのセクタサイズの整数倍という制約があります すると余分な領域も書き込んでしまいますよね?
0874デフォルトの名無しさん
2007/10/31(水) 10:25:420875icc使用
2007/10/31(水) 10:28:34そもそも、この程度をインライン展開できないコンパイラを前提としている段階で速度を語られてもなぁ。
0876デフォルトの名無しさん
2007/10/31(水) 10:35:310877デフォルトの名無しさん
2007/10/31(水) 10:37:49あと埋め込み版とたいして速度変わらないよ charの関数呼び出し埋め込みも変わらない
charはstringの倍の早さ
0878デフォルトの名無しさん
2007/10/31(水) 10:45:14そもそもSTLといいつつstringを出されてもなぁ。元質はvectorなんだし。
0879デフォルトの名無しさん
2007/10/31(水) 10:46:09で、NO_BUFFERINGの方が速いというのは、ちゃんと速度計測した上でのこと?
もちろん、普通は遅延書き込みだからディスクにかかれる前に戻ってくるけど
NTFSだとジャーナルに一度書き込むまで戻らないから、
メモリ上でのコピーに要する時間の影響はかなり小さくなると思うんだけど。
で、俺が提示した他の手段は使えないと。
そもそも、どういうデータ形式で、データ数の保存をどうしているのか激しく疑問なんだけど。
非固定長だとデータ数が取得できて固定長だと取得できないってのは
もしかしてデータ長をファイルサイズで得ようとしてるのかな。
そんなベタなデータ形式って、テキストファイル以外には見当たらないけど
そういう用途で、ディスクアクセスの時間がそれほど重要なわけ?
それこそ、stdioとsetvbufで大容量バッファを用意する方が、よっぽど有効だと思うんだけど。
0880デフォルトの名無しさん
2007/10/31(水) 10:46:570881デフォルトの名無しさん
2007/10/31(水) 10:59:08だから、「メンバとして」vectorを持つのとポインタを持つのなら、まったく同じ。
ただ、メンバとして配列を持つのと比較すると
間接参照一回分増えるケースが多いかもしれない。
ローカル変数の場合も基本的には同じ。
(内部で持ってる)ポインタ変数の値を取得するのに
thisをベースにするかフレームポインタをベースにするかが違うだけ。
ただ、ローカル変数でポインタを持つ場合、レジスタ割付される可能性が高い。
その分、(何回もポインタの値を読み出す必要があるなら)差がつくかもしれない。
ローカル配列の場合は、フレームポインタ経由で直接アクセスするので
レジスタ割付された場合と同等の速度になる。
クラスメンバの場合は、100%レジスタ割付されないから、必ず間接参照を含むわけだけど
気になるようなら、頻繁に利用される部分(ループ内とか関数全体とか)で
先頭を一度ポインタ変数に取得して、それをベースにアクセスすればいい。
そうすればレジスタに割り付けられる場合が出てくる。
当然オーバーフローの危険はあるが、それはvectorに[]でも同じだし
生存(new/delete)を気にせずにすむだけでもメリットはある。
ただ、増減する可能性がある場合は使えないけど。
0882デフォルトの名無しさん
2007/10/31(水) 11:17:17#include <iostream>
#include <vector>
#define N 32000000
using namespace std;
vector<int> a;
main(){
int n,k,c;
a.reserve(N);
for(n=0;n<N;n++)a[n]=rand();
vector<int>::iterator p=a.begin(),q=a.end();
cout<<p<<" "<<q;
}
0883デフォルトの名無しさん
2007/10/31(水) 11:23:490884デフォルトの名無しさん
2007/10/31(水) 11:27:26--
static int fvf(std::vector<int> const & foo, int bar)
{
return std::find(foo.begin(), foo.end(), bar) - foo.begin();
}
static int fvl(std::vector<int> const & foo, int bar)
{
for (std::vector<int>::const_iterator it = foo.begin(); it != foo.end(); ++it) {
if (* it == bar) return it - foo.begin();
}
return foo.end() - foo.begin();
}
static int fl(int const * foo, unsigned size, int bar)
{
for (unsigned ic = 0; ic < size; ++ic) {
if (foo[ic] == bar) return ic;
}
return size;
}
--
icc(10.0) -xP -O3 -ip -funroll-loops
2.46sec 3.53sec 2.31sec
gcc(3.4.6) -msse2 -O3 -funroll-loops
2.22sec 3.69sec 3.04sec
--
約3000件のデータを10M回回してこの所要時間だからどれも大差ないっちゃ大差ないけどね。
0885デフォルトの名無しさん
2007/10/31(水) 11:28:01sizeを変えるのはresize
0886デフォルトの名無しさん
2007/10/31(水) 11:31:52reserve()は領域を確保するだけ。要素数を変更するにはresize()かassign()が必要。
つーか、reserve()しているんだから素直にfor (int n = 0; n < N; ++n) a.push_back(rand())すればいいだけ。
# それはさておき、グローバル変数にしてはいけないと思うのだが。
0887vector は差がない
2007/10/31(水) 11:47:18#include <vector>
#include <time.h>
#define N 8000000
#define M 80
using namespace std;
vector<int> a;
int *b;
static int e[N];
inline int f(){vector<int>::iterator p=a.begin(),q=a.end();
int k=0;while(1){p=find(p,q,0);if(p==q)break;;k++;p++;}return k;}
inline int g(){int n,k=0;for(n=0;n<N;n++)if(a[n]==0)k++;return k;}
inline int h(){int n,k=0;for(n=0;n<N;n++)if(b[n]==0)k++;return k;}
main(){
int n,k,c,i;
a.resize(N);b=new int [N];
for(n=0;n<N;n++)a[n]=b[n]=e[n]=rand();
k=0;c=clock();for(n=0;n<M;n++)k+=f();
c=clock()-c;cout<<"vector + iterator call "<<c<<"m秒 sum= "<<k<<endl;
k=0;c=clock();for(n=0;n<M;n++)k+=g();
c=clock()-c;cout<<"vector + []アクセス call "<<c<<"m秒 sum= "<<k<<endl;
k=0;c=clock();for(n=0;n<M;n++){for(i=0;i<N;i++)if(a[i]==0)k++;}
c=clock()-c;cout<<"vector埋め込み "<<c<<"m秒 sum= "<<k<<endl;
k=0;c=clock();for(n=0;n<M;n++)k+=h();
c=clock()-c;cout<<"new call "<<c<<"m秒 sum= "<<k<<endl;
k=0;c=clock();for(n=0;n<M;n++){for(i=0;i<N;i++)if(b[i]==0)k++;}
c=clock()-c;cout<<"new埋め込み "<<c<<"m秒 sum= "<<k<<endl;
k=0;c=clock();for(n=0;n<M;n++){for(i=0;i<N;i++)if(e[i]==0)k++;}
c=clock()-c;cout<<"配列埋め込み "<<c<<"m秒 sum= "<<k<<endl;}
0888デフォルトの名無しさん
2007/10/31(水) 11:50:020889デフォルトの名無しさん
2007/10/31(水) 12:28:17またしてもつまづいてしまいました。
今回は完全に環境依存ですので、以下で質問させて頂きました。
http://www.b8p.net/cgi-bin/wforum/wforum.cgi?no=788&reno=787&oya=785&mode=msg_view&page=0
もしお分かりになる方、どうかよろしくお願いします。
0890デフォルトの名無しさん
2007/10/31(水) 12:29:410891デフォルトの名無しさん
2007/10/31(水) 12:42:250892889
2007/10/31(水) 12:52:26すみません。
書き忘れました、m,nは初期値として-1を代入しています。
マルチすみませんでした、あちらで気長に待ちます。
0893デフォルトの名無しさん
2007/10/31(水) 13:22:46lambdaとstd::count_ifを使ったら少し遅くなった(120%)
が一行で済むからそのコストも安いもの…なのかな?
0894デフォルトの名無しさん
2007/10/31(水) 14:26:17してはいけない。「実測が基本」とは実際のコードで計測した値に基づいて最適化を
施すべきということ。
オーダーの変わらない範囲の比較用コードをいくら並べたところであまり意味は
無いんだよ。
0895デフォルトの名無しさん
2007/10/31(水) 14:49:150896デフォルトの名無しさん
2007/10/31(水) 14:58:57HTMLのファイルからタグを取ったファイルを作りたいのですが日本語がうまくコピーできません。
StreamReaderのReadLine()で読み込んでStreamWriterのWriteLine()でファイルに
出力しようとしているんですが、ReadLine()で読み込んだ時点でうまくいってません。
こんなやり方ではできないんでしょうか?
0897デフォルトの名無しさん
2007/10/31(水) 15:07:27StreamReaderやStreamWriterのコンストラクタでちゃんとエンコーディング
を指定汁。
それと、C++/CLIはさすがに専用スレに行ったほうがいいぞ。
0898デフォルトの名無しさん
2007/10/31(水) 15:19:010899896
2007/10/31(水) 15:26:23ついでなんですが、HTMLの文字コードが決まっていなくいろいろあります。
やはり、HTMLのファイルのコードを統一してから文字の読み込みとするしかないのでしょうか?
0900デフォルトの名無しさん
2007/10/31(水) 15:29:510901デフォルトの名無しさん
2007/10/31(水) 15:57:14環境破壊大国オーストラリアの環境大臣が日本人に説教だ。
公金を使って外国人に説教をするって。。。
0902デフォルトの名無しさん
2007/10/31(水) 16:08:300903デフォルトの名無しさん
2007/10/31(水) 21:24:23MSHTMLあたりでDOMとして読み込めば、
自分は文字コードの問題を考えずに済むと思う。
0904デフォルトの名無しさん
2007/11/01(木) 04:30:230905デフォルトの名無しさん
2007/11/01(木) 04:32:41方向性が違うので、較べる方向によって異なるかと。
0906904
2007/11/01(木) 04:49:40あと開発環境も軽いのが良いです
0907デフォルトの名無しさん
2007/11/01(木) 09:58:430908デフォルトの名無しさん
2007/11/01(木) 10:05:080909デフォルトの名無しさん
2007/11/01(木) 10:54:270910デフォルトの名無しさん
2007/11/01(木) 10:54:29VisualC++2005 win32なんですが
拡大鏡のプログラムを作っています。
マウスカーソルの座標を読み込んで
その周囲の100*100くらいのピクセル値をGetPixelで読み込んで配列に格納。
そのピクセル値の中央のあたりをを拡大した値をまた配列に入れて、
それをSetPixelで現在のマウスカーソルの位置の周りに表示させてます。
それで拡大はできてるんですが、動作が遅いのか
カクカクと点滅するようにしか表示されません。
フリーソフトとかである拡大鏡みたいに
スムーズに表示させるにはどうしたらいいんでしょうか?
そもそもこのやり方より別の方法使ったほうがいいでしょうか?
0911デフォルトの名無しさん
2007/11/01(木) 10:59:31Win32APIスレのほうがふさわしいと思うが。
GetPixelは遅かった気がする。
よく知らんけどDCとかDIB弄ると良いのでは?
0912デフォルトの名無しさん
2007/11/01(木) 11:41:52これらより良い方法ありますか?
4Mずつ転送します
while(n<N){
m=N-n;if(m>4194304)m=4194304;
WriteFile(fq ,&( data[n] ) ,m, &sz , NULL);
n+=sz;
if(n >= N)break;}
可能な限り転送します
while(n<N){
WriteFile(fq ,&( data[n] ) ,N-n, &sz , NULL);
n+=sz;
if(n >= N)break;}
0913デフォルトの名無しさん
2007/11/01(木) 11:46:42一度に200Mとか書き込み要求したときは、WriteFileは書き込み成功まで固まるんでしょうか?
細かく転送すると、ディスクのシーク時間等がかかって鈍くなると思いますけど・・・ 4Mくらいがちょうど良いですか?
0914デフォルトの名無しさん
2007/11/01(木) 11:47:430915910
2007/11/01(木) 11:50:01わかりました。とりあえずそっちで聞いてみます。
ありがとうございます。
0916デフォルトの名無しさん
2007/11/01(木) 11:51:03まぁ、大差ないから気にするな。気になるなら実測しろ。
# 私なら 4194304 と書くより 4 * 1024 * 1024 って書いちゃうなぁ。
0917デフォルトの名無しさん
2007/11/01(木) 12:07:00ありがとうございます
読み込みも書き込みもですけど、200Mとかメモリに貯まる前に
例えば5Mとか貯まったら書き出した方が良いですよね?
バッファ1と2があって1が貯まったら書き出してその間に2へ蓄えておくっていうのがいいと思うんですけど・・
バッファサイズと個数の最適地を実測してみます あと定番のアルゴリズムってあるんでしょうか?
0918デフォルトの名無しさん
2007/11/01(木) 12:15:55そもそも前提条件がわからない。
200Mメモリが貯まるって何?
環境やどういう作業をしたいのか(ファイルコピーでもしたいの?)、
求めるパフォーマンスはどこに重点を置くのか(速度、メモリ?)等はっきりさせたほうがいいよ。
0919デフォルトの名無しさん
2007/11/01(木) 12:17:490920デフォルトの名無しさん
2007/11/01(木) 12:27:240921デフォルトの名無しさん
2007/11/01(木) 12:31:430922デフォルトの名無しさん
2007/11/01(木) 12:36:170923デフォルトの名無しさん
2007/11/01(木) 13:02:220924デフォルトの名無しさん
2007/11/01(木) 16:50:10どっちかが嘘教えてるな
0925デフォルトの名無しさん
2007/11/01(木) 17:17:210926デフォルトの名無しさん
2007/11/01(木) 17:21:470927デフォルトの名無しさん
2007/11/01(木) 18:37:43こうですか?わかりません><
0928デフォルトの名無しさん
2007/11/01(木) 19:25:450929デフォルトの名無しさん
2007/11/01(木) 22:34:37とりあえず、以前から「NO_BUFFERING」と叫んでる初心者君だと思うが、
続けるなら捨てハンつけろよ。
で、「書き込みをバッファリングしない」というのは、
確かに「処理が完全に終了する時間(=ディスクに書き込み終わる時間)」は短くなるが
「WriteFileから戻って次の処理を続けられるようになるまでの時間」は長くなるんだよ。
当然だろ?OSのバッファまでコピーするだけで戻れるんだから。
(コピーしない場合、メモリ上のデータが書き換えられるのを防ぐため、カーネルから戻れない)
バッファリングを無効にすることにより処理が速くなるのは、読み込みのときだけだから。
それも、メモリマップドファイルを使う方がずっと一般的で
わざわざOSのキャッシュシステムを無効にして書き込みするのは
DB等の確実性が求められる用途など、極一部でしかない。
もちろん、こういう場合は、自前でキャッシュ管理している。
0930デフォルトの名無しさん
2007/11/01(木) 22:48:010931デフォルトの名無しさん
2007/11/01(木) 23:04:40よくわからんが、
巨大なファイルを高速に&キャッシュを汚さずに転送したいとか
考えてるんじゃないのかねえ。要するにFireFileCopyみたいな。
とりあえずSDKのサンプルにunbufcpyというのがあったような。
IOCP&マルチスレッドで、バッファリング無しコピーをやっていたと思う。
>>913はまずその辺を見てみたら。
0932931
2007/11/01(木) 23:07:32・速いか遅いかなんてのは自分で実測しろ
・自分の環境でたまたま有効なチューニングが、どんな環境でも有効だとは思うな
と言っとく。
0933デフォルトの名無しさん
2007/11/02(金) 00:33:11#include <iostream>
#include <string>
#include <fstream>
using namespace std;
main(){
locale::global(locale("japanese"));
setlocale(LC_ALL, "japanese");
wstring a=L"ハローワールド" ;
wcout <<a<<endl;
wfstream fp("file",ios::in);
if(!fp){wcout<<"file err\n";return 0;}
for(;;){
getline(fp, a);wcout<<a<<"\n";
if(fp.eof()){wcout<<"end\n";break;}
}}
0934デフォルトの名無しさん
2007/11/02(金) 00:38:13つ std::perror
0935933
2007/11/02(金) 00:53:37やり方わかりますか?
0936933
2007/11/02(金) 03:36:540937デフォルトの名無しさん
2007/11/02(金) 03:50:460938933
2007/11/02(金) 03:57:57いま一番確実だと思うのは、NKFでシフトJISに変換してchar配列で読み込んで
MultiByteToWideCharでwchar_tに変換するという方法です
0939デフォルトの名無しさん
2007/11/02(金) 04:22:060940933 日本語のwchar_tへの読み込みできたよ
2007/11/02(金) 06:53:29#include <iostream>
#include <string>
#include <fstream>
using namespace std;
typedef int (__stdcall *FNC)(LPCSTR);
typedef void (__stdcall *FND)(LPCTSTR ,LPCTSTR );
main(){
locale::global(locale("japanese"));
setlocale(LC_ALL, "japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption = (FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfFileConvert = (FND)GetProcAddress(hd,"NkfFileConvert2");
SetNkfOption("-w -X -Lu -d");NkfFileConvert("file","templary");
fstream fp("templary",ios::in);
char buf[4100];wchar_t* wbuf;
fp.getline(buf, 4096);int n;
n=MultiByteToWideChar(CP_UTF8, 0, buf, -1, NULL, 0);
wbuf=(wchar_t *)LocalAlloc(LPTR, (n+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, n);
wcout<<wbuf<<endl;
n=WideCharToMultiByte(CP_ACP, 0, wbuf, -1, NULL, 0, NULL,NULL );
char* putf = new char[n+1];
n = WideCharToMultiByte( CP_ACP, 0, wbuf, -1, putf, n, NULL,NULL );
cout<<putf;}
0941デフォルトの名無しさん
2007/11/02(金) 07:35:320942デフォルトの名無しさん
2007/11/02(金) 07:38:010943デフォルトの名無しさん
2007/11/02(金) 11:45:50どっちの方が実行速度が遅いのですか?
コンパイラはVC++2005を使ってます。
0944デフォルトの名無しさん
2007/11/02(金) 12:00:060945デフォルトの名無しさん
2007/11/02(金) 12:27:49必要なものはすべて揃っているのに、どうして自分でやらないのか。
0946デフォルトの名無しさん
2007/11/02(金) 12:30:500947デフォルトの名無しさん
2007/11/02(金) 15:35:44#include <iostream>
#include <string>
#include <fstream>
using namespace std;
typedef int (__stdcall *FNC)(LPCSTR);
typedef void (__stdcall *FND)(LPCTSTR ,LPCTSTR );
main(){
locale::global(locale("japanese"));
setlocale(LC_ALL, "japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption=(FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfConvert=(FND)GetProcAddress(hd,"NkfConvert");
fstream fp("file",ios::in);
char buf[20010],buft[20010];
fp.getline(buft, 20000);
int n;
SetNkfOption("-w -X -Lu -d");
while(!fp.eof()){
NkfConvert(buf,buft);
n=MultiByteToWideChar(CP_UTF8,0,buf,-1,NULL,0);
wchar_t* wbuf=new wchar_t [n+1];
MultiByteToWideChar(CP_UTF8,0,buf,-1,wbuf,n);
wcout<<wbuf<<endl;
n=WideCharToMultiByte(CP_ACP,0,wbuf,-1,NULL,0,NULL,NULL);
char* putf = new char[n+1];
n=WideCharToMultiByte(CP_ACP,0,wbuf,-1,putf,n,NULL,NULL);
cout<<putf;
fp.getline(buft, 20000);}}
0948デフォルトの名無しさん
2007/11/02(金) 18:59:10wwwからファイルのダウンロードを行うべくソケットを使って実装していました。
スレッドセーフにするため、関数名の末尾に_rが付くものに置き換えていましたが
引数のシグネチャが違っていてわけわかりません
スレッドセーフでオススメのライブラリはないでしょうか?
0949デフォルトの名無しさん
2007/11/02(金) 19:38:550950デフォルトの名無しさん
2007/11/02(金) 19:44:030951デフォルトの名無しさん
2007/11/02(金) 19:45:43CHoge ← CChild
という継承を行い、CChildで virtual int test() という関数をオーバーライドしたとします
この状態で
p = new CChild();
とやり、CHogeのコンストラクタでtest()を呼び出したとしても、オーバーライドされていないtest()が呼び出されますよね
この実装自体は別に構わないのですが、何故このような仕組みになっているのでしょうか?
コンパイラ的には、オーバーライドされたほうを呼び出させることは難しくないと思います
(CChildのコンストラクタの頭でCHogeのコンストラクタを呼ぶ前に、vtblだけは初期化してしまえばいいですよね)
事実、Javaはオーバーライドされたほうのtestが呼ばれます
何故C++では、オーバーライド前のtest()を呼ぶ仕組みになっているのでしょうか?
0952デフォルトの名無しさん
2007/11/02(金) 19:47:10あと分割するなら初めに書き込む位置決めておけばいいし
0953デフォルトの名無しさん
2007/11/02(金) 19:56:110954デフォルトの名無しさん
2007/11/02(金) 20:32:27Base(void) { ::printf("Base"); }
};
struct Member {
Member(void) { ::printf("Member"); }
};
struct Derived : public Base
{
Derived(void) { ::printf("Derived"); }
Member mem_;
};
これ実行したら分かるかもしれない。
0955デフォルトの名無しさん
2007/11/02(金) 20:45:240956デフォルトの名無しさん
2007/11/02(金) 20:50:00>>949
先ほど書店でBoost.Asioの解説読んでました。これ使うとだいぶ楽になりそうです
でもhttp1.0や1.1の実装は自分でやらないといけないんですね
>>952
理由はわかりませんが、gethostbyname、getservbynameあたりの関数がスレッドセーフではないと定義されているんです
明日にでも本屋行ってBoostライブラリの書籍買って試してみます
0957デフォルトの名無しさん
2007/11/02(金) 20:51:18本のサンプルコードはサポートページで配布してるし
0958デフォルトの名無しさん
2007/11/02(金) 20:52:360959デフォルトの名無しさん
2007/11/02(金) 21:01:02間単にいうともし派生クラス(CChild)のtest()が呼ばれたら
恐いことになる可能性があるから。基底クラス部分の初期化
の最中は、派生クラスの部分の初期化はまだ行われて
おらず、基底クラス部分の初期化時に派生クラスでオーバーライド
されたメンバー関数の呼び出しが可能だとしたら、まだ初期化されて
いない派生クラスのメンバーにアクセスしてしまう危険があるから。
0960デフォルトの名無しさん
2007/11/02(金) 21:15:57CChild としては未だコンストラクトされてないから。
「コンストラクトされていないが関数だけは呼べる」
ということで呼ばせてくれた方が良かったと俺は思うけど。
そんなとこだけ安全>>利便としてくれても嬉しくない。
0961デフォルトの名無しさん
2007/11/02(金) 21:16:03基底クラスのコンストラクタが実行されるとき、
まだ派生クラスオブジェクトは存在しない(作られていない)ので、
派生クラスでオーバーライドしたほうの関数が呼ばれるのはおかしいという理屈に基づいている。
そして>>959が書いたように現実的な視線での理由もある。
0962デフォルトの名無しさん
2007/11/02(金) 21:17:03コンパイラは何を使っている?
0963938
2007/11/02(金) 21:17:590964デフォルトの名無しさん
2007/11/02(金) 21:23:40BCCにもバージョンがたくさんあり、その都度STLのデベロッパが違って
たりして混乱するんだが。
最新版は5.9.2だよ。
0965938
2007/11/02(金) 21:32:085.5.1です でもコンパイラが違っていても、NKFでUTF8に変換して、それをwindows APIで
wchar_t、wstringに変換すれば確実ではないですか?
0966デフォルトの名無しさん
2007/11/02(金) 21:36:38もしかしてShiftJISのファイルを読み込んでstd::wstringに入れて扱いたいだけなのに、
「なんだかよく分からないけど動かないからNKFを通したら動いた」
みたいな事になってるんじゃないかと心配なんだ…。
0967デフォルトの名無しさん
2007/11/02(金) 21:38:380968デフォルトの名無しさん
2007/11/02(金) 21:40:050969デフォルトの名無しさん
2007/11/02(金) 21:42:110970デフォルトの名無しさん
2007/11/02(金) 21:53:20そのスレッドセーフでない二つの関数は、既に非推奨になっている。
getaddrinfoを使え。
0971デフォルトの名無しさん
2007/11/02(金) 21:55:460972デフォルトの名無しさん
2007/11/02(金) 21:57:26なるほど。
逆にJavaは、派生クラスのものも含めてメンバ変数の初期化が(未定義であってもその型に応じたものが自動的に)行われるから、コンストラクタの中でオーバーライド後の関数を呼んでしまっても平気
ってことですね?
ありがとうございました
C++はスピード優先や、Cとの互換性も考えてそうなってるんでしょうね。おもしろいです
0973972
2007/11/02(金) 22:00:07ttp://www.ne.jp/asahi/yamashita/programming/java/forBeginner.html
ここでJava側の理論を読んでいたのですが
>したがって 基本クラスのコンストラクタから呼ばれるメソッドをオーバーライド した場合,「フィールドが初期化される前にオーバーライドしたメソッドが呼ばれる] 可能性もあるので注意が必要である。
C++と安全性変わってませんね・・・
0974デフォルトの名無しさん
2007/11/02(金) 22:12:31Effective C++読むと良いよ
0975デフォルトの名無しさん
2007/11/02(金) 22:29:43それだと入力がUTF-8/16のようなUnicodeなファイルでは、
情報の欠落が発生することになるだろ。
0976デフォルトの名無しさん
2007/11/02(金) 22:30:570977938
2007/11/02(金) 22:31:09UTF8に変換して読み込むことにしましたよ
0978デフォルトの名無しさん
2007/11/02(金) 23:23:28RS232Cから受信したデータによって画像の切り替えをしたいのですが
どのように記述すればよいですか?このままだとReadFileが無視されます。
//Form1.h
(省略)
#pragma endregion
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
//変数宣言やら初期設定やら
//画像のビットマップを生成する
Bitmap^ bmap=gcnew Bitmap("../yakyuu/img/3.bmp");
Bitmap^ clr=gcnew Bitmap("../yakyuu/img/white.bmp");
//4x4の画像を描画する
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
int X=10+i*310;
int Y=10+170*j;
gr->DrawImage(bmap,X,Y);
}
while(1){
ReadFile(hc, &data, 1, &dwRead, NULL);
if(data==END)
break;
if(data>=1 && data<=16)
gr->DrawImage(clr,10+((data-1)%4)*310,10+((data-1)/4)*170);
}
}
0979デフォルトの名無しさん
2007/11/02(金) 23:27:44nkfってUTF-16LEの出力ってできないの?
UTF-16LEのファイルを読み込めば、わざわざMultiByteToWideCharで変換する必要もない。
読み込みには、std::ifstreamでバイナリモードを使えばいい。改行の扱いが問題になるが。
0980デフォルトの名無しさん
2007/11/02(金) 23:30:37なぜなのかは本とか学習サイトとかドキュメントとか読んで把握してください。
(↑これサボって先へは一歩も進めないので、ちゃんとやるように)
スレッドを使うのは技術的にまだ難しいだろうから、
タイマーで定期的に読んでImageに書いて Invalidate、Updateし、
Paint では(描画済みの) Image をDrawImage する、等。
0981938
2007/11/02(金) 23:36:34-w16 -w16B0 UTF16 コードを出力する。 (Big Endian / BOM 無し)
-w16B UTF16 コードを出力する。 (Big Endian / BOM 有り)
-w16L UTF16 コードを出力する。 (Little Endian / BOM 有り)
-w16L0 UTF16 コードを出力する。 (Little Endian / BOM 無し)
0982デフォルトの名無しさん
2007/11/02(金) 23:38:04Mozillaのソースとか読むと良いのかな?
マルチプラットフォームでライセンス緩めの適当なライブラリがあると有難いんだが。
Windows限定だと、MLangでコードページ50932を指定すると
JIS, EUC-JP, CP932の自動認識はしてくれるようだね。
0983デフォルトの名無しさん
2007/11/02(金) 23:50:15まぁJavaの場合はnullか0かfalseで初期化されてるから、少なくともゴミ値を読んで暴走するようなことはない
NullPointerExceptionが起きるくらい
0984デフォルトの名無しさん
2007/11/03(土) 00:02:44Visual C++ 2005 Express Editionを用いた易しい画像処理(1)―原画像を読み込み、RGBとCMYの三色に分解する
http://homepage3.nifty.com/ishidate/vcpp05_g1/vcpp05_g1.htm
そんでもって、ウィンドウにも表示してみたいなぁと思って貼り付けたんですが、ビルドできない。
フォームの方にあった、↓も貼り付けてみたけど、
using namespace System::Drawing;
こんなエラー↓がでました。
.\TestWin.cpp(7) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。
.\TestWin.cpp(7) : error C2871: 'Drawing' : この名前を指定された名前空間は存在しません。
環境はVC++ 2005 Expressっす。
0985デフォルトの名無しさん
2007/11/03(土) 00:09:040986デフォルトの名無しさん
2007/11/03(土) 00:11:40「CLRなんとか」という種類のプロジェクトを作れ。
0987デフォルトの名無しさん
2007/11/03(土) 00:14:45やってみるっすー
>>985
そういや、bitmapクラスってドトネトみたいね。
eclipseしか使ったことないもんで、新しい環境は右も左もわけわかめやね。
0988938
2007/11/03(土) 00:15:25#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
typedef int (__stdcall *FNC)(LPCSTR);
typedef void (__stdcall *FND)(LPCTSTR ,LPCTSTR );
main(){
locale::global(locale("japanese"));
setlocale(LC_ALL, "japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption=(FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfFileConvert = (FND)GetProcAddress(hd,"NkfFileConvert2");
SetNkfOption("-w16L0 -X -Lu -d");
NkfFileConvert("file","templary");
fstream fp("templary",ios::in | ios::binary );
wchar_t *wbuf= new wchar_t [1024*1024*5];
int n=0;
while(!fp.eof()){
fp.read(( char * ) &(wbuf[n]), 1024 );
n+=1024;}
wcout<<wbuf<<endl;
}
0989デフォルトの名無しさん
2007/11/03(土) 00:19:28ちなみに、そのBitmapクラスなどは、.NET版とは多少異なるがアンマネージ版もあって、
それを使えば.NET Frameworkなしでも使える。
http://msdn2.microsoft.com/en-us/library/ms533798.aspx
0990デフォルトの名無しさん
2007/11/03(土) 00:20:53【初心者歓迎】C/C++室 Ver.44【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1194016813/l50
0991デフォルトの名無しさん
2007/11/03(土) 00:22:30たいへんよくできました。花丸
0992デフォルトの名無しさん
2007/11/03(土) 00:26:48は何文字読み込んだのかどうやってわかりますか? freadはバイトが帰ってきますが
0993デフォルトの名無しさん
2007/11/03(土) 00:29:37std::istream::gcount()
を呼ぶか、
かわりにstd::istream::readsome()
を使う
0994デフォルトの名無しさん
2007/11/03(土) 00:31:040995デフォルトの名無しさん
2007/11/03(土) 00:31:080996デフォルトの名無しさん
2007/11/03(土) 00:32:05スーパーありがとう!
ドトネトの説明にもGDI+のbitmapをカプセル化してあるって書いてあるね!
GDI+のチュートリアルかなんか探してみるっさ!
0997デフォルトの名無しさん
2007/11/03(土) 05:47:370998デフォルトの名無しさん
2007/11/03(土) 05:50:020999デフォルトの名無しさん
2007/11/03(土) 05:50:341000小倉優子 ◆YUKOH0W58Q
2007/11/03(土) 05:51:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。