08/03/07 15:23:55
>>509,510
関数テーブルで引数が違う関数をまとめる場合に、
引数型を全部派生にして親クラスのポインタを
受け取るようにしとくと、キャストミスも無くて便利かなと
思ったんですが。
多分設計見直したほうが良いパターンなんでしょうね。
512:デフォルトの名無しさん
08/03/07 15:49:54
デストラクタを仮想にしておけば良いんじゃないかな
このパターンで自分もはまったな
引数に<list>をとるか可変長引数とか配列とか色々やり用はあるな
513:デフォルトの名無しさん
08/03/07 16:23:58
>>511
つテンプレートの特殊化
514:468
08/03/07 16:44:37
URLリンク(www.borujoa.org)
すみません。ド素人のプログラマですが、質問です。
なるべく上のファイルを利用してファイルソートを行いたいのですが、
これからどうすればいいのかわからず手が止まっております。
ソースではなく文章でいいので答えていただけますか?
filesortがファイルをソートする関数部分です。
つまりVectorとsortを使って何とかしたいわけですが、
この書き方であると要素ごとでしかソートできません。
もちろん要素だけのソートはできました。
なんかあとちょっと弄ればできそうな気がするんですが、
僕の脳ではどうしようもありません。
どなたかご指導ください。
私的にはsetさえ使えば100人力じゃぁみたいな感じになるので、
setを使いたくありません。その点も含めてよろしくお願いいたします。
あとこのソース見て「ここをこうした方がいいのでは?」と思う人はご指摘ください。
よろしくお願いいたします。勉強になります。
開発環境:CentOS 5
コンパイラ:g++
コンパイルエラー:無し
515:デフォルトの名無しさん
08/03/07 16:49:15
クラスについてさっぱりわかってないからこんなこと思うのかも知れませんが、
クラスの公開メンバ関数のアドレスを外部に教えてあげて、
そこから直接クラスの関数にアクセスすることってできますか?
具体的に言うと、Wik32APIでの、ウィンドウプロシージャに、クラスのメンバ関数を使いたいのですが…
516:デフォルトの名無しさん
08/03/07 17:06:28
>514
filesortの中身をちらっと読んだだけ。
・カンマ区切りを取り出す常套手段は
1:スペース記号、タブ記号をすべて別の文字列で一旦置換
2:カンマ記号をすべてスペースに置換
3:stringstreamに流し込んで >> を使って読み込む
4:1:で入れ替えてたのを元にもどす
です。こうした方がいいです。
・名前を入れ替えたいだけじゃないんですよね?
今のあなたのファイルは「名前データを取り出して、それをベクターに格納。そのベクターをソート」
している「だけ」ですよ。
あきらめてsetを使うか、set相当のものを自分で書くか、
そうでなければsort相当のものを自分で書いてください。
・fin>>temp
この部分は、もし入力ファイル中にスペースがあると困るのではないかと。
nameに「Richard Feynman」って入ったら、Richardで切れますけど、いいんですか?
一行取り出したいならgetlineを使いましょう。
517:デフォルトの名無しさん
08/03/07 17:07:45
>>511
普通の関数は仮想にするなよ
つEffective C++ 第38項
ダウンキャストはやめよう
つEffective C++ 第39項
というかEffective C++を購入して一読する事を強く勧める。
518:デフォルトの名無しさん
08/03/07 17:12:53
>>515
メンバ関数の実装は、クラスのポインタを引き渡していることが多い。
(thisポインタが引数としてわたっている)。
よって、関数ポインタを取ってきたところで、メンバ以外からマトモに使えません。
519:デフォルトの名無しさん
08/03/07 17:31:14
>>513
511じゃないが参考までにどういう形で実装するのか教えてくれませんか?
テンプレートを使った経験がないのでどういう風に使うのか見当がつきません
520:452
08/03/07 18:21:57
>>455-456
亀ですがレスthx
Winsockと同時に使うから文字列をstd::stringじゃなくてchar*で使ってたんですが、
例外処理さえつければ>>452のコードで大丈夫ですよね
あと、>>455のカマを掘られたって言うのがどうことかちょっと気になるんですが・・・
521:デフォルトの名無しさん
08/03/07 19:07:56
>>518
やっぱ駄目なんですか。
共通プロシージャ用意してmapしたのを検索する方向で考えてみます。
522:デフォルトの名無しさん
08/03/07 19:31:55
>>515
URLリンク(web.archive.org)
523:デフォルトの名無しさん
08/03/07 19:42:31
>>521
staticなメンバ関数なら問題ない
524:デフォルトの名無しさん
08/03/07 19:48:12
>>523
staticメンバ関数はstaticなメンバしかイジれないじゃん。
525:デフォルトの名無しさん
08/03/07 20:31:15
>>524
そうだよ。単にクラスという名前空間に閉じ込め、
protected/privateにできるという程度の意味しかない。
どっかからインスタンスへのポインタを得て、非静的なメンバ関数を呼ぶのが
静的メンバ関数のウィンドウプロシージャの仕事。
>>522
526:デフォルトの名無しさん
08/03/07 20:34:15
>>524
オブジェクトを作らずに呼び出そうとしてるんだからメンバなんていじる必要ない気が
527:デフォルトの名無しさん
08/03/07 20:42:15
>>515
サンクという手法でウィンドウプロシージャを書き換えて、ウィンドウハンドルの代わりにthisをスタックに積んでメンバ関数にジャンプさせれば?
528:デフォルトの名無しさん
08/03/07 20:47:14
boost::function
529:デフォルトの名無しさん
08/03/07 21:35:51
>>528
どうやってやるのさ
530:デフォルトの名無しさん
08/03/07 21:38:29
>>523-527
あ、オブジェクトではなく、クラスにひも付けすればよいのですね。
有り難うございました!
531:デフォルトの名無しさん
08/03/08 01:39:03
とあるクラスの派生クラス郡の中で一つの派生クラスだけ
関数の引数が異なることになってしまいました
こういう場合はどうしたらよいでしょうかorz
532:デフォルトの名無しさん
08/03/08 01:51:31
設計しなおす
533:デフォルトの名無しさん
08/03/08 01:52:10
>>531
全クラスに引数増やすとか(そしてデフォルト引数をつけておくとか)、
その派生クラスだけ別のメンバ関数で余分の引数を設定しておくとか、
引数の集合を何かクラスにまとめて、上位の概念に置き換えることで引数を共通にするとか。
534:デフォルトの名無しさん
08/03/08 01:53:54
dynamic_castしろと悪魔が囁いているぜ
535:デフォルトの名無しさん
08/03/08 01:56:46
>531
1. きっとやりたいことが間違ってるから考え直す。
2. boost::any とか boost::variant とかでぶちかます。
まぁもう少しやりたいことを詳細に説明するべきだろうね。
536:531
08/03/08 02:14:02
とある計測器と連携して、とあるプロセスを監視してそのデータをモニタに表示するのですが
今回のプロセスだけ表示させたいパラメータの数が増えてしまいました
監視プロセスが複数同時に走っていて、そのうち3つを同時に表示するようにするため
表示対象をユーザーが切り替えられるようにするため
表示クラスに監視クラスのポインタをつかって保持させています
監視クラスに
GetData(int OutputA, int dataB,int dataC)
という関数をよういしていたのですが
最新の計器が監視できるパラメータが増えてしまって・・・orz
537:デフォルトの名無しさん
08/03/08 02:22:28
>>536
そのシグニチャでGetだと言うのなら、参照かポインタ渡しじゃないの?
まあそれはいいとして。
パラメータの種類を指定して、データを1種類だけGetする関数を作ったら?
538:デフォルトの名無しさん
08/03/08 02:38:59
void calc(int& m, fstream* fio);
int main(void)
{
fstream fio[10];
char filename[10];
int m, steps;
steps = 7;
fio[0].open("calc0.dat");
m = 1;
while(m <= steps){
sprintf(filename, "calc%d.dat", m);
fio[m].open(filename, ios::in | ios::out);
m++;
}
m = 1;
while(m <= steps){
calc(m, fio);
m++;
}
return 0;
}
539:デフォルトの名無しさん
08/03/08 02:43:13
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?
540:デフォルトの名無しさん
08/03/08 02:43:52
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?
541:デフォルトの名無しさん
08/03/08 09:11:50
>>540
>どこか間違っていますか?
あんたの説明。
結果がどうなったのか、どうなるつもりだったのか(これは全てcalc0.datと同じになるということか)、
実行した環境と処理系は何か、位のことは書いても罰は当たらんよ。
542:511
08/03/08 11:33:07
昨日の続きなんですが、引数のの違う関数を
まとめた関数テーブルって、どう実装するのが
良いでしょうか?
>512のようにlistや可変長引数だと、個数が
違う場合には有効ですが、構造体を渡す場合には
無理があると思えます。
(構造体の要素をPOD型に分解してlist化するとか?)
>513で書かれた特殊化では、どう実装するのかが
全く閃きませんorz
キャストを使う以外で違った構造体やクラスを
スムーズに(できれば低コストで)渡す方法ってあるのでしょうか?
543:デフォルトの名無しさん
08/03/08 11:41:16
>>542
昨日の続きと言われても状況を把握するために過去に遡って読むのは面倒なので目的を詳しく。
まぁ、よくあるGUIライブラリの実装などでは構造体を丸ごと渡すのではなく汎用ポインタを渡す形が多いけどね。
544:511
08/03/08 11:42:33
なお今自分が使ってた方法だとこんな感じです。
class ArgBase { //引数親
public:
virtual ~ArgBase(){};
}
class Arg1 : public ArgBase {
public:
int arg;
}
//以下必要なだけArgBaseを引き継いだ構造体を作る
//関数テーブル
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
FUNCPTR fuctable[10];
fnctable[0] = Func1;
//関数例
bool Func1(ArgBase *pArg) {
//これがArg1が必要な関数なら
Arg1 *ptr = dynamic_cast<Arg1*>(pArg);
if(ptr == NULL) return FALSE;
//処理
return TRUE;
}
545:デフォルトの名無しさん
08/03/08 15:49:36
久しぶりにプログラムを組むのですが、初歩的なことが分からないので
教えてください。昔
float a;
a=1.0
と1ではなく1.0にしなさいと教わったのですが、その詳しい理由を
忘れました。
どうしてなのでしょうか?
546:デフォルトの名無しさん
08/03/08 15:56:19
>>545
1.0も中途半端だな。1.0fと書け。
1と書くとそれはint型になる。
1.0と書くとdouble型になる。
1.0fと書くとfloat型になる。
intやdoubleからfloatへの変換は警告が出る可能性があるので、
代入先と同じ型にしておけということ。生成される機械語は同じだろうけど。
547:デフォルトの名無しさん
08/03/08 16:23:22
>>543
やはり間違わないように気をつけてvoid*で渡してキャストするのが
常套手段なんですかね。
548:デフォルトの名無しさん
08/03/08 16:25:25
あと、
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
じゃなくて
typedef bool(*FUNCPTR)(ArgBase*);
でしたorz
549:デフォルトの名無しさん
08/03/08 17:09:29
現在、勉強がてらに、Windows用のクラスライブラリを無意味に作ってるのですが
dynamic_castって良い機能ですねぇ
基本クラスに無意味に仮想関数を突っ込まなくても、派生クラスの機能が使えるなんて嬉しすぎる
550:デフォルトの名無しさん
08/03/08 17:12:08
dynamic_cast禁止
551:デフォルトの名無しさん
08/03/08 17:12:19
は?
552:デフォルトの名無しさん
08/03/08 17:12:46
すげークラスライブラリきた
553:デフォルトの名無しさん
08/03/08 17:24:08
俺も今無意味にgtkのラッパークラスライブラリ作ってるよ!
Window wnd("sample",MAIN_WINDOW);
vBox box(MAIN_WINODW);
Label sample_label("sample",MAIN_WINDOW);
Button ok_button("OK",MAIN_WINDOW);
CREATE(MAIN_WINDOW);
ok_button.clicked(func);
box << sample_label << ok_button;
wnd << box;
CONSTRUCT(MAIN_WINDOW);
みたいにmain関数の中で書いたらコンパイルが通るようになるやつ。
今マニピュレーター実装中。
554:デフォルトの名無しさん
08/03/08 17:26:54
これだから演算子多重定義が叩かれるわけだ。
555:デフォルトの名無しさん
08/03/08 17:49:29
>>550
ごめんねごめんね(*‘ω‘ *)
void __fastcall TForm1::N1Click(TObject *Sender) {
TMenuItem* menu = dynamic_cast<TMenuItem*>(Sender);
switch(menu->GroupIndex) {
case 1:
switch(static_cast<TSortDirection>(menu->Tag)) {
case sortLarge:
break;
case sortSmall:
break;
}
break;
case 2:
switch(static_cast<TLogOutputMode>(menu->Tag)) {
case logList:
break;
case logSingleLine:
break;
}
break;
}
UpdateTitle();
}
556:デフォルトの名無しさん
08/03/08 18:05:19
Cらしいプログラムですなあw
557:デフォルトの名無しさん
08/03/08 18:05:55
これなら適切にdynamic_castを使っている場面に見える。
558:デフォルトの名無しさん
08/03/08 18:08:50
TForm1とかN1Clickとかいただけない
559:デフォルトの名無しさん
08/03/08 18:17:40
すみません。えらく単純な質問なんですが、
C++で「なんでもいいからキーを押すと続行」
というのはどうすれば実現できるのでしょうか?
文字列や数字を読み取らせる方法は知ってますし、
ググればいくらでも出てくるのですが、
「いったん入力待ちしていかなるキーを押しても構わず実行」
という風にしたいのです。
もちろん数字読み取らせて適当な数+ENTERという風に組めば
手間が増えるだけで大体同じことはできるます。
しかし、あるデータの異常値の原因を調べるため、
異常のたびにそのデータをグラフにして打ち出させたいんですが
たぶん三万回くらいやらなきゃならないんです・・・
560:デフォルトの名無しさん
08/03/08 18:25:40
OSによる
561:デフォルトの名無しさん
08/03/08 18:26:01
そこでpdcurses(ncurses)
562:デフォルトの名無しさん
08/03/08 18:27:06
enterキーのみ反応でいいならgetchar()でもなんでもいけそうな気がする
563:560
08/03/08 18:33:28
ありがとうございます。getcharでいけました
564:デフォルトの名無しさん
08/03/08 18:33:56
>546
ありがとうございます。
元がfloatなのにいらないお節介しなくても良さそうなのに。
565:デフォルトの名無しさん
08/03/08 18:34:05
559の間違いです。すいません
566:デフォルトの名無しさん
08/03/08 18:46:22
msxml6.dllを使ってXMLのデータを取得しようと思っているのですが、
要素の属性の取り方だけ分かりません。
どのように取り出せばいいのでしょうか?
567:デフォルトの名無しさん
08/03/08 18:48:37
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
大きな勘違いをしている悪寒。
568:デフォルトの名無しさん
08/03/08 19:22:34
もうなんて言うか、初心者とかそういうレベルですらないんですけど、
昨日小一時間このミスに気づかなくてバグと死闘していたので…
int a,c,x;
unsigned int b;
x = max(-c, min(x, a - b));
としたとき、
(a-b)がunsigned intとして評価されてしまうのですが、
こういうとき、オペレーターの戻り値の語ってどうやって決まるんですか?
どこかの本では、大きい方に丸められるとか何とか書いてあった気がするんですが…
実際どのような規則になっているんでしょうか?
569:デフォルトの名無しさん
08/03/08 19:30:35
>>568
算術型の標準変換、整数の格上げとか
そんなもんどの本にも載ってるだろ。
570:デフォルトの名無しさん
08/03/08 19:30:57
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
もとがdoubleの値(1.0)をおまいが勝手にfloat型の変数に入れようとしているのを
コンパイラさんは(おせっかいかなと思いながらも)教えてくれようとしている。
レベルアップするためにも、人の忠告は素直に聞こうな。
571:デフォルトの名無しさん
08/03/08 19:35:44
>>570
おまえはサル
572:デフォルトの名無しさん
08/03/08 19:37:00
サルなら反省できる
573:デフォルトの名無しさん
08/03/08 19:43:39
>>570
お前・・・なんという読解力のなさ・・
574:デフォルトの名無しさん
08/03/08 19:46:59
>>570の言うことは間違ってないような・・・
575:デフォルトの名無しさん
08/03/08 19:48:09
>>570は正しい事を言っている気がするが
オレも読解力がないのだろうか
576:デフォルトの名無しさん
08/03/08 19:53:38
皆無
577:デフォルトの名無しさん
08/03/08 19:54:05
レスをたどると元々は
float a = 1;
のような気がする
578:デフォルトの名無しさん
08/03/08 19:59:33
>>577
それだとfloat変数の初期化だよね。
もともとは以下のようにfloat←doubleの代入だったはず。
>float a;
>a=1.0
579:デフォルトの名無しさん
08/03/08 20:08:18
>>569
持ってる本は2冊ともunsignedまでは書いてないんだが…
駄目なの使ってるのね…(一つは学校指定だけど)
算術型 標準変換 でググったら見つかりました、有り難う。
long double > double > float > unsigned long int > long int > unsigned int > int
int > unsigned int だとばっかり思ってた。
(表現力が大きい方に…ってかいてあるからマイナスが表現できる方が上なのかと…
よく考えてみたら、表現できる値の絶対値はunsignedの方が大きいけど。)
580:デフォルトの名無しさん
08/03/08 20:15:02
>>566
DOMだったら、selectNodesとかselectSingleNodeとかを使えばいいよ。
581:デフォルトの名無しさん
08/03/08 21:20:47
>578
最初に書き込んだものです。
多分みなさんが思っているよりもっと初歩的なことが
分かっていないのだと思います。
正直doubleとfloatの違いが精度の違いでfloatがメモリ確保の
ためだけに使われるぐらいにしか考えていません。
情報落ちや桁落ちの問題でここまでするのでしょうか?
正しい解釈はこうですか?
int a;
float b;
double c;
a=1;
b=1.0f;
c=1.0;
582:デフォルトの名無しさん
08/03/08 21:23:45
>581
すいません。もう少し質問させてください。
何のためにここまでするのかと言う部分です。
情報落ち、桁落ち、丸め誤差、その他
このうちのどれですか?
583:デフォルトの名無しさん
08/03/08 21:31:40
おっもくそ大量の数値データを扱うときはdoubleじゃなくてfloatにするなぁ・・・
で、単純に、floatを準備したからにはfloatを突っ込む。と。
584:デフォルトの名無しさん
08/03/08 21:37:28
>>581
何をどう解釈しているのか分からないが…。
1や1.0などの定数自身も型を持っていることは理解している?
その定数をどの型の変数に代入するかに無関係に、定数自身が型を持っている。
1 ← int型
1U ← unsigned int型
1.0 ← double型
のように。
>情報落ち、桁落ち、丸め誤差、その他
この場合は、その他。
実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現できる。
ここで指摘されているのは、定数の書式としてfloat型の定数を表現できるのだから
それを使用したほうが適切だろう、ということ。
精度の大きい型の値を精度の小さい型の変数に代入しても、桁落ちなどがなければ全く問題ない。
桁落ちなどがあるとしても、それを意図して書いているなら動作としては正しい。
でも意図したものかどうかプログラムを他人が読んでも分からないので、そのような場合は明示的なキャストをしたほうがいいこともある。
この場合はキャストなんかせず、定数を明示的にfloat型で書けばいい。
585:デフォルトの名無しさん
08/03/08 21:39:04
定数の1は整数型だが、実数に変換しても何にも問題ないので
int a = 1;
float b = 1;
double c = 1;
としてしまうなぁ。
# ただし、float b = 1.0としてしまうとdouble値からfloat値からのキャストになるのでコンパイラによっては巧くないね。
586:デフォルトの名無しさん
08/03/08 22:09:18
>584-585
早速のレスありがとうございます。
よく分かりました。
>この場合は、その他。
>実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現で>きる。
そう思っていたのに何故そこまでこだわるのだろうと思っていたら、
定数の型のことを言っていたんですね。
587:デフォルトの名無しさん
08/03/08 22:20:53
マルチスレッドのプログラムでSTLは使えないと聞いたのですが、本当ですか?
あと、_PTHREADSをdefineすれば使えるとも聞いたのですが、、、
googleしても、結構昔の情報が多くて実際のところはどうなのかよく分かりませんでした。
588:デフォルトの名無しさん
08/03/08 22:23:39
FedoraとWindowsでソースレベルで100%互換のアプリケーションを
作ろうとしているのですが、現実的ではないでしょうか?
またどの辺に気をつけて開発した方が良いでしょうか?
内容は不特定多数のPCとsocket通信でバイナリデータをやりとりし、
内部でPostgreSQLにアクセスする、いわゆるサーバアプリケーションです。
開発はほぼ全面的にWindows側(VisualC++.net2003)で行い、
1日2度程、Fedoraでも動作テストをする予定です。
589:デフォルトの名無しさん
08/03/08 22:56:48
>>587
そういうときは、闇雲にググるのではなく、
自分の使っているライブラリのマニュアルを読め。
例えば、Visual C++もlibstdc++もスレッド安全性についての文書がある。
URLリンク(msdn2.microsoft.com)(VS.80).aspx
URLリンク(gcc.gnu.org)
590:デフォルトの名無しさん
08/03/08 22:58:30
かつてKylixという開発環境があってですね
591:デフォルトの名無しさん
08/03/09 03:48:11
>>588
完全に.NET上に載せてしまってMONO使うとか。
俺は使ったことないけど
592:デフォルトの名無しさん
08/03/09 03:56:01
一つお伺いしたいのですが,FLVなどの動画をweb上からdownloadし,
てローカルに保存するプログラムを作りたいのですが,
どのようなライブラリを使えばいいのでしょうか?
ライブラリなどなく自分で作るしかないのでしょうか?
593:デフォルトの名無しさん
08/03/09 04:02:45
ダウンロードするライブラリはあるが、アドレスを発見するライブラリはない
594:デフォルトの名無しさん
08/03/09 04:10:04
レスありがとうございます.
アドレス入力は手動でやろうと思っています.
ダウンロードするライブラリはあるんですね.ありがとうございます
595:デフォルトの名無しさん
08/03/09 04:14:05
Youtubeの動画がおいてある場所がわかれば
ZIPやEXEやAVIやMP3を落とすのと同じ
場所がわからなければ無理
動画が見られるアドレスと違う
596:デフォルトの名無しさん
08/03/09 05:39:49
祭りらしい
【ひめはじめ】その7
スレリンク(megami板)
【ひめはじめ】その8
スレリンク(megami板)
597:デフォルトの名無しさん
08/03/09 09:17:25
>>588
ソケット通信をどうにかする必要がある。
WindowsとPOSIXで似て非なるAPIを持っているから、
自分でラップするなり既存のライブラリを使うなりしないといけない。
598:デフォルトの名無しさん
08/03/09 09:51:30
先にSTLについて質問したものです。
教えてもらったファイルとかを見てみたのですが、マルチスレッド環境で
std::cout に何かを書き出す時、いちいちロックをとらないとだめなようですが、
ロックの必要ないcout相当のものはないでしょうか?
自分でinline関数を作ってつかうようにはしたのですが、、
599:デフォルトの名無しさん
08/03/09 10:33:05
ごめんマクロだった
boost::mutex mutex_io;
#define safe_cout(m) { \
boost::mutex::scoped_lock lock(mutex_io); \
m \
}
int main() {
safe_cout(
std::cout << "hello" << std::endl;
);
こんな感じ。
600:デフォルトの名無しさん
08/03/09 11:39:46
頭がこんがらがってきたのですが、
クラスmyclassの大きさをnバイトとして、次のように定義すると、
myclass *A;
A = new myclass[x];
myclass B[x];
sizeof()の戻り値が
n ← sizeof(myclass),sizeof(*A),sizeof(*B)
4 ← sizeof(A)
x*n ← sizeof(B)
となるわけですが、AとBにはどういう違いがあるんでしょうか
601:デフォルトの名無しさん
08/03/09 11:45:03
配列とポインタの違い。
ちなみにsizeof (*B)は、Bが配列型→ポインタ型への変換を受けた後、
それに単項*演算子を適用しているので、B型のインスタンスをsizeofにかけていることになる。
602:デフォルトの名無しさん
08/03/09 11:56:08
Aはポインタ型(配列の先頭を指す)
Bは配列型(値は配列の先頭を指すポインタ)
ってことでしょうか
両方A[0].xとかB[1].xでクラスのメンバ変数xにアクセスできるので、
イマイチ区別が付きませんでした
603:デフォルトの名無しさん
08/03/09 12:13:17
配列型のインスタンスは、原則として式の中でその先頭要素を指すポインタに変換される。
(sizeof Bのように直接sizeofの演算対象にするのはその例外の1つ)
それで、[]演算子は常にポインタを対象にしている。
このページの中程にそういう話がある。
URLリンク(kmaebashi.com)
604:デフォルトの名無しさん
08/03/09 12:32:06
cout << Bでどう考えてもBがポインタだったのは、
自動で変換されていたためでしたか
そのページを参考に基本的な部分を整理しようと思います
ありがとうございました
605:デフォルトの名無しさん
08/03/09 17:48:09
これの直しかたわかりませんか?
コンパイル時にアットマークがついてしまいます
Error 42: Symbol Undefined _WSACleanup@0
606:デフォルトの名無しさん
08/03/09 17:58:46
それはstdcall関数の仕様。
@がどうとか関係ないから、ws2_32.libか何かをリンクしろ。
607:デフォルトの名無しさん
08/03/09 18:03:44
C++の入門書のお勧めは?
608:デフォルトの名無しさん
08/03/09 18:04:43
accelerated C++
609:デフォルトの名無しさん
08/03/09 19:12:41
>>607
猫でも分かるC++言語プログラミング
610:デフォルトの名無しさん
08/03/09 21:05:34
>>608
そ・れ・は・な・い
611:デフォルトの名無しさん
08/03/09 21:22:02
>>610
え、そうなの?
>>608見てアマゾンに注文したばかりなんだけど。
612:デフォルトの名無しさん
08/03/09 21:29:54
>>611
評判はとてもいいのですが
入門向きでは無いだろあれw
C++が初めてで、他になにかやってたってとかならまだいいんだろうけど
613:デフォルトの名無しさん
08/03/09 21:30:27
>>611
読む価値は非常に高い良書。
ただ入門書を探してる人のレベルによっては
難しいと感じるかもしれないというだけのこと。
いずれ読むべきだから買っておけ。
614:デフォルトの名無しさん
08/03/09 21:42:41
JavaやC#でいうところのInterface的なものを真似る場合
class IHogeの中に実装があってもいいのでしょうか?
615:デフォルトの名無しさん
08/03/09 21:48:02
実装があるならabstractクラスを真似るべきじゃね
616:デフォルトの名無しさん
08/03/09 21:57:55
多重継承最強!
617:デフォルトの名無しさん
08/03/09 22:06:06
>>614
「真似る」のなら駄目
C++的にIHogeの中に実装があってもいいかどうかは別ね
618:デフォルトの名無しさん
08/03/09 22:25:57
accelerated c++ はベターCでなく C++ らしいやり方で進めてるところが好き
619:デフォルトの名無しさん
08/03/09 22:30:02
いずれ読むべきという点で「C++の設計と進化」をお勧(ry
620:デフォルトの名無しさん
08/03/09 23:17:51
独習C++やらロベールやら色々あるから
本屋でとりあえず立ち読みでもしてみれ。
ネットでポチっと買うと合わなかった時悲惨。
621:デフォルトの名無しさん
08/03/09 23:42:18
現行規格とはずれているがARMの内容は秀逸。
622:デフォルトの名無しさん
08/03/09 23:53:59
今のところ、入門に向いてるのは609の
猫でも分かるC++言語プログラミングだけだなw
>>607
「猫でも~」は本買った方がいいけど(著者にとって)、webでも見れるよ。
URLリンク(www.kumei.ne.jp)
623:デフォルトの名無しさん
08/03/10 00:02:50
じゃあ一発
これならわかるC++ ブルーバックス版
624:デフォルトの名無しさん
08/03/10 00:04:46
>>614
それなんてCOM?
625:デフォルトの名無しさん
08/03/10 00:05:50
猫でもを妙に推している人がいるな。
本人なのか、信者なのか。
626:デフォルトの名無しさん
08/03/10 00:08:18
猫でもわかるシリーズにC++編はないわけだが
627:デフォルトの名無しさん
08/03/10 00:10:15
ググったら確かに。書籍化されてるのは C だけだな。
じゃあ本人ではないなw
628:デフォルトの名無しさん
08/03/10 00:10:15
webにはちょっとあるけど全然使えない
629:622
08/03/10 00:13:06
>>625
推してるの一人じゃね?
俺はwebでも見れるよって言いたかったの。
"だけだな"って言ったのはacceleratedとかD&Eとか無茶やろって思ったからw
630:デフォルトの名無しさん
08/03/10 00:16:03
>>628
あれって全部じゃなかったんだ・・・
631:デフォルトの名無しさん
08/03/10 00:18:10
独習やロベールは別に無茶じゃないだろ?
632:デフォルトの名無しさん
08/03/10 00:21:07
>>625
猫は素人でも知ってる場合があったぞw
素人メールに猫の話があった時には目を疑った。
Web主体の素人さんにはPG的に一番名度高いのかも知れんね。
633:デフォルトの名無しさん
08/03/10 00:23:37
>>631
ごめん"立ち読みしてみれ"のあたりしか読んでなかった。
独習は良いかもね。
634:デフォルトの名無しさん
08/03/10 00:25:03
猫でもはサンプル動かして改造するのには最適
入門書読んで、猫でもで遊んで、オブジェクト指向とか良いプログラミング作法でも学んでいけばいいんじゃね
635:デフォルトの名無しさん
08/03/10 01:34:18
C言語を独学で学んでいるのですがよく分からない文字(演算子?)があります
->
↑これはどういった意味の物なのでしょうか?
636:デフォルトの名無しさん
08/03/10 01:37:35
アロー演算子
637:デフォルトの名無しさん
08/03/10 01:38:56
>>635
A* a = new A();
//以下の2行は同じ
(*a).aaa();
a->aaa();
638:デフォルトの名無しさん
08/03/10 01:41:57
>>635
ポインタptrが指す構造体のメンバmemである
(*ptr).mem を ->演算子を用いて
ptr->memと表す。
a -> b は、aが指す構造体のメンバbを表す。
639:デフォルトの名無しさん
08/03/10 01:45:26
>>636-638
良く分かりました。ありがとうございます。
640:デフォルトの名無しさん
08/03/10 01:56:28
俺は (*a) も a-> も導入せずに、
同じ意味で a@ みたいな演算子が欲しかったよ・・・
[0]の構文糖衣として。
a@.aaa();
a@ += 10;
a@++;
まぁ、提案するとしても20年くらい言うのが遅い(C言語宛てになるし)わけだけど。
641:デフォルトの名無しさん
08/03/10 02:03:40
Delphiみたいに ^ がいいな
642:デフォルトの名無しさん
08/03/10 02:22:49
そうなると、定義もDelphiっぽくA^ a;になってC++/CLI設計者が涙目w
643:デフォルトの名無しさん
08/03/10 02:26:36
A$でおk
644:デフォルトの名無しさん
08/03/10 02:53:11
>>640
そもそも*(ついでに&も)が後置だったら良かったと俺は思う。
なんで前置にしたんだろう。
645:デフォルトの名無しさん
08/03/10 02:57:37
それを言い出すとなんで関数ポインタの宣言はあんなに狂ってるんだとかそういうハナシに
646:デフォルトの名無しさん
08/03/10 03:09:58
そもそもなんでこんな話題話してんだという話になる
647:デフォルトの名無しさん
08/03/10 03:24:32
>>644
たしかに。後置で良いよな。
>>646
void 635(){
640();
}
648:デフォルトの名無しさん
08/03/10 03:46:23
何故前置にしたのか気になってD&Eちょっと見て
C言語の設計者の方じゃないと意味無いことに気付いた
649:デフォルトの名無しさん
08/03/10 05:09:56
素人の友達にWindowsプログラミングしてみたいから
いい本ないかと聞かれて猫でもわかる~を薦めたら
馬鹿にするなと怒られた。
他意はなかったんだが、うかつだったわ。
650:デフォルトの名無しさん
08/03/10 06:44:56
それだけ聞くと、なんか馬鹿っぽい友達だな。
651:デフォルトの名無しさん
08/03/10 07:25:43
数学でも単項演算子は前置である割合が多いから、
特別な理由をその時思いつかなければ
まず後置にはしないと思う。
652:デフォルトの名無しさん
08/03/10 09:54:49
オブジェクトの排他制御というのはマルチスレッドで処理するとき以外は気にしなくて良いのでしょうか?
というか、マルチスレッドを利用する場面というのはどういうときなのでしょうか
653:デフォルトの名無しさん
08/03/10 10:01:09
マルチスレッドでぐぐれよもう
654:デフォルトの名無しさん
08/03/10 11:21:28
>>652
ウンコしながらオナニーとか
655:デフォルトの名無しさん
08/03/10 11:50:51
>>652
GUIアプリなんかで通常の機能を提供しながら重い処理をバックグラウンドでやるとか
656:デフォルトの名無しさん
08/03/10 11:56:51
>>654
流石にそれは難しいだろう。
>>652
トイレで出すもの出しながら飲食するとか。
657:デフォルトの名無しさん
08/03/10 12:20:13
>>649
猫でもわかる~のサイトは、中身はいいけど、体裁がなぁ...
プログラムの入門サイトなんだし、HTMLのタグぐらい、もうちょっと調べようよつとか思うよね...
658:デフォルトの名無しさん
08/03/10 12:24:13
文章が読めたら何でもいいだろ・・・
659:デフォルトの名無しさん
08/03/10 12:32:21
本人乙
660:デフォルトの名無しさん
08/03/10 12:34:24
むしろプレーンテキストでいい
661:デフォルトの名無しさん
08/03/10 13:33:18
Delphiなんかの ExpandFileName関数(相対パスを絶対パスにする)と
同じ働きをする関数って VC++ だとなんて関数?
662:デフォルトの名無しさん
08/03/10 13:37:42
GetModuleFileNameでがんばるとか
663:デフォルトの名無しさん
08/03/10 13:44:38
VC++標準じゃないが、boostにパス変換がある。
boost::filesystem::system_complete
664:デフォルトの名無しさん
08/03/10 13:45:59
>>662
何故GetModuleFileName()?
あれはカレントからの相対パスを解決する関数なんだから、モジュールからの相対パスにしちゃダメだろう。
665:デフォルトの名無しさん
08/03/10 13:54:07
GetFullPathNameは駄目なの?
666:デフォルトの名無しさん
08/03/10 13:56:31
クラスのメソッドから、クラスのインスタンスの変数名を知る方法ってありますか?
具体的には、
class test {};
test a1;
a1.method();
としたとき、method内でa1という名前をしることは出来ますか?
667:デフォルトの名無しさん
08/03/10 14:05:01
>>666
ムリ
668:デフォルトの名無しさん
08/03/10 14:07:08
>>666
thisでよくね?
669:デフォルトの名無しさん
08/03/10 14:12:44
面倒だがコンストラクタの引数で変数名を文字列受け取るようにして
自分で保持するってのは?
class test {
std::strung instance_name;
public:
test(const char *pName) {
instance_name = pName;
}
}
test a1("a1");
670:デフォルトの名無しさん
08/03/10 14:15:06
変数名が知りたいっていう状況がわからんのだが
どう使うの?
671:デフォルトの名無しさん
08/03/10 14:26:04
>>667-670
ありがとうございます。
用途はデバッグです。あるクラスの中身を表示させているのですが、
どのインスタンスかがわかりやすいようにしたかったので、、
自動化したいので、コンストラクタの引数に書くのは避けたいです。
が、これが一番確実ですかね。
672:デフォルトの名無しさん
08/03/10 14:30:23
>>671
Use the debugger, >671
673:デフォルトの名無しさん
08/03/10 14:32:57
デバッグ用途ならマクロの文字列化演算子 # を使うとか
674:デフォルトの名無しさん
08/03/10 14:44:44
>>671
どういう環境かは知らんが>>672の言うようにデバッガ使ったらいいと思う
675:デフォルトの名無しさん
08/03/10 15:03:47
>>671
何らかの制限で、デバッガが使えない場合
デバッグログが使えるのならば、
生成した側が、確保されたアドレスを出力(__FILE__と、__LINE__も一緒に出力するとわかりやすい)
クラスの中身を表示するところでthisを表示すればいいんじゃないかな?
>>674
なかなか面白い書き込み時間だ
676:デフォルトの名無しさん
08/03/10 16:52:05
URLリンク(www.borujoa.org)
簡易ブラウザを作っているのですが、ソケット接続エラーがでます。
どこが原因か分かりません。教えていただけませんか?
677:デフォルトの名無しさん
08/03/10 18:03:29
>>676
htonsとか?
678:デフォルトの名無しさん
08/03/10 18:06:29
>>676
基礎からやり直せ。
679:デフォルトの名無しさん
08/03/10 19:01:42
ハ,,ハ
('(゚∀゚∩_ おいらをどこかのスレに送って!
/ヽ 〈/\ お別れの時にはお土産を持たせてね!
/| ̄ ̄ ̄|.\/
|dexiosu|/
 ̄ ̄ ̄
現在の所持品:たばこ・ライター・コーヒー・ブラックブラック・枕・ケータイ電話
睡眠薬・聖教新聞 ・ダッチワイフ・外付けSCSI340MHDD・ネットランナー4月号
TYG02・小嶋進社長・ペプシNEX・モツ煮・ヌルポ・伊予柑・寒いギャグ ・7年ものキムチ
・カビキラーストロング ・ハイスクール奇面組文庫版全13巻 ・(元)関内太郎 ・チャッカマン
・ぺヤングソースやきそば・魔法先生ネギま!14巻限定版 ・小田急3000形・PSP
・デスノート ・ファブリーズ ・ポーション ・SH902i ・Windows3.1
680:デフォルトの名無しさん
08/03/10 19:11:21
>>676
生ソケットでHTTPをやるプログラム例はウェブにやまほど転がってるか
ら、それらを見て何が足りないか調べてみましょ。
gethostbyname()やsocket()のエラーチェックもしましょ。
それ以外にもツッコミ所が多いけど致命的じゃないので省略。
681:676
08/03/10 20:26:39
うん、何か知らないけど分かって言ってるのか分かってないのかようわからん、
役に立たない情報ありがとう。
682:デフォルトの名無しさん
08/03/10 20:37:07
>>680
例えばnewしてdeleteしないのは、それが習慣化すると致命的だと思うぞ。
>>676
ということで、>678。
まさかとは思うが、そのレベルで外部に直接繋ぎに行くなよ。
接続先に迷惑掛けることになるからな。
683:676
08/03/10 20:44:42
>>682
いまどきのパソコンは自動で解放するから別にデリートしなくていいし
(つーかdeleteしなかったのはこの程度のプログラムだったらいらんし面倒くさいからで)、
その機能的な面を考えておるんだったら、最初っから一気にメモリ確保しといて、
解放しますよ。あと、ポート80に設定してないとか言われてたが、
あれはポート80に設定しなかったら自動で80に設定してくれるからで、面倒くさいから。
socket()のエラーチェックしなかったのは、面倒くさかったからで。
684:デフォルトの名無しさん
08/03/10 20:48:29
>>682
newしてdeleteしない習慣がついてます、サーセンwww。
vectorとかshared_ptrがないと生きていけません。
685:デフォルトの名無しさん
08/03/10 20:49:11
お前に教えるのが面倒くさいわ。
686:デフォルトの名無しさん
08/03/10 20:49:20
きみのところの石がPowerPCとかMIPSとかでないなら、
iprt.sin_port=80;
は
iprt.sin_port=20480;
にするといいお
687:676
08/03/10 20:50:38
>>684
俺もC++で、ついこないだまで必死でc_str( )使ってた。
688:デフォルトの名無しさん
08/03/10 20:52:26
newはクラス以外で使うなよ
STLのように自動開放する以外には使うべきでない
689:676
08/03/10 20:53:06
>>686
あぁ消したハズなのに普通に代入してたの残ってた。
このことか。ありがとう。
てか20480って怪しいポート何?
690:デフォルトの名無しさん
08/03/10 20:54:16
deleteめんどくさいならnewしなきゃいいって発想はないのかなぁ。
悪くてもこの場合固定長配列でいいし、もっと言えばstringを使うべきところ。
全く意味のないnewじゃん。
newしてdeleteしないのが致命的にならないのはこのサイズのバイナリだからであって、
自動でやるからデリートしなくて良いって考え方は非常に危険。くせにするなって言う意見のがもっとも。
たとえば、photoshopみたいなソフトを作ってる人がnewしてdeleteしなかったらどうなるか。
691:デフォルトの名無しさん
08/03/10 20:54:40
はい、GCを導入します
692:676
08/03/10 20:59:43
>>690
ありがとう。今度からできるだけ意味無いことは止める。
string型にすればいいだろうなぁとは思ってた。
最初mallocにしてたけど、知らん間にnewになった。
そもそもstringならnewはいらんはなしだったけど、そこまで頭回らんかった。
俺の脳裏にはC言語っぽいのをできるだけC++っぽくしようってのがあったんだと思う。
かえってそれが変に見えたのは認める。
勉強になりました。
693:デフォルトの名無しさん
08/03/10 21:01:47
つーか、
・getaddrinfo使えタコが
・面倒だからとエラー処理サボると、もっと面倒な事態に
の例
694:676
08/03/10 21:07:27
>>693
ネットワーク系に触るの生まれて初めてなのよn
getaddrinfoか、メモメモ
/ ̄ ̄\/)
f ヾ
| ⊂(゚Д゚)|
ヽ _(◎)ノ ノつ
/ノ/ ハヽ二二ノ
( (||i) )ヽ\
ヽ)L人(_/(ノ`J
695:デフォルトの名無しさん
08/03/10 21:30:06
>>694
触んないほうがいい。
696:676
08/03/10 21:42:16
>>695
NEってCCNAとかのイメージが先行して配線を弄ってるイメージ強かったけど、
プログラム組ませると「間違えると危険なんだなぁ」とは思った。勉強になりました。
安全な下級PGに戻ります。
697:デフォルトの名無しさん
08/03/10 22:38:48
スレがカオス気味でワロタ
698:デフォルトの名無しさん
08/03/10 23:10:24
ここでド素人の俺が颯爽と質問
int型へのポインタの宣言って
int *a;
int* a;
この二つで差がありますか?
699:デフォルトの名無しさん
08/03/10 23:13:06
int* a, b;
700:デフォルトの名無しさん
08/03/10 23:13:52
若干スレ違い臭いのですが、質問させてください。
コンパイル時、2つのコンパイルオプションを指定したいのですが、どのように書けばいいのでしょうか。
例えば`wx-config --cppflags` と `pkg-config --cflags gtk+-2.0`
を同時に使いたいのです。
701:デフォルトの名無しさん
08/03/10 23:14:44
>>698
違いはありません。
しかし、その二つはまれに戦争の火種となります。
702:デフォルトの名無しさん
08/03/10 23:19:40
>>698
int *a, b;
int* a, b;
703:デフォルトの名無しさん
08/03/10 23:33:51
>>699,701-702
ありがとうございます
intだとint型とint型へのポインタが同時に宣言でき、
int*だとint型へのポインタのみ宣言できるわけですか
>戦争の火種
(((( ;゚Д゚))))ガクガクブルブル
704:デフォルトの名無しさん
08/03/10 23:39:19
>>703
いいえ、どちらも同じです
705:デフォルトの名無しさん
08/03/10 23:40:40
>703
戦争の火種って言っても空襲は来ないから安心しておじいちゃん。
706:デフォルトの名無しさん
08/03/10 23:47:02
>>703
残念ながらそれは違う
707:デフォルトの名無しさん
08/03/10 23:59:24
int *a, b;
int* a, b;
二つとも
aがint型へのポインタ。int型の変数bでしょうか?
708:デフォルトの名無しさん
08/03/11 00:02:17
Yes.
int* a, b; と書こうが、b はポインタにはならない。
709:デフォルトの名無しさん
08/03/11 00:02:58
>>707
その通り
710:デフォルトの名無しさん
08/03/11 00:05:39
int * a; のように書く人もいるね。
711:デフォルトの名無しさん
08/03/11 00:07:17
>>700
単に並べればいいよ。
gcc `wx-config --cppflags` `pkg-config --cflags gtk+-2.0` mycode.cc
712:デフォルトの名無しさん
08/03/11 00:08:06
int*a; 派
713:デフォルトの名無しさん
08/03/11 00:09:31
おまえがどう書こうが関係ねえ
714:デフォルトの名無しさん
08/03/11 00:10:33
int
*
a
;
派
715:デフォルトの名無しさん
08/03/11 00:11:23
>>714
ステップ数至上主義者ですね
716:700
08/03/11 00:17:01
>>711 さん
ありがとうございます!
717:デフォルトの名無しさん
08/03/11 00:34:27
i\
n\
t
*
a
;
派
718:デフォルトの名無しさん
08/03/11 00:37:59
boost::mpl::identity<int*>::type a;派
719:デフォルトの名無しさん
08/03/11 01:21:53
string の読み込みがないのが不便ですね
改行やバリナリはありますが 自作するしかないですか
720:デフォルトの名無しさん
08/03/11 01:24:21
C言語やWindowsAPIはファイルの入出力が低レベルのしか無いです
たとえば空きメモリを調べてバッファを使って出力するとか
そういうのを強化するライブラリ無いですか ビット単位の出力もないです
721:デフォルトの名無しさん
08/03/11 01:25:23
boostでおk
722:デフォルトの名無しさん
08/03/11 01:27:40
詳しく教えてください ライブラリ名とか
723:デフォルトの名無しさん
08/03/11 01:32:21
例えば、Fstream というバッファ付きファイル出力クラスを自作したとします
書き込みがあまりなくなったらメモリを解放したいのですが、
一番最後の書き込み時に解放しなかった場合、
それ以降アクセスがなかったら無いことを知ってメモリ解放するにはどうしたらいいですか
724:デフォルトの名無しさん
08/03/11 01:33:05
デストラクタで開放するようにして、スマートポインタに入れるなりなんなり
725:デフォルトの名無しさん
08/03/11 01:34:41
クラス生成時にサブスレッドを動かして
時間計測してシグナル出せば良さそうですね
726:デフォルトの名無しさん
08/03/11 01:37:56
>>724
複数のファイルを同時に扱いたいです 1000個の書き込みがあれば
一つあたり100KB確保でも大きいです
単独でバッファ管理するより複数を調べた方が良さそうですが
727:デフォルトの名無しさん
08/03/11 01:43:50
例えば
Fstream fp("out1"), fq("out2"); としたとします
クラスはfpの状態とfqの状態両方を知ることは出来ますか
728:デフォルトの名無しさん
08/03/11 01:51:55
static変数ででも管理すればいいだろ
729:デフォルトの名無しさん
08/03/11 01:57:24
fp[100]としたとき、メモリを解放した方が良い番号がわかったとき自動的に
解放させるにはどうしたらいいですか?
最近参照された時間を保持していてもメンバ関数からでは
他のメンバ変数はわからないですよね
730:デフォルトの名無しさん
08/03/11 01:58:38
>>729
728読んだ?
731:デフォルトの名無しさん
08/03/11 01:59:49
staticは共用されないですか?
個別の時間を保持しないと駄目ですが
732:デフォルトの名無しさん
08/03/11 02:01:30
全インスタンスの個別の時間を保持するlistかmapかなんかをstatic変数にすればいいだろう
733:デフォルトの名無しさん
08/03/11 02:02:00
だいたい貴様の知識が乏しいのは自分でもわかってるんだろ。
その貧相な知識で勝手に判断して人のレスを無視するんじゃねえよ
734:デフォルトの名無しさん
08/03/11 02:03:54
時間管理もバッファも、vector型にして共用すれば良いですか?
735:デフォルトの名無しさん
08/03/11 02:09:53
あとメモリ解放のためにサブスレッドを動かしたいのですが
コンストラクタに入れるとクラス生成ごとに呼びだれると思うのですが
これも共用するにはどうすればいいですか?
static fnc(){}などと書けば初めの一回だけになりますか
736:デフォルトの名無しさん
08/03/11 02:10:01
質問する前に手を動かしてみたら?
737:デフォルトの名無しさん
08/03/11 02:15:17
闇雲に手を動かすだけで、「~をやってみましたがうまくいきませんでした。なぜですか。」とか聞いてきそうだ。
>static fnc(){}などと書けば初めの一回だけになりますか
staticというキーワードを知っているのなら、それについての最低限の仕様くらいは
自分で調べたほうがいいよ。webを見るなり、まともな入門書を読むなりして。
凝ったことをやろうとする前に、もっと先に学ぶべきことが多そうだ。
738:デフォルトの名無しさん
08/03/11 02:28:02
うごかないですが原因がわかりません
どうすればいいですか
class cls{
public:
static int n;
cls(){ n=0; }
};
main(){ cls x; }
739:デフォルトの名無しさん
08/03/11 02:32:52
どううごかないんだ
コンパイルエラーなのか
画面に何も表示されないのか
後者なら別におかしくないぞ
740:デフォルトの名無しさん
08/03/11 02:37:50
Error: 未解決の外部参照 'cls::n' がTEST.OBJ から参照されました
とでます
741:デフォルトの名無しさん
08/03/11 02:39:42
static変数の定義がないから
static int cls::n;
742:デフォルトの名無しさん
08/03/11 02:42:55
それは知りませんでした サンクス
あとクラスのメンバ関数も共用出来ますか? 初めに一度コンストラクタで起動するだけにしたいです
743:デフォルトの名無しさん
08/03/11 02:44:44
>>742
staticをメンバ 関数につけたらどうなるか調べなおせ
744:デフォルトの名無しさん
08/03/11 02:56:22
他人のコードを読んでいて、
namespace std {
template <>
void swap(hoge &a)
みたいな記述があったのですが、templateのあとの<>の中が空白でも
コンパイル出来ているのですが、なんででしょうか?
745:デフォルトの名無しさん
08/03/11 02:57:24
パラメータ0個のテンプレート
746:デフォルトの名無しさん
08/03/11 03:01:30
>>745
ありがとうございます。でも意味がないような、、、
どんな時につかうのですか?
747:デフォルトの名無しさん
08/03/11 03:06:02
特殊化でぐぐれ
748:デフォルトの名無しさん
08/03/11 03:11:47
read(fp, x)
write(fq,x)
としたとき、読み込むファイルが1G以上だとメモリがたらなくなります
あらかじめ書き込むサイズが判明していたとしてマルチスレッド化して
read(fp, x)
write(fq, x, N, KAIHOUFLG)
としてメモリを解放しながら読み書きするにはどのように実装すればいいですか
749:デフォルトの名無しさん
08/03/11 03:15:09
マルチスレッドに何の関係があるんだよ。
分割して読み書きすればいいだけだろうが
750:デフォルトの名無しさん
08/03/11 03:17:02
read(fp, x)はファイルを読み込みますが、例えば1G読み切るまで停止しないって事です
751:デフォルトの名無しさん
08/03/11 03:19:17
それはそのreadの設計が悪いだけだろうが。
752:デフォルトの名無しさん
08/03/11 03:20:49
>>747
ありがとうです。特殊化でぐぐったら、wikipediaのエントリが先頭に出てきて、それを
読んだらわかりました。(わかりやすく書いてあった)
templateのうち、コンパイラまかせじゃなくて自分で書いてしまいたいところを自分で
書くということですね。
753:デフォルトの名無しさん
08/03/11 03:21:11
1Gのファイルを読み込んだとして、
メモリを解放しながら書き込むという指定をすると
読み込まれた部分に対して先頭からメモリを解放しながら書き込みます
754:デフォルトの名無しさん
08/03/11 03:23:27
通常使用では一括して読み込むことも出来るし、
メモリを解放させながら読み込むことも出来るという汎用の関数を作りたいんです
755:デフォルトの名無しさん
08/03/11 03:25:35
なら作ってください
756:デフォルトの名無しさん
08/03/11 03:26:09
やり方を教えてください
757:デフォルトの名無しさん
08/03/11 03:30:19
上で散々でてるがな。
758:デフォルトの名無しさん
08/03/11 03:30:20
商品先物や、為替取引と同じようなものです
現物を扱わずに売り買いだけを先にしてしまうようなものです
読み込みと書き込みの約束だけをしてしまい不要ならメモリを解放します
759:デフォルトの名無しさん
08/03/11 04:31:06
口約束で終わるって事か?
760:デフォルトの名無しさん
08/03/11 06:03:12
スレが伸びてると思ったら、梯子もなしに屋上に上ろうとする馬鹿が沸いてたか。
761:デフォルトの名無しさん
08/03/11 07:20:30
VirtualAllocでCOMMITを調整する話か?
まー、32bitアプリは仮想メモリ空間も
2Gあたりでリミットだからあんまし意味がないけど
762:デフォルトの名無しさん
08/03/11 07:20:53
>>756
763:デフォルトの名無しさん
08/03/11 07:23:38
>>756
Windowsなら4つのAPIで実現できる。
APIの頭文字はそれぞれ、C、M、U、Cだ。
764:デフォルトの名無しさん
08/03/11 09:38:41
書き込み予約と、読み取り予約と、バッファ管理して
それらを同時に動かして快適動作させたいわけです
コードを教えてもらえませんか?
読み書きのバッファを128KB単位にして管理すれば良さそうなんですが・・
x[n]のようにデータにアクセスできるが、前方が解放されていたとしてもそれ以外は同じアクセスが出来るようにしたいです
765:デフォルトの名無しさん
08/03/11 09:46:11
>>764
ディスクを交換するほうが早い。
766:デフォルトの名無しさん
08/03/11 10:36:58
>>764
脳ミソを交換ry
767:デフォルトの名無しさん
08/03/11 12:00:57
>>764
したい事は >>748 なのか?
もしそうなら、標準関数は何もしなくてもそうなってる
一体何のために何がしたい?
768:デフォルトの名無しさん
08/03/11 13:46:23
読み込みや書き込みをできる限りメモリにキャッシュしたい、というこ
となら、組み込み環境でない限り、OSがそれぐらいはやっている。
769:デフォルトの名無しさん
08/03/11 13:57:28
そんなこと無いよ
それだったらFFCやfast copyがOS標準のコピーを上回らないはずだよ
一つの巨大ファイルだけを扱うならば、速度差は出ないだろうけど
複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない
あと2Kずつ書き込みがあったとしたらそのつどAPIでそのまま書き込んでいたらとても鈍いよ
770:デフォルトの名無しさん
08/03/11 14:02:16
ファイルをメモリにロードする事、複数の少数ずつのファイル出力の最適化する事
上のファイルロードをスレッド化して読み込み中に不要なメモリを解放出来るようにすること
771:デフォルトの名無しさん
08/03/11 14:07:58
まずC言語とWindows APIのファイル入出力は難しいんだよ
Read( "inputfile", buf );
Write( "outputfile" , buf );
だけで扱えるようにしたい
しかしここで、バッファ管理やマルチスレッド化を導入しなければ
巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する
これらを解消して簡単なファイル入出力をしたい
772:デフォルトの名無しさん
08/03/11 14:10:02
ファイルマッピングをmemcpyしたまえ
64ビットならアドレス空間も余裕だ
773:デフォルトの名無しさん
08/03/11 14:20:24
>>769
FFCとかはFILE_FLAG_NO_BUFFERINGをつかって
システムキャッシュにのせないことで高速化してるんじゃなかったっけ?
774:デフォルトの名無しさん
08/03/11 14:28:10
>>770
目指している方向はわからなくもないが、
ここで色々訊いているような人間が使い物になるものを作れるかどうか不安。
何事も、下手な自作よりOS標準など既存のものほうがずっとうまいと仮定すべき。
775:デフォルトの名無しさん
08/03/11 14:33:19
読むだけじゃ意味無い(処理するために読む)んだから、
巨大データをオンメモリでっていうこと自体に元々限界があるの。
分けなさい。
776:デフォルトの名無しさん
08/03/11 14:49:21
すみません 出力値が異なるのですが原因がわかりません なぜでしょうか?
#include <iostream>
#include <string>
using namespace std;
#define N 10000000
int main(){
unsigned int n,m,cn[256];
string x(N,'\0');
for(n=0;n<N;n++)x[n]=rand()&255;
for(n=0;n<256;n++){cn[n]=0;for(m=0;m<8;m++)cn[n]+=(n>>m)&1;}
unsigned int sum=0;
for(n=0;n<N;n++)sum+=cn[x[n]];
cout<<sum<<endl;
#define b(x,i) ((x>>i)&1)
sum=0;
for(n=0;n<N;n++){
int y=x[n];
sum+=b(y,0)+b(y,1)+b(y,2)+b(y,3)+b(y,4)+b(y,5)+b(y,6)+b(y,7);
}
cout<<sum<<endl;
}
777:デフォルトの名無しさん
08/03/11 14:52:58
自己解決しました
string x(N,'\0');
→
vector<unsigned char> x(N,0);
で一致しました
778:デフォルトの名無しさん
08/03/11 15:48:42
ちょっとお尋ねしたいのですが
コンパイル時
../source/memo.h:15: note: candidates are: MyFrame::MyFrame()
../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&)
のようなエラーが出たのですが、このエラーはどういう意味のエラーなのでしょうか??
779:デフォルトの名無しさん
08/03/11 16:52:43
それ単独では出ないと思うけど・・・
その直前のエラーについての補足説明で、
候補としてこういう関数がありますよってことじゃないかなたぶん?
780:デフォルトの名無しさん
08/03/11 20:31:11
山ほどあるコンパイラのエラー出力フォーマットなんていちいち覚えてられないよ。
コンパイラ・ソース・エラー(省略せずに)を明記してくれ。
781:デフォルトの名無しさん
08/03/11 21:04:38
>>778
noteって単語と、candidateって単語の意味くらい調べましょうね。
そうすればそれらの行がエラーじゃないことと、何を言わんとしているか位判るだろうから。
782:デフォルトの名無しさん
08/03/11 21:06:36
>>769
>複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない
 ̄ ̄
>巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
落ち着いて、日本語で書いてください。
783:デフォルトの名無しさん
08/03/11 21:07:04
int a[6]={0,1,2,3,4,5,6}
とすると、配列の中身を一気に定められますが、
int a[6]
と一度定義した配列に一気に中身を代入することは可能でしょうか
784:デフォルトの名無しさん
08/03/11 21:15:55
>>783
int oneShotArray[] = {0, 1, 2, 3, 4, 5, 6};
int a[6];
std::copy(oneShotArray, oneShotArray + 6, a);
memcpy(a, oneShotArray, sizeof(* a) * 6);
785:デフォルトの名無しさん
08/03/11 21:43:13
誘導されてこちらに来ました。
ifstreamで半角空白を含むファイル名や、日本語を含むパスで
ifstream ifile(フルパス名);で失敗してしまうのですが、これは仕様なのでしょうか?
仕様なのでしたら回避策はあるのでしょうか?
Visual Studio 2005SP1を使用しています。
よろしくおねがいします。
786:デフォルトの名無しさん
08/03/11 21:43:47
コンパイルはVisualStudio2005 Command Promptで行いました。
フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main(int argc, char **argv)
{
ifstream ifile("d:\\新規テキスト ドキュメント.txt");
if(ifile) {
MessageBox(NULL, "success", "info", MB_OK);
ifile.close();
} else {
MessageBox(NULL, "failed", "info", MB_OK);
}
return 0;
}
787:デフォルトの名無しさん
08/03/11 21:44:52
>>786
向こうの誘導したレスの前半は無視ですか?
788:デフォルトの名無しさん
08/03/11 21:46:51
えくすぽろーらで開けんだから、ファイルはあるんしょ
789:デフォルトの名無しさん
08/03/11 21:49:05
とりあえずtest.txtで試してみたら?
790:デフォルトの名無しさん
08/03/11 21:49:56
だから、カレントディレクトリはどこなのかとw
791:デフォルトの名無しさん
08/03/11 21:50:28
ソースコードのエンコーディングがutf8なんじゃない?
792:デフォルトの名無しさん
08/03/11 21:51:42
>>787
ファイルはあります。
>>789
"d:\\test.txt"ではsuccessとなります。
793:デフォルトの名無しさん
08/03/11 21:52:33
だったらロケール設定して見るんだ。
794:デフォルトの名無しさん
08/03/11 21:53:40
>>791
ソースコードに
// あいうえお
と入力して、テキストエディタでエンコードを確認しましたがシフトJISでした。
795:デフォルトの名無しさん
08/03/11 21:57:55
>>793
setlocale(LC_ALL, "");
で出来ました!
ありがとうございました!
796:デフォルトの名無しさん
08/03/11 22:36:43
向こうで速攻でロケールについて指摘されているのを無視するからだ・・・
797:デフォルトの名無しさん
08/03/11 23:16:36
なんで無知の身でもらった回答を勝手に「選別」するんだろうな。
798:デフォルトの名無しさん
08/03/11 23:17:43
自分クラスのアドレス(実際はthis)をstatic_castで上位クラスにキャストしなおして、上位クラスのメソッドを呼ぼうと思ったのですが
segmentation faultになります。
baseclass::method();
と書いて目的は達成できたのですが、segmentation faultになる理由が分かりません。
#あと、このスレのタイトルが
#【初心者歓迎】C/C++室 Ver.50【環境依存OK】
# ってなってるけど、なんか何度かVer.50がくりかえされているような気がするのは自分だけ?
799:デフォルトの名無しさん
08/03/11 23:39:18
だからコードを晒せと。スラッシングが起きてるんじゃねーだろーなー
800:デフォルトの名無しさん
08/03/11 23:51:29
どこで聞けば良いのかわからなかったので、
環境依存OKということでここでお伺いします。
linuxThreadsでは、あるスレッドでsetpriority()を呼ぶと
親スレッドの優先度は変化しないと思いますが、
NPTLでは同一のPIDならすべて変化するのでしょうか?
801:デフォルトの名無しさん
08/03/11 23:52:56
>linuxThreadsでは、あるスレッドでsetpriority()を呼ぶと
>親スレッドの優先度は変化しないと思いますが、
そうは思えないが。
802:778
08/03/11 23:54:27
レスくださった方々ありがとうございます。
noteはなんとなく分かったのですが、candidatesは調べてもわかりませんでした。
candidatesは何のことなんでしょうか・・。
どなたかご教示頂けると幸いです。
803:デフォルトの名無しさん
08/03/11 23:57:01
ヒント:複数形
804:デフォルトの名無しさん
08/03/11 23:57:11
>>799
すいません。
class base {
public:
virtual void resize(){}
};
class deri : public base {
public:
virtual void resize() {
#if 1
base* tmp = this;
tmp->resize(); // ここでseg fault
#else
base::resize(); // 問題なし
#endif
}
};
です。
805:デフォルトの名無しさん
08/03/11 23:58:21
>>804
無限再帰でスタックオーバーフローだな。
806:デフォルトの名無しさん
08/03/11 23:59:48
・base::resize() 静的に呼ぶ
・tmp->resize() 結局virtualたどってderi::resize()にくるから無限再帰
807:デフォルトの名無しさん
08/03/12 00:00:30
>>801
即レスどうもです!!
そうなんですか?
manにはプロセスの優先度を設定すると書かれてありました。
linuxThreadsはPIDを共有しないので変化しないと思ってたのですが。
PIDは違うけどプロセスは同一ということでしょうか?
808:デフォルトの名無しさん
08/03/12 00:07:58
>>805-806
ありがとうございます。tmp->resize()の前にログをいれて再帰していることを確認しました。
再帰というのは全然考えてなかったです。
助かりました。
809:デフォルトの名無しさん
08/03/12 00:21:21
>>802
../source/memo.h:15: note: candidates are: MyFrame::MyFrame()
../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&)
俺も英語は苦手だがせっかくネット使えるんだから有効活用しようぜ。
「MyFrameが複数の候補がある」という内容。
コード上でどちらの処理を使うかがコンパイラに判断できないからだ。
810:デフォルトの名無しさん
08/03/12 00:23:45
エスパーすると、直前に
no matching function for call to ~
とか云われたはず。コードで書いてある引数に
マッチする関数の宣言がなかったって話。
811:778
08/03/12 01:14:43
>>803さん 809さん 810さん
レスありがとうございます。
なるほど、普通に「候補」でよかったんですね。
なんかプログラミングの専門用語でcandidatってのがあるのかと勘違いしてました。
ありがとうございましたm(_ _)m
812:デフォルトの名無しさん
08/03/12 01:16:15
正常なSJISならば出現しない番号0-255ってありますか?
813:デフォルトの名無しさん
08/03/12 01:24:27
>>812
日本語でおkと言いたいが、
windowsなら スタート → すべてのプログラム → アクセサリ → システムツール → 文字コード表
を見てみては?
814:デフォルトの名無しさん
08/03/12 02:02:04
すみません 番号を教えてください
815:デフォルトの名無しさん
08/03/12 02:10:10
新聞、2ちゃんなどを1ギガほど計測したところ次の通りでした
下位のものは間違ったSJISの番号でしょうか?
26番15475回
30番17423回
22番18440回
127番18931回
25番19273回
上位
32番45338056回
130番93045087回
816:デフォルトの名無しさん
08/03/12 02:11:38
スレ違い
817:デフォルトの名無しさん
08/03/12 02:51:43
一度定義したクラスのデータメンバやメンバ関数をあとで追加することってできないのでしょうか?
例えば、40行目で
clsss aaa {
public:
void sample1 ();
}
と定義したクラスのデータメンバとメンバ関数を、
80行目で
class aaa {
public:
int xxx;
void sample2();
}
みたいな感じで、追加する感じです。
上のように書いたのをコンパイルしようとしたらエラーが出たのですが、
すでに定義したクラスの機能を拡張するにはやはり継承しなければいけないのでしょうか??
818:デフォルトの名無しさん
08/03/12 02:52:26
はい、そうです
819:デフォルトの名無しさん
08/03/12 05:03:16
>>817
40行目の定義を削除すればいいじゃん。
820:デフォルトの名無しさん
08/03/12 05:44:14
環境はLinux/Windowsの両方です
HDD残量を取得したいのですがどのようにすればよいのでしょうか?
環境に関係なくとる方法はあるのでしょうか?
もしなければ,どのようにして取得すればよいか教えていただきたいです.
821:デフォルトの名無しさん
08/03/12 06:16:19
環境別に分ける
822:デフォルトの名無しさん
08/03/12 07:48:11
>>811
だから、英単語の意味を調べたら単に「候補」って出てくると思うのだが……
823:デフォルトの名無しさん
08/03/12 07:49:31
>>820
そもそも、どのディスクの残量を知りたいのかね。
824:デフォルトの名無しさん
08/03/12 07:55:39
Amazonを使ってる方へ
Amazonのほしい物リストで、個人情報(氏名等)がもれる場合があります。
ほしい物リスト(ウィッシュリスト)が未登録ならば、問題ありません。
しかし、自分のアカウントを調べた方が良いです。
URLリンク(1505953.blog76.fc2.com)
祭り中?
【祭】Amazonウィッシュリストで個人情報ダダ漏れ中★6
スレリンク(news板)
825:817
08/03/12 11:28:26
>>818 さん >>819さん
レスありがとうございます。
40行目のやつは、実際今作ってるプログラムだとincludeで読み込んでるライブラリで定義していまして、
消して下で書き直すのもライブラリ自体をいじるのもなんか好ましくないような気がしまして。
やはり継承するしかなさそうですね。というかむしろライブラリのクラスは継承してから使うものなんですかね。
ありがとうございましたm(_ _)m
826:デフォルトの名無しさん
08/03/12 13:36:09
すれ違いといううことでここに移ってきたんですが、
stlの使い方について質問です。今リストの中に1,2,4,8,16,32,64
と入っているんですが、"erase" を使って5番目の数字を削除して中身を表示し、
その後に3番目の数字を削除して表示。 そして、"insert"を使って3番目と4番目の
数字の間に7を入れて表示という感じにするにはどうしたらいいんですか?
osはubuntuでg++を使っています。
#include <iostream>
#include <iterator>
#include <list>
using namespace std;
int main(){
list<int> mylist;
for(int i=1; i<=64; i *= 2)
mylist.push_back(i);
cout<<endl;
list<int>::const_iterator itr1;
for(itr1 = mylist.begin(); itr1 != mylist.end(); itr1++)
cout<< *(itr1)<<" ";
return 0;
}
827:デフォルトの名無しさん
08/03/12 13:47:08
質問です
引数つきコンストラクタから、デフォルトのコンストラクタを呼ぶことはできないでしょうか?
Javaではできたので、C++でもできないものかと思っているのですが
CHoge::CHoge()
{
// 共通の初期化がだらだらと
}
CHoge::CHoge(int type)
{
// CHoge()で共通の初期化を呼び出したあと、色々やりたい
}
CHoge::CHoge(const char *psz)
{
// CHoge()で共通の初期化を呼び出したあと、色々やりたい
}
828:デフォルトの名無しさん
08/03/12 13:56:34
初期化処理をまとめたプライベート関数を作ればよろし
829:デフォルトの名無しさん
08/03/12 13:58:35
>>827
ないよ。
そんなことできたら初期化子が重複するから。
830:デフォルトの名無しさん
08/03/12 13:59:16
>>828-829
ありがとうございます
初期化プライベート関数つくるとします
831:デフォルトの名無しさん
08/03/12 14:01:57
>>826
>"erase" を使って5番目の数字を削除して中身を表示し
削除したら表示できないだろ。
削除するだけでいいなら、文字通りerase()を使えばいい。
# erase(), insert()は引き数にiteratorを必要とするが、
# advance()を使えば何番目を指すiteratorを作れる。
832:デフォルトの名無しさん
08/03/12 14:02:09
>>827
C++でもコンストラクタからコンストラクタを呼び出すことは文法違反ではない。
CHoge::CHoge()
{
// 共通の初期化がだらだらと
}
CHoge::CHoge(int type)
{
CHoge(); //一時オブジェクトの生成!!!!!
//いろいろな固有の処理
}
しかし、こんなコードを書いたならば想像してるとおりにはならないだろう。
こういう場合C++では、共通化したい処理をまとめた
(恐らくはprivateな)メンバー関数を別に用意する。
void CHoge::init();
CHoge::CHoge(int type)
{
init(); //共通の処理
//いろいろな固有の処理
}
833:デフォルトの名無しさん
08/03/12 14:10:49
勇気を出して変えてごらん
HogeをMoeに変えてごらん
そうすれば世界も変わって見えるんだ
834:デフォルトの名無しさん
08/03/12 14:20:50
>>831
"erase" を使って5番目の数字を削除して中身を表示
1,2,8,32,64
その後に3番目の数字を削除して表示
1,2,32,64
そして、"insert"を使って3番目と4番目の数字の間に7を入れて表示
1,2,32,7,64
というう感じにしたかったんです。
835:デフォルトの名無しさん
08/03/12 14:29:04
>>834
その通りに書けばいいだろ。
URLリンク(www.wakhok.ac.jp)
836:デフォルトの名無しさん
08/03/12 15:13:26
>>834
>831に書いた内容の何が気に入らないんだ?(:;
つーか、4はどこに消えたんだ?
837:デフォルトの名無しさん
08/03/12 15:27:12
マクロでクラス生成をしたいのですが、任意のクラス名を受け取る方法はないですか?
#define GENERATE_CLASS class X {...} // マクロを呼び出す側からXの部分を任意に指定できるようにしたい
838:デフォルトの名無しさん
08/03/12 15:30:49
#define GENERATE_CLASS(x) class x{hogehoge
ではないの?
839:デフォルトの名無しさん
08/03/12 15:48:28
template使えば?
840:837
08/03/12 15:58:32
>>838
その方法はGENERATE_CLASS(Hoge)と使った時、Hogeの部分でエラーが出た気がしたのですが、
今もう一度試してみたらできました。(別の部分で間違いがあったようです)
簡単すぎること聞いて申し訳ないです。
>>839
template引数のバインドができない関係で、マクロでクラスを書くことになってので、templateでは無理なのです。
841:デフォルトの名無しさん
08/03/12 16:04:21
>>840
まさかとは思うが、業務上のプログラムを2ちゃんで質問しながら書くなよ。
842:837
08/03/12 16:06:27
>>841
趣味グラマです。
843:デフォルトの名無しさん
08/03/12 17:21:29
Visual C++ 6.0の課題で分からないところがあるので助言お願いします。
「main関数において、返却値の値によって表示の方法を変えよ」
とあるのですが“表示の方法を変える”とはどのようなことをすれば良いのでしょうか?
返却値は1、2、3の三つです。
844:デフォルトの名無しさん
08/03/12 17:32:05
printf("%dがきたー\n", henkyakuchi)
845:デフォルトの名無しさん
08/03/12 17:33:57
変化球がきたに見えた
846:デフォルトの名無しさん
08/03/12 17:43:04
>>844
ありがとうございます
とりあえずその方向でやってみます
847:デフォルトの名無しさん
08/03/12 18:06:09
>>843
もし問題文が
「main関数において、返却値の値によって表示の方法を変えよ」
だけなら、回答はこうだ
「日本語でおk」
848:デフォルトの名無しさん
08/03/12 18:12:25
うむ、出題の意味がわからん。
そして宿題は宿題スレへ。
849:デフォルトの名無しさん
08/03/12 18:12:32
こういうことか!
switch(henkyakuchi) {
case 1: printf("きたー"); break;
case 2: puts("きたー"); break;
case 3: cout << "きたー"; break;
}
850:デフォルトの名無しさん
08/03/12 18:18:14
>>843
switch (henkyakuti) {
case 1:
printf("0"); break;
case 2:
fputs("0", stdout); break;
case 3:
putchar('0'); break;
}
851:850
08/03/12 18:18:48
ネタかぶったorz
852:デフォルトの名無しさん
08/03/12 18:35:01
>>847
まあ全文じゃないけどな
>>848
スマン、ヒントが欲しかったんだ
>>849,850
そういうことなのか?
853:デフォルトの名無しさん
08/03/12 18:40:31
全文載せないでまともなヒントあげれると思ってんの?
載せるなら宿題スレ池だが
854:デフォルトの名無しさん
08/03/12 18:45:01
>>853
お前>>843読んでないだろ
855:デフォルトの名無しさん
08/03/12 19:11:36
>>843 の文章だけでは題意が読み取れない
これが分かっただけでもいいんじゃないか?
っつーか問題の意図は出題者に聞けよ
856:デフォルトの名無しさん
08/03/12 19:24:25
>>852
問題文を他人に意味が伝わるように要約できない=テメーが問題文の意味を理解していない
857:デフォルトの名無しさん
08/03/12 22:00:24
>>856
理解できてないから質問してるんじゃないか?
858:デフォルトの名無しさん
08/03/12 22:04:09
理解できてないなら要約すべきではないわけで
>>852 みてイラっときた俺はたぶん短気なんだろう
859:デフォルトの名無しさん
08/03/12 22:04:20
まとめると、質問するなら要約するなってことだな
860:デフォルトの名無しさん
08/03/12 22:19:52
ある変数の値に応じて特定の処理をさせたいのですが、
値のパターンがかなり多い場合、
switch~case文とif~elseif文ではどっちのほうが処理が早いでしょうか
ひとつの値に対しひとつの処理なので、どちらの文を使っても同じように処理できます
(switch~caseの場合はbreakで抜けるので)
あんまり多い場合、関数の配列でも用いた方がいいのかもしれませんが……
861:デフォルトの名無しさん
08/03/12 22:23:18
試せるなら実測しろ
試せないならどっちを使っても一緒。気にするだけ無駄。
862:デフォルトの名無しさん
08/03/12 22:27:22
switch 文にはジャンプテーブル最適化というのがあってだな、
その最適化が効けば
case ラベルの位置のアドレスの表を使ってジャンプするようになる。
863:デフォルトの名無しさん
08/03/12 22:33:39
しかし分岐予測の効き方を考えるとジャンプテーブルの方が遅い場合もある
実測して比べるしかない
864:デフォルトの名無しさん
08/03/12 22:37:03
多くの場合においてある1つの条件に集中するような場合は
それだけ if して、その他を switch にするとか?
865:デフォルトの名無しさん
08/03/12 22:37:40
>>860
一般的にはswtichが効率的。
なぜならswitchはジャンプテーブルなり、各個比較なり、
コンパイラが最適なものを選択すると期待できるから。
866:デフォルトの名無しさん
08/03/12 23:13:05
>>857
問題が理解できないのなら、問題の意味を教えてくれと問うべきだし、
問題が理解できているのなら、その解決策に関して問うべきだし、
解決策があるていど目星が付いてるが、ひっかかる所があるならば、その点を問うべきだろ。
自分が理解できない問題を一部だけ示して教えろなんて、どんなバカだ。
867:デフォルトの名無しさん
08/03/12 23:14:30
処理を後々追加する羽目になる可能性があればswitchの一択でしょ。
868:デフォルトの名無しさん
08/03/12 23:23:08
顔真っ赤なやつがいるな
いいかげんその話題は終われ
869:デフォルトの名無しさん
08/03/12 23:26:07
上と似たようなどうでもいい質問なんだけど
bool z = a() && b() && c() && d() && e();
みたいな文があったとき、a()から順に、最悪e()まで調べていくと思う。(&&演算子は必ず左から調べるよね
ということは、e()が最も高確率でfalseを返す場合、e()を一番左に持って行った方が効率よくなりますよね?
あと↑が正しいとして、コードの見栄や保守を考えて順番を変えたくないって場合、どうしますか?
870:デフォルトの名無しさん
08/03/12 23:30:01
あ、でも関数だから、ショートサーキットな評価は行われないのか…
書いた後に気づいた…
871:デフォルトの名無しさん
08/03/12 23:39:01
>>868
「その話題」がどの話題かわからないけど、「顔真っ赤」とか刺激してる時点で
たぶん君も「終わらせない気満々」なんだよね。
終わらせようとしているのに同時に刺激してるなら、馬鹿丸出しだし。
872:デフォルトの名無しさん
08/03/12 23:39:13
>>870
> 関数だから
なんでそう思うんだ?
873:デフォルトの名無しさん
08/03/12 23:39:48
>>870
?
874:デフォルトの名無しさん
08/03/12 23:45:30
>>872
関数が実行されるかされないかによって、プログラムの挙動が変わることがあるから、って思った。
よく考えてみれば、 if (ptr && ptr->func()) とか書きますね・・・
875:デフォルトの名無しさん
08/03/12 23:49:23
> if (ptr && ptr->func())
これptrがNULLでも安全なの?
876:デフォルトの名無しさん
08/03/12 23:51:53
871
これでも舐めておちつけ(´・ω・`)つ〔きゃらめる〕
877:デフォルトの名無しさん
08/03/12 23:55:45
>>875
ptrがNULLなら&&を通らないから大丈夫じゃない?
878:デフォルトの名無しさん
08/03/12 23:56:26
>>875
ptrがNULLの場合でも問題ない。
でも、ptrがNULLじゃなくても変なとこ指してる可能性は忘れるな。
それだけ見て本当の意味で安全かどうかはなんともいえない。
879:デフォルトの名無しさん
08/03/12 23:57:29
&&の評価順は左からと決まっている。
880:デフォルトの名無しさん
08/03/13 00:02:46
>>869
前半部分が正しい。
効率が良くなるが順番を変えたくない場合は個人的にケースバイケース。
効率が求められる部分ならば変更かける。(実測して効果があるかも試して)
とはいえ、関数内に副作用があったり、今後そうなる可能性だってあるから
基本的に短絡評価をあてにした効率は求めないようにしている。
>>875
NULLなら短絡評価でptr->func()は評価されないため問題なし。
881:デフォルトの名無しさん
08/03/13 00:49:53
make && make installみたいなものだよな。
882:デフォルトの名無しさん
08/03/13 02:25:29
>>869
割と適当に答えるけど、通常見かける && や || は短絡評価をあてにして
cond && (cond が非ゼロの時のみ可能な処理)
や
(非ぜロの確率が低い式) && (非ゼロの確率が高い式)
あるいは
(軽い処理) && (重い処理)
または
(先に必要な副作用のある式) && (その後にのみ評価されるべき式)
等、
すでに正しい順序で記述されているので、並べ替えは不可ということが多いように思う。
もしそうでない場合はコードの質を疑っちゃうから、もしちゃんと動いているならなるべく
触らない⇒やはり並べ替えないだろうなあ。
883:デフォルトの名無しさん
08/03/13 03:13:39
#include <studio.h>
int main(void)
{
puts("ローゼン「ローザmstcを入れて」");
puts("「次に、目玉を入れて」");
puts("真紅「ぎゃあああああああ」");
puts("ローゼン「あ、順番間違えた」");
return 0;
}
コンパイル通りません><
884:デフォルトの名無しさん
08/03/13 03:21:04
>>883
そうですね。ではおやすみ。
885:デフォルトの名無しさん
08/03/13 03:39:10
>>883
studio
886:デフォルトの名無しさん
08/03/13 05:08:18
質問です。現在猫でもわかるC言語プログラミングというので勉強しているのですが、
関数の再帰呼び出しというところで
#include<stdio.h>
int main()
{
static int i = 1;
if (i <= 10) {
printf("i = %d\n", i);
i++;
main();
}
return 0;
}
というのがあり、これを実行すると
i = 1
i = 2
・・・
i = 10
になるとなっていて、試してみたところ確かにそうなるのですが、
main内でmainをもう一度呼び出した際に
static int i = 1;
の部分でなぜ再度 i に1が代入されないのでしょうか?
初心者過ぎてバカかと思われるかと思いますが
ご教授願えるとありがたいです。
887:デフォルトの名無しさん
08/03/13 05:17:07
static i = 1; //宣言かつ初期化
static i; //宣言のみ
i=1; // 代入
初期化と代入は違うのです。
下のように書き換えてみるとどうなります?
888:デフォルトの名無しさん
08/03/13 05:20:28
ごめん、書き込んですぐだけど、そんなプログラムまわすべきじゃないね。
延々回り続けちゃう。
static int i=1;
static int j;
j=1;
if(i<10){
printf("%d %d",i,j);
i++;
j++
main();
}
return 0;
}
まわすならこっち。
889:デフォルトの名無しさん
08/03/13 05:23:47
>>886
>main内でmainを
URLリンク(ml.tietew.jp)
>static int i = 1; の部分でなぜ再度
URLリンク(d.hatena.ne.jp)
890:デフォルトの名無しさん
08/03/13 05:27:30
>>885
わかった!ありがとう!
891:886
08/03/13 05:59:43
なるほど、初期化というのが代入とごっちゃになって、
ちゃんと理解できてなかったことがよく分かりました。
887さん、889さん、ありがとうございました。
892:デフォルトの名無しさん
08/03/13 16:35:10
vector型で
push_backの反対で、先頭に要素を追加するには
どのようにすればいいのでしょうか
893:デフォルトの名無しさん
08/03/13 16:37:34
できません。
listとか使ってください。
894:デフォルトの名無しさん
08/03/13 16:42:01
そうですか
残念です。すごく
これが出来れば完成なのに
895:デフォルトの名無しさん
08/03/13 16:50:34
単純な質問があります。
Mainループ
{
①の計算
whilie(永久にループ)
{
②の計算
}
}
このようなプログラムでは、①の計算をし続け、かつ②の計算をし続けてもらえると思ったのですが
①を一度計算したあとは②の実行をループします。
こういった処理をしたい場合はマルチスレッド処理?というのをしなければならないのでしょうか?
896:デフォルトの名無しさん
08/03/13 16:51:40
ジャパニーズでおk
897:デフォルトの名無しさん
08/03/13 16:52:15
>>892
vectorの先頭への挿入は効率が悪いからpush_frontは提供されていない。
どうしても必要ならinsert
898:デフォルトの名無しさん
08/03/13 16:55:00
無限ループ作ったらずっとそこで回り続けるに決まってるじゃないか。
899:デフォルトの名無しさん
08/03/13 16:57:24
>>898
ありがとうございます。やっぱりそうゆうものですよね。
900:デフォルトの名無しさん
08/03/13 17:17:11
待てよお前らwww
vectorでpush_frontを使いたいって言われて、なんでlist薦めたり、insert薦めたりなんだよwww
deque教えてやれよちゃんとww
901:デフォルトの名無しさん
08/03/13 17:34:44
それよりもっと良いのは
URLリンク(ufcpp.net)
URLリンク(www5c.biglobe.ne.jp)
のようなページを教えてあげること。
そして一番良いのは、今後同じ様な問題を自己解決出来るようにしてあげること。
「stl コンテナ」でググれ。
902:デフォルトの名無しさん
08/03/13 18:59:00
>>900
>これが出来れば完成なのに
この言葉に心奪われたんだ。
903:デフォルトの名無しさん
08/03/13 18:59:58
>>900
dequeにもvectorに劣る欠点はあるしなあ。なんともいえん。
904:デフォルトの名無しさん
08/03/13 20:04:03
初心者なんざ全部vectorで充分
905:デフォルトの名無しさん
08/03/13 20:39:41
窓の杜も忘れないであげて。
906:デフォルトの名無しさん
08/03/13 21:08:38
そういえば、去年だかの窓の社で紹介されていたいもうとデスクトップ、
どうやら動くものが出来つつあるらしいな。
907:デフォルトの名無しさん
08/03/14 01:36:10
C++ の入門書を探しています。C言語の知識はありません。
ネットで検索してみると
柴田望洋『新装版 プログラミング講義C++』(ソフトバンククリエイティブ)
塚越一雄『はじめてのC++』(技術評論社)
日経ソフトウエア編『ゼロから学ぶC/C++』(日経BP社)
あたりがC言語の知識が無い初心者にとっての
C++ の入門書らしいのですが,
この3冊の中で特にお薦めなものとその理由を教えていただけませんか?
908:デフォルトの名無しさん
08/03/14 01:42:59
すべての書籍を持ってる人なんているのかな?個人的にはどれでもいいと思う。というより、別にネットでもいいのでは?
書籍がいいというのであれば、大きめの本屋にいって立ち読みで少し目を通してわかりやすそうなのを選ぶ。
909:デフォルトの名無しさん
08/03/14 01:48:40
本気でやるなら三冊とも買えばいいと思う
出費したくないなら入門サイトでも探して勉強するのがいい
910:907
08/03/14 01:53:06
確かに,3冊とも持っている方はほぼいないでしょうね。
では,この3刷のどれかを読んで感じた長所・短所を教えていただけませんか?
911:デフォルトの名無しさん
08/03/14 02:00:34
>>910
つ スレリンク(tech板)
912:デフォルトの名無しさん
08/03/14 02:16:07
独習と林晴比古ってどうなんだろう。
913:デフォルトの名無しさん
08/03/14 03:14:18
>>912
独習は基礎知識と問題集
林はC言語で知識止まってる
914:デフォルトの名無しさん
08/03/14 08:03:07
林と柴田の本はケツを拭く紙にもならない
915:デフォルトの名無しさん
08/03/14 09:12:16
C++はロベール見ておけばよくね?
ロベールでぐぐれば一番上にくるよ
916:デフォルトの名無しさん
08/03/14 09:49:23
テンプレート周りまでカッチリやりたかったらC++Primer 4/Eにしとけ。
値段は張るがまあいい本だ。
917:デフォルトの名無しさん
08/03/14 11:43:37
循環小数のことについて知りたいのですが。
vc6.0からC#に移って久しぶりにこの問題に直面
しました。
double d;
d=1.2-1.1;
が0.0999999になりますが循環小数でない数の
0.0999999とどうやって見分けをつけたらいいのでしょうか。
0.1だけだったら分かるかも知れませんが他にも循環小数が
いっぱいあるし自動的に調べられるようにしたいです。
丸めればいいとか1000000倍して必要なときだけ/10000000
すればいいとかいろいろ意見はあるでしょうが単に見分ける方法
とか聞きたいです。
918:デフォルトの名無しさん
08/03/14 11:50:05
プログラムに循環小数は無いだろう
無限の値を保存できない
919:デフォルトの名無しさん
08/03/14 11:57:42
>>917
double d1 = 1.2 - 1.1; //d1 == 0.099999999999999867
double d2 = 0.099999999999999867;
で、
d1 != d2ということが知りたいの?
920:デフォルトの名無しさん
08/03/14 12:03:20
その手の誤差は浮動小数点の宿命。
完全に一致したり不一致したりを確認することはできないから、
その計算で出る誤差の最大を取って±誤差に収まってるものを一致するとみなしたりする。
そういう誤差が許されない処理をしたいなら整数型でなんとかするしかない。
921:デフォルトの名無しさん
08/03/14 12:36:02
>>917
一応C++で浮動小数点の比較をやりたいときは、
double a,b;//こいつらには適当な数値がはいってるとして
if (abs(a-b)<=std::numeric_limits<double>::min()) {
// a == b
}
else {
// a != b
}
おれはこんな書き方を習ったけど、これでもすべてのケースを正しく判定できるわけではないからなあ。
922:デフォルトの名無しさん
08/03/14 12:39:43
あるクラスのメンバ変数に関数へのポインタを与え、
そのクラスのメンバ関数にアクセスしたいのですが、
代入の仕方が分かりません
グローバル関数へのポインタなら問題なく出来るのですが
923:デフォルトの名無しさん
08/03/14 12:40:05
int ary[100] = {0};
int100個の配列を0で初期化したいとき、このコードは規格に沿ってますか?
手元のg++だと動くんですが、、、
924:デフォルトの名無しさん
08/03/14 12:41:29
そもそも 1.2 とか 1.1 とか 0.1 って定数が正しく 1.2 や 1.1 や 0.1 を表してるわけじゃないから、
正しく判定ったって、何がどう正しいのやら
925:デフォルトの名無しさん
08/03/14 12:42:19
>>922
メンバ関数ポインタでぐぐる
>>923
沿ってます
926:デフォルトの名無しさん
08/03/14 12:42:37
>>923
沿ってない
ary[1]~ary[99]は初期化されない
927:922
08/03/14 12:57:06
>>925
ちょっと説明不足でした
インスタンスごとにポインタに代入するメンバ関数を変えたいんですよね
main関数内で宣言・代入する方法はいくらでも見つかるんですが、
コンストラクタのようなメンバ関数内で宣言・代入する方法が分からなくて
928:デフォルトの名無しさん
08/03/14 13:03:04
こうか?
class Foo {
public:
void (Foo::*func)();
Foo(int){ func = &Foo::bar; }
Foo(bool){ func = &Foo::hoge; }
void foo(){ (this->*func)(); }
void bar(){ cout << "bar"; }
void hoge(){ cout << "hoge"; }
};
int main() {
Foo a(1);
Foo b(true);
a.foo();
b.foo();
}
929:デフォルトの名無しさん
08/03/14 13:15:08
>>923
C++なら規格に沿ってる
Cだと沿ってなかったような気がするが…
930:デフォルトの名無しさん
08/03/14 13:18:03
>>928
それです!
>void (Foo::*func)();
ここが分かっていませんでした
ありがとうございました
931:デフォルトの名無しさん
08/03/14 13:49:37
>919
そうです。
>921
確かに整数値に直すしかなさそうですね。
丸める方法も0.00001の誤差を判定するときも
0.09999の次の9を丸めて0.1にしたらえらい違い
になりそうな気がするし。
確実に循環してると分かっているなら丸めてもいいと思うけど
そうでない場合は困るね。
>921
それでも確実じゃないと言われると絶望的?
VC6.0はどうやって判断していたんだろう。
932:デフォルトの名無しさん
08/03/14 13:50:09
>>930
>main関数内で宣言・代入する方法はいくらでも見つかるんですが
これ嘘くせえな
おまえちゃんと読んでないだろ
933:デフォルトの名無しさん
08/03/14 14:08:50
>>929
Cでも沿っている。
934:デフォルトの名無しさん
08/03/14 14:17:17
しつもんです。
int hoge [][3] = {
{0,0,0},
{1,1,1},
{0,1,0},
};
のような配列で
hoge[1];
とやると
hoge[1][0]のアドレスを返して来るでよろしいでしょうか?
935:デフォルトの名無しさん
08/03/14 14:19:14
>>931
別に循環はしてないよ
これ実行してみ
int main()
{
printf("%.70f\n", 1.2);
printf("%.70f\n", 1.1);
printf("%.70f\n", 1.2 - 1.1);
}