【初心者歓迎】C/C++室 Ver.38【環境依存OK】
1 :
デフォルトの名無しさん :
2007/06/03(日) 22:33:55
乙
3ならC++は廃れる。
殺す
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д` ) < 通報しますた!! /, / \_______ (ぃ9 | / /、 / ∧_二つ / / / \ ((( ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ / /~\ \ ( ´Д`) < しますた!!! / / > ) (ぃ9 ) \_______ / ノ / / / ∧つ / / . / ./ / \ (゚д゚) シマスタ!! / ./ ( ヽ、 / /⌒> ) ゚( )− ( _) \__つ (_) \_つ / > (・∀・)シマスタ!! .マスタ!! .スタ!!
おいおい ここはいつからネタスレになったんだ
7 :
2 :2007/06/03(日) 23:08:10
>―:::::::::::::::::::::::V::<
/::::::::::::::::::::::::::::::::::::::::::::\
ゝ---‐彡'´:::::::::/::;::::::::::::::::::::::::::::::::ヽ
 ̄//:::::::/::/l:::::l::|:::ヽ::::::::ヽ::::::ハ
ー=ニ:ィ::/::l:/::/::::/:::::l:::\::ヽヽ::::l::::::::l
. /::;l:/-イ:l、:::::::::::/l::/l:∧::::}::::|::::::、\
l::/'l:::::::::::トl_ヽ:::::///zl左∨:::::l:::::::::::‐≧-
l:{ ゝ::::::::{代fjヘ:{/´ 弋チ, }::::メテ:≦≠-
`ゝ ヽ::l:::≧= }`  ̄ ノィ/´::l/
j/ヽlヘ 丶 彳!:/ 殺すなんて・・・
´ l´ ヽ、' ⌒ /ノィk1
/>‐ 彡 ´ ̄ 〉
{:.: ̄ ̄ .:.:.:.:.:└-、_
_/>:.:.:.:.:..:.:_:.:-‐:.:.:. ´.:└┐
__/.:./ ./:. :.:.:.: ̄:.:.:.-‐ .:. _ -‐'^`ア ヽ
. /l/.:. 人:. .:.:.:.:. _、-‐ / ∧
{/ .: / \___ -‐ ´ ∧
. /: ' | l / l|
/: .: l l | l|
l.: .:.:. | , ゚ ヽ| l 〈
機動戦士ガンダム00
http://www.gundam00.net/
8 :
2 :2007/06/03(日) 23:12:01
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д` ) < ころしますだ!! /, / \_______ (ぃ9 | / /、 / ∧_二つ / / / \ ((( ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ / /~\ \ ( ´Д`) < 殺します!!! / / > ) (ぃ9 ) \_______ / ノ / / / ∧つ / / . / ./ / \ (゚д゚) シマスタ!! / ./ ( ヽ、 / /⌒> ) ゚( )− ( _) \__つ (_) \_つ / > (・∀・)シマスタ!! .マスタ-ベーション!!
構造体の初期化で ={0}とmemsetによる初期化ってどう違うのでしょうか? またどちらの方がいいですか?
>>9 前者の方が普遍的。
後者は間違いの元。
積極的に使う理由がないなら前者でOK。
動作はそんなに変わらないけど ={0} : 他のメンバが初期化されてない、って警告が出る場合がある。 memset : ビットパターンが0であると保証されているわけではない型 (ポインタとか)でぐだぐだ言われる場合もないわけでもない。それと、 ゼロクリア処理であって、初期化ではないので、挟もうと思えば処理を 挟むことができてしまう。
12 :
9 :2007/06/04(月) 00:29:40
>>10-11 ありがとうございます。できるだけ前者を使う事にします。
/ .:/::i:! ,:li ::::jl::. |:::::. ::| !:| ヾ:::: |ヽ::iィ"/}ヽ\ ヾ} l ::/i:::l:| j:l|:::;ハ::. ト;::::: j |l-‐|ヤl k'//リ }゙i 〉、} } j::/::i:::l::l i::|l:;-!十!::::: / |! l }リ |lヾン j|,! ∧∨ |/|::l:::l:::| j;lfl:::| |:j }:::/ _,jzヶ=ュ!、{ レ' /ヽ〉〉 || |::i::::l:::i l::| l::| _,.z;リュj:/ ケ{! :::::: Y!〉ヽ、_,/ //、\ ‖ |::l、:|:::ト、:!ヾa´::::ヾ` ゙t._''''ゲ'゙ ! jN 〈〈 ヽ.ヽ |! !:トN:::l::l:トィf{!; :;;;;rう  ̄ j,.イ! トi、ヽ\ ) 〉 | ∧!:l:ト:ト:ljヘ ` `=‐''´ ,小:i:. l |::、 )_)`'" /〃X! /人ーヘ `_ /i.:.li:|::. l l::i / // .::::;イ' アー:ヽ、 ‘ー’ ,イ|::i :.i::ト、::| |::! /,イ// .::;ィ' j j/| : :i::|in、_ / |:l::i.:.:i:| }::! |:| / / / j .::/l | / / ,! : :i:::li:j::|:「フi ‐ - '′ |:|::i:.:.i:| j:;! !| 〃 l / | :/ !l/ ,イ{,/_:_::l:::j⊥'-'"j ・∵!|:j:::// // |l
Borland C++ 5.5.1+BCC Developerを使っています。 あるクラスのメンバ関数を別ファイルにし#includeしているのですが ・型限定子 '***' がクラス名または名前空間名ではない ・宣言が正しく終了していない というエラーが出ます。 このファイルをプロジェクトからはずすとコンパイルでき 問題なく実行できるのですが、なぜでしょうか。 また、クラス宣言内に関数を書いてもうまくいきます。
どうせ ***.cpp を #include してるんだろうが、 ***.cpp もそれ単体でコンパイルされるからだ。 つーか、何で #include してるかが気になる。
system関数でunixのコマンドを実行する際に、結果が戻ってくる前に、次の行へ実行を移したいのですが、 どのようにすればよいのでしょうか? コマンドラインでいうところの&をつけてバックグラウンドで実行するような形にしたいのです。
>>16 一般的にsystem()はシェルを経由してコマンドを呼び出すので、単に&をつければいい。
Ex.
system("sleep 86400&");
情報系学部の大学2年です。将来はプログラマ・システム関係に就きたいと思っています。 環境は自分のパソコンにCygwinを入れて使っています。 今まではアスキー出版の「C言語入門」という本で勉強してきて基本的なことは理解しています。 それでC++にはいつ頃から入ればいいでしょうか?まだ早いでしょうか? またこれから何を勉強していったらいいかいまいち先がわかりません。 簡単なゲームを製作することが目標です。 ただプログラミングは楽しんでいるのでこれからも続けていきたいです。 大学の授業ではC言語のアルゴリズムを勉強中です。
いつでも
20 :
デフォルトの名無しさん :2007/06/04(月) 13:23:33
車のナンバーと色の情報を100台分入れるArrayを作るために struct car {int number; string color; }; car cars[100]; のように宣言したのですが。 これを並び替えるための関数を作り、関数の宣言したいのですが。 void function(car cars[]) のような宣言の仕方でいいのでしょうか? 質問がわかりにくくて、申し訳ないです。
void function(struct car*)とか void function(struct car[])で良いんじゃないの。
それでいいと思うけど、高々並び替えるだけの目的なら関数を自作する必要はないと思うよ。 その構造体の比較関数をオーバーロードして、std::sort()呼ぶだけでいいんだから。
>>22 パフォーマンスを気にするようなレベルじゃないならAoSでいいんでね?
どうせ100台分だってことだし。
25 :
20 :2007/06/04(月) 13:45:11
回答ありがとうございました、助かりました。 また質問で悪いんですけども、下のように2種類のファイルを呼んだんですけども 二個目のexample2の部分でエラーがでてしまいます。 何が悪いんでしょうか? #include<fstream> int main(){ ifstream fin("sample1.txt"); /* 入力ファイルストリーム 宣言 */ fin >> x; fin >> y; /* 読み込み */ cout << x << ' ' << y << endl; /* 表示 */ fin.close(); /* 読み込み終了 */ ifstream fin("sample2.txt"); /* 入力ファイルストリーム 宣言 */ fin >> a; fin >> b; /* 読み込み */ cout << x << ' ' << y << endl; /* 表示 */ fin.close(); /* 読み込み終了 */ return 0; }
コンパイルエラー出まクリスティ
同一のスコープ内で 同じシンボル名の変数(fin な)を2回宣言してる
28 :
20 :2007/06/04(月) 13:54:52
二種類のファイルを呼ぶには、どうしたらいいのでしょうか・・・
違う名前にするかopen使うかすればいいんじゃねーの 入門書読めばわかる
クラスでnew,delete演算子をオーバーロードしたいんですが、 staticじゃないといけないんでしょうか? エラーが出て困ってます。
そうですか。
そうですね。
そうですく。 そうですれ。
>>30 staticを付けなくてもstatic扱いされる。だって実体がまだ/もう存在していないから。
これに限らず静的メンバは、ただそのクラスに関連があるからクラス宣言の中に入っているだけと思えばいい。
>>9 遅レスなんだが、みんな{0}初期化なの?
個人的にCでtypedef enumを使うんだが、こいつが一番始めにいると
型違いエラー(警告だっけ?)になるからずっとmemsetを使うようになったんだが。
わざわざ、メンバの順番意識するなんてバカらしいし・・・
浮動小数点数の0とヌルポインタのビットパターンが 単に0を並べただけと規定されているわけではないから もちろん自分の環境でそうなっているのなら、 移植性無視してやるという選択肢はある
そういう構造体にはコンストラクタを作ってしまうので無問題。
>>37 >>38 いや、C++だったらコンストラクタでポチポチ初期化するよ。
浮動小数点は使わない(使えない)環境なんで問題ないんだが、
NULLポインタはどうしようもないな。今の環境は0だから問題ないんだけど。
コンストラクタでよいのなら、 そのような構造体用の初期化関数をつくってポチポチ初期化してみては。 あるいは、初期化専用のglobal変数を確保しておいて、それを代入することで 初期化するとか。 後者はmutexを初期化するときにPTHREAD_MUTEX_INITIALIZERを使う のと同様の使い勝手になると思いますので、そういう感じの 名前をつけておけば紛らわしさも無いかと。
>あるいは、初期化専用のglobal変数を確保しておいて、それを代入することで 初期化するとか。 一時期はそういう風に初期化してた。 const XXX_STR INIT_TABLE = {0}; // global ソース内 XXX_STR strValue; strValue = INIT_TABLE で、構造体のメンバの頭にtypedef enumが来たときにVCでコンパイルエラー。 確かにそうだよな・・・って思って、全部memsetにしたんだ。 組込みなもんで、C→C++になんて早々変わらないんだ。 しばらくはこのままmemsetでやっていこうと思う。
>>41 global変数なら
= { 0 }
とかは、べつにいらないのではないでしょうか。
つうかenumは明示的に指定して初期化すべきだろ memsetて
>>42 global変数ってのは間違ってたかな?
初期化用のconstデータを作るって感じで
>>43 構造体内のメンバに変更があったときに、面倒なのと
チーム内で変数の0=異常値として扱ってるのでまぁいいかなと・・・
いや、わかってるんだけどね・・・昔からの流れは中々変えさせてもらえなくて
>>44 global変数の場合ですと、ゼロで初期化したいだけなら、規格に
準拠している処理系なら自動的にそうなるので、= { 0 } は不要です。
enumのようなものを含む型に初期値を正しく与えたい場合には、例えば
= { none, 0, ... }
とでも書けばよいではありませんか。
global変数による初期化を利用するのなら、こう書くのは一箇所だけ、
型の定義を変えても変更はそこだけで済みます。
>>45 いや、組込みなんで、処理系なんてもんがいてくれればそれでいいんだけど
RAM配置からコールドスタート処理、レジスタ設定からその他初期化処理まで
やるのは自分なわけで・・・って関係ないか。
ま、そんなわけで、自動的に初期化なんてしてはくれないわけですよ。
>enumのようなものを含む型に・・・
{0}によって、後ろの省略されたメンバを0で初期化するって話とずれてません?
全部、初期化子書くなら初期化用の関数でも同じですよね?
って、そろそろすれ違いなんでやめますか。
板汚し、失礼しました。
>46 組み込みのイニシャルルーチンは無いの? そこでRAMの初期化をするはずなんだが
>>47 領域クリアしてるよ
いくつかの領域にわけて、初期化内容に応じてどこまで初期化するか決定してる。
で、そこで初期化されると困るけどメインルーチンに戻ってきたときには
初期化しておいてほしいやつとかを、ぽちぽち初期化してる。
いや、そんな変数ばっかの環境が悪いとかは言わないで・・・
49 :
デフォルトの名無しさん :2007/06/05(火) 03:04:00
>48 なんでRAM全領域を初期化しないの?
50 :
49 :2007/06/05(火) 03:06:39
ここ初心者対象スレだったね。 組み込みの話題は別にします。
π計算はそのパソコンの性能がわかるって聞いたんだけど質問させて。 Q1,πって高校数学でも式作れるよね? それをプログラムにすればいいんじゃない?とか思ったんだけど・・ でもサイト調べたら難しい公式とか使ってるけどどうして? Q2,円周率のプログラムってなんで桁に限界あるの?一応無限までだせそうだけど パソコンつけっぱなしでどんどんでてくるんじゃないのかなっておもったんだけど どこどこの大学が何桁まで出した!とかあってあれ?って思った Q3,高校数学レベルでいいから簡単なπ求めるプログラムを教えて。 使用してるのはC言語のWINDOWS 学校で聞いてきになったんだけど、言葉足らずだったらごめん
クロスコンパイラが.bssを分けてくれない? .bssは分けてくれるけどそれをゼロクリアするスタートアップコードはついて 無いし、自分でも書いてない?(セグメント別れてるんなら書くの簡単だと思うけど) 組込みって奥が深くてわかんないや
55 :
51 :2007/06/05(火) 03:35:07
>>52 だった・・
今見てきたけど、このくらいの質問は論外なんだなって思った。
学校で聞いてもそれは今関係ない、いつかやるからって言われるし・・
まぁいつかわかるとおもうけど
>>55 「マチンの公式 多倍長演算」でぐぐってみろ。
57 :
51 :2007/06/05(火) 03:45:42
>>41 Cなら enum を 0 で初期化してもエラーにはならないはず。
C++ ならエラーになるけど、その場合はコンストラクタが使えるし、
= {} も使える。
C/C++ のどっちかが決まってるなら問題にならないはず。
CのソースをC++でもコンパイルできるようにしたいときだけ、
面倒な話になる。
>54 おそらく初期化ルーチンはライブラリ化されていると思うよ。 どこのマイコンコアだかわからんが、メーカー純正のコンパイラ? 組み込みのCの場合でもスタック以外のRAM領域はクリア(つまり0)されているのが基本
>>60 バグってるのはすぐ処理系のせいにする君の頭だ
char型の変数に%dを突っ込むな
%dはint型のポインタを要求する
まぁ初心者のうちはありがちなことだな>処理系のバグを疑う
ほんとだorz ありがとうございます なんか、こういうミスで詰まること多いんですよね
>>60 startPtr + 9 は一体どこをポイントしているとお思いか?
自分の無理解無努力無責任のつけをコンパイラに転嫁させませぬよう。
これって、char型の変数とか言ってる>61も大間違いなのに、それで勝手に納得している>63ってなんなの?
ってか、Cのソースなのに、for文の中で変数宣言しちゃうのはどうかと。
C99だと思えば、ってBCCはC99非対応だけどね
>>65 ???
chはchar型でそのポインタにintサイズ書き込んだら近くのメモリ壊すのは当たり前だと思うが
まぁ言葉足らずとかのレベルで間違いとも言い切れないな
あとどうでもいいことだが
(startPtr+9)->
って書くよりは
startPtr[9].
のほうがスマートでわかりやすい気がする
さらに言わせてもらえば
startPtrは他の変数にコピーしといて
for(int c=0;c<10;c++;startPtr++){
printf("%d個目の文字を入力してください:",c+1);
scanf("%d",&(startPtr->data));
startPtr->nextPtr=startPtr+1; // ++startPtrにして上のstartPtr++無くしてもいいんだが
}
startPtr->nextPtr=NULL;
でとっといた startPtr のコピーを戻してやればスマートじゃないかと
>>69 for(int c=0;c<10;c++;startPtr++){
これは
for(int c=0;c<10;c++,startPtr++){
の間違い
>>69 for(int c=0;c<10;c++,startPtr++){
これは
for(int c=0;c<10;c++;startPtr++){
の間違い探し
てんで話にならない。
いやー、わからんかったw 画面上でも1ドットだぜ・・・
大学2年です。現在、C言語の勉強をしています。 制御構造やポインタなど基本的なことは理解できました。 これから何をしていけばいいでしょうか?将来はプログラマ志望です。 授業ではアルゴリズムを勉強しています。 勉強しておいたほうがいい言語や順序みたいなものを提示してくださると嬉しいです。
フローチャートを勉強してるの?
分かりました、専ブラに挑戦してみます。
プログラマでも入る分野で結構違うと個人的には思う。
>>77 のアセンブラもいいと思うし、割り込みとかマルチスレッドなんかもいいんじゃね?
可読性とか汎用性とかデザインパターン、テストとかデバッグ技術もあってもいいかも?
アルゴリズムって実際に役に立つかな?
いろんなプログラムを山ほどこなしてるほうがいい気がする。
>>79 >>75 の大学がどこかは知らないが、大抵大学の授業で教えるアルゴリズムっていうと
基礎の基礎で結構重要だろw
学生時代を思い返してみると、オートマトンとかやってたような・・・ 俺、役に立ってねぇ・・・ もっと基礎的な内容かな?ソートとか? ソートなんて、バブルソートとクイックソート以外は必要なときに毎度調べてるな。
アルゴリズムでオートマトンはやらなかったなぁ ソートとか探索とかリストとかやったかなぁ・・・? 仕事でそのまま使えるってことは少ないだろうけど、基礎を覚えておいて損は無い
問題「ソートするプログラムを書け」 俺「qsort(...); はい終わり^^」
まあ、一口にプログラマといっても 「標準ライブラリに丸投げでOK」から「自力でアルゴリズムをひねり出すことを要求される」まで幅広いわけで
つ[安定ソートするプログラムを書け]
あぁ、言われて見れば重要だなぁと思ってきたw リスト、スタック、キューとかのデータ構造とかか。 素因数分解とかは、暗号化とかの分野いかなきゃ使う機会はなさそうだな
88 :
75 :2007/06/05(火) 22:50:14
有り難うございます。 授業のアルゴリズムではソートやリスト構造、木構造などをやっています。 アセンブラですか。何か必要な環境等は必要でしょうか? またC++も興味があるのですが勉強可能でしょうか?環境はCygwinです。
>>88 やる気があれば何でも可能。
>>82 のアドバイスをうけて、慣れてきたら同じ課題をCっぽい解き方、
C++っぽい解き方の両方やってみたりしても良いかも。
>>86 つ[std::stable_sort()]
紙と鉛筆で間に合うのは頭のいい人だけ 常人は適当にmasmなりインラインアセンブラ等ケースで身に着けましょう
やべぇ俺頭いいのか
アセンブラの勉強するときはシミュレータ上で動かしたいよね VirtualPC とか VmwarePlayer とか Bochs とか qemu とか いろいろあるけど、どれがいいんだろう?
95 :
75 :2007/06/05(火) 23:36:48
なるべく無料で環境は揃えたいところです; あと、どうもMicrosoft製はソフトが重いイメージがあるので微妙です。 なのでVisual Studioはどうも慣れません。 大学の先生もなるべくUNIX上でコンパイル・実行したほうがいいと言っています。
じゃあnasmとかどうでしょ?
VisualStudioの環境が重ければソースを外部で編集するようにして 構成ツールをmake代わりに使ったり、clだけ利用すればいい話 てかいくらなんでもUNIX推奨は冗談だろう…
>>98 俺はそうしてる。つっても芽衣の開発環境じゃないんだが。
普段がテキストエディタなもんで、そっちのほうがやりやすい。
VisualSutudioの環境が重ければPC買い換えればいい ・・・もしかしてだいぶMSにお布施してるかな、漏れ。
>>95 かわいこちゃん・・・
人の話聞いて知ったかするより、自分でWinとUnix系の違いを
自分で調べて知りなさい。
>>98 最近のゲーム機やパチンコ台の液晶なんかの場合はUNIX系環境が主流だな
そっち方面ならcygwinやlinuxでなれておくと楽だぞ
あのへんなら開発環境に金かからんし
Winだけのプログラム勉強したいならともかく、
広い意味でプログラムの勉強したいならVisualStudioはオススメしない
プログラムの勉強なら環境はなんだっていいだろ
いいだろ
マジかよ もうvsのインターフェースに慣れちゃったぜ…orz
>>103 MSの環境は独自の俺様仕様が多過ぎる、それに値段も高い
SDKのバージョン変わるとコンパイル通らなくなったりするし
小規模なプログラムだといいけど大規模になるとあの互換性のなさには泣けてくるぞ
開発以外の余計な事に時間取られすぎるんだよ
いまだに一部ゲームで古いDirectXとか使ってるのはそのせいだろうし
仕事の関係で多数の環境、日立のshcとかgcc、ボーランドCとかLSI-C、CodeWarrior その他いろいろ
使ってきたけどあそこまでかけ離れてるのはMS環境だけだ
それでもMSを勧める人がいるのはやっぱ「MSだから」だと思うよ? SDKとかMFCをC++の勉強に使うなんて、とても勧められないし コンパイラのバグもちょくちょくあったりする。 設定に困ったときにネットで探せば色々見つかるってのは大きいと思う。 コンパイラのバグなんて、MS環境でもなきゃ中々しにくくね? まぁ、bccやgccならそれなりにサイトも多いけどやっぱMSに比べると・・・ やっぱ、作ったもんが動くからプログラミングって楽しいんじゃね? とはいえ値段や仕様変更の多さには同感だw
値段は(学割だけだけど)凄まじいダンピング始めたからなぁ Visual C++ は単品で持ってたけど、VSのあの安さなら買っちゃうって
109 :
デフォルトの名無しさん :2007/06/06(水) 04:25:45
VC++.net2003でmain.cpp, Sphere.hとSphere.cppとファイルを分割しました Sphere.hにint Collide( Sphere, Sphere )という関数を定義して, Sphere.cppで実装しました このint Collide( Sphere, Sphere )をinline関数にしたいのですが、上手く行きません .h, .cppのどちらにもinlineを書く, どちらか一方に書く場合と試しましたが上手く行きません どちらにもつけない場合は上手く行きます どうすればinline関数にできるでしょうか?無理なのでしょうか? よろしくお願いします
inline関数は内部リンケージを持つからヘッダファイルには書くな。
111 :
109 :2007/06/06(水) 04:36:03
内部リンケージで調べたら分かりました ありがとうございました
内部リンケージって言葉を聞いたばっかりで 理解せずに使ってるだけな馬鹿は無視しろ
>>110 inline 関数はヘッダに書くもんだろw
正しくはinline関数の「宣言だけ」ならヘッダには書くな、書くなら「定義」まで 書け、って事だな
具体例としてはジャネリックな独自テンプレートライブラリを作る時とかか なんか極めて限られるような状況ですな
>>110 inline 指定とリンケージは関係ないよ。
>>116 でもヘッダファイルに宣言だけしたらリンカエラーでるじゃん?
なんという面倒くさい仕様… これは暗に「よほどのことが無い限り使うな」と言っているので同じではないか
>>117 定義が無いからだろ。リンケージも inline も関係ない。
>>118 その認識で問題ない。 inline で速度が変わる状況なんてかなり減ってきてるし、
これからも減るだろうし。
もうinline化なんかコンパイラに任せろよ 適当にやってくれるだろ
>>118 ついでに言えば、最早コンパイラはオブジェクト間最適化を行なう時代。
inline指定なんぞせんでもコンパイラの方で勝手に(別ファイルの関数さえ)インライン展開してくれるよ。
>>119 静的リンケージだから定義がないんじゃないのか?
内部、だ。
>>119 それはおかしい。extern宣言しても他のファイルで定義してある
inline関数は使えんぞ。
>>125 なるほど。 inline は関係あるな。
7.1.2p4 より
"An inline function shall be defined in every translation unit in which it is used and
shall have exactly the same definition in every case."
inline 関数は使われるソースごとに定義が必要になるってことらしい。
エラーになるのはこのルールに違反するからであって、リンケージは
関係ない。
>>126 お前最初にinline関係ないって言ったじゃん。いい加減な事を言うな。
ごめんよ。 >119 を書いた時点では分割コンパイルを意識してなかったんだ。
( ゚д゚)ポカーン
分割コンパイルを使わないとC++の意味が・・・・・
131 :
デフォルトの名無しさん :2007/06/06(水) 19:15:39
getchar(c); c - '0' /*cの中が文字か数字かをしらべる*/ c - '0' の意味がわかりません これは何をやってるんですか?
c - '0' は普通数字を 0 〜 9 の数値に変換するときに使うけど
ざっと C++ のドラフトを見ても、 仮想関数テーブルに関する記述がないんですが、 仮想関数テーブルは C++ の仕様上には 全く存在しない概念なんでしょうか?
ABIとか、Implementation Specificな話は規格には載らないんじゃないの
>>131 '0'ってのは数値的には0x30、そこから順に0x39('9')まで並んでる
だから文字として入力したものを数値に変換するときはそういうこともするけど・・・
キャラクターコードの意味わかってないなら
isdigitとか使っとけ
変換するなら
atoiとかstrtol使えばいい
それコメントが間違ってるよw
関数使わずに調べるなら
if((c >= '0') && (c <= '9'))
でいいだろうし、
変換したいならその後に c-'0' したほうがいいと思う
c-'0' じゃ数字かどうか調べてないしな・・・
直接プログラミングではない質問なのですが、 ネットワーク外部にインストールしたRuby等の.exeを、ファイル共有した状態で 例えば \\マシン名\\Ruby\bin\ruby.exe にあるruby.exeを実行したくて Path環境変数に"\\マシン名\\Ruby\bin"を追加したのですが、うまくいきません。 そもそも無理なのか、または指定のやり方が間違っているのでしょうか?
歯医者に風邪治してくれと言ってるようなもの スレ違い
下手な例えだな
>>134 つまり、仮想関数テーブルは Implementation Specific な話ということなんですね。
了解しました。
140 :
1/2 :2007/06/06(水) 20:51:48
#include <stdio.h> int main(void) { int a, b, n; puts("整数を2つ入力してください"); scanf("%d %d", &a, &b); puts("演算子を入力してください"); n = getchar(); switch(n) { case '+': printf("%d\n", a+b); break; case '-': printf("%d\n", a-b); break; case '*': printf("%d\n", a*b); break; case '/': printf("%d\n", a/b); break; case '%': printf("%d\n", a%b); break; } return 0; }
141 :
2/2 :2007/06/06(水) 20:52:58
#include <stdio.h> int main(void) { int a, b, n; puts("整数を2つ入力してください"); scanf("%d %d", &a, &b); puts("演算子を入力してください"); n = getchar(); switch(n) { case '+': printf("%d\n", a+b); break; case '-': printf("%d\n", a-b); break; case '*': printf("%d\n", a*b); break; case '/': printf("%d\n", a/b); break; case '%': printf("%d\n", a%b); break; } return 0; }
142 :
2/2 :2007/06/06(水) 20:53:38
上記のプログラムを作ったのですがコンパイルして実行すると 「演算子を入力してください」 でプログラムが終了してしまいます。 何故でしょうか? 環境はcygwinです。
>>142 getchar() で改行文字を読み込んでいるから
144 :
142 :2007/06/06(水) 21:09:30
>>143 "改行文字を読み込んでいる"、とはどういうことでしょうか?
scanf で数値の後にいれた改行が stdin のバッファに残っている getchar でバッファに残った改行文字が取り出される とりあえず scanf("%d %d", &a, &b); ↓ scanf("%d %d%*[\n]", &a, &b); または scanf("%d %d", &a, &b); ↓ scanf("%d %d", &a, &b); while(getchar()!='\n'); としてみては?
146 :
142 :2007/06/06(水) 21:29:59
>>145 無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。
Google Booksすげーな。言語の本無料でみれんじゃん
>>147 それって、前にTVでやっていた著作権切れの本を公開する奴?
149 :
デフォルトの名無しさん :2007/06/07(木) 06:26:40
NULLが0でない環境が存在するのと同様に、 0がぬるぽじゃない環境ってのもあるんでしょうか?
150 :
デフォルトの名無しさん :2007/06/07(木) 06:28:41
0がぬるぽでない環境が存在するのと同様に、 NULLが0じゃない環境ってのもあるんでしょうか?
151 :
デフォルトの名無しさん :2007/06/07(木) 06:49:24
トートロってんじゃねぇよって事ですか よく考えると自分も質問の意図を把握できてないのに気づいたので取り下げます
>>149 0 こそが真のヌルポインタだよ。
ただ、これだけだと整数型とか小数型の値としてもとれるから、
NULL ってマクロを使ってそれを回避できるようにもしてるだけ。
自分の読解力の無さを人の文章力のせいにするな
確かに隙が多かったな。 >ただ、これだけだと整数型とか小数型の値としてもとれるから、 これは、 #ただ、これだけだと「プログラムを読む人間」 が、この 0 が #数値の 0 か、ヌルポインタの 0 かを、そこからだけでは読み取れないので、 という風な意味。
自分の文章力の無さを人の読解力のせいにするな
コピペうざす
自分のうざさを人のうざさのせいにするな
彼は分裂症で、彼の否定する自分自身とは彼自身では違う人格なのだから良いんだよ。
何もかもみんなお前のせいだ
for(;;) { struct st* a; get(&a); /* callocで構造体配列作成しaに割り当て */ free(a); } これをコンパイルすると、syntax error: missing';' before 'type' とでます。アドバイスを頂けないでしょうか。お願いします。
申し訳ありません。161の件は宣言の前にif-break;を入れていたのが原因 のようです。しかし、freeのときにエラーが出るのがわからなく その件について助言お願い致します。
>>162 その原因の行も書いてよ。
自分がコンパイラになったつもりでたどればわかる
164 :
デフォルトの名無しさん :2007/06/07(木) 14:47:38
aをNULLで初期化したらエラー消えるはず
165 :
デフォルトの名無しさん :2007/06/07(木) 14:49:08
は関係ありませんねすいません
161です。レスありがとうございました。自己解決しました。 if(FALSE)break; struct st* a; get(&a); free(a); だとコンパイルできなくて struct st* a; if(FALSE)break; get(&a); free(a); だと実行時エラー。 struct st* a = NULL; if(FALSE)break; get(&a); free(a); で解決しました。C言語に慣れておらずいまいち理解できないので すごく変な勘違いしてそうですね…。
変数の宣言がブロックの先頭じゃなかった、という落ちか・・・ 実行時エラーは何か勘違いしてる
おそらく、get() の先のcallocで取ったポインタを * つけないで代入してるんだろうな
実行時エラーというか実行時警告というか あれは未初期化ポインタに対するアクセスのエラーだから リリースビルドにすれば実行時に落ちることは無い しかしその前にコンパイラの方で未初期化に対するどうたらこうたらっていう 警告が出るはずなんだが…
>>169 get で &つけて呼び出してるから、警告は出ないんじゃないかな。
その関数で代入失敗してるっぽい。
そうかごめん 試しにそうしたら確かに通っちゃったよ…
コンパイルの段階で出てくるのが コンパイルエラー (リンクの段階で出てくるのが リンクエラー) 出来上がった実行ファイルを実行して出てくるのが 実行時エラー m(c)alloc で得られたポインタではない非NULL 値を realloc しようとしたんじゃねーかな?
って calloc と書いてあったな… get(struct st**) の実装晒したほうが早いぞ
getの実装は既存のライブラリです。でも一応、callocの部分を 確認したところキャストはされていませんでした。 ブロックの先頭・値初期化の不備は、お恥ずかしいミスです。 ところで、C++てエラーメッセージがわかりにくくないですか? 関数や引数のクイックインフォも出なくて、難しすぎて泣けてきます。
いや、これそのままなら初期化いらないはずなんだって。 getの仕様によるけどな。
あ、
>>168 はキャストのことじゃなくて、参照を考慮にいれてないって
ことでしょうか?でも多分、get()には問題はないはずです。
たった4行のコードでここまで悩める俺みたいなバカは
プログラマに向いてないんでしょうねorz
>>176 だったら get(arg) の仕様は?
第一引数 arg の内容を書き換えるだけ ならば、
NULL 初期化しなくても、実行時エラーは出ないつくりになる(はず)。
第一引数 arg の内容を確認してから書き換える ならば、
NULL 初期化が必須になるだろう。
この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)
コマンドプロンプトで色々なコマンドが用意されていると思うのですが、 それをC言語で使用するにはどうすればいいのでしょうか? 具体的に言いますと、とりあえずexeファイルにa.txtをD&Dしたらそのディレクトリに copy_a.txtというファイルを作成したりしたいです。コマンドプロンプトでいうとcp a.txt copy_a.txtですね。 まぁやりたいのはcpコマンドではなくて、javacコマンドとjavaコマンドなのですが・・・。
system関数
180 :
178 :2007/06/07(木) 18:51:42
まぁ、要はJAVAのコンパイルが面倒なのでドラッグするだけで出来るソフトをCで作りたいって話なんです。
181 :
178 :2007/06/07(木) 18:54:29
>>179 ありがとうございます。
ちょっとやってみます。
strcmp(buf, '\0'); でエラーが出るのですが、何か書式を間違ってるでしょうか? 文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。 最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん
>>183 とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。
>>184 そういう課題なんです・・・
C++でクラスを書くとき、Javaの書き方に合わせようと思って、 #define Public public: #define Private private: #define Protected protected: って定義して、んでヘッダファイルを Public int getNum(); Public void setNum(int num); みたいに書いてみたんだけど、これと似たようなことをやる人は多い? それとも明らかにC++の常識からは外れた書き方?
他言語を真似るマクロは愚の骨頂だと俺は思う なにより読みにくいし、なら java でかけよと言いたい
つか Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ
>>186 PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?
Bourne shellの作者のSteve BourneがALGOL風のトンチキなマクロを定義して シェルを書いたのは(勿論悪い意味で)有名
マクロなんだから予約語も糞もないだろ
#define for if(0); else for とかできるんだぜ。
>>186 やるな。
理由は色々あるが、一番実害があるのはこんなところか。
#define public public:
としたとして、
class A {
public void foo();
void bar();
};
の bar のアクセス指定がどうなるか考えてみよう。
これは public だ。
だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。
>>194 for (int i=0; ...) {
// スコープ1
}
// スコープ2
でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな
ふるっ
特殊っていうか、昔はそれで仕様通りだったと思う。
そういえばVisual C++で.NETアプリケーションのウィザードを使うと、 public: void Hoge()なんてコードを出していた気がする
>>199 それが仕様だったかも知れないが、規格にはなっていない罠。
ふるーい規格の話だけど、 それでもなってないの?
ARMやドラフトを規格だと言うのなら 規格になっていたと言うがいい
なるほど。ドラフト段階でしかこの仕様はなかったわけか。
205 :
178 :2007/06/07(木) 23:43:26
>>178 です。とりあえずサンプルってことで
system("cd c:\\java");
system("java HelloWorld");
で実行したみたのですが、
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
と出てしまいます。普通にコマンドプロンプトでcd c:\javaとjava HelloWorldを打ち込んだときは
正常に動作するのですが、何かsystemでやるときに特別に何かしなければいけない事があるのでしょうか?
206 :
178 :2007/06/07(木) 23:49:32
というよりも、system("cd c:\\java");のあとに system("dir")を実行したら、javaディレクトリが表示されずに、 プロジェクトのディレクトリが表示されるのですが・・・
system("java c:\\java\\HelloWorld");じゃ駄目なの?
それぞれのsystem呼出は、細切れになるから 1度のsystem呼出で済ませるようにしろ 絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか
209 :
178 :2007/06/07(木) 23:56:35
一回ごとに細切れなんですか・・・。結構面倒ですねw とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld と出てしまいます。う〜ん・・・
210 :
178 :2007/06/08(金) 00:06:01
system("javac c:\\java\\HelloWorld.java"); は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;
カレントに存在する必要があるのかな? それとも区切り文字か。 ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?
C++の参照は、中身はポインタと同じで、参照先のアドレスがメモリに記憶されてるんですか? (関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
>(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?) 質問の意図が読めんが… 関数の引数で 値渡しした場合には 値が持つ大きさ だけスタックに詰まれる 参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる
>>214 通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。
217 :
178 :2007/06/08(金) 12:13:26
>>212 おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?
218 :
178 :2007/06/08(金) 12:19:35
>>211 system("cd c:\\java; java HelloWorld");
だと、指定されたパスが見つかりませんと出ます。
system("java c:/java/HelloWordl");
だと、Exception in thread "main" java.lang.NoClassDefFoundError: c:/java/HelloWorld
う〜ん・・・
219 :
178 :2007/06/08(金) 12:23:46
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class"); などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;
javaの仕様がわかってないな。 まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい
221 :
178 :2007/06/08(金) 12:44:54
>>220 ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。
まさかとは思うが、Dドライブで作業してたりして。
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA"); SetCurrentDirectory(L"c:\\JAVA"); じゃ…
224 :
178 :2007/06/08(金) 12:53:25
解決する事が出来ました。 とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。 その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA"); に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。 それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。 原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。 ありがとうございました。
SetCurrentDirectory(_T("c:\\JAVA")) なら、unicodeでも設定無しでも動くよ エラーが出るからってとりあえずキャストすんのはやめとけ
あともう一つ。 system("java c:/java/HelloWordl"); これだけど、 system("java -classpath c:/java HelloWordl"); これなら動くんじゃないか? HelloWordl の綴りが気になるが
227 :
178 :2007/06/08(金) 13:54:53
>>225 丁寧にありがとうございます。キャストはあまりしないほうがいいみたいですね。
現在はchar型の変数にパスを入れて、SetCurrentDirectory(dirPass);のようにしているのですが、
やはりそれだと動作が微妙です。引数はcharじゃなくてLPCTSTR(?)じゃないといけないのかな
とか思いつつ奮闘しています。
>>226 一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが
>>211 で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。
>>227 classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?
230 :
178 :2007/06/08(金) 14:04:28
>>228 あ、大丈夫です。ちゃんと半角スペース入れています。
あと、どうやら
>>227 のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。
>>230 ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな
>system("dir");を実行しただけでエラーが・・・。
ふーん
232 :
178 :2007/06/08(金) 14:18:29
>>231 ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。
わかった。もうキミには言うことは無い うちでは動いてるけど、君のトコでは動かないんだね
>>230 どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)
235 :
178 :2007/06/08(金) 15:16:42
>>233 そういう次元でもないような・・・。
>>234 dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw
なんかさ、やろうとしてることがショートカット作る程度でできそうな事な感じなんだが 複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか? 無理矢理Cで作ろうとするほうが疑問なんだが・・・
238 :
178 :2007/06/08(金) 15:30:47
>>236 ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ
>>237 やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。
strncpy()は鬼門。積極的に使う理由がないなら、sprintf()を使え。
240 :
デフォルトの名無しさん :2007/06/08(金) 17:32:11
したのようなプログラムで、今調べている位置を出力するにはどうしたら良いですか? printf("%d\n", Fd)としたら値が変化しません・・・ struct ffblk Fd; findfirst("*", &Fd, 55); do { printf("%s\n", Fd.ff_name); } while(!findnext(&Fd));
242 :
デフォルトの名無しさん :2007/06/08(金) 17:48:57
>>241 再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです
243 :
デフォルトの名無しさん :2007/06/08(金) 17:50:47
A_dir B_dir C_dir というディレクトリがあったとき、B_dirを調べ終わったとき 次にC_dirを検索するにはどのデータを保存しておけば良いんですか??
245 :
デフォルトの名無しさん :2007/06/08(金) 18:05:38
何故?
Fdを保存しておけばいい
249 :
デフォルトの名無しさん :2007/06/08(金) 18:13:57
>>246 再帰は不安定になるんですよ
>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした
struct ffblk[MAX_DIR_DEPTH];
再帰が不安定とは……
普通にスタックに積めばいいじゃん。
>>249 再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても
>>250 みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。
何が「再帰は不安定になるんですよ」だよ馬鹿もんが
255 :
249 :2007/06/08(金) 18:29:22
速度を上げる為に複数スレッドで読み込みたいんですよ 再帰だと出来ないんです・・・・
256 :
デフォルトの名無しさん :2007/06/08(金) 18:31:38
ドライブ資源は1個なのに、複数スレッドでアクセスしたら、 かえって遅くなるような気がしないでもない
258 :
デフォルトの名無しさん :2007/06/08(金) 18:35:07
>>250 進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも
(一般的には)無駄なシークが発生して、遅くなります。
260 :
デフォルトの名無しさん :2007/06/08(金) 18:36:15
>>257 実際にデータを読み込む訳ではないんですよ
FindFirstFile()が返してきたハンドルをスタックとして もっとけばいいだけじゃないの? そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと 続きから返ってこないか?
262 :
257 :2007/06/08(金) 18:39:04
>>260 俺は
>>259 のことを想定して書いた。 余計なシーク発生するから遅くなるんじゃね? ってこと
>>256 そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。
264 :
249 :2007/06/08(金) 18:46:10
265 :
デフォルトの名無しさん :2007/06/08(金) 18:49:33
C言語なんですが 自作関数で実引数で文字列を返す事は可能ですか?
266 :
257 :2007/06/08(金) 18:49:52
>>264 どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい
スレッド1個でも動くものができないのに
しかし、どうでもいいけどD-Usageとかいうソフト、速いのかも知れないけど使い難いなぁ。 作者本人は悦に入っているようだから別にいいけど。 つーか、VCDCASEは目的が違うじゃん。違う目的のソフトを比較して速度云々って>249はどこまで阿呆を晒せば気が済むんだ?
>>249 A_dir
- file1
- file2
B_dir
- file3
とあった場合に欲しい結果は以下のどっち?
1) A_dir B_dir
2) A_dir file1 file2 B_dir file3
1)ならFdを保存すればOK。
272 :
デフォルトの名無しさん :2007/06/09(土) 01:52:08
windows環境でTCHARに対応した標準出力へのiostreamを使いわけるようにしたいわけですが #ifdef UNICODE #define tcout wcout #define tcin wcin #define tcerr wcerr #define tclog wclog #endif #ifdef _MBCS #define tcout cout #define tcin wcin #define tcerr wcerr #define tclog wclog #endif のようにtc*を定義するのは良くないんでしょうか? もしそうであるならば、大体案としてはどのようなものがありますか?
273 :
デフォルトの名無しさん :2007/06/09(土) 01:55:20
大体案は代替案のtypoですorz
#ifdef _UNICODE iostream& tcin = cin; (ry
>>272 とりあえず、_MBCS ブロック内のヤツは cin, cerr, clog にしたほうがいいと思うよ。
>>272 おそらく、個人・環境等で意見は様々だと思う。
個人的には、4つや5つなら許せるが、こんなことしなくても問題ないようなモノにしたい。
で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。
>>274 cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。
>>272 実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。
回答ありがとうございました。 皆様の意見を参考にこのようにしました。 #ifdef UNICODE #ifdef _MBCS #error define either only UNICODE or _MBCS. #else std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::wcout; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::wcerr; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::wclog; #endif #else #ifdef _MBCS std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::cin; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::cout; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::cerr; std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::clog; #else #error define either only UNICODE or _MBCS. #endif #endif 軽く使っただけなんで不具合は分かりませんが、 iostreamやiosfwdでの定義から考えればこれでいけそうに思えます。 _INC_TCHARの定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが
fopen("test.txt", "w"); でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、 C:\C:\Documents and Settings\ユーザ名 のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、 どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、
>>280 >普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。
282 :
534 :2007/06/09(土) 03:49:25
>>280 これ使ってください><
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i = 0;
size_t len;
len = strlen(argv[0]);
while (i < len) {
printf("argv[0][%d]:%c\n", len-i, argv[0][len-i]);
if (argv[0][len-i] == '\\')
break;
++i;
}
if (dest_sz < len-i +2)
return -1;
strncpy(dest, argv[0], len-i+1);
dest[len-i+1] = '\0';
return 0;
}
argvはmain(int argc, char* argv[])のargvで
destは出力先の文字列の先頭ポインタ
dest_szはsizeof(dest)です><
ちなみにこれC++のSTL使うと4行程でできちゃいます><
283 :
534 :2007/06/09(土) 04:20:39
改良しました>< // コマンドライン引数配列から実行されたディレクトリを取得する int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) { size_t i; size_t len; i = len = strlen(argv[0]); while (i > 0) { if (argv[0][i-1] == '\\') break; --i; } if (dest_sz < i +2 || i == 0) return -1; strncpy_s(dest, dest_sz, argv[0], i); dest[i] = '\0'; return (int)i; }
285 :
534 :2007/06/09(土) 04:48:38
まだ直すところありました(^^ // コマンドライン引数配列から実行されたディレクトリを取得する size_t getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) { size_t i; size_t len; i = len = strlen(argv[0]); while (i > 0) { if (argv[0][i-1] == '\\') break; --i; } if (dest_sz < i +1 || i == 0) return -1; strncpy_s(dest, dest_sz, argv[0], i); dest[i] = '\0'; return i; }
コマンドライン引き数から実行モジュールの場所が得られると思ったら大間違い。
287 :
534 :2007/06/09(土) 06:31:11
詳しく^^
288 :
534 :2007/06/09(土) 06:49:51
自己解決しました^^ フルパスじゃないと取得できないので windowsだとGetModuleFileName()を使うのですね^^ この辺は環境依存になるので注意が必要ですね^^ 勉強になりました^^^^;;
system()関数って凄く謎なのですが・・・。 printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。 これは俺が、system()で使う領域を侵してると考えていいのでしょうか?
1.Unix系はarg[0]にパスが入らないんじゃなかったかな。 2.バッファオーバーランしかけたらエラー処理してくれ 3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」 4.const char* argv[]じゃなくてchar const *const argv[]な
291 :
534 :2007/06/09(土) 08:06:37
これでどうでしょう? もうWindows特化ですが(というかUNIXの実行環境が無い(´・ω・`) ) // コマンドライン引数配列から実行されたディレクトリを取得する size_t getExecutedDirectory(TCHAR* dest, size_t dest_sz) { _locale_t loc; size_t len; // 実行ファイルのフルパスを取得 TCHAR fullpath[4096]; GetModuleFileName(NULL, fullpath, sizeof(fullpath)); // ロケール設定 loc =_create_locale(LC_CTYPE, "japanese"); // 最後の\を見つけて、コピー範囲[fullpath,len)が適用できるようなlenを生成 TCHAR* last_slash = _tcsrchr(fullpath, '\\'); len = last_slash - fullpath +1; // 出力先の容量が不足ならエラーで-1を返す if (len-1 == 0 || dest_sz < len) { if (dest_sz > 0) dest[0] = '\0'; return -1; } // コピーして終端に0 _tcsncpy_l(dest, fullpath, len, loc); dest[len] = '\0'; return len-1; }
>>289 その周辺を晒してくれないとなんとも言えないのだが。
>>279 std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。
1.sizeof(fullpath) → sizeof fullpath / sizeof *fullpath 2._tcsrchr(fullpath, '\\')→ _T('\\') 3._tcsrchr(fullpath, '\\') _UNICDEかMBCSが定義されてないとShift-JISは問題起こす(たぶん) 4.dest[0] = '\0'→_T('\0') 5.return -1→return static_cast<size_t>(-1)とか ↓ これで我慢しろ。(UNCパスだと問題あるかも) std::basic_string<TCHAR> getExePath() { TCHAR exe_path[MAX_PATH]; DWORD r = ::GetModuleFileName(NULL, exe_path, sizeof exe_path / sizeof *exe_path); if( r == 0 || r == sizeof exe_path / sizeof *exe_path ) throw std::runtime_error("うぎゃあ"); TCHAR drive[_MAX_DRIVE], path[_MAX_PATH]; _tsplitpath(exe_path, drive, path, NULL, NULL); return std::basic_string<TCHAR>(drive) + path; }
>>294 sizeof(fullpath)じゃなんであかんのんですか?
>>294 だけど、
GetModuleFileNameの第3引数はバイト単位のサイズでなく配列要素数を
指定する。Unicodeビルドの時はsizeof(TCHAR)が2なので、TCHAR buf[10]は
sizeof buf = 20
sizeof buf / sizeof *buf = 10
違ってたらごめん
ヘッダーファイルで class temp{ public: int *func(); }; と書いた場合、funcの定義はどう書き始めればいいですか int temp::*func() int temp::(*func()) int *temp::func()
一番下じゃないとVSのインテリセンスが効かなかったので一番下
>>299 コンパイルできるのは一つだけしかないだろ?
>>279 テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う
304 :
デフォルトの名無しさん :2007/06/10(日) 00:26:59
ちょっと相談。 CSV形式のテキストファイルを採用することになったんだけど、 エスケープの方法など、細かい仕様について悩んでる。 この辺の定番仕様ってどんな感じかな。 専用の入力ツールを用意しない場合、やっぱりExcelあたりに合わせるのがベターだろうか。 で、その定番仕様に対応したCまたはC++のライブラリがあればお願いします。
csvってRFCできてなかったっけ
306 :
304 :2007/06/10(日) 00:59:15
RFCあるのか……ありがとう、ちょっと探してみる
307 :
デフォルトの名無しさん :2007/06/10(日) 02:42:21
C++で自分で作ったクラスのVectorを使ってVector aを宣言して -aを使いたいのですがどのようにすればよいでしょうか よろしくおねがいします
ええとよくわからんけど -演算子をオーバーロード?
単項演算子を使いたいってこと? 2次元ベクトルの例だと、Vectorのメンバに Vector operator - () const {return Vector(-x, -y);} みたいな感じか?
311 :
307 :2007/06/10(日) 02:54:52
解決しましたありがとうございました
linuxで標準ライブラリをインストールしたいのですが glibc-2.5.0-0exp1 glibc-2.5.0-0exp2 の違いってなんですか?
1と2
>>312 そのパッケージは Ubuntu にしか無いっぽいな、
俺はFedora使いだからよくわからん
Ubuntu系のスレにでも行ったほうがよさげだ
ファイル情報の取得の仕方教えて。
stat
file
Windows環境で,任意のファイルが変更された時に, 変更の種類(作成,更新,削除等)と,変更を与えたプロセスを 出力するプログラムを作成しようと思っています. 変更の検知とその種類に関しては,Win32APIのReadDirectoryChangesWで 取得できるのですが,変更を与えたプロセスの取得方法が Win32APIや.NETを探しても分かりません. 何か方法があれば教えていただけませんか?
319 :
318 :2007/06/10(日) 14:11:45
すみません, Windows環境 → WindowsXP環境 です
320 :
デフォルトの名無しさん :2007/06/10(日) 14:56:21
VB.NETとC#.NETで、大きく異なる点とは、どういうとこでしょう? 考えたかとか、コーディングの仕方で教えてください。
元が VB か C/C++ か、の差
#include <iostream> struct A { A(){ std::cout << "A" << std::endl; } ~A() { std::cout << "~A" << std::endl; } template<class T> static void func() { std::cout << "func" << std::endl; } }; int main() { A().func<int>(); return 0; } 以上のプログラムを実行すると vc, gccでは A func ~A と出力され、bccでは func ~A と表示されました。 コンストラクタが呼ばれないのはbccのバグでしょうか? ちなみにメンバ関数にtemplateを使わなかったりstaticでなければ問題なくコンストラクタは呼ばれるようです。
>>322 バグだね。 bcc なんて使わなけりゃいい。
324 :
320 :2007/06/10(日) 15:24:40
メモリーの考え方とか、大きく違ったりしませんか? 定数、変数のきり方とか・・・・ インスタンスの方法とか、考え方とか・・・ 単に、方言が違うだけ?
325 :
322 :2007/06/10(日) 15:38:39
>>323 レスどうもです。
やはりバグですか。
bccはコンパイル速度しか売りがないのかなと感じる今日この頃。
>>324 .NETスレは他にあるだろ。なんでここで聞くんだ?
どのくらい違うかの位置関係はこんな感じで、
VB6−−−−−−VB.NET−C#
メモリーの考え方とかインスタンスの考え方はVB6から大きく変更になってる。
327 :
320 :2007/06/10(日) 15:55:44
ごめん。 C#スレと勘違いしてた。
あれだけ#の種類を変えて頑張っているのにw
構造体/クラスを関数に渡すときは、ポインタか参照が使われることが一般的のようですが、 戻り値が構造体/クラスなのは普通ですか?
>>329 コピーが重い場合には避けられるけど、単純にポインタや参照にして
置き換えられないこともあるので、引数に比べれば使われる機会は多いでしょう。
ttp://www.cs.bme.hu/~bodon/en/apriori/ ↑のサイトのプログラムを落として
makeしてみたらエラーがでて、makeできませんでした。
どのようにしたらmakeできますか?
実行はCygwin上で行ってます。
エラー内容は
$ make
g++ Input_Output_Manager.o Apriori.o Trie.o Apriori_Trie.o main.o -o ../apriori
Input_Output_Manager.o: In function `_ZN20Input_Output_ManagerC2ERSt14basic_ifstreamIcSt11char_traitsIcEEPKc':
Input_Output_Manager.cpp:(.text+0x2f): undefined reference to `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'
Input_Output_Manager.cpp:(.text+0x4a): undefined reference to `_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev'
・
・
・
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x0): undefin
ed reference to `_ZTVN10__cxxabiv120__si_class_type_infoE'
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x8): undefin
ed reference to `_ZTISt14basic_ofstreamIcSt11char_traitsIcEE'
collect2: ld returned 1 exit status
make: *** [../apriori] Error 1
>>331 うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ
>>329 小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。
演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。
暇過ぎw
マルチーズ乙
340 :
デフォルトの名無しさん :2007/06/11(月) 11:47:18
g++で、Aというクラスを継承したBというクラスを作成し、 void func(B obj_arg) という関数を定義してBを渡すと、 Bのコピーコンストラクタは呼ばれるのですが、Aは通常のコンストラクタが 呼ばれます。(コピーコンストラクタではない、と言う意味です) これは、なぜこのようになっているのでしょうか? いまC++を勉強中ですが、この部分が納得できずにいます。 すみませんがどなたか理由を教えてもらえませんでしょうか?
class A { A(){} A(int n){} }; class B:A { B(){} B(int n){} }; B b(1); って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる? とESPしてみる
343 :
デフォルトの名無しさん :2007/06/11(月) 12:46:26
>>341 #include <iostream>
using namespace std;
class aaa {
public:
aaa() {printf("%p: [%s]: %s called\n",this,"aaa","constructor");}
aaa(const aaa &a) {printf("%p: [%s]: %s called\n",this,"aaa","copy constructor");}
~aaa() {printf("%p: [%s]: %s called\n", this, "aaa", "destructor");}
};
class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};
void func2(bbb x){return;}
int main()
{
bbb x;
func2(x);
return 0;
}
344 :
デフォルトの名無しさん :2007/06/11(月) 12:47:18
>>343 改行が多すぎるといわれたので、わけました。
実行結果は以下のようになりました。
~/> g++ samp.cpp
~/> ./a.out
0xbfc07bee: [aaa]: constructor called
0xbfc07bee: [bbb]: constructor called
0xbfc07bef: [aaa]: constructor called
0xbfc07bef: [bbb]: copy constructor called
0xbfc07bef: [bbb]: destructor called
0xbfc07bef: [aaa]: destructor called
0xbfc07bee: [bbb]: destructor called
0xbfc07bee: [aaa]: destructor called
>>344 class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
- bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
+ bbb(const bbb &b): aaa (b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};
346 :
デフォルトの名無しさん :2007/06/11(月) 12:57:06
>>345 すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。
どうやら勉強不足のようです。
失礼しました。
ありがとうございました。
エスパー342
348 :
デフォルトの名無しさん :2007/06/11(月) 13:16:15
>>342 >>347 なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。
>>348 コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。
350 :
デフォルトの名無しさん :2007/06/11(月) 13:25:20
>>349 でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)
351 :
342 :2007/06/11(月) 13:48:27
コンストラクタの呼び出し方は独学でやってると大抵詰まる。
>>342 にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。
string::find と string::find_first_of 、 string::rfind と string::find_last_of って、 どう違うの? 同じ?
rの有無、firstかlastかの違い begin側から探し始めるかeng側から探し始めるかの違い
ごめん。左右の比較の話。 解説を穴が空くほど読んだら 全然違う関数と分かった。
ostringstream って、flush も endl もしないで str 呼んだら 不完全なまま出力されることってあるの? 大丈夫だって保証があればいいんだけど。
356 :
デフォルトの名無しさん :2007/06/12(火) 18:12:14
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに 何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?
__DATE__ と __TIME__
358 :
デフォルトの名無しさん :2007/06/12(火) 18:23:26
>357 感謝するわよ。
359 :
デフォルトの名無しさん :2007/06/12(火) 18:34:03
もう一つ教えてちょうだい。 Jun 12 2007 って出るのを、 2007年6月12日にするにはどうしたらいいかしら?
360 :
デフォルトの名無しさん :2007/06/12(火) 20:18:53
入力した自然数を4で割り、4つの変数に収めた後、 余りをランダムに割り振るプログラムを書いて見ました #include<ctime> #include<cstdlib> #include<iostream> using namespace std; int main() { int a;//適当な大きさの変数を読み取らせるための変数 int c1; int c2; int c3; int c4;//aを4で割り、余りをこの4つの数値にランダムに格納する int b; c1=c2=c3=c4=0; scanf("%d",&a); b=a % 4; printf("%d,%d\n",a/4,b); printf("%d,%d,%d,%d\n",c1,c2,c3,c4); while(b>0) { srand(time(NULL)); int dice=rand() % 4;
361 :
360 :2007/06/12(火) 20:20:06
続きです switch(dice) { case 0: { c1++; c2+=0; c3+=0; c4+=0; } case 1: { c1+=0; c2++; c3+=0; c4+=0; } case 2: { c1+=0; c2+=0; c3++; c4+=0; } case 3: { c1+=0; c2+=0; c3+=0; c4++; } }
362 :
360 :2007/06/12(火) 20:22:09
printf("%d\n",dice); //dice=0; b--; } printf("分配計算後に\n"); printf("%d,%d,%d,%d\n",c1,c2,c3,c4); c1+=(int)a/4; c2+=(int)a/4; c3+=(int)a/4; c4+=(int)a/4; printf("%d,%d,%d,%d\n",c1,c2,c3,c4); scanf("%d",&c1); return 0; } このように作ったのですが、余りが2になる場合に どうしても余分な計算をしているようです。 srand(time(NULL)); int dice=rand() % 4; に問題があるのか、case文がおかしいのか分からず迷っております よろしくお願いします
caseの後にbreakするんだ
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は
>>364 の指摘してるとおりだと思うが
while(b--) { *(int *)(((void *)(&c1))+(rand()&3))++; } ただし、c1からc4までが連続定義されているものとする。ANSI 環境依存なら。 int cx[4]; while(b--) { cx[rand()&3]++; } かな?
引数からファイルパスを取得し、同じ内容を別名で出力するプログラムに 関してですが、コマンドプロンプトなどで引数を与えると正常にo.txtが 出力されるのですが、ドラッグアンドドロップだと上手く動作しないです。 ご指南お願いします。 OSはWindowsです。 #include <iostream> #include <fstream> using namespace std; int main(int argc,char **argv) { char buf[256]; ifstream ifs(argv[1]); ofstream ofs("o.txt"); while( ifs.getline(buf,sizeof(buf))) ofs << buf << endl; return 0; }
よく意味がわからんけど コマンドプロンプトにD&Dしてんの? どういうオブジェクトをD&Dしてて、 どううまく動作しないのさ
とりあえず引数を表示してみるとか
o.txtをフルパスで書いたら? なんか変なトコに出力してるだけだろ。
372 :
360 :2007/06/12(火) 20:54:29
>>364-365 など各位
皆様ありがとうございます。早速配列化と、breakを試してみます
373 :
368 :2007/06/12(火) 20:55:45
実行ファイルがtest.exeだとしたら、batファイルなどで test.exe i.txtへの絶対パス test.exe i.txt 両者ともファイルの書き出しに成功しますが、 エクスプローラー上でi.txtをtest.exeへD&Dするとファイルの書き出しが 行われません。 ちなみに引数を表示するプログラムを追加してみたところ、見た目は batファイルとD&D両者とも同じ引数を受け取っているように見えます。
374 :
368 :2007/06/12(火) 21:08:30
>>371 なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。
んでコマンドライン第一引数から実行ファイルまでのパスを切り取って
output.txtに付け加えてあげたら、正常動作しました。
ありがとうございます。
バッチファイルをダブルクリックした場合と、D&Dした場合じゃあ カレントディレクトリの位置が違うんだよね。 よく分からん仕様ではあるよな
a != '.' これの右側(コンマ)の意味がわかりません。
>>376 右側にあるのはシングルクォーテーション「'」とピリオド「.」
間違いました。ピリオドです。
''はAとかの文字リテラルを表示するときに使う物だと思います。
変数aが右オペランドと等しくないということです。
そんなに虐めちゃるなよwって思ったけど確かに
>>376 の質問にちゃんと応えようとしたらこうなるのは致し方ないかw
.は文字リテラルということですね。分かりました。
'.' が文字リテラルであって . が文字リテラルなわけではない。
すいません、質問お願いします。 本日 -> という記号が出てきたんですが、どういった意味なんでしょう よろしくお願いします。
アロー演算子といいます よろぴくね
395 :
デフォルトの名無しさん :2007/06/13(水) 00:33:33
ヘッダファイルなんですが、以下をBorlandでコンパイルすると 「train.h 6: 宣言の構文エラー」となります。なぜでしょうか^^; 初心者ゆえ何卒ご指導願います。 −−−−−−−−−−−−−−− #ifndef __TRAIN_H__ #define __TRAIN_H__ #include<stdio.h> class Train { public: Train(); void SetSpeed(int aspeed); int GetSpeed(); void Run(); void Stop(); private: int speed; }; #endif // __TRAIN_H__
ファイルの拡張子、.cとかになってねぇか? Borland詳しく知らないが、C言語でclass使えないぞ。
予約識別子死ね。
stdにsort()とstable_sort()があるけど stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない ってどういうときに重要になるの? 別関数を用意してまで保障する必要性がわからない。
ヒント:ソートに使った以外のデータメンバ
>>398 すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。
あとstable_sortは最悪条件の時の効率がsortより良い。
それを気にするなら、 ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。
std::sort_heap()
インデックスとアドレスを保持した構造体を使ってソートして、 それから位置を変更していけば、 安定かつ高速なソートができると思う。 作業領域が必要にはなるけどね。
それでも最適化なら・・・最適化ならきっと何とかしてくれる・・・!!
C++のthrow/catch みたいな例外処理を何て呼ぶんですか?
>>406 「例外処理」でいいような気がするけど、「C++のthrow/catch」に限定するなら
「C++例外処理」とでも呼べば?
>C++例外処理 これの存在を知らない組み込みな人たちに伝えるので、 センセーショナルでクールな呼び名を教えて欲しいでつ。
C++言語的割り込み処理
それだ! 組み込みな人達から見ればセンセーショナルでクールでつね。 でも、自分から見れば八百長っぽくてダサダサ。
C++ってなんでfinallyがないの? あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか? char *str = new char[256]; try { ... if (...) return; ... } finally { delete [] str; } と、C/C++初めて1年の俺が適当に言ってみる。
>>411 逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする
>>411 そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。
>>411 ↓こっちのが楽だと思わんか?
std::string str(256);
...
if (...) return;
...
415 :
デフォルトの名無しさん :2007/06/13(水) 09:53:43
そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。
>C++言語的割り込み処理 割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ? なら意味違うかも。。。
割り込みはダメだろう・・・常識的に考えて。 例外処理は例外処理。 例外的な動作が起こった場合に行う処理。
食い込みはおk?
>例外的な動作が起こった場合に行う処理。 C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、 これじゃ、区別付かないじゃん。
でも「C++例外処理」じゃ不満なんだろ。 センセーショナルでクールな・・・ | \ __ / _ (m) _ピコーン |ミ| / `´ \ ('A`) ノヽノヽ くく 「禿式例外処理」なんてどうだ? 組み込みのおっさん相手にはかなりセンセーショナルだろ。
>でも「C++例外処理」じゃ不満なんだろ。 当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。 >「禿式例外処理」なんてどうだ? オヤジギャグ?
別に俺用語を生み出すのは構わないけど 他人とコミュニケーションを取るときには使わないでね
洋本でも普通にC++EHだしな
儂の例外処理は108式まで……
構造化例外ってのは別物だっけ課?
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう
>>419 それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、 forで回すのとその関数を使うのとではどちらが早いんですか? もしくは、計測するのでその関数名教えてください。age
memsetのこと?
fill() だろ。
ostream::write って引数 const char* だけど、 何で const void* じゃないの? クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?
あなたに愛を届ける関数です。
int main() { FILE *fp; int c; fp=fopen("sample.txt","r"); while((c=fgetc(fp))!=EOF) putchar(c); fclose(fp); return 0; } このプログラムの動作でsample.txtが日本語でも大丈夫なようにしたいのですが、 fgetcをどう変えたら良いでしょうか?
>>435 それで大丈夫なように見えるけど、どうダメだったの?
>>436 すいません、putcharの下に一つ入れ忘れましたorz
int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
{
putchar(c);
putchar('\n');
}
fclose(fp);
return 0;
}
正しくはこうでした。
cが漢字の1バイト目だったら改行しない、でいいだろ 1バイト目かどうかの判断は文字コードによる
文字コードじゃなくて漢字コード、ね。 で、1バイト目を出力したことは覚えておいて 2バイト目は無条件に出力 3バイトの文字コードなら以下同様
>>439 ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。
>>406 -
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない
>Windowsの例外処理 これってなんだけ?
>>433 そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。
関係ある。ちゃんと読め。 fwrite は、サイズと数を指定するだろ。 ストリームはストリームを指定するんだ
>>442 「構造化例外」つってんのにググりもしないとは。
>>443 それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?
>>442 __try
__except
__finally
>>445 ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。
>>444 要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?
文字列をbyte列と言い換えればいいのでは、streamは
クラステンプレートbasic_ostreamのこともたまには思い出してあげてください writeの引数はただのcharではなくテンプレート引数よ
ああ、そうか。 そういうことか・・・。 了解。分かった。
俺が思うに、basic_ostream::writeに対応するCの関数は、 fwriteではなくfputs/fputwsなのだろう するとfwriteに対応するのはなんだろうという気になるが
いや、ヌル文字を無視するから、fputs とは対応しないと思う。 wostream::write がある以上、 fwrite と basic_ostream::write も対応しないんだろうな。 用途的には fwrite と ostream::write が対応するんだろうけど。
ところで、例えば int 値をバイナリでファイルに書き込みたいときは、 ofstream f("hoge", ios::binary); int x = 0x12345678; f.write(reinterpret_cast<const char*>(&x), sizeof x); という風に使うんだよね?(エラー処理は略)
new されたサイズをプログラマが知る方法はないですか?
>>454 たしかに、そうなんだけどね。ただ、
basic_ofstream<wchat_t> f;
のときは
f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t));
になる。
const void* を引数にするとわけ分からなくならないか?
"wchat_t"?
>>457 それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる
write()で書いたものが変換をバイパスできるわけではないし
>>457 それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。
const void* でわけわからなくなる点に関しては、
既にその点で了解してる。
バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。
>>459 エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?
>>459 うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。
>>462 まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。
C言語でプログラムを作ってコンパイルまでできているのに いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、 数回入力するとエラーがでるんだけどなんでなんだい?
コンパイルが通るからってバグが無いわけじゃないだろ その情報だけじゃ何が原因かはわからんけど
文てきには間違ってないんだけど、 長い文を書いて作ると絶対なるんだよね。 行数の限界とかってないよね?
>>457 char 以外のストリームでバイナリ出入力っていうのがそもそも無理。
>>463 一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。
少なくともSTLportでは、
ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign
の順で文字などが出力されているのだけど、
このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。
多分、探し方が足りないだけだと思うので。
>>467 basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、
UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、
charだけ特別ってわけにはいかなかったんだろうね。
学校で作ったライブラリがあって、ヘッダーファイルに #define GameMain \ int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\ {\ MSG lpMsg;\ HWND hWnd;\ WNDCLASS myProg;\ (以下略) } って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・ とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。 学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz
>>468 足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。
>>469 どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ
キタ━━━━(゚∀゚)━━━━!!!!
>>471 >>472 半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz
問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。 コマンドプロンプトで実行したら絶対途中でエラーがでる。 なぜだよおい。
環境もコードも示さずにその質問に答えられるのはエスパーだけだな まぁexeとかコマンドプロンプトとか言ってるし Windowsなんだろうなってことぐらいはわかるが
まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード で、VS2003のIDEのデフォルト設定がMBCSで、 VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、 こけてるんじゃないか。
素人なもんですみません。windowsです。 でなにを示せばいいんだい。 ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。
>>459 Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど
>>468 locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う
>>478 素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。
>>480 おそらくコマンドプロンプトがバグってると思われるんだけどな
ソース出せばいいと思うよ
>>481 windows入れなおせばいいと思うよ
>>470 最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。
>>474 /* */ 型のコメントなら大丈夫だよ
>>857 へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?
何誤爆しとんねんw
489 :
487 :2007/06/13(水) 23:51:37
誤爆しました>< 焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><
NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、 「NULLは 0」ということを前提としたプログラムは書くべきではないですか? 例えば… void hoge(Foo *bar) { // bar が NULL じゃなかったら if (bar != NULL) // こっちはいいけど if (bar) // こう書く奴は死ぬべきでしょうか bar->...; }
>>355 それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。
>>491 d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。
まあ、flush しといた方が無難そうだな。
scanf の戻り値を確認して 0 なら 1 文字捨てて読み直す
>>495 さんのレスを参考に変えてみたのですが、
for(i=0;i<3;i++){
printf("%d行目の\n",i+1);
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0)
printf("%d",array[i][j]);
j--;
}
こういうことかと思ったらやはり間違ってて、
「一文字捨てる」という概念がいまいち分からないです。
どう直したらarray[i][j]のエラー入力は無かったことにされて
再入力するようにできるんでしょうか?orz
int ret; while(ret = scanf("%d", &array[i][j]), ret == 0) { scanf("%*c"); } if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }
>>497 %*cって何やってるんだろうとググったらscanfに見たことも無い仕様が
いっぱいで今更ながらにビックリしてしまったです…。
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0){
scanf("%*c");
j--;
}
レスを参考にこんな感じで直したらいけそうな感じになりました!
scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><
つか、getchar でいいような
>>499 getcharって文字入力用じゃないですか?
これで使う方法ってあります?
scanf("%*c"); の代わりに使ってみればいいじゃないの。
>>501 あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。
余計複雑になるだけだと思うが。
fgets+strtolにすれば10進数以外も使えて便利 文字が来ても対処簡単だし
1行につき数値1つ?
>>506 オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ
すまんす
509 :
デフォルトの名無しさん :2007/06/15(金) 15:35:13
C++の質問です。 学習用の簡単なクラス(名前をsampとします)があって、内部でintの値を保持してます。 そこに、friend関数でoperator+()を追加したいです。 最初、 samp operator+(samp & obj, int i) samp operator+(int i, samp & obj) としたところ、 obj = 10 + obj; はOKだったのですが、 obj = 10 + obj1 + 10; はコンパイルがエラーになりました。 そこで、 samp operator+(samp obj, int i) samp operator+(int i, samp obj) としたところ、コンパイルが通り、結果も意図した通りになりました。 これはなぜなのでしょうか? ちなみに、operator+()の内部は以下のように書きました。 samp operator+(int i, samp obj) { samp temp; temp.x = obj.x + i; temp.y = obj.y + i; temp.z = obj.z + i; return temp; } 引数の順序が反対の関数も内部は同じです。 今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、
samp operator+(samp & obj, int const & i) ; samp operator+(int const & i, samp & obj) ;
511 :
デフォルトの名無しさん :2007/06/15(金) 15:56:02
>>510 そのように書き直してみましたが、コンパイル通りませんでした。
以下はコンパイルエラーのメッセージです。
> g++ samp.cpp
samp.cpp: In function 'int main()':
samp.cpp:50: error: no match for 'operator+' in 'operator+(((const int&)((const int*)(&10))), ((samp&)(& obj3))) + obj3'
samp.cpp:37: note: candidates are: samp operator+(const int&, samp&)
samp.cpp:28: note: samp operator+(samp&, const int&)
>>511 すまん、sampの分を忘れてた。
samp operator+(samp const & obj, int const & i) ;
samp operator+(int const & i, samp const & obj) ;
理由?
関数の戻り値はrvalueだからかな。
513 :
デフォルトの名無しさん :2007/06/15(金) 16:13:55
やたらと質問ばかりですいません。 operator||()って、定義するのが何か変な感じなのですが、 ||って、そもそも 式A || 式B などと書いて、 式Aまたは式Bのどちらかが真なら、真。 という意味ですよね?このとき、||の右側の値と左側の値とを 特にoperator||(式A, 式B)としてひとつの関数内で一緒に処理しなくては ならないような状況ってないんじゃないか と思うのですが、 ,,, ここまで書いてきて、なんだか自分でも意味が分からなくなってきました。 ぶっちゃけた話、operator||()が定義できてよかった、という状況って ありますでしょうか? よろしくお願いします。
C++再考かなにかで、画像をくっつける演算子に使っていた気がするな。 実装例では簡単にするため、たんなる文字列だったが。 operator , () より使い道はあるだろ。 こんなものBoostを実装できるような変態なやつらしか使わない。
515 :
デフォルトの名無しさん :2007/06/15(金) 16:23:16
>>512 教えてもらった書き方でコンパイルは通りました。
しかし、今度は
obj3 = 10 + obj3 + obj3 + 100;
と書くとコンパイルが通りません。
ずーっと御世話になってますので、ソースを張り付けます。
#include <iostream>
using namespace std;
class samp {
int x;
public:
samp(int i = 0) {x = i;}
friend samp operator+(int const & i, samp const & obj);
friend samp operator+(samp const & obj, int const & i);
};
samp operator+(samp const & obj, int const & i) {
samp temp;
temp.x = obj.x + i;
return temp;
}
samp operator+(int const & i, samp const & obj) {
samp temp;
temp.x = obj.x + i;
return temp;
}
int main() {
samp obj1(10), obj2(7), obj3;
obj3 = 10 + obj3 + obj3 + 100;
return 0;
}
516 :
デフォルトの名無しさん :2007/06/15(金) 16:31:38
>>514 そうなんですか。実は今独修C++を読んでいますが、そこに、operator,()は
特殊なのでこの本では扱わない、と書いてあって、不思議な感じがして
いました。たしかに手元のマシンでgrepしてみると出てきますね。
rpm -ql boost-devel | xargs egrep 'operator\,\('
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
...(略)
前このスレで、独修C++をやればそれなりに力が付く、とだれかが
書いていたのでこの本を勉強しているのですが、たしかにいい本だと
思ってます。でも、この本にも書いてないことがあるのですね。
この本を終えたら次はどういう本で勉強すべきでしょうか?
517 :
デフォルトの名無しさん :2007/06/15(金) 16:34:28
>>514 C++再考ですね。見てみます。
ありがとうございます。
ミスターoperatorでも目指してんのか
519 :
デフォルトの名無しさん :2007/06/15(金) 16:38:22
今見ている本が演算子のオーバーロードの章(6章)なので、 つい上記のような質問ばかりになってしまいました。
よっ、ミスターoperator!
521 :
257 :2007/06/15(金) 16:40:19
friend samp operator+(samp const & obj1, samp const & obj2); が必要 ((10 + obj3) +obj3) + 100 の順に評価される operator 演算子呼ばれた後のの戻り型を並べると ((samp) + samp) + int ~~~~~~~~~~~~~~~~ ここの演算定義がいない
522 :
デフォルトの名無しさん :2007/06/15(金) 17:03:04
>>521 なるほど。。。。その通りですね。定義したらコンパイルできました。
あと、constの役割(とくにint const &iのあたりとか)が気になるのですが、
それはもうすこし自分で調べてみます。
ありがとうございました。
523 :
デフォルトの名無しさん :2007/06/15(金) 17:10:09
>>520 いやいや。。
それにしても、C++はいろいろ複雑ですね。
質問なんですが、C/C++の開発環境でお勧めのものってありますか。 JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね? ソースコードを書くのが楽したいというのが要望です。 ちなみに、TurboC++を試してみましたがどうもしっくりこない。 というか、まだほとんど使っていないので分からないというのが正直なところです。 環境、WinXP 普通の32ビット (MacやLinuxでもおk) 当方のスペック 大学3年 Javaは普通に使いこなせるという程度
よろしくお願いします。
Eclipseが使えるんなら、そいつにCDTを入れてみたら?
operator&&、operator||、operator, をオーバーロードすると短絡評価でなくなってしまう 見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない
>>505 sscan系でも%iというものがあってな
>>512 intは値渡しでいいだろ
>>513 > operator||()が定義できてよかった、という状況って
Boost.Lambda
samp じゃなくて smap に見えた
>>524 VC++のアカデミックは?
アカデミックは超安かった希ガス
ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。
531 :
デフォルトの名無しさん :2007/06/15(金) 20:10:29
VC++2005expressは無料だよ
express だな。 商用には使えないが、それはアカデミックも同じだな。
嘘言ってはいけません。 Expressも他のEditionと同じように、 商用利用を禁止する条項はない
VC++EEはリソースの扱いが難点だけど それ以外は十分だな
>>533 前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。
アカデミックも商用可能だな。
std::wofstream m_ofs; void CLog::Write( LPCWSTR strMessage ) { if( !m_ofs.is_open() ) return; m_ofs << " Message:" << strMessage; } こういうものを作って CLog log; log.Write( L"てすと" ); という風に使うと Message: としか出力されません。何故でしょうか?
よく判らんけど、バッファリングされているからじゃないの? フラッシュしたら?
ロケールの設定
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです
>>539 ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・
>>541 おお!解決しました!
ありがとうございます!
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?
>>543 gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。
wchar_t wfunc[sizeof __FUNCTION__]; swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__); とか自分で変換するしかないのかな。 バッファが必要だから、マクロ化するのも難しいな。 グローバル変数を使うのもアレだし・・・。
>>528 scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし
>>530 普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる
今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする
>>547 それはわかる
1行目の10進以外もに反応しただけ
>>547 つ[%i]
って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。
ツーか、むしろ突っ込むならここだな。 >どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
知らないくせに偉そうな事を言うってのが とてもみっともないんだよね
あ、ちょっと違うか。
>>547 は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505 の基数の自由度に関しては、確かにstrtolの方が便利。
最近Cの勉強を始めたのですが、いくつか質問したいことがあります。 講座などを見ると、Javaにできることは全部できると感じましたが、 Javaと同じようにやるのが難しいこととか、 Javaの感覚でやると間違いやすいこととか、ありますか? それからヘッダというのはプログラム本体と同じように、 関数を定義したり、グローバルに使う変数を保持してもいいのでしょうか? VCにはJavaのEclipseのように、打った瞬間コンパイルエラーを表示してくれたり、 3,4字打ったら当てはまる構文や変数名やクラス名を出してくれる機能はないのでしょうか? それがないと、打ち間違いしそうです。
556 :
デフォルトの名無しさん :2007/06/16(土) 12:03:58
すみません。6年ほど前にVC++6.0を買ったんですが、入門者だった私にはどうにも難しくて C言語のコマンドラインプログラムを勉強した程度です(独習C)のレベルです。 それから、JavaやPHPやASP.NETのWeb系の仕事をしたりしていたんですが、最近、Win32プログラムの昔買った本とかを 読んでみると結構理解できます。自分としてはVCへの憧れが強いので、MFCとかも勉強したいとおもっているのですが いまさらMFCを勉強しても無駄でしょうか?C++の文法的知識はあります。
MFCをやる利点てあるかな? 全部C#でことたりね?
>>544 >>545 ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。
>>557 .NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。
個人的には今からMFCやる意味はあんまり無いと思うけど。
ファイルに関するたくさんの情報を保持するクラスを作りたいんですが、 こういう時のメンバ変数はprivateにするのが基本なんですよね? Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?
>>561 ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。
どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら クラスじゃなくて構造体を使うとかしたら?
クラスにしたのはコンストラクタとデストラクタが使いたかったからです。 このクラスの変数には別のクラスから頻繁にアクセスする必要があって、 こういう場合隠蔽する意味あるのかな〜?と。 かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・ とか思ってなかなか決められないんです。
あ、構造体でもコンストラクタとデストラクタは使えますね。 結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。
好きにしろ
>このクラスの変数には別のクラスから頻繁にアクセスする必要があって まずこの設計が間違ってないかどうかを考えるべきだと思う
ですよね。 ちょっと検討しなおします。 ありがとうございました。
横からなんですけど
>>556 さんの質問に関連して、
現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?
>>570 とりあえず.NETかそうでないほうをやるかで決めては
MFCやればいいじゃん。趣味なら何の問題もないよ。 もう後がないとか、2005EEでできないとか、どうでもいいじゃん。
さすがにMFCはもうやめといたほうがいいだろ。 どうせまだ入り口程度しかやってないんだろ。 だったら早いうちに.Netへ移行しておけ。
>>571 今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz
>>572 今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。
>>573 やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?
>>575 プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。
プログラマになるなら最低7つは言語を習得しないとダメです。
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について
そもそも何を持ってマスターと言うのか? C++0xとかまだ定まっていないというのに
難易度高くても、C++しかできないとな。 つぶしが利かない。
>>580 C++できたら他の言語なんて楽勝だろ。
楽勝だったら、7つ覚えておけよw
仕事で必要になるたびに覚えていけばいい
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。
いやぁ、C++からJavaはちょっと壁があるぞ。 C++言語を覚えただけじゃ、GUIもスレッドもないしな。
さらに言うと、現状javaの案件といえば、サーバーサイドだな。
>>585 でも逆の Java → C++ と違って挫折することはまずないだろ。
それで挫折する人間なら、C++覚える時点で挫折するよ。
GUI は言語の問題じゃなくてライブラリの問題だと思うが。
言語だけのC言語ベースでイインジャネ? 設計まで絡んだら知らん。
591 :
デフォルトの名無しさん :2007/06/16(土) 18:01:50
reinterpretって何て読むの? ネット辞典で調べてもでてこん。
リインタープリット
文法だけではプログラマになれないよ。 そもそも質問主は、MFCか.Netかで迷ってるんだよ? それでもライブラリだから論点が外れてるといえるか?
594 :
デフォルトの名無しさん :2007/06/16(土) 18:17:30
俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ
>>594 慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。
俺はC++からJavaScript+HTMLをやったんだが。 C#には簡単に移行出来たな。
597 :
W :2007/06/16(土) 20:25:34
JavaScript+HTML
CやC++で a = b = c = d; としたら、段階的に処理を書くと、 a = b = (c = d); //まずcにdが代入される a = (b = c) = d; //次にbにcが代入される (a = b) = c = d; //最後にaにbが代入される と言うことでいいのでしょうか? 詳しく教えてほしいです
a = (b = (c = d)) c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
なるほど! わかりやすい説明をありがとうございます!!
HTMLってプログラミング言語?
・変数がない ・ループ、条件分岐が書けない ・関数も書けない 修飾言語ではあるが、プログラム言語ではないかな
HTMLはマークアップ言語です。
>>602-603 トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。
プリコンパイル済みヘッダーを作ったですが デバッグモードではビルドできるのに、リリースにすると error LNK2005: *** は既に ***.obj で定義されています。 というエラーが全部のファイルで発生してしまいます。 これは何故なんでしょうか? 環境はVS2005です
特異な言語といえばSQLもそうだな。 一応Languageと名前についてるけど、 これをプログラミング言語と呼ぶのは ちょっと抵抗ある。
ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が
SQLに制御構造をつけたのがストアドじゃないかね
HTMLだってLanguageと名前についてるだろ SQLはプログラミング言語じゃなくて、データベース言語だろ
Languageは「言語」であって「プログラミング言語」ではないからな。
>>594 for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。
グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。
HTML はプログラミング言語じゃなくてマークアップ言語。 TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
SQLがチューリング完全でないことは明白。
何言ってるの?
わからないなら調べてから聞けよ
あ〜い、とぅいまてぇ〜ん♪
>>602 IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ
619 :
デフォルトの名無しさん :2007/06/17(日) 12:43:27
親クラスのprotectedな変数が、public継承した子クラスでは publicにならずにprotectedなままなのは何故ですか? 親クラスのpublicな変数が、protected継承した子クラスでは protectedになるのに。 publicよりもprotectedの方が強いと理解しておけばよいのでしょうか
そう理解しておけばおk そしてプライベートが最強と
621 :
デフォルトの名無しさん :2007/06/17(日) 12:55:24
>>620 ありがとうございました。
そう理解しときます。
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、 thisポインタを戻り値にしない書き方ってありますか?
ありますよ
それは例えばどういった書き方でしょうか?
>>624 void operator = (...
a = b + c + d;の処理の流れって、 a = (b + c) + d; //まずbにcを加算 a = ((b + c) + d); //次にb+cの値にdを加算 最後に aに代入という流れで理解してよいのでしょうか? 詳しく教えてください。
デバッグ
デバッグする環境がありません・・・すいません。
>>626 その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。
いや待て、a = b + (c + d)という解釈をしているかも知らん。
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから b+cが先だろ
>>630 しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。
>>633 コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
??? 誰もそんな事言ってないぞ?
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。
a = b() + c() + d(); で、b, c, d の呼び出される順番は未定義だっけ? 結合順と、各項の評価順はまた別の話だよな。
fgetsの使い方で fgets(buf, sizeof(buf), stdin); のような常套句がありますが、これは sizeof(char) が1であることが 前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が 想定した数の2倍になってしまうと思うのですが。 こういった書き方は問題ないのでしょうか。
>>638 sizeof(char)は絶対に1だから安心しる。
ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。
charが1バイトじゃなくて1バイトの定義がchar?
charは常に1バイト
643 :
638 :2007/06/17(日) 18:47:09
レスありがとうございます。 charが常に1バイトというのは、規格で決まっているのですか?
>>643 決まってる。
ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。
誤解があるといけないから念のために言うけど、 char が 1 バイトというのは決まってるが、 1 バイトが 8 ビットである保証はない。 1 バイトが 9 ビットの環境もある。
1バイトのビット数を取得するマクロってありますか?
647 :
638 :2007/06/17(日) 18:51:48
皆さんありがとうございました。勉強になりました。
アルバイトのヒト数を取得するユニクロってありますか?
>>637 未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。
たまにはlimits.hも眺めよう
float.h も眺めようぜ
眺めすぎて惚れるなよ
やだ・・///
構造体やクラスを関数内で定義すること、 つまり、以下のようなことがしたいのですが これは規格でできることが保証されていますか? void hoge() { struct hage { ... }; ... }
ちなみに関数内で関数は定義できません
>>656 ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。
>>657 構造体やクラスの静的関数で代用するのが常套句になってますね。
GCC の拡張でよければ関数内関数は使えるんだけどな。確か。
関数内クラスをテンプレート引数に出来たらなぁ と思うことがある
charのバイト数の件で便乗質問。 shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか? 決まってないのなら確実に2byteの型は有りますか? また確実に4byteの型はありますか?
longは32bit以上というのはK&Rに書かれていた気がする。 というか規格原理主義者によると、1バイトが何ビットかも決められていないとか
>>661 #include <stdint.h> で int16_t と int32_t でおk。
>>661 sizeof (short) == 2と規格で定まっているわけではない
でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける
同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける
2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える
前者がぴったし16ビットの型(対応する型があれば用意されている)
後者は少なくとも16ビットの型(絶対に用意されている)
後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得
C++に今のところ<stdint.h>は、存在しないから
<boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない
C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?
必要以上に移植性を求めるのは不毛。 必要以上に移植性を失うのも愚かしいこと。
俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^
どうせ他の部分も環境依存しまくりなんだろ? どんどん使っちゃえYO!
>>667 __closureも活用してもっと便利に!
勉強になるな。
#include <stdint.h> VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。
672 :
デフォルトの名無しさん :2007/06/18(月) 00:47:53
質問 void hoge() { 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif ↑こんな調子で数百行位ある } こういう汚い関数を直したいんだが void DebugPrint(char *str) { #ifdef DEBUG printf("Debug %s, str); #endif } void hoge() { 何かの処理 DebugPrint(nanka); 何かの処理 DebugPrint(nanka); } って感じに直したいんだが、やったら動作変わっちゃう? #ifdefあんま使ったこと無いから教えてくださいな
そりゃそうだろ
>>673 すんません
分かり易く解説お願いします
675 :
673 :2007/06/18(月) 00:49:19
>>671 の事ね
VC6が出来たのはだいぶ前だから
676 :
672 :2007/06/18(月) 00:50:28
>>675 あ、すんません
タイミング良かったんで即レス来たのかと思っちゃいましたw
#ifdef DEBUG #define DEBUG_PRINT(a) printf("Debug %s, (a)) #else #define DEBUG_PRINT(a) #endif void hoge() { 何かの処理 DEBUG_PRINT(nanka); 何かの処理 DEBUG_PRINT(nanka); } こういうのはよくやるな。 ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。
>>677 おぉ、なるほど
後、確認なんですけど、自分が書いた
>>672 だと動作変わっちゃうんですよね?
勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz
別に動きは変わらんと思うが
>>679 あ、そうなんですか?
ありがとうございます
個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな〜と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)
失礼、 ×他から ○他からも
動きは変わらないが、 後者は関数呼び出しのオーバーヘッドが発生する。
関数本体の中にやたらと#ifdefなんかが入ってるのは、 あんまりいいコードとはいえないな。 「見づらくてしょうがない」というその感覚は限りなく正しい。 改善する方法をいろいろ考えるべきだな。
>>682 すいません
そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?
>>683 ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです
関数を呼び出すという処理は、それ自体スタック操作や
プログラムカウンタの移動などの処理が行われる。
だから、
>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で
>>677 の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。
ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。
でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?
>>685 なるほど、詳しい解説ありがとうございます
せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね
可変長引数マクロを使えるコンパイラならこんなこともできる #if DEBUG #define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__) #else #define DebugPrint(...) #endif
リリース版ではインライン関数にして、 コンパイラの最適化に期待する手もある。
/* 古いコンパイラで使える技 */ #if DEBUG #define DebugPrint(args) printf args #else #define DebugPrint(args) #endif /* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */ DebugPrint(("%d\n", 1234));
古くなくてもできることないか?
1. インライン関数の定義を別ファイルに分ける 2. inline を INLINE マクロに置き換える INLINE マクロの定義は以下の通り(これは自分で定義する) #ifdef NDEBUG #define INLINE inline #else #define INLINE #endif 3. リリース版の場合はヘッダファイルでインクルードする #ifdef NDEBUG #include "***.***" #endif 4. デバッグ版の場合はソースファイルでインクルードする #ifndef NDEBUG #include "***.***" #endif
#if DEBUG #define DebugPrint printf #else #define DebugPrint (int)sizeof #endif
C++なら、こんなことできるお class DebugPrinter { DebugPrinter(const char *filename, int line) {...} void out(const char *format, ...) {...} }; #if DEBUG #define DebugPrint DebugPrinter(__FILE__, __LINE__).out #else #define DebugPrint #endif
>>695 エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。
>>695 たぶん、ならんよ。リリース時は
DebugPrint("%d, %d", f(x), f(y)); → ("%d, %d", f(x), f(y));
ってなるだけだから。
ただ、これがいやなら、
>>693 のようにsizeofしちゃうか、
dummyの関数作って
#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
inline DebugPrintDummy(const char *filename, ...) {}
#define DebugPrint DebugPrintDummy
#endif
って感じにしちゃうのがいいかもね
VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。
if(1); else に置換するという技もある。 多分最適化で消える。
>>697 関数 f が副作用を持ってたら問題があるな。
VC++ならTRACEで以上では?
皆さん 感謝、感激雨あられです ちょっとF1見てる隙にこんなに書き込みが・・・ 色々参考にさせてもらいます
何F1見てんだよこのヤロー
ああ、F1押すと長々と待たされた後で 役に立たないヘルプが出るよね
>>700 まあ、必要なら
>>699 で多分消せるじゃね?
>>701 TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん
必要ならって言うか、必須なんだぜ。
>>706 いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?
709 :
デフォルトの名無しさん :2007/06/18(月) 03:10:09
ちょっと相談です。 言語はCでもC++でも構いません。 ちなみに開発環境はWin2000+VisualStudio2005です。 DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。 この関数は、処理結果を文字列として str に返してくれます。 strに渡される文字列の長さは *不明* です。 DLL、および関数Funcの中身を弄ることは出来ないものとします。 この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。
>>708 これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy
>>709 static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。
>>709 Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです
通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。
例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません
715 :
709 :2007/06/18(月) 03:28:23
即レスサンクス。 やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。 >711 とりあえず1万バイトくらいでがんばろうと思います。 >712 バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)
>>715 え、本当にどうしようもないの?
仕様上から決まる例(
>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?
そりゃDLLの設計が糞としか言いようがないが…
gets を安全に使うにはどうすればいいですか? っていう質問と一緒だね。残念ながら無理だ。
仕様上から決まる例で32bit整数が最大値だとわかれば 常にその大きさの配列渡せば安心、かな
メモリ使い切って落ちるに1票
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ? それにしても 32bit 最大値はやりすぎだろうけど。
パイプとかその辺のOSの用意したプロセス間通信機能でどうにかするしかないんじゃね?
722 :
デフォルトの名無しさん :2007/06/18(月) 13:48:29
すいません、また質問させてください。 #include <iostream> using namespace std; class base { public: int a; base(int x) {a=x;} }; class sub1 : virtual public base { public: sub1() : base(0) {} }; class sub2 : virtual public base { public: sub2() : base(0) {} }; class sub3 : public sub1, public sub2 {}; int main() { sub3 obj; obj.a = 10; return 0; } これがコンパイル通らないんですが、baseクラスに引数のないコンストラクタを 追加するとコンパイル通るようになります。virtual指定で継承すると、引数のない コンストラクタを呼ぶというルールなのでしょうか?
#include <iostream> namespace test_ { class base { public: base() { std::cout << "base::base()" << std::endl; } base(int x) { std::cout << "base::base(int x)" << std::endl; } }; class derived1 : virtual public base { public: derived1() : base(0) { std::cout << "derived1::derived1()" << std::endl; } derived1(int x): base(x) { std::cout << "derived1::derived1(int x)" << std::endl; } }; class derived2 : public derived1 {}; } int main() { test_::derived2 a; return 0; } そのようですね なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです
>>722 >引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;
725 :
709 :2007/06/18(月) 15:00:50
>716 一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。 3000とか4000とか飛んでるのを何度か見たことはありますが。
>>725 >一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
>3000とか4000とか飛んでるのを何度か見たことはありますが。
そりゃーDLLが糞でFAじゃね?
もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。
仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。
仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。
まぁがんがれw
727 :
デフォルトの名無しさん :2007/06/18(月) 18:05:42
#include <iostream> #include <string> #include <boost/function.hpp> #include <boost/bind.hpp> class Writer { public: void run(const std::string& str) { std::cout << str << std::endl; } }; class Module1 { public: typedef boost::function<void(const std::string&)> func_t; private: func_t func; public: Module1(func_t func_) : func(func_) {} void run() { func("message"); } }; int main() { Writer w; w.run("test"); using boost::bind; Module1 module( static_cast<Module1::func_t>( bind(&Writer::run, &w) ) ); module.run(); return 0; } Writerクラスのrun()をコールバック関数として、boost::bindを使ってクラスModule1に渡します Module1はboost::functionを用いてこのコールバック関数を保持します これを実現したいのですがエラーどころか、コンパイラ(VC2005のcl.exe)が落ちます(汗 どうすればこの動作を実現できるんでしょうか?
自己解決しました bind(&Writer::run, &w)→bind(&Writer::run, &w, _1) 引数とる場合はプレースホルダが要るんですね(汗
>>722 class sub3 : public sub1, public sub2
{
sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
こんばんは、皆さんに質問です テンプレートの定数の引数をエレガントに記述する方法が分かりません template <class Type, int Length> Array { …Arrayの実装… }; class Color : public Array< unsigned char, 3 > // RGBなので3 { public: static const int ColorDimension = 3; // これは使えない… …Arrayの実装… }; ここに出てくる3をエレガントに記述する方法が分かりません グローバルで定義したりdefineディレクティブで定義したりは汚いですし、 無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。
731 :
デフォルトの名無しさん :2007/06/18(月) 20:48:52
元々汚いんだからエレガントなんて求めなくて良い
少しはきれいに書ける方法としては派生元で定義してしまう方法ですが… template <class Type, int Length> Array { …Arrayの実装… }; class ColorBase { public: const static int Dimension = 3; } class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3 { …Arrayの実装… }; なんか微妙です…第一、継承する意味があるのかと…う〜ん。 でもnamespaceだと関連性の記述があいまいです。 さらにはこんな方法もあるのですが… class TColor<int Length> : public ColorBase, public Array< unsigned char, Length > { …Arrayの実装… }; typedef TColor<3> Color; 結局これでは定数をtypedefに移しただけで意味がなく、 const TColor::Dimension=3; typedef TColor<TColor::Dimension> Color; とまでして構造をめちゃくちゃにするのなら、 そのまま3って書いておいたほうがましな気がします。 何かよい方法があるのでしょうか?
>>731 では、その元々汚いものを綺麗にする方法を教えてください。
>>730 Arrayに手を付けていいなら、
template <class Type, int Length_> Array
{
public:
static const int Length = Length_;
//...
};
class Color : public Array<unsigned char, 3> // RGBなので3
{
public:
static const int ColorDimension = Length;
//...
};
735 :
デフォルトの名無しさん :2007/06/18(月) 21:10:10
int g1;int g2; int ga[10]; main(){ int li;int l2; int la[10]; int lb[10][10]; printf("%d\n", &g1); printf("%d\n", &g2); printf("%d\n", &l1); printf("%d\n", &l2); printf("%d\n", &l1-&l2); } ↑のようなプログラムの printf("%d\n", &l1-&l2);の表示結果の意味と 大局変数ga と局所変数la がどのように並んでいるのかを答えろって 課題なのですが、全くもって意味が分かりませんorz ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。 これはどういう事を意味しているのでしょうか? ga[10]とla[10]に関してですが、これは[0]〜[9]までの配列が用意されてるって事で良いんですかね? ヒントの方よろしくお願いしますorz
なぜに&
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。 >これはどういう事を意味しているのでしょうか? 「鼻から悪魔がでてきて私をたぶらかした結果である」
すみません、いくつか質問させてください。 1、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか? int i = Array<int, 3>::Length; とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に 初期化が行われるのでしょうか? 2、int i = Color::ColorDimension; とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか? ちなみに、せっかく答えていただいたのに恐縮ですが、 class Color : public Array<unsigned char, 3> の、3がマジックナンバーとなっているのを何とかしたかったのですが… やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。
739 :
730 :2007/06/18(月) 21:18:19
あ、私は730で
>>734 さんに対してのコメントです
>>735 ヒント:課題スレではない
しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。
>>735 >printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]〜[9]までの配列が用意されてるって事で
おk。
クラスを増やしたり、 define使ったり、 グローバルなenum使ったり namespaceを使ったり できないのなら、それは不可能ってことだよ。 別にグローバルにColorDimensionを定義してもいいじゃん。
ここは格好良く可変引数取れるArrayにして Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな 俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど
>>741 理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。
745 :
デフォルトの名無しさん :2007/06/18(月) 21:51:47
>>736 頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。
>>740 神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。
>>741 神様レス有難う。
ga[10]とla[10]の件理解しました。
>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。
746 :
730 :2007/06/18(月) 21:54:59
>>742 グローバルの名前空間は絶対に汚せない環境というのがございまして…
#define COLOR_DIMENSION 3
class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3
{
…Arrayの実装…
};
#undef COLOR_DIMENSION
とかwww、もう何がなんだか…
#undef _COLOR_DIMENSION 3
あたりで我慢っすかねぇ
>>743 しかし、ArrayはColorとはあんまり関係なかったりして…
そもそも、public継承なのかprivate継承なのかという問題までありまして…
template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3
{
public:
Color() { assert(Dimension==3); }
}
とか…いや、assertで比較している3がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも
C言語の全角半角処理について二点程分からないので、宜しかったらアドバイスを頂けたらと思います。
仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。
(CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。
現在、入力された文字列に「@全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」
(つまり@の処理は漢字や平仮名カタカナや英字は入力出来ます)
という処理と、「A全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」
(Aは、@の通過可能な条件に、全角半角数字が含まれます)
という処理と、「B全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。
半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで
どうにかなってますが、Aのハイフンの判別ができずに詰まってます。
使ってるソースは、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3606 こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。
>730 というか、継承では"Color is an Array"が成立するかという問題がある ので、素直に包含関係にしてしまえ。
>747 ShiftJISの仕様についてもうちっと調べるべき、かな。 まあ、一旦wcharに変換して扱う手もあるけどネ。
751 :
デフォルトの名無しさん :2007/06/18(月) 22:17:19
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか? 継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?
classでレガシーな初期化はできなかった希ガス。 class Foo {int bar; int barz;} foo = {1, 2} できたらごめん。
>752 全メンバをpublicにすればコンパイルできた。 まあ、当然といえば当然か。
754 :
デフォルトの名無しさん :2007/06/18(月) 22:49:14
サンクス。 しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。 内緒にしとくもんでもなかろうて。
質問 1. 死ぬまでenumハックを使うべきなのか。 2. 死ぬまでexportは使ってはならないのか。
>>755 1. そうです
2. そうです
早死にしないように気をつけて
1 VC6を窓から投げ捨てりゃいいんじゃね 2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね
>738 初期化は実行時に起こる。 テンプレートが使用された時、というのはコンパイル時の話。 件の場合、定数化されてしまうというのを無視すると int i = Array<int, 3>::Length; とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。 で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも 初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。 >2、int i = Color::ColorDimension; > とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか? 実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。
いくつかのサイトで見られたのですが、 STARTUPINFO si = {sizeof (STARTUPINFO)}; は何をやっているんでしょうか? STARTUPINFO si = {0}; や、 STARTUPINFO si; memset(&si,0,sizeof (STARTUPINFO); si.cb = sizeof(STARTUPINFO); などなら分かるのですが。
761 :
760 :2007/06/19(火) 07:24:58
あ、すみません。 構造体の第一メンバをsizeof (STARTUPINFO)で、 残りのメンバを0で初期化している事が分かりました。 値を設定してないと0で初期化されるようですが、 STARTUPINFO si = {}; のような使い方では0で初期化される保証はないのでしょうか?
>>760 定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。
>STARTUPINFO si = {};
コンパイル通った?
763 :
760 :2007/06/19(火) 08:56:24
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。 コンパイル通らない可能性もあるんですね。それなら使いません。 あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると 「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。 これはmemset()が使われてるということなんでしょうか?
>>763 そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。
766 :
デフォルトの名無しさん :2007/06/19(火) 10:21:17
すみません、このスレでいいのか迷うんですが、 Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり 開始したりする方法を教えて下さい。 宜しくお願いします。
767 :
760 :2007/06/19(火) 11:07:01
>>764 おお、なるほど。C++でした。
>>765 ありがとうございます。
みなさん、どうもありがとうございました。
768 :
766 :2007/06/19(火) 12:48:11
解決しますた
769 :
デフォルトの名無しさん :2007/06/19(火) 12:57:26
今現在BMPの画像をexeファイルで表示する方法をやってるのですが よろしければ必要最低限のプログラムのソースを教えていただけませんか? よろしくお願いします。
771 :
デフォルトの名無しさん :2007/06/19(火) 13:10:27
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>
int main(){
printf("今現在BMPの画像");
return 0;
}
どうせWindowsだろ 猫でも読んどけ
丸投げは宿題スレ以外はだめ 今どこまで理解しててどこら辺がわからないのか書け
774 :
デフォルトの名無しさん :2007/06/19(火) 14:38:22
>>729 ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)
775 :
デフォルトの名無しさん :2007/06/19(火) 14:46:23
すいません、ソース貼り忘れた #include <iostream> using namespace std; class base { public: int a; base(int x) { a=x; cout << "x=" << x << endl; } }; class sub1 : virtual public base { public: sub1() : base(0) {} }; class sub2 : virtual public base { public: sub2() : base(0) {} }; class sub3 : public sub1, public sub2 { public: sub3() : base(33) {} }; class sub4 : public sub3 { public: sub4() : base(1) {} }; int main() { sub4 obj; obj.a = 10; return 0; }
776 :
デフォルトの名無しさん :2007/06/19(火) 14:49:43
win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか? また、両者の使い分け基準って何かあるのですか? たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。 趣味でやるなら好みでいいんじゃない?
778 :
デフォルトの名無しさん :2007/06/19(火) 16:30:34
try catchでわざと例外を出す方法を教えてください 今は変数を0の入った変数で割って例外を出しています
try catchじゃ例外は出せない
780 :
デフォルトの名無しさん :2007/06/19(火) 16:42:51
tryの中でcatchに飛ばす方法を教えてください
「C++ 例外」でググれ
782 :
デフォルトの名無しさん :2007/06/19(火) 17:01:37
このソースで LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。 がでるんだけど、何が悪いか教えてください。 どうやったらwarning消せますか。ちゃんと.shareが使える形で。 #include <windows.h> #pragma comment(linker, "/section:.share,RWS") #pragma data_seg(".share") HANDLE x = NULL; #pragma data_seg() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK); return TRUE; }
>>782 とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1
784 :
デフォルトの名無しさん :2007/06/19(火) 17:35:43
捕捉でごめんなさい。 debugだとでなくて、releaseだとでるみたい。
785 :
783 :2007/06/19(火) 18:05:35
releaseでもでなかった printfでx見たいからコンソールにした 複数プロセス起動させるとxの値が増加したからshareされてると思う@vc7.1 winxp sp2 #include <stdio.h> #include <windows.h> #pragma comment(linker, "/SECTION:.share,RWS") #pragma data_seg(".share") int x = 1; #pragma data_seg() int main(int ac, char** av) { printf("%d\n", x); x += 1; MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK); return 0; }
786 :
デフォルトの名無しさん :2007/06/19(火) 18:59:16
>>785 まじですか。
こちらの環境はVS2005のExpress。
調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。
コンパイルエラーが出ないソース。
#include <windows.h>
#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
++x;
MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
return TRUE;
}
つづく
787 :
デフォルトの名無しさん :2007/06/19(火) 19:01:28
コンパイルエラーが出るソース。 #include <windows.h> #pragma comment(linker, "/section:.share,RWS") #pragma data_seg(".share") int x = 1; #pragma data_seg() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK); return TRUE; } ++x; がないだけ。 ↑のは ×初期化されない ○一度も利用されることがない かと思っています。
最適化で消されてるだけじゃないかな /Faで.asm見ればわかるよ
よりにもよってスカかよw
しかも logK か。 何か化学的な雰囲気を感じるぞ。
792 :
730 :2007/06/19(火) 22:17:42
>>759 Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?
>>792 テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない
794 :
730 :2007/06/19(火) 23:51:30
>>793 ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。
コンパイル時に行われるということを考えると文法も分かりますね。
・OKな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B;
};
const int Base:: A = 1;
const int Derived:: B = A;
・ダメな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B = A;
};
const int Base:: A = 1;
たしかにwww。ありがとうございました。
いかん 最近始めたCの勉強をここ一週間ほどさぼってたんだが ここ見てちょっと焦ってきた いかんいかん
例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで template<typename T> value_t { public: T get() const { return value; } void set(T n) { value = n; } private: T value; }; という感じになると思います。value_t<int> とかなら問題ないと思いますが、 (普通は参照を使って渡す)クラスや構造体が型に指定されると、 無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。 ということで、最初から参照を使って、 template<typename T> value_t { public: const T & get() const { return value; } void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする private: T value; }; こう書いても問題ないですか?(というか、こう書くべきですか?)
問題はないけど、 プリミティブ型だと結構遅くなる。
>>796 boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか
799 :
デフォルトの名無しさん :2007/06/20(水) 08:26:49
ofstream ofs("a.txt",ios::app); ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl; や、 if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName")) だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも) ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl; や、 if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName")) のようにhwndParentならクラッシュしません。これは何が原因でしょうか?
>>800 各変数の値がどうなってるかくらい調べろよ
>>800 とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?
803 :
800 :2007/06/20(水) 13:04:12
>>801 すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。
>>802 ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。
C++で安全なコードを書きたいなら、キャスト前のチェックとか、 ->の元がNULLでないことを保証するassertなんかは必須かと というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを 処理の前に挿入してログにでも吐けばいいんじゃね?
>>803 予測なんてしなくていいから、デバッグ実行しろ。
806 :
800 :2007/06/20(水) 13:41:47
>>804 lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。
>>805 デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。
MSDNのCREATESTRUCTに関するヘルプには Because the lpszClass member can contain a pointer to a local (and thus inaccessable) atom, do not obtain the class name by using this member. Use the GetClassName function instead. と書かれているようだが。 lpszClassに直接アクセスしてクラス名を取得しようとするな ってことじゃねえの。
808 :
800 :2007/06/20(水) 15:24:02
809 :
デフォルトの名無しさん :2007/06/20(水) 19:21:18
class Stone{ public: Stone(); int color, groupNumber; Stone *nextStone, * groupHead, *nextGroup; }; Stone::Stone(){ color = groupNumber = 0; *nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない } というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、 Boardオブジェクトを作りたいと考えています。 改行が多いといわれたので続きます
810 :
809の続き :2007/06/20(水) 19:22:32
class Board{ public: Board(); Stone board[21][21]; Stone *boardHead; }; Board::Board{ *boardHead = &board; // (2).Stone(*)型はStone型に変換できない for(int i; i < 20; i++){ int j; for(j; j < 19; j++){ board[i][j].color = 3; board[i][j].(*nextGroup) = board[i][j + 1]; } board[i][j].color = 3; board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様 } と表記したところ、(1).(2)のエラーが起きました。 配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?
811 :
809、810 :2007/06/20(水) 19:24:44
すいません。書き忘れです。 (1)では、ヌルポインターを取り合えず代入したいと思っています。 (2)では、配列番号から、要素のポインターを代入したいと思っています。
(1)のところには、余計なカンマが付いている (2)の最初の箇所は、余計な*が付いている 2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ
813 :
デフォルトの名無しさん :2007/06/20(水) 19:31:34
(1)で*付ける意味も分からんし nextStone = groupHead = nextGroup = 0; とか
814 :
デフォルトの名無しさん :2007/06/20(水) 19:33:43
すみません、質問させてください。 void foo(const char *const& hoge); のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が 分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか? よろしくお願いします
windowsで、C++builder使用してます。 質問です。 Linuxだと、iptablesのテーブルの中身を書き換えて iptablesを再起動すると、設定変更できますよね。 やりたいことは、 ※時間ごとに、アクセスできる人を変更したいんです。 これをwindowsでやりたいんです。 1、ファイアーウォールみたいなのから、自分で作る。 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり とかのやり方がわからないです。本などご存じないでしょうか。 2、フリーのファイアーウォールソフトを探してきて、 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動 で、できそうでしょうか? 2番目だと簡単そうですか?
ソフト単体ならパケット監視してどうこうということもできるだろうけど、 windowsのばあい、システムに対してユーザーが介入するのは難しい。 アクセスというのは、何に対してのアクセスなんだ? webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。 共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。
>>818 レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。
>>819 ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。
821 :
デフォルトの名無しさん :2007/06/20(水) 22:47:33
>>820 そんなあなたにフィルタドライバか、DLLインジェクション。
なんで具体的にそのソフト名をいわんのかね。
改造する気?
C++でLinkポインタというのを作りました 所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて 自分が消滅する時にそれらを一気にぬるぽ値に設定することで コピーは本体の事を意識しなくて済むというメリットがあります 質問はこれと似たような事が出来る既存のライブラリは無いかということです 正直あまり良い実装じゃない上に根本的に泥臭いんですよね…
Lockできないboost::weak_ptrを実装したって話?
あのー (unsigned int) ((context->count[0] >> 3) & 0x3F) これがなぜ64のあまりになるのですか?
0x3f=16*3+1*15
えーとじゃあ 45と120の場合いくらになるんだろ なんか計算あわない
>>826 一瞬、LISPあたりのコードかと思った。
ところでなんで (context->count[0] >> 3)してるんだろう。 これすると値辺になる気がするのですが
つーかそれ、 8で割った後に64で割った余りを求めてる事になるが
あっそ、よかったね
よくないという話だな
>>826 10進数で下6桁残して上の桁を0にしたら
それは100万 (10^6) で割った余りになる。
それと同じように、0x3F で AND とると
(=2進数の下6ビットを残して上のビットをクリア)
64 (2^6) で割った余りになるわさ。
836 :
ひろみつ :2007/06/21(木) 16:29:58
Cって何言語で一版最初書かれたの?今のC言語はCで書かれてるとかいうのはなしね。 K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?
837 :
デフォルトの名無しさん :2007/06/21(木) 16:33:43
ひろみつ死ね
838 :
デフォルトの名無しさん :2007/06/21(木) 16:50:44
94年じゃしょうがないな
841 :
デフォルトの名無しさん :2007/06/21(木) 18:27:59
unsigned conv_in:1; という記述を見かけたのですが このコロンはなんですか?
>>841 ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。
843 :
838 :2007/06/21(木) 18:33:45
>>839 どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。
>>840 やっぱだめですよね。。どうもありがとうございました。
おいおい独学社ならそれくらい嫉妬家よ
845 :
841 :2007/06/21(木) 18:44:33
>>844 今日始めたばかりの独学者なんだろ。事情を察しろ。
そういうところのリンクをまとめて貼ってもいいんだが 見つける喜びってのがあるからなあ
>>847 急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。
長いソースを打ち込みたいならCプログラミング診断室 いや本気にしないでね
>>825 おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い
OfficeのWORDの文字だけをいじるプログラムを組みたいのです。 ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。 DCOMを使うのも、避けたいのです。 そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、 UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。 よろしくお願いします、
あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、
あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。
POIでいいじゃん。 がんばって移植すれ。
typedef vector<int> V; typedef V::iterator I; typedef vector<V> VV; VV vv; for_each( vv.begin(), vv.end(), tr1::bind( &fill<I,int>, tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1), tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1), 0)); g++ 4.1.2です。 2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、 こんな悲しいコードになってしまいます。 static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか? (省略できたとしても普通にループ書いたほうがわかりやすいけど)
>>852 ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?
>>856 バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。
夏カシス昔よくやった
>>855 g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。
>>851 WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。
861 :
デフォルトの名無しさん :2007/06/22(金) 13:26:29
0〜9の数字をランダムに発生させて 数字が被らないように どのような順番で数字が来たか表示させるという処理をしたいのですが このようなプログラムを作るにはどうすればいいのでしょうか 乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。 C++ なら random_shuffle って関数テンプレートがあるから、それ使う。 C なら自前で作るべし。 アルゴリズム悪いと確率が偏るから、 ランダムシャッフルで検索してアルゴリズム調べてちょ。
>>861 絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。
864 :
861 :2007/06/22(金) 13:35:54
,, ,,, ゙'lliiiiiiiiiiiiilllllllllllllllll|||li,, l||||l ゙゙゙゙゙ 、,,,,,,,ii!!"゙゙゙゙゙ 、,,,,,, 、,,,, |||| ,l||||" ゙゙'llli,, ゙l||! ,,l|||゙ ill,,,,,,,,,,,,,,,,,,,,,,,,,,,iiilllll,,, ||| ,,l|||! ゙゙゙゙゙ ,,,l||" ゙゙'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙ || ,il|l゙゙ ,,rlll" ,,,, ,,ill"゙ ,,,ril"゙ il||||l
力抜けよ
そう、もっと・・・力を抜いてごらん・・・。
5→6→4じゃね?
869 :
デフォルトの名無しさん :2007/06/22(金) 14:27:56
C++では変数の宣言をどこにでも置けると聞いたのですが、 goto文で変数の宣言を飛ばすことはできないのですか? 以下の文をコンパイルできません。 int main() { goto end; int a = 100; end: return 0; }
>>869 何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。
つまり、gotoで分岐する範囲では宣言できないということだ。
switch - case で、caseで宣言できないのと同じだな
最初に格納する数値を入力して、
以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
fgetsとstrtolを使うといけそうな気がするのですが
頑張ったものの自分ではどうにもならない状況ですorz
【実行画面】
個数を入力したください
>>5 5a11bbb7
88yew99
数値1:5
数値2:11
数値3:7
数値4:88
数値5:99
874 :
デフォルトの名無しさん :2007/06/22(金) 16:53:19
いままでCでは数値を文字列にするときは sprintf(str,"%d",num);のようにやってたのですが、 C++でstd::stringとsize_type size()等、STLを使う場合はどのように変換すればいいのでしょうか? std::string str1 = "ああああ"; std::string str2 = "長さ" + str1.size() + "です"; みたいに使いたいのですが、これはエラーがでます。
boost::lexical_castなどはどうだろう
876 :
874 :2007/06/22(金) 17:10:29
>>875 おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。
>>873 一文字ずつアスキーコードで比較して行けばいいのでは?
>>873 宿題なら宿題スレ行きを薦めるが、とりあえずこんな感じで出来る。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int i, c, nc, *nv;
printf("個数を入力してください>>");
if (scanf("%d", &nc) != 1 || nc <= 0) return 1;
nv = malloc(nc * sizeof(int));
for (i = 0; i < nc && (c = getchar()) != EOF; ) {
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &nv[i++]);
}
}
nc = i;
for (i = 0; i < nc; i++)
printf("数値%d:%d\n", i+1, nv[i]);
free(nv);
return 0;
}
>>877 このスレを最初から読んでいたらscanf処理のことが書いてあって、
代わりにfgets+strtolということが書いてあったので
この処理を弄くって上に書いたような処理がOKになったら
使いやすくなりそうだと思ったのですが
やはりこの仕様にするとそれが早いかもですね…。
>>878 宿題では無くちょっとこのスレを読んでいて気になったので考えていました。
しかし書いてくださりありがとうございます。
いくつか知らない関数があるのでググって見てみます。
ちなみにfgetsとstrtolで12a23から12と23を取りたかったら
strtol(str,&error[i],0);
strtol(&error[i]+1,&error[i+1],0);
こんな感じでずらしていく感じにするのでしょうか?
>>879 こんなかんじ。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char buff[0x1000], *p, *q;
unsigned char c;
while (fgets(buff, sizeof buff, stdin)) {
for (p = buff; c = *p++; ) {
if (isdigit(c)) {
printf("%ld\n", strtol(p-1, &q, 10));
p = q;
}
}
}
return 0;
}
>>880 おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!
突然すみません。質問させていただきます 自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。 そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました すると、いくつもファイルがあり、ひとつではありませんでした。 教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか? 分がわかりにくかったらすみません。教えていただけたら幸いです。
分割コンパイルで検索
解凍したディレクトリで、./configure か、counfigure.bat したあと、make か nmake
885 :
たろう :2007/06/22(金) 21:41:10
曖昧さについて質問があります。 現在、ある処理をできるだけ小さいプログラムで記述する競争をしてまして、 以下のような記述か可能かどうか教えてください。 ●質問1 ----- int a = 0; int b[] = {a++, a++, a++}; ----- と記述した場合、 b = {0, 1, 2} となるのでしょうか? それともコンパイラ依存でしょうか? コンマ演算子は左から行う結合ルールですが、 この場合は演算子じゃないので、 明確なルールはなく、コンパイラ依存でしょうか? ●質問2 func1 があるクラスのポインターを返す関数であるとして、 ----- int a = 0; func1(a++)->func2(a++); ----- と記述した場合、 func1(0)->func2(1) となるのでしょうか? それともコンパイラ依存でしょうか? func1(0) を実行してからでないと、func2 が決定しないので、 なんとなくその中の引数の評価が後のような気がしますが。
886 :
じろう :2007/06/22(金) 22:12:25
やあ、たろう この勝負は俺がもらった 約束通りお婆ちゃんの貞操は頂いて逝くぜ
int a = 0; int b[] = {a++, a++, a++}; ----- int b[] = {0, 1, 2};の方がよほど短いわけだが。 ----- int a = 0; func1(a++)->func2(a++); ----- 同様にfunc1(0)->func2(1);ではいけないのだろうか。 まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。
>>880 sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?
>>889 別にカッコつけなくても生きていけるんです
891 :
デフォルトの名無しさん :2007/06/22(金) 23:46:17
sizeofというのは「関数」じゃない。 だから、sizeof(buf)のbufは、関数の「引数」じゃない。 関数じゃないから、括弧は「関数呼び出し演算子」ではない。 sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。 「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。
892 :
889 :2007/06/23(土) 00:11:33
ありがとうございます。付けなくてもいいんですね。 なのに()付きのサンプルコードが多いのは何故なんでしょうか?
>>892 型のサイズを知るには、sizeof(int)のように括弧が必要。
それに倣って、括弧をつける人が多数。
894 :
889 :2007/06/23(土) 00:19:49
なるほど、そういうことだったんですね。 ありがとうございました。
括弧つけても優先順位に全く影響与えないしな。 無駄だし勘違いする人も出るからと嫌う人もいるし、 括弧を付けた方が統一性が出ると付ける人もいる。 そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。
何でtypeidはカッコ必須なの?
typeidの場合はsizeofと違って対象が型だろうが値だろうが括弧が必要。 だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。
>887 >まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。 不定じゃなくて未定義でしょ。 鼻から悪魔がでてくるじょ
いや不定だろ
JISX3010 6.5式 (70)によれば、 「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」
せいぜい言葉遊び。 「未定義」だから、コンパイラにより「不定」になるんだろ。
903 :
デフォルトの名無しさん :2007/06/23(土) 14:44:39
C++とはちょっと違うのですが、適当なスレが見つからなかったので、すみませんが質問させてください。 VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を 外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか そもそもこいつが何者なのかがさっぱりわかりません。 マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが 外部プログラムの実行だけがどうしてもできません。 どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。
904 :
855 :2007/06/23(土) 21:13:36
>>859 遅くなってすみません。キャスト外せませんか…ありがとう。
俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、
でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。
906 :
855 :2007/06/23(土) 23:25:01
>>905 あ、ありがと。気づきませんでした。
&V::beginは関数ポインタの集合で、これをキャストなり代入なりする時に
型に合う関数ポインタが適当に選ばれるような感じでしょうか。
V::iterator (V::*b)() = &V::begin;
V::const_iterator (V::*cb)() const = &V::begin;
V::beginは前者、(const V)::beginは後者を選ぶようなルールがあれば話は早いと思うけど、残念。
文字列中の " を \" に変える関数ってコレで良いんですかね? std::basic_string<TCHAR>::iterator dquoteToESC(std::basic_string<TCHAR>& str) { typedef std::basic_string<TCHAR>::iterator iter; iter i = str.begin(); while ( i != str.end() ) { i = std::find(i, str.end(), _T('\"')); if ( i == str.end() ) break; i = str.insert(i, _T('\\')) +2; } return str.begin(); }
どうでもいいが関数名はEscDQuoteのほうがいいんじゃないの?
今では vector のメモリ上での連続性は保証されてますけど、 昔は少なくとも規格上では保証されていませんでした。 で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか? 実在しなければ、メモリ上での連続性を仮定したプログラムは 過去の処理系との互換性があるということで安心できるのですが。
俺は聞いたことがない 普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、 連続していなかった処理系なんてないと思って差し支えないはず
そうですか。安心しました。 d。
912 :
デフォルトの名無しさん :2007/06/24(日) 13:53:56
ifstreamへの書き込みについて質問させてください。 ifstream fin("test"); として、 char c; char s[100]; のとき、 (1) fin >> c; ===> 読み込みは一文字だけ。 (2) fin >> s; ===> 読み込みは一行全部。配列sのサイズを越えても。 という理解でいいでしょうか。 (実験したらそうなりました。)
普通は、fin.read(s, 100 )とかstd::getline( fin, str )とか使うけどね。
>>912 配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。
>.912 (1)についてはそのとおり (2)についてはちがう。 空白文字(スペース、タブ、改行等)を読み飛ばし、 次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。 scanfの%sと同じと思っておけばよい。
まあ、折角 istream 使ってるんなら、 char じゃなくて string 使った方が安全でいいね。
そもそも、なんでifstreamへの書き込みについての質問なのに読み込む話ばかりなんだ?
>>917 2行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。
>>919 なるほど。確かに。
ただ、仕様上 one-past-the-end の問題は無い、
と言ってる点がいまいち分からんのですが。
5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証)
あたりとは矛盾しないのですか?
>>920 !v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が
有効なことと 5.7p4 の
「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」
っていうルールから導き出せるから、特に vector について書くことは無い
ってことじゃないかな?
まぁ、そうだとしてもわかりにくいね。
なるほど・・・。確かに。
自動配線ツールをCで書こうと思ってるんですけど。 アルゴリズムはmazeをベースで。 書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか? アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。 サンプルなどがあればと思って質問させていただきました。
早速ダウンロードしました
ないのならないで結構です。
>>923 半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう
そして、そんなものが作れるなら…
>>927 そうなんですか。
イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。
ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html
プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、
中身を開けませんでした。
難しいようですね、お騒がせして申し訳ありませんでした。
930 :
ちんこ :2007/06/24(日) 19:27:46
こんなのコンパイルとおるんだな。
>>930 State::State(bool s[3][3]){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
a[i][j] = s[i][j];
}
}
}
ちなみに、マスの状態は、「○」「×」「どちらもおかれていない」の3通りあるから、boolではだめかと。
933 :
ちんこ :2007/06/24(日) 20:33:11
[akira@58x13x98x215 sanmoku]$ g++ test.cc
[akira@58x13x98x215 sanmoku]$ ./a.out
1 0 1
0 1 0
1 0 1
さんくるです。
>>932 では3通りを表現するのに一番適したデータ型はなんですか?
空 1 0 というつもりだったのですが。intだとメモリがでかくなる。
まぁ三目なら全検索してもうんこだけど。
幅検索型の三目並べゲームをclassを使って作るというのが目標です。
計画しているクラスは
Player
CPU
State
Queue(Stateを含みまくるキューのクラス)
Board(mainのクラスです)
とかです。オブジェクト指向的に考えて適切ですか?
うまい人ならどういうクラスを考えるんでしょうか。
934 :
ちんこ :2007/06/24(日) 20:35:34
これが出来たら9*9盤くらいで5目並べをしてみたいです。 最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。
>3通りを表現するのに一番適したデータ型はなんですか? boost::triboolってのがある これはtrue, false, indeterminateの3値を表現できる これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定 とでも使えばちょうど良いんじゃないかな
>>933 intでもメモリには大差なくね?
ってより、intのほうが高速になる可能性を秘めていると思うが・・・
あくまでも可能性だけど
937 :
ちんこ :2007/06/24(日) 20:53:33
>>935 不定か、なんか怪しいデータ型ですね。
>>936 intの方が高速になる理由は?
intって4byteですよね、boolがダメならcharかなと思っています
938 :
デフォルトの名無しさん :2007/06/24(日) 20:55:37
ちんこあほすぎでわろたw
ちょっとすれ違いですが、 eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?
>>939 あります。スレ違いなので詳細は割愛。
>>937 サイズが大きいから遅いとは簡単にはいえません。
まずは真っ当に作り上げることが先決でしょう。
>>937 そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。
って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。
ほとんどintの処理速度=charの処理速度だと思うが。
実際型のビット幅が決まってないのって弊害にしかならん気がする。
typedef int TRIBOOLとでも定義しておいて とりあえず組んでみたら? 出来てから速度とか使用メモリーを測定してそれから決めればいい
>>937 高速になる理由は>940-941のとおり。
charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。
1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。
ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに
配列として持つより設計を見直すほうがいいと思われる。
メモリアクセスの遅延により、メモリの節約自体が速度に効くだろうから やっぱり最終的に実測しないと決まらない。
945 :
ちんこ :2007/06/24(日) 21:21:39
うお、その話ならどっかで聞いたことがあったような。 じゃあintにしてみます。 9路盤で5目並べする時用にプログラムをあらかじめ N // 盤の大きさ M // これだけ並べば勝ちだぜぃな数 として組んだ方がいいですかね? しかしどうやればいいかはさっぱりなんですがね。 何しろゆとりなもんでwww
>>945 とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ
話はそれからだ
947 :
ちんこ :2007/06/24(日) 21:27:00
まじ難しい。
948 :
ちんこ :2007/06/24(日) 21:29:53
クラスの依存関係がイミフ
日記帳にでも書いてろ
あきらめろ
>>937 メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok
ちなみにC++ではbool型のサイズは環境によって違う
普通はintかcharになってるようなのでメモリの節約にはならない
でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから
まず動くもの作ってそれから考えるほうがいいよ
>>945 ちなみに、見た目簡単そうな5目並べだが、
まともな思考エンジン作れたら結構な額で売れる
昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw
953 :
ちんこ :2007/06/24(日) 21:58:57
Playerクラスとかいるか・・・? でもないとオブジェクト指向っぽくないよなぁ・・
>>953 お前には無理だ
せいぜい無駄な時間を浪費するがよい
くだらない質問だと思いますがお願いします。 STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか? Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。
std::copy
&vector_instance[0]ではいかんのか?
こんにちは
次期仕様のドラフトだと data 関数があるみたいだが、 今の所は &v[0] か &v.front() だな。
>>953 Player インタフェースクラスを作って、
PlayerCom と PlayerHuman クラスを派生して・・・
GameMaster クラスを用意して本物の盤面をいじれるのはそのクラスだけにして…
PlayerCom からも複数のクラスを派生して・・・
966 :
ちんこ :2007/06/25(月) 07:14:38
そんなにクラス作るのか。 PlayerからPlayerComとPlayerHumanを継承 PlayerComから複数はなんで? もしや思考パターンを変える為?
ちんこ死ね
968 :
ちんこ :2007/06/25(月) 07:36:38
初心者歓迎スレなのに・・・ クラスを使ったものとしてはC++かつGUI以外でははじめて もう何がなんだか分からんとです。 まずUML勉強した方がいいかな? 生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。
はいはいわろすわろす
○×ゲーム程度なら、まず非オブジェクト指向で作ってから 設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。
>>968 愚かな一貫性は小人物に憑いたお化けである
まあ、色々なパターンで作って、 それぞれのプログラムの性質を比較してみるのも勉強になるよね。
そろそろ次スレの季節だな。
定刻も、過ぎてることだしな
乙
VisualC++2005です。switch文で以下のように下にcaseが続くと変数の宣言と同時に初期化できません。 これは何故でしょうか? case 1: int i=1;//int i; i=1;ならOK break; case 2: break;
case 1 に飛んだ場合はいいけど、 case 2 に飛んだ場合は i が使えるのに 初期化の位置を飛ばしてしまう。 だから、そういうことはできないようになってる。 case 1: { int i = 1; } break; みたいにブロックで囲むといいよ。
979 :
977 :2007/06/25(月) 22:54:36
ありがとうございます。そのようにします。
980 :
デフォルトの名無しさん :2007/06/26(火) 21:11:34
>>978 横レスだが
なるほど
時間があれば言語仕様もきっちり読んでおけってことか
時間が無くても言語仕様は嫁
必須かよorz プログラム開発の面接を受けた感触として ひょっとしたら読まなきゃかもなーとは思ってたが
必要があれば読みたくなるだろうからそれまでは別に無理して読まなくて良いよ 経験があってこそ初めて理解できるような部分もあるし
985 :
デフォルトの名無しさん :2007/06/26(火) 23:52:05
C++で一時オブジェクトを関数に渡す時に値渡しするしかないんですか? boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが 右辺値を参照で渡せるような何か良い手段ありますか?
constのことかーーーーーー?
あああ、const参照にはこういう使い方もあったんでうsね どうもです
亀だが
charとかshortは演算途中で内部的にintに無理矢理キャストされることがある
理由は
>>941 の通り
だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い
>>988 「ことがある」じゃなくて、その動作が標準として規定されている。
ちなみに
windows.hのBOOL型は実際はlongのtypedefで TRUE = 1, FALSE = 0
Cだと_Bool型で
_Bool型は符号なし型として扱われる
_Bool型には signed, unsigned はつけられない
_Bool型は 0 と 1 を格納できれば十分なサイズ
_Boolに変換するときその値が0なら0、それ以外は 1
_Bool型はどの標準整数型ランクよりも小さい
ビットフィールドに無修飾版の _Bool をおける
引用(
ttp://seclan.dll.jp/c99d/c99d05.htm )
sdk\include>grep typedef.*BOOL WinDef.h File WinDef.h: typedef int BOOL;
今更だけど、C/C++とC99は別物だと思う。
「演算途中で」となるとまあ sizeof くらいなのかな? あ、いや、キャストもか。
>>992 MSのやつはバージョンによって違うらしいぞ
999 :
デフォルトの名無しさん :2007/06/27(水) 14:45:41
1000ゲトー
。 + 『1 0 0 0 G E T ぃ ゃ っ ほ ぉ ぉ ぉ ぅ ー !』 * 。 . . * . * + 。 。 + __ _ /ヾ_/ヽ 旦 f ミv'´{ごづヾ彡 , '´⌒'v'ヾ '´ ̄`ヽ * 。 ゙i´!(((从 从リ ! ifi」liリ゙l i!卯、 (((/从从 i !○(l ^ヮ゚ノ!| i * |i、゚ヮ^ |!)○゙ 。 从゚- ゚ ||○ * ノノ ヽ)本iO ヾ Oi本(~/ヽ OL介_(ノ . + ガタン||| ((´ く/_i_iヾ )) ||| /i_i_ヾ> ) )) ||| + /_|_|ヾ> |||ガタン +  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ロ リ 最 強 ! 華 麗 な 1 0 0 0 に 超 感 動 !
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。