スレを勃てるまでもないC/C++の質問はここで 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/09/17(水) 15:41:48過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
0425デフォルトの名無しさん
2008/11/30(日) 20:00:51> if(0<argv[1]<32){
・折角数値に変換したのに、元の文字列と比較してどーする
・C/C++では a<b<c という条件式は
文法上は書けるが、見た目とは相反する動きになるから
a<b && b<c と書くべき
(普通の処理系なら a<b は成り立てば1、成り立たなければ0
a<b<cは、(1か0)<c という式として翻訳されてしまう)
0426デフォルトの名無しさん
2008/11/30(日) 20:07:39ユーザーがランダムな順番で入力した四角形の4つの頂点座標のCPoint型(x,y座標を保持)の変数の中から
四角形の左上の頂点がどれかを判定したいのですが
うまい方法が思いつきません。
1番左 かつ 1番の上の座標を求めれば良いだけジャン…と思っていたんですが
//CPoint cp0, cp1, cp2, cp3には既にx,y座標が代入済みとする
//四角形の左上座標がどれか4つの中からを決める
CPoint tmp;
tmp = cp0;
if ( tmp.x >= cp1.x ) if ( tmp.y >= cp1.y ) tmp = cp1;
if ( tmp.x >= cp2.x ) if ( tmp.y >= cp2.y ) tmp = cp2;
if ( tmp.x >= cp3.x ) if ( tmp.y >= cp3.y ) tmp = cp3;
return tmp;//左上座標を返す
長方形だとこれで問題なさそうなんですが、例えば極端に歪んだ平行四辺形とかだと
左から2〜3番目の頂点が左上頂点だったり(例:上底、下底が水平で下底が思い切り左に寄っている)
上から2〜3番目の頂点が左上頂点だったり(例:右辺、左辺が垂直で右辺が思い切り上に寄っている)
等のケースに対応できません。
0427デフォルトの名無しさん
2008/11/30(日) 20:33:50左上って定義が曖昧すぎないか?
全てのパターンを分ける以外方法無いと思う
0428デフォルトの名無しさん
2008/11/30(日) 20:43:23_
/ \
 ̄ ̄ ̄
「左上」自体の定義によっては一番左の点が左上かも知らん。
0429426
2008/11/30(日) 21:40:33うーん。人間にとっては迷うことなく一意に決められそうですけど
いざ言語化して厳密に定義するとなると難しいですね…
>>428の図をみて思ったのですが
◇(菱形)みたいな形だとどれが左上か厳密に決められないので
「上底下底が水平 or 右辺左辺が垂直な四角形(台形)に限定する」
とすると決まりそうですね。
「その頂点のx座標より右側にx座標があればひとつにつき1点ずつ、
その頂点のy座標より下側にy座標があればひとつにつき1点ずつ
の評価点を加点し、最も高い評価点の頂点を左上の頂点とする 」
>>428の台形だと
上底の左側の頂点:右2点、下2点、計4点
上底の右側の頂点:右1点、下2点、計3点
下底の左側の頂点:右3点、下0点、計3点
下底の右側の頂点:右0点、下0点、計0点
で「上底の左側の頂点」が左上
あ、なんとか行けそうです。有難うございます。
たぶん漏れるケースはないかと…
0430デフォルトの名無しさん
2008/11/30(日) 23:43:170431426
2008/12/01(月) 00:21:314つの座標の入力順が狂っていても治す必要があったので
実際には右上と右下と左下も決めます。
0432デフォルトの名無しさん
2008/12/01(月) 00:23:330433デフォルトの名無しさん
2008/12/01(月) 00:27:20list<foo, bar>::iterator it = xmap.begin();
while (it != xmap.end()) {
if (it->finished()) {
it = xmap.erase(it);
} else {
++it;
}
}
とかやりますが、イテレータを返さない、たとえば map
とかで
for (map<foo, bar>::iterator it = xmap.begin(); it != xmap.end(); ++it) {
if (it->second.finished()) {
xmap.erase(it);
}
}
みたいなのは大丈夫なんでしょうか?
0434デフォルトの名無しさん
2008/12/01(月) 01:54:02今回の場合は、一番上だが一番左じゃないケース、一番左だが一番上じゃないケースに対応する必要があったんじゃないかね。
0435デフォルトの名無しさん
2008/12/01(月) 01:55:17それならもう入力段階で弾くか正す方が早いかと
0436デフォルトの名無しさん
2008/12/01(月) 02:11:50いやだから、一番上を優先して、一番上なら一番左じゃなくてもいいことにすればいいんじゃないかってこと。
少なくとも私なら、そうする。それなら、上下が等しい場合のみ左右をチェックすればいいから効率もいい。
0437デフォルトの名無しさん
2008/12/01(月) 02:19:24/ /
\ /
\/
上底の左側の頂点:右2点、下2点、計4点
上底の右側の頂点:右0点、下2点、計2点
左の頂点:右3点、下1点、計4点
下の頂点:右1点、下0点、計1点
0438デフォルトの名無しさん
2008/12/01(月) 02:25:39四辺がねじれないように描画したいとか?
0439デフォルトの名無しさん
2008/12/01(月) 02:26:45ああ、一番上でも一番左でもないケースがあるわ。
でも見た目的には左上に見える。
/|
/ |
 ̄ ̄
こんなのとか。
こんな図形絶対データに入らねーよ!とかなら構わんけど、
俺はあんたの作りだとすげー気持ち悪い感じがする。
対応漏れが意図的で、かつ仕様として問題ないんなら良いんだけどね。
0441デフォルトの名無しさん
2008/12/01(月) 04:40:09今回の質問は、四角形の各頂点座標から
(菱形みたいな明らかに決定不能な場合を除いて)
左上、右上、左下、右下をそれぞれ決定したいってことだろ。
例えば一番上が右上の場合、それが左上として認識されてはいけないのでは?
0442426
2008/12/01(月) 06:10:59え〜と。入力段階で弾くために判定をしています。
>>437
>>439
>>429で取り敢えず決めた「上底下底が水平 or 右辺左辺が垂直な四角形(台形)に限定する」
に反するのでその形状はご勘弁を…
>>436
それだと極端に歪んだ平行四辺形(例:右辺、左辺が垂直で右辺が思い切り上に寄っている)
/|
| |
|/
に対応できないもので…
ただ、「そもそも左上を厳密に決めない」という手も確かにありますね…
本当の最終的な目的は
「ユーザーが適当な順番で入力した座標4点の四角形の範囲を
1ピクセルずつ拾って画像処理をするための座標を計算したい」
ですので必ずしも左上を厳密に決めなくてもなんとか計算できるかもしれません。
(パッと今は思いつきませんが)
0443デフォルトの名無しさん
2008/12/01(月) 09:08:20ブーメランみたいな凹図形だと厳しいな。
0444デフォルトの名無しさん
2008/12/01(月) 09:50:42上を優先して次に左を優先じゃね?画像処理したことないからよく分からんけど。
0445デフォルトの名無しさん
2008/12/01(月) 11:06:430446デフォルトの名無しさん
2008/12/01(月) 12:15:270447デフォルトの名無しさん
2008/12/01(月) 13:14:13touzen
0448デフォルトの名無しさん
2008/12/01(月) 18:06:580449デフォルトの名無しさん
2008/12/02(火) 01:06:09439にも対応できるぞ
0450デフォルトの名無しさん
2008/12/02(火) 01:11:010451デフォルトの名無しさん
2008/12/02(火) 01:13:26>>439をひたすら縦に引き伸ばしてから同じことを考えるんだ
明らかに右上の座標のx+yのほうが小さくなる
0453デフォルトの名無しさん
2008/12/02(火) 14:47:45(0,0)と(0,1)のどちらが左上だ?
凹四角形の扱いはどうするのだ?
0454デフォルトの名無しさん
2008/12/02(火) 15:15:12>>429
0455デフォルトの名無しさん
2008/12/02(火) 17:33:01int b[100];
bの[0~99]までの全内容を a[0~99]にfor文とかmemcpyやmemmoveとか使わないで
代入する方法なんてありますか・・・?
0456デフォルトの名無しさん
2008/12/02(火) 17:39:07a[0]=b[0];
a[1]=b[1];
a[2]=b[2];
・
・
・
a[99]=b[99];
0457デフォルトの名無しさん
2008/12/02(火) 17:49:01やはりないかぁ・・・
0458デフォルトの名無しさん
2008/12/02(火) 18:04:11struct array_of_int_100 {
int array[100];
};
int a[100];
int b[100];
*(struct array_of_int_100*)a = *(struct array_of_int_100*)b;
0459デフォルトの名無しさん
2008/12/02(火) 18:09:590460デフォルトの名無しさん
2008/12/02(火) 18:21:47a = b;
0461デフォルトの名無しさん
2008/12/02(火) 18:44:570462デフォルトの名無しさん
2008/12/02(火) 19:20:46バイナリデータからバイナリ列をサーチする関数、STLないですか?
0463デフォルトの名無しさん
2008/12/02(火) 19:23:280464デフォルトの名無しさん
2008/12/02(火) 19:32:15list<int> list[M][N];
みたいな2次元配列って出来るんですか?
0465デフォルトの名無しさん
2008/12/02(火) 20:22:08できるよ
0466デフォルトの名無しさん
2008/12/02(火) 20:55:07質問があるのでどうか答えてほしい。
C++とVB.NETで両方ともオブジェクト指向でわけわからんになってしまった経験があるのだが。オブジェクト指向って本当に必要なんですか?
コンピューターの世界で無理やり知らなければならないような方向に誘導されてるような気がするのですが。
オブジェクト指向は効率的なプログラムを組むために必要だとか利便性を説いてるが、かえって複雑になって習得が難しくなってる気がする。
Windows上でツールを作ることを目的としてプログラミング言語を2,3勉強したが。身についたのはC言語だけ。
もうこうなったらオブジェクト指向はさっぱりあきらめてC言語だけで行こうかと思ってるのですけど。
C言語でアプリやツール、ゲームをつくる需要は今後も残るのでしょうか?
0467デフォルトの名無しさん
2008/12/02(火) 21:06:00俺は詳しいとはいわんが、C の需要は残ると思う。ただ、アプリ、ゲームを
チームで全てCで作ることはあまり無くなるだろう。一人で作るなら勝手に。
ドライバとか低レベル(悪い意味で無くて)のものはCで残るものがあるはず。
ただ、オブジェクト指向使えた方が楽だと思うんだけどなぁ…
(C→C++,Java と来た人だけど)
他の人の意見も見てみたい
0468デフォルトの名無しさん
2008/12/02(火) 21:12:54今ではすっかりC++に馴染んでオブジェクト指向じゃないと面倒だと感じるようになりました^q^
>>467の言う通り完全に需要がなくなることは当分無いと思う(実際COBOLとか未だに需要あるし)けど、
やっぱり自分一人という範囲に限らないならオブジェクト指向の知識は必要だと思う。
ライブラリの類もオブジェクト指向前提のものは多いしね。
0469デフォルトの名無しさん
2008/12/02(火) 21:20:11みんながむやみやたらと唱えるバズワードと化してしまったのがだいぶ前から。
あと、Cで書かれたプログラムだってオブジェクト指向的な部分はいくらでも指摘できる。
もちろん、Cはオブジェクト指向プログラミング言語ではないし、
そこで書かれたプログラムにも、オブジェクト指向プログラミングでよく見かける特徴は
あまり見出せないけど。
0470デフォルトの名無しさん
2008/12/02(火) 21:23:52気持ちはすごいわかる。
自分もそんなに分かってるわけじゃないけど、世間のオブジェクト指向って
それっぽい文法を採用してるよ、ってぐらいなので、そんな気にすることはないと思う。
言語体系が複雑になっているのは、汎用性とのトレードオフじゃないかね。
C言語のコアはシンプルだけど、何かするなら結局OSのAPIとか使わないとならない。
Javaみたいにそれ全部仕様に含んじゃうと、当然仕様は膨らんじゃう。
仕事でチーム作業の場合 C++で統一するってのは仕方ないだろうね
でも自分は C で作ってる。必要最小限のコードで済ませられるし、
プログラムとかプロセスのレベルでシステムを設計すれば、実際のところ
言語はなんでもいいしね。
0471デフォルトの名無しさん
2008/12/02(火) 21:23:55そのうち慣れるって。
慣れたらもう戻れないけどね。いや、戻れるけど
クラス無いのきびしーって思うようになるよ。
関数やローカル変数なかったらきびしーなんてもんじゃないけど。
そういえばCOBOLには無いんだっけw
0472デフォルトの名無しさん
2008/12/02(火) 21:26:04ご回答ありがとう。
C++とVB.NETと一通り勉強したけど、自分でオブジェクト指向でプログラムつくれなくて挫折したわ。
これを理解できるのはかなり頭のいい人だろうね。
趣味でプログラミングをやってるので、チームワークの必要なことはしないし知ってるのは唯一自分でコードが書けたC言語だけでいいかなとも思った。
ところで質問をもうひとつしますが。
ウェブブラウザのFirefoxってフリーでソースが公開されてるけど、
ビルドするのにGCCを用いる様だけど、これってC言語でできてるのでしょうか?
0473デフォルトの名無しさん
2008/12/02(火) 21:30:56オブジェクト指向で何がしたいのか分かると思う
0474デフォルトの名無しさん
2008/12/02(火) 21:33:21確かに色々と覚えることがあって回りくどくて面倒なんで
うんざりするほどその気持ちはわかる。
自分もそう思っていたんで。
でも、とりあえずクラス化したら楽だと思うんだ。
慣れないうちは全部publicなメンバでも良いと思う。
関数名とか変数名とかdrawとかxみたいに短くても楽に管理できるし。
それだけでも重宝するかと。
0475デフォルトの名無しさん
2008/12/02(火) 21:59:58なんだか知らないけれど新たにがんばってみようと言う気になったわ。
ありがとうよ。
0476デフォルトの名無しさん
2008/12/02(火) 23:33:31だけで大分便利。ついでに自分で template 書けるようになると
もっと便利。そんなことしてるうちに自然と OOP。
0477デフォルトの名無しさん
2008/12/03(水) 02:46:39ファイル処理関連はどの言語もOOPみたいなもんだ
単に語順と追加機能の有無だけ
0478デフォルトの名無しさん
2008/12/04(木) 17:38:38左上に「ファイル」、右上に最小化最大化閉じる、といったものがある普通のアプリの段階にはいつ入るものなのでしょうか?
あるいはこういった骨格みたいなの?は入門書的にはなんという項目から始まるものなのでしょうか
0479デフォルトの名無しさん
2008/12/04(木) 17:54:24入門書は普通、CやC++の基礎部分を解説するもの
ウィンドウシステムは応用部分にあたるので
入門書ではあまり語られない
一通り入門書を触ったら、Visual C++ Express 辺りを落として
インスコした Visual C++ をテキトーに弄ったり
Windowsプログラミングの書籍を読んで勉強するヨロシ
0480デフォルトの名無しさん
2008/12/04(木) 18:17:54http://homepage2.nifty.com/c_lang/index_sdk.html
0481デフォルトの名無しさん
2008/12/04(木) 18:19:18ある程度共通項が多い上扱いやすい stdio に対して
ウィンドウシステムの扱いは各環境でバラバラ。
そしてその多くはそれだけで本が1〜数冊書ける複雑さ。
直接扱うのは複雑だからと、簡単に扱うためのライブラリもある。
(WindowsならMFCや.net、LinuxならTkやGTKやQtなど)
それから、色んな環境で扱えるように作られたライブラリもある。
(wxWidgetとか。.netやTkも一応互換環境がありこっちにも分類可能)
環境も手段も多様で、総てを統括するのは困難。
0482デフォルトの名無しさん
2008/12/04(木) 18:32:53ありがとう、また文字を表示する作業から勉強しなおしてきます
0483デフォルトの名無しさん
2008/12/05(金) 09:10:330484デフォルトの名無しさん
2008/12/05(金) 09:34:160485デフォルトの名無しさん
2008/12/05(金) 09:38:400486デフォルトの名無しさん
2008/12/05(金) 11:47:410487デフォルトの名無しさん
2008/12/06(土) 10:25:010488デフォルトの名無しさん
2008/12/06(土) 10:27:230489デフォルトの名無しさん
2008/12/07(日) 10:30:310490デフォルトの名無しさん
2008/12/07(日) 10:47:51アクセスできなくて困ることはあるが。
0491デフォルトの名無しさん
2008/12/07(日) 17:10:34int v(char *c){int i;sscanf(c,"%4d",&i);return htons(i);}
この関数をもっと短くする方法あるかな?
Code Golfの感じで。
引数のcharポインタは"YYYYMMDD"といった数字文字列の領域を指してると思いねぇ。
0492デフォルトの名無しさん
2008/12/07(日) 17:32:09七行スレのログ読めば短くするノウハウが沢山あると思う
0493デフォルトの名無しさん
2008/12/07(日) 18:38:38先頭のintを省く
0494デフォルトの名無しさん
2008/12/07(日) 23:11:370495デフォルトの名無しさん
2008/12/08(月) 08:24:270496デフォルトの名無しさん
2008/12/08(月) 11:20:15いいえ
0497デフォルトの名無しさん
2008/12/08(月) 11:47:46↑を見てインターフェースクラスというものを知ったのですが
インターフェースクラスをスーパークラスとして実装を行った場合、
特定のサブクラスのみが持つようなメンバ関数にアクセスすることができないと思いました。
このサイトに書いてあるインターフェースクラスというものが間違いなのか、
それとも私の理解がぜんぜん足りていないのでしょうか。
どこが間違っているか、どこが理解不足かの指摘をお願いします。
0498デフォルトの名無しさん
2008/12/08(月) 11:51:55型キャストすれば特定のサブクラスのみが持つようなメンバ関数にアクセスすることができる。
reinterpret_castだったかな?
0499デフォルトの名無しさん
2008/12/08(月) 11:54:55特定のサブクラスのみが持つ特殊なメンバ関数などには興味がないはずである
0500デフォルトの名無しさん
2008/12/08(月) 11:55:17>>497のサイトでCExample3という、IExampleを継承したクラスを追加するとして、
IExampleがもしMethod2()というメンバ関数を持っていたら、
大幅な修正を加えないとMethod2を呼ぶことができないように思います。
理解が足りないのでしょうか…
C++は難しいです
0501デフォルトの名無しさん
2008/12/08(月) 11:57:34>>498
レスをありがとうございます。
スーパークラスからサブクラスへのキャストはあまりよろしくないと聞きました。
実際は使っても良いものなのでしょうか。
それとももっと別の書き方をするのでしょうか。
>>499
レスをありがとうございます。
ということは、特殊なメンバ関数を使いたい場合には、
やはりどういったクラスがあるかを確認して、
そのクラスの型を持つポインタを用意する必要があるということでしょうか。
0502デフォルトの名無しさん
2008/12/08(月) 11:58:370503デフォルトの名無しさん
2008/12/08(月) 11:59:21partition(b,e,p)を定義しろってのがあったんだけどだれかおしえてくだしあ><
0504デフォルトの名無しさん
2008/12/08(月) 12:00:59頭の回転が遅いので、これをヒントにもっと考えてみます。ありがとうございます。
0505デフォルトの名無しさん
2008/12/08(月) 12:03:45Javaを学ぶと良い。言語仕様にInterfaceを含んでいる。
0506デフォルトの名無しさん
2008/12/08(月) 12:04:01特定のサブクラス固有の特殊なメンバ関数を使いたいというのは、
すべてのクラスを共通のインタフェイスで扱いたいという趣旨に反している
設計がどこかおかしい
0507デフォルトの名無しさん
2008/12/08(月) 12:42:56template<class T>void copy(T * b, T * e, T * d) {for (; b != e; ++b, ++d) *d = *b;}
他は仕様が余りに曖昧なのでパス。
0508デフォルトの名無しさん
2008/12/08(月) 12:50:36template<typename FI, typename PRED>FI partition(FI b, FI e, PRED p)
{
if (b == e) return b;
while (p(* b)) if (++b == e) return b;
FI n = b;
while (++n != e) if (p(* n)) swap(* ++b, * n);
return b;
}
0509デフォルトの名無しさん
2008/12/08(月) 14:05:260510デフォルトの名無しさん
2008/12/08(月) 14:11:070511デフォルトの名無しさん
2008/12/08(月) 14:11:410512デフォルトの名無しさん
2008/12/08(月) 14:23:05でもなんか動作がほんの少しちがうようだ。原因は不明
0513デフォルトの名無しさん
2008/12/08(月) 14:27:01つーか、>508ってSTLの実装じゃないの?w
0514デフォルトの名無しさん
2008/12/08(月) 14:33:51ここで「unused parameter 'parent'」のWarningが出てしまいます。
コンパイラを変える
コンパイラオプションを変える
#pragmaで抑制する
以外の簡単な解決法があれば教えてください。
0515デフォルトの名無しさん
2008/12/08(月) 14:39:340516デフォルトの名無しさん
2008/12/08(月) 14:48:54�d
なんで気付かなかったんだろ
0517デフォルトの名無しさん
2008/12/08(月) 14:51:060518デフォルトの名無しさん
2008/12/08(月) 21:46:41class CHoge
{
const int path; // ここでのconstがエラー?
public:
CHoge();
void Show();
};
CHoge::CHoge(){ path = 1024; }
void CHoge::Show(){ printf( "%d\n", path ); }
void main()
{
CHoge hoge;
hoge.Show();
}
上記のソースでコンパイルするのですが
error C2758: 'path' : オブジェクト コンストラクタの初期化リストで初期化されませんでした。
とコンパイルエラーがでます
const int path を int path にするとコンパイルは通るのですが、
pathをconstにして変更不可にしたい場合どのような手段があるのでしょうか?
0519デフォルトの名無しさん
2008/12/08(月) 21:53:52↓
CHoge::CHoge() : path(1024){}
constなんだから代入できるわけ無いだろカス
0520デフォルトの名無しさん
2008/12/08(月) 22:10:07ではどうしろと?
0521デフォルトの名無しさん
2008/12/08(月) 22:14:110522デフォルトの名無しさん
2008/12/08(月) 22:17:27参考書にはその書式載ってなかったんだ
ありがとう
0523デフォルトの名無しさん
2008/12/08(月) 22:30:52class CHoge
{
const int path
public:
CHoge();
void Show();
};
CHoge::CHoge() : path(1024){}
void CHoge::Show(){
char lo[path]; // ここでエラー
printf( "%d\n", path ); // ここはOK
}
void main()
{
CHoge hoge;
hoge.Show();
}
う〜ん
error C2057: 定数式が必要です。
error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
error C2133: 'lo' : サイズが不明です。
とエラーがでるんですが、#define の変わりにはならないんでしょうか?
0524デフォルトの名無しさん
2008/12/08(月) 22:34:22CHoge::pathとかいろんな言語でありがちな書き方だと思うけど
■ このスレッドは過去ログ倉庫に格納されています