スレを勃てるまでもな ..
[2ch|▼Menu]
596:デフォルトの名無しさん
07/10/27 23:21:37
理由のところ、教えてくれませんか

なんで()つけないとダメなのか。
というか中身にアクセスするときは()つけた方がいいんでしょうか

597:デフォルトの名無しさん
07/10/27 23:28:44
>>596
演算子の優先度

598:デフォルトの名無しさん
07/10/28 04:23:38
*po++ は *(po++) という意味だから、だな

599:デフォルトの名無しさん
07/10/28 04:48:37
俺は演算子の優先度の表を暗記するだけの頭脳がないので、
決して、
*po++ ;
なんてコードは書かない。
他人が書いたのを読まないといけないときは、優先度の表を見て確認する。

そもそも、後ろに++を付けるのは特別なときだけだし・・・。

600:デフォルトの名無しさん
07/10/28 13:39:19
*++p

601:デフォルトの名無しさん
07/10/28 13:40:46
++(*po);

602:デフォルトの名無しさん
07/10/28 20:56:27
>>601
括弧イラネ

603:デフォルトの名無しさん
07/10/28 21:02:43
優先順位覚えてないから付けといて

604:デフォルトの名無しさん
07/10/28 21:33:35
左側に単項演算子二つで優先順位も糞もないだろ

605:デフォルトの名無しさん
07/10/28 21:52:24
むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける

606:デフォルトの名無しさん
07/10/28 21:55:25
>>605
それって何て逆ポーランド記法?

607:デフォルトの名無しさん
07/10/28 23:15:58
★改行が多すぎと言われたので、何度かにわけます。

構造体Sのvectorがあって、SのメンバdoubleDataに関してfindをしようとしています。
(#include <algorithm>しています)

struct S{
string strA;
int intData;
double doubleData;
};

findを使っているところは、こんな感じです。
vector<S>::iterator it;
it = find(VecTest.begin(), VecTest.end(), 1.7);
cout << (*it).doubleData << endl;


608:デフォルトの名無しさん
07/10/28 23:16:34
★続き

Boland55で、以下のようなエラーが出ます。

エラー E2094 c:\Borland\Bcc55\include\algorith.cc 72: != 演算子が使われたがクラ
ス S では double 型のための定義が存在しない(関数 find<S *,double>(S *,S *,const
double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'last' は一度も使
用されない(関数 find<S *,double>(S *,S *,const double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'value' は一度も
使用されない(関数 find<S *,double>(S *,S *,const double &) )
*** 1 errors in Compile ***


609:デフォルトの名無しさん
07/10/28 23:17:24
★続き

ちなみに、以下のような演算子オーバーロードをしているのですが、
何がよくないのでしょうか。
bool operator == ( const S& left, const S& right )
{
return left.doubleData == right.doubleData;
}

bool operator != ( const S& left, const S& right )
{
return left.doubleData != right.doubleData;
}



610:デフォルトの名無しさん
07/10/28 23:32:46
find には 1.7 じゃなくて S を渡さんといかんのでは?

611:デフォルトの名無しさん
07/10/28 23:34:03
struct has_double
{
bool operator()(const S& s, double d) const
{
return s.doubleData == d;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double(1.7));

612:デフォルトの名無しさん
07/10/28 23:36:44
まちがった

struct has_double
{
double d;

has_double(double d)
:d(d)
{}

bool operator()(const S& s) const
{
return s.doubleData == d;
}
};


613:デフォルトの名無しさん
07/10/28 23:44:17
>> 612さん

コンパイル、通りました!すごい!!
でも全く解読できましぇん。
一語一句の意味をこれから勉強します。。。


614:デフォルトの名無しさん
07/10/28 23:55:56
>>612
テンプレート使って、

template<double value>
struct has_double
{
bool operator()(const S& s) const
{
return s.doubleData == value;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double<1.7>);

ってのではダメ?

615:デフォルトの名無しさん
07/10/29 00:00:45
はは
定数だからね

616:デフォルトの名無しさん
07/10/29 00:13:48
もっと簡潔・明瞭に書く方法ないのかなぁ。


617:デフォルトの名無しさん
07/10/29 09:53:08
C++勉強しはじめてリファレンスを知って、
ポインタ使うよりずっといいじゃないですかって気分なんですが、
関数の引数としてリファレンス使うときに、

void hoge(int* out1, int* out2); //out2の出力が必要ない場合はout2としてNULLを渡す

のような仕様はリファレンスでは実現できないってことなんでしょうか?
毎回ダミー変数宣言して渡すのも馬鹿らしいし。

618:デフォルトの名無しさん
07/10/29 12:44:05
>>617
どうしてもやりたかったらこういう手はどうだろう。
--
int dummyOut;

void hoge(int & out1, int & out2 = dummyOut)
{
if (& out2 != & dummyOut) {
out2 = someOutput;
}
}
--
ダミーは必要だけど、毎回じゃないし使わないときは出力処理を回避することもできる。

619:かぜひいてます←寝てろ
07/10/29 13:39:10
>>617
ダミー変数を渡すのがバカらしいのなら、ポインタ渡しのままでいいのでは?

参照は、結局ポインタ渡ししてるだけだから、組み込み型を渡すときはあまりメリットがない。
しかも、ポインタ渡しでも上手に組めば代入するのは1、2ヶ所だから読みにくくも無い。

俺のスタイルとしては、値を返すときは参照型ではなくポインタ渡し。

参照型が活きるのはクラス等を渡すとき。
void hoge(vector<char>& ref_v);
void hoge(const vector<char>& ref_v);

メンバアクセス演算子( . -> )がオーバーライドされてる場合でも深く考えなくともよい。


620:619
07/10/29 13:44:56
>>618
それも一応考えてみた。他にもオーバロードって手もあるよね。

621:デフォルトの名無しさん
07/10/29 14:30:48
int val = 100;
val = val++;
int result = val;

このとき、result はいくつになりますか?
また、処理系に依存せず、同じ値になりますか?

622:デフォルトの名無しさん
07/10/29 14:44:58
>>621
URLリンク(www.kouno.jp)

623:デフォルトの名無しさん
07/10/29 14:47:49
>>622
おぉ。ファック。
なんてこった。
ありがとう。

624:デフォルトの名無しさん
07/10/29 14:57:30
ファックしてもいい?

625:デフォルトの名無しさん
07/10/30 00:59:37
>>572
超遅レスで申し訳ない。

VB自体は糞というわけではないのか。。

もし、また改めて勉強するとするならば、VisualC++とVisualC#はどちらがお勧めですか?
もちろんどんな物を作るか、目的は何か、ってのが決まっててこそ選ぶのかもしれないけど、
もし、将来性等考えたらどっちになります??


626:デフォルトの名無しさん
07/10/30 01:01:04
VisualC#

627:625
07/10/30 01:06:12
検索したらいっぱい出てきたんでとりあえず色々眺めて決めます。


・・とおもったらレスがついてた。
>626
なぜですか?よかったら教えてほしいです。

628:デフォルトの名無しさん
07/10/30 01:26:32
自動車に例えるなら、

C# → トヨタ自動車本社の設計技術者
C++ → トヨタに部品を収めている協力会社の設計技術者

そういう感じ。

629:デフォルトの名無しさん
07/10/30 01:41:21
…え。

630:デフォルトの名無しさん
07/10/30 06:09:37
C# → Windowsユーザー
C++ → マイクロソフト

631:デフォルトの名無しさん
07/10/30 10:29:36
>>628
確かに C++ の方がスキルが必要だから間違ってないね。

632:デフォルトの名無しさん
07/10/30 10:36:13
.NET Frameworkって「のり」があるからC#, C++, F#とどれも使えるのが一番だね
状況に応じてシームレスに言語を選択できる開発環境ってのはかなり美味しいだろう
さらにPowerShellスクリプトも使えば窓も*nix系に匹敵するかなり強力な環境になると思う

633:デフォルトの名無しさん
07/10/30 12:24:06
んじゃ、
C→町工場の工員
こんなかんじか?

634:デフォルトの名無しさん
07/10/30 13:09:12
C→拡張しすぎてわけがわからなくなった、おじいちゃん技術者


635:デフォルトの名無しさん
07/10/30 15:43:19
質問させてくださいー・・・。

Visualstudio2005のC++でCのソースをコンパイルしているんですけど、
off_t strip_offset, data_offset, curve_offset;
off_t thumb_offset, meta_offset, profile_offset;
の2行で構文エラーって出るんです。

error C2061: 構文エラー : 識別子 'strip_offset'
error C2061: 構文エラー : 識別子 'thumb_offset'

ココだけ見てもわかんねーよって感じでしょうか・・・。
なんとなく原因が雰囲気でも分かれば教えてください。


636:デフォルトの名無しさん
07/10/30 15:47:08
>>635
off_tのtypedefを探して貼れ

637:635
07/10/30 16:11:04
レスありがとうございます。

typedef、存在しないみたいです。
設定しなきゃ駄目ですか?

638:デフォルトの名無しさん
07/10/30 16:14:16
typedefが存在しないわけがなかろう。
off_tは予約語じゃないぞ。

639:デフォルトの名無しさん
07/10/30 16:16:33
それか、struct off_t strip_offsetとして使うべきものかも。

640:635
07/10/30 16:21:06
>638
off_t、ココにしか出てこない上にtypedefってのも無いんです。
元々Linux用(?)に書かれたソースらしいんですけど、そっちではちゃんと動いているみたいなんですけど・・・。
すみません、いまいちよく分かってなくて。とにかくtypedefしなきゃ駄目って事でしょうか。

>639
struct off_t strip_offsetみたいにしてみたんですけど、、エラーが出ちゃいますね・・・。
「error C2079: 'strip_offset' が 未定義の struct 'off_t' で使用しています。」
だそうです。

641:デフォルトの名無しさん
07/10/30 16:26:44
>>640
じゃあそのソースがインクルードしているソースやヘッダを
全部調べてoff_tの定義を調べるべきだな。

642:デフォルトの名無しさん
07/10/30 16:28:04
もしかしたらtypedefではなく#defineかもしれない。

643:635
07/10/30 16:33:32
>614
インクルードされているファイルって言うと#include <winsock2.h>みたいなやつですよね?
全部調べていくのはちょっと自分には難しいかもしれません。

そっちに原因があるということだったら、コンパイラを変えてみると何とかなるかも、ですか?
MinGWとかでコンパイルできるか試してみます!

>642
#defineもありませんでした。>635に書いた2行以外のどこにも出てこないんです。


644:デフォルトの名無しさん
07/10/30 16:34:14
#include <sys/types.h>

645:デフォルトの名無しさん
07/10/30 16:38:35
>>643
off_tでぐぐるぐらいの事はしてみたよな?

646:デフォルトの名無しさん
07/10/30 16:38:56
typedef long off_t;

647:デフォルトの名無しさん
07/10/30 16:40:53
>>635
検索を使ってちゃんと探してみたか?
俺は自分の環境で探してみつかったぞ。
しかも難しい定義でもなんでもなかったぞ。
答えは言わない。自分で環境全部きちんと探して。


648:647
07/10/30 16:45:36
答えでちゃったね。
VS C++のファイル検索使えば全検索でも何分もかからないのに。
いずれ仕事にするならそれぐらいはきちんと覚えておいて。

649:デフォルトの名無しさん
07/10/30 17:01:56
>644
その記述を入れたらoff_tに関してのエラーは出なくなりました!ありがとうございます。

>645
ググって、検索結果のページも色々参照させてもらったんですけど、なにぶんCそのものについての知識がなさ過ぎて・・・。すみません。

>646
その記述を入れてもoff_tに関してのエラーは出なくなりました!ありがとうございます。

>647
ありがとうございます。皆さんに助けていただいてひとつ前に進めました。
まだエラーが出てるんで先は長そうでけど・・・。

650:デフォルトの名無しさん
07/10/30 20:50:14
理解しないで使うには危険な言語だと思うぞ。


651:デフォルトの名無しさん
07/10/31 12:14:47
>>649
「その記述を入れたら出なくなった」じゃなくて、
なんでエラーが解消できたのかを知っておかないと
これから先苦労するぞ。

652:デフォルトの名無しさん
07/10/31 18:09:26
Win32環境+VS2005で開発を行っています。
ダブルクリックでファイルを開く処理に対応させようと頑張っていた所
Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。
(でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く)

そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?


653:デフォルトの名無しさん
07/10/31 18:11:41
スレ違い

654:652
07/10/31 18:27:32
了解しました、他スレに流れてきます。

655:デフォルトの名無しさん
07/10/31 18:59:54
グリッド状に3次元ボクセルが並んでいる座標を格納したファイルがあって
0 0 0
1 0 3
5 20 9
…(順番はメチャクチャ)

URLリンク(up2.viploader.net)

こういう感じに1層だけ取り出して計算処理。
終わったらその上の層だけ取り出して計算処理

ということをしたいのですが

これって

for(slice=0,slice<MAX;slice++){
while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){
array[x][y][z]に層を格納
}
格納した層について計算処理
}

という風に、計算したい層を取り出すために、毎回ファイルを読み込むという賢くない処理をしなくてはならんでしょうか
もう少し賢いやり方をしたいのですが、アドバイスいただけませんか。

656:デフォルトの名無しさん
07/10/31 19:28:37
URLリンク(kansai2channeler.hp.infoseek.co.jp)

これに実験結果を入れたいのですが、どこに入れたらいいか分かりません。
教えてください。

657:デフォルトの名無しさん
07/10/31 19:30:04
>>656
コンパイルして、./a.out 実験結果 とでもすればいいだろ。

658:wolf ◆8VH3XAqjlU
07/10/31 21:09:30
>>655
For your Reference.

Managing Memory-Mapped Files in Win32
URLリンク(msdn2.microsoft.com)

Beej's Guide to Unix Interprocess Communication(Ref. Memory Mapped Files)
URLリンク(www.ecst.csuchico.edu)

659:デフォルトの名無しさん
07/10/31 21:47:11
>>658
thanks for your advice

but I don't mention accessing memory
and that code was rough. so I have some mistake



660:デフォルトの名無しさん
07/11/01 01:31:10
「派生クラスのインスタンスを生成する時、newで生成しないと使えない」
と言われたのですが、何でなのかわかりません。

  親クラス* p= new 子クラス;
  p->なんか関数();

これしか方法はないんですか?

661:デフォルトの名無しさん
07/11/01 01:39:13
>>660
そんな事はない

662:デフォルトの名無しさん
07/11/01 05:49:28
>>655
データ量にもよるが・・・

ファイルの読み書きと計算処理を分離し、
データはすべてメモリに読んでしまい、
計算処理はメモリ上にあるデータに対して行う。
いくつもの計算処理を済ませた後に、
メモリからファイルに書きだす。

663:デフォルトの名無しさん
07/11/01 10:38:55
子クラス kokurasu;
親クラス* oyakuasu = &kokurasu;
oyakurasu->NFunction();

664:デフォルトの名無しさん
07/11/01 16:13:54
>>662さん
レスありがとうございます。
小さいデータ量なら3次元配列に読み込んでしまえばいいのですが
量がメモリの容量を越えてしまうくらい大きいので…

2048×2048×2048の大規模なものや、それ以上を想定しています。。。

メモリに乗り切らない→1層ずつ処理→そのためには?
という考えからきています

665:デフォルトの名無しさん
07/11/01 16:34:53
ファイルを何度もスキャンするくらいなら、
物理メモリに乗らないような巨大なサイズでも、
仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。



666:デフォルトの名無しさん
07/11/01 17:00:46
>仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。
仮想記憶で扱うということはこれまでやったことが無くて。
どこかわかりやすく参考になるところありますか?

667:デフォルトの名無しさん
07/11/01 17:02:15
>>666
Wikipedia項目リンク

668:デフォルトの名無しさん
07/11/01 17:15:27
教えてください。

(Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか?


if((A==1)&&(B==2)){

}
else{
  処理
}

でいいのかなぁ?



669:デフォルトの名無しさん
07/11/01 17:17:15
ありがとうございます。
だいぶ難しそうな気配がしています。。。


670:デフォルトの名無しさん
07/11/01 17:19:27
if( (A!=1)&&(B!=1) )
処理

でいんでない

671:よろず
07/11/01 17:21:39
募集してるよん♪
bloom@geocities.co.jp

672:デフォルトの名無しさん
07/11/01 17:22:21
if((A!=1)||(B!=2))
{
処理
}

673:デフォルトの名無しさん
07/11/01 17:22:36
よくねぇよ

674:デフォルトの名無しさん
07/11/01 17:23:05
>>668
ド・モルガンの法則でひっくり返せ。

A != 1 || B != 2

675:デフォルトの名無しさん
07/11/01 17:23:24
>>668
if( !(A==1 && B==2) ) {
 処理
}

676:デフォルトの名無しさん
07/11/01 17:23:40
更新してなかtったorz

677:デフォルトの名無しさん
07/11/01 17:23:51
ありがとう || でやってみます

678:デフォルトの名無しさん
07/11/01 17:24:41
>>666
高々GiBオーダだろ。普通にmalloc()したらOSが勝手に確保してくれて、使うときに勝手にスワップアウトしてくれるよ。
OSがタコじゃなきゃ。

679:デフォルトの名無しさん
07/11/01 17:26:13
WindowsXPはタコですか?

680:デフォルトの名無しさん
07/11/01 17:26:41
>>677
果たして、>670で「(Aが1)、かつ(Bが2)以外」と読めるか?
if (!(A == 1 && b == 2)) {
処理
}
の方が読みやすいかも知れんぞ。
# ド・モルガンの定理を知らん香具師がメンテナンスするかもしれないんだし。

681:デフォルトの名無しさん
07/11/01 17:28:59
「(Aが1以外)且つ(Bが1以外)」と読める

682:デフォルトの名無しさん
07/11/01 17:29:48
どっちも同じようにしか見えない俺は眼が腐ってる

683:デフォルトの名無しさん
07/11/01 17:30:11
だね

684:デフォルトの名無しさん
07/11/01 17:49:50
「(Aが1以外)且つ(Bが1以外)」じゃないの?

685:デフォルトの名無しさん
07/11/01 17:52:10
if( !(A==1 && B==2) ) {
処理
}

こういう記述もできるんですね

みなさんありがとう 勉強になりました

686:デフォルトの名無しさん
07/11/01 18:25:35
>>680
読みやすさとかより
!(A == 1 && b == 2)) と (A!=1)&&(B!=1) は別物なんだが。

687:デフォルトの名無しさん
07/11/01 18:30:38
そりゃそーだ
Bの値が違う

688:デフォルトの名無しさん
07/11/01 18:47:54
>>678
ためしにmallocで 1024 1024 1024 を確保して解放しただけで仮想メモリの警告が出ましたが
確保をしているような感じでした。
ただ、合計4GBくらいになるはずのものが2.5GBで解放されたのが気になりますが。。。


もう少し別のやり方調べてみます。。。

689:デフォルトの名無しさん
07/11/01 19:12:47
>>688
Windowsの32ビットアプリケーションは、
3GiBオプションを付けない限り、ユーザアドレス空間2GiBしかないよ。
その2GiBをプログラム本体や、WindowsのDLL、スタックを差し引いた残りが、
およそmallocほか動的メモリ確保で使用できる領域になる。

それ以上使いたければ、64ビット化するか、2GiB未満に小分けして処理する必要がある。
いずれにせよ、同じ仮想記憶を使うのでも、
単純にmallocでメモリを確保するよりは、メモリマップドファイルにしたほうがいいと思う。

690:デフォルトの名無しさん
07/11/01 20:02:10
>>687
それだけ?

691:デフォルトの名無しさん
07/11/01 20:34:15
うぜ

692:デフォルトの名無しさん
07/11/01 22:00:13
>>689
動的メモリになると2GBの壁がでるのですね…

それだと必然的に1024^3はムリになるので、目的のは出来ないかもしれません
ファイルにランダムアクセスできればいいのですが…
それかファイルをソートする方がはやいのかも

693:デフォルトの名無しさん
07/11/01 22:05:34
>>692
ランダムアクセスはできるよ
テープじゃないんでしょ

694:デフォルトの名無しさん
07/11/01 22:07:58
テープですよ
ランダムアクセスはできるけど

695:デフォルトの名無しさん
07/11/01 22:17:07
>>692
流れをあんまり理解してないけど、
ファイルにランダムアクセスってfseekとかその手の話?

696:デフォルトの名無しさん
07/11/01 22:19:59
まさか数GBのファイルを全部メモリに読むつもりとか

697:デフォルトの名無しさん
07/11/01 22:20:04
そのファイルはテキスト?

698:デフォルトの名無しさん
07/11/01 22:21:37
層毎に読み込むのがいいよ

699:デフォルトの名無しさん
07/11/01 23:21:22
>>655のことです
層ごとに読み込みたくて。

15GBくらいのデータを縦軸・横軸の層で読み込んで計算したくて伺っていました。
テキスト形式のデータで要素数にして数億個のデータです。


700:デフォルトの名無しさん
07/11/01 23:39:36
なんで一度に読み込みたいのかがわからん。
ある層の計算をするときは、他の層がどうなってるかは知らなくていいんじゃないの?

逐次的に計算できるなら、何億個、何兆個データがあっても関係ないでしょ?

701:デフォルトの名無しさん
07/11/01 23:40:03
層順にソートしておくとか

702:デフォルトの名無しさん
07/11/01 23:44:40
何層あるのか知らないけど、元ファイルを順次読み込み、層ごとのファイルに分ける。
slice001.txt, slice002.txt, ... みたいに。
で、それぞれのファイル毎に層毎の計算をする。

で、ダメ?

703:デフォルトの名無しさん
07/11/01 23:45:52
>>700
一度に読み込まないための方法を探してるんです。

>>701
それは考えました。
縦方向に層を作るのであればZだけでソートしたファイルを読み込み処理ですむのですが
横方向に層も必要で
最悪2つの15GBのデータを作らないといけなくなりそうです。



704:デフォルトの名無しさん
07/11/01 23:47:23
あー、2k*2k*2k程度を想定してるのか。
層ごとに分けてしまえば次元が一つ減るから、オンメモリでいけるでしょ。

705:デフォルトの名無しさん
07/11/01 23:48:41
めんどくせーから、64bitOSにしちゃえよ

706:デフォルトの名無しさん
07/11/01 23:49:57
めんどくせーから、諦めちゃえよ

707:デフォルトの名無しさん
07/11/01 23:51:50
めんどくせーからDBにしとけ

708:デフォルトの名無しさん
07/11/01 23:56:27
>>703
> 横方向に層も必要で
おいおい、必要な情報は一度に開示しとけよ。

709:デフォルトの名無しさん
07/11/01 23:59:58
>>708
はい、すみません。

縦方向の層/横方向の層 でスライス作って計算するのが一番速そうですね。
始めは15GBの3次元の塊から、層を2次元配列で確保していくつもりでしたが

レスありがとうございました

710:デフォルトの名無しさん
07/11/02 00:43:29
> (Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか?

どーみても、
if ( (A==1) && (B!=2)) {
処理
}
だろ。

それとも日本語が不自由なのか?

711:デフォルトの名無しさん
07/11/02 00:45:03
668の例を見てそう言えるお前のほうが不自由

712:デフォルトの名無しさん
07/11/02 00:45:12
うは亀レス
日本語が不自由なんですね

713:デフォルトの名無しさん
07/11/02 00:45:41
もうその話題終わったよ

714:デフォルトの名無しさん
07/11/03 01:41:40
実体のまだないData型のpDataAというクラスが、ポインタで関数DataA_Setupにわたってきます。
DataA_Setupの中で、実体化(new)して、いろいろ値をつめます。
次に、このpDataAを、別の処理関数DataA_Modifyにわたして中身を書き換えるのですが、
DataA_Modifyのインタフェースが、Data型の参照を受けているのです。

int DataA_Setup(Data* pDataA)
{
pDataA = new Data();
// pDataAにいろいろ値をセット

    DataA_modify(ここが、Data型の参照になっている);



715:デフォルトの名無しさん
07/11/03 01:45:14
>>714の続き
で、DataA_modifyにpDataAを渡すには、どのように変換すればいいのでしょう。

Data rDataA = &pDataA;

とすると、
error: conversion from `Data**' to non-scalar type `Data' requested

とエラーが出ました。

716:デフォルトの名無しさん
07/11/03 01:48:22
*pDataA でいいんではないの

717:デフォルトの名無しさん
07/11/03 01:51:06
ありがとうございます。

DataA_modify( *pDataA );

で通りますか?

718:デフォルトの名無しさん
07/11/03 02:35:35
ゲームに制限時間を付けたいんですが、どうすればいいのか
わかりません。


719:デフォルトの名無しさん
07/11/03 04:52:32
>>714
> 実体のまだないData型のpDataAというクラスが

「クラス」???
基本的なことを理解していないっぽいな。

> ポインタで関数DataA_Setupにわたってきます。

実体がないのに、どうしてポインタが渡せるんだ?

そして案の定、

> int DataA_Setup(Data* pDataA)
> {
> pDataA = new Data();

なんていう変なことをしている。

引数の型はData*ではなくData**か、Data*&にしないと。
pDataAに何を代入したって、DataA_Setupの呼び出し側には伝わらないぞ。

> Data rDataA = &pDataA;

わかってなさすぎ。

720:デフォルトの名無しさん
07/11/03 08:39:58
>>718
あなたがどんなゲームをどのように作っているのか判らないので「こうしなさい」などとおこがましいことは言えません。

721:デフォルトの名無しさん
07/11/03 16:40:26
>>714
>>719のとおりだなあ。
とりあえずC++ Primerと初心者本を買って理解することをお勧めする。

722:デフォルトの名無しさん
07/11/04 16:35:46
二次元配列で
foo[たて][よこ]
を走査したいのですが
どんなループが一般的にやられてますか?

723:デフォルトの名無しさん
07/11/04 16:39:32
ふつう

for(y = 0;y < たて;y++){
for(x=0;x < よこ:x++){
}
}

724:デフォルトの名無しさん
07/11/04 16:40:09
二重ループ

725:デフォルトの名無しさん
07/11/04 16:58:20
>>723-724
ありがとうございます。

あとすいません、言葉足りなくて
foo[][]を

行だけ取り出して、計算→次の行へ。
列だけ取り出して、計算→次の列へ

ということです。



726:デフォルトの名無しさん
07/11/04 17:01:18
>>725
for(y = 0;y < 列;y++){
for(x=0;x < 行:x++){
}
}

for(y = 0;y < 行;y++){
for(x=0;x < 列:x++){
}
}


727:デフォルトの名無しさん
07/11/04 17:05:07
…そうだ。そうですね
なんか変に考えすぎてました。

ありがとうございます

728:デフォルトの名無しさん
07/11/14 02:03:47
if(条件1){処理1}
else if(条件2){処理2}
else if(条件3){処理3}
else if(条件4){処理4}
else{処理5}

という処理をやりたいのですが、ネストは3までと決められているので、このままの形では書けません
なんとかスマートにネストを減らしたいのですがどうするのがいいのでしょうか
今は仕方なくこんな風に書いてるんですが、不格好だし面倒くさいし…

int flg;
if(条件1){flg=1}else{DoNothing();}
if(条件2){flg=2}else{DoNothing();}
if(条件3){flg=3}else{DoNothing();}
if(条件4){flg=4}else{DoNothing();}
if(条件5){flg=5}else{DoNothing();}
switch(flg)
{
 case 1:処理1;break;
 case 2:処理2;break;
 case 3:処理3;break;
 case 4:処理4;break;
 case 5:処理5;break;
 default:DoImpossible();break;
}

729:デフォルトの名無しさん
07/11/14 02:07:49
ごめんなさい
条件の方のflg=*にセミコロン忘れました

730:デフォルトの名無しさん
07/11/14 02:17:22
>>728
ネストが3ということだが、一番はじめに提示したソースはネストは1じゃないか?
普通かどうかしらんが、俺の感覚でネストが深くなるといわれると
if ( XXX ) {
if ( YYY ) {
if ( ZZZ ) {
}
}
}
ということだと思うんだが?

731:デフォルトの名無しさん
07/11/14 02:20:14
一応、回避策(?)も提示してみる。
int Check( void ) {
if ( 条件1 ) return 1;
if ( 条件2 ) return 2;
if ( 条件3 ) return 3;
if ( 条件4 ) return 4;
if ( 条件5 ) return 5;
return -1;
}
/**/
switch( Check( ) ) {
case 1://以下略
}

732:デフォルトの名無しさん
07/11/14 02:22:28
else if{〜}はelse{if{〜}}のことなので、最初のソースのネストは5なんです
正直納得いかないんですが、コードチェッカがそう言って怒るので仕方ありません

733:デフォルトの名無しさん
07/11/14 02:28:20
>>731
結局条件を数値に直してswitchしかないんですかね
elseは必ず書くことになってるので正直あまり変わらない気がします。ごめんなさい

734:デフォルトの名無しさん
07/11/14 02:33:01
そのコードチェッカーは必ず、例外なく、何があっても、守らなければいけないもの?
可読性や汎用性やテスト容易性まで犠牲にしてまで守る利点はあるの?
っていっても、守らなきゃならない状況ってのはあるんだろうけど・・・
関数分割をなるたけして、厳しい部分はswitchに落とすしかないかな?

735:デフォルトの名無しさん
07/11/14 02:40:00
>>733
elseはcase -1:でよくね?-1じゃなくてもなんでもいいけど。
条件の内容次第ではうまくいく場合もあるよ。
例えば、文字列比較によって関数呼び出しを行うなら・・・
typedef sturct {
const char * str;
void ( * func )( void );
} T_HOGE;
const T_HOGE Hoge[ 3 ] = {
{ "right", Func1 },
{ "center", Func2 },
{ "left", Func3 },
};
for ( cnt = 0; cnt < 3; cnt++ ) {
if ( strcmp( Hoge[ cnt ].str, input ) == 0 ) {
Hoge[ cnt ].func( );
}
}
条件が複雑になれば厳しくなるけど・・・

736:デフォルトの名無しさん
07/11/14 02:41:57
bool notYet = true;
if (notYet && condition1) {process1; notYet = false;}
if (notYet && condition2) {process2; notYet = false;}
if (notYet && condition3) {process3; notYet = false;}
...

737:1/2
07/11/14 05:31:15
#include <utility>
#include <vector>
#include <iostream>
#include <functional>

struct func_holder : public std::unary_function<void,void> {
  typedef result_type (*func_type)(argument_type);
  func_holder( func_type f ) : m_func(f) {};
  result_type operator()(argument_type) const { return (*m_func)(); }
private: func_type m_func;
};
struct pred_holder : public std::unary_function<int, bool> {
  typedef result_type (*func_type)(argument_type);
  pred_holder( func_type f ) : m_func(f) {};
  result_type operator()(argument_type a) const { return (*m_func)(a); }
private: func_type m_func;
};
template< class Pred, class Func >
struct dispatcher
 : public std::unary_function<typename Pred::argument_type, void> {
  typedef std::pair<Pred, Func> pair;
  typedef std::vector<pair> vector;

  void add(pair const& p) { v.push_back(p); }
  void operator()(argument_type a) {
    for (vector::iterator i = v.begin(); i < v.end(); ++i) {
      if ( i->first(a) ) { i->second();break; }
    }
  }
private: vector v;
};

738:2/2
07/11/14 05:34:32
void out1() {
  std::cout << "out1!\n";
}
void out2() {
  std::cout << "out2!\n";
}
bool pred1(int i) {
  return i > 0;
}
bool pred2(int i) {
  return i == 0;
}
int main() {
  dispatcher<pred_holder, func_holder> dis;
  dis.add( std::make_pair(&pred1, &out1) );
  dis.add( std::make_pair(&pred2, &out2) );
  dis(0);
}

.*_holderで指定する関数の方を変えてやったり、predのargumentとして状態を保持した構造体を渡すようにすれば
もっと複雑な条件でも使えるかもしれない
boostを使えば使い勝手が良くて読みやすいのが作れる?

739:デフォルトの名無しさん
07/11/14 16:11:34
>>734
必ず守らなければならないとしたときの利点:
  お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む

740:デフォルトの名無しさん
07/11/14 16:18:34
>>739
必ず守らなければならないとしないときの利点:
  お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む

741:738
07/11/14 17:59:11
よく考えるまでもなく激しく車輪の再発明してる気になるなぁ(それ以前にC++)
これと同じようなものが「boostにあるよ」とか「lokiにあるよ」とか「俺が作ったよ」とかあれば
是非情報をおながいします

あとこういうのって、デザパタ用語で責任の連鎖パターンっていうんですか?

742:デフォルトの名無しさん
07/11/14 21:50:49
コンソール上で動かすプログラムを作っています。
画面消去の方法で『ESC [2J』と解説されてるサイトが多いのですが、
XPではエスケープ・シーケンスが使えないようなのです。
他に画面消去に使えるような命令はないでしょうか?
コンソール画面上をスペースで塗り潰す以外の方法は無いのでしょうか。

743:デフォルトの名無しさん
07/11/14 21:51:38
プログラムを書くというのは、特殊化だと思う。
だから、汎用に書くのは間違い。

可読性を損なわないようにベタっと書くべき。

744:デフォルトの名無しさん
07/11/14 21:55:55
DRY原則は守ってね

745:デフォルトの名無しさん
07/11/14 22:09:17
>>742
Win32APIスレで質問すべし。

746:デフォルトの名無しさん
07/11/14 22:13:36
APIじゃなくてもclsでよくね?

747:デフォルトの名無しさん
07/11/14 22:18:55
そこでPDCursesですよ
単にコンソールIOのシステムコールをCursesのインターフェースでラップしただけだけど
そのまま使うよりは使いやすいような使いにくいような

748:デフォルトの名無しさん
07/11/14 22:25:05
血圧が高くて疲労感が取れません。

749:デフォルトの名無しさん
07/11/15 03:23:46
A.cpp
CSample *Sample = 〜〜〜


B.cpp
Sample->Loop();

という風にしたいんですが
どうにかしてB.cppでSampleオブジェクトを使う方法はありませんか

750:デフォルトの名無しさん
07/11/15 04:30:17
>>749
グローバル変数


751:デフォルトの名無しさん
07/11/15 04:45:48
windowsでC言語の開発環境を整えようと思いbcpadをダウンロードしようとしたのですが、
ベクターでダウンロードできなくなっており、自身で探してみたのですが、ダウンロードできるサイトが見つかりません。
ご存知の方がいらっしゃいましたら教えてください。

752:デフォルトの名無しさん
07/11/15 10:28:55
>>751
シェアウェアにするとかなんとか書いてるから
フリーのVC++2005expとSDKでやれば?
ANSIIの関数で複数の関数が
警告で「安全性がなんたらかんたら・・・」って警告
でるけど、別に関数の使い方間違ってなかったら
問題無いし、C言語の開発環境としては
VC++2005で十分気軽に使えるでしょ

753:デフォルトの名無しさん
07/11/15 21:04:22
配列の要素数をsizeof演算子で得ることができるということは理解できるのですが
配列のポインタから、そのポインタが指す配列の要素数を得ることはできるのでしょうか?

754:デフォルトの名無しさん
07/11/15 21:22:21
>>753
できない。

755:753
07/11/16 02:27:16
ありがとうござました

756:デフォルトの名無しさん
07/11/16 19:26:34
WikibookのMore C++ Idiomsって更新されてるの?
10項目ぐらい聞いたことも無い名称が出ててとても気になるんだけど・・・

757:デフォルトの名無しさん
07/11/16 19:29:58
更新履歴みればいいじゃない

758:デフォルトの名無しさん
07/11/17 19:50:02
コンストラクタなんですが

クラス名::クラス名() : クラス変数名(値){
// 以下コード
}

みたいな宣言をされているのですが、「:」以降の文法の意味が分からないのですが・・・。
クラス変数の型は、インクルードしている他のクラスです。

759:デフォルトの名無しさん
07/11/17 19:52:17
初期化してるだけ
class A{
 int a;
 A();
};
A::A(): a(1) {
}
の場合、Aのメンバ変数aは1で初期化される

760:デフォルトの名無しさん
07/11/17 20:02:35
なるほどです。
手持ちの本では載っていなかったので。
ありがとうございます。


761:デフォルトの名無しさん
07/11/18 00:07:18
その本が入門書であるなら窓から投げ捨てたほうがいい。

762:デフォルトの名無しさん
07/11/18 03:02:02
未だにこんなコード載せてる本がたまにあるから困る
間違いだからなこれ
A::A(){
 a=1;
}

763:デフォルトの名無しさん
07/11/18 07:34:46
int a=1 ;
ってのも間違いで、
int a(1) ;
にしろってか?

764:デフォルトの名無しさん
07/11/18 07:40:24
どこが?

765:デフォルトの名無しさん
07/11/18 07:54:07
>>762
間違いってほどでもないな。効率が悪いってだけで。

効率の悪さよりも保守性のために、
あえて初期化リストを使わないという選択もあるよ。

多数のコンストラクタがある場合、
同じ初期化リストをコピペすることになる。

コンストラクタ内で代入するのであれば、
共通した代入をprivateなメンバ関数にできる。

766:デフォルトの名無しさん
07/11/18 08:00:24
>>765
それはクラス設計が悪い

同じように初期化するメンバで1つクラスにして、それを継承すべし

767:デフォルトの名無しさん
07/11/18 08:53:40
>>763
その2つは同値な表記
A::A():a(1){}とA::A(){a=1}は意味が違う
まあint型くらいなら大して変わらんけどさ

768:デフォルトの名無しさん
07/11/18 10:02:10
>>766
アンチパターン

769:デフォルトの名無しさん
07/11/18 11:01:06
>>766
継承はやりすぎ
包含で十分

770:デフォルトの名無しさん
07/11/18 11:02:24
>>767
意味が違うのなら、どちらが正しいかなんて言えないよな

771:デフォルトの名無しさん
07/11/18 11:04:58
クラスだとコンストラクタとコピー代入演算子が違う意味を持っているから初期化子に馴れておいた方がいい。
さらにstatic/constが絡んでくると初期化子の方が合理的だと思えるようになるよ。

772:デフォルトの名無しさん
07/11/18 11:14:04
説明がド下手

773:デフォルトの名無しさん
07/11/18 11:52:42
C++での質問です

EA001 80
EA002 60
EA003 100
EA004 0
EA005 50

みたいな感じに学籍番号と整数値が与えられているテキストファイルを読み込んで、
整数値をソートして行ごとに並べ替えるプログラムを作りたいのですが
どのようにテキストファイルを読み込めばいいのか教えてください。

774:デフォルトの名無しさん
07/11/18 11:56:49
#include <fstream>

std::fstream f("ファイルのパス.txtxtxtxt", std::ios::in | std::ios::binary);

void *buff new char[適当な数];

f.read((char*)buff, 読み込むサイズ);

775:デフォルトの名無しさん
07/11/18 11:59:31
>>774
バイナリで読み込む必要ない
あとソートはSTLのmapとかsetだと読み込めばソート完了する

776:デフォルトの名無しさん
07/11/18 15:32:20
Visual C++ 2005 Express Edition で、PCのイベントログをとってくるには
どうしたらいいんですか?

777:デフォルトの名無しさん
07/11/18 15:59:26
>>776
Win32API質問スレへどうぞ。

778:デフォルトの名無しさん
07/11/18 16:01:51
>>776
Win32APIのReadEventLogを使う。

WMIあたりにもっと便利なのがあると思うが、
その質問の仕方を見ていると使いこなせるか疑問。

779:デフォルトの名無しさん
07/11/18 19:28:29
>>777-778
すみません。ありがとうございます。
おっしゃる通り、C言語すら知らないド素人です。
Win32APIとやら・・・Cの基礎を知ってないと駄目なほどのものを使わないと
できませんか・・・Windowsのイベントログだから考えてみればそうですよね・・
ありがとうございました。

780:デフォルトの名無しさん
07/11/18 22:11:53
Cの基礎を知らないでVisual C++でまともなプログラムを作るのはそもそも無理だろWin32APIがどうこういう前に

781:デフォルトの名無しさん
07/11/19 11:13:10
>>779
とやらって…。Win32APIは別にCの基礎じゃない。

782:デフォルトの名無しさん
07/11/19 23:49:41
>>781
日本語読めない人ですか?
779は Win32API = Cの基礎を知ってないと駄目なほどのもの って言ってるんであって
Win32API = Cの基礎 だなんて一言も言ってないだろ。

783:デフォルトの名無しさん
07/11/20 00:15:24
そんな必死にならなくてもいいのに

784:デフォルトの名無しさん
07/11/20 00:17:31
と言う事にしたいのですね:-)

785:デフォルトの名無しさん
07/11/20 01:44:13
いいえ、事実です。

786:デフォルトの名無しさん
07/11/20 02:25:22
1,2、たくさんとしか数えられないから、三行以上の書き込みが必死に見えるらしい。

787:デフォルトの名無しさん
07/11/20 12:34:12
>>782
Win32APIがCの基礎を知ってないと駄目なほどのもの?
笑わせてくれるぜ。

788:デフォルトの名無しさん
07/11/20 13:19:02
Win32APIがCの基礎を知ってないと駄目なほどのものって言ってるのは782じゃなくて779だろ。
782は781の読み違いを指摘してるだけ(煽ってるともいう)なのに、なんで782に絡むんだよw

789:デフォルトの名無しさん
07/11/20 13:23:47
そんなことよりみんなで乱交パーティしようぜ

790:デフォルトの名無しさん
07/11/20 13:29:54
そんなどうでもい話で盛り上がってんなよ

791:デフォルトの名無しさん
07/11/20 13:42:43
新しいネタもないし別にいいんじゃね?
どうしても話題変えたかったらなんか質問でもしなよ

792:デフォルトの名無しさん
07/11/20 15:18:08
C++で、stringに入力した文字列をint型に変換する方法が分かりません。
atoi()を使うとエラーが出てしまいます。

793:デフォルトの名無しさん
07/11/20 15:19:08
string s="123456";

cout << atoi(s.c_str());

794:デフォルトの名無しさん
07/11/20 15:29:00
string s="123456";
int i;
istringstream(s) >> i;

795:デフォルトの名無しさん
07/11/20 15:39:01
代入演算子で、整数変数に浮動小数点をかけ算するとき、ワーニング出ないようにするにはどうすればいいの。
int value=10;
value *= 0.5;


796:デフォルトの名無しさん
07/11/20 15:45:22
整数演算に直す。
value /= 2;

797:デフォルトの名無しさん
07/11/20 16:15:33
WindowsAPI使えば、スタンバイとか自分の好きな風にカスタマイズできますか?

PCのスタンバイ設定が気に入らないので。

798:デフォルトの名無しさん
07/11/20 16:16:42
レジストリだろう

799:デフォルトの名無しさん
07/11/21 08:51:30
double型・float型っていくらの整数まで厳密に保持できると保証されてるんでしょうか?
(桁が上がっていくと1の位を保持できなくなるわけですよね)
具体的にはunsigned intの最大値までそれぞれ保証しているのか知りたいのです。

800:デフォルトの名無しさん
07/11/21 09:29:21
>>799
それぞれの仮数部のビット数を調べればいい。
結論から言えば、一般的にdoubleは53bit、floatは24bitとなる。
従って、一般的な4バイト整数と較べた場合、floatは精度が足りないと言うことになる。

801:デフォルトの名無しさん
07/11/21 12:50:50
>>800
なるほど、納得です!
ありがとうございました。

802:デフォルトの名無しさん
07/11/21 22:31:20
保障はされてなかった気がする

803:デフォルトの名無しさん
07/11/22 01:15:33
質問です。
今自分はCからFORTRANにする事をしていて、
wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/

drawrest(xps+50,50,200,200,yellow)

line(xp,250,xp,yp,white,0,0)
といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
これをFORTRANで表現するにはどうしたらいいのでしょうか?


804:デフォルトの名無しさん
07/11/22 01:24:43
>>803
我々はエスパーじゃない。

805:デフォルトの名無しさん
07/11/22 01:27:41
>>803
お前みたいなのを雇うなんて会社の程度が知れてるな

806:デフォルトの名無しさん
07/11/22 01:39:29
>>803
>といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
>これをFORTRANで表現するにはどうしたらいいのでしょうか?
それを調べるのがあんたの仕事だ。
調べずとも明らかなことだけなら猫にでもやらせればすむことだからな。

807:デフォルトの名無しさん
07/11/22 01:44:40
すみません超初心者なんですが質問いいでしょうか

1、ネットで見つけたあるサンプルをVisual C++ 2005 Express Editionというソフトで開くと
「古いバージョンのソフトで作ってあるから新しいソフトに書き直す」
というような内容のメッセージがでたのでOK、開けました

2、ビルドして実行しようとすると
”ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?”
というメッセージが出たのでOK

3、”プログラム’・・・.exe’を開始できません。指定したファイルが見つかりません。’
というメッセージが出てきて実行できません。

これってVisualC++2005だとこのソースはビルドできなくて結局使えないってことですか?
ゲームを作ろうとしたのにいきなり詰まってて困ってます。

808:デフォルトの名無しさん
07/11/22 01:47:35
>>807
2.の時点で間違っている。
ビルドエラーが発生してるのに実行しようとしているため。
ちゃんとビルドできるようにして来い。
わかんなかったらソースとエラー書いてくれ。
もしくは、そのサンプルがあるURLを書いてくれ。

809:デフォルトの名無しさん
07/11/22 02:02:47
CUIでのゲームプログラムを作ろうと思ってるんですが、
保存したデータ内容の編集はCの標準ライブラリのみで出来るのでしょうか。
追記は出来ても一部分のみ書き換えや削除等の方法が分からなくて。

810:809
07/11/22 02:04:00
説明不足でした。
ファイル処理の話です。

811:デフォルトの名無しさん
07/11/22 02:06:36
C以外でやった方が楽だし早いんじゃね?

812:デフォルトの名無しさん
07/11/22 02:08:50
>>809
ファイルの途中への挿入や削除は標準関数ではできない。
サイズが変わらないなら、方法はある。

813:デフォルトの名無しさん
07/11/22 02:09:58
>>811
仰るとおりですが、まだ授業でCの勉強しかしてなくて。
javaも独学で勉強してるもののいまいちピンと来ないんですよ…。

814:デフォルトの名無しさん
07/11/22 02:12:26
>>812
書き換えや削除するとサイズが変わってしまうのでは?

もし宜しければ参考のためにご教示願えますか。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4726日前に更新/260 KB
担当:undef