【初心者歓迎】C/C++室 Ver.47【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
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
d

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などの意味が分かりません。

無視して進んでも大丈夫ですか?
どんな場合に使うのかなどが把握できていない状況です。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4988日前に更新/252 KB
担当:undef