【初心者歓迎】C/C++室 Ver.47【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/01/16(水) 15:14:51ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1198755167/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/01/16(水) 15:16:07乙
0003デフォルトの名無しさん
2008/01/16(水) 15:56:00同じ引数で何度も呼び出しても毎回返値が違う可能性がありますよね。
time()とか。
もし、ある関数に対して「同じ引数ならば常に同じ値を返し、かつ副作用が無い」ことをコンパイラに対して表明できれば、
あるケースにおいては最適化に有利だと思うのですが、
何らかの方法でそれをコンパイラに表明することはできますか?
int f(int x){return x+1;} //同じxに対して同じ値を返す
int main(){
for(int i=0; i<f(99); i+=f(0)) printf("%d", f(1)); //最適化可能?
return 0;
}
0004デフォルトの名無しさん
2008/01/16(水) 16:04:20定数を返す関数ならVC8などで関数がインライン化されてしまう
事はあるが、引数によって戻り値が違う場合は難しいかも。
0005デフォルトの名無しさん
2008/01/16(水) 16:05:16副作用がないことの表明にはならないけれど、C++のinlineはコンパイラにインライン展開を促す
00063
2008/01/16(水) 16:11:14たとえ同じ引数に対して常に同じ値を返すとしても、
インライン展開では毎回計算してしまうんですよね?
やはり自分で一時変数を確保しておくのが良いということですか
0007デフォルトの名無しさん
2008/01/16(水) 16:14:01そうでないコンパイラを使うなら、自前でキャッシュを持てばいいだろう。
0008デフォルトの名無しさん
2008/01/16(水) 16:14:41引数の取る数が限られている場合はテーブル展開するのが常識。
引数が実数だとそうは行かないが。
0009デフォルトの名無しさん
2008/01/16(水) 16:17:32出てくるような再帰的な関数の場合、整数のペアをstd::pairに
入れてキーにしてstd::mapに入れれば劇的に速くなる。
0010デフォルトの名無しさん
2008/01/16(水) 16:26:44・グローバル変数を参照しない
・ローカルstatic変数を持たない
・間接参照を用いてローカル変数以外の変数を参照しない
・初期化していない変数の値を返さない
・他の一意的でない関数を呼ばない
こんな感じか
0011デフォルトの名無しさん
2008/01/16(水) 17:01:31memoizeは自分で処理しないといけない
0012デフォルトの名無しさん
2008/01/16(水) 17:04:05プロジェクトをアセンブラにあまり劣らない速度を保ちつつ
開発を可能にしたのがC/C++
他の言語は必ずどこかで速度や効率を犠牲にしている
0013デフォルトの名無しさん
2008/01/16(水) 17:34:410014デフォルトの名無しさん
2008/01/16(水) 18:03:140015デフォルトの名無しさん
2008/01/16(水) 18:32:40__declspec(noalias)とか__attribute__((const))とかないわけではない。
0016デフォルトの名無しさん
2008/01/16(水) 18:45:59zlib.hはたぶん大丈夫だと思います。この前には
zlib.hが見つからないってエラーが出てたんですが
どっかのディレクトリにあったzlib.hを/usr/includeに
持ってきたらエラーは消えて現在に至る、と言うかんじです。
glutが足りないんでしょうか。Synapticで
lib-glut3
lib-glut3-dev
glut3
glut3-dev
freeglut3
freeglut3-dev
とかは入れたのですが。。。まだ他に入れなければいけないパッケージが
あるということでしょうか。
0017デフォルトの名無しさん
2008/01/16(水) 18:50:25glutが使ってるzlibが足りないとみたんだが。
gzFileはzlibで定義されてるはず
0018デフォルトの名無しさん
2008/01/16(水) 18:51:24ちゃんとインストールしてないんじゃないの?
001916
2008/01/16(水) 18:58:46/usr/src/linux-headers-2.6.22-14/include/linux/zlib.h
にあったのでこれを取ってきたのですが・・・
するとエラーが消えたのでこれでいいのかな、と思ったのですが・・
ちゃんとsynapticなりでインストールしなきゃいけないということでしょうか。
0020デフォルトの名無しさん
2008/01/16(水) 19:07:40そのzlib.hの中に gzFile の定義なかったらハズレ。ちゃんとzlibをイ
ンストールしましょう。
そもそも、ヘッダだけコピーしてもライブラリがなきゃリンクできない
じゃない。
002116
2008/01/16(水) 19:20:25とりあえずエラーは消えました。ただ
/tmp/ccqSOFll.o: In function `readfile':
cv109.c:(.text+0xa41d): undefined reference to `gzopen'
cv109.c:(.text+0xa5ce): undefined reference to `gzgets'
cv109.c:(.text+0xa5e4): undefined reference to `gzclose'
というエラーが出てしまって…GLUTのライブラリを読み込めていないということでしょうか。
Synapticで
freeglut3
glut
libglut
関連は入れてるので多分大丈夫だと思うのですが。。。
コンパイルするコマンドは
gcc -lglut -lGLU -lGL cv109.c
でいいのでしょうか?
0022デフォルトの名無しさん
2008/01/16(水) 19:41:500023デフォルトの名無しさん
2008/01/16(水) 19:53:09int main(){
int x = 10;
float f = 5.5;
const int& r = (int)x, &s = (int)f;
x = 8;
f = 1.00;
std::cout << x << ',' << r << std::endl;
std::cout << f << ',' << s << std::endl;
return 0;
}
実行結果
8,8
1,5
同じキャストでも元の型と同じ型にキャストすると変数自体へのリファレンス、
違う型にキャストすると一時値へのリファレンスになります。
(int)xの方は最適化が働いているんだろうと思いますが、
このように同じキャストでも結果が違うのは仕様に準拠したものでしょうか?
コンパイラはbccです。
002416
2008/01/16(水) 20:09:37お手数をお掛け致しましたm(_ _)m
0025デフォルトの名無しさん
2008/01/16(水) 20:48:20処理
if(条件)
構造体の宣言を新しく追加 //例えばkouzoutai hoge[0]、hoge[1]、hoge[2]…
}
ってしたいんだけどどうやって書けばいいの?
0026デフォルトの名無しさん
2008/01/16(水) 20:50:06>>14 の言ってる constexpr ってのが次期 C++ に入る予定。
関数の戻り値をコンパイル時に定数にできる。
ただし、return 文しかない関数じゃないとダメだけど。
あるいは、今でもテンプレート引数と静的メンバ定数を利用して
似たような物を作る事もできる。
複雑な事やろうとしたら再帰するしかない。
制御文も使えないけど、? : は使えるから意外と色々出来るよ。
0027デフォルトの名無しさん
2008/01/16(水) 20:53:38宣言は追加できません。配列の要素数を増やしたいなら、std::vectorでも使えばよろしいかと。
0028デフォルトの名無しさん
2008/01/16(水) 20:56:19同一の型へのキャストはno effectだったという記憶があるような
ないような。
0029デフォルトの名無しさん
2008/01/16(水) 20:57:18ありがとう。そうすることにします
0030デフォルトの名無しさん
2008/01/16(水) 20:57:37つまり最適化ではなく、標準どおりかと
思うような思わないような。
0031デフォルトの名無しさん
2008/01/16(水) 21:04:56入力
string line = "11 22 33 44";
char delim = ' ';
出力
vector<int> v ← 11,22,33,44 (要素4個のベクタ)
という関数をつくろうとして、それはできたのですが、次に
stringからintへ変換するunary_functionを引数で渡して(1)、上記関数内で
transform()に渡そう(2)としたのですが、上手くいきません。前スレで教えてもらって
(1)の引数で渡すところまではできたのですが、(2)のtransformに渡す所でコンパイル
が通りません。どこが間違っているのでしょうか?
vector<int> line2vec2(string line, char delim, unary_function<string,int> func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}
よろしくお願いします。
0032デフォルトの名無しさん
2008/01/16(水) 21:18:07v, v2の型は何だ。
0033デフォルトの名無しさん
2008/01/16(水) 21:21:28一時オブジェクトが作られてるね。一時オブジェクトそのものは仕様にあると思う。
コンパイラの警告レベルを上げると一時オブジェクトを作った警告が出せるコンパイラもあったと思う。
0034デフォルトの名無しさん
2008/01/16(水) 21:29:21ありがとうございます
すっきりしました
>>33
bccでもconstを外すと「一時変数を云々」という旨の警告が出ます。
0035デフォルトの名無しさん
2008/01/16(水) 21:30:11VC++ 2008でも同じ結果。
キャストの結果は右辺値(一時オブジェクト)
これは仕様。ただし、同じ型へのキャストはno effect
だったと思うような思わないような。
メイヤーズかなんかの本でチラっと書いて
あった気がする。
0036デフォルトの名無しさん
2008/01/16(水) 21:30:25ありがとうございます
すっきりしました
0037デフォルトの名無しさん
2008/01/16(水) 21:33:00それは標準準拠してないから。
bccは非constリファレンスでも左辺値以外の値を
参照できてしまう。
0038デフォルトの名無しさん
2008/01/16(水) 22:41:31すいません。
コンパイルエラー
test.cpp:73: instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:936: error: no match for call to
'(std::unary_function<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, int>) (std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&)'
vの型vector<string>
v2の型vector<int>
です。
先の関数はこんな感じ() {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
0039デフォルトの名無しさん
2008/01/16(水) 22:42:34std::for_each(pens.begin(), pens.end(), ここ);
と書くと、「ここ」の関数に
std::pair<wstring, HPEN>
が渡されると思うのですが、
BOOL DeleteObject(HGDIOBJ)なので
都合よくHPENだけ渡す方法はないでしょうか?
0040デフォルトの名無しさん
2008/01/16(水) 22:56:11テキストボックスにリンクを複数貼ってクリックするとフォームが開き
その開くフォームがフォルダダイアログだったりアドレス入力フォームだったりと
一行ずつ異なるリンク付きテキストボックスはどのようにつくればいいのでしょうか?
RichTextBoxで作ろうにもリンクしている文字列が開いたフォームで変えられるので
LinkClickedのリンク文字列で判断は難しく、同名のリンクが複数あった場合などで困っております。
どなたか良い方法を教えてください。
0041デフォルトの名無しさん
2008/01/16(水) 22:59:43ファンクタ
0042デフォルトの名無しさん
2008/01/16(水) 23:03:48unary_function型そのものには関数呼び出しが定義されてないからエラー
そもそもunary_function型はそのように使うことを想定されていない
template <typename T> vector<int> line2vec2(string line, char delim, const T& func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}
0043デフォルトの名無しさん
2008/01/16(水) 23:06:14コメント残しっぱだし……
template <typename T> vector<int> line2vec2(string line, char delim)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),T());
return v2;
}
0044デフォルトの名無しさん
2008/01/16(水) 23:47:030045デフォルトの名無しさん
2008/01/17(木) 01:03:03場合ですが、引き算・掛け算の計算方法を誰か言葉で説明してください!
例えば足し算なら
「下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる」
となるんですが。。
おねがいします!
0046デフォルトの名無しさん
2008/01/17(木) 01:08:08aとbの掛け算なら、aをb回足し算すればいいと思うよ
0047デフォルトの名無しさん
2008/01/17(木) 01:19:590048デフォルトの名無しさん
2008/01/17(木) 01:30:2450桁の掛け算なんですがそれで大丈夫ですかね?(+_+)
やってみます!
あざす!
>>47
筆算みたいに計算するって書いたら先生にそんな単純に書くなって言われました↓
でもあざす!
0049デフォルトの名無しさん
2008/01/17(木) 09:35:35入れるのがよいのでしょうか?2 となっているコードもあるし
4となっているコードもあります.
0050デフォルトの名無しさん
2008/01/17(木) 09:36:213や5でもいいですよ。
0051デフォルトの名無しさん
2008/01/17(木) 11:44:490052デフォルトの名無しさん
2008/01/17(木) 11:49:01ありがとうございます。
そうすると、unary_function()を引数にもらって、それを内部で使う関数というのは
かけないのですか?
void *のポインタをもらって、内部で適当にキャストして、unary_function()として
使えたりしないのかな。
とりあえずやってみます。
0053デフォルトの名無しさん
2008/01/17(木) 12:13:01b=1/7.90,1/8.12,1/8.23,1/8.56,1/7.97,1/8.68
と仮定する。
for ($i=0; $i<=5; $i++) {
$p1 = (1/$a[$i])**$a * (1-1/$a[$i])**($play-$a);
$p2 = (1/$b[$i])**$b * (1-1/$b[$i])**($play-$b);
$p3 = $p1 * $p2;
$t_ap += $p1; push(@ap,$p1);
$t_bp += $p2; push(@bp,$p2);
$t_abp += $p3; push(@abp, $p3);
}
上記の構文で計算すると分母に差があるのでオーバーフローを起こす・・・と言われました。
**($play-$a);←この部分の計算に問題があるようなのですが、プログラムに疎いので良く判りません><
問題のある部分をどのように記述するべきなのかご指導お願い致します。m(_ _)m
0054デフォルトの名無しさん
2008/01/17(木) 12:18:480055デフォルトの名無しさん
2008/01/17(木) 12:20:36すいませんm(_ _)m
どこで聞けば良いのでしょう?
0056デフォルトの名無しさん
2008/01/17(木) 12:21:39http://pc11.2ch.net/tech/subback.html
0057デフォルトの名無しさん
2008/01/17(木) 12:22:31unary_functionへの参照をもらえばいいんじゃないかね
0058デフォルトの名無しさん
2008/01/17(木) 12:24:01それすら判りません><
0059デフォルトの名無しさん
2008/01/17(木) 12:26:19Perlについての質問箱 34箱目
http://pc11.2ch.net/test/read.cgi/tech/1199977642/
0060デフォルトの名無しさん
2008/01/17(木) 12:26:460061デフォルトの名無しさん
2008/01/17(木) 12:29:49仮想関数になってんの?
0062デフォルトの名無しさん
2008/01/17(木) 12:53:200063デフォルトの名無しさん
2008/01/17(木) 12:54:49じゃあunary_function型で引数を取ること自体が意味無い、だよね
0064デフォルトの名無しさん
2008/01/17(木) 13:02:36M:\>sort3.exe
入力ファイル名:
と表示されて、そこからどうすればいいかわかりません。
ファイル入出力とソートの宿題なのですが、
いかんせん超がつくほどの初心者なので…。
どなたかよろしかったらお願いします。
使っているソフトはVisual C++ 2005 Express Edition です。
0065デフォルトの名無しさん
2008/01/17(木) 13:03:04/* sort3.c */
#include <stdio.h>
struct kamoku { char mei[20];
char kana[10];
int ei;
int koku;
int su;
int sha;
int ri;
}
#define SIZE 30
main(){
struct kamoku seiseki[SIZE], min;
int i,j,m,n;
FILE *input, *output;
char infname[16], outfname[16];
printf("入力ファイル名: ");
scanf("%s",infname);
printf("出力ファイル名: ");
scanf("%s",outfname);
if((input=fopen(infname,"r")) == NULL ){
printf("ファイルがありません\n");
exit(1);
}
if((output=fopen(infname,"r")) == NULL ){
printf("ファイルが作成できません\n");
exit(1);
}
0066デフォルトの名無しさん
2008/01/17(木) 13:06:19入力ファイル名を入力する。
・・・ってかプログラム以前にパソコン教室に通うべきだな。
0067デフォルトの名無しさん
2008/01/17(木) 13:12:05どのようなファイルを入力すべきかがわかりません。
初心者ですみません。
0068デフォルトの名無しさん
2008/01/17(木) 13:15:42鼬害。キーボードの使い方やファイルとは何かと言ったことは
プログラミング以前の知識です。
0069デフォルトの名無しさん
2008/01/17(木) 13:18:13ちゃんと授業にはでようね
0070デフォルトの名無しさん
2008/01/17(木) 13:24:44やってみましたが、ダメなようです。
vector<int> line2vec2(string line, char delim, const unary_function<string,int> &func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func());
return v2;
}
>>61
仮想関数になっているかどうかはよくわかりませんでしたが、
stlのソースを見ていると、pointer_to_unary_functionというクラスが
ありました。今度はこれで試してみる。
0071デフォルトの名無しさん
2008/01/17(木) 13:40:250072デフォルトの名無しさん
2008/01/17(木) 13:41:27もうなんだかわけがわからなくなってきた。
unary_functionはArgとResのtypedefなんですか?
STLのコンパイルエラーメッセージはやくにたたん。
0073デフォルトの名無しさん
2008/01/17(木) 13:53:510074デフォルトの名無しさん
2008/01/17(木) 14:14:06そもそもunary_functionを引数にしようとした理由は?
普通継承したファンクタ作るよね
0075デフォルトの名無しさん
2008/01/17(木) 14:17:44std::bind2ndなどのアダプタがargument_typeとresult_typeを
必要とするから。
それ以上の意味はない。別にstd::unary_functionを継承しなくても
自分でargument_typeとresult_typeをtypedefしてもいい。
0076デフォルトの名無しさん
2008/01/17(木) 14:33:29template <typename T>
vector<int> line2vec2(string line, char delim, T func) {
transform(v.begin(), v.end(), v2.begin(), func());
}
line2vec2( , , std::ptr_fun(関数ポインタ));
line2vec2( , , 関数オブジェクト());
0077デフォルトの名無しさん
2008/01/17(木) 14:35:18>transform(v.begin(), v.end(), v2.begin(), func());
transform(v.begin(), v.end(), v2.begin(), func);こうだな
0078デフォルトの名無しさん
2008/01/17(木) 15:04:35>>42-43
0079デフォルトの名無しさん
2008/01/17(木) 15:06:07今回のエラーメッセージは割と理解できるものだし、
そもそも何が駄目なのか指摘されてるのに
まるで見当違いの方法を試しているのはお前自身だ
0081デフォルトの名無しさん
2008/01/17(木) 15:45:44おう、こりゃ失礼
0082コンパイルできた
2008/01/17(木) 15:48:16ソースは以下です。
template <class T, typename T2>
vector<T> line2vec2(string line, char delim, T2 func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<T> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
この関数をこんな感じで使う。
string s = "1 2 3 4 5 - 6 7 8 9";
vector<int> v = line2vec2<int>(s, ' ', string2int());
0083コンパイルできた
2008/01/17(木) 15:48:54ちなみにstring2int()は以下のように定義しました。
class string2int : public unary_function<string,int> {
public:
unary_function<string,int>::result_type operator() (unary_function<string,int>::argument_type str) {
if (str == "-")return 0;
else return static_cast<int>(atoi(str.c_str()));
}
};
いやー、すげえ感謝感謝。今回答えてくれた方々には昼飯一回おごってもいいくらいス。
0084デフォルトの名無しさん
2008/01/17(木) 15:57:070085デフォルトの名無しさん
2008/01/17(木) 16:04:00もうちょっと本買って読んだ方がいいな
0086デフォルトの名無しさん
2008/01/17(木) 16:04:23えらく大変だな
0088デフォルトの名無しさん
2008/01/17(木) 20:00:30#include <cstdio>
char ch[10];
int main()
{
while ((cin.getlie(char, 10)) != EOF) {
}
}
これをコンパイルしようとするとwhileの行でエラーが出るのですが、
何がいけないのでしょうか??
008988
2008/01/17(木) 20:02:080090デフォルトの名無しさん
2008/01/17(木) 20:03:38余分なものが付いているk 「ar」 a
0091デフォルトの名無しさん
2008/01/17(木) 20:04:320092デフォルトの名無しさん
2008/01/17(木) 20:04:36分かってるとは思うけど
0093デフォルトの名無しさん
2008/01/17(木) 20:04:38std:: n が足りない
009488
2008/01/17(木) 20:12:05すいません色々抜けていました。。orz
正しくはこれです。
#include <iostream>
#include <cstdio>
using namespace std;
char ch[10];
int main()
{
while ((cin.getline(ch, 8)) != EOF) {
cout << "test";
}
}
これでもコンパイルできないのです。
whileの行でエラー出ます。
0095デフォルトの名無しさん
2008/01/17(木) 20:14:35!= EOFこれが不要。
質問するときはエラーの内容も書いてくれ。
0096デフォルトの名無しさん
2008/01/17(木) 20:14:54#include <iostream>
char ch[10];
int main()
{
while (std::cin.getline(ch, 8)) {
std::cout << "test";
}
}
0097デフォルトの名無しさん
2008/01/17(木) 20:35:00int main()
{
char ch[10];
while (std::cin.getline(ch, sizeof ch)) {
std::cout << "test";
}
}
0098デフォルトの名無しさん
2008/01/17(木) 21:21:43でファイルの更新を検知するプログラムを作りたいのですが、
更新までブロックする関数を教えてください。
if (ファイルの更新までブロック)
{
//更新された
read();
...
}
みたいなカンジです。
ちなみにtailのソースを見てみたのですが、
1秒毎にファイルが更新されたかチェックして処理をしているようです。
何秒毎にチェックするのではなく、更新までブロックできる関数がわかればいいです。
よろしくお願いします。
0099デフォルトの名無しさん
2008/01/17(木) 21:29:340100デフォルトの名無しさん
2008/01/17(木) 21:38:030101デフォルトの名無しさん
2008/01/17(木) 21:42:18FindFirstChangeNotification/FindNextChangeNotification って API があるから
他の OS でもそういう API があるんじゃないかと思う気持ちも分からんでも無い。
■ このスレッドは過去ログ倉庫に格納されています