【初心者歓迎】C/C++室 Ver.50【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.50【環境依存OK】 - 暇つぶし2ch809:デフォルトの名無しさん
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);
}

936:デフォルトの名無しさん
08/03/14 14:24:19
>>931
どうやって判別しているのかは、仮数部と指数部が完全一致だろう

937:デフォルトの名無しさん
08/03/14 14:28:56
>>934
うん。
int a[3];でa==&a[0]なのと一緒だからね。

938:デフォルトの名無しさん
08/03/14 14:29:38
扱う数によってどの位の誤差ならいっちしていると見なすか各自で判定すればいい
100億と100億1くらいならば同一と見なすとか・・ 0.0001なら1の誤差は大きい

GOSA = 0.999と定義して、x = yであることを
x*GOSA < y < x/GOSA としたらどうか?

939:デフォルトの名無しさん
08/03/14 14:33:04
計算量を減らすなら 0.999 < x/y < 1.001 の判定にすれば良いか

940:デフォルトの名無しさん
08/03/14 14:49:12
>935
すいません。VC6.0からC#間がないので、
stdio.hをインクルードする方法(できるの?)が分かりません。
代わりに次のようにしてみたら・・・、

static void Main(string[] args)
{
Console.WriteLine(1.2 - 1.1);
}

0.0999999999999999

となりました。




941:デフォルトの名無しさん
08/03/14 14:51:41
>939
なるほど。参考にしてみます。


942:デフォルトの名無しさん
08/03/14 15:01:04
初めに|x - y| < 1 などを調べておくと高速化できるな

943:デフォルトの名無しさん
08/03/14 15:03:12
仮数部、指数部を直接調べていけばより高速化出来るな
指数部が2以上ずれていれば駄目だろう

944:デフォルトの名無しさん
08/03/14 15:29:33
>>940
C#ならdecimal型を使えば解決
static void Main(string[] args)
{
decimal d = 1.2m - 1.1m;
Console.WriteLine(d);
}

945:デフォルトの名無しさん
08/03/14 15:35:36
初心者スレで >>926 みたいな嘘付くのは良くないよね・・・

946:デフォルトの名無しさん
08/03/14 16:00:02
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
cout << rand() << endl;
cout << rand() << endl;
}
このようにプログラムをコンパイルし実行してみると何度やっても
0
1481765933
となります。乱数当てプログラムみたなのも全部0が生成されてしまいます。
コンパイラはcygwinのg++です。なぜなんでしょうか???

947:デフォルトの名無しさん
08/03/14 16:04:10
>>946
しょせん擬似乱数だから
srandで異なるシード値を与えれば変わる

948:デフォルトの名無しさん
08/03/14 16:36:37
class X {
public:
const int tbl[2];
};

非staticでconstの配列をメンバーに持たせることは可能ですか?


949:デフォルトの名無しさん
08/03/14 16:44:49
>>948
こう?

class X { 
public: 
const int tbl[2]; 
};
int main() {
X x = {{96,43}};
cout<<x.tbl[0]<<x.tbl[1]<<endl;
}

950:デフォルトの名無しさん
08/03/14 16:54:23
>943
ここまでしないとだめ?
確かにそれだと指数部を見ただけで二つの値が違うかどうか
分かりそうだけど。


951:デフォルトの名無しさん
08/03/14 17:00:01
>944
いいですね。しかし128ビットも使うのは少し嫌ですね。
unsigned short decimal とか使いたい^^

952:デフォルトの名無しさん
08/03/14 17:05:54
>>946
ちゃんとsrandにガンダムシードを与えないと。

953:デフォルトの名無しさん
08/03/14 17:24:35
>>949
説明不足でした。
コンストラクタで初期化できるかどうかです。

もう少し込み入ったクラス
class X {
public:
int mi;
virtual void mf();
double md;
private:
const int tbl[2];
};


954:デフォルトの名無しさん
08/03/14 17:28:42
>>953
むり

955:バラ
08/03/14 17:31:15
c言語で

”山田太郎”は0008バイトあります。

とmystrlenを使ってと表示させたいのですが
やり方教えてください。
お願いします。

956:デフォルトの名無しさん
08/03/14 17:34:16
#define mystrlen strlen

957:デフォルトの名無しさん
08/03/14 17:47:22
>>954
thx 規格でもそうなってる?

958:バラ
08/03/14 17:48:53
956
mystrlen関数だけをを使いたいのですが。
strlenは使用禁止だそうせす。
詳しく教えてください。

959:デフォルトの名無しさん
08/03/14 17:53:04
宿題スレ行け

960:デフォルトの名無しさん
08/03/14 17:53:19
> strlenは使用禁止
仕方がないな。
int mystrlen(const char*p){
    return strchr(p,0) - p;
}


961:デフォルトの名無しさん
08/03/14 17:55:00
素直にdecimal型を使うことにします。
皆さま、いろいろとありがとうございました。


962:バラ
08/03/14 17:57:35
ほ~^^。
ありがとうございます。


963:デフォルトの名無しさん
08/03/14 18:26:55
まず間違いなく先生にツっこまれるな

964:デフォルトの名無しさん
08/03/14 18:42:37
じゃあこれでどうだ?
int mystrlen(const char *str) {
 char buff[512];
 return sprintf(buff, "%.500s", str);
}

965:デフォルトの名無しさん
08/03/14 18:43:43
void mystrlen()
{
printf("\"山田太郎\"は0008バイトあります。");
}

一応質問文からだとこれでもあながち間違いじゃない

966:バラ
08/03/14 19:20:51
#include <stdio.h>
#include <stdlib.h>

#define STRING "山田太郎"

int mystrlen(char *p)
{
/*i初期化*/
int i = 0;
/*\0ならば抜ける*/
while(*p != '\0')
{
/*pを増やす*/
p++;
/*iを増やす*/
i++;
}
/*iを返す*/
return i;
}
int main()
{
/*バイトを表示*/
printf("%s は %04d バイトです.\n", STRING, mystrlen(STRING));
/*0を返す*/
return 0;
}

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

967:デフォルトの名無しさん
08/03/14 19:22:29
圧倒的なひらめき
っ BCD

968:デフォルトの名無しさん
08/03/14 19:31:19
「先生に車輪の再発明は不毛です。」と告げるのじゃ。

969:デフォルトの名無しさん
08/03/14 19:34:10
車輪の再発名は勉強にはいいのじゃ。

970:パラ
08/03/14 19:38:27
何をどうやっても山田太郎が12バイトになってしまいます…
どうやったら8バイトにすることでができるんでしょうか…

971:教えてください><
08/03/14 19:39:08
関数ってなんですか?

972:デフォルトの名無しさん
08/03/14 19:39:31
UTF-8 なら 12 バイトだから正常だと思うぜ。

973:デフォルトの名無しさん
08/03/14 19:40:07
>>971
中学校からやり直してください

974:教えてください><
08/03/14 19:46:37
この歳では中学校に通う暇がないんです><
c++における関数の定義が知りたいんです><

975:デフォルトの名無しさん
08/03/14 19:49:48
その歳なら本買え。

976:教えてください><
08/03/14 19:51:32
本を買いに行ってる時間が無いんです><
今教えていただけませんか?><

977:デフォルトの名無しさん
08/03/14 19:52:30
ならググれ。
C++ の入門サイトがあるだろう。

978:デフォルトの名無しさん
08/03/14 19:53:14
googleで検索したほうが時間の節約になる

979:デフォルトの名無しさん
08/03/14 19:55:35
問題解決能力がないとこの先生きのこれないしな。

980:教えてください><
08/03/14 19:56:18
なんで皆さんそんなに冷たいんですか?><
分かる人から分かりやすく聞いた方が理解しやすいと思って書き込んだのに!><
何のための掲示板ですか?!><

981:デフォルトの名無しさん
08/03/14 19:58:08
お前のためを思ってるからこう言ってるんだ。
こんな質問するなんて、お前のこの先が凄く心配だからな。

982:教えてください><
08/03/14 20:01:41
分かりました。さてはあなたたちも説明できないのですね><
説明してくれる人が現れるのを待つことにします。
このスレッドが1000行くまで待ちます><

983:デフォルトの名無しさん
08/03/14 20:03:21
f(6)=2

fが関数。中の構造は何でもいい。

984:教えてください><
08/03/14 20:04:17
ラーメンうめえwwwwwww

985:デフォルトの名無しさん
08/03/14 20:04:40
>>976
ほれ
URLリンク(ja.wikipedia.org)

986:教えてください><
08/03/14 20:05:08
誤爆しました><

987:デフォルトの名無しさん
08/03/14 20:06:10
これはひどい

988:教えてください><
08/03/14 20:08:50
985さん
つまりc++の関数とはサブルーチン機能のことなんですね!><
ありがとうございました><
ラーメンおいしいです

989:デフォルトの名無しさん
08/03/14 20:39:56
スレ違いかもしれんが自転車こいで電力ためるのってどういう装置がいるんだ?

990:デフォルトの名無しさん
08/03/14 20:40:57
蓄電池だろ

991:デフォルトの名無しさん
08/03/14 20:48:48
重りを上に上げて、位置エネルギーから電気を取り出す機械ってのもあったな
スレチだが

992:デフォルトの名無しさん
08/03/14 20:58:50
揚水発電もその一種だな

993:デフォルトの名無しさん
08/03/14 21:01:17
今更だけど本屋行く時間はないのに誰かが答えを書くのを待つ時間はあるんだな。

994:デフォルトの名無しさん
08/03/14 21:02:45
建てた。
【初心者歓迎】C/C++室 Ver.51【環境依存OK】
スレリンク(tech板)l50

995:デフォルトの名無しさん
08/03/14 21:08:15
>>994


>>989 発電機もいる
コイル+磁石 で電磁誘導がどうたら
発生する電流は交流だから整流してこうたら
蓄電池に充電する際には一定以上の電圧(蓄電池による)が必要になるからうんたら
で、スレチというより板違い

996:デフォルトの名無しさん
08/03/14 21:16:01
どう考えてもスレチなのに答えてくれるお前らに感動した

997:デフォルトの名無しさん
08/03/14 21:29:31
こんなんでましたけど~
無かった事にしておこうか…

【初心者歓迎】C/C++室 Ver.50【環境依存OK】
スレリンク(tech板)

実はこのスレよりも古いようだ
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
スレリンク(tech板)

998:デフォルトの名無しさん
08/03/14 21:29:38
>>994


999:デフォルトの名無しさん
08/03/14 21:41:19
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
スレリンク(tech板)

こっちまだ残ってるけど使わないの?

1000:デフォルトの名無しさん
08/03/14 21:54:54
1000 なら

【初心者歓迎】C/C++室 Ver.50【環境依存OK】
スレリンク(tech板)

は超高速質疑応答で消費される

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


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