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

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とかいろいろあるよ。

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

333 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 03:34:45 ]
質問です。
今までファイルからデータをストリームとして呼んでいたのですが、ファイルの内容を簡易的に隠蔽したくて、
ヘッダファイルにchar filedata[] = "(ファイルの内容)";
として、ソースに埋め込んだのですが、これをファイルからの読み込みと同じように、ストリームとして読み込み処理を行いたいのです。
char配列をストリームにする方法ってあるのでしょうか。

334 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 08:10:49 ]
>>333
iostream の実装は自分で定義することができるようになってるから、
いちおう可能なはず。簡単かどうかは知らない。
↓ここらへんから始めれ。
www.google.co.jp/search?q=iostream+%E5%AE%9F%E8%A3%85

335 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 09:58:12 ]
つstd::istringstream <sstream>



336 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:36:06 ]
vector<T>ってTがbool型以外の時はメモリが連続していると聞いたのですが、

vector<float> *vec = new vector<float>(5000);

for(int i=0; i<5000; i++) {
float *tmp = (float *)&vec[i];
cout << *tmp << endl;
*tmp = 100;
}
Visual C++ 2005 でこのコードを実行するとエラーになります。
Visual C++だとメモリが連続していないのでしょうか?

337 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:47:32 ]
>>336
× (float *)&vec[i];
○ &(*vec)[i]

無茶なキャストした時点でなんかおかしいって気づけよ。

338 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:57:10 ]
>>337
gcc4.0だとこれでも上手くいくのですが・・・・。

339 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:59:45 ]
ちなみにこのページを参考にしました。
ttp://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html

340 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:03:26 ]
>>338
未定義動作。

>>339
そのページを見て vector を new するとは、本末転倒。

341 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:08:10 ]
>>338
間接参照のレベルが一段違うだろうが。

342 名前:336 mailto:sage [2006/11/18(土) 23:11:33 ]
>>336
あ、分かりました。
float *tmp = (float *)&vec[i];
でなくて
float *tmp = &(*vec)[i];
とすべきだったんですね。vec[i]ではvector<float>の配列としてi番目のvector<float>オブジェクトにアクセスする意味になってしまう・・・。
寝ぼけてました。すみません。

343 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:13:03 ]
意味を持つのはvec[0]だけ。
vec[1]〜はメモリのどこを指しているのかわからない。

344 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:21:04 ]
>>343
ばかですか?

345 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:23:37 ]
どこを指してるかはわかるだろ



346 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:29:59 ]
要するにvec[1]をアクセスした時点で未定義動作だろ

347 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:30:08 ]
>>344
危険いっぱいの所を指している、という事を言いたかっただけなんじゃまいか

348 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:35:43 ]
配列の要素を指していないポインタに対して +/- した時点で未定義動作。
p[i] は (*(p+i)) と定義されているので、 vec[0] も未定義。

349 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:43:49 ]
vec[0]は*vecなので、vector<float>を指しているだろ。
何言ってんの?

350 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:47:44 ]
× vec[0]は*vec
○ vec[0]は*(vec+0)

351 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:49:32 ]
>>350
本気で信じてるのか?規格書のどこに書いてあるか出せよ。

352 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:52:42 ]
>>348の1行目が本当だとしても
NULLは0とは限らないがNULLが0でないコンパイラなんてまずない
ってのと一緒で、ほとんどのコンパイラじゃ問題にならないんだよな?

353 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:54:30 ]
C++ では 5.7p5 に >>348 の言ってることは書いてあるが、
その前に 5.7p4 で配列じゃないオブジェクトを指すポインタは
要素数1の配列と同等に扱うとなっているので、問題ない。
5.7p4 を読まずに 5.7p5 だけ読んだんだろう。

C では 6.5.6p7, p8 に同様のことが書いてある。

354 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:54:33 ]
いやいや、そんな些末な納得の仕方よりも、規格書で該当する部分を
出してもらえばそれで完全に決着するから。

355 名前:348 mailto:sage [2006/11/18(土) 23:56:46 ]
正直スマンカッタ



356 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:56:54 ]
というわけで>>348>>350は無知だと証明されました。終わり。

357 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 12:42:11 ]
linuxなんですが質問です。

ただ単にファイルをコピーするプログラムと
lsコマンドを自作したのですが、
もし、lsコマンドするフォルダに書き込み中のファイルがあったら、
「書き込み中」を表示したり、違う処理をしたいのですが、
書き込み中か調べる方法ってありますでしょうか?

考えてみたのですが
■lsコマンド側で解決方法
sleepを入れて容量の増減を調べる。
(これだと返ってくるまで、すごい時間が掛かってしまいます。)

■書き込むプログラム側の解決方法
・元のファイルをA,コピー先のファイルをA'とすると
1、A'を作ります
2、ファイルディスクリプタ指定してA'をlockします
3、書き込みします。
4、lock解除

・何かCOPYコマンドにオプション付けるとコピーが終わるまで
読めなくなるとないでしょうか。

358 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 13:40:39 ]
>>357
357です。
なんか質問の内容がぼけてしまってますね。
ちょっと質問内容変更させてください。

書き込むプログラムは、自分で作ったもので
無い場合(lockしてない場合)でも書き込み中か
知る方法ってあるでしょうか?
sleep使って調べると時間かかってします。

359 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 14:14:40 ]
「書き込み中」を、「コピープログラムがコピーを完了していない」状態と考えていいのかな?
それならば、コピー完了を知る手段は一般的にはないと思う。
解決策としては、こんなもんかなぁ……

・コピー元ファイルのサイズを知り、コピー先ファイルのサイズと較べる。
・コピー対象ファイルの終端の特徴を知り、コピー先ファイルの終端がその特徴に一致するか調べる。
#汎用性はないが、コピー対象が特定のフォーマットに従っているならそれなりに実用的か。
・コピープログラムに完了を通知してもらう。
#通知方法は色々考えられる。signalでもいいし、ファイルでもipcでもいいだろう。
・コピープログラムに一旦別の名前でコピーしてもらい、コピー完了後に目的の名前に変えてもらう。


360 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 19:59:29 ]
>>359
何通りもありがとうございます!
どれもすごい参考になりました。
上2つは、初心者の僕でもすぐにできそうです。
signalも勉強してみます。

361 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 18:25:45 ]
どうして

static const int Size = 256;
int a[Size];
for (int i = 0; i < Size; ++i)

ではなく

static const std::size_t Size = 256;
int a[Size];
for (std::size_t i = 0; i < Size; ++i)

の方が正しいの?


362 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 00:34:24 ]
>>361
誰がそんなことを言ってたかは知らんが、その範囲を見ただけでは
上が間違っているとは思えないが。
下のほうは、size_tが64bitのような環境ではかえって無駄なことをしているだけのように思える。

363 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 03:39:31 ]
>誰がそんなことを言ってたか
cppllから引っ張ってきたネタでしょ
www.tietew.jp/cppll/archive/12803

話題を提供しつつ小遣いを稼ぐという視点は無かったな

364 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 03:51:10 ]
cppll って、技術コミュニティとしてはもう崩壊してるよね。
C/C++ コミュニティで「昔の C コンパイラでも void を書くか書かないで・・・」に
突っ込みが入らないのは異常だろ。

365 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 05:34:30 ]
>>362
そりゃ実装依存の話であって、誰が悪いかっつったら断りなしにsize_tを64ビット化した環境のが悪い気が。
もっとも、size_tは基本sizeofの返り値用の型だし、要素数表現に使われてるのはちょっと微妙なわけだが。



366 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 17:03:25 ]
size_tを要素数や文字列長に使うのは自然だと思うけど。
無符号というのも意味的にスッキリしてるし。
ビット長はその処理系で必要な長さになってるんだから無駄と言うのも変な話だ。

367 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 02:07:17 ]
例えばmallocの引数型がsize_tなのは、
そのままsizeof演算子の結果に配慮したからで、
これを要素数倍するのは構わないのだが、
要素数を扱う型にくくってしまうのは、少々短絡的。

文字列長に使うのは、charがなんだかんだで
バイト単位と認められてしまってるところから。

一番悪いのはlengthof演算子だのlength_tだのを
用意しなかったCそのものだと思われるが、
C++に世代が移ってループもイテレータで回す昨今、激しくどうでもいい。

俺も上のようなことは正直こじつけそのもので、自分でもまったく信じてない。


最近だとptr_diffなんかも64ビット化してるんで、
細かい目で見るとポインタの加減算もコストが嵩んでる。

無視するのがいいのだろうが、世の中ままならぬ。

368 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 11:23:59 ]
そういやC99ではどうなん?

369 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 19:53:08 ]
>>368 何の話だ?

370 名前:デフォルトの名無しさん [2007/01/06(土) 18:19:48 ]
boolは1バイト消費するのですか?


371 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 19:48:59 ]
かもしれないし4バイトかもしれない

372 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 08:06:00 ]
>>370
STLなら1ビット

373 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 12:43:05 ]
>372
はぁ?

374 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 15:18:41 ]
>>373
std::vector<bool>のことを言っているんだろう

375 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 16:46:38 ]
vector<bool> は領域節約のため特殊化する必要があるが
それは 1 bit を保証するものではない。



376 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 17:15:33 ]
>>374-375
それって valarray<bool> のことじゃなかったっけ?

377 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 00:18:10 ]
>>376
23.2.5 Class vector<bool> [lib.vector.bool]
1 To optimize space allocation, a specialization of vector for bool elements is provided

378 名前:デフォルトの名無しさん [2007/01/12(金) 17:01:28 ]
引数を受け取るコンストラクタがある関数オブジェクトを
渡す方法を教えてください。

struct Func
{
  int data;
  func(int v) : data(v) {}
  int operator() (int i) { return v*i; }
}

template<typename F>
int Test(F f, int i)
{
  return f(i);
}

int main()
{
  Func func(1);
  return Test(func, 2);
}

Test<F>(Func) に一致するものが見つからないと怒られます。

struct Func
{
  int operator() (int i) { return i; }
}
こうすると通ります。なぜでしょうか?

379 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:02:51 ]
func(int v) : data(v) {}のところはFunc(〜のtypoです

380 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:28:07 ]
struct Func
{
  int data;
  Func(int v) : data(v) {}
  int operator() (int i) { return data*i; }
}

まだ間違ってました。


381 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:33:04 ]
>>378-380
通るじゃないか。コンパイラ何使ってんの?

382 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:36:23 ]
うあれ?TurboC++です。もう一度やってみます

383 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:42:23 ]
gcc3.4.2なら通るぞ。

384 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:42:26 ]
すみません、再構築したら通りました・・・・

385 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:50:21 ]
makefileをちゃんと書いてないんじゃないの?
ヘッダとの依存性とかを



386 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 22:00:14 ]
C++で
vector<counter> v(dic.begin(), dic.end());
sort(v.begin(), v.end(), cmp);
for (vector<counter>::iterator i = v.begin(); i != v.end(); ++i)
cout << i->first << ":" << i->second << endl;
return 0;
の部分の機能がわからないのでどなたか解説してください

387 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 22:50:34 ]
www005.upp.so-net.ne.jp/episteme/html/stlprog/

388 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 22:52:01 ]
dicというコンテナからcounter型のvectorを生成し、
それをcmpを比較関数としてソート
ソート結果を表示


389 名前:デフォルトの名無しさん [2007/03/02(金) 11:50:48 ]
1.0-1.0が0にならない理由を教えてくだすれ

390 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 12:02:14 ]
0になるだろ

391 名前:デフォルトの名無しさん [2007/03/03(土) 00:45:07 ]
ポインタで
char *p;
p = "ABC";
とした時の
pは"ABC"を表すのですか?
*pは何を表すのですか?

392 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 02:01:01 ]
pは"ABC"の先頭アドレスをさす
*pは'A'を表す

393 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 03:11:04 ]
>>392
ありがとうございます!

394 名前:デフォルトの名無しさん [2007/03/04(日) 18:58:20 ]
C言語系のサイトでよく見るんですが
kitty on your lap とは何なのでしょうか?
hello worldみたいなもの?

395 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:08:10 ]
ぐぐっても…一番上には出てこないのか。
何番目かに引っかかる「ひざの上の同居人」ってゲームに
そういうサブタイトルがついてたんだよ。
今では陳腐に見えるけど、当時はまだまだ新鮮なコンセプトで、
一部の猫耳好きから圧倒的な支持を受けた。



396 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:09:23 ]
よく見るって…そんなの使ってるの一箇所だけだろ

397 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:12:02 ]
さくら、ケロちゃんと同じくらいは使われてるんじゃね?

398 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:15:57 ]
あのヲタクチックなサンプルコードさえなければ
あそこは最高のサイトだと思うんだがな…

399 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:20:44 ]
一昔前はプログラマ言ったらそんな奴らばかりだっただろ

400 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:37:35 ]
今もだけどな

401 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:04:36 ]
pc11.2ch.net/test/read.cgi/prog/1166284393/842
に誤爆してしまったのでこちらに再投下します。

std::string変数を空にするのに、
var=std::string("");
とか馬鹿馬鹿しいことやってるんですが、普通はどうするんでしょうか。

402 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:13:33 ]
>>401
var.clear();

403 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:22:07 ]
あっあありがとうございます。

404 名前:デフォルトの名無しさん [2007/04/13(金) 09:12:41 ]
nullと0の違いを教えてください

405 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:21:57 ]
0はただのゼロだが、nullは「意味を持たない」という文脈で使われ、
その実体は必ずしもゼロではない
例えば大抵の処理系では int *p=null; と int *q=0; は等価だが、
場合によっては q はメモリの「ゼロ番地」を指しており、
実際に読み取ることができる、ということもありうる



406 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:33:16 ]
とすると、大抵の処理系では、0番地とヌルポはどのようにして見分けているのですか?

407 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:48:57 ]
>>404
CにもC++にもnullなんてものはない。
NULLのことなら、NULLが0なんじゃない。0がNULLなんだ。

408 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 10:13:41 ]
>>405
いくら「はきだめ」でも、嘘はいくない。

409 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 10:58:09 ]
>>404
C言語の定義によればどんなポインターの型にも特別な値、
すなわち 「ヌルポインター」が存在する。このヌルポインターは
他のどんなポ インターの値とも区別可能で、「いかなるオブジェクトや
関数へのポ インターと比較しても等しくなることがないことを
保証されている」。 すなわちアドレス演算子&を適用した結果が
ヌルポインターとなることもない。

C言語の定義によれば、ポインターを書くべきところに現れた定数0は、
コンパイル時にヌルポインターに変換される。すなわち初期化・代入・
比較をするときに左辺/右辺のどちらかにポインター型の変数か式が
現れたときは、コンパイラはもう一方の側の定数0がヌルポインター
を要求していることを理解し、適切なデータ型のヌルポインターの値
を産み出す。

410 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 19:12:14 ]
C++Q&Aの2.24に
class Vehicle{
public:
virtual void startEngine()=0;
vietual ~Vehicle();
};
Vehicle::~Vehicle(){}

「そこから導出される派生クラスではstartEngine()メンバ関数を提供してはいけない。」

とあるんですが、これは使うなって事ですか?
「提供してはいけない」っていう言葉の趣旨がわからんのですが。


411 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 19:15:40 ]
多分
s/しては/しなくては/
ではないかと。

412 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:41:27 ]
ですよね。
定義しないとエラーになるんで、これは一体・・・と思ってた所です。

訳者が監修扱いになってるんで、誤訳かなぁと思ってた所です。


413 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:45:54 ]
デストラクタをvirtualにしないと駄目な理由がいまいちわかりません。


414 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:49:42 ]
>>413
struct Base
{
// virtual ~Base() {}
};
struct Derived : Base
{
Derived() : p(malloc(100)) {}
~Derived() { free(p); }
private:
void* p;
};

{
Base* x = new Derived;
delete x;
}

415 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 21:06:15 ]
そこでshared_ptrですよ、と惑わしてみる



416 名前:デフォルトの名無しさん [2007/04/15(日) 08:19:41 ]
動的束縛(アップキャスト)を使った状態でのdeleteが駄目って事ですか?



417 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 09:42:37 ]
float x=0.1;
exp(0.1*x)だとfloatなのにpow(0.1*x,2)だとdoubleになってしまうのは何故なのでしょうか?
pow(float(0.1*x),2)とすれば、floatになってくれるのですが、expとpowで何が違うのでしょうか?


418 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 09:49:12 ]
んなこたーない。

つーか、何を根拠にfloatだのdoubleだの言ってるんだ?

419 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:40:47 ]
まずCかC++かはっきりさせろ

420 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:48:26 ]
C++です。

421 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 17:25:36 ]
で、根拠は?

422 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 17:33:13 ]
cmathを使っている

423 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 18:57:11 ]
ダメだこりゃ。

424 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 19:14:06 ]
math.hを使え

425 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 20:25:31 ]
なんでやねん。



426 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 21:33:50 ]
>>417
0.1 * xは、0.1がdouble型だからxもdouble型へ昇格され、全体としてもdouble型になる。
expもpowもdouble型の引数を取るものが呼ばれるはず。
そうでないならコンパイラがおかしいはず。
そもそも418も指摘しているとおりで、417自身がどうやって調べたのかも怪しいが。

ついでにいくつか言うが、float型リテラルを作るには0.1fのようにfを後置しろ。
そんな関数スタイルのキャストでも(勿論Cスタイルのも)使うな。
ここではstatic_castを使え(Boostのimplicit_castもありだ)。

427 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 13:06:00 ]
#include <windows.h>
#include <stdio.h>


void main()
{
 double a;

 a = 2/6;
 printf("%f\n", a);
}

VC6にて上のように単純に2÷6を計算したら0が出力されます。
0.33333・・・を出したいのですがどうすればいいのでしょうか?

428 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 13:48:59 ]
>>427
a = 2.0 / 6.0;

429 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 13:54:24 ]
>>428
ありがとー


430 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 20:52:34 ]
共用体が有効なときってあるの?
活用方法が見出せない。

431 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:11:20 ]
>>430
確かに。職業PGだが、BigEndianとLittleEndianが混在した状況で
共用体が必要な場面は少ないと思う。実際使わないし。

組み込み系ならBEかLEかははっきりしているので
union X {
long a;
char b[sizeof(long)];
};

とかやることがあるかも。

432 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:37:36 ]
領域をケチりたい場合にはよく使ったが、
最近はメモリに気を使う必要性が減ったから、
わざわざそういうことはしなくなったな。

433 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:02:36 ]
union REGS は昔良く使われてたな。
今は struct sockaddr 関係で使われてたような。
sin_addrが内部の何かのdefineだった気がする。実装依存だろうけど。

434 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 11:00:22 ]
>>430
であれば、使わなければよい。

実例としては、例えば「ICMPヘッダ union」でググるよろし。

435 名前:デフォルトの名無しさん [2007/04/21(土) 18:03:25 ]
freeにNULLを渡した場合の挙動は仕様として決まっていますか?
また、一般的な処理系ではどうなっているでしょうか。



436 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:24:28 ]
>435
標準CではfreeにNULLを渡したときは何もしない(だから渡してもよい)
ことが保証されている。

437 名前:デフォルトの名無しさん [2007/04/30(月) 09:05:06 ]
32bit Windowsと64bit Windows両方で共通のコードを書きたいのですが、
int、doubleなど同じ変数型でも変数の桁数、精度がそれぞれで違うと思いますが、
これらの違いの一覧はどこかで公開されているのでしょうか?
これらはOS依存なのでしょうか?それともコンパイラ依存なのでしょうか?



438 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 10:41:58 ]
VC++なら、
たぶん求めてるのはこの中から見つけ出せると思う。
ttp://msdn2.microsoft.com/ja-jp/library/02c56cw3(VS.80).aspx

439 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 10:49:34 ]
intってコンピュータが64bitなら64bitになるというものじゃないのですか?

440 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 11:00:43 ]
IP64,LP64,LLP64とかでググレ

441 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 16:20:50 ]
if文の条件としてキーボードでaが入力されたら〜ということを表したいのですが、
char c;
if((c=getchar())==a)
と言ったものを考えたのですが、
char c;
if((c=getchar())=='a') に直すべきでしょうか。
非常に稚拙な質問ですが、よくわからないので助けてください。


442 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 16:26:29 ]
>>441
正しくコンパイルできて動くほうを選べ。

443 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 17:07:24 ]
>>442
ごめんなさい、今出先なのでコンパイルできる環境がないもので・・・。
どうか教えていただけませんか。

444 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 17:12:29 ]
>>443
教えるも何も >>441 からでは判別不能。エスパーの召喚が必要だ。
コンパイルできない環境で知る必要も無いだろう。帰ってからゆっくり試せ。

445 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 19:00:38 ]
>441
前者は、入力した文字を 変数 a の内容と比較している。
後者は、入力した文字が a という文字かどうかを判定している。
さあ、選べ。



446 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 01:23:21 ]
>>445
トークンa
'a'という整数

447 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 07:40:59 ]
>441
ついでにgetchar()の戻り値、文字リテラルの型はintだからchar c;ではなくint c;
とすべき

448 名前:447 mailto:sage [2007/05/01(火) 07:42:04 ]
>文字リテラルの型はint
Cの場合ね。

449 名前:デフォルトの名無しさん [2007/05/06(日) 19:11:31 ]
下記のファイルの3列目を読み込んで配列に格納したいです。
-----
1,2,3,4
5,6,7,8
9,8,7,6
5,4,3,2
-----

数値はカンマで区切られています。
どうやったら a[0]=3, a[1]=7, a[2]=7, a[3]=3
というふうに格納できるでしょうか?
a[0][2]=3, a[1][2]=7, a[2][2]=7, a[3][2]=3
でも構いません。よろしくお願いします。

450 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 19:12:13 ]
宿題は宿題スレへ

451 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 19:19:57 ]
>>449
適当でいいのなら fgets で 3 列目まで読み込んでから
sscanf(buf, "%d,%d,%d,%d", &a[0], &a[1], &a[2], &a[3]);
みたいに。

真面目にやるなら strtok とか、コンマを strchr で探して切り捨てたりしてから、
atoi とか。

452 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 19:31:52 ]
一行読み込むごとに
sscanf(buf, "%d,%d,%d,%d", &dummy, &dummy, &a[i], &dummy);
でいいじゃん

453 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 20:42:28 ]
普通に %*d つかえよw

454 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 20:45:02 ]
あ、三列目ってそっちか。

455 名前:449 mailto:sage [2007/05/06(日) 20:47:58 ]
>>451-454
とくに宿題ではないのでここに書かせてもらってます。
型は決まっているのでsscanfでできました。
ありがとうございました。



456 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 00:21:59 ]
>>453
すっかり忘れてたわー

457 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:33:22 ]
>>452
で、3カラム目だけ得る目的なのに4カラム目を空読みする理由は?
#"%*d,%*d,%d"で充分。

458 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 17:30:42 ]
>>457
上につられたってことにしといてください

459 名前:デフォルトの名無しさん [2007/05/07(月) 23:31:13 ]
#include <stdio.h>
#define JIJYO(x) ((x)*(x))

main()
{
int i = 1;
while(i <= 5) {
printf("結果:%d\n", JIJYO(i++));
}
}
において、実行結果は1^2,3^2,5^2の順に表示されるのですが、
何故、1^2,2^2,3^2……とならずに、i++が2回ずつ呼びだされるのでしょうか?

460 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:42:30 ]
見え見えの落とし穴にはまるあなたは
きっと仲間内では天然キャラとして愛される存在なのでしょう

461 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:53:10 ]
>>459
漏れも初心者なんで、あってるかどうかわからないけど。

#define JIJYO(x) ((x)*(x))

((i++)*(i++)) に展開されるんじゃないかな。

462 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:56:59 ]
マクロを教える時に必ず注意される所だと思うが。

463 名前:459 mailto:sage [2007/05/08(火) 02:02:18 ]
>>461
なるほど……。
ありがとうございました。

464 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 13:38:07 ]
C++について。
問題文: f(x)=x^3(xの3乗)のdf(x)/dxのプログラムをC++で作れ。
(1≦x≦2、xは0.01ずつ増加<x(i+1)=x(i)+0.01>、そのときのf(x)の値も用いる。)

5月14日までに考えて来い!との事なので・・・
どうかご教授願いたく存じますm(_ _;)m

465 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 13:56:57 ]
>>464
for (int x=100;x<=200;x++)
{
    cout<<(x/100.0)<<" "<<3*(x/100.0)*(x/100.0)<<"\n";
}



466 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 13:59:49 ]
>>464
宿題スレとのマルチはお勧めしない。

467 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 15:44:46 ]
さすが掃き溜め。

468 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 16:20:58 ]
C++厨死ね

469 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 01:28:34 ]
>>464
丸投げしといて、回答があれば丸写ししようなどと考えてる (らしい) 奴が
>ご教授願いたく
などとふざけた台詞を吐くお陰で、この単語に脊髄反射してしまう奴が
後を絶たないんじゃないかと思うようになって来た。

470 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:33:14 ]
すいません・・・二重ポインタ**の意味がどうしてもわかりません・・・
多次元配列がどうのこうのって書いてあったけど・・・

471 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 00:30:42 ]
>>470
ポインタのポインタで検索汁

472 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 00:45:13 ]
ありがとうございました.二重ポインタで検索してました.

473 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 19:23:25 ]
ぬるぽいんた

474 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:52:42 ]
がっいんた

475 名前:デフォルトの名無しさん [2007/06/07(木) 11:04:30 ]
ropeってどんな時に使うのですか?
いまいち利点が分からないのですが。



476 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 11:19:39 ]
>>475
ttp://www.oopweb.com/CPP/Documents/STLGuide/Volume/Rope.html

個人的には、「非標準である」というデメリットしか思いつきません。

477 名前:デフォルトの名無しさん [2007/06/07(木) 12:04:02 ]
gccで作成した静的ライブラリとg++で作成したオブジェクトファイルを
リンクさせようとすると

undefined reference to ****

のようになります。
ライブラリの方はgccでしかコンパイルがうまく通らないのですが、
今後作成するプログラムはC++で書くため、gccでコンパイルしたものと
g++でコンパイルしたものをうまくリンクしたいのですが
何かよい解決策はないでしょうか?

478 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 12:17:22 ]
>>477
「名前マングル」でググるよろし。
ライブラリのヘッダに手を入れていいなら
プロトタイプ宣言の先頭に

 #ifdef __cplusplus
 extern "C" {
 #endif

最後に

 #ifdef __cplusplus
 }
 #endif

を入れる。

479 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 13:12:38 ]
while(1)
{
scanf("%d", &a);

switch (a) {
case 1:
printf("a = 1\n");
break;
case 3:
printf("a = 3\n");
break;
case 5:
printf("a = 5\n");
break;
default:
printf("others\n");
break;
}
}


これでgとか非数値を入力するとscanfが飛ばされて
defaultの所が延々流れるのですが何故でしょうか?

480 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 13:20:52 ]
1. g の地点で scanf が失敗
2. a には何も入らないため、変数に最初に入ったゴミにより default が選択される
3. others と出力される
4. 1 に戻る

この無限ループ

481 名前:477 mailto:sage [2007/06/07(木) 13:22:09 ]
なるほど、うまくいきました。ありがとうございます。

482 名前:デフォルトの名無しさん [2007/06/07(木) 13:51:28 ]
const int* p = new int[10];
delete[] p;

これ、エラーも警告も何も出ないんですけど、
仕様上合法なんですか?

483 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 13:59:51 ]
>>480
なるほど、文字入力を%dの10進数指定して読み込んだら
ASCIIコードの値が格納されるかと勘違いしてました。
ていうか失敗の後再読み込みされずにgのゴミで処理されるって
scanfの仕様どうなってるんだろうかと今さらながらググってみたら
一番最初に出てくる関数だから侮っていたら書いてあることが意外と難しくてビックリでしたorz


484 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:15:41 ]
>>482
const int の配列を割り当てるのも、それを解放するのも
何の問題ありません。

でも p[0] = 0; なんてするとエラーになる罠。

485 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:26:43 ]
メモリの破棄には const の力は及ばない・・・ということですか。
分かりました。



486 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:59:10 ]
破棄そのものは内容書き換えないからな

487 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 16:04:32 ]
理屈は分かるけど、それでいいんかいと思わなくはないなw

void foo(const int* p) {
 delete[] p;
}

を foo(p); って呼んで、
ああ、p は foo で何の影響も受けてないよねー、と思ったら、
delete[] されてた、なんつって。

まあ、const_cast という悪魔も確かにいるけどね。

488 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 17:36:12 ]
そんな気持ち悪いことはしないでくださいとしかなあ。

489 名前:デフォルトの名無しさん [2007/07/06(金) 09:47:01 ]
C言語で、文字列 str1 の先頭から1文字づつ取り出して
別の文字列 str2 に追記していく場合、
strncatを使用して

strncat(str2,&str1[i],1);

とするとstr2の内容が文字化けしてしまいます。
FedoraCore6なんですが、どうすればいいでしょうか?

490 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:48:11 ]
何を入れたらどう化けたんだよ

491 名前:デフォルトの名無しさん [2007/07/06(金) 10:01:41 ]
>>490
(だとか)だとかを入力後、他の文字を追記するとstr2に文字化けが生じてしまいます


492 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 10:03:31 ]
つまり、マルチバイト文字を入れたときに化けるんだな
化ける前と化けた文字を見れば一発でわかるが・・・
iはちゃんと1ずつ進めてんの?

493 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 10:05:06 ]
マルチバイトはstrncpyの3番目が1の場合2回(UTF-8なら3回)実行しないとだめなのはわかってる?

494 名前:デフォルトの名無しさん [2007/07/06(金) 10:07:47 ]
半角(などを使用していたつもりだったので、
文字列内にマルチバイト文字は入っていないと思っていたのですが・・・・

sizeof("(")でもsizeof("1")でも同じ値がかえってきたのですが、"("もマルチバイトなんでしょうか?
あらかじめstrlenで文字数を数えてからiを回しています。


495 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 10:08:40 ]
(だとか)だとかを
「だとか」じゃなくて、"("、")"のほうかよw



496 名前:デフォルトの名無しさん [2007/07/06(金) 10:10:48 ]
>>495
すみません、ちゃんと""つけておいたほうが良かったですね。

497 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 10:13:54 ]
文字化けを見てみないとわからんけど、\0終端して無いからゴミがくっついてるんじゃね

498 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 10:17:24 ]
そういや、最初にstr2は0で初期化してる?
strcat は\0のとこに追加するんだぜ。

499 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:01:06 ]
str(n)cat なんていう下衆なもんは使わないことをおすすめする。

500 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:18:09 ]
>>498
してませんでした。
やってみます

501 名前:デフォルトの名無しさん [2007/07/10(火) 21:31:00 ]
クラスにはセットとゲット以外に、
なるべくメンバ関数を作らないようにすべきですか?
それとも、どんどん関数を含めても良いのでしょうか?
思想的な質問ですが…

502 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:33:03 ]
アクセサ自体ベタベタ付ける物ではない
メンバ関数・変数ともにそのクラスを表現するのに必要なものだけで良い

503 名前:デフォルトの名無しさん [2007/07/10(火) 21:38:34 ]
つまりメンバ関数にする意味があるもののみ含めるのが良いと、
そういうことで良いでしょうか。

504 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:59:27 ]
それでおkかな。
OOには単一責任の原則と言う物があるから
基本的にクラスが持つ責任は一つだけ。
メンバ関数をその責任に応じたもののみを付けるのが良い。
無駄に責任を負うと初心者にありがちなblobアンチパターンになる。

505 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:28:49 ]
class A
{
public:
  int x;
};
class B: public A
{
public:
  int y;
}:
class C: public B
{
  int z;
};

継承を習っているんですが、上のようなコードがあったとき、

int main()
{
  C object;
}

このようにクラスCのオブジェクトを生成したとすると、
int x, yの分のメモリを保持しているクラスCのオブジェクトができるんでしょうか?





506 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:35:06 ]
もう一つ質問なんですが

class A
{
  int x;
};
class B: public A
{
public
  int y;
};
int main()
{
  A* p;
  p = new B;
}

このようにクラスA型のポインタでクラスBの領域を動的確保した場合、
Bのオブジェクトができるのですか?
それともAのオブジェクトができるのでしょうか?


507 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:35:08 ]
>>505
うん。もちろん z もね。

508 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:37:23 ]
>>507
ありがとうございます!!


509 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:38:42 ]
>>506 B

510 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:40:07 ]
>>509
ありがとうございます!
これで今ある疑念が解消されました!


511 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:54:21 ]
解消されたと言った手前、いきなりですが
>>506の場合において、生成されたクラスBのオブジェクトが持つint yにアクセスする手段ってありますか?
ポインタはクラスA型なので、アロー演算子を使っては呼び出せないですし…
もしかして不可能ですか?


512 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:09:52 ]
>>511
A* が指してるオブジェクトが本当に B だと確信できるなら static_cast で
B* に変換してアクセスできる。ただし、行儀のいいコードではない。

513 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:14:45 ]
いや普通ダウンキャストだろ

514 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:25:11 ]
static_cast でダウンキャストするわけですが何か?

515 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 05:10:25 ]
コマンドプロンプトの履歴?をもっと多く表示させたいんです。
最初のほうの計算がきれてしまいます。



516 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 05:15:38 ]
>>515
ウィンドウ名が書いてあるところ右クリック

プロパティ

あとはお好きにドゾー

517 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 05:22:20 ]
>>516
そこからがわからないんですけど
バッファサイズとバッファ数を大きくすればいいのでしようか?

518 名前:デフォルトの名無しさん [2007/07/11(水) 08:55:39 ]
さいです

519 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 02:28:20 ]
>>517
あー説明不足ですまん。

> バッファサイズとバッファ数を大きくすればいいのでしようか?
おk。

520 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 18:42:34 ]

 漢字かな雑じりの string を小文字にしたいんですが,以下の方法では「認.」 が化けてしまいます.

std::string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ AB確認.";//期待する変換: abcdefghijklmnopqrstuvwxyz AB確認.
std::ctype<char> c;
c.tolower( str.begin(), str.end() );//「認.」 が化ける


 以下の方法で上手くいっているように思いますが問題ありますでしょうか?
また,もっと簡単な方法があれば御教示下さい.

for( int i=0; i < str.size(); i++)
{
  if ( _ismbblead(str[i]) )
  {
    i++;
    continue;
  }
  str[i] = tolower(str[i]);
}



521 名前:デフォルトの名無しさん [2007/07/15(日) 21:09:48 ]
for(i=0; N; i++){
・・・



このときの繰り返し条件Nってどういう意味になりますか?

522 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:11:49 ]
Nのところが0以外なら繰り返してください、っていう意味!!!!

523 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:17:25 ]
共有メモリに(キューデータ構造)を構築したいのですが
どうしたらいいのでしょうか?

524 名前:デフォルトの名無しさん [2007/07/15(日) 21:30:25 ]
>>523
まずは、パソコンの電源を入れる

525 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 23:02:52 ]
>>520
wchar_t 使えば?



526 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:43:59 ]
wchar_t じゃ解決にならんと思うのだが。

527 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:58:23 ]
>>526
何か問題あるの?

528 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 01:47:49 ]
>>520 で済む事なのに
わざわざ文字コード変換とかするとか、
いくらなんでも無駄すぎる。

529 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 01:53:54 ]
>>521
Nがtrue(真)なら繰り返す
Nがfalse(偽)なら打ち切る
そして true とは 0 以外の値を持つ事であり、false とは 0 であることである。


530 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:18:50 ]
>>528
お前の言うことは分かるが、もし527に対して言っているのなら、
答えになっていないぞ。
無駄かどうかはともかく、wchar_tでも解決できるのだから。

個人的にはwchar_tを使うのはありだと思う。
確かにこの例では_ismbbleadの1つで済むが、そうでない(wchar_tにしたほうが手っ取り早い)場合は結構ある。
それ以外にも利点や必要があってwchar_tを使っていると、
522程度でもwchar_tを使えばいいと思うようになってくる。
今時変換のコストなんて微々たるもの。
なんなら元データをwchar_tと同じ文字コードにすればいい。(完全に脱線したが)

ただ、std::stringとstd::wstringとの間に簡単な変換方法が無いのは痛い。

ところで、wchar_t使う方法では、やり方次第で
全角英字まで小文字になりそうな気もする。

531 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:22:10 ]
L"" で初期化すれば変換なんて要らないんじゃないの?

532 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:29:58 ]
wchar_t は2バイトだったり4バイトだったりするからな・・・

533 名前:520 mailto:sage [2007/07/16(月) 14:26:31 ]

皆さん御解答有難う御座います.
wchar_t も検討しましたが,問題なさそうなので >>520 で行きたいと思います.
有難う御座いました.

534 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:28:47 ]
int x;
std::cin >> x;

ってすると、xがint型であってもキーボードからWWWって文字列を入れたりすることができちゃうじゃないですか
これって防げませんか?


535 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:56:16 ]
>>534
入力されたらどうするかを自分で決めて好きに実装すればいい。
最悪は1文字ずつ処理。



536 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 21:54:41 ]
その方法がわかりません・・・・・

537 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:57:53 ]
一旦、文字列として読み込めばいい。

538 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:55:38 ]
配列と、forとかの反復処理を勉強してください。

539 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 03:37:06 ]
わざわざ再発明させなくてもいんじゃね?っていつも思う。
てか悪い。C++は良く分からなかった。

#include <stdio.h>
main() {
   int a;
   do {
      printf("値>");
      scanf("%d",&a);
      while (getchar() != '\n') { }
   } while((a < 1) || (a > 9999));
   return 0;
}

540 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 04:07:14 ]
>>534
fail したら clear してから string へ読み捨てれば

541 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 22:37:43 ]
じゃあC++における標準入力って何でも文字列で読み込まないとエラー処理できないわけですか…


542 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 22:52:48 ]
>>541
Cでも同じじゃね?
ってか、入力されるのは実際文字列であってたまたま数字だったら変換してくれてるってことでしょ。
Variantみたいな型が無い時点で>540のようにするしかないかと。

543 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 01:04:15 ]
>>541
どうしてもっていうならテンキー以外のキーボードをつなげるな

544 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 06:29:53 ]
人はそれを電卓と呼ぶ。

545 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 06:57:01 ]
cin.ignore 使えば



546 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 19:06:59 ]
ttp://www.kk19.net/new_microsoft_keyboard.jpg

地球上のキーボードが全てこれだったら、
ちっとはマシな世の中になってたかもな

547 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 07:58:57 ]
>>546
せめてリターンキーは必要だろう
CtrlとALTときたら普通はSHIFT
指五本あるのになんで三キーしかないのか


548 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 19:36:32 ]
同時に全部押すことにしか使わないのさw

549 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 01:49:49 ]
最近は使わないんだろうな。
NTのログインにも使わなくなったからな・・・

550 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 15:26:31 ]
参照っていうのは『参照!』ってやった時にしかアクティブにならないのがファイナルアンサーですか?

551 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 21:52:37 ]
ニッポンランゲージでOK

552 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:01:40 ]
構造体を関数で参照した時に
その関数では使わない構造体の中の変数があった時
関数に構造体を渡した時に、
構造体の中の変数が多いとそれだけ何か、処理が増えてしまうのか
それとも「参照!」ってやったときだけ処理されるのかが知りたいです(´・ω・`)


553 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:08:55 ]
参照渡しなら問題ない。

554 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:41:42 ]
>>552
もう少し質問を簡潔にまとめてくれると助かる。
構造体を値渡しすれば関数内で利用されてない変数の有無に関わらずコピーの処理が発生する。
よって、構造体が大きくなればなるほど処理も大きくなる。
これを避けたいのであれば>>553のようにするか、ポインタ渡しすればいい。

555 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:51:52 ]
>>554
日本語の拙い>552に合わせて変な用語を使わなくていいよ。
構造体のメンバを変数と言われるとどうにも理解しにくいから。
#メンバ変数と言おうと要素と言おうとその辺は構わんが。

ついでに注釈。問題の関数がインライン展開されるような代物なら、
参照渡しでなくともコピーが発生しない可能性はある。
従って、迷ったときは値渡しで充分だ。



556 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 12:05:33 ]
謝罪を賠償しるニダ

557 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:10:49 ]
>>553
ありがとう

>>554
なるほど

>>555
インラインっていうのを始めて知りました
それだとコピーされなかったりするんですね
でもとりあえず参照使っときます

558 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:28:35 ]
恥ずかしい

559 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:49:12 ]
迷ったらconst参照でいいよ。

560 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:02:25 ]
typedef struct __blockData{
uint32_t index;
uint32_t block_size;
struct __blockData *next;
}BlockData;


struct __blockData *next;この部分なんとか
BlockData *next;って書きたいんですけど

なんとかならないっすか?

561 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:05:15 ]
なんとかならないっすね

562 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:14:43 ]
ええーーーやだやだ
ちょっとちょっとそんなぁ

まってくださいよ>>561さん
俺がどんな思いで12分過ごしたと思うのですか?

563 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:35:10 ]
typedefはあくまで再定義
最後の行のBlockData;までいったところで初めて再定義完了になるから
自分を指す場合ちゃんとstruct __blockDataと明示しないと不可。

564 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:39:25 ]
そうなのか

やけ酒するしかないな...
高校生だけどまぁいいかw

565 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:48:04 ]
通報しました



566 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:55:34 ]
>>560
これでいいんじゃね?

typedef struct __blockData BlockData;

struct __blockData{
uint32_t index;
uint32_t block_size;
BlockData *next;
}BlockData;

567 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:04:43 ]
>>566
それはCでもC++でも無理だろ。書き忘れたがC++コンパイラなら
struct BlockData;と前方宣言する事でコンパイルをパス出来た。

568 名前:566 mailto:sage [2007/09/25(火) 01:08:52 ]
あ、最後に余計な BlockData がついてた。ごめん。

>>567
最後の余計なやつだけ修正すればコンパイルできるよ。
C++ なら前方宣言も要らなくて struct BlockData { BlockData* ... ってできるよ。

569 名前:デフォルトの名無しさん [2007/09/25(火) 01:13:22 ]
うへー

570 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:17:52 ]
void *next;

では・・・・だめですかそうですか。

571 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:18:50 ]
uint_ptrと
void *

の使いわけってどうすればいいの?

572 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:26:04 ]
大文字じゃなくて小文字なの?あんま見覚えが無い・・・

UINT_PTRはunsigned intだった気もするけどよく覚えていない

573 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 04:52:14 ]
a |= b

ってどんな意味なんでしょうか?


574 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 08:13:47 ]
>>573
a = a | b

575 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 09:29:14 ]
>>572
UINT_PTRはC99のuintptr_t相当。



576 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:18:36 ]
>>571
int と voidの使い分けは?


577 名前:デフォルトの名無しさん [2007/10/18(木) 01:34:33 ]
あげあげ

578 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:00:25 ]
>>571

void* はどんな型のポインタが渡されるか分らない場合に使う。
(キャストしないと参照先を見れない)
int* はポインタが指し示した先がint型であるとされる。

char a = 'a'
int* p1 = (int*)&a;
void* p2 = &a;

となっているとき*p1はエラーにならんが*p2はエラーになる。
なので関数内で使用時のキャストし忘れが防げる…のではなかったかな?

579 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 08:17:44 ]


580 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 08:32:36 ]
すみません。書きかけを送信してしまいました。
ハード、ソフト共に同じはずなのに、別のPCではマルチプロセスのミューテックスによる排他制御が上手く働いていないみたいなのですが、
原因として何を疑えばいいのでしょうか。もう全然判んないです。

581 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 09:30:23 ]
>>580
最小限のコードを晒す

582 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:27:30 ]
『上手く働いていないみたい』といいたい気持ちはわかるが
それでは他人にはわかってもらえませんよ。

583 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:30:39 ]
>>580
今まで偶然動いていただけで同期処理に漏れがあったかだな

584 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:13:13 ]
>>580
うちでは上手く働いている
実力不足じゃね?

585 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 11:06:18 ]
今まで低速シングルCPUで動いていたが
高速なPCに変えたらおかしくなったとか
クアッドコアに変えたらおかしくなったとか
そういうマルチスレッドプログラムなんかもあるんだろうな。



586 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:03:24 ]
機種依存ソフトなんだろう。

587 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 16:34:20 ]
方角が悪い。

588 名前: ◆NpJ1Hez.TM mailto:sage [2007/10/24(水) 04:48:27 ]

YES!!

589 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 17:57:28 ]
関数ポインタテーブルとswitch-case文
ってどっちが高速なの?

どっちも個数は100

590 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:02:40 ]
ポインタ

591 名前:要は、実測あるのみ mailto:sage [2007/10/29(月) 12:07:48 ]
>>589
一概には言えないが、テーブルの方が遅いことは多分ないと思う。
恐らくは、大差ないと思うが。

592 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 01:12:14 ]
テーブルが遅くなるケースも充分考えられるよ。もちろん、メモリアクセスの速度を除いて。

単純な例だと、2つの値(分岐先)が交互に来る場合。
こういった規則的なものなら、分岐予測はほぼ必ず成功する(ものが多い)。
最近のプロセッサなら、もっと複雑なパターンでも予測出来るものもある。
一方、テーブルジャンプだと、(普通は)前回と同じ分岐をすると仮定されるので
必ず分岐ミスとなる(ものもある)。

当然、分岐予測ミスのペナルティの大きさも含めて、プロセッサによる差が大きいけどね。

593 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:20:28 ]
>>589
なぜ「switch-case文より関数ポインタテーブルのが高速」だと考えるのか?

条件分岐が排除できるから

では、なぜ条件分岐が排除できると高速になるのか?

実際に実行するコードがかなり前から分かっていれば、
CPUでコードプリフェッチやアウトオブオーダー実行などの最適化を行えるから

関数ポインタテーブルを使えば実行するコードがかなり前に分かるのか?

条件にもよるが、おそらくはノー
多くの場合、直前にならないと関数ポインタの値が分からない

つまり、関数ポインタテーブルを使っても、少なくともx86の場合は速くなりません。
条件分岐なら二者択一でとりあえずどちらかの分岐コードを実行するという手もありますが、
関数ポインタだとそういうこともできないので、多くの場合ストールします。
実際に実行するコードアドレスがかなり前から分かっていて、
そのアドレスを特定のレジスタ(か不変なことが保証されているメモリ)
に保存しておくことができればストールは回避できます。

594 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:25:53 ]
じゃあif-elseでもいいのか


595 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:17:04 ]
選択肢が100個もあれば、速度は分布によっていろいろだろうな。



596 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:16:36 ]
Cカス
Cカス

うるさい人を黙らせる方法教えてください

なるべく合法的な方法がいいです

597 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:30:14 ]
RubyもPythonもphpもUnixも
全部Cで書かれてるんだぞ。
Cはすごいんだぞ。

598 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:35:23 ]
>>596
相手がしゃべった瞬間に大声を出すとか

599 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 07:11:07 ]
>>596
お前の耳を取ってしまえ

600 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:23:13 ]
C言語でC++の
テンプレート見たいに記述したいんだけど

どうしたらいいものじゃろうか?のぅ?

601 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:03:26 ]
プリプロセッサを駆使する。

602 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 20:52:15 ]
でどうやってかくの?

603 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:48:29 ]
## を駆使する

604 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 06:34:15 ]
C++にtemplateが実装されるまでの過程を知ってりゃ話は早いんだがな。
generic.h

605 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 22:49:30 ]
そうだ、cfrontを使おう(w



606 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 09:23:34 ]
template<typename T>T*hoge(T*t){return t;}
でNULLを受け取れるようにするにはどうすればいいんでしょう...

607 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 11:57:46 ]
(void*)NULLみたいに、型付きのNULLを渡す。
でないと、どの型のNULLがほしいか誰にも判らないじゃん。

608 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:28:57 ]
NULLに型など付けれません
ばかじゃねーのw

609 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 23:02:23 ]
>>606
hoge<int>(0)

610 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:18:25 ]
hashのkeyを

char key[32]で定義しmemcpyを
必要に応じて複数回コールする方法と


struct key_data{
_u32 data;
....
};

みたいな感じで構造体を定義して
_u8 *にキャストして使うのは
どっちが速い?それとも同じ?


611 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 03:44:57 ]
なんともいえない。
実測。

612 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:12:37 ]
>>608
いくらここが掃き溜めだと言っても限度が・・・

613 名前:デフォルトの名無しさん [2008/01/20(日) 21:00:38 ]
コンパイルしたときのエラーに

storage size of 's' isn't known

とでてきてしまいます。
これはどこを直せばいいんでしょうか?
storageって何ですか?

614 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:32:07 ]
>>613
辞書くらい引け。

恐らく、int s[]みたいな変数宣言でもしているんだろ。

615 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 12:37:58 ]

offsetof(s,m)マクロみたいなので
他クラスのprotectedメンバのオフセットを
取得したいんですがどうすればよいですか?





616 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 12:41:48 ]
>>615
それができたらprotectedの意味がないとは思わないかね?

617 名前:デフォルトの名無しさん [2008/01/22(火) 23:31:19 ]
コンパイルをした時に
converting to ‘int’ from ‘float’

って表示されたらどこが悪いんでしょうか?

618 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 23:39:07 ]
>>617
floatからintに暗黙の変換を行っている。
明示的にキャストを書けば警告は出ない。

619 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 23:44:05 ]
>>617
>って表示されたらどこが悪いんでしょうか?
頭……というのはさておき、floatからintではオーバフローが起きる恐れがあるので
気の利いたコンパイラは警告を出すってこと。
# 勿論、出さないようにもできる。

620 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 00:29:52 ]
>>618-619
お陰様で解決出来ました、ありがとうございます。


621 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:04:43 ]
C++のコンストラクタの中で例外発生させるのは駄目と聞いたのですが
ではnewもbad_alloc投げる可能性があるのでコンストラクタでnewしてはいけないのですか?

622 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:45:32 ]
コンストラクタで例外はまあない方がいいのは確かだが、
ダメというほどではない。
デストラクタは絶対あかんがね。

623 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:08:28 ]
クラスを作る側も使う側もきちんとリソースの管理ができていれば何の問題もない。

624 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:38:50 ]
コンストラクタでの例外については、人によって意見が違うが、
俺は積極的に例外が発生するようにしてる。

じゃないと、不正なオブジェクトが生成されてしまうから

625 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:02:43 ]
仮想コンストラクタとスマートポインタ使えば解決。



626 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:07:41 ]
Phidgetsというハードを制御したいのですが

~略
int servo_simple()
{

CPhidgetServoHandle servo = 0;

//create the accelerometer object

CPhidgetServo_create(&servo);

//open the LED for device connections

CPhidget_open((CPhidgetHandle)servo, 20489);

//Step 1: Position 10.00
printf("Move to position 10.00. Press any key to Continue\n");
getchar();

CPhidgetServo_setMotorPosition (servo, 1, 100.00);

return 0;
}

//int _tmain(int argc, _TCHAR* argv[])
int main(void)
{
servo_simple();
return 0;
}

627 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:08:03 ]
この文で、
getchar();
で入力を待たずにCPhidgetServo_setMotorPosition (servo, 1, 100.00);
を実行したいのですが、getchar();を消しただけでは駄目なのでしょうか?
ド素人な質問をしていると思うのですがどうかご教示下さいませ。

628 名前:626-627 mailto:sage [2008/02/12(火) 07:42:40 ]
自己解決しました。 getchar();で入力を待たずに実行すると、ハードを認識するのが追いつかずに実行されるようでした。

629 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:09:36 ]
クラスを普通に前宣言する時
class MyClass;

って書けばいいけど、例えば

class MyClass
{
public:
class Foge
{
};
};

みたいに MyClass の中にあるクラス Foge を
前宣言したい時はどうすればいいの?

630 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:39:33 ]
>>629
class MyClass
{
public:
class Foge;
};

class MyClass::Foge
{
};

MyClass の定義無しでの宣言はできない。だからネストされたクラスを
インターフェースに使うと MyClass を前方宣言で済ませるのが難しくなる。

631 名前:デフォルトの名無しさん [2008/02/20(水) 22:12:19 ]
一つのソケットに対して送信、受信が交互ではなくて、不定期に発生するような、
プログラムを作ってるんですけども、こういうのってどうするのが良いですか?
交互に通信がある場合ならselect→recv→sendとかで簡単なんですけども
送信が繰り返される場合もあるので悩んでいます。
どなたか教えてください

632 名前:デフォルトの名無しさん [2008/02/20(水) 22:58:08 ]
今マインスイーパーを作ってるんですが
それについての質問ってここでしてもいいんですか?

633 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 23:35:38 ]
>>631
sendリクエストをsignalで受ければいいような。
もし必要ならネットワークスレへどうぞ。

>>632
マインスイーパー程度ならここでもいいと思いますが、
GUIライブラリの使い方なら該当GUIライブラリスレへどうぞ。
マインスイーパースレも参考にどうぞ。

634 名前:デフォルトの名無しさん [2008/02/20(水) 23:51:14 ]
>>633
visualC++ 6.0を使って作ってるんですが
地雷の表示と踏んだ後のリセットがうまく出来ないんです

void CMine1View::DispMine()
{
CClientDC dc(this);
CBrush *oldBrush1,redBrush,*oldBrush2;
int iy,ix;
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Position[iy][ix]==-1)
{
oldBrush1=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(ix*Width,iy*Width,
ix*Width+Width,iy*Width+Width);
dc.SelectObject(oldBrush1);
redBrush.CreateSolidBrush(RGB(255,0,0));
oldBrush2=dc.SelectObject(&redBrush);
dc.Ellipse(ix*Width+5,iy*Width+Width+5,
ix*Width+Width-5,iy*Width+Width-5);
dc.SelectObject(oldBrush2);
redBrush.DeleteObject();
}
}
}
AfxMessageBox("地雷 踏みました!");
}

635 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 03:02:40 ]
>>631
selectが反応したときはrecvする
sendはいつでも何度でも好きなときに好きなだけ繰り返し呼んで良し
何か問題が?



636 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 03:13:07 ]
トランシーバーと同じ問題じゃないの?どうぞ

637 名前:デフォルトの名無しさん [2008/02/27(水) 01:03:33 ]
質問です。
VC使ってて、あるクラスの実体を複数のスレッド内で使ってるのですが、
これって問題あるのでしょうか?
スレッド毎に異なるデータを用意してるので、
クラスのメンバ変数への排他の問題はありませんが、
クラス内にDLLクラスをメンバに作っていて、
スレッド毎に同じDLLにアクセスしています。
こんな使い方って問題ありますか?




638 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:08:24 ]
DLLの提供する関数がリエントラントなら問題ないんじゃね

639 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 03:27:06 ]
クラスAがあり、クラスAを実体化した際、コンストラクタでクラスBを実体化したとします。
このとき、クラスBがクラスAのpublicな関数を呼び出すためには、
クラスBに対してクラスAの実体のポインタを渡し、そこからアクセスする以外に方法がありますか?
どのような方法があるでしょうか?


640 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 03:29:48 ]
>>639
ポインタじゃなくて参照使うとか、無理やり違う手段でっていうならグローバル変数とか、
いろいろありそうだよ。

641 名前:デフォルトの名無しさん [2008/03/03(月) 15:37:24 ]
>>639
あんま使ったこと無いけどクラスBにクラスAのメソッドをfriendで共有すれば?

642 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:35:21 ]
friendにしてもthisポインタ相当の何かは必要だろ。

643 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 19:14:59 ]
クラスCのstatic変数に突っ込んで、クラスCの静的メンバ関数から呼んでもらう。

644 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:27:18 ]
>>639
C#でいうdelegate?
d.hatena.ne.jp/wata_d/20060309/1141875648

645 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:19:25 ]
グローバル変数なんつー力技を除けば、
どうあっても this は渡す必要がある。
デリゲートだって内部的に this を渡している訳で。

friend は public メンバ呼ぶのには全く関係ないな。



646 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:27:30 ]
>>645
もちろん、何らかの方法でthisを渡す必要はあるだろう。
でも、>>639の場面で、class Bからclass Aのメソッドを直接呼び出すには、class Bがclass Aを知らないといけない。
delegateは、メンバ関数へのproxyとして働くことで、メソッドを定義しているclassを隠すことが出来る。
>>639の場面では、class Bはclass Aを知らなくても、class Aのメソッドを呼び出すことが出来るようになる。

647 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:59:25 ]
そもそも、コンストラクタ内で他のクラスにメンバ関数を呼ばせる事自体
結構危険な事だと思うけどね。

648 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:27:25 ]
コンストラクタで実体化しただけで、
コンストラクタで関数を呼ぶとは書いてないだろ

649 名前:デフォルトの名無しさん [2008/03/13(木) 19:06:50 ]
ja.wikipedia.org/wiki/Memset
何でstrcpy(s, NULL);は誤りなのですか?

650 名前:デフォルトの名無しさん [2008/03/13(木) 19:26:01 ]
>>649
NULLがchar*型じゃないから

651 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:44:01 ]
memsetは問題なく動くからまだいいけど、
普通は、s[0] = '\0';で十分だろ。せいぜいstrcpy(s, "");

652 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:19:50 ]
NULL を脱参照して死亡

653 名前:デフォルトの名無しさん [2008/03/24(月) 10:47:50 ]
ファイルを分割したときに変数を大域変数として定義して、
呼び出すためにはどうしたらいいでしょうか?

今ファイルがmain.cpp,hoge.h,hoge.cpp,hage.h,hage.cppとある時に,
全体でのメモリアクセスを調べるためにmain.cppでint型の大域変数を定義して,
hoge.cppとhage.cpp内で値をインクリメントできるようにしたいのですが・・・

654 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 10:51:04 ]
どんな入門書にも書いてあるよ

655 名前:デフォルトの名無しさん [2008/03/24(月) 11:25:16 ]
main.cppで変数定義して、
hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
やり方間違ってますか?



656 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 11:26:37 ]
>>653
クラスにすることお勧め。

657 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 13:36:42 ]
どうしてエラーをコピペしないのか。俺らをエスパーだと思ってるのか。

>>655
ソースも見ないで間違ってるかどうか判断できるわけがない。
ソース(その変数に関係するところ)とエラー(いっぱい出てたら始めの3個くらい)を張って。
改めて打つんじゃなくてコピペで。

>hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
externの綴りが間違ってる。ここに書く時に間違えただけならいいんだけど。

658 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 20:57:56 ]
エスパーしてもらいたいんじゃなくて
原因である可能性の高いものを列挙してもらいたいんじゃない?

んで、それを一通り試して、自己解決しました!って言うの(笑)

659 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 02:29:45 ]
>>655
やりかたがまちがっている。
.h ファイルはコンパイルする必要はないよ。

660 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 03:10:31 ]
>>653
[main.cpp]
#include <stdio.h>
void hoge_inc(void);
void hage_inc(void);
int count;
int main(int argc, char *argv[]) {
    count = 0;
    hoge_inc();
    printf("count = %d\n", count);
    hage_inc();
    printf("count = %d\n", count);
    return 0;
}
[hoge.cpp]
extern int count;
void hoge_inc(void) {
    count++;
}
[hage.cpp]
extern int count;
void hage_inc(void) {
    count++;
}

661 名前:デフォルトの名無しさん [2008/03/25(火) 11:28:05 ]
スレの内容見ながら直したら解決できました。
出てたエラーは
error LNK2001: 外部シンボル ""int mov_i" (?mov_i@@3HA)" は未解決です。
でファイルの依存関係が間違っていたのが原因でした。

>>656-660
有難うございました。

>>657
申し訳ないです・・・以後気をつけます

662 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 04:03:10 ]
Windows 限定の話題で申し訳ないんですが、FARPROC 型というのが何なのかよくわからないので質問させてください。
MSDN の CallWindowProc の項目を見ると、FARPROC 型は

 typedef int (FAR WINAPI *FARPROC)();

と宣言されているらしいんですが、WINAPI は __stdcall だから良いとして、FAR というのは何なんでしょうか?
MinGW だと FAR は省略されてるので、付けても付けなくても同じな気がするんですが、
とすると FARPROC=ただの関数ポインタと考えちゃって構わないんですか?

663 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 04:04:56 ]
16bitアドレッシング時代の残骸だろ。無視して医院で内科医。

664 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 04:09:15 ]
>>663
ありがとうございます。なんかMS-DOS時代はFARとかNEARとか使ってたらしいのでそういうことなんですかね。
Windows だとこういうマクロとか typedef がやたらと多くて変な所でやたら苦労させられます(;´Д`)

665 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 11:29:57 ]
どこかに#define FARと定義されているから、
プリプロセスが終われば消えてなくなる。



666 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:20:32 ]
いい時代になったもんだ。

667 名前:デフォルトの名無しさん [2008/04/01(火) 23:30:29 ]
コンストラクタを定義しようと思っているのですが
ClassA();
ClassA(int nSize);
と定義して、実体を書く時に

ClassA::ClassA(){
this->ClassA(1);
}

と言う具合に書きたいんですが
error C2273: '関数形式のキャスト' : '->' 演算子の右側で使用できません。
となって出来ません。
何とか、良い方法はありませんでしょうか?
ClassA(int nSize=1);
もあるとは思うのですが、指定した場合、もう少し細かくコードを書きたいのです。


668 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 23:35:07 ]
ほかのコンストラクタを呼ぶことは今のところ不可能だから、
privateな初期化関数を作ってそれを呼ぶのが常套手段。

669 名前:デフォルトの名無しさん [2008/04/08(火) 18:49:12 ]
nanosleepの使用例はどこかにありませんか?

670 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:20:53 ]
>>669
ありますが、何か。

671 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:24:11 ]
nanosleepの使用例なんて腐るほどあるわよ。ネットは広大ね。

って少佐が言ってた

672 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:28:06 ]
あんなの、man引けば使い方なんて一発だろうに。

673 名前:デフォルトの名無しさん [2008/04/09(水) 04:07:45 ]
うちのman nanosleepには使用例は載っていないな〜〜

674 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 06:39:06 ]
手取り足取り教えて貰わないと書けないんですか?

675 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 07:04:28 ]
www.google.co.jp/codesearch



676 名前:デフォルトの名無しさん [2008/04/09(水) 08:05:20 ]
Visual C++でnanosleepに当たるものを教えてください

677 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 08:59:32 ]
Sleep()
指定する時間単位と精度の違いに注意。

678 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 13:21:59 ]
質問。
ttp://www.be-interactive.org/index.php?itemid=57
にあるアクションスクリプトをC++で書き直してみたいんだけど、
辞書データのクラス化と初期化をどうやったらいいのか
分からなくて困ってます。
typedef struct { int x,y; } POINT;
class Stroke { vector<POINT> points; };
class DictItem { vector<Stroke> strokes; };
class Dictionary { vector<DictItem> items; };
と定義してはみたものの、どうデータを流し込んで
やればいいんでしょうか?
もしくはもっと効率的なクラス定義の方法があれば
教えてください。

679 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:09:12 ]
std::map使えばいいんじゃね

680 名前:デフォルトの名無しさん [2008/04/10(木) 17:44:25 ]
ダイナミックライブラリとスタティックライブラリの使い分けについて教えてください

681 名前:デフォルトの名無しさん [2008/04/10(木) 21:40:05 ]
>>680
C/C++の質問ではありませんのでスレ違いです。

682 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:44:04 ]
ポインタで複数の配列の連続的に扱うことはできますか?

int *p
int A[3] , B[3], C[3];
(p+0) = A;
(p+3) = B;
(p+6) = C;



683 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:47:57 ]
できません

684 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:52:33 ]
そういうコンテナ/イテレータを書くのも勉強になりそうではあるな

685 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:20:38 ]
>>682
unionで配列の位置を一纏めに固定すれば可能



686 名前:回答者も下級なのか、このスレは mailto:sage [2008/04/17(木) 08:15:36 ]
>>685
ほほぉ、unionでですか。具体例をどうぞ。

687 名前:デフォルトの名無しさん [2008/04/18(金) 00:02:31 ]
VisualC++2008でfopen_sやfopenしてもファイルを読み込んでくれません。
パスはあってるし、DOS窓で実行ファイルと読み込みたいファイルのあるディレクトリに移動してから実行してもダメでした。

fopen_s(&fp, "a.txt","r")
fp=fopen("a.txt","r")
という書き方で間違ってないと思うのですが…

原因としてはどんなことが考えられるんでしょうか?


688 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:31:47 ]
もしかして:
a.txt.txt

689 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:58:27 ]
もしかして:
VisualC++2008 【Express Edition】

690 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:02:10 ]
>>682

int p[9];
int* A=p+0, *B=p+3, *C=p+6;
A[0]=(以下略

じゃだめなん?

691 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:25:14 ]
>>689
そうです

692 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 02:54:00 ]
>>686
union {
struct {
int A[3],B[3],C[3];
};
int D[9];
} Array;

int *p = &( Array.A[0] );

こんな風に

693 名前:デフォルトの名無しさん [2008/04/22(火) 11:59:19 ]
intじゃなかったら使えないな

694 名前:デフォルトの名無しさん [2008/04/22(火) 17:51:28 ]
10進数を2進数に変換する方法教えてください

695 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:57:29 ]
2で割って少数以下切捨て、その時の余りをならべる。を繰り返す。



696 名前:デフォルトの名無しさん [2008/04/22(火) 18:16:54 ]
以下を実行して
a:0x8049e80 0x8049e80 0x8049e80
A:0x8049e80 0x8049e80 0x8049e80
11 12 13
4 5 6
0 0 0
のようになることを期待していますが11 12 13が1 2 3のままです。どのようにしたらよいか教えていただけると幸いです。
struct data{
double x[3],p[3],q,rm;
};
class Func{
public:
void func1(struct data []);
};
class SubFunc{
public:
void subfunc1(struct data []);
};
続く

697 名前:デフォルトの名無しさん [2008/04/22(火) 18:17:29 ]
続きです
int main(void)
{
static data P[3];
Func FC;
FC.func1(P);
for(int i=0;i<3;i++){
cout << P[i].x[0] <<" "<< P[i].x[1] <<" "<< P[i].x[2] << endl;
}
return 0;
}
void Func::func1(struct data A[]){
SubFunc SFC;
SFC.subfunc1(A);
A[0].x[0]=1.0;
A[0].x[1]=2.0;
A[0].x[2]=3.0;
cout <<"A:"<< &A[0].x[0] <<" "<< &A[0].x[0] <<" "<< &A[0].x[0] << endl;
}
void SubFunc::subfunc1(struct data a[]){
a[0].x[0]=11.0;
a[0].x[1]=12.0;
a[0].x[2]=13.0;
cout <<"a:"<< &a[0].x[0] <<" "<< &a[0].x[0] <<" "<< &a[0].x[0] << endl;
a[1].x[0]=4.0;
a[1].x[1]=5.0;
a[1].x[2]=6.0;
}


698 名前:デフォルトの名無しさん [2008/04/22(火) 18:27:36 ]
char a[] = "100";

って書くと これどういう意味になるの?

699 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:29:01 ]
>>698
a[0]='1' a[1]='0' a[2]='0' a[3]='\0'

700 名前:デフォルトの名無しさん [2008/04/22(火) 18:34:43 ]
>>699
さんきゅ!

701 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:36:19 ]
>>696
SFC.subfunc1(A); 
A[0].x[0]=1.0; 
A[0].x[1]=2.0; 
A[0].x[2]=3.0; 

SFC.subfunc1()呼んで11 12 13入れても、その後上書きしてるじゃん



702 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:55:07 ]
>>701
おっしゃるとおりです。ありがとうございました。

703 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:03:54 ]
コンパイラとリンカのバージョンってどうやって調べるか分かりますか?
ちなみに、使っている環境(って言うのかな?)はCPad for Borland C++Compilerってやつです
あんまり難しい専門用語は分からないんで、初級者でもわかるように教えてくれるとうれしいです

704 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:07:11 ]
無料版の BCC のバージョンは 5.5 しか存在しない。

705 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:34:27 ]
>>704
それはリンカのこと?それともコンパイラのことですか?
超下級者だから全然わからん



706 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:35:44 ]
ちっとも保守される様子がないbccなんかそろそろやめて
mingwやvcのexpress editionにすればいいのに。

707 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:39:43 ]
-v

708 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 02:19:31 ]
>>704
修正版の5.5.1がある。

709 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 10:33:03 ]
>>694-695
整数は割っても少数にならないし、小数は扱いにくいから
↓のを繰り返す。

x % 2 //2進数の一桁目がこれででる。
x /= 2 //一桁目を取り出したらずらす。



710 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 10:47:35 ]
x & 1
x =>> 1

711 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:42:59 ]
1, 2, 4, 8, 16, 32, ... とビット数の数だけ論理和とればいいだけじゃん

712 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:57:14 ]

ごめん。
>>709はマイナスのとき使えな・・くもないか。


713 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:56:29 ]
まず10進数の定義からだな。


714 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:44:04 ]
定義厨もここまできたか

715 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 09:16:09 ]
パックドBCDかもしれんし、ASCZかもしれん。



716 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 17:33:03 ]
#include <stdio.h>
struct histgram{
int x;
int y[100];
};
void one(struct histgram *hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist[1] ;
int z;
hist->x = 0;
for(z=0;z<100;z++){
hist->y[z]=0;
}
printf("before***%d***%d***%d***",hist->x,hist->y[0],hist->y[50]);
one(hist);
printf("before***%s***%s***%s***",hist->x,hist->y[0],hist->y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void one(struct histgram *hist)
{
two(hist);
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;}}
これで実行するとメモリのエラーが出るんですが、どうすれば解決するでしょうか

717 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 17:50:14 ]
>>716
2つめのprintfは、%sじゃなくて%dを使うべし。

718 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:50:09 ]
×for(z=0;z<9999999999;z++);
○getchar();

719 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 06:03:23 ]
それ以前に hist->x は hist[0].x じゃないのか?

720 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 06:44:04 ]
どっちでもいいんじゃね?

721 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:10:46 ]
ボーランドでコンパイルしたのですが、
E2293 linearEq5.c 4:)が必要
って出ます。
#include<stdio.h>
#include<math.h>
#define MAX_DATA 1000//データ点まで想定
void read_data(double x[],double y[],int &order ,int &data_number)// データファイルの読み込み
{
FILE* ifp;
char ifile[20];
printf("Input the file name of input data:");
scanf("%s",ifile);
printf("何次近似にしますか?:");
fscanf(ifp,"%d",&order);
printf("Input a data number:");
fscanf(ifp,"%d",&data_number);

if((ifp=fopen(ifile,"rt"))==NULL){
fprintf("Can't open input file \"%s\"\n",ifile);
}
途中までです。
一様、visualではこのエラー表示は出ません。
どうしたらいいか教えてください。

722 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:22:34 ]
>>721
Cには参照はありません。visualとやらでエラーが出なかったとすれば、C++としてコンパイルしたのでしょう。

723 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 03:47:57 ]
>>722
参照って何ですか?

724 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 09:34:34 ]
>>723
int &

725 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:32:59 ]
>>724
ありがとうございます



726 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:59:47 ]
”プロセスにマッピングされている”というのは具体的には
ヘッダのインポートセクションとかにアドレスが格納されている、という意味ですか?

727 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:06:35 ]
いいえ。

728 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:09:06 ]
ではどういう意味ですか?

729 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:17:01 ]
そのキーワードで検索すれば判る通り、状況によって意味することが違うので単純には答えられません。

730 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 01:25:27 ]
>>726
タグ打ってくれなきゃ元レスがわかんね


731 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:15:18 ]
c/c++ランタイムってもしかして
c/c++じゃなくてもプロセス起動時にロードされてる?

732 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:18:50 ]
そのプロセスのコードの一部がC/C++で書かれてるならロードされる場合もある。
.dllや.soなら他のプロセスが呼び出してるかもしれん。

733 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:26:56 ]
環境:vc2007
言語:c++

argcに間違ったパスを入れてしまいました。
そのあと何度動かしても、動かした瞬間にargcに間違ったパスが入り
プログラム'******'を開始できません。指定したファイルがみつかりません

というエラーが出ます。

どうやったら、このエラーは出なくなるでしょうか

734 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:13:51 ]
>>733
argcはコマンドライン引数の数。パスなど入らない。
プロジェクトのプロパティのデバッグの動作のコマンドに間違ったものが入ってるとそうなる。

735 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:53:16 ]
>>733
argv にも入れてみるとか……



736 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 07:33:05 ]
>>733
プロジェクトのデバッグのタブの引数の項と間違えて、実行するプログラムのパスを書き換えたんじゃないのか?とか言ってみる。

737 名前:733 mailto:sage [2008/05/25(日) 11:26:10 ]
解決しました。ありがとうございます。

738 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 19:04:50 ]
Visual Studio 2008 Express で VC++の勉強をはじめたばかりの超初心者です。

gcnewを用いてインスタンスを生成し、"->"を使用してメンバ関数を呼び出すと、メンバ関数からメンバ変数をアクセスできません。
ご回答のほど、よろしくお願いします。

739 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 22:46:16 ]
ref class A

740 名前:738 mailto:sage [2008/05/25(日) 23:42:33 ]
>>739
ref にしてるんですが、ref じゃだめってことですか?!

741 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:28:28 ]
C++/CLIではじめるならC++かC#のどちらかで始めたほうが楽じゃないかな。


742 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:28:52 ]
>>738
それだけじゃなんとも答えようがない。ここだとスレ違い気味だし、
コードを付けてこっちで聞きなおしてみたらいい。

C++/CLI part3
pc11.2ch.net/test/read.cgi/tech/1206447234/l50

743 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 15:58:07 ]
C/C++言語でプログラムを書いたら、
必ずC/C++ランタイムは使われていますか?

C/C++以外の言語で、C/C++ランタイムを使用している言語はありますか?

744 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 17:49:30 ]
まったく使わないこともできるな。


745 名前:743 mailto:sage [2008/05/29(木) 20:36:21 ]
C/C++で書いたプログラムはmain関数の前に
C/C++ランタイムのスタートアップルーチンが呼ばれるそうですが、
まったく使わない事も出来る、とはつまり
main関数の前にスタートアップルーチンを呼ばない事が出来るということでしょうか?



746 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:47:15 ]
空の同名のスタートアップルーチンを自作してリンクすればできるだろ

747 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 22:32:17 ]
>>745
フリースタンディング環境とか

748 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 22:51:56 ]
>>745
書ける。組み込みなんか自分で書いたりするゾ

749 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:18:16 ]
ファイルからN(定数)個のスペースで区切られた値を読み込むのに
while(fgets(str,512,fp)){
sscanf(str, "%d %d %d …, %d",
&input[0][ct], &input[1][ct], &input[2][ct], …, &input[N][ct]);
ct++;
}
とやっているのですが、Nを変数にしたい場合、どういう風にすればいいんでしょうか?



750 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:46:39 ]
>>749
C++ なら問題ない。

751 名前:デフォルトの名無しさん [2008/06/06(金) 01:24:08 ]
難しいね、C++って、、、、

752 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 17:22:05 ]
vector t;
をモジュールに引数として渡す方法を教えてください。もう3年も悩んでます。

753 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 18:57:23 ]
>>749
C++ならvectorでできる。C99なら可変長配列でそのままできる。C89だとmalloc()で確保するしかない。
入力自体は、いずれにしてもループで回すしかない。

754 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 18:58:00 ]
>>752
何をしたくて、3年間も何を無駄に調べたのか教えてください。

755 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:22:29 ]
>>752
多分調べればわかると思う。



756 名前:デフォルトの名無しさん [2008/06/07(土) 23:03:18 ]
なんで .cpp と .h に分けるの?
h に全部書いちゃいけないの?

(javaって1ファイルだよね?)

757 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:08:17 ]
コンパイル激遅でいいならやればw

758 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:23:32 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6829.txt

データ対の大小比較を行った回数を計算し出力するプログラムなのですが
while(1){
count++
while(d[++i]<key)
count++;
count++
while(d[--j]>key
count++;
この部分は
これで合ってるのでしょうか?


759 名前:デフォルトの名無しさん [2008/06/08(日) 00:35:08 ]
>>757

遅くなるの?

それは知らなかった。

Boostってhppだよね?
あれ、遅いのに採用してるの?

760 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:38:27 ]
>>759
インクルードってどういうものか分かってる?
ファイルの中身を合成するものなんだよ?
全てのコードをヘッダファイルに書いて
main のある .cpp でそれを全部インクルードしたとすると、
それら全てのファイルの中身を合成したファイルを
毎回コンパイルすることになるんだぜ。
そのファイルの中の1カ所を変更しただけでな。

761 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:40:13 ]
>>759
boost 全部を一気に使う訳じゃないだろ。
まあ、boost 使うとそれなりにコンパイル遅くなるけど。
そのためのプリコンパイル済みヘッダファイルだな。

762 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:42:53 ]
>>760

ただの宣言をするものと思ってた。

>>761

確かに、一気には使わないね。


ありがとう。

763 名前:デフォルトの名無しさん [2008/06/08(日) 00:44:28 ]
質問です。
if(整数型)  ってやったときに
数字が0だと偽、符号が正だと真と聞いたのですが
ゼロ以下だとどっちになりますか?

764 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:45:25 ]
>>759
Boostの場合はテンプレート使っていてヘッダに書かざるを得ないという事情がある。
もちろん、ライブラリのリンクという面倒事を回避できるという点も影響を及ぼしているとは思う。
要LIBのものでも必要最低限しかLIBに入れていない。

765 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:02:37 ]
>>763
その説明はおかしい
0が偽で0以外が真

っていうかif(-1)とでもやって試せばどうかね



766 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:54:36 ]
自分で試してあやふやな結果を得るくらいならここで質問して確実な回答を求めます。

767 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:02:47 ]
規格票をおよみください

768 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:06:57 ]
規格以前の問題。
まともな C++ の本読め。

769 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 06:58:45 ]
まともなC++の本かどうかを判断するには知識が・・・

770 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:51:07 ]
卵が先か鶏が先か。

771 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:57:06 ]
代理出産だー

772 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:56:17 ]

本ならここで聞け

ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/

773 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:08:28 ]
ここでの回答なら確実だと思ってるのかな。

774 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:09:44 ]
if(-1) (-1に限らず負の数)くらいを試せないのはちょっとしんどいな。
いくらでも試す方法はあるだろうに・・・

775 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 02:57:06 ]
C++だと環境に依存するコードが多くてバグるからCで書け
といわれたんですがC++特有で環境に著しく依存する物って何でしょう
仮想関数や継承の挙動が大きく変わるとは考えにくいんですが。



776 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 09:40:29 ]
>>775
言ったやつに聞いてくれよ。

777 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 11:43:49 ]
>>776
いったやつが理由を知らないんだよ。
知ったかぶりだよ。


778 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:31:53 ]
>>775
例外処理とか、標準ライブラリの実装とか、の話かな?

いずれにしても挙動が変わることはさすがにないでしょ。
もちろん規格に沿った範囲内の話で、未定義動作を利用した
コードなんかについては知ったこっちゃ無いけど。

779 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 13:07:23 ]
ども。やはりそんなものですよね…
上司が自信満々に断言するので突込んで聞けなかったんです

780 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 16:17:23 ]
vector<Hoge>::const_iterator iter = hoge.begin();
(*iter).name

で、なんでアスタリスクが必要なの?

781 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 16:41:34 ]
iter は const_iterator であって Hoge ではないから
iter.name という表記は const_iterator のメンバ name を参照しようとしているのであって、Hoge の name を見ているのではない
iter->name ならおk

782 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 16:48:02 ]
>>781

ポインタと同じように考えればいいのなか?

783 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 17:36:46 ]
>>782
うん

784 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 18:27:12 ]
>>783

アリガd

785 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 18:37:41 ]
イテレータはポインタを模したクラスのことだからな。



786 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:20:01 ]
いい野中

787 名前:デフォルトの名無しさん mailto:age [2008/06/09(月) 23:16:16 ]
配列の要素に-1を指定した時の挙動について教えてください

char a;
char b[10];

と宣言しておいて、b[-1]を指定したら、aを意味していることになりますか?

788 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 23:17:31 ]
なるはずがありません

789 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 23:17:37 ]
>>787
なりません。未定義動作になります。

790 名前:787 mailto:sage [2008/06/09(月) 23:26:09 ]
FreeType2という、フォントレンダラのソースを読んでいたら
配列の添字に-1を指定している箇所があり、気になって質問しました
このソフトはC言語で書かれています。
やはりこれはイレギュラーな使い方なんですね

791 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 23:36:26 ]
ほんとに配列として宣言されてた?
mallocで確保したアドレスに+1したものを配列として使ってたりしない?

792 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 02:07:48 ]
メンバ変数の場合は宣言順にメモリに置かれることが保証されてるので、
あとはアラインメントに関して処理系独自の定義が行われていれば
その処理系では保証されるね。

793 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 02:34:15 ]
>>792
されません。配列の添え字演算(ポインタ演算)で配列の範囲外にアクセスしたら未定義動作です。

794 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 02:43:51 ]
未定義動作を発生させるコードについて、ある処理系が特定の挙動を保証することがあっても構わない。

795 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 04:40:52 ]
[-1]だけではそれが間違ってるとは言い切れない。
char a[10], *p
p = a + 1;
とすれば
p[-1] == a[0]
であり、そこにアクセスするのは何の問題もない。



796 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:05:10 ]
enumは変数宣言出来るけど
enum変数自体 int型で特に特別な変数ではないし
他の変数で代用可能だから活用法が思いつかない

どういった活用法があるのですか?

797 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:25:06 ]
たしかに定数宣言+typedef程度の意味しかないけど、
C++なら多重定義できるのが便利と言えば便利、特にストリーム入出力。

これも主にC++のことだけど、クラス内で定数宣言するのにも使った。
static constのおかげでこの用途からは退き気味だけど。

798 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:13:14 ]
>>796
数値に特別な意味がない場合に、シンボル(名前)で記述できた方が判り易いことがしばしばあるから。
古いCだとdefineマクロしか選択肢がなかったのでデバッグ時に苦労したけれど、
enumならデバッガにシンボル情報をくれてやりさえすればシンボルのまま扱えるわけだ。

799 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:35:23 ]
>>796
信号機を作るときに
enum state {
 green = 0,
 yellow,
 red,
};
と状態を宣言しておけば便利ジャン。
黄色の次は紫に変わるようにしろ、と言われたときでもyellowの次の行にpurpleを足せばいい。
static constだとredの値も変更しなくちゃならない。

800 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:11:52 ]
つまり
if (yello)
とかしとけば数値を気にしないで便利

801 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:25:29 ]
>>799-800
そこは理解済みです、言われている通り
#defineやconstよりはるかに便利だと思います

>>796で質問したことをコードにすると

enum タグ名 {
名前1,名前2,・・・
} 変数宣言

とした場合、宣言した変数の活用方について教えて下さい、という意味です
説明が簡単過ぎてうまく伝わっていなくて申し訳ないです

stractならデータ管理が目的なので利用法が思いつくのですが
enumの方は使いどころがいまいちピンときません

802 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:29:34 ]
enumシンボルのことでなく、enum型変数ってことか?
>797とか。後は、例えばenum state conditionとか宣言しておけば
condition変数にはenum stateのシンボルしか入れない積りであることが明確になる。
コンパイラによっては、switch (condition)したときにシンボルの抜けがないかもチェックしてくれる。

803 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 01:07:53 ]
>>801
>>2-3

804 名前:デフォルトの名無しさん [2008/06/13(金) 21:40:38 ]
>>801
構造体の場合
typedef struct{
int a;
double b;
}HOGE;
みたいに変数宣言するんじゃなくHOGE型として宣言しといたほうが
typedefせずグローバルで変数宣言すると何かとふべんだから
typedefして使うところで変数宣言したほうが良い

enumなら下記みたいに宣言したりする。
typedef enum {FALSE = 0,TRUE = 1} BOOL;

805 名前:誰か一緒に考えてください [2008/06/13(金) 22:37:30 ]
もしプロトコルを開発するならどんなプロトコルにしますか??





806 名前:デフォルトの名無しさん [2008/06/13(金) 22:49:23 ]
>>805
漠然としすぎ

807 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 09:59:08 ]
>>805
>もしプロトコルを開発するならどんなプロトコルにしますか??
既存のプロトコルを利用できないか、再検討する。

808 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:32:10 ]
enum の話で考えたんだけど、
enum のすべてのメンバがそのスコープで有効になるのは勘弁してほしい。
メンバが多いと名前が衝突する可能性が高くなるし、
enum Style { None, A, B }; enum ExStyle { None, C, D };
みたいに同じ名前を使えないのは痛い。

仕方ないから、
namespace Style { enum Style { None, A, B }; } namespace ExStyle { enum ExStyle { None, C, D }; }
とか宣言して、
Style::Style style = Style::None; みたいに使ってる(非標準だけど VC++ は一応通してくれる)。

俺は本質的に enum の使い方を間違えてるんだろうか?
>>802 の言うように、特定の値しか入れない場合とかに使ってるんだが。

809 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:41:17 ]
>>808
class内に置く方法もあるぞ。


810 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 17:02:09 ]
>>809
なるほど。
class Style
{
public:
enum _Style { None, A, B };
private:
_Style value;

public:
Style() : value(None) { }
Style(_Style value) : value(value) { }
Style(const Style &style) : value(style.value) { }

bool operator ==(const Style &style) { return value == style.value; }
bool operator !=(const Style &style) { return value != style.value; }
operator int() { return (int)value; }
};
みたいにすれば Java, C# の列挙型と同じように扱えるわけか。switch にも入るし。
しかも #define とかうまく使えばこれを毎回書かなくても使い回せそうだ。
すばらしい一言アドバイスをありがとう。

・・・もしかして常識ですか?

811 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:48:18 ]
残念ながら

812 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 00:40:33 ]
あの、>>808ってどこが非標準なんですか?
名前空間と列挙型が同一の名前を持っていることでしょうか。

813 名前:808 mailto:sage [2008/06/16(月) 00:05:50 ]
>>812
VC++ では

>コンパイラの警告 (レベル 1) C4482
>エラー メッセージ
>非標準の拡張機能が使用されています: enum 'enum' が限定名で使用されます

>型の中の列挙型を参照するときは、列挙型の名前を指定する必要はありません。

だと。(型名)::(列挙子名) とするのは非標準らしい。

よく考えたら

#define enum_class(Type) \
class Type\
{\
private :\
int value;\
public :\
Type() : value(0) { }\
Type(int value) : value(value) { }\
operator int() const { return value; }\
operator int &() { return value; }\
enum Tag;\
};\
enum Type::Tag

とかすればほとんど C# ライクな列挙型もどきができるな。
これも非標準だし、列挙型みたいにする意義も薄れてるが。

814 名前:デフォルトの名無しさん [2008/06/16(月) 22:51:16 ]
C/C++のばかたれっ!!

あー すっきり!!

もやっとボール 100000000個くれ!!


815 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:53:38 ]
>>813
それは >808 の namespace を使った例に対して Style::Style::None とした場合の警告じゃないか?
Style::None なら最初の Style は namespace 名だから、その警告には該当しないだろ。



816 名前:デフォルトの名無しさん [2008/06/17(火) 11:02:38 ]
すまぬがちょいと質問。

下記のような構造体の中に構造体の中に構造体が入ってるような形にしてるんだが、
矢印の所でエラーで止まるんだ。
ちなみに「struct FGroup *fGroup」は空のまま。(初期化も何もせず)
ほんまに原因不明なんだぜ・・・
デバッグ出来ない環境だから、エラーの原因は不明なのよおおお

// h
struct FGroup {
char strKey[40];
};
struct AInfoGroup {
struct FGroup* srcfn[10];
};
struct MatchingResultGroup {
struct AInfoGroup* aig[6];
};

// cpp
struct MResultGroup *res;
〜中略 resに色々格納〜
struct AInfoGroup *aiGroup = res->aig[0];
for(int j = 0; j < 9; j++) {
  struct FGroup *fGroup = (*aiGroup).srcfn[j];
  if((*fGroup).strKey != NULL) {
    char tmp[40];
    strcpy(tmp, (*fGroup).strKey);  ←ココでエラー
  }
}

817 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 11:08:24 ]
>>816
エラーメッセージぐらい貼れ。
人に原因を調べて欲しいならソースを略すな。

↓これ見ただけでポインタをよく理解していないというのがわかる。
> if((*fGroup).strKey != NULL) {
入門サイトをよく読みなおしたほうがいいかもしれない。

818 名前:デフォルトの名無しさん [2008/06/17(火) 11:18:02 ]
エラーメッセージですか。

MinGW Developer Studio にてソース作成して
VC++にてDLL連携してしているので下記のようにしか表示されません。。。

ハンドルされていない例外はACMatch.exe(MSVCRT.DLL)にあります: 0xC0000005: Access Violation。
例外処理 (初回) は ACMatch.exe (MSVCRT.DLL) にあります: 0xC0000005: Access Violation。
プログラム 'ACMatch.exe' はコード 0 (0x0) で終了しました。

>if((*fGroup).strKey != NULL) {
これは策がもうなくて、ものは試しにでやってみたのを削除し忘れていました。。。

819 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 11:22:13 ]
>>816
>デバッグ出来ない環境だから、エラーの原因は不明なのよおおお
それでプログラミングしようってのが無謀。

820 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 12:03:38 ]
中略部分を晒すつもりが無いなら、終了。

821 名前:816 [2008/06/17(火) 12:53:33 ]
>>819
無謀なのは承知です。printfにてエラー発生箇所は分かるのですが
原因を特定する為のデバッグのみが出来ない状況ですので
それで納得し、何とかやっております。

>>820
記述通り「struct FGroup」はヘッダでの宣言のみにて
中略部分ではstruct FGroupへの格納どころか、
struct FGroupの要素のstrKeyが一切記述されていなかったので中略していました。
それでも晒した方がよろしいでしょうか?

822 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 12:59:16 ]
>>821
相談したいなら晒したほうがいい。

でも、 strKey に値が設定されて無いなら strcpy でぶっ飛ぶのはあたりまえ。

823 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:02:48 ]
>>815
ごめん、確かに (名前空間名)::(列挙子名) は問題ないわ
どっかで Style::Style::None みたいなことしたから警告でたんだろうな
>>808 そのものは非標準ではありませんでした。
(>>813 の「列挙型の前方宣言」は非標準のはず)

824 名前:816 mailto:sage [2008/06/17(火) 13:07:13 ]
C言語はjavaのように自分で初期化しなくても
初期化されいてるとどこかで読んだ記憶があったので、
strcpyにて複写しても大丈夫かと思ってたのですが、、、駄目だったのですか?

825 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:11:13 ]
>>824
記憶があるのならどこで読んだか思い出して内容を確認してくれ。
たぶん間違いだから、 Web 上の記事なら晒して欲しい。

C言語で自動初期化(ゼロ初期化)が入るのは非ローカル変数かローカルで static な変数のみ。



826 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:36:19 ]
printf分でデバッグウィンドウに情報出力とか可能ですか?



827 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:49:18 ]
OutputDebugString関数

828 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:49:36 ]
>>816
MResultGroupってMatchingResultGroupのtypedefか?
resに色々格納って言ってるけど、MResultGroupのインスタンスはちゃんと確保されてるのか?
fGroup自体が0(NULLはC++では使わない方が良い)だったりしないか?
今回のエラーには関係ないけど、j < 9 は合ってるのか?j < 10じゃねーか?

829 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 12:44:12 ]
数分前まではちゃんと動いてたのに、
急にこんなエラーを吐き出しました。
開発ソフト:BCC Developer
状況:コンパイラもデバッカもライブラリも誤字脱字共に無い、
エラーの内容:
> C:\borland\bcc55\Bin\make.exe -fDebug\dxtest.mak -B TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -nDebug -I..\DxLib -c C:\puroguram\dxtest\test.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\puroguram\dxtest\test.cpp:
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -eDebug\dxtest.exe Debug\test.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Could not open Debug\dxtest.exe (program still running?)
** error 1 ** deleting Debug\dxtest.exe
Build End !! (Elapsed time 0:07.578)

書いた物:
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ;//画像を表示する関数
WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数
return 0 ;
}

830 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 12:52:11 ]
>>829
エラーメッセージをよく読め。アドバイスしてくれてるじゃないか。

831 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:19:50 ]
>>830
もう一度よく調べてくる

832 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:35:52 ]
program still running?
program still running?
program still running?
program still running?
program still running?

833 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:11 ]
program still running? 訳(プログラム・動かない・見出し)

って意味であってる?

834 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:53:05 ]
つまらん

835 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:02:45 ]
ちゃんと辞書を引こう



836 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:06:46 ]
program still running? (訳:あなたは気が付いていないけれど プログラムは静かに動き続けているだろう。 私にその健気なプログラムを殺してしまえというのか?)

837 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 17:27:22 ]
はい、もちろん幸福です、親愛なるコンピュータ。

838 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:51:51 ]
c++で

for(int n=0;n<1;n++)
func();
for(n=0;n<1;n++)
func();

みたいなfor()の括弧内での変数の宣言のスコープって括弧内とそのforループ内に限定されますよね。
これって昔のバージョンだとforのブロック内でも有効だったりしました?(下のforでも有効だった?)

839 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:09:24 ]
>>838
C++ の仕様決定以前に先走り実装されたコンパイラはそうなってたりする。
MS VC++ 6.0 とか。

840 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 18:13:03 ]
C++でC#同様にインテリセンスを働かせる方法ってないですか?
いちいちALT→押すのが面倒です。

841 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 19:44:33 ]
何を使ってるかわからんもん

842 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 20:20:19 ]
プリコンパイル済みヘッダを複数指定することは出来ますか?

843 名前:デフォルトの名無しさん [2008/07/16(水) 15:14:24 ]
#ifdef XXX


#endif
で囲まれた部分がコンパイルされたかをコンパイル時に簡単に知る方法を教えてください


844 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 15:15:06 ]
>>843
#ifdefと#endifの間に#errorと書く

845 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 15:23:22 ]
>>843
XXX_defined とか XXX_undefined ってグローバル変数を定義しておいて
オブジェクの中に該当シンボルが存在するか否かを調べる
もしくは
コンパイラにアセンブラソース吐かして眺めてみる
もしくは
出来上がったオブジェクトファイルの逆アセンブルリストを眺める




846 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 15:24:08 ]
>>845 すまんコンパイル時っての見てなかった。忘れてくれ


847 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 07:56:37 ]
#errorだとそこでコンパイルが終了してしまうかも。
実害のない警告が出るようにしておけばいい。たとえば
#ifdef XXX
#define XXX_DEFINED 0
#define XXX_DEFINED 1
...
#endif

848 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 08:45:39 ]
うわー、意味ねーw

849 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:42:29 ]
std::tr1::unordered_mapを使わないといけないんですが現在の環境(gcc3)には入っていません。
これはどのライブラリに入っていますか?

850 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:49:10 ]
>>849
STLport かな?

851 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:27:51 ]
>>850
STLportにありました。ありがとうございます。

852 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:30:06 ]
>>849
std::map じゃなくて unordered_map を「使わないといけない」状況って、どんなの?

853 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:47:57 ]
>>852
ビルドしようとしたソフトがunordered_mapを使っていたからですよ。

854 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 18:42:45 ]
vc++のデバッグの仕方が分からないんだけど
c#のconsole.writelineみたいにvcのデバッガに出力する方法ってないの?
outputdebugstring()とかやっても出てこないんだけど。

855 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:52:35 ]
>>854
出てるよ、見てるとこが違うだけだ



856 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 08:24:23 ]
>>854
MFCを使ってるならTRACEマクロ
ATLを使ってるならATLTRACEマクロ
WIN32APIだけならOutputDebugStringをじかに使う。
C++・CLIならC#と同じのが使える。

857 名前:デフォルトの名無しさん [2008/07/24(木) 17:21:59 ]
最近勉強始めた初心者です。すっげー初歩の質問で悪いんですけど、
関数の宣言のとこで、引き値とか戻り値とかそれ自体の説明は
分かるんですけど、その使い分けの所がいまいちピンとこなくて。

例えばint main(void)とintとかその辺自体は分かるんですけど、
返り値が無いならvoidとかの説明で、じゃあなんで
このときはvoid使わないんだとか、自分が一からプログラム組むと仮定して考えた場合、
その辺の区分けと言うか、使い分けが明瞭に納得がいかなくて。
いろんな解説読み漁ったんですけど、はっきり分かんなくて。

858 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 17:57:48 ]
>>857
引数は渡すもの、戻り値は返すもの。
渡すパラメータがなければ引数はvoid、返す結果がなければ戻り値はvoid、両方何もなければ両方void。

自分で1からプログラムを組む場合、関数がどのようなパラメータを取ってどのような結果を返すかは、自分の都合と独断と偏見で勝手に決める。
例えば・・・ファイルに文字列を書き込む関数を作ることにしたとすると、その関数にはたぶんファイル名と書き込む文字列を指定する必要があるだろう。
ファイル名が固定なら、書き込む文字列だけ指定すればいいかもしれない。
結果は特に何も要らないかもしれないし、書き込みに成功したか失敗したか知りたいかもしれない。
それは自分が (別の人が使う関数なら、その人が) どういった機能を必要としているかによって決める。

フルバージョンならたぶんこんな感じ
int write_text_to_file(const char *filename, const char *text);
成功/失敗といった結果は別に要らないと思ったなら、戻り値はvoidにして
void write_text_to_file(const char *filename, const char *text);
ファイル名は固定なので特に指定する必要はないと考えるなら、その部分は削って
void write_text_to_file(const char *text);
実は文字列も固定なんだ、って場合は、何も指定するものがないので
void write_text_to_file(void);

859 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 01:22:48 ]
自分は引数voidの関数は滅多に作らないな。
グローバル変数使えば引数で渡さなくてもいいけど、
何をする関数なのかわかりにくくなるし。

860 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 02:23:01 ]
渡す情報が要らないからvoidなんですよ。

861 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 08:54:19 ]
そうそう、time()なんて愚の骨頂ですよ。

862 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:38:10 ]
渡すものがなかったら、かわいい君に寄せる想いを僕調の曲にして渡せばいいじゃない。


863 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 11:15:13 ]
>>862
華麗にスルーされる訳ですね。わかります。

864 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:19:58 ]
cin を使った入力ってメモリからあふれる位いっぱい入力した場合
バッファアンダーランとかになったりするの?

865 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 12:47:37 ]
なりません。そもそも、バッファアンダーランなんて現象自体、データストレージに関するものです。



866 名前:デフォルトの名無しさん [2008/08/03(日) 13:30:11 ]
Access Violationが出ているのですが、
 これはそのプロセスが確保していないメモリ空間から読み込もうと
したときに出るのですが?

867 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 13:38:36 ]
確保してない領域に書き込もうとしたときも出るし
確保されてても読み取り専用領域に書き込もうとしたときも出る

868 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 17:05:21 ]
>>866
そんなもん、環境によって違います。そもそも出ない環境だってたくさんあります。

869 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 17:07:36 ]
いつのまにかスタック領域がプログラムやデータを侵蝕して暴走を引き起こしていたあの頃を思い出します。
comファイルって、プログラムと同一セグメント内にスタック領域を確保するから、
プログラムとデータが大きいとすぐに侵蝕しちゃうんだよね。

870 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 10:51:08 ]
gccを使いたいんだけど、どれをインストールすればいいの?
日本語バージョンてないの?

871 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 10:58:38 ]
>>870
Linuxならデフォルトで入ってる
WindowsならMinGWをインストールする
Macなら知らない

872 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 10:59:39 ]
BSD/Solarisなどの*nix系なら標準で入ってる可能性が高い。

873 名前:870 mailto:sage [2008/08/04(月) 11:04:59 ]
レスどうもです。
OSを書き忘れてましたが、WinXPです。
GCCにはいろいろ亜種があるということかな?
どれが標準てこともないの?

874 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 11:13:40 ]
>>873
MinGWはあくまでgccを簡単にインストールするためのパッケージ。
gccであることに変わりはない。
gccのバージョン違いはたくさんあるね。3.4とか4.1とか。

875 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 11:18:14 ]
>>873
擬似Unix環境ごとインストールするならcygwinという選択もある。



876 名前:870 mailto:sage [2008/08/04(月) 11:38:46 ]
重ね重ね、どうもです。
MSYSなるものもありますね。
プログラミング目的ならMinGWとMSYSでいいのかな。

877 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 11:50:12 ]
これでMinGWとMSYSで作るものが単純なテキスト処理だったり数値処理だったりしたら大笑いだな。

878 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 13:13:21 ]
MSYSって日本語表示できないんだけど、どうにかならない?

879 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 16:36:01 ]
rxvt の引数を変えて、日本語フォントにすればいいのでは

880 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 20:48:53 ]
>>879
さんくす、やってみるよ。

881 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 21:21:24 ]
経過報告
MSゴシックだとうまく表示されなかった。
ぐぐってみてTerminal-14にしてみたけど、やっぱりうまく表示されなかた。

試したコマンド: ls /c/winnt
MSYS 1.0.10
rxvt 2.7.2

export LANG=ja_JP.Shift_jis とかやってもダメだった。
どうも根本的に何かを間違えてるのかなあ。
ま、いっか。

882 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 22:27:35 ]
>>881
-fn "MS ゴシック"-12

ls --show-control-chars /c/winnt

確認したら、LF改行コードのファイル~/.profile に
alias ls='ls --show-control-chars' を追加しておく

883 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 12:56:29 ]
>>882
ありがとう。
でも、俺の環境じゃ
ls --show-control-chars /c/winnt だと半角カナ混じりで化けた。

こんな具合いに: "ほげほげ.txt" → "・ル・ー・・ル・ー・.txt"

御協力感謝。


884 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 01:47:00 ]
rxvt使わないで、コマンドプロンプト上でmsys使うと良いよ。
cygtermみたいなのがmsysにあるともっといいんだけど。

885 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 02:30:38 ]
OS:Windows、コンパイラー:VC2005です。
CPUのクロック数を変化させる、もっとも簡単なコードを教えてください。



886 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:18:33 ]
int main(void){ while(1) {} }

対応CPUならこれでクロック上がる

887 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:59:32 ]
>>886
そうか、その手があったか!

888 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 09:27:45 ]
感動した

889 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 09:33:46 ]
クロックが上がるっつーか、CPUが音を上げそうだな。

890 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:49:00 ]
最近のだとスレッドで何本かまわさないとね

891 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:53:51 ]
最近のは他のコアが休んでるときはクロックあがるんだぜ

892 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:58:43 ]
なるほど!コロンブスのたまごですね。
クロックダウンのコード聞いたのですが・・・

893 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 03:01:06 ]
#include <stdio.h>
void main(void) { char i[256]; FILE* fp=fopen("C:\con\con","rb"); fread(&i, 1, 256, fp); fclose(fp); }

対応OSならこれでクロック下がる

894 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:27:50 ]
C++で
char* を バイト配列に変換するにはどうすればよいのでしょうか。
ちなみにchar*の中身は日本語文字列です。

895 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:44:54 ]
char*の中身はすでにバイト配列です
変換する必要はありません



896 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:46:39 ]
>>895
char配列とbyte配列はちがうような、、、

897 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:52:54 ]
charは1バイトの整数
charの配列は1バイト整数の配列すなわちバイト配列
何が違うというのか

898 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:54:40 ]
byteなんて型はないから
大概charをtypedefしたものなんじゃない?

899 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:12:14 ]
一応言っておくが、もしC#やJavaからやってきたというのなら、
それらの言語のcharに相当するC++の型はwchar_tだ。
wchar_t配列と(それらの言語でのバイト配列に相当する)char配列との変換には
mbstowcs, wcstombs関数がまあまあ手軽に使える。
もちろんwchar_tの入出力で間に変換が噛まされるのはC++でも同じだ。

900 名前:デフォルトの名無しさん [2008/08/13(水) 23:56:04 ]
C言語のマクロについて質問です、詳しい方助言ください。

__mulk(4) と記述することで、
"movl 4(%ebx),%eax \n"
という文字列( " "も含む)を吐き出すマクロを作りたいのですが、
次のように考えた結果これはうまくいきませんでした。

#define LTR(STR) #STR
#define COMMA ,

#define __mulk(A) LTR(movl A ## (%ebx) ## COMMA ## %%eax \n)

カンマをそのまま書いてしまうとマクロ__mulkが2つの引数を持っていると解釈されてしまうようです。

この回避方法はあるのでしょうか?環境はLinux,gcc 4.3.1です。

901 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:10:54 ]
#define __mulk(A) "movl " #A "(%ebx),%eax \n"

902 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 01:19:16 ]
>>901
なるほど・・・すばらしい。
どうもありがとうございました。

903 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:49:38 ]
プログラム実行時に引数を何も入力しなかった場合に、デフォルト引数を使いたいのですが、
どうもnullが入ってしまっていて、デフォルト引数が使えません。

どうすれば、デフォルト引数を使えるようになるか、教えていただけませんでしょうか。。。

int main (int argc,char *argv[])
{

  abc(argv[1]);
・・・・・


void abc(char *str = "STRING")
{

・・・

904 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:59:59 ]
>>903
これではだめ?
if (argc >= 2)
  abc(argv[1]);
else
  abc();


905 名前:903 mailto:sage [2008/08/14(木) 12:07:56 ]
>>904

早速の回答ありがとうございます。
すいません。書くのを忘れてました。。。
main文は他の誰かが書くとかで、できたら関数(abc)の中で処理したいのですがいい方法ありませんでしょうか。



906 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:15:52 ]
void abc(char *str)
{
if (str == NULL) str = "STRING";
...
}

907 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:17:48 ]
デフォルト引数にこだわる意味がわからん

908 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:26:00 ]
標準C/C++に準拠したコンパイラなら argv[argc] == NULL だから>>906で大丈夫だな

909 名前:903 mailto:sage [2008/08/14(木) 13:05:15 ]
>>906,908

無事できました!ありがとうございます。

>>907

C++のデフォルト引数が便利そうだったので、使ってみたかっただけでした。。。すいません


910 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:09:08 ]
デフォルト引数は、NULLのとき代わりに、という意味ではないよ
引数を渡さなかったときに使われるもの
argv[1]を渡せばargv[1]が渡る

911 名前:903 mailto:sage [2008/08/14(木) 13:12:19 ]
なるほど、、そういう意味だったのですね
いろいろとありがとうございました。

912 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:09:44 ]
コンストラクタやコピーコンストラクタでメモリの確保に失敗したら
どうすればいいですか?例外をなげたほうがいいのか、
成功か失敗のフラグをクラス内部でもつのか、作成及び複製専用の
関数を用意したほうがいいのかよくわかりません。
できれば、コンストラクタで失敗したならそのインスタンスは無効であることを
戻り値で返せればいいんですが無理ですよね。

913 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:44:26 ]
自分で投げなくてもnewに失敗したら勝手にstd::bad_alloc投げると思うけど

914 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:34:20 ]
unicodeって文字コード統一する目的で作られたんでしょ?
なんでいくつも形式が存在するの?

915 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:36:32 ]
>>914
1文字に4バイトも食うからそりゃ敬遠するでしょ



916 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:40:55 ]
>>914
キャラクタセットとエンコーディングは区別しろよ

917 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:37:50 ]
UnicodeとUTF-8の違いは?
pc11.2ch.net/test/read.cgi/tech/1177930957/

918 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 02:44:25 ]
if(A&&B&&C){...}

if(A){
 if(B){
  if(C){...}
 }
}

これだったらどっちが高速なのですか?

919 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 02:47:05 ]
なんでそんなに高速性を気にする?

920 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 02:48:39 ]
完全に興味本位です。


921 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 02:59:55 ]
>>918
生成されるコードを見るしかない。
コンパイラによって違うかもしれない。

だが多分ショートサーキットを考慮すれば同じコードを吐くだろう。

922 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 03:11:44 ]
なるほど。
ありがとうございます。非常に勉強になりました。

923 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 08:19:33 ]
コンテナに入れたデータを一定の時間間隔で処理するために
コールバッククラスのインスタンスでイテレータを保持するようにしたんだけど、
これってどう思う?

for (Hoge::iterator i = hoge.begin(); i != hoge.end(); ++i)
みたいな、その場のループで使い捨てする用途しか今まで見たことがなくて、ちょっと不安。

要素が増えも減りもしないことが分かっている場合は、ポインタと同じ感覚でいいのかな?

924 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 09:20:29 ]
>>923
どういうときにイテレータが無効になるかをきちんと把握して、
(ちなみにこれはコンテナの種類によって異なる)
自分も他人もそういうコードを書かないという確信があるならそれでいいんじゃない?

普通にコンテナのポインタなり参照なりを保持させればいいと思うけど、
それじゃ無理なわけ?

925 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 19:49:44 ]
>>924
コンテナの要素をどこまで処理したか覚えておきたいんだ。
wavのストリーム再生をイメージしてもらえれば近いかな。
コンテナのポインタなり参照なりを保持するとして、どうすればいいのか分からないです。



926 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 20:47:48 ]
>>925
コンテナの中身が書き換わらないならイテレータは無効にならない

927 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 01:09:12 ]
>>926
じゃぁ今回はイテレータ保持のままでいいか。どうもありがとう。
もっと色んなソース読んでみないとなぁ。自分のしていることが一般的なのか分からなくて不安。

928 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:02:11 ]
Cのif文について質問です

if(a>0xffffffff){ 命令; }

とするとコンパイラが 条件が常に真 と警告を吐きますが
普通に動作します

また  -1(0xffffffff) を -2(0xfffffffe) に変えるとその警告は無くなります

変数 a はunsigned int型です

なぜこの警告は出るのでしょうか。

929 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:42:01 ]
>>928 条件が常に真だからだよ。

930 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:49:46 ]
>>929
でも普通にその条件式が動作するのは何でなんだぜ?

931 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:54:36 ]
>>930
常に真だから

932 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:54:52 ]
>>930
条件式の結果が真であることは誤動作じゃないだろ。

933 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:54:53 ]
>>1読まなかった俺を許してくれ

934 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:56:45 ]
常に偽という気がする。
>>928
おまえんとこのunsigned intの範囲が0から0xffffffffなんだろう。
a>0xffffffffという条件はaがどんな値でも成り立たない。
だからのその命令;は絶対に実行されない。
だったら初めからifなんて書くなよ無駄だからというのがその警告だ。

0xfffffffeにすると、aが0xffffffffの場合だけそこが実行されるという
意味のあるif文が出来上がるので、警告にならない。

あと、0xffffffffは-1ではない、4294967295だ。0xfffffffeも同様に4294967294。

935 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:58:41 ]
>>934
ガチですまん
俺ホント馬鹿
吊ってくる



936 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 02:03:01 ]
無駄だからというより、なんか間違っていないかって注意を促す意味合いのほうがおっきい気がしてきた。

937 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 02:22:25 ]
>>934
ばーか。コンパイラが「常に真」と言ってるんだよ。なにが「常に偽という気がする」だよ。

938 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 02:28:18 ]
>>937
いやだってa>0xffffffffが常に偽になる場合は容易に思い付いたけど、
常に真になる状態は考え付かなかったから。
常に真でも偽でも同じメッセージを使い回しているだけだろうと思うことにした。

939 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 02:33:03 ]
sizeof(unsigned int)よりもsizeof(unsigned long int)の方が大きい環境なら、常に真になるんだけどね。

940 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 03:03:50 ]
なかなか面白いジョークだな

941 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 04:21:35 ]
>>928 とりあえずコンパイラとバージョン教えて。試してみたいから。

942 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 07:40:50 ]
フォントが小さいので 常に夏 に見えて仕方ない
イヤなスレだなぁ・・・と思ったらイヤなのは俺だった

943 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 16:17:34 ]
VCなんですが、例外処理 (初回) は test2.exe にあります:
0xC0000005: Access Violation。とでます。
ループの回数を減らせば通るのですが、ループ数を減らさずに
実行するにはどうすればよいでしょうか?
iのループは60、jのループは1500程度です。

for(i=0; i < font->Tnum; i++){
// 1ブロックのフォント収録数
fontnum = font->Block[i].End - font->Block[i].Start;
fputs("const char data[] = {\r\n\t", fp);
for(j = 0; j < fontnum * 24; j++){ // 1ブロックのフォント分繰り返す */
dt = *p++;
fputs("0x", fp);
sprintf(tmp, "%02x", dt);
tmp[2] = 0;
fputs(tmp, fp);
fputs(", ", fp);
ct++;
if(ct == 8){ // 改行
fputs("\r\n\t", fp);
ct = 0;
}
}
fputs("}\r\n\t", fp);
}

944 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 16:58:13 ]
>>943
デバッグすればいいよ・・・・・・・・・・・・・・・・・・

945 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 22:30:00 ]
ソース生成しているのか。くだらんなぁ。それはさておき、こりゃ酷い。
--
fputs("0x", fp);
sprintf(tmp, "%02x", dt);
tmp[2] = 0;
fputs(tmp, fp);
fputs(", ", fp);
--
fprintf(fp, "0x%02x, ", dt)で事が足りるだろうに。処で、tmpはどう宣言されているんだ?



946 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 13:01:48 ]
c++使ってるといちいち型変換がめんどくさいんだけど
一番簡単な方法はboostの変換ライブラリ使う事?
他にいい方法があれば教えてください。

947 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 14:53:32 ]
sendmessageでwm_copydataが送れないんですけど、
何かプロジェクトの設定とかが必要だったりします?
他のメッセージは送れるんですがこれはデータのコピーとかやってるのでその辺でこけてるのかなあと。

948 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 15:25:26 ]
GetLastErrorで原因調べた?

949 名前:947 mailto:sage [2008/08/29(金) 15:25:28 ]
sendmessageなのにスレッドループで捕まえようとしてました
解決しました


950 名前:デフォルトの名無しさん [2008/08/30(土) 07:51:33 ]
オブジェクトのメソッドの呼び出し規約ってどうなるんですか?


951 名前:デフォルトの名無しさん [2008/08/31(日) 12:07:46 ]
>>950
とりあえずぐぐろう

952 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 12:18:42 ]
>>945
>>943ほどの低レベルなコードを書く奴ならどうせchar*tmp;と宣言していると予想

953 名前:デフォルトの名無しさん [2008/09/01(月) 08:01:13 ]
printfなどでの書式指定で、たとえば0.123の場合、
最初の0をつけずに、.123の様になるようにするには
どのように指定したらよいのでしょうか

954 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 08:41:46 ]
"%.3f"

955 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 10:23:10 ]
文字列を入力するときの例は、配列を使うものしか見たこと無いのですが、 
文字列を入力する場合は、常に配列を使わなければならないのでしょうか。 

たとえば、宣言は、 char st[100]; とかの例を見たりしますが、 
char st; だけじゃ不都合があるのでしょうか。文字が一文字しか入らないとか。。。 
 




956 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 11:15:33 ]
文字列 = 文字の配列
と思えばとりあえずなんとかなる

957 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 11:53:00 ]
>>955
Cには文字列形がないので、文字型の配列などに格納する必要がある。
文字型変数であるchar stには、当然ながら一文字しか入らない。

958 名前:デフォルトの名無しさん [2008/09/01(月) 21:53:28 ]
どなたかこの低脳野郎に知恵を授けてください・・・。実はいまC言語を学んでいるのですが
C言語はソフト開発が出来るのでしょうか?(窓の杜にあるようなやつ)
回答お願いします。

959 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 21:57:30 ]
低脳にもほどがある

960 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 22:11:12 ]
>>958
アインシュタインは紙と鉛筆で相対性理論を完成させたかもしれないが、俺にはできない。
たしかに偉大な先人達はCで作ったソフトを窓の杜に投稿したかもしれないが、
その軌跡を今の私たちが無理してなぞる必要は無いと思わないか。

ということで、もっと楽ちんな言語使おうぜ。
C++とか。

961 名前:デフォルトの名無しさん [2008/09/01(月) 22:48:25 ]
>>960
ありがとうございます。偉大な人とはいえ結局は人ですからがんばって見ます。


962 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:27:03 ]
がんばって何を見るというのだろう……

963 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:52:14 ]
そりゃあ、おい、青少年ががんばって見るといえばアレしかないだろ。
まぁ俺からのアドバイスとしては薄目にしても効果はないということだ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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