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


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

【初心者歓迎】C/C++室 Ver.50【環境依存OK】



1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

136 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:52:05 ]
最後のcatch節の下

137 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:53:51 ]
復帰しないよ?そのまま続く。
try{
A; //例外発生
B;
}catch( exception &e ){
C; //例外処理
}
D;

なら、正常は:A, B, D。
Aで例外時は:A, C, D。
もちろん、Cで例外が発生したり、throwしたりしたら別だけど。

138 名前:デフォルトの名無しさん [2008/03/01(土) 19:58:13 ]
Win32APIのWindowsアプリケーション開発環境を作るためにPlatform SDKを
インストールしたのですが、corewin_express.vspropsのデータの修正が出来
なくて困っています。 どうしたら、修正する事が出来るようになるのでしょうか?

ちなみに、OSはvistです。


139 名前:デフォルトの名無しさん [2008/03/01(土) 20:01:49 ]
visual stdio2008のexpressいれとけ

140 名前:デフォルトの名無しさん [2008/03/01(土) 20:13:48 ]
>>134
ありがとうございます。

141 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:34:52 ]
>>136-137
ありがとうございます
tryブロックの範囲の選定も気をつけないといけないようですね

またまた質問なんですが

std::exceptionを継承してMyExceptionクラスを作ってそこに、例外発生時のログ取り機能を追加しました
不正な引数を取ってしまったときinvalid_argumentのような例外クラスを投げたいのですが

多重継承は色々ややこしいのでMyExceptionから派生させて相当の自作クラスを投げる
やっぱりMyExceptionとinvalid_argumentの多重継承を行う

どちらがよいのでしょうか?


142 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:39:40 ]
ログ取り機能を例外クラスから分離した方がいいと思う。

143 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:41:52 ]
MyExceptionからログ鳥部分を分離して、派生のない
ExceptionLogクラスを作り、std::invalid_argumentと
派生した例外を投げる、みたいな。

144 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:02:07 ]
>>142-143
必要な標準例外クラスから派生したmy標準例外クラスを作って
そのクラスにログ取り機能クラスを保有させたほうがいい

ということですよね?
そのほうが系統だった例外クラスの構造になるのでしょうか?



145 名前:138 [2008/03/01(土) 22:11:41 ]
2005で作りたいのですが、いい方法はありませんか?
どこかの設定をいじると書き込み可能になったりとかないんでしょうか・・・。

146 名前:デフォルトの名無しさん [2008/03/01(土) 22:12:05 ]
1クラスに2つ以上の機能を入れるのは一般によくないとされている

147 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:23:16 ]
とりあえずロガークラスを作るのは確定としても、
以降をどう実装するかは結構悩みどころだな。

個人的には throw をマクロ LOG_THROW みたいなので置き換えて、
その中で例外を投げる前にログを取るようにするのがいいと思う。

マクロは使わずに済むなら使わないのが一番いいんだけど、
デバッグ時に __FILE__, __LINE__ を利用したり、
文字列化演算子を使って移植性の高い方法でクラス名を表示したりできるから、
ログ取りには便利だと思う。

148 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 23:38:52 ]
質問です。
ヘッダをインクルードせずに
class Cls* pCls;
と書くのはOKなんですけど

namespaceで括られた場合に
class Name::Cls* pCls;
と書くと'Namne' : 識別子がクラス名でも名前空間名でもありません。
とエラーが出ます。

インクルードせずに宣言する方法ってあります?






149 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 23:45:13 ]
>>148
こうかな
namespace Name{
 class Cls;
}
Name::Cls *pCls;

150 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:06:39 ]
ところで標準例外std::exceptionの中身ってどうなってるんだろう?

151 名前:デフォルトの名無しさん [2008/03/02(日) 00:12:35 ]
CLASS x={1,2,3,4,5,6};
はどのようにかけばジツゲンできますでしょうか

152 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:14:58 ]
boost::arrayでも見れば?

153 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:26:06 ]
>>150
実装依存としか。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:27:31 ]
>>152
要するにあれは構造体の初期化だよね。
コンストラクタが無ければクラスだろうが
あのタイプの初期化ができることを利用しているという。



155 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:18 ]
boost::arrayは {{ }} で囲わないとダメだろう。

156 名前:148 mailto:sage [2008/03/02(日) 00:49:28 ]
>>149
無事宣言することが出来ました。
ありがとうございます。

お礼にオプーナを買う権利をあげます。

157 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:11:03 ]
「↓」を表示後、キー入力があるまで処理を一時停止させ、
キー入力があればそれに対応した動きをさせたいのですがどうすれば良いでしょうか?
getch()だと入力待ちカーソルが邪魔になってしまい、困ってます

158 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:11:07 ]
>>155
いや、必要ではない。

159 名前:デフォルトの名無しさん [2008/03/02(日) 01:13:39 ]
>>157
別スレで環境依存だといわれたろ?
なぜ環境を書かない

160 名前:157 mailto:sage [2008/03/02(日) 01:17:19 ]
すみません、vidual studio2005のC++です

161 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:15:30 ]
>>147
実装方法ですか。
マクロを使うというとこういう感じになるのでしょうか?

ErrorLogger(char* filename, int linenumber, const char* errmsg)
のようなロガークラスを用意して、
コンストラクタ内でエラー内容を記録させてしまうようにしておいて

#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg);\
throw exeption_type\

というようなマクロを組めばよいのでしょうか?

というか、初めてマクロを組んだのであってるかどうかも判りませんorz

162 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:55:52 ]
>>161
自己レスながらマクロ修正してみた

#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg); \
exception_type e;\
throw e\

これでだいじょうぶですかね?

163 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:58:56 ]
>>161-162
ErrorLogger をクラスにする意味がわからない。関数でいいだろ。
例外オブジェクトにデフォルトコンストラクタしか使えないのは無駄な制限。
マクロ名は動作を表すように LOG_AND_THROW() とかにしたほうがよくない?
あと、最後の \ が余計。

164 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 03:00:12 ]
inline関数でいいじゃまいか。何故define・・・しかもTHROWはないなw



165 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 03:03:37 ]
>>164
__FILE__, __LINE__ は inline 関数だとマズイだろ。

166 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:18:51 ]
#define LOG_THROW(type) \
 do { \
  :LogAndThrow(#type, __FILE__, __LINE__); \
  throw type(); \
 } while(false)

void LogAndThrow

167 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:19:13 ]
途中で送ってしまった・・・。

168 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:26:43 ]
#ifdef NDEBUG
#define LOG_THROW(type) \
 do { \
  LogAndThrow(#type); \
  throw type(); \
 } while(false)

void LogAndThrow(const char* type_name)
{
 ErrorLogger log;
 // ここでログをとる
}
#else
#define LOG_THROW(type) \
 do { \
  LogAndThrow(#type, __FILE__, __LINE__); \
  throw type(); \
 } while(false)

void LogAndThrow(const char* type_name, const char* file_name, int line)
{
 ErrorLogger log;
 // ここでログをとる
}
#endif

こんな感じ。
実際には関数の実装は .cpp 側に書くわけだけど。

THROW という名前は何かと使われている恐れがあるので止めた方がいい。
LOG_THROW って名前も、実際には何か接頭辞を付けた方がいいと思う。

169 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:30:39 ]
しまった。ログとるだけにしたから LogAndThrow じゃなくて LogError だな。

170 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:31:38 ]
もちつけ

171 名前:デフォルトの名無しさん [2008/03/02(日) 13:09:31 ]
ifstreamで読込みをしているとき、改行を読み込んだことを知るにはどうすればよいですか?


172 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:10:28 ]
読み込んだ内容が改行を含むかどうかチェック。

1行ずつ読み込みたければ getline が使える。

173 名前:デフォルトの名無しさん [2008/03/02(日) 13:16:15 ]
>>172
int a;
ifs >> a;
みたいにやってるんですが、
> 読み込んだ内容が改行を含むかどうかチェック。
はどうやればいいですか


174 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:18:17 ]
ああ、そういうことか・・・。
それは無理じゃないかな。



175 名前:デフォルトの名無しさん [2008/03/02(日) 13:20:54 ]
>>174
じゃあ、一行ずつ読みたいなら、getline()でやるしかないですか?


176 名前:デフォルトの名無しさん [2008/03/02(日) 13:25:32 ]
以下のようなとき、
子クラスのオブジェクトから、func(1)を実行すると、
func(const char* ch)を呼んでしまうのですが、
親クラスのfunc(int i)を呼ぶにはどうすればいいのでしょうか?

/*****こんな感じ*****/
class Parent{
public: void func(int i);
};
class Child : public Parent{
public: void func(const char* ch);
};
/*******************/

177 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:29:35 ]
>>175
そうなる。
getline した後 istringstream に渡してやるとか。

178 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:39:57 ]
>>176
Child ch;
ch.Parent::func(1);

179 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:47:37 ]
>176
子クラス Child の func() によって親クラス Parent の func() が隠蔽されている。普通にオーバーロードしたいなら
class Child : public Parent {
public:
  using Parent::func;
  void func(const char* ch);
};
とすることで Parent での func() も見えるようになる。

180 名前:176 mailto:sage [2008/03/02(日) 14:07:51 ]
>>178
>>179
ありがとうございます。

181 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:27:55 ]
namespace temp
{
class Test
{
private:
std::ostringstream oss;
public :
~Test() {std::cout << oss.str();}

template <typename T>
friend Test &operator <<(Test &, T t);
};
}

template<typename T>
temp::Test &operator<< (temp::Test& test, T t)
{
test.oss << t;
return test;
}

を、temp::Test() << 2;
と使うと、「operator << が曖昧です」というコンパイルエラーになります。
名前空間を使わないとコンパイルできるのですが、何が問題なのでしょうか

Win2k、VC2005です

182 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:32:37 ]
<< の実装部も temp 名前空間に入れないと。
temp::Test 内で宣言してる friend 関数は temp 名前空間内に入る。
だから、今は temp::operator<< と operator<< の2つがある状態。

183 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:37:08 ]
>>182
なるほど、ありがとうございました!

184 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:39:32 ]
あるいは friend のところを ::operator<< にするかだけど、
temp 名前空間内に入れた方がいいと思う。



185 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:17 ]
コマンド等文字列処理で2重のループから抜けるときに
goto文使うのって邪道かな?

いつも使ってるんだが。

186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:54 ]
2重ループから抜ける際に goto を使うのは常套手段

187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:17:28 ]
俺、今まで一度も使ったことが無い。
使いたい衝動に駆られたことはある。

188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:19:02 ]
小さい関数内なら結構goto使っちゃうなぁ

189 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:23:44 ]
常套手段ではあるけど、
2重ループから抜ける必要があること自体があまりないよね。

190 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:24:49 ]
まあ関数は一目でざっと目通せる程度にするもんだしちゃんと考えて使うならぜんぜんいいと思う

191 名前:デフォルトの名無しさん [2008/03/02(日) 15:36:50 ]
ポインタを解放した後、安全のためNULLを入れると書いてたんですが、
NULLを入れると何が安全なのでしょうか?

192 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:38:35 ]
解放されているかどうかを NULL チェックで確認できる。

193 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:39:18 ]
二重にdeleteすることが無くなる(delete(NULL)は安全なことが保障されている)

194 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:40:13 ]
NULL なら間違って解放後にアクセスした際にエラーになってくれる環境が多い。
NULL じゃない場合は偶然アクセスできるかもしれないが、
メモリ領域を壊したり変な値を取得したりしてしまう。



195 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:41:42 ]
無限ループでポインタインクリメントでもしながら片っ端から表示してみれば良いわけない

196 名前:デフォルトの名無しさん [2008/03/02(日) 15:49:10 ]
すみません

keybd_eventみたいに
プログラムからキーボードを押したことにするのは
gccだと何か方法がありますか・・・?

197 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 16:12:32 ]
>196
keybd_event は Windows API。gcc はいろんな環境向けがあるコンパイラ。
例えば Windows 上で gcc を使っているなら keybd_event になるわけだしやりたいことをもっと正確に書こう。

198 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:26:18 ]
初心者です。

デフォルトコンストラクタっていうのは、
1.引数なしで呼ばれるコンストラクタ
2.なにも記述してなくてもデフォルトで呼ばれるコンストラクタ
のいったいどっちのことなのですか?

1と2の違いは、例えば、引数なしのコンストラクタを
自分で定義したときに、それをデフォルトコンストラクタと
いうかどうかという違いになると思うのですが、、、
1と2の説明ともWEB上で見かけますが、
どちらがより正確なのでしょうか?

199 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:29:15 ]
引数無しで呼ばれるコンストラクタ。
自分で定義しようがデフォルトコンストラクタ。

200 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:34:41 ]
>>198
引数なしで呼ばれるというよりは引数なしで呼ぶことが可能なと
いったほうがいいかもな。デフォルト引数もあるから。

class Widget {
public:
Widget(int i = 0) {}
};

      //例えば
Widget w; //このsyntaxがデフォルトコンストラクタを要求する。
      //Widget::Widget(0)が呼ばれる。


201 名前:198 mailto:sage [2008/03/02(日) 17:35:37 ]
>>199
ありがとうございます。
すっきりしました。


202 名前:198 mailto:sage [2008/03/02(日) 17:37:25 ]
>>200
おっと行き違いになりました。
そうですか、
それもデフォルトコンストラクタなんですね。
ありがとうございました。

203 名前:196 [2008/03/02(日) 18:15:40 ]
>197
すみませんでした
OSはDebianでPDFかパワポのようなものを
C言語で操作したいのです

具体的には下キーかEnterキーをC言語で押したことにして
スライドを進めることを行いたいです

204 名前:191 mailto:sage [2008/03/02(日) 19:36:37 ]
>>192
>>193
>>194
ありがとうございます。
具体的によく分かりました。



205 名前:デフォルトの名無しさん [2008/03/02(日) 21:56:29 ]
c言語で聞きたいことが1からたくさんあるので、何方かmsnメッセで教えてくれませんか?
kamisama6@hotmail.co.jp         までお願いします!

206 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:02:14 ]
>>205
C言語の個人講習をして欲しい訳だな?しかも無料で!

そんな奇特な人は少ないが候補として
C言語を覚えたてで自分のために他人に説明する人がいるが
そんな人を探すくらいなら良書を買ったほうがいくぶんかマシ

C言語をマスターしていながら教えてくれる人がいるとしたら
リタイヤした人くらいだろうな

207 名前:デフォルトの名無しさん [2008/03/02(日) 22:08:50 ]
string tmp;
cin >> tmp;
としたとき、改行だけが押されたことを知るにはどうすればいいですか?

208 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:16:47 ]
>>207
フォーマット入力はデフォルトでは空白類記号は読み込まれない。

209 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:29:59 ]
gcc をつかった
分割コンパイルの仕方がわからないのですが
わかりやすく解説したページはないでしょうか?

210 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:33:01 ]
gcc -c hoge1.c
gcc -c hoge2.c
gcc -c hoge3.c
gcc -c hoge4.c
gcc -o hoge hoge1.o hoge2.o hoge3.o hoge4.o

211 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:55:20 ]
>>209
Makefileでググれば、良いと思う。

212 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:35:02 ]
namespace Name
{
class Cls;
}

213 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:48:48 ]
丸一日前のレスにレスか

214 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:52:06 ]
Makefileとbjamとどっちがいい?
やっぱ標準であるmakeは一通りやっとくべきかな?



215 名前:デフォルトの名無しさん [2008/03/03(月) 01:14:07 ]
>>208
ありがとうございます。一応自分で書いてみましたが、まだうまく動きません。
noskipwsをした後、おかしくなります。
どうかよろしくお願いします。

std::string filename = "default_file.txt";
while (1) {
std::string tmp;
cout << "Input file name : (hit return to default: " << filename << ") ";
cin >> std::noskipws >> tmp; // 下の(1)でY以外で答えたとき、ここで入力を受け付けてくれない。
if (tmp.empty()) {
// リターンキーだけが押された場合に、ここのIF文に入る
tmp = filename;
}
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin >> std::skipws;
cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
cin >> ans; // (1)
if (ans == "Y") {
filename = tmp;
break;
}
}

216 名前:デフォルトの名無しさん [2008/03/03(月) 02:22:41 ]
stdlib.hの中で_CRT_DOUBLE_DECと_LDSUPPORTを定義してないとき_CRT_DOUBLE、_CRT_FLOATといった構造体を用意してるようですが、
_CRT_DOUBLE_DECと_LDSUPPORTとこの2つに囲まれた構造体などは何のために用意してるんですか?

217 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:31:37 ]
>>215
改行は読み込まないからgetlineがいい。

std::string filename = "default_file.txt";
while (1) {
std::string tmp;
std::cout << "Input file name : (hit return to default: " << filename << ") ";
std::getline(std::cin, tmp);
if (tmp.empty()) {
tmp = filename;
}
std::cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
std::getline(std::cin, ans);
if (ans == "Y") {
filename = tmp;
break;
}
}

218 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:43:47 ]
C++ってどういう業界の人がつかってるの?
GUIでMFCやVCL、Qtさわるくらいはあるが、
ゲーム以外でフルスクラッチで書き上げる人たちって
どういう人?

219 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:44:13 ]
趣味

220 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:24:20 ]
やっぱそうか。
抽象化なんて考えてる暇あったら別の仕事が
飛んでくるもんね。

221 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:25:01 ]
最近C#なんか使う企業もねえ

222 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:50:36 ]
つまりCωの時代がやってくると。

223 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:57:12 ]
時代はwebアプリか・・・

224 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:58:37 ]
業務ソフトなら実際C#とか.NETでもなんら問題なくなってきてるご時世だもの



225 名前:デフォルトの名無しさん [2008/03/03(月) 03:59:03 ]
俺は金融関係だけど、C++使ってるよ。
matlabを使うとこも多いけど。


226 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:00:20 ]
自動車関係企業のシステム部門ってC/C++使うのかなぁ

227 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:01:14 ]
いかにも使いそうじゃないか

228 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:05:58 ]
>>226
COBOLとか使うと思うんだ、経験則

229 名前:デフォルトの名無しさん [2008/03/03(月) 04:51:56 ]
昨日から色々質問させてもらっているものです。
色々分かってきたのですが、getlineとcinとの併用のときにどう書くべきかわかりません。

#include <iostream>
using namespace std;
int main()
{
int a;
string s;

cout << "int: ";
cin >> a;
// cin.ignore(numeric_limits<streamsize>::max(), '\n');

cout << "string: ";
getline(cin, s);

cout << "int: ";
cin >> a;
return 0;
}

上記のソースでコメントアウトしている箇所がありますが、コメントアウトしたままだと、
真ん中のstringの入力が、1つめのintの入力の改行を拾ってしまうせいで、とばされてしまいます。
そこで質問なのですが、ここにコメントアウトされている行をいれるのは正しいですか?


230 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:00:45 ]
>>229
コメントアウトした行を入れてもだめ。
cin >> a; で改行文字がバッファに残るため、それが次のgetlineで
読み取られてしまう。Cで言う所のscanf()とgets()を混在させた問題と同じ。

解決策はgetline(cin, s); をもう一つ付け足して改行文字を読み飛ばす。
もしくはgetline()に統一する。

231 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:37:29 ]
今の所COBOL、PL/I、Java、JS、Access、Rubyを見たことがある

232 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:42:58 ]
>>225

金融っていってもmatlab使ってるようなところは
複雑な数値計算やってるだろうからちょっと特殊だな。

車でもカーナビのように限られたリソースでGUI作るようなところは
使ってるだろうが、間違っても制御には使わんと思うんだが。

233 名前:デフォルトの名無しさん [2008/03/03(月) 05:53:38 ]
>>230
ありがとうございます。
getline()とcinを混在させないのが一番いいと。でも、cinが便利なので、
基本的にはcinを使いつつ、cinだと改行を扱うのが不便なのでその時だけgetline()を
使う、という風になりそうです。(自分としては)
すると、
(1)getline()する前にバッファに改行が残っているか確認して、残っていれば消す。
(2)cinした後には改行を消しておく。
のどっちかになると思うのですが、今回は(1)の方法が分からなかったので、(2)で実装しました。
どっちにしても、cin関係はなんか使いにくい感じ。



234 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:00 ]
linux のmmapのこと調べてて疑問に思ったので質問。
mmap でファイルを仮想メモリにマッピングしたとき、OSがファイル上のデータを
ブロック転送する、アプリがその領域に書き込むとOSがファイルにそれを反映すると
書いてあった。

mmapでマップされた領域に上のあるアドレスに代入したとき、
OSは代入されたことを知っているの?
代入演算子で値を放り込むことと、read write のシステムコールを使うのは
根本的に違いますよね?



235 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:27 ]
>>218
GEANTは4からC++だよ!

236 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:09:53 ]
>>234
C/C++の問題じゃないと思う
多分OSがマッピングした領域は書き込み不可の属性が付いており
書き込んだらCPUに割り込みがかかってそれを利用してファイルに反映してるか
そんな所だと思う






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

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

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