スレを勃てるまでもないC/C++の質問はここで 10at TECH
スレを勃てるまでもないC/C++の質問はここで 10 - 暇つぶし2ch490:デフォルトの名無しさん
09/05/31 20:58:48
既存のDOS EXEって何よ?

491:デフォルトの名無しさん
09/05/31 21:14:14
>>489
USBカメラがそうなっているかは分からんが、TWAINという共通化インターフェースがある

492:デフォルトの名無しさん
09/05/31 21:19:51
カプセル化という物を勉強したのですが、一度しか使わない計算でも
関数を定義して別ファイルに値を渡し、戻り値をmainに渡すようにしたほうがよいのでしょうか?


493:デフォルトの名無しさん
09/05/31 21:22:02
ありがとうございます。TWAIN初めてききました
直接カメラのドライバをたたいてるのかと思ってたけど、こんな便利なのがあったんですね

494:デフォルトの名無しさん
09/05/31 21:34:23
>>492
必要に従いカプセル化する。何でもかんでもカプセルにして密閉化すると。
オブジェクト指向原理主義者になるw

495:デフォルトの名無しさん
09/05/31 21:39:04
>>492
突き詰めると決着が付かないような議題
個人的にはほんの数行(最大4行ぐらい)で、そこでしか計算しないんだったら埋め込む
ただ
>関数を定義して別ファイルに値を渡し、戻り値をmainに渡す
が何を言ってるのかがわからなくて心配

496:デフォルトの名無しさん
09/05/31 21:51:10
>>492
それはカプセル化というよりはリファクタリングに関係してるように思う
俺の場合、ある処理を2回行うようになった時点で関数化する
逆に1回しか使う場所がないのに無駄に抽象化した関数は定義しないようにしている
C++の抽象化能力では、これは常に出来ないのは若干悩みの種

カプセル化は、ライブラリのように
他人もそのコードを使うケースで意識すればよいと思う

497:デフォルトの名無しさん
09/05/31 21:54:50
>>477
出力ファイル名にCONを指定して標準出力へ出せるようにならない?
それで動くなら、あとはリダイレクトできるでしょ。

498:デフォルトの名無しさん
09/05/31 22:01:18
>>494-496
ありがとうございます
一人だから問題ないのですが、逆に指摘してくれる人がいないのが難点です


499:デフォルトの名無しさん
09/06/01 00:08:32
スタイルの問題で答えはないと思うけど、マクロってインデントするべきかな?

#ifndef CLASS
 namespace Name
 {
  class Class
  {
  public:
   foo bar();
   #ifdef _DEBUG
    hoge fuga();
   #endif
  }
 }
#endif

#ifndef CLASS
namespace Name
{
 class Class
 {
 public:
  foo bar();
#ifdef _DEBUG
  hoge fuga();
#endif
 }
}
#endif

悩む・・・

500:デフォルトの名無しさん
09/06/01 00:26:03
#ifndef CLASS
なんたらかんたら
# ifdef _DEBUG
なんたらかんたら
# endif /* _DEBUG */
なんたらかんたら
#endif /* CLASS */
とやるのが普通かな。

プリプロセッサディレクティブは、行の先頭を#で始めなければならない。
規格のどのセクションだったかもう覚えてないけど。

フリーソフトウェアのソースを読んで勉強したら良いかもしれない。

501:デフォルトの名無しさん
09/06/01 00:53:26
そう?
手元のANSI C言語辞典には#の前に空白類があってもよいと書いてあるけど。
もちろんそんな書き方誰もしないということは同意だ。

502:デフォルトの名無しさん
09/06/01 00:59:31
#if foo
 #if bar
  #include <momo.h>
 #else
  #include <taro.h>
 #endif
#endif

のような例はよくみかける。 

503:デフォルトの名無しさん
09/06/01 01:25:41
自分は普段はこう書くな。

#if foo
# if bar
# include <momo.h>
# else
# include <taro.h>
# endif
#endif

行頭に#があったほうが見た目わかりやすいと思う。




504:503
09/06/01 01:27:01
#if foo
# if bar
#  include <momo.h>
# else
#  include <taro.h>
# endif
#endif

こうな。


505:デフォルトの名無しさん
09/06/01 01:36:32
Windows98のメモ帳でのプログラムの実行の仕方を教えて下さい
因みに入力したのはC言語のprintf何たらの簡単なプログラムです


506:デフォルトの名無しさん
09/06/01 01:41:44
書いたコードをここに貼り付けて、右下のボタンを押せ。
URLリンク(codepad.org)


507:デフォルトの名無しさん
09/06/01 05:53:03
>>502
俺もそう書くわ。
特に多いのが
#ifndef __BORLANDC__
 高度な処理;
#else
 低度な処理;
#endif
みたいにコンパイラで処理を分けたりとか、あとはデバッグの時かな。


508:デフォルトの名無しさん
09/06/01 06:27:58
1.下の多重ループで「A」は何行何列に表示されるか.
for(j=1;j<=2;j++) {
for(k=1;k<=3;k++) {
printf("A");
}
printf("\n");
  }
2.下の多重ループで「A」は何行何列に表示されるか.
for(j=1;j<=5;j++) {
for(k=1;k<=4;k++) printf("A");
printf("\n");
  }

1は2行3列で2は4行5列ですか?


509:デフォルトの名無しさん
09/06/01 07:30:16
>>506
すみません
ネットに繋げてないのでメモ帳での方法を教えて下さい

510:デフォルトの名無しさん
09/06/01 10:56:47
>509
別にメモ帳だろうが何だろうが、Cのプログラムには関係ないよ。
もちろん効率とかは違うだろうけど。

511:デフォルトの名無しさん
09/06/01 11:32:44
>>509
エスパーすると、コンパイラの使い方がわからないんだろう
そもそも509はC言語のコンパイラを持っているのか?
例えばVC,BCC,GCCなど。

512:デフォルトの名無しさん
09/06/01 12:13:08
持ってないだろうねえ。でも、
最初の一歩も自分で踏み出せない奴を
どうにか歩かせたところで無駄じゃね?

513:デフォルトの名無しさん
09/06/01 13:27:29
最小2乗法によるm次の多項式近似を行うプログラムを教えてください
教えて

xがー2の時yが3.02
-1の時0.98
0の時1.22
1の時2.16
2の時2.61         の時のです
出来ればソース全文書いてください




514:デフォルトの名無しさん
09/06/01 14:16:58
>出来ればソース全文書いてください
>出来ればソース全文書いてください
>出来ればソース全文書いてください

515:デフォルトの名無しさん
09/06/01 14:20:25
>>513
マルチすんなカス

516:デフォルトの名無しさん
09/06/01 16:18:56
符号なしenumがほしいんですが、なにか代替案はありますかね?今は
typedef const unsigned long uenum_t;
uenum_t foo = 0, bar = 1, hoge = 2 ・・・;
みたいに地道に書いて我慢してるんですが
省略記法が使えなくてめんどいし、メモリももったいない気がします

517:デフォルトの名無しさん
09/06/01 17:25:11
半角テキストファイルを読み込んで使用する場合
空白文字も含めて一つの変数orクラスに格納したいんですが
どうすればいいでしょうか?
というかなぜ空白で一々区切られるのでしょうか?
EOFでいいじゃないですか?

518:デフォルトの名無しさん
09/06/01 17:27:29
getlineでいいんじゃない?

519:デフォルトの名無しさん
09/06/01 17:49:17
getlineって一行だけじゃなかったっけ?

520:デフォルトの名無しさん
09/06/01 20:39:48
whileのループをEOFで抜けだし、出力するようにしたのですが、
出力後、プロンプトが出てきません。ctrl+Zで中止しないといけない状態です。
なぜ出てこないのでしょうか?

よろしくお願いします。

521:デフォルトの名無しさん
09/06/01 20:44:30
ループにでも入ってるんじゃない?

522:デフォルトの名無しさん
09/06/01 22:51:06
for(a=0;a<3;a++){
for(b=0;b<20;b++){
     if(hensu<0){
       処理1;
}
else{
       処理2;
     }
}
}

このようなfor文で、処理1もしくは処理2を実行したら
二つのfor文を一度に抜けたいのですが、どうすれば可能でしょうか?
処理のあとにbreakひとつじゃ後のfor文しかぬけないため、また処理1か2を実行してしまうので
困ってます。
goto文?というのはなるべく使いたくないのでそれ以外で何か簡潔にできますでしょうか?

523:デフォルトの名無しさん
09/06/01 22:55:08
俺は普通に終了フラグを作る

524:デフォルトの名無しさん
09/06/01 22:56:20
典型的な「gotoを使うと綺麗に書ける例」だな。

どうしても使いたくないなら
 ・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける
 ・全体を関数にしてしまい、returnで抜ける
とかどうか。


525:デフォルトの名無しさん
09/06/01 22:58:27
int end = 0;
for(a=0;a<3 && !end;a++){
for(b=0;b<20 && !end;b++){
if(hensu<0){
処理1;
end = 1;
}
else{
処理2;
end = 1;
}
}
}

もしくは関数化して、returnで抜けるとか。

526:デフォルトの名無しさん
09/06/01 23:00:31
男3人が結婚かよ

527:デフォルトの名無しさん
09/06/01 23:09:54
C言語の本を買ってきて、printfなるものをWindowsのメモ帳に入力したけど、どうしたら実行出来るの?

528:デフォルトの名無しさん
09/06/01 23:12:53
C言語の本に書いてあるんじゃね?

529:デフォルトの名無しさん
09/06/01 23:13:08
そのC言語の本に実行までのやり方が書いてないなら、
それが書いてある入門本を買いに本屋に走るんだ。

530:デフォルトの名無しさん
09/06/01 23:13:10
そのC言語の本を1ページ目から読み返せ。
それで分からなければタイトル晒して燃やせ。

531:デフォルトの名無しさん
09/06/01 23:13:58
また多重婚だねっ♪

532:デフォルトの名無しさん
09/06/01 23:19:00
2重のループを無理やり1重のループに変換する

533:デフォルトの名無しさん
09/06/01 23:20:52
aに3を入れる

534:デフォルトの名無しさん
09/06/01 23:21:06
>>523-524
フラグをつくる場合、>>525さんが書いて頂いたような
フラグの仕方が一番コード書く上では綺麗なのでしょうか?

関数化もよさげですね。ただあまり関数を増やしたくないのもあるので
使わずにすむならそっちのが使いたいです

535:デフォルトの名無しさん
09/06/01 23:22:34
フラグと書いた俺はフラグが基本だ。他は好みだろ

536:532
09/06/01 23:25:30
誰も思いついてない方法だから俺様の勝ち

int a, b;
for(x=0; x<60; x++){
  a = x/20; b = x%20;
  if(hensu < 0){
    処理1;
  }
  else{
    処理2;
  }
}

537:デフォルトの名無しさん
09/06/01 23:26:55
>>536  -見るー> >>532

538:デフォルトの名無しさん
09/06/01 23:29:37
・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける

あれでもこれだと、内側のループをまずbreakで抜けて、抜ける前にフラグをたてて
で、抜けたあとに外側をそのフラグでみるということかな?
でも外側のループから抜けるってどうやるんだろう

539:デフォルトの名無しさん
09/06/01 23:34:46
例の通りなら hensuの比較bool だから a=0,b=0 時点で必ずループ終了を要求することにならないか?

540:デフォルトの名無しさん
09/06/01 23:35:11
つうか処理1もしくは処理2は初回で確実に実行されるんじゃないのかfor文いらなくね

541:デフォルトの名無しさん
09/06/01 23:36:36
俺もそれ思ったwアルゴリズムが変

542:デフォルトの名無しさん
09/06/01 23:47:28
>>534
2重ループくらいなら、あんまり汚くはならんでしょ。たぶん。
実際の書き方は十人十色だろうけどね。
個人的には、forの条件式のところに書くよりは、新しくif~breakを作る方が好き。

あと、もう1つ。
関数呼び出しにかかる時間が致命的で、少しでも減らしたいというのでもない限り
基本的に関数を増やす方向で進めた方がいいと思うよ。


>540-541
まあ、実際のコードとは違う可能性もあるし、そこは突っ込むほどのことでもないんじゃない?

543:デフォルトの名無しさん
09/06/01 23:56:17
>538
すごく単純に書くと

for ()
{
 for ()
 {
  end_flag = 1;
  break;
 }
 if ( end_flag == 1 ) break;
}

544:デフォルトの名無しさん
09/06/02 00:04:31
書いてない
近所にそんな本置いてない
Amazon登録(会員?)してない
晒した後に燃やす意味がわからない


メモ帳ってテキストエディタだよね?C言語によるプログラムはどうやって実行するの?

545:デフォルトの名無しさん
09/06/02 00:07:04
Cの入門書なら絶対に書いてある。
万が一書いてなければ、それは間違いなく悪書なので燃やしても咎められないだろう。
ついでに、同じような被害者を出さないためにも、タイトルを晒しておこう。

くらいの意味。
要約すると、「1ページ目から読み直せ」ってことだ。

546:デフォルトの名無しさん
09/06/02 00:30:19
void型のWINAPI関数、ABC()があるとします。

void WINAPI ABC()

VOID WINAPI ABC()

には違いがありますか?(voidが小文字か大文字か)

547:デフォルトの名無しさん
09/06/02 00:34:47
>546
どっかで、「VOID は void の別名ですよー」って定義されているかどうかによる。
結論から言うと、たぶんそうなってる。


548:デフォルトの名無しさん
09/06/02 00:53:27
>>542
なるほど。関数を呼ぶと時間がかかるのですか。
かなり高い頻度で呼び出すのでできればはずしたいかな。

書いてなく申し訳ないですが、おっしゃるとおり実際は
forで回している変数を処理1,2で使っているので何とか抜けないといけないのです。

見た目で行くとやっぱり関数ですねー。
一気にfor二個抜けるbreak2みたいなのがあればいいですね(笑)

549:デフォルトの名無しさん
09/06/02 00:58:34
>548
>関数を呼ぶと時間がかかる

それこそ1/60秒間に1000回呼ばれ、マシンの性能の極限まで詰め込みたい……とかいうのでもない限り
普通に関数使っとけw

550:デフォルトの名無しさん
09/06/02 01:00:46
goto文使ってたり多重ループがあるだけで、
コードレビューが合格にならないキチガイISOマンセープロジェクト
って、この世からなくなればいいのに

551:デフォルトの名無しさん
09/06/02 01:29:22
>>522

for(~){
  for(~){
    if(hoge) break;
  }
  if(hoge) break;
}

552:デフォルトの名無しさん
09/06/02 01:42:18
そのループ処理を関数に切り出して、
抜けたいところで return してしまうのも一つの手。

553:デフォルトの名無しさん
09/06/02 01:55:55
>551-552
実際の質問の直後のレスを見ようぜ

554:デフォルトの名無しさん
09/06/02 03:49:46
go to文は有害だよ
どんなネストごちゃまぜなソースでもちゃんと普通に抜けだすコード書いたほうがいい
go to文はあとから見た時可読性が著しく落ちる まじで

555:デフォルトの名無しさん
09/06/02 03:53:11
その部分をまるっと関数化してreturnで抜けだすのと
gotoにそこまで違いがあるのかどうかw


556:デフォルトの名無しさん
09/06/02 04:01:36
for(a<3){ for(b<20){
if(){if(hensu){}else{},a=3;continue;}
}} // bループの外に処理があるなら }if(a<3){ }}


で十分じゃないの?

557:デフォルトの名無しさん
09/06/02 04:02:07
>>554
フラグ変数とか多用されるよりgoto使ってくれた方が追うの楽だし、
そもそもgotoつかえば深いネストしなくて済むことも多い。

558:デフォルトの名無しさん
09/06/02 04:05:36
フラグ変数を使って深いループを抜ける事は、仮想関数を
使うべき所にswitch文やif文で多重にネストした醜いプロ
グラムを連想させる

559:デフォルトの名無しさん
09/06/02 04:18:03
質問。
あるクラスから派生したクラスを作るとき、その派生クラスを強制的にシングルトンにさせる方法ってありますか?
派生クラスに自前でシングルトンパターンを実装するしかないのでしょうか?

>goto
まあ俺みたいな初心者は
少しは綺麗になるかも?と思ってもgotoを使わない方向で書いた方が安全ってことだな!


560:デフォルトの名無しさん
09/06/02 06:19:47
gotoが必要になる事ってほとんど無いんだけど。
ちゃんとクラス設計しているのか?
・・・と思ったが、C言語の場合はクラス設計もクソもないな。

561:デフォルトの名無しさん
09/06/02 06:26:12
gotoも使いようだよ
ifとかwhileで書けるなら、gotoでなくそっちを使うべき、ってだけ

いずれにせよクラスは関係ないな

562:デフォルトの名無しさん
09/06/02 07:30:53
>>545
最初っから読んだが載って無いな
悪書なのは分かったが買ったからには100%使う予定

で、メモ帳はテキストエディタっていう程だからプログラムを実行出来るんだよね?ググっても良く分からんのだよorz

563:デフォルトの名無しさん
09/06/02 07:37:44
>>562
じゃぁ、初心者向けの本じゃ無かったんだろ。
自分のレベルにあった本を買えるようにしような。

564:デフォルトの名無しさん
09/06/02 08:04:55
もっと高級なテキストエディタじゃないと実行できないんだよ。

565:デフォルトの名無しさん
09/06/02 08:14:21
>>582
C言語なら、コンパイラというプログラムが必要だ。それをつかえ。
コンパイラにも色々種類があるが、C言語用のコンパイラな。

566:デフォルトの名無しさん
09/06/02 08:48:14
>>564
嘘は言っていないから困る

567:デフォルトの名無しさん
09/06/02 09:54:40
まあ基本は、「エディタは編集するものであって実行するものじゃない」

568:デフォルトの名無しさん
09/06/02 12:38:23
>562
念のため、本のタイトルを。

569:デフォルトの名無しさん
09/06/02 12:59:30
わかた
コンパイラは自力で探してみる

因みに購入したC言語本は
URLリンク(www.amazon.co.jp)
コンパイラについて書いて無かった気がしたけどなぁ

570:デフォルトの名無しさん
09/06/02 13:00:55
あ、コンパイラはC++用でもおKなの?


571:デフォルトの名無しさん
09/06/02 13:02:32
/                     \
              、   ヽ\    ヽ
. /  , /    !    ∨丁ヽ い   |    /二フ”
/  ! |   ィ 「\   | ハ   l |   ,′    /
l   ! | / /j/   '.  ノ, =、!// /j/      ヽ/
l   い/ ,, =x j/ ′   〈j/       /ヽ
ト ._  \_〃         :.:.:.:.}           /二フ”
l l { 下 ̄ .:.:.:.:  -‐1   ∧          /
l l T ‐个 ._     ー'  イ l|         ニニ!
l/ /|  l l//下二千ヽ_l い          ─┘
' / .′ l,ノ\/// 小、|、\ヽ\          「〉
¦l  /  / \/ U` \ヽl i      r_|
¦l l    i      !   ト ヽ |


572:デフォルトの名無しさん
09/06/02 13:29:57
>569
ちょっと軽く評判を調べてみたんだけど、「実行する方法が書いてない」「やたら間違ってる」なんて話がチラホラあった。
1から読み直せとか、さんざん疑ってしまってスマン。


573:デフォルトの名無しさん
09/06/02 13:31:19
>>571 質問者はケータイみたいだし、AAでの返答はしないほうがいいんでね?

574:デフォルトの名無しさん
09/06/02 13:37:19
>>570
今のC++コンパイラはたいていCも扱える

575:デフォルトの名無しさん
09/06/02 13:39:07
やっぱりぼうようか

576:デフォルトの名無しさん
09/06/02 13:42:25
>>573
もともと >>571 に、真面目に答える気があるとも思えん。

577:デフォルトの名無しさん
09/06/02 14:08:56
これは酷い
URLリンク(labaq.com)

578:デフォルトの名無しさん
09/06/02 14:12:23
夏休みまだだよな?

579:デフォルトの名無しさん
09/06/02 14:13:22
年中夏休みですがなにか

580:デフォルトの名無しさん
09/06/02 14:25:09
VB、C#、C++だと.NETフレームワークの使い方って全然違ってくる?
.NETフレームワークの用途毎の使い方が載ってる本がほしいので
「.NET Frameworkプログラミングテクニック―for Visual Basic/C#」
を買おうかと思うんだが今使ってる言語はC++なんだ・・・

581:デフォルトの名無しさん
09/06/02 14:46:50
C#がいいお

582:デフォルトの名無しさん
09/06/02 14:51:25
>cat test.cpp
#include <iostream>
template <typename _T>
struct base { typedef size_t size_type; };
#ifdef CANNOTCOMPILE
template <typename _E>
struct A:base< A<_E> >{
#else
struct A:base< A >{
#endif
  size_type s;
};
#ifdef CANNOTCOMPILE
  typedef A<int> type;
#else
  typedef A type;
#endif
int main(void)
{
  type a;
  a.s = 10;
  return 0;
}
>g++ test.cpp
>g++ test.cpp -DCANNOTCOMPILE
test.cpp:10: error: ‘size_type’ does not name a type
test.cpp:10: note: (perhaps ‘typename base<A<_E> >::size_type’ was intended)
test.cpp: In function ‘int main()’:
test.cpp:20: error: ‘struct type’ has no member named ‘s’

頭がこんがらがってよくわからなくなってしまったのですが、
テンプレート版でsize_typeが継承されてないのはなぜでしょうか?

583:デフォルトの名無しさん
09/06/02 15:31:35
public base

584:デフォルトの名無しさん
09/06/02 15:31:42
マイクロソフトの最新版らしいので安心して使用してみます

べっかんこから見ているのでAAも安心です

では、おいとまさせて頂きます

585:デフォルトの名無しさん
09/06/02 15:33:26
おとこは黙ってVisual J

586:デフォルトの名無しさん
09/06/02 16:33:41
涙で>585が見えない


587:デフォルトの名無しさん
09/06/02 16:55:46
>>569
amazonの中身が読める所だけみたが
3ページの上の方に、プログラムの実行方法は
「処理系や実行環境によって異なりますから
みなさんが利用している処理系のマニュアルなどを参照してください」
と書いてある

まぁ、完全な初心者にはそもそも「処理系」って何?ってなるから
これじゃつまづくな

588:デフォルトの名無しさん
09/06/02 18:56:19
訳語の「処理」が大外れではないけど意味を採り難い語だからね

「処理乾酪」でヤバさ倍増な感

589:デフォルトの名無しさん
09/06/02 19:33:34
>>580
ライブラリ自体の使い方は同じだから、そういう目的ならVB/C#向けでも構わないと思う。

590:デフォルトの名無しさん
09/06/02 21:39:01
同じ名前のメンバ変数を持ってるクラスを継承しちゃったらどうなるの?

591:デフォルトの名無しさん
09/06/02 21:50:55
>>590
継承の仕方による。

多重継承ならスコープ解決演算子で名前解決することになる。

多重継承でなく、単一の継承を繰り返した場合は
派生クラスのメンバ変数の名前が基底クラスの
メンバで同名なものを「全て」隠蔽する。

これ以上は、実例を挙げるのがめんどくさいので、誰かよろしく。

592:デフォルトの名無しさん
09/06/02 23:34:12
すいません、VS2005で外部ライブラリをソースコードの中に記述して取り込む方法をど忘れしてしまいました、教えてください。

593:デフォルトの名無しさん
09/06/02 23:37:41
絶対ど忘れじゃねーだろwwwww

594:デフォルトの名無しさん
09/06/02 23:40:00
pragman

595:デフォルトの名無しさん
09/06/03 00:06:16
そうだった
#pragma comment(lib,"ws2_32.lib") これでよかった、thx>>593ぶた野郎

596:デフォルトの名無しさん
09/06/03 06:42:31
メモリ上のポインタをファイルポインタで開くことはできますか?

597:デフォルトの名無しさん
09/06/03 06:58:06
できません

598:582
09/06/03 16:54:38
よろしくお願いします。

599:デフォルトの名無しさん
09/06/03 17:59:15
すまん質問させて貰う

下のように定義した関数があり
void funcA( const char *pszA, const char *pszB, const char *pszC );

funcBで色々と処理した後に、funcB内でfuncAを呼ぶと
pszBとpszCのアドレスが変わってしまう

pszBに渡されるアドレスが本来0x1000だとすると、0x1200となる
デバッガで渡される直前の中身と、funcAで受け取った中身が違ってるのも確認済み
これの原因で考えられるのはメモリ破壊のみだろうか?
funcAとfuncBは別々のモジュールで実装されているんだが
WinMainを呼んで他に処理をする前に
すぐにfuncBを呼んでも、同様の現象が起きてる

そこの機能だけを一つに纏めて実験すると問題無く動作する
IDEはVC++2008 ExpressEdtion

正直訳が分からない。よろしくお願いします。

600:デフォルトの名無しさん
09/06/03 18:27:56
char const * (const char *)
const なcharへのポインタ。アドレスは変わっても良い。データはconst。

char * const
charのポインタがconst。アドレスはconst。データは変わってもよい。

char const * const (const char * const)
const な char のポインタがconst。アドレス、データ共にconst

601:599
09/06/03 18:51:25
自己解決した

構造が
main.cpp
dialog/dialog.cpp
shell/shell.cpp
resource/resource.cpp
という風にモジュール分けしてて

funcB内で別のモジュールの処理を呼ぶんだが
そのモジュール(funcB内で呼ぶ処理)自体は結合度が凄い低い

そのモジュールのヘッダに
#include "../hogehoge.h"
とアプリ全体の共通ヘッダをインクルードしたら解決した

そのモジュール自体、他の機能全く使わないのに
何でこれで解決するのかが分からないが…

スレ汚しすまない

602:デフォルトの名無しさん
09/06/03 18:56:43
>>601
アドレスは変わっても良いってコンパイラに伝えてるんだから、当然アドレスはいつか突然変化する。
今回変わらなかったのは単なる偶然。

603:599
09/06/03 19:17:16
例えば
void func( const char *pszHoge )
と定義して

char szHoge[] = "hogehoge";
szHogeのアドレスが0x1000として
func( szHoge );
とすると、func側のpszHogeは必ずしも0x1000ではないって事?
同じアプリのメモリ空間だから、アドレスが変わるっていうのは知らなかった

でも、今回のはアドレスも変わって、中身も変わってた

604:デフォルトの名無しさん
09/06/03 19:18:46
すまん、記述ミスがあった
×pszHogeは必ずしも0x1000ではないって事?
○pszHogeが指すアドレスは0x1000ではないって事?

605:デフォルトの名無しさん
09/06/03 19:23:39
>>600参照。
const char*だと、アドレスは変わる。
ついでに>>603だと宣言の時点でconstついてないから中身も変わる。
コンパイラによって保証されるのは、funcがpszHogeの中身を変えないことだけ。

606:599
09/06/03 19:45:18
>>605
有難う
ポインタで渡す限りアドレスは固定だと思ってたが、違うのか
今日アドレスと中身も変わったが、相当レアなケースに遭遇したみたいだ
>>600は凄い参考になった。有難う

607:デフォルトの名無しさん
09/06/03 19:53:48
ポインタ変数だろうがint型の変数だろうが関数に渡した値が勝手にかわってたらおかしいだろw

608:デフォルトの名無しさん
09/06/03 20:18:16
C++でゲーム開発してるんですが、敵ユニットや弾をリスト構造を用いて実装しました。
しかし、これらのオブジェクト同士の当たり判定の実装で詰まってしまっています。
解決策を知っている方が居たらお願いします。

それが駄目でも、二つの双方向リストを総当りで比較する方法などありましたらお願いします。

609:デフォルトの名無しさん
09/06/03 20:24:55
>>608
サンプルプログラムそこらじゅうに転がってるからてきとーに参考にすりゃいいだろ

総当りの方法って、先頭から順番に見ていきゃ言いだけだろ



610:582
09/06/03 22:23:15
VC++2008 EEで試してみたところ、どちらのバージョンでも問題なくコンパイルされてしまいました。
動作も期待(?)通りです。お騒がせいたしました。

611:デフォルトの名無しさん
09/06/03 22:25:31
だめだったのはやっぱBCC無料版だったりするんだろうか

612:デフォルトの名無しさん
09/06/03 22:38:02
>>609
まぁ、ゲームの場合速度が重視されるから単純な総当たりなんてやらないで
エリアを区切ってエリア単位で総当たりの判定するけどな。

613:デフォルトの名無しさん
09/06/03 22:42:02
まずすべてのオブジェクトの座標を確認して
適当な範囲ごとにソートして、それからその範囲内で当たり判定を行うってことかしら?
範囲の境界に位置するようなオブジェクトの場合はどうしたら…

614:デフォルトの名無しさん
09/06/03 22:42:52
>>613
どっちでもいい、処理を減らすことが目的だから

615:デフォルトの名無しさん
09/06/03 22:43:36
いや違うな
>>613じゃ根本的に間違ってる

616:デフォルトの名無しさん
09/06/03 23:35:00
for(n=1; n<=100; n++){
sum += n;
printf("1+2+...+100=%d\n",sum);
}

{ }をつけると、1、1+2、1+2+3、・・・、1+2+…+100までの答え、
{ }を外すと単なる1+2+…+100の答えが出るのですが、
これはなぜですか?

本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが
ここで{ }を省略するかどうかというのは重要な問題だと思うのですが

617:デフォルトの名無しさん
09/06/03 23:39:11
{} を省略した場合は

for(n=1; n<=100; n++){
 sum += n;
}
printf("1+2+...+100=%d\n",sum);

って書いてあるのと同じ意味になるから。

618:デフォルトの名無しさん
09/06/03 23:41:42
> 本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが
だから、{ }がなければ
for(n=1; n<=100; n++){
sum += n;
}
printf("1+2+...+100=%d\n",sum);
とみなされる。

619:616
09/06/03 23:42:47
>>617
なるほど!
1つの文しかないときは{}を省略できるってのは、
条件式が1つの場合、って解釈してたんですが
printfも何もかも含むんですね!わかりやすい説明ありがとうございます

620:616
09/06/03 23:44:20
>>618
ありがとうございます!

621:デフォルトの名無しさん
09/06/03 23:44:21
関数で値渡しをするときに配列の要素全てを渡すことは出来ますか?
それともそれぞれ引数に指定しないとダメでしょうか

622:デフォルトの名無しさん
09/06/03 23:47:37
;が文の終わり。日本語の句点のような存在。
だからsum += n;で1つの文。

{}はその例外で、囲った部分全体で1つの文になる。 すまん話し過ぎたか。

623:デフォルトの名無しさん
09/06/03 23:51:15
>>621
C++ なら vector を使えばいいです。
Cでは直接配列を値渡しすることはできないので、
構造体の中に入れて、構造体を値渡ししましょう。

624:デフォルトの名無しさん
09/06/03 23:56:06
>>623
アリガトゴザイマす

625:デフォルトの名無しさん
09/06/04 04:23:23
初心者です。

Cの参考書でメモリ関連の事が良く出てきます。

バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても
良いんでしょうか?

HTMLで例えるなら#ffffffみたいな感だったので・・・。
これは覚えたほうがいいんでしょうか。
わけわからないんですが

626:デフォルトの名無しさん
09/06/04 04:54:02
スルーしちゃらめぇ。

627:デフォルトの名無しさん
09/06/04 06:24:57
>>625
C言語はそう言うのを扱うのが醍醐味というか、
それが分からないと全然まともに使えないと思われる。

理系なら分かるでしょ?がんばれ!

628:デフォルトの名無しさん
09/06/04 07:46:11
授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど
せいぜいそれくらいだよなあ。

629:デフォルトの名無しさん
09/06/04 17:39:26
C++の質問です。

あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。
この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか?


 ・メンバ変数にする
     → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?

 ・呼び出し側で変数を用意しておき、引数でその都度渡す
     → 呼び出し側の手間が増える。数が多いとかなり大変。

 ・staticを付ける
     → オブジェクトごとに個別の値を持てなくなる

630:デフォルトの名無しさん
09/06/04 17:42:17
そのときの変数の性質や役割による。 手間隙とかは関係ない

631:デフォルトの名無しさん
09/06/04 17:50:18
ああごめん、途中で質問を書き直したら
頓珍漢な内容になってました。

以下の3パターン以外に方法はないのでしょうか、で。
思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。


632:デフォルトの名無しさん
09/06/04 17:57:18
制約がないなら好きにすればいい

633:デフォルトの名無しさん
09/06/04 17:58:41
>>629
 ・メンバ変数にする
     → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
これがやっぱり一番自然でしょ。
と俺は思う。
いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?


634:デフォルトの名無しさん
09/06/04 17:58:43
・関数オブジェクトを用いる。

635:デフォルトの名無しさん
09/06/04 18:08:35
C言語勉強中なんですが、宿題で
「ファイル名を自分で設定しそのファイルに、EOFを行うまで
スペース区切りの二つの整数を何回でも入力できるようにし、
それをファイルに改行して記録しなさい」
というのがあり、
#include <stdio.h>
int main()
{
int a,b;
FILE *fp;
char name[100];
printf("ファイル名を入力してください\n");
scanf("%s",name);

fp=fopen(name,"w");
printf("数値を入力してください\n");
while(scanf("%d %d",&a,&b)!=EOF){
scanf("%d %d",&a,&b);
fprintf(fp,"%d,%d\n",a,b);
}
fclose(fp);
return(0);
}
というプログラムを作ったんですが、なぜか
数値を入力した際に記録される時とされない時があります。。。。
どなたか解決策を教えていただけないでしょうか?

636:デフォルトの名無しさん
09/06/04 18:36:32
スレの皆様に質問です。
8ビットbitmapファイルを読み込み、各ピクセルに演算を加え、別ファイルとして出力するプログラムを作っています。
演算結果をint型の変数ifooに格納し、unsigned char型にキャストしてputしています。
ifooがunsigned char型の範囲外の値の時は、範囲の端の値を代入しています。

//fin,foutのファイル上の位置は適切な場所にあるとする
for (int y=0 ; y<height ; ++y){
  for (int x=0 ; x<width ; ++x){
    int ifoo = fin.get()*A+B;
    if(ifoo<0) ifoo=0;
    if(ifoo>255) ifoo=255;
    fout.put((unsigned char)ifoo);
    ++i;
  }
  //bmpファイルの幅は4の倍数ピクセルとする
}

先輩が組んだプログラムはこれの2倍以上速いのですが、AとBがハードコードされていて
ソースコードは失われ、先輩本人は行方知れずです。。。
そのためA,Bを引数で与えられるように、イチから再作成しています。
1000x1000pxのBMPを一度に数千枚~数万枚単位で処理するため
このループ部分をもっと高速化したいです。何か良いアイデアは無いでしょうか。
ちなみにこの部分以外に目立ったループ箇所は無いです。


637:デフォルトの名無しさん
09/06/04 18:48:13
>>636
1. ループの中で ファイルIOするのは遅すぎるので、
一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
(全部読み込めないほどメモリが少ないのなら、一部ずつとか)

2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く

638:デフォルトの名無しさん
09/06/04 20:50:01
>>637
早速ありがとうございます。とりあえず1を試してみます。

環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。
2の手法はVisualStudio等を使って行う方法でしょうか?
そのうち勉強してみたいと思います。

639:デフォルトの名無しさん
09/06/04 20:56:08
>>638
インラインアセンブラ

640:デフォルトの名無しさん
09/06/04 20:57:00
と外部ライブラリ

641:デフォルトの名無しさん
09/06/04 21:17:36
usingを解除することはできますか?
namespace {
using foo::CFoo;
class CBar {
public:
void hoge(CFoo);
};
}
みたいにやってるんですが副作用があるのかどうか気になってます

642:デフォルトの名無しさん
09/06/04 21:21:29
>>638
最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。
いずれにせよgccでも使える。

643:デフォルトの名無しさん
09/06/04 21:23:37
まぁまずないとは思うけど最適化オプションの存在は知ってるよね?

644:デフォルトの名無しさん
09/06/04 21:37:23
>>635

while(scanf("%d %d",&a,&b)!=EOF){
 fprintf(fp,"%d,%d\n",a,b);
}

としてみるべし

645:デフォルトの名無しさん
09/06/04 21:40:54
デートは家でまったりしたいのですが
女性から見ればNGですか?

646:デフォルトの名無しさん
09/06/04 21:43:37
Rubyを教えてくれるならOK

647:デフォルトの名無しさん
09/06/04 21:43:39
>>645
死ね

648:デフォルトの名無しさん
09/06/04 21:44:20
>>645
誤爆サーセン

649:636
09/06/04 22:05:38
>>639
アセンブラはマイコンで少々やったことがあるので挑戦してみます。
ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn
>>>640
外部ライブラリというと、そういう処理が高速にできる
ライブラリを他から持ってきちゃえということでしょうか?
>>643
恥ずかしながら知らなかったです。
軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。

プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。
皆様アドバイス有難う。

650:デフォルトの名無しさん
09/06/04 22:46:58
あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。
gccならOpenMPが使えるし。

651:636
09/06/05 14:13:30
>ループの中で ファイルIOするのは遅すぎるので
>一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
new で uint8(unsigned char)型の readbuf,writebuf を、int型のcalcbufを確保し
以下のように書き換えたところ、>>636より約6倍も高速化しました。

fin.read((char*)readbuf,width*height);
int i=0;
for( int y=0 ; y<height ; ++y){
for( int x=0 ; x<width ; ++x){
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
}
fout.write((char*)writebuf,width*height);


○vector<uint8> foo でバッファを確保した場合 read()にchar* が渡せないからダメ。
 という判断から、バッファはnewで確保しました。
○ループ中の2回のif文をelse if でまとめ、比較演算回数の減少を図りました。
 (気休め程度だと思ったので、これ単体の効果は未計測)

「先輩と互角」という目標を軽くクリアし、先輩の倍以上高速なプログラムになりました。
最適化オプション、インラインアセンブラ、並列化等もこれから試してみたいですが
目標クリアしたためとりあえず質問は終了させて頂きます。
スレの皆様ありがとうございました!

652:デフォルトの名無しさん
09/06/05 14:20:51
アセンブラ化は効果なし。 
もっとも時間かかるのはディスクアクセス。
Windowsであれば、Noバッファリングで読み込んでみて。
バッファリングありより倍以上の速度になる。
あと、一度にたくさん読み込んでも逆に遅くなる。
100M読み込むより、4Mや2Mずつのほうが速い。
データが仮想メモリ(HDD)に移動してしまう可能性が高い。
自分の環境では4M以上は速度は上がらなかった。

653:デフォルトの名無しさん
09/06/05 14:24:21
ちなみに一度に一斉に書くのも遅くなる。 
メモリ不足になるという理由で。
入出力バッファは、1M~4Mくらいにして、使い回すのが吉。

654:デフォルトの名無しさん
09/06/05 14:27:13
並列化もきっと意味ないだろうなぁ

655:デフォルトの名無しさん
09/06/05 14:27:21
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];

tmp = readbuf[i] * A + b;
if (tmp < 0) tmp = 0;
if (tmp > 255) tmp = 255;
writebuf[i] = (uint8) tmp;

656:デフォルトの名無しさん
09/06/05 14:29:14
2008-04-30  大容量ファイルI/Oの効率について 其の弐

FILE_FLAG_NO_BUFFERING 指定のないReadFile() -赤線-
リニアにアクセス速度が低下していく。大容量ファイルのリードを行うことに対して
Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。
FILE_FLAG_NO_BUFFERING を指定すれば回避できるとはいえ、
コンシューマ市場向けにもTBクラスのストレージが出回ってる昨今、これは致命的な問題だと思う。

FILE_FLAG_NO_BUFFERING 指定のあるReadFile() -緑線-
2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!!

URLリンク(img.f.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)

657:デフォルトの名無しさん
09/06/05 14:34:48
bmpではなくjpgなら、アセンブラ化は効果あるだろけど
bmpはサイズがでかいからな。
処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど
単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。

658:デフォルトの名無しさん
09/06/05 19:59:01
implementationは実装と訳せばいいのですか?

659:デフォルトの名無しさん
09/06/05 20:33:17
>>656
バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?

660:デフォルトの名無しさん
09/06/05 21:24:22
>>658
そうです^^

661:658
09/06/05 21:31:46
>>660
ありがとうございます。

662:デフォルトの名無しさん
09/06/06 01:54:30
関数を呼びまくるとスタックオーバーフローを起こします。
スタックを増やす以外にどんな解決方法がありますか?

663:デフォルトの名無しさん
09/06/06 02:01:52
関数オブジェクトをヒープに置く。

664:デフォルトの名無しさん
09/06/06 02:23:44
>>662
再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。
そうでなければ、ローカル変数域を減らす。特にバッファ。

665:デフォルトの名無しさん
09/06/06 05:33:46
配列の要素の組み合わせを出力したいのですが、
実装をどのようにするか迷っています・・・

配列
int array[10] = {0,1,2,3,4,5,6,7,8,9};

出力
{0}, {1}, {2}, {3}... {9}
{0,1}, {0,2}, {0,3}... {8,9}
{0,1,2}, {0,1,3}... {7,8,9}
...
{0,1,2,3,4,5,6,7,8,9}

このような出力を実現するにはどのようにコードを組めば効率が良いでしょうか?

666:デフォルトの名無しさん
09/06/06 05:41:25
ヒント:二重ループ

667:デフォルトの名無しさん
09/06/06 06:29:22
なんだよそのヒントw
>>665は一応実装はできるけど
最適な実装ロジックを聞いてるんでしょ。

668:デフォルトの名無しさん
09/06/06 06:47:20
いや二重ループが一番のヒントだろ

669:デフォルトの名無しさん
09/06/06 07:25:49
>>665
どういう規則で出力するのかさっぱりわからん。

670:デフォルトの名無しさん
09/06/06 07:37:10
桁ごとに、組み合わせを順番に表示してくんだろw

671:デフォルトの名無しさん
09/06/06 07:56:47
>>665
効率はしらんが、適当に書いてみた

#include <stdio.h>

void combi(int n, int pos, int digit, int *array)
{
int i, j;

if(pos==digit) {
printf("{%d", array[0]);
for(i=1; i<digit; i++) printf(",%d", array[i]);
putchar('}');
} else {
for(i=n; i<=9; i++) {
array[pos] = i;
combi(i+1, pos+1, digit, array);
}}}

int main(void)
{
int i, array[10];

for(i=1; i<=10; i++) combi(0, 0, i, array);

return 0;
}

672:デフォルトの名無しさん
09/06/06 08:23:21
printfのfはformattedのfだと聞いたことがありますが、
そもそもformattedってどういう意味ですか?
辞書を引いてもC/C++に適した訳語が見つからなくて。。。

673:デフォルトの名無しさん
09/06/06 08:30:09
書式に則った

674:デフォルトの名無しさん
09/06/06 08:31:42
>>673
何の書式に則ったってことですか?
自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?

675:デフォルトの名無しさん
09/06/06 08:34:17
どう考えてもそれしかないと思う。


676:デフォルトの名無しさん
09/06/06 08:38:52
>>675
ありがとうございました。

677:デフォルトの名無しさん
09/06/06 08:45:47
>>665

main()
{
int array[10]={0,1,2,3,4,5,6,7,8,9};
int i,f,set;
for(set=1;set<=0x3ff;set++)
{
putchar('{');
for(i=0,f=0;i<10;i++)
if(set & (1 << i)) {
if(f) putchar(',');
printf("%d", array[i]),f=1;
}
putchar('}');
}
}


678:デフォルトの名無しさん
09/06/06 10:20:23
>>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった

679:デフォルトの名無しさん
09/06/06 15:57:09
クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。

680:デフォルトの名無しさん
09/06/06 15:59:10
>>679
できます

681:デフォルトの名無しさん
09/06/06 16:04:03
これができません。なぜでしょうか。

#include <iostream>
#include <string>
using namespace std;



class A {
public: char *ch;
A() { ch=new char [10]; strcpy(ch,"aaa"); }
void test(char *p){ p=ch; } };

main () {
A x; char *p;
x.test(p);
cout<<p;
}

682:デフォルトの名無しさん
09/06/06 16:06:26
自己解決しました。 test(char* &p)にしたら良かったです。

683:デフォルトの名無しさん
09/06/06 16:11:36
char* &pって気持ち悪いなchar*& pがクール

684:デフォルトの名無しさん
09/06/06 16:16:08
いやむしろ、char *&p の方がクール。
理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。
char* p; のように書く人は p と q をポインタにしたいとき
char* p, *q; のように非対称に書いたりするので混乱必至。

っていうか宗教^^

685:デフォルトの名無しさん
09/06/06 16:16:56
それより一引数で参照私の値変更ってのがさ!

686:デフォルトの名無しさん
09/06/06 16:23:07
>>684
> char* p; のように書く人は p と q をポインタにしたいとき
> char* p, *q; のように非対称に書いたりするので混乱必至。
そうでもないよ。俺は普段1行目のように書くけど、2行目のようなケースは
まず第一に「滅多に書かない」し、もし書く時は char *p, *q; って書く。

まぁ、宗教。

687:デフォルトの名無しさん
09/06/06 16:26:38
そもそも*&ってのが気持ち悪い
ダブルポインタのほうがかっこよくない?

まぁ、宗教。

688:デフォルトの名無しさん
09/06/06 16:29:15
Effective C++(第2版)には ** 使うくらいならどうして *& を使わないのかって書いてあるから
*& でいいんじゃない?っていうか、>>681のような質問って時々出てくるけど
その設計にどういうメリットがあるのかしら?
ポインタの管理はクラスの外でやってるし、そもそも内部の詳細を公開しているし・・・

689:デフォルトの名無しさん
09/06/06 16:29:33
創価学会最高!

690:デフォルトの名無しさん
09/06/06 17:09:37
そこまでするならmulti_arrayみたいにラップするわ

691:デフォルトの名無しさん
09/06/06 18:20:00
デバッグしてるときにちょっと気になったんですが
他人の作ったメソッドや関数(例えばSTLやboost)が投げる可能性のある例外を調べる方法は仕様を読む以外ないんでしょうか?
強制的に例外を投げさせるオプションみたいなものがあるんでしょうか?
コンパイラはVC++EE2008を使っています

692:デフォルトの名無しさん
09/06/06 18:27:02
つ grep

693:デフォルトの名無しさん
09/06/06 22:29:11
複文マクロは
do{~;~;~;}while(0)
とすると良いとききました。
しかしこれだと返り値を持たせられないため、関数形式のマクロが書けません。
複文マクロでありながら、返り値を持たせる方法はありませんか?

694:デフォルトの名無しさん
09/06/06 22:34:00
インライン使っとけ。 複雑なマクロつかうよりいい。
エラーがわかりやすい。 実行時間が計測できるなどりメリット。

695:デフォルトの名無しさん
09/06/06 22:34:51
>>694
インライン関数などの知識は十分あるんですが、
どうしても変なマクロが書きたいんです。

マクロでしかできない変な処理なんです。

696:デフォルトの名無しさん
09/06/06 22:46:21
カンマ演算子でなんとかするのはもう考えた?

697:デフォルトの名無しさん
09/06/06 22:48:56
>>696
ありがとうございます。

もう考えてあります。
ただ、try catchブロックを盛り込みたく、それがカンマ演算子に合わせられないのです。。。
そしてマクロでしかできない処理というのは「マクロ引数から#で文字列化する」というような
いわばリフレクション的な処理も含んでいる物だからです。

まあ無くても支障ないのですが、一般化して再利用可能にしておいたら便利かなと思って
変態マクロに挑戦しているところです。

698:デフォルトの名無しさん
09/06/06 22:50:26
引数っぽくすれば
#define FOO(X) do{;;(X)=hoge;}while(0)

699:697
09/06/06 22:55:03
>>698
ありがとうございます。

副作用を持たせるわけですね。
最終手段として考慮します。

しかし当面はもうちょっと挑戦してみます。
返り値はbool型になる予定でして、疑似関数の形の方が分かりやすいので。

関数テンプレートや文字列結合演算子、無名構造体など、
もちえる言語仕様の知識をフル活用してみます。


700:デフォルトの名無しさん
09/06/06 23:20:30
void func(float a[]){
  int size=sizeof(a)/sizeof(float);
}
これでsizeに配列aの個数が入ると思ったのに1になる。何で?

701:デフォルトの名無しさん
09/06/06 23:31:22
aはfloatへのポインタに変わったから

702:デフォルトの名無しさん
09/06/06 23:31:55
サイズが分からないから

void func(float a[10]){
とかにすれば10って出るはず

703:デフォルトの名無しさん
09/06/06 23:34:47
void func(float a[]){
としても

void func(float *a){

となるから

>>702
なんねーよばか

704:デフォルトの名無しさん
09/06/06 23:35:53
ありがとう。float[10]ってしないと駄目なのか
でもそれだとint size=10;ってすることと一緒だから意味無いよね
受け取った配列の数によって処理を変えたいんですがどうすればいいですか?

705:デフォルトの名無しさん
09/06/06 23:38:08
それこそマクロっぽくするべき
#define func(x) func_(sizeof(x)/sizeof(float))
void func_(unsigned size);


706:デフォルトの名無しさん
09/06/06 23:39:11
>>704
二引数にして大きさを渡すする
ものすごい馬鹿みたいに思うかもしれんが
memsetやらfreadやらあるように領域の大きさを渡すのは普通

707:デフォルトの名無しさん
09/06/06 23:39:19
void func(float *a, size_t n) { }
#define numberof(array) (sizeof(array)/sizeof(array[0]))
float foo[10];
func(foo, numberof(foo));

708:デフォルトの名無しさん
09/06/06 23:48:33
ありがとうございます。サイズを引数として受け取るしかないんですね
当たり前なんだろうけど、これにはちょっとびっくり。
普通に分かるものだとばかり思ってた

709:デフォルトの名無しさん
09/06/07 00:27:30
商業ソフトだとメモリ確保とかでガチガチにtry catchするんでしょうか?

710:デフォルトの名無しさん
09/06/07 01:10:01
メモリ確保失敗はアプリレベルではどうにもならないからOSに例外投げてしまう。



という考え方もある。

711:デフォルトの名無しさん
09/06/07 01:14:08
限界になる前に、そろそろメモリが足りません言い出すソフトもあるなぁ・・・・

712:デフォルトの名無しさん
09/06/07 02:22:58
OSに例外投げたらどうなるんだ?つか、そんなことできるのか?

713:デフォルトの名無しさん
09/06/07 02:57:00
他人のソースコードを読んでいってもさっぱり頭に入ってきません。
何かソースコードを読む際のポイントとかあるんでしょうか。

714:デフォルトの名無しさん
09/06/07 03:00:11
コメントを読んだり、
読んでる関数の中身までは読まずに、大まかな流れを先に確認する。

715:デフォルトの名無しさん
09/06/07 03:37:32
>>713
doxygen(Graphviz)で関係のグラフ化オヌヌメ

716:デフォルトの名無しさん
09/06/07 10:54:46
テンプレートの型を一部の型に限定したい(たとえばunsignedの各種整数型のみ)場合は
template<typename T> class HOGE;
template<> class HOGE<unsigned char> {...;};
template<> class HOGE<unsigned short> {...;};
template<> class HOGE<unsigned long> {...;};
template<> class HOGE<unsigned int> {...;};
のように本体を書かずに、特殊化のほうをいちいち全部書くしかないんでしょうか?

717:デフォルトの名無しさん
09/06/07 11:53:12
traits

718:デフォルトの名無しさん
09/06/07 12:20:01
C++にて。
同じ副作用を保ったまま、式を文にすることは出来ます。
セミコロンを付ければ良いだけです。
 例 x=3ならx=3;とすればよい。
しかし同じ副作用を保ったまま、文を式にすることは出来ますか?
その際の式の値は何だって良いとして。
 例 while(flag){++x;} を ???


719:デフォルトの名無しさん
09/06/07 12:50:35
>716
class の中身の方は型によって変わらないと仮定して、

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_unsigned.hpp>

template<typename T, typename Enable = void>
class HOGE {};

template<typename T>
class HOGE<T, typename boost::enable_if<boost::is_unsigned<T> >::type>
{ // 何か
};

他の型にするなら boost::is_unsigned を適宜変更すれば OK。
型をべた書きするなら↓なんてのも可能。

#include <boost/mpl/set.hpp>
#include <boost/mpl/has_key.hpp>
template<typename T>
class HOGE<T, typename boost::enable_if<
  boost::mpl::has_key<
    boost::mpl::set<
      unsigned int,
      unsigned char
    >,T> >::type>
{ // 何か
};

中身も変わってくるなら >717 の通り traits でまとめる。

720:デフォルトの名無しさん
09/06/07 13:42:55
>>718
そこを関数にする。
そうすれば関数呼出式になる。

721:718
09/06/07 14:31:24
>>720
あーなるほど。
ありがとうございます。

722:デフォルトの名無しさん
09/06/07 18:39:05
for each 処理を自前で作りたい。
Sentinelを付加する方法でなんかいいアイデアない?

723:デフォルトの名無しさん
09/06/07 18:43:09
CかC++かくらい書け。
もっとも、C++ならSTL使え、だが。

724:デフォルトの名無しさん
09/06/07 18:57:23
もっと洗練されたライブラリが必要だと思うんだ

725:722
09/06/07 19:00:27
STL様 i=begin;while((function(i++),i)<=end); は偽物foreach

i=begin; end+1=eoloop; while(function(i++));
      ^^^^^^^^^←この部分

726:デフォルトの名無しさん
09/06/07 19:01:00
一応Qt(C++用ライブラリ)にforeachはある
それを参考にしろとは言わんが

727:デフォルトの名無しさん
09/06/07 21:22:20
インターフェースクラスがクールに感じたんだけど、これってなにかマイナス面はある?
今作ってるプログラムをこれ使って大幅に書き換えようかなと思ってるんだけど

728:デフォルトの名無しさん
09/06/07 21:39:06
>>727
ソースコードの量が増える
保守するとき読めればいいが
そんな保証などない

将来性にかけて拡張性に優れた設計にするには
優れた設計能力が必要
後からの変更は1からのやり直し

729:デフォルトの名無しさん
09/06/07 21:48:20
>>727
Qtのこと?
俺もQtの設計は美しいと思ってるし、
いまさらMFCやろうとしてる(まずいないがw)やついたらQtを紹介してる

マイナス面は、以前はGPLだったけどそれも変更になってLGPL
不満といえばdllのサイズぐらいかな?


マルチOSなのもおいしいところ

730:デフォルトの名無しさん
09/06/07 21:56:43
>>725
std::for_eachもいやならBOOST_FOREACHはだめ?

731:デフォルトの名無しさん
09/06/07 22:02:31
>>729
そのインターフェイスじゃないだろ

732:デフォルトの名無しさん
09/06/07 22:11:32
QtってGUI専用だと勝手に思っていたが、
GUI以外の事も出来るの?



733:デフォルトの名無しさん
09/06/07 22:18:02
>Qt

何故か俺の中で、
フジコフジオのイメージが払拭できない

734:デフォルトの名無しさん
09/06/07 22:21:55
>>732
コンテナ、ネットワーク、XML、データベースとか一通り
機能制限はあるが組込み向けやXサーバーなしでもGUIが使えたり

735:732
09/06/07 22:24:51
>>734
すげーー
マジかよ。

LGPLだと商用利用はしんどいか?
Staticリンクしちゃうとオープンソース強制だっけ?

736:デフォルトの名無しさん
09/06/07 22:55:36
>>735
LGPLだと静的リンクはアウトだね
動的リンクなら商用非公開おk

737:デフォルトの名無しさん
09/06/07 23:03:14
LGPLだと、リバースエンジニアリングの拒否の禁止かな。

738:732
09/06/07 23:06:54
リバースエンジニアリングはどうせされるんだろうし
そんなの禁止しても意味ないだろうけど・・・。

>動的リンクなら商用非公開おk
これはつまりDLLを付属させて配れってこと?


739:デフォルトの名無しさん
09/06/07 23:14:11
>>735
強制じゃないけど
staticリンクでその条件を満たすのはかなりしんどい

740:デフォルトの名無しさん
09/06/07 23:14:53
>>738
そうだよ配っていいんだよ


741:デフォルトの名無しさん
09/06/07 23:28:13
ってことは

「QtのDLLを付属させてスタティックリンクしないようにするかぎり」
無償でクローズドソースの商用利用が可能

ということか。
Qtいいな。
…ちょっと考えてみようかな。


742:デフォルトの名無しさん
09/06/08 02:12:57
>>715
分かりやすい解説サイト教えてください

743:デフォルトの名無しさん
09/06/08 02:20:00
>>742
ggrks
相当前からあるソフトで、情報も腐るほどあるぞ




ちなみにそのウィザードもQtでできてる

744:デフォルトの名無しさん
09/06/08 03:44:59
C++のテンプレートについて教えて
クラスとどう違うんだ?

745:デフォルトの名無しさん
09/06/08 03:49:36
次元が違う

746:デフォルトの名無しさん
09/06/08 04:18:25
違いすぎて逆に説明が困難だな。

747:デフォルトの名無しさん
09/06/08 04:19:38
訂正
C++のテンプレートについて教えて
やっぱクラスとの違いじゃなくてどういう時に使うのか
どんなニーズによってできたのか教えて

748:デフォルトの名無しさん
09/06/08 04:27:42
型が違うだけで同じような処理を何回も書かないで済むように

749:デフォルトの名無しさん
09/06/08 06:46:52
今年女子大に入ったばかりのゆきこと言います。
C++を学びたいのですが、どの本がお薦めでしょうか?


750:デフォルトの名無しさん
09/06/08 06:47:04
>>744
天と地ほど違うと思うけど。

[タイヤキを作るための金属の鋳型]

[食べられるタイヤキ]
の違い。ぜんっぜん違う。


751:デフォルトの名無しさん
09/06/08 06:56:11
>>742
このスレに行け。
【コメント】doxygen【コンソメ】
スレリンク(tech板)

オススメは以下。
Graphviz
URLリンク(www.graphviz.org)
doxygenの文字化け対策 - 僻地のプログラマkmt-t - わりとどうでもいい日記 1.1
URLリンク(d.hatena.ne.jp)
Let’s use doxygen!
URLリンク(www.fides.dti.ne.jp)
無題ドキュメント
URLリンク(www.sat.t.u-tokyo.ac.jp)
SourceForge.net: sakura-editor ≫ DoxygenComment
URLリンク(sakura-editor.wiki.sourceforge.net)
Doxygenマニュアル
URLリンク(www.doxygen.jp)
Doxygen公式
URLリンク(www.doxygen.jp)


752:デフォルトの名無しさん
09/06/08 10:12:17
>>750
それクラスとインスタンスの違いでなくて?
テンプレートはその鋳型を付け替えるとタコ焼にも今川焼きにもなる台とか

753:デフォルトの名無しさん
09/06/08 11:03:19
型チェックしてくれるマクロとでも思えば。

754:デフォルトの名無しさん
09/06/08 12:56:01
なんだかtemplateってbindに似てるね

755:デフォルトの名無しさん
09/06/08 13:03:26
コンストラクタの引数の値によって、データメンバの型を変える方法ってありますか?

756:デフォルトの名無しさん
09/06/08 13:24:48
>>749
女子供は股開いてればいいんだよ

757:デフォルトの名無しさん
09/06/08 13:34:28
子供もかよ……

758:デフォルトの名無しさん
09/06/08 13:49:24
ぼくおとこのこだよ…

759:デフォルトの名無しさん
09/06/08 13:58:54
>>755
同じ親クラスから継承した子クラスという条件内であれば可能。

もしくは、void*で持たせれば、多分なんでもおkだけど。

760:750
09/06/08 16:12:44
>>752
そうとも言えるな。
なら俺方式で言うなら
クラステンプレート=[タイヤキやら今川焼きやらを作るための金属の鋳型を作るためのナニモノか]
クラス=[タイヤキを作るための金属の鋳型]
インスタンス=[食べられるタイヤキ]
とでも言えばいいかな。

761:デフォルトの名無しさん
09/06/08 16:55:30
喩えなら何とでも言えるわ。

762:デフォルトの名無しさん
09/06/08 17:42:54
名前空間について質問です。

名前空間 foo と、それとは別に名前空間 bar::foo があるとします。
このとき、bar の内側から、bar::fooでは無い方の foo を指定するにはどうしたら良いのでしょうか。

なお、環境はWinXP、C++、VisualStudio2005です。


763:デフォルトの名無しさん
09/06/08 17:46:20
::foo

764:762
09/06/08 17:53:04
すみません、2つ質問するつもりで書いてませんでした。

あるクラス内に、別クラスをメンバ変数として取り込む時、
その別クラスが書かれたヘッダファイルをインクルードするのではなく、
先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?

さて、その別クラスの名前が、名前空間 bar の下にあるとき、
namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?


>>763
ありがとうございます。
なんで思いつかなかったんだろう、自分。

765:デフォルトの名無しさん
09/06/08 18:40:27
便乗質問、テンプレートクラスを持たせる時って同じ方法使えるん?

766:デフォルトの名無しさん
09/06/08 18:48:37
使えるん

767:デフォルトの名無しさん
09/06/08 18:51:59
>>764
あなたのいうクラスに名前が付いていないので
説明の便宜上
あるクラス=MyClass, 別クラス=fooとします。

まずは本題からちょっとそれた話から。
 > その別クラスが書かれたヘッダファイルをインクルードするのではなく、
 > 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
あります。
しかし
 > あるクラス内に、別クラスをメンバ変数として取り込む時、
この場合は前方宣言Forward declarationだけでは足りません。
というのも、
class MyClass {int m_num;std::string m_str;foo m_var;}
のようにメンバ変数としてfoo型変数を使いたい場合、
fooが不完全型なのでそのサイズがわからず、したがって
MyClassのために確保すべき領域のサイズもコンパイラには分からないことになるからです。
前方宣言で足りるのはfoo型メンバ変数ではなく
foo型への参照型メンバ変数やfoo型へのポインタ型メンバ変数、
あるいはメンバ関数の戻り値としてfoo型を使用する場合などです。


768:デフォルトの名無しさん
09/06/08 18:54:54
ユーザが入力した数式を処理するプログラムを考えているのですが
cin>>eq;
#define function(x) (eq)
cout<<function(1);

みたいなことができませんんか?もしくは別の方法があったら教えてください

769:767
09/06/08 18:54:56
あとはまあ
前方宣言で足りるのは
メンバ関数の引数の型としてfoo型を使用する場合

typedefとかかな。
 > さて、その別クラスの名前が、名前空間 bar の下にあるとき、
 > namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?
それでいいと思いますが。
class bar::foo;とか書いても無理ですし、それ以外記述できないですよねぇ?

もし有識者がいらしたらそっちを信用してください。


770:767
09/06/08 18:56:45
>>768
意味不明ですが、どういうことですか?
プリプロセッサにより
cin>>eq;
cout<<((eq));//xは無視される
として処理されるだけですが。。。

771:デフォルトの名無しさん
09/06/08 19:01:07
>>770
768に書いたのはあくまでイメージです。言葉足らずですみません
私がしたいことは引数にある文字列を数式として扱いたいのです
もしくはcinで入力した式をプログラムで処理したいのですが


772:デフォルトの名無しさん
09/06/08 19:02:27
ほんとは言語の問題じゃないかもしれないけど教えてください

①double配列と、②メンバがdoubleいっこだけの構造体の配列を読み上げる速度を比較するための
コードを書いて実行してみたら②のほうが速かったです

環境はItanium、CentOS、GCC(C++)です

これはなぜなんでしょうか?

773:デフォルトの名無しさん
09/06/08 19:04:08
そうなったから

774:767
09/06/08 19:04:19
>>771
言いたいことは分かりました。
C++の知識はどのくらいありますか?
STLやBoost C++はご存じですか?
C言語じゃなくてちゃんとC++らしいコードが書けますか?

775:デフォルトの名無しさん
09/06/08 19:05:31
>>772
不思議だわ。
・・・最適化とかレジスタの割り付けとか、もう不確定要素に押されて結果が揺らいでるだけじゃないか?

つまりどっちで書いても大差ないから好きな方で記述すればよか。

776:デフォルトの名無しさん
09/06/08 19:08:39
>>774
c++は初めて3か月くらいですが、STLはつかったものがあるので
簡単なものなら大丈夫だと思います。

777:デフォルトの名無しさん
09/06/08 19:09:25
>>775
計算時間半分くらいでした

ちなみにこれに気づいたのは構造体メンバのアライメントに関する実験中でした




コンパイラが賢くなりすぎてマニアックな知識も必要ない時代になったんですかねえ・・・

778:デフォルトの名無しさん
09/06/08 19:11:11
普通のポインタがインスタンスを持ってるかどうか判別する方法はありますか?
現状ではポインタのゼロ初期化とdelete・0代入を徹底するぐらいしか手段が思いつきません

779:767
09/06/08 19:11:28
>>776
せっかくSTLの知識の有無を聞いたのですが、STLつかった実例が見つかりませんでした。
とりあえず適当なリンクを張っておきます。

以下の中で、上に挙げられている物の方が
より優れていると思ってください。

letsboost::spirit
URLリンク(www.kmonos.net)
数式解釈プログラム - uPage
URLリンク(www-as.dse.ibaraki.ac.jp)
七行プログラミング
URLリンク(cm.xrea.cc)

LISPですが
記号数式処理
URLリンク(www-antenna.ee.titech.ac.jp)


780:767
09/06/08 19:13:06
追記。
>>776
Spiritで数式を解釈させるなら
boost::spiritっちゃえ!
URLリンク(tamachan.club.kyutech.ac.jp)
C++ Labyrinth
URLリンク(www.fides.dti.ne.jp)
Spirit v1.6
URLリンク(boost.cppll.jp)
これらが有名で質も高いと評判です。


781:デフォルトの名無しさん
09/06/08 19:14:34
>>768
これでイメージが湧いたらそいつは一流のエスパーだwwwww

782:767
09/06/08 19:17:06
>>778
>普通のポインタがインスタンスを持ってるかどうか
有効な領域を指し示しているかどうかとおっしゃりたいものと推測・解釈します。
結論から言えば、
普通のポインタでしたら、そんな方法はありません。
指し示す領域が有効かどうかなぞわかり得ません。

783:768
09/06/08 19:22:56
>>782
いろいろ情報ありがとうございます。


784:764
09/06/08 19:45:30
>>767>>769
ありがとうございます

>宣言
やっぱ namespace bar { class foo; }; って書くしか無さそうですね。
階層が深いとちょっと面倒かな?と思っただけなので、特に問題はありません。

>メンバ変数
確かに、メンバ変数を直接弄ろうとすると前方宣言だけじゃダメですよね。
まあ、素直にアクセサ付けれ、って話ですが。


>>765
確かに、 std::string とかは上記の方法じゃ出来ないですね。


785:デフォルトの名無しさん
09/06/08 20:11:52
C++の関数で文字列を参照渡しする方法がわかりませ
ん &stringだと弾かれたし

786:デフォルトの名無しさん
09/06/08 20:16:09
>>785
参照の記述を勉強してください。
クラス名& ref=参照先;
で記述します。


787:785
09/06/08 20:23:15
参照の書き方って&nと違うの?

788:デフォルトの名無しさん
09/06/08 20:31:10
>>787
まずは日本語から覚えた方がよさそうだな

789:デフォルトの名無しさん
09/06/08 20:33:46
char &string;
って書いてるんだったりして。

790:786
09/06/08 20:36:41
もう らちがあかないので

ソースみせるか、
参照の記述を勉強し直すか、
名前空間を記述するか

せめて少なくとも1つはやってみせてください。
なんかアドレスとごっちゃになってそうな予感もしますね。

791:デフォルトの名無しさん
09/06/08 20:39:25
int func(const char *string)

792:デフォルトの名無しさん
09/06/08 20:40:24
途中送信。>791を参照渡しにする

793:786
09/06/08 21:04:14
>>791
それだけエスパーを強制しすぎです。

適当に答えるなら
//before
int func(const char *string);
const char * const p="mojiretsu";
func(p);
がアドレス渡し(ポインタ渡し)で、
//after
int func(const std::stirng &string);
std::string str="mojiretsu";
int func(str);
が参照渡しです。

せめて前後関係の分かるソースを見せてください。
答える側が書いたソースの方が長いっておかしいです。


794:デフォルトの名無しさん
09/06/08 21:16:08
foo *p = new foo[bar]; delete p;
がまずいのはわかるんだけど
foo *q = new foo; delete [] q;
ってーのはべつにやばくない・・・よね?

795:デフォルトの名無しさん
09/06/08 21:16:58
やばいよ。何が起きても知らないよ。

796:デフォルトの名無しさん
09/06/08 21:17:12
std::stringで書き変えるのは要求を満たしてない気がするなあ。

797:デフォルトの名無しさん
09/06/08 21:19:34
>>794
配列をnewしたときは、その配列のサイズなんかも保持しておくので
配列じゃないのにdelete[]だと、関係ない部分にアクセスする危険性がある……と教わったが、正確には違うかも。

798:786
09/06/08 21:21:37
>>796
彼は
>C++の関数で文字列を参照渡しする方法
と言っています。
別にconst char*型変数を参照渡ししてもいいんですが、
もうエスパーするしかないからわかりませんよ。


799:デフォルトの名無しさん
09/06/08 21:23:02
>>794
だめな理由は処理系によりいろいろあるだろうけど、そんなの関係ない。
「仕様上認められていない」ってだけで
十分に鼻から悪魔が出てくると結論づけられます。

800:デフォルトの名無しさん
09/06/08 21:26:52
C++はめんどくさいな

801:デフォルトの名無しさん
09/06/08 21:36:37
>>800
なにを今更w

802:デフォルトの名無しさん
09/06/08 21:50:39
C++に限らず、多種多様の実装が存在する言語は多かれ少なかれそういう傾向にあると思う。

803:デフォルトの名無しさん
09/06/08 23:34:58
doxygen = デュクシジェン

804:デフォルトの名無しさん
09/06/09 01:06:17
doxygen destroyer

805:デフォルトの名無しさん
09/06/09 04:19:56
>>804
スレリンク(gamedev板:692番)

692 :名前は開発中のものです。:2009/06/09(火) 00:57:34 ID:2fI/sHFo
何言ってんだ。プログラマにまともな精神持った奴がいた試しなんてねえよ。
第一プログラマと精神科なんてほとんどセットなのに今更それを語るとか情弱以下だろ。

806:デフォルトの名無しさん
09/06/09 04:31:40
C言語をやりたいんだけど

Microsoftのc++ExpressEdition
ってのでもできますか?

#include <stdio.h>
int main(void){
printf("aaaa");
return 0;
}
みたいなのもちゃんとできますか?

807:デフォルトの名無しさん
09/06/09 05:09:32
>>806
Microsoft Visual C++ 2008 Express Edition
の事ですね。
可能です。
ですが、最初はコンソールの方が分かりやすいと思いますよ。
C/C++初心者なら
bcc5.5.1+bcc developer
がなかなかオススメ。
エラーメッセージが分かりやすいので。
複雑なテンプレート等、まともなC++をやりたくなったらその時初めて
Microsoft Visual C++ 2008 Express Edition
gcc3.x, gcc4.x
などを試せば良いかと思います。


808:デフォルトの名無しさん
09/06/09 09:17:19
まあ鼻から悪魔が出ることは無いと断言できる

809:デフォルトの名無しさん
09/06/09 15:45:37
C/C++というよりLinuxの質問になってしまうのですが、
mq_sendとmq_receiveでメッセージキューのパラメータに
任意の構造体を渡すことはできますでしょうか?
関数仕様ではchar*のみのようですが。

メッセージキュー以外の方式で別プロセスに任意の型の
値を渡す代替案があればそれでも良いのですが。

810:デフォルトの名無しさん
09/06/09 16:10:40

mmapとかpipeとか
プロセス間通信は、Linuxの方で聞いた方がいいかもね

811:デフォルトの名無しさん
09/06/09 16:13:22
使ったこと無いけど
文字列にシリアライズして渡すんじゃねーの
そんな雰囲気のある関数っぽい


812:デフォルトの名無しさん
09/06/09 17:07:30
>>809
昔は, 任意のバイト列に対するポインタは char* を使っていた
で, 関数使用はその名残だと思うんだわ

# kernel 内部の caddr_t とかの絡みもあるとは思うが………

構造体とか配列とかもバイト列として表現できるわけだから,
キャストすれば何でも可


813:デフォルトの名無しさん
09/06/09 17:08:35
>>812
× 関数使用は
〇 関数仕様は


814:デフォルトの名無しさん
09/06/09 17:27:02
なるほど、ありがとうございます。
mmapとかの共有メモリがお手軽そうですね。

>>812
やはりできるんですね。やろうとしてsegvでちゃったん
ですが、できるとわかればもうちょっと調べてみます。


815:デフォルトの名無しさん
09/06/09 17:29:28
vectorのmax_size()って中の人はどうやって計算してるの?

816:デフォルトの名無しさん
09/06/09 17:51:40
bad_alloc出した場合って普通何をするもんなのかな
・APIとかで開いた画像ファイルとかを閉じる
・そのメソッドで確保成功した分のメモリを開放する
・そのメソッド内での仕事が完了したらbad_allocを上に投げる
・再帰的に開放作業を繰り返して、一番上でプログラム終了
とかでいい?

817:デフォルトの名無しさん
09/06/09 18:01:25
>>815
gcc 4.1は単にsize_type(-1) / sizeof(value_type)を返してた。
VC2008は、上の値とアロケータの最大サイズと比較してちっさい方返してた。

818:デフォルトの名無しさん
09/06/09 19:52:52
void Initialize(){
ここで配列を5本動的確保

}

そしてこの関数で使いたいんですがどうすればいいですか?
void calc(){

}
calcは何度も呼び出すのでcalc内で動的確保するのは無駄だと思いました。

819:デフォルトの名無しさん
09/06/09 20:03:38
template <typename _T,int _Size>
class hoge
{
private:
  std::vector<_T> _vec[5];
public:
   void Initialize(void)
  {
    for(int i=0;i<5;++i) _vec[i].reserve(_Size);
  }

   void calc(void)
  { 以下略

};


820:デフォルトの名無しさん
09/06/09 20:09:32
vectorとかのコンテナのサイズを変えるときはtry-catch(bad_alloc)したほうがいいの?

821:デフォルトの名無しさん
09/06/09 20:17:52
>>819
できればSTLなしで・・・

822:デフォルトの名無しさん
09/06/09 20:48:36
>>821
お前の質問に対する答えが>>819なわけだが、STLがその答えの本質じゃないことぐらい判るだろ。
コードを一から書いて欲しいなら宿題スレ行ってこいよ。

823:デフォルトの名無しさん
09/06/09 21:17:14
内容がC++からちょっとずれますがお願いします。
大学ではじめてのC++で勉強しているのですが、phpの初心者向けサイトで
コードをみたところc++と似ていて驚きました。c++はphpにも応用が利くと聞いたのですが、
C++をどの程度できるようになればphpでも簡単なwebサービスをできるでしょうか?

824:デフォルトの名無しさん
09/06/09 21:32:03
C++をいくら極めてもwebサービスはできんじゃろ。
なんせ標準ライブラリにwebに関するものはまったくはいっとらんからな…。

825:デフォルトの名無しさん
09/06/09 21:33:51
>>821
STLなしでとか何言ってるの?
まさかSTLない環境でやってるわけじゃなくて知識がないだけでしょ?
ちょっとで良いから勉強しろよ。

826:デフォルトの名無しさん
09/06/09 21:34:11
>>814
Linux の実装はしらんが, Solaris とか *BSD とかの実装だと,

mq_send で msq_ptr からサイズ分 kernel 内バッファにコピーして,
mq_receive で該当領域を読み出し側にコピーする

で, kernel は該当領域にアクセス可能か否かの test 程度は行っている
ので, とんでもない引数を与えると EINVAL か何かが返るはず

segv が発生するのは, mq_receive で, msq_ptr として与えた領域サイズより
大きな msg_len を与えてスタック書きつぶしたときくらいじゃ内かな?


827:デフォルトの名無しさん
09/06/09 21:34:16
文字処理が面倒だけど
cgiで起動すれば出来るんじゃね。


828:デフォルトの名無しさん
09/06/09 21:36:02
0から99までの乱数を表示するプログラムを作ったんですが、コンパイルしたらまた新たな乱数を表示するにはどうすれば良いのですか?


829:デフォルトの名無しさん
09/06/09 21:42:11
>>828
乱数系列切り替えればええんちゃうの?


830:デフォルトの名無しさん
09/06/09 21:44:31
時刻でも乱数シードに使えばいい

831:デフォルトの名無しさん
09/06/09 21:46:56
>>828
乱数の生成方法によって違うけれど乱数の種を設定できる仕組みがあるはずだからそれで種を変更する。

832:デフォルトの名無しさん
09/06/09 21:50:14
>>829-831
ありがとうございます。
すいません。
かなり初心者なので、出来れば、詳しくお願いします。
今main関数の中が
cout<<rand()%100<<endl;
だけなんですが、何かつけ加えますか?

833:デフォルトの名無しさん
09/06/09 21:54:17
>>832 そうゆう話なら取りあえず処理系の名前を書け


834:デフォルトの名無しさん
09/06/09 21:54:55
↓以下乱数の質について

835:デフォルトの名無しさん
09/06/09 21:56:53
箱を開けたら猫

836:デフォルトの名無しさん
09/06/09 21:58:12
>>833
bcc32です。

837:デフォルトの名無しさん
09/06/09 22:06:15
メルセンヌツイスタでぐぐるといいよ

838:デフォルトの名無しさん
09/06/09 22:10:23
>>836
けっして誉められた手法ではないんだろうが
おそらく
sland(time(NULL))
とかやっとけば?

>>834 が期待してるように
用途に応じて生成される乱数の品質とかアルゴリズムとかが問題になる
置くの深い部分だけどな


839:デフォルトの名無しさん
09/06/09 22:18:59
標準の乱数は大きな素数を割ってるだけみたいな単純な実装なので
それをそのまま使うとカルドセプトサーガみたいなことになるかもね♥

840:デフォルトの名無しさん
09/06/09 22:25:25
>>838
ありがとうございます。
やってみます。

841:デフォルトの名無しさん
09/06/09 22:31:08
>>837
ありがとうございます。
参考にしてみます。

842:デフォルトの名無しさん
09/06/09 23:33:38
どういたしまして

843:デフォルトの名無しさん
09/06/10 00:59:13
質問したいのですが誰かいますか?

844:デフォルトの名無しさん
09/06/10 01:00:12
います

845:デフォルトの名無しさん
09/06/10 01:11:32
じゃあ質問させていただきます。
今、作っているプログラムはあるファイルから特定の部分の値を読み込み
値だけのバイナリファイルを書き出すプログラムを作っているのですが。
sstreamを使い、値を変数に格納したいのですがfloat型だと格納できるのですが、
int型だと格納されません。
どうしてか教えてください。
ソース:
stringstream ss(f_buf);

int test[16 * 3]; //ここがint型だと値が入らない

for(int i = 0; i < (16 * 3); i++){

ss >> test[(i * 3)] >> w >> test[(i * 3) + 1] >> w >> test[(i * 3) + 2] >> w >> w;

}

データ:
0;1;2;,
1;2;3;,


846:デフォルトの名無しさん
09/06/10 01:13:48
>>845

追記

stringstream ss(f_buf);の下に
char w; //記号を飛ばすための変数

847:デフォルトの名無しさん
09/06/10 01:19:14
どうしてでしょう?

848:デフォルトの名無しさん
09/06/10 01:20:34
わからん

849:デフォルトの名無しさん
09/06/10 01:27:14
どなたか>>845の理由が分かる人いますか?

850:デフォルトの名無しさん
09/06/10 01:29:17
たとえば古いgccはstringsteamの中身に挙動不審なバグがあるので、それが原因かもしれない。
今やってみたらとりあえずgcc 4.1とVC2008はどっちもちゃんと動いた。

#include <iostream>
#include <sstream>

using namespace std;

int main(void)
{
  int t[3];
  char w;
  stringstream ss("1,2,3,,");

  ss >> t[0] >> w >> t[1] >> w >> t[2] >> w >> w;

  cout << t[0] << " " << t[1] << " " << t[2] << endl;

  return 0;
}

出力
1 2 3

851:デフォルトの名無しさん
09/06/10 01:34:22
>>850さん、ありがとうございます。
環境をかくの忘れてましたね…
環境はVC2005です。
>>850さんのソースも試してみましたがやはりだめなようです…
変数を作った時の不定な値が入ったままでした。
2008でビルドしてみようかな…

852:デフォルトの名無しさん
09/06/10 10:06:43
あるディレクトリ下にあるファイルを読み取ってから削除するという処理をしているのですが、希にコピー途中のものを読み取ってしまい、
思ったような動作が出来ない場合があります。アクセスしようと(もしくはアクセス中の)ファイルが、コピー中であるか否かの判断は
一般的にどのような方法で実装するのでしょうか。

853:デフォルトの名無しさん
09/06/10 10:07:49
>>852
OSは?

854:デフォルトの名無しさん
09/06/10 10:09:47
>>853
Windows 2000/XP です。コピー元は同じPC上の時もあれば、ネットワークを介して他PCからの場合もあります。

855:853
09/06/10 10:19:57
俺はUNIX屋なので、後は誰かに任せた。

856:デフォルトの名無しさん
09/06/10 11:04:35
>>854
writeオープンしてからコピーする

857:デフォルトの名無しさん
09/06/10 11:55:21
FILE_FLAG_DELETE_ON_CLOSEフラグ付けて開くとか

858:デフォルトの名無しさん
09/06/10 12:41:47
std::stringでTCHAR扱えないので
std::basic_string<TCHAR>を使うってのはグーグル先生でわかったんですが、
入出力の方法が今度はわかりません。グーグル先生に聞いてもわかりませんでした。
std::cinやstd::coutの代わりにどのように使うんでしょうか?

859:デフォルトの名無しさん
09/06/10 14:19:21
//hoge.h
class CHoge {
public:
 void hoge();
};

//hoge.cpp
#include "hoge.h"
void CHoge::hoge() {・・・};

このCHoge::hogeを省略してhogeだけで書きたいんですけどそういうことはできますか?
なぜかusing CHoge::hogeではできませんでした

860:デフォルトの名無しさん
09/06/10 14:22:27
名前空間じゃなくてクラス名か。
全然「なぜか」じゃねーw

どうしても面倒なら、ヘッダファイルに中身も書いたら?

861:デフォルトの名無しさん
09/06/10 14:30:00
C#を使えばおk

862:デフォルトの名無しさん
09/06/10 14:34:07
>>858
wstring & wcoutを使う。

>>859
#define hoge CHoge::hoge

863:デフォルトの名無しさん
09/06/10 14:51:54
+とか+=とか、そういった四則演算関連の演算子オーバーロードを作成したいのですが、
ネットで見ると、戻り値が参照だったり実体だったりして、演算子によって違うみたいです。
どういう考え方で参照と実体の使い分けをしているのでしょうか?


864:デフォルトの名無しさん
09/06/10 14:58:39
関数を抜けても壊れない参照を返せるなら基本参照返し。
一時オブジェクトを返さざるをえないなら泣く泣く実体返し。

865:デフォルトの名無しさん
09/06/10 15:49:30
float型の変数がゼロかどうか(誤差も含めて)判断するときに、
1e-4fみたいな数字で比較を行っているコードを見たんですが、
こういう数字の記述の仕方(意味)を説明してるウェブページをどこか知りませんか?


866:デフォルトの名無しさん
09/06/10 15:53:30
科学表記とかでぐぐる

867:デフォルトの名無しさん
09/06/10 17:32:36
初歩的な部分ですが、

while(i--) 処理

は「iの値が評価され、処理を実行するか決定する」→「iがデクリメントされる」

while(--i) 処理

は「iがデクリメントされる」→「iの値が評価される」

ということで、i>0なら前者は処理が i 回、後者は (i - 1)回行われるということでよいのでしょうか。

868:デフォルトの名無しさん
09/06/10 17:34:44
コーディングの最終段階に入っていて、
なるべく見通しが良くなるように関数に処理を分割したりしています。
a,b,cという関数が有って各関数はうまく行けば0を返し失敗すれば1を返します。
aがうまく行けばbを,bがうまくいけばcを行いcがうまく行けば
最後に少量の出力が有ります。
そこで、今の段階はプロトタイプとして
int main()
{
if(a == 0) {
if(b == 0 {
if(c == 0{
//some print
}
}
}
return 0;
}
となっているのですが、ネストが深くなりすぎているような気がしてなりません。
なにか良い方法が御座いましたらご教授願います。

869:デフォルトの名無しさん
09/06/10 17:37:21
if (!a && !b && !c)

870:デフォルトの名無しさん
09/06/10 17:41:00
!(a||b||c)

871:868
09/06/10 17:43:50
見落としていた点が有りました。
追加で書きますがお許しください。
aが失敗すればプログラム終了
bが失敗すればプログラム終了
cが失敗すればプログラム終了
とそれぞれ行いたく思います。
よろしくおねがいします。

872:デフォルトの名無しさん
09/06/10 17:50:39
それは a が false を返す代わりに exit(1) を呼び出せばいいじゃないか^-^

873:デフォルトの名無しさん
09/06/10 17:57:00
>>872
そうなんですよね、一度そのような事を考えたのですが
言語はC++なのですが、
URLリンク(kmaebashi.com)
というページを見かけてなんとなく怖くなってexit()を使わなくしたのですが、
実際どうなのでしょうか?
よろしくおねがいします

874:デフォルトの名無しさん
09/06/10 18:09:17
どっちにしても>>869>>870でOK。

875:デフォルトの名無しさん
09/06/10 18:11:32
>> 874
ありがとう御座います。
無事きれいになりました!!
感謝感激です。

876:デフォルトの名無しさん
09/06/10 18:52:22
C++にはJavaのObjectクラスに相当するようなものは無いんでしょうか?

Java使い向けに書かれているデザインパターン本を読んでて
脳内翻訳するのに必要になったもので

877:デフォルトの名無しさん
09/06/10 18:59:05
全然別人が話に食いつきます。
>>873が言う
>ISO/IEC 14882:1998 3.6.1-4
>exit 関数を呼び出すことは現ブロックを抜けずにプログラムを終了させることであるため、
>自動記憶域期間を持つオブジェクトは破棄されない。
>静的記憶域機関を持つオブジェクトのデストラクタ中から
> exit を呼び出すことは、未定義の動作を引き起こす。
これって
巻頭言 2000~
URLリンク(park1.wakwak.com)
ここに書いてあるとおりなんだろうが、
恐ろしいよねぇ。


878:デフォルトの名無しさん
09/06/10 19:37:24
もよもと exit はプログラムの異常終了時くらいしか使わんからなー。

879:デフォルトの名無しさん
09/06/10 20:17:11
>>858
自分で作ればいい。
#ifdef UNICODE
# define tcin std::wcin
# define tcout std::wcout
# define tcerr std::wcerr
# define tclog std::wclog
#else
# define tcin std::cin
# define tcout std::cout
# define tcerr std::cerr
# define tclog std::clog
#endif
あと、mainの頭で、文字コード変換が行われるように指示しておく。
std::locale l(""); // 数値を取り扱うならstd::locale l(std::locale::classic, "", std::locale::ctype);のほうがよいかも。
tcin.imbue(l);
tcout.imbue(l);
tcerr.imbue(l);
tclog.imbue(l);

880:デフォルトの名無しさん
09/06/10 20:57:45
C++なら例外使えばいいのに

881:デフォルトの名無しさん
09/06/10 21:00:13
>>880
誰もキャッチできない例外をスローするってこと?

みんなはそうしてるの?

882:デフォルトの名無しさん
09/06/10 21:03:14
例外のよい使い方がいまだにわからん

883:881
09/06/10 21:14:30
>>882
俺は
関数の戻り値は正常値ならおk、
異常値を返す場合は-1とか0とかそういう値に限り、
不完全なオブジェクトを返すような形は
とらないようにしている。
そして不完全なオブジェクトを返さざると得ない時に
例外を使っている。

・・・でもやっぱり俺もわからない。

884:デフォルトの名無しさん
09/06/10 21:15:49
スレリンク(tech板)
ここの>>740が妙な提案をしていたよ。
もっとも実際には出来なさそうって結論になったのだが。

885:デフォルトの名無しさん
09/06/10 22:06:18
ABCが失敗したら例外発生させて、キャッチして適当に処理して return 0 すればいい。


886:デフォルトの名無しさん
09/06/10 23:24:46
VC++を勉強するのにお勧めの本ありますでしょうか?
初級~中級くらいをめどに

887:デフォルトの名無しさん
09/06/10 23:29:14
いわゆるぺゾルト本。
Programing Windows 第5版。

定番なので。

888:デフォルトの名無しさん
09/06/10 23:32:10
>>886
VC++だから、MFCかも知れないが
普通にSDK使う程度なら、wisdomとか入門サイトから見るといいよ
俺はいろいろなサイト見て学んだ

889:デフォルトの名無しさん
09/06/10 23:33:06
>>887
URLリンク(www.amazon.co.jp)

これのことでしょうか?すごくとっつきにくそうなんですが

890:デフォルトの名無しさん
09/06/10 23:37:56
今時MFCはどうかと思うけど、お勧めの本はなさす。
中級以上なら、Effective C++のシリーズお勧め

891:デフォルトの名無しさん
09/06/10 23:38:07
この本は原著じゃなくても翻訳はまともだから大丈夫だよw

プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版!
(Microsoft Programming Series) (単行本)

まぁ…とっつきにくい感じはするかなぁ。
まぁ、あくまで定番ってことで。

892:デフォルトの名無しさん
09/06/10 23:40:51
Effective C++はもちろん名著だけど、VCの勉強にはならんじゃろw

893:デフォルトの名無しさん
09/06/11 00:16:36
質問です

Cでファイルに書き込むときに
fwrite(str, 1, strlen(str), fp);
fwrite(str, strlen(str), 1, fp);
とどちらが一般的ですか?何か違いは出てくるのでしょうか?

894:デフォルトの名無しさん
09/06/11 00:24:08
VC++で、いっぱい書店においてるような本はどうなのですか?
入門~やや中級手前レベル?の内容くらいかいてるようにはみえたのですが
役に立たないのかな

895:デフォルトの名無しさん
09/06/11 00:56:43
>>894
プログラミング言語を全く知らない人が、いきなりVCに手を出す状況とかなら
決して悪くはないんじゃないかしら?

896:デフォルトの名無しさん
09/06/11 01:49:07
>>893
fwrite(str, 1, strlen(str), fp);
に1票。
なんとなく2番めの引数は型のサイズ、3番めの引数はその個数って
思っている。


897:デフォルトの名無しさん
09/06/11 04:45:58
>>893
>fwrite(str, 1, strlen(str), fp);
1バイトをstrlen(str)分書き込む、成功した際の戻り値がstrlen(str)

>fwrite(str, strlen(str), 1, fp);
strlen(str)バイトを1回書き込む、成功した際の戻り値が1

結果は同じ
ただ、意味のあるデータなら後者の方が意味的に良くない?

898:デフォルトの名無しさん
09/06/11 07:13:39
>>895
>プログラミング言語を全く知らない人が、いきなりVCに手を出す状況
そうとうな窮地だな。

899:デフォルトの名無しさん
09/06/11 07:24:29
#include <iostream>
#include <list>
int main() {
std::list<int> nums1;
nums1.push_back(4);
nums1.push_back(6);
std::cout << nums1[0] << std::endl;
std::cout << nums1[1] << std::endl;
return 0;
}
vectorで動いたソースをlistに変更してみたら動かないのでしがなんででしょうか?

900:デフォルトの名無しさん
09/06/11 07:52:45
エラーメッセージ読めよ


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