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


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

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



1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


331 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:21:23 ]
ttp://www.cs.bme.hu/~bodon/en/apriori/
↑のサイトのプログラムを落として
makeしてみたらエラーがでて、makeできませんでした。
どのようにしたらmakeできますか?

実行はCygwin上で行ってます。

エラー内容は
$ make
g++ Input_Output_Manager.o Apriori.o Trie.o Apriori_Trie.o main.o -o ../apriori

Input_Output_Manager.o: In function `_ZN20Input_Output_ManagerC2ERSt14basic_ifstreamIcSt11char_traitsIcEEPKc':
Input_Output_Manager.cpp:(.text+0x2f): undefined reference to `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'
Input_Output_Manager.cpp:(.text+0x4a): undefined reference to `_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev'



Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x0): undefin
ed reference to `_ZTVN10__cxxabiv120__si_class_type_infoE'
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x8): undefin
ed reference to `_ZTISt14basic_ofstreamIcSt11char_traitsIcEE'
collect2: ld returned 1 exit status
make: *** [../apriori] Error 1

332 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:42:17 ]
>>331
うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ


333 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:48:07 ]
>>329
小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。

演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。

334 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:20:48 ]
>>332
成功しました。ありがとうございます。

335 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:23:04 ]
>>332
暇人乙

336 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:52:44 ]
>>335
暇潰しにもならんかったよ


337 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:54:11 ]
暇過ぎw

338 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:44:29 ]
続けて、質問すみません。
さっきの
ttp://www.cs.bme.hu/~bodon/en/apriori/
のやつなんですが、

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4208.txt
↑のもっと長いようなデータ読み込ませようとすると

11 [sig] apriori 436 open_stackdumpfile: Dumping stack trace to apriori.exe.stackdump

ってでて、動きません。

動くようにするには、どの部分をどのようにすればいいですか?

339 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 23:51:01 ]
マルチーズ乙



340 名前:デフォルトの名無しさん [2007/06/11(月) 11:47:18 ]
g++で、Aというクラスを継承したBというクラスを作成し、
void func(B obj_arg) という関数を定義してBを渡すと、
Bのコピーコンストラクタは呼ばれるのですが、Aは通常のコンストラクタが
呼ばれます。(コピーコンストラクタではない、と言う意味です)
これは、なぜこのようになっているのでしょうか?
いまC++を勉強中ですが、この部分が納得できずにいます。
すみませんがどなたか理由を教えてもらえませんでしょうか?



341 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:26:40 ]
>>340
再現する最小限のソース貼って


342 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:29:24 ]
class A {
A(){}
A(int n){}
};

class B:A {
B(){}
B(int n){}
};

B b(1);

って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる?
とESPしてみる

343 名前:デフォルトの名無しさん [2007/06/11(月) 12:46:26 ]
>>341
#include <iostream>
using namespace std;

class aaa {
public:
  aaa() {printf("%p: [%s]: %s called\n",this,"aaa","constructor");}
  aaa(const aaa &a) {printf("%p: [%s]: %s called\n",this,"aaa","copy constructor");}
  ~aaa() {printf("%p: [%s]: %s called\n", this, "aaa", "destructor");}
};

class bbb : public aaa {
public:
  bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
  bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
  ~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};

void func2(bbb x){return;}

int main()
{
    bbb x;
    func2(x);
    return 0;
}


344 名前:デフォルトの名無しさん [2007/06/11(月) 12:47:18 ]
>>343
改行が多すぎるといわれたので、わけました。

実行結果は以下のようになりました。
~/> g++ samp.cpp
~/> ./a.out
0xbfc07bee: [aaa]: constructor called
0xbfc07bee: [bbb]: constructor called
0xbfc07bef: [aaa]: constructor called
0xbfc07bef: [bbb]: copy constructor called
0xbfc07bef: [bbb]: destructor called
0xbfc07bef: [aaa]: destructor called
0xbfc07bee: [bbb]: destructor called
0xbfc07bee: [aaa]: destructor called



345 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:52:34 ]
>>344
class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
- bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
+ bbb(const bbb &b): aaa (b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};


346 名前:デフォルトの名無しさん [2007/06/11(月) 12:57:06 ]
>>345
すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。

どうやら勉強不足のようです。
失礼しました。

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


347 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:59:40 ]
エスパー342


348 名前:デフォルトの名無しさん [2007/06/11(月) 13:16:15 ]
>>342
>>347
なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。


349 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 13:19:25 ]
>>348
コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。



350 名前:デフォルトの名無しさん [2007/06/11(月) 13:25:20 ]
>>349
でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)

351 名前:342 mailto:sage [2007/06/11(月) 13:48:27 ]
コンストラクタの呼び出し方は独学でやってると大抵詰まる。
>>342にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。

352 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:21:19 ]
string::find と string::find_first_of 、
string::rfind と string::find_last_of って、
どう違うの? 同じ?

353 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:23:36 ]
rの有無、firstかlastかの違い
begin側から探し始めるかeng側から探し始めるかの違い

354 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:52:19 ]
ごめん。左右の比較の話。

解説を穴が空くほど読んだら
全然違う関数と分かった。

355 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 14:27:03 ]
ostringstream って、flush も endl もしないで str 呼んだら
不完全なまま出力されることってあるの?

大丈夫だって保証があればいいんだけど。

356 名前:デフォルトの名無しさん [2007/06/12(火) 18:12:14 ]
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに
何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?

357 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 18:15:59 ]
__DATE__ と __TIME__

358 名前:デフォルトの名無しさん [2007/06/12(火) 18:23:26 ]
>357
感謝するわよ。


359 名前:デフォルトの名無しさん [2007/06/12(火) 18:34:03 ]
もう一つ教えてちょうだい。
Jun 12 2007
って出るのを、
2007年6月12日にするにはどうしたらいいかしら?



360 名前:デフォルトの名無しさん [2007/06/12(火) 20:18:53 ]
入力した自然数を4で割り、4つの変数に収めた後、
余りをランダムに割り振るプログラムを書いて見ました
#include<ctime>
#include<cstdlib>
#include<iostream>
using namespace std;

int main()
{
int a;//適当な大きさの変数を読み取らせるための変数
int c1;
int c2;
int c3;
int c4;//aを4で割り、余りをこの4つの数値にランダムに格納する

int b;
c1=c2=c3=c4=0;
scanf("%d",&a);
b=a % 4;
printf("%d,%d\n",a/4,b);
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

while(b>0)
{
srand(time(NULL));
int dice=rand() % 4;

361 名前:360 [2007/06/12(火) 20:20:06 ]
続きです
switch(dice)
{
case 0:
{
c1++;
c2+=0;
c3+=0;
c4+=0;
}
case 1:
{
c1+=0;
c2++;
c3+=0;
c4+=0;
}
case 2:
{
c1+=0;
c2+=0;
c3++;
c4+=0;
}
case 3:
{
c1+=0;
c2+=0;
c3+=0; c4++;
}
}

362 名前:360 [2007/06/12(火) 20:22:09 ]
printf("%d\n",dice);
//dice=0;
b--;
}

printf("分配計算後に\n");
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

c1+=(int)a/4;
c2+=(int)a/4;
c3+=(int)a/4;
c4+=(int)a/4;

printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

scanf("%d",&c1);
return 0;
}

このように作ったのですが、余りが2になる場合に
どうしても余分な計算をしているようです。

srand(time(NULL));
int dice=rand() % 4;
に問題があるのか、case文がおかしいのか分からず迷っております

よろしくお願いします

363 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:25:30 ]
>>360
+=0て

364 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:26:45 ]
caseの後にbreakするんだ

365 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:29:49 ]
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は >>364 の指摘してるとおりだと思うが

366 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:37:55 ]
>>359
実行時に自分で変換すれば。

367 名前:MSX++ mailto:sage [2007/06/12(火) 20:42:32 ]
while(b--) {
*(int *)(((void *)(&c1))+(rand()&3))++;
}
ただし、c1からc4までが連続定義されているものとする。ANSI

環境依存なら。
int cx[4];
while(b--) {
cx[rand()&3]++;
}

かな?


368 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:42:47 ]
引数からファイルパスを取得し、同じ内容を別名で出力するプログラムに
関してですが、コマンドプロンプトなどで引数を与えると正常にo.txtが
出力されるのですが、ドラッグアンドドロップだと上手く動作しないです。
ご指南お願いします。
OSはWindowsです。

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc,char **argv)
{
char buf[256];
ifstream ifs(argv[1]);
ofstream ofs("o.txt");

while( ifs.getline(buf,sizeof(buf)))
ofs << buf << endl;

return 0;
}

369 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:47:31 ]
よく意味がわからんけど
コマンドプロンプトにD&Dしてんの?

どういうオブジェクトをD&Dしてて、
どううまく動作しないのさ



370 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:49:25 ]
とりあえず引数を表示してみるとか

371 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:53:09 ]
o.txtをフルパスで書いたら?
なんか変なトコに出力してるだけだろ。

372 名前:360 mailto:sage [2007/06/12(火) 20:54:29 ]
>>364-365 など各位

皆様ありがとうございます。早速配列化と、breakを試してみます

373 名前:368 mailto:sage [2007/06/12(火) 20:55:45 ]
実行ファイルがtest.exeだとしたら、batファイルなどで
test.exe i.txtへの絶対パス
test.exe i.txt
両者ともファイルの書き出しに成功しますが、
エクスプローラー上でi.txtをtest.exeへD&Dするとファイルの書き出しが
行われません。
ちなみに引数を表示するプログラムを追加してみたところ、見た目は
batファイルとD&D両者とも同じ引数を受け取っているように見えます。

374 名前:368 mailto:sage [2007/06/12(火) 21:08:30 ]
>>371
なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。

んでコマンドライン第一引数から実行ファイルまでのパスを切り取って
output.txtに付け加えてあげたら、正常動作しました。

ありがとうございます。

375 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 21:13:46 ]
バッチファイルをダブルクリックした場合と、D&Dした場合じゃあ
カレントディレクトリの位置が違うんだよね。
よく分からん仕様ではあるよな

376 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:11:47 ]
a != '.'
これの右側(コンマ)の意味がわかりません。

377 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:14:35 ]
>>376
コンマなんてどこにあるんだ?

378 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:15:35 ]
>>376
右側にあるのはシングルクォーテーション「'」とピリオド「.」

379 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:17:00 ]
間違いました。ピリオドです。



380 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:18:29 ]
>>376
じゃあ、' の意味は分かるのか?

381 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:20:53 ]
>>376
aとか!=の意味は?

382 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:25:13 ]
''はAとかの文字リテラルを表示するときに使う物だと思います。

383 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:26:08 ]
>>381
分かります。

384 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:27:31 ]
>>383
本当にわかるのか?!=の意味言ってみ

385 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:29:51 ]
変数aが右オペランドと等しくないということです。

386 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:30:19 ]
そんなに虐めちゃるなよwって思ったけど確かに
>>376 の質問にちゃんと応えようとしたらこうなるのは致し方ないかw

387 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:33:21 ]
>>385
変数aがピリオドと等しくない

388 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:42:32 ]
>>387
これはひどい

389 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:43:55 ]
.は文字リテラルということですね。分かりました。



390 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:47:43 ]
'.' が文字リテラルであって
. が文字リテラルなわけではない。

391 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:15:42 ]
すいません、質問お願いします。
本日 -> という記号が出てきたんですが、どういった意味なんでしょう

よろしくお願いします。

392 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:20:34 ]
アロー演算子といいます

よろぴくね

393 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:23:44 ]
>>391
wisdom.sakura.ne.jp/programming/c/c36.html
ここ見ると幸せな予感。

394 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:30:40 ]
>>392-393
ありがとうございます。早速読んでみます

395 名前:デフォルトの名無しさん [2007/06/13(水) 00:33:33 ]
ヘッダファイルなんですが、以下をBorlandでコンパイルすると
「train.h 6: 宣言の構文エラー」となります。なぜでしょうか^^;
初心者ゆえ何卒ご指導願います。
−−−−−−−−−−−−−−−
#ifndef __TRAIN_H__
#define __TRAIN_H__

#include<stdio.h>

class Train
{
public:
Train();
void SetSpeed(int aspeed);
int GetSpeed();
void Run();
void Stop();
private:
int speed;
};

#endif // __TRAIN_H__

396 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:40:02 ]
ファイルの拡張子、.cとかになってねぇか?
Borland詳しく知らないが、C言語でclass使えないぞ。

397 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:44:14 ]
予約識別子死ね。

398 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:16:30 ]
stdにsort()とstable_sort()があるけど
stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない
ってどういうときに重要になるの?
別関数を用意してまで保障する必要性がわからない。

399 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:20:20 ]
ヒント:ソートに使った以外のデータメンバ



400 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:27:34 ]
>>398
すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。

401 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:35:50 ]
あとstable_sortは最悪条件の時の効率がsortより良い。

402 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:37:10 ]
それを気にするなら、
ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。

403 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:48:03 ]
std::sort_heap()

404 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:14:47 ]
インデックスとアドレスを保持した構造体を使ってソートして、
それから位置を変更していけば、
安定かつ高速なソートができると思う。
作業領域が必要にはなるけどね。

405 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:22:42 ]
それでも最適化なら・・・最適化ならきっと何とかしてくれる・・・!!

406 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:22:35 ]
C++のthrow/catch

みたいな例外処理を何て呼ぶんですか?

407 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:26:41 ]
>>406
「例外処理」でいいような気がするけど、「C++のthrow/catch」に限定するなら
「C++例外処理」とでも呼べば?

408 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:28:09 ]
>C++例外処理

これの存在を知らない組み込みな人たちに伝えるので、
センセーショナルでクールな呼び名を教えて欲しいでつ。

409 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:34:50 ]
C++言語的割り込み処理



410 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:36:43 ]
それだ!

組み込みな人達から見ればセンセーショナルでクールでつね。











でも、自分から見れば八百長っぽくてダサダサ。

411 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:38:21 ]
C++ってなんでfinallyがないの?
あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか?

char *str = new char[256];
try {
  ...
  if (...) return;
  ...
} finally {
  delete [] str;
}
と、C/C++初めて1年の俺が適当に言ってみる。

412 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:41:27 ]
>>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする

413 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:42:02 ]
>>411
そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。

414 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:45:13 ]
>>411
↓こっちのが楽だと思わんか?

std::string str(256);
...
if (...) return;
...

415 名前:デフォルトの名無しさん [2007/06/13(水) 09:53:43 ]
そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。

416 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:54:43 ]
>C++言語的割り込み処理

割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ?
なら意味違うかも。。。

417 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:48:04 ]
割り込みはダメだろう・・・常識的に考えて。

例外処理は例外処理。
例外的な動作が起こった場合に行う処理。

418 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:52:15 ]
食い込みはおk?

419 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:56:58 ]
>例外的な動作が起こった場合に行う処理。

C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、
これじゃ、区別付かないじゃん。



420 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:02:07 ]
でも「C++例外処理」じゃ不満なんだろ。
センセーショナルでクールな・・・

       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ
       くく

「禿式例外処理」なんてどうだ?
組み込みのおっさん相手にはかなりセンセーショナルだろ。

421 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:03:25 ]
>でも「C++例外処理」じゃ不満なんだろ。

当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。

>「禿式例外処理」なんてどうだ?

オヤジギャグ?

422 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:06:32 ]
別に俺用語を生み出すのは構わないけど
他人とコミュニケーションを取るときには使わないでね

423 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:08:45 ]
洋本でも普通にC++EHだしな

424 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:09:05 ]
禿が作ったんだから禿式ってことね。
www.research.att.com/~bs/

エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。

425 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:15:26 ]
儂の例外処理は108式まで……

426 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:27:04 ]
構造化例外ってのは別物だっけ課?

427 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:38:04 ]
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう

428 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 12:42:32 ]
>>419
それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。

429 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:04:41 ]
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age



430 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:14:35 ]
memsetのこと?

431 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 14:27:31 ]
fill() だろ。

432 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:00:43 ]
ostream::write って引数 const char* だけど、
何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?

433 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:05:48 ]
>>432
writeは何をする関数かな?

434 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:12:29 ]
あなたに愛を届ける関数です。

435 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:19:29 ]
int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
putchar(c);
fclose(fp);
return 0;
}

このプログラムの動作でsample.txtが日本語でも大丈夫なようにしたいのですが、
fgetcをどう変えたら良いでしょうか?

436 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:26:24 ]
>>435
それで大丈夫なように見えるけど、どうダメだったの?

437 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:33:31 ]
>>436
すいません、putcharの下に一つ入れ忘れましたorz

int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
{
putchar(c);
putchar('\n');
}
fclose(fp);
return 0;
}

正しくはこうでした。

438 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:34:43 ]
cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる

439 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:36:49 ]
文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様



440 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:48:56 ]
>>439
ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。

441 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:32:27 ]
>>406-
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない

442 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:58:33 ]
>Windowsの例外処理

これってなんだけ?

443 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:16:48 ]
>>433
そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。

444 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:19:30 ]
関係ある。ちゃんと読め。
fwrite は、サイズと数を指定するだろ。
ストリームはストリームを指定するんだ

445 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:21:58 ]
>>442
「構造化例外」つってんのにググりもしないとは。

>>443
それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?

446 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:22:12 ]
>>442
__try
__except
__finally

447 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:23:58 ]
>>445
ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。

448 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:24:54 ]
>>444
要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?

449 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:26:38 ]
文字列をbyte列と言い換えればいいのでは、streamは



450 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:34:58 ]
クラステンプレートbasic_ostreamのこともたまには思い出してあげてください
writeの引数はただのcharではなくテンプレート引数よ

451 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:36:15 ]
ああ、そうか。
そういうことか・・・。
了解。分かった。

452 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:42:34 ]
俺が思うに、basic_ostream::writeに対応するCの関数は、
fwriteではなくfputs/fputwsなのだろう

するとfwriteに対応するのはなんだろうという気になるが

453 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:52:56 ]
いや、ヌル文字を無視するから、fputs とは対応しないと思う。
wostream::write がある以上、
fwrite と basic_ostream::write も対応しないんだろうな。

用途的には fwrite と ostream::write が対応するんだろうけど。

454 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:56:35 ]
ところで、例えば int 値をバイナリでファイルに書き込みたいときは、

ofstream f("hoge", ios::binary);

int x = 0x12345678;
f.write(reinterpret_cast<const char*>(&x), sizeof x);

という風に使うんだよね?(エラー処理は略)

455 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:29:12 ]
new されたサイズをプログラマが知る方法はないですか?

456 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:37:32 ]
>>455
標準にはない

457 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:03:36 ]
>>454
たしかに、そうなんだけどね。ただ、
 basic_ofstream<wchat_t> f;
のときは
 f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t));
になる。
const void* を引数にするとわけ分からなくならないか?

458 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:05:26 ]
"wchat_t"?

459 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:11:26 ]
>>457
それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる

write()で書いたものが変換をバイパスできるわけではないし



460 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:34:48 ]
>>457
それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。

const void* でわけわからなくなる点に関しては、
既にその点で了解してる。

バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。

461 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:14:07 ]
>>455 >>456
replacement newを書くというのはだめなのかな。

462 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:16:49 ]
>>459
エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?

>>459
うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。

463 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:21:27 ]
>>462
まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。

464 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:38:59 ]
C言語でプログラムを作ってコンパイルまでできているのに
いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、
数回入力するとエラーがでるんだけどなんでなんだい?

465 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:40:41 ]
コンパイルが通るからってバグが無いわけじゃないだろ

その情報だけじゃ何が原因かはわからんけど

466 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:42:18 ]
文てきには間違ってないんだけど、
長い文を書いて作ると絶対なるんだよね。
行数の限界とかってないよね?

467 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:47:43 ]
>>457
char 以外のストリームでバイナリ出入力っていうのがそもそも無理。

468 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:12:04 ]
>>463
一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。
少なくともSTLportでは、
ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign
の順で文字などが出力されているのだけど、
このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。
多分、探し方が足りないだけだと思うので。

>>467
basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、
UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、
charだけ特別ってわけにはいかなかったんだろうね。

469 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:37 ]
学校で作ったライブラリがあって、ヘッダーファイルに
#define GameMain \
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\
{\
MSG lpMsg;\
HWND hWnd;\
WNDCLASS myProg;\
(以下略)

って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・
とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。

学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz



470 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:47 ]
>>468
足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。


471 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:18:50 ]
>>469
どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ

472 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:19:40 ]
>>469
}が全角だとか言う落ちはないよな?

473 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:24:58 ]
キタ━━━━(゚∀゚)━━━━!!!!

474 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:35:19 ]
>>471 >>472
半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz

475 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:50:00 ]
問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。

コマンドプロンプトで実行したら絶対途中でエラーがでる。
なぜだよおい。

476 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:51:56 ]
環境もコードも示さずにその質問に答えられるのはエスパーだけだな
まぁexeとかコマンドプロンプトとか言ってるし
Windowsなんだろうなってことぐらいはわかるが

477 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:53:56 ]
まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード
で、VS2003のIDEのデフォルト設定がMBCSで、
VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、
こけてるんじゃないか。

478 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:54:51 ]
素人なもんですみません。windowsです。
でなにを示せばいいんだい。
ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。

479 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:00:51 ]
>>459
Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど

>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う



480 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:02:34 ]
>>478
素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。

481 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:04:08 ]
>>480
おそらくコマンドプロンプトがバグってると思われるんだけどな

482 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:10:04 ]
ソース出せばいいと思うよ

483 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:11:04 ]
>>481
わらた、おもしろすぎ。

484 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:13:38 ]
>>481
windows入れなおせばいいと思うよ

485 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:26:52 ]
>>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。

486 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:39:48 ]
>>474
/* */ 型のコメントなら大丈夫だよ

487 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:46:04 ]
>>857
へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?

488 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:47:30 ]
何誤爆しとんねんw

489 名前:487 mailto:sage [2007/06/13(水) 23:51:37 ]
誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><




490 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:52:31 ]
NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、
「NULLは 0」ということを前提としたプログラムは書くべきではないですか?
例えば…
void hoge(Foo *bar)
{
  // bar が NULL じゃなかったら
  if (bar != NULL) // こっちはいいけど
  if (bar)       // こう書く奴は死ぬべきでしょうか
    bar->...;
}

491 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:54:41 ]
>>355
それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。

492 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:56:23 ]
>>490 www.kouno.jp/home/c_faq/c5.html

493 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 01:24:47 ]
>>491
d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。

まあ、flush しといた方が無難そうだな。

494 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:27:21 ]
pc11.2ch.net/test/read.cgi/tech/1181087371/l2
↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?

495 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:35:50 ]
scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す

496 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:18:35 ]
>>495さんのレスを参考に変えてみたのですが、

for(i=0;i<3;i++){
printf("%d行目の\n",i+1);
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0)
printf("%d",array[i][j]);
j--;
}
こういうことかと思ったらやはり間違ってて、
「一文字捨てる」という概念がいまいち分からないです。
どう直したらarray[i][j]のエラー入力は無かったことにされて
再入力するようにできるんでしょうか?orz

497 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:35:41 ]
int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) {
 scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }

498 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:43:41 ]
>>497
%*cって何やってるんだろうとググったらscanfに見たことも無い仕様が
いっぱいで今更ながらにビックリしてしまったです…。
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0){
scanf("%*c");
j--;
}
レスを参考にこんな感じで直したらいけそうな感じになりました!
scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><

499 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:53:50 ]
つか、getchar でいいような



500 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:12:28 ]
>>499
getcharって文字入力用じゃないですか?
これで使う方法ってあります?


501 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:26:25 ]
scanf("%*c"); の代わりに使ってみればいいじゃないの。

502 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:34:57 ]
>>501
あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><

503 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:46:34 ]
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。

504 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:48:53 ]
余計複雑になるだけだと思うが。

505 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 03:24:22 ]
fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし


506 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 04:02:27 ]
1行につき数値1つ?

507 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:00:46 ]
>>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ


508 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:48:27 ]
すまんす

509 名前:デフォルトの名無しさん [2007/06/15(金) 15:35:13 ]
C++の質問です。
学習用の簡単なクラス(名前をsampとします)があって、内部でintの値を保持してます。
そこに、friend関数でoperator+()を追加したいです。
最初、
samp operator+(samp & obj, int i)
samp operator+(int i, samp & obj)
としたところ、
obj = 10 + obj;
はOKだったのですが、
obj = 10 + obj1 + 10;
はコンパイルがエラーになりました。
そこで、
samp operator+(samp obj, int i)
samp operator+(int i, samp obj)
としたところ、コンパイルが通り、結果も意図した通りになりました。
これはなぜなのでしょうか?
ちなみに、operator+()の内部は以下のように書きました。

samp operator+(int i, samp obj)
{
samp temp;
temp.x = obj.x + i;
temp.y = obj.y + i;
temp.z = obj.z + i;
return temp;
}

引数の順序が反対の関数も内部は同じです。
今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、




510 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 15:43:21 ]
samp operator+(samp & obj, int const & i) ;
samp operator+(int const & i, samp & obj) ;

511 名前:デフォルトの名無しさん [2007/06/15(金) 15:56:02 ]
>>510
そのように書き直してみましたが、コンパイル通りませんでした。
以下はコンパイルエラーのメッセージです。

> g++ samp.cpp
samp.cpp: In function 'int main()':
samp.cpp:50: error: no match for 'operator+' in 'operator+(((const int&)((const int*)(&10))), ((samp&)(& obj3))) + obj3'
samp.cpp:37: note: candidates are: samp operator+(const int&, samp&)
samp.cpp:28: note: samp operator+(samp&, const int&)

512 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:10:41 ]
>>511
すまん、sampの分を忘れてた。

samp operator+(samp const & obj, int const & i) ;
samp operator+(int const & i, samp const & obj) ;

理由?
関数の戻り値はrvalueだからかな。

513 名前:デフォルトの名無しさん [2007/06/15(金) 16:13:55 ]
やたらと質問ばかりですいません。

operator||()って、定義するのが何か変な感じなのですが、
||って、そもそも
式A || 式B
などと書いて、
式Aまたは式Bのどちらかが真なら、真。
という意味ですよね?このとき、||の右側の値と左側の値とを
特にoperator||(式A, 式B)としてひとつの関数内で一緒に処理しなくては
ならないような状況ってないんじゃないか
と思うのですが、
,,,
ここまで書いてきて、なんだか自分でも意味が分からなくなってきました。
ぶっちゃけた話、operator||()が定義できてよかった、という状況って
ありますでしょうか?
よろしくお願いします。



514 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:18:52 ]
C++再考かなにかで、画像をくっつける演算子に使っていた気がするな。
実装例では簡単にするため、たんなる文字列だったが。

operator , () より使い道はあるだろ。
こんなものBoostを実装できるような変態なやつらしか使わない。

515 名前:デフォルトの名無しさん [2007/06/15(金) 16:23:16 ]
>>512
教えてもらった書き方でコンパイルは通りました。
しかし、今度は
obj3 = 10 + obj3 + obj3 + 100;
と書くとコンパイルが通りません。
ずーっと御世話になってますので、ソースを張り付けます。

#include <iostream>
using namespace std;
class samp {
int x;
public:
samp(int i = 0) {x = i;}
friend samp operator+(int const & i, samp const & obj);
friend samp operator+(samp const & obj, int const & i);
};
samp operator+(samp const & obj, int const & i) {
samp temp;
temp.x = obj.x + i;
return temp;
}
samp operator+(int const & i, samp const & obj) {
samp temp;
temp.x = obj.x + i;
return temp;
}
int main() {
samp obj1(10), obj2(7), obj3;
obj3 = 10 + obj3 + obj3 + 100;
return 0;
}

516 名前:デフォルトの名無しさん [2007/06/15(金) 16:31:38 ]
>>514
そうなんですか。実は今独修C++を読んでいますが、そこに、operator,()は
特殊なのでこの本では扱わない、と書いてあって、不思議な感じがして
いました。たしかに手元のマシンでgrepしてみると出てきますね。

rpm -ql boost-devel | xargs egrep 'operator\,\('
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
...(略)

前このスレで、独修C++をやればそれなりに力が付く、とだれかが
書いていたのでこの本を勉強しているのですが、たしかにいい本だと
思ってます。でも、この本にも書いてないことがあるのですね。
この本を終えたら次はどういう本で勉強すべきでしょうか?



517 名前:デフォルトの名無しさん [2007/06/15(金) 16:34:28 ]
>>514
C++再考ですね。見てみます。
ありがとうございます。

518 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:36:00 ]
ミスターoperatorでも目指してんのか

519 名前:デフォルトの名無しさん [2007/06/15(金) 16:38:22 ]
今見ている本が演算子のオーバーロードの章(6章)なので、
つい上記のような質問ばかりになってしまいました。




520 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:39:39 ]
よっ、ミスターoperator!

521 名前:257 mailto:sage [2007/06/15(金) 16:40:19 ]
friend samp operator+(samp const & obj1, samp const & obj2);
が必要

((10 + obj3) +obj3) + 100 の順に評価される

operator 演算子呼ばれた後のの戻り型を並べると
((samp) + samp) + int
~~~~~~~~~~~~~~~~ ここの演算定義がいない

522 名前:デフォルトの名無しさん [2007/06/15(金) 17:03:04 ]
>>521
なるほど。。。。その通りですね。定義したらコンパイルできました。
あと、constの役割(とくにint const &iのあたりとか)が気になるのですが、
それはもうすこし自分で調べてみます。

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

523 名前:デフォルトの名無しさん [2007/06/15(金) 17:10:09 ]
>>520
いやいや。。
それにしても、C++はいろいろ複雑ですね。



524 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:18:12 ]
質問なんですが、C/C++の開発環境でお勧めのものってありますか。
JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね?
ソースコードを書くのが楽したいというのが要望です。

ちなみに、TurboC++を試してみましたがどうもしっくりこない。
というか、まだほとんど使っていないので分からないというのが正直なところです。


環境、WinXP 普通の32ビット
(MacやLinuxでもおk)
当方のスペック 大学3年 Javaは普通に使いこなせるという程度

525 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:19:06 ]
よろしくお願いします。

526 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:54:37 ]
Eclipseが使えるんなら、そいつにCDTを入れてみたら?

527 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 18:22:25 ]
operator&&、operator||、operator, をオーバーロードすると短絡評価でなくなってしまう
見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない

528 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:50:20 ]
>>505
sscan系でも%iというものがあってな

>>512
intは値渡しでいいだろ

>>513
> operator||()が定義できてよかった、という状況って
Boost.Lambda

529 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:57:07 ]
samp じゃなくて smap に見えた



530 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:57:36 ]
>>524
VC++のアカデミックは?
アカデミックは超安かった希ガス

ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。

531 名前:デフォルトの名無しさん [2007/06/15(金) 20:10:29 ]
VC++2005expressは無料だよ

532 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 20:40:21 ]
express だな。
商用には使えないが、それはアカデミックも同じだな。

533 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:12:36 ]
嘘言ってはいけません。
Expressも他のEditionと同じように、
商用利用を禁止する条項はない

534 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:27:41 ]
VC++EEはリソースの扱いが難点だけど
それ以外は十分だな

535 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:30:29 ]
>>533
前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。

536 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 23:32:57 ]
アカデミックも商用可能だな。

537 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:23:34 ]
std::wofstream m_ofs;

void CLog::Write( LPCWSTR strMessage )
{
if( !m_ofs.is_open() ) return;

m_ofs << " Message:" << strMessage;
}

こういうものを作って

CLog log;
log.Write( L"てすと" );

という風に使うと

Message:

としか出力されません。何故でしょうか?

538 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:26:58 ]
よく判らんけど、バッファリングされているからじゃないの?
フラッシュしたら?

539 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:27:16 ]
ロケールの設定



540 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:34:54 ]
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです

>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・


541 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:40:59 ]
>>540
imbue()

ただし
forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7

542 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:47:35 ]
>>541
おお!解決しました!
ありがとうございます!

543 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 02:41:07 ]
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?

544 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:12:13 ]
>>543
gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。

545 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:36:40 ]
wchar_t wfunc[sizeof __FUNCTION__];
swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);

とか自分で変換するしかないのかな。
バッファが必要だから、マクロ化するのも難しいな。
グローバル変数を使うのもアレだし・・・。

546 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:33:44 ]
>>540
"japanese"より""を勧める

547 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:10:16 ]
>>528
scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし


548 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:16:07 ]
>>530
普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる

今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする


549 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:21:21 ]
>>547
それはわかる
1行目の10進以外もに反応しただけ



550 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:21:59 ]
>>547
つ[%i]

って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。

551 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:23:48 ]
ツーか、むしろ突っ込むならここだな。
>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

552 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:30:18 ]
通りすがりのものだけど、>>550-551 のほうが変なこと言ってる

553 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:38:37 ]
知らないくせに偉そうな事を言うってのが
とてもみっともないんだよね

554 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:41:57 ]
あ、ちょっと違うか。
>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。

555 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:51:44 ]
最近Cの勉強を始めたのですが、いくつか質問したいことがあります。

講座などを見ると、Javaにできることは全部できると感じましたが、
Javaと同じようにやるのが難しいこととか、
Javaの感覚でやると間違いやすいこととか、ありますか?

それからヘッダというのはプログラム本体と同じように、
関数を定義したり、グローバルに使う変数を保持してもいいのでしょうか?

VCにはJavaのEclipseのように、打った瞬間コンパイルエラーを表示してくれたり、
3,4字打ったら当てはまる構文や変数名やクラス名を出してくれる機能はないのでしょうか?
それがないと、打ち間違いしそうです。

556 名前:デフォルトの名無しさん [2007/06/16(土) 12:03:58 ]
すみません。6年ほど前にVC++6.0を買ったんですが、入門者だった私にはどうにも難しくて
C言語のコマンドラインプログラムを勉強した程度です(独習C)のレベルです。

それから、JavaやPHPやASP.NETのWeb系の仕事をしたりしていたんですが、最近、Win32プログラムの昔買った本とかを
読んでみると結構理解できます。自分としてはVCへの憧れが強いので、MFCとかも勉強したいとおもっているのですが
いまさらMFCを勉強しても無駄でしょうか?C++の文法的知識はあります。

557 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:08:01 ]
MFCをやる利点てあるかな?
全部C#でことたりね?

558 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:10:30 ]
>>544 >>545
ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。

559 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 13:44:46 ]
>>557
.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。

個人的には今からMFCやる意味はあんまり無いと思うけど。



560 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:02:04 ]
ファイルに関するたくさんの情報を保持するクラスを作りたいんですが、
こういう時のメンバ変数はprivateにするのが基本なんですよね?
Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?

561 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:16:15 ]
>>560
必要に応じて。

562 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:30:56 ]
>>561
ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。

563 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:41:34 ]
どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら
クラスじゃなくて構造体を使うとかしたら?

564 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:00:11 ]
>>562
駄目な理由を考えてみる

565 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:17:27 ]
クラスにしたのはコンストラクタとデストラクタが使いたかったからです。
このクラスの変数には別のクラスから頻繁にアクセスする必要があって、
こういう場合隠蔽する意味あるのかな〜?と。
かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・
とか思ってなかなか決められないんです。

566 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:20:29 ]
あ、構造体でもコンストラクタとデストラクタは使えますね。
結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。

567 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:22:57 ]
好きにしろ

568 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:28:29 ]
>このクラスの変数には別のクラスから頻繁にアクセスする必要があって
まずこの設計が間違ってないかどうかを考えるべきだと思う

569 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:35:22 ]
ですよね。
ちょっと検討しなおします。
ありがとうございました。



570 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 16:54:32 ]
横からなんですけど>>556さんの質問に関連して、
現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?




571 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:00:38 ]
>>570
とりあえず.NETかそうでないほうをやるかで決めては

572 名前:そう思えるかどうかが分岐点 mailto:sage [2007/06/16(土) 17:06:41 ]
MFCやればいいじゃん。趣味なら何の問題もないよ。
もう後がないとか、2005EEでできないとか、どうでもいいじゃん。

573 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:11:21 ]
さすがにMFCはもうやめといたほうがいいだろ。
どうせまだ入り口程度しかやってないんだろ。
だったら早いうちに.Netへ移行しておけ。

574 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:15:07 ]
>>571
今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz

>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。

575 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:17:10 ]
>>573
やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?

576 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:08 ]
>>575
プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。

577 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:19 ]
プログラマになるなら最低7つは言語を習得しないとダメです。

578 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:34:41 ]
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について

579 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:31 ]
そもそも何を持ってマスターと言うのか?
C++0xとかまだ定まっていないというのに



580 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:53 ]
難易度高くても、C++しかできないとな。
つぶしが利かない。

581 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:39:32 ]
>>580
C++できたら他の言語なんて楽勝だろ。

582 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:41:42 ]
楽勝だったら、7つ覚えておけよw

583 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:45:08 ]
仕事で必要になるたびに覚えていけばいい

584 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:46:28 ]
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。

585 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:47:52 ]
いやぁ、C++からJavaはちょっと壁があるぞ。
C++言語を覚えただけじゃ、GUIもスレッドもないしな。

586 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:49:11 ]
さらに言うと、現状javaの案件といえば、サーバーサイドだな。

587 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:50:03 ]
>>585
でも逆の Java → C++ と違って挫折することはまずないだろ。

588 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:51:10 ]
それで挫折する人間なら、C++覚える時点で挫折するよ。

589 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:59:05 ]
GUI は言語の問題じゃなくてライブラリの問題だと思うが。



590 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:00:40 ]
言語だけのC言語ベースでイインジャネ?
設計まで絡んだら知らん。

591 名前:デフォルトの名無しさん [2007/06/16(土) 18:01:50 ]
reinterpretって何て読むの?
ネット辞典で調べてもでてこん。

592 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:03:55 ]
リインタープリット

593 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:12:53 ]
文法だけではプログラマになれないよ。
そもそも質問主は、MFCか.Netかで迷ってるんだよ?
それでもライブラリだから論点が外れてるといえるか?

594 名前:デフォルトの名無しさん [2007/06/16(土) 18:17:30 ]
俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね
いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ
for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ
イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ

595 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 19:20:14 ]
>>594
慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。

596 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:22:02 ]
俺はC++からJavaScript+HTMLをやったんだが。
C#には簡単に移行出来たな。

597 名前:W [2007/06/16(土) 20:25:34 ]
JavaScript+HTML

598 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:30:12 ]
CやC++で
a = b = c = d;
としたら、段階的に処理を書くと、
a = b = (c = d); //まずcにdが代入される
a = (b = c) = d; //次にbにcが代入される
(a = b) = c = d; //最後にaにbが代入される
と言うことでいいのでしょうか?
詳しく教えてほしいです

599 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:34:46 ]
a = (b = (c = d))
c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される



600 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:40:25 ]
なるほど!
わかりやすい説明をありがとうございます!!

601 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:43:43 ]
HTMLってプログラミング言語?

602 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:46:19 ]
・変数がない
・ループ、条件分岐が書けない
・関数も書けない

修飾言語ではあるが、プログラム言語ではないかな

603 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:53:07 ]
HTMLはマークアップ言語です。


604 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:01:38 ]
>>602-603
トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。

605 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:03:45 ]
プリコンパイル済みヘッダーを作ったですが
デバッグモードではビルドできるのに、リリースにすると

error LNK2005: *** は既に ***.obj で定義されています。

というエラーが全部のファイルで発生してしまいます。
これは何故なんでしょうか?
環境はVS2005です

606 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:28:39 ]
>>605 エラーです

607 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:32:24 ]
特異な言語といえばSQLもそうだな。
一応Languageと名前についてるけど、
これをプログラミング言語と呼ぶのは
ちょっと抵抗ある。

608 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:49:46 ]
ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が

609 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:51:48 ]
SQLに制御構造をつけたのがストアドじゃないかね



610 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:58:45 ]
HTMLだってLanguageと名前についてるだろ
SQLはプログラミング言語じゃなくて、データベース言語だろ

611 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:59:39 ]
Languageは「言語」であって「プログラミング言語」ではないからな。

612 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:07:19 ]
>>594
for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。

グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。

613 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:08:18 ]
HTML はプログラミング言語じゃなくてマークアップ言語。

TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。

614 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:56:37 ]
SQLがチューリング完全でないことは明白。

615 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 00:22:00 ]
何言ってるの?

616 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:02:03 ]
わからないなら調べてから聞けよ

617 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:07:53 ]
あ〜い、とぅいまてぇ〜ん♪

618 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 09:34:26 ]
>>602
IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ

619 名前:デフォルトの名無しさん [2007/06/17(日) 12:43:27 ]
親クラスのprotectedな変数が、public継承した子クラスでは
publicにならずにprotectedなままなのは何故ですか?

親クラスのpublicな変数が、protected継承した子クラスでは
protectedになるのに。

publicよりもprotectedの方が強いと理解しておけばよいのでしょうか




620 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:46:05 ]
そう理解しておけばおk
そしてプライベートが最強と

621 名前:デフォルトの名無しさん [2007/06/17(日) 12:55:24 ]
>>620
ありがとうございました。
そう理解しときます。


622 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:57:34 ]
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、
thisポインタを戻り値にしない書き方ってありますか?

623 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:58:53 ]
ありますよ

624 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:01:58 ]
それは例えばどういった書き方でしょうか?


625 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:03:17 ]
>>624 void operator = (...

626 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:04:43 ]
a = b + c + d;の処理の流れって、

a = (b + c) + d; //まずbにcを加算
a = ((b + c) + d); //次にb+cの値にdを加算

最後に aに代入という流れで理解してよいのでしょうか?
詳しく教えてください。

627 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:25 ]
デバッグ

628 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:57 ]
デバッグする環境がありません・・・すいません。


629 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:09:12 ]
>>625
マジサンキュー
課題が終わった



630 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:10:36 ]
>>626
その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。

631 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:13:46 ]
いや待て、a = b + (c + d)という解釈をしているかも知らん。

632 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:28:39 ]
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから
b+cが先だろ

633 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:40:39 ]
>>630
しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。

634 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:56:56 ]
>>633
コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?

635 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:08:24 ]
???
誰もそんな事言ってないぞ?

636 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:14:59 ]
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。

637 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:18:51 ]
a = b() + c() + d();

で、b, c, d の呼び出される順番は未定義だっけ?
結合順と、各項の評価順はまた別の話だよな。

638 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:37:07 ]
fgetsの使い方で

fgets(buf, sizeof(buf), stdin);

のような常套句がありますが、これは sizeof(char) が1であることが
前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が
想定した数の2倍になってしまうと思うのですが。

こういった書き方は問題ないのでしょうか。

639 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:40:16 ]
>>638
sizeof(char)は常に1



640 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:41:57 ]
>>638
sizeof(char)は絶対に1だから安心しる。

ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。

641 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:43:56 ]
charが1バイトじゃなくて1バイトの定義がchar?

642 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:44:21 ]
charは常に1バイト

643 名前:638 mailto:sage [2007/06/17(日) 18:47:09 ]
レスありがとうございます。
charが常に1バイトというのは、規格で決まっているのですか?

644 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:48:49 ]
>>643
決まってる。

ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。

645 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:50:14 ]
誤解があるといけないから念のために言うけど、
char が 1 バイトというのは決まってるが、
1 バイトが 8 ビットである保証はない。
1 バイトが 9 ビットの環境もある。

646 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:51:29 ]
1バイトのビット数を取得するマクロってありますか?

647 名前:638 mailto:sage [2007/06/17(日) 18:51:48 ]
皆さんありがとうございました。勉強になりました。

648 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:57:42 ]
アルバイトのヒト数を取得するユニクロってありますか?

649 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 19:19:40 ]
>>646
CHAR_BIT



650 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 20:31:59 ]
>>637
未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。

651 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:06:51 ]
たまにはlimits.hも眺めよう

652 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:08:10 ]
float.h も眺めようぜ

653 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:10:15 ]
眺めすぎて惚れるなよ

654 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:21:25 ]
やだ・・///

655 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:22:24 ]
構造体やクラスを関数内で定義すること、
つまり、以下のようなことがしたいのですが
これは規格でできることが保証されていますか?

void hoge() {
 struct hage {
  ...
 };
 ...
}

656 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:23:44 ]
>>655 C89 の頃から余裕で使える。

657 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:26:15 ]
ちなみに関数内で関数は定義できません

658 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:33:03 ]
>>656
ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。

>>657
構造体やクラスの静的関数で代用するのが常套句になってますね。

659 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:44:49 ]
GCC の拡張でよければ関数内関数は使えるんだけどな。確か。



660 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 22:29:53 ]
関数内クラスをテンプレート引数に出来たらなぁ
と思うことがある

661 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:05:55 ]
charのバイト数の件で便乗質問。
shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか?
決まってないのなら確実に2byteの型は有りますか?
また確実に4byteの型はありますか?

662 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:07:51 ]
longは32bit以上というのはK&Rに書かれていた気がする。
というか規格原理主義者によると、1バイトが何ビットかも決められていないとか

663 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:17:52 ]
>>661
#include <stdint.h> で int16_t と int32_t でおk。

664 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:20:56 ]
>>661
sizeof (short) == 2と規格で定まっているわけではない
でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける
同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける

2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える
前者がぴったし16ビットの型(対応する型があれば用意されている)
後者は少なくとも16ビットの型(絶対に用意されている)

後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得

C++に今のところ<stdint.h>は、存在しないから
<boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない

665 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:32:47 ]
C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?

666 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:48:09 ]
必要以上に移植性を求めるのは不毛。
必要以上に移植性を失うのも愚かしいこと。

667 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:53:10 ]
俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^

668 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:56:15 ]
どうせ他の部分も環境依存しまくりなんだろ?
どんどん使っちゃえYO!

669 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:04:53 ]
>>667
__closureも活用してもっと便利に!



670 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:13:58 ]
勉強になるな。

671 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:19:27 ]
#include <stdint.h>
VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。

672 名前:デフォルトの名無しさん [2007/06/18(月) 00:47:53 ]
質問
void hoge()
{
何かの処理
#ifdef DEBUG
  printf("Debug %s, nanka);
#endif
何かの処理
#ifdef DEBUG
  printf("Debug %s, nanka);
#endif
↑こんな調子で数百行位ある
}
こういう汚い関数を直したいんだが

void DebugPrint(char *str)
{
#ifdef DEBUG
  printf("Debug %s, str);
#endif
}
void hoge()
{
何かの処理
  DebugPrint(nanka);
何かの処理
  DebugPrint(nanka);
}
って感じに直したいんだが、やったら動作変わっちゃう?
#ifdefあんま使ったこと無いから教えてくださいな

673 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:48:22 ]
そりゃそうだろ

674 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:49:09 ]
>>673
すんません
分かり易く解説お願いします

675 名前:673 mailto:sage [2007/06/18(月) 00:49:19 ]
>>671
の事ね

VC6が出来たのはだいぶ前だから

676 名前:672 mailto:sage [2007/06/18(月) 00:50:28 ]
>>675
あ、すんません
タイミング良かったんで即レス来たのかと思っちゃいましたw

677 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:57:26 ]
#ifdef DEBUG
  #define DEBUG_PRINT(a) printf("Debug %s, (a))
#else
  #define DEBUG_PRINT(a)
#endif


void hoge()
{
何かの処理
  DEBUG_PRINT(nanka);
何かの処理
  DEBUG_PRINT(nanka);
}

こういうのはよくやるな。
ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。

678 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:04:08 ]
>>677
おぉ、なるほど

後、確認なんですけど、自分が書いた>>672だと動作変わっちゃうんですよね?

勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz

679 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:05:32 ]
別に動きは変わらんと思うが



680 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:11:32 ]
>>679
あ、そうなんですか?
ありがとうございます

個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな〜と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)


681 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:12:16 ]
失礼、
×他から
○他からも


682 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:13:48 ]
動きは変わらないが、
後者は関数呼び出しのオーバーヘッドが発生する。


683 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:20:02 ]
関数本体の中にやたらと#ifdefなんかが入ってるのは、
あんまりいいコードとはいえないな。
「見づらくてしょうがない」というその感覚は限りなく正しい。
改善する方法をいろいろ考えるべきだな。


684 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:25:43 ]
>>682
すいません

そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?

>>683
ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです


685 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:39:54 ]
関数を呼び出すという処理は、それ自体スタック操作や
プログラムカウンタの移動などの処理が行われる。
だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で>>677の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。

ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。

でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?


686 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:47:04 ]
>>685
なるほど、詳しい解説ありがとうございます

せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね

687 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:56:30 ]
可変長引数マクロを使えるコンパイラならこんなこともできる
#if DEBUG
#define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__)
#else
#define DebugPrint(...)
#endif

688 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:01:41 ]
リリース版ではインライン関数にして、
コンパイラの最適化に期待する手もある。

689 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:02:11 ]
/* 古いコンパイラで使える技 */
#if DEBUG
#define DebugPrint(args) printf args
#else
#define DebugPrint(args)
#endif

/* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */
DebugPrint(("%d\n", 1234));



690 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:19 ]
古くなくてもできることないか?

691 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:47 ]
>>687,>>689
おぉ、凄いですね

色々ご教授ありがとうございます

>>688
もし良ければその方法も教えて頂けないでしょうか・・・

692 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:33 ]
1. インライン関数の定義を別ファイルに分ける

2. inline を INLINE マクロに置き換える
  INLINE マクロの定義は以下の通り(これは自分で定義する)

#ifdef NDEBUG
#define INLINE inline
#else
#define INLINE
#endif

3. リリース版の場合はヘッダファイルでインクルードする

#ifdef NDEBUG
#include "***.***"
#endif

4. デバッグ版の場合はソースファイルでインクルードする

#ifndef NDEBUG
#include "***.***"
#endif

693 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:49 ]
#if DEBUG
#define DebugPrint printf
#else
#define DebugPrint (int)sizeof
#endif

694 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:17:09 ]
C++なら、こんなことできるお

class DebugPrinter {
 DebugPrinter(const char *filename, int line) {...}
 void out(const char *format, ...) {...}
};

#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
#define DebugPrint
#endif

695 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:21:38 ]
>>694 リリースでエラーにならないか?

696 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:28 ]
>>695
エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。

697 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:35 ]
>>695
たぶん、ならんよ。リリース時は
DebugPrint("%d, %d", f(x), f(y)); → ("%d, %d", f(x), f(y));
ってなるだけだから。

ただ、これがいやなら、>>693のようにsizeofしちゃうか、
dummyの関数作って
#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
inline DebugPrintDummy(const char *filename, ...) {}
#define DebugPrint DebugPrintDummy
#endif
って感じにしちゃうのがいいかもね

698 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:33:27 ]
VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。

699 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:34:36 ]
if(1); else に置換するという技もある。
多分最適化で消える。



700 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:27 ]
>>697
関数 f が副作用を持ってたら問題があるな。

701 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:55 ]
VC++ならTRACEで以上では?

702 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:41:56 ]
皆さん
感謝、感激雨あられです

ちょっとF1見てる隙にこんなに書き込みが・・・

色々参考にさせてもらいます

703 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:52:34 ]
何F1見てんだよこのヤロー

704 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:55:55 ]
ああ、F1押すと長々と待たされた後で
役に立たないヘルプが出るよね

705 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:56:43 ]
>>700
まあ、必要なら>>699で多分消せるじゃね?

>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん

706 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:57:53 ]
必要ならって言うか、必須なんだぜ。

707 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:02:02 ]
>>706
いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?

708 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:06:34 ]
>>699 だと式のつもりが文になってしまうね。

709 名前:デフォルトの名無しさん [2007/06/18(月) 03:10:09 ]
ちょっと相談です。
言語はCでもC++でも構いません。
ちなみに開発環境はWin2000+VisualStudio2005です。

DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。
この関数は、処理結果を文字列として str に返してくれます。
strに渡される文字列の長さは *不明* です。
DLL、および関数Funcの中身を弄ることは出来ないものとします。

この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。




710 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:04 ]
>>708
これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy

711 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:48 ]
>>709
static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。

712 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:19:32 ]
>>709
Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです

通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。

例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません

713 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:21:19 ]
>>711
charが抜けた。すいません。

714 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:25:49 ]
>>707
そういやそうだな。

715 名前:709 mailto:sage [2007/06/18(月) 03:28:23 ]
即レスサンクス。
やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。

>711
とりあえず1万バイトくらいでがんばろうと思います。

>712
バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)


716 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:01:59 ]
>>715
え、本当にどうしようもないの?
仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?

そりゃDLLの設計が糞としか言いようがないが…

717 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:45:43 ]
gets を安全に使うにはどうすればいいですか?
っていう質問と一緒だね。残念ながら無理だ。

718 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 10:59:41 ]
仕様上から決まる例で32bit整数が最大値だとわかれば
常にその大きさの配列渡せば安心、かな

719 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:10:29 ]
メモリ使い切って落ちるに1票



720 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:12:45 ]
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ?
それにしても 32bit 最大値はやりすぎだろうけど。

721 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:50:56 ]
パイプとかその辺のOSの用意したプロセス間通信機能でどうにかするしかないんじゃね?

722 名前:デフォルトの名無しさん [2007/06/18(月) 13:48:29 ]
すいません、また質問させてください。

#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {a=x;}
};
class sub1 : virtual public base {
public:
sub1() : base(0) {}
};
class sub2 : virtual public base {
public:
sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {};
int main() {
sub3 obj;
obj.a = 10;
return 0;
}


これがコンパイル通らないんですが、baseクラスに引数のないコンストラクタを
追加するとコンパイル通るようになります。virtual指定で継承すると、引数のない
コンストラクタを呼ぶというルールなのでしょうか?


723 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:17:15 ]
#include <iostream>

namespace test_ {
  class base {
  public:
    base() { std::cout << "base::base()" << std::endl; }
    base(int x) { std::cout << "base::base(int x)" << std::endl; }
  };

  class derived1 : virtual public base {
  public:
    derived1() : base(0) { std::cout << "derived1::derived1()" << std::endl; }
    derived1(int x): base(x) { std::cout << "derived1::derived1(int x)" << std::endl; }
  };

  class derived2 : public derived1 {};
}
int main() {
  test_::derived2 a;
  return 0;
}
そのようですね
なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです

724 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:53:20 ]
>>722
>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;

725 名前:709 mailto:sage [2007/06/18(月) 15:00:50 ]
>716
一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。

726 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 15:21:26 ]
>>725
>一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
>3000とか4000とか飛んでるのを何度か見たことはありますが。

そりゃーDLLが糞でFAじゃね?
もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。
仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。
仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。

まぁがんがれw

727 名前:デフォルトの名無しさん [2007/06/18(月) 18:05:42 ]
#include <iostream>
#include <string>
#include <boost/function.hpp>
#include <boost/bind.hpp>

class Writer { public: void run(const std::string& str) { std::cout << str << std::endl; } };

class Module1 {
public: typedef boost::function<void(const std::string&)> func_t;
private: func_t func;
public:
  Module1(func_t func_) : func(func_) {}
  void run() { func("message"); }
};

int main() {
  Writer w;
  w.run("test");

  using boost::bind;
  Module1 module(
    static_cast<Module1::func_t>( bind(&Writer::run, &w) )
    );
  module.run();
  return 0;
}
Writerクラスのrun()をコールバック関数として、boost::bindを使ってクラスModule1に渡します
Module1はboost::functionを用いてこのコールバック関数を保持します
これを実現したいのですがエラーどころか、コンパイラ(VC2005のcl.exe)が落ちます(汗
どうすればこの動作を実現できるんでしょうか?

728 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 18:09:09 ]
自己解決しました
bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗

729 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 19:34:13 ]
>>722
class sub3 : public sub1, public sub2
{
  sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている



730 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:43:11 ]
こんばんは、皆さんに質問です
テンプレートの定数の引数をエレガントに記述する方法が分かりません

template <class Type, int Length> Array
{
   …Arrayの実装…
};

class Color : public Array< unsigned char, 3 > // RGBなので3
{
public:
   static const int ColorDimension = 3; // これは使えない…
   …Arrayの実装…
};

ここに出てくる3をエレガントに記述する方法が分かりません
グローバルで定義したりdefineディレクティブで定義したりは汚いですし、
無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。

731 名前:デフォルトの名無しさん [2007/06/18(月) 20:48:52 ]
元々汚いんだからエレガントなんて求めなくて良い

732 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:50:52 ]
少しはきれいに書ける方法としては派生元で定義してしまう方法ですが…

template <class Type, int Length> Array
{ …Arrayの実装… };

class ColorBase
{
public:
  const static int Dimension = 3;
}

class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3
{  …Arrayの実装… };

なんか微妙です…第一、継承する意味があるのかと…う〜ん。
でもnamespaceだと関連性の記述があいまいです。

さらにはこんな方法もあるのですが…
class TColor<int Length> : public ColorBase, public Array< unsigned char, Length >
{  …Arrayの実装… };

typedef TColor<3> Color;

結局これでは定数をtypedefに移しただけで意味がなく、
const TColor::Dimension=3;
typedef TColor<TColor::Dimension> Color;
とまでして構造をめちゃくちゃにするのなら、
そのまま3って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?

733 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:53:19 ]
>>731
では、その元々汚いものを綺麗にする方法を教えてください。

734 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:00:58 ]
>>730
Arrayに手を付けていいなら、

template <class Type, int Length_> Array
{
public:
  static const int Length = Length_;
  //...
};

class Color : public Array<unsigned char, 3> // RGBなので3
{
public:
  static const int ColorDimension = Length;
  //...
};


735 名前:デフォルトの名無しさん [2007/06/18(月) 21:10:10 ]
int g1;int g2; int ga[10];
main(){
int li;int l2; int la[10]; int lb[10][10];

printf("%d\n", &g1);
printf("%d\n", &g2);
printf("%d\n", &l1);
printf("%d\n", &l2);

printf("%d\n", &l1-&l2);
}


↑のようなプログラムの
printf("%d\n", &l1-&l2);の表示結果の意味と
大局変数ga と局所変数la がどのように並んでいるのかを答えろって
課題なのですが、全くもって意味が分かりませんorz

ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
これはどういう事を意味しているのでしょうか?

ga[10]とla[10]に関してですが、これは[0]〜[9]までの配列が用意されてるって事で良いんですかね?

ヒントの方よろしくお願いしますorz



736 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:14:01 ]
なぜに&

737 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:15:51 ]
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」

738 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:16:17 ]
すみません、いくつか質問させてください。
1、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか?
  int i = Array<int, 3>::Length;
  とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に
  初期化が行われるのでしょうか?

2、int i = Color::ColorDimension;
  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?

ちなみに、せっかく答えていただいたのに恐縮ですが、
class Color : public Array<unsigned char, 3>
の、3がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。

739 名前:730 mailto:sage [2007/06/18(月) 21:18:19 ]
あ、私は730で>>734さんに対してのコメントです



740 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:20:20 ]
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。


741 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:23:23 ]
>>735
>printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]〜[9]までの配列が用意されてるって事で
おk。

742 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:27:19 ]
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。

743 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:44:32 ]
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど

744 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:49:54 ]
>>741
理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。

745 名前:デフォルトの名無しさん [2007/06/18(月) 21:51:47 ]
>>736
頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。

>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。

>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。


>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。



746 名前:730 mailto:sage [2007/06/18(月) 21:54:59 ]
>>742
グローバルの名前空間は絶対に汚せない環境というのがございまして…
#define COLOR_DIMENSION 3
class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3
{
  …Arrayの実装…
};
#undef COLOR_DIMENSION
とかwww、もう何がなんだか…
#undef _COLOR_DIMENSION 3
あたりで我慢っすかねぇ

>>743
しかし、ArrayはColorとはあんまり関係なかったりして…
そもそも、public継承なのかprivate継承なのかという問題までありまして…

template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3
{
public:
   Color() { assert(Dimension==3); }
}
とか…いや、assertで比較している3がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも

747 名前:594デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:57:33 ]
C言語の全角半角処理について二点程分からないので、宜しかったらアドバイスを頂けたらと思います。
仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。
(CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。
現在、入力された文字列に「@全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」
(つまり@の処理は漢字や平仮名カタカナや英字は入力出来ます)
という処理と、「A全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」
(Aは、@の通過可能な条件に、全角半角数字が含まれます)
という処理と、「B全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。
半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで
どうにかなってますが、Aのハイフンの判別ができずに詰まってます。
使ってるソースは、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3606
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。

748 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:58:46 ]
>>745
とりあえずグダグダうるせえ。




749 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:00:47 ]
>730
というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。



750 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:03:07 ]
>747
ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。

751 名前:デフォルトの名無しさん [2007/06/18(月) 22:17:19 ]
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか?
継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?

752 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:21:47 ]
classでレガシーな初期化はできなかった希ガス。
class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。

753 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:39:10 ]
>752
全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。

754 名前:デフォルトの名無しさん [2007/06/18(月) 22:49:14 ]
サンクス。
しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。

755 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:00:50 ]
質問
 1. 死ぬまでenumハックを使うべきなのか。
 2. 死ぬまでexportは使ってはならないのか。

756 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:07:21 ]
>>755
1. そうです
2. そうです

早死にしないように気をつけて

757 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:10:24 ]
1 VC6を窓から投げ捨てりゃいいんじゃね
2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね

758 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:16:47 ]
>>754
www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014


759 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:44:18 ]
>738
初期化は実行時に起こる。
テンプレートが使用された時、というのはコンパイル時の話。

件の場合、定数化されてしまうというのを無視すると

int i = Array<int, 3>::Length;

とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。
で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも
初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。

>2、int i = Color::ColorDimension;
>  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。



760 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:38:16 ]
いくつかのサイトで見られたのですが、
STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。

761 名前:760 mailto:sage [2007/06/19(火) 07:24:58 ]
あ、すみません。
構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?


762 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:59:43 ]
>>760
定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。

>STARTUPINFO si = {};
コンパイル通った?

763 名前:760 mailto:sage [2007/06/19(火) 08:56:24 ]
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。
コンパイル通らない可能性もあるんですね。それなら使いません。

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?

764 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 08:56:28 ]
>>761
全部省略できるのは C++ だけ。

765 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 09:59:42 ]
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。

766 名前:デフォルトの名無しさん [2007/06/19(火) 10:21:17 ]
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。

767 名前:760 mailto:sage [2007/06/19(火) 11:07:01 ]
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。

768 名前:766 mailto:sage [2007/06/19(火) 12:48:11 ]
解決しますた

769 名前:デフォルトの名無しさん [2007/06/19(火) 12:57:26 ]
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。



770 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:01:28 ]
>>769
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。

771 名前:デフォルトの名無しさん [2007/06/19(火) 13:10:27 ]
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>

int main(){
printf("今現在BMPの画像");
return 0;
}

772 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:11:07 ]
どうせWindowsだろ
猫でも読んどけ

773 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:47:09 ]
丸投げは宿題スレ以外はだめ
今どこまで理解しててどこら辺がわからないのか書け

774 名前:デフォルトの名無しさん [2007/06/19(火) 14:38:22 ]
>>729
ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)



775 名前:デフォルトの名無しさん [2007/06/19(火) 14:46:23 ]
すいません、ソース貼り忘れた

#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {
a=x;
cout << "x=" << x << endl;
}
};
class sub1 : virtual public base {
public: sub1() : base(0) {}
};
class sub2 : virtual public base {
public: sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {
public: sub3() : base(33) {}
};
class sub4 : public sub3 {
public: sub4() : base(1) {}
};
int main()
{
sub4 obj;
obj.a = 10;
return 0;
}

776 名前:デフォルトの名無しさん [2007/06/19(火) 14:49:43 ]
win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり
win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか?
また、両者の使い分け基準って何かあるのですか?
たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか

777 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 14:56:41 ]
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?

778 名前:デフォルトの名無しさん [2007/06/19(火) 16:30:34 ]
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています

779 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:40:49 ]
try catchじゃ例外は出せない



780 名前:デフォルトの名無しさん [2007/06/19(火) 16:42:51 ]
tryの中でcatchに飛ばす方法を教えてください

781 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:48:03 ]
「C++ 例外」でググれ

782 名前:デフォルトの名無しさん [2007/06/19(火) 17:01:37 ]
このソースで
LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。
がでるんだけど、何が悪いか教えてください。
どうやったらwarning消せますか。ちゃんと.shareが使える形で。

#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
HANDLE x = NULL;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

783 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 17:24:35 ]
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1

784 名前:デフォルトの名無しさん [2007/06/19(火) 17:35:43 ]
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。

785 名前:783 mailto:sage [2007/06/19(火) 18:05:35 ]
releaseでもでなかった printfでx見たいからコンソールにした 複数プロセス起動させるとxの値が増加したからshareされてると思う@vc7.1 winxp sp2
#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/SECTION:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int main(int ac, char** av)
{
 printf("%d\n", x);
 x += 1;
 MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK);
 return 0;
}

786 名前:デフォルトの名無しさん [2007/06/19(火) 18:59:16 ]
>>785
まじですか。
こちらの環境はVS2005のExpress。
調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。

コンパイルエラーが出ないソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 ++x;
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

つづく

787 名前:デフォルトの名無しさん [2007/06/19(火) 19:01:28 ]
コンパイルエラーが出るソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

++x; がないだけ。
↑のは ×初期化されない ○一度も利用されることがない
かと思っています。

788 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 20:14:08 ]
最適化で消されてるだけじゃないかな
/Faで.asm見ればわかるよ

789 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:00:05 ]
スカトロCGを激しく集めるスレver27
sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537

537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528

 試 し た の か ? 

IDがC++



790 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:08:56 ]
よりにもよってスカかよw

791 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:12:52 ]
しかも logK か。
何か化学的な雰囲気を感じるぞ。

792 名前:730 mailto:sage [2007/06/19(火) 22:17:42 ]
>>759
Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?


793 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:19 ]
>>792
テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない

794 名前:730 mailto:sage [2007/06/19(火) 23:51:30 ]
>>793
ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。
コンパイル時に行われるということを考えると文法も分かりますね。

・OKな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B;
};
const int Base::  A = 1;
const int Derived:: B = A;

・ダメな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B = A;
};
const int Base::  A = 1;

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

795 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:55:57 ]
いかん
最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん

796 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 01:49:32 ]
例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで
template<typename T> value_t
{
public:
  T get() const { return value; }
  void set(T n) { value = n; }
private:
  T value;
};
という感じになると思います。value_t<int> とかなら問題ないと思いますが、
(普通は参照を使って渡す)クラスや構造体が型に指定されると、
無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。
ということで、最初から参照を使って、
template<typename T> value_t
{
public:
  const T & get() const { return value; }
  void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする
private:
  T value;
};
こう書いても問題ないですか?(というか、こう書くべきですか?)

797 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:00:31 ]
問題はないけど、
プリミティブ型だと結構遅くなる。


798 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:37:39 ]
>>796
boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか

799 名前:デフォルトの名無しさん [2007/06/20(水) 08:26:49 ]
>>783
>>788
ありがとう。「最適化で消された」みたいです。腑に落ちました。



800 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:49:37 ]
ofstream ofs("a.txt",ios::app);
ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl;
や、
if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName"))
だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも)

ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl;
や、
if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName"))
のようにhwndParentならクラッシュしません。これは何が原因でしょうか?

801 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:51:30 ]
>>800
各変数の値がどうなってるかくらい調べろよ

802 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:56:12 ]
>>800
とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?

803 名前:800 mailto:sage [2007/06/20(水) 13:04:12 ]
>>801
すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。

>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。

804 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:13:25 ]
C++で安全なコードを書きたいなら、キャスト前のチェックとか、
->の元がNULLでないことを保証するassertなんかは必須かと

というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?

805 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:17:03 ]
>>803
予測なんてしなくていいから、デバッグ実行しろ。

806 名前:800 mailto:sage [2007/06/20(水) 13:41:47 ]
>>804
lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。

>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。

807 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:56:34 ]
MSDNのCREATESTRUCTに関するヘルプには
Because the lpszClass member can contain a pointer to a local
(and thus inaccessable) atom, do not obtain the class name
by using this member. Use the GetClassName function instead.
と書かれているようだが。
lpszClassに直接アクセスしてクラス名を取得しようとするな
ってことじゃねえの。

808 名前:800 mailto:sage [2007/06/20(水) 15:24:02 ]
>>807
わざわざありがとうございました。

809 名前:デフォルトの名無しさん [2007/06/20(水) 19:21:18 ]
class Stone{
public:
Stone();
int color, groupNumber;
Stone *nextStone, * groupHead, *nextGroup;
};

Stone::Stone(){
color = groupNumber = 0;
*nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない
}
というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、
Boardオブジェクトを作りたいと考えています。

改行が多いといわれたので続きます



810 名前:809の続き [2007/06/20(水) 19:22:32 ]
class Board{
public:
   Board();
   Stone board[21][21];
   Stone *boardHead;
};

Board::Board{
*boardHead = &board; // (2).Stone(*)型はStone型に変換できない
for(int i; i < 20; i++){
int j;
for(j; j < 19; j++){
board[i][j].color = 3;
board[i][j].(*nextGroup) = board[i][j + 1];
   }
board[i][j].color = 3;
board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様
}
と表記したところ、(1).(2)のエラーが起きました。
配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?

811 名前:809、810 [2007/06/20(水) 19:24:44 ]
すいません。書き忘れです。

(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。

812 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:29:47 ]
(1)のところには、余計なカンマが付いている
(2)の最初の箇所は、余計な*が付いている
2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ

813 名前:デフォルトの名無しさん [2007/06/20(水) 19:31:34 ]
(1)で*付ける意味も分からんし

nextStone = groupHead = nextGroup = 0;

とか

814 名前:デフォルトの名無しさん [2007/06/20(水) 19:33:43 ]
すみません、質問させてください。

void foo(const char *const& hoge);

のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします


815 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:42:09 ]
constな(C++の)参照

宣言自体の読み解き方がわからなければ、ここでも読んでおけ
kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ

816 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:19:12 ]
>>812-813
あ、*の扱い方が間違ってたのか。ありがとうございました。

817 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:05:47 ]
windowsで、C++builder使用してます。

質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。

これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
 とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
 で、できそうでしょうか?

2番目だと簡単そうですか?

818 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:56:04 ]
ソフト単体ならパケット監視してどうこうということもできるだろうけど、
windowsのばあい、システムに対してユーザーが介入するのは難しい。

アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。


819 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:05:58 ]
>>817
ttp://www.wilderssecurity.com/showthread.php?t=112582
でも読んでみたら



820 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:29:39 ]
>>818
レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。

>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。

821 名前:デフォルトの名無しさん [2007/06/20(水) 22:47:33 ]
>>820
そんなあなたにフィルタドライバか、DLLインジェクション。

822 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:07:41 ]
なんで具体的にそのソフト名をいわんのかね。

823 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:36:12 ]
改造する気?

824 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:45:03 ]
C++でLinkポインタというのを作りました
所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります

質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…

825 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:53:56 ]
Lockできないboost::weak_ptrを実装したって話?

826 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:31:22 ]
あのー

(unsigned int) ((context->count[0] >> 3) & 0x3F)

これがなぜ64のあまりになるのですか?

827 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:33:42 ]
>>826
0x3fは2^6-1だから。

828 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:47:40 ]
0x3f=16*3+1*15

829 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:50:06 ]
えーとじゃあ
45と120の場合いくらになるんだろ
なんか計算あわない



830 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:52:38 ]
>>826
一瞬、LISPあたりのコードかと思った。

831 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:53:37 ]
ところでなんで
(context->count[0] >> 3)してるんだろう。

これすると値辺になる気がするのですが

832 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:05:29 ]
つーかそれ、
8で割った後に64で割った余りを求めてる事になるが


833 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:14:49 ]
あっそ、よかったね

834 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:30:08 ]
よくないという話だな

835 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:54:13 ]
>>826
10進数で下6桁残して上の桁を0にしたら
それは100万 (10^6) で割った余りになる。

それと同じように、0x3F で AND とると
(=2進数の下6ビットを残して上のビットをクリア)
64 (2^6) で割った余りになるわさ。

836 名前:ひろみつ [2007/06/21(木) 16:29:58 ]
Cって何言語で一版最初書かれたの?今のC言語はCで書かれてるとかいうのはなしね。

K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?

837 名前:デフォルトの名無しさん [2007/06/21(木) 16:33:43 ]
ひろみつ死ね

838 名前:デフォルトの名無しさん [2007/06/21(木) 16:50:44 ]
すみません。長いソース打ち込みたいとおもって、本屋で長いソースが載っている本を買ってきました。
www.amazon.co.jp/C%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E9%9B%86-%E6%9E%97-%E6%AD%A3%E5%B9%B8/dp/4320027108/ref=sr_1_3/250-4187414-6697033?ie=UTF8&s=books&qid=1182412183&sr=1-3
です。

QuickC対応って書いてあるんですが、VC++6.0でも大丈夫ですか?

839 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:10:28 ]
>>838
QuickC……

その本は今すぐ返品しなさいw
ソースが欲しいなら、
sourceforge.jp/
sourceforge.net/
なんかで探しなさい。
もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。



840 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:57:25 ]
94年じゃしょうがないな

841 名前:デフォルトの名無しさん [2007/06/21(木) 18:27:59 ]
unsigned conv_in:1;
という記述を見かけたのですが
このコロンはなんですか?

842 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:31:58 ]
>>841
ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。

843 名前:838 mailto:sage [2007/06/21(木) 18:33:45 ]
>>839
どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。

>>840
やっぱだめですよね。。どうもありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:35:49 ]
おいおい独学社ならそれくらい嫉妬家よ

845 名前:841 mailto:sage [2007/06/21(木) 18:44:33 ]
>>842
ありがとうございます

846 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:55:12 ]
>>844
今日始めたばかりの独学者なんだろ。事情を察しろ。

847 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:06:10 ]
そういうところのリンクをまとめて貼ってもいいんだが
見つける喜びってのがあるからなあ

848 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:09:04 ]
>>847
急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。

849 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:20:52 ]
長いソースを打ち込みたいならCプログラミング診断室


いや本気にしないでね



850 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:22:08 ]
>>825
おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い

851 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:45:49 ]
OfficeのWORDの文字だけをいじるプログラムを組みたいのです。
ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。
DCOMを使うのも、避けたいのです。

そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、
UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。

よろしくお願いします、

852 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:51:51 ]
あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、

853 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:10:31 ]
あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。

854 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:17:29 ]
POIでいいじゃん。
がんばって移植すれ。

855 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:31:38 ]
typedef vector<int> V;
typedef V::iterator I;
typedef vector<V> VV;

VV vv;

for_each(
  vv.begin(),
  vv.end(),
  tr1::bind(
    &fill<I,int>,
    tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1),
    tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1),
    0));

g++ 4.1.2です。
2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、
こんな悲しいコードになってしまいます。
static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか?
(省略できたとしても普通にループ書いたほうがわかりやすいけど)

856 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:20:41 ]
>>852
ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?

857 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:06:54 ]
>>856
バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。

858 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:10:48 ]
夏カシス昔よくやった

859 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:00:27 ]
>>855
g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。



860 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:55:40 ]
>>851
WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。

861 名前:デフォルトの名無しさん [2007/06/22(金) 13:26:29 ]
0〜9の数字をランダムに発生させて
数字が被らないように
どのような順番で数字が来たか表示させるという処理をしたいのですが
このようなプログラムを作るにはどうすればいいのでしょうか
乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます



862 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:14 ]
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。
C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。

863 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:39 ]
>>861
絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。

864 名前:861 [2007/06/22(金) 13:35:54 ]
           ,,                                 ,,,
  ゙'lliiiiiiiiiiiiilllllllllllllllll|||li,,                               l||||l
   ゙゙゙゙゙  、,,,,,,,ii!!"゙゙゙゙゙     、,,,,,,   、,,,,                      ||||
      ,l||||"       ゙゙'llli,, ゙l||! ,,l|||゙   ill,,,,,,,,,,,,,,,,,,,,,,,,,,,iiilllll,,,      |||
      ,,l|||!         ゙゙゙゙゙  ,,,l||"     ゙゙'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙       ||
     ,il|l゙゙            ,,rlll"                      ,,,,
    ,,ill"゙           ,,,ril"゙                         il||||l

865 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:40:26 ]
力抜けよ

866 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:56:17 ]
そう、もっと・・・力を抜いてごらん・・・。

867 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:59:44 ]
for (;;) { >>865 >>867 >>866 }

868 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:02:50 ]
5→6→4じゃね?

869 名前:デフォルトの名無しさん [2007/06/22(金) 14:27:56 ]
C++では変数の宣言をどこにでも置けると聞いたのですが、
goto文で変数の宣言を飛ばすことはできないのですか?
以下の文をコンパイルできません。

int main() {
goto end;
int a = 100;
end:
return 0;
}



870 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:38:20 ]
>>869
何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。

871 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:43:43 ]
つまり、gotoで分岐する範囲では宣言できないということだ。

872 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:46:05 ]
switch - case で、caseで宣言できないのと同じだな

873 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 16:18:11 ]
最初に格納する数値を入力して、
以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
fgetsとstrtolを使うといけそうな気がするのですが
頑張ったものの自分ではどうにもならない状況ですorz

【実行画面】
個数を入力したください>>5
5a11bbb7
88yew99

数値1:5
数値2:11
数値3:7
数値4:88
数値5:99

874 名前:デフォルトの名無しさん [2007/06/22(金) 16:53:19 ]
いままでCでは数値を文字列にするときは
sprintf(str,"%d",num);のようにやってたのですが、
C++でstd::stringとsize_type size()等、STLを使う場合はどのように変換すればいいのでしょうか?
std::string str1 = "ああああ";
std::string str2 = "長さ" + str1.size() + "です";
みたいに使いたいのですが、これはエラーがでます。


875 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:01:09 ]
boost::lexical_castなどはどうだろう

876 名前:874 [2007/06/22(金) 17:10:29 ]
>>875
おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。

877 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:20:04 ]
>>873
一文字ずつアスキーコードで比較して行けばいいのでは?

878 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:25:46 ]
>>873
宿題なら宿題スレ行きを薦めるが、とりあえずこんな感じで出来る。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int i, c, nc, *nv;
    printf("個数を入力してください>>");
    if (scanf("%d", &nc) != 1 || nc <= 0) return 1;
    nv = malloc(nc * sizeof(int));
    for (i = 0; i < nc && (c = getchar()) != EOF; ) {
        if (isdigit(c)) {
            ungetc(c, stdin);
            scanf("%d", &nv[i++]);
        }
    }
    nc = i;
    for (i = 0; i < nc; i++)
        printf("数値%d:%d\n", i+1, nv[i]);
    free(nv);
    return 0;
}

879 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:41:32 ]
>>877
このスレを最初から読んでいたらscanf処理のことが書いてあって、
代わりにfgets+strtolということが書いてあったので
この処理を弄くって上に書いたような処理がOKになったら
使いやすくなりそうだと思ったのですが
やはりこの仕様にするとそれが早いかもですね…。

>>878
宿題では無くちょっとこのスレを読んでいて気になったので考えていました。
しかし書いてくださりありがとうございます。
いくつか知らない関数があるのでググって見てみます。


ちなみにfgetsとstrtolで12a23から12と23を取りたかったら
strtol(str,&error[i],0);
strtol(&error[i]+1,&error[i+1],0);
こんな感じでずらしていく感じにするのでしょうか?




880 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:51:22 ]
>>879
こんなかんじ。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    char buff[0x1000], *p, *q;
    unsigned char c;
    while (fgets(buff, sizeof buff, stdin)) {
        for (p = buff; c = *p++; ) {
            if (isdigit(c)) {
                printf("%ld\n", strtol(p-1, &q, 10));
                p = q;
            }
        }
    }
    return 0;
}

881 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 18:25:06 ]
>>880
おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!

882 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:30:17 ]
突然すみません。質問させていただきます
自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。

883 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:35:30 ]
分割コンパイルで検索

884 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:43:54 ]
解凍したディレクトリで、./configure か、counfigure.bat したあと、make か nmake

885 名前:たろう [2007/06/22(金) 21:41:10 ]
曖昧さについて質問があります。
現在、ある処理をできるだけ小さいプログラムで記述する競争をしてまして、
以下のような記述か可能かどうか教えてください。

●質問1
-----
int a = 0;
int b[] = {a++, a++, a++};
-----
と記述した場合、
b = {0, 1, 2} となるのでしょうか?
それともコンパイラ依存でしょうか?

コンマ演算子は左から行う結合ルールですが、
この場合は演算子じゃないので、
明確なルールはなく、コンパイラ依存でしょうか?

●質問2

func1 があるクラスのポインターを返す関数であるとして、
-----
int a = 0;
func1(a++)->func2(a++);
-----
と記述した場合、
func1(0)->func2(1) となるのでしょうか?
それともコンパイラ依存でしょうか?

func1(0) を実行してからでないと、func2 が決定しないので、
なんとなくその中の引数の評価が後のような気がしますが。


886 名前:じろう [2007/06/22(金) 22:12:25 ]
やあ、たろう
この勝負は俺がもらった
約束通りお婆ちゃんの貞操は頂いて逝くぜ

887 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:20:55 ]
int a = 0;
int b[] = {a++, a++, a++};
-----
int b[] = {0, 1, 2};の方がよほど短いわけだが。

-----
int a = 0;
func1(a++)->func2(a++);
-----
同様にfunc1(0)->func2(1);ではいけないのだろうか。

まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。

888 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:27:23 ]
>885
プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ

七行プログラミング part5
ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/

889 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:38:11 ]
>>880
sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?



890 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:41:30 ]
>>889
別にカッコつけなくても生きていけるんです

891 名前:デフォルトの名無しさん [2007/06/22(金) 23:46:17 ]
sizeofというのは「関数」じゃない。
だから、sizeof(buf)のbufは、関数の「引数」じゃない。
関数じゃないから、括弧は「関数呼び出し演算子」ではない。
sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。

「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。


892 名前:889 mailto:sage [2007/06/23(土) 00:11:33 ]
ありがとうございます。付けなくてもいいんですね。
なのに()付きのサンプルコードが多いのは何故なんでしょうか?

893 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:15:46 ]
>>892
型のサイズを知るには、sizeof(int)のように括弧が必要。
それに倣って、括弧をつける人が多数。

894 名前:889 mailto:sage [2007/06/23(土) 00:19:49 ]
なるほど、そういうことだったんですね。
ありがとうございました。

895 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:22:27 ]
括弧つけても優先順位に全く影響与えないしな。
無駄だし勘違いする人も出るからと嫌う人もいるし、
括弧を付けた方が統一性が出ると付ける人もいる。

そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。

896 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:56:10 ]
何でtypeidはカッコ必須なの?

897 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:58:17 ]
typeidの場合はsizeofと違って対象が型だろうが値だろうが括弧が必要。

だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。


898 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 01:07:29 ]
>887
>まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。

不定じゃなくて未定義でしょ。
鼻から悪魔がでてくるじょ

899 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 06:59:03 ]
いや不定だろ



900 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 07:11:10 ]
JISX3010 6.5式 (70)によれば、
「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」

901 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 13:33:55 ]
せいぜい言葉遊び。
「未定義」だから、コンパイラにより「不定」になるんだろ。

902 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 14:02:30 ]
>>901
www.kouno.jp/home/c_faq/c11.html#33

903 名前:デフォルトの名無しさん [2007/06/23(土) 14:44:39 ]
C++とはちょっと違うのですが、適当なスレが見つからなかったので、すみませんが質問させてください。
VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を
外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか
そもそもこいつが何者なのかがさっぱりわかりません。
マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが
外部プログラムの実行だけがどうしてもできません。
どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。


904 名前:855 mailto:sage [2007/06/23(土) 21:13:36 ]
>>859
遅くなってすみません。キャスト外せませんか…ありがとう。
俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、
でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。

905 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 21:15:34 ]
>>904
const の有無で2つある。

906 名前:855 mailto:sage [2007/06/23(土) 23:25:01 ]
>>905
あ、ありがと。気づきませんでした。
&V::beginは関数ポインタの集合で、これをキャストなり代入なりする時に
型に合う関数ポインタが適当に選ばれるような感じでしょうか。

V::iterator (V::*b)() = &V::begin;
V::const_iterator (V::*cb)() const = &V::begin;

V::beginは前者、(const V)::beginは後者を選ぶようなルールがあれば話は早いと思うけど、残念。

907 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 23:46:52 ]
文字列中の " を \" に変える関数ってコレで良いんですかね?
std::basic_string<TCHAR>::iterator dquoteToESC(std::basic_string<TCHAR>& str) {
    typedef std::basic_string<TCHAR>::iterator iter;

    iter i = str.begin();
    while ( i != str.end() ) {
        i = std::find(i, str.end(), _T('\"'));
        if ( i == str.end() )
            break;
        i = str.insert(i, _T('\\')) +2;
    }

    return str.begin();
}

908 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:03:12 ]
どうでもいいが関数名はEscDQuoteのほうがいいんじゃないの?

909 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 05:33:08 ]
今では vector のメモリ上での連続性は保証されてますけど、
昔は少なくとも規格上では保証されていませんでした。

で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか?
実在しなければ、メモリ上での連続性を仮定したプログラムは
過去の処理系との互換性があるということで安心できるのですが。



910 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:15:16 ]
俺は聞いたことがない

普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、
連続していなかった処理系なんてないと思って差し支えないはず

911 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:17:54 ]
そうですか。安心しました。
d。

912 名前:デフォルトの名無しさん [2007/06/24(日) 13:53:56 ]
ifstreamへの書き込みについて質問させてください。
ifstream fin("test");
として、
char c;
char s[100];
のとき、
(1) fin >> c; ===> 読み込みは一文字だけ。
(2) fin >> s; ===> 読み込みは一行全部。配列sのサイズを越えても。
という理解でいいでしょうか。
(実験したらそうなりました。)


913 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:04:56 ]
普通は、fin.read(s, 100 )とかstd::getline( fin, str )とか使うけどね。

914 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:14:46 ]
>>912
配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。

915 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:31:41 ]
>.912
(1)についてはそのとおり
(2)についてはちがう。
空白文字(スペース、タブ、改行等)を読み飛ばし、
次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。
scanfの%sと同じと思っておけばよい。

916 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:35:50 ]
まあ、折角 istream 使ってるんなら、
char じゃなくて string 使った方が安全でいいね。

917 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:52:06 ]
そもそも、なんでifstreamへの書き込みについての質問なのに読み込む話ばかりなんだ?

918 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:54:29 ]
>>917
2行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。

919 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:22:55 ]
>>910
設計時点で C 配列の代用という用途は考えられていて、
規格への明記が漏れていただけだと思われ。

↓でも現状の実装についての考察なんて問題にならなかったみたいだし。
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69



920 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:59:49 ]
>>919
なるほど。確かに。

ただ、仕様上 one-past-the-end の問題は無い、
と言ってる点がいまいち分からんのですが。
5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証)
あたりとは矛盾しないのですか?

921 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:17:52 ]
>>920
!v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が
有効なことと 5.7p4 の
「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」
っていうルールから導き出せるから、特に vector について書くことは無い
ってことじゃないかな?

まぁ、そうだとしてもわかりにくいね。

922 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:26:54 ]
なるほど・・・。確かに。

923 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:10:37 ]
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。

924 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:28:14 ]
これですか?

www5e.biglobe.ne.jp/~me-jin_k/


925 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:30:07 ]
早速ダウンロードしました

926 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:33:48 ]
ないのならないで結構です。

927 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:24:12 ]
>>923
半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう

そして、そんなものが作れるなら…

928 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:35:00 ]
>>927
そうなんですか。
イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。
ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html
プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、
中身を開けませんでした。

929 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:36:55 ]
難しいようですね、お騒がせして申し訳ありませんでした。



930 名前:ちんこ [2007/06/24(日) 19:27:46 ]
www.uploda.org/uporg872561.cc.html

g++です。
三目並べのゲームを作ります。
show_stateがばぐります。どこがおかしいか教えてください

931 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:34:07 ]
こんなのコンパイルとおるんだな。

932 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:37:08 ]
>>930
State::State(bool s[3][3]){
  for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
      a[i][j] = s[i][j];
    }
  }
}

ちなみに、マスの状態は、「○」「×」「どちらもおかれていない」の3通りあるから、boolではだめかと。

933 名前:ちんこ [2007/06/24(日) 20:33:11 ]
[akira@58x13x98x215 sanmoku]$ g++ test.cc
[akira@58x13x98x215 sanmoku]$ ./a.out
1 0 1
0 1 0
1 0 1
さんくるです。>>932では3通りを表現するのに一番適したデータ型はなんですか?
空 1 0 というつもりだったのですが。intだとメモリがでかくなる。
まぁ三目なら全検索してもうんこだけど。

幅検索型の三目並べゲームをclassを使って作るというのが目標です。
計画しているクラスは
Player
CPU
State
Queue(Stateを含みまくるキューのクラス)
Board(mainのクラスです)
とかです。オブジェクト指向的に考えて適切ですか?

うまい人ならどういうクラスを考えるんでしょうか。

934 名前:ちんこ [2007/06/24(日) 20:35:34 ]
これが出来たら9*9盤くらいで5目並べをしてみたいです。
最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。

935 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:38:40 ]
>3通りを表現するのに一番適したデータ型はなんですか?
boost::triboolってのがある
これはtrue, false, indeterminateの3値を表現できる
これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定
とでも使えばちょうど良いんじゃないかな

936 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:39:14 ]
>>933
intでもメモリには大差なくね?
ってより、intのほうが高速になる可能性を秘めていると思うが・・・
あくまでも可能性だけど

937 名前:ちんこ [2007/06/24(日) 20:53:33 ]
>>935
不定か、なんか怪しいデータ型ですね。
>>936
intの方が高速になる理由は?
intって4byteですよね、boolがダメならcharかなと思っています

938 名前:デフォルトの名無しさん [2007/06/24(日) 20:55:37 ]
ちんこあほすぎでわろたw

939 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:58:59 ]
ちょっとすれ違いですが、
eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?



940 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:02:43 ]
>>939
あります。スレ違いなので詳細は割愛。

>>937
サイズが大きいから遅いとは簡単にはいえません。
まずは真っ当に作り上げることが先決でしょう。

941 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:07:12 ]
>>937
そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。
って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。
ほとんどintの処理速度=charの処理速度だと思うが。
実際型のビット幅が決まってないのって弊害にしかならん気がする。

942 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:12:39 ]
typedef int TRIBOOLとでも定義しておいて
とりあえず組んでみたら?
出来てから速度とか使用メモリーを測定してそれから決めればいい

943 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:16:21 ]
>>937
高速になる理由は>940-941のとおり。
charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。

1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。
ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに
配列として持つより設計を見直すほうがいいと思われる。


944 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:20:22 ]
メモリアクセスの遅延により、メモリの節約自体が速度に効くだろうから
やっぱり最終的に実測しないと決まらない。

945 名前:ちんこ [2007/06/24(日) 21:21:39 ]
うお、その話ならどっかで聞いたことがあったような。
じゃあintにしてみます。
9路盤で5目並べする時用にプログラムをあらかじめ
N // 盤の大きさ
M // これだけ並べば勝ちだぜぃな数
として組んだ方がいいですかね?

しかしどうやればいいかはさっぱりなんですがね。
何しろゆとりなもんでwww

946 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:25:46 ]
>>945
とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ
話はそれからだ

947 名前:ちんこ [2007/06/24(日) 21:27:00 ]
まじ難しい。

948 名前:ちんこ [2007/06/24(日) 21:29:53 ]
クラスの依存関係がイミフ

949 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:33:39 ]
日記帳にでも書いてろ



950 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:43:37 ]
あきらめろ

951 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:45:30 ]
>>937
メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok

ちなみにC++ではbool型のサイズは環境によって違う
普通はintかcharになってるようなのでメモリの節約にはならない

でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから
まず動くもの作ってそれから考えるほうがいいよ


952 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:58:34 ]
>>945
ちなみに、見た目簡単そうな5目並べだが、
まともな思考エンジン作れたら結構な額で売れる

昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw


953 名前:ちんこ [2007/06/24(日) 21:58:57 ]
Playerクラスとかいるか・・・?
でもないとオブジェクト指向っぽくないよなぁ・・

954 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:00:34 ]
>>945
この辺参考にして頑張ってくれ
www.h6.dion.ne.jp/~game296o/GameMain.html
www002.upp.so-net.ne.jp/ys_oota/mdp/

後はひたすら試行錯誤
考えて分からなければとりあえず書いたら最低限何が駄目か何が必要かとかわかってくるんじゃね?


955 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:05:01 ]
>>953
お前には無理だ
せいぜい無駄な時間を浪費するがよい

956 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:42:47 ]
>>928
KL1
www.klic.org/software/klic/index.ja.html

957 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:48:42 ]
くだらない質問だと思いますがお願いします。
STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか?
Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。

958 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:49:27 ]
std::copy

959 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:06:23 ]
>>958
どうもです。



960 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:09:28 ]
&vector_instance[0]ではいかんのか?

961 名前:こんにちは mailto:こんにちは [2007/06/25(月) 03:30:00 ]
こんにちは

962 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:45:34 ]
次期仕様のドラフトだと data 関数があるみたいだが、
今の所は &v[0] か &v.front() だな。

963 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:47:50 ]
>>953
Player インタフェースクラスを作って、
PlayerCom と PlayerHuman クラスを派生して・・・

964 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:03:54 ]
GameMaster クラスを用意して本物の盤面をいじれるのはそのクラスだけにして…

965 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:05:41 ]
PlayerCom からも複数のクラスを派生して・・・

966 名前:ちんこ [2007/06/25(月) 07:14:38 ]
そんなにクラス作るのか。
PlayerからPlayerComとPlayerHumanを継承
PlayerComから複数はなんで?
もしや思考パターンを変える為?


967 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:32:33 ]
ちんこ死ね

968 名前:ちんこ [2007/06/25(月) 07:36:38 ]
初心者歓迎スレなのに・・・
クラスを使ったものとしてはC++かつGUI以外でははじめて
もう何がなんだか分からんとです。
まずUML勉強した方がいいかな?
生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。

969 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:01 ]
はいはいわろすわろす



970 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:12 ]
○×ゲーム程度なら、まず非オブジェクト指向で作ってから
設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。

971 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:59:30 ]
>>968
愚かな一貫性は小人物に憑いたお化けである

972 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:03:07 ]
まあ、色々なパターンで作って、
それぞれのプログラムの性質を比較してみるのも勉強になるよね。

973 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:13:38 ]
そろそろ次スレの季節だな。

974 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 09:55:20 ]
定刻も、過ぎてることだしな

975 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:02:09 ]
次スレ立てた

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

976 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:03:14 ]


977 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:36:14 ]
VisualC++2005です。switch文で以下のように下にcaseが続くと変数の宣言と同時に初期化できません。
これは何故でしょうか?
case 1:
 int i=1;//int i; i=1;ならOK
 break;
case 2:
 break;

978 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:38:42 ]
case 1 に飛んだ場合はいいけど、
case 2 に飛んだ場合は i が使えるのに
初期化の位置を飛ばしてしまう。
だから、そういうことはできないようになってる。

case 1: {
 int i = 1;
} break;

みたいにブロックで囲むといいよ。

979 名前:977 mailto:sage [2007/06/25(月) 22:54:36 ]
ありがとうございます。そのようにします。



980 名前:デフォルトの名無しさん [2007/06/26(火) 21:11:34 ]
>>913-918
ありがとうございました。


981 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:34:30 ]
>>978
横レスだが
なるほど
時間があれば言語仕様もきっちり読んでおけってことか

982 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:55:00 ]
時間が無くても言語仕様は嫁

983 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:21:51 ]
必須かよorz
プログラム開発の面接を受けた感触として
ひょっとしたら読まなきゃかもなーとは思ってたが

984 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:24:17 ]
必要があれば読みたくなるだろうからそれまでは別に無理して読まなくて良いよ
経験があってこそ初めて理解できるような部分もあるし

985 名前:デフォルトの名無しさん [2007/06/26(火) 23:52:05 ]
C++で一時オブジェクトを関数に渡す時に値渡しするしかないんですか?
boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが
右辺値を参照で渡せるような何か良い手段ありますか?

986 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:52:50 ]
constのことかーーーーーー?

987 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:59:47 ]
あああ、const参照にはこういう使い方もあったんでうsね
どうもです

988 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:09:12 ]
亀だが
charとかshortは演算途中で内部的にintに無理矢理キャストされることがある
理由は>>941の通り
だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い

989 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:42 ]
>>988
「ことがある」じゃなくて、その動作が標準として規定されている。



990 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:27:02 ]
ちなみに
windows.hのBOOL型は実際はlongのtypedefで TRUE = 1, FALSE = 0

Cだと_Bool型で
_Bool型は符号なし型として扱われる
_Bool型には signed, unsigned はつけられない
_Bool型は 0 と 1 を格納できれば十分なサイズ
_Boolに変換するときその値が0なら0、それ以外は 1
_Bool型はどの標準整数型ランクよりも小さい
ビットフィールドに無修飾版の _Bool をおける

引用(ttp://seclan.dll.jp/c99d/c99d05.htm)

991 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:29:54 ]
>>989
そうか、すまん俺の勉強不足だった

992 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:19:35 ]
sdk\include>grep typedef.*BOOL WinDef.h
File WinDef.h:
typedef int BOOL;

993 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:34:17 ]
>>989
格上げされない場合もあるわけだが。

994 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:52:27 ]
>>993 sizeof ぐらいじゃね?

995 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:18:22 ]
今更だけど、C/C++とC99は別物だと思う。

996 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 05:44:06 ]
「演算途中で」となるとまあ sizeof くらいなのかな?
あ、いや、キャストもか。

997 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 07:02:02 ]
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1182740506/

念のためにもう一度貼っとくよ〜
二重に立てるような無駄を防ぐためだよ〜

998 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 12:26:27 ]
>>992
MSのやつはバージョンによって違うらしいぞ


999 名前:デフォルトの名無しさん [2007/06/27(水) 14:45:41 ]
1000ゲトー



1000 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:46:23 ]
 。  + 『1 0 0 0 G E T ぃ ゃ っ ほ ぉ ぉ ぉ ぅ ー !』    *     。       .
                 .             *        .
       *      + 。           。     +
           __   _     /ヾ_/ヽ        旦
        f ミv'´{ごづヾ彡   , '´⌒'v'ヾ      '´ ̄`ヽ       *     。
        ゙i´!(((从 从リ !   ifi」liリ゙l i!卯、   (((/从从 i
         !○(l ^ヮ゚ノ!| i * |i、゚ヮ^ |!)○゙ 。  从゚- ゚ ||○  *
        ノノ ヽ)本iO ヾ   Oi本(~/ヽ    OL介_(ノ  .      +
  ガタン||| ((´ く/_i_iヾ  )) ||| /i_i_ヾ> ) )) ||| + /_|_|ヾ> |||ガタン +
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ロ リ 最 強 ! 華 麗 な 1 0 0 0 に 超 感 動 !

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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