スレを勃てるまでもないC/C++の質問はここで 10
これはポニーテールがなんちゃらかんちゃら
3 :
デフォルトの名無しさん :2009/05/14(木) 21:15:47
std::invalid_argument は「意味的に正しくない引数に対する例外」ということなのですが、 この「意味的」という意味が分かりません。 具体的にどのような場合が「意味的に正しくない」のでしょうか?
例えば引数で何月かという値をもらうとする。 1-12以外が渡されたら、意味的におかしいだろ?
5 :
3 :2009/05/14(木) 21:48:32
>>4 ありがとうございます。
1-12以外が渡されたら、それは想定範囲外だから std::out_of_range であると思っていました。
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
class Hoge { private: int h; public: Hoge(int h) : h(h) {} }; 俺、上みたいなとき、いつも仮引数の名前とメンバ変数の名前同じにしてるんだが、 (特に問題なく動くので)そういうコード見たことない。混乱するから?それともたまたま 動いているだけで何か問題あるの? 俺にとっては毎回変数と違う名前を思いつく方がよっぽど紛らわしいんだが。
8 :
デフォルトの名無しさん :2009/05/15(金) 03:24:23
始めて3日の初心者です。 初項1、公比1/3の等比数列の4項までの和を求めたいのですが (もちろん普通に計算すればできますが) どうにも上手くいかなくて困っています。助けてください。 自分が書いたのはこんな感じです。 #include <stdio.h> #include <conio.h> int main(void ){ int l; double m,n; l=0; m=0; n=0; for(l=0;l<5;l++) { m=1/3^l; n=n+m; } printf("%f",n); getch(); return 0; } どこがいけないのかさっぱりわかりません。どなたかご指摘お願いします。
>>8 C言語ではべき乗演算子はない
^はXOR演算子
だから m = 1 / pow(3, l); とすればいいはず
あ、#include <math.h> を忘れずにな powがdouble型を返す事を前提にしてるんで そうしないと整数÷整数という意味のない事をする事になってしまう
11 :
デフォルトの名無しさん :2009/05/15(金) 04:09:31
>>8 問題あるよ。
その問題とはお前が低脳ってこと
普通の脳なら、int m_h;とかする。
>>11 おまえ番号ちがうくらいだからもっと低能だな
m_って何の略?
staticの意味を調べコードを書いたのですがコンパイルエラーになります どこがおかしいのでしょうか #include <iostream> class Test { public: static int x; int y; Test() {} ~Test() {} void show(); static void s_show(); }; void Test::show() { std::cout << "y=" << y << std::endl; } void Test::s_show() { std::cout << "x=" << x << std::endl; } int main() { return 0; }
int Test::x; が抜けてる
#include <iostream> class Test { public: static int x; int y; Test() {} Test(int i = 0) : y(i) {} ~Test() {} void show(); static void s_show(); }; int Test::x = 1; void Test::show() { std::cout << "y=" << y << std::endl; } void Test::s_show() { std::cout << "x=" << x << std::endl; } int main() { Test t(2); t.show(); t.s_show(); }
えっグローバル変数とstatic変数は宣言と同時に自動的に0に初期化されるのではないのでしょうか? 例) #include <iostream> int global; int main() { static int staticint; int local; std::cout << local << std::endl; std::cout << global << std::endl; std::cout << staticint << std::endl; return 0; } (結果) -1881141193 ←ゴミ 0 ←きちんと0で初期化されてる 0 ←きちんと0で初期化されてる
>>17 クラスのstatic変数は例外です
というのもクラスのインスタンスを複数作ってもstatic変数の
実体は一つしか作られない上にコンストラクタでも初期化不可能
なため、どこかで定義してやる必要があります。
もちろん = 1 を省略すれば 0 で初期化されます。
19 :
17 :2009/05/15(金) 06:23:33
>>7 メンバー変数と仮引数と局所変数を区別するプリフィックスをつければいいんじゃないかな。同じ意味で記憶クラスが異なる変数を人目で見分けられるし、名前を増やさなくて済む。
例えば、メンバーはm、仮はkとか何とか
class Hoge {
private:
int mh;
public:
Hoge(int kh) : mh(kh) {}
};
>>7 私は小さいコンストラクタに限り、同じ名前でやってるよ。まぁ、別に問題ないな。
>>10 解釈がおかしい。プロトタイプ宣言のないpow()を使った場合、引き数のそれぞれがintのまま引き渡されてしまいおかしなことになる。
又、戻り値もdouble値として戻されるのにintとして受け取ろうとするからやはりここでもおかしなことになる。
x86みたいにintとdoubleで格納するレジスタが異なるような環境の場合、一見巧く動くから厄介だ。
等比数列で前の数を使わないでいちいちpowするような間抜けなやり方なんてどうでもいいだろw
自作のヘッダファイルは二重にインクルードしてしまうと再定義のエラーになりますが、 よくよく考えると<iostream>のような標準ヘッダはインクルードガードしないで何度もインクルードしているような 気がしますが、なぜエラーにならないのでしょうか?
>>23 標準ヘッダもインクルードガードしてるだろ。
25 :
23 :2009/05/15(金) 12:43:11
>>24 あ、そっか。独自のヘッダファイルでインクルードガードするんじゃなくて、
標準ヘッダ側にインクルードガードが書かれてるのか。ところで標準ヘッダファイルを見た事がないのですが、
標準ヘッダってどこのディレクトリにあるんでしょうか?iostreamでCドライブ検索したけどヒットしませんでした。
Visual Studio2008使ってます
includeの下。
27 :
23 :2009/05/15(金) 13:19:27
やっぱりなかった。iostreamもistreamもostreamも。 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include ですよね!?
#include <iostream>で右クリックして ドキュメントを開くを選んで 開いたらタブで完全パスのコピー
29 :
23 :2009/05/15(金) 14:09:23
こんな機能あったんだ。。 ヒットしなかったのは違うドライブにインストールしてたからだった。。 大変失礼しやした。ありがとー
>>30 >僕の読み違いでしょうか?
いいえ、間違いです。
「インライン関数はソース側に記述できない」のは正しいが、「エラーにならない」のも事実。 従って「読み違い」ではなく、「検証方法の間違い」だ。
34 :
デフォルトの名無しさん :2009/05/15(金) 17:22:25
共用体ってどんな時に使うのでしょう? メンバの値がどれも同じになるなら、変数と同じ気がするんですが…
メモリが足りない時等にに変数を共有してメモリ節約したい時
36 :
デフォルトの名無しさん :2009/05/15(金) 17:44:56
すいません、わかりません…。 同じデータだけどデータ型が頻繁に変わるゆうな時に使う、という認識ですか?
変数で考えるな メモリで考えろ
>>36 >同じデータだけどデータ型が頻繁に変わるゆうな時に使う、という認識ですか?
データ型が変わるという認識は間違い。
例えば
2つの変数char cとint iに対して同時にアクセスしないなら
それをunionにすれば同じメモリ上に配置できるから節約できるでしょ?
ただしそのunionの値を読み出す時は
どちらの値が入っているかに気を配りながら使う手間が必要。
#include <stdio.h> typedef struct { int sampling_rate; }AAC; typedef struct { int sampling_rate; }AC3; typedef struct { union{ AAC aac; AC3 ac3; }u; }SOUND; int main(void) { SOUND sound; // なにかの処理 } みたいな?
40 :
38 :2009/05/15(金) 17:53:18
>>36 これでもわからなければ諦めろ
つーかググれ。
41 :
デフォルトの名無しさん :2009/05/15(金) 17:56:48
ありがとうございます!よくわかりました
こんなのはありそうだね。 typedef union { struct foo { int x; int y; } s; int array[sizeof(struct foo)]; } coord_t;
C99のソースを書く奴は単なるオナニー
unionは二分木の実装で見かける気がする。
通信では、普通に使う
クラスを配列にすることはできますか?
できます
C言語で、linux のioポートのアクセスを行う実装を行いたくて #include <linux/types.h> #include <linux/config.h> #include <asm/system.h> include <asm/io.h> これらのファイルがないと怒られます、どうしたらいいのでしょうか?
Redhat系なら、kernel-headersとかその辺のパッケージを入れる。 それ以外なら Linux板で聞け。
>>49 Thx
slacklwareなんでlinux板で聞きます、因みにkernel-headersはインストールしているのですが
カーネルを 2.6.29.3に上げているためだと思います、 2.6.29.3用のkernel-headersをインストールしないといけないのでしょうかね?
>>47 ありがd
クラス覚えた手だけどこりゃ便利そうだ
プログラム板から、誘導されました C言語で、linux のioポートのアクセスを行う実装を行いたくて #include <linux/types.h> #include <linux/config.h> #include <asm/system.h> include <asm/io.h> これらのファイルがないと怒られます、どうしたらいいのでしょうか? 因みに、鳥はslacklware12.2でkernel-headersはインストールしているのですが カーネルを 2.6.29.3に上げているためだと思います、 2.6.29.3用のkernel-headersをインストールしないといけないのでしょうか?
53 :
デフォルトの名無しさん :2009/05/15(金) 22:52:38
C言語で一つの処理?を終えるまでにかかる時間を計算する方法ってありますか? CPUが100Mhzだとすると、 たとえば、*buf = 1000 とか一つ処理するのにどれくらいかかりますか?
1/100000000秒じゃね?
>52 J 釣りか ? それくらい解決できないようではC言語を使わないでもらいたい。 昔の人は考えた、無ければ作ればいいと。 findでgrepのviだろjk.
>>53 コンパイルしてアセンブラのコードを見ないと。
最近のCPUは複雑だから、それでも難しいと思うけど。
57 :
デフォルトの名無しさん :2009/05/15(金) 23:10:21
>>56 アセンブラのコードみたらわかるというわけでもないのですね
そういうのって計算できないものなのかな
おおよその計算ができるプログラムなりあったりしないのでしょうか?
CPU作ってる人たちはそういうの計算してるんですよねやっぱり
大体は判るよ。CPUが指定されているのならね。 アセンブラの判る人間なら、この処理はこんなコードに落ちるから、何クロックとか推測出来る。 同じ周波数でもCPUによってかかる時間が違うから単に100MHzとか言われても答えようがない。 もっと問題なのは *buf = 1000; なんてのはコンパイラの最適化でどうなるか判らないことだ。
>>57 10年くらい前に読んだアセンブラの本にはVTuneってツールで
プロファイルしながら、アセンブラのコードを最適化する例が
乗ってたよ。
ググったら、今でも売ってるみたいなんで、そういうツールを
使えばわかるんじゃないの?
最速のケースと、最悪のケースは計算できるだろうけど。 あとは、CPUのシミュレータがあるからね。
61 :
デフォルトの名無しさん :2009/05/15(金) 23:24:21
>>58 Mhz以外に何がわかればいいのでしょうか?
計算方法としては
Cのソースをコンパイル→アセンブラ見る→CPUから計算? という感じでしょうか
>>58 たとえ同じCPUでも、その前のコードによってキャッシュやパイプラインの状況が
異なってくるから何とも言えないというのはある。
63 :
デフォルトの名無しさん :2009/05/15(金) 23:28:09
>>62 大体はわかりませんか?
たとえば10000回ループさせたとして
これくらいだと、100ms〜200msかかるとか
あと、いい加減sageろ
>63 大体は判るって言ってるだろうが。 日本語に不自由してるのか? アセンブラ勉強しろ。その範囲で判る範囲の推測は出来る。 それより実測した方が早いがな。
67 :
デフォルトの名無しさん :2009/05/15(金) 23:36:45
大体は判る その大体すら教えてくれないのにそういわれても
>>67 CPUすら教えてくれないのにそう言われても。
>>63 実測するのが早い。
実測できないのなら、MIPS値がわかれば一秒間に実行できる大体の命令数がわかる。
環境によって変わり過ぎる ハードウェア等の動かない前提のものならともかく、 OSやサービスパックの有無、画面のサイズなどの描画関係やアンチウィルスソフトなんかも走ってればかなり差も出る ってか、実測すれば??
そのためのプロファイラだろ
アセンブラで局所的にパフォーマンスどうこうって話をしてるのに、 サービスパックの有無とか安置ウイルスソフトどうこうとかって話はないだろ。
だよねw
例えアセンブラでも、
>>67 の書いた情報だと、
「全フットプリント合計の最悪値以下」しか答えようがないでしょ。
キャッシュやらパイプラインやら環境要因/外的要因が多すぎる。
組み込み用のMMUもないCPUを割り込み禁止で使えば、
好きなだけアセンブラから完全な精度で値を割り出せるよw
みんなわかりきってて言及を控えた事だから書かなくていいよ
unionの話ちょっと前に出てるけど unionをどんな時に使ってるんだ?
上にも出てたが、最有力はネットワークのパケット関連だろ。 あとは特定のファイル形式のヘッダとか。 俺は組み込みやらんから知らないけど、メモリの制約が大きい環境では勿論メモリ節約の意味で使うだろうし。
インストール完了して、ライブラリなどの参照先を全て設定してあるのですが コンパイルで3回ほどやったら固まったり ビルドですぐに固まったりして 何度も強制終了して困っています。 何か解決策はありますでしょうか? 使用 VC++6.0 OS WindowsXP Proffesional メモリ 4GB CPU Core2 Duo 3GHz です。
それは C/C++ の質問とは言わん。が、まあいい。 >使用 VC++6.0 これを新しくするか >OS WindowsXP Proffesional これを古くする。
>>レスありがとうございます。 新しくするというのは VC++ 2008にするという事ですか?
VC++6.0は時代の遺物じゃね。 もう使い物にならん。
小林健一郎さんの、「これならわかるC++」と 矢沢久雄さんの「C++クラスの継承」を読み終わって 平山尚さんの「ゲームプログラマになる前に覚えておきたい技術」を読んでみたのですが 最初のプログラムって、初心者が思いつくようなものなのでしょうか?orz 初心者向けと聞いて開いてみたのですが、難しくて挫折しそうです・・・。 平山さんの本を読むために、読んでおくべき本があったら教えてください・・・。
読むだけじゃだめ、何か作っていかないと
追加、本読めば作れるようになれっると思うのはひじょーーに甘い。 簡単なものからで良いから、数を作ることが必要。 例えば、マラソンの本を1万冊読もうがマラソン選手になれるわけではない。
>>83-84 即レスありがとうございます。
プログラムも自分なりに作ってはいるのですが
x軸やy軸などの基本書に書いてなかった概念が出てきて
何か足りない知識があるのだろうか、と思っています。
まて、それは数学の知識や物理の知識で、2Dなら中学程度でOKだけど。 本当に知りたいのはなに?
>>86 数学の知識があればいけるのでしょうか?
私の単なるプログラムの経験不足でしょうか・・・。
目にしたことない単語が多く出てきたので、難しく感じています。
数学は大学センター試験で1A,2B両方とも80点取れる程度です。
>>87 なんとなくスレ違だが、
>>85 の例題が悪い。
>私の単なるプログラムの経験不足でしょうか・・・。
これが答え。
易しく言うと、ある現象、キャラガX軸方向に歩いていきます。とした場合。
あなたなら、簡単に計算式が予想できると思う。しかしだ、
それをプログラムとした場合のモデル化が予想できない状態である。
この解決策は、ずばり、経験だけ。あなたなら経験すればすぐ作れるようになる
ゆとりの理想像にだいぶ近いな
>>88 レスありがとうございます。
やはり経験不足なのですね。
色々なプログラムに触れて勉強したいと思います。
どうもありがとうございました。
宿題スレの問題を自分の力だけで解けば、糸口が見えてくると思う。 解けない時は、他の人の回答を 手打ちで入れる。 コピペは駄目ぜったい
ゲーム作りたいのなら、HSPあたりがいいんじゃない?
誕生日を祝ってくれるプログラムを作りましたが何も表示されません。 やはり誰も祝ってくれないのでしょうか。 int main(void){ int i; for(i=0;i>100;i++) printf("お前、お誕生日おめでとう。\n"); return 0; }
>>93 釣り?マジ?コマンドラインからそのプログラムを起動しろ
95 :
94 :2009/05/16(土) 23:46:16
>>93 その前に
i>100
この停止条件がおかしいじゃん。
俺が祝ってやる int main(void){ while(1) { printf("お前、お誕生日おめでとう。\n"); return 0; }
あーーーーーーーっ } 何も言うな orz やはり祝えなかった
ありがとうございます。 しかしこういうエラーが出るんです。 'int' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
まじで、コマンドプロンプトなのか? ちょっとOS何か言ってみ
OSはウインドウズです。 もしかしてウインドウズだとできないんですか?
101 :
93 :2009/05/17(日) 00:01:30
解決しました。 一年後よろしくお願いします。
>>100 んなわけがない
まさかソースを直接実行してないよね?
コンパイルはしてるよね?
コンパイルはコマンドラインでするんですよね? ちゃんとプログラムを打ち込んでるつもりなのですが・・・
DOS窓でコンパイルか、なにC使ってるか疑問だ
おまえら全力で釣られてていいの?
int main(void){ printf("今日、僕ね、万個からこんにちはしたんです。\n"); main(); return 0; }
コマンドラインで int main(void){ って入力するとそのエラーになるなw
>>107 関係ないけど
>万個からこんにちはしたんです
「中に誰もいませんよ」を思い出した。
C++にて unsigned x=10; と言ったらxの型は何になるんでしょうか? unsigned intですか?
111 :
デフォルトの名無しさん :2009/05/17(日) 12:04:29
yes
112 :
110 :2009/05/17(日) 12:09:42
>>111 unsigned intと書かずに
unsignedとだけ書くメリットは短い以外に何かありますか?
今後の互換性とか何か?
113 :
デフォルトの名無しさん :2009/05/17(日) 12:12:59
なんのメリットもない気がする
省略かっこいい 俺すげー(゚∀゚)神のヨカーンな気分にひたれる
ギャル語みたいなもんか
R&K を厨二病だなんて言ってやるな。
117 :
110 :2009/05/17(日) 12:56:34
まあ確かに long intと書かずにlongで済ませたりしますが、そんな感じですか。 ありがとうございました。
ポインタ → 整数型(64bit) → ポインタの変換って仕様的に保証されていますか? C で確保したリソースを他システムにハンドル値として渡し、他システム側からの 解放命令やセッション中断で解放したいんですが。
thankyou
整数型への相互変換自体は保証されているが、それが64bitというのは保証されて無い というのが建前で そのためにわざわざintptr_tとかUINT_PTRとかが用意されているんだけど まあC以外との通信なら仕方ないかな。 既に環境依存だし、64bitってのも問題ないんだろう。 キャストの方法(構文)はどうでもいい。
テキストの改行コード \r \n を削除して バイナリファイルとしてファイルに出力後 メモ帳でみると1024文字目で改行されて表示されるのです バイナリで開くと改行コードは取り除かれているのですが これはWindowsのメモ帳の仕様でしょうか?
コマンドプロンプトから type [ファイル名] で改行されていなかったらメモ帳の仕様
質問です。 ・・・ 俺:「RSA暗号で暗号化されているので安全です」 上司:「RSA暗号とは?」 俺:「素数を使った暗号なのですが・・・要するに解読しようと思ったら何万年もかかってしまうから、 実際には解読しようと試みる人はいないだろうという意味で安全な暗号なのです。」 上司:「高速なコンピュータを使ったら解けてしまうのではないか?」 俺:「TOP500という世界で一番速いコンピュータのリストがあるのですが、その上位のコンピュータでも私たちが生きている間には解けませんよ。 まぁ、量子コンピュータなんかがあれば一瞬で解けてしまうと聞いたことがありますが、幸か不幸か量子コンピュータをまだ誰も完成させていません。」 上司:「でもお前が知らないだけかもしれない」 俺:「いえいえ、量子コンピュータなんかができたらすごいニュースになりますよ」 上司:「ほかの企業や組織が秘密裏に作っていたりしたらお前にわかるのか?」 俺:「・・・」 ↑の「俺」がRSA暗号が安全だと上司を説得するにはこの後どのように続ければ良いでしょうか? 正論でお願いします。
「他の企業でも積極的に使われていますよ」
>>124 100%開かない鍵のかかった扉は、もはや誰にも明けられない扉だと思わなければなりません。
それと同じで、正当な手順で暗号を解除して元に戻すことが出来るようにしておく以上、
100%の確率で不正な解除を防げるようなことはありえません。
現行の規格で利用可能な現実的な意味で安全な暗号なんです。
これでどうだ?
つーかスレちがいじゃね?
>>124 2048ビット値の素因数分解してもらえ
もしくはできるプログラムを書いてもらえ
上司:「でも俺が書けないだけかもしれない」
つい最近始めた者です。 知り合いのサンプルコードをみてみると グローバル変数に OBJ gPlayer; という欄があったのですが、これはどういう変数なのでしょうか?
OBJ型のgPlayerという名前の変数です
OBJ型っていうのが本に書いてないんですが どういう型なんですか?
132 :
デフォルトの名無しさん :2009/05/19(火) 00:00:44
学校でUNIXでC++やってるんですが、 どうやってプログラム書く画面開くんですか? lsとか色々入れてたんですが、どこに何を入れればテキストエディタ開けますか。 どうすれば、コンパイルかけれますか?
136 :
デフォルトの名無しさん :2009/05/19(火) 00:15:47
>>135 なるほど
探してみます
ありがとうございましたー
>>132 lsとか打ち込む画面で、viと打ち込めばエディタが立ち上がる。
プログラム打ち込んだら、
cc プログラム
でコンパイルできる。
>>124 「見つけた人はCIAとFBIから消されますので、公的には発表できません。ですから安心です」
とでも言っておけ。
つまんね
>>132 % vi hello.c (プログラム)と打ち込めばviエディタが立ち上がる。
[a]または[i]プログラム main(){} と打ち込んだら、
[Esc][:][w][q][Enter] でエディターを終了する。
% cc hello.c (プログラム)でコンパイルできる。
バカな上司は持ちたくないですな
144 :
デフォルトの名無しさん :2009/05/19(火) 15:41:16
DOS窓に出力したいんですが、どうすればいいのですか?
146 :
デフォルトの名無しさん :2009/05/19(火) 20:14:59
AllocConsole
147 :
デフォルトの名無しさん :2009/05/19(火) 20:16:41
HTMLを解析するライブラリはないでしょうか? 言語はC/C++です
148 :
デフォルトの名無しさん :2009/05/19(火) 20:38:47
久しぶりにプログラムを行ったらすごく基本的なところで躓きました double x; x=2/5; printf("%f\n",x); この結果が0.0000になります もちろん0.4000にしたいのですが何が悪いんでしょうか?
今ゲームや単純な練習用プログラムを作ってるんですが、 どこからどこまでクラスを使うべきか、等がよくわかりません ○○の場合は△△を使うのが良い、というようなことを書いてあるサイトなどはありますか?
>>151 デザパタの本でも読めばいいんじゃね?
って思ったけど、本読んでも試行錯誤した経験がないとピンとこないかもしれない。
OOPで作るなら、全部オブジェクトでつく霊
>>152 ありがとうございます
作りながらそういう分野も勉強してみます
float型の変数の値をRS-232で送りたいので8bitずつに分けたいんですが、どうすればできますか? ビットシフトや論理積とろうとしてもエラーがでてしまいます。
union { flaute fdat struct { char cdat[4]; } } udat;
ありがとうございます。unionで出来ました。unionってこう使うものだったんですね でも、何故structでchar cdat[4]を括ってるのか分かりません。何故ですか?
IDAという解析ツールのver5.2の体験版が欲しいんですが、誰か持ってませんか?
製品版買え
>>157 別に括りたくなければ括らなくていいよ。それと、unionを使うことは環境依存という修羅の道に進むことだと言うこともお忘れなく。
# 尤も、float値をバイナリのままシリアル伝送しようと言う時点で既に修羅の道だけど。
int i = *(int*)&f;
>>161 このケースでどのようにmemcpy()を使うのか、詳しく。
できた unsigned char c[sizeof(float)]; float f; f = 10000000.0f; memcpy(c, &f, sizeof(f)); for (int i=0; i<sizeof(c);i++) { printf("%#x,", c[i]); }
memcpyしなくてもできた float f; f = 10000000.0f; for (int i=0; i<sizeof(f);i++) { printf("%#x,", ((unsigned char*)&f)[i]); }
>>124 団塊世代の上司ってそんな感じのやつが多いよなあ。
解りもしないくせに説明しろだの言ってくるから困る。
解るためには自分で理解しようという努力が必要なのにその努力もせずに、
自分が理解できないのは説明しているやつが悪いからだ、と責任の押しつけまでしてくることもある。
んで結局は他の何人かが良いと思うか悪いと思うか聞いて直感で判断するわけなんだが、
解らないなら最初からそうしろ、と思うわけなんだよ。
結局のところ、団塊世代は対抗意識が非常に強くて教育者あるいは指導者しての能力が致命的に欠落していると言わざるを得ない。
ろくに説明もできないのに何言ってんだか。 内容が知りたいわけじゃなくて、当人がちゃんと理解してるか判断するために 説明させてるんだよ、たぶんw。
新しい暗号技術でも開発しろというのか?
>>167 つまり部下を信用していないということか。
社内にまで敵を作って大変ですね。
どうせムズカシイ理論とかは理解できないんだから、せめて成果で判断すりゃいいのにね。
最初は小さいことから成果を積ませて、だんだん大きいことをやらせれば良いのに。
>>164 >>165 わざわざコピーする理由は? 元質は転送が目的なんだから、コピーしなければいけないなんて要件ないよね。
わざわざunionにする理由は? 元質は転送が目的なんだから、unionにしなければいけないなんて要件ないよね。
で、コピーするコストを掛ける理由は?
頭悪いな
またメモリ節約厨か
>>173 charの配列にコピーすれば取り出せるんじゃね?
って思ったけど、じゃあcharにキャストすればいいんじゃね?
という具合に思考が遷移したんだよ。
ごめんよ。
>>167 いや、技術的に正確かどうかなんてどうでもいいんだよ。
納得させられるかどうかだけが問われる。
>>177 だから、単に自分の権威を見せつけたいというのと対抗意識の現れでしかないんだよ。
団塊世代は技術もなければ精神性も低い。 社会のゴミですね。
>>178 うん、そうかもね。
だから?w
それで出世あきらめるの?
もう俺が悪いって事でいいからけんかはよせ
あーあ 団塊世代のせいでまた人材が日本から流出していく。 さすが社会のゴミ 国賊 団塊世代は日本をつぶす気か
何でも他人のせいにするところはどっかの民族とそっくりだな。
>>183 団塊世代が悪いかどうかは知りませんが、うちの会社でも団塊世代の天下りを受け入れない方針になったみたいですよ。
まぁ、最近の世論的に天下りはまずいからでしょうが。
Windows上でLinuxを起動させたいのですが VMwareソフトウェアのどのシリーズを選んだらいいのでしょうか?
vmware serverをダウンロードしてインストールしる
ようしゃなく英語やったorz
日本人のくせに英語もできないのか
敵性言語として長く使用を禁じられていたので…
じゃぁ なでしこでWMwareと同レベルのものを作ってください
今は属国なんだからしっかりしる!
#include <iostream> using namespace std; int main(){ int tmppl; cin>>tmppl; int const pl=tmppl; int php[pl]; return 0; } あらかじめ数字を入力して変数tmpplに入れておき const plの初期化の際にtmpplを使おうと思ったのですがコンパイルエラーが出ます これは無理なんでしょうか? また配列の要素数をキーボードで入力した数字で決めたいのですが、どうすればよいでしょうか?
>あらかじめ数字を入力して変数tmpplに入れておき >const plの初期化の際にtmpplを使おうと思ったのですがコンパイルエラーが出ます >これは無理なんでしょうか? 無理です >また配列の要素数をキーボードで入力した数字で決めたいのですが、どうすればよいでしょうか? std::vector
int *php=new int [pl];
それは初期化とか代入の話じゃなくて 配列の添え字はコンパイル時定数でなければならないという仕様の話じゃないのかい? っていうか、前にもまったく同じ回答をした気配がする。
extern就職誌というのを知らなかったので試してみたら疑問がでました。 (main.cpp) #include <iostream> int global = 100; extern void func(); //ココをexternとっても動作する int main() { std::cout << ::global << std::endl; ::func(); return 0; } (another.cpp) #include <iostream> extern int global; void func() { std::cout << ::global << std::endl; } 俺の理解している範囲ではexternをつけると「この変数もしくは関数はグローバルだ。ただし定義自体はこのファイルでなくて 別のソースファイルでしているから気をつけろ。」ということなのだが、上記のソースではどうも動作が違う。 最初にメイン関数内でグローバル変数のglobalを表示するのはいいだろう。 次にグローバル関数のfuncに突入するのだがfuncはexternがついているので別ファイル、すなわち another.cppで定義されている。それで実行は可能なのだが試しにメインのextern void func()からexternをとってみた。それでも 動作したのだが、なんで動くんだ?
>>extern就職誌 素晴らしい
で、とりあえず、externは、「この名前がグローバルだ」とするためのもの。 そのコンパイル単位で定義されているかどうかは関係ない。 それと、関数はデフォルトでextern。 つまり、staticを付けないで宣言(定義も)されたものは、全てexternと同等となる。
海外転職誌みたいだな。
本題に答えろ
おまえ、辞書引いたのか。。
>>200 んー、よくわからんのですがとりあえず関数はおいておいて変数については
「この変数はグローバルだ。ただし定義自体はこのファイルでなくて 別のソースファイルでしているから気をつけろ。」
この定義は間違っていますか?それとも合っている?今、同じソースファイルで宣言だけでなく定義もしたらエラーに
なったのですが。。わかりやすい説明モトム
(main.cpp)
#include <iostream>
extern int global;
int global = 4;
void func();
int main() {
std::cout << ::global << std::endl;
::func();
return 0;
}
(another.cpp)
#include <iostream>
void func() {
std::cout << ::global << std::endl;
}
どんなエラーだよ まさか宣言しないシンボルを使おうとかしてないよな
another.cppの中ではglobalが何者かわからん。
動けばいいんだよ。動けば。
コンパイルできない なんでか教えて #include <iostream> class Point { private: int m_x; int m_y; public: Point(int x = 0, int y = 0): m_x(x), m_y(y) {} void show() { std::cout << "m_x = " << m_x; std::cout << ", m_y = " << m_y << std::endl; } Point *operator+(Point *p) { m_x = m_x + p->m_x; m_y = m_y + p->m_y; return *this; } }; int main() { Point *p1 = new Point(3, 4); Point *p2 = new Point(5, 8); p1->show(); p2->show(); Point *p3; p3 = p1 + p2; p3->show(); return 0; }
>>209 Point *operator+(Point *p) {
...
return this;
}
p3 = *p1 + p2;
コンパイルするだけならこう変更する
ありがとうございます 仮にp3 = p1 + p2; を計算させたい場合は関数定義はどうすればいいですか?
ポインタ演算をオーバーロードするのはオススメできない
どうしてもやりたいなら「フレンド関数 オーバーロード」あたりでぐぐれ
あと補足だけど
>>210 はp1==p3になるから気を付けてね
了解しました。
std::cout << "ABCDEFGHIJKLMN"; std::cout << "\r12345\n"; とすると12345ABCDEFGHIJKLMNと表示される。 \rは復帰、現表示位置がその行の先頭に移動する。 というのはわかるが、一体何の役に立つんだこれ? マジで使ったことある人いたら教えてくれ
歴史的遺物
216 :
214 :2009/05/21(木) 16:41:05
興味程度にどんな歴史的遺物か教えてくれ
コマンドライン上で簡易進捗バー出すのに便利。
>>205 externは、別のファイルで定義しているリソース(変数とか)を
このファイルでも流用するよ、っていう宣言。
C++では、変数名・関数名などは、その変数・関数を使用するより前に、
それが何なのかを同じファイル中でコンパイラに教えてやらないとエラーになる。
お前さんのソースの中で、グローバル的に使用されているのは、
void func()とint globalの2つ。
func()を使用しているのはmain.cppだが、ここではfunc()を使用するより
前に
void func();
と宣言してあるから無問題。
一方、another.cpp内で使用されているglobalは、定義はmain.cppでしているが、
another.cpp内で宣言していない。
だからコンパイラはanother.cppのglobalという識別子が何なのかという
情報を教えてもらってないのでエラーになる。
>>214 つか、それ12345FGHIJKLMNって表示されないか?
処理系依存なんかな。
すまん質問させてもらう void *operator new(size_t size,const char *pname, int nline ); #define new new(__FILE__, __LINE__) とnewを実行したソース名と行数を取ってるんだが これのdelete版が出来ない もしかしてdeleteの方は無理? STL使ったら、妙なdeleteが増えて特定したいんだ
>>220 処理系っつーか、出力装置 (と、その状態) による。
MFCを使ってライブラリを利用するのと SDKで一からアプリケーションを作成するのは どちらがいいでしょうか?
MFC。間違いない。マクロやキャスト使いまくりで興奮する。
最初のうちはSDKで必死になって窓の基本を覚え、その後MFCをさわって逝く まあ俺のことだが
226 :
205 :2009/05/22(金) 01:07:35
>>218 やっと理解できたー!有難う。
というわけで俺んなかでの結論;
「extern就職誌をつけられた変数・関数はこのファイルでこれから使うけどどっか別のソースファイルで
指定されてるからね!ちなみに関数のプロトタイプがあるとしたらそれはextern就職誌つけなくてもそれは
externとみなされてるから、別のファイルで指定されてるかもしんないし、ひょっとするとこのファイルの
後で定義されてるかもしんない」
という感じか。
なんか認識にまだ問題有ったら指摘して
就労意欲は汲み取れた。
ワロタ
まずはexternなしでソースを書いてコンパイルしてエラーが 出たらexternをつければよい
そもそもexternって使う機会あんまなくないか?
グローバル変数
グローバル変数そのものをほとんど使わないからな
グローバル変数を使うとしても、 初期化の問題を恐れてほとんど全部 関数スコープ内でのstatic変数の参照の呼び出しにしちゃうし (つまり結局グローバルスコープではない。) 。
グローバル変数でもグローバル変数を入れるクラスを作るからね
グローバル変数がグローバル関数になり、グローバル関数がグローバルオブジェクトになるわけですね。
template <int N> foo bar(Hoge hoge1, Hoge hoge2, … , Hoge hogeN) みたいな感じでtemplate <int N>のNに対応して引数の数を変える関数とかって標準で作れますか?
多重定義しかありません
可変引数リストじゃだめなんだろうか
Cを使ってlsライクなプログラムを作ろうとしてて、自分の環境下で動いているlsコマンドの動作を元に作ろうと思ってるんだけど ls-オプションの動作のCで書かれたソースはコンピュータ内にあるのでしょうか?
引数の個数が変化すれば bar() の中身も変える必要があるしね
今加速度センサから値を得て速度を出してるんですが、ノイズや誤差の影響で 加速度を積分した値が静止させても0に戻りません。 そこで出来るだけ正確に無理矢理0に戻そうとしているんですが、何かいい方法ありませんか? あと、このようなフィルタ処理?とかを扱ってるスレってありますか?
getopt
C/C++でHTMLのパーサってないでしょうか?
なんでop[]は引数をひとつしか取れないようにしたんだろう
>>245 C++はPascalじゃないよ
[a, b]なんて書き方はないから
何をブチ込んでもいいんだから 気が済むまでメンバ変数詰め込んだクラスを引数にとる[]を定義すればいいじゃないか
delete a, b;
とかやるのと一緒だな
>>247
250 :
246 :2009/05/23(土) 22:09:52
>>247 別に
>>245 はPascalとごっちゃにしているわけではないだろう。
オペレータオーバーロードとしては[a, b]の形も認めてもいいんじゃないかって
>>245 は言いたいんじゃないの?
C++はカンマ演算子の意味が違うから無理 関数呼び出しはむしろ特別な場合
252 :
246 :2009/05/23(土) 22:28:16
>>251 そりゃ知っているけどさ、
出来たら便利じゃない。
今からじゃ互換性の関係があって無理だけど、
最初の段階で可能であるように仕様を定めておけばよかったのでは。
・・・ということも踏まえた上で、
だから俺は「ハゲに聞いてくれ」と言ったのだ。
C言語で連立方程式を解くにはどんな方法がありますか? 2次方程式だけじゃなく3次4次と応用が利くようなやり方で
あほか ガウス法は一元一次方程式にしか使えん 反復法なら使える
もしかして: ガウスの消去法
掃き出し法だろ常考
お前ら・・・(汗 3次とか4次にも使えるようにって書いてあるのが読めないのか?
Gauss-Seidel反復法マジオススメ
反復法で10万次方程式解いて悦にひたるのがマイブーム
long num=100; このとき ++(++(++(++num))); って動作は未定義になりますか? 一つの式の中で値が複数回変更されているように見えるのですが。
>>261 ならない
カッコがついているので副作用完了点がカッコの中で終了するから
263 :
261 :2009/05/23(土) 23:14:35
>>262 となると、自作クラスの前置インクリメント演算子のオーバーロードの返り値は、
const参照で*thisを返すのではなく
非constな参照で*thisを返すべきなのですね。
ありがとうございました。
>>261 そもそも
++(++foo)
は、++fooが評価後に値なので、++を作用させることができない気がするのだが
これがC++の参照返す++演算子のオーバーロードならどうなるか知らないけど
265 :
261 :2009/05/23(土) 23:19:51
>>264 でも一応
long num=100;
++(++(++(++num)));
はコンパイル可能です。
Cでは前置も後置も値のコピーを返すけど C++の前置は自身を左辺値として帰すので有効。
ああ、cとc++では扱いが違ったのですね。 c++脳なので知りませんでした。
HTMLパーサ自作できたのだわ 1時間もかからなかったのだわ こんなに簡単なのでググってもでないわけだわ JAVA, Ruby でパーサ使ってる奴って・・・
+は可算演算子だよね。 では%は何演算子と呼べばいい?
剰余演算子
よく言われる
273 :
269 :2009/05/24(日) 13:00:27
そこらへんのパーサって非標準(タグ閉じ忘れとか含め)のHTML読めるの?
STLの投げる例外の一覧みたいなサイトってありますか?
276 :
269 :2009/05/24(日) 14:39:30
+num や -num といった、符号をあらわす演算子はなんて言えばいい? 単項演算子じゃおかしいし、符号演算子とか??
性符号・フフ郷
int foo(bool arg1, bool arg2) { if(arg1){return 1;} else if(arg2){return 2;} else return 3; } この関数をこれ以上速く記述することって可能でしょうか? 例えばelseを無くしたりすることによって。
速く記述する、ってどういうこと? 短くの間違い?
>>279 int foo(bool arg1, bool arg2)
{
return arg1 ? 1 : arg2 ? 2: 3;
}
static int f[][] = {{3, 2}, {1, 1}}; int foo(bool arg1, bool arg2){ return f[arg1][arg2]; }
static int* f = {3, 2, 1, 1}; int foo(bool arg1, bool arg2){ ASSERT((!!arg1) == arg1 && (!!arg2) == arg2); return f + ((arg1 << 1) | arg2); }
>>279 速くするんだったらinline asmかな
やり方知らんから教えられないけど
285 :
279 :2009/05/24(日) 18:06:32
>>280 速く動作するように記述したいという意味です。
確かに速記でもするかのような書き方でした。
>>281-283 ありがとうございます。
>>284 ありがとうございます。
一応標準C++だけで書きたいと思っております。
みなさんありがとうございます。
連続質問で申し訳ないのですが、
int bar(bool arg1, bool arg2)
{
if(arg1&&arg2){return 1;}
else if(arg1||arg2){return 2;}
else return 3;
}
でしたらどう記述するのが(動作速度的に)ベストでしょうか?
前のもそうだがその程度ならそのまま書くのが一番良いと思う。 特定の環境を想定しないのなら尚更だ。
>>286 たしかに、ボトルネックにならないなら素直な書き方が一番ですかね。
ありがとうございました。
数人の身長が記されているtxtファイルを読み込んで、 140 ー 145cm ** 145 ー 150cm * 150 ー 155cm ** 155 ー 160cm ** 160 ー 165cm **** 165 ー 170cm ** の、ようにヒストグラムで出力するプログラムの作り方を教えてください。
読み込んで出力すればいいよ
>>289 1.テキストファイルを読み込む
2. int配列にそれぞれの範囲の要素を加算していく
3 配列の要素の値の数だけ*を表示する。
順番に作っていけばいい。
292 :
287 :2009/05/24(日) 21:47:55
>>288 ありがとうございます。
・・・ボトルネックになるようでしたら挑戦してみます。
float A[4][21]; でA[2]とA[4]を入れ替える方法教えてください
>>293 std::swap(A[2][x],A[4][x])
でxを0〜21まで回せばいいんじゃない?
for(int i = 0; i < 21; i++){ float t = A[2][i]; A[2][i] = A[4][i]; A[4][i] = t; }
普通にmemcpy3回じゃない? ビットスワップでもいいけど
どうかなぁ。並列化考えたらmemcpyは不利な気がした。
d 一個一個交換する方法でやってみます こんな風にしてたんだけど何故か変な値になっちゃうんだよね。 memcpy(B,A[i],sizeof(float)*(n+1)); memcpy(A[i],A[i+j],sizeof(float)*(n+1)); memcpy(A[i+j],B,sizeof(float)*(n+1));
A[4][n+1]; B[n+1];としてね
クラスの2次元配列を用いるにはどう宣言すればよいでしょうか 具体的には、 class Complex { public: double re;//実部 double im;//虚数部 }; という複素数のクラスを用いて行列を作成したいのですが、メインで #define SIZE 5 int main(){ Complex **comp_mat; comp_mat = new Complex[SIZE][SIZE]; } のようにしますと(*)[5]型は**型に変換できませんとエラーが出ます。 どのようにすればいいのかわからないので1次元で宣言して以下のように アクセスしていました。(comp + i * SIZE + j )の記述がわかりにくいので 簡単にしたいのですが、よろしくお願いします int main(){ int i , j ; Complex *comp_mat ; comp_mat = new Complex[SIZE*SIZE] ; //compを(-1 , -1)の値で埋める for( i = 0 ; i < SIZE ; i++ ){ for( j = 0 ; j < SIZE ; j++){ (comp + i * SIZE + j ) ->re = -1.0 ; (comp + i * SIZE + j ) ->im = -1.0 ; } } ・・・・省略・・・・ }
>>293 std::swap(A[2],A[4])はどう?
C++で fout << "Hello World" << endl ; などでファイル書き込みができますが、 foutで複数ファイルへの書き込みを区別するにはどうすればいいのでしょうか FILE *f_eng_p , *f_jpn_p ; fprintf( f_p , "Hello World ") ; fprintf( f_s_p , "こんにちは 世界") ; のようにファイルポインタを2つ宣言してfprintfで行うのでしょうが、 fprintfは記述がめんどくさいのでどなたか知恵をお貸しください
すみません、上の f_p と f_s_p は以下の間違いです FILE *f_eng_p , *f_jpn_p ; fprintf( f_eng_p , "Hello World ") ; fprintf( f_jpn_p , "こんにちは 世界") ;
306 :
294 :2009/05/24(日) 23:04:25
>>304 出力ストリームを複数持てばいいだけじゃないの?
>>303 それだとエラーでちゃいます。swap(A[2][x],A[4][x])の方法で上手くうごきました。
あと、すみませんがもう一つ質問お願いします。
void func(二次元配列を受け取る){
処理
}
int main(){
float A[x][y];
A[0〜x][0〜y]に値を代入;
func(?);
return 0;
}
ここで関数funcはA[4][5]でもA[99][99]でもどんな大きさの二次元配列でも
受け取れるようにしたいんですが、関数funcの宣言の引数と、main関数内で
関数funcに渡す引数はどのようにすればいいですか?
それは無理なので std::vector< std::vector< float > > 使っとけ
void func(float *a, int m, int n){ 処理 } int main(){ float A[x][y]; A[0〜x][0〜y]に値を代入; func((float*)A, x, y); return 0; }
ありがとうございます。無理なんですね。どうりで調べてもA[][5]とかしか出てこないわけだ C言語でしたいのでA[]にしてA[y*x+y]でアクセスすることにします。
>>312 これは知らなかった。でも、VS2008でやってみたらエラー出て無理だった
マイクロソフトはC99シカトしてます。
0Xどうするんだろうね。 でも、C++/CLIはもはやC++なのかどうなのかも怪しいw
>>314 VS2010でauto、decltype、λ式、右辺値参照、static_assertは取り敢えず入れる
予定だそうだ
それ以上のC++0x対応は今の所未定
C++ なんだから配列には vector 使おうよとか 配列の配列をポインタのポインタに置き換えられないことは 大概の教科書で懇切丁寧に説明しているはずなのでもう一度教科書読んでねとか 全力でマクロは避けろ( C++ Coding standards )とか なぜに FILE 構造体?とか いろいろ思った^^
>>317 その辺りはD&Eを読んでもらえば歴史的経緯がよくわかる
Cは一人、いや二人の人間が独善で作った言語だが
C++はコミュニティに属する数多くの人の意見を元に作られてる
中心人物は禿だったがもはや禿が一人で作ったC++とは絶対に言えまい
>>301 動的二次元配列の作成と削除は
Complex **comp_mat = new Complex *[SIZE];
for ( size_t i = 0; i != SIZE; ++i )
comp_mat[i] = new Complex();
for ( size_t i = 0; i != SIZE; ++i )
delete [] comp_mat[i];
delete [] comp_mat;
でも、C++でこんなことしちゃらめ。
>>319 なんでダメなの?
俺はよく使ってるぜ
コンストラクタとデストラクタにぶち込んでおけば十分じゃん
vectorを使う事もあるけど少なくとも速度が最大要求の
科学技術計算では
>>319 の方法をよく使うぞ
速度重視ならクラスで包んじゃダメでしょ。 ・・・それはさておき、C++のモダンなスタイルは可読性重視になってるからっていう弱い理由。 もちろん、わかって使う分には問題ないよ。
「速度が最大要求」ならクラスはおろか関数呼び出しもNGでしょ^^ なにより new と delete 自体が遅い。 memcpy を使うほうが一般的。 どうしても C++ ライクに書きたいなら、せめて allocator クラス使おうよ。
memcpy じゃなくて malloc の間違いでした^^スマンコ
そもそも速度優先なら、そんなに頻繁にメモリの確保/解放はしない。 どうしてもって言うのなら、自前でメモリ管理する。
>>321-322 いや速度重視ならmallocもそのままでは使わないだろ。自前でプールとかしてさ。
だな。つか new 遅すぎ。
っていうかC++が速くない Cより5%遅いが開発の指標だったから
OCN規制で携帯でしか書けないのが辛いぜ。
支援
これlj(x)の分子が0になっちゃうんだけど、これで合ってるの?
なんか一気にレベル低くなってね?
※スレを勃てるまでもない低俗なC/C++の質問はここでお願いします
C++で文字列を入力し、そこに指定されていた文字が含まれている場合、そうでない場合に分けて処理を行いたいです。 どう書けばいいでしょうか? 文字列はアルファベットなのですが、 指定するすべての文字についてif,elseifで判別するしかないのでしょうか?
>>335 ありがとうございます。
もう一つお願いします。
たとえば、
abddみたいな文字列があって、
先頭の1文字づつ判別していきたいです。つまり、
1回目の処理はaについて、
2回目の処理はbについて・・・
のような感じです。
どう考えればいいでしょうか?
何をどう判別するのかわからん。 具体的な入力例と、期待される結果を示してくれ。
>>337 アルファベットと書きましたが、半角英数すべてで、
accaと入力したとすれば
aが1個存在するので coutで1と出力
cが2個存在するので coutで2と出力
aが1個存在するので coutで1と出力
みたいな感じです。
よろしくお願いします。
#include <iostream> #include <string> using namespace std; int main(){ int n = 0; string s; cin >> s; for(int i=0; i<s.size(); i++){ n++; if(s[i]==s[i+1]) continue; cout << n << endl; n = 0; } return 0; }
ファイル操作にはいろいろとエラーチェック用のメソッドが用意されてますが、例外機構をつかわない理由はあるのでしょうか?
例外を使いたくない環境ってのが結構あるからかも
C言語そのものの質問とはちょっと違うのですが#ifdef,#ifndefに対応する#endifを見つけて、 どれとどれが対応しているかのコメントを追加するようなツールは無いでしょうか? //////////入力/////////// #if AAA ... #if BBB ... #endif ... #endif ///////////出力/////////// #if AAA ... #if BBB ... #endif //BBB ... #endif // AAA
>>342 知らないなぁ。
俺は大抵はコメントを毎回記載しちゃう派だし。
あるいはエディタの機能で対応する#〜に飛んだりするし。
良い課題として作ってみてよ。
そして是非とも公開してくれ!
charで配列の要素数を変数にしています。 cinで入力後、この要素数の最大値を調べたいのですがどうしたらいいでしょうか?
345 :
馬牛 :2009/05/27(水) 17:14:21
C++です。 a=10,b=3,c=2として、!aかつb>cの戻り値、!aまたはb>cの戻り値はそれぞれどうなりますか? よろしくです。
felse true
18時まで引っ張ろうぜw
350 :
デフォルトの名無しさん :2009/05/27(水) 18:03:03
https通信をOSによらずに行いたいと思っているのだが、手の込んだことするのは 面倒になりcurl.exeを呼び出すことで解決することにした。 先頭の10KBとかは読めないと思っていたら対応していた。
351 :
デフォルトの名無しさん :2009/05/27(水) 21:26:13
main{ func1(); } func1{ char array[100]; array[1] = 10; func2(); } func2{ char sum[10]; sum[0] = array[1]; } このようにプログラムする場合、func2にてarray[1]をセットする場合、 グローバル宣言するしかないのでしょうか? できれば、main内でfunc1が終了した時点でarrayで使用していた変数を消滅させたいのです。 メモリ使用量を少なくする意味で
352 :
デフォルトの名無しさん :2009/05/27(水) 21:29:16
func2(array[1] );
>>350 何のことを言っているのだい?
curl.exeはWindows専用ではないのかい?
354 :
デフォルトの名無しさん :2009/05/27(水) 21:36:15
>>352 func1{
char array[100];
array[1] = 10;
array[2] = 5;
func2();
}
func2{
char sum[10];
sum[0] = array[1];
sum[1] = array[2];
}
こうだった場合は、func2();
の中は何になるのでしょうか?
>>354 参考書とにらめっこしてこい。 コードの書き方からしてお前は根本的に理解できていない。
356 :
デフォルトの名無しさん :2009/05/27(水) 21:48:55
すみませんお願いします
357 :
デフォルトの名無しさん :2009/05/27(水) 21:50:33
353 SYSTEMの中身を対応するのに変える MACでもUNIXでもあるはず curl.hの使い方がわかればいいんだけど、メモリやファイルに読み書きするのに 専用の関数を用意しなければならず難しかった。 それなら直接exeを動かしたら簡明と思った。
358 :
デフォルトの名無しさん :2009/05/27(水) 21:51:13
func2(array);
359 :
353 :2009/05/27(水) 22:57:24
>>357 UNIX系でも〜.exeって名前なの?
>>354 お前ふざけてんの?
何言ってるの?
スレタイ読めよ、ここはC/C++の質問部屋だぞ!!
そんな謎の言語は知りません!
質問します。 Windows環境で、とあるC++用ライブラリ hoge.lib があります。 このライブラリには、関数を呼び出すためのヘッダファイル hoge.h が用意されていますが、 実際のソースは提供されていないものとします。 また、ライブラリ内部だけで使われている関数は、hoge.h には記述されていないようです。 さて、このライブラリには名前空間は設定されていません。 そのままでは使いにくいので、Hoge::〜 という名前でライブラリの関数を呼び出せたら便利だと思いました。 この状況(*.h と *.lib のみ)で、ライブラリの関数に名前空間をセットすることは可能でしょうか?
>>361 君がhoge_ns.hとかいうヘッダを自作して、
hoge_ns.hでは
namespace Hoge
{
inline int bar(int x)
{
return bar(x);//hoge.hの。
}
//...etc
}
のようにラップしたらだめかな?
c/c++で仕事している人たちに質問です。 基本情報技術者試験って、最低限必要な資格ですか?
5000円程度で取れるんだから、とっとけ。
365 :
デフォルトの名無しさん :2009/05/28(木) 07:09:15
生産性と資格には関連はないだろ。 未経験なら持っていたら考慮されるとか一時金や給料がすこしだけ良くなるとかだろう。
>362 ありがとうございます。 諦める決心がつきそうです。
367 :
デフォルトの名無しさん :2009/05/28(木) 07:29:43
webページを解析したいのですが、HTMLを整形済みXMLに変換するライブラリはありますか
368 :
デフォルトの名無しさん :2009/05/28(木) 07:57:22
自己解決しました。 HTMLのパーサーがあるみたいでそっちのします。
くわしく
>>366 C用のライブラリだったら
namespace hoge {
extern "C" {
#include "hoge.h"
}
}
である程度ごまかせるんだけどな。
それにusing hoge::hogedata_t
とか#pragma comment(lib)とかも使って。
fstream& getLogFile() { static fstream logFile; return logFile; } として、非局所的なオブジェクトのコンストラクタ内でもログを取れる用にしたんですけど、 logFileの破壊と非局所的なオブジェクトの破壊はどちらが先に起こるか決まってるんですか? 非局所オブジェクトの破壊時にもログをとるのに使えるのか知りたいので。
フーリエ級数展開をするプログラム を作ったんだけど異常値しか出ないのでどこが悪いか教えてください ↓のプログラムの場合はf(x)=x [xが0-5] , 0 [xが5-10] で波長が10でループするような式 //最初にxの値を入力してから hani_suu = 2;//範囲の数 hani[0]=0.0; hani[1]=5.0; hani[2]=10.0; //(0〜5),(5〜10)という意味 double temp=0,temp_cos,temp_sin; for(int j=0;j<hani_suu ;j++)//以下a0の計算 for(double i = hani[j];i<hani[j+1];i+=0.1)temp += 0.1 * kansuu(i,j);//積分計算 ※kansuu(i,j)はjが0のときf(x)=x,1のときf(x)=0を返す for(int n=1;n<50;n++)//以下an,bnの計算 { temp_cos=0; temp_sin=0; for(int j=0;j<hani_suu;j++) for(double i = hani[j];i<hani[j+1];i+=0.1) //積分計算 { temp_sin+= 0.1 * kansuu(i,j)*sin((2.0*PI*i*n)/10); temp_cos+= 0.1 * kansuu(i,j)*cos((2.0*PI*i*n)/10); } cos_v[n] = temp_cos; //an sin_v[n] = temp_sin;//bn } temp = temp/2.0; //以下a0+Σ(ancos+bnsin) for(int n=1;n<50;n++) temp = temp + cos_v[n] * cos((2.0* PI * n * x )/10) + sin_v[n] * sin((2.0* PI * n * x )/10); //最終的なtempが答え 見にくいですがお願いします
勉強用に、シンプルな多倍長加算を作ってるのですが もっとシンプルに出来ますでしょうか 効率は意識していません string add(string l,string r){ int carry=0; stringstream ss; if(l.size()>r.size()){swap(l,r);} reverse(l.begin(),l.end()); reverse(r.begin(),r.end()); int i=0; for(;i<l.size();++i){ unsigned int tmp=(l[i]-'0')+(r[i]-'0')+carry; if(tmp/10){carry=1;}else{carry=0;} tmp%=10; ss<<tmp; } for(int j=i;j<r.size();++j){ unsigned int tmp=r[i]-'0'+carry; if(tmp/10){carry=1;}else{carry=0;} tmp%=10; ss<<tmp; } if(carry){ss<<'1';} string ret=ss.str(); reverse(ret.begin(),ret.end()); return ret; }
>>372 感覚で読むとfor ( ; i<hani[j+1]; )が臭うコードに見える。
>>373 C++は、よくわからないが、やりたいことはなんとなく伝わる。
for()は、二つに分ける必要があったのかな。
似たようなことをしているから、for()のなかで、if()するようなコードが浮かびそう。
引数を参照にしたり、const char *foo = bar.c_str()で添字アクセスとか
ただの高速化だけど。
375 :
デフォルトの名無しさん :2009/05/28(木) 20:17:36
ヘッダファイルでプログラムソースファイルを分割することができますが ヘッダファイルも分割する方法があったら教えて下さい
ヘッダファイルはいくらでも分割できます。
377 :
デフォルトの名無しさん :2009/05/28(木) 20:38:31
VC++2008を使ってるのですが 自動修復情報の保存ってのが左下にでてしょっちゅう重いです なんですかこれ
実際の数学みたいにxを数字にせずxとして計算するにはどうしたらいいですか? 例えば2x*3x=6x^2みたいな感じで計算して、あとで6x^2のxに色々な数字を代入 できるようにしたいんですが
関数電卓のソースを探して見てみよう!
ある関数内でnewして得たアドレスを返り値にして それを外で受け取ったらそのまま、受け取らなかったらdeleteする みたいな記述はどうやったらできますか?
>>381 受け取らなかったらとは、どういう状態?
>>382 pHoge = allocHoge(); // OK
allocHoge(); // 自動でdelete したい!
>>383 生のポインタじゃムリじゃね?
スマートポインタを使うとか。
wrap_allocHoge( void* p )的なものを外側に作って p==NULLならそのまま削除 p!=NULLなら入れて返すとか
387 :
372 :2009/05/29(金) 04:19:06
>>372 では
for(double i = hani[j];i<hani[j+1];i+=0.1)temp += 0.1 * kansuu(i,j);//積分計算
こんな風に小さい範囲を刻んで積分計算してるんですが
もっと精度を上げたり計算量を少なくするためにはどんな方法がありますか?
>>387 完全にスレ違いだろ。
数学スレに行ってくれ。
RPGの戦闘部分を作っています。 FFみたいなアクティブタイムバトル(パラメータのすばやさに毎秒1ずつ足して行き、規定値になったら行動) というものですが、勝利判定はどこでどういう風にすればよいでしょうか? 行動が終わった時に、goto文で戦闘部分の処理を抜け出すのが一般的でしょうか?
goto文が一般的じゃない。break使え
>>390 ありがとうございます。危うく道を踏み外すところでした
STLにupper_boundとlower_boundってありますが lower:指定した値"以上"の値が最初に現れる位置を返す upper:指定した値"より大きい"の値が最初に現れる位置を返す となっていて、どちらも指定した値以上の値が帰ってきます。 そうではなくて、指定した値を超えない最大の値を得たい場合 アルゴリズムを組み合わせたりして それを簡単に行うような方法ってありますでしょうか 具体的に言うと 1 7 10という列に対して upper/lower_boundに値2を与えると どちらも7が帰ってきますが、 1が帰ってくるアルゴリズムはありますか
デクリメントすれば?
394 :
392 :2009/05/29(金) 20:24:57
自己解決しました find_if(v.begin(),v.end(),bind2nd(less<int>(),n));
395 :
392 :2009/05/29(金) 20:38:47
すみません、解決していませんでした デクリメントってこういうことでしょうか vector<int>::iterator it = lower_bound(v.begin(),v.end(),n); --it; //ここ(*) int lower = *it; 確かにこれで期待した動作はするのですが ちょっと気になるのは (*)の箇所でイテレータが範囲外、例えばitが最初の要素だったりした場合 どう範囲チェックすれば良いのでしょうか if(it)やif(it!=NULL)などは型チェックが通りませんし
begin()でもrend()でも使えばいいじゃない
includeファイルが増えてくると面倒なので include_iroiro.h---------- #include "foo.h" #include "bar.h" ・ ・ ・ #include "hoge.h" ---------------------- のように、よく使うものを全部includeするヘッダを使ってます この場合includeしたcppで実際には使わなかったクラスなども無意味にコンパイルされるんでしょうか?
398 :
デフォルトの名無しさん :2009/05/29(金) 21:46:39
.h ということならYES
そうなんですか・・・ショック!
400 :
デフォルトの名無しさん :2009/05/29(金) 22:05:33
プリコンパイルヘッダを使えばいい
401 :
デフォルトの名無しさん :2009/05/29(金) 22:11:28
450 step -1 until 1 do ってどういう意味ですか?
450が1なるまで-1しながらdo以下の処理を繰り返す??
while(条件){ cin >> x1 >> x2; (以下if文) のように記述して、ループさせています。 EOFでwhileのループを終了させたいとき条件はどう書いたらいいのでしょうか? よろしくおねがいします。
404 :
デフォルトの名無しさん :2009/05/29(金) 22:24:33
>>402 ありがとうございます。
ということは、「1が53になるまで+1しながらdo以下の処理を繰り返す」っていうのは、
1 step +1 until 53 do
であってますか?
それC/C++じゃないじゃん。スレ違い
>>401 どこの言語だ。
最近スレ違いがおおいな。
VS2005proです #pragma region 〜処理を記述〜 #pragma endregion このおまじないは、どういう意味を持つのですか?教えてくださいエロイ人
>>408 thx
syntaxには関係ないものか、あまり役に立たない機能だな
templateを展開した後のコードを生成するようなフリーソフトってなんかいい感じのありますか?
すいません、質問です。
アマゾンで古本を販売していて
販売価格を簡単に改定できるソフトを探しています。
改定ソフトは.netフレームワークでプログラムが作られてるようなのですが
プログラミングの知識がまったくない素人が売ってるのを購入せず
同じようなものを作るにはどれぐらいの時間がかかりそうですか?
プログラム自体はアマゾンサイトから価格データを集めるのがメインで
それほど難しくなさそうに見えるのですが。(素人なので直感です)
価格改定ソフトの一例です
ttp://6plan.net/amazonpricechecker やっぱりめちゃくちゃ難しいんですかね?
>>411 とりあえず君のプログラミングスキルを教えてくれ。
ここはC/C++スレだからC/C++のスキルに関しても。
>>412 すいません、プログラミング知識はゼロです。
コンピュータ用語がわかる程度
良く言ってシスアドレベルだと思います。
>>413 0からだと果てしなく険しいと思う。
少なくともC/C++でやるなら相当苦労しそうだ。
他の人の意見も聞きたいところだけど、
やるにしてもせめて初心者にやさしい超高級言語で挑戦したとして
果たして何ヶ月かかるだろうか。。。
プログラムの取得にかかる時間は個人差がある。 独学ならなおさら。 半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、 いくら頑張っても途中で挫折する人間も大勢いる。
>>415 >半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、
だれ?
>>411 業務時間内に作ろうと思ってるならやめた方がいい
よほどの天才じゃない限り買った方が安い
>>415-417 レスありがとうございます。
それほど難しいものなんですか。
おとなしく製品を購入することにします。
ちなみにシスアド程度の素人がプログラムを楽しもうと
思う場合、ExcelとかのVBAなら比較的簡単に習得できるものなんですか?
あくまでも趣味程度しか時間はさけませんので。
極端な例を出して話をはぐらかすやつって馬鹿なの?
char x1,x2;としてこれをwhileで繰り返し、if文でx1==x2の判定をしながら、 文字列のランレングス符号化をしたいです。 どう書けばいいでしょうか?
グローバル変数と性的変数ってどっちのほうがメモリ容量多く使うのでしょうか? また、staticを何個も書くのはまずいですか?
422 :
デフォルトの名無しさん :2009/05/30(土) 19:00:00
静的変数の間違いでした。
>>421 たいていの場合、グローバル変数とstatic変数は同じ扱いになる
static変数を何個も書くこと自体は問題ない。
性能面、安全面で自動変数より劣ることはあるかもしれない。
グローバル変数のほうが、シンボル情報がオブジェクトファイルに含まれるので .objなり.oなりが大きくなる と全然意味の無いことを言ってみる
ヘッダーファイルの値をいくら変えても反映されません。 どうやらパソコンを起動してから最初に実行した時の値が以後ずっと使われているようです。 PCを変えて実行してみましたが、同じ不具合が発生しています。 原因がわかるかたいませんか?
日本語でおk
説明しようにも不具合の原因がわからなすぎて、上手く説明できません。 ソースファイルの更新はしっかり反映されるのに、ヘッダーファイルの更新は最初の一度しか反映されないのです。
428 :
デフォルトの名無しさん :2009/05/30(土) 20:05:58
その.hをincludeした.cで printfしてみれ それでも反映されないのなら、コンパイラのバグじゃね
どうやら値事態はしっかり反映されているようです。 しかし、その値と変数を比較する部分が正しく動作しません。 友人と全く同じプログラムですが、実行結果が違います。(アカウントは違います。)
ヘッダーを書き換えた後にそれをインクルードしているソースはコンパイルしなおしているよな? 一応OSと環境(VC++とかgccとか)よろ
学校の課題は先生に訊きなさい
複数あるソースファイルのうち、その比較部分があるファイルにprintf文をつけたところ、値の比較が正しく行われるようになりました…。 当然、友人らはこのソースファイルには手をつけなくても正しく動作しています。 全くもって理解不能です。
こんな言葉がある 『プログラムは思ったとおりに動かない。書いたとおりに動くのだ』
printf文をつけることで関係無い部分が正しく動くようになったのですよ。 理解不能(^q^)
>>430 の言ってることが答えな気がする
printf文を加えたソースファイルをコンパイルしなおしたことでヘッダファイルの変更が反映されたと
>>435 別のソースファイルにつけたときは正しく比較部分が正しく動かなかったです。
(ヘッダーで設定した数値は正しく表示された)
日本語が不自由ですみません。
そんなときにはソリューションのクリーン→ビルド
>>436 いやだから、別のソースファイルの時は今回直したソースファイルをコンパイルしなおしていないんじゃないか?ってこと
とりあえず環境、ヘッダとかのファイル名と実行したコマンドを書け。
C言語の質問です。お願いします。 { int i; char ch; scanf("%d", &i); printf("%dです。\n", i); scanf("%c", &ch); printf("%cです。\n", ch); return 0; } というプログラムを実行し例えば4と打つと 4 4です。 です。 と表示されてしまいます。 何故、scanf("%c", &ch)は無視されるのでしょうか? 4 4です。 s sです。 と言った具合に表示させたいです。
virtualってつけれるところは全部つけとけばおkなんですか?
>>440 4の次に入力された改行文字が、2回めのscanfで読み込まれるから。
scanf("%d%*c", &i);
のようにして、改行文字を1回めのscanfで読み込ませればいい。
>>442 副作用としては、
・オーバーライドするつもりのない関数を間違ってオーバーライドする可能性がある
・多分、メモリ使用量が幾分増える
ってのがある。
Cの乱数をsrandとtimeを使って毎回違うようにするのは わかったのですが、二つの乱数をほぼ同時に出す場合、どうすれば その二つの乱数をバラバラにする事ができますか? 具体的には戦闘ゲームなのですが、 コチラの攻撃が1~30までで、相手も1~30までの値で 攻撃してくるときに、1~30までの値を返す関数を srandで初期化してrand()%30+1の値を返すという風に作りました。 しかし、自分の攻撃値も上の関数でけっていし、それにほぼ同時 (すぐ次の行で)相手の攻撃値も決定しているのですが、そうすると どうしても自分の攻撃値と相手の攻撃値が同じになってしまいます。 時間がほぼ同時ぐらいのタイミングで処理するとどうしても このようになってしまうと思うのですが、どのようにすれば別々の値に できるでしょうか?よろしくおねがいします。
srandで初期化するのは、プログラム中1回だけでいい。 面倒なら、srand呼ばないようにすればとりあえずランダムな値は取れる。
同じだったらもう一回randすればいいんじゃないの
乱数シードに IP アドレスとかプロセス ID とかを加算 てか同じプロセス内のコードか??? なら初期化は一回だけであとは rand を呼べばいい
質問なのですがお願いします。 c++、bccを使用しています。 char si[1000]; char sj[1000]; cin>>s1; cin>>s2; と二つの配列を作って、こんぱいる実行したら 「_ 」 とうまく入力待ちになりました。しかし、 char si[1000]; char sj[1000]; cin>>s1; cin>>s2; array[1000][1000][5]; では、 「 c:\bcc\test> 」 と表示されて、たぶん実行終了した状態になるのですが、 原因を教えてくださいませんでしょうか?おれがうんこなのでしょうか?
451 :
450 :2009/05/31(日) 05:20:12
全力で間違えました。 char si[1000]; char sj[1000]; cin>>s1; cin>>s2; int array[1000][1000][5]; でうまくいかないのでしあt
領域確保しすぎてスタックオーバーフロー? 配列をグローバルにしてみよう
>>451 >int array[1000][1000][5];
これ単純に大きさを計算したら1000×1000×5×4=約19MBとなって
スタックのデフォルトの大きさ1MBを超えるから異常終了する
スタックを大きくするかstaticを付けてBSSに配置するかだな
Visual Studio 2005 Proですが array<String^>^ getFilterName_St(); Bitmap^ sample_grab(); Bitmap^ sample_grab2(Bitmap^ bmp); こういう書き方って、.NET対応CLIの実装ですよね、NativeなC/C++では使えないコードですよね。
455 :
デフォルトの名無しさん :2009/05/31(日) 08:37:19
うん
>>455 Thx分かりました。
.NETのCLIって、C/C++のコードも混在することができるんですね、templateや関数オブジェクトがすらすら書けない俺には無用なものですね。
457 :
450 :2009/05/31(日) 11:42:01
ありがとうございました。 mainの外に追い出したところ、何とか起動しました。 途中で強制終了されたけど。。。なんかでかい配列を扱うのはすごく大変ですね。 ありがとうございました!
458 :
デフォルトの名無しさん :2009/05/31(日) 13:25:55
ある動的配列の要素全てが0以下である をループを抜ける条件としたいのですが、何か良い方法はありますか? 今はforで要素全てを判定させて、全て0以下なら 変数aを1、このaが1ならループを抜けるとしています
O(n)未満の方法はないんじゃないかな
なのでその方法がベスト
もし、STLに関数型言語のforallやexistsのようなものがあれば
記述的に楽は出来るだろうが
やる計算的には
>>458 の方法と同じになるし
Pstade.Ovenライブラリを使って oven::forall(xs, _1 <= 0) を終了条件にすればいい ただしxsは対象である動的配列の型で、かつ xsの型がsingle pass rangeのコンセプトを満たす必要がある vectorやlistはこのコンセプトを満たす
>>458 それでいいんじゃないの?
あまりにも大量のデータを頻繁にチェックするというのなら、
配列に書き込む時点で値が0以下かどうかチェックするという方法もあるけど。
(配列への書き込みが大量に発生するようだと、これも効率的でなくなるが)
while( !isAllNegative(array, size) ) 〜; isAllNegative(int *array, int size){ for(int i = 0; i < size; ++i) if(array[i] >= 0) return false; return true; }
ああ、そのほうが良いな。アホだった あと、そのプログラム、条件>=じゃなくて>にしないと
464 :
458 :2009/05/31(日) 14:31:22
ありがとうございます! 全部試してみますね
他人の作ったクラスを継承するのって危険ですかね?
継承する想定で設計しているならそうでもないんじゃないの。 まぁ作った奴のスキルがどれだけ信用できるかだが。
自分で定義したクラスでも意識してないと Liscov Sutstitution Principleは簡単にぶっ壊れるのになにをかいわんやだ
プライベート継承しただけで壊れるんだっけ
469 :
デフォルトの名無しさん :2009/05/31(日) 17:09:19
女でプログラマは何割くらいいますか?
一割いないね。
471 :
デフォルトの名無しさん :2009/05/31(日) 17:42:00
トンクス
女でプログラマで美人で性格いい人は何割ぐらいいますか?
本当に人口の半分は女なのか疑わしくなってくる
女優遇社会だからな。酷い男社会とは別の贅沢な環境で生活してるんだよ。
主夫になりたい
476 :
デフォルトの名無しさん :2009/05/31(日) 19:18:18
前にも質問したんですが、メモリをファイルに見せかける方法か、 ramディスクを動的に生成する方法ありますか。
477 :
デフォルトの名無しさん :2009/05/31(日) 19:21:25
DOSコマンドでファイルへ出力するものを直接メモリに入れたいのですが。無理でしょうか。 標準出力ではなく、ファイルへの出力の場合です。
mmapとか、MapViewOfFileとか、その辺を調べるといいかも。 ただし俺だったら出力関数にファイルに出力するかメモリに書き込むかを 指定するフラグをつけるけどな。
479 :
デフォルトの名無しさん :2009/05/31(日) 20:08:14
>>476 メモリマップドファイルというのがある
それ専用のWindowsAPIがあるから、他でもOSレベルのAPIがあるんじゃね
480 :
デフォルトの名無しさん :2009/05/31(日) 20:12:08
ファイルをメモリのように扱うのではなく、 メモリをファイルのようにしたいのですが。 メモリを借りてきて、Zドライブを作るとかです。 普通のドライブのようにアクセスする方法はないですか
481 :
デフォルトの名無しさん :2009/05/31(日) 20:14:51
えっ
---hoge.h--- class Hoge{ public: メンバ関数; private: void *mMember; }; ----------- --hoge.cpp-- namespace{ struct Member{hoge hg}; //コンストラクタでmMember = (void *) new Member; アクセスは(Member *)mMember privateメンバ関数の代わりの関数; } メンバ関数; ----------- めんどくさそうだけど、カプセル化にこだわるならこんな感じのほうがいいんでしょうか?
>>480 RAMディスク Windows
とかでぐぐれ。
>>482 こだわるならそんな感じだけど、そこまでこだわる必要があるケースは稀。
485 :
デフォルトの名無しさん :2009/05/31(日) 20:21:33
RAMディスクをプログラムが動いているときだけ生成して、終了したら解放する方法はないですか? 既存のDOS EXEで、出力がファイルのやつを直接メモリに格納して高速化したいです。
RAMディスクつくるソフトを制御して 起動時にRAMディスク作らせて、終了時にRAMディスク開放させればいいのでは?
487 :
デフォルトの名無しさん :2009/05/31(日) 20:29:44
汎用性がある方法はないですか ソフトをインストールしてもらわないと出来ません
単に、バーチャルなファイルシステムをかますだけでしょ。作った方が早い
USBカメラから画像を取り込みたいんですが、よくあるUSBカメラを使うソフト とかってどうやってるんでしょうか?
既存のDOS EXEって何よ?
>>489 USBカメラがそうなっているかは分からんが、TWAINという共通化インターフェースがある
492 :
デフォルトの名無しさん :2009/05/31(日) 21:19:51
カプセル化という物を勉強したのですが、一度しか使わない計算でも 関数を定義して別ファイルに値を渡し、戻り値をmainに渡すようにしたほうがよいのでしょうか?
ありがとうございます。TWAIN初めてききました 直接カメラのドライバをたたいてるのかと思ってたけど、こんな便利なのがあったんですね
>>492 必要に従いカプセル化する。何でもかんでもカプセルにして密閉化すると。
オブジェクト指向原理主義者になるw
>>492 突き詰めると決着が付かないような議題
個人的にはほんの数行(最大4行ぐらい)で、そこでしか計算しないんだったら埋め込む
ただ
>関数を定義して別ファイルに値を渡し、戻り値をmainに渡す
が何を言ってるのかがわからなくて心配
>>492 それはカプセル化というよりはリファクタリングに関係してるように思う
俺の場合、ある処理を2回行うようになった時点で関数化する
逆に1回しか使う場所がないのに無駄に抽象化した関数は定義しないようにしている
C++の抽象化能力では、これは常に出来ないのは若干悩みの種
カプセル化は、ライブラリのように
他人もそのコードを使うケースで意識すればよいと思う
>>477 出力ファイル名にCONを指定して標準出力へ出せるようにならない?
それで動くなら、あとはリダイレクトできるでしょ。
498 :
デフォルトの名無しさん :2009/05/31(日) 22:01:18
>>494-496 ありがとうございます
一人だから問題ないのですが、逆に指摘してくれる人がいないのが難点です
スタイルの問題で答えはないと思うけど、マクロってインデントするべきかな? #ifndef CLASS namespace Name { class Class { public: foo bar(); #ifdef _DEBUG hoge fuga(); #endif } } #endif #ifndef CLASS namespace Name { class Class { public: foo bar(); #ifdef _DEBUG hoge fuga(); #endif } } #endif 悩む・・・
#ifndef CLASS なんたらかんたら # ifdef _DEBUG なんたらかんたら # endif /* _DEBUG */ なんたらかんたら #endif /* CLASS */ とやるのが普通かな。 プリプロセッサディレクティブは、行の先頭を#で始めなければならない。 規格のどのセクションだったかもう覚えてないけど。 フリーソフトウェアのソースを読んで勉強したら良いかもしれない。
そう? 手元のANSI C言語辞典には#の前に空白類があってもよいと書いてあるけど。 もちろんそんな書き方誰もしないということは同意だ。
#if foo #if bar #include <momo.h> #else #include <taro.h> #endif #endif のような例はよくみかける。
自分は普段はこう書くな。 #if foo # if bar # include <momo.h> # else # include <taro.h> # endif #endif 行頭に#があったほうが見た目わかりやすいと思う。
504 :
503 :2009/06/01(月) 01:27:01
#if foo # if bar # include <momo.h> # else # include <taro.h> # endif #endif こうな。
505 :
デフォルトの名無しさん :2009/06/01(月) 01:36:32
Windows98のメモ帳でのプログラムの実行の仕方を教えて下さい 因みに入力したのはC言語のprintf何たらの簡単なプログラムです
>>502 俺もそう書くわ。
特に多いのが
#ifndef __BORLANDC__
高度な処理;
#else
低度な処理;
#endif
みたいにコンパイラで処理を分けたりとか、あとはデバッグの時かな。
1.下の多重ループで「A」は何行何列に表示されるか. for(j=1;j<=2;j++) { for(k=1;k<=3;k++) { printf("A"); } printf("\n"); } 2.下の多重ループで「A」は何行何列に表示されるか. for(j=1;j<=5;j++) { for(k=1;k<=4;k++) printf("A"); printf("\n"); } 1は2行3列で2は4行5列ですか?
509 :
デフォルトの名無しさん :2009/06/01(月) 07:30:16
>>506 すみません
ネットに繋げてないのでメモ帳での方法を教えて下さい
>509 別にメモ帳だろうが何だろうが、Cのプログラムには関係ないよ。 もちろん効率とかは違うだろうけど。
>>509 エスパーすると、コンパイラの使い方がわからないんだろう
そもそも509はC言語のコンパイラを持っているのか?
例えばVC,BCC,GCCなど。
持ってないだろうねえ。でも、 最初の一歩も自分で踏み出せない奴を どうにか歩かせたところで無駄じゃね?
513 :
デフォルトの名無しさん :2009/06/01(月) 13:27:29
最小2乗法によるm次の多項式近似を行うプログラムを教えてください 教えて xがー2の時yが3.02 −1の時0.98 0の時1.22 1の時2.16 2の時2.61 の時のです 出来ればソース全文書いてください
>出来ればソース全文書いてください >出来ればソース全文書いてください >出来ればソース全文書いてください
符号なしenumがほしいんですが、なにか代替案はありますかね?今は typedef const unsigned long uenum_t; uenum_t foo = 0, bar = 1, hoge = 2 ・・・; みたいに地道に書いて我慢してるんですが 省略記法が使えなくてめんどいし、メモリももったいない気がします
半角テキストファイルを読み込んで使用する場合 空白文字も含めて一つの変数orクラスに格納したいんですが どうすればいいでしょうか? というかなぜ空白で一々区切られるのでしょうか? EOFでいいじゃないですか?
getlineでいいんじゃない?
getlineって一行だけじゃなかったっけ?
whileのループをEOFで抜けだし、出力するようにしたのですが、 出力後、プロンプトが出てきません。ctrl+Zで中止しないといけない状態です。 なぜ出てこないのでしょうか? よろしくお願いします。
ループにでも入ってるんじゃない?
522 :
デフォルトの名無しさん :2009/06/01(月) 22:51:06
for(a=0;a<3;a++){ for(b=0;b<20;b++){ if(hensu<0){ 処理1; } else{ 処理2; } } } このようなfor文で、処理1もしくは処理2を実行したら 二つのfor文を一度に抜けたいのですが、どうすれば可能でしょうか? 処理のあとにbreakひとつじゃ後のfor文しかぬけないため、また処理1か2を実行してしまうので 困ってます。 goto文?というのはなるべく使いたくないのでそれ以外で何か簡潔にできますでしょうか?
俺は普通に終了フラグを作る
典型的な「gotoを使うと綺麗に書ける例」だな。 どうしても使いたくないなら ・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける ・全体を関数にしてしまい、returnで抜ける とかどうか。
int end = 0; for(a=0;a<3 && !end;a++){ for(b=0;b<20 && !end;b++){ if(hensu<0){ 処理1; end = 1; } else{ 処理2; end = 1; } } } もしくは関数化して、returnで抜けるとか。
男3人が結婚かよ
527 :
デフォルトの名無しさん :2009/06/01(月) 23:09:54
C言語の本を買ってきて、printfなるものをWindowsのメモ帳に入力したけど、どうしたら実行出来るの?
C言語の本に書いてあるんじゃね?
そのC言語の本に実行までのやり方が書いてないなら、 それが書いてある入門本を買いに本屋に走るんだ。
そのC言語の本を1ページ目から読み返せ。 それで分からなければタイトル晒して燃やせ。
また多重婚だねっ♪
2重のループを無理やり1重のループに変換する
aに3を入れる
534 :
デフォルトの名無しさん :2009/06/01(月) 23:21:06
>>523-524 フラグをつくる場合、
>>525 さんが書いて頂いたような
フラグの仕方が一番コード書く上では綺麗なのでしょうか?
関数化もよさげですね。ただあまり関数を増やしたくないのもあるので
使わずにすむならそっちのが使いたいです
フラグと書いた俺はフラグが基本だ。他は好みだろ
536 :
532 :2009/06/01(月) 23:25:30
誰も思いついてない方法だから俺様の勝ち int a, b; for(x=0; x<60; x++){ a = x/20; b = x%20; if(hensu < 0){ 処理1; } else{ 処理2; } }
538 :
デフォルトの名無しさん :2009/06/01(月) 23:29:37
・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける あれでもこれだと、内側のループをまずbreakで抜けて、抜ける前にフラグをたてて で、抜けたあとに外側をそのフラグでみるということかな? でも外側のループから抜けるってどうやるんだろう
例の通りなら hensuの比較bool だから a=0,b=0 時点で必ずループ終了を要求することにならないか?
つうか処理1もしくは処理2は初回で確実に実行されるんじゃないのかfor文いらなくね
俺もそれ思ったwアルゴリズムが変
>>534 2重ループくらいなら、あんまり汚くはならんでしょ。たぶん。
実際の書き方は十人十色だろうけどね。
個人的には、forの条件式のところに書くよりは、新しくif〜breakを作る方が好き。
あと、もう1つ。
関数呼び出しにかかる時間が致命的で、少しでも減らしたいというのでもない限り
基本的に関数を増やす方向で進めた方がいいと思うよ。
>540-541
まあ、実際のコードとは違う可能性もあるし、そこは突っ込むほどのことでもないんじゃない?
>538 すごく単純に書くと for () { for () { end_flag = 1; break; } if ( end_flag == 1 ) break; }
544 :
デフォルトの名無しさん :2009/06/02(火) 00:04:31
書いてない 近所にそんな本置いてない Amazon登録(会員?)してない 晒した後に燃やす意味がわからない メモ帳ってテキストエディタだよね?C言語によるプログラムはどうやって実行するの?
Cの入門書なら絶対に書いてある。 万が一書いてなければ、それは間違いなく悪書なので燃やしても咎められないだろう。 ついでに、同じような被害者を出さないためにも、タイトルを晒しておこう。 くらいの意味。 要約すると、「1ページ目から読み直せ」ってことだ。
void型のWINAPI関数、ABC()があるとします。 void WINAPI ABC() と VOID WINAPI ABC() には違いがありますか?(voidが小文字か大文字か)
>546 どっかで、「VOID は void の別名ですよー」って定義されているかどうかによる。 結論から言うと、たぶんそうなってる。
548 :
デフォルトの名無しさん :2009/06/02(火) 00:53:27
>>542 なるほど。関数を呼ぶと時間がかかるのですか。
かなり高い頻度で呼び出すのでできればはずしたいかな。
書いてなく申し訳ないですが、おっしゃるとおり実際は
forで回している変数を処理1,2で使っているので何とか抜けないといけないのです。
見た目で行くとやっぱり関数ですねー。
一気にfor二個抜けるbreak2みたいなのがあればいいですね(笑)
>548 >関数を呼ぶと時間がかかる それこそ1/60秒間に1000回呼ばれ、マシンの性能の極限まで詰め込みたい……とかいうのでもない限り 普通に関数使っとけw
550 :
デフォルトの名無しさん :2009/06/02(火) 01:00:46
goto文使ってたり多重ループがあるだけで、 コードレビューが合格にならないキチガイISOマンセープロジェクト って、この世からなくなればいいのに
>>522 for(〜){
for(〜){
if(hoge) break;
}
if(hoge) break;
}
そのループ処理を関数に切り出して、 抜けたいところで return してしまうのも一つの手。
>551-552 実際の質問の直後のレスを見ようぜ
go to文は有害だよ どんなネストごちゃまぜなソースでもちゃんと普通に抜けだすコード書いたほうがいい go to文はあとから見た時可読性が著しく落ちる まじで
その部分をまるっと関数化してreturnで抜けだすのと gotoにそこまで違いがあるのかどうかw
for(a<3){ for(b<20){ if(){if(hensu){}else{},a=3;continue;} }} // bループの外に処理があるなら }if(a<3){ }} で十分じゃないの?
>>554 フラグ変数とか多用されるよりgoto使ってくれた方が追うの楽だし、
そもそもgotoつかえば深いネストしなくて済むことも多い。
フラグ変数を使って深いループを抜ける事は、仮想関数を 使うべき所にswitch文やif文で多重にネストした醜いプロ グラムを連想させる
質問。 あるクラスから派生したクラスを作るとき、その派生クラスを強制的にシングルトンにさせる方法ってありますか? 派生クラスに自前でシングルトンパターンを実装するしかないのでしょうか? >goto まあ俺みたいな初心者は 少しは綺麗になるかも?と思ってもgotoを使わない方向で書いた方が安全ってことだな!
gotoが必要になる事ってほとんど無いんだけど。 ちゃんとクラス設計しているのか? ・・・と思ったが、C言語の場合はクラス設計もクソもないな。
gotoも使いようだよ ifとかwhileで書けるなら、gotoでなくそっちを使うべき、ってだけ いずれにせよクラスは関係ないな
562 :
デフォルトの名無しさん :2009/06/02(火) 07:30:53
>>545 最初っから読んだが載って無いな
悪書なのは分かったが買ったからには100%使う予定
で、メモ帳はテキストエディタっていう程だからプログラムを実行出来るんだよね?ググっても良く分からんのだよorz
>>562 じゃぁ、初心者向けの本じゃ無かったんだろ。
自分のレベルにあった本を買えるようにしような。
もっと高級なテキストエディタじゃないと実行できないんだよ。
>>582 C言語なら、コンパイラというプログラムが必要だ。それをつかえ。
コンパイラにも色々種類があるが、C言語用のコンパイラな。
まあ基本は、「エディタは編集するものであって実行するものじゃない」
>562 念のため、本のタイトルを。
569 :
デフォルトの名無しさん :2009/06/02(火) 12:59:30
570 :
デフォルトの名無しさん :2009/06/02(火) 13:00:55
あ、コンパイラはC++用でもおKなの?
/ \ 、 ヽ\ ヽ . / , / ! ∨丁ヽ い | /二フ” / ! | ィ 「\ | ハ l | ,′ / l ! | / /j/ '. ノ, =、!// /j/ ヽ/ l い/ ,, =x j/ ′ 〈j/ /ヽ ト ._ \_〃 :.:.:.:.} /二フ” l l { 下 ̄ .:.:.:.: -‐1 ∧ / l l T ‐个 ._ ー' イ l| ニニ! l/ /| l l//下二千ヽ_l い ─┘ ' / .′ l,ノ\/// 小、|、\ヽ\ 「〉 Ul / / \/ U` \ヽl i r_| Ul l i ! ト ヽ |
>569 ちょっと軽く評判を調べてみたんだけど、「実行する方法が書いてない」「やたら間違ってる」なんて話がチラホラあった。 1から読み直せとか、さんざん疑ってしまってスマン。
>>571 質問者はケータイみたいだし、AAでの返答はしないほうがいいんでね?
>>570 今のC++コンパイラはたいていCも扱える
やっぱりぼうようか
夏休みまだだよな?
年中夏休みですがなにか
VB、C#、C++だと.NETフレームワークの使い方って全然違ってくる? .NETフレームワークの用途毎の使い方が載ってる本がほしいので 「.NET Frameworkプログラミングテクニック―for Visual Basic/C#」 を買おうかと思うんだが今使ってる言語はC++なんだ・・・
C#がいいお
>cat test.cpp #include <iostream> template <typename _T> struct base { typedef size_t size_type; }; #ifdef CANNOTCOMPILE template <typename _E> struct A:base< A<_E> >{ #else struct A:base< A >{ #endif size_type s; }; #ifdef CANNOTCOMPILE typedef A<int> type; #else typedef A type; #endif int main(void) { type a; a.s = 10; return 0; } >g++ test.cpp >g++ test.cpp -DCANNOTCOMPILE test.cpp:10: error: ‘size_type’ does not name a type test.cpp:10: note: (perhaps ‘typename base<A<_E> >::size_type’ was intended) test.cpp: In function ‘int main()’: test.cpp:20: error: ‘struct type’ has no member named ‘s’ 頭がこんがらがってよくわからなくなってしまったのですが、 テンプレート版でsize_typeが継承されてないのはなぜでしょうか?
public base
584 :
デフォルトの名無しさん :2009/06/02(火) 15:31:42
マイクロソフトの最新版らしいので安心して使用してみます べっかんこから見ているのでAAも安心です では、おいとまさせて頂きます
おとこは黙ってVisual J
涙で>585が見えない
>>569 amazonの中身が読める所だけみたが
3ページの上の方に、プログラムの実行方法は
「処理系や実行環境によって異なりますから
みなさんが利用している処理系のマニュアルなどを参照してください」
と書いてある
まぁ、完全な初心者にはそもそも「処理系」って何?ってなるから
これじゃつまづくな
訳語の「処理」が大外れではないけど意味を採り難い語だからね 「処理乾酪」でヤバさ倍増な感
>>580 ライブラリ自体の使い方は同じだから、そういう目的ならVB/C#向けでも構わないと思う。
同じ名前のメンバ変数を持ってるクラスを継承しちゃったらどうなるの?
>>590 継承の仕方による。
多重継承ならスコープ解決演算子で名前解決することになる。
多重継承でなく、単一の継承を繰り返した場合は
派生クラスのメンバ変数の名前が基底クラスの
メンバで同名なものを「全て」隠蔽する。
これ以上は、実例を挙げるのがめんどくさいので、誰かよろしく。
すいません、VS2005で外部ライブラリをソースコードの中に記述して取り込む方法をど忘れしてしまいました、教えてください。
絶対ど忘れじゃねーだろwwwww
pragman
そうだった
#pragma comment(lib,"ws2_32.lib") これでよかった、thx
>>593 ぶた野郎
596 :
デフォルトの名無しさん :2009/06/03(水) 06:42:31
メモリ上のポインタをファイルポインタで開くことはできますか?
できません
598 :
582 :2009/06/03(水) 16:54:38
よろしくお願いします。
すまん質問させて貰う 下のように定義した関数があり void funcA( const char *pszA, const char *pszB, const char *pszC ); funcBで色々と処理した後に、funcB内でfuncAを呼ぶと pszBとpszCのアドレスが変わってしまう pszBに渡されるアドレスが本来0x1000だとすると、0x1200となる デバッガで渡される直前の中身と、funcAで受け取った中身が違ってるのも確認済み これの原因で考えられるのはメモリ破壊のみだろうか? funcAとfuncBは別々のモジュールで実装されているんだが WinMainを呼んで他に処理をする前に すぐにfuncBを呼んでも、同様の現象が起きてる そこの機能だけを一つに纏めて実験すると問題無く動作する IDEはVC++2008 ExpressEdtion 正直訳が分からない。よろしくお願いします。
char const * (const char *) const なcharへのポインタ。アドレスは変わっても良い。データはconst。 char * const charのポインタがconst。アドレスはconst。データは変わってもよい。 char const * const (const char * const) const な char のポインタがconst。アドレス、データ共にconst
601 :
599 :2009/06/03(水) 18:51:25
自己解決した 構造が main.cpp dialog/dialog.cpp shell/shell.cpp resource/resource.cpp という風にモジュール分けしてて funcB内で別のモジュールの処理を呼ぶんだが そのモジュール(funcB内で呼ぶ処理)自体は結合度が凄い低い そのモジュールのヘッダに #include "../hogehoge.h" とアプリ全体の共通ヘッダをインクルードしたら解決した そのモジュール自体、他の機能全く使わないのに 何でこれで解決するのかが分からないが… スレ汚しすまない
>>601 アドレスは変わっても良いってコンパイラに伝えてるんだから、当然アドレスはいつか突然変化する。
今回変わらなかったのは単なる偶然。
603 :
599 :2009/06/03(水) 19:17:16
例えば void func( const char *pszHoge ) と定義して char szHoge[] = "hogehoge"; szHogeのアドレスが0x1000として func( szHoge ); とすると、func側のpszHogeは必ずしも0x1000ではないって事? 同じアプリのメモリ空間だから、アドレスが変わるっていうのは知らなかった でも、今回のはアドレスも変わって、中身も変わってた
すまん、記述ミスがあった ×pszHogeは必ずしも0x1000ではないって事? ○pszHogeが指すアドレスは0x1000ではないって事?
>>600 参照。
const char*だと、アドレスは変わる。
ついでに
>>603 だと宣言の時点でconstついてないから中身も変わる。
コンパイラによって保証されるのは、funcがpszHogeの中身を変えないことだけ。
606 :
599 :2009/06/03(水) 19:45:18
>>605 有難う
ポインタで渡す限りアドレスは固定だと思ってたが、違うのか
今日アドレスと中身も変わったが、相当レアなケースに遭遇したみたいだ
>>600 は凄い参考になった。有難う
ポインタ変数だろうがint型の変数だろうが関数に渡した値が勝手にかわってたらおかしいだろw
C++でゲーム開発してるんですが、敵ユニットや弾をリスト構造を用いて実装しました。 しかし、これらのオブジェクト同士の当たり判定の実装で詰まってしまっています。 解決策を知っている方が居たらお願いします。 それが駄目でも、二つの双方向リストを総当りで比較する方法などありましたらお願いします。
609 :
デフォルトの名無しさん :2009/06/03(水) 20:24:55
>>608 サンプルプログラムそこらじゅうに転がってるからてきとーに参考にすりゃいいだろ
総当りの方法って、先頭から順番に見ていきゃ言いだけだろ
610 :
582 :2009/06/03(水) 22:23:15
VC++2008 EEで試してみたところ、どちらのバージョンでも問題なくコンパイルされてしまいました。 動作も期待(?)通りです。お騒がせいたしました。
だめだったのはやっぱBCC無料版だったりするんだろうか
>>609 まぁ、ゲームの場合速度が重視されるから単純な総当たりなんてやらないで
エリアを区切ってエリア単位で総当たりの判定するけどな。
まずすべてのオブジェクトの座標を確認して 適当な範囲ごとにソートして、それからその範囲内で当たり判定を行うってことかしら? 範囲の境界に位置するようなオブジェクトの場合はどうしたら…
614 :
デフォルトの名無しさん :2009/06/03(水) 22:42:52
>>613 どっちでもいい、処理を減らすことが目的だから
615 :
デフォルトの名無しさん :2009/06/03(水) 22:43:36
616 :
デフォルトの名無しさん :2009/06/03(水) 23:35:00
for(n=1; n<=100; n++){ sum += n; printf("1+2+...+100=%d\n",sum); } { }をつけると、1、1+2、1+2+3、・・・、1+2+…+100までの答え、 { }を外すと単なる1+2+…+100の答えが出るのですが、 これはなぜですか? 本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが ここで{ }を省略するかどうかというのは重要な問題だと思うのですが
{} を省略した場合は for(n=1; n<=100; n++){ sum += n; } printf("1+2+...+100=%d\n",sum); って書いてあるのと同じ意味になるから。
> 本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが だから、{ }がなければ for(n=1; n<=100; n++){ sum += n; } printf("1+2+...+100=%d\n",sum); とみなされる。
619 :
616 :2009/06/03(水) 23:42:47
>>617 なるほど!
1つの文しかないときは{}を省略できるってのは、
条件式が1つの場合、って解釈してたんですが
printfも何もかも含むんですね!わかりやすい説明ありがとうございます
620 :
616 :2009/06/03(水) 23:44:20
関数で値渡しをするときに配列の要素全てを渡すことは出来ますか? それともそれぞれ引数に指定しないとダメでしょうか
;が文の終わり。日本語の句点のような存在。 だからsum += n;で1つの文。 {}はその例外で、囲った部分全体で1つの文になる。 すまん話し過ぎたか。
>>621 C++ なら vector を使えばいいです。
Cでは直接配列を値渡しすることはできないので、
構造体の中に入れて、構造体を値渡ししましょう。
初心者です。 Cの参考書でメモリ関連の事が良く出てきます。 バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても 良いんでしょうか? HTMLで例えるなら#ffffffみたいな感だったので・・・。 これは覚えたほうがいいんでしょうか。 わけわからないんですが
スルーしちゃらめぇ。
>>625 C言語はそう言うのを扱うのが醍醐味というか、
それが分からないと全然まともに使えないと思われる。
理系なら分かるでしょ?がんばれ!
授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど せいぜいそれくらいだよなあ。
629 :
デフォルトの名無しさん :2009/06/04(木) 17:39:26
C++の質問です。 あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。 この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか? ・メンバ変数にする → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも? ・呼び出し側で変数を用意しておき、引数でその都度渡す → 呼び出し側の手間が増える。数が多いとかなり大変。 ・staticを付ける → オブジェクトごとに個別の値を持てなくなる
そのときの変数の性質や役割による。 手間隙とかは関係ない
ああごめん、途中で質問を書き直したら 頓珍漢な内容になってました。 以下の3パターン以外に方法はないのでしょうか、で。 思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。
制約がないなら好きにすればいい
>>629 ・メンバ変数にする
→ 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
これがやっぱり一番自然でしょ。
と俺は思う。
いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?
・関数オブジェクトを用いる。
C言語勉強中なんですが、宿題で 「ファイル名を自分で設定しそのファイルに、EOFを行うまで スペース区切りの二つの整数を何回でも入力できるようにし、 それをファイルに改行して記録しなさい」 というのがあり、 #include <stdio.h> int main() { int a,b; FILE *fp; char name[100]; printf("ファイル名を入力してください\n"); scanf("%s",name); fp=fopen(name,"w"); printf("数値を入力してください\n"); while(scanf("%d %d",&a,&b)!=EOF){ scanf("%d %d",&a,&b); fprintf(fp,"%d,%d\n",a,b); } fclose(fp); return(0); } というプログラムを作ったんですが、なぜか 数値を入力した際に記録される時とされない時があります。。。。 どなたか解決策を教えていただけないでしょうか?
636 :
デフォルトの名無しさん :2009/06/04(木) 18:36:32
スレの皆様に質問です。 8ビットbitmapファイルを読み込み、各ピクセルに演算を加え、別ファイルとして出力するプログラムを作っています。 演算結果をint型の変数ifooに格納し、unsigned char型にキャストしてputしています。 ifooがunsigned char型の範囲外の値の時は、範囲の端の値を代入しています。 //fin,foutのファイル上の位置は適切な場所にあるとする for (int y=0 ; y<height ; ++y){ for (int x=0 ; x<width ; ++x){ int ifoo = fin.get()*A+B; if(ifoo<0) ifoo=0; if(ifoo>255) ifoo=255; fout.put((unsigned char)ifoo); ++i; } //bmpファイルの幅は4の倍数ピクセルとする } 先輩が組んだプログラムはこれの2倍以上速いのですが、AとBがハードコードされていて ソースコードは失われ、先輩本人は行方知れずです。。。 そのためA,Bを引数で与えられるように、イチから再作成しています。 1000x1000pxのBMPを一度に数千枚〜数万枚単位で処理するため このループ部分をもっと高速化したいです。何か良いアイデアは無いでしょうか。 ちなみにこの部分以外に目立ったループ箇所は無いです。
>>636 1. ループの中で ファイルIOするのは遅すぎるので、
一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
(全部読み込めないほどメモリが少ないのなら、一部ずつとか)
2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く
>>637 早速ありがとうございます。とりあえず1を試してみます。
環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。
2の手法はVisualStudio等を使って行う方法でしょうか?
そのうち勉強してみたいと思います。
と外部ライブラリ
usingを解除することはできますか? namespace { using foo::CFoo; class CBar { public: void hoge(CFoo); }; } みたいにやってるんですが副作用があるのかどうか気になってます
>>638 最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。
いずれにせよgccでも使える。
まぁまずないとは思うけど最適化オプションの存在は知ってるよね?
>>635 while(scanf("%d %d",&a,&b)!=EOF){
fprintf(fp,"%d,%d\n",a,b);
}
としてみるべし
デートは家でまったりしたいのですが 女性から見ればNGですか?
646 :
デフォルトの名無しさん :2009/06/04(木) 21:43:37
Rubyを教えてくれるならOK
649 :
636 :2009/06/04(木) 22:05:38
>>639 アセンブラはマイコンで少々やったことがあるので挑戦してみます。
ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn
>
>>640 外部ライブラリというと、そういう処理が高速にできる
ライブラリを他から持ってきちゃえということでしょうか?
>>643 恥ずかしながら知らなかったです。
軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。
プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。
皆様アドバイス有難う。
あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。 gccならOpenMPが使えるし。
651 :
636 :2009/06/05(金) 14:13:30
>ループの中で ファイルIOするのは遅すぎるので
>一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
new で uint8(unsigned char)型の readbuf,writebuf を、int型のcalcbufを確保し
以下のように書き換えたところ、
>>636 より約6倍も高速化しました。
fin.read((char*)readbuf,width*height);
int i=0;
for( int y=0 ; y<height ; ++y){
for( int x=0 ; x<width ; ++x){
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
}
fout.write((char*)writebuf,width*height);
○vector<uint8> foo でバッファを確保した場合 read()にchar* が渡せないからダメ。
という判断から、バッファはnewで確保しました。
○ループ中の2回のif文をelse if でまとめ、比較演算回数の減少を図りました。
(気休め程度だと思ったので、これ単体の効果は未計測)
「先輩と互角」という目標を軽くクリアし、先輩の倍以上高速なプログラムになりました。
最適化オプション、インラインアセンブラ、並列化等もこれから試してみたいですが
目標クリアしたためとりあえず質問は終了させて頂きます。
スレの皆様ありがとうございました!
652 :
デフォルトの名無しさん :2009/06/05(金) 14:20:51
アセンブラ化は効果なし。 もっとも時間かかるのはディスクアクセス。 Windowsであれば、Noバッファリングで読み込んでみて。 バッファリングありより倍以上の速度になる。 あと、一度にたくさん読み込んでも逆に遅くなる。 100M読み込むより、4Mや2Mずつのほうが速い。 データが仮想メモリ(HDD)に移動してしまう可能性が高い。 自分の環境では4M以上は速度は上がらなかった。
653 :
デフォルトの名無しさん :2009/06/05(金) 14:24:21
ちなみに一度に一斉に書くのも遅くなる。 メモリ不足になるという理由で。 入出力バッファは、1M〜4Mくらいにして、使い回すのが吉。
並列化もきっと意味ないだろうなぁ
calcbuf[i] = readbuf[i]*A+B; if(calcbuf[i]<0) writebuf[i]=0; else if (calcbuf[i]>255) writebuf[i]=255; writebuf[i] = (uint8)calcbuf[i]; ↓ tmp = readbuf[i] * A + b; if (tmp < 0) tmp = 0; if (tmp > 255) tmp = 255; writebuf[i] = (uint8) tmp;
656 :
デフォルトの名無しさん :2009/06/05(金) 14:29:14
657 :
デフォルトの名無しさん :2009/06/05(金) 14:34:48
bmpではなくjpgなら、アセンブラ化は効果あるだろけど bmpはサイズがでかいからな。 処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど 単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。
implementationは実装と訳せばいいのですか?
>>656 バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?
661 :
658 :2009/06/05(金) 21:31:46
関数を呼びまくるとスタックオーバーフローを起こします。 スタックを増やす以外にどんな解決方法がありますか?
関数オブジェクトをヒープに置く。
>>662 再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。
そうでなければ、ローカル変数域を減らす。特にバッファ。
665 :
デフォルトの名無しさん :2009/06/06(土) 05:33:46
配列の要素の組み合わせを出力したいのですが、 実装をどのようにするか迷っています・・・ 配列 int array[10] = {0,1,2,3,4,5,6,7,8,9}; 出力 {0}, {1}, {2}, {3}... {9} {0,1}, {0,2}, {0,3}... {8,9} {0,1,2}, {0,1,3}... {7,8,9} ... {0,1,2,3,4,5,6,7,8,9} このような出力を実現するにはどのようにコードを組めば効率が良いでしょうか?
ヒント:二重ループ
なんだよそのヒントw
>>665 は一応実装はできるけど
最適な実装ロジックを聞いてるんでしょ。
いや二重ループが一番のヒントだろ
>>665 どういう規則で出力するのかさっぱりわからん。
桁ごとに、組み合わせを順番に表示してくんだろw
>>665 効率はしらんが、適当に書いてみた
#include <stdio.h>
void combi(int n, int pos, int digit, int *array)
{
int i, j;
if(pos==digit) {
printf("{%d", array[0]);
for(i=1; i<digit; i++) printf(",%d", array[i]);
putchar('}');
} else {
for(i=n; i<=9; i++) {
array[pos] = i;
combi(i+1, pos+1, digit, array);
}}}
int main(void)
{
int i, array[10];
for(i=1; i<=10; i++) combi(0, 0, i, array);
return 0;
}
printfのfはformattedのfだと聞いたことがありますが、 そもそもformattedってどういう意味ですか? 辞書を引いてもC/C++に適した訳語が見つからなくて。。。
書式に則った
>>673 何の書式に則ったってことですか?
自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?
どう考えてもそれしかないと思う。
>>665 main()
{
int array[10]={0,1,2,3,4,5,6,7,8,9};
int i,f,set;
for(set=1;set<=0x3ff;set++)
{
putchar('{');
for(i=0,f=0;i<10;i++)
if(set & (1 << i)) {
if(f) putchar(',');
printf("%d", array[i]),f=1;
}
putchar('}');
}
}
>>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった
679 :
デフォルトの名無しさん :2009/06/06(土) 15:57:09
クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。
680 :
デフォルトの名無しさん :2009/06/06(土) 15:59:10
681 :
デフォルトの名無しさん :2009/06/06(土) 16:04:03
これができません。なぜでしょうか。 #include <iostream> #include <string> using namespace std; class A { public: char *ch; A() { ch=new char [10]; strcpy(ch,"aaa"); } void test(char *p){ p=ch; } }; main () { A x; char *p; x.test(p); cout<<p; }
682 :
デフォルトの名無しさん :2009/06/06(土) 16:06:26
自己解決しました。 test(char* &p)にしたら良かったです。
char* &pって気持ち悪いなchar*& pがクール
いやむしろ、char *&p の方がクール。 理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。 char* p; のように書く人は p と q をポインタにしたいとき char* p, *q; のように非対称に書いたりするので混乱必至。 っていうか宗教^^
685 :
デフォルトの名無しさん :2009/06/06(土) 16:16:56
それより一引数で参照私の値変更ってのがさ!
>>684 > char* p; のように書く人は p と q をポインタにしたいとき
> char* p, *q; のように非対称に書いたりするので混乱必至。
そうでもないよ。俺は普段1行目のように書くけど、2行目のようなケースは
まず第一に「滅多に書かない」し、もし書く時は char *p, *q; って書く。
まぁ、宗教。
そもそも*&ってのが気持ち悪い ダブルポインタのほうがかっこよくない? まぁ、宗教。
Effective C++(第2版)には ** 使うくらいならどうして *& を使わないのかって書いてあるから
*& でいいんじゃない?っていうか、
>>681 のような質問って時々出てくるけど
その設計にどういうメリットがあるのかしら?
ポインタの管理はクラスの外でやってるし、そもそも内部の詳細を公開しているし・・・
創価学会最高!
そこまでするならmulti_arrayみたいにラップするわ
デバッグしてるときにちょっと気になったんですが 他人の作ったメソッドや関数(例えばSTLやboost)が投げる可能性のある例外を調べる方法は仕様を読む以外ないんでしょうか? 強制的に例外を投げさせるオプションみたいなものがあるんでしょうか? コンパイラはVC++EE2008を使っています
つ grep
複文マクロは do{〜;〜;〜;}while(0) とすると良いとききました。 しかしこれだと返り値を持たせられないため、関数形式のマクロが書けません。 複文マクロでありながら、返り値を持たせる方法はありませんか?
694 :
デフォルトの名無しさん :2009/06/06(土) 22:34:00
インライン使っとけ。 複雑なマクロつかうよりいい。 エラーがわかりやすい。 実行時間が計測できるなどりメリット。
>>694 インライン関数などの知識は十分あるんですが、
どうしても変なマクロが書きたいんです。
マクロでしかできない変な処理なんです。
カンマ演算子でなんとかするのはもう考えた?
>>696 ありがとうございます。
もう考えてあります。
ただ、try catchブロックを盛り込みたく、それがカンマ演算子に合わせられないのです。。。
そしてマクロでしかできない処理というのは「マクロ引数から#で文字列化する」というような
いわばリフレクション的な処理も含んでいる物だからです。
まあ無くても支障ないのですが、一般化して再利用可能にしておいたら便利かなと思って
変態マクロに挑戦しているところです。
引数っぽくすれば #define FOO(X) do{;;(X)=hoge;}while(0)
699 :
697 :2009/06/06(土) 22:55:03
>>698 ありがとうございます。
副作用を持たせるわけですね。
最終手段として考慮します。
しかし当面はもうちょっと挑戦してみます。
返り値はbool型になる予定でして、疑似関数の形の方が分かりやすいので。
関数テンプレートや文字列結合演算子、無名構造体など、
もちえる言語仕様の知識をフル活用してみます。
void func(float a[]){ int size=sizeof(a)/sizeof(float); } これでsizeに配列aの個数が入ると思ったのに1になる。何で?
aはfloatへのポインタに変わったから
サイズが分からないから void func(float a[10]){ とかにすれば10って出るはず
void func(float a[]){
としても
void func(float *a){
となるから
>>702 なんねーよばか
ありがとう。float[10]ってしないと駄目なのか でもそれだとint size=10;ってすることと一緒だから意味無いよね 受け取った配列の数によって処理を変えたいんですがどうすればいいですか?
それこそマクロっぽくするべき #define func(x) func_(sizeof(x)/sizeof(float)) void func_(unsigned size);
>>704 二引数にして大きさを渡すする
ものすごい馬鹿みたいに思うかもしれんが
memsetやらfreadやらあるように領域の大きさを渡すのは普通
void func(float *a, size_t n) { } #define numberof(array) (sizeof(array)/sizeof(array[0])) float foo[10]; func(foo, numberof(foo));
ありがとうございます。サイズを引数として受け取るしかないんですね 当たり前なんだろうけど、これにはちょっとびっくり。 普通に分かるものだとばかり思ってた
商業ソフトだとメモリ確保とかでガチガチにtry catchするんでしょうか?
メモリ確保失敗はアプリレベルではどうにもならないからOSに例外投げてしまう。 という考え方もある。
限界になる前に、そろそろメモリが足りません言い出すソフトもあるなぁ・・・・
OSに例外投げたらどうなるんだ?つか、そんなことできるのか?
他人のソースコードを読んでいってもさっぱり頭に入ってきません。 何かソースコードを読む際のポイントとかあるんでしょうか。
コメントを読んだり、 読んでる関数の中身までは読まずに、大まかな流れを先に確認する。
>>713 doxygen(Graphviz)で関係のグラフ化オヌヌメ
テンプレートの型を一部の型に限定したい(たとえばunsignedの各種整数型のみ)場合は template<typename T> class HOGE; template<> class HOGE<unsigned char> {...;}; template<> class HOGE<unsigned short> {...;}; template<> class HOGE<unsigned long> {...;}; template<> class HOGE<unsigned int> {...;}; のように本体を書かずに、特殊化のほうをいちいち全部書くしかないんでしょうか?
traits
C++にて。 同じ副作用を保ったまま、式を文にすることは出来ます。 セミコロンを付ければ良いだけです。 例 x=3ならx=3;とすればよい。 しかし同じ副作用を保ったまま、文を式にすることは出来ますか? その際の式の値は何だって良いとして。 例 while(flag){++x;} を ???
>716 class の中身の方は型によって変わらないと仮定して、 #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_unsigned.hpp> template<typename T, typename Enable = void> class HOGE {}; template<typename T> class HOGE<T, typename boost::enable_if<boost::is_unsigned<T> >::type> { // 何か }; 他の型にするなら boost::is_unsigned を適宜変更すれば OK。 型をべた書きするなら↓なんてのも可能。 #include <boost/mpl/set.hpp> #include <boost/mpl/has_key.hpp> template<typename T> class HOGE<T, typename boost::enable_if< boost::mpl::has_key< boost::mpl::set< unsigned int, unsigned char >,T> >::type> { // 何か }; 中身も変わってくるなら >717 の通り traits でまとめる。
>>718 そこを関数にする。
そうすれば関数呼出式になる。
721 :
718 :2009/06/07(日) 14:31:24
>>720 あーなるほど。
ありがとうございます。
for each 処理を自前で作りたい。 Sentinelを付加する方法でなんかいいアイデアない?
CかC++かくらい書け。 もっとも、C++ならSTL使え、だが。
もっと洗練されたライブラリが必要だと思うんだ
725 :
722 :2009/06/07(日) 19:00:27
STL様 i=begin;while((function(i++),i)<=end); は偽物foreach i=begin; end+1=eoloop; while(function(i++)); ^^^^^^^^^←この部分
一応Qt(C++用ライブラリ)にforeachはある それを参考にしろとは言わんが
インターフェースクラスがクールに感じたんだけど、これってなにかマイナス面はある? 今作ってるプログラムをこれ使って大幅に書き換えようかなと思ってるんだけど
>>727 ソースコードの量が増える
保守するとき読めればいいが
そんな保証などない
将来性にかけて拡張性に優れた設計にするには
優れた設計能力が必要
後からの変更は1からのやり直し
>>727 Qtのこと?
俺もQtの設計は美しいと思ってるし、
いまさらMFCやろうとしてる(まずいないがw)やついたらQtを紹介してる
マイナス面は、以前はGPLだったけどそれも変更になってLGPL
不満といえばdllのサイズぐらいかな?
マルチOSなのもおいしいところ
>>725 std::for_eachもいやならBOOST_FOREACHはだめ?
QtってGUI専用だと勝手に思っていたが、 GUI以外の事も出来るの?
>Qt 何故か俺の中で、 フジコフジオのイメージが払拭できない
>>732 コンテナ、ネットワーク、XML、データベースとか一通り
機能制限はあるが組込み向けやXサーバーなしでもGUIが使えたり
735 :
732 :2009/06/07(日) 22:24:51
>>734 すげーー
マジかよ。
LGPLだと商用利用はしんどいか?
Staticリンクしちゃうとオープンソース強制だっけ?
>>735 LGPLだと静的リンクはアウトだね
動的リンクなら商用非公開おk
LGPLだと、リバースエンジニアリングの拒否の禁止かな。
738 :
732 :2009/06/07(日) 23:06:54
リバースエンジニアリングはどうせされるんだろうし そんなの禁止しても意味ないだろうけど・・・。 >動的リンクなら商用非公開おk これはつまりDLLを付属させて配れってこと?
>>735 強制じゃないけど
staticリンクでその条件を満たすのはかなりしんどい
ってことは 「QtのDLLを付属させてスタティックリンクしないようにするかぎり」 無償でクローズドソースの商用利用が可能 ということか。 Qtいいな。 …ちょっと考えてみようかな。
>>742 ggrks
相当前からあるソフトで、情報も腐るほどあるぞ
ちなみにそのウィザードもQtでできてる
C++のテンプレートについて教えて クラスとどう違うんだ?
次元が違う
違いすぎて逆に説明が困難だな。
訂正 C++のテンプレートについて教えて やっぱクラスとの違いじゃなくてどういう時に使うのか どんなニーズによってできたのか教えて
型が違うだけで同じような処理を何回も書かないで済むように
749 :
デフォルトの名無しさん :2009/06/08(月) 06:46:52
今年女子大に入ったばかりのゆきこと言います。 C++を学びたいのですが、どの本がお薦めでしょうか?
>>744 天と地ほど違うと思うけど。
[タイヤキを作るための金属の鋳型]
と
[食べられるタイヤキ]
の違い。ぜんっぜん違う。
>>750 それクラスとインスタンスの違いでなくて?
テンプレートはその鋳型を付け替えるとタコ焼にも今川焼きにもなる台とか
型チェックしてくれるマクロとでも思えば。
なんだかtemplateってbindに似てるね
755 :
デフォルトの名無しさん :2009/06/08(月) 13:03:26
コンストラクタの引数の値によって、データメンバの型を変える方法ってありますか?
子供もかよ……
ぼくおとこのこだよ…
>>755 同じ親クラスから継承した子クラスという条件内であれば可能。
もしくは、void*で持たせれば、多分なんでもおkだけど。
760 :
750 :2009/06/08(月) 16:12:44
>>752 そうとも言えるな。
なら俺方式で言うなら
クラステンプレート=[タイヤキやら今川焼きやらを作るための金属の鋳型を作るためのナニモノか]
クラス=[タイヤキを作るための金属の鋳型]
インスタンス=[食べられるタイヤキ]
とでも言えばいいかな。
喩えなら何とでも言えるわ。
名前空間について質問です。 名前空間 foo と、それとは別に名前空間 bar::foo があるとします。 このとき、bar の内側から、bar::fooでは無い方の foo を指定するにはどうしたら良いのでしょうか。 なお、環境はWinXP、C++、VisualStudio2005です。
::foo
764 :
762 :2009/06/08(月) 17:53:04
すみません、2つ質問するつもりで書いてませんでした。
あるクラス内に、別クラスをメンバ変数として取り込む時、
その別クラスが書かれたヘッダファイルをインクルードするのではなく、
先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
さて、その別クラスの名前が、名前空間 bar の下にあるとき、
namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?
>>763 ありがとうございます。
なんで思いつかなかったんだろう、自分。
765 :
デフォルトの名無しさん :2009/06/08(月) 18:40:27
便乗質問、テンプレートクラスを持たせる時って同じ方法使えるん?
使えるん
>>764 あなたのいうクラスに名前が付いていないので
説明の便宜上
あるクラス=MyClass, 別クラス=fooとします。
まずは本題からちょっとそれた話から。
> その別クラスが書かれたヘッダファイルをインクルードするのではなく、
> 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
あります。
しかし
> あるクラス内に、別クラスをメンバ変数として取り込む時、
この場合は前方宣言Forward declarationだけでは足りません。
というのも、
class MyClass {int m_num;std::string m_str;foo m_var;}
のようにメンバ変数としてfoo型変数を使いたい場合、
fooが不完全型なのでそのサイズがわからず、したがって
MyClassのために確保すべき領域のサイズもコンパイラには分からないことになるからです。
前方宣言で足りるのはfoo型メンバ変数ではなく
foo型への参照型メンバ変数やfoo型へのポインタ型メンバ変数、
あるいはメンバ関数の戻り値としてfoo型を使用する場合などです。
768 :
デフォルトの名無しさん :2009/06/08(月) 18:54:54
ユーザが入力した数式を処理するプログラムを考えているのですが cin>>eq; #define function(x) (eq) cout<<function(1); みたいなことができませんんか?もしくは別の方法があったら教えてください
769 :
767 :2009/06/08(月) 18:54:56
あとはまあ 前方宣言で足りるのは メンバ関数の引数の型としてfoo型を使用する場合 や typedefとかかな。 > さて、その別クラスの名前が、名前空間 bar の下にあるとき、 > namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか? それでいいと思いますが。 class bar::foo;とか書いても無理ですし、それ以外記述できないですよねぇ? もし有識者がいらしたらそっちを信用してください。
770 :
767 :2009/06/08(月) 18:56:45
>>768 意味不明ですが、どういうことですか?
プリプロセッサにより
cin>>eq;
cout<<((eq));//xは無視される
として処理されるだけですが。。。
>>770 768に書いたのはあくまでイメージです。言葉足らずですみません
私がしたいことは引数にある文字列を数式として扱いたいのです
もしくはcinで入力した式をプログラムで処理したいのですが
772 :
デフォルトの名無しさん :2009/06/08(月) 19:02:27
ほんとは言語の問題じゃないかもしれないけど教えてください @double配列と、Aメンバがdoubleいっこだけの構造体の配列を読み上げる速度を比較するための コードを書いて実行してみたらAのほうが速かったです 環境はItanium、CentOS、GCC(C++)です これはなぜなんでしょうか?
そうなったから
774 :
767 :2009/06/08(月) 19:04:19
>>771 言いたいことは分かりました。
C++の知識はどのくらいありますか?
STLやBoost C++はご存じですか?
C言語じゃなくてちゃんとC++らしいコードが書けますか?
>>772 不思議だわ。
・・・最適化とかレジスタの割り付けとか、もう不確定要素に押されて結果が揺らいでるだけじゃないか?
つまりどっちで書いても大差ないから好きな方で記述すればよか。
>>774 c++は初めて3か月くらいですが、STLはつかったものがあるので
簡単なものなら大丈夫だと思います。
>>775 計算時間半分くらいでした
ちなみにこれに気づいたのは構造体メンバのアライメントに関する実験中でした
コンパイラが賢くなりすぎてマニアックな知識も必要ない時代になったんですかねえ・・・
普通のポインタがインスタンスを持ってるかどうか判別する方法はありますか? 現状ではポインタのゼロ初期化とdelete・0代入を徹底するぐらいしか手段が思いつきません
779 :
767 :2009/06/08(月) 19:11:28
780 :
767 :2009/06/08(月) 19:13:06
>>768 これでイメージが湧いたらそいつは一流のエスパーだwwwww
782 :
767 :2009/06/08(月) 19:17:06
>>778 >普通のポインタがインスタンスを持ってるかどうか
有効な領域を指し示しているかどうかとおっしゃりたいものと推測・解釈します。
結論から言えば、
普通のポインタでしたら、そんな方法はありません。
指し示す領域が有効かどうかなぞわかり得ません。
783 :
768 :2009/06/08(月) 19:22:56
784 :
764 :2009/06/08(月) 19:45:30
>>767 >>769 ありがとうございます
>宣言
やっぱ namespace bar { class foo; }; って書くしか無さそうですね。
階層が深いとちょっと面倒かな?と思っただけなので、特に問題はありません。
>メンバ変数
確かに、メンバ変数を直接弄ろうとすると前方宣言だけじゃダメですよね。
まあ、素直にアクセサ付けれ、って話ですが。
>>765 確かに、 std::string とかは上記の方法じゃ出来ないですね。
C++の関数で文字列を参照渡しする方法がわかりませ ん &stringだと弾かれたし
>>785 参照の記述を勉強してください。
クラス名& ref=参照先;
で記述します。
787 :
785 :2009/06/08(月) 20:23:15
参照の書き方って&nと違うの?
>>787 まずは日本語から覚えた方がよさそうだな
char &string; って書いてるんだったりして。
790 :
786 :2009/06/08(月) 20:36:41
もう らちがあかないので ソースみせるか、 参照の記述を勉強し直すか、 名前空間を記述するか せめて少なくとも1つはやってみせてください。 なんかアドレスとごっちゃになってそうな予感もしますね。
int func(const char *string)
途中送信。>791を参照渡しにする
793 :
786 :2009/06/08(月) 21:04:14
>>791 それだけエスパーを強制しすぎです。
適当に答えるなら
//before
int func(const char *string);
const char * const p="mojiretsu";
func(p);
がアドレス渡し(ポインタ渡し)で、
//after
int func(const std::stirng &string);
std::string str="mojiretsu";
int func(str);
が参照渡しです。
せめて前後関係の分かるソースを見せてください。
答える側が書いたソースの方が長いっておかしいです。
foo *p = new foo[bar]; delete p; がまずいのはわかるんだけど foo *q = new foo; delete [] q; ってーのはべつにやばくない・・・よね?
やばいよ。何が起きても知らないよ。
std::stringで書き変えるのは要求を満たしてない気がするなあ。
>>794 配列をnewしたときは、その配列のサイズなんかも保持しておくので
配列じゃないのにdelete[]だと、関係ない部分にアクセスする危険性がある……と教わったが、正確には違うかも。
798 :
786 :2009/06/08(月) 21:21:37
>>796 彼は
>C++の関数で文字列を参照渡しする方法
と言っています。
別にconst char*型変数を参照渡ししてもいいんですが、
もうエスパーするしかないからわかりませんよ。
>>794 だめな理由は処理系によりいろいろあるだろうけど、そんなの関係ない。
「仕様上認められていない」ってだけで
十分に鼻から悪魔が出てくると結論づけられます。
C++はめんどくさいな
C++に限らず、多種多様の実装が存在する言語は多かれ少なかれそういう傾向にあると思う。
doxygen = デュクシジェン
doxygen destroyer
C言語をやりたいんだけど Microsoftのc++ExpressEdition ってのでもできますか? #include <stdio.h> int main(void){ printf("aaaa"); return 0; } みたいなのもちゃんとできますか?
>>806 Microsoft Visual C++ 2008 Express Edition
の事ですね。
可能です。
ですが、最初はコンソールの方が分かりやすいと思いますよ。
C/C++初心者なら
bcc5.5.1+bcc developer
がなかなかオススメ。
エラーメッセージが分かりやすいので。
複雑なテンプレート等、まともなC++をやりたくなったらその時初めて
Microsoft Visual C++ 2008 Express Edition
gcc3.x, gcc4.x
などを試せば良いかと思います。
まあ鼻から悪魔が出ることは無いと断言できる
C/C++というよりLinuxの質問になってしまうのですが、 mq_sendとmq_receiveでメッセージキューのパラメータに 任意の構造体を渡すことはできますでしょうか? 関数仕様ではchar*のみのようですが。 メッセージキュー以外の方式で別プロセスに任意の型の 値を渡す代替案があればそれでも良いのですが。
mmapとかpipeとか プロセス間通信は、Linuxの方で聞いた方がいいかもね
811 :
デフォルトの名無しさん :2009/06/09(火) 16:13:22
使ったこと無いけど 文字列にシリアライズして渡すんじゃねーの そんな雰囲気のある関数っぽい
>>809 昔は, 任意のバイト列に対するポインタは char* を使っていた
で, 関数使用はその名残だと思うんだわ
# kernel 内部の caddr_t とかの絡みもあるとは思うが………
構造体とか配列とかもバイト列として表現できるわけだから,
キャストすれば何でも可
なるほど、ありがとうございます。
mmapとかの共有メモリがお手軽そうですね。
>>812 やはりできるんですね。やろうとしてsegvでちゃったん
ですが、できるとわかればもうちょっと調べてみます。
vectorのmax_size()って中の人はどうやって計算してるの?
bad_alloc出した場合って普通何をするもんなのかな ・APIとかで開いた画像ファイルとかを閉じる ・そのメソッドで確保成功した分のメモリを開放する ・そのメソッド内での仕事が完了したらbad_allocを上に投げる ・再帰的に開放作業を繰り返して、一番上でプログラム終了 とかでいい?
>>815 gcc 4.1は単にsize_type(-1) / sizeof(value_type)を返してた。
VC2008は、上の値とアロケータの最大サイズと比較してちっさい方返してた。
818 :
デフォルトの名無しさん :2009/06/09(火) 19:52:52
void Initialize(){ ここで配列を5本動的確保 } そしてこの関数で使いたいんですがどうすればいいですか? void calc(){ } calcは何度も呼び出すのでcalc内で動的確保するのは無駄だと思いました。
template <typename _T,int _Size> class hoge { private: std::vector<_T> _vec[5]; public: void Initialize(void) { for(int i=0;i<5;++i) _vec[i].reserve(_Size); } void calc(void) { 以下略 };
vectorとかのコンテナのサイズを変えるときはtry-catch(bad_alloc)したほうがいいの?
>>821 お前の質問に対する答えが
>>819 なわけだが、STLがその答えの本質じゃないことぐらい判るだろ。
コードを一から書いて欲しいなら宿題スレ行ってこいよ。
内容がC++からちょっとずれますがお願いします。 大学ではじめてのC++で勉強しているのですが、phpの初心者向けサイトで コードをみたところc++と似ていて驚きました。c++はphpにも応用が利くと聞いたのですが、 C++をどの程度できるようになればphpでも簡単なwebサービスをできるでしょうか?
C++をいくら極めてもwebサービスはできんじゃろ。 なんせ標準ライブラリにwebに関するものはまったくはいっとらんからな…。
>>821 STLなしでとか何言ってるの?
まさかSTLない環境でやってるわけじゃなくて知識がないだけでしょ?
ちょっとで良いから勉強しろよ。
>>814 Linux の実装はしらんが, Solaris とか *BSD とかの実装だと,
mq_send で msq_ptr からサイズ分 kernel 内バッファにコピーして,
mq_receive で該当領域を読み出し側にコピーする
で, kernel は該当領域にアクセス可能か否かの test 程度は行っている
ので, とんでもない引数を与えると EINVAL か何かが返るはず
segv が発生するのは, mq_receive で, msq_ptr として与えた領域サイズより
大きな msg_len を与えてスタック書きつぶしたときくらいじゃ内かな?
827 :
デフォルトの名無しさん :2009/06/09(火) 21:34:16
文字処理が面倒だけど cgiで起動すれば出来るんじゃね。
0から99までの乱数を表示するプログラムを作ったんですが、コンパイルしたらまた新たな乱数を表示するにはどうすれば良いのですか?
時刻でも乱数シードに使えばいい
>>828 乱数の生成方法によって違うけれど乱数の種を設定できる仕組みがあるはずだからそれで種を変更する。
832 :
デフォルトの名無しさん :2009/06/09(火) 21:50:14
>>829-831 ありがとうございます。
すいません。
かなり初心者なので、出来れば、詳しくお願いします。
今main関数の中が
cout<<rand()%100<<endl;
だけなんですが、何かつけ加えますか?
>>832 そうゆう話なら取りあえず処理系の名前を書け
↓以下乱数の質について
835 :
デフォルトの名無しさん :2009/06/09(火) 21:56:53
箱を開けたら猫
メルセンヌツイスタでぐぐるといいよ
>>836 けっして誉められた手法ではないんだろうが
おそらく
sland(time(NULL))
とかやっとけば?
>>834 が期待してるように
用途に応じて生成される乱数の品質とかアルゴリズムとかが問題になる
置くの深い部分だけどな
標準の乱数は大きな素数を割ってるだけみたいな単純な実装なので それをそのまま使うとカルドセプトサーガみたいなことになるかもね♥
>>838 ありがとうございます。
やってみます。
>>837 ありがとうございます。
参考にしてみます。
どういたしまして
質問したいのですが誰かいますか?
います
じゃあ質問させていただきます。 今、作っているプログラムはあるファイルから特定の部分の値を読み込み 値だけのバイナリファイルを書き出すプログラムを作っているのですが。 sstreamを使い、値を変数に格納したいのですがfloat型だと格納できるのですが、 int型だと格納されません。 どうしてか教えてください。 ソース: stringstream ss(f_buf); int test[16 * 3]; //ここがint型だと値が入らない for(int i = 0; i < (16 * 3); i++){ ss >> test[(i * 3)] >> w >> test[(i * 3) + 1] >> w >> test[(i * 3) + 2] >> w >> w; } データ: 0;1;2;, 1;2;3;, :
>>845 追記
stringstream ss(f_buf);の下に
char w; //記号を飛ばすための変数
847 :
デフォルトの名無しさん :2009/06/10(水) 01:19:14
どうしてでしょう?
わからん
849 :
デフォルトの名無しさん :2009/06/10(水) 01:27:14
たとえば古いgccはstringsteamの中身に挙動不審なバグがあるので、それが原因かもしれない。 今やってみたらとりあえずgcc 4.1とVC2008はどっちもちゃんと動いた。 #include <iostream> #include <sstream> using namespace std; int main(void) { int t[3]; char w; stringstream ss("1,2,3,,"); ss >> t[0] >> w >> t[1] >> w >> t[2] >> w >> w; cout << t[0] << " " << t[1] << " " << t[2] << endl; return 0; } 出力 1 2 3
851 :
デフォルトの名無しさん :2009/06/10(水) 01:34:22
>>850 さん、ありがとうございます。
環境をかくの忘れてましたね…
環境はVC2005です。
>>850 さんのソースも試してみましたがやはりだめなようです…
変数を作った時の不定な値が入ったままでした。
2008でビルドしてみようかな…
あるディレクトリ下にあるファイルを読み取ってから削除するという処理をしているのですが、希にコピー途中のものを読み取ってしまい、 思ったような動作が出来ない場合があります。アクセスしようと(もしくはアクセス中の)ファイルが、コピー中であるか否かの判断は 一般的にどのような方法で実装するのでしょうか。
>>853 Windows 2000/XP です。コピー元は同じPC上の時もあれば、ネットワークを介して他PCからの場合もあります。
855 :
853 :2009/06/10(水) 10:19:57
俺はUNIX屋なので、後は誰かに任せた。
FILE_FLAG_DELETE_ON_CLOSEフラグ付けて開くとか
858 :
デフォルトの名無しさん :2009/06/10(水) 12:41:47
std::stringでTCHAR扱えないので std::basic_string<TCHAR>を使うってのはグーグル先生でわかったんですが、 入出力の方法が今度はわかりません。グーグル先生に聞いてもわかりませんでした。 std::cinやstd::coutの代わりにどのように使うんでしょうか?
//hoge.h class CHoge { public: void hoge(); }; //hoge.cpp #include "hoge.h" void CHoge::hoge() {・・・}; このCHoge::hogeを省略してhogeだけで書きたいんですけどそういうことはできますか? なぜかusing CHoge::hogeではできませんでした
名前空間じゃなくてクラス名か。 全然「なぜか」じゃねーw どうしても面倒なら、ヘッダファイルに中身も書いたら?
C#を使えばおk
>>858 wstring & wcoutを使う。
>>859 #define hoge CHoge::hoge
863 :
デフォルトの名無しさん :2009/06/10(水) 14:51:54
+とか+=とか、そういった四則演算関連の演算子オーバーロードを作成したいのですが、 ネットで見ると、戻り値が参照だったり実体だったりして、演算子によって違うみたいです。 どういう考え方で参照と実体の使い分けをしているのでしょうか?
関数を抜けても壊れない参照を返せるなら基本参照返し。 一時オブジェクトを返さざるをえないなら泣く泣く実体返し。
865 :
デフォルトの名無しさん :2009/06/10(水) 15:49:30
float型の変数がゼロかどうか(誤差も含めて)判断するときに、 1e-4fみたいな数字で比較を行っているコードを見たんですが、 こういう数字の記述の仕方(意味)を説明してるウェブページをどこか知りませんか?
科学表記とかでぐぐる
初歩的な部分ですが、 while(i--) 処理 は「iの値が評価され、処理を実行するか決定する」→「iがデクリメントされる」 while(--i) 処理 は「iがデクリメントされる」→「iの値が評価される」 ということで、i>0なら前者は処理が i 回、後者は (i - 1)回行われるということでよいのでしょうか。
コーディングの最終段階に入っていて、 なるべく見通しが良くなるように関数に処理を分割したりしています。 a,b,cという関数が有って各関数はうまく行けば0を返し失敗すれば1を返します。 aがうまく行けばbを,bがうまくいけばcを行いcがうまく行けば 最後に少量の出力が有ります。 そこで、今の段階はプロトタイプとして int main() { if(a == 0) { if(b == 0 { if(c == 0{ //some print } } } return 0; } となっているのですが、ネストが深くなりすぎているような気がしてなりません。 なにか良い方法が御座いましたらご教授願います。
if (!a && !b && !c)
!(a||b||c)
871 :
868 :2009/06/10(水) 17:43:50
見落としていた点が有りました。 追加で書きますがお許しください。 aが失敗すればプログラム終了 bが失敗すればプログラム終了 cが失敗すればプログラム終了 とそれぞれ行いたく思います。 よろしくおねがいします。
それは a が false を返す代わりに exit(1) を呼び出せばいいじゃないか^-^
>> 874 ありがとう御座います。 無事きれいになりました!! 感謝感激です。
C++にはJavaのObjectクラスに相当するようなものは無いんでしょうか? Java使い向けに書かれているデザインパターン本を読んでて 脳内翻訳するのに必要になったもので
全然別人が話に食いつきます。
>>873 が言う
>ISO/IEC 14882:1998 3.6.1-4
>exit 関数を呼び出すことは現ブロックを抜けずにプログラムを終了させることであるため、
>自動記憶域期間を持つオブジェクトは破棄されない。
>静的記憶域機関を持つオブジェクトのデストラクタ中から
> exit を呼び出すことは、未定義の動作を引き起こす。
これって
巻頭言 2000〜
ttp://park1.wakwak.com/~y-nagano/200001.html ここに書いてあるとおりなんだろうが、
恐ろしいよねぇ。
もよもと exit はプログラムの異常終了時くらいしか使わんからなー。
>>858 自分で作ればいい。
#ifdef UNICODE
# define tcin std::wcin
# define tcout std::wcout
# define tcerr std::wcerr
# define tclog std::wclog
#else
# define tcin std::cin
# define tcout std::cout
# define tcerr std::cerr
# define tclog std::clog
#endif
あと、mainの頭で、文字コード変換が行われるように指示しておく。
std::locale l(""); // 数値を取り扱うならstd::locale l(std::locale::classic, "", std::locale::ctype);のほうがよいかも。
tcin.imbue(l);
tcout.imbue(l);
tcerr.imbue(l);
tclog.imbue(l);
880 :
デフォルトの名無しさん :2009/06/10(水) 20:57:45
C++なら例外使えばいいのに
>>880 誰もキャッチできない例外をスローするってこと?
みんなはそうしてるの?
例外のよい使い方がいまだにわからん
883 :
881 :2009/06/10(水) 21:14:30
>>882 俺は
関数の戻り値は正常値ならおk、
異常値を返す場合は-1とか0とかそういう値に限り、
不完全なオブジェクトを返すような形は
とらないようにしている。
そして不完全なオブジェクトを返さざると得ない時に
例外を使っている。
・・・でもやっぱり俺もわからない。
885 :
デフォルトの名無しさん :2009/06/10(水) 22:06:18
ABCが失敗したら例外発生させて、キャッチして適当に処理して return 0 すればいい。
VC++を勉強するのにお勧めの本ありますでしょうか? 初級〜中級くらいをめどに
いわゆるぺゾルト本。 Programing Windows 第5版。 定番なので。
>>886 VC++だから、MFCかも知れないが
普通にSDK使う程度なら、wisdomとか入門サイトから見るといいよ
俺はいろいろなサイト見て学んだ
今時MFCはどうかと思うけど、お勧めの本はなさす。 中級以上なら、Effective C++のシリーズお勧め
この本は原著じゃなくても翻訳はまともだから大丈夫だよw プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series) (単行本) まぁ…とっつきにくい感じはするかなぁ。 まぁ、あくまで定番ってことで。
Effective C++はもちろん名著だけど、VCの勉強にはならんじゃろw
質問です Cでファイルに書き込むときに fwrite(str, 1, strlen(str), fp); fwrite(str, strlen(str), 1, fp); とどちらが一般的ですか?何か違いは出てくるのでしょうか?
VC++で、いっぱい書店においてるような本はどうなのですか? 入門〜やや中級手前レベル?の内容くらいかいてるようにはみえたのですが 役に立たないのかな
>>894 プログラミング言語を全く知らない人が、いきなりVCに手を出す状況とかなら
決して悪くはないんじゃないかしら?
>>893 fwrite(str, 1, strlen(str), fp);
に1票。
なんとなく2番めの引数は型のサイズ、3番めの引数はその個数って
思っている。
>>893 >fwrite(str, 1, strlen(str), fp);
1バイトをstrlen(str)分書き込む、成功した際の戻り値がstrlen(str)
>fwrite(str, strlen(str), 1, fp);
strlen(str)バイトを1回書き込む、成功した際の戻り値が1
結果は同じ
ただ、意味のあるデータなら後者の方が意味的に良くない?
>>895 >プログラミング言語を全く知らない人が、いきなりVCに手を出す状況
そうとうな窮地だな。
#include <iostream> #include <list> int main() { std::list<int> nums1; nums1.push_back(4); nums1.push_back(6); std::cout << nums1[0] << std::endl; std::cout << nums1[1] << std::endl; return 0; } vectorで動いたソースをlistに変更してみたら動かないのでしがなんででしょうか?
エラーメッセージ読めよ
「動かない」というのはこの場合、極めて曖昧な比喩表現でしかない。 比喩を使われても困る。
list<int>::iterator p = nums1.begin(); while( p != nums1.end() ) { cout << *p << endl; p++; } list はランダムアクセス子をもってない
904 :
デフォルトの名無しさん :2009/06/11(木) 15:57:58
gprofって、対象のプログラムが使うライブラリが全てスタティックリンク でないといけないのです? そういうのないですよね?
try { m_pInt = new int [N]; } catch { delete [] m_pInt; // <-するべき?それとも放置? }
>>905 m_pIntに予め 0 を入れておけばdeleteしても問題ない
>>905 そんなことよりboost::scoped_array使え。
908 :
デフォルトの名無しさん :2009/06/12(金) 01:31:58
ちょっとした質問です。 二分木の高さと深さは違うものですよね。
木の「高さ」とノードの「深さ」のこと?
下から見れば高さ、上から見れば深さ、相対的な違いか?
視点が違うだけで数としては同じになる
912 :
デフォルトの名無しさん :2009/06/12(金) 02:04:36
たとえば、a(左部分, 右部分)とあらわす。 aはroot a(b, NULL) b(c, d) c(NULL, NULL) d(NULL, NULL) c,dはleaf という風になっているとします。伝わるかわからないですが・・・ このとき、a,b,c,dそれぞれの高さは2,1,0,0で合ってますか?
913 :
853 :2009/06/12(金) 02:07:21
Fedora11落としてきたばかりなのに。 最近は自前でカーネルコンパイルするの減ったな。
914 :
デフォルトの名無しさん :2009/06/12(金) 02:50:17
すいません。だれか僕が作ったプログラミングのデバッグしてくれませんか?お願いします。 初歩中の初歩です。
お断りします
とりあえずうp汁
住所・氏名・連絡先も忘れずに。
コンストラクタの引き数の規約を与えるための仮想基底クラスを作ることはできますか?
>>920 どこにエラーが? 警告なら出ているようだけど。
三行目を void print( const char *c ) にすればいいよ。
>>920 ほい、エラーを翻訳してやったよ。
--
誤りとして扱われる警告
--
R255 G0 B0の赤色の1ピクセルのbitmapのデータ読み込みで 54byte飛ばして色データを読み込んで10進数で表示させたのですが 0 0 -1 0 と表示されます。 0 0 255 0と表示されないのはなぜでしょうか?
>>927 charではダメなんですか?
1バイトだからいいかと思ったのですが
char unchi[10000];
fread( unchi, 1, 5000, fp );
とやっています
あ、わかりました charって-127~128ですよね unsignedにすればいいですか?
できました。 お騒がせしてすいません ありがとうございました。
>>929 ビットマップに限った話ではないが
typedef unsigned char uint8;
とでもしておくと楽。
必要に応じてuint16,uint32,uint64もtypedefしといてもいいかと。
932 :
デフォルトの名無しさん :2009/06/12(金) 15:51:13
char 配列に日本語が入っているとします。 改行コードが\nで統一されている場合に wchar_tにポインタでキャストしたときに文字化けしない方法はありますか?
933 :
932 :2009/06/12(金) 16:05:38
キャストしたら\r\nでも文字が正しくなく・・・ windowsのwchar_tの文字コードは UTF16とか効いた気がします・・・
mbtowc(wchar_t *wc_str, const char *mb_str, size_t mb_scan_size);
935 :
932 :2009/06/12(金) 16:10:43
ここに書いてありました。 EUCやSJISをwchar_t* にキャストして操作しても問題は出ませんか? 表示できないだけで。 ワイド文字 - Wikipedia wchar_tの内部表現もUnicodeである必要はない。 本来はCode Set Independet(符号化集合に独立)なのである。 しかし、Windowsでは16ビット (UTF-16)、 LinuxやMac OS Xでは32ビット (UTF-32)である。
>>935 文字列の終わりの0のサイズが違うんで、キャストしただけじゃ使えないと思う。
質問です int *Array; int *pNum; int Num = 10; Array = new int[1]; Array[0] = Num; *pNum = Array[0]; デバッグすると、このコードの最後の部分でエラーが起きます どうすればうまくいきますか?
>>938 ああ、なるほど
ありがとうございました
ユニコードとかって3バイト以上の文字もありますよね? wchar_tは2バイトなのにどうやってこれを格納してるんですか?
>>940 >wchar_tは2バイト
そんなこと決まってないっしょ?
言語使用上定められているのは
sizeof(char)<=sizeof(wchar_t)
だけじゃない?
942 :
デフォルトの名無しさん :2009/06/12(金) 19:39:08
つ UTF16
少なくともうちでは2バイトじゃないから大丈夫だなあ
cygwinはwchar_tが2バイトっていうイカれた仕様 なのでUTF-8が上手く使えない…
945 :
デフォルトの名無しさん :2009/06/12(金) 21:04:42
windowsも2バイト
そうなのか、失敬した
UTF-8はマルチバイトだからchar*で扱うもの
16bit整数二つ→32bit整数ひとつと変換して、配列の添え字に使いたいのですが 全部のインデックスからアクセス可能にしようとすると配列がでかくなりすぎてこまります なにかいい方法はないでしょうか?
inline static void foo(); と static inline void foo(); とではどちらが正しいですか? foo()はあるクラスの静的メンバ関数です。
950 :
949 :2009/06/12(金) 22:16:02
あれ? MyClassの宣言中では MyClass { //etc static void foo(); //etc }; と書き、 そのヘッダの中(ただし宣言の外で)実装を書いて inline void foo() { //実装 }; と書くのがただしいですか?
どっちでもいい。 どっちかが正しかったら、憶えなくちゃいけないから大変だ。
952 :
949 :2009/06/12(金) 22:22:17
953 :
デフォルトの名無しさん :2009/06/12(金) 22:23:49
>>948 つ map
mapなら、int x=-1; でも、a[x]がエラーにならない。
google製のmapもある
>>940 Windows環境ではsizeof(wchar_t) == 2で、UTF-16を格納している。
昔はサロゲートペアはサポートしていないと聞いたような気がするが今はどうだか知らん。
多くの*NIX系環境ではsizeof(wchar_t) == 4で、UTF-32(UCS-4)を格納している。
int型の配列に整数だけを代入したいときにはどうすればよいのでしょうか? isdigitが数字かどうかの判定が出来るというので、使ってみたら、エラーが出ます。 これがソースの一部です。 for(i = 0; i < 10; i++){ while(isdigit(a[i]) == 0){ printf("%d個目の整数です。\n",i+1); fgets(buf, 10, stdin); sscanf_s(buf, "%d", a[i]); } } whileの中身をどうにかすればうまくいくと思うんですが。
956 :
デフォルトの名無しさん :2009/06/13(土) 02:14:55
いろいろとだめだろ。 &がついてないし、入力後に確認すればいいものをループの上で判定するし たとえば変数xに数字が入っていたら代入すればいいし。
ソースの一部を貼るのはいいが、特に初心者ならちゃんと変数宣言とかも書いてくれ。 あとエラーメッセージもちゃんと書いてくれよ。 エスパー技能を発揮できる人間はそうそういないんだから。
958 :
デフォルトの名無しさん :2009/06/13(土) 02:23:10
たとえば。 int inputsu(){ int x; do{ scanf("%d", &x); } while(x<0 || x>1000); return x; } int main(){ int i; int a[10]; for(i = 0; i < 10; i++){ printf("%d個目の整数です。\n", i+1); a[i]=inputsu(); } }
>>955 isdigitは、あるcharの1字が'0'から'9'までの数字に分類される文字かどうかを判定するだけ。
数値であるかどうかの判定とは違う。
a[i]に値が入るのはsscanf_sの時点。
そのsscanf_sは代入できたデータの数を戻り値にする。見るべきはこれ。
for (i = 0; i < 10; i++) {
do {
printf("%d個目の整数です。\n", i + 1);
fgets(buf, 10, stdin);
} while (sscanf_s(buf, "%d", &a[i]) != 1);
}
>>956 入力後に確認ですか、ありがとうございます。
>>957 すいません、次から気をつけます。
visual C++ 2008EEでやっているのですが、ビルド時にエラーは出ないんです。
コンパイルしたときに
Debug Assertion Failed!
Program:...\Visual Studio 2008\Projects\~
Line: 56
Expression: (unsigned)(c + 1) <= 256
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
っていうメッセージが出ます。
>>958 >>959 言われたとおりにやってみたら、
期待したとおりの出力結果が得られました。
ありがとうございます。
Webを参考に全ての順列を列挙するプログラムを作ったんですが、 これをnPkが列挙できるように改良するにはどうすれば良いですか 引数を一つ増やして(int k) 終了条件をt.size()==kとしてみましたが 予想よりも多く結果が出力されてしまってうまくいきません void perm(int p,vector<int>& v,vector<int> t){ if(t.size()==v.size()){ copy(t.begin(),t.end(),ostream_iterator<int>(cout," "));cout<<endl; } for(int j=p;j<v.size();++j){ t.push_back(v[j]); perm(p+1,v,t); t.pop_back(); perm(p+1,v,t); } } int main(){ vector<int> v(5),t; for(int i=0;i<5;++i){v[i]=i;} perm(0,v,t); }
C言語でマイコンからLCDに文字列を出力するプログラムで void PutString(char* point); void PutChar(char data); main(){ PutString("Hello,world!"); } void PutString(char* point){ while(*point){ PutChar(*point); ++point; } } void PutChar(char data){ //LCDに1文字出力し、カーソルをインクリメントする } 上記のプログラムが正常に動くのですが PutString("Hello,world!"); 文字列のリテラルとchar型ポインタは型があわないはずなのに なぜこの行がエラーにならず正常に動のでしょうか? マイコンというよりCの言語仕様の話だと考えたのでこっちに質問しました。
俺も最近マイコンのプログラムに触れて思ったけど、 マイコン向けのコンパイラってANSIとかに厳密に追従してない感じだな ところどころ気持ち悪い
標準出力? 何ソレ? みたいな環境もあるからな。 それはしゃーない。
>>963 "Hello,world"はchar[12]型。
それが配列からポインタへの変換でchar*になる。
型の問題はどこにもないぞ。
ヒント:リテラル
え?文字列リテラルは書き換えできなくてもchar*に変換できるだろ。
969 :
963 :2009/06/13(土) 15:52:05
>>964-968 アドバイスサンクスです。
関数コール時に一時的にメインメモリ上にchar[12]の領域が確保され
そのポインタが渡され、型の問題が生じない。という理解で良いですか。
char[12]が一時的に確保されたなら、その領域が解放されるのは
PutString("Hello,world!");
を抜けた時でしょうか。
いいや、一時的な領域が作られることはないよ。 基本的に、文字列リテラルは予め用意された静的な領域に置かれるが、 そこへのポインタそのものがPutStringの引数として渡される。
型安全についてCよりも厳しくなったC++では この変換を「死の変換」と呼ぶ。
972 :
963 :2009/06/13(土) 16:26:04
>予め用意された静的な領域に置かれる
納得しました。
>>971 「死の変換」ですか・・・
関数から抜けた後は、その文字列リテラルへのポインタがわからなくなり
永遠にアクセスできない領域になってしまうためそう呼ばれるのでしょうか。
char hello[12] = "hello,world!"
と最初のほうに書いておき、
PutString(hello);
とやるほうが望ましいでしょうか。
973 :
デフォルトの名無しさん :2009/06/13(土) 16:28:43
C++でnamespaceの名前つけかたのルールみたいなものってあるんですか? Javaだと全部小文字でドメイン名をひっくり返したものとか、あるけど。 大文字で始まってるのよく見る気もするし。 ドットが入ってるのあんまり見ないし ドメイン名っていうのはかぶらないのでいい方法だと思うけど yahoo.co.jpだったらどんなのつけます?
974 :
デフォルトの名無しさん :2009/06/13(土) 16:31:59
そういうのは、プロジェクトポリシーで決まるんじゃねーの
>>972 いや、それよりもPutStringの引数にconstつけろよ。
>>973 全世界にソース公開とかじゃない限り「絶対にかぶらない名前をつける」ってのは
重視しなくていいんじゃないかな。
ちなみに、自分はクラス名と同じ命名規則。
977 :
デフォルトの名無しさん :2009/06/13(土) 16:44:55
プログラムのわかりやすさではstringだな。 生成と動作のコストがかかるが。
978 :
デフォルトの名無しさん :2009/06/13(土) 16:52:01
長い文字列、データをソース内に貼り付けるとコンパイル時間かかりサイズもでかくなる。 計算や短い文から生成できるならそれ使うべき。
日本語の識別子を使う人なんてめったにいないだろうから namespaceで日本語を使えば被る確立はほとんどないだろう コンパイラ依存だけど
>>979 どう考えたって、
仕様違反のコンパイラ依存に確実になるくらいなら
namespaceがかぶる危険があるってだけの方が
まだマシだと考えるヤツが大半だと思うが。
ローマ字に止めるべし。
和製英語のローマ字読み最強
BOOL bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg); int iOnSocketEvent(WPARAM wParam, LPARAM lParam); BOOL bInitBufferSize(DWORD dwBufferSize); XSocket(HWND hWnd, int iBlockLimit); virtual ~XSocket(); int m_WSAErr; BOOL m_bIsAvailable; BOOL m_bIsWriteEnabled; void _CloseConn(); int _iSendUnsentData(); int _iRegisterUnsentData(char * cData, int iSize); int _iSend(char * cData, int iSize, BOOL bSaveFlag); int _iSend_ForInternalUse(char * cData, int iSize); メンバ関数の 始まりの文字が b -> return BOOL i -> return int と規則的に作られてるのですが _ (アンダーバー)で始まるのは何の意味があるのでしょうか?
実装した奴が、そうしたかったから 言語仕様での意味はないはず。
privateなメンバとか。何か規則があると思う。 スコープがクラスだから、_[a-Z]+()なメンバ関数があっても他のスコープと識別子がかぶることはないが、 _[a-Z]+で始まる識別子は予約されているので、マクロで置き換えられたときに嵌まるおそれがある。
985 :
デフォルトの名無しさん :2009/06/13(土) 19:00:49
STLのmapの容量はかってみた。 <int,int>で2の21乗個登録したら、127M使用していた。 一個あたり、64バイト。 通常の配列だと4バイト、16倍も消費量が多い。 もっと少なくなるやつある?
986 :
デフォルトの名無しさん :2009/06/13(土) 19:18:51
VC++2008で、2の22個の比較。 上はBCC最新版。 google::sparse_hash_map 50M google::dense_hash_map 66M STL map 132M STLとsparseは挿入時にCPU負荷が高め。 STL使うならdense map使うとよさげ。
その使用量はどうやって計ったの? VC++ 2008のunordered_mapも計りたい。
988 :
デフォルトの名無しさん :2009/06/13(土) 21:04:25
Windowsタスクマネージャですよ。プロセスのメモリ使用量の値です。 ページファイルの分はカウントされないようですが、 アクティブにして時間が立たないうちは、移動しないので正確な値のようです。 たとえばint(4バイト)を64M分確保したらちゃんと64M前後の値になります。
989 :
デフォルトの名無しさん :2009/06/13(土) 21:08:35
あと、vectorやstringなどは実際に値を代入しないと メモリを消費しないので注意してください。 vector<int> v(1<<24,0); としても表示に出ません。 memsetなどで値を入れたら実メモリに確保されます。 あと、確保後にgetchar(); で待ちを入れないと終了してしまいます。
> あと、vectorやstringなどは実際に値を代入しないと > メモリを消費しないので注意してください。 それはC/C++というよりOSの作り次第じゃないかな。 実際にそのメモリにアクセスするまではメモリを割り当てないってのはよくあること。
64bitマシンかな? 赤黒親のポインタ三つで24バイト 自分とキーが両方intで8バイト 足して32ビットは必要最低限のサイズ。まだ半分までしか行かないね。なんか忘れてるかな。 それとも間に入れやすいように櫛みたいなすかすかのメモリ要求してるのかな。わかんない。
>>988 OSはXP、それともVista?
そこを境に表示内容が異なるんだけど。
何でsinとかasinとかってラジアン単位なの? 普通に30度ならsin(30)→(戻り値)→1/2とかasin(1/2)→30とかにしてくれた方が 一々ラジアンに変換しなくていいから楽なのに
degだと展開するのめんどくさいじゃん
>>993 数学だからじゃね?
数学者にとってラジアン以外まともな角度じゃないんだろ。
高校の数学を勉強しなおして来いってことですね。ありがとうございます
度にするって、「度分秒」で指定するってことか?
>>993 三角関数を微分積分しようとしたら
ラジアン以外じゃやってられない。
理系の高等教育を受けた人のほとんどはラジアン脳
d/dx sinx |x=0が1になるからだよ
1000 :
デフォルトの名無しさん :2009/06/13(土) 22:50:11
微積はラジアン関係ない。 xは値が定まって異ない。 ラジアンが意味もつは、E^( i x) = cosx + i sinxという等式のためだろう。 x=πとすると、E^( iπ ) = -1 となる。 物理学者のリチャード・ファインマンはこの公式を評して 「我々の至宝」かつ「すべての数学のなかでもっとも素晴らしい, そして驚くべき「公式」の一つだと述べている。 オイラーの公式 - Wikipedia
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。