【初心者歓迎】C/C++室 Ver.28【環境依存OK】
1 :
デフォルトの名無しさん :
2006/06/09(金) 10:08:51
2 :
デフォルトの名無しさん :2006/06/09(金) 10:44:36
余裕で2げっとw
,ヘ ,:ヘ.
/: : \ /:: !
/::::..... \--―‐'.:.:::... !
>>3 プギャーーーーーーーッ
/:::::: .::::::::::::: ',
,':::: /\ヽ_ヽv /: /\i
.i:::: √___丶 !
!:::. / / tーーー|ヽ !
|::::.. ..: | |ヽ l _,-,.、
i;::::.. | |⊂ニヽ| | ! i´ヽ い {,-ゝ.
':;::::... | | |:::T::::| ! / l ,人 __,!...!_}ゝ l
_ \:::::.... ト--^^^^^┤ / ヽ. '´ ` /
/ `ヽ `ゝ:::::........ ....../_ / ァ-- '
i::..... ;\!..-ー 、 /⌒ヽ 、\ / .:/
` '''''ー- 、::::/ ,.. . `/::: 〉‐ 、 \ \ / ..::ノ
.ソ' : /::. /:: 〉 \\,/ .:/
/i:. :,'::. /:: ./ヽ \! ..:;'
/ |:: |ヽ.:.. :'::/ \ .::/
/ !::. i::.:.:`:‐"ー、_,ノ \:::/
/ ,/ヾ;:.... /:.:.:.:.:/:::.:.. ヽ、
| :i `ー::':.:.::.:.:./\:::::.:.:. ':;
4 :
デフォルトの名無しさん :2006/06/09(金) 16:43:53
C++でGUIする場合はC++BUILDERしかない?
5 :
デフォルトの名無しさん :2006/06/09(金) 17:04:39
VC++6.0 MFCで自作簡易HTMLレンダリングエンジンの作り方、プログラムが分かる方 居ませんか??? 教えていただけると助かります。。。。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
8 :
TOM :2006/06/09(金) 19:00:50
c言語で定期的にディレクトリの中味を監視すれにはどうしたrいいですか?
>>8 デーモンの常駐。それかsleep()を発行して、一定時間経過後ディレクトリ内容取得。
10 :
デフォルトの名無しさん :2006/06/09(金) 20:41:37
質問です listで型を指定するところにクラスや構造体を指定した場合 要素を追加するときどうするんですか? intやfloatのような型だとpush_back(10)のようにできますが、 クラスだと、どうやって記述すればいいのかわかりません。
>>10 class Foo;
std::list<Foo> foos;
foos.push_back(Foo());
Foo foo;
foos.push_back(foo);
12 :
10 :2006/06/09(金) 20:56:38
>>11 ありがとうございました
関数でもいいんですね
>>12 > foos.push_back(Foo());
これの引数はFooという関数を呼んでいるわけではないぞ。
Foo型の一時的なオブジェクトを(コンストラクタ引数なしで)作っている。
14 :
10 :2006/06/09(金) 21:23:14
>>13 コンストラクタを呼べばいいのですね。わかりました
あと、何度も同じような質問で申し訳ないのですが
listの要素のオブジェクトのメンバ関数を呼ぶ方法がわかりません。
// list中の要素のメンバを順に呼ぶ例 class Foo; std::list<Foo> foos; ... for(std::list<Foo>::iterator it = foos.begin() ; it != foos.end() ; ++it) it->memberFunc();
16 :
10 :2006/06/09(金) 21:36:23
CFOOクラスがあります。 メンバ変数の一つに、CFOO* m_focusFoo を持ち、 メンバ関数の一つに、CFOO* GetFocusFoo() を持ってます。 m_focusFooは、下のようにコンストラクタでNULLで初期化してます。 CFOO::CFOO():m_focusFoo(NULL),・・略{略} GetFocusFoo()は、下のようにただ m_FocusFoo を返すだけです。 CFOO* CFOO::GetFocusFOO() { return m_focusFoo; ←ここで止まる!!!!! } CFOOのインスタンスは複数生成するんですが、 m_focusFooには自分自身が入ってる場合もあれば NULLの場合もあれば 他のインスタンスが入る場合もありえます。 GetFocusFoo()を呼び出してる側では、 NULLが返ってきてもいいようになってまして、 ためしに return NULL; としてみると落ちないでちゃんと動きます。 (もちろん正規の動きでは無いですが、 少なくとも呼び出し側は仮にNULLが返されても安全なようにはしてある、という意味です。) で、一応コンパイルは通ってまして、 win2000の環境では動くのですが、xpのマシンで走らせるとエラーで落ちます。 デバッグしてみると、return m_focusFoo;のところで止まっているようで、 CFOOのコンストラクタの初期化リストでちゃんと初期化しているはずの変数も含め 全ての変数に「式を評価できません」とエラーが出てます。 return の m_FocusFoo の評価部分で落ちて、 しかもそれが環境に依存するというのは、どこの書き方が悪いと考えられますでしょうか?
18 :
17 :2006/06/09(金) 22:57:31
一応age
20 :
17 :2006/06/09(金) 23:13:38
長いのでエスパー的にお願いします。
21 :
デフォルトの名無しさん :2006/06/09(金) 23:14:50
22 :
17 :2006/06/09(金) 23:47:41
今気づいたのですが、 GetFocusFoo()の処理の先頭に、 WinAPIのMessageBoxを差し込んで試してみたら、 なぜかWin2000の方で実行すると起動直後にGetFocusFoo()は呼ばれなくて、 xpの方で実行すると呼ばれるみたいです。 OSによって実行の順序が変わるなんてありえるんですかね? 処理的には、GetFocusFoo()が呼ばれるからにはインスタンスが出来上がってるわけで、 となれば少なくともm_focusFooはコンストラクタでNULLに初期化されてるはずだと思うのですが、 これをreturnするところで落ちるってのがいったいどういうことなのかよく分かりません。
23 :
17 :2006/06/09(金) 23:57:45
何かとりあえず直りました。 実行される順番が違うってことが分かったんで、 勘で適当に関係ありそうなところをいじって見たら直りました。 なんで直ったか分かりませんし、 説明しようにも内容が入り組みすぎてるので、無理です。すいません。 お騒がせしました。
>>23 そんなに入り組んだプログラムを作っているから、
17のようなわけわからないことが起きるんだよ。
>25 「主な機能」と書いてあるじゃないか。全部ってわけじゃない。
>>25 「拡張」っつーと少し語弊がある気がするな。
CはもともとJavaみたいに、その言語環境だけでどうこうするように考えて
作られた言語じゃない。
CはOSのシステムコールやFORTRAN等で書かれたライブラリルーチン等を
直接呼べるように設計されているが、
別にOSのシステムコールは「C言語を拡張するため」のものではない。
typedef class AClass { public: AClass **ppMe; }; というクラスがあったとして AClass *pTest = new AClass(); pTest->ppMe = &pTest; とやってppMeメンバに自分のアドレスを持つ変数のポインタを代入したいんですが これをオペレータ等を使って見た目上1ステップで書くことは可能でしょうか?
なんでthisじゃダメなんだ?
「自分を参照している変数」に対してアクセス(解放時にNULL代入等)したいからです
だから、コンストラクタでppMe = this;とでもすればいいじゃん。
>>28 は「自分を参照している変数」じゃなく、「自分へのポインタを自分に設定している」だが?
33 :
28 :2006/06/10(土) 20:39:31
AClassのメソッドからpTestの値を書き換えたいということなんですが・・・ ちなみにthisはAClass*、ppMeはAClass**です
AClassのメソッドからpTestを書き変えればいいじゃん。
pTestのメンバ情報からpTestの指す先を書き換えることは無理じゃないか? グローバル変数に保存してそれを参照しないことには。
36 :
28 :2006/06/10(土) 20:49:21
メソッドから*this->ppMeに対してアクセスすれば 外のpTestの内容を書き換えることは可能です で、今回の質問はクラス生成、代入時に、 同時に左辺の変数のアドレスをppMeメンバに代入したいということなんですが
コンストラクタでthisのポインタを取得しても、そのポインタのポインタを保持 しているエリアはローカル変数だから、コンストラクタを抜けた時点でppMeの アドレスが無効になる。 やはりどこかでグローバル変数が必要か。
38 :
28 :2006/06/10(土) 21:05:46
グローバル変数ではありませんが、他もしくはAClassの別のインスタンスが AClassのインスタンスのアドレスを保持する変数を持つことを想定しています リストやツリーのようなもんです(根っこだけは別ですが)
なんだよCompositeパターンか。
>>28 は自分に自分を設定しているじゃん。だから混乱するんだよ。
42 :
28 :2006/06/10(土) 21:33:50
自分のポインタを保持している変数を別のインスタンスが持っているか どこかのスコープで保持されている変数が持っているかの違いだけで、 やっている事自体に変わりはありません 質問の主旨とかけはなれてきているので しばらくはppMeを設定するメソッドを用意して対応することにします ありがとうございました
43 :
デフォルトの名無しさん :2006/06/10(土) 21:34:03
C++で時間を扱うのってどうやるんですか? 例えば、0から10までの数字をランダムで一定時間ごとに 足していって1000になるまでかかった時間を表示するプログラムみたいなの つくるためにはどうすればいいですか?
開始時刻を保存しておいて、終了時刻から引けばいい。 秒単位なら time() さらに高精度でほしいなら clock() で現在時刻を取得できる。
45 :
43 :2006/06/10(土) 21:40:44
time()やclock()ってCPUの違いによって変わらないの? OSあたりで調整しているの?
47 :
デフォルトの名無しさん :2006/06/11(日) 01:36:53
クラス定義でインライン記述を使っていい条件がよくわからないのですが、 何か差があるんでしょうか? 全関数のプロトタイプとインプリメンテーションは別にした 方がいいのでしょうか?
48 :
47 :2006/06/11(日) 01:42:30
すいません。言語はC++です。 templateを使うクラスを記述するときに インラインの方が記述しやすかったもので・・・
>>46 そりゃそうだ。
clock() はいろいろ違うだろうけど CLOCKS_PER_SEC で差を吸収することができる。
おまえら前スレを成仏させてあげてください
>>47 インターフェースをクラス定義で記述するつもりなら、
別にしたほうがインターフェースと実装が分かれていて良いと言える。
インターフェースを別の文書で記述するなら、
クラス内で定義してしまってもほとんど問題ない。
ポインターの勉強を始めたんですが、分からないことがあるので教えてください。 環境は VC++2003/2005 でプロジェクトのプロパティでコンパイル言語をC言語にしています。 #include <stdio.h> int main() { char exe[] = "test.exe"; /* @ */ // char *exe = "test.exe"; /* A */ char *p = strrchr( exe, '.' ); if( p ) { strcpy( p, ".ini" ); } printf("%s\n", exe); return 0; } Aの方を有効にすると実行時にエラーになってしまいます。 @もAもやっていることは同じだと思っていたのですが、何か違いがあるのでしょうか?
どうやってOSで調整しているんだろう?>clock() for文などで何回も空ループさせて、計測しているのか? CPUの周波数があらかじめわかると計算できるけど OSからみれば、どのCPUに搭載されるかわからないからね〜
>>53 まぁあれだ。オープンソースのOSのソースみればわかるよ
>>52 それらは全く別物。
char a[] = "abc";
は
char a[] = {'a','b','c','\0'};
と同義。
char *a = "abc";
は、メモリ上のどこかに確保された文字列定数「"abc"」へのポインタを、ポインタ変数「a」の初期値としている。
文字列定数は、あくまで定数だから変更しちゃいかん。
>>52 この手の間違いはC初学者にはとても多いので、何か命名した方がいいと思った
「リテラルレイプ」とか
そうすれば回答者は「リテラルレイプでググれ」で済むし、
質問者も「リテラルレイプはCでよく陥るミスなんだな」と
理解が早まると思ったんだがどうか
57 :
47 :2006/06/11(日) 02:53:42
>>51 ありがとうございます。
ヘッダをインターフェース確認ファイルとして使うときに分ける感じでしょうか?
VisualC++ですと1クラス1ヘッダが推奨されているようなんですが、
組み込みのSTL等見るとインラインに加えて複数クラスが
ヘッダで定義されているんですが、
どっちがよいのでしょうか?
58 :
52 :2006/06/11(日) 03:04:49
>55 素早い回答ありがとうございます。 char a[] = "abc"; と char *a = "abc"; では実際に確保されるメモリ領域が異なるということでしょうか? char a[] = "abc"; はヒープ領域?に確保される。 char *a = "abc"; は静的領域?に確保される。 静的領域に確保されたメモリは変更できない。 という理解でいいんでしょうか?
data/bss/stack/moat/heapで区別するなら文字列実態はdataセクション、 ポインタはstack(auto) or bss(static), 配列の名前はおそらく即値でアセンブラ命令に直接入るだろうな。
>>59 ちょwwwww
どうみても初心者なのにその解説かよwwww
>>58 # とおりすがりですが、、、、
実装される領域に注目しすぎると本質を見失うかも。
定数(const)かどうかに注目したほうが理解しやすいと思います。
char a[] = "abc";
これは、配列(メモリ上の領域)の定義。(const指定子をつけていないので書き換え可能)
char *a = "abc";
これは、ポインタの定義。
リテラル("abc")を指すように初期化される。
通常リテラルはconst属性を持つ定数配列なので、書き換えができない。
コンパイラにうるさくwarningさせれば、この初期化が問題を起こしうることは
コンパイラが指摘してくれるはずです。
また、コンパイラオプションによって、リテラルを定数として扱わないように
することができる処理系も存在します。このようなオプションを指定すれば、
Aのソフトも実行することは可能です。
ただし、この場合、処理系がどのようにリテラルをメモリ上に格納しているのか、
実装方法に対して十分に注意しないと、さらに予期せぬ動作につながるため
お勧めはできません。
62 :
55 :2006/06/11(日) 08:33:14
>>58 配列は理解してる前提で書いたら、配列は理解してなかったのか…。
前者(a[])である配列の方は、文字列「abc\0」を格納するのに必要な領域を確保し、
それ全体に「a」と言う名前を付ける、と言う配列の定義。
後者(*a)であるポインタ変数の方は、どこかの領域を指すための値を格納するのに必要な領域なを確保し、
その領域に「a」と言う名前を付け、文字列定数「abc\0」の先頭を指すポインタ値で初期化しているポインタ変数の定義。
# ちなみに、文字列定数は、一般的には文字列リテラルと呼ばれる。
# 「文字列定数」と書いた方が、「何故、変更するべきモノではないのか?」がわかりやすいかと思った。
だから、細かいことを言えば、pはchar*よりもconst char *である方がよい。 そうすれば書き換えようとしても、コンパイル時にエラーになる。 特にC++では文字列リテラルを非constなchar*へ初期化・代入できるのは、互換性のためとなっていたはず。
すみません。 今日からプログラミングをはじめてみたんですが、 プログラムが動きません。 色々ネットであさってみたのですが、よく理解できないので ヒントでもいいので教えてください。
>>65 何をどうしてどのように動かないのか書かないと口の出しようもない。
すいません。質問です。 今日からはじめようと思うんですが、CとC++どっち覚えればいいですか? と質問したいところですが、わからないっていわれたんで、 C++でできることはCで全部できますか?教えてください。
C++のリファレンスがネットで観れるところはありませんか? MSDNとかじゃなくてもうちょっと綺麗にまとまった感じで
できるよ
あるよ
URLを教えてください!
>>68 「できること」というのがプログラムを作成するという意味なら可能
言語の機能を指してるなら不可能
>>67 すみませんでした。ちょっと頭痛かったのでそこらへん忘れていました。
borlandをsetbccを使って設定までしたのですが、
作ったのを動かす(?)ことができません。
たぶんborlandの使い方が理解できていないと思うのですが・・・
作ったやつをクリックすると1.exe 1.obj 1.tbsが作成されます。
プログラムの内容は文字の表示です。
その他書くことがあればお願いします。
>>75 「何が動かないのか」が書かれていないが。
>>70 >>74 わかりました。ありがとうございます。
C言語から始めて、色々身に付けてC言語じゃ不便と感じるようになってからC++に手出したいと思います。
79 :
デフォルトの名無しさん :2006/06/11(日) 21:45:41
初心者なんですがプログラムつくるまえに仕様書的なもの書くじゃないですか? 書き方とか参考になるサイトないですか?なにかけばいいやら…
まず、マトモな日本語で概要説明が書けることが重要。 そこが欠落した人の図面はどこか破綻している事が多い。
エラー処理がよくわからないのですが、 たとえばスタッククラスのpopメソッドで 空っぽなのに実行された場合など どういうエラー処理をすればいいんでしょうか? 例外をthrowしたり、assert()を呼んだりの区別がよくわかりません。
83 :
デフォルトの名無しさん :2006/06/11(日) 22:03:59
>>81 好きにしろ。ここはお前のプログラムの仕様を考えてやるスレじゃいないんだ。
結構大事な話題だと思うけどね 表明とかEiffelの契約とか
むしろ例外でpopした値を返せ
>>75 その1.exeを動かせ。それがお前の作ったプログラムだ。
システムフックに関して質問させてください。 いずれかのウィンドウがアクティブになるたびに処理をしたいので、 下記のようなシステムフッククラスを作成しました。 (長いので要点のみ) // フックの登録 BOOL CHook::Set(HWND hWnd) { m_hHook = ::SetWindowsHookEx( WH_CBT, (HOOKPROC)CHook::CBTProc, GetThisInstH(), // システムフックなのでNULLじゃなくインスタンスハンドル渡す GetWindowThreadProcessId(hWnd, &lpdwProcessId)); }
// フックの処理 LRESULT CALLBACK CHook::CBTProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam) { // 処理してはいけないメッセージなので、次へ渡す if( p_nCode < 0 || p_nCode == HC_NOREMOVE) return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam ); if( p_nCode == HCBT_ACTIVATE ) // ここがアクティブウィンドウが発生したときの処理 TRACE0(_T("アクティブ化\n")); return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );// 次のフックへと繋げる } また、このフックハンドルや必要な変数はグローバルにし、他とかぶらないようにしてあります。 #pragma data_seg( ".CKHookData" ) HHOOKCHook::m_hHook = NULL; #pragma data_seg() この状態で使用すると、フックを呼び出したウィンドウがアクティブになったときにしか反応しません。 これではローカルフックと変わりません。 いろいろ試してはみたのですがどうにも・・・どなたかわかる方、ご教授願います。 MFCアプリで使用するので、DLLはMFC DLL の拡張モードで作成してあります。
>>88 GetWindowThreadProcessId(hWnd, &lpdwProcessId));
フックを呼び出したウインドウと同じスレッドのみって自分で指定してるだろが。
システム全体にフックを有効にしたければ、ここをNULLにする。
90 :
k ◆WFGp1NZuiw :2006/06/12(月) 00:23:36
メモリを解放せずに,デストラクタのみを呼び出す auto_ptr のようなものを 作りたいのですが,うまくいきません.アドバイスいただけないでしょうか? (placement new と組み合わせて使用することを想定) 書いてみたのは↓みたいなコードで,「pointer_->PointerClass();」のところで 文句言われてしまいます. template<class PointerClass> class CleanPointer { public: CleanPointer(PointerClass *pointer) : pointer_(pointer) { }; ~CleanPointer() { pointer_->PointerClass(); }; private: PointerClass *pointer_; };
>「pointer_->PointerClass();」のところで はて……コピペミスではないようだが……高度な釣りかな。
>>90 デストラクタの呼び出しは ~PointerClass() だよ。
しかしそのクラスが何の役に立つのかわからんな。
>>90 デストラクタを呼ぶにはpointer_->~PointerClass();だぞ。
>>89 できた・・・orz
即答ありがとうございます。
できた…かも。
今日一日潰れた問題でしたが、解決してよかったです。
ありがとうございました。さっそく必要な処理を加えていこうと思います。
96 :
京大生www :2006/06/12(月) 01:18:09
Cです。 環境はどこまでいえばいいか分かりませんが、コンパイラはbcc32 テキストファイルのa.textが abc def ghi だとします。 char *hako[3]; で定義した配列ポインタを使って *(hako+0) = abc *(hako+1) = def *(hako+2) = ghi というかんじでファイルから配列にコピーしたいのですが、どうすればいいのでしょうか?
これが今の京大生だったら泣けるw
99 :
京大生www :2006/06/12(月) 01:24:16
宿題スレにも書いた。 早く答えて欲しい、製作意欲が失せてしまう
答え聞いてるのに制作意欲も何もないよね
いつかのトリップが残ってやがったorz
102 :
京大生www :2006/06/12(月) 01:27:55
これが出来れば先がうまくいきそうなんだけど。 分からないなら分からないって言ってくれないか?
>>102 わかるからわからないって言わないんだろうが。
マルチは失せろそして氏ね。
>>102 我々には到底分からないので、どうか違う場所でお尋ねください
>狂大生 お前には一生無理なんだからもう寝ろよ
>>102 つまりお前のこの先はうまくいかないってことだ。
これは分かる。
>>96 何がうまくいかないのかわからなけりゃ、答えようもないだろ?
まずは自分で書いて、わからないところを質問、相談しろ。
108 :
52 :2006/06/12(月) 02:31:21
>61,62,63 回答ありがとうございます。 ポインタを使えば文字列定数でも書き換えられると誤解していました。
>>96 ,99,102
BCC32で確認してある。ちなみにお前の配列はタダのポインタの配列
#include <stdio.h>
#define BUFSIZE 1000
FILE *fp;
char *fname = "testdata.txt";
unsigned char buf[BUFSIZE];
unsigned char *getnext(unsigned char *);
int main(void)
{
char *hako[3];
int i,g;
if((fp=fopen(fname,"rt"))==NULL){printf("cannot open file %s\n",fname);return 1;}
i=0;
while(1){
if(EOF==(g = fgetc(fp)))break;
buf[i++]= g;
}
//printf("%s",buf);
hako[0]=buf;
for(i=1;i<3;i++)hako[i] = getnext(hako[i-1]);
for(i=0;i<3;i++) printf("hako[%d] : %s\n",i,hako[i]);
return 0;
}
unsigned char *getnext(unsigned char *buffer){
while( *buffer != 0x0a) buffer++;
*buffer=0x00;
return ++buffer;
}
110 :
デフォルトの名無しさん :2006/06/12(月) 18:02:04
リソースを使わずにエディットボックスを作りたいのですが CREATEWINDOWの所を教えて下さい
>>110 ●どこまで調査したのか?
●どこまで理解したのか?
●何が理解できないのか?
●具体的に、どの様な事を試したのか?
112 :
デフォルトの名無しさん :2006/06/12(月) 19:26:20
WISDOM SAKURAにあるソースでエディットボックスは作れましたが リソースエディタなどで作れる物とは違い、線のみの枠なので 困っているのです 立体的な凹みのある物を作りたいのですが
114 :
デフォルトの名無しさん :2006/06/12(月) 20:10:58
携帯なので見れません
>>96 各行は1023バイト以下とし、エラー処理等は割愛する。
char *hako[3];
char buffer[1024];
FILE* fp;
int i;
てな変数を用意して、
fp = fopen("a.text", "r");
for (i = 0; i < 3; i++) {
buffer[sizeof(buffer)-1] = 0;
fgets(buffer, sizeof(buffer)-1, fp);
hako[0] = strdup( buffer );
}
fclose(fp);
>>112 CreateWindowExで拡張スタイル指定すればいい
詳細はググレ
117 :
デフォルトの名無しさん :2006/06/13(火) 17:35:50
質問です コンパイラ C言語を始めよう! を使っているのですが実行してコマンドプロンプトに何も出ません プログラム自体には間違いはないと思うのですが・・・ そもそもコンパイラとの受け渡しもよく理解できておりません >< OS:windowsXP SP2 コンパイラに LSI C-86 Ver.3.30c 試食版 を使用
開いた口蛾塞がらなくなった
第三者だが老婆心で補足。 「C言語を始めよう!」ってのは、誰だかが作った簡易IDE機能を持つ エディタのようなものの固有名詞のようです。 では淡々と続けてください:
120 :
デフォルトの名無しさん :2006/06/13(火) 17:54:30
実行後にPAUSE にチェックを入れて、 コンパイルして実行してみたら?
>>117 学習用としても、LSI-C86を使うことは激しくお勧めできません。
もっと近代的なコンパイラを使いましょう。
123 :
デフォルトの名無しさん :2006/06/13(火) 18:28:14
VCEEの登場で有象無象の学習用Cコンパイラとやらを使う理由がほとんどなくなったな。
127 :
京大生www :2006/06/13(火) 19:43:27
釣りだろ
109,115カワイソ
最近C言語を始めた者です。 ヘッダファイルとCソースファイルに書くべきことは何ですか? 例えば、Cソースファイルで使う定数をヘッダファイルに書くなと聞いたことがあります。 どんなものがヘッダファイルに記述すべきで、どんなものがCソースファイルに記述すべきか教えてください。
>>130 いろいろなソースファイルから参照される情報→ヘッダファイルへ
その他→ソースファイルへ
APIを使ってウインドウのインスタンスハンドルを取得しようとしています。 HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE); ここで警告がでてきます。 '型キャスト' : 'LONG' からより大きいサイズの 'HINSTANCE' へ変換します。 (VS.NET 2003 > VC++) 警告を出さないようにするにはどうすればいいんでしょうか?
bcc55でプログラミングをしています。 平方根を求めるためにsqrt関数を使おうとしました。 #inclide<math.h>もちゃんと入れたのですが、 「エラー E2314 rego.c 27: 関数でないものを呼び出している(関数 main )」 と表示されうまくいきません。 どうすればいいのでしょうか?
>>132 プロジェクトの設定の「C/C++」→「64bit移植への対応」を「いいえ」に
sourceは?
>>134 おお、見事に消えました。ありがとうございます!
137 :
デフォルトの名無しさん :2006/06/14(水) 01:45:43
C言語をやろうと思い導入しました ですがうまくいきません ------ ビルド開始: プロジェクト: C, 構成: Debug Win32 ------ コンパイルしています... Cプラス.cpp .\Cプラス.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません ビルドログは "file://d:\My document\Visual Studio 2005\Projects\C\C\Debug\BuildLog.htm" に保存されました。 C - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== となってエラーになります
138 :
デフォルトの名無しさん :2006/06/14(水) 01:47:22
誤爆しました さようなら
>>132 <windowsx.h>のGetWindowInstanceの方が楽だよ。
中身はGetWindowLongPtrを呼んで結果をHINSTANCEへキャストするマクロ。
>>137 まず、ソースも貼れ。
話はそれからだ。
141 :
133 :2006/06/14(水) 10:34:01
#include<stdio.h> #include<math.h> #define n 5 int main(void) { int i; double q[n],avq,qr,s; double p=0,r=0; printf("%d個のQのデータを入力してください\n",n); for(i=0; i<n ; i++) { scanf("%lf", &q[i]); } for(i=0; i<n ; i++) { p=p+q[i]; } avq=p/n; for(i=0; i<n ; i++) { r=r+(q[i]-avq)*(q[i]-avq); } qr=sqrt(r/ (n(n-1)) ); s=qr/avq; printf("Qの相対誤差は%20.15lfです。\n",s); return 0; } ソース貼ってなかったですね。冗長なソースですがよろしくお願いします。
>>141 × n(n-1)
○ n*(n-1)
これじゃnって名前の関数をn-1を引数に呼び出してると解釈される罠
143 :
133 :2006/06/14(水) 12:03:47
>>142 ありがとうございます、解決しました。
こんな初歩のミスやってしまった・・・
144 :
137 :2006/06/14(水) 13:26:03
>>140 ソースは単純なものです
#include <stdio.h>
main()
{
printf("ABC\n");
}
初歩の文字の表示すら受け付けないんでしょうか・・・
>>144 C言語としてコンパイルすること。
C言語は、関数の戻り値の型の省略を認めている(暗黙にint型になる)
C++は、認めていない(main()関数は、かならずint型を返さなければならない)
146 :
623 :2006/06/14(水) 14:32:17
Borland 5.5,bcpadを使用しています。
行列のプログラム計算をしようとしてて下のサイトのファイルを導入しようと思い、
ttp://www.ipc.akita-nct.ac.jp/~yamamoto/comp/cpp/class/class.html で、matrix.hとmatrix.cppをダウンロードして、まずmatrix.hを
.hが入っているフォルダに入れてそのあとmatrix.cppをビルドしました。
しかし、Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
となってしまいました。それで解決する方法をそのあといろいろググって
保存ファイル名を「bcc32 -tW 保存ファイル名」にすればいいらしいということが
書いてあって早速やってみたのですが「エラー E2194: ファイル 'bcc32.cpp' が見つからない」
となってしまい、ビルドできません。さらに、ビルドを無視して
インクルードファイルを使ってプログラムを作って実行してみたのですがやはり、
「Error: 外部シンボル 'Matrix::~Matrix()' が未解決(Z:\○○\TORIAEZU.OBJ が参照)
Error: 外部シンボル 'Matrix::Matrix(int, int)' が未解決(Z:\○○\TORIAEZU.OBJ が参照)」
と出てきてしまいます。どうにかしてこれを使用したいのですがどうすればいいのでしょうか?
長文すみません。教えてください。よろしくお願いします。
147 :
137 :2006/06/14(水) 14:42:14
>>145 拡張子をCにしていろいろ試したらできました
>>146 そのmatrix.cppはクラスの実装だけだからそれだけじゃ実行できない。-cオプション付けてリンク、実行ファイル生成しなければobjファイルは吐けるけど。
でtoriaezu.cppでエラー出るのはクラスの実装がリンクされてない。上の手順でコンパイル済みのobjをリンクする必要がある。
bcc32 toriaezu.cpp matrix.objな感じで。
補足すると、 bcc32 toriaezu.cpp matrix.cppでもいける。 でも元のソースの文字コードがEUCでそのままじゃエラー出るんで、 QKCかなんか適当な手段でShift-JISに直すと吉。
151 :
146 :2006/06/14(水) 15:33:18
>>148-150 さん。
小一時間考えても何をおっしゃってるのか理解出来ません( ノД`)
本当申し訳ないのですが、もう少し馬鹿にもわかるように
説明していただけませんか?本当すみません。
あと
>>150 のは見たんですけど、私はそれほど大規模な計算は
行わないと思いますのでこの山本さんのファイルを使用したいと思うのです。
>151 えーと。 分割コンパイルという言葉に聞き覚えは?
153 :
デフォルトの名無しさん :2006/06/14(水) 16:45:58
>>152 返答遅くなってすみません!!どうしても外せない用事ができてしまって
外に出てしまいました。今出先のノートパソコンからやってるのですが、
分割コンパイルという言葉に聞き覚えはありません…
帰ってみてぐぐればわかるでしょうか?本当申し訳ありません。
>>153 なんかとてつもなくわかりにくいような気もするが置いとく
・コンパイル時の動作
とりあえずbcc32 toriaezu.cpp matrix.cppと打ち込んだ場合、
コンパイラはまず最初にtoriaezu.cppとmatrix.cppをコンパイルしてtoriaezu.objとmatrix.objを作成する(この時点でエラーがあればコンパイルエラーと出る)
次に、リンカ(ilink32.exe)を呼び出して、CUIアプリケーション用スタートアップモジュール(C0X32W.OBJ)や標準関数ライブラリ(CW32.LIB)と
先にコンパイルしたtoriaezu.objとmatrix.objをリンクしてtoriaezu.exeを吐き出させる。
・ヘッダファイルとソースファイル(コンパイル単位)
ヘッダファイルは通常、クラスや関数の宣言のみで単独でコンパイルや他のソースファイルにインクルードしても実体は含まれない。(テンプレートは通常ヘッダに実装書くけど置いとく)
当然、宣言だけだと呼び出す関数がそのコンパイル単位に存在しないのでそのクラスの実装(matrix.obj)から関数を呼び出す必要がある。
ついでにBCC5.5.1のライブラリファイルとかの資料
http://support.borland.com/entry!default.jspa?categoryID=90&externalID=4323 混乱するかも知らん(;´Д`)
先日、VisualC++EEをインストールしたんですが 環境変数設定で間違えて$(PATH)の値を消してしまって困っています $(PATH)○○ となるはずですけど○○の部分がわかりません 変な話で申し訳ありませんが教えてください どうかお願いします
通りすがりですが、、 ・複数のソースコードからなるソフトをひとつのexeファイルにまとめることができる。 中規模以上のソフトは通常複数のソースファイルで構成されている。 (もしこの機能がなかったら、たとえばLINUXカーネルのソースコードは、、、、、、) ひとつのソフトを分割してコンパイルすることになるので、コンパイル結果を結合する 必要がある、リンカはこの結合を行い、結合されたソフトの実行開始アドレスなどを exeファイル内に設定する。 (ちなみに、単一のCソースからなるソフトでも、リンカはスタートアップ時に初期化のために 実行されるCRTなどを、コンパイル結果に結合して実行ファイルを作成している) ・C言語(コンソールプログラム)は、int main()から実行が開始される。 (実際にはCRT(C0X32)の中のスタートアップルーチンからmainを読んでいるのですが、、、) よって、mainがないとリンカさんが困ってしまう。 Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) そしてふりだしへ、、、
どうでもいいけどこのスレで_mainが未解決のエラーが出ると書かれたら、 十中八九WinMainから始まっているのに-Wを指定していなかったというオチ。
>>157 不幸なことに今回はレアケースなのだよ
つまり10回のうち1、2回というか、それ以上
多分100万人に1人の…
main.c hoge.c hoge.hをコンパイルする場合 bcc32 -etest *.h *.c
160 :
デフォルトの名無しさん :2006/06/14(水) 23:59:17
C言語での質問なんですが 関数定義、宣言の時 例えば static void func(void){}と void func(void){}とするのでは 何が違うんでしょうか どなたか教えて頂きたいです
>>160 別のソースファイルから呼び出すことができるかどうかが違う。
>>160 前者は非公開、後者は他ソースに公開。
例えば同じ名前の関数が他ソースにあるときに問題になる。
最適化の観点からは、
gccなら前者ならインライン展開する可能性を期待できる。
iccなら事実上殆ど差がない。
163 :
デフォルトの名無しさん :2006/06/15(木) 00:24:07
>>156 例えばコマンドラインから、bcc32 hoge.h hoge1.c hoge2.c ...でできるはず
>>159 *.h *.c はディレクトリ内の拡張子 .h .c の全てのファイルをコンパイル対象にしてしまう。
これやるぐらいなら、makefile の作り方を覚えた方がいい。
初心者の内は自分がどのファイルをコンパイルしているのか、
意識的に考えながらやった方がいい。
164 :
デフォルトの名無しさん :2006/06/15(木) 03:31:01
初歩的な事で申し訳ないのですが……次のソースをコンパイルして実行すると、「セグメンテーション違反」と言われて怒られます。何が悪いのでしょう? #include <stdio.h> int double_malloc(double *target, int number) { if ((target = (double *)malloc(sizeof(double) * number)) == NULL ) { puts("Memory Unallocatable in dounle_malloc()\n") ; return (-1) ; } return (0) ; } int main(void) { int number ; double *test ; number = 2 ; double_malloc(test, number) ; test[0] = 1.0 ; test[1] = 2.0 ; printf("%f\n", test[0]+test[1]) ; free(*test) ; return (0) ; } OSはVineLinux3.2、コンパイラはOSについてきたgccを使っています。CPUはPentium4 2.66GHz、総メモリは1Gでコンパイル後も650MB程度の空きがありました。
Cはよく分からないから勘で言うけどfree()はポインタ渡すんでない?
double_malloc の target が double * なのがそもそも問題外。
パラメータをdouble**にするか戻り値をdouble*にすれ。
>>164 1. 関数の中で引数(の変数)に代入しても、渡した側の変数の値は変更されない。
2. free には malloc が返してきた値と同じ値を渡す必要がある。
(例) a = malloc(...); としたなら free(a)。 free(*a) や free(a+1) はダメ。
C なら double* double_malloc(int n) として、 test = double_malloc(number) とするか、
int double_malloc(double** ptr, int n) として、 double_malloc(&test, number) とする。
(後者の場合 *ptr = (double*) malloc(...); として値を返す)
加えて C++ なら int double_malloc(double* &ptr, int n) として、 double_malloc(test, number) とも書ける。
(この場合 ptr = (double*) malloc(...); でOK)
いや、C++ならそもそもmalloc()なんか使うなよ、と。
なんで?
俺は #define MBYTE (1024 * 1024) char Var[MBYTE]; こうやったらエラーでたからしかたなくmalloc()使ってる…。
>>170 単一オブジェクトの動的生成なら new 使ったほうがよくて、
動的配列なら vector 使ったほうがいいから。
174 :
172 :2006/06/15(木) 13:10:22
>>173 自分ではそんなつもりないけど、何か変なこと言ったか?
>>172 俺もnewかコンテナ使うけど、コンテナの機能を使わない場合、malloc()でもいいんじゃね?
ビルトインタイプなんだし。
まあnew/deleteとmalloc/freeをごっちゃにするようなトンチキなことさえしなきゃいいんじゃね
mallocすればreallocも使える!
vectorよりmallocの方が、微妙に速い・・
そんなにクリティカルに速度を気にする奴は、 そもそもmallocなど使わずに、環境依存のメモリ確保のシステムコールなどを使う。
結論、Cとの互換性が必要な場合と既存のソースの流用の場合を除いて、 C++で積極的にmalloc()を使用する理由はない。
>>172 問題になるのは、コンストラクタ/デストラクタの呼び出しの有無。
呼び出されなければならない場合、new/deleteを使用するべき。
コンストラクタ/デストラクタがなければ好みの問題。
>>180 システムコールの方が c のライブラリの malloc より速い OS って
例えばどんなのがある?
185 :
164 :2006/06/15(木) 17:05:49
>>184 mallocがそのシステムコールを呼んでいるだけだったとしても、
インライン展開されない限り、mallocを呼ぶオーバーヘッドがかかる。
>>186 理論上、1度だけ大きな領域を確保するときにはそうだね。
というような特殊事例でのバカ話は別として、
実際にはどのOSのシステムコールが、そのOSの標準的なCランタイムの
malloc より高速なの?
>>188 まあ、そういう工夫によって、OS依存のAPIより早いという場合はあるね。
iostreamだって、内部でバッファ処理をしていて、
OSのAPIを呼び出して、ファイルに対して1バイトずつアクセスするより早いことがあるかもしれないし。
>>188 でも近頃のVisual C++のmallocは単にHeapAllocを呼ぶようになっていたと思う。
たぶん誤解している人がいる ヒント:仮想記憶空間
プログラム的には動的に割り当ててるけど、 実はプロセス起動時にまるっとある程度確保されてる場合もある
、、、 システムにメモリを要求することはかなりかなり高価な処理であるから, mallocの呼び出しごとにそれをするのは損である。 、、、 と古典には書かれている。
>>193 どのレスに対するコメントか知らんが、
「だからどうした」
>>195 これ使ってみて。
boost sandbox bigint
197 :
デフォルトの名無しさん :2006/06/16(金) 03:00:28
>>161 さん
>>162 さん
遅レスですいません
レスありがとうございます。
そういう意味だったんですか。
わかりました。ありがとうございました。
>>195 >MS VC++2005 で使える
かどうかは確認してないけど
gmpなんてのもある
gmpはgccでしか使えない希ガス
>>196 bigintってまだ残っていたんだ。
正式に採用される日は来るのかな。
個人的に、単純な実装でもいいから、
多倍長整数のための、標準ライブラリは必要だと思うのだけれど。
>>195 単にC++のヘッダーファイルが*.hになってるだけだね。
気合で修正汁
STLのmapをイテレータでアクセスする場合、 キーでソートされていることは保障されているのでしょうか? 次のコードによる出力結果が同じであることは、保障されていますか? int main() { std::map<int, int> test ; for (int i = 0 ; i != 100 ; ++i) test[i] = i ; for (std::map<int, int>::iterator Iter = test.begin() ; Iter != test.end() ; ++Iter) { std::cout << "key : " << Iter->first << ' element : ' << Iter->second << '\n' ; } std::cout << std::endl ; }
>>202 ・できる限り載せるソースはコンパイル可能なものにしてくれ。
・「出力結果が同じ」とは? 何と何が同じであることを期待しているの?
>>203 全角空白を半角空白に置換すればコンパイル可能だと思います。
VC8のDinkumwareでは、
1 1
2 2
3 3
...
のように表示されます。
デフォルトでは比較関数はstd::lessになるのは決まっていたと思いますが、
イテレータでアクセスする場合、
こういう風にソートされた形で順々に要素にアクセスできるのが、
規格として保障されているのか知りたいのですが。
>>202 ほんとにコンパイルできた?
2バイト空白を置換してもエラーになるんだけどなぁ。
つーか、>204のようには出力されないと思うぞ。
#少し落ち着いて自分のコードをよく見てみるか自分でコピペして味噌。
##あ、すまんが本題の「規格で保証」されているかは知らない。
###でも、その筈だけどね。
####いや、保障はしてくれないのは間違いないなw
>>205 パッと見、elementを囲っているのがシングルクォーテーションであるって以外は問題ないコードだが
210 :
202 :2006/06/17(土) 00:52:23
>>205 どうも文字列リテラルをシングルクオートでくくっていたみたいです。
すみません。
>>206 読んでみましたが、どこにもmapをイテレータでアクセスすると
ソートされているかどうかなんて、書かれていないような気がします。
211 :
209 :2006/06/17(土) 00:54:18
今見たらいろいろ間違ってた。 申し訳ないです。
>>210 > and they also guarantee that their elements are always sorted in ascending order by key.
213 :
202 :2006/06/17(土) 01:06:07
>>212 Sorted Associative Containerの説明のほうにあったのですか。
どうもありがとうございます。
214 :
195 :2006/06/17(土) 01:58:47
レスどうも。
>>196 頑張って探したけど、見つかりませんでした><
>>201 気合入れて修正して、コンパイルはなんとか通らせることが出来ました。
サンプルプログラムも正常に動作しているみたいです。でも、警告いっぱいでちょっと不安です。
gmpの情報もありがとうございます。ドキュメント読みながら考慮してみます。
216 :
デフォルトの名無しさん :2006/06/17(土) 13:59:47
どなたか教えてくださいませ。 GetValue()という関数があったとして、仮引数に与えたTypeとIndexによって、 戻り値がfloatやlongとして返ってくる方法は無いでしょうか? キャストや別関数を作成しないでまとめたいのです。 戻り値 float(or long) GetValue(long iType, long iIndex);
>>216 思いつく方法を書いてみた。
戻り値型のクラスを作成する(別関数と同程度の手間がかかる)
unionを使う(非推奨)
void *ポインタを使って環境依存のコード(非推奨&キャスト必須ゆえNG)
boost::anyを使う(キャスト必須ゆえNG)
例外を使う(禁止)
何がいいんだろう。
>>216 戻り値の型がfloatではいけない訳を聞こうか。
>>216 仮にGetValueがfloatやlongを臨機応変に返せたとして、受け取る側はどうするつもりだよ
long l = GetValue(); // floatを返すかもしれない
float f = GetValue(); // longを返すかもしれない
220 :
デフォルトの名無しさん :2006/06/17(土) 14:19:21
floatじゃ駄目な理由は特にないんですが、 取ってきたいデータがfloatはlongと混在しているので、全てfloatで返ってきてしまうのが、 なんかスッキリしなくてですね。
221 :
デフォルトの名無しさん :2006/06/17(土) 14:23:40
確かに...破綻してました。すいません。
>>221 エスパーしてみると、iTypeってのがlongかfloatかを決めているのかな?
だとしたらtemplate使えばいいんじゃまいか。
223 :
デフォルトの名無しさん :2006/06/17(土) 14:28:01
>>222 はい。Typeによって決めています。
最初テンプレート関数を使おうかと思ったのですが、私が馬鹿過ぎてほぼ使い方を忘れかけてまして...。
戻り値の型だけを変更することもできるんでしたっけ。
そういう話なら、オーバーロードで十分。
オーバーロードじゃ駄目だろ
え゛
>>223 出来る、が、iTypeを見て型を判別する責務をGetValueではなく、GetValueを使う側に移さないといけない。
template <class T>
T GetValue(long iIndex);
てなのを作っておいて
long l;
float f;
if (iType == /*long型*/)
l = GetValue<long>(index);
else
f = GetValue<float>(index);
のような感じの使い方なら可能だが…
なんだ。コンパイル時に決まっていればそれでいいのか。 てっきり、戻す型がもっと多くて、コンパイル時にやるのが面倒だから聞いているんだと思っていた。 //ヘッダ template < typename T > T getValue(int idx) ; //実装 template < typename T > T getValue(int idx) { return 0 ; } //longとfloatしか使わないので、明示的なインスタンス化をしておく。 template long getValue(int idx) ; template float getValue(int idx) でもこれ、わざわざ使うときに、getValue<long>とかgetValue<float>とかしないといけないな。 面倒かも。
>>225 オーバーロードだとこんな感じ?
戻り値にはできなくなるけど
void GetValue(long & dest, int idx) ;
void GetValue(float & dest, int idx) ;
//使い方
long x ;
GetValue(x, 0) ;
float f ;
GetValue(f, 1) ;
>>229 > キャストや別関数を作成しないでまとめたいのです。
というのがあるし、データを特定のインデックスから取ってくるってだけでオーバーロードを使ってしまうと、
それぞれの関数の内容がほとんど同じになってしまって無駄。
この場合はtemplateが妥当だろ。
longとfloatの場合でよほど処理に差があるなら話は別だが
floatでいつも返して、受け取り側でキャストすりゃいいじゃn
232 :
デフォルトの名無しさん :2006/06/17(土) 15:19:26
テンプレート関数ってオーバーライドできんだっけ?
>>232 いつの時代の人ですか?
とっくにできるようになりましたよ。
煽りいくない
>>231 一般的に、floatの方がlongより精度がないので問題が出そう。
>>232 オーバーライドはできないなぁ。
オーバーロードならできるけど。
>>233 いつの時代の人ですか?
237 :
デフォルトの名無しさん :2006/06/17(土) 17:06:55
structにprivate指定できるのがむかつく
>>237 D&E読めば少しは納得する気になれるかもしれない。
>>239 何かと思ったら計算するだけかと思いきや何で全部intなんだよ
toukasokudoの中の変数はdoubleかfloatを使うか、割り算の前に1.0を掛けておけ
>>239 各 case 節を関数に分けるといいよ。
何度も使われてる数値入力も関数にするのがいいよ。
242 :
デフォルトの名無しさん :2006/06/18(日) 02:58:25
Visual C++ 2005 Express Edition 使ってCの勉強最近始めたっばかりなんだが #include <stdio.h> int main() { int a = 10; int b = 7; double c = (double) (a+b)/2.0; printf("%f",c); return 0; } 「10」と「7」の平均を求め、小数点以下まで正しく表示させる問題で 上のが答えで下のが自分でやったものでどっちとも同じ答えが出力されるのですが これはこれでいいのでしょうか? #include <stdio.h> int main() { short a = 10; short b = 7; float c = (a+b)/2.0; printf("%f",c); return 0; }
>>242 その場合は問題は無い、ように見えるが、厳密に言うとキャスト演算子を用いる方が適切。
結果は問題なくても、処理の流れとしては (double) のある方が適切。
趣味の問題だと思うがなあ。
>>242 それじゃ、(double) をつけずに c = a/b をやってみ。
次に c = (double)(a/b) と c = (double)a/(double)b を比較してみ。
どういう結果になるか?
各々の変数に対して (double) をつけなきゃ意味がないのが分かるよ。
a+b と変数同士が足し算だったから分からなかっただろうけど
変数同士の割り算ならどう?
>>244 そりゃ違うだろw 一個人の趣味で言語の仕様が勝手に決まったら怖いよぉ〜
普通はintとdoubleを使う、と斜め上のレスをしてみる
よーしパパ、long long intにlong long double使っちゃうぞ
よーしぼくちん、キャスト演算子なんて面度だから 変数の定義はすべてdoubleにしちゃうぞぉ〜
うむ、たかが0〜1の間の細かい数値でも、数学で出てくる 近似値だの常用対数だの、円周率だの、そういった数値計算を扱わず 整数ばかりを扱う人にとっては気にせんでもやっていけるもんだねw
小数を扱う人たちの中にも、桁オチなんかされちゃ困る人もいるんですが
>>251 はいはい、えらいえらい。自慢はよそでやってね。ちらしの裏とか。
誰も誰が必要とするか?については言ってないよ? 整数ばっかり扱っている奴にはほとんど気にしなくてもやっていけるくらい その問題にぶち当たらないってことを指摘したまでだが? どうもこういう板には自分の考えに沿わない奴を排除したがる奴がいて困るw 適切か不適切かはコンピュータがはじきだしてくれるから、安心しろw
255 :
デフォルトの名無しさん :2006/06/18(日) 03:45:54
そこでfloatですよ!
>>252 =
>>253 なんなのお前ら?自分が答えられなかった、知らなかったことを知っている奴を妬んでいるように聞こえるが?
違いに気づかないくらい、整数、あるいは除算に定数を使っている奴が多いってことだろ?
やれやれ・・・お前らじゃ変数の型にすら理解していないようだ、失せろ、専門学校程度のクズ共
>>252 >桁オチなんかされちゃ困る
誰が桁オチを良しとした?意味を理解できない低学歴ってほんっと困るねw
>>245 は桁オチする例をモロに出したんだが・・・やっぱアホには分からんよねw
失せろ、正論も言えないバカ
259 :
242 :2006/06/18(日) 03:49:57
皆さんありがとうございます ちょっと荒れる質問だったようで申し訳ないです
>>259 気にせんでいいよ。キミが悪い訳ではないw
>>244 =
>>252 =
>>253 何こいつ?自分が趣味程度にしか思わなかった程度の知識しか持ってなくて
説明を聞いて理解したとたん、小数を理解して扱う人が少ないって意見に対して
自分は小数命!みたいなレスしてんの?(プ
>>259 そうそう、君が悪いんじゃない、桁オチを許さないって思っている頭の固い奴が
勝手に小数点以下を切り捨てても良いもんだと言った奴がいると勘違いしただけだからw
途中のレスは鬱陶しくて読んでないが、>242に関しては2進化で桁落ちが発生することはないから全く同じだな。 勿論、右辺は2.0で割っている以上等価だし。
除算で使われている値が定数だから見た目では分からないんだよね。 小数を扱わない型で宣言された変数を除算で扱った場合は、モロに分かる。 厳密に言えば、 a / (double)b で a に (double) をつけなくてもいけるが とりあえず計算式を代入する変数の型に合わせておいてもおk。
っつか、(double)a/bでもいけたおw
C++どころかプログラム自体全然知らなくて、
少し依頼っぽくなるのですが、
窓立て2ってソフトがあるのですが、
ttp://www.ksky.ne.jp/~seahorse/mtate2/ どうしても立体化ボタンのダサさが気になり、替えたいのですが、
立体化ボタンがC++で直接書かれているのでどうにもなりません。
窓立てフォルダ内に置いた指定画像ファイルを
表示させるようなプログラムには出来ないんですか?
もし、そのような改造を施せるのであれば、教えてください。
>>266 作者に頼めば?
って、既に掲示板で同じこと言ってるのか。
ソースはあるけどBCCだしなぁ。
UIがダサいので変えられないかとこれ以上なく直接的に書いててわらた もうちょっとオブラートに包め
自作自演ひどすぎですなぁ。 必死な奴の特徴丸分かりで笑える。 他のスレでもよく見る奴。
宿題程度の問題で数値演算やって、鼻高々な馬鹿
りそーすはっかー
>>270 245=246=247=248=249=256=261=262とかw
Cの質問です。データが(数字)(半角スペースいくつか)(文字)(改行) 例: 164 hoge 24 hogehoge 300 hog … というテキストから数字と文字を取り出したいんですが、 int num; char str[1000][128]; int count = 1; fp = fopen("test.txt" , "r"); while( (temp = fscanf(fp , "%d %s" , &num , &str[count-1])) != EOF){ printf("line:%d\n" , count); count++; if(temp == 2){ printf("%d %s\n" , num , str[count-1]); } else{ fgetc(fp); } } として、変なのが入ったら切り捨てて、戻り値が2の場合のみとりあえず表示させてみようっていうソースを書いたつもりなんですが、出力で上手く出ないようです…。 どこがまずいのでしょうか・・・
>>274 printf("%d %s\n", num, str[count - 2]);
>>275 指摘通り書き換えたら正しく入ってたようです
ありがとうございました
>>273 =
>>270 < こいつが自作自演で荒らしている低学歴
それ、全部イコールじゃないのは書き込んでいた奴なら分かるけど
それ以外のくだらねぇ煽りをしているのがお前だってバレバレだから
ヒント:頭のおかしい人は相手にしないようにしましょう
んで
>>252 が一番アホ。誰もプログラミングで小数を使わないとは言っておらず
キャスト演算子がなくても問題のない、あるいは気づかない人が
どっちも同じだと勘違いする例が上で挙げられていただけなのに気づかないだけ。
>>251 には小数点以下の数値が重要となる一例
>近似値だの常用対数だの、円周率だの
が書かれているにも関わらず、それらの計算式を使う必要がある場合は
結果からして小数点以下が落とされると困るのは分かっているはずで
そういう計算式を扱うようになれば、プログラム言語の細かい部分にまで
目がいくようになるわけで。
まぁ、理解力のないバカは、相手の意向を無視して自分勝手な解釈で
勘 違 い をして恥をかくから痛々しいw
ヒント:頭のおかしい人は相手にしないようにしましょう
>>277 自演しまくってる本人が何言ってんだかwwww
数値計算で注意すべきはオーバーフローする場合と桁落ちの時だ 数値計算の基礎で叩き込まれるけど、キャストしたからOKって事では無いぞ 引き算なんかは一気に演算精度落ちちゃうから 有効桁数云々言うなら式の変形も考えないと
ヒント:頭のおかしい人は相手にしないようにしましょう
>>281 頭のおかしい人は相手にしないようにしましょう
ふつー、数値演算ライブラリなわけだが。
>>282 そうだよ、だからってそんな精密な計算を必要とする計算式に
int型で宣言した変数を扱うこと自体どーとか言う前に
上で挙げられた例は気づかないものだって話じゃん。
キャスト演算子なんて使うのが面倒なら、よーしぼくちん
面倒だから全部変数をdoubleで宣言しちゃうぞー
で良いじゃんw
>>281 言葉も理解できない低学歴(専門学校生)ごときが、何煽ってんだよ?w
せっかくの休日も煽りをするためだけに使うなんて、くせぇ人生送ってんなぁ〜お前w
あっ、もしかして、ニート?w
ものすごく精度の高い数値の必要のない計算式を扱うだけの人は そういう点に気づかないんだろ。問題や論点の趣旨が分かってない奴がファビョってるだけ。 誰も小数点以下の数値を扱う必要がないとは言ってないし。 扱う奴が勝手に困るとか言っただけw こっちは扱う人間を困らせるつもりなんてないし、 扱う場合がない例について言ったところで何も困らんだろ。
荒らしウザイのぅ
((double)a+b)/2.0 みたいに動作に影響を与えるものなら趣味の問題じゃないが、 (double)(a+b)/2.0 みたいに動作に影響を与えないものなら趣味の問題だよなあ。
まぁ精度云々は置いとけ、
>>242 の何が問題か?
キャスト演算子を使わなくても結果にはほんとうに影響がないが
こういう場合でも、キャスト演算子を使った例を出して質問してんだから
それについて答えてみろよ?>精度フェチ
あぁん?どうした?結局、キャスト演算子のことについて答えられねーじゃん。 第一、キャスト演算子は何も精度を保つとかじゃなく 型の違う変数同士の計算式で使って帳尻あわせすんだろが? 何も変数の型がdoubleだけじゃないんだから、ちったぁ幅広い観点で物事を理解しろや、な?
ヒント:頭のおかしい人は相手にしないようにしましょう
>>291 また例によって途中は読み飛ばしているのだが、>242の右辺は全く等価でキャストする必要は全くないよ。
あくまでも、代入される対象の変数の型が違うだけ。
>>294 >代入される対象の変数の型が違うだけ
まだわかってないのか、呆れた・・・
>>295 数学で出てくる微積分だの、常用対数だの、円周率だの
無限小数が続くような精度の重要性の問題でキャストの話をしたんじゃねーんだよ?
まだ上の議論の論点がわかってねーのか、呆れたな、ろくに勉強してこなかった
オチこぼれの「専門学校生」ってのは
>>296 ((a + b) / 2.0) と ((double)(a + b) / 2.0) が等価でないということでしょうか?
>>242 で注目しておく点とし
>float c = (a+b)/2.0;
ここ、除算に使っている値はなんだ?そもそも何型の変数でもないな?
分かったか?タコ助共。問題がないからってその前にあるint型の変数を
無視しても良いとか言い出したら笑っちゃうよ?
そもそも、除算するくらいなら浮動少数を使っとけって、うぜぇ。
まぁ、こういうと今度は小数点以下のある数値の積、和、差については良いんでちゅか〜?
って屁理屈ごねてくるんだろw
AA貼りまくりで荒らす奴なら対処方もあるんだが、こいつの場合、一見何かを語って いるように見えるので、始末におえない。
>>298 > ここ、除算に使っている値はなんだ?そもそも何型の変数でもないな?
short 型の変数と、 double 型のリテラルだよ。
301 :
300 :2006/06/18(日) 18:11:40
ん?除算自体の2項のことかな?そうなると、確かに変数じゃないな。 言いたいことはよくわからんが。
あーあ、相手しちゃってるよ・・・
あーなんだ、2.0がdoubleじゃないと思い込みたい人だったのか。
>>297 そういうわけで、>296にとっては等価ではないと思い込みたいらしい。
数値計算・・・ 積み残しとかはなんか嫌だから 小さい値から加えてくようにしてる。
「除算に使っている値」という表現で素人なのが丸バレなんですが。
と玄人が一言
307 :
デフォルトの名無しさん :2006/06/18(日) 18:59:04
class test { int a; public: test(int i) : a(i) {}; }; 上のようなコンストラクタを見たのですが、これは test(int i) { a = i; } と同じ意味ですか? 同じだとしたらどちらが一般的な書き方なのでしょうか。
>>307 意味は違う。
前者は a を i で初期化している。
後者は a を初期化せず i を代入している。
>>308 じゃあ、後者でaはいつ初期化されるんですか?
>>309 初期化がされたうえで代入が行われる。
test(int i) : a(i) {}; なら初期化だけで済む。
>>309 意味論的には307の前者の書き方でaが初期化されるのと同じ時に、
(初期化子が無いので)不定の値で初期化されると言えば良いかな。
312 :
307 :2006/06/18(日) 19:32:41
解答ありがとうございます。 エラーの原因が分かったみたいです。 前者の場合はコピーコンストラクタが動いていたのかな。 後者だと、intの引数無しコンストラクタと代入演算子が動く・・・。
すいません。C言語で詰まっています。 文字列を返す関数を作っているのですが、 char *Method() { char strA[] = "こんにちは"; return strA;; } これだとstrAはローカル変数へのポインタなのでもちろんダメなわけですが、 なんとかして文字列を返す方法はありませんか? ちなみに引数は一切取りたくありません。
static
char *Method() { return "こんにちは"; }
>>313 char *Method() {
char* strA = "こんにちは";
return strA;;
}
関数にする意味がわからない・・・
そういう関数の宣言はconst char *Method()が良いな
>>310-312 ちがう。後者では a は初期化されず、代入まで不定な値となる。
意味上はね。
>>314-316 ああなるほど。そうすると"こんにちは"は性的領域に確保されるんですね。
bufを取らないitoaを作ろうとしましたが、なぜいちいちbufを取るのか先ほど理解しました。
ありがとうございました。
性的領域
>303 が結論だな
327 :
デフォルトの名無しさん :2006/06/18(日) 21:14:06
>>303 >2.0がdoubleじゃない
お前バカ?定数と型の指定のある変数の意味もわかってないのが露呈されただけ
専 門 学 校 は こ の 程 度 ( プ
>お前バカ?定数と型の指定のある変数の意味もわかってないのが露呈されただけ それはお前
2.0をdoubleだと信じている椰子は専門学校生ケテーイらしいw
331 :
デフォルトの名無しさん :2006/06/18(日) 21:25:20
>>328 なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・
自分の知識が浅はかだってまだ気づいてないな。
キャスト演算子の括弧の中はな〜〜〜んだ?変数を宣言するときの型が入っていると思うがねぇ〜〜
>>330 決定っつーか低レベル決定。物事を理解する頭がないってこと。
定数と変数なんて、既に中学、高校の数学でやってんだし。
違いの意味に気づいてない奴は、惰性で数値計算をしているだけの
思考能力のないアホ
>>331 > なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・
なるよ。馬鹿だなお前。
333 :
デフォルトの名無しさん :2006/06/18(日) 21:33:49
専門学校生乙。恥ずかしいからもう黙ってな。 筋の通った理論に基づいて話してなく、自分がバカだと思う奴がバカって 言っているだけだな。ご愁傷様。 2.0は 変数 ではなく 定数 なので、変数に使う型は関係ない。 問題は変数同士と、代入する変数の型だよ。 あの数式を見れば一目瞭然。さすがに初心者だからといって 理解力のないバカまで指導するスレじゃないんで、俺はこれで失礼するよ。 低俗な人間の問題煮まで相手にしてたら、こっちがバカになるw
面白いなぁ。07って書いても10進数だって言い張ったりするんだろうか。
いなくなるなら願ったりだが。
>>333 初心者が見てるだろうから騙されないように注意しておきますが、
C/C++ のソース上で 2..0 は double 型のリテラルです。
確かに変数の型とは関係ないですが、型が決まっていないわけではありません。
337 :
336 :2006/06/18(日) 21:40:01
おっと 2..0 はまちがい。 2.0 のことね。
>>336 上級者にバカにされたくなければ今すぐ考えを改めるよう注意しておきますが、
2.0がどこうではなく、「変数」と「定数」について述べていると思われますが?
それから、浮動小数についても理解しておられないようですね。
123.45を1.2345 x 10^2と表示することは理解していても
小数点が動くという意味までは理解しておられないようで?
>>334 いつまで屁理屈で自分勝手なお馬鹿な妄想してんの?
07については述べられていないし、2.0という値についてだよ?
っつか、0xとかつけるならまだしも、単に07って二桁にする意味ってなんだよ・・・
あー8進数
>>338 とりあえず以下のコードの実行結果の考察について説明してもらおうか。
#include <stdio.h>
int main()
{
printf("sizeof(long)=%d\n", sizeof(long));
printf("sizeof(float)=%d\n", sizeof(float));
printf("sizeof(double)=%d\n", sizeof(double));
printf("sizeof(2)=%d\n", sizeof(2));
printf("sizeof(2.0)=%d\n", sizeof(2.0));
return 0;
}
sizeof(long)=4
sizeof(float)=4
sizeof(double)=8
sizeof(2)=4
sizeof(2.0)=8
初心者同士が暴れてますね
>>338 まだ居るのかよ。早く消えるか、主張の内容がわかるように書いてくれ。
「変数」と「定数」について何を述べているのか伝わってないから。
8進数ワラタ
345 :
デフォルトの名無しさん :2006/06/18(日) 22:14:22
>>343 お前が変数と定数の意味を理解していないだけじゃね?どっちも恥ずかしいから
いい加減にしろ。特に屁理屈だけしか言わないアホ、C言語の前に数学やり直せw
そもそもはこの2つの違いの話だよな。(この結果を代入する先のcのことはとりあえず考えない) (A) (double)(a+b)/2.0; (B) (a+b)/2.0; aとbはint型。(242の後者でaとbはshort型だが、式内での格上げで結局int型として扱われる) だから(a+b)もA, B共にint型になる。 Aでは、それをdouble型にキャストして、2.0で割っている。Bではキャストせずに2.0で割っている。 2.0は浮動小数点リテラルで、接尾辞は何も付いていないから、double型。 つまりAは「double型の値 / double型の値」、Bは「int型の値 / double型の値」となる。 Aは除算演算子の両辺の型が同じdouble型だから、double型で除算が行われる。 Bは両辺の型が違うが、規格書ではこの場合両辺をdouble型にする事になっている。(規格書を各自見てくれ) この際にint型の値をdouble型の値に変換する方法は、 int型の値をdouble型の値へキャスト演算子で変換する場合と全く同じである。(〃) だからAもBも(型、値含め)全く同じ結果になる。
347 :
デフォルトの名無しさん :2006/06/18(日) 22:16:50
>>339 >>334 は
>07って書いても10進数だって
だから10進数だったら0を書く必要がないだろ・・・
その値が8進数かどうか言い出したら、最初の10進数で記述された数式ってなんだよ・・・
相手が知らないであろう事実を引き出そうって態度が痛すぎ。
論点を摩り替えて、お前は俺が知っている○×を知らない!ざま〜みろって
自分に有利なルールで勝負でもしてんの?w
>>345 Cでは式の中で右辺値として用いられる限り、
共に何か型を持ち値を持つという点では同じなのだから、
この流れで定数と変数を区別する意味は無いだろ。
349 :
デフォルトの名無しさん :2006/06/18(日) 22:18:52
>>346 >2.0は浮動小数点リテラルで、接尾辞は何も付いていないから、double型。
それについては、2.0が変数か定数かの方が論点になってるだろ・・・
お前、まさかいちいちdouble型で宣言したa,bをint型で宣言した変数cに代入する数式で
c= a+b / (int)2.0 ってやる?キャスト演算子についての話としても不適切だよ・・・
もうバカバッカw
350 :
デフォルトの名無しさん :2006/06/18(日) 22:20:08
>>348 >定数と変数を区別する
残念、計算式の中で使われている変数の型が違うってところから話が始まっているんだが?
過去ログも読んでないで、論点ズラして何言ってんだ?
もう痛すぎ、質問でも質問者への答えでもないなら消えろ
ちょ、暴れてる奴はコテで書いてくれ あぼーんしづらい
352 :
デフォルトの名無しさん :2006/06/18(日) 22:33:07
>>329 察しの通り、文字列の操作部分が怪しい。
(1) int str[MAXDATA][64]; → char str[MAXDATA][64]; じゃないか?
(2) 配列の初期化されていない部分を参照しているので適当な値で初期化するか、
終端フラグをもうけるか、ソート範囲を有効なデータの範囲だけにすること。
(3) (1) と仮定して str は「大きさ64の文字列の配列」なので Insertion_sort の引数を
void Insertion_sort(int num[] , char str[][64] , int data) とする。
(4) この場合、ソートする際は文字列の実体を strcpy 等でコピーする。
>>347 素直に「私が無知でしたごめんなさい」って言えばいいのに
8進数程度のことでがたがた言うなよ
>>349 安心しろ。 2.0 が変数だなんて言ってるやつは居ないから、それは論点にならない。
なあもうちょっと煽り抜きで主張することを覚えてくれ 双方とも
>>352 正直、double型とかの論争?に埋もれたかと思ってたら返信が…
(1)のとおりcharでした;
(2)の意味がすこし不明なんですが、まず、データのtxtファイルは
>>274 の上の部分のが999個くらい入ってます。
で、num[]にそれぞれの数を str[]に英字を格納してますが…
(3)と(4)とおりに直してみました…。コンパイルできず
mainの渡し方がまずいのか、根本的にわかってないのか、両方か…。
>>357 コンパイルできないなら、エラーメッセージ読んで直せよ。
お前ら、8進数も知らなかった中学生に いつまでも構うなよ・・・。
コンパイラによるw
361 :
デフォルトの名無しさん :2006/06/18(日) 23:26:09
ほんっとにバカって釣られやすいんだな、2chも初心者、一生ROMってろw
ついに主張することが無くなって、煽りだけになってしまいました。
>>357 (2) の意味は、例えば読み込んだデータの数が900個だった時
mainで Insertion_sort() を呼ぶ際、data=MAXDATA(999)になってるから
num[900]/str[900]以降のデータもあわせてソートしてるけど
じゃあ、そこに入っている値は何? ということ。
(3), (4) の通りにするとこんな感じになる。
void Insertion_sort(int num[] , char str[][64] , int data){
int i, j;
int numtemp;
char strtemp[64];
for(i = 1; i < data ; i++){
numtemp = num[i];
strcpy(strtemp, str[i]);
for(j = i; j > 0 && num[j-1] > numtemp ; j--){
num[j] = num[j-1];
strcpy(str[j], str[j-1]);
}
num[j] = numtemp;
strcpy(str[j], strtemp);
}
}
文字列のソートをポインタ操作だけで済ませたいときは
>>329 のソースに
例えば char str[MAXDATA][64]; の後ろ辺りに文字列へのポインタの配列
char *ptr[MAXDATA]; を追加してデータを読み込む際にptr[]を初期化
(ptr[count] = str[count]とか)し、以降はstr[]の代わりにptr[]を操作すれば良い。
釣り宣言きたか。さすが 2ch の伝統どおりだな。
まぁまぁこのスレは初心者歓迎なんだから 8進数なんてchmodの時ぐらいしか使わないんだから
>>338 プログラミングの式を数学の式と同じだと思わない方がいいと俺は思う。
理由は
>>348 で書いたとおり。
367 :
デフォルトの名無しさん :2006/06/19(月) 00:00:29
>>366 >プログラミングの式を数学の式と同じだと
誰が同じって言った?また妄想か・・・ループじゃなくて
無限に屁理屈が増大しているので、ここらでビックバーンでも起こして
お前ら全員吹っ飛んでくれw
>>363 おかげさまで動きました。と同時に(2)の話も理解しました。
そこらへんもなんとかしてみます。
お世話になりました。
>>367 なんか喋る前に
>>340 についてなんか解説してくれよ。
シンプルなコードにシンプルな結果だろう?
>>367 主張することが無いなら黙っててください。
ねぇねぇ、予約語に触れるもんでもなく問題もないんだけど 自分で定義する関数とか変数に大文字使う人っているじゃん? それってちょ〜〜〜〜キモイんですけどぉ〜、やめてもらえませんか〜? 大文字使う場合、変数とか関数とかじゃなくってぇ〜〜〜〜 #define MAX 10 とか変数じゃないものに使って欲しいんですけどぉ〜〜? ↓それについてあんたどう思う?
>>369 勝手な妄想する前に
>>340 についてなんか解説してくれよ。
シンプルなコードにシンプルな結果だろう?
>>370 質問に対してレスすることが無いなら黙っててください。
>>367 > 誰が同じって言った?また妄想か・・・ループじゃなくて
↓こりゃなんだ?
>>331 > 定数と変数なんて、既に中学、高校の数学でやってんだし。
別人?
>>340 >sizeof(2.0)=8
ああ、これね。これが何か?変数じゃない値で
メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
コンピュータ側がやっていることだが、それで勝手に2.0がdouble型の変数と
同じ扱いにはならない。変数と定数についてまだわかってないんだな・・・
少なくとも、変数の型が違う場合に使うキャスト演算子の話じゃないんで
何 が 言 い た い ん だ ?
>>373 コンパイルはしなくていいからさ、実行結果についてなんか喋ってくれよ。
>>375 誰も2.0が変数だなんて主張してないぞ。
>>375 > それで勝手に2.0がdouble型の変数と同じ扱いにはならない。
式で参照される限りは同じだよ。いいかげんにどこが違うのか言ってみてよ。
「俺は正しいはずなのに、何故か誰も味方についてくれない」 という状況に陥ったら、まず前半の前提部分を疑ったほうがいいなw
>>377 そうだね、だから変数の型によって出てくる「キャスト演算子」の話じゃねーっつってんだろ?
>>378 >いいかげんにどこが違うのか
それじゃ、お前はdouble型で宣言されたaを2.0で割った値を
int型の変数に代入する際には、ちゃんと 2.0 に (int)2.0 と書いて下さいね(ニヤニヤ
俺は2だってわかっている「定数」だったらわざわざ2.0なんて書かずに2って書くけどねw
質問の出所が分かってないから余計に悪いんだよな。
>>242 を読み直してから議論しろよ、こっちはもうくだらない屁理屈には付き合わない。
最後に、sizeofが何なのか、それもよーーーく調べておけよ、知ったか初心者
ID出ないって面倒ね
話を横道にそらす前に、以下の矛盾について自己弁護してもらおうか。
>>331 >なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・
>>376 >ああ、これね。これが何か?変数じゃない値で
>メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
>コンピュータ側がやっていること
>>375 ,379,381
今一度まとめて確認させてくれないか?
A. 2.0 は double 型の定数である。
B. a, b が整数型のとき ((a+b)/2.0) と ((double)(a+b)/2.0) は等価である。
どちらも真なわけだが、何か反論はあるか?
それからこれも答えてもらおうか。
>>381 >int型の変数に代入する際には、ちゃんと 2.0 に (int)2.0 と書いて下さいね(ニヤニヤ
>俺は2だってわかっている「定数」だったらわざわざ2.0なんて書かずに2って書くけどねw
2と2.0と書いた場合では、コンピュータの扱いが違うのだが。
>>340 >sizeof(2)=4
>sizeof(2.0)=8
わざわざ2と書かずに2.0と書くのには意味があるのか無いのか説明してもらおう。
387 :
366 :2006/06/19(月) 00:30:59
>>367 331で「定数と変数なんて、既に中学、高校の数学でやってんだし。」
と書いていることから、数学がわかればプログラミングも(当然)わかると主張しているように見受けられた。
366でアンカーを張った先が338というのはおかしかったな、それはすまん。
おいバカ、 sage るんじゃない。特定が面倒になったじゃないか。
さらには、次の概念について、君の思うところを語っていただこう。 ・暗黙の型変換 ・型拡張
ぼくちんはまだ 「2.0はdouble型のリテラルでしたごめんなさい」 が言えてないのか
>>381 たしかにC/C++において、
(配列の要素数など)整数定数式が要求される場所以外では、2と(int)2.0は等価。
でも2.0はあくまでdouble型。
しかし(int)2.0とした場合、コンパイラは定数式だからコンパイル時にint型に変換してしまう。
おや、未だやってたのか。 確か、失礼するのどうのと言ってたのじゃなかったのかな。 あーそうか、「去る」と言う意味ではなく文字通り、「失礼な行為を行なう」と言う意味だったのか。 #って、アンカーなくても被害妄想全開でレス来るんだろうなぁ。
393 :
デフォルトの名無しさん :2006/06/19(月) 11:20:31
class out { friend ostream &operator<<(ostream &o, out ob); public: int a; int func() { return 99; } }; ostream &operator<<(ostream &o, out ob) { o << "unko\n"; return o; } int main() { out ob; cout << ob; cout << ob.func(); } これを実行したらプログラムが強制終了します。 ob.a = 10;を追加すると動きました。 変数に値を格納していないオブジェクトはメモリ上に存在しないということですか?
しないぞ?
強制終了が抜けた・・・
396 :
393 :2006/06/19(月) 12:16:21
>>394 もう一度実行してみましたがやっぱり途中で落ちます。
環境のせいだったみたいですね。
VisualC++.net2003を使っています。
BCC,MinGW,VC++6,VC++2003,VC++2005全部落ちなかった。
>>386 >>389 このスレは個人を特定して考えを聞くスレじゃありません。
何偉そうに 〜〜(して)いただこう?なんて催促してんの?
さて、sizeofの2.0と2について、結果が8と4バイトということだったが
それはメモリの領域のサイズのことであって、しつこいようだけど
2.0そのものは定数だし「変数じゃない」ってことは理解しているんだろうか?
そして、2.0というように、小数点以下のある値を精度を落とさずに代入するには、
浮動小数があ使えるdouble型で宣言されたものにするのが適切
というのが言語の仕様や検証結果から分かることではないだろうか?
まぁ、こっちは変数の型のキャスト演算子と計算式の中の定数について
しっかり述べているのに、
>>386 >>389 みたいな疑問を抱く奴に
いちいち答えを強要される必要はないし、答えなきゃこいつは無知だの
勝手に言われてもかまわない。俺が知らないわけじゃないし。
問題は俺が最初に何の質問に対して答えたか?
そっちを理解できない奴が勝手に自分が疑問に思ったことを
いちいちつきつけられるスレじゃないし。そんな質問は
自分で言語の仕様を知って理解すべきだろ。
どこの学校言ってんだよ、こいつら?分からなきゃ誰かに教えてもらわなきゃ
やっていけない、学習能力のない痛いお子ちゃまですか?
>>398 なんか喋る前に、
>>385 に答えろ、馬鹿が
お前の脳内言語仕様はちらしの裏にでもメモしとけ
>>398 変数か定数かなんてことは誰も話題にしてないことに気づけよ。
>>349 >それについては、2.0が変数か定数かの方が論点になってるだろ・・・
その論点の発端となった、お前以外の発言番号を示せるものなら示してみろ。
402 :
デフォルトの名無しさん :2006/06/19(月) 15:20:12
>>353 とか悪質だな。8進数の数値計算の話じゃないのに
上の方で勝手に
>07って書いても10進数だって
とか言ったアホがいるから悪いんだろ。煽って荒らしているのはどっちだ?
そろそろ通報した方が良いな。ついでにどこの専門学校から書き込まれているか
調べてもらいたいね。
403 :
デフォルトの名無しさん :2006/06/19(月) 15:20:44
>>400 >答えろ
命令しても無駄。ここで出た質問に「確実に答えてもらえる」すれじゃありません。
そろそろうざいね、低レベルな低学歴って。
>>398 良くも悪くも周りがみんな自分と同レベルだと思わない方がいいよ。判っているとは思うけど。
405 :
デフォルトの名無しさん :2006/06/19(月) 15:23:10
>>401 >変数か定数かなんてことは誰も話題にしてないことに気づけよ
定数の型についてが最初の話題じゃないって気づけよ?
勝手に論点すり変えて、自分勝手な議論を持ち出すなよ?
こっちが理解していないみたいなことを言うが、自分で言語の仕様を理解して
適切に記述できないことを
露 呈 し な く て 良 い か ら さ ぁ 専 門 学 校 生 w
ついでに、2.0は定数だよ?人間の目でも小数点以下があることが分かるじゃん?
コンピュータもちゃんと8バイトで計算に使う数値を格納するメモリをとってるだろ?
それはsizeofで分かったろ?いい加減うざい。
本当に通報するね。悪質だよ、ここ。
>>404 >りがみんな自分と同レベルだと思わない
思ってないよ。初心者歓迎でしょ?少なくともこのスレで
屁理屈や理解していない議論を持ち出しているバカは低レベル。
そんな奴らにまともなソースはかけないのは分かっているし
いつまでもつまらん質問に答えようとも思わない。
が、バカはバカだときづかぜるきっかけを与えなきゃ、いつまでも社会のお荷物で困るんだよ
犯罪者になるなよ、低学歴
そろそろ出しとくか。 ヒント:頭のおかしい人は相手にしないようにしましょう ヒント:強度の学歴コンプレックスを持った人も相手にしないようにしましょう
それじゃ最後に、以下の定数で表される計算式を代入するさいに 精度が保たれる型の変数は何か? a = 1*0.5 b = 2+2 c = 2.5 + 1 さぁ、計算結果に応じて代入するabcの適切な型を宣言してください。 また、メモリの無駄な確保はしないように答えなさい(すべてdoubleは不適切とする) これくらいの問題に答えられなきゃ、お前ら小学生からやり直せ
規格書はここから見れる。見たことが無い人は読んでおくといいよ。
http://www.jisc.go.jp/ 「JIS検索」から規格番号 X3010でいわゆるC99、X3014でC++が見れる。
今言い合っている点に関してはC89からC99まで特に変化は無いはず。
411 :
デフォルトの名無しさん :2006/06/19(月) 15:35:19
>>385 の何を間違えだと言った?論点がズレてるね。
どう考えても2つめは計算の結果の 値 が等しいんであって
値として出された数値の型(精度)については考慮していない無意味な質問だよ。
>定数である
そうだよ?見て分かるじゃん。変数ってのは定まっていない値を入れるから
わざわざ何か値が入りますよって宣言してメモリを確保してんだから。
定数だけどdouble型とかは関係ない。double型って
浮動小数でしょ?2.0は固定小数だよ?頭大丈夫か・・・
既に浮動小数の表現についても過去ログにレスがあるけど?
123.45だったら1.2345 x 10^2って表したら浮動小数(double型)って思えと言うのか?ってのは
ご自由に解釈してください。少なくとも2.0は固定小数であってdouble型とは関係ない。
>等価である。
値が同じだからといって、変数の型まで不適切にして良いわけじゃない。
キャスト演算子についてもバグが報告されている。
最初っから数式が小数点以下も扱うもんだと分かったら
その計算式をの値を代入する変数の型はdoubleにしときゃ良いって話で終わるよ?
自分の目でそういう部分を判断できなきゃ、自分が適切なプログラムを作れなくて困るだけ
一生2.0が何型か?について議論してなさい。
とりあえず答えたけど?自分(質問者)はバカですが何か?って質問に対して
あ〜そうですね?って俺に答えさせただけだな。恥ずかしいね
本当に頭の弱い人って。お願いだから浅はかな考えで社会に出て
犯罪を犯さないでくれ。いつまでもあんたらみたいな「低俗な人間」に
入れ知恵をするつもりはないし、お前らもその程度じゃ賢くはなれんよ。
何でもかんでも答えてもらえる、自分の思った通りに答えない人は嫌いになる
みたいな感情まで持ち込んでどうすんだよ?プログラムは感情なんて当てにしてくれないぞw
>>406 わかっているならバカや低レベルや初心者にもわかりやすく書いてください。
バカは死んでも直らないと言う信念をお持ちであれば、
せめて低レベルや初心者だけでも相手してやってください。
>>411 >
>>385 の何を間違えだと言った?論点がズレてるね。
> どう考えても2つめは計算の結果の 値 が等しいんであって
ヒント:暗黙の型変換(キャスト)
C/C++的には「2.0」は浮動小数点数リテラルであって、それ以上でもそれ以下でもないと思うが。 つーか定数ってなに?
>>376 >ああ、これね。これが何か?変数じゃない値で
>メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
>コンピュータ側がやっていること
だったら、
>>242 の下のコードは全く問題ないね!
>>411 C/C++には“言語仕様上”、固定小数と言う概念は無い。
C/C++で数値を扱う型は数値型と分類されている。
数値型は整数型と浮動小数点数型に分かれる。
当然intは整数型、doubleは浮動小数点数型に分類される。
標準規格ではリテラル(お前の言う定数)がどんな型になるかも規定されている。(
>>410 から見てみろ)
それによればC/C++において2.0はdouble型になる。
俺が語っているのでは無い。規格書がそう語っているのだ。
>>414 > C/C++的には「2.0」は浮動小数点数リテラルであって、それ以上でもそれ以下でもないと思うが。
その通り。
> つーか定数ってなに?
リテラル(Literal)の和訳。
うお、コピペしたら、アンカー違うとこ指してるじゃん。 めんどくさいので訂正はしない。
>>405 変数の型についてが最初の話題じゃないって気づけよ?
勝手に論点すり変えて、自分勝手な議論を持ち出すなよ?
こっちが理解していないみたいなことを言うが、自分で言語の仕様を理解して
適切に記述できないことを
露 呈 し な く て 良 い か ら さ ぁ 専 門 学 校 生 w
>>417 定数と書くと、#defineやconst (C++)などによって名前を付けたものというイメージを持つ人が多いんだ。
>>411 C/C++において385の2つの式は、結果の型も同じ。
そういう規則だから。
>>413 >ヒント:暗黙の型変換(キャスト)
それがバグの原因だよ。もっと必要な文献に目を向けたらどうだ?
だから適切にキャスト演算子を使うか、最初っから計算結果を代入する型にあわせて
計算式の中に使う変数の型もあわせておいた方が良いってのが報告されてんだよ
>>421 だから?代入する型の変数をどうしたら良いか?って話になるなるだけじゃん。
まだわかってないな・・・精度の問題なのか、値が扱うメモリの領域の大きさがどうなのか?
議論をはっきりしろよ、おめぇ騒ぐだけで相手を無理に否定しようとしているだけじゃん。
相手がどうだろうと、言語を作った人が決めたルールや仕様書があんだろが?
ふつー、「const定数」とか「デファインした値」とか言わないか?俺の周りではそうだが。 それとコード中に出てくる数値リテラルなどのことは「直値」と言うな。 「リテラル」は対人コミュニケーションでは使わない。相手が理解できない場合があるからな。 自分が書く文章では使うが。
もう何がなんだか。そこで、 ヒント:頭のおかしい人の相手はしないようにしましょう
>>422 今はバグの話をしているのではないと俺は思っている。
暗黙の型変換によって385のBの2つの式は
同じ意味(結果の型・値、途中の計算過程など全てが等価)になると主張するだけだ。
>>423 俺が気付いていないうちに242のcがdoubleかfloatかの違いの話になっていた?
今まで俺はずっと代入式の右辺の部分(385のB)についてだけ話していると思っていたよ。
>>422 式1 : (double) (a+b)/2.0;
演算手順
1. a+b を演算
→a、b共にint型のためint型として演算
2. (a+b) の演算結果をdouble型にキャスト
3. [2の結果] / 2.0 を演算
→[2の結果]、2.0 共にdouble型のためdouble型として演算
式2 : (a+b)/2.0;
演算手順
1. a+b を演算
→a、b共にint型のためint型として演算
2. (a+b) の演算結果をdouble型にキャスト
→暗黙の型変換
3. [2の結果] / 2.0 を演算
→[2の結果]、2.0 共にdouble型のためdouble型として演算
君は「結果の値のみ」が等しいと言った。
しかし、C/C++の規格に沿って見ると、
手順も一緒であるが、どこがどう違うというのかね?
>>428 それだと式2の暗黙の型変換が行われるタイミングが勘違いされそう。
double型の値で割られるからdouble型へ暗黙の型変換がなされるという風に読み取れない。
castとtype conversionって同じ概念だっけか?
ヒント:C++には3つのキャスト演算子がある。
必死なのが複数湧くとこんなに伸びるのな。
>>432 あのねぇ、まずはどんなソースをつくりたかったのか説明するべきだろ。
>>432 適当にコピペしながらプロジェクトを作ったら、ちゃんとビルドできた。
引数としてファイル名が二つ必要みたいだったので、適当にファイルを作って動かしたら、
>***error ユニット番号が不適当(1 0 -858993460 -858993460)
と表示された。
で、何が聞きたいの?
シカト
439 :
432 :2006/06/19(月) 17:54:55
440 :
435 :2006/06/19(月) 18:00:08
>>439 アルゴリズムが正しいかどうかの判断は出来ないが、動かして出力を見ることだけはできるから、
引数に与えるファイル1、ファイル2をコードと同じ場所にアップしてくれ。
この流れになってから初めてこのスレ覗いたんですが、 引っ込みがつかなくなった約一名の狂態はこれ以上ないくらいくっきり浮き彫りなんで、 もう相手しなくていいと思いますよ。 こんだけログが揃えば、約一名様がいくらそれっぽく勝利宣言しても誰も騙せないでしょうし。
442 :
435 :2006/06/19(月) 18:16:38
>>439 の中身を読んで、ファイルを作って実行してみたところ、以下のような出力になった。
で、質問は?
[C:\temp\backpr\Debug] backpr data1.dat data2.dat
学習回数は? 5000
何回毎に収束を確認しますか? 500
学習パターンのファイル名は? learn.dat
回数 500 誤って認識したパターン数 4
回数 1000 誤って認識したパターン数 4
回数 1500 誤って認識したパターン数 4
回数 2000 誤って認識したパターン数 4
回数 2500 誤って認識したパターン数 3
回数 3000 誤って認識したパターン数 0
入力パターン 1 0.00 0.00
出力パターン(理想) 0.000
(実際) 0.087
入力パターン 2 0.00 1.00
出力パターン(理想) 1.000
(実際) 0.907
443 :
435 :2006/06/19(月) 18:19:04
ああ、リターンを押し続けるのね。結果はこうなった。動いてるんじゃないの? 内容はわからんが。 (略) 重み to 1 from 2 10.767 3 -4.905 4 4.892 to 2 from 3 6.506 4 -6.819 バイアス 1 -2.615 2 -3.678 未学習パターンの認識を行いますか?(=1:行う,=0:行わない) 0 [C:\temp\backpr\Debug]
>>432 メニューからプロジェクトの設定を選んで、デバッグタブに引数を書いてから実行する。
ファイルが見つからない場合は、ファイル名をフルパスで書くか、作業用のディレクトリに
ファイルがあるディレクトリ名を書く。
>>417 リテラルと定数は意味が違うだろう・・・。
まあ俺が正解を言うと Stroustrup: C++ Glossary constant - literal, object or value declared const, or enumerator. literal - notation for values of bool, character types, integer types, or floating-point types. See also: enumerators. TC++PL 4.2, 4.3.1, 4.4.1, 4.5.1, 5.2.2, D&E 11.2.1. つまりリテラル⊆定数
C/C++に限らなければ、定数でないリテラルも結構あるきがする。
>>448 このスレは
【初心者歓迎】C/C++室 Ver.28【環境依存OK】
C/C++質問室じゃなくて C/C++室ってところがうまいよなぁw
初心者は歓迎しても、理解力のない変な自称中級〜上級者はお断りだよ
452 :
デフォルトの名無しさん :2006/06/20(火) 00:35:49
質問です。 今度会社のコーディング規約で「//のコメント禁止」が入るらしい。 なぜかと聞くと「コメントの最後が日本語で「\」を含む場合継続行と見なされるから」 つまり下の例でb=2;が前の継続行と見なされてコメント扱いされてしまうからというのですが 本当でしょうか。 会社は組み込み系なのでCは今でも現役だし、コンパイラはCPUのメーカによって異なります。 VC++では大丈夫とかC99では採用済みとか以外の回答をお願いします。 例 int a,b; a=1;//○○可能 b=2;
>>452 全くの嘘ですが、波風立てたくないなら、おとなしく従いましょう
コンパイラが多バイトをキッチリ解釈できるなら問題なし 組み込み系ならASCIIのみというコンパイラもあるだろう そういう場合はヤバス
455 :
仕様書無しさん :2006/06/20(火) 00:44:14
>>452 コンパイラが日本語(2バイトコード)を含むソースに対応していなくて、
ソースがシフトJISで書かれている場合に限定される話だろ。
今時、そんなラベルの低いコンパイラは捨ててしまえ。サポートもロクに
期待できないだろう。あるいは、そんなコーディングルールを決めるような
会社はさっさと辞めたほうがいいかも。バカは伝染るぞ。
>>452 大学のLinux端末が少し前に更新されたがそれまではその問題があった。
結構有名な話なんで覚えておいても損はない。
>>452 全くの嘘ではありませんが、万に一つくらいの可能性でマルチバイトに対応していないコンパイラがあるかも知れません。
それを禁止するなら文字列リテラルの直接表記を禁止するとかコメント閉じの前にスペースは必須とかもコーディング規約に入れるべきだと思います。
ソースのエンコーディング指定できるようになった 3.4 より古い gcc なんて、 まだザラにあるんじゃないか?
>>457 組み込み系でマルチバイト文字を処理させるとは
考えにくいけどどうなんだろうね?教えれ
>>452
>>459 SJISでコメント入れたときの話だろ?
作成するプログラムでマルチバイト文字を扱うわけじゃない。
461 :
460 :2006/06/20(火) 00:55:09
ん?
>>457 へのレスならいいのか。
ごめん。アンカー見間違えてた。
>457にもあるが、//コメントは行末に必ずドットか何か置くことにすればいいと思うがねぇ。 #空白は拙いな。行末の空白を取り除く余計なお世話なエディタがあるし、毛嫌いする人もいる。
最近趣味でC++をはじめてみたのですが、 ウィンドウのデザインを変更する事はできるのでしょうか? よくフリーソフトでウィンドウのスキンを変更できるソフトあるじゃないですか。 私の場合はexeにした時点でウィンドウデザインを変更しておきたいのです。 ググっても載っていなかったので、 ご存知の方いらしゃいましたらアドバイスお願いします。
exeにした時点 とやらをもうちょいと明確に
俺のセブンセンシズは 「コンパイル時にウィンドウスタイルを変更したい」 だと語っている
>>464 あ、不明確ですみませんorz
ビルドする前にコード打つ段階でウィンドウスタイルを変更する
コードが打てるのか、もしくはコンパイラのフォームデザインから
変更できるのか分からないのですが、ビルドしてexe形式にして
配布できる状態になった状態の時点でデザインの変更をしておきたいのです。
普通ウィンドウズですと、タイトルバーが青くてフォームがグレーじゃないですか。
それを画像を用意して張りかえるか、コードで変更できるのか、もしくはできないのか
分からないので、現在もググりながら書き込んでます。
>>452 まぁそういう問題があるコンパイラなら、
a=1;/*○○可能*/
b=2;/*hoge*/
でもb=2はコメントアウトされてしまう(またはコンパイルエラー)から、気をつけとけ
>>466 ヒント: WM_NCHITTESTを処理せよ。
471 :
452 :2006/06/20(火) 04:09:00
皆さん、ありがとうございます。 ほとんど大丈夫だが、中には当てはまるコンパイラがあるかも知れないということですね。 コーディング規約に入れられたら反論できないわけですね。
>>471 「その規約だと>468の問題もありますよね」って突っ込んでみると面白いかもしれない。
>468ってなんか問題起こる? 行連結って行末の \ + 空白xn + 改行 でしか行われないような・・・ そもそもそんな構造のコンパイラがあったら"\"(0x5c)を含むコードが一切使えなくなる気が
>>473 "能"の次の*がエスケープされて、"*/"というコメント終端文字列とはみなされず、
次の行の終わりの"*/"までをコメントとみなしてしまうおそれがある。
そんなコンパイラ実在するのかw って言うかそんなの気にするぐらいなら コメント中の行連結文字を検出するツールでも 作った方がいい希ガス。
>>474 /* */ のコメント中にエスケープなんか効かないよ。
いや、エスケープ効くかどうかはコンパイラの自由なんじゃないか? まあ、実在するかは(´・ω・`)知らんがな
>>477 自由にしてたらコンパイラごとにソースの意味が変わっちゃうからダメだろ。
>>476 /* */の中はエスケープは効かないが、//の後ろは効くという主張?
>>479 改行のエスケープは規格で定められている。
日本語禁止でいいんじゃね? そういうプロジェクトいくつかあったよ
#include <stdio.h> #include <stdlib.h> #include <time.h> int myRand(int a) { return rand()%a+1; } int main(void) { srand( (unsigned)time(NULL) ); int a; printf("整数を入力\n"); scanf("%d", &a); printf("%d", myRand(a)); return 0; } このプログラムで、srand((unsigned)time(NULL));を書くとコンパイル時にエラーが出てしまうのですがなぜですか? まったく原因が分かりません。
行連結は翻訳段階2で行われるけど コメント処理は翻訳段階3だからねー。 規格合致処理系なら /\ *\ *\ /\ もコンパイルは通る。
>>475 日本語に対応してないコンパイラ(Cygwin の gcc とか)
ああ、* へのエスケープが効くかどうかは、今手元にないからシラネ。
>>483 Cでは、変数の宣言はブロックの先頭でなければならない。
関数呼び出しの後ろで宣言するな。
489 :
483 :2006/06/20(火) 12:32:29
エラー E2140 kadai10_2.c 13: ここでは宣言できない(関数 main) です
490 :
483 :2006/06/20(火) 12:34:42
>>488 ありがとうございます!
うまくいきました
>>485 それは確かに。
でもそういうコンパイラを使うプロジェクトなら
それこそ日本語禁止にしないと駄目だよな。
>>485 もう 3.4 になってるから、 -finput-charset 使えば問題なし。
494 :
432 :2006/06/20(火) 15:20:14
>>435 さん
おお、ありがとうございます!
それで、質問というのは
そのプログラムをVC++に入れてコンパイルしても、エラーが沢山出てしまって
動作してくれなくて困っています。
具体的にどういじって、どんなファイルを用意すれば良いのかなど、
ご教授してくれると有難いです・・・。
程度が低すぎて申し訳ない。
ひょっとして、 もしかして、 サンプルのtxtファイル自体をVCに食わせようとしてる? あと、単にエラー出たとか言われてもエスパーじゃないのでエラー内容は君にしかわからん
496 :
435 :2006/06/20(火) 15:50:26
497 :
435 :2006/06/20(火) 15:57:42
498 :
435 :2006/06/20(火) 16:04:22
つか、俺あのプログラム書いた本人がVCでビルドしようとして出来ないんだと思ってたよ。
void Kansu { ・ ・ ・ //抜けたい場所 ・ ・ ・ } whileやfor文ならbreakで抜けれますが、 returnを使わずに関数を途中で抜ける方法ってありますか?
関数を途中で抜けるのと、returnをすることの違いとは?
あ、returnって値を返さなきゃならないんですよね? もしかして値を返さなくてもreturnできるですか?
return を使う事と、関数を途中で抜ける事は等価なので、 質問自体が矛盾している。
ああ、returnの後ろに何も書かなければ値を返さなくても関数を抜けれるんですね。 何かつけないとダメと思ってました。ありがとうございます。
まあこの場合戻り値がvoidだしな。何かしら返す必要があるならダメ。 それか、gotoやら例外で飛ぶこともできる。前者の濫用はやるべきではないが。
>>503 たしかCだとvoid以外の関数でも戻り値をせずにreturnが使えるはずだから、
一応念のため言っておくけど、returnに戻り値を書かなくても済むのは、
戻り値の型がvoidである関数限定だと思っておきなさい。
引数を与えないでreturnした場合は何が戻り値になるんだろう。 たまたまEAXレジスタに入ってたゴミが返るとかそんな感じなのかな。 今まで考えたこともなかった。 関数を途中で抜けて、しかも戻り値を使わないような場合って ほとんどエラーが起こった状況だと思うんだけど、エラーが 起こったことがわかるように戻り値を返してやるのが親切かも。
VC++2005、bcc、gcc、ICCはeaxのゴミっぽい。
508 :
504 :2006/06/20(火) 22:28:45
うっかりしてたがgotoは同じ関数内のラベルにしか飛べないのでこの場合ダメだった この場合setjmpとlongjmpを使う。 つっても例外使った方がいいと思うけど
>>506 Cではたしか不定の値(ようするにごみ)が返ることになるんだったと思う。
(もしかしたら未定義だったかもしれない)
C++ではコンパイルエラー。
>>509 実装依存なので、律儀に0を返すコンパイラもあります。
0や1などの小さな整数しか入れない変数を定義する時、intにしないでcharを使ったほうが メモリが節約できると思うのですが、そうすると他人に理解しにくいというか、 間違ってると思われるでしょうか?
>>511 殆どメモリの節約にならないばかりか、最適化の妨げになるのでintで充分です。
質問です。 gettimeofday関数を使用して実行時間を計測したいのですが、 #include <sys/time.h> が見つかりません とエラーが出てgettimeofday関数を使用できません。 このファイルは普通どこにあるんでしょうか?? VisualStudio.NET2003使用。
そんなものはない。
>>513 落ち着いてどんな質問がしたいのかもう一度考えて。
gettimeofdayはlinuxの関数じゃない?
BSDにもあるぞな。 まあ、VCのライブラリには無いようなので適当に<time.h>includeしてclock()使うとか
man 2 gettimeofday (略) 準拠 SVr4, BSD 4.3
まあ、Windowsなら普通はGetTickCountとかQueryPerformanceCounterとか使う
521 :
432 :2006/06/21(水) 17:44:32
>>435 こんなにご丁寧に、親切教えて頂いて、
本当にありがとうございます!
アップして頂いたコードも落とさせて頂きました。
ビルドしたら、上手くいったのですが・・・
こんな事を聞くのも心苦しいのですが、
VC++で実行すると、***error 入力データファイルを指定してください。
と出ます。
435さんが教えてくださった通り、data1.dat、data2.datというファイルを作り、
中に制御データ、構造データを入れるところまではやったのですが
ここから起動する、というのがよく分からないです・・。
ここまで親切に教えてくださいましたし、あまり甘えるのもアレかと思うのですが
もし宜しければ、起動の方法を教えてください。
VCから直接動かそうとしているなら、
>>444 。
そうじゃないなら、[Windowsキー]+Rで、cmdと入力して、exeがあるところまでcdしてから
>>442
523 :
432 :2006/06/21(水) 22:58:59
>>522 さん
出来ました!
ありがとうございました!
>>444 さん、
>>435 さん
お世話になりました!
特に435さんは、とても丁寧ににして頂いてとても感謝しています。
素人の程度の低い質問に答えてくださり、
皆様本当にありがとうございました!
>>523 まぁ全部の発言が俺なわけだが・・・。
なんにせよ、よかった。いろいろ頑張れよ。
STL の情報が網羅されている(出来れば)日本語のサイトが見たいのですが、 std::deque std::list を使うか、 std::vector を使うかで迷っているのですが、 1. 二つのコンテナをつなげて一つのコンテナにする 2. 末尾に要素を追加 3. 先頭から要素を取り出して、削除する 4. 要素の数を取得する という4つの操作しかしないのですが、std::listの方が速いですか?
>>526 日本語でどうぞ。
つーか、文章は完結させましょう。
528 :
526 :2006/06/22(木) 00:48:21
すいません。 書く内容を纏めている途中で送信してしまいました。 でも大体書きたいことは伝わったかなと思います。よろしくお願いします。
>>526 短く言うと、std::dequeは大抵は お そ い と知っておいてくれ。
std::list<>::size()はcomplexityが…と思って調べたらconstantなのね。
enumって、前方参照宣言できないんでしたっけ? 次のプログラムのコンパイルが通らない... ---ファイル:bigger.h enum e_bigger_t { MEGUMI, HOSHINO, SAAYA }; ---ファイル:momu.h enum e_bigger_t; void momu( e_bigger_t eb ); ---ファイル:momu.cpp #include "momu.h" #include "bigger.h" void momu( e_bigger_t eb ) { // なんか処理 } $ g++ momu.cpp ってやると momu.h:1: error: use of enum `e_bigger_t' without previous declaration 「e_bigger_tってなんだよ?」って... つか、e_bigger_tは列挙体だよ、って、そこで教えてるのに...
浅はかな素人思考だな。何もわかっていない。
という内容の指摘を素人でも書ける言葉だけでまとめるのは ギャグでやってるのかなw
浅はかな素人ギャグだな。何も笑えない。
>>532 結論を言えば、ダメ。
enumは不完全型として認められていない。
>>536 さんきゅ!
VC++ではできたように思ったんだが勘違いか、
VC++独自の仕様なんだろうなあ。
ありがと。
539 :
432 :2006/06/22(木) 11:19:02
>>524 さん
ああ、そうだったのですか、失礼しました。
はい、頑張ります!
本当にありがとうございました!
>>540 ほんとだ。
でも constant と要求されてるわけじゃないから、 constant とも言い切れないな。
困った規格だ。
542 :
デフォルトの名無しさん :2006/06/22(木) 12:08:47
class A { public: void f() const {} void f() {} }; 定義がconstの有無だけのオーバーロード?関数はどうやって呼び出しを区別するのですか? こういう定義をする意味もよく分かりません。 どういった場合に使われるのか良ければ教えてください。
>.542 A a; A const ca; a.f(); // こっちは const 付いてない f() ca.f(); // こっちは const 付いてる f() コンテナの operator [] とか、オブジェクトの中身への参照を返すときに 戻り値の型にも const を使い分けてよく使われる。
545 :
デフォルトの名無しさん :2006/06/22(木) 14:01:34
WAVEファイルの取り込みってどんなプログラム書けばいいんですか? ここ2ヶ月そのことしか考えてません。
>>543 確かthisにconstが付くんだっけ。typeidで表示されてみればいいか?
理由が分からん('A`) #include <stdio.h> #include <stdlib.h> typedef union { double a; unsigned char b[8]; } D8; double swap(D8 s) { return (double)((s.b[0] << 56) |(s.b[1] << 48) | (s.b[2] << 40) |(s.b[3] << 32) | (s.b[4] << 24) |(s.b[5] << 16) | (s.b[6] << 8) |(s.b[7])); } int main() { D8 a; int i; a.a = 0.0; a.a = swap(a); printf("%g\n", a.a); } gcc ttt.c ttt.c: In function [minomura@mozart07 minomura]$ ttt.c:10: warning: left shift count width of type ttt.c:11: warning: left shift count width of type ttt.c:12: warning: left shift count width of type ttt.c:13: warning: left shift count width of type
s.b[0] << 56 で s.b[0] の型は 56bit長もねーよ と言ってる 56bit以上の整数型 (仮に T としよう)でキャストの後ビットシフトすれ ((T)s.b[0]) << 56
>>548 むしろ、藻前が何をしたいのかがわからん。
エスパー typedef union { unsigned long long a; unsigned char b[8]; } D8; unsigned long long swap(D8 s) { int i; D8 tmp; for(i=0;i<8;i++) tmp.b[i] = s.b[8-1-i]; return tmp.a; }
552 :
デフォルトの名無しさん :2006/06/22(木) 22:13:45
スレ違いだったらごめんなさい。 C言語のプログラミングをマスターするために来週から練習します。 プログラムを打つのは初心者です C言語を覚えたら、javaなどやろうと考えています OS:XP h 今後のことを考えて、お勧めの市販ソフト又はフリーソフトは何がいいんですか? ご指導お願いします
554 :
531 :2006/06/22(木) 22:49:23
>>538 ,540
あ、たしかにshouldだった。shallと勘違いしていた。スマン
555 :
デフォルトの名無しさん :2006/06/22(木) 23:02:52
>>553 即レスありがとうございます
これはCとC++がやれるソフトでOKですか?
>>555 そりゃ、CもC++もできるけど、高いよー。
プログラマでメシを食う覚悟があるならどうぞ。
単に趣味とか学校の単位のためとかならとりあえずタダのBorlandで。
>>556 アカデミックなら4800円。
MSの青田刈りもここまで来たかという感じがする。
あとcygwin-gcc
VC++でWindowsアプリケーションを作ってるとログ出力機能を持たせることが多いです。 で、そのログ出力の内容を外部からhookさせる方法やソフトはないでしょうか? ログ出力機能を持った既存のアプリの変更は無しが嬉しいです。 ようするにログの内容を別窓で見たいのです。
563 :
デフォルトの名無しさん :2006/06/23(金) 00:53:25
この動きがいまいち理解できません。 class TestBase { public: print() { std::cout << "TestBase" << std::endl; } }; class TestSub : public TestBase { public: print() { std::cout << "TestSub" << std::endl;} }; これで、TestBase* testBase = new TestSub; testBase->print() をすると、TestBaseが呼ばれます。 で、TestBaseのprintにvirtualをつけると、TestSubが呼ばれます。 この動きが良くわかりません。 わかりやすく教えてください。
>>563 printがTestBase、TestSubのどちらが呼ばれるかは
printがvirtualでないとき静的に決まり、virtualだと動的に決まる。
つまりこの場合静的と言うと、ソースコード上testBaseの型がTestBaseだからTestBase::printが呼ばれるということ。
動的と言うのは、printを呼ぶときにTestBaseへのポインタから呼び出そうとも、
newして作られたのはTestSubだから、TestSub::printが呼ばれるということ。
C++使用で、厳しく求められる安全性とソースの共有の上で ・TCHAR [](固定長) による文字列とその処理 ・(STL)std::basic_string<TCHAR> による文字列とその処理 ・(MFC)CString による文字列とその処理 について考えているのですが、 C++でも文字列変数にTCHAR[]が多いのはなぜでしょうか? 安全性の要求があってもbasic_stringなどでなくTCHAR[](固定長)を使うのは なにか理由があるのでしょうか?
単純に、安全性が確保できているなら固定長配列でも問題ないと思う。
>>565 WinAPIの引数がTCHARだからじゃない?
CStringはともかく、std::stringを使わない積極的理由は思いつかない。
>>564 回答ありがとうございます。
静的か動的かということですか。
なれないと難しい動きですね。
ありがとうございました。
>>563 デストラクタに virtualがついているのも同じ理由。
動的にデストラクタを呼び出す為。
覚えると何かと便利だ。
>>563 TestBase*と宣言しているから、生成したのはTestSubでも
virtualをつけなければ、単純にTestBase::print() が呼ばれる。
virtualをつけても実はTestBaseのメソッドしかアクセスできない。
virtualの場合、TestBase内にTestBase::print() 関数への
ポインタ変数が作られる。
そして、TestSubで生成するとTestBase内のこのポインタに
TestSub::print() へのアドレスが格納される。
TestBase::
virtual print() ← 実は関数へのポインタ
print() ←TestBase::print() の実体 ↑
|
|
TestSub:: |
print() ←TestSub::print() の実体 ---+
TestSubの生成時にポインタをセット
>>563 というか、そのコードというか考え方そのものがあまりよくない。
virtualを付ける/付けないで動きが違う理由は、上記の通りだけどね。
もう一度、継承する意味と多態性について勉強したほうがいいと思う。
あ、書き忘れた。 ベースクラスの関数を隠蔽してしまう(上書きしてしまう)ような関数定義は、あまりよくないってこと。
>>572 それには漏れは全く同意しない。ケースバイケースですらなく、1%も。
virtual を付けてオーバーライドして動作を変えることを「あまりよくない」とする 理由が(オブジェクト指向を知らない人が混乱すること以外)存在しないし、 ふつうにポリモするときにはこれは必須。 virtual をつけずに(誤って)隠ぺいしてしまうことの問題は、昔からある一般的な シンボルの衝突の問題であって、派生だ基底だという問題ではないから。 これは単に「関数名はよく考えてつけよう」という話。 virtual をつけずに意図して隠ぺいするのはテンプレート等メンバのシグネチャレベル でのインタフェイスを維持するときに便利だし。 「確かにこれは悪い」っていう例がこれらの利点を打ち消すほどたくさんあれば、 考えを変えるけど。
>>575 まぁ考え方の違いなんだろうけど、言語的に便利な場面で意図的に隠蔽するような
関数定義をするのは全く問題ないけど、多態性という文脈で考えたときに、どちらが
呼ばれるか混乱するという意味で、俺は隠蔽するのは良くないと思う。
一般的なシンボルの衝突、と言ってしまえばその通りかもしれないけど、オブジェクトに
よって同一のメッセージ(という単語を出すと荒れるような気がするが)に対して異なる
振る舞いをするというのが多態性の基本的な考え方なので、そうクールに切り捨てて
いい問題とは思わない。
577 :
デフォルトの名無しさん :2006/06/23(金) 15:59:12
//N=50で落ちるのはバグの性だったようです。これならN=100でも落ちない。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15 void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)*p = rand() % 2; } void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)return; block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); } void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);paint(block, i,N-1); } } int main(){int block[N][N], *p, i = 1;srand(time(NULL));get_randam(block);make_ans(block);for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){ switch(*p){case 0: printf(" 1"); break; case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break; }if(i % N == 0) putchar('\n'); } return 0;} 上のソースは、宿題レスでだいぶ前に俺が適当に問題提示してみた問題の答え(どなたかが答えたソースです) -**-** -*-*-* *-**** **---- の*で囲まれてる所をすべて別の文字に埋めるっていう問題 で、問題出しただけで答えは自分自身わからなかったのですが この答えのソース見てもどうやって、再帰つかって探索してるのかが いったいどうやったらこういうのを思いつけるのかがわからないです。 センスもあるんでしょうが、パズルの解法とかの関連ページ見ても わからずで。 どういう風に、再帰さして結果を出してるのか。 ヒントか、参考になるページとかあれば、どなたか教えてください。
578 :
576 :2006/06/23(金) 16:00:48
例えば
>>563 のコードでは、
・printを多態する(俺造語)関数であると設計するなら、初めからvirtualを付けとけ
・printを多態しない関数であると設計するなら、継承したクラスではその関数名は使うな
(似たような処理をする関数を作りたければ、別の名前にしろ)
また別の側面から考えると、あるクラスライブラリを使うということを考えたときに、
「隠蔽された関数がいたるところに散らばっている」というライブラリの場合、
使いたいクラスの規定クラスまでさかのぼって、多態という文脈でその関数を
使ってよいかどうか調べなければならなくなるかもしれないというようなことも
起こりえる。
579 :
576 :2006/06/23(金) 16:13:48
付け加えておくけど、以上はC++に限った話で、他言語だと全く違うこともあるからね。
>>578 まぁ昔はそうだったわけだけど、WTLなんかにあるようなテンプレートベースの
クラスライブラリだと virtual なしで関数シグネチャ一致でポリモするってのは
便利に使われてるわけで・・・
たとえば(単純すぎて有効性が示せてない例かもしれないけど)
template class<T> void Log(const T& o) { o.print(); }
なんてのを使いたいとき。
Java とか C# なら
>>579 には賛成します。
581 :
576 :2006/06/23(金) 16:52:46
>>580 俺はただ「1%も同意しない」にひっかかってるだけなんだけど、その「便利な場合」以外においても
C++では
>>576 ,
>>578 には全く同意できないということですか?
うーん、まぁそういう考えの人もいるってことはわかりました。(あなたにとっては俺のような奴が
いるってことがわかったんでしょうが)
582 :
576 :2006/06/23(金) 17:01:30
ちなみにRubyでは、振る舞いを変える場合は単にメソッドを定義するだけであって、 呼び出される文脈でどれが呼ばれるかが変わるいうことはありません。 こっちの方が自然だと思う。
>>565 今のところ、標準規格においてstd::basic_stringは要素がメモリ上で連続している保障がないから、
APIにバッファとして渡せないという影響も大きいと思う。(読み取りだけなら勿論c_strがあるけどね)
その点CStringはGetBufferなど、如何にもAPIにバッファとして渡すことを考慮されている分便利。
ちなみにCString以外でWindows APIにバッファとして渡すのに使えるものとしては、
std::vector<TCHAR>とか(std::vectorは要素がメモリ上連続している保障がある)、
new[]してboost::scoped_array, shared_arrayとかがある。
>>581 主義の違いでよいような気もするけれども、質問風の文章なので一応返事してみます。
CBase::print() // オブジェクトの内部状態を表示
CDerived::print() // オブジェクトの内部状態を表示
なんていう2つの関数は同じ名前でよいと(強く)思うわけです。
CBase::basePrint() // オブジェクトの内部状態を表示
CDerived::derivedPrint() // オブジェクトの内部状態を表示
とするのは馬鹿げてると(これまた強く)思うから。
でまぁ、virtual の有無で動作が変わるからポインタベースでのポリモに使えるか
どうかわからんってのは・・・ドキュメント化するしかないでしょうね。
関数名を変えておけば使えないことは明らかなのでウマー!ってのは・・・アリなのかなぁ。
デストラクタとかは関数名変えようがないわけだし・・・
585 :
576 :2006/06/23(金) 17:52:59
>>584 うーん、主義の違いとしか言えないということかな。
>なんていう2つの関数は同じ名前でよいと(強く)思うわけです。
全く同意。ただ俺の場合はCBase::print()をvirtualにします。
俺の主義では、CBaseもCDerivedもprintに反応するなら、CFoo : CBaseも、
CBar : CDerivedもprintに反応するのが自然だと本能的に思うわけです。
どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
しとけって思うんですね。
つまり、親クラスがprintに反応するのに子クラスが反応しないのはOOに
反していると感じるわけです。
やっぱり、主義の違いってことかな・・・。
>>573 馬鹿じゃないの?どう考えても、メンバ関数の隠蔽は、最悪ケースバイケースでそれはオッケーてな感じだろ。
いちいちそんなことされた日にやコンテナ入れるのも迷うわい。可読性とユーザビリティが著しく阻害される。
つか、純粋仮想関数使え。あ、こりゃ仮想だからNGなのかw
>>586 能無しが無理して割り込まなくていいですよ。
>>585 >どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
>しとけって思うんですね。
virtual にしなくても反応はするでしょう。ふつうに継承して。
virtual の有無での差はポインタ経由で呼び出すときの違いだけ。
>>587 なにか具体的な例あげて批判してくれるとわかりやすいんだけど。
っていうかみんななんでそんなに仮想関数好きなの?
漏れは純粋仮想関数以外はあんまり使わないけどなぁ。
>>590 つまりC++の継承とポリモーフィズムの仕組みを真っ向から否定する、ということだね
ポインタ経由でとか言っちゃう時点でお国が知れるってもんだ。
593 :
576 :2006/06/23(金) 22:32:28
>>590 うーん、なんだかもっと話がかみ合わなくなってきた気がするので、これを
最後にします。
>virtual にしなくても反応はするでしょう。ふつうに継承して。
え?そういう話だったんですか?
もともとあるクラスツリーに属するクラスでは全てprintに反応するのだが、
それぞれで実装が違うけど、virtualはお勧めしないって話では?
なぜvirtualを付けることに1%も同意できないのか良く分からなくなって
きました。
とはいうものの、実はC++の場合、俺も将来を見越してvirtualを付けておく
というのは(オーバーライドされることを考えておくというのは)、ほんの少し
違和感があります。前述のRubyの例が自然だと考えてるわけで・・・。
ただひとつ言えることは、言語仕様的にvirtualを付ける/付けないでこの
ように振る舞いがかわるからこうしろ、ということではなく、多態性を使う
のであれば仮想関数にしておくのがC++の流儀である、という認識は
多分どのように説得されても変わることはないと思います。
ではでは。
594 :
576 :2006/06/23(金) 22:35:19
s/それぞれで実装が違うけど/それぞれで実装が異なることがわかっていても/
またこのスレ伸びてると思ったらこんなんかよ 前のよりマシだけど
馬鹿ほど饒舌なんだよ。 利口な人間は己に欠落を見つけ次第黙々と勉強する。だから利口になる。 馬鹿はそこで間違った自分の正しさを延々と説いて回る。だから馬鹿。
>>577 ・どこまで理解できていて、何が理解できていないのか明確にせよ。
・デバッガを使ってどのような動作するのか調査する。
・printfなどを使って途中経過がわかるようにする。
、、and so on
ほら来た。逆ギレも馬鹿の特徴のひとつ。
俺の予想:こいつは2.0の奴だ
逆ギレの使い方間違ってますよw
俺の予想:JUnitスレで暴れてた奴
俺の予想:宿題スレで暴れてる奴
何かインクリメントするとき、例えば data[number] = a; number++; と書くのと、 data[number++] = a; と書くのでは、では客観的にどっちのほうが良いでしょうか?
後者
後者の方がスッキリしててわかりやすさも失われていないから
インクリメントするためだから前者に決まっとる。 後者はnumberのインクリメントのためにdata[]のインデックスとして使いaを代入する冗長なコード。
(何でここはすぐ論争が始じまるのだろう…) (プログラミング手法の好みって宗教と似てる所があるな)
インクリメントするとき≠インクリメントするため 馬鹿ですか?
まあ、そう荒れるなよ。ネタをネタと(ry
見間違えることくらいよくあることだろ
ネタリスト 1.インクリメントだけする時、++i; と i++; のどっちがいい? 2.無限ループは、while(true) while(1) for(;;) ? 3.エラー処理へのgoto はOK? 4.関数の入口でチェックしてreturn はOK? 5.ステータスを返す時は、必ず戻り値で返した方が良い ? 6.正常値は 0 にすべき? …まだまだありそうw
1.現代では関係ない。大昔のコンパイラではベンチが変わった。 2.現代では関係ない。 3.gotoでなくthrowが正しい 4.ぜんぜんOK、それを排除するとthrowも書けない 6.Cのライブラリにそういう関数が多いから合わせたほうが良いでしょう。
無駄なメモリの消費やら、計算時間がやたらと掛かる効率の悪いアルゴリズムでなく どっちを書いても処理の流れが同じなら、パッと見て把握しやすい 見やすい方を選べば良い。そしてその見やすいの基準は自分で良いんじゃね? 誰かにいちいちケチつけられても始まらないし そもそも市販の本をいくつか見たことある人なら そんな細かいことを気にしないんでは? 人それぞれだし、思想の自由まである国で生きていることを実感した方が良いよ?
>614 例外のないCの場合は?
>そしてその見やすいの基準は自分で良いんじゃね? まあ、ソースを自分しか見ないのであれば。
何かと人の意見にいちいちけちつけるよな、ここ。 自分の視野が狭く観点が甘いことに気づいた方が良いよ。 無理に相手を理解しない、自分を理解させない。 意見を押し付けない、気に入らない意見ならスルーすりゃ良い。 ただ、誰かが自分の気に入らないことを言っていると思う前に 言っていることが「事実」かどうかは自分で判別する能力を身に着けた方が良いよ。 所詮、他人の意見なんざそいつの価値観による判断でもあるんだろうし。 何も相手が自分が嫌いな食べ物を好き好んでいたって良いじゃん。 嫌うなら食べ物だけにして、食べる人まで嫌うこたぁ〜ないだろ?
こいつ2.0野郎に確定した。
++i; と i++; の問題は、少々根が深いですよ。 Cの黎明期に、実はCが環境依存というか プロセッサ依存していた名残ですね。
622 :
613 :2006/06/24(土) 04:35:00
>>620 全然ちがうと思うよ。
怒ってると言うよりあきれてる雰囲気だものw
俺もちょっとあきれてるww
>>622 いったい何にあきれてるんだ?
このスレでは2.0問題以降、平和なもんだが。
7.仮引数として配列を渡す場合、void func(int num[]); と void func(int *num); どっちがいい?
何だかわからんが、必死な奴がいるな
1. C++のイテレータでは基本的に前置使うから、どちらでもよいときにはiでもなんでも前置にする。 6. WindowsのGetLastError()/HRESULTなどのように複数の意味を持たせる場合には、 逆に0を成功値にするというのもありだとは思う。 7. void func(int* num, size_t size); 或いは template<typename RandomAccesIter> void func(RandomAccesIterIter first, RandomAccesIterIter last); あとRange版もあればなおよしか。
┏┳┳┓ ┏┳┳┓ ┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓ ┃┃┃┃┣┓ ここまで.┏┫┃┃┃┃ ┃ ┃┃┏━━━┓┃┃ ┃ ┃スレ違い ┣┫ ・∀・ ┣┫ END ┃ ┗━━━━┛┗┳━┳┛┗━━━━┛ ┏┻┓┃ ┏━┛ ┣┻┓ ┗━━━┫ ┗━┓ ┗━━━┛
何だかわからんが、スレ違いではないんじゃないか?
初心者向きではないわなw
>>615 =
>>619 君、2ちゃんに向いてないと思うよ。
来なけりゃ腹も立たないし。
Yahooや@ITの掲示板がいいんじゃないかな。マナーいいらしいよ。
char *a; a="test"; このソースコードに悪い点はありますか?
ない。
あるよ
634 :
631 :2006/06/24(土) 14:32:23
ほれ char *a = "test";
8.ローカル変数の定義はブロックの先頭に限る?
>>634 ないよ。
まぁ固定文字列を代入するのなら
char *a = "test";
って書けという奴はいるかもしれんがな。(俺もこう書く)
>>636 君なんでそんなに必死なの?
君が振る話題って、手垢が付きまくったもので面白みに欠けるんだけど。
相手してほしけりゃ、もっとましなネタ振って下さいね。
639 :
631 :2006/06/24(土) 14:38:12
char *a; a="test1"; (aを表示) a="test2"; (bを表示) ではこんな使い方も、あながち間違いではないということでしょうか?
640 :
631 :2006/06/24(土) 14:38:45
ミス char *a; a="test1"; (aを表示) a="test2"; (aを表示)
>>639 全く問題ない。
(コードの最適化はできるだろうが)
特に問題は無いが。
643 :
631 :2006/06/24(土) 14:52:08
有難うございます。
>>638 手垢が付きまくって面白みに欠けるリストを作ってるんだがw
余計だったかな? 失礼しやしたw
>>644 別にいいんじゃないの?気にせず続けなよ。
>>641 括弧の中を詳しく。
>>640 間違いではないが、括弧の中が関数呼び出しなら
a = "test1";
disp(a);
ではなく
disp("test2");
の方が見通しはよさそうだね。
文字列定数をポイントするなら、 const char* a; a = "test1"; のほうが好ましいと思う。
面白くないよ。
constってなんですか?
調べるより先に質問する奴は進歩しない
釣られまくりですな
質問しに来たら、丁度文字列の質問があってどうしようかと悩む俺。
謎1 Hoge() { char ch[10] = "hoge"; return 謎2 } int main() { char str[10] = "test"; str = Hoge(); printf("%s",str); return 0; } 関数Hoge()で処理した ch の文字配列を 呼び出し元の str へ入れようとした時に 謎1・2はどんな風に書けばいいのでしょうか。
>>653 void Hoge( char* forRet ) {
char ch[10] = "hoge";
strcpy( forRet, ch );
}
int main() {
char str[10] = "test";
Hoge( str );
printf("%s",str );
return 0;
}
どうしても返り値でやりたいんなら struct buf_wrap { char buf[10]; } struct buf_wrap Hoge() { struct buf_wrap r; strcpy( r.buf, "hoge" ); } int main() { struct buf_wrap l; l = Hoge(); printf( "%s", l.buf ); } スタックをたくさん消費するし、 そんなに簡潔な感じもしないのであんまりお薦めしない。
656 :
653 :2006/06/24(土) 17:02:23
>>647 についてわからないのですが、
宣言時に初期化せずにconstした場合、そのとき
aのメモリ位置に元から入っている未知のビットが
aの定数として固定されるのではなく、
後から代入が可能なのですか?
>657 const char *a; と char * const b; の違い。
659 :
@゚ν゚)ニホンゴムズカスィネー ◆FIgVQJjZb6 :2006/06/24(土) 17:23:53
コンパイラで初心者でも使いやすいのを教えてください
660 :
デフォルトの名無しさん :2006/06/24(土) 17:31:08
質問があります。ウィンドウプログラムでツールバーを作成しました。 しかし画面を最大化するとツールバーが消えてしまいます。 ウィンドウのサイズが変更になったときの処理 WM_SIZE: SendMessage(hTool、TB_AUTOSIZE、0、0) もして、ツールバーにメッセージをおくっているのですが直りません。 どうしたらいいですか?
>>659 初心者にもいろいろあるし好みもあるから、一概にこれというのは決められない。
自分で試して使いやすいのを選べ。
662 :
デフォルトの名無しさん :2006/06/24(土) 18:10:44
初心者の質問ですいません。 純粋仮想関数の存在意味がわかりません。 仮想関数でも十分な気がするんですが。
>>662 ・派生クラスにオーバーライドを強制できる
・純粋仮想関数があるクラスはインスタンス化できなくなる
664 :
デフォルトの名無しさん :2006/06/24(土) 18:27:16
初心者質問です。 gccでコンパイルしたライブラリーはiccからリンクすることは 可能なのでしょうか? よろしくお願いします。
>>664 Windows版iccはリンカにMSのLink.exeを使うんじゃなかったかな。gccはどうだっけ?
Linux版はgccでコンパイルしたと思われるライブラリを使っているから大丈夫っぽい。
#但し、C++は無理。
666 :
デフォルトの名無しさん :2006/06/24(土) 19:21:07
LSI使ってるんですが、「Division by 0」というエラーが出ます これはどういう意味なんでしょうか
667 :
デフォルトの名無しさん :2006/06/24(土) 19:21:20
>>662 インターフェースのみのクラスを定義できる。
派生クラスにインターフェースを確実に継承させられる
(インターフェースの保証ができる)
確実に実装させられる。だな。
669 :
デフォルトの名無しさん :2006/06/24(土) 19:33:15
671 :
デフォルトの名無しさん :2006/06/24(土) 19:35:33
>671 というかそのまま書いてあるんだから読めよ
だから今時LSI-Cなんか使うなよ。
674 :
デフォルトの名無しさん :2006/06/24(土) 21:46:27
#include<iostream.h> int count=0; int main(void){ while(1){ cout<<count; } } これをコンパイルしようとすると 「E2015'count'とSTL::count(略)の区別が曖昧」ってエラーでて、 countを別の変数に変えると通るのはどうして?
>>674 obsoleteなC++コンパイラは窓から投げ捨てろ。
>>675 よくわかんないけどBCC6ってポンコツなのか
まて、bcc5.5.1ならエラーにならないぞ!
iostream,h はもうやめとけよ
>>676 BCCはもう5.8.2になってるから。5.6.4とかだろ?あれは失敗作と言われている。
STLportなんぞを無理に取り込もうとするからnamespace周りでバグだらけ。
5.8.2も良いとは言えないが、Dinkumwareなので上のようなエラーにはならない。
BCCってSTL変わりまくってんだな。昔はRougeWaveだったと思ったが
Borland c++ Builder6 ≠ BCC6? ちょっと勘違いしてるかもしれない。
MSNメッセのメンバーのIPアドレスを知る方法ってありますか? ネットなプログラムを書こうとしてるんだけど、お互いが固定ではないIP の場合、相手のIPを知る必要がありますよね。手動で相手のIPを入力する のは手間だし、メッセのデータを使えると便利かなぁとか。
あ、すみません、ネットワークのスレあったんでそっちに行きます^^;
// gcc3.4.3arm // extern unsigned int *data; // srcにdata[0]が代入される // extern unsigned int data[]; // 意図通りに動く void hoge() { void *src, *dst; src = data; dst = malloc(1024); memcpy(dst, src, 1024); } ポインタと配列で混乱中なんだけど誰か講釈してくれ
ポインタと配列ではなく、ポインタを理解していないと思われます
やりたい事は strdup() なわけ?
>>685 unsigned int dataについてもっとくやしく語ってください。
gccとvs2005で for(i=0;i<100;i++){ fprintf(stderr, "%s\n", strerror(i)); } こんなの実行してみて出力結果を眺めていたんですけど、 strerr(17);だと vs2005 :Block device required cygwin :Unknown error でエラー内容が違っていたりします。 別にエラーとして出力される内容が違っているのは問題ないんですが、 c言語では、エラーが起きるかもしれない標準関数を実行し、エラーが 起きた場合のエラー定数ってマクロ定義されていないんでしょうか? もしも、マクロ定義されている場合、どこを調べるといいんでしょうか?
>>690 ほんとにcygwinでerrno=17がそのエラーか?
ってのは置いといて、<errno.h>を見ればわかる。もちろんerrno.hが何かを
インクルードしてたら、それも見るんだぞ。
cygwinの場合は、/usr/include/errno.hだ。
692 :
685 :2006/06/25(日) 00:13:27
>>689 別ファイルでグローバル変数として初期化してます。
unsigned int data[] = {1,2,3,4,以下省略};
>>690 ANSI-CではEDOMとERANGEが決まってる
それ以外はPOSIXとかX/OPENとかなんかでも決まりがある
はっきり言って統一されていないが、過去の互換性とかあるので仕方が無い
ポインタは配列じゃないもんよ。
695 :
689 :2006/06/25(日) 00:41:59
>>685 んなら挙動は同じ。
src[0]でけでなくsrc[1]も見てみな。デバガでメモリを参照するといい。
>>686 の言うとおりポインタを理解していないと思われる。
「配列はポインタのシンタックスシュガーなんだよ!」
こう語れるぐらい勉強してください。
error = 15でした。 マクロ定義だけでも統一してくれればいいのに・・・ コンパイラ屋はマクロ定義をマクロ定義すればいいだけだからそんなに手間はかからないだろうに。 エラー処理は移植性を考慮できないじゃん。
>>695 > 「配列はポインタのシンタックスシュガーなんだよ!」
それだとポインタがあれば配列が必要ないような言い方だが、
配列なしにはメモリ上で連続したオブジェクトの集合を表現できないよ。
シューガーベーィビらーぶ
699 :
660 :2006/06/25(日) 01:23:54
事故解決しました。
700 :
デフォルトの名無しさん :2006/06/25(日) 01:29:30
配列があればポインタは必要ない
どっちもイラネ
702 :
685 :2006/06/25(日) 02:08:50
-- abc.c -- int data_ary[] = {1,2,3,4}; int data_ptr[] = {5,6,7,8}; -- xyz.c --- extern int *data_ptr; extern int data_ary[]; int *src; int ary[] = {9,10,11,12}; src = ary; // こういう書き方が出来るので src = data_ptr; // これもOKだと思ってた src = data_ary; // こっちはOK 解決できました。 みなさんありがとうございました。
関数から配列とその要素数の二つの戻り値をとりたくて、 複数の戻り値を返すには仮引数を使うところは分かったんですが…。 void func(int **array, int *number); int main(void) { int *array, number; func(&array, &number); (処理...) return 0; } void func(int **array, int *number) { int data[50], data_number; (処理...) *array = data; *number = data_number; } 配列を返したい時に、これでいいのかちょっと自信がありません。 コンパイラは通るので間違ってはいないと思うのですが、なにか改良点などあるでしょうか?
>>703 初心者がよくやる間違い。
関数から抜けた時点ですでに開放されている領域(スタック上に確保された配列)を
ポイントしているので、領域内のデータは保証されない。
705 :
703 :2006/06/25(日) 03:34:55
あー…。 ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか? static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
C++でstd::vectorを使う。
>>705 > あー…。
> ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
そうです。
> static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
ある。
解りやすさ考えたら配列のポインタにした方が良いんじゃない? と斜め上の回答もしてみる
709 :
デフォルトの名無しさん :2006/06/25(日) 13:23:12
スコープが違うポインタだけコピーしてもしゃあない。 引き渡したバッファにデータを設定したいなら中身をコピーせんと。
C言語とC++の日本語リファレンス(JavaのAPIリファレンスやPHPのPHPマニュアルのような、関数やクラスの一覧など)はどこで読めますか? 検索しても個人のサイトゆか見つからず、そのようなサイトは一部の関数等の説明が省かれてしまっています。 MSDNには英語のものしか見つかりませんでした。
712 :
711 :2006/06/25(日) 15:43:33
でも正直言って、英語読みたくねー日本語よこせとかいうレベルで、
規格書はお勧めしないが。
>>710 が規格書を必要としているとは思えない。
>>710 API一覧ならMSDNにも日本語でついてるよ
構造体とメッセージは英語だけど
715 :
703 :2006/06/25(日) 19:46:28
>>709 中身をコピーするにはどうしたらいいのでしょうか?
memcpy strcpy
>>715 (*array)[0] = data[0];
(*array)[1] = data[1];
以下略
718 :
京大生www :2006/06/26(月) 19:37:34
課題をやってる途中です。 int compare (char *s1, char *s2) { int i; char new_s1[20]; for (i=0; i<20; i++) { new_s1[20] = toupper(s1[i]); } return strcmp(new_s1, s2); } strcmpの進化版みたいのを作ったつもりですがうまく作動しません。 どこが間違っているのでしょうか? ちなみにここで使います。見てのようにどうせ小文字しかないのでstrcmpで代用したらうまく動きました。 上のはどこが間違っているのでしょうか。 void search_record(word *eng, int current_num, char *search_string){ int i; int count=0; for (i=0; i<current_num; i++){ if(strcmp(eng[i].spelling, search_string)==0) { printf("%s\n", eng[i].spelling); count += 1; } } printf("以上%d件がヒットしました", count); }
719 :
スミたん ◆JnsvZNFyHU :2006/06/26(月) 19:54:41
↑ 環境はbcc32です。
>>718 おそらくforの中のこれ。
> new_s1[20] = toupper(s1[i]);
new_s1[i]だろ、きっと。
けど、そのcompareではs1に19文字以上の文字列を渡せない。
ループまわして1文字ずつ比較するようにしようよ、strcmp使わないで。
もっとも、英字の大小を区別せずに比較したいだけなら、
だいたいstricmpとかstrcmpiとかそういう名前の関数が
処理系独自に用意されていることが多い。
721 :
京大生www :2006/06/26(月) 20:10:11
本当だ、ありがとう。 ちとやってエラーでたら報告する
722 :
京大生www :2006/06/26(月) 20:14:34
えっと比べる先がchar [20]だから問題がない。 しかし直したにも関わらず compare("unko", "unko")で-32という意味不明な値を返してきた。 鬱になる、これさえ通せば終わりなのに・・・何が間違ってるんだぁ
723 :
京大生www :2006/06/26(月) 20:16:00
あと、課題なので小文字で比較する関数を作りやがれと申しております。 そういう便利な関数があるとは知らなかったが、使っちゃダメなんだろうな〜あくまでも課題だから
man strcmp
小文字でなのにtoupperか! 大文字小文字区別しないなら、引数の両方を統一してやらないと意味無いのでは?
726 :
京大生www :2006/06/26(月) 20:44:07
検索にかけるワードは小文字で打てといってあります。 かけられるワード(配列)は全部小文字なのですが、課題では例えそれが大文字であってもよいようにしろという意図が含まれています。 ああああああああああああああああ toupperじゃなくてtolowerじゃねーか。やってみよ
727 :
京大生www :2006/06/26(月) 20:46:57
ビンゴー!!!!! 全部解決、ありがとございますた!!!!
京大生の評判を落とそうとしているやつがいる…
ギャングスター大学というイメージしかないんですが
それはそれは貧困なイマジネーションだこと
733 :
デフォルトの名無しさん :2006/06/27(火) 00:56:13
純粋仮想関数をつける/つけない をみなさんはどのように考えていますか? 経験不足なのか、私にはいまいちわかりません。
どのように考えるも何も、必要なら付ける・必要ないなら付けない それだけだ。
736 :
703 :2006/06/27(火) 01:28:10
>>716-717 の方法でやってみたのですが、どうもうまくいきません。
>>703 のコードのvoid funcを
void func(int **array, int *number)
{
int data[50], data_number, i;
(処理...)
for(i = 0, i < data_number; i++) {
(*array)[i] = data[i];
}
*number = data_number;
}
に変えたり、forの部分をmemcpy(*array, data, sizeof(data));とかにしてみましたが
うまくいきませんでした(コンパイラは通る)
どう修正すればいいのでしょうか…。
>>736 それだけじゃエスパーしかわからんから、ソース丸ごとどっかに上げてみ。
>>736 -void func(int **array, int *number)
+void func(int *array, int *number)
-(*array)[i] = data[i];
+array[i] = data[i];
739 :
738 :2006/06/27(火) 01:54:04
int **array だと、int へのポインタへのポインタになる。 int配列へのポインタなら配列の先頭アドレスを渡せば 配列全体の変更ができる。
740 :
738 :2006/06/27(火) 02:12:35
>>736 のままでも以下の様に呼び出せば、OKだが、無駄。
int a[50];
int *b=a;
int cnt;
func(&b, &cnt);
>>738 なら
func(a, &cnt);
で呼び出せる。
void func(int *array, int *number); int main(void) { int *array_data, number; func(array_data, &number); (array_dataを表示する処理など...) return 0; } void func(int *array, int *number) { int data[50], data_number, i; (50個以下で入力したデータをdataに格納する処理など...) //data_numberはdataに格納されてるデータの個数です for(i = 0, i < data_number; i++) array[i] = data[i]; *number = data_number; } こうすると、値が割り当てられていないローカルな変数array_dataに対して参照が行われたとエラーがでます。 func(array_data, &number);の前にmallocするとか、あらかじめarray_data[50];とかって 領域を確保しておけばエラーはでないのですが、void func()内で得たデータ分だけの領域を 確保したいのです。
>>741 それは無理だ。
必要領域の大きさを返す関数を先に呼ぶか、
充分な領域を用意するか、
可変長の構造を持つクラスのオブジェクトを渡すか
のどれかでないと。
743 :
742 :2006/06/27(火) 03:07:12
WinAPIなんかだと、NULLを渡すとsizeだけ返すのがあるから、 その方式でいけば、 #define NULL 0 int main(void) { int *array_data, number; func(NULL,&number); array = (int*)malloc(number*sizeof(int)); func(array_data, &number); (array_dataを表示する処理など...) free(array); return 0; } void func(int *array, int *number) { int data[50], data_number, i; (50個以下で入力したデータをdataに格納する処理など...) //data_numberはdataに格納されてるデータの個数です if(array !=NULL) for(i = 0, i < data_number; i++) array[i] = data[i]; *number = data_number; }
>>743 func()を二度呼んでもコストが掛からない状況にしか使えないね。
>>741 エラー処理省略でこんな感じじゃね?
int main()
{
int ** array, number;
func(& array, & number);
...;
free(array);
return 0;
}
void func(int ** array, int * number)
{
int tNumber = 件数;
int * tArrray = malloc(sizeof(int) * tNumber);
for (int i = 0; i < 件数; ++i) {
tArray[i] = データ[i];
}
* array = tArray;
* number = tNumber;
}
まぁ、件数は戻り値でもいい気がするけどね。
745 :
デフォルトの名無しさん :2006/06/27(火) 18:40:16
グローバル領域で構造体を宣言してグローバル領域やウィンドウプロシージャ関数の先頭で構造体内のデータをセットすると正常に動作するんだが、 ウィンドウプロシージャ関数の先頭で構造体を宣言してウィンドウプロシージャ内で構造体内のデータをセットしたら動作がおかしくなります。なにが原因なのですか?
スタックヤバスな予感
その構造体の参照位置によるんじゃないかな
質問です inline int f(int i) { static const int a[] = {...}; return a[i]; } という風に書いた場合,どういう風に展開されるのでしょう? a[]は1つだけ確保されるのでしょうか?
どこかに静的に確保されるだろ。たぶん 賢いコンパイラなら定数に展開するかも。たぶん
定数はさすがに無理か
iの範囲チェックを厳密に行なっていれば定数になる可能性はあるよ。 それはさておき、inline関数はstatic inlineにする方が無難だと思うのだが。
752 :
745 :2006/06/27(火) 20:06:15
>>747 すいません説明不足でした
Aという構造体とCという構造体ををウィンドウプロシージャ内の先頭で宣言して、宣言直後にAとCの構造体
に、データをセットすると、Aはのデータは正常ですがCのデータだけがおかしくなるので
参照位置はあんまり関係なあいとおもいます
>>752 その構造体の定義とウィンドウプロシージャを晒して味噌。
#十中八九、バッファオーバランだろうけど。
>>751 fをstaticにすべきかはfがどこでどう使われているかに拠るだろ。
そんな一概に言えることか?
exportが実装されていたり、iccのようなオブジェクト間最適化を具えたコンパイラでもない限り、 コンパイル単位内にないとインライン展開できないから事実上、staticでもいいかもね。
forループの利点がいまいち分からないです。 int main(void) { int i; for(i=0; i < 100; i++) printf("%d\n", i); return 0; } よりも、 int main(void) { int i = 0; while(i < 100) printf("%d\n", i++); return 0; } の方がやってることが少なくて良いように素人目では思えてしまうのですが…。
forは初期化、終了判定、カウンタインクリメント がセットで記述できるので、書き忘れがない といいな
748ですレスありがとうございます >751 >754 >755 さん fはヘッダで定義してグローバルな関数として使っています。 参照回数が多いのでどのような扱いになっているのか気になり質問した次第です。 staticにすると何が起こるのでしょうか? 各ソース毎に関数が定義されてa[]が複数確保されそうな印象を受けるのですが 配列は1つだけになるのでしょうか? ( 実際のところ速度重視でサイズはあまり気にしていないのですけれども。) 元々は下の様な形になっていたのですがもし良い方法があればご教示ください。 if( i < a0) return 0; if( i < a1) return 1; : if( i < a8) return 8; else assert(0);
>756 さん for(i=0; i < 100; i++) ... と書いてあればたいていの人が100回繰り返すことを一目で分かってくれるのでよいかもしれません。 c++では for(int i=0; i<100; i++) ... と書けるようになってループ変数のスコープがfor文の中だけでおさまるのが嬉しいこともあります。
初心者の俺が答えてみる。 forなら宣言と初期化とインクリメントと判定が1セットだし、 iのスコープが限定されるのでわかりやすいです。 for(int i=0;i<100;++i)と書くのがセオリーです。 これであってる?
761 :
デフォルトの名無しさん :2006/06/27(火) 21:08:21
C言語の言語仕様ってどこかで手に入りませんか?
ISOとかJISとか 適当にK&R読むとか
>printf("%d\n", i++); この書き方って大丈夫なんだっけ?
ひとつならだいじょうぶ
766 :
デフォルトの名無しさん :2006/06/27(火) 22:17:50
768 :
756 :2006/06/27(火) 22:41:01
>>759 へえ、C++ではそういう機能があるんですか。まだCしか勉強していないので知りませんでした。
効率的な部分は良く分からないんですが、
>>756 のような場合だとwhileよりforの方が見た目に分かりやすくて良いということですか。
C99でも可能
>>768 インデックス増やすだけとか単純な処理ならforのほうが良く使う
whileだとうっかりi++を書き忘れて「あれ、ばぐった」ということがよくある、すぐ気づくけど
C++を「インラインと参照仮引数とテンプレートが使えるC」として使っている今日この頃
Cってinline使えなかったのか。今まで普通に使ってた。
boostはちょっと怖いよ
ソース見るのは怖いな。 使うのはそれほど怖くないけど。
boost::MPLは目が潰れる。 逆にenable_ifは拍子抜けした。
みんな、ライブラリのソースって読む?
自分ならどう実装するか脳内でちょろんと考えてみて 思いつかなかったら読んで勉強する もちろん暇な時に限るけど
779 :
745 :2006/06/28(水) 02:58:25
>>753 お願いします
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) //ウィンドウプロシージャ
{
TBBUTTONtbb[5];//ツールバーを表示させたい しかしこれが悪の元凶でプロシージャに持ってきただけで動かなくなる
//グローバル領域で宣言するとまともに表示されるが、プロシージャで宣言すると表示が無茶苦茶になる
INITCOMMONCONTROLSEXcc;
tbb[0].iBitmap = 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = BTNS_BUTTON;
tbb[1].iBitmap = 1;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = BTNS_BUTTON;
tbb[2].iBitmap = 2;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = BTNS_BUTTON;
tbb[3].iBitmap = STD_FILENEW;
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = BTNS_BUTTON;
tbb[4].iBitmap = STD_CUT;
tbb[4].fsState = TBSTATE_ENABLED;
tbb[4].fsStyle = BTNS_BUTTON;
staticHWNDhTool;
780 :
745 :2006/06/28(水) 02:59:21
(続き) switch ( msg ){ case WM_CREATE: cc.dwSize = sizeof(INITCOMMONCONTROLSEX); cc.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&cc); hTool = CreateToolbarEx(hwnd, WS_CHILD | WS_VISIBLE , ID_TOOLBAR, 3 , hInst, IDR_TOOLBAR1, tbb, 3, 0, 0, 0, 0,sizeof(TBBUTTON)); tb.hInst = HINST_COMMCTRL; tb.nID = IDB_STD_SMALL_COLOR; tb= SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb); break;0
782 :
745 :2006/06/28(水) 03:48:57
>>781 様
TBBUTTONtbb[] = {
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
};
で初期化してデータをセットしなおすと表示できました!!ありがとうございます!!
でも、どうして全部0で初期化したら表示できるという発想がおもいついたのですか?
普通そんなこと思いつかないと思うんだけど・・・
>>782 グローバルに置いた変数は = {0} と同じように初期化される。
関数ローカルに置いたときは初期化しないとゴミが入ってる。
784 :
745 :2006/06/28(水) 04:34:58
>>783 tbb[0].iBitmap = 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = BTNS_BUTTON;
のように書いたら、すでに初期化されていると思うのですがどうしていけないの?
>>784 TBBUTTON には他にもメンバがあるだろ。
質問です。以下のソースをコンパイルすると、A::xが見つからないというリンク時 のエラーになってしまいます。どうしてなのでしょうか。 static intで宣言した変数は、インスタンスを作成しなくても使えると思ったのですが。 gcc.exe (GCC) 3.4.2 (mingw-special)です。 #include <iostream> class A{ static int x; public: static int get_x(); static void set_x(int m_x); }; int A::get_x(){ return x; } void A::set_x(int m_x){ x=m_x; } int main(){ A::set_x(5); std::cout << A::get_x() << std::endl; }
787 :
745 :2006/06/28(水) 05:49:30
>>785 ええ?最初の4つの引数だけじゃなかったんですか?
今回は表示させるだけで2番目は必要ないし・・・
>>786 クラスの静的変数は、クラスの宣言内で宣言するだけでなく、
どこかでint A::x;のように定義しないといけない。
ちょうど、グローバル変数をヘッダに宣言して、どこかで定義するのと同じ。
>>787 API に渡して使ってるんだから、 API の中では使われるんだろ。
さっと Google で調べると bReserved は 0 固定にする必要があるらしい。
790 :
745 :2006/06/28(水) 17:08:44
質問です。 C++のvectorは、JavaのVectorと違って、インスタンスをコピーして 登録するのでしょうか? vector<string> vec; vec.clear(); string foo = "ふー!"; vec.push_back(foo); cout << (&vec[0] == &foo) << endl; => 0 こうして見ると、どうもアドレスは違うようで、コピーされているようです。 コピーされるという推測がが正しいとしたら、どうしたらコピーなしで 登録が出来るのでしょうか?
vector<string*>
794 :
791 :2006/06/28(水) 19:22:03
ありがとうございます。 vector<string*> vec2; vec2.clear(); vec2.push_back(&foo); cout << (*vec2[0] == foo) << endl; => 1 cout << (vec2[0] == &foo) << endl; => 1 cout << *vec2[0] << endl; => ふー! 確かに意図どおりに動きました。 しかし、vector#push_back()はconst <T>& を引数に取るので、 私はてっきり、渡したインスタンスがそのまま登録されると思っていました。 そのままか、コピーなのか、見分ける方法はないのでしょうか?
795 :
791 :2006/06/28(水) 19:24:24
ちょっと日本語が変なので、書き直します。 各種コンテナにインスタンスを登録する場合、それがそのままなのか、コピーなのか、 コンテナやそのメソッドによって違うのでしょうか? もし違うとしたら、どうやって見分ければ良いでしょうか?
>>794 コンテナは基本的に全て値ベースのコピー。
引数が参照型なのは効率化のため。
797 :
791 :2006/06/28(水) 19:27:26
>>796 ありがとうございます。
すべてデフォルトでコピーとは驚きました。Javaとはまったく逆です。
巨大なオブジェクトを登録するときなど、気をつけなければいけませんね。
Javaと逆というか、Javaでは参照での登録“しかできない”というだけかと
799 :
791 :2006/06/28(水) 19:31:50
>>788 な。なるほど・・・・。
たしかにそうじゃないとクラス宣言をincludeしたときにつじつまが
合わなくなってしまいますね・・・。ありがとうございました。
801 :
デフォルトの名無しさん :2006/06/28(水) 21:09:45
読み込みファイルのendianをlittleからbigに簡単に変換するには (コンパイルオプション等で)どうしたら良いのでしょうか? コンパイラーはiccです。 ほとんどCに馴染みがなく、非常に単純な質問で申し訳ないのですが、 どなたかよろしくお願いします。
>>801 Windows, Linux, Unix, MacOS など殆どの OS でファイルは
単なるバイトストリームであって、エンディアンを持ちません。
大学のC言語の授業で「ソートについてテーマを決めて研究しレポートせよ」という課題が出ています。 例として与えられているのは「クイックソートを再帰を使った場合と、ループで実装してしまう場合との速度差」 だとか「○○ソート(マイナーなヤツ)について調べる」とか、せいぜいそんなレベルです。 大体C言語はわかっている俺は他と差を付けたいのですが、研究テーマが思いつきません。 それが公に結果が明らかであるか否かなど問いません、なにかいいテーマないでしょうか?
>>803 良いPCもってるなら、
SMTやマルチコア向けのparallel sortなんかどう?
並列度を増やした場合の性能向上度合いとか。
他と差を付けたいと言いながら人に頼る姿勢はどうかと思うが
807 :
質問者 :2006/06/28(水) 22:15:42
>>806 のおっしゃるとおりだと思ったので、自分で考えたいと思います。
>>801 コンパイルオプションではないが
swab
使うとか
>>797 ちなみにポインタ・参照ベースのコンテナが欲しければ、boost::ptr_vectorなんかがある。
データを一回スキャンして、最適なソートアルゴリズムを決定するアルゴリズムを考えてみるといいかもしれない。 そのアルゴリズムがO(n)だったら、割と役に立つような気もする。
812 :
デフォルトの名無しさん :2006/06/29(木) 10:30:26
1から10までの積(10の階乗 10!)を求めるプログラムを作成しなさい。 なお、階乗計算において、いくつを超えるとオーバーフロー(桁あふれ)が発生するか、調べなさい。 この問題がわからないんだがだれかおしえてくれ
スレ違い
815 :
デフォルトの名無しさん :2006/06/29(木) 14:20:44
1万字程度の英文を入力データにしたいんですが、ネットにある文章をtxtに貼り付けて、改行コードをCRのみにしないとならないんです。 そのやりかたを教えて下さい
気の利いたエディタを使う
818 :
デフォルトの名無しさん :2006/06/29(木) 16:48:59
F2C - A FORTRAN to C translator これの使い方がわからないのですが、どなたか教えてください。
819 :
デフォルトの名無しさん :2006/06/29(木) 17:06:36
char a[100]; double d=10.5; TextOut(HDC ,0 ,0 ,a ,wsprintf(a ,"d:%2.5f\n" ,d) ); このプログラムをC++.Netに入力しても表示されないのですが どこが間違っているのでしょうか? よろしくお願いします。
820 :
ネタ :2006/06/29(木) 17:09:46
>>819 キーボードが壊れているようなので取り替えろ。
今すぐ必要なら、マウスを右クリックしてコピペ。
821 :
デフォルトの名無しさん :2006/06/29(木) 17:13:23
本気?
>>819 C++.Netうごく環境ないから適当なこと書くけど、
分解してうまくいくならコンパイラが変なのでは?
824 :
819 :2006/06/29(木) 17:39:22
申し訳ないです。 読みましたがわからないです。 どこが悪いのでしょうか?
>>819 HDCとはcharやdoubleのような型であって変数そのものではない。
TextOutの最初の引数にはHDC型の変数か何かを渡す必要がある。
適切なHDCを得る関数も、MSDNには書いてある。
826 :
80 :2006/06/29(木) 18:23:16
828 :
819 :2006/06/29(木) 18:27:04
書き方が悪かったみたいで申し訳ないです。 HDCのところは HDC hdc というように宣言してから、 GetDCを用いて行っていますので間違ってないと思います。
829 :
デフォルトの名無しさん :2006/06/29(木) 18:32:08
#include<stdio.h> #include<stdlib.h> int charcmp(const void* a,const void* b){return *(const char*)a-*(const char*)b;} int main(void){char tmp[100];int len;fgets(tmp,sizeof(tmp),stdin);len=strlen(tmp); tmp[--len]='\0';qsort(tmp,len,sizeof(char),charcmp); printf("%s\n",tmp);return 0;} 文字列をASCIIコード順に並び替えるプログラムなんですが、qsortっていうのがどこから出てくるのかわかりません。 教えて下さい
>>829 質問の意味がよくわからないけど、stdlib.hで宣言されている、Cの標準ライブラリ関数、
と答えてみる。
stdio.h
stdlib.hじゃないの?
>>830 そういうことなんですね。ありがとうございます
このプログラムをポインタを使わないで書くことってできますか?
834 :
デフォルトの名無しさん :2006/06/29(木) 18:39:23
はあ?
あとtmp[--len]='\0'の操作って意味あるんでしょうか?
意味がないと思ったら削除して実行結果を比べてみりゃいいだろ。
>>836 変わらないですね。でもどっかでおかしくなるのかなとおもいました
>>838 変わらないように見えるなら今すぐ病院へGO!
AのようなプログラムをBのように書きかえたいのですが、何か方法はありますか? //A while(1){ scanf("%d",&a); printf("%d",a); } //B WHILE scanf("%d",&a); printf("%d",a);
無い。
WHILE a; b; c; 以下略 どこまでループするかどうやって判断するんだ
848 :
デフォルトの名無しさん :2006/06/29(木) 20:29:22
コールバック関数から、クラスメンバのvectorにもらった値って追加できないですか? エラーの意味がわからんので教えてください。 class Hoge { vector<HWND> hWnds; ・ ・ ・ VOID Hoge::EnumStart() { EnumWindows(Hoge::EnumWindowProc, (LPARAM)this); } BOOL CALLBACK Hoge::EnumWindowProc(HWND hWnd, LPARAM lPram) { Hoge* hoge = (Hoge*)((LPCREATESTRUCT)lParam)->lpCreateParams; hoge->hWnds.push_back(hWnd); } push_backで落ちます
lParamってthisでしょ。
ありがと。たすかった。まじで、うれしい。 Hoge* hoge = (Hoge*)lParam; でなおった。 いみわからずやってた私があふぉでした。
MSDN見てないんかな
>>824 そもそもwsprintfではdoubleは扱えない。書式指定子の型指定子にfなんてないだろ。
Javaを長いことやってたらC++が良くわからなくなったよ。
855 :
デフォルトの名無しさん :2006/06/30(金) 00:36:31
C言語でWindowsAPIを使ってます。VC6.0でWindows Apilicationでワークスペースを作成しました。 WinMain()でDialogBoxParam()でダイアログを表示し、OKボタンを押したら終了するプログラムを作りました。 ダイアログプロシージャでOKボタン押したらEndDialog()を呼ぶようにしたわけです。 WinMainはループ処理をしています。(SleepとかPeekMessageを使ってます) さて質問なのですが、ダイアログを表示する前と表示後で、タスクマネージャで見ていると、 ハンドルが10個くらい増えます。 EndDialog()でダイアログを終了しても、このハンドルが減りません。 これってハンドルリークというやつだと思うのですが、このDialogBoxParam()で起動したダイアログの ハンドルを解放するにはどうやるのでしょうか?
そんなものは無い。システム側が裏で何かしてるだけだから気にするな。 あと、モーダルダイアログなのに、なんでループ処理してるの?
857 :
855 :2006/06/30(金) 09:58:51
ほんとはもっとでっかいプログラムで、ダイアログもサブスレッドで表示してたんです。 ある日タスクマネージャでハンドル数をチェックしてたら、あるタイミングで10個くらい増えたのを発見。 そのタイミングがダイアログ表示とわかり、原因特定のため855のようなプログラムを組んだわけです。 ループにしてるのはループにしないとプログラムがすぐ終了して、もしのちのちハンドルが解放されてもわからないからです。 でも気にしなくてよかったんですね。
858 :
デフォルトの名無しさん :2006/07/01(土) 14:44:06
C++のWinSockラッパークラスでおすすめってなんですか? MFCのCSocket以外でおいしいの教えて工口ぃ人 UDP/TCPの非同期処理がサポートされているやつを探しているんですが Google先生でみつかるのは同期処理のやつヴぁっか。
エロく無い俺は教える資格なしか
860 :
デフォルトの名無しさん :2006/07/01(土) 14:53:16
正直、工口が重要?
くだらないレス
C++で、カプセル化のためのsetter,getterを自動生成する方法ってありますか? stlとboostは使う予定です。
つエディタマクロ/スクリプト系言語
>>862 カプセル化を考えるなら、必要性をよく考えて自分で作ったほうがいいよ。
不要な setter, getter はカプセル化を破壊する。
一律にsetter、getter作るなら、publicでええやん
866 :
デフォルトの名無しさん :2006/07/01(土) 19:31:52
配列について質問です a[10][10]ってのがあるとしてa[10],[1]〜[10]までに同じ値を入れたい時はどう書けば良いでしょうか。。。?
for(ry
868 :
デフォルトの名無しさん :2006/07/01(土) 19:38:44
>>867 やっぱりforしかないですよね。ありがとうございます
つーかa[10]だとバッファオーバーランするよ
>>866 C++を使ってるなら
std::fill(&a[10][0], &a[10][10], 0x1234);
intでないと使えんがな
んなこたぁない
874 :
デフォルトの名無しさん :2006/07/01(土) 20:14:35
#include <iostream> #include <fstream> using namespace std; int main() { fstream ifs("a.bmp", ios::binary | ios::in); fstream ofs("a.bin", ios::binary | ios::out); char c; while ( ? ) { ifs.get(c); ofs.put(c); } return 0; } バイナリ型式でファイルをコピーしたいのですが、 この場合、ファイルの終端はどうやって検出するのでしょうか? ifs.eof()は当然ダメでした
>>874 get()してみないと、eof()かどうかは判らない。
do { ifs.get(c); ofs.put(c); } while (!ifs.eof()); 取り敢えず修正 eof()を使って終端判定すると 変なところでeof検出されたりしませんか?
>>876 単にファイルをコピーしたいだけならOS依存にはなるが、
system("/bin/cp -p fromFile toFile");
でいいのではないかと。
#或いは"copy fromFile toFile"か。
#include <iostream> #include <fstream> #include <iterator> #include <algorithm> using namespace std; int main() { fstream ifs("a.bmp", ios::binary | ios::in); fstream ofs("a.bin", ios::binary | ios::out); typedef istreambuf_iterator<char> i; typedef ostreambuf_iterator<char> o; copy(i(ifs),i(),o(ofs)); } //while(ifs.get(c))とかいてもいいけどな
#include <fstream> int main() { std::ifstream ifs("a.bmp", std::ios::binary); std::ofstream ofs("a.bin", std::ios::binary); ofs << ifs.rdbuf(); }
sort.obj : error LNK2019: unresolved external symbol __imp__GetPixel@12 referenced in function _WinMain@16 as.exe : fatal error LNK1120: 1 unresolved externals コンパイルは通るんですが、上記のリンクエラーがでます。 どのライブラリをリンクしたらいいのか教えていただけませんか? もしくは、それを調べる事ができるAPI関数のリファレンスのような物があれば教えて下さい。 コンパイラはVCTK2003とPsdkのx86用 OSはXPを使っています。
sort.exe : fatal error LNK1120: 1 unresolved externals エラーの最終行が変わってました。正しくは上記です。
882 :
880 :2006/07/01(土) 21:48:00
ついにGoogle先生で自己解決できました。 数時間彷徨って、書き込んだとたんにこれだあえちjせちぽうgsれlkじぇryぽ お騒がせしましたー。
883 :
デフォルトの名無しさん :2006/07/01(土) 23:08:06
MY_DATA stMyData[4] = { { 1, 2 }, { 5, 7 }, { 3, 3 }, { 2, 4 }, }; こんな感じで構造体の配列を作ったとします。 stMyDataというアドレスだけを受け取って 構造体が何個含まれているか(上の例では4個)を 知る方法はありますか?
885 :
デフォルトの名無しさん :2006/07/01(土) 23:13:45
じゃあ sizeof(stMyData) / sizeof(MY_DATA) とかで あらかじめ個数を調べておくしかないってことですね
stMyDataが同じファイルスコープにいるなら可能 sizeof(stMyData)/sizeof(stMyData[0]) そうじゃないなら終端を表す特殊なデータをケツに置いておく
887 :
デフォルトの名無しさん :2006/07/01(土) 23:23:05
あと、MY_DATA* pstMyData = stMyData とおいて x = pstMyData[3].nData1 y = pstMyData[3].nData2 と値を取ろうとしますが、うまくいきません (x=2、y=4になるはずなのに) 全然違う値が返ってきてしまいます。 理由を教えてもらえませんでしょうか?
888 :
デフォルトの名無しさん :2006/07/01(土) 23:27:56
f
何が目的で全角英数を使うのか理解できない。
何が目的で大文字英数を使うのか理解できる。
Runtime Error! Program: ...udio 2005\Projects\directxtest05\debug\directx05.exe This application has requested the Runtime to terminate it in an unusal way. Please contact the application's support team for more information. VC2005 Express Editionでコンパイルしたらこんなのが出て終了します。なんで?
×コンパイルしたら
○デバッグなしで開始 したら
デバッグ開始 すると意味分からないエラーが
directxtest05.exe の 0x7c81eb33 で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012fcb4)。
directxtest05.exe の 0x7c81eb33 でハンドルされていない例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012fcb4)。
ttp://uploader.system-witch.com/UpLoader/Itiran file_id:621,pass:cpp
C言語の fp = fopen(path, "r"); if (fp ==NULL) die("unko"); if (ferror(fp)) die("unko"); をC++でfstreamを使う場合で同じ動作をさせるにはどう書けばよいですか?
>>894 デバッグしろってか。
せめて落ちる所を特定しろよ。
>>895 std::ifstream fin(path);
if (!fin) throw std::runtime_error("die");
デバッグ版をリンクしてなかったってオチじゃねぇの
>>894 catch(int errtype){
↓
catch(HRESULT errtype){
というかこんなキモイ例外の使い方するな、普通に返り値で分岐すればいいだろ
Cで2ちゃんねるに書き込むソフトを作ろうと思ったのですが、
作り方がわからないのでまず試しにhtml文書で試しにしてみました。
<html>
<head>
<title>■ 書き込み確認 ■</title>
<META http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
<form method=POST action="
http://pc8.2ch.net/test/bbs.cgi ">
<input type=hidden name=subject value="">
<input TYPE=hidden NAME=FROM value="">
<input TYPE=hidden NAME=mail value="sage">
<input type=hidden name=MESSAGE value="試しです">
<input type=hidden name=bbs value=tech>
<input type=hidden name=time value=1151831869>
<input type=hidden name=key value=1149815331>
<input type=hidden name="hana" value="mogera">
<br>
<input type=submit value="上記全てを承諾して書き込む" name="submit">
<br>
</form>
</body>
</html>
ですが「ERROR:referer情報が変です。(ref1) 」となりました。
ですので調べたらIPアドレスとかの情報がいるとか・・・。
どなたか作り方教えてもらえないでしょうか?
901 :
800 :2006/07/02(日) 18:57:53
もしかして案外普通にCでのプログラムとかで作ったなら 勝手にそういった情報が送られるのかな?
とりあえずHTTPの仕組みを勉強しよう
C言語でメモリー上の特定のアドレスの値を取得したいのですが(例えば0x00000001の値1バイト分)どうやってやればいいんでしょう?
*(char*)0x00000001
906 :
904 :2006/07/02(日) 21:51:50
レスありがとうございます VC2005で実際やってみたのですがどうもうまくいかないorz 「MSにエラー送信しますか」のダイアログがでます。 で、いろいろ試行錯誤してみたのですが printf( "%d", (char*)0x00001234 ); で通すと"1234"と出力されました。 printf( "%d", *(char*)0x00001234 ); でやるとエラー送信のダイアログがでます。 フォーマットの指定が変なんでしょうか?
そもそも0x00001234には何があるのか考えろ
>>906 アンタはアタイの触れちゃいけないもんに触れちまったのさ
>>906 そのアドレスを読むことが認められていないのでしょう。
MS-DOSの時代なら自由に読めたのにね
>>906 WindowsはまともなOSだから、そう直接的に好き勝手な場所のメモリを読み書きその他することはできない。
912 :
904 :2006/07/02(日) 23:36:55
ではどうやって任意のメモリの読み書きを行うのでしょうか?
>>912 そもそも任意のメモリが読めたとして、一体それをどうしたいんだ?
914 :
904 :2006/07/02(日) 23:54:45
あるアプリのメモリーの変動をウォッチングして変動に応じた処理をするプログラムが作りたい
Windowsで任意のメモリにアクセスするには、特権モードでないと無理。 ところで物理アドレスなのかね?それとも論理アドレス?
>>914 それは他プロセスのアドレス空間の話だろ。
ReadProcessMemory()を使え。
>>904 致命的に知識不足。
お前には無理だ、あきらめろ。
知識不足なら埋めればいいだけだろうに。 短絡的に無理と判断するのはこれまたゆとり教育の弊害か。
>>918 「埋める」の主語はなんだ?俺たちが埋めてやるとでも?
知識はあっても応用する力が無いとダメだな。
ポケコンとはちがうのだよ、ポケコンとは!!
つまり、ポケコンでやれってことだな。
fopenなどは大概 if ((fp = fopen("my.dat", "r")) == NULL) { /* エラー処理 */ } 等のようにしてエラー処理をすると思うんですが、fgetsもエラー処理はした方が良いでしょうか?
>>923 どっちか不安なら、しといたほうがいい。
925 :
デフォルトの名無しさん :2006/07/03(月) 10:24:58
すいません、質問なんですが ANSI C++で #include <stdlib.h> #include <iostream.h> #include <list.h> class Guardian { class Child { public: int a; double b; list<Gurdian*> gurdian; }; Child *child; }; の様にクラスの中でそのクラスのメンバを持った クラスを宣言することはできないのでしょうか?
#include <iostream.h> → #include <iostream> #include <list.h> → #include <list> list<Gurdian*> gurdian; → std::list<Guardian*> gurdian; ~~~~~~~~~
class Moge; class Hoge{ Moge moge; }; class Moge{ }; int main(){ return 0; } ↑のようなコードを書いてコンパイルしたところ、 「'Hoge::moge' が 未定義の class 'Moge' で使用しています」(VC8) 「未定義の構造体 'Moge'」(BCC5.5) 「field `moge' has incomplete type」(GCC) のようなエラーを吐かれます。 また、 - Moge moge; + Moge* pMoge; のように変更を加えたところ、何事もないようにコンパイルされます。 この違いはいったい何なのでしょうか。
ポインタか実体か。
>>927 コンパイラはソースを上から順に読んでいく。これがヒント。
930 :
927 :2006/07/03(月) 11:11:59
実体の宣言をする前にそのクラスの定義を見る必要がある (ポインタの宣言ならそのクラスの宣言だけでよい) という解釈でよろしいでしょうか。 とりあえず、おとなしく分割コンパイルをすることにします。
使おうとしているライブラリが gif_lib.h と png.h をインクルードしてるんですが これらのヘッダのあるライブラリの名称ってなんですか?
fstreamをメンバ関数にもつクラスのコピーコンストラクタを作成したときと、fstreamを関数で受け渡しする際に次のようなエラーがでてしまいます。 コピーコンストラクタの場合 : class Test { public : fstream fs; Test() { } Test( const Test &test ) { fs = test.fs; } }; 関数で受け渡しする場合 : void test( fstream fs ) { } int main() { fstream fs; test( fs ); return 0; } error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。 環境はWindowsのVC8です。 どちらかの場合の解決法がわかれば、問題は解決できるんですが、どなたかわかりますか?
fstreamはコピーできない。 参照で渡す or ポインタで渡す のどちらかで
>>934 -935回答ありがとうございます。
ポインタで渡すしかないということは、クラスのコピーコンストラクタを使う方法は使えないということでいいですか?
test( fstream &fs )
{
}
int main()
{
fstream fs;
test(fs);
return 0;
}
では、動作することを確認しました。
ありがとうございます。
演算子の優先順位に関して、Cのスレで質問したのですが、 C++とちょっと様子が違うようなので、こちらで聞かせてください。 3項演算子と、代入、カンマ演算子を括弧無しで書いたときの 動作についてです。 a , b ? c , d : e , f; は a , (b ? (c , d) : e) , f; と同じでしょうか? あと、 a = b ? c = d : e = f; は a = (b ? (c = d) : (e = f)); ですか? 優先順位を素直に解釈すれば a = (b ? (c = d) : e) = f; こうなるようなアドバイスはあったのですが、現実には上に書いたような 解釈をされるようです。 続きます…
そういうのをなまじ知ってると、 括弧を省略したくなる病になる可能性があるから、 そういう分かりにくいものは必ず括弧をつけるように。 あと、C だと a = (b ? (c = d) : e) = f; と解釈されるけど、 C++ だと確かに a = (b ? (c = d) : (e = f)); と解釈されるようだ。 つまり、e = f の付近は括弧をつけないと 移植性が低いよということなんだろうが、 何でこういう違いが出るのかは分からんな。
>>938 すみません、続きを書くのを忘れてしまったようです。
仰るようにプログラムするときは括弧を書くべきですが、
コンパイラの動きの内部をちょっと勉強していて、
どうもC++の3項演算子のコロン以降が特殊処理されている
ような感触を受けたので質問させていただきました。
なら、カンマ演算子の場合も
a , b ? c , d : e , f;
は
a , (b ? (c , d) : (e , f));
こうなるのでしょうか?
連続した3項演算子の結合については、 if else if 同様に以下のような書き方ができると 覚えておけば忘れないと思います。 weight = (sex == male) ? 65 : (sex == female) ? 55 : 105;
>>940 3項演算子の連続ではなくて、カンマ演算子や代入演算子との兼ね合いで
首をひねっているのです。
>>937 > 現実には上に書いたような解釈をされるようです。
バグやろ。コンパイラ晒せ。
>>943 VC++ 6らしい。
http://pc8.2ch.net/test/read.cgi/tech/1146700389/664n 俺はVC++ 7.1, 8で試したが直っているみたい。
#include <iostream>
int main()
{
using namespace std;
int a, b, c = 2, d = 3, e = 4, f = 6;
cin >> b;
a = b ? c = d : e = f;
cout << a << ' ' << b << ' ' << c
<< ' ' << d << ' ' << e << ' ' << f << endl;
}
1を入力すると「3 1 3 3 4 6」と出力され、0を入力すると「6 0 2 3 6 6」が出力される。
g++でも当然そうなった。
結論:ifを使え
そうそう、無理して理解しなくても、自分の能力の範囲内で 使えるものを適切に使うところから始めた方が良いよ。 原理を理解していないから結果が分からんのだし。
演算の優先順位に自信がないときは、しつこいぐらいに 括弧をつけるのがおすすめ、
「配列のアドレスを書き換える事はできるか?」と聞かれ、 「それができたら領域破壊をする可能性があるためできないんじゃないだろうか」と答えたのですが、 憶測のため間違った知識を与えてしまったかもしれません。 実際のところ、配列のアドレスを書き換える事はできるのでしょうか?
int a[20]; としたときに、 a のあるアドレスをあとから変更できるかってことか? 無理だろ。 int b; の b のアドレスを後から変更できないのと同じ。 それとも、違う意味か?
>>944 VC6でもそうなります。なので、C++流は
a = b ? c = d : e = f;
は
a = (b ? (c = d) : (e = f));
なのでしょう。
この辺がC言語から変わった経緯とか知ってる人いませんか?
D&Eにはそれに触れてるところはなかったかなあ…。
あと、括弧をつけるのは別の話で。実務ではそうしてますから。
>>944 さんへ。カンマ演算子に関してはご存知ないですか?
a , b ? c , d : e , f;
は
a , (b ? (c , d) : e) , f; こう?
VC6ではこれっぽかった。代入演算子の場合と括弧の結びつきが違うのは、
代入は右から評価されるってのが影響してるのかな。
C++がどうこうというか、VC6がアレという話ではなかろうか
>>950 実行した限りでは、a , (b ? (c , d) : e) , f だな。
これはごく普通の挙動だ。
= だとなぜ C と C++ で変わるんだろうか?
ああ、俺のコンパイラは gcc/g++ 3.4.4 ね。
953 :
944 :2006/07/04(火) 19:25:41
>>950 ああ、ごめん。
自分が試したコンパイラ=正しい、VC6=間違いと思い込んでしまっていた。
ところで規格をあたってみたら、たしかにCとC++ではその定義が異なっている。
X3010ではこう。(PDF P69-70)
6.5.15 条件演算子
条件式:
論理OR式
論理OR式 ? 式 : 条件式
ところがX3014ではこうなっている。(PDF P73-74)
5.16 二択条件演算子
二択条件式:
論理和式
論理和式 ? 式 : 代入式
X3014の付随書C(Cとの非互換の機能の説明がある)にも何も書かれていない。
コーディング規約で「三項演算子の使用禁止」と書く奴の気持ちが 初めてわかった気がした。
つ結合規則
>>954 三項演算子の右項で普通代入式なんか書かねーよw
>>953 なるほど。
C++ だと ? : の仕様として、
最右項に代入式があったら括弧なくても通るようになってんのか。
こんな仕様変更、始めて知ったな。
C/C++の違いじゃなくて、三項演算、代入は右からの 結合なので、括弧なしで結合するのが正しい構文解析だと思うのだが、 # ちなみにカンマは左からの結合
Cって、左辺値に三項演算式書けるんだっけ?
>>959 VC7でやってみた。
コンパイルは通るが、実質的にno effect。
int main(void)
int x=10, y=20, z;
char tmp[100];fgets(tmp,sizeof(tmp),stdin);z=atoi(tmp);
z&1?x:y = 0; //←no effect?
printf("x=%d,y=%d,z=%d\n",x,y,z);
return 0;
}
当然の事ながら、こうしたら期待した結果を得られた。
*(&(z&1?x:y)) = 0;
>>960 それだと第3項が代入になるんじゃない?
>>960 括弧足りないし
(z&1?x:y) = 0 がやりたいことじゃないの
>>959 出来ない。
>>953 はC++で可能になったことが追加されているわけでしょ。
だから非互換ではない。あくまで追加。
cppでコンパイルしてたorz
>>826 機能からこれが気になってしょうがない。
ネタじゃなかったらC++を窓から放り投げるぞ。
コンパイラだけは使うけど…
>964 >847
開発の動機というか経緯が全然事実に即して書かれてない。 ガセであることがすぐわかってつまらない。
んで、ガセかどうかはともかく、質疑応答の内容そのものは間違ったこといってないのか? 例えば開発期間が長くなるとかetc
なる
というか、お前らものすごく遅れてますよと。
前世紀のネタで今更盛り上がられてもなぁ。
>>958 結合規則は優先順位が同じもの同士じゃないと意味がないのでは・・・。
972 :
デフォルトの名無しさん :2006/07/05(水) 19:51:21
UNIX系のg++で、pthreadを使って何かのイベントが発生したら処理をするような 機構を実現したいのですがどうしたらいいのでしょうか? やはりwhileで変数を見張り続けるしかないのでしょうか? わかりづらい質問ですが、どなたかわかる方がいらっしゃったら教えていただけ ないでしょうか?
>>967 > 開発期間が長くなる
教科書的な回答をするとしたら、
「それはC++に熟練していない人間が関わるからだ。」
もう pthread なんて忘れたけど、 pthread_wait とかあった気がする。
977 :
デフォルトの名無しさん :2006/07/05(水) 21:51:15
phread_cond_wait(pthread_self(), &mutex) として、自スレッドを一時停止させようとしているのですが、うまくいかないのです。 何か根本的に間違っている気がするのですが、、pthreadの資料少なすぎ orz
勘違いしていた、申し訳ない。
手元のK&Rのapendixに乗ってるBNRをまじめに追いかけてみたら、
確かにCでは第3項は代入式としては解釈されない、、、
# 手元に最新の規格ないので古い資料ですが、、、(ANSI1989版相当)
>>953 の言っているように、生成規則自体が変わっているのだね…
そもそも、結合則に関して勘違いした状態で
知ったような口をたたいて申し訳なかった。
>>978 ×BNR
○BNF
、、、、、旅に出ます、、、、
981 :
デフォルトの名無しさん :2006/07/06(木) 10:05:00
>>980 ありがとうございます。
う〜ん、しかしやっぱりスレッド一時停止してくれません orz
pthreadのmanでも見るしかないのか。。。
何故マニュアルを読まん?
ARM5.16 (953のX3010と同じ) 第二のオペランドと第三のオペランドが、同じ型であり、 どちらも左辺値である場合、式の結果も左辺値である。 例をあげる。 int a,b; x?a:b = 1; // ok ARM19.1 conditional-expressionとassignment-expressionの構文は、 (throw-expressionを許すために)、以下のように変更された。 (略 953のX3014と同じ) 例をあげる。 i ? x=y : x=z; // i ? (x=y) : (x=z) を意味する
984 :
937 :2006/07/06(木) 17:00:35
>>983 ARMですか…。もう読んだの10年以近く前でした。
D&Eの横に置いてあったんだけど目に入ってなかったです。
皆さんの書き込みで大体納得できました。
直感に従うように変更された、という感じですね。
はぁ
x = i ? y : z; でいいやん
俺のチンコデッドロックで固まっちゃった どうしよう
>>987 おいしいもの食ってうんこすればなおるよ!
ハ_ハ ('(゚∀゚∩ なおらなかったよ! ヽ 〈 ヽヽ_)
getch()について質問があります #include <stdio.h> #include <curses.h> int main(void) { printf("Enter a letter: "); printf("That letter is %c.\n",getch()); return(0); } というプログラムなんですがコンパイルして実行してもgetch()の部分がすっ飛ばされて終了してしまいます Linux環境でgetch()をどうしても使わなくてはいけないのですが何か解決法はないでしょうか?
992 :
デフォルトの名無しさん :2006/07/08(土) 22:48:25
次スレムリだったor2
つか、これUnix Programming FAQに載るほどの超既出問題なんですが。
996
長門
998
999 :
デフォルトの名無しさん :2006/07/09(日) 00:01:28
999 ↓m9(^Д^)プギャーッ
1000 :
デフォルトの名無しさん :2006/07/09(日) 00:01:57
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。