[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 01/29 10:31 / Filesize : 249 KB / Number-of Response : 964
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

はきだめC/C++下級者の質問箱 2



1 名前:デフォルトの名無しさん [2006/08/22(火) 09:21:31 ]
はきだめのスレへようこそ

ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。


前スレ:はきだめC/C++下級者の質問箱
pc8.2ch.net/test/read.cgi/tech/1124256027/

52 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 00:27:24 ]
においのいい草を食わせた後

53 名前:デフォルトの名無しさん mailto:sage [2006/09/03(日) 01:29:21 ]
>>49
>>50
詳しくありがとうございます。
こういうのって、経験して覚えていくんでしょうか。
覚えることがいっぱいあって大変です。

54 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 05:53:30 ]
すごい簡単なことなんですが、ifの条件ってintだと、
0はfalseでそれ以外はtrueっていうことでよかったでしょうか。
-10~10までやってみました。
自分で関数作るときに-1をfalseにしてたんですが、
ほかの人がみたら変に思われますか?

#include <stdio.h>
for(int i = -10; i<10 ; i++){
if(i){
printf("%dはtrue\n",i);
}else{
printf("%dはfalse\n",i);
}

}

55 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 05:59:34 ]
確認画面見ようと思ったら
書き込まれてしまいました。

コード、段落とかint main()とか抜けててすみません。

56 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 06:09:48 ]
>>54
> すごい簡単なことなんですが、ifの条件ってintだと、
> 0はfalseでそれ以外はtrueっていうことでよかったでしょうか。
良い。

> 自分で関数作るときに-1をfalseにしてたんですが、
> ほかの人がみたら変に思われますか?
非負値を返す関数のエラーとして負値を返す事はある。
getchar の EOF とか。
真偽値しか返さない場合は、偽の場合 0 を返すのが当然。
真の方に関しては、何を返すかは case by case だが、
普通は 1 を返したのでいい。
is 系関数とか、真の時 1 以外の値も返す実装の場合もあるけど、
これは高速化の為にそうしてるだけ。
まあどちらにしろ、非 0 を返すのが当然。
C++ なら普通は bool 型にして true/false を返すけど。

57 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 06:29:01 ]
さっそく、お返事ありがとうございます。

勉強始めたばかりなんですが、本でエラーのとき
return -1っていうのがあったような気がして、
-1にしてたんですが、if文書いてて「あれ」っと思いました。

いろんな種類のエラーを返す複数のエラー処理を
してたのも知れません。

0が偽で1が真ですか。了解しました。

58 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 09:44:59 ]
>57
「エラーを返す」と「偽を返す」の違いを考えてみよう

59 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:24:03 ]
エラーの内容が複数ある場合は、
0 を正常として、他の値をエラーとするね。

60 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:31:23 ]
俺は0をエラー、1を正常にして、エラー番号をポインタでもらった引数に入れる。



61 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:41:19 ]
そういう実装も見るね。

62 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:23:19 ]
UNIX系で 0=OK、 1、2、3、4=エラーって見かける


63 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:28:30 ]
DirectX も D3D_OK(0) が正常で他がエラーとか。

64 名前:デフォルトの名無しさん [2006/09/04(月) 23:30:30 ]
質問です。
std::vector<std::vector<int> > array;

とある場合、clearをする場合は
array.clear();
を呼ぶだけでメモリは解放されるのですか?
それともループでまわしながら解放しなければいけませんか?

65 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:37:51 ]
>>64
array.clear() でいいよ。ループは要らない。

66 名前:64 [2006/09/04(月) 23:54:11 ]
>65

どうもありがとうございます。
助かりました。

67 名前:デフォルトの名無しさん [2006/09/05(火) 00:04:00 ]
ちょっとクラスについて質問です。

入門用の本とかを見ると、C++のクラスは
Javaで言うJavaBeansみたいな使い方ばかり書いてあるけど、
関数の塊のようなクラスは、普通作らないものなのでしょうか?

単純にヘッダをインクルードして関数を呼び出すものなのか、
それとも関数群をクラスにして、そこから呼び出したほうがいいのか。
悩んでおります。

68 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:09:48 ]
>>67
クラスにするメリットがあるなら、そうすればいい。
Java とか関係無しに、それだけの話じゃないのか?

69 名前:67 mailto:sage [2006/09/05(火) 00:24:16 ]
>>68
オブジェクト指向って言うから、オブジェクト的にしなきゃ
いけないのかなぁ、と思いまして。
好きにすりゃいい、ってことなんでしょうけど。

特にメリットもなく、関数全部クラスにしたようなプログラムは
クソソース扱いなんだろうかと思うと、夜も寝られません。

70 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:34:30 ]
>>69
何のメリットも無いのに複雑度を上げるソースは糞ソースに違いない。



71 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:40:54 ]
> 関数の塊のようなクラス
俺からすれば、これはJavaが普通の関数を持てない(全てクラス内に入れないといけない)から、
仕方なくやっているという風にしか見えない。

72 名前:67 mailto:sage [2006/09/05(火) 00:46:56 ]
>>69
確かにそうッスね。
ライブラリとして、クラスにしてまとめるのも変?

>>71
あ、僕も最初はそう思ってたけど、だんだん麻痺して、
最初にクラスありきな頭になってたかも。

73 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:54:51 ]
その関数群が共通となるデータを持たないのなら、クラスにする必要ないでしょ。
まぁ、共通のデータ構造を持っているならネームスペースに放り込んじゃえばいいしね。

74 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:13:31 ]
あるフォルダのどんどん増えていく複数のテキストファイルを圧縮するって
いうアプリを作りたいのですが質問です。

複数のテキストファイルを選択して、zipなどで圧縮するというのは
できると思うんですが、新しく増えたテキストファイルを圧縮ファイルと
一緒にする方法を悩んでいます。
私の頭では、下記のような手順しかできそうにありません。
@圧縮したファイルをフォルダに解凍
A新しいファイルをそのフォルダにコピー
Bまとめて圧縮

ただ、この方法だと圧縮された容量の大きいファイルを
毎回、解凍、圧縮することになります。
それで、下記のようなようなことをしたいんですが
アドバイスをお願いできないでしょうか。

新しいファイルを圧縮して、それを圧縮ファイルに追加で
書き込むっていうことができれば、負担が少なくて良いかと
思っているんですがどうなんでしょうか。

また、圧縮ファイル内でもファイル名で区切れば、
全部解凍しないでも、そのファイル名での区間を
読み取って解凍すれば部分的に取り出すことができると思います。

えっと、圧縮するときも解凍するときも毎回丸々全部を
計算しないで、加えるところだけ圧縮、
読みたいところだけ解凍って言うことがしたいです。

75 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:16:28 ]
>>74
やりたいことはわかった。あとは、何をやったらどんな問題が出たのかも書いてほしい。

76 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:18:11 ]
>>74
使ってる圧縮フォーマットは何?
ライブラリ使って操作してるんなら、どのライブラリ?

77 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:25:14 ]
>>75 それはもう書いてあるだろ。

78 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:38:15 ]
>>75
>>76
すみません。実はこれから作ろうと思ってます。

ろくに調べないで質問してしまい
申し訳ございません。当方、初心者なのでこういうことが
実現可能かどうかわからず、それが知りたいということでした。
確かに、何が聞きたいのかわからない文章でした。
実現できそうということで、ひとつずつ調べて
書いてみます。
わからないことがあったら、また
よろしくお願いします。
時間掛かりそうですが、できたらコード書きます。

ありがとうございました。

79 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:45:23 ]
共通アーカイブライブラリに行ってみたらどうだろう。

80 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 10:02:02 ]
>77
m9プ



81 名前:デフォルトの名無しさん mailto:sage [2006/09/06(水) 11:37:38 ]
少なくとも、自前実装であれば、実現はできるだろう。
何かのライブラリ使うなら、マニュアルを百万回繰り返して読んでみてくれ。
俺なら、>>79の方法をとるが…。(でも、ZIPだけシェアウェアだったような希ガス…。)

うろ覚えですまんが、lzhだったら、全体のヘッダの後に、個数分の(ファイルごとのヘッダ+圧縮データ)が並んでるだけ。
だから、最後に単純にデータ付加すりゃヨロシ。

zipは知らないので、今、仕様を斜め読みしてみたが、最初のヘッダがなくて、個数分の(ファイルごとのヘッダ+圧縮データ)が並んで、
なんか、最後に変なデータ(ディレクトリツリーのデータ?)がついてるみたい。
(バイナリエディタで、zipファイルを覗いてみても、最後のあたりに、ファイル名のデータが入ってるね。)
まあ、それでも、たいした大きさじゃないので、どこかにデータ退避させれば、簡単にデータ付加できるだろ。


82 名前:デフォルトの名無しさん [2006/09/07(木) 14:53:42 ]
ファイルの読み込みの仕方を教えてください
PGM形式の画像を読み込みたいんですが、コメント行の読み飛ばしなどがよくわかりません。
どうやって読み込んだらいいのでしょうか?

83 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 15:01:05 ]
>>82
つ[libpnm]

84 名前:デフォルトの名無しさん [2006/09/08(金) 06:22:28 ]
C++の資格って何かありますか?

85 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 07:46:02 ]
>>82
pngじゃないのかよワロス
テキスト形式の画像フォーマットなんだ。おもしろい。
読み込み専用でいいなら、Susieのプラグインもあるみたいだね。

コメント行の最初は#になってるんだね。(改行は\n限定(\r\n不可)で。)
じゃ、最初1バイト読んで、分岐させて、次の行に逝けばいいじゃん。
ファイルから読んでるのか、メモリから読んでるのか、
また、テキスト読み込みには、何のクラス・関数使ってるのか分からんので、
これ以上は答えられない。

>>84
基本情報技術者・ソフトウェア開発技術者は持ってるので、
別の資格が欲しいってこと?


86 名前:デフォルトの名無しさん [2006/09/08(金) 08:55:19 ]
>>85

基本情報は取ったんだけど何とろうか迷ってる
さすがに今更サーティファイのCやJAVAなんて受ける気になれないしさ


87 名前:デフォルトの名無しさん [2006/09/08(金) 09:14:14 ]
資格より職務経歴

88 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 11:27:15 ]
コールバックについて質問です。
手元の本3冊にも全く書いてないのですが
どのように書けばよいのでしょうか。

コールバック関数は普通の関数みたいなんですが、
呼び出す側の関数がどのように書くものなのかわかりませんでした。
下記は、pro2の引数がおかしいっていうエラーがでますが
呼び出した関数が実行されて、次にコールバック関数が実行、
"hello2hello"と出力されることを期待して書きました。

ネットで関数のポインタを渡すと呼ばれるって解説があったので、
ただ、priを引数に入れただけです。
これを動くようにしたいんですが、よろしくお願いします。
簡単に説明しているページなども歓迎です。

#include<stdio.h>
int pri(){
   char* str = "hello";
   printf("%s",str);
   return 1;
}
int pri2(pri){
   char* str = "hello2";
   printf("%s",str);
   return 1;
}

int main()
{
   pri2(pri);
   return 1;
}

89 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 11:35:19 ]
>>88 www.google.co.jp/search?q=%e9%96%a2%e6%95%b0%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf

90 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 13:09:32 ]
>>89
関数ポインタで、ぐぐれば良かったですか。
見てみます。
ありがとうございました!




91 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 15:17:37 ]
お世話になっております。
関数ポインタのページいくと、コールバック関数について
触れているページもありました。

自分で作った関数を引数にして渡せるAPI関数(なかのコードがわからないブラックボックスの)
なんか見かけるんですが、ちゃんとその関数は、返り血の型、引数の型と個数が
定義されていて関数の中でポインタで呼び出されてるんですね。
ただ単に、引数にコールバック関数の名前だけを入れると
実行されるわけでは無いんですね。
普通に考えてもそんな意味のわからないルール作らないですよね。

見かけてもいきなり関数名だけ、引数に入れているので今まで
意味がわかりませんでした。

と思ったのですが、こういう解釈でよかったでしょうか。

92 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 18:34:13 ]
>>91
解釈と感想がごっちゃになっててよくわからん。
きっと君自身ごっちゃになっているのだろうね。
先ずは、他人にきちんと説明できるように整理してみたら?

93 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 14:09:42 ]
環境
OS:windows2000
コンパイラ:Borland C++

プログラム中においてフォルダを作成して
その中にデータファイルの保存をしたいんですけど、
どうやればいいんですか?

94 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 15:06:52 ]
つ[mkdir()]

95 名前:93 mailto:sage [2006/09/09(土) 17:31:20 ]
>>94
#include<windows.h>

int main(void)
{
system("md test");
return 0;
}

これで実現することができました。
ただこれだとフォルダ名が固定になってしまいます。
そこでフォルダ名を決めれるようにするにはどうしたらよいのでしょうか?


96 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:26:21 ]
>>95
mkdir()は使わんの?
どちらにしろユーザーから入力された文字列を渡せばいいじゃない。
めっちゃ基本中の基本だけど。

97 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:31:00 ]
>>95
つ[sprintf()]
つ[boost::format()]
つ[_mkdir()]
つ[CreateDirectory()]
つーか、調べるってことはできんもんかね。

98 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 21:32:04 ]
systemなんて恐ろしい関数をよく使う気に

99 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 14:20:44 ]
まあ確かに普通はあまり使わんかな。
外で何されてもわかんないもんなー。

100 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 20:58:47 ]
現在ポインタ及びリスト構造の学習中で
tagData * EraseNext(tagData *p);
こういう文を見かけたのですが、どういう意味かわかりません
tagdata * の”*”はどういう意味でしょうか?



101 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 21:18:35 ]
>>100
仮引数と同じ、tagDataへのポインタ。としか言いようがない。

102 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:12:05 ]
ポインタの学習中でその質問はないだろー

103 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:33:44 ]
×学習中
○たった今学習を始めたところ

104 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 15:33:01 ]
たとえば、(tagData* p)と、(tagData *p)を別物と思ってるとか。


105 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 17:51:29 ]
初心者以前のレベルの質問なのでこちらにきました。
telnetのクライアントの送受信の並列処理(マルチスレッド)について質問です。

telnetクライアント並列処理(親スレッドは受信、子スレッドは送信)を
実装することは、どういうことができるようになることなのでしょうか?
受信と送信のスレッドが起動していて、受信も送信もどちらでもできて、
単純な"送信→受信"だけじゃなくて、
「接続が確立したらいきなり"受信だけ"とか"受信→送信"というのもできる」ように
なることをいうのでしょうか?

サーバーの場合は、親スレッドがアクセプトして、
子スレッドを作って処理をさせることによって、
「複数のクライアントを相手することができる」というのは勉強しました。

よろしくお願いします。

106 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 18:14:08 ]
>>105
送信が連続している状況でも安定して受信できる。
telnetのプロトコルはチャットほど単純じゃないから敢えてそうすることもあるんでないかな?

107 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 21:15:07 ]
>>106
ありがとうございます。
>送信が連続している状況でも安定して受信できる。
スレッドがたくさん作られるということでしょうか?

スレッドだとちょっと複雑で自分的に難しいので、マルチプロセスで考えさせてください。
以下かなり省略した物になりますがコードです。

if(pid>0){
 //親プロセス
  while(1){
   //受信処理
  }
 //シグナル送信、プロセス終了の処理
}

else if(pid=fork()){
 //子プロセス
  while(1){
   //入力と送信処理
  }
 //シグナル送信、プロセス終了の処理
}

サーバーの場合、たくさんのプロセスが作られることになると思いますが、
上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか?
アプリケーションを起動すると"標準入力から送信"、"受信"この2つのプロセスが起動して同時にできるだけ。
送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか?

長文すみません。変なところあると思いますので
ご指摘ください。補足させていただきます。
よろしくお願いします。

108 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 01:46:54 ]
>スレッドがたくさん作られるということでしょうか?
いいえ。

>上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか?
はい。

>送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか?
サーバの御心次第です。

telnetプロトコルもそうだが、例えば標準入出力をみても必ずしも対になっていないことに注意。

109 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 08:23:15 ]
>>108
ずばりの回答ありがとうございます。
すっきりできました。

110 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 03:42:09 ]
pthread_createで複数スレッドを作ったときの
プロセス内のスレッドの数が知りたいんですが方法
ありますでしょうか。
よろしくお願いします。




111 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 01:24:23 ]
linuxのfork+execについて質問です。
下記のコードは10回繰り返し、execvを繰り返して、
プロセスが生成できなかったときは、もう一度繰り返したいため
失敗したときに、i--;してます。
・このコードでエラーのときの処理できているか確認したいのですが、
 プロセス生成をわざと失敗するようにすることできるでしょうか?
・i--で繰り返しの処理はできてるでしょうか?

for(i=0;i<10;i++){

    //子プロセスの生成
    if((pid=fork())==0){
        execv(path,opt);
    }else if(pid>0){
        //親プロセス
    }else{
        //子プロセス生成失敗の時はiを一つ減らして繰り返し
        i--;
    }

}

112 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 03:10:28 ]
>>111
実験してみたいだけならこんなマクロでも用意すればよろしかろ。
#define myFork(x) (fgetc(stdin) != (x) ? fork() : -1)
#んで、fork()の代わりにmyFork('\n')とでもすればいい。

113 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 07:36:29 ]
>>112
関数のマクロ定義ってこういうふうに使えるんですね。
はじめてみました。
ど初心者なので感動しました。
どうやって勉強していけば、こういう感覚が身につくんだろう。。。

114 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 20:28:57 ]
「勉強」しているうちは無理。

115 名前:デフォルトの名無しさん mailto:sage [2006/09/25(月) 09:28:13 ]
君は勉強をやめたの?

116 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 00:58:06 ]
>>115
やってることは同じでも「勉強」だと認識してやってるようなうちは芽が出ないってこと。

117 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 09:10:23 ]
なにその理屈w

118 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:04:37 ]
勉強をやめてしまうことこそ芽がしぼむだろ普通に考えて。

119 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:09:54 ]
日々是勉強

120 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 10:52:48 ]
ファイルの排他制御をしたいのですが、open()関数を使って、
ファイルディスクリプタをflockの引数に入れてロックする方法はできました。
ディスクリプタではなくて、ストリームを使って排他モードで開きたいと思ってます。
コードです。
#include <fstream>
int main(){
using namespace std;
ifstream fin;
fin.open("filepath",ios::in, filebuf::sh_none);
return 0;
}
こんなエラーが出ます。
error: `sh_none' is not a member of `std::filebuf'

tp://www.codeguru.com/forum/printthread.php?t=293846
こういうページが見つかったので、filebuf.sh_noneにしてみましたが
だめでした。
買ったばかりのlinuxのパソコン壊れて、現在の環境はcygwinです。
・filebuf::sh_noneはどのようにすればよいでしょうか。
・排他制御は、他にスマートで簡単な方法ありますでしょうか。
よろしくお願いします。



121 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 11:49:22 ]
filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。
正攻法ではファイルディスクプリタで読み書きするバッファクラスを自分で作れということになるのだが、まあ面倒。

122 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 14:42:23 ]
>>121
お返事ありがとうございます。
>filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。
非標準とかそういうこともあるんですか。知りませんでした。
tp://www.kumei.ne.jp/c_lang/cpp/cpp_38.htm
有名そうなページでもfilebufってでてきたので、エラーがでるのは、
自分の書き方が変だと思いこんでました。

いろいろ検索してみると、ifstreamで排他モードはできない
と書いてある掲示板の書き込みもありました。
windowsだとライブラリあるんですが、linuxだとそういうの
簡単にできるの無いっぽいです。
boostもちょっと見てみたんですが良くわからないし、
自分のスキル的にopen+flockじゃないとだめのようです。

123 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 15:04:29 ]
実はflock()は完全ではない罠。

124 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 00:01:02 ]
>>123
flock調べたんですが、どういうところが完全じゃないんでしょうか?
cじゃなくてperlのページなんですが、自分でファイルのある無しの
関数作るよりも、flock使うほうがいいってあったんですが。

検索していたらこういうページを発見しました。
tp://www.tietew.jp/cppll/archive/4753
[io]fstream <=> fd
こういうことできるってことしか読み取れませんでしたが、
1、[io]fstream で開く、
2、[io]fstream => fdでディスクリプタ取得
3、flockでロック
4、[io]fstreamで操作
っていうことができないでしょうか。
ストリームとディスクリプタがどんなものかわかって無いので、
並行して操作できるのかどうかわかりませんが。
4番目の操作が、ストリームで操作できないと、
はじめからディスクリプタで開くしかないですよね。
読んでもわからないので、とりあえずやってみるしか無いでしょうか。

125 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 06:50:45 ]
flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか?
誰もがflock()使ってアクセスする保証があるなら問題ないが。

126 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 09:43:57 ]
それを問題あると言っちゃうのか・・・。

127 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 11:25:46 ]
>>125
>>126
お返事ありがとうございます。

>flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか?
なんかひらめいたかもしれません。
はじめfdで開いてflockします。同じプロセスならそのままfstreamでファイルを
開いて操作できそうです。
違うプロセスでもflockを呼び出さなければfstreamでファイルを開いて
操作できそうですね。実験したらflockを呼び出さなければ待機しませんでした。
fstream.openって返り値ないので、ちゃんとオープン
してるのかわからないんですが。書き込みしてみて確認してみたいと思います。

なんかflockの仕組みがやっとわかってきました。
>>124みたいなややこしいこと考えなくてもよさそうです。

○自前のflockでも他のプロセスは同じ自前のflockを、
呼び出さないとだめなので、その点はシステムコールの
flockと同じということよろしかったでしょうか?

○必要なくなってしまいましたが、[io]fstream <=> fd
の関数はどれでどのような使い方かご教示
お願いできないでしょうか。
参考になるのかわからないですが
tp://www.tietew.jp/cppll/archive/4767
環境が対応していないのか、わかりませんせんがいろいろ
試しても動きませんでした。
よろしくお願いします。

128 名前:デフォルトの名無しさん [2006/10/01(日) 13:49:36 ]
Cで、ある一定時間内に入力がなければ
次の処理に移る、ということをしたいんですが
どのように書けばいいのでしょうか。

129 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:01:09 ]
一定時間内に入力が無いってどういうこと?
関数内で、tm構造体からforかwhileで時間取ってはその時間の差分とって
条件満たせば、関数を抜け出すようにしてみれば?


130 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:15:22 ]
キーボードからの入力のことです。
ずっと入力待ちなるんじゃなくてしばらくしたら飛ばしたいんです。
while(時間の条件){
scanfとか;    ←ここでずっと止まったりしないですかね?
}



131 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:24:45 ]
標準Cでは無理だね。
「キーボードが押されたか」の検出は。

132 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:37:52 ]
そうですか・・・。ありがとうございました。

133 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:48:47 ]
標準Cでできないとはつまり、
WindowsならWindowsの関数、UnixならUnixの関数使えばできるよということ。

134 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 15:14:13 ]
機種依存スレに行けばいいかも。
Windowsだったら思い切ってAPIスレへ。

135 名前:デフォルトの名無しさん mailto:sage [2006/10/02(月) 01:13:41 ]
夜遅くにすみません…

今、VC++でプログラミングしてるんですが、
ダイアログボックスから変数を持って行きたい時はどうすればいいですか?

例えば

ダイアログボックスで
次の数の二乗を算出します
とか書いてユーザに入力を求めて、そしてユーザが入力したら
その値を元に計算→出力
的な感じなんですが…

136 名前:デフォルトの名無しさん [2006/10/03(火) 03:14:22 ]
ヘルプを見ろ。それで全てが解決する。

137 名前:デフォルトの名無しさん [2006/10/04(水) 22:20:22 ]
class CDSig : public CDialog
{
// コンストラクション
public:
CDSig(CWnd* pParent = NULL); // 標準のコンストラクタ



以下略
------------------------------------

VCでダイアログを作成しクラスCDSigを作成したところ自動で上のようなクラスが
自動で作成されました。
標準でコンストラクタが出来ているようですが、自前でクラス内の変数を初期化する
コンストラクタを作成するにはどうしたらよいのでしょう?
名前CDSigの定義を追加すると
  error C2668: 'CDSig::CDSig' : オーバーロード関数の呼び出しを解決することができません。
と怒られます。

138 名前:デフォルトの名無しさん mailto:sage [2006/10/05(木) 00:05:25 ]
>>137
その「標準のコンストラクタ」の定義を変更しろ。

139 名前:デフォルトの名無しさん [2006/10/07(土) 14:42:09 ]
C++で
「変数aとbの符号が同じ場合」という条件を判断する関数があれば教えてください。
自分はif ( ( a < 0 ) == ( a < 0 ) ) と書いてるのですが、あまりに非効率な気がするので...


140 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 14:49:07 ]
a*b > 0



141 名前:139 mailto:sage [2006/10/07(土) 14:53:15 ]
>>139
スミマセン
変数a,bは有効数字15ケタなんです。書き忘れました。
それでも掛け算は避けた方がいいかな〜と思ってます。

142 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 15:22:13 ]
>>141
有効数字15桁ってどんな型?
まぁ、何をもって効率とするかが未定義なのでそもそも答えようがないけど。

・コーディングの効率なら、テンプレート関数でそういう関数を一個作っておけばいい。
・実行効率なら、型ごとに大抵は符号ビットを持っているだろうからそれを見ればいい。

143 名前:141 mailto:sage [2006/10/07(土) 15:37:59 ]
>>142
double型です。
符号ビットの見方を教えてください

144 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 15:41:46 ]
IEEE754
変数(のbit)同士でxorでも取ったあと、
符号bitのみ見ればいいんじゃないかね。

145 名前:141 mailto:sage [2006/10/07(土) 16:00:07 ]
1bitが符号判定に割り当てられてるのは勉強しましたが、
どうやって1bitを見ればいいのかさっぱりわかりません。
コードを書いてもらえませんか...

146 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 16:12:58 ]
&

147 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 16:46:54 ]
ja.wikipedia.org/wiki/IEEE754

148 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:05:08 ]
( a < 0 ) == ( b < 0 )
これが画像処理の1ピクセルごとに繰り返されるのなら
気になるかもしれんが、そうでもないならこれで十分。

double使ってるんだからそんなにシビアなものを組んでるとも
思えんし。シビアなところならdouble使うのをやめる工夫をして、
整数タイプでxorしたらいい。

もしどうしてもって言うなら>>146だけど、エンディアンには気を
つけてね。

149 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:12:14 ]
つーか、パフォーマンスを期待しているならそんなところよりも他にやることが山ほどありそうだが。

150 名前:141 mailto:sage [2006/10/07(土) 17:20:38 ]
>>146, 147, 148, 149
2000回ほどのループなので、計算負荷が高すぎて困っているというわけではないのですが
Cの先輩方はどのように書くのか知的好奇心から質問しました。
&も使えるように練習してみます。ありがとうございました。



151 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:27:28 ]
ひとつだけアドバイスしておくが
おまえが小手先でごちゃごちゃやろうとしている方法よりも
単純な>>139のままのコードの方がが、最適化されて速くなっている可能性も十分ある。

とりあえず、何か小技を使おうとする前に
必ずアセンブラ出力を見て不満があるかどうかを判断すべき。

もちろん、それ以前に、そこまで速度を求める必要があるのか
あるいは他の部分で工夫すべき点がないのか、ということをよーーく考えるべきだが。

152 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 18:14:19 ]
PXOR






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef