[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/24 21:17 / Filesize : 258 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.38【環境依存OK】



1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


2 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 22:35:41 ]


3 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 22:57:43 ]
3ならC++は廃れる。

4 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 22:59:14 ]
殺す

5 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:00:47 ]
           ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < 通報しますた!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < しますた!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ!! .スタ!!

6 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:01:44 ]
おいおい
ここはいつからネタスレになったんだ

7 名前:2 mailto:sage [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
www.gundam00.net/

8 名前:2 mailto:sage [2007/06/03(日) 23:12:01 ]
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < ころしますだ!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < 殺します!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ-ベーション!!

9 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:05:40 ]
構造体の初期化で
={0}とmemsetによる初期化ってどう違うのでしょうか?
またどちらの方がいいですか?

10 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:11:34 ]
>>9
前者の方が普遍的。
後者は間違いの元。
積極的に使う理由がないなら前者でOK。



11 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:14:09 ]
動作はそんなに変わらないけど
={0} : 他のメンバが初期化されてない、って警告が出る場合がある。
memset : ビットパターンが0であると保証されているわけではない型
(ポインタとか)でぐだぐだ言われる場合もないわけでもない。それと、
ゼロクリア処理であって、初期化ではないので、挟もうと思えば処理を
挟むことができてしまう。

12 名前:9 mailto:sage [2007/06/04(月) 00:29:40 ]
>>10-11
ありがとうございます。できるだけ前者を使う事にします。

13 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:53:18 ]
                  / .:/::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

14 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:53:15 ]
Borland C++ 5.5.1+BCC Developerを使っています。
あるクラスのメンバ関数を別ファイルにし#includeしているのですが

・型限定子 '***' がクラス名または名前空間名ではない
・宣言が正しく終了していない

というエラーが出ます。

このファイルをプロジェクトからはずすとコンパイルでき
問題なく実行できるのですが、なぜでしょうか。
また、クラス宣言内に関数を書いてもうまくいきます。

15 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 05:11:56 ]
どうせ ***.cpp を #include してるんだろうが、
***.cpp もそれ単体でコンパイルされるからだ。

つーか、何で #include してるかが気になる。

16 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 09:23:11 ]
system関数でunixのコマンドを実行する際に、結果が戻ってくる前に、次の行へ実行を移したいのですが、
どのようにすればよいのでしょうか?
コマンドラインでいうところの&をつけてバックグラウンドで実行するような形にしたいのです。

17 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 10:15:54 ]
>>16
一般的にsystem()はシェルを経由してコマンドを呼び出すので、単に&をつければいい。
Ex.
system("sleep 86400&");

18 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 10:19:54 ]
情報系学部の大学2年です。将来はプログラマ・システム関係に就きたいと思っています。
環境は自分のパソコンにCygwinを入れて使っています。
今まではアスキー出版の「C言語入門」という本で勉強してきて基本的なことは理解しています。
それでC++にはいつ頃から入ればいいでしょうか?まだ早いでしょうか?
またこれから何を勉強していったらいいかいまいち先がわかりません。
簡単なゲームを製作することが目標です。
ただプログラミングは楽しんでいるのでこれからも続けていきたいです。
大学の授業ではC言語のアルゴリズムを勉強中です。

19 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 10:30:28 ]
いつでも

20 名前:デフォルトの名無しさん [2007/06/04(月) 13:23:33 ]
車のナンバーと色の情報を100台分入れるArrayを作るために
struct car {int number;
string color;
};
car cars[100];
のように宣言したのですが。

これを並び替えるための関数を作り、関数の宣言したいのですが。
void function(car cars[])
のような宣言の仕方でいいのでしょうか?

質問がわかりにくくて、申し訳ないです。



21 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:25:30 ]
void function(struct car*)とか
void function(struct car[])で良いんじゃないの。

22 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:26:46 ]
>>20
AoSよりSoAを使え。


23 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:26:55 ]
それでいいと思うけど、高々並び替えるだけの目的なら関数を自作する必要はないと思うよ。
その構造体の比較関数をオーバーロードして、std::sort()呼ぶだけでいいんだから。

24 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:29:38 ]
>>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;
}


26 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:48:34 ]
コンパイルエラー出まクリスティ

27 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:53:26 ]
同一のスコープ内で 同じシンボル名の変数(fin な)を2回宣言してる

28 名前:20 [2007/06/04(月) 13:54:52 ]
二種類のファイルを呼ぶには、どうしたらいいのでしょうか・・・

29 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:57:17 ]
違う名前にするかopen使うかすればいいんじゃねーの
入門書読めばわかる

30 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 14:27:31 ]
クラスでnew,delete演算子をオーバーロードしたいんですが、
staticじゃないといけないんでしょうか?
エラーが出て困ってます。




31 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 14:30:56 ]
そうですか。

32 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 14:55:06 ]
そうですね。

33 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 15:17:32 ]
そうですく。
そうですれ。

34 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 15:28:45 ]
>>31-33金くれ

35 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 18:32:08 ]
>>30
staticを付けなくてもstatic扱いされる。だって実体がまだ/もう存在していないから。
これに限らず静的メンバは、ただそのクラスに関連があるからクラス宣言の中に入っているだけと思えばいい。

36 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:51:23 ]
>>9
遅レスなんだが、みんな{0}初期化なの?

個人的にCでtypedef enumを使うんだが、こいつが一番始めにいると
型違いエラー(警告だっけ?)になるからずっとmemsetを使うようになったんだが。
わざわざ、メンバの順番意識するなんてバカらしいし・・・

37 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:55:30 ]
浮動小数点数の0とヌルポインタのビットパターンが
単に0を並べただけと規定されているわけではないから

もちろん自分の環境でそうなっているのなら、
移植性無視してやるという選択肢はある

38 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:56:43 ]
そういう構造体にはコンストラクタを作ってしまうので無問題。

39 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:03:05 ]
>>37
>>38
いや、C++だったらコンストラクタでポチポチ初期化するよ。
浮動小数点は使わない(使えない)環境なんで問題ないんだが、
NULLポインタはどうしようもないな。今の環境は0だから問題ないんだけど。




40 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:32:09 ]
コンストラクタでよいのなら、
そのような構造体用の初期化関数をつくってポチポチ初期化してみては。
あるいは、初期化専用のglobal変数を確保しておいて、それを代入することで
初期化するとか。

後者はmutexを初期化するときにPTHREAD_MUTEX_INITIALIZERを使う
のと同様の使い勝手になると思いますので、そういう感じの
名前をつけておけば紛らわしさも無いかと。



41 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:46:07 ]
>あるいは、初期化専用のglobal変数を確保しておいて、それを代入することで
初期化するとか。
一時期はそういう風に初期化してた。
const XXX_STR INIT_TABLE = {0};  // global

ソース内
XXX_STR strValue;
strValue = INIT_TABLE

で、構造体のメンバの頭にtypedef enumが来たときにVCでコンパイルエラー。
確かにそうだよな・・・って思って、全部memsetにしたんだ。
組込みなもんで、C→C++になんて早々変わらないんだ。
しばらくはこのままmemsetでやっていこうと思う。


42 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:49:20 ]
>>41
global変数なら
= { 0 }
とかは、べつにいらないのではないでしょうか。

43 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:50:02 ]
つうかenumは明示的に指定して初期化すべきだろ
memsetて

44 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:59:21 ]
>>42
global変数ってのは間違ってたかな?
初期化用のconstデータを作るって感じで

>>43
構造体内のメンバに変更があったときに、面倒なのと
チーム内で変数の0=異常値として扱ってるのでまぁいいかなと・・・
いや、わかってるんだけどね・・・昔からの流れは中々変えさせてもらえなくて

45 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:08:21 ]
>>44
global変数の場合ですと、ゼロで初期化したいだけなら、規格に
準拠している処理系なら自動的にそうなるので、= { 0 } は不要です。

enumのようなものを含む型に初期値を正しく与えたい場合には、例えば
= { none, 0, ... }
とでも書けばよいではありませんか。
global変数による初期化を利用するのなら、こう書くのは一箇所だけ、
型の定義を変えても変更はそこだけで済みます。


46 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:29:01 ]
>>45
いや、組込みなんで、処理系なんてもんがいてくれればそれでいいんだけど
RAM配置からコールドスタート処理、レジスタ設定からその他初期化処理まで
やるのは自分なわけで・・・って関係ないか。
ま、そんなわけで、自動的に初期化なんてしてはくれないわけですよ。

>enumのようなものを含む型に・・・
{0}によって、後ろの省略されたメンバを0で初期化するって話とずれてません?
全部、初期化子書くなら初期化用の関数でも同じですよね?

って、そろそろすれ違いなんでやめますか。
板汚し、失礼しました。

47 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:42:48 ]
>46
組み込みのイニシャルルーチンは無いの?
そこでRAMの初期化をするはずなんだが

48 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:48:22 ]
>>47
領域クリアしてるよ
いくつかの領域にわけて、初期化内容に応じてどこまで初期化するか決定してる。
で、そこで初期化されると困るけどメインルーチンに戻ってきたときには
初期化しておいてほしいやつとかを、ぽちぽち初期化してる。

いや、そんな変数ばっかの環境が悪いとかは言わないで・・・

49 名前:デフォルトの名無しさん [2007/06/05(火) 03:04:00 ]
>48
なんでRAM全領域を初期化しないの?

50 名前:49 mailto:sage [2007/06/05(火) 03:06:39 ]
ここ初心者対象スレだったね。
組み込みの話題は別にします。



51 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:19:39 ]
π計算はそのパソコンの性能がわかるって聞いたんだけど質問させて。
Q1,πって高校数学でも式作れるよね?
  それをプログラムにすればいいんじゃない?とか思ったんだけど・・
  でもサイト調べたら難しい公式とか使ってるけどどうして?
Q2,円周率のプログラムってなんで桁に限界あるの?一応無限までだせそうだけど
  パソコンつけっぱなしでどんどんでてくるんじゃないのかなっておもったんだけど
  どこどこの大学が何桁まで出した!とかあってあれ?って思った
Q3,高校数学レベルでいいから簡単なπ求めるプログラムを教えて。
  使用してるのはC言語のWINDOWS

学校で聞いてきになったんだけど、言葉足らずだったらごめん

52 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:21:23 ]
>>51
www1.coralnet.or.jp/kusuto/PI/

53 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:25:23 ]
>>51
 ちょっと行ってみる。ありがとう。

54 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:25:41 ]
クロスコンパイラが.bssを分けてくれない?
.bssは分けてくれるけどそれをゼロクリアするスタートアップコードはついて
無いし、自分でも書いてない?(セグメント別れてるんなら書くの簡単だと思うけど)

組込みって奥が深くてわかんないや

55 名前:51 mailto:sage [2007/06/05(火) 03:35:07 ]
>>52
 だった・・

今見てきたけど、このくらいの質問は論外なんだなって思った。
学校で聞いてもそれは今関係ない、いつかやるからって言われるし・・
まぁいつかわかるとおもうけど

56 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:36:41 ]
>>55
「マチンの公式 多倍長演算」でぐぐってみろ。

57 名前:51 mailto:sage [2007/06/05(火) 03:45:42 ]
>>56
夜中に申し訳ない!

58 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:50:05 ]
>>41
Cなら enum を 0 で初期化してもエラーにはならないはず。
C++ ならエラーになるけど、その場合はコンストラクタが使えるし、
= {} も使える。

C/C++ のどっちかが決まってるなら問題にならないはず。
CのソースをC++でもコンパイルできるようにしたいときだけ、
面倒な話になる。

59 名前:デフォルトの名無しさん mailto:sage  [2007/06/05(火) 04:09:56 ]
>54
おそらく初期化ルーチンはライブラリ化されていると思うよ。
どこのマイコンコアだかわからんが、メーカー純正のコンパイラ?

組み込みのCの場合でもスタック以外のRAM領域はクリア(つまり0)されているのが基本


60 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:30:00 ]
連結リストを利用したプログラムを作ったんですがうまくいきません
ソース kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4155.txt
コンパイラ BCC5.5

デバッガを走らせて見たところ、39行目のscanf("%d",&ch);の実行後にstartPtrの値がNULLになったことが原因みたいなんですが、
なぜここでstartPtrの値が変わるかわかりません
BCC5.5のバグかなんかでしょうか?



61 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:38:02 ]
>>60
バグってるのはすぐ処理系のせいにする君の頭だ
char型の変数に%dを突っ込むな
%dはint型のポインタを要求する

62 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:43:00 ]
まぁ初心者のうちはありがちなことだな>処理系のバグを疑う

63 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:44:09 ]
ほんとだorz
ありがとうございます
なんか、こういうミスで詰まること多いんですよね

64 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:53:05 ]
>>60
startPtr + 9 は一体どこをポイントしているとお思いか?
自分の無理解無努力無責任のつけをコンパイラに転嫁させませぬよう。

65 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 04:54:23 ]
これって、char型の変数とか言ってる>61も大間違いなのに、それで勝手に納得している>63ってなんなの?

66 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 07:46:12 ]
>>64-65
startPtr + 9で問題ないだろ

67 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 08:23:53 ]
ってか、Cのソースなのに、for文の中で変数宣言しちゃうのはどうかと。

68 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 08:30:08 ]
C99だと思えば、ってBCCはC99非対応だけどね

69 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:23:44 ]
>>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 のコピーを戻してやればスマートじゃないかと


70 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:27:54 ]
>>69
for(int c=0;c<10;c++;startPtr++){
これは
for(int c=0;c<10;c++,startPtr++){
の間違い




71 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:36:12 ]
>>69
for(int c=0;c<10;c++,startPtr++){
これは
for(int c=0;c<10;c++;startPtr++){
の間違い探し

72 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:40:54 ]
てんで話にならない。

73 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:43:07 ]
>>72
誰がうまいことを言えと(ry

74 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:43:49 ]
いやー、わからんかったw
画面上でも1ドットだぜ・・・

75 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 21:57:56 ]
大学2年です。現在、C言語の勉強をしています。
制御構造やポインタなど基本的なことは理解できました。
これから何をしていけばいいでしょうか?将来はプログラマ志望です。
授業ではアルゴリズムを勉強しています。
勉強しておいたほうがいい言語や順序みたいなものを提示してくださると嬉しいです。

76 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:00:29 ]
フローチャートを勉強してるの?

77 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:00:50 ]
>>75
擬似でいいからアセンブラ

78 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:04:44 ]
分かりました、専ブラに挑戦してみます。

79 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:08:57 ]
プログラマでも入る分野で結構違うと個人的には思う。
>>77のアセンブラもいいと思うし、割り込みとかマルチスレッドなんかもいいんじゃね?
可読性とか汎用性とかデザインパターン、テストとかデバッグ技術もあってもいいかも?

アルゴリズムって実際に役に立つかな?
いろんなプログラムを山ほどこなしてるほうがいい気がする。

80 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:15:30 ]
>>79
>>75の大学がどこかは知らないが、大抵大学の授業で教えるアルゴリズムっていうと
基礎の基礎で結構重要だろw



81 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:18:43 ]
学生時代を思い返してみると、オートマトンとかやってたような・・・
俺、役に立ってねぇ・・・
もっと基礎的な内容かな?ソートとか?
ソートなんて、バブルソートとクイックソート以外は必要なときに毎度調べてるな。

82 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:19:09 ]
>>75
宿題スレで宿題解くのオススメ

83 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:25:36 ]
アルゴリズムでオートマトンはやらなかったなぁ
ソートとか探索とかリストとかやったかなぁ・・・?
仕事でそのまま使えるってことは少ないだろうけど、基礎を覚えておいて損は無い

84 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:29:01 ]
問題「ソートするプログラムを書け」
俺「qsort(...); はい終わり^^」

85 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:30:50 ]
まあ、一口にプログラマといっても
「標準ライブラリに丸投げでOK」から「自力でアルゴリズムをひねり出すことを要求される」まで幅広いわけで

86 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:32:25 ]
つ[安定ソートするプログラムを書け]

87 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:32:29 ]
あぁ、言われて見れば重要だなぁと思ってきたw
リスト、スタック、キューとかのデータ構造とかか。
素因数分解とかは、暗号化とかの分野いかなきゃ使う機会はなさそうだな


88 名前:75 mailto:sage [2007/06/05(火) 22:50:14 ]
有り難うございます。
授業のアルゴリズムではソートやリスト構造、木構造などをやっています。
アセンブラですか。何か必要な環境等は必要でしょうか?
またC++も興味があるのですが勉強可能でしょうか?環境はCygwinです。

89 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:55:43 ]
>>88
やる気があれば何でも可能。
>>82のアドバイスをうけて、慣れてきたら同じ課題をCっぽい解き方、
C++っぽい解き方の両方やってみたりしても良いかも。



90 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:57:04 ]
>>86
つ[std::stable_sort()]



91 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:08:45 ]
>>88
紙とペンさえあれば勉強できる

>>90
C言語で解け

92 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:18:29 ]
紙と鉛筆で間に合うのは頭のいい人だけ
常人は適当にmasmなりインラインアセンブラ等ケースで身に着けましょう

93 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:19:30 ]
やべぇ俺頭いいのか

94 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:26:17 ]
アセンブラの勉強するときはシミュレータ上で動かしたいよね

VirtualPC とか VmwarePlayer とか Bochs とか qemu とか
いろいろあるけど、どれがいいんだろう?

95 名前:75 mailto:sage [2007/06/05(火) 23:36:48 ]
なるべく無料で環境は揃えたいところです;
あと、どうもMicrosoft製はソフトが重いイメージがあるので微妙です。
なのでVisual Studioはどうも慣れません。
大学の先生もなるべくUNIX上でコンパイル・実行したほうがいいと言っています。

96 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:39:25 ]
じゃあnasmとかどうでしょ?

97 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:40:24 ]
>>95
はいはいかわいい子犬ちゃん

98 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:47:21 ]
VisualStudioの環境が重ければソースを外部で編集するようにして
構成ツールをmake代わりに使ったり、clだけ利用すればいい話
てかいくらなんでもUNIX推奨は冗談だろう…

99 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:48:45 ]
>>98
俺はそうしてる。つっても芽衣の開発環境じゃないんだが。
普段がテキストエディタなもんで、そっちのほうがやりやすい。

100 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:50:21 ]
VisualSutudioの環境が重ければPC買い換えればいい

・・・もしかしてだいぶMSにお布施してるかな、漏れ。



101 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:55:22 ]
>>95
かわいこちゃん・・・
人の話聞いて知ったかするより、自分でWinとUnix系の違いを
自分で調べて知りなさい。

102 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:43:54 ]
>>98
最近のゲーム機やパチンコ台の液晶なんかの場合はUNIX系環境が主流だな
そっち方面ならcygwinやlinuxでなれておくと楽だぞ
あのへんなら開発環境に金かからんし

Winだけのプログラム勉強したいならともかく、
広い意味でプログラムの勉強したいならVisualStudioはオススメしない


103 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:46:43 ]
プログラムの勉強なら環境はなんだっていいだろ

104 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:51:27 ]
いいだろ

105 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:53:21 ]
マジかよ
もうvsのインターフェースに慣れちゃったぜ…orz

106 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 01:23:45 ]
>>103
MSの環境は独自の俺様仕様が多過ぎる、それに値段も高い
SDKのバージョン変わるとコンパイル通らなくなったりするし
小規模なプログラムだといいけど大規模になるとあの互換性のなさには泣けてくるぞ
開発以外の余計な事に時間取られすぎるんだよ

いまだに一部ゲームで古いDirectXとか使ってるのはそのせいだろうし

仕事の関係で多数の環境、日立のshcとかgcc、ボーランドCとかLSI-C、CodeWarrior その他いろいろ
使ってきたけどあそこまでかけ離れてるのはMS環境だけだ


107 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 01:35:06 ]
それでもMSを勧める人がいるのはやっぱ「MSだから」だと思うよ?
SDKとかMFCをC++の勉強に使うなんて、とても勧められないし
コンパイラのバグもちょくちょくあったりする。
設定に困ったときにネットで探せば色々見つかるってのは大きいと思う。
コンパイラのバグなんて、MS環境でもなきゃ中々しにくくね?
まぁ、bccやgccならそれなりにサイトも多いけどやっぱMSに比べると・・・

やっぱ、作ったもんが動くからプログラミングって楽しいんじゃね?
とはいえ値段や仕様変更の多さには同感だw

108 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 02:56:46 ]
値段は(学割だけだけど)凄まじいダンピング始めたからなぁ
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関数にできるでしょうか?無理なのでしょうか?
よろしくお願いします


110 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 04:26:58 ]
inline関数は内部リンケージを持つからヘッダファイルには書くな。



111 名前:109 [2007/06/06(水) 04:36:03 ]
内部リンケージで調べたら分かりました
ありがとうございました

112 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 04:55:09 ]
内部リンケージって言葉を聞いたばっかりで
理解せずに使ってるだけな馬鹿は無視しろ

113 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 04:56:48 ]
>>110
inline 関数はヘッダに書くもんだろw

114 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 06:07:24 ]
正しくはinline関数の「宣言だけ」ならヘッダには書くな、書くなら「定義」まで
書け、って事だな

115 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 06:13:31 ]
具体例としてはジャネリックな独自テンプレートライブラリを作る時とかか
なんか極めて限られるような状況ですな

116 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:31:36 ]
>>110
inline 指定とリンケージは関係ないよ。

117 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:32:28 ]
>>116
でもヘッダファイルに宣言だけしたらリンカエラーでるじゃん?

118 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:35:02 ]
なんという面倒くさい仕様…
これは暗に「よほどのことが無い限り使うな」と言っているので同じではないか

119 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:36:50 ]
>>117
定義が無いからだろ。リンケージも inline も関係ない。

120 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:39:09 ]
>>118
その認識で問題ない。 inline で速度が変わる状況なんてかなり減ってきてるし、
これからも減るだろうし。



121 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:40:49 ]
もうinline化なんかコンパイラに任せろよ
適当にやってくれるだろ

122 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:45:38 ]
>>118
ついでに言えば、最早コンパイラはオブジェクト間最適化を行なう時代。
inline指定なんぞせんでもコンパイラの方で勝手に(別ファイルの関数さえ)インライン展開してくれるよ。

123 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:46:05 ]
>>119
静的リンケージだから定義がないんじゃないのか?

124 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:47:01 ]
内部、だ。

125 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 07:51:14 ]
>>119
それはおかしい。extern宣言しても他のファイルで定義してある
inline関数は使えんぞ。

126 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:03:10 ]
>>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 関数は使われるソースごとに定義が必要になるってことらしい。
エラーになるのはこのルールに違反するからであって、リンケージは
関係ない。

127 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:05:29 ]
>>126
お前最初にinline関係ないって言ったじゃん。いい加減な事を言うな。

128 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:19:03 ]
ごめんよ。 >119 を書いた時点では分割コンパイルを意識してなかったんだ。

129 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:20:18 ]
( ゚д゚)ポカーン

130 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:21:37 ]
分割コンパイルを使わないとC++の意味が・・・・・



131 名前:デフォルトの名無しさん [2007/06/06(水) 19:15:39 ]
getchar(c);

c - '0' /*cの中が文字か数字かをしらべる*/


c - '0' の意味がわかりません
これは何をやってるんですか?

132 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:18:36 ]
c - '0' は普通数字を 0 〜 9 の数値に変換するときに使うけど

133 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:43:22 ]
ざっと C++ のドラフトを見ても、
仮想関数テーブルに関する記述がないんですが、
仮想関数テーブルは C++ の仕様上には
全く存在しない概念なんでしょうか?

134 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:50:11 ]
ABIとか、Implementation Specificな話は規格には載らないんじゃないの

135 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:53:29 ]
>>131
'0'ってのは数値的には0x30、そこから順に0x39('9')まで並んでる
だから文字として入力したものを数値に変換するときはそういうこともするけど・・・

キャラクターコードの意味わかってないなら
isdigitとか使っとけ
変換するなら
atoiとかstrtol使えばいい

それコメントが間違ってるよw

関数使わずに調べるなら
if((c >= '0') && (c <= '9'))
でいいだろうし、
変換したいならその後に c-'0' したほうがいいと思う

c-'0' じゃ数字かどうか調べてないしな・・・


136 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:58:24 ]
直接プログラミングではない質問なのですが、
ネットワーク外部にインストールしたRuby等の.exeを、ファイル共有した状態で
例えば
\\マシン名\\Ruby\bin\ruby.exe
にあるruby.exeを実行したくて
Path環境変数に"\\マシン名\\Ruby\bin"を追加したのですが、うまくいきません。

そもそも無理なのか、または指定のやり方が間違っているのでしょうか?

137 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 20:02:41 ]
歯医者に風邪治してくれと言ってるようなもの
スレ違い

138 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 20:14:38 ]
下手な例えだな

139 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 20:43:07 ]
>>134
つまり、仮想関数テーブルは Implementation Specific な話ということなんですね。
了解しました。

140 名前:1/2 mailto:sage [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 mailto:sage [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 mailto:sage [2007/06/06(水) 20:53:38 ]
上記のプログラムを作ったのですがコンパイルして実行すると
「演算子を入力してください」
でプログラムが終了してしまいます。
何故でしょうか?
環境はcygwinです。

143 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 20:58:13 ]
>>142
getchar() で改行文字を読み込んでいるから

144 名前:142 mailto:sage [2007/06/06(水) 21:09:30 ]
>>143
"改行文字を読み込んでいる"、とはどういうことでしょうか?

145 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 21:22:48 ]
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 mailto:sage [2007/06/06(水) 21:29:59 ]
>>145
無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。

147 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:46:17 ]
Google Booksすげーな。言語の本無料でみれんじゃん

148 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:57:06 ]
>>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 ]
トートロってんじゃねぇよって事ですか
よく考えると自分も質問の意図を把握できてないのに気づいたので取り下げます

152 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 09:12:19 ]
>>149
0 こそが真のヌルポインタだよ。
ただ、これだけだと整数型とか小数型の値としてもとれるから、
NULL ってマクロを使ってそれを回避できるようにもしてるだけ。

153 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 09:53:37 ]
>>152
そんな隙だらけの説明しかできないんならヌルポインタについて語るのはやめとけ。
↓これでいいだろ。
www.kouno.jp/home/c_faq/c5.html

154 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 09:57:54 ]
自分の読解力の無さを人の文章力のせいにするな

155 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:10:02 ]
確かに隙が多かったな。

>ただ、これだけだと整数型とか小数型の値としてもとれるから、

これは、

#ただ、これだけだと「プログラムを読む人間」 が、この 0 が
#数値の 0 か、ヌルポインタの 0 かを、そこからだけでは読み取れないので、

という風な意味。

156 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:13:43 ]
自分の文章力の無さを人の読解力のせいにするな

157 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:18:00 ]
コピペうざす

158 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:25:38 ]
自分のうざさを人のうざさのせいにするな

159 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:33:51 ]
彼は分裂症で、彼の否定する自分自身とは彼自身では違う人格なのだから良いんだよ。

160 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:54:04 ]
何もかもみんなお前のせいだ



161 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:32:34 ]
for(;;)
{
struct st* a;
get(&a); /* callocで構造体配列作成しaに割り当て */
free(a);
}
これをコンパイルすると、syntax error: missing';' before 'type'
とでます。アドバイスを頂けないでしょうか。お願いします。

162 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:36:43 ]
申し訳ありません。161の件は宣言の前にif-break;を入れていたのが原因
のようです。しかし、freeのときにエラーが出るのがわからなく
その件について助言お願い致します。

163 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:42:07 ]
>>162
その原因の行も書いてよ。

自分がコンパイラになったつもりでたどればわかる

164 名前:デフォルトの名無しさん [2007/06/07(木) 14:47:38 ]
aをNULLで初期化したらエラー消えるはず

165 名前:デフォルトの名無しさん [2007/06/07(木) 14:49:08 ]
は関係ありませんねすいません

166 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:18:12 ]
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言語に慣れておらずいまいち理解できないので
すごく変な勘違いしてそうですね…。

167 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:27:24 ]
変数の宣言がブロックの先頭じゃなかった、という落ちか・・・
実行時エラーは何か勘違いしてる

168 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:32:37 ]
おそらく、get() の先のcallocで取ったポインタを * つけないで代入してるんだろうな

169 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:32:46 ]
実行時エラーというか実行時警告というか
あれは未初期化ポインタに対するアクセスのエラーだから
リリースビルドにすれば実行時に落ちることは無い
しかしその前にコンパイラの方で未初期化に対するどうたらこうたらっていう
警告が出るはずなんだが…

170 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:34:10 ]
>>169
get で &つけて呼び出してるから、警告は出ないんじゃないかな。
その関数で代入失敗してるっぽい。



171 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:38:09 ]
そうかごめん
試しにそうしたら確かに通っちゃったよ…

172 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:41:04 ]
コンパイルの段階で出てくるのが コンパイルエラー
(リンクの段階で出てくるのが リンクエラー)
出来上がった実行ファイルを実行して出てくるのが 実行時エラー

m(c)alloc で得られたポインタではない非NULL 値を realloc しようとしたんじゃねーかな?

173 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:44:43 ]
って calloc と書いてあったな…
get(struct st**) の実装晒したほうが早いぞ

174 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:52:12 ]
getの実装は既存のライブラリです。でも一応、callocの部分を
確認したところキャストはされていませんでした。
ブロックの先頭・値初期化の不備は、お恥ずかしいミスです。
ところで、C++てエラーメッセージがわかりにくくないですか?
関数や引数のクイックインフォも出なくて、難しすぎて泣けてきます。

175 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:56:37 ]
いや、これそのままなら初期化いらないはずなんだって。
getの仕様によるけどな。

176 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:59:17 ]
あ、>>168はキャストのことじゃなくて、参照を考慮にいれてないって
ことでしょうか?でも多分、get()には問題はないはずです。
たった4行のコードでここまで悩める俺みたいなバカは
プログラマに向いてないんでしょうねorz

177 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 16:08:38 ]
>>176
だったら get(arg) の仕様は?

第一引数 arg の内容を書き換えるだけ ならば、
 NULL 初期化しなくても、実行時エラーは出ないつくりになる(はず)。

第一引数 arg の内容を確認してから書き換える ならば、
 NULL 初期化が必須になるだろう。

この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)

178 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 18:47:58 ]
コマンドプロンプトで色々なコマンドが用意されていると思うのですが、
それをC言語で使用するにはどうすればいいのでしょうか?
具体的に言いますと、とりあえずexeファイルにa.txtをD&Dしたらそのディレクトリに
copy_a.txtというファイルを作成したりしたいです。コマンドプロンプトでいうとcp a.txt copy_a.txtですね。
まぁやりたいのはcpコマンドではなくて、javacコマンドとjavaコマンドなのですが・・・。

179 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 18:51:14 ]
system関数

180 名前:178 mailto:sage [2007/06/07(木) 18:51:42 ]
まぁ、要はJAVAのコンパイルが面倒なのでドラッグするだけで出来るソフトをCで作りたいって話なんです。



181 名前:178 mailto:sage [2007/06/07(木) 18:54:29 ]
>>179
ありがとうございます。
ちょっとやってみます。

182 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:19:13 ]
strcmp(buf, '\0');
でエラーが出るのですが、何か書式を間違ってるでしょうか?
文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。
最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・

183 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:23:49 ]
>>182
www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)

184 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:26:23 ]
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん


185 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:37:02 ]
>>183
とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。

>>184
そういう課題なんです・・・

186 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:42:50 ]
C++でクラスを書くとき、Javaの書き方に合わせようと思って、

#define Public public:
#define Private private:
#define Protected protected:

って定義して、んでヘッダファイルを

Public int getNum();
Public void setNum(int num);

みたいに書いてみたんだけど、これと似たようなことをやる人は多い?
それとも明らかにC++の常識からは外れた書き方?

187 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:46:56 ]
他言語を真似るマクロは愚の骨頂だと俺は思う

なにより読みにくいし、なら java でかけよと言いたい

188 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:52:34 ]
>>186
m9( ´,_‥`)プッ

189 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:56:46 ]
つか
Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ

190 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:57:08 ]
>>186
PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?



191 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:59:41 ]
Bourne shellの作者のSteve BourneがALGOL風のトンチキなマクロを定義して
シェルを書いたのは(勿論悪い意味で)有名

192 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:20:55 ]
>>187
関数一覧をカテゴリ別に並べて書きたくて……

>>188
(´・ω・`)

>>189
いや先頭が小文字のpublicとかは予約語なんで

>>190
……ええと、すいません

193 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:23:51 ]
マクロなんだから予約語も糞もないだろ

194 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:26:05 ]
#define for if(0); else for

とかできるんだぜ。

195 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:29:36 ]
>>186
やるな。
理由は色々あるが、一番実害があるのはこんなところか。

#define public public:

としたとして、

class A {
public void foo();
void bar();
};

の bar のアクセス指定がどうなるか考えてみよう。
これは public だ。

だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。

196 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:29:41 ]
>>192
あほすぎw

197 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:37:01 ]
>>194
for (int i=0; ...) {
 // スコープ1
}
// スコープ2

でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな

198 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:41:40 ]
ふるっ

199 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 22:09:01 ]
特殊っていうか、昔はそれで仕様通りだったと思う。

200 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:01:19 ]
そういえばVisual C++で.NETアプリケーションのウィザードを使うと、
public: void Hoge()なんてコードを出していた気がする



201 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:03:36 ]
>>199
それが仕様だったかも知れないが、規格にはなっていない罠。

202 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:06:05 ]
ふるーい規格の話だけど、
それでもなってないの?

203 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:07:51 ]
ARMやドラフトを規格だと言うのなら
規格になっていたと言うがいい

204 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:26:13 ]
なるほど。ドラフト段階でしかこの仕様はなかったわけか。

205 名前:178 mailto:sage [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 mailto:sage [2007/06/07(木) 23:49:32 ]
というよりも、system("cd c:\\java");のあとに
system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・

207 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:52:22 ]
system("java c:\\java\\HelloWorld");じゃ駄目なの?

208 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:52:57 ]
それぞれのsystem呼出は、細切れになるから
1度のsystem呼出で済ませるようにしろ
絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか

209 名前:178 mailto:sage [2007/06/07(木) 23:56:35 ]
一回ごとに細切れなんですか・・・。結構面倒ですねw
とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり
Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld
と出てしまいます。う〜ん・・・

210 名前:178 mailto:sage [2007/06/08(金) 00:06:01 ]
system("javac c:\\java\\HelloWorld.java");
は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;



211 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 00:12:18 ]
カレントに存在する必要があるのかな?
それとも区切り文字か。
ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。

212 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 00:21:01 ]
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?

213 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 09:35:51 ]
>>212
普通はそれを最初にやるわな

214 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 10:47:42 ]
C++の参照は、中身はポインタと同じで、参照先のアドレスがメモリに記憶されてるんですか?
(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)

215 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 10:55:06 ]
>(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
質問の意図が読めんが…

関数の引数で
値渡しした場合には 値が持つ大きさ だけスタックに詰まれる
参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる

216 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 11:34:37 ]
>>214
通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。

217 名前:178 mailto:sage [2007/06/08(金) 12:13:26 ]
>>212
おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?

218 名前:178 mailto:sage [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 mailto:sage [2007/06/08(金) 12:23:46 ]
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class");
などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;

220 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:32:11 ]
javaの仕様がわかってないな。
まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい



221 名前:178 mailto:sage [2007/06/08(金) 12:44:54 ]
>>220
ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。

222 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:48:21 ]
まさかとは思うが、Dドライブで作業してたりして。

223 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:49:32 ]
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA");

SetCurrentDirectory(L"c:\\JAVA");
じゃ…

224 名前:178 mailto:sage [2007/06/08(金) 12:53:25 ]
解決する事が出来ました。
とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。
その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA");
に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。
それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。
原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。
ありがとうございました。

225 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:32:56 ]
SetCurrentDirectory(_T("c:\\JAVA")) なら、unicodeでも設定無しでも動くよ
エラーが出るからってとりあえずキャストすんのはやめとけ

226 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:42:37 ]
あともう一つ。
system("java c:/java/HelloWordl");
これだけど、
system("java -classpath c:/java HelloWordl");

これなら動くんじゃないか?
HelloWordl の綴りが気になるが

227 名前:178 mailto:sage [2007/06/08(金) 13:54:53 ]
>>225
丁寧にありがとうございます。キャストはあまりしないほうがいいみたいですね。
現在はchar型の変数にパスを入れて、SetCurrentDirectory(dirPass);のようにしているのですが、
やはりそれだと動作が微妙です。引数はcharじゃなくてLPCTSTR(?)じゃないといけないのかな
とか思いつつ奮闘しています。

>>226
一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが>>211で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。

228 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:56:31 ]
>>227
classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?

229 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:00:32 ]
日本にもう一人いるのか、本人なのか。

www.google.co.jp/search?q=hellowordl&lr=lang_ja


230 名前:178 mailto:sage [2007/06/08(金) 14:04:28 ]
>>228
あ、大丈夫です。ちゃんと半角スペース入れています。

あと、どうやら>>227のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。



231 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:10:49 ]
>>230
ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな

>system("dir");を実行しただけでエラーが・・・。
ふーん

232 名前:178 mailto:sage [2007/06/08(金) 14:18:29 ]
>>231
ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。

233 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:32:47 ]
わかった。もうキミには言うことは無い
うちでは動いてるけど、君のトコでは動かないんだね

234 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:44:31 ]
>>230
どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)

235 名前:178 mailto:sage [2007/06/08(金) 15:16:42 ]
>>233
そういう次元でもないような・・・。

>>234
dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw


236 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:18:42 ]
>>233の皮肉に気づけよ

237 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:19:58 ]
なんかさ、やろうとしてることがショートカット作る程度でできそうな事な感じなんだが
複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか?
無理矢理Cで作ろうとするほうが疑問なんだが・・・


238 名前:178 mailto:sage [2007/06/08(金) 15:30:47 ]
>>236
ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ

>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。

239 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:32:32 ]
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));



241 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 17:45:49 ]
>>240
何も分からない

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を検索するにはどのデータを保存しておけば良いんですか??


244 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 17:59:58 ]
>>243
関数を再帰的に書けば良いじゃん

245 名前:デフォルトの名無しさん [2007/06/08(金) 18:05:38 ]
>>244
再帰を使いたくないんです・・・

246 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:07:08 ]
何故?

247 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:09:33 ]
Fdを保存しておけばいい

248 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:10:05 ]
末尾再帰型で書いてからループ化すれば?
ttp://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0

249 名前:デフォルトの名無しさん [2007/06/08(金) 18:13:57 ]
>>246 再帰は不安定になるんですよ

>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした

250 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:19:05 ]
struct ffblk[MAX_DIR_DEPTH];



251 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:19:21 ]
再帰が不安定とは……

252 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:21:44 ]
普通にスタックに積めばいいじゃん。

253 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:23:20 ]
>>249
再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても>>250みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。

254 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:28:29 ]
何が「再帰は不安定になるんですよ」だよ馬鹿もんが

255 名前:249 [2007/06/08(金) 18:29:22 ]
速度を上げる為に複数スレッドで読み込みたいんですよ
再帰だと出来ないんです・・・・

256 名前:デフォルトの名無しさん [2007/06/08(金) 18:31:38 ]
ここに複数スレッドでうごいているようなソフトがあるんですけど・・・
どうやればいいんですか???


フォルダサイズ調査  『 D-Usage.exe 』
hp.vector.co.jp/authors/VA032597/Software/DirMan.html

257 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:32:30 ]
ドライブ資源は1個なのに、複数スレッドでアクセスしたら、
かえって遅くなるような気がしないでもない

258 名前:デフォルトの名無しさん [2007/06/08(金) 18:35:07 ]
>>250
進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも

259 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:36:02 ]
(一般的には)無駄なシークが発生して、遅くなります。

260 名前:デフォルトの名無しさん [2007/06/08(金) 18:36:15 ]
>>257
実際にデータを読み込む訳ではないんですよ



261 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:37:02 ]
FindFirstFile()が返してきたハンドルをスタックとして
もっとけばいいだけじゃないの?
そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと
続きから返ってこないか?


262 名前:257 mailto:sage [2007/06/08(金) 18:39:04 ]
>>260
俺は >>259 のことを想定して書いた。 余計なシーク発生するから遅くなるんじゃね? ってこと

263 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:42:22 ]
>>256
そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。

264 名前:249 [2007/06/08(金) 18:46:10 ]
複数の方が早いですよ

複数スレッド
D-Usage. 36s
hp.vector.co.jp/authors/VA032597/Software/index.html

単一スレッド
VCDCASE 45s
www.hi-ho.ne.jp/hiro30/

265 名前:デフォルトの名無しさん [2007/06/08(金) 18:49:33 ]
C言語なんですが
自作関数で実引数で文字列を返す事は可能ですか?

266 名前:257 mailto:sage [2007/06/08(金) 18:49:52 ]
>>264
どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい

267 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:50:33 ]
>>264
>263

268 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:54:11 ]
スレッド1個でも動くものができないのに

269 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 19:00:58 ]
しかし、どうでもいいけどD-Usageとかいうソフト、速いのかも知れないけど使い難いなぁ。
作者本人は悦に入っているようだから別にいいけど。

つーか、VCDCASEは目的が違うじゃん。違う目的のソフトを比較して速度云々って>249はどこまで阿呆を晒せば気が済むんだ?

270 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 19:09:05 ]
>>265
できます



271 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 20:52:54 ]
>>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

274 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:56:39 ]
#ifdef _UNICODE
iostream& tcin = cin;
(ry

275 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:57:45 ]
>>272
とりあえず、_MBCS ブロック内のヤツは cin, cerr, clog にしたほうがいいと思うよ。

276 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:57:52 ]
>>272
おそらく、個人・環境等で意見は様々だと思う。
個人的には、4つや5つなら許せるが、こんなことしなくても問題ないようなモノにしたい。

で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。

277 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:01:44 ]
>>274
cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。

278 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:05:01 ]
>>272
実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。

279 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:29:52 ]
回答ありがとうございました。
皆様の意見を参考にこのようにしました。

#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の定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが

280 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 03:17:18 ]
fopen("test.txt", "w");
でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、
C:\C:\Documents and Settings\ユーザ名
のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、
どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、



281 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 03:24:21 ]
>>280
>普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。

282 名前:534 mailto:sage [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 mailto:sage [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;
}

284 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 04:36:26 ]
>>281
そんなアプリケーション見たことねえw

285 名前:534 mailto:sage [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;
}

286 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 05:58:26 ]
コマンドライン引き数から実行モジュールの場所が得られると思ったら大間違い。

287 名前:534 mailto:sage [2007/06/09(土) 06:31:11 ]
詳しく^^

288 名前:534 mailto:sage [2007/06/09(土) 06:49:51 ]
自己解決しました^^
フルパスじゃないと取得できないので
windowsだとGetModuleFileName()を使うのですね^^
この辺は環境依存になるので注意が必要ですね^^
勉強になりました^^^^;;

289 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 06:51:34 ]
system()関数って凄く謎なのですが・・・。
printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。
これは俺が、system()で使う領域を侵してると考えていいのでしょうか?

290 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 06:51:36 ]
1.Unix系はarg[0]にパスが入らないんじゃなかったかな。
2.バッファオーバーランしかけたらエラー処理してくれ
3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」
4.const char* argv[]じゃなくてchar const *const argv[]な



291 名前:534 mailto:sage [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;
}

292 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 08:17:05 ]
>>289
その周辺を晒してくれないとなんとも言えないのだが。

293 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 08:34:05 ]
>>279
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。

294 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:21:55 ]
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;
}

295 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:27:16 ]
>>294
sizeof(fullpath)じゃなんであかんのんですか?

296 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:54:28 ]
>>294だけど、
GetModuleFileNameの第3引数はバイト単位のサイズでなく配列要素数を
指定する。Unicodeビルドの時はsizeof(TCHAR)が2なので、TCHAR buf[10]は
 sizeof buf = 20
 sizeof buf / sizeof *buf = 10

違ってたらごめん

297 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 10:05:43 ]
>>296
嘘つくな。氏ね

298 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 10:46:05 ]
>>297
ttp://msdn2.microsoft.com/en-us/library/ms683197.aspx
> The size of the lpFilename buffer, in TCHARs.
だから>>296であってる

299 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 17:45:36 ]
ヘッダーファイルで
class temp{
public:
int *func();
};
と書いた場合、funcの定義はどう書き始めればいいですか
int temp::*func()
int temp::(*func())
int *temp::func()

300 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 17:59:13 ]
一番下じゃないとVSのインテリセンスが効かなかったので一番下



301 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 18:05:51 ]
>>299
コンパイルできるのは一つだけしかないだろ?

302 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 18:16:44 ]
>>299
int* func();

303 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 19:58:45 ]
>>279
テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う

304 名前:デフォルトの名無しさん [2007/06/10(日) 00:26:59 ]
ちょっと相談。

CSV形式のテキストファイルを採用することになったんだけど、
エスケープの方法など、細かい仕様について悩んでる。
この辺の定番仕様ってどんな感じかな。
専用の入力ツールを用意しない場合、やっぱりExcelあたりに合わせるのがベターだろうか。

で、その定番仕様に対応したCまたはC++のライブラリがあればお願いします。

305 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:30:56 ]
csvってRFCできてなかったっけ

306 名前:304 mailto:sage [2007/06/10(日) 00:59:15 ]
RFCあるのか……ありがとう、ちょっと探してみる

307 名前:デフォルトの名無しさん [2007/06/10(日) 02:42:21 ]
C++で自分で作ったクラスのVectorを使ってVector aを宣言して
-aを使いたいのですがどのようにすればよいでしょうか
よろしくおねがいします

308 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:44:07 ]
>>307 まず服を脱ぎます。

309 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:46:32 ]
ええとよくわからんけど
-演算子をオーバーロード?

310 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:46:58 ]
単項演算子を使いたいってこと?
2次元ベクトルの例だと、Vectorのメンバに
Vector operator - () const {return Vector(-x, -y);}
みたいな感じか?



311 名前:307 mailto:sage [2007/06/10(日) 02:54:52 ]
解決しましたありがとうございました

312 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 04:01:52 ]
linuxで標準ライブラリをインストールしたいのですが
glibc-2.5.0-0exp1
glibc-2.5.0-0exp2
の違いってなんですか?

313 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 07:16:07 ]
1と2

314 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 11:47:50 ]
>>312
そのパッケージは Ubuntu にしか無いっぽいな、
俺はFedora使いだからよくわからん

Ubuntu系のスレにでも行ったほうがよさげだ


315 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:20:40 ]
ファイル情報の取得の仕方教えて。


316 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:24:06 ]
stat

317 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:30:01 ]
file

318 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 14:10:54 ]
Windows環境で,任意のファイルが変更された時に,
変更の種類(作成,更新,削除等)と,変更を与えたプロセスを
出力するプログラムを作成しようと思っています.

変更の検知とその種類に関しては,Win32APIのReadDirectoryChangesWで
取得できるのですが,変更を与えたプロセスの取得方法が
Win32APIや.NETを探しても分かりません.
何か方法があれば教えていただけませんか?

319 名前:318 mailto:sage [2007/06/10(日) 14:11:45 ]
すみません,
Windows環境 → WindowsXP環境
です

320 名前:デフォルトの名無しさん [2007/06/10(日) 14:56:21 ]
VB.NETとC#.NETで、大きく異なる点とは、どういうとこでしょう?
考えたかとか、コーディングの仕方で教えてください。



321 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:09:24 ]
元が VB か C/C++ か、の差

322 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:11:46 ]
#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でなければ問題なくコンストラクタは呼ばれるようです。

323 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:19:03 ]
>>322
バグだね。 bcc なんて使わなけりゃいい。

324 名前:320 [2007/06/10(日) 15:24:40 ]
メモリーの考え方とか、大きく違ったりしませんか?
定数、変数のきり方とか・・・・
インスタンスの方法とか、考え方とか・・・

単に、方言が違うだけ?

325 名前:322 mailto:sage [2007/06/10(日) 15:38:39 ]
>>323
レスどうもです。
やはりバグですか。
bccはコンパイル速度しか売りがないのかなと感じる今日この頃。

326 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:39:27 ]
>>324
.NETスレは他にあるだろ。なんでここで聞くんだ?

どのくらい違うかの位置関係はこんな感じで、
VB6−−−−−−VB.NET−C#
メモリーの考え方とかインスタンスの考え方はVB6から大きく変更になってる。

327 名前:320 [2007/06/10(日) 15:55:44 ]
ごめん。
C#スレと勘違いしてた。

328 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 18:12:08 ]
あれだけ#の種類を変えて頑張っているのにw

329 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:01:15 ]
構造体/クラスを関数に渡すときは、ポインタか参照が使われることが一般的のようですが、
戻り値が構造体/クラスなのは普通ですか?

330 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:08:14 ]
>>329
コピーが重い場合には避けられるけど、単純にポインタや参照にして
置き換えられないこともあるので、引数に比べれば使われる機会は多いでしょう。



331 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:21:23 ]
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

332 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:42:17 ]
>>331
うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ


333 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:48:07 ]
>>329
小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。

演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。

334 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:20:48 ]
>>332
成功しました。ありがとうございます。

335 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:23:04 ]
>>332
暇人乙

336 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:52:44 ]
>>335
暇潰しにもならんかったよ


337 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:54:11 ]
暇過ぎw

338 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:44:29 ]
続けて、質問すみません。
さっきの
ttp://www.cs.bme.hu/~bodon/en/apriori/
のやつなんですが、

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4208.txt
↑のもっと長いようなデータ読み込ませようとすると

11 [sig] apriori 436 open_stackdumpfile: Dumping stack trace to apriori.exe.stackdump

ってでて、動きません。

動くようにするには、どの部分をどのようにすればいいですか?

339 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 23:51:01 ]
マルチーズ乙

340 名前:デフォルトの名無しさん [2007/06/11(月) 11:47:18 ]
g++で、Aというクラスを継承したBというクラスを作成し、
void func(B obj_arg) という関数を定義してBを渡すと、
Bのコピーコンストラクタは呼ばれるのですが、Aは通常のコンストラクタが
呼ばれます。(コピーコンストラクタではない、と言う意味です)
これは、なぜこのようになっているのでしょうか?
いまC++を勉強中ですが、この部分が納得できずにいます。
すみませんがどなたか理由を教えてもらえませんでしょうか?





341 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:26:40 ]
>>340
再現する最小限のソース貼って


342 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:29:24 ]
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



345 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:52:34 ]
>>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
すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。

どうやら勉強不足のようです。
失礼しました。

ありがとうございました。


347 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:59:40 ]
エスパー342


348 名前:デフォルトの名無しさん [2007/06/11(月) 13:16:15 ]
>>342
>>347
なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。


349 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 13:19:25 ]
>>348
コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。

350 名前:デフォルトの名無しさん [2007/06/11(月) 13:25:20 ]
>>349
でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)



351 名前:342 mailto:sage [2007/06/11(月) 13:48:27 ]
コンストラクタの呼び出し方は独学でやってると大抵詰まる。
>>342にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。

352 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:21:19 ]
string::find と string::find_first_of 、
string::rfind と string::find_last_of って、
どう違うの? 同じ?

353 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:23:36 ]
rの有無、firstかlastかの違い
begin側から探し始めるかeng側から探し始めるかの違い

354 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:52:19 ]
ごめん。左右の比較の話。

解説を穴が空くほど読んだら
全然違う関数と分かった。

355 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 14:27:03 ]
ostringstream って、flush も endl もしないで str 呼んだら
不完全なまま出力されることってあるの?

大丈夫だって保証があればいいんだけど。

356 名前:デフォルトの名無しさん [2007/06/12(火) 18:12:14 ]
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに
何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?

357 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 18:15:59 ]
__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文がおかしいのか分からず迷っております

よろしくお願いします

363 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:25:30 ]
>>360
+=0て

364 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:26:45 ]
caseの後にbreakするんだ

365 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:29:49 ]
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は >>364 の指摘してるとおりだと思うが

366 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:37:55 ]
>>359
実行時に自分で変換すれば。

367 名前:MSX++ mailto:sage [2007/06/12(火) 20:42:32 ]
while(b--) {
*(int *)(((void *)(&c1))+(rand()&3))++;
}
ただし、c1からc4までが連続定義されているものとする。ANSI

環境依存なら。
int cx[4];
while(b--) {
cx[rand()&3]++;
}

かな?


368 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:42:47 ]
引数からファイルパスを取得し、同じ内容を別名で出力するプログラムに
関してですが、コマンドプロンプトなどで引数を与えると正常に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;
}

369 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:47:31 ]
よく意味がわからんけど
コマンドプロンプトにD&Dしてんの?

どういうオブジェクトをD&Dしてて、
どううまく動作しないのさ

370 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:49:25 ]
とりあえず引数を表示してみるとか



371 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:53:09 ]
o.txtをフルパスで書いたら?
なんか変なトコに出力してるだけだろ。

372 名前:360 mailto:sage [2007/06/12(火) 20:54:29 ]
>>364-365 など各位

皆様ありがとうございます。早速配列化と、breakを試してみます

373 名前:368 mailto:sage [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 mailto:sage [2007/06/12(火) 21:08:30 ]
>>371
なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。

んでコマンドライン第一引数から実行ファイルまでのパスを切り取って
output.txtに付け加えてあげたら、正常動作しました。

ありがとうございます。

375 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 21:13:46 ]
バッチファイルをダブルクリックした場合と、D&Dした場合じゃあ
カレントディレクトリの位置が違うんだよね。
よく分からん仕様ではあるよな

376 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:11:47 ]
a != '.'
これの右側(コンマ)の意味がわかりません。

377 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:14:35 ]
>>376
コンマなんてどこにあるんだ?

378 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:15:35 ]
>>376
右側にあるのはシングルクォーテーション「'」とピリオド「.」

379 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:17:00 ]
間違いました。ピリオドです。

380 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:18:29 ]
>>376
じゃあ、' の意味は分かるのか?



381 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:20:53 ]
>>376
aとか!=の意味は?

382 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:25:13 ]
''はAとかの文字リテラルを表示するときに使う物だと思います。

383 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:26:08 ]
>>381
分かります。

384 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:27:31 ]
>>383
本当にわかるのか?!=の意味言ってみ

385 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:29:51 ]
変数aが右オペランドと等しくないということです。

386 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:30:19 ]
そんなに虐めちゃるなよwって思ったけど確かに
>>376 の質問にちゃんと応えようとしたらこうなるのは致し方ないかw

387 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:33:21 ]
>>385
変数aがピリオドと等しくない

388 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:42:32 ]
>>387
これはひどい

389 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:43:55 ]
.は文字リテラルということですね。分かりました。

390 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:47:43 ]
'.' が文字リテラルであって
. が文字リテラルなわけではない。



391 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:15:42 ]
すいません、質問お願いします。
本日 -> という記号が出てきたんですが、どういった意味なんでしょう

よろしくお願いします。

392 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:20:34 ]
アロー演算子といいます

よろぴくね

393 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:23:44 ]
>>391
wisdom.sakura.ne.jp/programming/c/c36.html
ここ見ると幸せな予感。

394 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:30:40 ]
>>392-393
ありがとうございます。早速読んでみます

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__

396 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:40:02 ]
ファイルの拡張子、.cとかになってねぇか?
Borland詳しく知らないが、C言語でclass使えないぞ。

397 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 00:44:14 ]
予約識別子死ね。

398 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:16:30 ]
stdにsort()とstable_sort()があるけど
stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない
ってどういうときに重要になるの?
別関数を用意してまで保障する必要性がわからない。

399 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:20:20 ]
ヒント:ソートに使った以外のデータメンバ

400 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:27:34 ]
>>398
すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。



401 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:35:50 ]
あとstable_sortは最悪条件の時の効率がsortより良い。

402 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:37:10 ]
それを気にするなら、
ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。

403 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 01:48:03 ]
std::sort_heap()

404 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:14:47 ]
インデックスとアドレスを保持した構造体を使ってソートして、
それから位置を変更していけば、
安定かつ高速なソートができると思う。
作業領域が必要にはなるけどね。

405 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:22:42 ]
それでも最適化なら・・・最適化ならきっと何とかしてくれる・・・!!

406 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:22:35 ]
C++のthrow/catch

みたいな例外処理を何て呼ぶんですか?

407 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:26:41 ]
>>406
「例外処理」でいいような気がするけど、「C++のthrow/catch」に限定するなら
「C++例外処理」とでも呼べば?

408 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:28:09 ]
>C++例外処理

これの存在を知らない組み込みな人たちに伝えるので、
センセーショナルでクールな呼び名を教えて欲しいでつ。

409 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:34:50 ]
C++言語的割り込み処理

410 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:36:43 ]
それだ!

組み込みな人達から見ればセンセーショナルでクールでつね。











でも、自分から見れば八百長っぽくてダサダサ。



411 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:38:21 ]
C++ってなんでfinallyがないの?
あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか?

char *str = new char[256];
try {
  ...
  if (...) return;
  ...
} finally {
  delete [] str;
}
と、C/C++初めて1年の俺が適当に言ってみる。

412 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:41:27 ]
>>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする

413 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:42:02 ]
>>411
そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。

414 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:45:13 ]
>>411
↓こっちのが楽だと思わんか?

std::string str(256);
...
if (...) return;
...

415 名前:デフォルトの名無しさん [2007/06/13(水) 09:53:43 ]
そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。

416 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:54:43 ]
>C++言語的割り込み処理

割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ?
なら意味違うかも。。。

417 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:48:04 ]
割り込みはダメだろう・・・常識的に考えて。

例外処理は例外処理。
例外的な動作が起こった場合に行う処理。

418 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:52:15 ]
食い込みはおk?

419 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:56:58 ]
>例外的な動作が起こった場合に行う処理。

C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、
これじゃ、区別付かないじゃん。

420 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:02:07 ]
でも「C++例外処理」じゃ不満なんだろ。
センセーショナルでクールな・・・

       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ
       くく

「禿式例外処理」なんてどうだ?
組み込みのおっさん相手にはかなりセンセーショナルだろ。



421 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:03:25 ]
>でも「C++例外処理」じゃ不満なんだろ。

当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。

>「禿式例外処理」なんてどうだ?

オヤジギャグ?

422 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:06:32 ]
別に俺用語を生み出すのは構わないけど
他人とコミュニケーションを取るときには使わないでね

423 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:08:45 ]
洋本でも普通にC++EHだしな

424 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:09:05 ]
禿が作ったんだから禿式ってことね。
www.research.att.com/~bs/

エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。

425 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:15:26 ]
儂の例外処理は108式まで……

426 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:27:04 ]
構造化例外ってのは別物だっけ課?

427 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:38:04 ]
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう

428 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 12:42:32 ]
>>419
それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。

429 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:04:41 ]
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age

430 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:14:35 ]
memsetのこと?



431 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 14:27:31 ]
fill() だろ。

432 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:00:43 ]
ostream::write って引数 const char* だけど、
何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?

433 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:05:48 ]
>>432
writeは何をする関数かな?

434 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:12:29 ]
あなたに愛を届ける関数です。

435 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:19:29 ]
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をどう変えたら良いでしょうか?

436 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:26:24 ]
>>435
それで大丈夫なように見えるけど、どうダメだったの?

437 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:33:31 ]
>>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;
}

正しくはこうでした。

438 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:34:43 ]
cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる

439 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:36:49 ]
文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様

440 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:48:56 ]
>>439
ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。



441 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:32:27 ]
>>406-
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない

442 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:58:33 ]
>Windowsの例外処理

これってなんだけ?

443 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:16:48 ]
>>433
そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。

444 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:19:30 ]
関係ある。ちゃんと読め。
fwrite は、サイズと数を指定するだろ。
ストリームはストリームを指定するんだ

445 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:21:58 ]
>>442
「構造化例外」つってんのにググりもしないとは。

>>443
それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?

446 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:22:12 ]
>>442
__try
__except
__finally

447 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:23:58 ]
>>445
ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。

448 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:24:54 ]
>>444
要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?

449 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:26:38 ]
文字列をbyte列と言い換えればいいのでは、streamは

450 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:34:58 ]
クラステンプレートbasic_ostreamのこともたまには思い出してあげてください
writeの引数はただのcharではなくテンプレート引数よ



451 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:36:15 ]
ああ、そうか。
そういうことか・・・。
了解。分かった。

452 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:42:34 ]
俺が思うに、basic_ostream::writeに対応するCの関数は、
fwriteではなくfputs/fputwsなのだろう

するとfwriteに対応するのはなんだろうという気になるが

453 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:52:56 ]
いや、ヌル文字を無視するから、fputs とは対応しないと思う。
wostream::write がある以上、
fwrite と basic_ostream::write も対応しないんだろうな。

用途的には fwrite と ostream::write が対応するんだろうけど。

454 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:56:35 ]
ところで、例えば int 値をバイナリでファイルに書き込みたいときは、

ofstream f("hoge", ios::binary);

int x = 0x12345678;
f.write(reinterpret_cast<const char*>(&x), sizeof x);

という風に使うんだよね?(エラー処理は略)

455 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:29:12 ]
new されたサイズをプログラマが知る方法はないですか?

456 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:37:32 ]
>>455
標準にはない

457 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:03:36 ]
>>454
たしかに、そうなんだけどね。ただ、
 basic_ofstream<wchat_t> f;
のときは
 f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t));
になる。
const void* を引数にするとわけ分からなくならないか?

458 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:05:26 ]
"wchat_t"?

459 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:11:26 ]
>>457
それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる

write()で書いたものが変換をバイパスできるわけではないし

460 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:34:48 ]
>>457
それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。

const void* でわけわからなくなる点に関しては、
既にその点で了解してる。

バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。



461 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:14:07 ]
>>455 >>456
replacement newを書くというのはだめなのかな。

462 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:16:49 ]
>>459
エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?

>>459
うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。

463 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:21:27 ]
>>462
まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。

464 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:38:59 ]
C言語でプログラムを作ってコンパイルまでできているのに
いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、
数回入力するとエラーがでるんだけどなんでなんだい?

465 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:40:41 ]
コンパイルが通るからってバグが無いわけじゃないだろ

その情報だけじゃ何が原因かはわからんけど

466 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:42:18 ]
文てきには間違ってないんだけど、
長い文を書いて作ると絶対なるんだよね。
行数の限界とかってないよね?

467 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:47:43 ]
>>457
char 以外のストリームでバイナリ出入力っていうのがそもそも無理。

468 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:12:04 ]
>>463
一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。
少なくともSTLportでは、
ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign
の順で文字などが出力されているのだけど、
このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。
多分、探し方が足りないだけだと思うので。

>>467
basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、
UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、
charだけ特別ってわけにはいかなかったんだろうね。

469 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:37 ]
学校で作ったライブラリがあって、ヘッダーファイルに
#define GameMain \
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\
{\
MSG lpMsg;\
HWND hWnd;\
WNDCLASS myProg;\
(以下略)

って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・
とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。

学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz

470 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:47 ]
>>468
足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。




471 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:18:50 ]
>>469
どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ

472 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:19:40 ]
>>469
}が全角だとか言う落ちはないよな?

473 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:24:58 ]
キタ━━━━(゚∀゚)━━━━!!!!

474 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:35:19 ]
>>471 >>472
半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz

475 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:50:00 ]
問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。

コマンドプロンプトで実行したら絶対途中でエラーがでる。
なぜだよおい。

476 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:51:56 ]
環境もコードも示さずにその質問に答えられるのはエスパーだけだな
まぁexeとかコマンドプロンプトとか言ってるし
Windowsなんだろうなってことぐらいはわかるが

477 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:53:56 ]
まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード
で、VS2003のIDEのデフォルト設定がMBCSで、
VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、
こけてるんじゃないか。

478 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:54:51 ]
素人なもんですみません。windowsです。
でなにを示せばいいんだい。
ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。

479 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:00:51 ]
>>459
Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど

>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う

480 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:02:34 ]
>>478
素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。



481 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:04:08 ]
>>480
おそらくコマンドプロンプトがバグってると思われるんだけどな

482 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:10:04 ]
ソース出せばいいと思うよ

483 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:11:04 ]
>>481
わらた、おもしろすぎ。

484 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:13:38 ]
>>481
windows入れなおせばいいと思うよ

485 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:26:52 ]
>>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。

486 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:39:48 ]
>>474
/* */ 型のコメントなら大丈夫だよ

487 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:46:04 ]
>>857
へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?

488 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:47:30 ]
何誤爆しとんねんw

489 名前:487 mailto:sage [2007/06/13(水) 23:51:37 ]
誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><


490 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:52:31 ]
NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、
「NULLは 0」ということを前提としたプログラムは書くべきではないですか?
例えば…
void hoge(Foo *bar)
{
  // bar が NULL じゃなかったら
  if (bar != NULL) // こっちはいいけど
  if (bar)       // こう書く奴は死ぬべきでしょうか
    bar->...;
}



491 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:54:41 ]
>>355
それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。

492 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:56:23 ]
>>490 www.kouno.jp/home/c_faq/c5.html

493 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 01:24:47 ]
>>491
d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。

まあ、flush しといた方が無難そうだな。

494 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:27:21 ]
pc11.2ch.net/test/read.cgi/tech/1181087371/l2
↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?

495 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:35:50 ]
scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す

496 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:18:35 ]
>>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

497 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:35:41 ]
int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) {
 scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }

498 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:43:41 ]
>>497
%*cって何やってるんだろうとググったらscanfに見たことも無い仕様が
いっぱいで今更ながらにビックリしてしまったです…。
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0){
scanf("%*c");
j--;
}
レスを参考にこんな感じで直したらいけそうな感じになりました!
scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><

499 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:53:50 ]
つか、getchar でいいような

500 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:12:28 ]
>>499
getcharって文字入力用じゃないですか?
これで使う方法ってあります?




501 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:26:25 ]
scanf("%*c"); の代わりに使ってみればいいじゃないの。

502 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:34:57 ]
>>501
あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><

503 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:46:34 ]
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。

504 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:48:53 ]
余計複雑になるだけだと思うが。

505 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 03:24:22 ]
fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし


506 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 04:02:27 ]
1行につき数値1つ?

507 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:00:46 ]
>>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ


508 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:48:27 ]
すまんす

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;
}

引数の順序が反対の関数も内部は同じです。
今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、


510 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 15:43:21 ]
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&)

512 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:10:41 ]
>>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||()が定義できてよかった、という状況って
ありますでしょうか?
よろしくお願いします。



514 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:18:52 ]
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++再考ですね。見てみます。
ありがとうございます。

518 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:36:00 ]
ミスターoperatorでも目指してんのか

519 名前:デフォルトの名無しさん [2007/06/15(金) 16:38:22 ]
今見ている本が演算子のオーバーロードの章(6章)なので、
つい上記のような質問ばかりになってしまいました。


520 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 16:39:39 ]
よっ、ミスターoperator!



521 名前:257 mailto:sage [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++はいろいろ複雑ですね。



524 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:18:12 ]
質問なんですが、C/C++の開発環境でお勧めのものってありますか。
JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね?
ソースコードを書くのが楽したいというのが要望です。

ちなみに、TurboC++を試してみましたがどうもしっくりこない。
というか、まだほとんど使っていないので分からないというのが正直なところです。


環境、WinXP 普通の32ビット
(MacやLinuxでもおk)
当方のスペック 大学3年 Javaは普通に使いこなせるという程度

525 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:19:06 ]
よろしくお願いします。

526 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:54:37 ]
Eclipseが使えるんなら、そいつにCDTを入れてみたら?

527 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 18:22:25 ]
operator&&、operator||、operator, をオーバーロードすると短絡評価でなくなってしまう
見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない

528 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:50:20 ]
>>505
sscan系でも%iというものがあってな

>>512
intは値渡しでいいだろ

>>513
> operator||()が定義できてよかった、という状況って
Boost.Lambda

529 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:57:07 ]
samp じゃなくて smap に見えた

530 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:57:36 ]
>>524
VC++のアカデミックは?
アカデミックは超安かった希ガス

ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。



531 名前:デフォルトの名無しさん [2007/06/15(金) 20:10:29 ]
VC++2005expressは無料だよ

532 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 20:40:21 ]
express だな。
商用には使えないが、それはアカデミックも同じだな。

533 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:12:36 ]
嘘言ってはいけません。
Expressも他のEditionと同じように、
商用利用を禁止する条項はない

534 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:27:41 ]
VC++EEはリソースの扱いが難点だけど
それ以外は十分だな

535 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:30:29 ]
>>533
前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。

536 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 23:32:57 ]
アカデミックも商用可能だな。

537 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:23:34 ]
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:

としか出力されません。何故でしょうか?

538 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:26:58 ]
よく判らんけど、バッファリングされているからじゃないの?
フラッシュしたら?

539 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:27:16 ]
ロケールの設定

540 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:34:54 ]
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです

>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・




541 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:40:59 ]
>>540
imbue()

ただし
forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7

542 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 01:47:35 ]
>>541
おお!解決しました!
ありがとうございます!

543 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 02:41:07 ]
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?

544 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:12:13 ]
>>543
gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。

545 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:36:40 ]
wchar_t wfunc[sizeof __FUNCTION__];
swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);

とか自分で変換するしかないのかな。
バッファが必要だから、マクロ化するのも難しいな。
グローバル変数を使うのもアレだし・・・。

546 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:33:44 ]
>>540
"japanese"より""を勧める

547 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:10:16 ]
>>528
scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし


548 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:16:07 ]
>>530
普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる

今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする


549 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:21:21 ]
>>547
それはわかる
1行目の10進以外もに反応しただけ

550 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:21:59 ]
>>547
つ[%i]

って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。



551 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:23:48 ]
ツーか、むしろ突っ込むならここだな。
>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

552 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:30:18 ]
通りすがりのものだけど、>>550-551 のほうが変なこと言ってる

553 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:38:37 ]
知らないくせに偉そうな事を言うってのが
とてもみっともないんだよね

554 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:41:57 ]
あ、ちょっと違うか。
>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。

555 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:51:44 ]
最近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++の文法的知識はあります。

557 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:08:01 ]
MFCをやる利点てあるかな?
全部C#でことたりね?

558 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:10:30 ]
>>544 >>545
ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。

559 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 13:44:46 ]
>>557
.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。

個人的には今からMFCやる意味はあんまり無いと思うけど。

560 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:02:04 ]
ファイルに関するたくさんの情報を保持するクラスを作りたいんですが、
こういう時のメンバ変数はprivateにするのが基本なんですよね?
Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?



561 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:16:15 ]
>>560
必要に応じて。

562 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:30:56 ]
>>561
ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。

563 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:41:34 ]
どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら
クラスじゃなくて構造体を使うとかしたら?

564 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:00:11 ]
>>562
駄目な理由を考えてみる

565 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:17:27 ]
クラスにしたのはコンストラクタとデストラクタが使いたかったからです。
このクラスの変数には別のクラスから頻繁にアクセスする必要があって、
こういう場合隠蔽する意味あるのかな〜?と。
かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・
とか思ってなかなか決められないんです。

566 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:20:29 ]
あ、構造体でもコンストラクタとデストラクタは使えますね。
結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。

567 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:22:57 ]
好きにしろ

568 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:28:29 ]
>このクラスの変数には別のクラスから頻繁にアクセスする必要があって
まずこの設計が間違ってないかどうかを考えるべきだと思う

569 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:35:22 ]
ですよね。
ちょっと検討しなおします。
ありがとうございました。

570 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 16:54:32 ]
横からなんですけど>>556さんの質問に関連して、
現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?






571 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:00:38 ]
>>570
とりあえず.NETかそうでないほうをやるかで決めては

572 名前:そう思えるかどうかが分岐点 mailto:sage [2007/06/16(土) 17:06:41 ]
MFCやればいいじゃん。趣味なら何の問題もないよ。
もう後がないとか、2005EEでできないとか、どうでもいいじゃん。

573 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:11:21 ]
さすがにMFCはもうやめといたほうがいいだろ。
どうせまだ入り口程度しかやってないんだろ。
だったら早いうちに.Netへ移行しておけ。

574 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:15:07 ]
>>571
今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz

>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。

575 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:17:10 ]
>>573
やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?

576 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:08 ]
>>575
プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。

577 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:19 ]
プログラマになるなら最低7つは言語を習得しないとダメです。

578 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:34:41 ]
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について

579 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:31 ]
そもそも何を持ってマスターと言うのか?
C++0xとかまだ定まっていないというのに

580 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:53 ]
難易度高くても、C++しかできないとな。
つぶしが利かない。



581 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:39:32 ]
>>580
C++できたら他の言語なんて楽勝だろ。

582 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:41:42 ]
楽勝だったら、7つ覚えておけよw

583 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:45:08 ]
仕事で必要になるたびに覚えていけばいい

584 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:46:28 ]
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。

585 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:47:52 ]
いやぁ、C++からJavaはちょっと壁があるぞ。
C++言語を覚えただけじゃ、GUIもスレッドもないしな。

586 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:49:11 ]
さらに言うと、現状javaの案件といえば、サーバーサイドだな。

587 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:50:03 ]
>>585
でも逆の Java → C++ と違って挫折することはまずないだろ。

588 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:51:10 ]
それで挫折する人間なら、C++覚える時点で挫折するよ。

589 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:59:05 ]
GUI は言語の問題じゃなくてライブラリの問題だと思うが。

590 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:00:40 ]
言語だけのC言語ベースでイインジャネ?
設計まで絡んだら知らん。



591 名前:デフォルトの名無しさん [2007/06/16(土) 18:01:50 ]
reinterpretって何て読むの?
ネット辞典で調べてもでてこん。

592 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:03:55 ]
リインタープリット

593 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:12:53 ]
文法だけではプログラマになれないよ。
そもそも質問主は、MFCか.Netかで迷ってるんだよ?
それでもライブラリだから論点が外れてるといえるか?

594 名前:デフォルトの名無しさん [2007/06/16(土) 18:17:30 ]
俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね
いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ
for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ
イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ

595 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 19:20:14 ]
>>594
慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。

596 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:22:02 ]
俺はC++からJavaScript+HTMLをやったんだが。
C#には簡単に移行出来たな。

597 名前:W [2007/06/16(土) 20:25:34 ]
JavaScript+HTML

598 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:30:12 ]
CやC++で
a = b = c = d;
としたら、段階的に処理を書くと、
a = b = (c = d); //まずcにdが代入される
a = (b = c) = d; //次にbにcが代入される
(a = b) = c = d; //最後にaにbが代入される
と言うことでいいのでしょうか?
詳しく教えてほしいです

599 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:34:46 ]
a = (b = (c = d))
c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される

600 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:40:25 ]
なるほど!
わかりやすい説明をありがとうございます!!



601 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:43:43 ]
HTMLってプログラミング言語?

602 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:46:19 ]
・変数がない
・ループ、条件分岐が書けない
・関数も書けない

修飾言語ではあるが、プログラム言語ではないかな

603 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:53:07 ]
HTMLはマークアップ言語です。


604 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:01:38 ]
>>602-603
トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。

605 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:03:45 ]
プリコンパイル済みヘッダーを作ったですが
デバッグモードではビルドできるのに、リリースにすると

error LNK2005: *** は既に ***.obj で定義されています。

というエラーが全部のファイルで発生してしまいます。
これは何故なんでしょうか?
環境はVS2005です

606 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:28:39 ]
>>605 エラーです

607 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:32:24 ]
特異な言語といえばSQLもそうだな。
一応Languageと名前についてるけど、
これをプログラミング言語と呼ぶのは
ちょっと抵抗ある。

608 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:49:46 ]
ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が

609 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:51:48 ]
SQLに制御構造をつけたのがストアドじゃないかね

610 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:58:45 ]
HTMLだってLanguageと名前についてるだろ
SQLはプログラミング言語じゃなくて、データベース言語だろ



611 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:59:39 ]
Languageは「言語」であって「プログラミング言語」ではないからな。

612 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:07:19 ]
>>594
for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。

グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。

613 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:08:18 ]
HTML はプログラミング言語じゃなくてマークアップ言語。

TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。

614 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:56:37 ]
SQLがチューリング完全でないことは明白。

615 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 00:22:00 ]
何言ってるの?

616 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:02:03 ]
わからないなら調べてから聞けよ

617 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:07:53 ]
あ〜い、とぅいまてぇ〜ん♪

618 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 09:34:26 ]
>>602
IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ

619 名前:デフォルトの名無しさん [2007/06/17(日) 12:43:27 ]
親クラスのprotectedな変数が、public継承した子クラスでは
publicにならずにprotectedなままなのは何故ですか?

親クラスのpublicな変数が、protected継承した子クラスでは
protectedになるのに。

publicよりもprotectedの方が強いと理解しておけばよいのでしょうか


620 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:46:05 ]
そう理解しておけばおk
そしてプライベートが最強と



621 名前:デフォルトの名無しさん [2007/06/17(日) 12:55:24 ]
>>620
ありがとうございました。
そう理解しときます。


622 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:57:34 ]
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、
thisポインタを戻り値にしない書き方ってありますか?

623 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:58:53 ]
ありますよ

624 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:01:58 ]
それは例えばどういった書き方でしょうか?


625 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:03:17 ]
>>624 void operator = (...

626 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:04:43 ]
a = b + c + d;の処理の流れって、

a = (b + c) + d; //まずbにcを加算
a = ((b + c) + d); //次にb+cの値にdを加算

最後に aに代入という流れで理解してよいのでしょうか?
詳しく教えてください。

627 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:25 ]
デバッグ

628 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:57 ]
デバッグする環境がありません・・・すいません。


629 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:09:12 ]
>>625
マジサンキュー
課題が終わった

630 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:10:36 ]
>>626
その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。



631 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:13:46 ]
いや待て、a = b + (c + d)という解釈をしているかも知らん。

632 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:28:39 ]
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから
b+cが先だろ

633 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:40:39 ]
>>630
しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。

634 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:56:56 ]
>>633
コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?

635 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:08:24 ]
???
誰もそんな事言ってないぞ?

636 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:14:59 ]
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。

637 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:18:51 ]
a = b() + c() + d();

で、b, c, d の呼び出される順番は未定義だっけ?
結合順と、各項の評価順はまた別の話だよな。

638 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:37:07 ]
fgetsの使い方で

fgets(buf, sizeof(buf), stdin);

のような常套句がありますが、これは sizeof(char) が1であることが
前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が
想定した数の2倍になってしまうと思うのですが。

こういった書き方は問題ないのでしょうか。

639 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:40:16 ]
>>638
sizeof(char)は常に1

640 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:41:57 ]
>>638
sizeof(char)は絶対に1だから安心しる。

ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。



641 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:43:56 ]
charが1バイトじゃなくて1バイトの定義がchar?

642 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:44:21 ]
charは常に1バイト

643 名前:638 mailto:sage [2007/06/17(日) 18:47:09 ]
レスありがとうございます。
charが常に1バイトというのは、規格で決まっているのですか?

644 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:48:49 ]
>>643
決まってる。

ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。

645 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:50:14 ]
誤解があるといけないから念のために言うけど、
char が 1 バイトというのは決まってるが、
1 バイトが 8 ビットである保証はない。
1 バイトが 9 ビットの環境もある。

646 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:51:29 ]
1バイトのビット数を取得するマクロってありますか?

647 名前:638 mailto:sage [2007/06/17(日) 18:51:48 ]
皆さんありがとうございました。勉強になりました。

648 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:57:42 ]
アルバイトのヒト数を取得するユニクロってありますか?

649 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 19:19:40 ]
>>646
CHAR_BIT

650 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 20:31:59 ]
>>637
未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。



651 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:06:51 ]
たまにはlimits.hも眺めよう

652 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:08:10 ]
float.h も眺めようぜ

653 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:10:15 ]
眺めすぎて惚れるなよ

654 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:21:25 ]
やだ・・///

655 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:22:24 ]
構造体やクラスを関数内で定義すること、
つまり、以下のようなことがしたいのですが
これは規格でできることが保証されていますか?

void hoge() {
 struct hage {
  ...
 };
 ...
}

656 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:23:44 ]
>>655 C89 の頃から余裕で使える。

657 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:26:15 ]
ちなみに関数内で関数は定義できません

658 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:33:03 ]
>>656
ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。

>>657
構造体やクラスの静的関数で代用するのが常套句になってますね。

659 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:44:49 ]
GCC の拡張でよければ関数内関数は使えるんだけどな。確か。

660 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 22:29:53 ]
関数内クラスをテンプレート引数に出来たらなぁ
と思うことがある



661 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:05:55 ]
charのバイト数の件で便乗質問。
shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか?
決まってないのなら確実に2byteの型は有りますか?
また確実に4byteの型はありますか?

662 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:07:51 ]
longは32bit以上というのはK&Rに書かれていた気がする。
というか規格原理主義者によると、1バイトが何ビットかも決められていないとか

663 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:17:52 ]
>>661
#include <stdint.h> で int16_t と int32_t でおk。

664 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:20:56 ]
>>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>で代用するくらいしかない

665 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:32:47 ]
C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?

666 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:48:09 ]
必要以上に移植性を求めるのは不毛。
必要以上に移植性を失うのも愚かしいこと。

667 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:53:10 ]
俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^

668 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:56:15 ]
どうせ他の部分も環境依存しまくりなんだろ?
どんどん使っちゃえYO!

669 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:04:53 ]
>>667
__closureも活用してもっと便利に!

670 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:13:58 ]
勉強になるな。



671 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:19:27 ]
#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 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:48:22 ]
そりゃそうだろ

674 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:49:09 ]
>>673
すんません
分かり易く解説お願いします

675 名前:673 mailto:sage [2007/06/18(月) 00:49:19 ]
>>671
の事ね

VC6が出来たのはだいぶ前だから

676 名前:672 mailto:sage [2007/06/18(月) 00:50:28 ]
>>675
あ、すんません
タイミング良かったんで即レス来たのかと思っちゃいましたw

677 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:57:26 ]
#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は引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。

678 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:04:08 ]
>>677
おぉ、なるほど

後、確認なんですけど、自分が書いた>>672だと動作変わっちゃうんですよね?

勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz

679 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:05:32 ]
別に動きは変わらんと思うが

680 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:11:32 ]
>>679
あ、そうなんですか?
ありがとうございます

個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな〜と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)




681 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:12:16 ]
失礼、
×他から
○他からも


682 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:13:48 ]
動きは変わらないが、
後者は関数呼び出しのオーバーヘッドが発生する。


683 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:20:02 ]
関数本体の中にやたらと#ifdefなんかが入ってるのは、
あんまりいいコードとはいえないな。
「見づらくてしょうがない」というその感覚は限りなく正しい。
改善する方法をいろいろ考えるべきだな。


684 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:25:43 ]
>>682
すいません

そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?

>>683
ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです


685 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:39:54 ]
関数を呼び出すという処理は、それ自体スタック操作や
プログラムカウンタの移動などの処理が行われる。
だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で>>677の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。

ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。

でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?


686 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:47:04 ]
>>685
なるほど、詳しい解説ありがとうございます

せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね

687 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:56:30 ]
可変長引数マクロを使えるコンパイラならこんなこともできる
#if DEBUG
#define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__)
#else
#define DebugPrint(...)
#endif

688 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:01:41 ]
リリース版ではインライン関数にして、
コンパイラの最適化に期待する手もある。

689 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:02:11 ]
/* 古いコンパイラで使える技 */
#if DEBUG
#define DebugPrint(args) printf args
#else
#define DebugPrint(args)
#endif

/* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */
DebugPrint(("%d\n", 1234));

690 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:19 ]
古くなくてもできることないか?



691 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:47 ]
>>687,>>689
おぉ、凄いですね

色々ご教授ありがとうございます

>>688
もし良ければその方法も教えて頂けないでしょうか・・・

692 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:33 ]
1. インライン関数の定義を別ファイルに分ける

2. inline を INLINE マクロに置き換える
  INLINE マクロの定義は以下の通り(これは自分で定義する)

#ifdef NDEBUG
#define INLINE inline
#else
#define INLINE
#endif

3. リリース版の場合はヘッダファイルでインクルードする

#ifdef NDEBUG
#include "***.***"
#endif

4. デバッグ版の場合はソースファイルでインクルードする

#ifndef NDEBUG
#include "***.***"
#endif

693 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:49 ]
#if DEBUG
#define DebugPrint printf
#else
#define DebugPrint (int)sizeof
#endif

694 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:17:09 ]
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 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:21:38 ]
>>694 リリースでエラーにならないか?

696 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:28 ]
>>695
エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。

697 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:35 ]
>>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
って感じにしちゃうのがいいかもね

698 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:33:27 ]
VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。

699 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:34:36 ]
if(1); else に置換するという技もある。
多分最適化で消える。

700 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:27 ]
>>697
関数 f が副作用を持ってたら問題があるな。



701 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:55 ]
VC++ならTRACEで以上では?

702 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:41:56 ]
皆さん
感謝、感激雨あられです

ちょっとF1見てる隙にこんなに書き込みが・・・

色々参考にさせてもらいます

703 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:52:34 ]
何F1見てんだよこのヤロー

704 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:55:55 ]
ああ、F1押すと長々と待たされた後で
役に立たないヘルプが出るよね

705 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:56:43 ]
>>700
まあ、必要なら>>699で多分消せるじゃね?

>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん

706 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:57:53 ]
必要ならって言うか、必須なんだぜ。

707 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:02:02 ]
>>706
いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?

708 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:06:34 ]
>>699 だと式のつもりが文になってしまうね。

709 名前:デフォルトの名無しさん [2007/06/18(月) 03:10:09 ]
ちょっと相談です。
言語はCでもC++でも構いません。
ちなみに開発環境はWin2000+VisualStudio2005です。

DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。
この関数は、処理結果を文字列として str に返してくれます。
strに渡される文字列の長さは *不明* です。
DLL、および関数Funcの中身を弄ることは出来ないものとします。

この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。


710 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:04 ]
>>708
これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy



711 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:48 ]
>>709
static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。

712 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:19:32 ]
>>709
Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです

通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。

例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません

713 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:21:19 ]
>>711
charが抜けた。すいません。

714 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:25:49 ]
>>707
そういやそうだな。

715 名前:709 mailto:sage [2007/06/18(月) 03:28:23 ]
即レスサンクス。
やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。

>711
とりあえず1万バイトくらいでがんばろうと思います。

>712
バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)


716 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:01:59 ]
>>715
え、本当にどうしようもないの?
仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?

そりゃDLLの設計が糞としか言いようがないが…

717 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:45:43 ]
gets を安全に使うにはどうすればいいですか?
っていう質問と一緒だね。残念ながら無理だ。

718 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 10:59:41 ]
仕様上から決まる例で32bit整数が最大値だとわかれば
常にその大きさの配列渡せば安心、かな

719 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:10:29 ]
メモリ使い切って落ちるに1票

720 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:12:45 ]
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ?
それにしても 32bit 最大値はやりすぎだろうけど。



721 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:50:56 ]
パイプとかその辺の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指定で継承すると、引数のない
コンストラクタを呼ぶというルールなのでしょうか?


723 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:17:15 ]
#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;
}
そのようですね
なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです

724 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:53:20 ]
>>722
>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;

725 名前:709 mailto:sage [2007/06/18(月) 15:00:50 ]
>716
一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。

726 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 15:21:26 ]
>>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)が落ちます(汗
どうすればこの動作を実現できるんでしょうか?

728 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 18:09:09 ]
自己解決しました
bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗

729 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 19:34:13 ]
>>722
class sub3 : public sub1, public sub2
{
  sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている

730 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:43:11 ]
こんばんは、皆さんに質問です
テンプレートの定数の引数をエレガントに記述する方法が分かりません

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 ]
元々汚いんだからエレガントなんて求めなくて良い

732 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:50: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って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?

733 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:53:19 ]
>>731
では、その元々汚いものを綺麗にする方法を教えてください。

734 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:00:58 ]
>>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



736 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:14:01 ]
なぜに&

737 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:15:51 ]
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」

738 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:16:17 ]
すみません、いくつか質問させてください。
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 mailto:sage [2007/06/18(月) 21:18:19 ]
あ、私は730で>>734さんに対してのコメントです

740 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:20:20 ]
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。




741 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:23:23 ]
>>735
>printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]〜[9]までの配列が用意されてるって事で
おk。

742 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:27:19 ]
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。

743 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:44:32 ]
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど

744 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:49:54 ]
>>741
理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。

745 名前:デフォルトの名無しさん [2007/06/18(月) 21:51:47 ]
>>736
頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。

>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。

>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。


>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。



746 名前:730 mailto:sage [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がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも

747 名前:594デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:57:33 ]
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
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。

748 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:58:46 ]
>>745
とりあえずグダグダうるせえ。




749 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:00:47 ]
>730
というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。

750 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:03:07 ]
>747
ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。



751 名前:デフォルトの名無しさん [2007/06/18(月) 22:17:19 ]
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか?
継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?

752 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:21:47 ]
classでレガシーな初期化はできなかった希ガス。
class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。

753 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:39:10 ]
>752
全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。

754 名前:デフォルトの名無しさん [2007/06/18(月) 22:49:14 ]
サンクス。
しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。

755 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:00:50 ]
質問
 1. 死ぬまでenumハックを使うべきなのか。
 2. 死ぬまでexportは使ってはならないのか。

756 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:07:21 ]
>>755
1. そうです
2. そうです

早死にしないように気をつけて

757 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:10:24 ]
1 VC6を窓から投げ捨てりゃいいんじゃね
2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね

758 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:16:47 ]
>>754
www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014


759 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:44:18 ]
>738
初期化は実行時に起こる。
テンプレートが使用された時、というのはコンパイル時の話。

件の場合、定数化されてしまうというのを無視すると

int i = Array<int, 3>::Length;

とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。
で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも
初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。

>2、int i = Color::ColorDimension;
>  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。

760 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:38:16 ]
いくつかのサイトで見られたのですが、
STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。



761 名前:760 mailto:sage [2007/06/19(火) 07:24:58 ]
あ、すみません。
構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?


762 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:59:43 ]
>>760
定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。

>STARTUPINFO si = {};
コンパイル通った?

763 名前:760 mailto:sage [2007/06/19(火) 08:56:24 ]
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。
コンパイル通らない可能性もあるんですね。それなら使いません。

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?

764 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 08:56:28 ]
>>761
全部省略できるのは C++ だけ。

765 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 09:59:42 ]
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。

766 名前:デフォルトの名無しさん [2007/06/19(火) 10:21:17 ]
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。

767 名前:760 mailto:sage [2007/06/19(火) 11:07:01 ]
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。

768 名前:766 mailto:sage [2007/06/19(火) 12:48:11 ]
解決しますた

769 名前:デフォルトの名無しさん [2007/06/19(火) 12:57:26 ]
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。

770 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:01:28 ]
>>769
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。



771 名前:デフォルトの名無しさん [2007/06/19(火) 13:10:27 ]
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>

int main(){
printf("今現在BMPの画像");
return 0;
}

772 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:11:07 ]
どうせWindowsだろ
猫でも読んどけ

773 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:47:09 ]
丸投げは宿題スレ以外はだめ
今どこまで理解しててどこら辺がわからないのか書け

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は同じことをする関数なんですけど..どっち使うのべきか

777 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 14:56:41 ]
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?

778 名前:デフォルトの名無しさん [2007/06/19(火) 16:30:34 ]
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています

779 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:40:49 ]
try catchじゃ例外は出せない

780 名前:デフォルトの名無しさん [2007/06/19(火) 16:42:51 ]
tryの中でcatchに飛ばす方法を教えてください



781 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:48:03 ]
「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;
}

783 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 17:24:35 ]
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1

784 名前:デフォルトの名無しさん [2007/06/19(火) 17:35:43 ]
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。

785 名前:783 mailto:sage [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; がないだけ。
↑のは ×初期化されない ○一度も利用されることがない
かと思っています。

788 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 20:14:08 ]
最適化で消されてるだけじゃないかな
/Faで.asm見ればわかるよ

789 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:00:05 ]
スカトロCGを激しく集めるスレver27
sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537

537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528

 試 し た の か ? 

IDがC++

790 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:08:56 ]
よりにもよってスカかよw



791 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:12:52 ]
しかも logK か。
何か化学的な雰囲気を感じるぞ。

792 名前:730 mailto:sage [2007/06/19(火) 22:17:42 ]
>>759
Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?


793 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:19 ]
>>792
テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない

794 名前:730 mailto:sage [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。ありがとうございました。

795 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:55:57 ]
いかん
最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん

796 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 01:49:32 ]
例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで
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;
};
こう書いても問題ないですか?(というか、こう書くべきですか?)

797 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:00:31 ]
問題はないけど、
プリミティブ型だと結構遅くなる。


798 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:37:39 ]
>>796
boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか

799 名前:デフォルトの名無しさん [2007/06/20(水) 08:26:49 ]
>>783
>>788
ありがとう。「最適化で消された」みたいです。腑に落ちました。

800 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:49:37 ]
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ならクラッシュしません。これは何が原因でしょうか?



801 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:51:30 ]
>>800
各変数の値がどうなってるかくらい調べろよ

802 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:56:12 ]
>>800
とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?

803 名前:800 mailto:sage [2007/06/20(水) 13:04:12 ]
>>801
すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。

>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。

804 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:13:25 ]
C++で安全なコードを書きたいなら、キャスト前のチェックとか、
->の元がNULLでないことを保証するassertなんかは必須かと

というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?

805 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:17:03 ]
>>803
予測なんてしなくていいから、デバッグ実行しろ。

806 名前:800 mailto:sage [2007/06/20(水) 13:41:47 ]
>>804
lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。

>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。

807 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:56:34 ]
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 mailto:sage [2007/06/20(水) 15:24:02 ]
>>807
わざわざありがとうございました。

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)では、配列番号から、要素のポインターを代入したいと思っています。

812 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:29:47 ]
(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&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします


815 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:42:09 ]
constな(C++の)参照

宣言自体の読み解き方がわからなければ、ここでも読んでおけ
kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ

816 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:19:12 ]
>>812-813
あ、*の扱い方が間違ってたのか。ありがとうございました。

817 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:05:47 ]
windowsで、C++builder使用してます。

質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。

これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
 とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
 で、できそうでしょうか?

2番目だと簡単そうですか?

818 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:56:04 ]
ソフト単体ならパケット監視してどうこうということもできるだろうけど、
windowsのばあい、システムに対してユーザーが介入するのは難しい。

アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。


819 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:05:58 ]
>>817
ttp://www.wilderssecurity.com/showthread.php?t=112582
でも読んでみたら

820 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:29:39 ]
>>818
レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。

>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。



821 名前:デフォルトの名無しさん [2007/06/20(水) 22:47:33 ]
>>820
そんなあなたにフィルタドライバか、DLLインジェクション。

822 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:07:41 ]
なんで具体的にそのソフト名をいわんのかね。

823 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:36:12 ]
改造する気?

824 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:45:03 ]
C++でLinkポインタというのを作りました
所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります

質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…

825 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:53:56 ]
Lockできないboost::weak_ptrを実装したって話?

826 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:31:22 ]
あのー

(unsigned int) ((context->count[0] >> 3) & 0x3F)

これがなぜ64のあまりになるのですか?

827 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:33:42 ]
>>826
0x3fは2^6-1だから。

828 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:47:40 ]
0x3f=16*3+1*15

829 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:50:06 ]
えーとじゃあ
45と120の場合いくらになるんだろ
なんか計算あわない

830 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:52:38 ]
>>826
一瞬、LISPあたりのコードかと思った。



831 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:53:37 ]
ところでなんで
(context->count[0] >> 3)してるんだろう。

これすると値辺になる気がするのですが

832 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:05:29 ]
つーかそれ、
8で割った後に64で割った余りを求めてる事になるが


833 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:14:49 ]
あっそ、よかったね

834 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:30:08 ]
よくないという話だな

835 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:54:13 ]
>>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 ]
すみません。長いソース打ち込みたいとおもって、本屋で長いソースが載っている本を買ってきました。
www.amazon.co.jp/C%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E9%9B%86-%E6%9E%97-%E6%AD%A3%E5%B9%B8/dp/4320027108/ref=sr_1_3/250-4187414-6697033?ie=UTF8&s=books&qid=1182412183&sr=1-3
です。

QuickC対応って書いてあるんですが、VC++6.0でも大丈夫ですか?

839 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:10:28 ]
>>838
QuickC……

その本は今すぐ返品しなさいw
ソースが欲しいなら、
sourceforge.jp/
sourceforge.net/
なんかで探しなさい。
もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。

840 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:57:25 ]
94年じゃしょうがないな



841 名前:デフォルトの名無しさん [2007/06/21(木) 18:27:59 ]
unsigned conv_in:1;
という記述を見かけたのですが
このコロンはなんですか?

842 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:31:58 ]
>>841
ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。

843 名前:838 mailto:sage [2007/06/21(木) 18:33:45 ]
>>839
どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。

>>840
やっぱだめですよね。。どうもありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:35:49 ]
おいおい独学社ならそれくらい嫉妬家よ

845 名前:841 mailto:sage [2007/06/21(木) 18:44:33 ]
>>842
ありがとうございます

846 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:55:12 ]
>>844
今日始めたばかりの独学者なんだろ。事情を察しろ。

847 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:06:10 ]
そういうところのリンクをまとめて貼ってもいいんだが
見つける喜びってのがあるからなあ

848 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:09:04 ]
>>847
急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。

849 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:20:52 ]
長いソースを打ち込みたいならCプログラミング診断室


いや本気にしないでね

850 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:22:08 ]
>>825
おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い



851 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:45:49 ]
OfficeのWORDの文字だけをいじるプログラムを組みたいのです。
ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。
DCOMを使うのも、避けたいのです。

そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、
UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。

よろしくお願いします、

852 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:51:51 ]
あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、

853 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:10:31 ]
あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。

854 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:17:29 ]
POIでいいじゃん。
がんばって移植すれ。

855 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:31:38 ]
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++特有の問題でしょうか?
(省略できたとしても普通にループ書いたほうがわかりやすいけど)

856 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:20:41 ]
>>852
ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?

857 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:06:54 ]
>>856
バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。

858 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:10:48 ]
夏カシス昔よくやった

859 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:00:27 ]
>>855
g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。

860 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:55:40 ]
>>851
WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。



861 名前:デフォルトの名無しさん [2007/06/22(金) 13:26:29 ]
0〜9の数字をランダムに発生させて
数字が被らないように
どのような順番で数字が来たか表示させるという処理をしたいのですが
このようなプログラムを作るにはどうすればいいのでしょうか
乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます



862 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:14 ]
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。
C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。

863 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:39 ]
>>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

865 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:40:26 ]
力抜けよ

866 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:56:17 ]
そう、もっと・・・力を抜いてごらん・・・。

867 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:59:44 ]
for (;;) { >>865 >>867 >>866 }

868 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:02:50 ]
5→6→4じゃね?

869 名前:デフォルトの名無しさん [2007/06/22(金) 14:27:56 ]
C++では変数の宣言をどこにでも置けると聞いたのですが、
goto文で変数の宣言を飛ばすことはできないのですか?
以下の文をコンパイルできません。

int main() {
goto end;
int a = 100;
end:
return 0;
}

870 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:38:20 ]
>>869
何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。



871 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:43:43 ]
つまり、gotoで分岐する範囲では宣言できないということだ。

872 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:46:05 ]
switch - case で、caseで宣言できないのと同じだな

873 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 16:18:11 ]
最初に格納する数値を入力して、
以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
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() + "です";
みたいに使いたいのですが、これはエラーがでます。


875 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:01:09 ]
boost::lexical_castなどはどうだろう

876 名前:874 [2007/06/22(金) 17:10:29 ]
>>875
おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。

877 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:20:04 ]
>>873
一文字ずつアスキーコードで比較して行けばいいのでは?

878 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:25:46 ]
>>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;
}

879 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:41:32 ]
>>877
このスレを最初から読んでいたらscanf処理のことが書いてあって、
代わりにfgets+strtolということが書いてあったので
この処理を弄くって上に書いたような処理がOKになったら
使いやすくなりそうだと思ったのですが
やはりこの仕様にするとそれが早いかもですね…。

>>878
宿題では無くちょっとこのスレを読んでいて気になったので考えていました。
しかし書いてくださりありがとうございます。
いくつか知らない関数があるのでググって見てみます。


ちなみにfgetsとstrtolで12a23から12と23を取りたかったら
strtol(str,&error[i],0);
strtol(&error[i]+1,&error[i+1],0);
こんな感じでずらしていく感じにするのでしょうか?


880 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:51:22 ]
>>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;
}



881 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 18:25:06 ]
>>880
おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!

882 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:30:17 ]
突然すみません。質問させていただきます
自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。

883 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:35:30 ]
分割コンパイルで検索

884 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:43:54 ]
解凍したディレクトリで、./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 ]
やあ、たろう
この勝負は俺がもらった
約束通りお婆ちゃんの貞操は頂いて逝くぜ

887 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:20:55 ]
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++が二つある場合の評価順序は不定と言うことで。

888 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:27:23 ]
>885
プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ

七行プログラミング part5
ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/

889 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:38:11 ]
>>880
sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?

890 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:41:30 ]
>>889
別にカッコつけなくても生きていけるんです



891 名前:デフォルトの名無しさん [2007/06/22(金) 23:46:17 ]
sizeofというのは「関数」じゃない。
だから、sizeof(buf)のbufは、関数の「引数」じゃない。
関数じゃないから、括弧は「関数呼び出し演算子」ではない。
sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。

「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。


892 名前:889 mailto:sage [2007/06/23(土) 00:11:33 ]
ありがとうございます。付けなくてもいいんですね。
なのに()付きのサンプルコードが多いのは何故なんでしょうか?

893 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:15:46 ]
>>892
型のサイズを知るには、sizeof(int)のように括弧が必要。
それに倣って、括弧をつける人が多数。

894 名前:889 mailto:sage [2007/06/23(土) 00:19:49 ]
なるほど、そういうことだったんですね。
ありがとうございました。

895 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:22:27 ]
括弧つけても優先順位に全く影響与えないしな。
無駄だし勘違いする人も出るからと嫌う人もいるし、
括弧を付けた方が統一性が出ると付ける人もいる。

そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。

896 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:56:10 ]
何でtypeidはカッコ必須なの?

897 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:58:17 ]
typeidの場合はsizeofと違って対象が型だろうが値だろうが括弧が必要。

だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。


898 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 01:07:29 ]
>887
>まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。

不定じゃなくて未定義でしょ。
鼻から悪魔がでてくるじょ

899 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 06:59:03 ]
いや不定だろ

900 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 07:11:10 ]
JISX3010 6.5式 (70)によれば、
「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」



901 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 13:33:55 ]
せいぜい言葉遊び。
「未定義」だから、コンパイラにより「不定」になるんだろ。

902 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 14:02:30 ]
>>901
www.kouno.jp/home/c_faq/c11.html#33

903 名前:デフォルトの名無しさん [2007/06/23(土) 14:44:39 ]
C++とはちょっと違うのですが、適当なスレが見つからなかったので、すみませんが質問させてください。
VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を
外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか
そもそもこいつが何者なのかがさっぱりわかりません。
マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが
外部プログラムの実行だけがどうしてもできません。
どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。


904 名前:855 mailto:sage [2007/06/23(土) 21:13:36 ]
>>859
遅くなってすみません。キャスト外せませんか…ありがとう。
俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、
でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。

905 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 21:15:34 ]
>>904
const の有無で2つある。

906 名前:855 mailto:sage [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は後者を選ぶようなルールがあれば話は早いと思うけど、残念。

907 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 23:46:52 ]
文字列中の " を \" に変える関数ってコレで良いんですかね?
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();
}

908 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:03:12 ]
どうでもいいが関数名はEscDQuoteのほうがいいんじゃないの?

909 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 05:33:08 ]
今では vector のメモリ上での連続性は保証されてますけど、
昔は少なくとも規格上では保証されていませんでした。

で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか?
実在しなければ、メモリ上での連続性を仮定したプログラムは
過去の処理系との互換性があるということで安心できるのですが。

910 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:15:16 ]
俺は聞いたことがない

普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、
連続していなかった処理系なんてないと思って差し支えないはず



911 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:17:54 ]
そうですか。安心しました。
d。

912 名前:デフォルトの名無しさん [2007/06/24(日) 13:53:56 ]
ifstreamへの書き込みについて質問させてください。
ifstream fin("test");
として、
char c;
char s[100];
のとき、
(1) fin >> c; ===> 読み込みは一文字だけ。
(2) fin >> s; ===> 読み込みは一行全部。配列sのサイズを越えても。
という理解でいいでしょうか。
(実験したらそうなりました。)


913 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:04:56 ]
普通は、fin.read(s, 100 )とかstd::getline( fin, str )とか使うけどね。

914 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:14:46 ]
>>912
配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。

915 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:31:41 ]
>.912
(1)についてはそのとおり
(2)についてはちがう。
空白文字(スペース、タブ、改行等)を読み飛ばし、
次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。
scanfの%sと同じと思っておけばよい。

916 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:35:50 ]
まあ、折角 istream 使ってるんなら、
char じゃなくて string 使った方が安全でいいね。

917 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:52:06 ]
そもそも、なんでifstreamへの書き込みについての質問なのに読み込む話ばかりなんだ?

918 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:54:29 ]
>>917
2行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。

919 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:22:55 ]
>>910
設計時点で C 配列の代用という用途は考えられていて、
規格への明記が漏れていただけだと思われ。

↓でも現状の実装についての考察なんて問題にならなかったみたいだし。
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69

920 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:59:49 ]
>>919
なるほど。確かに。

ただ、仕様上 one-past-the-end の問題は無い、
と言ってる点がいまいち分からんのですが。
5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証)
あたりとは矛盾しないのですか?



921 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:17:52 ]
>>920
!v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が
有効なことと 5.7p4 の
「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」
っていうルールから導き出せるから、特に vector について書くことは無い
ってことじゃないかな?

まぁ、そうだとしてもわかりにくいね。

922 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:26:54 ]
なるほど・・・。確かに。

923 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:10:37 ]
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。

924 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:28:14 ]
これですか?

www5e.biglobe.ne.jp/~me-jin_k/


925 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:30:07 ]
早速ダウンロードしました

926 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:33:48 ]
ないのならないで結構です。

927 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:24:12 ]
>>923
半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう

そして、そんなものが作れるなら…

928 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:35:00 ]
>>927
そうなんですか。
イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。
ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html
プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、
中身を開けませんでした。

929 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:36:55 ]
難しいようですね、お騒がせして申し訳ありませんでした。

930 名前:ちんこ [2007/06/24(日) 19:27:46 ]
www.uploda.org/uporg872561.cc.html

g++です。
三目並べのゲームを作ります。
show_stateがばぐります。どこがおかしいか教えてください



931 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:34:07 ]
こんなのコンパイルとおるんだな。

932 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:37:08 ]
>>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目並べをしてみたいです。
最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。

935 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:38:40 ]
>3通りを表現するのに一番適したデータ型はなんですか?
boost::triboolってのがある
これはtrue, false, indeterminateの3値を表現できる
これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定
とでも使えばちょうど良いんじゃないかな

936 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:39:14 ]
>>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

939 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:58:59 ]
ちょっとすれ違いですが、
eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?

940 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:02:43 ]
>>939
あります。スレ違いなので詳細は割愛。

>>937
サイズが大きいから遅いとは簡単にはいえません。
まずは真っ当に作り上げることが先決でしょう。



941 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:07:12 ]
>>937
そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。
って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。
ほとんどintの処理速度=charの処理速度だと思うが。
実際型のビット幅が決まってないのって弊害にしかならん気がする。

942 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:12:39 ]
typedef int TRIBOOLとでも定義しておいて
とりあえず組んでみたら?
出来てから速度とか使用メモリーを測定してそれから決めればいい

943 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:16:21 ]
>>937
高速になる理由は>940-941のとおり。
charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。

1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。
ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに
配列として持つより設計を見直すほうがいいと思われる。


944 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:20:22 ]
メモリアクセスの遅延により、メモリの節約自体が速度に効くだろうから
やっぱり最終的に実測しないと決まらない。

945 名前:ちんこ [2007/06/24(日) 21:21:39 ]
うお、その話ならどっかで聞いたことがあったような。
じゃあintにしてみます。
9路盤で5目並べする時用にプログラムをあらかじめ
N // 盤の大きさ
M // これだけ並べば勝ちだぜぃな数
として組んだ方がいいですかね?

しかしどうやればいいかはさっぱりなんですがね。
何しろゆとりなもんでwww

946 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:25:46 ]
>>945
とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ
話はそれからだ

947 名前:ちんこ [2007/06/24(日) 21:27:00 ]
まじ難しい。

948 名前:ちんこ [2007/06/24(日) 21:29:53 ]
クラスの依存関係がイミフ

949 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:33:39 ]
日記帳にでも書いてろ

950 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:43:37 ]
あきらめろ



951 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:45:30 ]
>>937
メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok

ちなみにC++ではbool型のサイズは環境によって違う
普通はintかcharになってるようなのでメモリの節約にはならない

でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから
まず動くもの作ってそれから考えるほうがいいよ


952 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:58:34 ]
>>945
ちなみに、見た目簡単そうな5目並べだが、
まともな思考エンジン作れたら結構な額で売れる

昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw


953 名前:ちんこ [2007/06/24(日) 21:58:57 ]
Playerクラスとかいるか・・・?
でもないとオブジェクト指向っぽくないよなぁ・・

954 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:00:34 ]
>>945
この辺参考にして頑張ってくれ
www.h6.dion.ne.jp/~game296o/GameMain.html
www002.upp.so-net.ne.jp/ys_oota/mdp/

後はひたすら試行錯誤
考えて分からなければとりあえず書いたら最低限何が駄目か何が必要かとかわかってくるんじゃね?


955 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:05:01 ]
>>953
お前には無理だ
せいぜい無駄な時間を浪費するがよい

956 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:42:47 ]
>>928
KL1
www.klic.org/software/klic/index.ja.html

957 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:48:42 ]
くだらない質問だと思いますがお願いします。
STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか?
Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。

958 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:49:27 ]
std::copy

959 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:06:23 ]
>>958
どうもです。

960 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:09:28 ]
&vector_instance[0]ではいかんのか?



961 名前:こんにちは mailto:こんにちは [2007/06/25(月) 03:30:00 ]
こんにちは

962 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:45:34 ]
次期仕様のドラフトだと data 関数があるみたいだが、
今の所は &v[0] か &v.front() だな。

963 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:47:50 ]
>>953
Player インタフェースクラスを作って、
PlayerCom と PlayerHuman クラスを派生して・・・

964 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:03:54 ]
GameMaster クラスを用意して本物の盤面をいじれるのはそのクラスだけにして…

965 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:05:41 ]
PlayerCom からも複数のクラスを派生して・・・

966 名前:ちんこ [2007/06/25(月) 07:14:38 ]
そんなにクラス作るのか。
PlayerからPlayerComとPlayerHumanを継承
PlayerComから複数はなんで?
もしや思考パターンを変える為?


967 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:32:33 ]
ちんこ死ね

968 名前:ちんこ [2007/06/25(月) 07:36:38 ]
初心者歓迎スレなのに・・・
クラスを使ったものとしてはC++かつGUI以外でははじめて
もう何がなんだか分からんとです。
まずUML勉強した方がいいかな?
生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。

969 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:01 ]
はいはいわろすわろす

970 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:12 ]
○×ゲーム程度なら、まず非オブジェクト指向で作ってから
設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。



971 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:59:30 ]
>>968
愚かな一貫性は小人物に憑いたお化けである

972 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:03:07 ]
まあ、色々なパターンで作って、
それぞれのプログラムの性質を比較してみるのも勉強になるよね。

973 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:13:38 ]
そろそろ次スレの季節だな。

974 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 09:55:20 ]
定刻も、過ぎてることだしな

975 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:02:09 ]
次スレ立てた

【初心者歓迎】C/C++室 Ver.39【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1182740506/

976 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:03:14 ]


977 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:36:14 ]
VisualC++2005です。switch文で以下のように下にcaseが続くと変数の宣言と同時に初期化できません。
これは何故でしょうか?
case 1:
 int i=1;//int i; i=1;ならOK
 break;
case 2:
 break;

978 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:38:42 ]
case 1 に飛んだ場合はいいけど、
case 2 に飛んだ場合は i が使えるのに
初期化の位置を飛ばしてしまう。
だから、そういうことはできないようになってる。

case 1: {
 int i = 1;
} break;

みたいにブロックで囲むといいよ。

979 名前:977 mailto:sage [2007/06/25(月) 22:54:36 ]
ありがとうございます。そのようにします。

980 名前:デフォルトの名無しさん [2007/06/26(火) 21:11:34 ]
>>913-918
ありがとうございました。




981 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:34:30 ]
>>978
横レスだが
なるほど
時間があれば言語仕様もきっちり読んでおけってことか

982 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:55:00 ]
時間が無くても言語仕様は嫁

983 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:21:51 ]
必須かよorz
プログラム開発の面接を受けた感触として
ひょっとしたら読まなきゃかもなーとは思ってたが

984 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:24:17 ]
必要があれば読みたくなるだろうからそれまでは別に無理して読まなくて良いよ
経験があってこそ初めて理解できるような部分もあるし

985 名前:デフォルトの名無しさん [2007/06/26(火) 23:52:05 ]
C++で一時オブジェクトを関数に渡す時に値渡しするしかないんですか?
boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが
右辺値を参照で渡せるような何か良い手段ありますか?

986 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:52:50 ]
constのことかーーーーーー?

987 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:59:47 ]
あああ、const参照にはこういう使い方もあったんでうsね
どうもです

988 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:09:12 ]
亀だが
charとかshortは演算途中で内部的にintに無理矢理キャストされることがある
理由は>>941の通り
だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い

989 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:42 ]
>>988
「ことがある」じゃなくて、その動作が標準として規定されている。

990 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:27:02 ]
ちなみに
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)



991 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:29:54 ]
>>989
そうか、すまん俺の勉強不足だった

992 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:19:35 ]
sdk\include>grep typedef.*BOOL WinDef.h
File WinDef.h:
typedef int BOOL;

993 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:34:17 ]
>>989
格上げされない場合もあるわけだが。

994 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:52:27 ]
>>993 sizeof ぐらいじゃね?

995 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:18:22 ]
今更だけど、C/C++とC99は別物だと思う。

996 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 05:44:06 ]
「演算途中で」となるとまあ sizeof くらいなのかな?
あ、いや、キャストもか。

997 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 07:02:02 ]
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1182740506/

念のためにもう一度貼っとくよ〜
二重に立てるような無駄を防ぐためだよ〜

998 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 12:26:27 ]
>>992
MSのやつはバージョンによって違うらしいぞ


999 名前:デフォルトの名無しさん [2007/06/27(水) 14:45:41 ]
1000ゲトー

1000 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:46:23 ]
 。  + 『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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef