トップページ⇒tech
1001コメント330KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/14(水) 01:00:02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0708デフォルトの名無しさん2008/06/07(土) 14:13:32
>>707
ありがとうございます、初歩的な質問ですみませんでした
0709デフォルトの名無しさん2008/06/07(土) 14:18:38
行列の乗算を演算子オーバーロードで表現したいのですが
結合規則の問題で悩んでます。

|A| = |B|*|C|*|D|の式をプログラムで表現するときに、

MATRIX matA, matB, matC, matD;

matA = matB * matC * matD;

と書いて表現させたいのですが、普通にやると
|A| = (|B|*|C|)*|D|
と認識してしまいます。
()などを使わずに
右辺を右から左の順序で乗算させる方法が何かありませんでしょうか
0710デフォルトの名無しさん2008/06/07(土) 14:26:29
同じ優先順位の二項演算子は左から順に組にすることになってるので、
結合律が成り立たない場合は括弧で括ってください。
0711デフォルトの名無しさん2008/06/07(土) 14:30:13
>>710
ありがとうございました。
それでやろうと思います。
0712デフォルトの名無しさん2008/06/07(土) 14:31:44
行列の積って結合則なかった?
(B×C)×D = B×(C×D) でしょ?
どっちでも一緒じゃん?
0713デフォルトの名無しさん2008/06/07(土) 14:33:05
>>712
結合順によって計算量が変わる可能性は高い
0714デフォルトの名無しさん2008/06/07(土) 14:55:30
>>712
行列演算で×を使うと意味が変わっちゃうよ
0715デフォルトの名無しさん2008/06/07(土) 15:14:34
直積には ⊗ を使わなかったっけ?
0716デフォルトの名無しさん2008/06/07(土) 15:28:01
行列は内積だろうが外積だろうが掛ける順番が変わっても問題ない。
ただ外積は順番によっては計算量が著しく変わる。内積はどんな順番でも行 * 列 * 項の数で一定
0717デフォルトの名無しさん2008/06/07(土) 15:50:05
計算量を考えるのであれば
そもそも行列積に operator* を使わない方がいいと思うが。
0718デフォルトの名無しさん2008/06/07(土) 15:51:07
>>716
A 100x100
B 100x100
C 10x100

(AB)C
100x100x100+100x10x100=1100000

A(BC)
100x10x100+100x10x100=200000
0719デフォルトの名無しさん2008/06/07(土) 16:00:33
行列の内積って Σij AijBij のことか?
0720デフォルトの名無しさん2008/06/07(土) 16:16:16
フロベニアス積だっけ?
0721デフォルトの名無しさん2008/06/07(土) 16:20:51
>>712
ない。
0722デフォルトの名無しさん2008/06/07(土) 16:27:47
>>719-720
それならスカラーになるから>>716の言ってるのはアダマール積のことだと思う。
0723デフォルトの名無しさん2008/06/07(土) 16:54:15
そこでシューア積ですよ
0724デフォルトの名無しさん2008/06/07(土) 17:07:16
それって内積と呼ぶんだろうか?
そして行列の外積って何を表しているんだろう?
0725デフォルトの名無しさん2008/06/07(土) 17:09:18
間違えた。
Σij AijBji のことか? と聞こうとしたんだった。
要するに tr A^T B
0726デフォルトの名無しさん2008/06/07(土) 19:08:48
外積とは、ふたつのオペランドベクトルに対して直交したベクトルを返す演算の事
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''>   ゆっくりしていってね!!!  <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ     __   _____   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__    ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´
0727デフォルトの名無しさん2008/06/07(土) 19:09:23
すみませんゆっくりAAは誤爆です無視してください
0728デフォルトの名無しさん2008/06/07(土) 19:12:52
>>724
電磁気の話だと物理的意味があるよ
0729デフォルトの名無しさん2008/06/07(土) 19:15:48
>>724
行列でouter productって言ったらテンソル積のことじゃね。
0730デフォルトの名無しさん2008/06/07(土) 19:19:10
マーチングキューブ法について質問があります。
http://www.jspf.or.jp/cd2/7505cd/75-5/sakagami/2-11.html
などのサイトに乗っている15種類の状態からでは2^8=256通りではなく254通りしか
生成できません

具体的には立方体のうち向かい会う2面のそれぞれ対角線上の格子点が垂直をなすように
ON(OFF)になっているケースの2通りの状態が含まれていません。
どこのサイトを見てもこのことに関する情報はありませんでした。

マーチングキューブ法ではこのような状態は異常として無視して描画しないのでしょうか?
しかしどこを見ても必ず「256通り」の記述があるのがどうにも・・
0731デフォルトの名無しさん2008/06/07(土) 19:24:10
外積にそんなに呼び名があるなんて知らなかった・・・
おまいら頭だけはでかいんだな
0732デフォルトの名無しさん2008/06/07(土) 19:25:29
ソースも貼らずに質問とな?
0733デフォルトの名無しさん2008/06/07(土) 19:28:26
>>730
14通りのうち表の左上が0。
そしてトポロジーにより0の状態が2つある。
よって2^256 - 2 = 254
0734デフォルトの名無しさん2008/06/07(土) 19:34:22
次の式を使って自然対数の底の値を求めよ
1+Σ(1/i!) (1〜10まで)

やってみたのですが分かりません。
何がおかしいでしょうか?
#include <stdio.h>


main(){
int i,fact;
double j,e;

fact=1;
i=1;

while(i<=10){
fact=fact*i;
j=1/fact;
i=i+1;

}
e=1+j;



printf("e=%lf\n",e);
}
0735デフォルトの名無しさん2008/06/07(土) 19:36:10
j=1.0/fact;
0736デフォルトの名無しさん2008/06/07(土) 19:36:13
>>734
とりあえず
1/fact;
これの結果は切り捨てになるぞ?
0.いくつとかにはならずに
0737デフォルトの名無しさん2008/06/07(土) 19:37:14
#include <stdio.h>


main(){
int i,fact;
double j = 0.0,e;
fact=1;
i=1;
while(i<=10){
fact=fact*i;
j+=1.0/fact;
i=i+1;
}
e=1+j;
printf("e=%lf\n",e);
}
0738デフォルトの名無しさん2008/06/07(土) 19:38:48
すいません参考にしていたサイトが間違っていたことに今気が付きました
13番目の状態が>>730で欠落している2箇所にあたります

ポリゴンは正しいけど黒丸の表示位置がそれとずれていました
0739デフォルトの名無しさん2008/06/07(土) 19:46:36
>>735
doubleで定義すると1.0としないとだめなんですか?

>>736
なぜですか?

>>737
なぜそういう風にしないといけないのか教えてもらいたいのですが・・・
0740デフォルトの名無しさん2008/06/07(土) 19:50:15
doubleでぐぐれ
0741デフォルトの名無しさん2008/06/07(土) 19:53:34
>>739
整数同士の演算結果は整数だから、そんでその結果をdoubleにして代入だから
暗黙の型変換とかでぐぐれ
0742デフォルトの名無しさん2008/06/07(土) 20:04:23
>>740
>>741
ありがとう
0743デフォルトの名無しさん2008/06/07(土) 21:25:22
>>740
doubleだけだとちょっと辛いだろw
0744デフォルトの名無しさん2008/06/07(土) 21:27:38
そこから学べばOK
0745デフォルトの名無しさん2008/06/07(土) 21:30:34
いっそgnu mp使っちゃおうぜ!!
0746デフォルトの名無しさん2008/06/08(日) 09:04:59
[1]プログラミング
[2]問題文
三つの整数値を読み込んで、それらの値が全て等しければ、「三つの値は等しいです。」と、どれか二つの値が等しければ、「二つの値が等しいです。」と、そうでなければ、「三つの値は異なります。」と表示するプログラムを作る。
[3-1]windows
[3-2]gcc
[3-3]C言語
[4]明後日まで。
[5]if文を使って下さい。お願いいたします。

0747デフォルトの名無しさん2008/06/08(日) 09:07:45
>>746
スレ違いです

こちらへどうぞw
http://pc11.2ch.net/test/read.cgi/tech/1211980711/944
0748デフォルトの名無しさん2008/06/08(日) 09:19:33
あまりの最適化された回答に理解できなかったらしいな。w
0749デフォルトの名無しさん2008/06/08(日) 10:20:13
>>746-747
[5]が増えてるw
0750デフォルトの名無しさん2008/06/08(日) 12:18:02
ひまわりすら挫折した初心者です
ttp://moyashi.air-nifty.com/hitori/2006/09/gsplayer225_0036.html
を読んでGSPlayerをビルドしようとしたんですが上手くいきません
そこに書いてあるようにVisual C++ 4.0などを入れてファイルを開いたら固まるので
Visual C++ 2005 Express EditionとPlatform SDKを入れてみたんですが上手くいきません
他に何かインストールしなきゃダメな物があるんでしょうか?
0751デフォルトの名無しさん2008/06/08(日) 12:21:51
書き忘れました
目的はWin32版のビルドです
0752デフォルトの名無しさん2008/06/08(日) 12:39:54
VC++ 4.0 じゃなくて eVC++ 4.0 のようだけど
0753デフォルトの名無しさん2008/06/08(日) 12:40:10
>>750
上手くいきません、だけじゃ回答の仕様が無い。
何をやって、どういう状況になったか明確に説明せずに、回答者側にそれを想像することを求めている?

そもそも、そのブログに
>eVC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストールすればOK。
と書いてあるのに、勝手にVC++2005を使って上手くいかないと言われても。
VC++2005の他に何かインストールしなければいけないのではなく、上記のものを正しくインストールすべき。

>Visual C++ 4.0などを入れてファイルを開いたら固まるので
これについてはどこか他スレで。
0754デフォルトの名無しさん2008/06/08(日) 12:43:34
その他のプラットフォームについて

自分では試せないので、上記を参考に試してみてください。
現在GSPlayer2は「Windows Mobile 2005」にも対応してます。この場合は、「Visual Studio 2005 Standard Edition」でビルドするんですかね。
相応のSDKも必要になるでしょう。

ただ、上記の手順で作ったバイナリは、H/PC系を除き、各種WMで動くと思います。


をやろうとしたんだと思う。多分。
07557502008/06/08(日) 13:02:52
>>753
>VC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストール
はやったのですが固まってしまうので下の方に書いてあるVisual Studio 2005 Standard Editionを入れました。
libmad.vcwを開くとあるのですが見つからないので、libmad.dspをダブルクリックで開くと
「Visual C++ プロジェクト形式に変換されなければなりません」と出たので変換して開いてソリューションのビルドをすると1 失敗となってしまいます

>>754
それをやろうとしたんですが上手くいきませんでした
>相応のSDKも必要
とあるので何かインストールしなければならない物があるのかと思ったのですが見当違いでしょうか
0756デフォルトの名無しさん2008/06/08(日) 13:19:11
初心者は何故、初期状態で動かす努力をしないのだろう。
勝手に、インクルードのパス変えてみたりフォルダの構造変えてみたり・・・
聴いてみれば、あれがなかったからかえてみた。とか、パスを通すの面倒だからコピーしたとか・・・・

どんな経験者でも、他人が作ったプロジェクトのどこにノウハウが隠れているか分からないものを変更するのは細心の注意が必要なのにな。
0757デフォルトの名無しさん2008/06/08(日) 13:37:33
>>755
>ソリューションのビルドをすると1 失敗となってしまいます
ビルドエラー時にもっと詳細なメッセージが出ているはずだけど、それについて調べる努力はした?
自分にとって意味不明なメッセージはスルー?
>>753も書いているけど、失敗というだけでなくもっと詳細な情報を出さなければ回答してもらえないよ。
たぶんこのスレで聞く様な問題ではなく、visual stdioとかそっち系を探すべきだとは思うけど。
07587502008/06/08(日) 13:54:49
>>757
すみません
エラーが多いので環境自体が整ってないのかと思っていました。
長いのでttp://uproda.2ch-library.com/src/lib030582.txt
スレ違いのようでしたら移ります。
0759デフォルトの名無しさん2008/06/08(日) 14:13:53
☆2005はやめて2008入れようね☆
0760デフォルトの名無しさん2008/06/08(日) 14:18:09
>>758 をまとめてみた

d:\gsplayer\libmad\libmad.c(2) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
0761デフォルトの名無しさん2008/06/08(日) 15:42:11
char a[] ="str";
++a; /* lvalue required as increment operand */

printf("%p", &a);でアドレスは取れるのにもかかわらず、このaは左辺値じゃないんですか?
0762デフォルトの名無しさん2008/06/08(日) 15:43:04
配列型ってインクリメントしていいのか?
0763デフォルトの名無しさん2008/06/08(日) 15:49:24
>>761
lvalueでもmodifiableなものとそうでないものがある。
その例のほかに、たとえばconst修飾されたlvalueはmodifiableでない。
07647612008/06/08(日) 16:00:36
>>762
代入が不可能である時点でインクリメントが出来ないんだろうなという気はするんですが、
>lvalue required as increment operand
というような表現なんで不思議に思ったのですよ

>>763
じゃあこのエラーメッセージは罠で、
aが変更不可能な変数であることがポイントって事なんでしょうか?
0765デフォルトの名無しさん2008/06/08(日) 16:06:37
>>761
char a[] は、
char* const a だと思っておけ。
0766デフォルトの名無しさん2008/06/08(日) 16:14:06
ISO/IEC 14882 5.19-4
The pointer shall be created explicitly, using the unary & operator, or
implicitly using a non-type template parameter of pointer type, or using
an expression of array (4.2) or function (4.3) type.

このルールで右辺値じゃないけど&でポインタをとれる
0767デフォルトの名無しさん2008/06/08(日) 16:15:13
>>764
そもそもa[0]などがlvalueであって、a自体はlvalueではないだろ。
&演算子が使えるかどうかはlvalueであることとは無関係では?
0768デフォルトの名無しさん2008/06/08(日) 16:18:32
aは変更可能な左辺値って奴だろう
0769デフォルトの名無しさん2008/06/08(日) 16:18:44
>>761
lvalue の解釈を「アドレスが取れるもの」とせずに、素直に「代入式の左辺に置けるもの」と
考えておけば何も問題ないエラーメッセージじゃないか?
07707682008/06/08(日) 16:19:34
すまん逆だ
modifiableでないlvalueだ
0771デフォルトの名無しさん2008/06/08(日) 16:25:07
関数だって左辺値だしな。確か。
左辺値なら何でも代入可能とは限らない。
0772デフォルトの名無しさん2008/06/08(日) 17:58:07
#include <iostream>
#include <bitset>
#include <boost/lambda/lambda.hpp>
#include <boost/cstdint.hpp>
int main() {
double d=1.0;
std::bitset<64> b(*((boost::int64_t *) &d));
namespace bl=boost::lambda;
for (int i=0; i < b.size(); ++i)
std::cout << b[i];
}

doubleのビット表現をbitsetにぶちこむ為に一時変数使ってポインタのキャストしてるんですが
こういう面倒臭いことせずに
std::bitset<64> b( foo(1.0) );
みたいに一発でできる方法ってないですかね?
0773デフォルトの名無しさん2008/06/08(日) 18:16:38
std::bitsetって確かstd::stringを引数に持つコンストラクタあったろ。

std::string("0110110101")みたいな
0774デフォルトの名無しさん2008/06/08(日) 18:48:03
>>772
一時変数を使うほうが分かりやすいと思うぞ。
reinterpret_cast<boost::uint64_t const&>(static_cast<double const&>(1.0))
そもそも標準のbitsetでは、コンストラクタが
773も言っているstringを取るやつと、unsigned longを取るやつ、
あとコピーコンストラクタしかないからうまくいかなくても知らないぞ。
0775デフォルトの名無しさん2008/06/08(日) 19:00:00
>>772
double型を引数としてビット表現を文字列表記したstd::string型を返す関数fooを用意すれば
>std::bitset<64> b( foo(1.0) );
という風にかけるんじゃない?

以下は適当に書いてみた。テストもコンパイルもしてない。

template<typename T>
std::string foo(T d)
{
char buf[sizeof(T)];
for (int i= 0 ; i < sizeof(T) ; i++)
{
buf[i] = *(reinterpret_cast<char*>(&d))[i/8] & (0x80 >> i%8);
}
return std::string(buf);
}
0776デフォルトの名無しさん2008/06/08(日) 19:00:53
× *(reinterpret_cast<char*>(&d))
○ (reinterpret_cast<char*>(&d))
0777デフォルトの名無しさん2008/06/08(日) 20:13:53
めちゃくちゃだけど雰囲気は伝わった。
0778デフォルトの名無しさん2008/06/08(日) 20:16:04
そういやoperatorによるキャストって、C++のキャスト演算子でも使えるの?static_castあたりか
0779デフォルトの名無しさん2008/06/08(日) 20:30:49
当然使える
0780デフォルトの名無しさん2008/06/08(日) 21:35:47
しかもif()はboolを引数に取る関数です。
0781デフォルトの名無しさん2008/06/08(日) 23:46:00
じゃぁifのオーバーライドって可能なのか?
0782デフォルトの名無しさん2008/06/08(日) 23:47:52
関数じゃねえよw
0783デフォルトの名無しさん2008/06/08(日) 23:50:17
俺、catchをオーバーライドしてくるわw
0784デフォルトの名無しさん2008/06/08(日) 23:51:52
さあ while をオーバーロードする作業に戻るんだ
0785デフォルトの名無しさん2008/06/09(月) 00:02:36
部長それは昨日やりました
0786デフォルトの名無しさん2008/06/09(月) 00:10:19
#define while myfunction
0787デフォルトの名無しさん2008/06/09(月) 00:18:27
#define wife my_fiction
0788デフォルトの名無しさん2008/06/09(月) 00:19:08
#define nagato my_wife
0789デフォルトの名無しさん2008/06/09(月) 00:19:54
#error
0790デフォルトの名無しさん2008/06/09(月) 00:32:22
#ifdef nagato
#undef nagato
#endif
0791デフォルトの名無しさん2008/06/09(月) 00:56:19
return -1;
0792デフォルトの名無しさん2008/06/09(月) 01:13:11
#define private public
0793デフォルトの名無しさん2008/06/09(月) 01:14:50
なんかキモいスレが続いてるな
0794デフォルトの名無しさん2008/06/09(月) 01:42:57
明日は日曜日だからな
0795デフォルトの名無しさん2008/06/09(月) 23:34:24
すいません、質問なんですが
構造体の配列をユーザ関数で作って
それをメイン関数に返したいのですが可能ですか?
0796デフォルトの名無しさん2008/06/09(月) 23:35:40
>>795
staticな変数なら返してもおk
0797デフォルトの名無しさん2008/06/09(月) 23:36:25
配列のインスタンスを返すというのなら無理
0798デフォルトの名無しさん2008/06/09(月) 23:43:18
template<typename T, unsigned int L> struct array_wrapper{
 T data[L];
};

array_wrapper<int, 10> function(){
 array_wrapper<int, 10> result_value;
 /* ... */
 return result_value;
}
0799デフォルトの名無しさん2008/06/09(月) 23:45:29
関数の中で構造体はmalloc関数で確保してるんですけど、
どうすればメイン関数で使えるか分からないんです

返却値を構造体の配列の0番目の要素のアドレスにして、
メイン関数で使おうとしたら、0番目の要素以外には処理に使えなくて…
どうすれば、メイン関数ですべての構造体の配列が使えるようになりますか?
08007952008/06/09(月) 23:47:39
今頃ですいません
使ってるのはCです
0801デフォルトの名無しさん2008/06/09(月) 23:47:57
>メイン関数で使おうとしたら、0番目の要素以外には処理に使えなくて…
使えるよ。

どう使えないの?
0802デフォルトの名無しさん2008/06/09(月) 23:48:50
ヒント:a[n] == *(a + n)
0803デフォルトの名無しさん2008/06/09(月) 23:56:01
なんか、宿題が増えてないか?
0804デフォルトの名無しさん2008/06/09(月) 23:57:19
宿題とな?
08057952008/06/09(月) 23:57:59
for(i = 0; i < n; i++){
printf("%d n",a[i]->num);
}
見たいな処理を関数内とメイン関数内ですると
構造体を作った関数内では表示できるんですけど
メインでは0番目の要素を処理した後に処理が止まります
0806デフォルトの名無しさん2008/06/09(月) 23:58:57
a[i]はポインタじゃないから普通にドット演算子a[i].numでいい
0807デフォルトの名無しさん2008/06/10(火) 00:18:56
そりゃあC++でいいなら、配列をクラスに隠蔽させるだろw
■ このスレッドは過去ログ倉庫に格納されています