08/01/16 15:14:51
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:デフォルトの名無しさん
08/01/16 15:16:07
>>1
乙
3:デフォルトの名無しさん
08/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;
}
4:デフォルトの名無しさん
08/01/16 16:04:20
>>3
定数を返す関数ならVC8などで関数がインライン化されてしまう
事はあるが、引数によって戻り値が違う場合は難しいかも。
5:デフォルトの名無しさん
08/01/16 16:05:16
>>3
副作用がないことの表明にはならないけれど、C++のinlineはコンパイラにインライン展開を促す
6:3
08/01/16 16:11:14
たとえば>>3のf()がやたら複雑な計算を要する場合とか、
たとえ同じ引数に対して常に同じ値を返すとしても、
インライン展開では毎回計算してしまうんですよね?
やはり自分で一時変数を確保しておくのが良いということですか
7:デフォルトの名無しさん
08/01/16 16:14:01
賢いコンパイラならそこを最適化できるかもしれないが、
そうでないコンパイラを使うなら、自前でキャッシュを持てばいいだろう。
8:デフォルトの名無しさん
08/01/16 16:14:41
>>6
引数の取る数が限られている場合はテーブル展開するのが常識。
引数が実数だとそうは行かないが。
9:デフォルトの名無しさん
08/01/16 16:17:32
例えばアッカーマン関数のような何度も同じ整数のペアが
出てくるような再帰的な関数の場合、整数のペアをstd::pairに
入れてキーにしてstd::mapに入れれば劇的に速くなる。
10:デフォルトの名無しさん
08/01/16 16:26:44
次の全ての条件に当てはまる関数を一意的な関数と呼ぶ
・グローバル変数を参照しない
・ローカルstatic変数を持たない
・間接参照を用いてローカル変数以外の変数を参照しない
・初期化していない変数の値を返さない
・他の一意的でない関数を呼ばない
こんな感じか
11:デフォルトの名無しさん
08/01/16 17:01:31
C/C++は余計なことしないからなあ
memoizeは自分で処理しないといけない
12:デフォルトの名無しさん
08/01/16 17:04:05
アセンブラじゃあ開発期間が長すぎる or 開発不可能な
プロジェクトをアセンブラにあまり劣らない速度を保ちつつ
開発を可能にしたのがC/C++
他の言語は必ずどこかで速度や効率を犠牲にしている
13:デフォルトの名無しさん
08/01/16 17:34:41
あ
14:デフォルトの名無しさん
08/01/16 18:03:14
constexpr待ちsage
15:デフォルトの名無しさん
08/01/16 18:32:40
>>3
__declspec(noalias)とか__attribute__((const))とかないわけではない。
16:デフォルトの名無しさん
08/01/16 18:45:59
前スレ995です。
zlib.hはたぶん大丈夫だと思います。この前には
zlib.hが見つからないってエラーが出てたんですが
どっかのディレクトリにあったzlib.hを/usr/includeに
持ってきたらエラーは消えて現在に至る、と言うかんじです。
glutが足りないんでしょうか。Synapticで
lib-glut3
lib-glut3-dev
glut3
glut3-dev
freeglut3
freeglut3-dev
とかは入れたのですが。。。まだ他に入れなければいけないパッケージが
あるということでしょうか。
17:デフォルトの名無しさん
08/01/16 18:50:25
zlibのバージョンは?
glutが使ってるzlibが足りないとみたんだが。
gzFileはzlibで定義されてるはず
18:デフォルトの名無しさん
08/01/16 18:51:24
つーか、どっかのディレクトリにあったのを自分でコピーするって、、
ちゃんとインストールしてないんじゃないの?
19:16
08/01/16 18:58:46
findで調べてみたら
/usr/src/linux-headers-2.6.22-14/include/linux/zlib.h
にあったのでこれを取ってきたのですが・・・
するとエラーが消えたのでこれでいいのかな、と思ったのですが・・
ちゃんとsynapticなりでインストールしなきゃいけないということでしょうか。
20:デフォルトの名無しさん
08/01/16 19:07:40
>>19
そのzlib.hの中に gzFile の定義なかったらハズレ。ちゃんとzlibをイ
ンストールしましょう。
そもそも、ヘッダだけコピーしてもライブラリがなきゃリンクできない
じゃない。
21:16
08/01/16 19:20:25
なるほど。。お恥ずかしい限りです。Synapticでzlibっぽいのをインストールしたところ
とりあえずエラーは消えました。ただ
/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
でいいのでしょうか?
22:デフォルトの名無しさん
08/01/16 19:41:50
-lz
23:デフォルトの名無しさん
08/01/16 19:53:09
#include <iostream>
int 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です。
24:16
08/01/16 20:09:37
-lz をつけると問題なく動きました。ありがとうございます。
お手数をお掛け致しましたm(_ _)m
25:デフォルトの名無しさん
08/01/16 20:48:20
while(条件){
処理
if(条件)
構造体の宣言を新しく追加 //例えばkouzoutai hoge[0]、hoge[1]、hoge[2]…
}
ってしたいんだけどどうやって書けばいいの?
26:デフォルトの名無しさん
08/01/16 20:50:06
>>3
>>14 の言ってる constexpr ってのが次期 C++ に入る予定。
関数の戻り値をコンパイル時に定数にできる。
ただし、return 文しかない関数じゃないとダメだけど。
あるいは、今でもテンプレート引数と静的メンバ定数を利用して
似たような物を作る事もできる。
複雑な事やろうとしたら再帰するしかない。
制御文も使えないけど、? : は使えるから意外と色々出来るよ。
27:デフォルトの名無しさん
08/01/16 20:53:38
>>25
宣言は追加できません。配列の要素数を増やしたいなら、std::vectorでも使えばよろしいかと。
28:デフォルトの名無しさん
08/01/16 20:56:19
>>23
同一の型へのキャストはno effectだったという記憶があるような
ないような。
29:デフォルトの名無しさん
08/01/16 20:57:18
>>27
ありがとう。そうすることにします
30:デフォルトの名無しさん
08/01/16 20:57:37
>>23
つまり最適化ではなく、標準どおりかと
思うような思わないような。
31:デフォルトの名無しさん
08/01/16 21:04:56
前スレからの続きのunary_functionに関する質問です。
入力
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;
}
よろしくお願いします。
32:デフォルトの名無しさん
08/01/16 21:18:07
コンパイルエラー書け。
v, v2の型は何だ。
33:デフォルトの名無しさん
08/01/16 21:21:28
>>23
一時オブジェクトが作られてるね。一時オブジェクトそのものは仕様にあると思う。
コンパイラの警告レベルを上げると一時オブジェクトを作った警告が出せるコンパイラもあったと思う。
34:デフォルトの名無しさん
08/01/16 21:29:21
>>28>>30
ありがとうございます
すっきりしました
>>33
bccでもconstを外すと「一時変数を云々」という旨の警告が出ます。
35:デフォルトの名無しさん
08/01/16 21:30:11
>>23
VC++ 2008でも同じ結果。
キャストの結果は右辺値(一時オブジェクト)
これは仕様。ただし、同じ型へのキャストはno effect
だったと思うような思わないような。
メイヤーズかなんかの本でチラっと書いて
あった気がする。
36:デフォルトの名無しさん
08/01/16 21:30:25
>>28>>30
ありがとうございます
すっきりしました
37:デフォルトの名無しさん
08/01/16 21:33:00
>>34
それは標準準拠してないから。
bccは非constリファレンスでも左辺値以外の値を
参照できてしまう。
38:デフォルトの名無しさん
08/01/16 22:41:31
>>32
すいません。
コンパイルエラー
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;
}
39:デフォルトの名無しさん
08/01/16 22:42:34
std::map<wstring, HPEN> pens;
std::for_each(pens.begin(), pens.end(), ここ);
と書くと、「ここ」の関数に
std::pair<wstring, HPEN>
が渡されると思うのですが、
BOOL DeleteObject(HGDIOBJ)なので
都合よくHPENだけ渡す方法はないでしょうか?
40:デフォルトの名無しさん
08/01/16 22:56:11
Microsoft OutLook 2003のメールのルール仕分けにあるような
テキストボックスにリンクを複数貼ってクリックするとフォームが開き
その開くフォームがフォルダダイアログだったりアドレス入力フォームだったりと
一行ずつ異なるリンク付きテキストボックスはどのようにつくればいいのでしょうか?
RichTextBoxで作ろうにもリンクしている文字列が開いたフォームで変えられるので
LinkClickedのリンク文字列で判断は難しく、同名のリンクが複数あった場合などで困っております。
どなたか良い方法を教えてください。
41:デフォルトの名無しさん
08/01/16 22:59:43
>>39
ファンクタ
42:デフォルトの名無しさん
08/01/16 23:03:48
>>31>>38
unary_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;
}
43:デフォルトの名無しさん
08/01/16 23:06:14
間違えたw
コメント残しっぱだし……
template <typename T> vector<int> line2vec2(string line, char delim)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),T());
return v2;
}
44:デフォルトの名無しさん
08/01/16 23:47:03
そこでU+2028の改行ですよ。
45:デフォルトの名無しさん
08/01/17 01:03:03
"数値を文字列として入力して、一桁ずつを配列にいれて計算する"
場合ですが、引き算・掛け算の計算方法を誰か言葉で説明してください!
例えば足し算なら
「下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる」
となるんですが。。
おねがいします!
46:デフォルトの名無しさん
08/01/17 01:08:08
>>45
aとbの掛け算なら、aをb回足し算すればいいと思うよ
47:デフォルトの名無しさん
08/01/17 01:19:59
筆算の要領で計算すりゃいいんじゃないの
48:デフォルトの名無しさん
08/01/17 01:30:24
>>46
50桁の掛け算なんですがそれで大丈夫ですかね?(+_+)
やってみます!
あざす!
>>47
筆算みたいに計算するって書いたら先生にそんな単純に書くなって言われました↓
でもあざす!
49:デフォルトの名無しさん
08/01/17 09:35:35
C/C++ では標準的にインデントとしていくつのスペースを
入れるのがよいのでしょうか?2 となっているコードもあるし
4となっているコードもあります.
50:デフォルトの名無しさん
08/01/17 09:36:21
4でも6でも8でも構いません。
3や5でもいいですよ。
51:デフォルトの名無しさん
08/01/17 11:44:49
標準なんてないだろう。俺は4だけど。
52:デフォルトの名無しさん
08/01/17 11:49:01
>>42-43
ありがとうございます。
そうすると、unary_function()を引数にもらって、それを内部で使う関数というのは
かけないのですか?
void *のポインタをもらって、内部で適当にキャストして、unary_function()として
使えたりしないのかな。
とりあえずやってみます。
53:デフォルトの名無しさん
08/01/17 12:13:01
a=1/350,1/320,1/360,1/368,1/397,1/400
b=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
54:デフォルトの名無しさん
08/01/17 12:18:48
ここは、C/C++のスレなんだが
55:デフォルトの名無しさん
08/01/17 12:20:36
>>54
すいませんm(_ _)m
どこで聞けば良いのでしょう?
56:デフォルトの名無しさん
08/01/17 12:21:39
自分の使ってる言語のスレを探せばいいだろうが
URLリンク(pc11.2ch.net)
57:デフォルトの名無しさん
08/01/17 12:22:31
>>52
unary_functionへの参照をもらえばいいんじゃないかね
58:デフォルトの名無しさん
08/01/17 12:24:01
>>56
それすら判りません><
59:デフォルトの名無しさん
08/01/17 12:26:19
>>58
Perlについての質問箱 34箱目
スレリンク(tech板)
60:デフォルトの名無しさん
08/01/17 12:26:46
コマンド名か、コンパイル時の画面に書いてないか。
61:デフォルトの名無しさん
08/01/17 12:29:49
unary_functionの関数呼び出し演算子って
仮想関数になってんの?
62:デフォルトの名無しさん
08/01/17 12:53:20
unary_functionはテンプレート引数をargument_typeとresult_typeにtypedefしてるだけにすぎん
63:デフォルトの名無しさん
08/01/17 12:54:49
だよねやっぱ
じゃあunary_function型で引数を取ること自体が意味無い、だよね
64:デフォルトの名無しさん
08/01/17 13:02:36
以下のソースプログラムをコンパイルして実行したのですが
M:\>sort3.exe
入力ファイル名:
と表示されて、そこからどうすればいいかわかりません。
ファイル入出力とソートの宿題なのですが、
いかんせん超がつくほどの初心者なので…。
どなたかよろしかったらお願いします。
使っているソフトはVisual C++ 2005 Express Edition です。
65:デフォルトの名無しさん
08/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);
}
66:デフォルトの名無しさん
08/01/17 13:06:19
>>64
入力ファイル名を入力する。
・・・ってかプログラム以前にパソコン教室に通うべきだな。
67:デフォルトの名無しさん
08/01/17 13:12:05
>>66
どのようなファイルを入力すべきかがわかりません。
初心者ですみません。
68:デフォルトの名無しさん
08/01/17 13:15:42
>>67
鼬害。キーボードの使い方やファイルとは何かと言ったことは
プログラミング以前の知識です。
69:デフォルトの名無しさん
08/01/17 13:18:13
>>67
ちゃんと授業にはでようね
70:デフォルトの名無しさん
08/01/17 13:24:44
>>57
やってみましたが、ダメなようです。
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というクラスが
ありました。今度はこれで試してみる。
71:デフォルトの名無しさん
08/01/17 13:40:25
なんか無駄に複雑な事になってるな
72:デフォルトの名無しさん
08/01/17 13:41:27
>>70のつづき
もうなんだかわけがわからなくなってきた。
unary_functionはArgとResのtypedefなんですか?
STLのコンパイルエラーメッセージはやくにたたん。
73:デフォルトの名無しさん
08/01/17 13:53:51
普通std::unary_functionは継承して使わないと役に立たないと思うんだが。
74:デフォルトの名無しさん
08/01/17 14:14:06
>>72
そもそもunary_functionを引数にしようとした理由は?
普通継承したファンクタ作るよね
75:デフォルトの名無しさん
08/01/17 14:17:44
std::unary_functionやstd::binary_functionを継承する理由は
std::bind2ndなどのアダプタがargument_typeとresult_typeを
必要とするから。
それ以上の意味はない。別にstd::unary_functionを継承しなくても
自分でargument_typeとresult_typeをtypedefしてもいい。
76:デフォルトの名無しさん
08/01/17 14:33:29
こんな感じか?
template <typename T>
vector<int> line2vec2(string line, char delim, T func) {
transform(v.begin(), v.end(), v2.begin(), func());
}
line2vec2( , , std::ptr_fun(関数ポインタ));
line2vec2( , , 関数オブジェクト());
77:デフォルトの名無しさん
08/01/17 14:35:18
間違えた
>transform(v.begin(), v.end(), v2.begin(), func());
transform(v.begin(), v.end(), v2.begin(), func);こうだな
78:デフォルトの名無しさん
08/01/17 15:04:35
>>76-77
>>42-43
79:デフォルトの名無しさん
08/01/17 15:06:07
>>72
今回のエラーメッセージは割と理解できるものだし、
そもそも何が駄目なのか指摘されてるのに
まるで見当違いの方法を試しているのはお前自身だ
80:76
08/01/17 15:10:05
>>78
>>43はstd::ptr_funが使えない。
81:デフォルトの名無しさん
08/01/17 15:45:44
>>80
おう、こりゃ失礼
82:コンパイルできた
08/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());
83:コンパイルできた
08/01/17 15:48:54
<82の続きです>
ちなみに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()));
}
};
いやー、すげえ感謝感謝。今回答えてくれた方々には昼飯一回おごってもいいくらいス。
84:デフォルトの名無しさん
08/01/17 15:57:07
昼飯一回程度の感謝
85:デフォルトの名無しさん
08/01/17 16:04:00
>>83
もうちょっと本買って読んだ方がいいな
86:デフォルトの名無しさん
08/01/17 16:04:23
名無しの書き込みから個人を特定して昼飯をおごる程の感謝
えらく大変だな
87:76
08/01/17 17:44:29
>>83
昼飯はいいから俺がニート脱出できるように神様にお願いしといてください。
88:デフォルトの名無しさん
08/01/17 20:00:30
#include <iostream>
#include <cstdio>
char ch[10];
int main()
{
while ((cin.getlie(char, 10)) != EOF) {
}
}
これをコンパイルしようとするとwhileの行でエラーが出るのですが、
何がいけないのでしょうか??
89:88
08/01/17 20:02:08
すいませんwhileの行のcharはchの間違いです。
90:デフォルトの名無しさん
08/01/17 20:03:38
>>88
余分なものが付いているk 「ar」 a
91:デフォルトの名無しさん
08/01/17 20:04:32
getlie
92:デフォルトの名無しさん
08/01/17 20:04:36
getlie ではなくて getline な。
分かってるとは思うけど
93:デフォルトの名無しさん
08/01/17 20:04:38
>>88
std:: n が足りない
94:88
08/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の行でエラー出ます。
95:デフォルトの名無しさん
08/01/17 20:14:35
>>94
!= EOFこれが不要。
質問するときはエラーの内容も書いてくれ。
96:デフォルトの名無しさん
08/01/17 20:14:54
>>94
#include <iostream>
char ch[10];
int main()
{
while (std::cin.getline(ch, 8)) {
std::cout << "test";
}
}
97:デフォルトの名無しさん
08/01/17 20:35:00
#include <iostream>
int main()
{
char ch[10];
while (std::cin.getline(ch, sizeof ch)) {
std::cout << "test";
}
}
98:デフォルトの名無しさん
08/01/17 21:21:43
Fedora6 gcc
でファイルの更新を検知するプログラムを作りたいのですが、
更新までブロックする関数を教えてください。
if (ファイルの更新までブロック)
{
//更新された
read();
...
}
みたいなカンジです。
ちなみにtailのソースを見てみたのですが、
1秒毎にファイルが更新されたかチェックして処理をしているようです。
何秒毎にチェックするのではなく、更新までブロックできる関数がわかればいいです。
よろしくお願いします。
99:デフォルトの名無しさん
08/01/17 21:29:34
なんでそんなものが存在するという前提で物事を進めようとするの?
100:デフォルトの名無しさん
08/01/17 21:38:03
てゆーかチェックせずに、更新されると発見してほしいのかよwwwwwwwww
101:デフォルトの名無しさん
08/01/17 21:42:18
Windows だとディレクトリの更新を検知してシグナル送ってくれる
FindFirstChangeNotification/FindNextChangeNotification って API があるから
他の OS でもそういう API があるんじゃないかと思う気持ちも分からんでも無い。
102:デフォルトの名無しさん
08/01/17 21:53:22
>>98
Linuxなら可能。
dnotify inotify といったキーワードで調べてみて。
103:デフォルトの名無しさん
08/01/17 22:30:53
プログラムって教科で分けると数学ということですか?
104:デフォルトの名無しさん
08/01/17 22:35:11
>>103
いや、国語だろ
105:デフォルトの名無しさん
08/01/17 22:38:31
普通に、技術家庭科。
実際、技術家庭科の時間にVBプログラミングやらされてたし。
106:デフォルトの名無しさん
08/01/17 22:39:31
情報だろ
107:デフォルトの名無しさん
08/01/17 22:45:09
統一された見解が無いということですか?
哲学っぽいですね。
108:デフォルトの名無しさん
08/01/17 22:47:06
分野でいうと情報処理だろうな。
つか、いちいちageんなって。
109:デフォルトの名無しさん
08/01/17 22:51:45
>>99
Winだと
URLリンク(www.google.co.jp)
みたいな感じで、存在するんだよ。だから、98もそこから、Linuxにも存在すると期待してるんじゃないかな……
ちなみに、俺は知らん。
110:デフォルトの名無しさん
08/01/17 23:01:49
高専だと、情報基礎以外に、制御とか計算機科学、電子、通信、ソフ技、ハード技、プロ技
至る所でプログラミング漬けだったけど。時代遅れのw
111:デフォルトの名無しさん
08/01/17 23:02:50
>>102
具体的にありがとうございます。
手詰まりだったので、大変助かりました。
ありがとうございました。
>>100
何が言いたいのか分かりません。
112:デフォルトの名無しさん
08/01/17 23:15:41
>>110
そういえば親戚に情報基礎の教科書見せてもらったら15年前と大差なくてワロタ
113:デフォルトの名無しさん
08/01/17 23:17:49
15年前って言うと、数学の教科書の後ろの方に載ってる、
実際には授業で何にも使われない BASIC のことか?
114:デフォルトの名無しさん
08/01/17 23:20:48
基礎は不滅です。
115:デフォルトの名無しさん
08/01/17 23:23:16
流動的なものは情報Aなんかに任せとけば良いよ。
116:デフォルトの名無しさん
08/01/17 23:30:52
>>113
入力・出力・制御・演算・記憶
FFの応用回路・BASIC・CASL
のあたり。
117:デフォルトの名無しさん
08/01/17 23:46:44
ああ、高専の教科書か。
それは・・・知らんから何とも言えん。
118:デフォルトの名無しさん
08/01/17 23:51:09
情報関係の教科書書いてる教授がwinの基本操作とかCDの焼き方きいてくるからね~(実話
119:デフォルトの名無しさん
08/01/17 23:52:34
VC++にtypeof()みたいのはないですか?
120:デフォルトの名無しさん
08/01/17 23:56:19
BOOST_TYPEOF
121:デフォルトの名無しさん
08/01/17 23:56:28
標準C++的にはtypeid演算子
あとMFCがなんか持っていた気がする。
C++/CLIなら当然.NET Frameworkのリフレクションが色々使える。
122:デフォルトの名無しさん
08/01/18 00:12:51
#define foreach(t, o, i) for(t::iterator (i)=(o).begin();(i)!=(o).end();++(i))
な感じのマクロの場合、それを使うと方を渡さなくて良くなりますか?
123:デフォルトの名無しさん
08/01/18 00:15:49
そんなマクロを作るな。
制御文をマクロ化すると
自分以外に読みづらいので
悪い作法だと言われている。
124:デフォルトの名無しさん
08/01/18 00:24:10
Cの文法で基本的な事かもしれないのですが、Linux のカーネルソースを読もうとして
挫折してしまったんですが、例えば
struct hw_pci mr300_pci __initdata = {
.nr_controllers = 1,
.preinit = mr300_pci_preinit,
.swizzle = pci_std_swizzle,
.setup = ixp4xx_setup,
.scan = ixp4xx_scan_bus,
.map_irq = mr300_map_irq,
};
のような struct 宣言が書いてありましたが、
.(dot)var = 値 のような記法って、そのメンバーの初期化という意味になるのでしょうか?
手元のCの文法書に見つからなかったのですが、この記述の説明文献ってありますかね?
125:デフォルトの名無しさん
08/01/18 00:25:09
C99 から導入された文法。
そのメンバの初期化という意味でおk。
126:デフォルトの名無しさん
08/01/18 00:26:17
C99 はここに簡単にまとめられてる。
URLリンク(seclan.dll.jp)
127:デフォルトの名無しさん
08/01/18 00:31:36
>>125-126 ありがとうございました。逝ってみます。
128:デフォルトの名無しさん
08/01/18 00:34:13
>>123
便利って書いてあるよ。
URLリンク(www.jah.ne.jp)
129:デフォルトの名無しさん
08/01/18 00:41:39
>>122
BOOST_FOREACH
130:デフォルトの名無しさん
08/01/18 00:54:48
>>129
むり
131:デフォルトの名無しさん
08/01/18 01:05:40
122はコンテナの型、BOOST_FOREACHは要素の型を渡す必要がある点では、どっちもどっち。
132:デフォルトの名無しさん
08/01/18 01:12:38
長いのよ
133:デフォルトの名無しさん
08/01/18 01:41:49
適当にマクロで短い名前を付ければいいだろ。
134:デフォルトの名無しさん
08/01/18 03:06:16
VC++2005、WinXPです。
チェックボックスつきのツリーコントロールを作りたいと考えています。
チェックボックスでは三つのチェック状態をあらわしたいと思っておりまして、
ちょうど、VCをカスタムインストールする時に出てくるチェック付きツリーコントロールのような物を考えております。
これを実現する簡単なAPIないし、クラスはないでしょうか?
135:デフォルトの名無しさん
08/01/18 04:20:09
xcode環境でc++を開発している人はいますか?
emacsよりもイイですか?
136:デフォルトの名無しさん
08/01/18 04:45:13
>>135
そもそもIDEとエディタを単純比較するのが間違ってる気がするよ!
気持ちは分かるけど・・・・・・
137:デフォルトの名無しさん
08/01/18 05:43:59
newでメモリを確保してdeleteをせずプログラムを終了した場合ってそのまま
ずっとメモリ確保されたままになるの?
138:デフォルトの名無しさん
08/01/18 05:45:44
cout
って何の略なんですか?
139:デフォルトの名無しさん
08/01/18 05:46:08
大抵はOSが何とかしてくれる
140:デフォルトの名無しさん
08/01/18 05:46:38
>>138
console out
141:デフォルトの名無しさん
08/01/18 06:06:10
>>139
ありがとう
再起動するまでずっと無駄に領域とられたままかと思ってたけどOSがどうにかしてるのね
142:デフォルトの名無しさん
08/01/18 07:08:07
>>138
console output
143:デフォルトの名無しさん
08/01/18 07:08:37
極めて古い OS だと分からんけどね。
144:デフォルトの名無しさん
08/01/18 11:36:39
>>136
emacs が好きなんですが、
class-name.<Tab>とか押すと、method-nameが選択できたり、
method一覧がかんたんに見れたり,そういう環境が羨ましい。
145:デフォルトの名無しさん
08/01/18 11:49:43
VB6、.NET言語のインテリセンスに比べればどうということはない。
146:デフォルトの名無しさん
08/01/18 11:51:24
インテリセンスは正直凄いと思う。
147:デフォルトの名無しさん
08/01/18 11:54:04
VCのは御馬鹿
148:デフォルトの名無しさん
08/01/18 12:20:50
eclipseとかもVC#のインテリセンス真似してくれればいいのにな
149:デフォルトの名無しさん
08/01/18 12:26:53
糞lipseは重くて嫌いだ。
150:デフォルトの名無しさん
08/01/18 16:57:49
最近のVSはC#だけインテリセンスがよく効く
C++はおざなりってか
151:デフォルトの名無しさん
08/01/18 17:35:44
C++は複雑すぎるからな
152:デフォルトの名無しさん
08/01/18 18:59:29
てゆーか昔から
153:デフォルトの名無しさん
08/01/18 19:04:38
プリプロセッサ,テンプレート,ポインタの
置き換え,マッチング,追跡の大変さを考えたら,
今の IntelliSense ってすげぇとおもうが.
154:デフォルトの名無しさん
08/01/18 19:06:52
VB.NETとC#はおなじじゃない?
155:デフォルトの名無しさん
08/01/18 19:10:49
MessageBoxの上にカーソルのせたら
WMessageBoxWにマクロで置換されてると教えてくれるけど。
肝心の引数がプロトタイプが見えないとか。
156:デフォルトの名無しさん
08/01/18 19:11:35
MessageBoxW
157:デフォルトの名無しさん
08/01/18 19:25:42
確かに引数のプロトタイプが見えないのは面倒だね
たいてい関数の末尾にA、W付ければ良いって話だけど
158:デフォルトの名無しさん
08/01/18 22:36:51
VS使ってるなら、「(」書いたときにプロトタイプ出て来ないっけ?
まぁ書いてるときじゃなくて見てるだけのときは面倒かもだけど
159:デフォルトの名無しさん
08/01/18 22:40:28
>>134
お願いします。
160:デフォルトの名無しさん
08/01/18 23:19:55
public:
template <class T> class templateA {
protected:
T value;
public:
各種メソッド
};
template <class T> class templateB {
protected:
T value;
public:
各種メソッド
}
class child : templateA<templateB<type> >{
追加メソッド
}
以上のようなクラスを作成し、
子クラス内でthis->value.valueでテンプレートクラスB内の値にアクセスしようとしたのですが、protectedの要素にアクセスできないというエラーが出ます。
どこを直せばよいのか分かりません。
どなたかご教示下さい。
宜しくお願いします。
161:デフォルトの名無しさん
08/01/18 23:30:06
templateBのvalueをpublicにすれば良い
childはtemplateBを継承してないんだからtemplateBのprotectedメンバにはアクセスできない
162:デフォルトの名無しさん
08/01/18 23:31:45
安易にpublicにしていいのだろうか。
163:デフォルトの名無しさん
08/01/18 23:47:24
なら安易にアクセスすんなよw
164:デフォルトの名無しさん
08/01/19 00:05:00
public にするくらいなら friend にするわ。
でも、設計をもうちょっと考える事をまず検討した方がいい気がする。
165:デフォルトの名無しさん
08/01/19 00:45:04
>>161-164様、ありがとうございます。
それぞれのテンプレートクラスにgetメソッドを追加して、要素にアクセスできるようにしてみました。
あまり綺麗な方法とは思いませんが、ひとまずこれで妥協しておきます。
C++初学者なので、friend関数の存在は知っていますが、使った事がないので、こちらも少し勉強してみようと思います。
オブジェクト指向が少しずつ理解できるようになってきて、数ヶ月前に作ったクラスのリファインが楽しすぎて困ります。
お陰で研究が全然進まないYO...
166:デフォルトの名無しさん
08/01/19 00:47:56
おすすめ 設計見直し > get > friend > public おすすめしない
って順かな。
167:デフォルトの名無しさん
08/01/19 00:51:39
friendもpublicも大差ない気がするけどな
研究とかならいっそstructでもいい気がする
168:デフォルトの名無しさん
08/01/19 00:57:23
一応公開する相手が制限されてる分、public よりマシだとは思うが、
決しておすすめはできないという点では確かに似たようなもんだな。
169:デフォルトの名無しさん
08/01/19 01:01:32
>>166
getは○~△というところでしょうか。
一応意図したものにはなったので、取りあえずこれで行ってみます。
>>167
この先数年使う可能性があるので、ある程度しっかりしたものが作っておきたかったのです。
最悪の場合、お上に献上しないといけないものなのでw
リファイン前は各変数毎にgetメソッドとsetメソッドを用意していました。
これではあまりにも酷いと思いまして。
>>168
難しいですね。
自分の知識がついてきたら、またリファインすると思います。
そして無限ループへ…
170:デフォルトの名無しさん
08/01/19 01:08:37
作る前に設計をよく練った方がよさそうな・・・
設計に関する知識が無いならC++なんかやってないでそっちの勉強すべきだし
171:デフォルトの名無しさん
08/01/19 01:32:23
#include <stdio.h>
class A{
public:
virtual void func(){printf("A::func¥n");};
};
class B :public A{
private:
virtual void func() {printf("B::func¥n");}
};
int main (void)
{
A* b = new B;
b->func(); //B::funcと出力される。privateなのにアクセスできる!?
}
上記のコードについて、ご教授をお願いします。
gcc4.01で試したところコンパイルすることができました。
B::func()はprivateなのになぜコンパイルエラーにならないのでしょうか?
172:デフォルトの名無しさん
08/01/19 01:33:38
A::funcがpublicだから
173:デフォルトの名無しさん
08/01/19 01:53:13
>>171
class A の 仮想関数テーブルには
void func(){printf("A::func\n");}
の関数アドレスが配列0番に登録されている。
また、class B の 仮想関数テーブルには
void func(){printf("B::func\n");}
の関数アドレスが同じく配列0番に登録されている。
コンパイル時には静的な型であるAのfunc()が
調べられ、publicゆえにアクセスできることが
確認される。同時に仮想関数ゆえ、func()は
意味的には以下のようにコンパイルされる。
(b->vptr[0])(this);
vptrは仮想関数テーブルへのポインタで、今の
場合、派生クラスBの仮想関数テーブルのアドレス
が格納されている。仮想関数の呼び出しでは
コンパイル時はあくまで静的な型でアクセス可能性
が決定されるのがポイント。
と思う。
174:デフォルトの名無しさん
08/01/19 01:56:50
>>171
こういうコードだと分かりやすいと思う。
B の実装なんて知ったこっちゃないのよ。
// a.h
#include <stdio.h>
class A{
public:
virtual void func(){printf("A::func\n");};
};
// b.h
#include "a.h"
A* get_b();
// test1.cpp
#include "a.h"
int main (void)
{
A* a = get_b();
a->func();
}
// b.cpp
略
175:デフォルトの名無しさん
08/01/19 01:57:24
間違えた。こうだ。
// test1.cpp
#include "b.h"
int main (void)
{
A* a = get_b();
a->func();
}
176:デフォルトの名無しさん
08/01/19 02:04:01
一般的なコンパイラの実装の仮想関数呼び出し
メカニズムで理解しておいたほうがいいんじゃね?
静的な型でアクセス可能性が決まるというのが
真実だと思うが。
177:デフォルトの名無しさん
08/01/19 02:15:42
>>171-176 さん、ありがとうございました。
Final Draft IS に、そのまんまの答えがありました。
URLリンク(www.kuzbass.ru)
>静的な型でアクセス可能性が決まるというのが
>真実だと思うが。
そういうことになりますね。
178:デフォルトの名無しさん
08/01/19 04:15:38
typedef{
int x,y;
}data;
・・・
hogehoge(std::vector<data>dist);
こんな使い方はできるんでしょうか?
また、こんな使い方はトリッキーなんでしょうか?
179:デフォルトの名無しさん
08/01/19 04:22:37
>>178
vectorにユーザー型を入れれるのか?
ということであれば、普通に使えます。
その書式はおかしいけどな
180:デフォルトの名無しさん
08/01/19 04:33:56
>>178
structかclassつけーや
181:デフォルトの名無しさん
08/01/19 09:07:21
struct a { ... };
typedef t_a { ... } a;
C++コード上で下の利点ってどういったものがありますか?
182:デフォルトの名無しさん
08/01/19 09:12:45
>>181
C でも使えるコードを書くのでなければ特に何の意味もない。
183:デフォルトの名無しさん
08/01/19 09:21:06
㌧
184:デフォルトの名無しさん
08/01/19 10:09:32
勉強で簡易Stringクラスを作ろうとしてます。
ところがコンストラクタだけの段階で、実行時に
アクセス違反の例外で死にます。なんで?
#include <cstring>
class String {
int len;
char* s;
public:
String (const char* ch_ini) {
len = (int) strlen(ch_ini);
strcpy(s,ch_ini);
}
};
実行は
String k1("kkkkk1");
だけ(作っただけのつもり)。
これで死にまする。
185:デフォルトの名無しさん
08/01/19 10:12:37
土曜の朝から釣りか
char *sの指してる領域はどこなんだよ?
186:デフォルトの名無しさん
08/01/19 10:13:18
>>184
そのコードじゃstrcpyで死ぬわ。
char* sはどこを指してるのかね?
187:デフォルトの名無しさん
08/01/19 10:17:02
unsigned long型 = 256 * unsigned char型の計算をしています。
unsigned char型の変数に入る値はランダムで0~150くらいの値が入るのですが、大体100以上の値が入ったときに4,294,967,295などの変な値になります。
なんで正しい値が入らないのでしょうか?
188:デフォルトの名無しさん
08/01/19 10:27:09
わかりました。あなたは世界を革命するしかないでしょう。
189:184
08/01/19 10:28:34
どこも指してない!?
どーすればよいのでしょうか。
190:デフォルトの名無しさん
08/01/19 10:29:29
古っ
191:デフォルトの名無しさん
08/01/19 10:29:53
>>189
その辺はポインタの基本中の基本なんだから、本でも読んで勉強してくれ。
192:デフォルトの名無しさん
08/01/19 10:39:07
>>187
本当に unsigned char なのかね?
符号つきになってないか?
193:デフォルトの名無しさん
08/01/19 10:44:12
>>189
正直自作クラスとか以前の問題。
文字列やポインタなどの基本から学び直してからのほうが良い。
194:デフォルトの名無しさん
08/01/19 10:46:26
>>187
ソースを晒すんだ
195:デフォルトの名無しさん
08/01/19 10:53:04
産業スパイか
196:デフォルトの名無しさん
08/01/19 10:57:22
(int)4294967295u == -1
197:187
08/01/19 11:32:13
処理の部分だけ抜き出して見ました。
traは0~255が入ります。
unsigned char tra_undf = 0;
unsigned char tra_buff = 0;
static unsigned long ValuePuls = 0;
void main (void){
while(1){
if (tedgf_tracr == 1)
{tra_buff = tra;
flag_edge = 1;
tedgf_tracr = 0;}
if(tundf_tracr == 1)
{tra_undf++;
tundf_tracr = 0;}
if(flag_edge == 1)
{Sort();
tra_undf = 0;
flag_edge = 0;}
:
}}
void Sort(void){ValuePulse = ((256 * tra_undf) + (255 - tra_buff));}
結果は
tra_undf=189のときにValuePulse=4294950301
tra_undf=234のときにValuePulse=4294961868
念のため+ (255 - tra_buff)の部分を消して見ましたが
tra_undf=223のときにValuePulse=4294958848
でした。
198:デフォルトの名無しさん
08/01/19 12:01:07
>>184
何の本読んで勉強してんだ
さらしちまえ
199:デフォルトの名無しさん
08/01/19 12:49:14
>>197
コンパイラは?
200:デフォルトの名無しさん
08/01/19 12:56:10
int と size_t はどういう違い、あるいは、どのように使い分ければよいのでしょうか?
201:デフォルトの名無しさん
08/01/19 13:02:40
>>197
ソースを晒すんだ
202:デフォルトの名無しさん
08/01/19 13:09:31
>>197
>念のため+ (255 - tra_buff)の部分を消して見ましたが
>tra_undf=223のときにValuePulse=4294958848でした。
intが16bitの環境か?
256がintなのでtra_undfがintに格上げされ乗算され0xdf00になるが
これはintでは負数になる。
でunsignd longに代入されると符号拡張され0xffffdf00になる。
これは符号無しだと4294958848になって一致する。
203:デフォルトの名無しさん
08/01/19 13:52:20
LSI_C 試食版の悪寒
204:187
08/01/19 13:57:43
>>202
ありがとうございます。
NC30というコンパイラを使っているのですが、調べたらintは16bitと書いてありました。
回避方法は256の前に(unsigned)を付けるんで大丈夫ですか?
205:デフォルトの名無しさん
08/01/19 14:02:10
256u でおk。
206:デフォルトの名無しさん
08/01/19 14:03:11
(unsigned long) にしないと一緒じゃね?
207:206
08/01/19 14:03:49
そんなことないか、(unsigned)でもいいかも
208:デフォルトの名無しさん
08/01/19 14:06:30
256 * unsigned char 値 なら一応 16 ビットに収まるしな。
別に 256lu にしてもいいとは思うが。
209:187
08/01/19 14:15:25
助かりました!
本当にありがとうございます。
210:デフォルトの名無しさん
08/01/19 14:20:37
まだはじめたばかりなんですが、short int とかlong、double longなどの意味が分かりません。
無視して進んでも大丈夫ですか?
どんな場合に使うのかなどが把握できていない状況です。
211:デフォルトの名無しさん
08/01/19 14:26:14
必要になれば使うし、必要にならなければ使わない。
それだけの話。
212:デフォルトの名無しさん
08/01/19 14:26:16
ビールをグラスに入れるか、ジョッキに入れるか、ピッチャーに入れるかの違いだ。
213:デフォルトの名無しさん
08/01/19 14:31:33
SFCで遊ぶか、PSで遊ぶか、PS2で遊ぶかの違いくらいか?
214:デフォルトの名無しさん
08/01/19 14:35:10
現在「猫でもわかるC言語」で勉強しています。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
double pai=3.14159265358979;
int mon=2;
float flt=1.2f;
printf("%5.2hf\n",flt); ←ここだけtypeのプレフィックスの「h」を使っているのか分からないです。
printf("%-5.2f\n",flt);
printf("%05.2f\n",flt);
printf("%+08.2f\n",flt);
printf("%-08.2f\n",flt);
printf("%d\n",mon=3);
printf("%e\n",pai);
printf("%08.2f\n",pai);
printf("%05d\n",mon);
printf("円周率は%fです\n",pai);
printf("円周率は%1fです\n",pai);
printf("もう少し詳しい値は%10.8lfです\n",pai);
printf("もう少し詳しい値は%15.13lfです\n",pai);←ここの2行も「l」が使われていますが何のために使用しているのか分かりません。
printf("もう少し詳しい値は%20.18fです\n",pai)
system("PAUSE");
return 0;
}
見難いと思いますが、現在このような感じで悩んでます。
質問の内容がおかしかったらすみません。
215:デフォルトの名無しさん
08/01/19 14:44:13
hとl(長さ修飾子)そのものがわからないのか
それともどうしてそのタイミングで修飾子を使っているのがわからないのか
前者ならprintfでぐぐると一番上に出てくるけど
216:デフォルトの名無しさん
08/01/19 14:45:01
>>214
URLリンク(www.linux.or.jp)
長さ修飾子
h 整数変換に対応する引き数が short int か unsigned short int で、
n 変換に対応する引き数が short int へのポインタであることを示す。
そこで h はおかしくね?
217:デフォルトの名無しさん
08/01/19 14:47:08
lf : C89 の場合、規格違反。ただし、f と同じになるコンパイラも多い。
double を渡す時につい l を付けてしまう人がいるが、
l が必要になるのは scanf の方だけ。
printf の方では l は必要ない。
ただ、l をつける間違いを犯す人が多く、さらにそれをサポートしているコンパイラも多いため、
C99 になって l を付けてもいいことになった。
lf は f と同じ。
218:デフォルトの名無しさん
08/01/19 14:56:32
>>217
hf は?
だいたい長さ修飾子に対して浮動少数点数って関係あるの?
上のリンク読む限り関係ないと思えるんだが。
219:デフォルトの名無しさん
08/01/19 14:57:51
hf はおかしいっつーのは既に >>216 が書いてあるから
220:デフォルトの名無しさん
08/01/19 15:00:18
>>215
>>216
>>217
せっかくお答え頂いてるのにいまいち理解できないです・・・。すいません。
この「h」も「l」も書かなくても結果には関係しないのですが、
ここでは「h」も「l」も書く意味はないということですか?
221:デフォルトの名無しさん
08/01/19 15:00:30
>>217
l (エル)
各変換に対応する引き数が、整数変換では long intか unsigned long int、 n
変換では long long int へのポインタ、 c 変換では wint_t、 s 変換では
wchar_t へのポインタであることを示す。
L
a, A, e, E, f, F, g, G 変換に対応する引き数が long double であることを
示す。 (C99 では %LF を使うことを認めているが、SUSv2 では認められていな
い。)
lfじゃなくてLfのことじゃねえの?上の説明では明らかにlとLは違うし
lの意味を考えるとlfはおかしくね?
222:デフォルトの名無しさん
08/01/19 15:05:42
>>220
おれは今の場合だと、lもhも指定する意味が無いと思う。
(コンパイルエラーにはされないみたいだが。)
ありうるとすれば、Lfだが、long doubleの
引数を渡してるわけではない(floatの引数になってるよね)
のでLfも無意味だと思う。
223:デフォルトの名無しさん
08/01/19 15:07:23
>>221
URLリンク(seclan.dll.jp)
224:デフォルトの名無しさん
08/01/19 15:18:30
>>222
この場合は特に意味は無いんですね。
引数がいまいち分かっていないので、皆さんの説明を上手く理解することができませんでした。
引数はもっと本の先で解説されているようなので、そこまで進んでまた戻ってみます。
アドバイスを上手く活用できなくてすいませんでした。ありがとうございました。
225:デフォルトの名無しさん
08/01/19 15:19:38
>>223
ほほー thx
以下でいいの?
%f doubleを出力
%lf doubleを出力(実質的には今までの%fと同じ)
%Lf long doubleを出力
要は表記を許しただけということか。
226:デフォルトの名無しさん
08/01/19 15:20:22
>>224
おい、>>223を見といたほうがいい
227:デフォルトの名無しさん
08/01/19 15:27:44
>>225
Yes.
>>226
まあもう少し後でいいんじゃね。
というか、可変個引数の引数の規則とか
先まで進まないとよく分からんと思うし。
228:デフォルトの名無しさん
08/01/19 15:39:11
C89は実情に見合ってないしC99は明々後日の方向向きすぎ
229:デフォルトの名無しさん
08/01/19 15:56:52
試したみたのはgcc,bcc32, vsのやつ、です
float.hのマクロ定数を表示させる文
1.
printf("FLT_MIN = %e\n", FLT_MIN );
printf("FLT_MAX = %e\n", FLT_MAX );
2.
printf("FLT_MIN = %f\n", FLT_MIN );
printf("FLT_MAX = %f\n", FLT_MAX );
としたところFLT_MAXはどちらもまともに表示されるのですが
FLT_MINのほうは2.の方が0.000000という表示になってしまいます
これはなにがまずいのでしょうか?
どなたかお願いします
230:デフォルトの名無しさん
08/01/19 16:04:55
%.50f くらいやっとけ
231:デフォルトの名無しさん
08/01/19 16:10:07
>>230
桁が足りなくて丸められてたのですね
ありがとございました
232:デフォルトの名無しさん
08/01/19 17:56:54
丸められていたというか表示されていなかっただけかと
233:デフォルトの名無しさん
08/01/19 18:06:26
>表示されていなかっただけかと
処理系依存かどうか知らないけど、printfって小数点以下表示桁で四捨五入しないっけ?
234:デフォルトの名無しさん
08/01/19 18:14:01
>>233
ですよねぇ
>>232
言われて
気になって確かめてみました
235:デフォルトの名無しさん
08/01/19 19:08:00
>>233
%fって%.6fと同じだからこれで合ってるんじゃないの?
236:デフォルトの名無しさん
08/01/19 19:17:53
丸めるか切り捨てるかの話だろ
237:デフォルトの名無しさん
08/01/19 19:23:27
>>236
切り捨てって丸めの一種なんだけどね。
238:デフォルトの名無しさん
08/01/19 21:37:55
>>235
あぁいや、大したこっちゃないんだけど、四捨五入した結果だったら、
表示されてないだけというより丸められてるって方があってるかな、と思っただけ。
実際問題じゃどっちでも良いかな
239:デフォルトの名無しさん
08/01/19 22:07:23
Visual Studio Std 2005 で Win32API を勉強中です。
ウィンドウを表示して、その中にMoveTo や LineTo で線を書くことはできました。
そこで、その書いた線上にマウスを持って行くと
マウスポインタが変更できるようにしたいのですが、
どんな感じに作っていけばいいのでしょうか?
マウスの位置を調べる関数があるのですが、
マウスが動くたびにその関数を呼び出して、
その値を、先ほど書いた2点間の線上の一次方程式に入れて判断していくとか、
そんな感じになるのでしょうか?
それとも、もっと簡単な方法とかあるのでしょうか。
教えてください。
240:デフォルトの名無しさん
08/01/19 22:14:37
>>239
Win32APIスレの方がいい気もするが。
WM_MOUSEMOVEのlParamを使うなりしてカーソル位置を取得。
特定の方程式があるなら、それに当てはめればいいし、
GetPixel()を使って色で判別とかも出来る。
241:デフォルトの名無しさん
08/01/19 22:43:31
>>240
色で判別というのもありますね。
いずれにしても、簡単にはいかないみたいですね。
Win32API スレにも質問してみます。
ありがとうございました。
242:デフォルトの名無しさん
08/01/19 22:48:03
後のマルチである。
243:デフォルトの名無しさん
08/01/19 23:43:44
凄く簡単な質問で、自分で確かめろって感じなんですが、
今実行できる環境がないので、教えてもらえませんか。
<Head.h>で以下のように変数を宣言して、
int var;
<Main.cpp>にインクルードしたら、
#include "Head.h"
何もしないでも<Main.cpp>でvarは使えますか?
それとも<Main.cpp>で"extern int var;"としないといけないんですか?
244:デフォルトの名無しさん
08/01/19 23:47:58
じゃ俺も試さないでレスw
多分何もしないで使えるはず。
245:243
08/01/19 23:52:22
>>244
ありがとうございます。
やっぱ何か心許ないので、後で実験してみます。
すいません。
246:デフォルトの名無しさん
08/01/20 00:01:11
>>229
%fなんか使わずに%gを使っとけ。
247:デフォルトの名無しさん
08/01/20 00:03:52
%e との比較をしたい以上、%f の方が適切じゃね?
248:243
08/01/20 00:09:50
すいません、なんか混乱してきたのでもう一度質問です。
------------
<Head.h>
extern int var;
<Head.cpp>
int var;
------------
<A.h>
#include "Head.h"
<A.cpp>
#include "A.h"
------------
<B.h>
#include "Head.h"
<B.cpp>
#include "B.h"
------------
これで<A.cpp><B.cpp>共に同じvarを使えるでしょうか?
249:デフォルトの名無しさん
08/01/20 00:18:25
>>248
リンケージと宣言、定義について勉強しろ
250:デフォルトの名無しさん
08/01/20 09:29:33
>>248
使える。
>>249
もしかしたらそれ以前に、#includeの意味がわかっていない気がしないでもない。
251:デフォルトの名無しさん
08/01/20 11:03:58
私にも力が出せるかな
本気でがんばるから見ててね
キミらしく夢を語る瞳 宝石だってかなわない
(いちばん) 好きなことで (進める) 道を探そうよ
「大人になることはさみしいことさ」なんて逃げないよ
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
一緒に行こう!
とまらない想いがあるってのに
誰にも言えずに温めてた
これからは話してみたいんだ
キミに会ってわかったよ
(ときどき) 確かめ合う
(希望が) 色あせぬように
「喜びをふたりで何倍にもしよう」いまを楽しくね
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
キミの笑顔と 一緒に行こう!
252:デフォルトの名無しさん
08/01/20 17:58:42
>>249
>>250
ありがとうございます。やってみたらできました。
253:デフォルトの名無しさん
08/01/20 18:04:28
メモリ解放というのをいつやればいいのか分からないんですが、
例えば下の場合、methodを抜けたら解放しなくても、
bufは自動でなくなるんでしょうか?
void method(){
char buf[100];
int i = 123456;
sprintf(buf,"%d",i);
}
254:デフォルトの名無しさん
08/01/20 18:06:07
無くなる。
解放する必要があるのは malloc やら new やらしたやつ
255:デフォルトの名無しさん
08/01/20 18:14:19
ありがとうございます。
256:デフォルトの名無しさん
08/01/20 18:42:36
サーセン
「+=」
とか
「-=」
ってどんな時使うんですか?(>_<)
257:デフォルトの名無しさん
08/01/20 18:44:09
>>256
A = A + 2
でAを2回書くのがめんどくさくなったとき。
258:デフォルトの名無しさん
08/01/20 18:44:09
a = a+10;
a += 10;
259:デフォルトの名無しさん
08/01/20 18:49:12
普通は a = a + 10; なんて書かない。
BASIC や FORTRAN あがりの人が書く程度。
260:デフォルトの名無しさん
08/01/20 22:48:50
最近のVisual C++ではfopenを使うと代わりにセキュアなfopen_sを使えと警告が出るらしいのですが、
fopen_sはfopenに比べてどうセキュアなのでしょうか。
261:デフォルトの名無しさん
08/01/20 22:58:48
>>260
fopenとfopen_sのソースでも見比べたら?
262:デフォルトの名無しさん
08/01/20 23:04:45
>>261
どこにあるんですか?
263:デフォルトの名無しさん
08/01/20 23:07:54
>>262
デバッガで動かして、fopenの中にF11キーで入ればいいだろ。
そうすりゃ分かる。
264:デフォルトの名無しさん
08/01/20 23:10:58
>>263
最近のVC++は持っていません。
265:デフォルトの名無しさん
08/01/21 00:16:01
も、もうだめだ。
さよなら単位
266:デフォルトの名無しさん
08/01/21 00:37:07
さよなら(^o^)/~~
267:デフォルトの名無しさん
08/01/21 00:40:28
Cプログラマ必須テキスト!
URLリンク(mori.eco.to)
268:デフォルトの名無しさん
08/01/21 00:48:51
>>267
経歴が恐ろしくしょぼいなwwwwwwwwwww
269:デフォルトの名無しさん
08/01/21 00:51:04
>C++未経験ながら、1人でC++の10万行のソースコードの保守及び、3万行の開発を行った。
突っ込みどころはここですか?www
270:デフォルトの名無しさん
08/01/21 00:55:57
>>260
s付いてるほうは受け渡し用のバッファサイズを指定するようになった。
バッファサイズを超えては読まないようになってる。
271:デフォルトの名無しさん
08/01/21 00:58:32
>>270
fopen_sもか?
272:デフォルトの名無しさん
08/01/21 01:04:11
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
形そのものが違うじゃん
273:デフォルトの名無しさん
08/01/21 01:12:41
悪い悪い、fopen_sの場合は
パラメータの検証が行われます。
pFile、ファイル名、またはモードが null ポインタの場合には、
「パラメータの検証」に説明されているように、これらの関数は
無効なパラメータの例外を生成します。
あとUnicode のファイル ストリームをサポートします
274:デフォルトの名無しさん
08/01/21 01:56:43
qsort関数について質問なんだが、
必ずしも内部のアルゴリズムがクイックソートだとは限らないよな?
選択ソートが使われてる気がして仕方ないんだが。
でもぐぐってみるとクイックソートが使われてるって書かれてるし…。
275:デフォルトの名無しさん
08/01/21 01:59:22
規格では具体的なソート手法の指定はないが、
O(N logN) でテンポラリバッファ不要のソート法であるという指定はあったと思う。
276:デフォルトの名無しさん
08/01/21 02:02:46
んだから、選択ソートは使われていないはず。O(N^2) だから。
277:デフォルトの名無しさん
08/01/21 02:03:29
ああ、ただし、要素数が少ない場合はわからん。
278:デフォルトの名無しさん
08/01/21 02:07:09
>>277
ありがとう。
比較関数弄ってみてるものの中々アルゴリズムが特定出来ない…。
O(N log N)だとするとやっぱりクイックソートなのかなぁ。
要素数によって使われるアルゴリズム変わるんですかね。
だとすると新しい発見かも…。
279:デフォルトの名無しさん
08/01/21 02:20:32
>>274
BCC5.9.2の実装だと途中で挿入ソートに切り替えている
要素数が10以下になると再帰呼び出しのコストが馬鹿に
ならないからだろう
280:デフォルトの名無しさん
08/01/21 02:21:47
281:274
08/01/21 02:43:21
>>279
VC++ 2005だと要素数が10個になるまではクイックソートで
それ以降は選択ソートを使ってるみたいです。多分。
282:デフォルトの名無しさん
08/01/21 02:46:44
バブルソートや挿入ソートではなく選択ソートと思った理由は何だろう?
選択ソートは交換回数が少なくて微妙に速度が違うからそこで判断したのかな。
283:デフォルトの名無しさん
08/01/21 02:49:25
安定じゃなかったんじゃないかな
284:デフォルトの名無しさん
08/01/21 03:00:25
>>282
比較関数で比較対象を出力してみて思っただけなので、
もしかしたら間違ってる可能性もあります。
一応ソースと出力結果貼っておきますね。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
------ソート前------
4
5
1
2
3
>要素数:5
-----ソート開始-----
1回目: 5と 4を比較
2回目: 1と 5を比較
3回目: 2と 5を比較
4回目: 3と 5を比較
5回目: 3と 4を比較
6回目: 1と 4を比較
7回目: 2と 4を比較
8回目: 3と 2を比較
9回目: 1と 3を比較
10回目: 1と 2を比較
285:デフォルトの名無しさん
08/01/21 03:00:53
>>284
ああ、なるほど。
286:デフォルトの名無しさん
08/01/21 15:28:11
C言語で質問なのです。
下のプログラムは動作確認済みなのですが、なぜ動作するかがわかりません。
iでfor文を考えているのに、for{}の中にiがなくても、動作するのはどうしてなんでしょうか?
#include<stdio.h>
int main(void){
double a[15]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0};
double *p;
p=a;
for(i=0;i<15;i++){
printf("%f\t%p\n",*p,p); ←例えばこの部分がprintf("%f\t%p\n",a[i],p);とかなら納得なのですが…
p++;
}
return(0);
}
287:デフォルトの名無しさん
08/01/21 15:36:25
>>286
ポインタ習ってないの?w
288:デフォルトの名無しさん
08/01/21 15:46:18
ポインタについてはまだ理解力が足りないと思っています。
ただ、printf("%f\t%p\n",*p,p);にするなら、forの()の中身をpのみで表さないとなんか気持ち悪い気がして…
今までやってきたfor文は()の中の変数が{}の中で必ず使われてきたので…
289:デフォルトの名無しさん
08/01/21 15:50:57
確かにあんまり行儀のいいプログラムじゃないなぁ。
私ならこう書く。
#include<stdio.h>
int main(void)
{
double a[]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0};
for (unsigned i = 0; i < sizeof(a) / sizeof(* a); ++i) {
printf("%g\n", a[i]);
}
return 0;
}
ポインタを使うならこうなるかな。
for (double * p = a; p - a < sizeof(a) / sizeof(* a); ++p) {
printf("%g\n", * p);
}
return 0;
}
いずれにしろ、定数を生のまま書くのはやめた方がいい。
290:デフォルトの名無しさん
08/01/21 15:51:24
>>286
>printf("%f\t%p\n",a[i],p)とかなら・・・
それを言うなら、printf("%f\t%p\n",a[i],&a[i]); だろ?
最後のpがokなら、*pもokだろうに。
291:デフォルトの名無しさん
08/01/21 15:51:39
>>288
p=a; //pがaの先頭(-256)を指す
printf("%f\n", *p); //pが現在指してる値(-256)を表示する
p++; //pが次の要素(0)を指す
printf("%f\n", *p); //pが現在指してる値(0)を表示する
p++; //pが次の要素(-128)を指す
printf("%f\n", *p); //pが現在指してる値(-128)を表示する
以下繰り返し
iを使ってるのは、単に繰り返し回数を数えるため
292:デフォルトの名無しさん
08/01/21 15:56:46
>>289-291
みなさんわかりやすい説明をありがとうございます。
なんとか理解できそうです。
293:デフォルトの名無しさん
08/01/21 18:26:49
>>288
繰り返し「回数」を明示するためにfor使ってるんじゃね
そのプログラムだとp+iとかp[i]とかでもいいが
ループ回数だけが重要で、何回目のループかはどうでもいいこともたまにある
294:デフォルトの名無しさん
08/01/21 20:41:09
ループ変数にunsignedを使っちゃう奴を久しぶりに見た
295:デフォルトの名無しさん
08/01/21 20:42:30
>>294
なんかまずいんですか?
296:デフォルトの名無しさん
08/01/21 20:44:46
どうみてもわざと
297:デフォルトの名無しさん
08/01/21 20:46:48
ここで聞いていいか分からないのですが、スレ違いならスレ教えてください。
目的はC++を使えるようになることです。
C++の前にC言語勉強した方がいいということで、(どっかのサイトに書いてあった)
今はC言語を勉強中ですが、
一通り勉強したらC++に移ってもいいでしょうか?
それとも、C言語をしっかりやってからの方がいいですか?
298:デフォルトの名無しさん
08/01/21 20:55:42
>>297
俺は両者を混同しなければいつ移ったって構わないと思う。
まぁせっかくCやってるんだからポインタあたりまでは勉強したほうがいいかもね。
299:デフォルトの名無しさん
08/01/21 21:12:43
>>298
ありがとうございます。
ざっと一通り勉強してから移ります。
300:デフォルトの名無しさん
08/01/21 21:13:38
自分の勉強の方針くらい自分で決めろよ
学習を進めていけば、次に何をしたらいいかくらい
自分で判断できるようになる。
C++の勉強を始めたが最期、Cの勉強には一生戻れない
というわけでもあるまいし。
301:デフォルトの名無しさん
08/01/21 21:28:36
逆に考えるんだ。
次にやるべきことを判断できるようになるまで
真面目に勉強する気が最初からないと考えるんだ。
302:デフォルトの名無しさん
08/01/21 21:47:04
というようなキチガイ的な返事しか出来ないのがプログラマw
個人的にはいきなりC++でも全然問題ないと思う。
303:デフォルトの名無しさん
08/01/21 21:57:41
>>295
> なんかまずいんですか?
・ふつーint
・差をとったりして負の数が出てくる計算で気分的によろしくない
304:デフォルトの名無しさん
08/01/21 22:31:29
>for (unsigned i = 0; i < sizeof(a) / sizeof(* a); ++i) {
forの初期化のトコで宣言出来るのってC99だっけ?
305:デフォルトの名無しさん
08/01/21 22:34:46
C++も
306:デフォルトの名無しさん
08/01/21 22:37:47
size_t型が符号なし整数として定義されている環境だと、iがsignedの場合
i < sizeof(a) / sizeof(* a);
の部分で「signedとunsigned比較すんなボケ」という警告が出るから
unsignedにしたんだろう。
だがこれだと、size_t型が符号あり整数として定義されている環境では
逆に警告が出る。
これが嫌な人は(sizeof(a) / sizeof(* a))の方をcastしたりするんだろうけど、
signedなsize_t型なんて聞いたことないからぶっちゃけどーでもいい。
307:デフォルトの名無しさん
08/01/21 22:52:47
根本的に違うんじゃね?
for文回すのにunsignedがいけないという理由は
for (unsigned i = 0; i > 0; i--) { ... }
というような回し方をしてたら、unsignedだから結局、
0未満は無いで、知らずに無限ループにハマってしまうからやめろ
とか、そんな理由の奴は聞いた事がある
308:デフォルトの名無しさん
08/01/21 23:04:27
そもそも、回数が固定なループを書くときに
継続条件に < を使うのがおかしい。!=を使え。
309:デフォルトの名無しさん
08/01/21 23:15:54
signed/unsigned関係ないし・・・
iteratorならよく見るが、ふつうは不等号じゃね?
310:デフォルトの名無しさん
08/01/21 23:16:23
>>306
>だがこれだと、size_t型が符号あり整数として定義されている環境では
そんな環境ありえねー。
>>307
そのループ1回も実行されないぞ。
まずいのは、例えば i を 9, 8, ... 1, 0 としてループしたい時に
for(int i = 9; i >= 0; i--){ ... }
って書いた場合、int を unsigned int にすると、>>307 の言うようにはまる。
でも、最近のコンパイラなら i >= 0 が偽にならないとかの警告が出るものも多いよ。
>>308
ネタだろうが、それはない。
311:デフォルトの名無しさん
08/01/21 23:20:52
>>310はイテレータを使ったことがないとみた
312:デフォルトの名無しさん
08/01/21 23:26:40
俺もたまに使ってしまう>unsigned
vectorなんかを添え字で単純に回したいとき。
くせというかなんというかw
313:デフォルトの名無しさん
08/01/21 23:27:01
>>310
>>308
ネタだろうが、それはない
iteratorでなくとも
Cの場合でもループの不変な表明を考えた場合
!= を使うべきことは非常に多い。
i != NUMS
の場合、ループ終了後はi == NUMS であることが保障される。
が、i >= NUMS だとそうはいかない。
314:デフォルトの名無しさん
08/01/21 23:30:13
どっちが速いの?
315:デフォルトの名無しさん
08/01/21 23:36:47
>>314
変わらないだろ。
0との比較は速い場合がある。
for(int i=10; i; i--) { ... } // 10回ループ
316:デフォルトの名無しさん
08/01/21 23:48:01
たまに数字飛ばしたりするからi>0って書くな
317:デフォルトの名無しさん
08/01/21 23:48:47
>>315
まさか、Javaでもあるまいし普通のコンパイラは速度差がないコードを吐くと思うぞ。
318:デフォルトの名無しさん
08/01/21 23:52:24
for(unsigned int i=10; i>0; i--) { cout << i << endl; } →期待通り
for(unsigned int i=10; i>=0; i--) { cout << i << endl; } →無限ループ
理由、
unsignedの値はmax→→→→→→0→maxになる。
上のループだと偽(i==0)があらわれる。下のループだと常に真だから無限。
おk?
319:デフォルトの名無しさん
08/01/21 23:53:20
>>318
お前は少し上のレスも読めないのか
320:デフォルトの名無しさん
08/01/21 23:55:28
>>317
0との比較はゼロフラグを使えるので、効率が良い。
アセンブラの話な。
もちろん、命令パイプラインの効果で差が無くなるかもしれないが、
「場合がある」ということで。
321:デフォルトの名無しさん
08/01/21 23:56:48
>>319
言われて見れば同じ事言ってるw つうか微妙に違う事言ってるのかと思って。
>>319のような言葉でしっかり確信持てることもある。
ということで、言葉は人をなめてるが実は優しい>>319
322:デフォルトの名無しさん
08/01/22 00:25:21
>>320
その話を知ってからいろんな環境で実験したけど未だに実感できたことがない。
ハンドアセンブルするような環境ならそりゃ違うけど・・・
323:デフォルトの名無しさん
08/01/22 00:32:33
>>322
だって期待できるコード削減量って
ループ1回につき比較命令1つ程度なんだから、
実感は難しいかなあ。
324:デフォルトの名無しさん
08/01/22 00:40:25
いや、実験はそりゃ億とか兆とかするよ?
CPUの周波数がわかってれば期待できる短縮時間は予測できるじゃん?
んでも、どんだけ回しても測定誤差程度の値しか出ないんだよ・・・逆転も往々にしてあるし。
325:デフォルトの名無しさん
08/01/22 00:43:08
なんか自分で書いててアセンブラで比較してステート数確認すりゃいいじゃんとか思ってしまった・・・
326:デフォルトの名無しさん
08/01/22 00:45:59
アセンブリ吐いて比較してるよね?
場合によっては逆順に最適化されることもあると聞いた事あるが。
327:デフォルトの名無しさん
08/01/22 01:02:26
>>306
規格でsize_tは符号なしと決まっている。
328:デフォルトの名無しさん
08/01/22 02:08:21
VC9なんですけど
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
このマクロをもっと圧縮できませんか?
二行くらいに。
329:デフォルトの名無しさん
08/01/22 02:15:54
できないから3行なんだ。
#define WIDEN(x) L#x
#define __WFILE__ WIDEN(__FILE__)
VC9を持ってないからこれがコンパイル通らなきゃ不可能。
ってか通ったところでほかの環境でも通るとは限らないが。
330:デフォルトの名無しさん
08/01/22 02:19:00
真ん中飛ばせる希ガス
331:デフォルトの名無しさん
08/01/22 02:30:20
みり
332:デフォルトの名無しさん
08/01/22 03:03:03
switchでcaseが大量にあるときに、
高速化を狙って関数ポインタの配列に
するって手があると思うんですが、
ポインタ関数の呼び出しのオーバーヘッドは
case何回くらいに匹敵するんでしょうか?
皆さんだったらcase何回くらいからポインタ関数
配列に換えますか?
333:必要なら実測するのみ
08/01/22 03:09:58
>>332
case by case.
334:デフォルトの名無しさん
08/01/22 03:11:00
>>332
そういう風に出来る switch は
普通はジャンプテーブルに最適化されるから
気にしなくてもいいぜ。
関数ポインタを使うのは高速化を目的とするものじゃなくて、
実装の利便性やら可読性やらを目的とするもんだ。
335:デフォルトの名無しさん
08/01/22 03:13:25
>ジャンプテーブルに最適化される
そうだったのか!w
わざわざ変えてたのは無駄だったんですね。
336:デフォルトの名無しさん
08/01/22 03:17:03
実は、関数テーブルではなくジャンプテーブルなので、手動で関数テーブルにするより高速。
337:デフォルトの名無しさん
08/01/22 03:28:00
>>332 実際は、ifで分岐を書いた方が高速
もし等確率で起こるならcaseの最適化がifより速くなることもあるが
CPUには分岐予測があり、30%くらいを占める分岐があればそれを始めに判定することでかなり速くなる
338:デフォルトの名無しさん
08/01/22 03:31:04
テーブルにアクセスする時間との兼ね合いで
ジャンプテーブルに最適化するかどうか
決めてたりしないのか? コンパイラは。
339:デフォルトの名無しさん
08/01/22 03:33:00
>>337
分岐数が100とか1000とかに達するような場合でも
CPUの分岐予測って効果あるんですか?
340:デフォルトの名無しさん
08/01/22 03:40:54
既存のクラスParentを新しいクラスChildに継承させたいのですが、Parentに規定のコンストラクタがなく、必ず引数を必要とする場合の子クラスのコンストラクタの書式が分かりません。
親切な方、どうか助けて下さい。
341:デフォルトの名無しさん
08/01/22 03:46:18
初期化子つけりゃいいだけじゃん
342:デフォルトの名無しさん
08/01/22 05:29:02
>>341
初期化子に親クラスで定義されている変数を引数として使えないことを知らなかった…
親クラスに少し手を加えて自己解決しました
343:デフォルトの名無しさん
08/01/22 08:50:36
勘違いしてる悪寒
344:デフォルトの名無しさん
08/01/22 10:23:40
wchar_tについて質問です。
実装によってはwchar_tのサイズは2byteなようですが、これはサロゲートペアは
どのような扱いになるのでしょうか?
1.サロゲートペアは見なかったことにする。結果サロゲートペアが必要な文字は文字化けする。
2.サロゲートペアも適切に処理。結果文字列の長さが変わる。
345:デフォルトの名無しさん
08/01/22 11:29:00
初心者です。ある多元配列をkaiseki.cvsで与えた時に
それの行と列を入れ替えるようなプログラムを考えています。
教科書を見たところ、1次元配列についてはfgets,fgetcを使えばいいという事はわかったのですが
多元配列になると、そもそもfgetsがどういうタイミングで一行を読み取るのかよくわかっていないので
for文の中にどうやって組み込めばいいのかわからず、さらには読み取ったものを
どうやって多元配列になおせばいいのかわかりません。
とりあえず自分で試行錯誤してみたのを張っておきます
URLリンク(kansai2channeler.hp.infoseek.co.jp)
346:デフォルトの名無しさん
08/01/22 12:18:45
fgetsは改行までを読み込むんだよ。
347:デフォルトの名無しさん
08/01/22 12:54:32
取り敢えず、kaiseki.cvsなんて名前はやめよう。誤解の元だ。
348:デフォルトの名無しさん
08/01/22 12:59:32
>>328
#define AL2TL(x) TEXT(##x##)
#define __TFILE__ AL2TL(__FILE__)
とか
349:デフォルトの名無しさん
08/01/22 13:13:53
VC2008で、「where」という単語使うと
予約語みたいで青くなるんですけど。
.NETの予約語みたいなんで使ってもいいですか?
350:デフォルトの名無しさん
08/01/22 13:19:14
>>344
wchar_tの中身がUnicodeとは限らないので、その質問は一般的には無意味。
で、Windows環境は確かにwchar_tは2バイトなんだけど、サロゲートペア
が問題になるかどうかはどういう処理をするかに依存するので、やるこ
とをもっと具体的に書いたほうがいいかも。
351:デフォルトの名無しさん
08/01/22 13:21:48
言語周りのAPIなり何なりに任せるしかないんじゃね?
352:デフォルトの名無しさん
08/01/22 14:18:45
文字数を数えたいときって,サロゲートペア以外に
合成文字も考えなきゃだめだよね?
もう,ウンコでそう.
353:デフォルトの名無しさん
08/01/22 15:22:27
もう1文字8バイトにしちゃいなYO
354:デフォルトの名無しさん
08/01/22 18:39:31
>>349
whereは予約語になる予定だったが
よく使われていたので却下された。よって使ってよし
355:デフォルトの名無しさん
08/01/22 19:09:07
みんな大好きデバナガリ
356:デフォルトの名無しさん
08/01/22 19:38:53
あなたも私も結合音節
357:デフォルトの名無しさん
08/01/22 22:06:55
>>350
確かに仕様ではwchar_tの中身もサイズも未定義でした。すいません。
やりたいことは、UTF-8のテキストをFreeTypeに突っ込みたいのですが、よくよく考えたら
FT_Get_Char_Indexの引数はFT_ULongで32ビットでした。
サロゲートペア関係ありませんでしたねOTL
358:デフォルトの名無しさん
08/01/23 15:19:28
#define max(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \ ←これ
_x > _y ? _x : _y; } )
上記の4行目だけ良く判りません。
これは、変数_x と _y の格納場所アドレスが同じ場合、
真(1)になるという意味だと思いますが、文がここで終わって
まして、このような場合どのように解釈されるんでしょうか?
359:デフォルトの名無しさん
08/01/23 15:33:22
型が違う場合に(intとdoubleのmaxとか)コンパイルエラーを起こさせて
落とすための仕掛けじゃないかという気がする。確かめたわけじゃ
ないからほんとにそうなるかわかんないけど。
360:358
08/01/23 15:53:12
gcc 3.4.4 で int と long 型の変数を max に与え、4行目のあり・なしでコンパイルしてみた所、
確かにありの場合だけ
warning: comparison of distinct pointer types lacks a cast
が出ました。なるほどー
ちなみに、_x > _y でも比較を行っていると思うのですが、ここでは弾かれないんですね…
361:デフォルトの名無しさん
08/01/23 15:55:44
数値の比較は暗黙の型変換されるからね。
ポインタだとそれがない。
362:358
08/01/23 16:03:06
よく分かりました。ありがとうございました。
363:デフォルトの名無しさん
08/01/24 13:08:33
cabファイルに、ファイルを追加圧縮したいのですが、DLLの説明書には出来ないとあります
しかしアーカイバで対応しているものがあります
C言語ではどのようにやればいいのかわかりますか
364:デフォルトの名無しさん
08/01/24 13:13:15
一旦どこかに展開してから再圧縮してるのでは。
365:デフォルトの名無しさん
08/01/24 13:15:21
そうみたいです ありがとうございます
366:デフォルトの名無しさん
08/01/24 14:25:20
昔のVCの話ですが。
367:デフォルトの名無しさん
08/01/24 14:25:38
めでたし、めでたし。
368:デフォルトの名無しさん
08/01/24 14:29:54
日本語のWindows98で動くプログラムは_MBCS指定しますか?
369:デフォルトの名無しさん
08/01/24 16:00:55
ケースバイケース
370:デフォルトの名無しさん
08/01/24 19:33:00
32bit数どおしの足し算が範囲を超えたのかチェックするにはどうすればいいですか if無しで出来ますか
371:デフォルトの名無しさん
08/01/24 19:37:22
a、bが1ビットならば
a + b = (a and b, a xor b)_(2)
ですが32bitはどうすればいいですか
372:デフォルトの名無しさん
08/01/24 19:41:31
複数ビットの加算器
URLリンク(ja.wikipedia.org)
373:デフォルトの名無しさん
08/01/24 19:42:57
>>370
何も考えずに、一番簡単なやり方でやろうと思えば、64bit整数にキャストして足し算してしまうことだな。
後は(a+b) と aの大小を比較するとか。
374:デフォルトの名無しさん
08/01/24 19:45:23
比較とかキャストしないでマシンに手間がかからないでやる方法ないですか
375:デフォルトの名無しさん
08/01/24 19:48:02
>>372
C言語は、1bit単位の変数ないし、加算器をソフトウェアで実装すると鈍いです
速い方法ないですか
376:デフォルトの名無しさん
08/01/24 19:50:15
a + b > INT_MAX
↓
a > INT_MAX - b
377:デフォルトの名無しさん
08/01/24 19:51:39
1bitみたいに桁上がりをandや+を使ってわかりませんか
378:デフォルトの名無しさん
08/01/24 19:53:06
比較っつっても真偽値取得するだけなら setxx 命令使えるから遅くはならないと思うがね。
379:デフォルトの名無しさん
08/01/24 19:57:07
キャリーフラグとか? まぁ、どっちにしても比較はいるわなぁ……
380:デフォルトの名無しさん
08/01/24 19:58:15
a + bで、
aとbの符号が異なれば、オーバーフローすることはない。
同符号の場合、aやbの符号とa + bの符号が異なれば、オーバーフローしている。
381:デフォルトの名無しさん
08/01/24 19:59:57
インラインアセンブリ?
382:370
08/01/24 20:02:29
いい方法みつけたような気がします
unsigned intだとします 桁上がりが起こるならどちらかの31bit目が1です
2^32からその数を引けばあといくつで桁上がりするかわかります
そこで2の補数を求めてから2つの数を足してみて、31bit目が1なら負なので桁上がりしません
383:デフォルトの名無しさん
08/01/24 20:03:00
mov eax, a
xor edx, edx
add eax, b
setc dl
もうこれでええっしょ。
384:370
08/01/24 20:10:10
間違えました でもいい線いってるきはします
385:デフォルトの名無しさん
08/01/24 20:10:12
OFビットを見るほうがいいんでね?
386:デフォルトの名無しさん
08/01/24 20:13:44
久しぶりだからOFとか忘れてたお・・・
387:370
08/01/24 20:17:58
a+b;
のあとにOFはどうすれば調べられるんですか
388:デフォルトの名無しさん
08/01/24 20:18:43
インラインアセンブリでごりごり
389:デフォルトの名無しさん
08/01/24 20:21:59
((a >> 1) + (b >> 1) + (a & b & 1)) & 0x80000000
これでどうよ?
シフト2回入っちゃうけど。
390:370
08/01/24 20:27:42
良いですね
下位1bitの桁上がりを求めて、1bitシフトさせたものに加えれば桁上がりがわかりますね
サンクス
391:デフォルトの名無しさん
08/01/24 20:29:19
何か a >= (unsigned)-b の方が速い気がする。
ちゃんと実測してソースつきで報告よろ。
392:デフォルトの名無しさん
08/01/24 20:41:43
符号ありなの無しなの?
393:デフォルトの名無しさん
08/01/24 20:44:21
なしっぽい流れ
394:370
08/01/24 20:58:30
なんか、if文の方が速いかも・・・BCC5.5の場合
#include <iostream>
#include <time.h>
using namespace std;
#define N 1000000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[3],s=0;
for(n=0;n<3;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<200;k++){
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"if文の速度 "<<clsum[0]<<endl;
cout<<"if無しの速度1 "<<clsum[1]<<endl;
cout<<"if無しの速度2 "<<clsum[2]<<endl;
}
395:デフォルトの名無しさん
08/01/24 20:59:26
>>31は遅いと思う。
396:デフォルトの名無しさん
08/01/24 21:00:27
最適化しないように文末にcout<<(s&1);を入れて下さい
397:デフォルトの名無しさん
08/01/24 21:00:39
if文じゃないだろif文じゃw
条件式だ。
398:デフォルトの名無しさん
08/01/24 21:08:11
メモリアクセスに時間かかるようなのでパラメータ変更しました これだと微妙に論理演算のほうが速いかも
#include <iostream>
#include <time.h>
using namespace std;
#define N 10000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[3],s=0;
for(n=0;n<3;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<30000;k++){
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"if文の速度 "<<clsum[0]<<endl;
cout<<"if無しの速度1 "<<clsum[1]<<endl;
cout<<"if無しの速度2 "<<clsum[2]<<endl;
cout<<(s&1);
}
399:デフォルトの名無しさん
08/01/24 21:13:15
#include <stdio.h>
#include <time.h>
#define N 10000000
int main() {
unsigned a, b=0;
int k;
int cl, clsum[2] = {0};
for(k=0;k<200;k++) {
cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl;
}
printf("条件式 : %d\n", clsum[0]);
printf("ビット演算: %d\n", clsum[1]);
printf("%u\n", b);
return 0;
}
条件式 : 1004
ビット演算: 1235
1
400:デフォルトの名無しさん
08/01/24 21:14:47
最適化忘れてた
条件式 : 600
ビット演算: 677
MacOSX Core2Duo 2.16GHz gcc -O2
401:デフォルトの名無しさん
08/01/24 21:17:28
#include <stdio.h>
#include <time.h>
#define N 10000000
int main() {
unsigned a, b=0;
int k;
int cl, clsum[3] = {0};
for(k=0;k<200;k++) {
cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))>>31; clsum[2]+=clock()-cl;
}
printf("条件式 : %d\n", clsum[0]);
printf("ビット演算1: %d\n", clsum[1]);
printf("ビット演算2: %d\n", clsum[2]);
printf("%u\n", b);
return 0;
}
条件式 : 566
ビット演算1: 672
ビット演算2: 701
やっぱり条件式が一番速い。
402:デフォルトの名無しさん
08/01/24 21:20:42
std::exceptionを継承して使う場合
勝手にメンバとか付け足してもいいですか?
たとえばHRESULTとか
403:デフォルトの名無しさん
08/01/24 21:20:57
ビット演算は健闘はしているけど、
いかんせん式が複雑すぎたな。
404:デフォルトの名無しさん
08/01/24 21:21:23
>>402
お好きにどうぞ
405:デフォルトの名無しさん
08/01/24 21:21:51
『最大50桁の自然数2つを、文字列として入力させて積を出す』
という問題が出たんですが。
先生とのメールのやりとり↓
私「筆算の方法で行う」
先「積は和の繰り返しで表すこともできます」
私「最初の数値を次の数値分だけ足し算する
(2×3 = 2+2+2)」
先「桁数が多い場合単純に繰り返すだけではだめです」
どうすればいいでしょうか(:_;)
お願いします
406:デフォルトの名無しさん
08/01/24 21:22:47
コピペか?
407:デフォルトの名無しさん
08/01/24 21:24:43
>>398をVC++6でやると論理演算の方が速いよ
1248
1108
1425
となる
BCC5.5では
1931
2878
2160
408:デフォルトの名無しさん
08/01/24 21:24:43
最近どっかで見たな。
409:407
08/01/24 21:28:38
GCC(MinGW)では
829
1236
1841
同一スペックで>>398を動かしたとき
410:デフォルトの名無しさん
08/01/24 21:37:26
>>398
ウチではこうなった。
1245
688
1302
411:デフォルトの名無しさん
08/01/24 21:38:58
>>398
ウチではこうなった。
if文の速度 100
if無しの速度1 111
if無しの速度2 107
412:デフォルトの名無しさん
08/01/24 21:40:17
あまりに早く終わるので N を 10 倍した
if文の速度 896
if無しの速度1 1008
if無しの速度2 1061
413:407
08/01/24 21:47:10
単純な計算と比べてもほんど無視できる程度しか変わらなかったよ・・・
#include <iostream>
#include <time.h>
using namespace std;
#define N 10000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[4],s=0,t=0;
for(n=0;n<4;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<30000;k++){
cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"比較演算の速度 "<<clsum[0]<<endl;
cout<<"論理演算の速度1 "<<clsum[1]<<endl;
cout<<"論理演算の速度2 "<<clsum[2]<<endl;
cout<<"単純な論理演算の速度 "<<clsum[3]<<endl;
cout<<(s&t&1);
}