はきだめC/C++下級者 ..
[2ch|▼Menu]
2:デフォルトの名無しさん
06/08/22 09:36:05
>>1 乙〜

3:デフォルトの名無しさん
06/08/22 11:44:16
C++でスレッドってどうやんの?

4:デフォルトの名無しさん
06/08/22 11:56:38
>>3
C++の規格の範囲には、スレッドは無い。
そこで、外部のライブラリやOSが提供するAPIを使ってスレッドを操作する。

これ以上何か知りたければ、自分で検索するか、こっちで。
マルチスレッドプログラミング相談室 その4
スレリンク(tech板)

5:デフォルトの名無しさん
06/08/22 14:55:32
適切なナビゲートに感謝します。

6:デフォルトの名無しさん
06/08/25 16:07:28
正規表現について教えてください。
aaa\bbb\ccc
上記のような文字列があったとします。
これを\で区切って、配列に格納したいです。
よろしくお願いします。

あっ、あとc/c++の正規表現の本って
見つけられないんですが無いんでしょうか。

7:デフォルトの名無しさん
06/08/25 16:43:46
>>6
\で区切りたいだけなら、正規表現ではないけど、Boost Tokenizerが使える。
パス文字列ならそれに特化したBoost Filesystemもおもしろい。

8:デフォルトの名無しさん
06/08/25 18:16:47
はきだめ的にはstrtokをバンバン使えというのが正しい。

9:デフォルトの名無しさん
06/08/25 18:53:00
boost馬鹿は死んでいいよ

10:デフォルトの名無しさん
06/08/25 20:43:27
Boostがないとまともに使えないC++の方こそどうにかしてください。

11:デフォルトの名無しさん
06/08/25 23:22:57
>>6
/**
文字列を指定の文字で分割し、単語のリストを作ります
@param text 入力文字列(","や";"を含む文字列)
@param separators 分裂文字列(",.;:","\n")
@param words 出力文字列リスト
*/
bool split(const string& text,
  const string& separators,
  vector<string>& words)
{
  int n = text.length();
  int start = text.find_first_not_of(separators);

  while ((start >= 0) && (start < n))
  {
     int stop = text.find_first_of(separators, start);
     if ((stop < 0) || (stop > n)) stop = n;
     words.push_back (text.substr(start, stop-start));
     start = text.find_first_not_of(separators, stop+1);
  }
  return true;
}

12:デフォルトの名無しさん
06/08/26 00:06:19
>>10
C++ をどうにかするのが Boost の存在意義だろ。
使用制限があるわけでもないんだから、おとなしく使っとけ。

13:デフォルトの名無しさん
06/08/26 00:34:11
>>11
なぜ bool ?

14:デフォルトの名無しさん
06/08/26 00:36:44
これで6と同じ動作をすると思う。
#include <boost/tokenizer.hpp>
#include <boost/range_ex/algorithm.hpp>

bool split(const std::string& text,
    const std::string& separators,
    std::vector<std::string>& words)
{
    typedef boost::char_separator<char> char_separator;
    boost::copy(
        boost::tokenizer<char_separator>(text, char_separator(separators.c_str())),
        std::back_inserter(words));
    return true;
}

>>12
むしろ9に言ってやってください。

15:デフォルトの名無しさん
06/08/26 01:00:53
>>11
int に string::npos が入ったら -1 になるのって、確実?

16:デフォルトの名無しさん
06/08/26 07:02:26
メモリ領域の質問です。

メモリ領域は
  ・プログラム領域 (ソースコードをロードする)
  ・静的領域     (グローバル変数など)
  ・スタック領域   (ローカル変数や引数などの、いわゆるワーク)
  ・ヒープ領域    (mallocなどで、プログラマが直接管理する)

だと理解しているのですが、この理解は正しいでしょうか。

また、正しかった場合、静的・スタック領域ではなく、
あえてヒープ領域を使ってプログラマが特にメモリを管理するのは、
どんな意図があるのでしょうか。
具体的な使い道など教えて下さい。

17:デフォルトの名無しさん
06/08/26 08:19:18
>>7
>>8
アドバイスありがとうございます。
勉強してみました。

>>11
>>14
初心者、はきだめの僕としては、コードはすごい助かります。
穴があくまでじっくり読ませていただきます。


18:デフォルトの名無しさん
06/08/26 09:16:38
>>16
大体あってます。
Unixの場合は、
・testセグメント(命令(コード)の領域)
・dataセグメント(グローバル変数・static変数の領域)
・bssセグメント(Block Started by Symbol)
  ・stackセグメント
  ・ヒープ領域
となります。
Windowsのことは良く知りません。

またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
領域はごく限られたサイズしかないため、ヒープを使います。

19:デフォルトの名無しさん
06/08/26 09:17:25
修正:
testセグメント

textセグメント

20:デフォルトの名無しさん
06/08/26 09:34:44
>>18
餅搗け。>19以外にも間違いだらけだ。

21:デフォルトの名無しさん
06/08/26 10:15:03
>>20
指摘してください。

22:デフォルトの名無しさん
06/08/26 10:22:42
>ヒープ領域はごく限られたサイズしかないため、ヒープを使います。
マゾっ娘確定

23:デフォルトの名無しさん
06/08/26 10:33:42
指摘サンクス。
修正:
また、ヒープ領域はごく限られたサイズしかないため、ヒープを使います。

また、スタック領域はごく限られたサイズしかないため、大きなメモリを扱うためにヒープを使います。

24:11
06/08/26 18:17:50
>>13
バカの一つ覚えでvoidでなく、とりあえずboolやっとけってのがある。それでかも

>>15
元ネタがパクリで覚えてない
CSVとかのコンマ区切り用で実際使ってます

25:デフォルトの名無しさん
06/08/26 19:29:13
>>20
間違いだらけって、どこが間違い?
いや、煽りじゃなくて、純粋に知りたい。

26:デフォルトの名無しさん
06/08/26 19:57:23
>>25
>20じゃないけど気づいた点を列挙。

>>16
>大体あってます。
そうでもないでしょ。

>Unixの場合は、
>・testセグメント(命令(コード)の領域)
これは>19だね。

>・dataセグメント(グローバル変数・static変数の領域)
明示的に初期化される場合のみ。

>・bssセグメント(Block Started by Symbol)
初期化されない静的変数などはこちら。
例えば0で初期化している場合は実装依存と思われ。

>またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
表現が微妙だ。

>グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
>領域はごく限られたサイズしかないため、ヒープを使います。
>23だが「ごく限られた」が相対的だなぁ。

ついでに言えば、自動変数でも動的確保できるんだが。

27:デフォルトの名無しさん
06/08/26 20:07:04
大体あってるじゃん。

28:26
06/08/26 20:14:53
そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。
それと、スタックのもう一つの重要な役割も書かれていないし。
#それらは末節だと言うのなら大体あっているってことだろうけどね。

29:デフォルトの名無しさん
06/08/26 20:22:12
>>28
> そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。

その理由とは?

> それと、スタックのもう一つの重要な役割も書かれていないし。

その役割とは?

30:デフォルトの名無しさん
06/08/26 20:33:54
再帰
関数の戻り先の保存

31:デフォルトの名無しさん
06/08/26 20:37:36
>>30
「〜などのいわゆるワーク」って書いてるじゃん。
明記してないから、理解してないということ?

32:デフォルトの名無しさん
06/08/26 21:42:27
>>16
メモリ領域は環境によっていろいろ変わるから、それで完全に
正しいかどうかは判別できない。でも一般的な区分として
そういう領域があるというのは正しい。以下は一般的な話。

プログラム領域にロードされるのはソースじゃなくてコンパイルされた
マシンコードね。

ヒープを使うのは、他のやつらが不適切なとき。

静的領域を使うと、プログラム起動中はずっとメモリを握ったままになるので
大きな領域で、必要な場合と不要な場合が分かれるようなときは効率が悪い。

スタックを使えば要らなくなったときにすぐ解放できるけど、解放の順序が
必ず確保と逆順じゃないといけない。あとはサイズに制限がある環境がほとんど。

33:デフォルトの名無しさん
06/08/26 22:48:50
つまり、大体あってるってことじゃん。

34:デフォルトの名無しさん
06/08/28 16:56:19
「大体」の基じゅ(ry

35:デフォルトの名無しさん
06/08/28 17:00:19
0 点じゃないってことじゃないの?

36:デフォルトの名無しさん
06/08/28 19:35:32
3点満点で1点てところだね
どうにも割り切れない

37:16
06/08/29 16:49:19
色々議論になってしまってすみません。

メモリ領域の分類については、
現時点の自分のレベルで理解する分には
差し支えないと思いました。

malloc(ヒープ)の利用については、以下のように解釈しました。

  処理中で扱う配列データの個数が不定な場合に、
  その時々に応じて臨機応変に配列を用意したい。
  そのためにmallocで動的に配列用のメモリを確保する。
  →メモリ節約技の1つ

なるべく理解してから書こうと思ったので、
レスが遅れました。すみませんでした。
ご回答頂いた>>18>>26>>32さん、
その他皆様ありがとう御座います。

38:デフォルトの名無しさん
06/09/01 03:32:13
builder使ってます。
ファイルを一行ずつ読んで、printfで出力したいんですが、
「メモリが"written"できませんでした」っていうエラーになります。
配列とかポインタとか良くわかってないので、その辺がおかしいんだと思います。
また、下記の場合読み込むファイルが3行だけになってるんですが、
行数が決まってないときのlist[num]を動的に処理する方法も
どうしたらいいのがわかりません。よろしくお願いします。

#include <stdio.h>
#include <fstream>
#include <iostream>
#include <iomanip>

int main()
{
std::ifstream fin("hoge.txt");
if(!fin){
printf("エラー");
return -1;
}
const int num = 3;
char* list[num];
for(int i=0; i<num; i++){
fin >> list[i];
}
for(int j=0; j<num; j++){
printf("%s\n",list[j]);
}
fin.close();
return 0;
}

39:デフォルトの名無しさん
06/09/01 05:02:26
char *list[num]は、ポインタの配列だが、配列の中身(=各ポインタの値)は不定。
C99とGCC以外では、配列の大きさは「定数」として、コンパイル時に決まってなければいけない。
あらかじめわからない場合は動的に確保する。(何も考えずにvectorを使うのも可)

40:デフォルトの名無しさん
06/09/01 07:48:28
>>39
アドバイスありがとうございます。
vector使って書いてみました。
vectorとstringで、文字数と行数が動的できたと思うんですが、
これで大丈夫でしょうか?ちょっと心配です。

int main()
{
std::ifstream fin("hoge.txt");
if(!fin){
printf("エラー");
return -1;
}
std::vector<std::string> list;
std::string s;
while(!fin.eof()){
getline(fin,s);
list.push_back(s);
}
for(int j=0; j<list.size(); j++){
printf("%s\n",list[j]);
}
fin.close();
return 0;
}


41:デフォルトの名無しさん
06/09/01 08:46:05
listという名前のvector...

42:デフォルトの名無しさん
06/09/01 09:25:52
「大丈夫でしょうか?」って・・・実行はしてみたの?

43:デフォルトの名無しさん
06/09/01 09:46:35
そりゃ一応動くらしきもの書いて、期待の動きはしてるようだが
はたして重大なバグが潜んでいないか心配なので添削お願いできますか
ということだろ。なんでみんなギスギスしてんの?

44:デフォルトの名無しさん
06/09/01 10:53:29
はきだめだから

45:デフォルトの名無しさん
06/09/01 11:16:17
だよな

46:デフォルトの名無しさん
06/09/01 18:55:48
まあとりあえず
・while (!fin.eof()) {} というやり方は大抵望み通りの動作にはならない
・printfにstringをそのまま渡しても大抵望みどおりの動作にはならない
とだけ

47:デフォルトの名無しさん
06/09/01 21:39:21
これで十分だろう。
while (getline(fin, s)) {
    list.push_back(s); 
} 

48:デフォルトの名無しさん
06/09/01 22:41:15
>>46
c_str()無いですね。
正常に動いてたっぽいんですが、違うソース
貼り付けてしまったのかもしれません。
while (!fin.eof()) {} は良くないですか。
奥が深いです。
難しいので今後の課題にさせてください。

>>47
ありがとうございます。
while (getline(fin, s))というのもできるんですね。
こちらに変えてみます。

49:デフォルトの名無しさん
06/09/01 23:19:17
while (!feof()) 系のやり方の駄目具合は、
最終行に改行だけの行(空行)がないファイルや
最後に改行がないファイルを扱ってみるとわかる。
なぜそうなるかは、feof()の仕組みを考えながら動きを追ってみるとよい。
もちろん、fin.eof()でも同じ。

50:デフォルトの名無しさん
06/09/01 23:29:51
Cのfeof()が立つのは、ファイルを読んだ後。
              ~~~~~~~~~~~~~~~~~~~~~~
BASICとは違うのです。

51:デフォルトの名無しさん
06/09/02 00:13:19
クララが立つのはいつ?

52:デフォルトの名無しさん
06/09/02 00:27:24
においのいい草を食わせた後

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

54:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/09/04 05:59:34
確認画面見ようと思ったら
書き込まれてしまいました。

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

56:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/09/04 06:29:01
さっそく、お返事ありがとうございます。

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

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

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

58:デフォルトの名無しさん
06/09/04 09:44:59
>57
「エラーを返す」と「偽を返す」の違いを考えてみよう

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

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

61:デフォルトの名無しさん
06/09/04 21:41:19
そういう実装も見るね。

62:デフォルトの名無しさん
06/09/04 23:23:19
UNIX系で 0=OK、 1、2、3、4=エラーって見かける


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

64:デフォルトの名無しさん
06/09/04 23:30:30
質問です。
std::vector<std::vector<int> > array;

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

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

66:64
06/09/04 23:54:11
>65

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

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

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

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

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

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

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

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

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

72:67
06/09/05 00:46:56
>>69
確かにそうッスね。
ライブラリとして、クラスにしてまとめるのも変?

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

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

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

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

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

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

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

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

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

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

77:デフォルトの名無しさん
06/09/05 08:25:14
>>75 それはもう書いてあるだろ。

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

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

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

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

80:デフォルトの名無しさん
06/09/05 10:02:02
>77
m9プ

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

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

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


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

83:デフォルトの名無しさん
06/09/07 15:01:05
>>82
つ[libpnm]

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

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

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

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


86:デフォルトの名無しさん
06/09/08 08:55:19
>>85

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


87:デフォルトの名無しさん
06/09/08 09:14:14
資格より職務経歴

88:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/09/08 11:35:19
>>88 URLリンク(www.google.co.jp)

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


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

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

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

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

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

93:デフォルトの名無しさん
06/09/09 14:09:42
環境
OS:windows2000
コンパイラ:Borland C++

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

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

95:93
06/09/09 17:31:20
>>94
#include<windows.h>

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

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


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

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

98:デフォルトの名無しさん
06/09/09 21:32:04
systemなんて恐ろしい関数をよく使う気に

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

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

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

102:デフォルトの名無しさん
06/09/11 10:12:05
ポインタの学習中でその質問はないだろー

103:デフォルトの名無しさん
06/09/11 10:33:44
×学習中
○たった今学習を始めたところ

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


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

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

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

よろしくお願いします。

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

114:デフォルトの名無しさん
06/09/24 20:28:57
「勉強」しているうちは無理。

115:デフォルトの名無しさん
06/09/25 09:28:13
君は勉強をやめたの?

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

117:デフォルトの名無しさん
06/09/26 09:10:23
なにその理屈w

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

119:デフォルトの名無しさん
06/09/26 12:09:54
日々是勉強

120:デフォルトの名無しさん
06/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'

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

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

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

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

123:デフォルトの名無しさん
06/09/28 15:04:29
実はflock()は完全ではない罠。

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

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

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

126:デフォルトの名無しさん
06/09/29 09:43:57
それを問題あると言っちゃうのか・・・。

127:デフォルトの名無しさん
06/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
の関数はどれでどのような使い方かご教示
お願いできないでしょうか。
参考になるのかわからないですが
URLリンク(www.tietew.jp)
環境が対応していないのか、わかりませんせんがいろいろ
試しても動きませんでした。
よろしくお願いします。

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

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


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

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

132:デフォルトの名無しさん
06/10/01 14:37:52
そうですか・・・。ありがとうございました。

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

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

135:デフォルトの名無しさん
06/10/02 01:13:41
夜遅くにすみません…

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

例えば

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

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

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



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

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

138:デフォルトの名無しさん
06/10/05 00:05:25
>>137
その「標準のコンストラクタ」の定義を変更しろ。

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


140:デフォルトの名無しさん
06/10/07 14:49:07
a*b > 0

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

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

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

143:141
06/10/07 15:37:59
>>142
double型です。
符号ビットの見方を教えてください

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

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

146:デフォルトの名無しさん
06/10/07 16:12:58
&

147:デフォルトの名無しさん
06/10/07 16:46:54
Wikipedia項目リンク

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

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

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

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

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

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

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

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

152:デフォルトの名無しさん
06/10/07 18:14:19
PXOR

153:デフォルトの名無しさん
06/10/08 12:42:50
( a < 0 ) == ( b < 0 )
何に使うのか知らないけど、これじゃ、ちゃんと動かない可能性ある罠。
a<0が、1返して、b<0が2返したら、!=になるし。
また、aかbのどちらかがゼロだったらどうする?(プラス扱いするならいいけど)

おいらなら、signって関数(符号に応じて-1,0,1を返す)を作って、
sign(a)==sign(b)って書く。
おそらく関数の中でif文使うから、実行効率は最悪だけど、
実行効率より、バグ鳥する時のコードの読みやすさ考えないと。

あと、どうしても効率最優先でも、何に使うのかが分からないと、最適な判別式は決められない。


154:デフォルトの名無しさん
06/10/08 12:47:33
pugya-

155:デフォルトの名無しさん
06/10/08 13:15:16
>>153
a < 0 が0か1であることは保証されている。

156:デフォルトの名無しさん
06/10/08 13:30:28
>>153
Cの比較演算の仕様を勉強しなおしてからお越しください。

157:デフォルトの名無しさん
06/10/08 14:36:37
0 か 1 になるのは C.質問者は C++ で聞いている.まあそれでも
The operands shall have arithmetic, enumeration or pointer type. The operators < (less than), > (greater
than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of
the result is bool.
であって,bool 同士の == が正常に動くことも保証されてるから >>153 はアホ.

158:デフォルトの名無しさん
06/10/08 23:56:38
#include <string>
using std;;string;

struct A {
string a;
};

struct B {
string b;
B &operator=(const string &s){
b = s;
}
};

int main(void){
A a;
A aa = a; // xxx
B b;
B bb = b;
return 0;
}

---

質問なのですが、main()のxxxのところってまずいですよね?

159:デフォルトの名無しさん
06/10/08 23:59:42
別に。

160:デフォルトの名無しさん
06/10/09 00:00:15
間違えた。
B &operator=(const B &b0){
b = b0.b;
}

161:デフォルトの名無しさん
06/10/09 00:02:14
>>159
stringのメンバにポインタがないことは保障されているのですか?

162:デフォルトの名無しさん
06/10/09 00:09:21
>>161
stringはコピーコンストラクト可能かつ代入可能。
ポインタは含まれているが、コピー時は生ポインタを明け渡すわけじゃなくって
ポインタが指し示す内容をコピーする様に作られてる。
よって何の問題も無い。

163:デフォルトの名無しさん
06/10/09 00:15:33
A のデフォ代入演算子がmemcpy() だとまずいと思ったのですが。
つまり、デフォの実装が
A A::operator=(const A &a0){
memcpy(this, &a0, sizeof(A));

}

164:デフォルトの名無しさん
06/10/09 00:17:34
送信失敗、すみません。
デフォの実装が
A A::operator=(const A &a0){
memcpy(this, &a0, sizeof(A));
return *this;
}

これだと、メモリ二重開放にならないかと心配したわけです。

165:デフォルトの名無しさん
06/10/09 00:21:22
C++のクラス(=構造体)の代入処理は、各メンバの代入処理を行なう形になる。
たまたまPODメンバがまとまっていれば、memcpy()相当の実装をするかもしれない。

166:デフォルトの名無しさん
06/10/09 00:21:48
なるよ。
つーかそんな馬鹿な実装はしちゃいかん。
C++におけるmemcpyは純粋に生のバイナリデータ転送用で、メンバのコピー用じゃない。

余談だけど、thisがポインタなのはthis登場時にC++がまだ参照をサポートしてなかったからで、
thisがポインタであることを副作用的に使うコード(memcpyの引数にする、this[2]とか書く、エトセトラ)は
総じて何か勘違いしている傾向。
忌避したくらいで丁度いいぞ。

167:デフォルトの名無しさん
06/10/09 00:22:32
>>159,>>162 は間違い。自前で代入演算子をちゃんと定義してやらないと
>>163-164 で心配している通り memcpy な実装になってメモリリークする。

168:デフォルトの名無しさん
06/10/09 00:27:03
>memcpy な実装になってメモリリークする。

服脱いで正座してbasic_stringのコード読んで来い。
そんなになってたまるか。アホらしい。


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

4741日前に更新/249 KB
担当:undef