[表示 : 全て 最新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/

232 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 08:55:09 ]
>>230
きみは 216 のヒントを理解する能力があった。
217 は 216 のヒントを理解する能力がなかった。
ただそれだけのことなんで気にしなくてもいい。

233 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 16:43:48 ]
カウント2のセマフォを使う必然性なんてどこにもないよ。

234 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 16:54:36 ]
やりたいことをまとめると、
・スレッドAが実行中は、B・Cは待機する
・スレッドBあるいはCが実行中は、Aは待機する
・スレッドB・Cは同時に実行できる
ってことか?
だったらカウント2のセマフォが必要だね。

235 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 01:22:24 ]
>>232
ありがとうございます。

>>233
セマフォっぽくないですが、ミューテックスのときみたいに、
取ってすぐ戻すと同じ動きになりそうですね。
って実はネットに書いてありました。

>>234
はい、やりたいことそれです。

いろんな方法一気に覚えられてよかったです。
ありがとうございました。

236 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 04:27:33 ]
>>235
>>234の仕様だとすると、>>229のコードでは駄目だよ。
Aが連続してセマフォを獲得する保証は無く、Aがひとつ、Bがひとつ獲得した状態で
Cが待ち状態になる場合もある。それでいいならいいんだけど・・・。

237 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 07:54:55 ]
>>236
Sleep無しで実行したときなのですが、
>>230の結果を見ると
Aがひとつ、Cがひとつ獲得した状態で
Bが待ち状態になっているようなんですが。
Aがひとつ、Bがひとつ、Cが待ちというのもあると思います。

>Aが連続してセマフォを獲得する保証は無く
Aが連続してセマフォを獲得する保証は、
どのようにすればよいでしょうか。
Aが連続で取れるように、B,CにSleepなど何か
処理をするということでしょうか?

238 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 14:59:52 ]
>>237
Windowsに詳しくないのでこれだという解決策は示せませんが、この問題は
「read write lock問題」として有名です。
・誰も読んでないときは書ける
・誰かが書いてるときは書き終わるまで読めない
・誰かが読んでいるときは読み終わるまで書けない
・誰かが読んでいても読める
今回の例ではAが書き込みスレッド、B,Cが読み取りスレッドとして対応させると
わかると思います。

windows read write lock
windows read write synchronization
などのkeywordで検索すれば、根本的な解決策が見つかるはずです。

239 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 18:56:53 ]
>>238
そういうことでしたか。

「Aがひとつ、Bがひとつ獲得した状態で Cが待ち状態になる場合」
はAがひとつ取っても、まだ待機している状態なので、
A,C待機、Bが実行という場合もありますね。
ただ、>>234には矛盾して無いので、
今回は、これもあって大丈夫ということにしたいと思います。

まとめますと、変更無いですが、
・スレッドAが実行中は、B・Cは待機する
・スレッドBあるいはCが実行中は、Aは待機する
・スレッドB・Cは同時に実行できる(片方だけのときもある)
ということになると思います。

「read write lock問題」さっそく勉強してみます。
ありがとうございました。

240 名前:デフォルトの名無しさん [2006/10/19(木) 20:22:09 ]
以下のプログラムをコンパイルする時点ではエラーはでません。
しかし、できたexeを実行するとエラーがでます。
どうしてでしょうか?おしえてください。
ちなみにコンパイラはBCC5.5.1です。
#include <stdio.h>
#include <string.h>
struct a {
int no;
char name[64];
};
int main(void)
{
struct a data[2];

data[1].no = 1;
strcpy(data[1].name,"name1");
data[2].no = 2;
strcpy(data[2].name,"name2");

printf("No.%d\n", data[1].no);
printf("%s\n", data[1].name);
printf("No.%d\n", data[2].no);
printf("%s\n", data[2].name);

return(0);
}




241 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 20:35:09 ]
struct a data[3];

242 名前:240 [2006/10/19(木) 21:13:34 ]
あ、できました。ありがとうございます。
でも何でですか?

243 名前:デフォルトの名無しさん [2006/10/19(木) 21:22:51 ]
>>240
struct a data[2];

data[0]: 先頭の構造体a
data[1]: 二番目の構造体a
data[2]: 三番目の構造体a <-定義されていない




244 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 21:23:28 ]
配列の章をまた初めから読み返してみろ

245 名前:240 mailto:sage [2006/10/19(木) 21:28:02 ]
ああ、わかりました。0から始まるんですね。
すいません。おさわがせしました。

246 名前:デフォルトの名無しさん [2006/10/19(木) 21:33:29 ]
質問です。

エラー E2209 test.cpp 1: インクルードファイル 'vcl.h' をオープンできない
エラー E2303 test.cpp 3: 型名が必要
エラー E2034 test.cpp 3: 'char *' 型は 'int' 型に変換できない
エラー E2303 test.cpp 4: 型名が必要
エラー E2034 test.cpp 4: 'char *' 型は 'int' 型に変換できない
エラー E2293 test.cpp 4: ) が必要
エラー E2141 test.cpp 6: 宣言の構文エラー

とでてコンパイルできません…

247 名前:デフォルトの名無しさん [2006/10/19(木) 21:40:33 ]
>>246
ソースを見せてみ

248 名前:デフォルトの名無しさん [2006/10/19(木) 21:46:38 ]
こちらです

#include <vcl.h>
#pragma hdrstop
USERES("test.res");
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "test";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}

249 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 22:35:31 ]
君はVCLをもっているのか?

250 名前:デフォルトの名無しさん [2006/10/20(金) 00:00:25 ]
2時間前くらいからCを勉強し始めたんですが、うまくいきません。
半径を入力して球の体積と面積を求めるってやつなんですけど、
入力が反映されなくて。

#include <stdio.h>
#include <math.h>

void main()
{
double rad, surface, volume;

printf("\nPlease input a radius. "); scanf("%f",&rad);

printf("Radius = %f \n",rad);

surface = 4 * M_PI * rad * rad;
volume = 4 / 3 * M_PI * rad * rad * rad;

printf("S = %f V = %f \n",surface,volume);
}




251 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 00:08:38 ]
>>250
そのプログラムを動かし、たとえば1と入力するとどうなる?

252 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 00:34:47 ]
4/3=1

253 名前:デフォルトの名無しさん [2006/10/20(金) 00:36:25 ]
>>251

0.000000 です。

254 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 00:38:37 ]
>>253
S = とか V = とか表示されねーのか。そりゃ不思議だな。

255 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 00:40:50 ]
うまくいかない、じゃなくて、何を期待してどういう結果になったのか書くべし。

それ以前に、勉強開始たった2時間半程度で人に聞くのはどうかと。
その時点では分からないことだらけで当然だろう。
とりあえずは参考書などで基本事項を一通り勉強したら?

%f → %lf

256 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 00:57:06 ]
>>255

どうもありがとうございます。
参考書の例題だったんですが、
書いてある通りやってもうまくいかなくて。

257 名前:デフォルトの名無しさん [2006/10/20(金) 01:02:34 ]
関数の中で関数別の関数呼んで、またそのなかで別の関数を…っていうふうに
階層が深くなってるとき、下のほうで起こったエラーはどこで処理するのがいいんですか。
一番下なのか…?はたまた上までエラーコード引っ張っていって一番上なのか…?

また上まで引っ張っていった場合、その途中の関数で起こったエラーコードとかぶらないようにするために
考えると、エラーコードの種類がすごく肥大化してしまったんですけど、
こういうものなんでしょうか?

258 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 01:08:04 ]
>>257
C では、そういうもの。
そういう問題への対策が、最近の言語に備わっている例外処理機構。
C++ にもある。

259 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 01:14:09 ]
>>258
なるほど。そういうものなんですか。
ありがとうございます。

後例外処理なんですが、実はあまり理解していなくて、try catchする(c++)のと、戻り値判定(c)するのと
どう違うのかと疑問に思ってました。例外処理のメリットというか。。
上記のような問題を解決する機構が例外というのはどういうことなんでしょうか。

何かキーワードだけでも教えていただけたらできるだけ自分で調べてみます。。

260 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 01:23:15 ]
>>259
C++ の例外処理機構を使えば、エラーは発生した
その場所で迷わず throw すればいい。
エラーを処理する場所や方法は使用者が選べる。

↓のスレに情報がいくらか貯まっている。

例外処理
pc8.2ch.net/test/read.cgi/tech/1142667446/



261 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 01:23:54 ]
try {
func1
 +func2-1
   +func3  --(A)
 +func2-2  --(B)
} catch (...) {
 // エラーきた --(C)
}
のように奥の func3 で例外を発行すると、func1 の途中部分であっても
きれいに脱出して(デストラクタの面倒は見て) (C) に到達できる。
この例の場合、(B) は実行されない

262 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 01:33:57 ]
>>260
上まで引っ張っていかなくてもいいってこと…ですよね?
なるほどそれだとたしかにエラー処理が綺麗に書けそうな気がします。
スレのほうも熟読してみます!ありがとうございました。

>>270
なるほど!これはわかりやすいです。
これは便利なんですね…
いままでせっかくc++のコンパイラ使ってたのに全部戻り値判定で引っ張っていたのが
すごく時間と労力を無駄にしてたきがしてきました…大げさかもしれませんがw
こんな機能ならぜひ例外処理を勉強してうまく使っていくようにしたいとおもいました。

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


263 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:06:14 ]
基本的に例外処理は便利で有意義なもの。
がんがん使え。

が、C++に限っては、性能を気にしだすと封印せざるを得なくなる諸刃の刃。
でもやっぱりがんがん使え。
使い慣れないとデストラクタ周りで戸惑ったりするので、経験値稼ぐためにもばんばん使え。
デメリットのことは後で考えればよい。

264 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:19:37 ]
はい。ガンガン使っていくようにしたいです。
何かのプログラムの本で、便利な機能は変なこだわりは捨ててどんどん使ったほうがいいって書いてたのを
読んだことがことがあります。
あとご指摘のデストラクタとの絡みのところもしっかり勉強したいと思います。

265 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:29:18 ]
へー、諸刃の刃なんて言葉も一応辞書に載ってるんだ。
普通は諸刃の剣だと思ってたけど。

266 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:29:59 ]
指が滑ったんだ。
ケツの穴の小さいこというなよ。
刺さらないじゃないか。

267 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:33:31 ]
つーか、今まで「もろはのけん」だと思ってたよ。
ついでに正しい知識が身についてよかった。


・・・・吉野家コピペくらいでしか使わないかもしれないが。

268 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 10:57:54 ]
うかつなこと書くなよ
剣がケツの穴に刺さったところ想像しちゃったじゃないか

269 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 19:58:59 ]
C++で例外と入ったら、性能よりも例外安全のほうがよっぽど心配になる。

270 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 00:59:54 ]
そいつもいちいちごもっとも。



271 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:38:49 ]
質問失礼します。

stringに入っている文字列を char* に変換したいのですが
良い知恵はありますでしょうか。
const char* では無く char* にしたいのです。

今のところ思いつくのは、自前で char* の領域を確保して
そこに c_str() の内容をコピーすれば問題は無いかと思うのですが
せっかく便利なクラスがあるのに、何だか冗長な気がします。

一応調べた限りでは const_cast という物があるようですが
const_castした文字列にアクセスした場合の動作は未定義という
記述がされていたりするのでそれはちょっと無いかな、と思います。

272 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:54:43 ]
>>271
std::vector<char>でも使えば?

273 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:59:47 ]
const_castは古いライブラリの機能を無理やり使いたい時とかのためだけに用意されてる様なもん。
基本的に使っちゃ駄目。

で、const_castを止めておきながら、こんなコードを薦めるのは激しくナニなんだが、
std::stringは添え字演算子が使える。
ので、一応

std::string str = "nullpo";
char* p = &str[0];

みたいな書き方はできないわけじゃない。


やっちゃ駄目よ?
問題起こしたところも見たことは無いけど。

274 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 02:29:31 ]
>>271
>stringに入っている文字列を char* に変換したいのですが
これが何を言っているかはっきりしないんだけど、

char *型の引数を要求するけど実際には渡した領域を更新することはない、
という関数に渡すというような使い方なら、const_castで問題ないと思う。
>const_castした文字列にアクセスした場合の動作は未定義
参照するだけなら問題ないんじゃなかったっけ?

文字列を更新する目的で char*型にしたいといっているなら、
自分で更新可能な領域にコピーするしかない。


275 名前:271 mailto:sage [2006/10/21(土) 03:05:01 ]
>272-274
参考になります。
今回の場合、実際は更新しない文字列だったので
>274さんの言う通りconst_cast使っても問題はあまり無さそうです。

ただ、更新する文字列のことも考えると
自前で確保する方法も覚えて損はなさそうですね。
std::vector はまだ使った事がありませんが覚えておきます。

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

276 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 07:38:19 ]
>>273
そのうちstd::vector同様にstd::basic_stringでも認められるという噂を聞いたことがあるんだ。

277 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 10:49:27 ]
>>276
いや、あれは実際に採用されるかどうかはまだ怪しい話。

278 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:30:53 ]
このレベルで「はきだめ」なのか…orz
ここ以下のおいらはどこに行けばいい?

279 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:39:19 ]
こんなスレもあるぜ

【初心者歓迎】C/C++室 Ver.32【環境依存OK】
pc8.2ch.net/test/read.cgi/tech/1160893851/



でも、余程頓珍漢な事を書かない限りここでもokだと個人的には思うが。


280 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 20:05:10 ]
まぁ、ここは下級者の質問をネタに半可通が自爆するスレだからこそ掃き溜めというわけだからな。



281 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 11:02:39 ]
int function(const int x)

int function(int x)
の違いを教えてください。



282 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 12:09:53 ]
>>281
前者はxがconstだから関数の中で代入できない
関数に渡す値は非constでもOK

283 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 17:21:12 ]
#include <iostream>
using namespace std;

//avg関数の宣言
double avg(int t[]);

int main()
{
int test[5];

cout << "5人のテストの点数を入力してください。\n";
for(int i=0; i<5; i++){
cin >> test[i];
}
double ans = avg(test);
cout << "5人の平均点は" << ans << "点です。\n";

return 0;
}

//avg関数の定義
double avg(int t[])
{
double sum = 0;
for(int i=0; i<5; i++){
sum += t[i];
}
return sum/5;
}



284 名前:283 mailto:sage [2006/10/23(月) 17:24:23 ]
配列を関数で引数として使う場合は実引数として配列名を渡しますよね
でも配列名は先頭要素のアドレスを表しますよね。
関数のdouble avg(int t[])の仮引数、t[]に先頭要素のアドレスを渡すことで
何で上のソースが動くのですか?
もし配列の各要素の値が渡されるとしたなら納得できるのですが、
アドレスが渡されるのにこの関数が動く理由がわかりません・・・
どなたか納得できるように説明していただけませんか?

285 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 18:03:33 ]
>284
C言語の配列がメモリにどう配置されるかを学ぶと良い

Cの配列は要素[0]を先頭に
連続したメモリ領域に配置される

例えば char s[255]; と書いた場合
s[0] のアドレスが 54322 バイト目なら
s[1] のアドレスは 54323 バイト目になる

char は1バイトだから1バイト毎
short なら2バイトだから2バイト毎な

だから配列の先頭要素のアドレスが判れば
その先の要素のアドレスも判る

286 名前:284 mailto:sage [2006/10/23(月) 20:29:26 ]
>>285
詳しい説明ありがとうございます。
何となくですが分かりました。
もうちょっと詳しく勉強してみます

287 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 21:22:18 ]
関数を使う立場からすれば、大きさの分かっている配列を渡しているが
渡された立場からみると、配列の大きさがわからない。
で、範囲外のアクセスでバグる と。

288 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 04:00:10 ]
そこでテンプレートです。

289 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 08:26:57 ]
#include <string.h>

#include <string>

#include <cstring>
の違いを教えてください。

cmath等と同様、cstringが最新のC++にあっているのかと思っていたのですが、
bcc32でcstringでコンパイルできたものがvc7ではstringにしないと、

二項演算子 '!=: 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません)

というエラーが出てコンパイルできませんでした。時期的には、vc7の方が新しいはずなのですが・・・

290 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 08:45:25 ]
>>289
そもそも何がしたいんだ?

Cの<string.h>のC++版が<cstring>で、
strlenとかstrcpyなどの関数を使用するときにインクルードする。

C++での<string>はstd::stringという文字列クラスを扱うときに用いる。



291 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 12:15:02 ]
>289
・C言語の "string.h"
文字列操作の為のライブラリ

・C++ の <string>
文字列クラス std::string を使う為のライブラリ

・C++ の <cstring>
C言語の "string.h" 風味のライブラリ



C言語の str〜 系の関数を使いたいなら
cstring をインクルードする

もしくは、ソースには"string.h" と書いて
大概の処理系にある
C言語としてコンパイルするオプション(や拡張子 .c)
でコンパイルすれば良い

292 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 16:58:06 ]
#include <iostream>
using namespace std;

//func関数の宣言
void func();

int a = 0;

//main関数
int main()
{
for(int i=0; i<5; i++)
func();

return 0;
}

//func関数の定義
void func()
{
int b = 0;
static int c = 0;

cout << "変数aは" << a << "変数bは" << b << "変数cは" << c << "です。\n";
a++;
b++;
c++;
}

293 名前:292 mailto:sage [2006/10/24(火) 17:02:11 ]
staticをつけると、そのローカル変数はグローバル変数と同じ記憶寿命を持つんですよね?
同じ記憶寿命を持っても上のコードでfunc()関数が呼び出される度にstatic int c = 0;と初期化しているのに何故実行結果では
0,1,2,3,4と増えていくのでしょうか?

staticをつけて初期化されるのは一回目だけということでしょうか?


294 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 17:48:49 ]
その通り
「初期化」は最初だけ
毎回0にしたければ「代入」をするべし

295 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 17:52:36 ]
>>294
一つ謎がとけました
ありがとうございます

296 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 05:43:46 ]
まだまだ謎がありそうだけど、
あなたを犯人です。

297 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 07:00:13 ]
>296
中国語でおk

298 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 12:14:07 ]
スレ違いかと思いますが、どこで聞けばいいのかもわからないアフォです。どうか助けてください。
普段からコンパイラにbcc5.5を使っているのですが、
今回、グラフィックスを描く必要があって、
ftp://spdg1.sci.shizuoka.ac.jp/pub/GrWinlib/index.htmlに置いてあるlGrWn0999b-f2bcc.exeでインストールして、
www005.upp.so-net.ne.jp/h-masuda/grwin/grwin01.htmlにある以下のサンプルを
動かしてみました。
#include <GrWin.h>

int main(void)
{
int width = 640, height = 400; /* ウィンドウサイズ640×400 */

GWopen(0); /* ウィンドウのオープン */
GWsize(-5, &width, &height); /* ウィンドウサイズ設定 */
GWsize(-3, NULL, NULL); /* フレーム(枠)サイズ設定 */
GWvport(0.0, 0.0, (float)width / (float)height, 1.0); /* ビューポート設定 */
GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
GWquit(); /* 終了処理 */ /* ↑ワールド座標系設定 */
return 0;
}
普段課題を出されたときと同じようにbcc32 sample.c のように打ち込んだのですが、
Error:外部シンボル '_GWopen'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWsize'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWvport'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWindow'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWquit'が未解決(C:\CWORK\SAMPLE.OBJが参照)
というエラーが出てしまいどうしても動いてくれません。
一度bccとGrwinをインストールし直したり、手動でインストールしようとして他のプログラムまで動かなくなったり、
あの手この手を尽くしたつもりなのですがダメでした。
googleで似たような症状を探しても見つけられないし、八方塞がりです。
どなたか解決法のわかる方、いらっしゃいませんでしょうか?


299 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 12:35:41 ]
GrWinとやらはダウンロードしてないがlibファイルは入ってなかったか?
入ってたとしたらそれをリンクすればいけるかもしれない

300 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 18:06:14 ]
すいません教えて下さい。
ClassDef のオブジェクトを他の関数らで使いまわしたいのです。
その場合、ClassDefのオブジェクトが無ければ作り
作られていればそのオブジェクトを使いたいのです。

そこで GetObjという関数を作り、そこで上記の判断を
させようと思うのですが、どのように作れば良いのかが・・・

下記の他にも良い書き方があればご教授の程お願い致します。

ClassDef* ObjDefP = NULL;

ClassDef GetObj()
{
if( ObjDefP = NULL ){
ClassDef ObjDef;
ObjDefP = &ObjDef;
return AppObj;
}else{
//return ObjDefP//ここが良くわかりません・・・
}
}

func1() {
ClassDef Obj = GetObj();
Objに対して処理1
}

func2() {
ClassDef Obj = GetObj();
Objに対して処理2
}



301 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 18:23:11 ]
シングルトンパターンだな.
new 使わない微妙なやつだけど、参照返しで

class ClassDef {
private:
 ClassDef() {} ~ClassDef() {}
public:
 static ClassDef& GetObj() { static ClassDef body; return body; }
 // その他公開メソッド
};

////// 利用側
func1() { ClassDef& cObj = ClassDef::GetObj(); }
func2() { ClassDef& cObj = ClassDef::GetObj(); }

302 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:48:35 ]
以下で、どれが一番清く正しく美しいですか?
お兄ちゃんはどんな風に書く?
int main(void) {}
int main() {}
main(void) {}
main() {}

303 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:53:14 ]
>>302
Cならばint main(void) {}
C++ならばint main() {}

304 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 09:33:03 ]
ちょっとしたテストコードは main() { で書いてる。
でもある程度長くなりそうなら
値返すだけでなくコマンド引数も受け取る。

305 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 18:58:32 ]
ああ、コマンド引数は考えなくてもいいですけど。
そっか、Cではint main(void)が厳密なんですね?
C++ではvoidが省略できるみたいな?

306 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 20:55:41 ]
C++ は main() って書くと int main() 扱いじゃなかったか?
んで暗黙に return 0; が書かれたことになるって仕様だったような。

307 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 21:21:34 ]
>>306
暗黙のintはなくなった。2文目は正しい。

308 名前:302 mailto:sage [2006/10/31(火) 22:01:45 ]
自分の得たい答えは得られました。
ありがとうございました。

309 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 10:04:14 ]
iostreamで質問があります。
文字列を入力するとき
string s;
cin >> s;
とすると、長さ1以上の場合は問題ないのですが
長さ0の文字列が入力できません。
エンターキーだけ押せば長さ0の文字列と見なして欲しいのですが、
どうすればいいでしょうか。

310 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 10:13:02 ]
getline(cin,s)



311 名前:309 mailto:sage [2006/11/02(木) 17:12:16 ]
>>310
ありがとうございました!

312 名前:デフォルトの名無しさん [2006/11/13(月) 00:50:01 ]
初学者の下らない質問ですがお許しください。
VC.Net2005を買ってきたのですがマシンパワーが足りないのでIDEを
使いたくなくてコマンドラインコンパイラとして使用しようと思っています。

C:\Program Files\Microsft VisualStudio 8にインストールし、
C:\ComLineCode\Cpp\にソースコードを置こうと思っています。

テストという事でcpptest.cppと名前を付けたコードをコンパイルしようと
したのですが、includeファイルが見つからないといわれたので、
OS(Win2k)の環境変数にINCLUDEを作り、iostreamを検索した結果出てきた
フォルダを指定してやったのですが、
C++例外処理を使っていますが、アンワインドセマンティクスは有効にはなりません。
と出てコンパイルできません。

// cpptest.cpp
#include <iostream>
using namespace std;
void main(void)
{
cout << "表示されれば設定OK";
}
//EOF

cl cpptest.cpp
ソースは間違って居ないと思うので設定が不味いだけだとおもうのですが、
どのようにしたら上手くコンパイルできるでしょうか?

C++以前の問題ですが、どうぞアドバイスを下さい。お願いします。

313 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:18:59 ]
>>312
「スタート→プログラム→Visual C++ 2005 Express Edition
→Visual Studio Tools→Visual Studio 2005 コマンド プロンプト」
で必要な環境変数が設定された状態のコマンドプロンプトが起動できる。

その例外処理がなんたらというのはエラーではなく警告。一応実行ファイルは作られている。
そしてその警告文には、その後に「/EHsc を指定してください。」と書いてあるはずだ。そのとおりにしろ。

314 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:21:20 ]
>>312
エラーメッセージはちゃんと全部読め。
cl /? を見ろ。オンラインマニュアルを読め。

315 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:21:24 ]
INCLUDEはvcvars32.batとか使えば勝手に設定されるからそっち使えよ。

でもってアンワイ(ryに関しては warning って書いてあるでしょ?
エラーじゃなくて警告だから気にしないのなら気にしなくていいし、
気になるんなら警告に書いてある通りにオプションつけろ。

316 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:22:22 ]
>>313-315
3P汁

317 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:27:36 ]
いまだにデフォルトになってなかったのか。なんでだろうな?

318 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 04:10:14 ]
vcvars32.batに
SET CL=/EHsc
の行を加えておくことを推奨

319 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 10:16:37 ]
int* p;



int *p;

って同じもの?

320 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 14:49:47 ]
>>319
同じ。だが
int *p, *q;

int* p, q;
は違うから初心者は注意するように。



321 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:05:25 ]
どう違うんだろう

int *p, *q; は

int *p;
int *q;



int* p, q; は

int *p;
int q;


であってる?

322 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:15:32 ]
あってる

323 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:16:00 ]
ありがとう

324 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 12:49:06 ]
ディレクトリの中を*を含んだ文字で検索するプログラム作っています。
windowsだと
_findfirst,_findnextがあって、*を含んだ検索が出来ます。
linuxだと
opendir,readdirがありますが、*を含んだ検索が出来ません。

そこで質問なんですが、
struct dirent *dir;とすると、
readdirを読んで、dir->name比較する関数で毎回調べて、
繰り返さないといけないでしょうか?

なにか他に簡単な方法あるとよいのですが。
よろしくお願いします。

325 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 12:56:06 ]
まあ普通にreaddir+fnmatchで大した手間にはならないと思うけど
他にやり方があるのかは知らない。

326 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 13:09:21 ]
>>325
実は、_findfirst,_findnextで作ってしまいまして。
コンパイルできないと思ったら、linuxだからということがわかりました。
似たような関数があればー。と思ったのですが。

確かに、そんなに大変ではないかもしれないです。
ありがとうございました。

327 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 23:55:59 ]
C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。

例えば
template <T>
hogehoge(T val){


328 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:00:53 ]
すみません、途中で書き込んでしまった・・・。

C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。
例えば
template <T>
void hogehoge(T val){
   if(T == int) {
処理1
} else if (T == char) {
処理2
}
}
のようなことをやりたいのです。もちろん上のコードはコンパイルなどできませんが・・・。

void process(int val){...}
void process(char val){...}
....
みたいなものを型ごとにひたすら用意して、
void hogehoge(T val){
  process(val);
}
とすればできますが、それだとコード量がふくらんでしまいます。他に良い方法ありますか?

329 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:13:53 ]
>>328
明示的特殊化を使えば?

330 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 07:29:32 ]
>>326
つ[popen("/bin/ls *", "r")]



331 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 11:58:02 ]
>>328
typeid

332 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 17:56:02 ]
>>328
BoostにMPLとかtype_traitsとかいろいろあるよ。

まあこんなところで勧めていいかわからないが。






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

前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