08/06/16 20:57:14
>>72
そもそも整数がその範囲に割り当てられた理由もあるんじゃね?
76:デフォルトの名無しさん
08/06/16 20:57:48
>>74
ですよねー。
77:デフォルトの名無しさん
08/06/16 20:58:55
FORTRAN は数式を扱うことを目的に作られたから
イテレーションによく使われていた i から始まり、
整数値としてよく使われていた n までを整数にした、
と考えるのが自然な気がするよ。
78:デフォルトの名無しさん
08/06/16 22:10:58
FORTRANのiはintegerのiだな。
79:デフォルトの名無しさん
08/06/16 22:16:35
数学で使われる方のiがintegerのiとは考えんのかね。
80:デフォルトの名無しさん
08/06/16 22:17:57
indexのiにきまってるだろ。
81:デフォルトの名無しさん
08/06/16 22:24:20
H の後に I があるなんてJokeだよ
82:デフォルトの名無しさん
08/06/17 01:00:56
LinuxもしくはOS Xでgccを使った場合の質問です。
- /usr/local/lib/libFOO.a
- bar.cxx
の2つがあり、bar.oとlibFOO.aを合体させて、
libbar.soというのを作りたいと思っています。
(libFOO.aも共有ライブラリの中に組み込んでしまいたい)
この場合、
$ g++ bar.cxx -o bar.o
したあとに、どのようにすれば良いのでしょうか。
83:デフォルトの名無しさん
08/06/17 01:23:06
マニュアルを読めばいいと思うよ
84:82
08/06/17 01:23:16
なんでそんなことをする必要があるかと言うと、
色々なライブラリを必要に応じて読み込むソフトがありまして、
そいつに自作のライブラリを読み込ませるためには、
必ず共有ライブラリじゃないと駄目なんです。
なので、libFOO.aを読み込ませる場合には、
一回自分で共有ライブラリを作らないといけない、と。
85:デフォルトの名無しさん
08/06/17 01:32:25
>>84
分かりました、マニュアルを読んでくさい
86:デフォルトの名無しさん
08/06/17 04:26:59
>>84
URLリンク(www.google.com)共有ライブラリ gcc
87:デフォルトの名無しさん
08/06/17 08:39:42
>>81
HしてもIがなかったらJuniorが生まれてこないとは考えんのかね。
88:デフォルトの名無しさん
08/06/17 12:57:29
>>87
望まれないJuniorっていう不幸もあるからなぁ
89:デフォルトの名無しさん
08/06/17 13:19:32
Knockが足りなかったんだろう
90:デフォルトの名無しさん
08/06/17 13:21:14
つまんないからやめろ
91:デフォルトの名無しさん
08/06/17 19:06:29
抽象的な質問で申し訳ないですが
あるクラスのメンバ関数を実装するとき、内部の処理をベタ書きすると
長くなるので、関数化したいことは良くあると思います。
このとき、その関数化したい処理そのものは、もとのメンバ関数の処理に比べて
低級な処理なので、同じクラスのメンバ関数として定義するのには違和感があります。
かといって、専用のクラスを作るほどではないと感じる場合があります。
こういう場合、どういった形で関数を定義するべきでしょうか。
例えば、積分をするためのループ処理1ステップ分を関数化して切り出したい場合などです。
92:デフォルトの名無しさん
08/06/17 19:07:38
よくわからんがprivate関数じゃだめなの?
93:デフォルトの名無しさん
08/06/17 19:09:35
アクセス制御で外からは見えない関数にすればいいよね
94:デフォルトの名無しさん
08/06/17 19:14:42
内部クラスの静的メソッドでいいよ。
95:デフォルトの名無しさん
08/06/17 19:31:17
URLリンク(www.cmagazine.jp)
C言語の本を買ったのですがサンプルソースのあるページにアクセスできません?
アク禁になっているのか知りたいので他の人アクセスできるか試してもらえませんか;;
96:デフォルトの名無しさん
08/06/17 19:42:58
>>91
自分専用ライブラリを放り込んでおく場所を決めておくと良いよ。
97:デフォルトの名無しさん
08/06/17 19:43:16
Cマガ休刊したんじゃないっけ?
98:デフォルトの名無しさん
08/06/17 19:47:50
>>95
こんなときこそあれだ
URLリンク(web.archive.org)
99:デフォルトの名無しさん
08/06/17 20:01:15
>>98
そのサイトもアクセスできません・・・。
スレ違いですが質問させてください。
代わりにソースプログラムを配布しているサイトご存じないですか?
100:デフォルトの名無しさん
08/06/17 20:03:59
>>98 で落とせるけど。
文字コードは EUC な。
101:デフォルトの名無しさん
08/06/17 20:10:42
>>100
ダウンロードできました!!
ありがとうございます><
102:デフォルトの名無しさん
08/06/17 20:57:50
コピーコンストラクタを呼ばずにキャスト演算子使う方法はありますか?
こんなんでエラーが出ちゃって困ってます
class NoCopy{
public:
NoCopy(int){}
private:
NoCopy(const NoCopy &);
};
class Hoge{
private:
operator NoCopy(){
return NoCopy(i);
}
};
int main(){
Hoge h();
static_cast<NoCopy>(h); //エラー!
return 0;
}
103:デフォルトの名無しさん
08/06/17 21:00:42
class NoCopy{
public:
NoCopy(int){}
private:
NoCopy(const NoCopy &);
};
class Hoge{
public:
operator NoCopy(){
return NoCopy(i);
}
};
int main(){
Hoge h();
h.operator NoCopy(); //エラー!
return 0;
}
104:デフォルトの名無しさん
08/06/17 21:05:33
> Hoge h();
引数無しでHoge型を返す関数のプロトタイプ宣言
105:デフォルトの名無しさん
08/06/17 21:25:32
>>102
何をしたいのか理解に苦しむけど、リファレンス返すのはどう?
#include <iostream>
#include <memory>
class NoCopy {
int val_;
NoCopy(const NoCopy&);
NoCopy& operator=(const NoCopy&);
public:
NoCopy(int val) : val_(val) {}
void dump() const { std::cerr << val_ << std::endl; }
};
class Hoge {
std::auto_ptr<NoCopy> nocopy_;
public:
Hoge() : nocopy_(0) {}
operator NoCopy&() {
nocopy_ = std::auto_ptr<NoCopy>(new NoCopy(1));
return *nocopy_.get();
}
};
int main() {
Hoge h;
NoCopy& nocopy = h;
nocopy.dump();
}
106:デフォルトの名無しさん
08/06/17 23:37:20
別にコピー禁止クラスにキャストしたい訳じゃなくて
キャスト演算子が必ずコンストラクタを2回呼ぶのが気に食わなかっただけです
使い捨て一時オブジェクトのためにポインタ持たせたくないし、
直接関数呼び出しするくらいなら普通のメンバ関数にしようと思います
ありがとうございました
107:デフォルトの名無しさん
08/06/17 23:39:17
ある圧縮ファイルの読み込み関数使ったら戻り値がバイナリデータへのvoid*なんですが
これをFILE構造体に変える方法ってありますか?
VC2008exp使ってます。
108:デフォルトの名無しさん
08/06/17 23:42:44
>>106
最適化してるか?
109:デフォルトの名無しさん
08/06/17 23:51:36
>>107
「FILE メモリストリーム」でググってみれば?
110:デフォルトの名無しさん
08/06/17 23:55:39
>>108
してますけど、どちらかというと精神的な問題なので
でも規格読むとstatic_castでキャスト演算子呼ぼうとすると
一時オブジェクト作るのに絶対コピーコンストラクタ使うらしいので諦めました
111:デフォルトの名無しさん
08/06/17 23:58:03
そんなあなたにPOD型
112:デフォルトの名無しさん
08/06/17 23:59:45
>>110
戻り値最適化の話なんだけど。
113:デフォルトの名無しさん
08/06/18 00:05:36
戻り値最適化って関数3段階経ても効くんですか?
戻り値最適化効いた結果が2回だと思ったんですけど
114:デフォルトの名無しさん
08/06/18 00:10:52
とりあえず2回呼ばれるというコードはどれ
115:デフォルトの名無しさん
08/06/18 00:21:39
#include <iostream>
struct X{
X(){std::cout<<"X()"<<std::endl;}
X(const X&){std::cout<<"X(X&)"<<std::endl;}
};
struct Y{
operator X(){return X();}
};
int main(){
Y y;
static_cast<X>(y);
return 0;
}
VC2008で
X()
X(X&)
って表示された
116:デフォルトの名無しさん
08/06/18 00:24:16
g++ だと X() としか表示されないけど。
Release ビルドでもそうなる?
117:デフォルトの名無しさん
08/06/18 00:26:42
失礼します。
Visual Studio 2005、C++言語でファイルストリームを用いたファイル入出力について質問させてください。
ifstream fin("test.txt");
のように相対パスで指定した場合は正常にファイルが開かれるのですが、
ifstream fin2("C:\\Documents and Settings\\ORESAMA\\デスクトップ\\test.txt");
と絶対パスで指定するとファイルが開けません。
(ちなみに、C言語風にfopen()を用いた場合は絶対パス指定でもファイルオープン出来ました。)
これはどのような原因が考えられ、またどのように対処すれば良いかご教授頂けないでしょうか。
何卒よろしくお願いします。
118:デフォルトの名無しさん
08/06/18 00:27:40
Releaseでも同じだった
規格上はこっちが正しいんじゃないのかしら
119:デフォルトの名無しさん
08/06/18 00:28:07
VC++ 2005 には fstream に日本語パスを渡すとファイルが開けないバグがあったはず。
120:デフォルトの名無しさん
08/06/18 00:29:25
>>118
最適化レベルあげてみてもだめ?
規格上は、コピーコンストラクタを省略できる所は省略していいって仕様が別の所に書いてある。
すげー分かりにくいけど。
121:デフォルトの名無しさん
08/06/18 00:30:34
ああ、バグじゃなくて、ロケール設定が必要だということらしい。
setlocale(LC_ALL, ""); と書いてみて。
122:デフォルトの名無しさん
08/06/18 00:31:09
いや、バグはバグでいいのか。
123:デフォルトの名無しさん
08/06/18 00:40:17
>>120
最適化設定色々いじくってみたがどうやっても2回呼ぶようだ
124:デフォルトの名無しさん
08/06/18 00:43:13
>>123
VC++ の限界なのかね。
125:117
08/06/18 00:46:30
>>119
即レスありがとうございます。
仰る通り試してみたところファイルは問題なくオープンできるようになりました。
しかし、setlocale()より後ろで
cout << "abcde\\あいうえお";
のように日本語の文字列を出力させようとすると、abcde\までが出力されて、プログラムが終了してしまいます。
何度も申し訳ありませんが、どうかご教示お願い申し上げます。
126:デフォルトの名無しさん
08/06/18 00:50:27
>>117
VC++8.0以降はfstreamはワイド文字版のファイル名を受け付けるよ
127:デフォルトの名無しさん
08/06/18 00:51:51
ということは L"..." にすればおk?
128:デフォルトの名無しさん
08/06/18 00:54:25
うん。ちゃんとUTF-16に対応できて、C++なのにstd::setlocale()で
グローバルロケールを弄る必要も無いのが利点
難点は移植性がないことなので、気になるんならboostの力を借りるんだね
129:デフォルトの名無しさん
08/06/18 00:57:18
ファイル名を変数で指定し出すとまたややこしい事になりそうですね。
130:デフォルトの名無しさん
08/06/18 00:59:08
今なら全部UTF-16でコード書く方を勧めるけどね
Win98もサポートするとかなら別だけど
131:デフォルトの名無しさん
08/06/18 01:03:15
ま、wchar_t*もchar*も受け取っちまうからねぇ
VC++8.0以降だとcodecvt<>もわりとまともに動くと思うので
string->wstring変換が簡単に書けるが
codecvt<>で使ってるmbstate_tって、一応標準のクセに
標準的な初期化手段すら定められていないという恐ろしい状態だったように思う
「VC++では」
mbstate_t mbs = { 0 };
で初期化できるはずだけど
132:117
08/06/18 01:09:50
うーんごめんなさい。
せっかくレス頂いたのに文字フォーマットなどの知識が足りないようで今イチ理解できてません。
皆さんのレスを見る限り今の私にはとても難しそうなので、おとなしくfopen()を使いたいと思います。
こんな初心者の質問につきあって頂き、ありがとうございました。
133:デフォルトの名無しさん
08/06/18 01:21:05
「FILE メモリストリーム」でググらなくても
バイト列からストリームで入出力する方法はわかるんですけどね。
知りたいのはFILE構造体を入力として受け付けるライブラリに
別のアーカイブライブラリからの出力であるバイト列をぶち込む方法なんです。
やっぱり前者のほうを書き換えるしかないのかな……。
134:デフォルトの名無しさん
08/06/18 02:05:23
>>133
パイプでも使えばいいんじゃないの?
pipeで作って、FILE*が必要なほうにはfdopenして。
135:デフォルトの名無しさん
08/06/18 02:10:41
>>125
そのとき、いったいどんなエラーメッセージが出てくるの?
136:デフォルトの名無しさん
08/06/18 02:15:58
>>121>>128
C++ならstd::locale::global(std::locale(""));使ってあげてください。
中でsetlocaleも呼ぶので心配しなくて平気。
137:デフォルトの名無しさん
08/06/18 02:42:14
>>117
バグかと思ってたんだけど、仕様らしい。
URLリンク(connect.microsoft.com)
めんどくさいけど標準ライブラリにマルチバイト文字を処理させようと思ったら
プログラム起動時に std::locale::global(std::locale("")) しとくのが正解みたい。
138:デフォルトの名無しさん
08/06/18 03:48:48
VC++2005でstlで使用する場合
全体の設定はデフォルトのまま"C"にしておく。
std::locale::global(std::locale("C"))
iostream系を使う場合は個々にロケールを設定する。
std::wcout.imbue(std::locale(""))
std::wcin.imbue(std::locale(""))
VC++2008では確認した限り直ってる
139:デフォルトの名無しさん
08/06/18 10:13:21
>>136
ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る
どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん
140:91
08/06/18 12:57:25
レス遅くなってすみません。ありがとうございました。
色々方法はあることがわかりました。
オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。
privateメンバの中に書いてしまう方式で行こうかと思っています。
141:デフォルトの名無しさん
08/06/18 13:39:48
> 134
なるほど。
ありがとう、やってみる。
char dat[8] = "message";
HANDLE pipe_r;
HANDLE pipe_w;
BOOL res = CreatePipe(&pipe_r, &pipe_w, NULL, sizeof(dat));
DWORD dwSize = sizeof(dat);
DWORD dwResult;
WriteFile(pipe_w, (LPCVOID)dat, dwSize, &dwResult, NULL);
int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT);
FILE * fp;
fp = _fdopen(hCrt, "rb");
int n;
while((n = fgetc(fp)) != '\0'){
putchar(n);
}
fclose(fp);
// CloseHandle(pipe_r);
CloseHandle(pipe_w);
これでいいんかね?
この場合
CloseHandle(pipe_r);
するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
142:デフォルトの名無しさん
08/06/18 16:55:20
>>141
> するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
そういうこと。
_open_osfhandleの説明には、_closeが中でCloseHandleする、
_fdopenではfcloseが中で_closeすると書いてある。
あと、_open_osfhandleと_fdopenでモードの指定が食い違っているのと、
_open_osfhandleでのハンドルの型は、longではなく
intptr_t(またはINT_PTR)になっているということが気になった。
143:デフォルトの名無しさん
08/06/18 17:13:35
#include <iostream>
class intl{
public:
int il;
void setil(int &i){il=i;}
};
int main(){
int *i = new int;
*i = 1;
intl i_intl;
i_intl.setil(*i);
delete i;
std::cout << i_intl.il;
return 0;
}
というようなことをやると、1が出力されます。
私の理解ではintl::setil()は参照仮引数なので、呼び出し時に*iのアドレス、
つまりポインタiが渡され、*iとilが同一のメモリ領域を表すようになるのではと思います。
従ってiをdeleteしてしまうとilも消えるのではと思うのですが、そうなっていないようです。
私の考えのどこが間違っているでしょうか。よろしくお願いします。
144:デフォルトの名無しさん
08/06/18 17:24:12
ii_intl.ilが参照でもポインタでもないから、
setilの中では、iからilへ値がコピーされている。
145:デフォルトの名無しさん
08/06/18 17:24:59
deleteってのはオブジェクトをもう使わない、とシステムに返す命令。
中身をクリアするわけじゃない。
直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。
それを参照しているだけ。
いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。
146:デフォルトの名無しさん
08/06/18 17:26:08
げ、恥ずかしい。
144のいうとおりだった。
145は早とちり。
147:143
08/06/18 17:35:28
レスありがとうございます。
クラスintlの定義を変えて
class intl{
public:
int *il;
void setil(int &i){*il=i;}
};
とした場合はやはりdelete後もilが残り、
class intl{
public:
int *il;
void setil(int &i){il=&i;}
};
とした場合はdeleteによってilも消えるようです。
>>144によれば、iが参照渡しでかつilがポインタであっても
*il = i;
の場合はiのコピーが渡されるということのようですね…。
この場合、il自身はインスタンスi_intlが消えるまで生き残るということですよね?
うーん、ややこしい気がする…。
148:143
08/06/18 17:35:56
sage忘れすみません。
149:デフォルトの名無しさん
08/06/18 17:58:20
> int *il;
> void setil(int &i){*il=i;}
初期化してないポインタ il が指す場所に値を入れてるのでダメ。
150:デフォルトの名無しさん
08/06/18 18:58:58
参照をポインタと似たようなもんだと思っていたら訳ワカメになるよ。
どうやらポインタのほうも理解していないようなので、
まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。
151:デフォルトの名無しさん
08/06/18 20:19:58
巷じゃMozilla Firefox 3.0の話題でもちきりだが、4.0世代はC++で開発するんだな・・・
152:デフォルトの名無しさん
08/06/18 20:20:52
いまままではCC??
153:デフォルトの名無しさん
08/06/18 20:45:48
memcpyは第三引数が0であっても正常に動作する事が保証されていますか?
154:デフォルトの名無しさん
08/06/18 22:06:29
規格に 0 だとダメとか特に書いてないから 0 でも大丈夫。
155:デフォルトの名無しさん
08/06/18 22:07:42
派生の質問だけど、第3引数が 0 で第1第2引数が NULL の場合はどうなんだろ。
memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。
156:デフォルトの名無しさん
08/06/18 22:10:46
そういや、いつの間にか規格が文書内検索できるようになってた。
結構文句きてたんだろうな。
157:デフォルトの名無しさん
08/06/18 22:22:31
Foxit Readerで見れなくなっちまった。