【初心者歓迎】C/C++室 Ver.73【環境依存OK】 at TECH
【初心者歓迎】C/C++室 Ver.73【環境依存OK】 - 暇つぶし2ch284:デフォルトの名無しさん
10/06/12 20:20:24
今度はテキストで貰ってきてくれ、なの

285:デフォルトの名無しさん
10/06/12 20:37:04
>>284

すんません。。。

286:デフォルトの名無しさん
10/06/12 21:23:17
int main(int argc, char *argv[])

で、プログラムを実行するとき引数に英1文字AかBかCかDが指定できるとして、
A,B,C,D以外が入力されたときにエラーを表示するための
if文の条件文の書き方が分かりません。

if(argv[1] != "r")
とすると、引数に何を入力しても該当してしまいます。

どうすればいいでしょうか

287:デフォルトの名無しさん
10/06/12 21:24:09
書き間違えました、
if(argv[1] != "A")
です

288:デフォルトの名無しさん
10/06/12 21:26:46
>>287
それは文字列へのポインタの比較なんで文字列の中身の比較ではない。
文字列の中身の比較はstrcmpを使う

289:デフォルトの名無しさん
10/06/12 21:29:36
気持ち悪いけど
if (strcmp(argv[1],"A")&&strcmp(argv[1],"B")&&strcmp(argv[1],"C")&&strcmp(argv[1],"D"))
こっちも気持ち悪いけど
if (strchr("ABCD",argv[1][0]))


290:デフォルトの名無しさん
10/06/12 21:35:39
C++ならこうか
std::string a(argv[1]);
if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D"))
{
}

291:デフォルトの名無しさん
10/06/12 21:37:54
>>289
前者はオプション文字列の長さが1である必要があるのに、
後者はオプション文字列の長さをチェックしていない。
いっそ、これでいいのでは?
if (argv[1][0] != 'A' || argv[1][0] != 'B' || argv[1][0] != 'C' || argv[1][0] != 'D' || argv[1][1] != '\0')

292:286
10/06/12 22:05:20
皆さんありがとうございます。
"A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。

293:デフォルトの名無しさん
10/06/12 22:27:36
結局分かってないし何度もすみません・・
>>291で書くと、引数をAで実行しても該当するようです。どうしてでしょうか

294:デフォルトの名無しさん
10/06/12 22:32:09
\0のところがいらないんじゃ…
間違ってたらスマソ

295:デフォルトの名無しさん
10/06/12 23:04:03
なんだかんだ言ってエバーはやっぱ面白いなぁ

296:286
10/06/13 00:56:43
if (argv[1][0] != 'A' || argv[1][1] != '\0')
とすると、うまくいきます。'A'以外を入力すると実行されます。AAと入力した時も実行されます。

ですが
if (argv[1][0] != 'A' || argv[1][0] != 'B' )
とするともう何を入力しても実行されるようになってしまいます。

環境が悪いのでしょうか・・?orz
言語はCで、linuxでgccを使っています。

297:デフォルトの名無しさん
10/06/13 01:03:52
今は高校で論理学ってやらないんだっけ?

298:デフォルトの名無しさん
10/06/13 01:04:38
条件をよく見ろ
'A'以外 ま た は 'B'以外
だから何入力してもtrueに決まってる

299:デフォルトの名無しさん
10/06/13 01:08:30
ぐはっ
ありがとうございます。失礼致しました;;

300:デフォルトの名無しさん
10/06/13 21:38:09
DLLを作るのも使うのも全部WINDOWS→リトルエンディアン
って認識でいいの?

301:デフォルトの名無しさん
10/06/13 22:26:26
>>300
今はintelだけなんでそうなる。

302:デフォルトの名無しさん
10/06/13 23:42:46
>>301
AMDとVIAは星になったのかw

303:デフォルトの名無しさん
10/06/14 06:50:37
>>302
俺もintelだけ、といわれるとなんか変な言い方だなぁとは思うけれど。
互換性があるという言い回しにした方がお気に召しますか?

304:デフォルトの名無しさん
10/06/14 08:53:13
IA-32と言えば何も問題は無かったのに

305:デフォルトの名無しさん
10/06/14 09:20:40
要するにDLL作るときにエンディアンも気にしないといけないんですか

306:デフォルトの名無しさん
10/06/14 11:11:43
大丈夫、エンディアン以前にプラットフォームが違っていれば動かない。

307:デフォルトの名無しさん
10/06/14 17:59:17
>>306
お前は何を問題としているかわかってない

308:デフォルトの名無しさん
10/06/14 18:08:05
Windows上でエンディアンを気にしなきゃいけない状況って
・ネットワークを使う
・クロスプラットフォームを考慮(cygwin等)
・他ハードをエミュレーションする

くらいしか思いつかんが。


309:デフォルトの名無しさん
10/06/15 23:31:39
int array[N];
のarrayは&array[0]と同じって本に書いってあったんだけど
で、多重配列 int mulary[N][M][][]...[Z];
の時のmularyは何と同じになるの?
&mulary[0]?
&mulary[0][0][0]...[0]?
....
で、なんでそうなるの?

310:デフォルトの名無しさん
10/06/15 23:51:22
不思議なことにどれをやっても同じなんだよ
そういうふうにメモリ配置されてるから

311:デフォルトの名無しさん
10/06/15 23:55:08
>>309
型はこれと一緒
&mulary[0]

312:デフォルトの名無しさん
10/06/16 01:13:23
>>309
多次元でも関係ない。
array が &array[0] と同じように、 mulary は &mulary[0] と同じ。

313:デフォルトの名無しさん
10/06/17 01:06:13
>>311-312
どもども。
何で配列名が&array[0] 、 &mulary[0]になるように決めたんですか?

314:デフォルトの名無しさん
10/06/17 01:11:15
>>313
>>309 がそう決めたから

315:デフォルトの名無しさん
10/06/17 04:28:55
>>313
便利だから

316:デフォルトの名無しさん
10/06/17 06:32:10
>>313
printf(&"Hello World"[0]);
とか書きたいか?

317:デフォルトの名無しさん
10/06/17 07:17:35
>>316
地味にヤだな、それw

318:デフォルトの名無しさん
10/06/18 16:11:35
>>313
決めたっていうかその表現にある通り、単に配列要素の先頭のアドレス拾ってるから
同じになるってだけじゃね。意味わかれば別に悩む所じゃないぜ


319:デフォルトの名無しさん
10/06/18 18:52:55
&*(array+0) と &array[0] が同じということを知れば
arrayが特殊でないことが分かるはず

320:デフォルトの名無しさん
10/06/21 22:33:23
「クラス名::」で呼び出せるものは静的なもの、
「クラス名.」で呼び出せるものは動的なもの

ってことで、おk?

321:デフォルトの名無しさん
10/06/21 22:59:52

クラス名::hoge
インスタンス.hoge


322:デフォルトの名無しさん
10/06/21 23:11:31
class A
{
public:
 void func1() {}
 void func2() { A::func1(); }
 static void static_func() {}
};

A a;
a.static_func();

323:デフォルトの名無しさん
10/06/23 02:18:51
ある変数(10桁)の
1の位:
10の位:
100の位:
1000の位:
  ・
  ・
  ・
ってな感じで出力する簡単な計算式教えてください
おねがいします

324:デフォルトの名無しさん
10/06/23 02:29:24
10で割ったあまりを出力して、
変数を10で割ったものを変数に代入する

というのを繰り返す

325:デフォルトの名無しさん
10/06/23 02:36:38
>>324
ありがとうございます

326:デフォルトの名無しさん
10/06/23 23:04:41
排他処理ってどんなふうにやればいいんですか

327:デフォルトの名無しさん
10/06/23 23:14:36
環境も書かずに排他処理とな?!(AAry

328:デフォルトの名無しさん
10/06/23 23:14:50
セマフォ、ミューテックス、クリティカルセクションでぐぐれば解る

329:デフォルトの名無しさん
10/06/23 23:38:44
DWORD WINAPI ThreadFunc1(LPVOID lpParam) //スレッドの1
{
WaitForSingleObject(g_mutexTest, INFINITE); //所有権取得
//排他的な処理
SetCursorPos(def_x, def_y);
ReleaseMutex(g_mutexTest); //所有権放棄
return 0;
}

void CreateMutexTest()
{
g_mutexTest = CreateMutex( 0, FALSE, NULL);
hThread1 = CreateThread(NULL, 0, ThreadFunc1, NULL, 0, &ThreadID);
}

void CloseMutex()
{
if (g_mutexTest)
{
CloseHandle(g_mutexTest);
g_mutexTest = NULL;
}
}




CreateMutexTest();
CloseMutex();


330:329,326
10/06/23 23:41:06
途中で送信してしまいました
ググったら>>329のようなものが出てきたんですけど
これでいいんですか?

331:330
10/06/23 23:43:36
環境はWin7 VC++です

332:デフォルトの名無しさん
10/06/24 05:14:55
static RECT rect;
を計算して求めたleft, top, right, bottomで初期化したいのですが

rect.left=left;
rect.top=top;
rect.right=right;
rect.bottom=bottom;
は不恰好なので

rect = {left, top, right, bottom};
と試してみましたがコンパイルエラーになりました。

RECT tmp = {left, top, right, bottom};
rect = tmp;
そこでこうするとうまく動いたのですが、もっといい方法はありますか?

Win7 VC++ 2008です。

333:デフォルトの名無しさん
10/06/24 07:38:41
Windows APIの構造体のやつならSetRect関数

334:デフォルトの名無しさん
10/06/24 14:03:02
配列の要素数を標準入力cinで入力することは出来ないでしょうか?

int num;
cin >> num;

int test[num];

「定数式が必要です」と出て失敗します
何故だ…

335:デフォルトの名無しさん
10/06/24 14:10:43
>>334
配列の要素数に変数を使うことはできない
定数じゃないと
そういうときはnew使うとかvector使うとかしないと

336:デフォルトの名無しさん
10/06/24 15:25:40
定数式が必要です、って言われて何故だとかメッセージを読む能力なさすぎだろ

337:デフォルトの名無しさん
10/06/24 16:05:14
初心者歓迎って書いてるから、ま、あまり目くじら立てるなよ。
きっと、変数と定数の区別がまだつかないんだよ。

338:デフォルトの名無しさん
10/06/24 18:18:15
おしえてください!俺はC言語の初心者です。csvファイルのデータを要素ごとに構造体に格納するのを、

struct nakami{
  char name1[80];
  int num1:
  char comp_name[2][80];
  ・・・・・・
}nk[グローバル変数x];

みたいな構造体にして。csvファイルへの読み込みのポインタをfpという変数で持ってきて、

char str[80], num[4], trash[80];
int i;

for(i = 0; i < グローバル変数y; i++){
  fgets (str, 500, fp);
  strcpy (trash, strtok( str, ",¥n"));

  strcpy (nk[i].name1, strtok[NULL]);

  strcpy(num, strtok[NULL]);
  nk[i].num1 = atoi(num);
  ・・・・・・
}

339:デフォルトの名無しさん
10/06/24 18:19:48
>>338の続きです

といった感じで格納を続けていくようにしました。
グローバル変数yはcsvファイルの読み込む列の数についてで、先に取得しています。グローバル変数xは150とプログラムの一番最初にdefineで書いています。

これを実行すると途中でプログラムに問題が発生して強制終了してしまいました。

間あいだに、printfで構造体の中身を含め、ループ中をチェックをしていたのですが、
yが74あって、取得したいcsvの列が0から73までのとき、途中の列までは無事に格納されていたのですが、
iが57までループを繰り返し、インクリメントされた後、何故か1に戻っていました。
そのため、終端に来る前にcsvの方が終わってしまい、強制終了するのだと思います。ループが73列目の格納作業まで終えて、74列目を読み始めて強制終了するみたいです。

初心者なので凄くおかしなことを言っていたり、
説明不足で、これだけの文では分からないかもしれませんが、なにとぞご回答頂きたく存じます。

340:デフォルトの名無しさん
10/06/24 18:28:20
>>338-339
それじゃコンパイル通らないだろ
コピペしろコピペ
URLリンク(codepad.org)
ついでにcsvもどっかにうpしろ

341:デフォルトの名無しさん
10/06/24 19:19:39
>>340
了解です。
このプログラムは2chのとある企画のアイディア推敲の一助にと、慣れないC言語を使って作っていたものです。
わけのわからないcsvファイルですが、ご理解よろしくお願いします。
色々無茶苦茶で、半端な部分も多いです。初心者なので、読解にご迷惑をおかけするかもしれません。
一応コンパイル出来るはずです。

コピペ
URLリンク(codepad.org)
問題は730~835行目の関数の特に811行目のループが始まってから起こるみたいです。

csvファイル
URLリンク(sugar310.dip.jp)

342:デフォルトの名無しさん
10/06/24 20:24:31
>>333
その名もズバリな関数があったんですね。調べ方が未熟でした。
無事綺麗なコードが書けました。
レスありがとうございました。

343:デフォルトの名無しさん
10/06/24 22:54:33
>>341
csv読み込ませるとnum周りのスタックが破綻したって出たな
配列の大きさを大きくしたらとりあえずエラーは出なくなったけど…
URLリンク(codepad.org)
これはGUIで作った方が分かりやすい気がする
ちょっと文字数オーバーしたら落ちるし
C++あたり勉強してstd::stringとか使った方がいいんじゃないか

344:デフォルトの名無しさん
10/06/24 23:50:44
c++の命名規則の例が詳しいサイトとかないでしょうか?


345:デフォルトの名無しさん
10/06/25 00:00:40
>>343
細かく見ていただき大変ありがとうございます!!
色々と自分のプログラムの汚いところがスッキリしてて驚きがあって感動してます。

ただ、自分がwinでvisiual C++2008のコマンドプロンプトからclでコンパイルしていたものを、
ちょっとした都合でwinがネットに繋げられなかったでの、
人のmacのxcodeに送ってそれをURLリンク(codepad.org) にコピペしたためか、
今winでclでコンパイルすると色々とエラーが出てしまって・・・、上手くいってるか直ぐに分からないです。
すみません。

対処法も教えていただけましたし、色々手も加えていただいたので、winにあるものとしっかり見比べて、理屈の理解をしていこうと思います。
C++も勉強してみたいと思います!!
ありがとうございました!!!

346:デフォルトの名無しさん
10/06/25 08:40:17
組み込みCでタスクの単体試験がしたい。
内部で状態が変わるようなタスクのテスト項目が思い付かない。


347:デフォルトの名無しさん
10/06/25 08:44:13
単体試験は単体でするもの、組み込んでするのは別の試験。
内部で状態が変わっても影響ないならNOPにしとけ~。

348:デフォルトの名無しさん
10/06/25 10:32:33
別にcodepadに貼らなくても自分の所でgcc + MinGW4.5.0でコンパイル
すればいいやん

あ、ソースを晒すためか

349:デフォルトの名無しさん
10/06/25 15:14:19
すいません int** aはどういうことでしょうか?
int* aならポインタ宣言と分かるのですけれど**が2個付くのは意味があるのでしょうか?

350:デフォルトの名無しさん
10/06/25 15:29:18
ポインタのポインタってことだ
COMとかでインターフェースのポインタをもらうときとかに使うな

351:デフォルトの名無しさん
10/06/25 15:29:48
>>349
ポインタのポインタ
int a;
int* b = &a;
int** c = &b;
といった感じでポインタ変数をさらに指し示せる。
関数から(戻り値以外の方法で)ポインタ値を返す時に使われるな。

352:デフォルトの名無しさん
10/06/25 15:36:04
>>349>>350
慣れてないとややこしそうですな 精進します
ありがとうございました!


353:デフォルトの名無しさん
10/06/26 19:42:40
引数なしローカル変数なしの再帰関数を作ったとしたら、これはどこまで再帰してもスタックオーバーフローを起こさないって考えていい?


354:デフォルトの名無しさん
10/06/26 19:50:52
末尾再帰が最適化されたらそうなるだろう。
が、もし最適化されなかったらリターンアドレスを積みまくって死ぬから、
オーバーフローは起こると考えたほうが安全。

355:デフォルトの名無しさん
10/06/26 19:51:31
>>353
戻ってくる場所をスタックに積むからいつかスタックオーバーフローを起こす

356:デフォルトの名無しさん
10/06/27 00:07:01
サンクスです
おとなしくループ回すでござる・・・

357:デフォルトの名無しさん
10/06/27 04:14:38
質問させてください。

参照カウントで管理するオブジェクトを作ろうとしています。
これは自動変数として確保されたくないのでコンストラクタをprotectedにして、
staticなオブジェクト生成用のメソッド(Create)を作ってそこでnewしています。

ただこれではクラスを継承するたびにサブクラス側でもCreateと同等のメソッドを用意しなければならなくなってしまいました。
これが結構面倒に感じています。
何かスマートな実装方法はないでしょうか?

358:デフォルトの名無しさん
10/06/27 05:02:19
>>357
CRTPパターン使うとか?
URLリンク(codepad.org)

まあ、ふつうはFactoryパターンでやるけど。

359:357
10/06/27 05:42:25
>>358
ありがとうございます。
リンク先のものが使えそうです。

ちなみにFactoryパターンでググったらFactoryMethodとAbstractFactoryが出ましたがどちらでしょうか?

360:デフォルトの名無しさん
10/06/27 09:18:30
自動変数を封じるならデストラクタを弄るだけでもできる
コンストラクタは複数有るのに対してデストラクタはひとつだからこっち弄るほうが楽だと思う

URLリンク(codepad.org)
URLリンク(codepad.org)



361:デフォルトの名無しさん
10/06/27 20:03:30
初歩的な質問ですが、教えて下さい。

void S(char okini[SIZE][2][100])
{`
  int i;
  int a;
  for(i=0;i<SIZE;i++)
  {
   printf("URLを入力してください");
   scanf("%s", okini[i][0]);
   printf("タイトルを入力してください");
   scanf("%s",okini[i][1]);
  }
  printf("削除したい番号を入力してください");
  scanf("%s",&a);
  okini[a-1][0][100]=´x´;
  okini[a-1][1][100]=´x´;


お気に入りを削除する関数を作りたいのですが、
どうやって削除すればいいのですか?
削除したいやつを「x」と置き換えようとしたのですが
エラーが発生しました。

362:デフォルトの名無しさん
10/06/27 20:17:21
>>361
hoge[100]と宣言した配列で使えるのはhoge[0]からhoge[99]まで。
っていうのはともかく、代入したいのは文字列だから、strcpy()を使わないと
strcpy(okini[a - 1][0], "x");


363:デフォルトの名無しさん
10/06/27 20:29:56
>>362
ありがとうございます。

大変申し訳ないのですが、strcpy()はまだ習っていません。
他に何か方法はありませんか・・・?


364:デフォルトの名無しさん
10/06/27 20:35:32
>>363
宿題なら↓へ
C/C++の宿題片付けます 137代目
スレリンク(tech板)

テンプレをよく読んで守ること。

# okini[a-1][0][0]='\0'; とか

365:デフォルトの名無しさん
10/06/27 20:52:48
>>364
どうもありがとうございました。
そちらに行ってみます!


366:デフォルトの名無しさん
10/06/28 22:48:49
「この文章の中に
1は□個、2は□個・・・9は□個ある」
というのをcで解こうと思ったのですが、なかなかうまくいきません
助言お願いします

URLリンク(kansai2channeler.hp.infoseek.co.jp)

367:デフォルトの名無しさん
10/06/28 23:15:51
恐ろしい物を見た気がする
何がやりたいのかはっきり言って分からない

368:デフォルトの名無しさん
10/06/28 23:20:39
なんだこのインデントの数は
これはC以外の何かだ

369:デフォルトの名無しさん
10/06/28 23:28:30
何なんだこれは
IOCCCにでも出すつもりか

370:デフォルトの名無しさん
10/06/28 23:32:54
すいません、上のほうで出てたmutexで質問です。

URLリンク(www.geekpage.jp)
ここのサンプルプログラムをコンパイルしたら、
pthread_mutexattr_setpsharedがないと怒られました。

いろいろ調べた結果、_POSIX_THREAD_PROCESS_SHARED が未定義な環境だとはわかりましたが、
どう回避していいかわかりません。排他制御するにはどうしたらいいか教えてください。

371:デフォルトの名無しさん
10/06/28 23:32:56
この文章の中にと書いてるが
何も文章を入力してないんだよな
これはなかなか歯ごたえがあるぜ

372:デフォルトの名無しさん
10/06/28 23:35:00
>>370
環境書け環境

373:370
10/06/28 23:51:22
すいません、環境はFreeBSD 6.0です。

374:デフォルトの名無しさん
10/06/29 00:38:37
ここで質問させていただきます。
URLリンク(upsurusuru.hp.infoseek.co.jp)
このtxtにプログラムの一部を書いています。
このプログラム内で
for(int i=0; i<n; i++){
fin >> a >> b >> c >> d >> e;
txt[i].setdata(a ,b ,c ,d ,e);}
としたあと
double test(Person txt[], int n)
{int sum = 0;
double te;
for(int i=0;i<n;i++){
sum = sum+txt[i].setdata;}
te=sum/n;}
ここへtxt[i]を送り、txt[i]の中からdだけを取り出したいのですがどうしたら良いでしょうか?
助言お願いします


375:デフォルトの名無しさん
10/06/29 00:56:03
Personクラスの定義ぐらい書けや

376:デフォルトの名無しさん
10/06/29 01:08:09
すみません
URLリンク(upsurusuru.hp.infoseek.co.jp)

377:デフォルトの名無しさん
10/06/29 01:47:26
>>374
簡単に言うとprivate変数のdをいじくれないからメンバ関数serdata()から
dを引き出したいって事?

それはあまり綺麗な設計じゃないな

dだけアクセサ作ったら?

double Person::dvalue() const { return d; } みたいな

それは嫌なのかな?

378:デフォルトの名無しさん
10/06/29 01:49:35
もしアクセサを作ることでどこからでもdを参照できるようになるのが嫌なら、
関数test()をPersonのfriendにすればいいじゃない

friendってそういう風に使うんだぜ

379:デフォルトの名無しさん
10/06/29 02:03:51
>>378
それをやってみます。
回答ありがとうございます。

380:デフォルトの名無しさん
10/06/29 06:43:47
うん

381:デフォルトの名無しさん
10/06/29 08:59:10
friendよりstaticメンバー関数にしたほうがきもちいいと思うんだがどうか

382:デフォルトの名無しさん
10/06/29 11:43:46
>>381
それだとthisが渡されないから個々のインスタンスのdをいじれないぞ

383:デフォルトの名無しさん
10/06/29 12:12:36
txt[]で渡してるじゃん

384:デフォルトの名無しさん
10/06/29 12:21:34
URLリンク(codepad.org)
自作のクラスのインスタンスをpush_backしたvectorをソートしようとしています。
codepadではコンパイルエラーは無かったのですが、
自宅のPC(Gentoo Linux, g++ (Gentoo 4.4.3-r2 p1.2) 4.4.3)だと以下のようなエラーが出てしまいます。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

コードのどこかが悪いのでしょうか?
それとも足りない環境があるのでしょうか?

codepadで出力結果がソートされていないのも何故か分かりません。
ご教示ください。

385:デフォルトの名無しさん
10/06/29 12:46:36
>>383
ああそういう事か
それならいいかもね

>>384
ちょwwSTL関係のエラーコード貼るな
貼るならSTLFiltとかで整形してから貼れ

それより肝心のソースコードは?

386:384
10/06/29 13:13:36
>385
コードは>384の1行目です。
STLFiltはちょっと調べてみます。

387:デフォルトの名無しさん
10/06/29 13:19:28
>>386
取り敢えず気が付いた事を一つだけ
ポインタをソートしてるよ
実体をソートしたいなら比較叙述関数を作るか関数オブジェクトにして与えないと

388:デフォルトの名無しさん
10/06/29 13:21:42
>>384
ポインタの順序付けは実体の順序付けと関係ない。
実体の順序付けを使うように比較関数を作って渡せ。

あとは gcc じゃなくて g++ 使ってみな。

389:デフォルトの名無しさん
10/06/29 13:24:54
取り敢えず応急処置だけどソートは出来てるっしょ

URLリンク(codepad.org)

390:デフォルトの名無しさん
10/06/29 13:30:08
こういう時はBoost::lambdaとかC++0xのラムダ式がとても役に立つよな

391:384
10/06/29 13:43:54
確かにgccを使っていました。g++にしたらコンパイルできるようになりました。
URLリンク(codepad.org)
のコードでうまくソートできました。

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

392:384
10/06/29 13:45:50
>389
>391のレスをしてから気付きました。
どうもありがとうございます。

393:デフォルトの名無しさん
10/06/29 14:15:48
delete しとけよ。

394:デフォルトの名無しさん
10/06/29 14:32:10
参照はがしできるなら剥がしてからファンクタに渡すラッパー作っとくと便利

395:デフォルトの名無しさん
10/06/30 15:12:13
コマンドプロンプトで
関数に0個の引数を指定できません
fatal error U1077 : C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cI..EXE : リターンコード0x2
と表示されたのですがどーゆーことでしょう?
もしスレ違いだったら申し訳ありません

396:デフォルトの名無しさん
10/06/30 15:22:17
コマンドプロンプトでなにしたんですか

397:デフォルトの名無しさん
10/07/01 10:02:20
環境非依存で整数型のビット長を調べるメタ関数は有りますか?

398:デフォルトの名無しさん
10/07/01 10:14:45
sizeof(IntType) * CHAR_BIT
メタ関数は上式で自作しなさい。

399:デフォルトの名無しさん
10/07/01 10:54:59
質問させてください。
c++プログラムの中で、既に存在する.exeファイルを実行して、
標準出力へ返ってくるはずの返り値をC++ソースの中で変数に格納したいのですが、
どのような書き方をすればよいでしょうか??

教えていただけると幸いです。

400:デフォルトの名無しさん
10/07/01 11:02:20
>>399
環境に拠るが、popen()ではどうだろう。

401:デフォルトの名無しさん
10/07/01 18:36:42
>>398
それが表現ビット長と一致するとは限らないんだぜ
std::numeric_limits<IntType>::digits + std::numeric_limits<IntType>::is_signed
が正しい

402:デフォルトの名無しさん
10/07/01 19:17:11
整数型の実ビット長が表現ビット長と一致しない環境ってある?
そりゃ非PODだったら違ってくるだろうけど。
規格ではどうなってるんだろう。

403:デフォルトの名無しさん
10/07/01 22:45:18
質問です。VC++2008EEですがソース分割の仕方がいまいち分かりません。簡単に組んでみたところエラーが出てしまいました。
>1>sub.obj : error LNK2005: "class c_Sub Sub" (?Sub@@3Vc_Sub@@A) は既に main.obj で定義されています。
>fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
どこが間違っているのかご教示お願いします。 URLリンク(codepad.org)

404:デフォルトの名無しさん
10/07/01 22:53:36
>>403
URLリンク(www.geocities.jp)

405:デフォルトの名無しさん
10/07/01 23:26:50
>>404 どうもです。
14行目を } static Sub; とすることでリンカ通りました。(これでよいのかも今一分かりませんが…

406:デフォルトの名無しさん
10/07/01 23:34:05
staticじゃSubの実体がいくつもできちまうじゃねえか。
だからグローバル変数はヘッダではextern宣言して
どれかcpp一つで実体を定義しろっつーの。

407:デフォルトの名無しさん
10/07/02 07:10:29
>>398,402
sizeof(型名) * CHAR_BIT != 有効ビット幅
URLリンク(portable-c.jugem.jp)

408:デフォルトの名無しさん
10/07/02 18:25:01
>>407
>Intelのi686をターゲットとするGCCでは、long double型の有効ビット幅が80ビット
FPU に80bitで数値を渡す(スタックに積む)命令はあるのだろうか?

409:デフォルトの名無しさん
10/07/02 21:44:35
tbyte ptrで行けない?

410:デフォルトの名無しさん
10/07/03 13:02:24
AT&A記法ならfstpl

411:410
10/07/03 14:00:45
方向逆の上lじゃなくてtだった
fldt

412:デフォルトの名無しさん
10/07/03 15:00:00
templateはコンパイル時に型が代わるってことでおk?

413:デフォルトの名無しさん
10/07/03 16:40:54
型が変わるというか、"型ごと"(←重要)に生成される
バイナリが肥大化するから気をつけて

414:デフォルトの名無しさん
10/07/03 16:47:44
さんくすっす
わかったっす


415:412
10/07/03 16:48:13
>>413
thx

416:デフォルトの名無しさん
10/07/03 19:50:45
いえいえ

417:デフォルトの名無しさん
10/07/03 23:22:12
ふと疑問に思ったので教えてください。
例えば、x=7,y=5,z=9のとき、
a=__min(__min(x,y),z);
と書いても実行可能で、aに5が代入されますか?

418:デフォルトの名無しさん
10/07/03 23:24:09
>>417
__min の動作が分からない

419:デフォルトの名無しさん
10/07/03 23:25:32
実際に試せない環境にでもいるのだろうか

420:デフォルトの名無しさん
10/07/03 23:29:22
>>419
yes

421:デフォルトの名無しさん
10/07/03 23:38:45
標準マクロのminでええやんと思う
代入されるかどうか、という話はyes
(__minがちゃんと定義されているならだが)

422:デフォルトの名無しさん
10/07/04 00:07:15
>標準マクロのmin
えっ・・・?

423:デフォルトの名無しさん
10/07/04 00:12:57
>>421
ありがとうございました。
超初心者ゆえに個人的な制約が色々あるわけです。

424:デフォルトの名無しさん
10/07/04 01:52:36
windows.hやkernel.hに含まれてるmin/maxマクロはC/C++標準ではありませんよ…

425:デフォルトの名無しさん
10/07/04 02:12:36
stdの方はマクロじゃないよな

426:デフォルトの名無しさん
10/07/04 10:08:13
PNGといえばlibpngのように、
Bitmapの読み書きをするクロスプラットフォームな
デファクトスタンダード的なライブラリがあれば教えてください。

427:デフォルトの名無しさん
10/07/04 18:16:05
初歩的な質問ですみません
#include<stdio.h>
void calc(int &po);
int main(void){
int miku=39;
calc(miku);
printf("%d\n",miku);
getchar();
return 0;
}
void calc(int &po){
po=po*2;
return;
}
これはcalc()関数にmikuを代入しているのですか
それともmikuのアドレスを渡しているんですか
そもそも文法的に正しいのですか
普通に動くので困ってしまいました

428:デフォルトの名無しさん
10/07/04 18:32:55
参照だもん正しいよ

429:デフォルトの名無しさん
10/07/04 18:46:27
いや、本当はポインタ使いたかったんですが
気が付いたらこんなのになってしまいました

430:デフォルトの名無しさん
10/07/04 20:09:37
ん、なんで動くんだ

431:デフォルトの名無しさん
10/07/04 20:12:03
参照を渡している
内部的にはアドレスを渡しているかも知れないしそうじゃないかもしれない
とりあえず文法的には合ってる

432:デフォルトの名無しさん
10/07/04 20:15:25
>>430
C++は初めてか?力抜けよ

433:430
10/07/04 20:19:33
参照を渡してたら、*po=*po*2としないと行けないんじゃないか?

434:デフォルトの名無しさん
10/07/04 20:20:58
それはvoid calc(int *po);の場合。

435:デフォルトの名無しさん
10/07/04 20:22:02
>>433
CじゃないC++だ。
C++では参照とポインタは別物

436:430
10/07/04 20:27:54
そうなのか、横からスマンかった。

437:デフォルトの名無しさん
10/07/04 20:51:46
あれ、それじゃあこれはC++の文法ですか?
てっきりCのものかと

438:デフォルトの名無しさん
10/07/04 20:56:00
C++が使える環境ならC++勉強したほうがメリットあるぞ。

439:デフォルトの名無しさん
10/07/05 07:23:05
>>437
>>427はCでコンパイルエラーになるはずだが?

440:デフォルトの名無しさん
10/07/05 13:30:44
C言語です

unsigned char buff[] = { 0x01, 0x1A, 0x00, 0x3F };
char str[256];

strの中身を"011A003F"としたいのですがどうすればよいのでしょうか


441:デフォルトの名無しさん
10/07/05 13:33:47
sprintf(str, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);

442:デフォルトの名無しさん
10/07/05 13:41:24
strcpy(buff, "011A003F");

443:デフォルトの名無しさん
10/07/05 13:41:32
>>441
ありがとうございました
sprintfの使い方は目からウロコが落ちました

444:デフォルトの名無しさん
10/07/05 13:42:39
質問の仕方が悪かったみたいです
>>442さんには余計な手間を取らせて申し訳ない


445:デフォルトの名無しさん
10/07/05 14:22:21
#if 0
sprintf(buff, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);
#elif 0
str[0] = '\0';
for (unsigned ic = 0; ic < sizeof(buff); ++ic) {
sprintf(strchr(str, '\0'), "%02X", buff[ic]);
}
#else
for (unsigned ic = 0; ic < sizeof(buff); ++ic) {
sprintf(& str[ic * 2], "%02X", buff[ic]);
}
#endif

446:デフォルトの名無しさん
10/07/06 02:15:54
派生クラスが初期設定で基底クラスに「*this」という値を渡していたのですが、
「this」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?

447:デフォルトの名無しさん
10/07/06 02:24:49
CRTPかな?
値か参照だけど、多分参照。

448:デフォルトの名無しさん
10/07/06 10:27:00
C言語でMySQLを制御したいのですが、どうしたら良いでしょうか

449:デフォルトの名無しさん
10/07/06 10:30:47
>>448
てきとーにライブラリを探してください

450:デフォルトの名無しさん
10/07/06 14:46:03
なんか変数へのアクセスはアクセサ関数を使って~と杓子定規にいわれるけど
C#でいうところのプロパティ的なモノはpublic変数でも良いのかなと最近思うようになったが
アクセスレベルを設定できないからそれはどうかな?とも思う
やはりちょっと見た目が悪くなるけどアクセサを使うべきなのでしょうか?

451:デフォルトの名無しさん
10/07/06 16:48:12
アクセス制限以外のアクセサ関数のメリットとして、
仮に内部実装が変わっても(例えばintだったのがdoubleになっても)
関数でラップしとけば呼び元に影響しない、とかもある

でも個人的には、よほどリスクがあるのでなければ
変数の方がすっきりしていい

452:デフォルトの名無しさん
10/07/06 20:35:39
>>450
変数は隠蔽するのが基本。公開すると変数の使用方法が統一できずバグだらけになりやすい。
変数と1対1にアクセサを作った場合は変数を公開したのと変わらなくなるのでよろしくない。

453:デフォルトの名無しさん
10/07/06 21:27:48
>>450
> なんか変数へのアクセスはアクセサ関数を使って~と杓子定規にいわれるけど
いや今の時代は言わないよ。

逆に、あるクラスのメンバを全部パブリックにするという
ノーガード戦法もあるが、それが有効なこともたまにある。
まあ単に変数をまとめたいだけの時だけどね。

普通は、クラスはちゃんとしたinterfaceとなるメンバ関数を持っていて、
使い方を知るのに内部構造を知らねばならないような
クラスはクソ設計と言われる。

まあ現実は納期とかあるからやむをえずクソ設計になっちゃうこともあるけど。


454:デフォルトの名無しさん
10/07/06 22:06:34
>>453
構造体も使ってあげて

455:デフォルトの名無しさん
10/07/07 02:25:40
>>450
先にクラスの外部インターフェースを考えろ。

メンバ変数ありきで関数を作ったりしてる限り、見た目がどうとか以前に糞クラス確定。

456:デフォルトの名無しさん
10/07/07 08:41:00
要はケースバイケース

抽象化したい場合はメンバ関数経由にすればいいし
実装が固定なら直接アクセスすればいい

457:デフォルトの名無しさん
10/07/07 23:36:26
設計不足の言い訳ですか?

458:デフォルトの名無しさん
10/07/08 03:49:07
全てはインタフェースについて記述せよと、
かのエリック・ガンマ先生も言っておられてだな


459:デフォルトの名無しさん
10/07/09 20:04:53
>>444
気にしないでくれ、俺優しいからさ

460:デフォルトの名無しさん
10/07/12 22:56:30
存在しないメンバを呼ぼうとしたら見つかるまで暗黙変換してくれればプロクシ作りやすくて便利なのに

461:デフォルトの名無しさん
10/07/13 21:44:29
#define Q_D(Class) Class##Private * const d = d_func()
こんなマクロがあったのですが、##Privateはどこから来ているのですか?
また、ClassってのはClass Tの省略形ってことでおk?

462:デフォルトの名無しさん
10/07/13 21:59:39
>>461
入門書読もうな

463:デフォルトの名無しさん
10/07/13 22:19:02
>>462は説明できないわけ

464:デフォルトの名無しさん
10/07/13 22:30:18
トークン連結でググれ

465:461
10/07/13 22:57:35
>>464
thx

466:デフォルトの名無しさん
10/07/13 23:59:19
ここまで俺の自演

467:デフォルトの名無しさん
10/07/15 22:24:53
ヘッダファイルで変数は「m_」という名前から始まっている場合が多いですが、
GUIプログラミングの場合はボタンやラベルも「m_」から始めていますか?

468:デフォルトの名無しさん
10/07/15 22:26:43
俺はm_btnAddとかやってるな

469:デフォルトの名無しさん
10/07/15 23:25:54
>>467
「m_」は「クラスのメンバ変数」って意味だと思うぞ。
なので、ボタンやラベルを指す変数がクラスのメンバ変数ならやはりm_を使う。


470:デフォルトの名無しさん
10/07/15 23:44:47
ちなみにメンバ変数にはうしろに _ をつけるという流儀もある
何にもつけないというやり方もある

471:デフォルトの名無しさん
10/07/16 18:31:24
C/C++(C#が扱えればなお嬉しい)が使えるIDEで
UMPC(ATOM/メモリ512MB)程度のスペックのPCでも実用に耐えるようなモノはないでしょうか?

472:デフォルトの名無しさん
10/07/16 18:32:25
VC6

473:デフォルトの名無しさん
10/07/16 19:12:24
VC6っていま手に入ります・・・?

474:デフォルトの名無しさん
10/07/16 19:56:40
VC6 は C++ じゃないので論外。

475:デフォルトの名無しさん
10/07/16 20:30:23
>>471
VC8とか9は普通に使えたけど。

476:デフォルトの名無しさん
10/07/16 21:02:32
メモリ512MBってのが厳しいな
EeePCのメモリ2Gに増設して使ってるが、コード書くだけならVS2005でもそこそこいけてるな

477:デフォルトの名無しさん
10/07/17 00:47:13
>>475
ビルドとかしなければ使えそうですか?
それなら移動端末に買おうと思うのですが

478:デフォルトの名無しさん
10/07/17 06:41:34
それだけの用途でなんでIDEが欲しいの?
C#が主目的なら分からなくもないけど、別に携帯のメモでいいじゃんって思っちゃう。
擬似コードメモるだけで十分だよ。

479:デフォルトの名無しさん
10/07/17 07:09:07
入力補完が欲しいんでないの

480:デフォルトの名無しさん
10/07/17 07:51:35
馬鹿は大変なんだね。

481:デフォルトの名無しさん
10/07/17 18:04:31
externとグローバール変数の違いがよくわかりません
どのようにちがうのですか?

482:デフォルトの名無しさん
10/07/17 18:14:15
externは他のソースコードに書かれたグローバル変数を使うためのおまじない

483:デフォルトの名無しさん
10/07/17 18:18:04
>>481
変数におけるextern宣言は、その変数の定義が同一コンパイル単位内にないことの表明だね。

484:デフォルトの名無しさん
10/07/18 09:15:46
>>474
VC6 は c++, MSC は c

485:デフォルトの名無しさん
10/07/18 09:29:39
>>474
え?

486:デフォルトの名無しさん
10/07/18 09:39:17
>>485
標準への準拠の度合いを言ってるんだと思うよ

487:デフォルトの名無しさん
10/07/18 09:43:24
>>486
それなら確かに同意

488:デフォルトの名無しさん
10/07/18 11:58:15
C++のコードを読んでいると、newが成功しているか調べているコードがよくある気がします
newってそんなに失敗しやすいんですか

それとも、ネットワーク/ディスプレイ/スレッドなどの明かにリソースが限られているものだけ、
newの失敗しやすいのでif文で調べていると考えてもいいのでしょうか

489:デフォルトの名無しさん
10/07/18 12:19:53
>>488
newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、

前者は趣味で書く分にはほとんど気にしなくていい。
newできないほどメモリが逼迫していたらもうマトモにエラー処理ができないだろというのもある。

後者は発生する可能性があるならちゃんとチェックしなくちゃいけない。
クラスのドキュメントを読んで、コンストラクタが失敗する場合があるかどうかをよく確認しましょう。

490:デフォルトの名無しさん
10/07/18 12:20:13
>>488
>newが成功しているか調べているコードがよくある気がします
>newってそんなに失敗しやすいんですか

それ本当に newが成功してるかどうかを調べてるコード?
その処理単位に再入した時にヌルかどうかを調べてるとか、そういう実装都合とかじゃなくて


491:デフォルトの名無しさん
10/07/18 12:20:44
>>488
失敗するかどうかの前にもしそのコードが下のように if で確認してたら100%意味がないことに注意ね
int* a = new int;
if (!a) {
    // エラー処理
}
理由は new は失敗すると例外を投げるから(new が nullptr を返すことは決してない)

new する以上失敗しうるし、そもそもどんな環境で実行されるかも事前に予期できないので、
失敗してもいいように備えてるだけじゃないかな強制終了されるなんてユーザは望んでないと思うし

492:デフォルトの名無しさん
10/07/18 12:22:41
失敗しやすいかどうかはともかく
エラーチェックを怠るとデバッグに苦労するよ

493:デフォルトの名無しさん
10/07/18 12:24:39
結論、今やnewの結果をチェックするコードは無意味。
寧ろ、適切に例外処理をしておくべし。
# MSVCならcatchじゃなくてCATCHを使うのかな?

494:デフォルトの名無しさん
10/07/18 12:29:26
>>488
メモリ確保については環境によるだろうが、通常は失敗しない。
しかし、たとえばWindowsで目一杯メモリを使うと
仮想メモリが不足しているとか警告が出てくると思うが、
そういう状況では失敗するかもしれない。

それはそうと、newが失敗したときはデフォルトで例外を投げるので、
if文で失敗を調べるのは方法が間違っているかもしれない。

495:488
10/07/18 12:58:13
>newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、
コンストラクタでは例外が発生しないフレームワークを使っています
また、個人的にはコンストラクタの例外が嫌いなので作らないようにしたいと思います

>それはそうと、newが失敗したときはデフォルトで例外を投げるので、
これは、システムが保証している事なんですか



496:デフォルトの名無しさん
10/07/18 13:20:25
VC6の時代に作られた

497:デフォルトの名無しさん
10/07/18 13:43:32
少なくともC++03とC++0xの規格ではnewでメモリ確保に失敗したときは
std::bad_allocを投げるよう定められている。

498:デフォルトの名無しさん
10/07/18 14:49:10
bad allocはめどいから投げっぱなしにしてmainで取って終わりにしちゃうよね普通

499:デフォルトの名無しさん
10/07/18 18:07:44
ああstd::bad_allocを投げるような場合はprintf()もまともに動くかどうか
わからん状態だからな

500:デフォルトの名無しさん
10/07/19 02:07:17
win7 64bitでVisualStudio2005は問題なく動作します?
64bitアプリを作成するには専用コンパイラが必要というだけで普通に使う分には問題ないですよね?

501:デフォルトの名無しさん
10/07/19 02:57:51
>>500
すべての機能が正常に動くかはわからんが、とりあえずこっちの64bitWin7では動いている。
32bitアプリも64bitアプリもビルドできる。

502:デフォルトの名無しさん
10/07/19 09:39:54
>>495 何年前からタイムスリップしてきたんですか?

503:デフォルトの名無しさん
10/07/19 11:23:40
煽りとか要らない

504:デフォルトの名無しさん
10/07/19 14:28:18
>>501
ありがとう、これでPCの更新ができるわ

505:デフォルトの名無しさん
10/07/19 20:03:34
>>504
URLリンク(www.microsoft.com)

506:デフォルトの名無しさん
10/07/20 18:32:31
frind classにしても「private メンバー にアクセスできません。」というエラーが出てしまいます

class A{
private:
int aaaa;
public:
friend class B;
};

class B{
public:
void err(int hoge){
hoge=30;
}
};

main(){
A a;
B b;
b.err(a.aaaa);
}

ソースを要約するとこんな感じです
ggってみて似たような質問があったのですが、それでは名前空間がどうたらという結果でしたがクラスA,Bは名前空間に入れていません
using namespace std;は使っていますが関係あるかどうか・・・

507:デフォルトの名無しさん
10/07/20 18:37:30
>>506
friend class B;
と書くと、Bのメンバ関数からAのメンバにアクセスできるようになる。
そのソースではa.aaaaが書いてあるのはmain()
main()はBのメンバか?

B::err()の中身が気にはなるが、まぁ別の話。

508:デフォルトの名無しさん
10/07/20 18:51:43
なるほど・・・そういうことでしたか
main関数の中身をなんらかのクラスを作って移住させれば動きました。ありがとうございます

errで意味ないことしてるのは渡すメンバーの中身を書き換えたりしない・・・みたいな意味合いです


509:デフォルトの名無しさん
10/07/21 13:57:17
自作のヘッダやライブラリをまとめておく場所って定石みたいなものがありますか?
基本どこでもいいと思ってるんですけど、こうやっておくと便利、みたいなものがあれば教えて頂きたく。
OSはWindowsで、Visual Studioでの使用を想定してます。

510:デフォルトの名無しさん
10/07/21 13:58:43
>>509
どこでも置いてもいい
インクルードパス指定すればおk

511:デフォルトの名無しさん
10/07/21 18:24:57
>>510
どこへ置いてもあまりメリット・デメリットはないってことですかね。
適当な場所を決めてまとめるようにします。
ありがとうございました。

512:デフォルトの名無しさん
10/07/21 19:47:19
/usr/includeとかってのはバカなのか?

513:デフォルトの名無しさん
10/07/21 20:36:13
ホーム直下に俺様ライブラリフォルダを作ってる
ルート権限がない計算機で仕事することもあるし

514:デフォルトの名無しさん
10/07/21 20:57:20
%HOME%\My Include
%HOME%\My Library
これに入れるとすごくWindowsっぽいですよ。

>>512 ないない。せめて/usr/local/include

515:デフォルトの名無しさん
10/07/22 00:27:11
定期的に更新する5つのオブジェクトの内容を画面に表示するとき

・ひとつの表示クラスに5個のオブジェクトを所有させる
・表示領域を担当する表示クラスを5個作ってそれぞれを結びつける

どちらにした方がやりやすいでしょうか・・・?

516:デフォルトの名無しさん
10/07/22 00:33:40
その5つのobjは互いに全然関係ないもの?

517:デフォルトの名無しさん
10/07/22 00:41:05
ひとつのクラスもしくは多態的な関係です

518:デフォルトの名無しさん
10/07/22 07:37:34
>>515
スレ違いっぽいね。
↓こっちでどうぞ。
スレリンク(tech板)

519:デフォルトの名無しさん
10/07/22 20:58:57
new Test();とnew Test;は何か違う事はありますか?


520:デフォルトの名無しさん
10/07/22 21:03:47
>>519
前者は引数無しコンストラクタを呼び出す
後者はデフォルトコンストラクタを呼び出す

521:デフォルトの名無しさん
10/07/22 21:11:37
>>520
thx

522:デフォルトの名無しさん
10/07/22 22:55:06
メンバ変数ってnewでインスタンス化する意味ってあるんですか?

523:デフォルトの名無しさん
10/07/22 22:57:22
メンバ変数がポインタの場合とか

524:デフォルトの名無しさん
10/07/23 01:25:56
>>519-521
てきとうなこといってんじゃねーよ。

後者は POD について値が不定となる。 POD じゃなければどちらも同じ。

525:デフォルトの名無しさん
10/07/23 15:30:06
>>519-521
これはひどいwwww


>>522
すげー巨大だからヒープに確保しておきたいという事情がある時とか。


526:デフォルトの名無しさん
10/07/23 15:43:02
>>522
配列を持つクラスを継承すると罠にハマる

527:デフォルトの名無しさん
10/07/24 01:09:10
>>526 くわしく

528:デフォルトの名無しさん
10/07/24 08:28:38
>>520 をさらし上げ

529:デフォルトの名無しさん
10/07/24 15:17:51
>>526
それ、そのクラスかお前がバグってただけだろ。

530:デフォルトの名無しさん
10/07/24 16:16:57
>>526
まさか配列の各要素がDeep copy されなくて云々なんて言わないよな?
そんな事で罠とか言わないよな?

531:デフォルトの名無しさん
10/07/24 16:25:41
>524 も同じレベル。
>後者は POD について値が不定となる。 POD じゃなければどちらも同じ。


532:デフォルトの名無しさん
10/07/24 16:38:36
間違ってると思うなら正しい答えを書こうぜ

533:デフォルトの名無しさん
10/07/24 16:38:57
・・・つまり、何がちがうんだってばよ?

534:デフォルトの名無しさん
10/07/24 17:06:43
試したけど>>524の正しいよな
URLリンク(codepad.org)

535:デフォルトの名無しさん
10/07/24 21:35:04
お前らこれで満足だろ
§5.3.4 New

15 A new-expression that creates an object of type T initializes that object as follows:
? If the new-initializer is omitted:
? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
? Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;

536:デフォルトの名無しさん
10/07/24 23:52:30
>>531
プッ

537:デフォルトの名無しさん
10/07/25 00:00:05
>>524正しいじゃん

538:デフォルトの名無しさん
10/07/25 03:50:53
いくつかの乱数を作るときに、全ての乱数の和が常に同じになるようにすることって出来ますかね?
例えば1~5の範囲の乱数を3つ作って、その3つの乱数の和は常に10になる、みたいな

"同じ数"から乱数分引いていって、残った分を最後の乱数にすればいいかと思ったんですが
それだと上の例で5が2つ出たら最後は0になって範囲外になってしまいます

539:デフォルトの名無しさん
10/07/25 04:46:45
#define N 3
#define R 5
int r[N];
int left = 10;
int i, tmp;
for(i = 0; i < N - 1; ++i){
  tmp =  left - (N - i);
  r[i] = (rand() % (tmp < R - 1 ? tmp : R - 1)) + 1;
  left -= r[i];
}
r[N - 1] = left;

540:デフォルトの名無しさん
10/07/25 04:57:55
適当に乱数を3つ出して、その比率に応じた数値に直せば良いんじゃないの。
もちろんそれをやると実数になっちゃうので、最後の微調整は必要だけど(あと0を除く処理とかも)。

例えばrand()を使って 23, 66, 70 の3つが得られたとすれば
23 + 66 + 70 = 159 から
それぞれ 10 * 23/159, 10 * 66/159, 10 * 70/159 にするとか。

まあ最後の要素は引き算にすべきで、さらに
2つ目からn-1個目の切り上げ切り捨ての判断も
個々にではなく、それまでの累計を基にしないと
最後の数が(引き算で求めても)範囲外になる可能性が出てきちゃうね。

541:デフォルトの名無しさん
10/07/25 12:56:05
>>538
割合を乱数で出したらダメなの?
例えば常に和が10と決まっていて乱数範囲が1~5だと言うなら、
和に対して 0.5~0.1 の乱数を一つと、
1.0 から 上の乱数を引いた物に対して、また 0.5~0.1 の乱数を求めれば

542:デフォルトの名無しさん
10/07/25 13:06:28
>>540>>541 は考え方は似てるけど、>>541 の方がスマート


543:デフォルトの名無しさん
10/07/25 13:11:33
和が10になる組み合わせを列挙しておいて
乱数でいずれかの組み合わせを選択する
数値の出力順も乱数で決定する

この方法なら最初の組み合わせを限定する事で
特定の数値が出やすいとかいうのを排除しやすい

544:デフォルトの名無しさん
10/07/25 13:27:33
和が1000で50個の値の組み合わせ、とかだった場合どうすんのそれw


545:デフォルトの名無しさん
10/07/25 13:35:09
いずれにしても 1, 1, 5 とかの順番で出ちゃったら破綻するな
最後は引き算にして、範囲外になったら最初から振り直すのが確実じゃね?

やり直しなしで求めるとした場合
出したい乱数の合計値をT、乱数の最大値・最小値をRmax・Rmin、
これまでに出た乱数の合計値をt、残りの乱数の個数をNと置いて
N>1の時は乱数の下限値を max(Rmin, T-t-(N-1)*Rmax)
上限値を max(Rmax, T-t-(N-1)*Rmin)
N=1(最後の一回)の時は r[n] = T-t とすれば良いかと。

546:デフォルトの名無しさん
10/07/25 13:42:56
>>539でいいじゃん

547:デフォルトの名無しさん
10/07/25 13:51:23
>>546
1が2回出たら困るやん

548:デフォルトの名無しさん
10/07/25 14:28:53
>>541でいいじゃん

549:デフォルトの名無しさん
10/07/25 15:36:49
randが0吐いたら困るんじゃね

550:デフォルトの名無しさん
10/07/25 15:41:06
これで満足か?
#include<stdio.h>
#include<stdlib.h>

#define MAX_NUM 5
#define MIN_NUM 1
#define SUM_NUM 10
#define NUM_NUM 3
void swap(int *a, int *b){int c;c=*a;*a=*b;*b=c;}

int main(void){
int i, sum, rest, max_num, min_num;
int nums[NUM_NUM];

for(i=NUM_NUM-1,rest=SUM_NUM;i>=0;i--){
max_num=MAX_NUM;
min_num=MIN_NUM;
if(rest-(MAX_NUM*i)>MIN_NUM) min_num=rest-(MAX_NUM*i);
if(rest-(MIN_NUM*i)<MAX_NUM) max_num=rest-(MIN_NUM*i);
if(max_num<min_num) exit(1);
nums[i]=rand()%(max_num-min_num+1)+min_num;
rest-=nums[i];
}
for(i=0;i<NUM_NUM;i++) swap(&nums[i], &nums[rand()%(i+1)]);

for(i=0, sum=0;i<NUM_NUM;i++){
printf("%d\n", nums[i]);
sum+=nums[i];
}
printf("\nsum=%d\n", sum);
return 0;
}

551:デフォルトの名無しさん
10/07/25 15:55:29
まあ>>538を読めば、自身がわかってないことがわかるが
最後の数字(最後に限らないが)を、それまでに算出した数を元に決めるやり方というのは
「乱数」の性質を満たしておらず、最後の数字に偏りが出る。

ただ、それでも良いのかもしれないけどね。

552:デフォルトの名無しさん
10/07/25 16:50:50
総和が決まっててそれを構成する複数の値を求めたいってのは、
幅が決まってる数直線上に、複数の区切り位置をランダムに決めてくのと同じ事なので、
>>541 の考え方がシンプルでいいかもしれない。割合のランダム


553:デフォルトの名無しさん
10/07/25 18:56:01
文字列を暗号化して色々な事に使いたいのですが、
RSAとAESのライブラリがある所をご存知ないですか?

554:デフォルトの名無しさん
10/07/25 19:02:53
main関数のreturnについて質問。


C/C++の宿題片付けます 138代目
スレリンク(tech板:416番)

416以降main関数のreturn 0;は省略可能か、
それが規格上の言語仕様なのかコンパイラ依存なのか、
スレチな議論が延々と続いてるんで、引き取ってくれ。

555:デフォルトの名無しさん
10/07/25 19:16:30
return文 wikipedia

return文に遭遇しないまま関数の終わりまでプログラムが実行された場合、
そこに式を省略したreturn;が行われたと見なされる。ただし、C99とC++98では、
main関数に限り、そのmain関数の戻り値の型がintであればreturn 0;が
あったと見なされる(X3010 9頁 5.1.2.2.3、X3014 35頁 3.6.1 5節参照)

556:デフォルトの名無しさん
10/07/25 19:17:14
いつの版のか知らんが手元にあったやつ載せとく。これでいいだろ。
> 5.1.2.2.3 Program termination
> 1 If the return type of the main function is a type compatible with int, a return from the
> initial call to the main function is equivalent to calling the exit function with the value
> returned by the main function as its argument;9) reaching the } that terminates the main
> function returns a value of 0. If the return type is not compatible with int, the
> termination status returned to the host environment is unspecified.

557:デフォルトの名無しさん
10/07/25 20:05:00
C/C++の宿題片付けます 138代目
スレリンク(tech板:551-553番)


551 名前:デフォルトの名無しさん[] 投稿日:2010/07/25(日) 19:40:48
>>1
> 気に入らない質問やその他の発言はスルーの方向で。
return 0; は ○省略可能 ×不要

552 名前:デフォルトの名無しさん[sage] 投稿日:2010/07/25(日) 19:41:43
【結論】

mainのreturn 0; は ○不要 ○有ってもいい △記述の省略は可

C99では、mainの } に達したら、0を返して終了する。
C++では、mainの最後に達したら、return 0; を実行する。

553 名前:デフォルトの名無しさん[] 投稿日:2010/07/25(日) 20:02:21
return 0; は ×不要 ○省略可 ○各自で適切に記述
勝手に不要としないで下さい ><;
お前の存在こそ、このスレにとっては不要です ><;

558:デフォルトの名無しさん
10/07/25 20:11:35
不要と省略可能がどう違うのか説明してもらわないと、わけがわからないな。
どうせくだらない思い込みだからどうでもいいんだけど。

559:デフォルトの名無しさん
10/07/25 20:17:37
なかったらデフォルト値が使われるだけで不要な訳ではない
ということでしょう

560:デフォルトの名無しさん
10/07/25 20:28:53
みんな目的語省略しすぎだな.
 プロセスローダ側から見てmainの返値は不要ではない
 return 0; の記述は省略可能
 retrun 0; を省略できる場合にわざわざ書く労力は不要


561:デフォルトの名無しさん
10/07/25 21:15:58
政治的に正しい言語定義が必要だな

562:デフォルトの名無しさん
10/07/25 23:26:38
記述が不要だって言ってるのに終了コード自体が不要だって言ってると勘違いした人が、
わざとなのか知らないが、誤解を埋めるための目的語を添えずにわめき続けている、と。

563:デフォルトの名無しさん
10/07/25 23:50:26
もう放っておけばいいよ

564:デフォルトの名無しさん
10/07/26 12:55:10
くだらない質問ですが、mapを使う際、変数名はどう命名するのが自然ですか?
たとえばこのような場合、address_map? store_map?

std::map<std::wstring, int> hoge;
hoge[店の名前] = 場所

565:デフォルトの名無しさん
10/07/26 13:15:46
>>538です
多くの回答ありがとうございました
割合をランダムで出す方向で行きたいと思います

566:デフォルトの名無しさん
10/07/26 17:36:50
>>564
冗長でいいなら、店の名前_場所_mapのようにするのが自然。
もうちょっと縮めたいなら、場所_mapの方が良好だと個人的に思う。

567:デフォルトの名無しさん
10/07/26 22:57:34
>>566
ありがとうございます
普通の配列のように、値の方で命名するのも良さそうですね

568:デフォルトの名無しさん
10/07/27 13:24:17
C++の型は静的であって、型を間違えたところでコンパイラに怒られるだけ
どのコンテナなのかもしくは配列なのか分からないんじゃ、扱い方が分からないんじゃないかと言われるかもしれないが
どのみちmapだとだけ分かってもどうせ格納してる型を知るには宣言に飛ぶ必要がある
コンテナの種類を載せることも冗長ではないか

569:デフォルトの名無しさん
10/07/27 23:30:18
「場所マップ」、「場所リスト」とかなら分かるけど「場所」だけじゃ気持ち悪いじゃん

570:デフォルトの名無しさん
10/07/28 01:00:04
場所[店] と書いて使うんならありじゃね?

571:デフォルトの名無しさん
10/07/28 09:40:15
ユーザー定義の構造体やクラスを関数の返り値にするのってコストの面や
返り値が変更点になったときその影響範囲が広くて大変なことになりそうですが
普通にやって良いものなのでしょうか?

それでも2値以上返す場合はそうするしかないのでしょうか?

572:デフォルトの名無しさん
10/07/28 21:19:52
const unsigned char s[] = "char";
const unsigned char *s = "char";

下の書き方だとgccに怒られるのですが、なぜ怒られるんですか?


573:デフォルトの名無しさん
10/07/28 23:18:30
あるクラスのメソッドで構造体を引数にとるとき
クラスが多態的になるとき引数の構造体も多態的に扱うというのは有りなのでしょうか?

また、このとき構造体も基底部をインターフェイスとした方がいいでしょうか?

574:デフォルトの名無しさん
10/07/29 00:04:06
>>572
上の"char"は{ 'c', 'h', 'a', 'r', '\0' }の構文糖。
下の"char"では無名のconst char[]が作られ、
const char*はconst unsigned char*に変換できないのでエラーになる。

575:デフォルトの名無しさん
10/07/29 00:47:45
>>571
コストは実測してみろ。
影響範囲がどうのということは代替案はグローバル変数か?ありえん。

たいていは読みやすく書いておけばいい。
「返す」というなら素直に戻り値にするのがいいだろう。

576:デフォルトの名無しさん
10/07/29 00:48:29
>>572 エラーメッセージ嫁。

577:デフォルトの名無しさん
10/07/29 00:49:34
>>573
クラスが多態的なのと引数が多態的なのは関係ない。別々で考えて好きにすればいい。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch