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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/06/03(日) 22:35:41
3デフォルトの名無しさん:2007/06/03(日) 22:57:43
3ならC++は廃れる。
4デフォルトの名無しさん:2007/06/03(日) 22:59:14
殺す
5デフォルトの名無しさん:2007/06/03(日) 23:00:47
           ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < 通報しますた!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < しますた!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ!! .スタ!!
6デフォルトの名無しさん:2007/06/03(日) 23:01:44
おいおい
ここはいつからネタスレになったんだ
72:2007/06/03(日) 23:08:10
             >―:::::::::::::::::::::::V::<
          /::::::::::::::::::::::::::::::::::::::::::::\
     ゝ---‐彡'´:::::::::/::;::::::::::::::::::::::::::::::::ヽ
       ̄//:::::::/::/l:::::l::|:::ヽ::::::::ヽ::::::ハ
    ー=ニ:ィ::/::l:/::/::::/:::::l:::\::ヽヽ::::l::::::::l
.        /::;l:/-イ:l、:::::::::::/l::/l:∧::::}::::|::::::、\
       l::/'l:::::::::::トl_ヽ:::::///zl左∨:::::l:::::::::::‐≧-
       l:{ ゝ::::::::{代fjヘ:{/´ 弋チ, }::::メテ:≦≠-
       `ゝ ヽ::l:::≧= }`    ̄ ノィ/´::l/
           j/ヽlヘ  丶       彳!:/  殺すなんて・・・
          ´  l´ ヽ、' ⌒  /ノィk1
               />‐ 彡 ´ ̄  〉
              {:.: ̄ ̄   .:.:.:.:.:└-、_
              _/>:.:.:.:.:..:.:_:.:-‐:.:.:. ´.:└┐
          __/.:./ ./:. :.:.:.: ̄:.:.:.-‐ .:. _ -‐'^`ア ヽ
.          /l/.:.  人:.    .:.:.:.:. _、-‐    /   ∧
         {/ .:  /  \___ -‐ ´             ∧
.         /:   '    |         l /      l|
        /: .: l              l |      l|
         l.: .:.:. |    , ゚         ヽ| l     〈

機動戦士ガンダム00
http://www.gundam00.net/
82:2007/06/03(日) 23:12:01
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < ころしますだ!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < 殺します!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ-ベーション!!
9デフォルトの名無しさん:2007/06/04(月) 00:05:40
構造体の初期化で
={0}とmemsetによる初期化ってどう違うのでしょうか?
またどちらの方がいいですか?
10デフォルトの名無しさん:2007/06/04(月) 00:11:34
>>9
前者の方が普遍的。
後者は間違いの元。
積極的に使う理由がないなら前者でOK。
11デフォルトの名無しさん:2007/06/04(月) 00:14:09
動作はそんなに変わらないけど
={0} : 他のメンバが初期化されてない、って警告が出る場合がある。
memset : ビットパターンが0であると保証されているわけではない型
(ポインタとか)でぐだぐだ言われる場合もないわけでもない。それと、
ゼロクリア処理であって、初期化ではないので、挟もうと思えば処理を
挟むことができてしまう。
129:2007/06/04(月) 00:29:40
>>10-11
ありがとうございます。できるだけ前者を使う事にします。
13デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/04(月) 04:53:15
Borland C++ 5.5.1+BCC Developerを使っています。
あるクラスのメンバ関数を別ファイルにし#includeしているのですが

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

というエラーが出ます。

このファイルをプロジェクトからはずすとコンパイルでき
問題なく実行できるのですが、なぜでしょうか。
また、クラス宣言内に関数を書いてもうまくいきます。
15デフォルトの名無しさん:2007/06/04(月) 05:11:56
どうせ ***.cpp を #include してるんだろうが、
***.cpp もそれ単体でコンパイルされるからだ。

つーか、何で #include してるかが気になる。
16デフォルトの名無しさん:2007/06/04(月) 09:23:11
system関数でunixのコマンドを実行する際に、結果が戻ってくる前に、次の行へ実行を移したいのですが、
どのようにすればよいのでしょうか?
コマンドラインでいうところの&をつけてバックグラウンドで実行するような形にしたいのです。
17デフォルトの名無しさん:2007/06/04(月) 10:15:54
>>16
一般的にsystem()はシェルを経由してコマンドを呼び出すので、単に&をつければいい。
Ex.
system("sleep 86400&");
18デフォルトの名無しさん:2007/06/04(月) 10:19:54
情報系学部の大学2年です。将来はプログラマ・システム関係に就きたいと思っています。
環境は自分のパソコンにCygwinを入れて使っています。
今まではアスキー出版の「C言語入門」という本で勉強してきて基本的なことは理解しています。
それでC++にはいつ頃から入ればいいでしょうか?まだ早いでしょうか?
またこれから何を勉強していったらいいかいまいち先がわかりません。
簡単なゲームを製作することが目標です。
ただプログラミングは楽しんでいるのでこれからも続けていきたいです。
大学の授業ではC言語のアルゴリズムを勉強中です。
19デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/04(月) 13:25:30
void function(struct car*)とか
void function(struct car[])で良いんじゃないの。
22デフォルトの名無しさん:2007/06/04(月) 13:26:46
>>20
AoSよりSoAを使え。
23デフォルトの名無しさん:2007/06/04(月) 13:26:55
それでいいと思うけど、高々並び替えるだけの目的なら関数を自作する必要はないと思うよ。
その構造体の比較関数をオーバーロードして、std::sort()呼ぶだけでいいんだから。
24デフォルトの名無しさん:2007/06/04(月) 13:29:38
>>22
パフォーマンスを気にするようなレベルじゃないならAoSでいいんでね?
どうせ100台分だってことだし。
2520: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デフォルトの名無しさん:2007/06/04(月) 13:48:34
コンパイルエラー出まクリスティ
27デフォルトの名無しさん:2007/06/04(月) 13:53:26
同一のスコープ内で 同じシンボル名の変数(fin な)を2回宣言してる
2820:2007/06/04(月) 13:54:52
二種類のファイルを呼ぶには、どうしたらいいのでしょうか・・・
29デフォルトの名無しさん:2007/06/04(月) 13:57:17
違う名前にするかopen使うかすればいいんじゃねーの
入門書読めばわかる
30デフォルトの名無しさん:2007/06/04(月) 14:27:31
クラスでnew,delete演算子をオーバーロードしたいんですが、
staticじゃないといけないんでしょうか?
エラーが出て困ってます。
31デフォルトの名無しさん:2007/06/04(月) 14:30:56
そうですか。
32デフォルトの名無しさん:2007/06/04(月) 14:55:06
そうですね。
33デフォルトの名無しさん:2007/06/04(月) 15:17:32
そうですく。
そうですれ。
34デフォルトの名無しさん:2007/06/04(月) 15:28:45
>>31-33金くれ
35デフォルトの名無しさん:2007/06/04(月) 18:32:08
>>30
staticを付けなくてもstatic扱いされる。だって実体がまだ/もう存在していないから。
これに限らず静的メンバは、ただそのクラスに関連があるからクラス宣言の中に入っているだけと思えばいい。
36デフォルトの名無しさん:2007/06/05(火) 00:51:23
>>9
遅レスなんだが、みんな{0}初期化なの?

個人的にCでtypedef enumを使うんだが、こいつが一番始めにいると
型違いエラー(警告だっけ?)になるからずっとmemsetを使うようになったんだが。
わざわざ、メンバの順番意識するなんてバカらしいし・・・
37デフォルトの名無しさん:2007/06/05(火) 00:55:30
浮動小数点数の0とヌルポインタのビットパターンが
単に0を並べただけと規定されているわけではないから

もちろん自分の環境でそうなっているのなら、
移植性無視してやるという選択肢はある
38デフォルトの名無しさん:2007/06/05(火) 00:56:43
そういう構造体にはコンストラクタを作ってしまうので無問題。
39デフォルトの名無しさん:2007/06/05(火) 01:03:05
>>37
>>38
いや、C++だったらコンストラクタでポチポチ初期化するよ。
浮動小数点は使わない(使えない)環境なんで問題ないんだが、
NULLポインタはどうしようもないな。今の環境は0だから問題ないんだけど。


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

後者はmutexを初期化するときにPTHREAD_MUTEX_INITIALIZERを使う
のと同様の使い勝手になると思いますので、そういう感じの
名前をつけておけば紛らわしさも無いかと。
41デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/05(火) 01:49:20
>>41
global変数なら
= { 0 }
とかは、べつにいらないのではないでしょうか。
43デフォルトの名無しさん:2007/06/05(火) 01:50:02
つうかenumは明示的に指定して初期化すべきだろ
memsetて
44デフォルトの名無しさん:2007/06/05(火) 01:59:21
>>42
global変数ってのは間違ってたかな?
初期化用のconstデータを作るって感じで

>>43
構造体内のメンバに変更があったときに、面倒なのと
チーム内で変数の0=異常値として扱ってるのでまぁいいかなと・・・
いや、わかってるんだけどね・・・昔からの流れは中々変えさせてもらえなくて
45デフォルトの名無しさん:2007/06/05(火) 02:08:21
>>44
global変数の場合ですと、ゼロで初期化したいだけなら、規格に
準拠している処理系なら自動的にそうなるので、= { 0 } は不要です。

enumのようなものを含む型に初期値を正しく与えたい場合には、例えば
= { none, 0, ... }
とでも書けばよいではありませんか。
global変数による初期化を利用するのなら、こう書くのは一箇所だけ、
型の定義を変えても変更はそこだけで済みます。
46デフォルトの名無しさん:2007/06/05(火) 02:29:01
>>45
いや、組込みなんで、処理系なんてもんがいてくれればそれでいいんだけど
RAM配置からコールドスタート処理、レジスタ設定からその他初期化処理まで
やるのは自分なわけで・・・って関係ないか。
ま、そんなわけで、自動的に初期化なんてしてはくれないわけですよ。

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

って、そろそろすれ違いなんでやめますか。
板汚し、失礼しました。
47デフォルトの名無しさん:2007/06/05(火) 02:42:48
>46
組み込みのイニシャルルーチンは無いの?
そこでRAMの初期化をするはずなんだが
48デフォルトの名無しさん:2007/06/05(火) 02:48:22
>>47
領域クリアしてるよ
いくつかの領域にわけて、初期化内容に応じてどこまで初期化するか決定してる。
で、そこで初期化されると困るけどメインルーチンに戻ってきたときには
初期化しておいてほしいやつとかを、ぽちぽち初期化してる。

いや、そんな変数ばっかの環境が悪いとかは言わないで・・・
49デフォルトの名無しさん:2007/06/05(火) 03:04:00
>48
なんでRAM全領域を初期化しないの?
5049:2007/06/05(火) 03:06:39
ここ初心者対象スレだったね。
組み込みの話題は別にします。
51デフォルトの名無しさん:2007/06/05(火) 03:19:39
π計算はそのパソコンの性能がわかるって聞いたんだけど質問させて。
Q1,πって高校数学でも式作れるよね?
  それをプログラムにすればいいんじゃない?とか思ったんだけど・・
  でもサイト調べたら難しい公式とか使ってるけどどうして?
Q2,円周率のプログラムってなんで桁に限界あるの?一応無限までだせそうだけど
  パソコンつけっぱなしでどんどんでてくるんじゃないのかなっておもったんだけど
  どこどこの大学が何桁まで出した!とかあってあれ?って思った
Q3,高校数学レベルでいいから簡単なπ求めるプログラムを教えて。
  使用してるのはC言語のWINDOWS

学校で聞いてきになったんだけど、言葉足らずだったらごめん
52デフォルトの名無しさん:2007/06/05(火) 03:21:23
53デフォルトの名無しさん:2007/06/05(火) 03:25:23
>>51
 ちょっと行ってみる。ありがとう。
54デフォルトの名無しさん:2007/06/05(火) 03:25:41
クロスコンパイラが.bssを分けてくれない?
.bssは分けてくれるけどそれをゼロクリアするスタートアップコードはついて
無いし、自分でも書いてない?(セグメント別れてるんなら書くの簡単だと思うけど)

組込みって奥が深くてわかんないや
5551:2007/06/05(火) 03:35:07
>>52
 だった・・

今見てきたけど、このくらいの質問は論外なんだなって思った。
学校で聞いてもそれは今関係ない、いつかやるからって言われるし・・
まぁいつかわかるとおもうけど
56デフォルトの名無しさん:2007/06/05(火) 03:36:41
>>55
「マチンの公式 多倍長演算」でぐぐってみろ。
5751:2007/06/05(火) 03:45:42
>>56
夜中に申し訳ない!
58デフォルトの名無しさん:2007/06/05(火) 03:50:05
>>41
Cなら enum を 0 で初期化してもエラーにはならないはず。
C++ ならエラーになるけど、その場合はコンストラクタが使えるし、
= {} も使える。

C/C++ のどっちかが決まってるなら問題にならないはず。
CのソースをC++でもコンパイルできるようにしたいときだけ、
面倒な話になる。
59デフォルトの名無しさん:2007/06/05(火) 04:09:56
>54
おそらく初期化ルーチンはライブラリ化されていると思うよ。
どこのマイコンコアだかわからんが、メーカー純正のコンパイラ?

組み込みのCの場合でもスタック以外のRAM領域はクリア(つまり0)されているのが基本
60デフォルトの名無しさん:2007/06/05(火) 04:30:00
連結リストを利用したプログラムを作ったんですがうまくいきません
ソース http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4155.txt
コンパイラ BCC5.5

デバッガを走らせて見たところ、39行目のscanf("%d",&ch);の実行後にstartPtrの値がNULLになったことが原因みたいなんですが、
なぜここでstartPtrの値が変わるかわかりません
BCC5.5のバグかなんかでしょうか?
61デフォルトの名無しさん:2007/06/05(火) 04:38:02
>>60
バグってるのはすぐ処理系のせいにする君の頭だ
char型の変数に%dを突っ込むな
%dはint型のポインタを要求する
62デフォルトの名無しさん:2007/06/05(火) 04:43:00
まぁ初心者のうちはありがちなことだな>処理系のバグを疑う
63デフォルトの名無しさん:2007/06/05(火) 04:44:09
ほんとだorz
ありがとうございます
なんか、こういうミスで詰まること多いんですよね
64デフォルトの名無しさん:2007/06/05(火) 04:53:05
>>60
startPtr + 9 は一体どこをポイントしているとお思いか?
自分の無理解無努力無責任のつけをコンパイラに転嫁させませぬよう。
65デフォルトの名無しさん:2007/06/05(火) 04:54:23
これって、char型の変数とか言ってる>61も大間違いなのに、それで勝手に納得している>63ってなんなの?
66デフォルトの名無しさん:2007/06/05(火) 07:46:12
>>64-65
startPtr + 9で問題ないだろ
67デフォルトの名無しさん:2007/06/05(火) 08:23:53
ってか、Cのソースなのに、for文の中で変数宣言しちゃうのはどうかと。
68デフォルトの名無しさん:2007/06/05(火) 08:30:08
C99だと思えば、ってBCCはC99非対応だけどね
69デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/05(火) 13:27:54
>>69
for(int c=0;c<10;c++;startPtr++){
これは
for(int c=0;c<10;c++,startPtr++){
の間違い
71デフォルトの名無しさん:2007/06/05(火) 13:36:12
>>69
for(int c=0;c<10;c++,startPtr++){
これは
for(int c=0;c<10;c++;startPtr++){
の間違い探し
72デフォルトの名無しさん:2007/06/05(火) 13:40:54
てんで話にならない。
73デフォルトの名無しさん:2007/06/05(火) 13:43:07
>>72
誰がうまいことを言えと(ry
74デフォルトの名無しさん:2007/06/05(火) 13:43:49
いやー、わからんかったw
画面上でも1ドットだぜ・・・
75デフォルトの名無しさん:2007/06/05(火) 21:57:56
大学2年です。現在、C言語の勉強をしています。
制御構造やポインタなど基本的なことは理解できました。
これから何をしていけばいいでしょうか?将来はプログラマ志望です。
授業ではアルゴリズムを勉強しています。
勉強しておいたほうがいい言語や順序みたいなものを提示してくださると嬉しいです。
76デフォルトの名無しさん:2007/06/05(火) 22:00:29
フローチャートを勉強してるの?
77デフォルトの名無しさん:2007/06/05(火) 22:00:50
>>75
擬似でいいからアセンブラ
78デフォルトの名無しさん:2007/06/05(火) 22:04:44
分かりました、専ブラに挑戦してみます。
79デフォルトの名無しさん:2007/06/05(火) 22:08:57
プログラマでも入る分野で結構違うと個人的には思う。
>>77のアセンブラもいいと思うし、割り込みとかマルチスレッドなんかもいいんじゃね?
可読性とか汎用性とかデザインパターン、テストとかデバッグ技術もあってもいいかも?

アルゴリズムって実際に役に立つかな?
いろんなプログラムを山ほどこなしてるほうがいい気がする。
80デフォルトの名無しさん:2007/06/05(火) 22:15:30
>>79
>>75の大学がどこかは知らないが、大抵大学の授業で教えるアルゴリズムっていうと
基礎の基礎で結構重要だろw
81デフォルトの名無しさん:2007/06/05(火) 22:18:43
学生時代を思い返してみると、オートマトンとかやってたような・・・
俺、役に立ってねぇ・・・
もっと基礎的な内容かな?ソートとか?
ソートなんて、バブルソートとクイックソート以外は必要なときに毎度調べてるな。
82デフォルトの名無しさん:2007/06/05(火) 22:19:09
>>75
宿題スレで宿題解くのオススメ
83デフォルトの名無しさん:2007/06/05(火) 22:25:36
アルゴリズムでオートマトンはやらなかったなぁ
ソートとか探索とかリストとかやったかなぁ・・・?
仕事でそのまま使えるってことは少ないだろうけど、基礎を覚えておいて損は無い
84デフォルトの名無しさん:2007/06/05(火) 22:29:01
問題「ソートするプログラムを書け」
俺「qsort(...); はい終わり^^」
85デフォルトの名無しさん:2007/06/05(火) 22:30:50
まあ、一口にプログラマといっても
「標準ライブラリに丸投げでOK」から「自力でアルゴリズムをひねり出すことを要求される」まで幅広いわけで
86デフォルトの名無しさん:2007/06/05(火) 22:32:25
つ[安定ソートするプログラムを書け]
87デフォルトの名無しさん:2007/06/05(火) 22:32:29
あぁ、言われて見れば重要だなぁと思ってきたw
リスト、スタック、キューとかのデータ構造とかか。
素因数分解とかは、暗号化とかの分野いかなきゃ使う機会はなさそうだな
8875:2007/06/05(火) 22:50:14
有り難うございます。
授業のアルゴリズムではソートやリスト構造、木構造などをやっています。
アセンブラですか。何か必要な環境等は必要でしょうか?
またC++も興味があるのですが勉強可能でしょうか?環境はCygwinです。
89デフォルトの名無しさん:2007/06/05(火) 22:55:43
>>88
やる気があれば何でも可能。
>>82のアドバイスをうけて、慣れてきたら同じ課題をCっぽい解き方、
C++っぽい解き方の両方やってみたりしても良いかも。

90デフォルトの名無しさん:2007/06/05(火) 22:57:04
>>86
つ[std::stable_sort()]
91デフォルトの名無しさん:2007/06/05(火) 23:08:45
>>88
紙とペンさえあれば勉強できる

>>90
C言語で解け
92デフォルトの名無しさん:2007/06/05(火) 23:18:29
紙と鉛筆で間に合うのは頭のいい人だけ
常人は適当にmasmなりインラインアセンブラ等ケースで身に着けましょう
93デフォルトの名無しさん:2007/06/05(火) 23:19:30
やべぇ俺頭いいのか
94デフォルトの名無しさん:2007/06/05(火) 23:26:17
アセンブラの勉強するときはシミュレータ上で動かしたいよね

VirtualPC とか VmwarePlayer とか Bochs とか qemu とか
いろいろあるけど、どれがいいんだろう?
9575:2007/06/05(火) 23:36:48
なるべく無料で環境は揃えたいところです;
あと、どうもMicrosoft製はソフトが重いイメージがあるので微妙です。
なのでVisual Studioはどうも慣れません。
大学の先生もなるべくUNIX上でコンパイル・実行したほうがいいと言っています。
96デフォルトの名無しさん:2007/06/05(火) 23:39:25
じゃあnasmとかどうでしょ?
97デフォルトの名無しさん:2007/06/05(火) 23:40:24
>>95
はいはいかわいい子犬ちゃん
98デフォルトの名無しさん:2007/06/05(火) 23:47:21
VisualStudioの環境が重ければソースを外部で編集するようにして
構成ツールをmake代わりに使ったり、clだけ利用すればいい話
てかいくらなんでもUNIX推奨は冗談だろう…
99デフォルトの名無しさん:2007/06/05(火) 23:48:45
>>98
俺はそうしてる。つっても芽衣の開発環境じゃないんだが。
普段がテキストエディタなもんで、そっちのほうがやりやすい。
100デフォルトの名無しさん:2007/06/05(火) 23:50:21
VisualSutudioの環境が重ければPC買い換えればいい

・・・もしかしてだいぶMSにお布施してるかな、漏れ。
101デフォルトの名無しさん:2007/06/05(火) 23:55:22
>>95
かわいこちゃん・・・
人の話聞いて知ったかするより、自分でWinとUnix系の違いを
自分で調べて知りなさい。
102デフォルトの名無しさん:2007/06/06(水) 00:43:54
>>98
最近のゲーム機やパチンコ台の液晶なんかの場合はUNIX系環境が主流だな
そっち方面ならcygwinやlinuxでなれておくと楽だぞ
あのへんなら開発環境に金かからんし

Winだけのプログラム勉強したいならともかく、
広い意味でプログラムの勉強したいならVisualStudioはオススメしない
103デフォルトの名無しさん:2007/06/06(水) 00:46:43
プログラムの勉強なら環境はなんだっていいだろ
104デフォルトの名無しさん:2007/06/06(水) 00:51:27
いいだろ
105デフォルトの名無しさん:2007/06/06(水) 00:53:21
マジかよ
もうvsのインターフェースに慣れちゃったぜ…orz
106デフォルトの名無しさん:2007/06/06(水) 01:23:45
>>103
MSの環境は独自の俺様仕様が多過ぎる、それに値段も高い
SDKのバージョン変わるとコンパイル通らなくなったりするし
小規模なプログラムだといいけど大規模になるとあの互換性のなさには泣けてくるぞ
開発以外の余計な事に時間取られすぎるんだよ

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

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

やっぱ、作ったもんが動くからプログラミングって楽しいんじゃね?
とはいえ値段や仕様変更の多さには同感だw
108デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/06(水) 04:26:58
inline関数は内部リンケージを持つからヘッダファイルには書くな。
111109:2007/06/06(水) 04:36:03
内部リンケージで調べたら分かりました
ありがとうございました
112デフォルトの名無しさん:2007/06/06(水) 04:55:09
内部リンケージって言葉を聞いたばっかりで
理解せずに使ってるだけな馬鹿は無視しろ
113デフォルトの名無しさん:2007/06/06(水) 04:56:48
>>110
inline 関数はヘッダに書くもんだろw
114デフォルトの名無しさん:2007/06/06(水) 06:07:24
正しくはinline関数の「宣言だけ」ならヘッダには書くな、書くなら「定義」まで
書け、って事だな
115デフォルトの名無しさん:2007/06/06(水) 06:13:31
具体例としてはジャネリックな独自テンプレートライブラリを作る時とかか
なんか極めて限られるような状況ですな
116デフォルトの名無しさん:2007/06/06(水) 07:31:36
>>110
inline 指定とリンケージは関係ないよ。
117デフォルトの名無しさん:2007/06/06(水) 07:32:28
>>116
でもヘッダファイルに宣言だけしたらリンカエラーでるじゃん?
118デフォルトの名無しさん:2007/06/06(水) 07:35:02
なんという面倒くさい仕様…
これは暗に「よほどのことが無い限り使うな」と言っているので同じではないか
119デフォルトの名無しさん:2007/06/06(水) 07:36:50
>>117
定義が無いからだろ。リンケージも inline も関係ない。
120デフォルトの名無しさん:2007/06/06(水) 07:39:09
>>118
その認識で問題ない。 inline で速度が変わる状況なんてかなり減ってきてるし、
これからも減るだろうし。
121デフォルトの名無しさん:2007/06/06(水) 07:40:49
もうinline化なんかコンパイラに任せろよ
適当にやってくれるだろ
122デフォルトの名無しさん:2007/06/06(水) 07:45:38
>>118
ついでに言えば、最早コンパイラはオブジェクト間最適化を行なう時代。
inline指定なんぞせんでもコンパイラの方で勝手に(別ファイルの関数さえ)インライン展開してくれるよ。
123デフォルトの名無しさん:2007/06/06(水) 07:46:05
>>119
静的リンケージだから定義がないんじゃないのか?
124デフォルトの名無しさん:2007/06/06(水) 07:47:01
内部、だ。
125デフォルトの名無しさん:2007/06/06(水) 07:51:14
>>119
それはおかしい。extern宣言しても他のファイルで定義してある
inline関数は使えんぞ。
126デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/06(水) 08:05:29
>>126
お前最初にinline関係ないって言ったじゃん。いい加減な事を言うな。
128デフォルトの名無しさん:2007/06/06(水) 08:19:03
ごめんよ。 >119 を書いた時点では分割コンパイルを意識してなかったんだ。
129デフォルトの名無しさん:2007/06/06(水) 08:20:18
( ゚д゚)ポカーン
130デフォルトの名無しさん:2007/06/06(水) 08:21:37
分割コンパイルを使わないとC++の意味が・・・・・
131デフォルトの名無しさん:2007/06/06(水) 19:15:39
getchar(c);

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


c - '0' の意味がわかりません
これは何をやってるんですか?
132デフォルトの名無しさん:2007/06/06(水) 19:18:36
c - '0' は普通数字を 0 〜 9 の数値に変換するときに使うけど
133デフォルトの名無しさん:2007/06/06(水) 19:43:22
ざっと C++ のドラフトを見ても、
仮想関数テーブルに関する記述がないんですが、
仮想関数テーブルは C++ の仕様上には
全く存在しない概念なんでしょうか?
134デフォルトの名無しさん:2007/06/06(水) 19:50:11
ABIとか、Implementation Specificな話は規格には載らないんじゃないの
135デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/06(水) 19:58:24
直接プログラミングではない質問なのですが、
ネットワーク外部にインストールしたRuby等の.exeを、ファイル共有した状態で
例えば
\\マシン名\\Ruby\bin\ruby.exe
にあるruby.exeを実行したくて
Path環境変数に"\\マシン名\\Ruby\bin"を追加したのですが、うまくいきません。

そもそも無理なのか、または指定のやり方が間違っているのでしょうか?
137デフォルトの名無しさん:2007/06/06(水) 20:02:41
歯医者に風邪治してくれと言ってるようなもの
スレ違い
138デフォルトの名無しさん:2007/06/06(水) 20:14:38
下手な例えだな
139デフォルトの名無しさん:2007/06/06(水) 20:43:07
>>134
つまり、仮想関数テーブルは Implementation Specific な話ということなんですね。
了解しました。
1401/2:2007/06/06(水) 20:51:48
#include <stdio.h>
int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}
1412/2:2007/06/06(水) 20:52:58
#include <stdio.h>
int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}
1422/2:2007/06/06(水) 20:53:38
上記のプログラムを作ったのですがコンパイルして実行すると
「演算子を入力してください」
でプログラムが終了してしまいます。
何故でしょうか?
環境はcygwinです。
143デフォルトの名無しさん:2007/06/06(水) 20:58:13
>>142
getchar() で改行文字を読み込んでいるから
144142:2007/06/06(水) 21:09:30
>>143
"改行文字を読み込んでいる"、とはどういうことでしょうか?
145デフォルトの名無しさん: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');

としてみては?
146142:2007/06/06(水) 21:29:59
>>145
無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。
147デフォルトの名無しさん:2007/06/06(水) 23:46:17
Google Booksすげーな。言語の本無料でみれんじゃん
148デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/07(木) 09:12:19
>>149
0 こそが真のヌルポインタだよ。
ただ、これだけだと整数型とか小数型の値としてもとれるから、
NULL ってマクロを使ってそれを回避できるようにもしてるだけ。
153デフォルトの名無しさん:2007/06/07(木) 09:53:37
>>152
そんな隙だらけの説明しかできないんならヌルポインタについて語るのはやめとけ。
↓これでいいだろ。
http://www.kouno.jp/home/c_faq/c5.html
154デフォルトの名無しさん:2007/06/07(木) 09:57:54
自分の読解力の無さを人の文章力のせいにするな
155デフォルトの名無しさん:2007/06/07(木) 10:10:02
確かに隙が多かったな。

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

これは、

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

という風な意味。
156デフォルトの名無しさん:2007/06/07(木) 10:13:43
自分の文章力の無さを人の読解力のせいにするな
157デフォルトの名無しさん:2007/06/07(木) 10:18:00
コピペうざす
158デフォルトの名無しさん:2007/06/07(木) 10:25:38
自分のうざさを人のうざさのせいにするな
159デフォルトの名無しさん:2007/06/07(木) 10:33:51
彼は分裂症で、彼の否定する自分自身とは彼自身では違う人格なのだから良いんだよ。
160デフォルトの名無しさん:2007/06/07(木) 10:54:04
何もかもみんなお前のせいだ
161デフォルトの名無しさん:2007/06/07(木) 14:32:34
for(;;)
{
struct st* a;
get(&a); /* callocで構造体配列作成しaに割り当て */
free(a);
}
これをコンパイルすると、syntax error: missing';' before 'type'
とでます。アドバイスを頂けないでしょうか。お願いします。
162デフォルトの名無しさん:2007/06/07(木) 14:36:43
申し訳ありません。161の件は宣言の前にif-break;を入れていたのが原因
のようです。しかし、freeのときにエラーが出るのがわからなく
その件について助言お願い致します。
163デフォルトの名無しさん:2007/06/07(木) 14:42:07
>>162
その原因の行も書いてよ。

自分がコンパイラになったつもりでたどればわかる
164デフォルトの名無しさん:2007/06/07(木) 14:47:38
aをNULLで初期化したらエラー消えるはず
165デフォルトの名無しさん:2007/06/07(木) 14:49:08
は関係ありませんねすいません
166デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/07(木) 15:27:24
変数の宣言がブロックの先頭じゃなかった、という落ちか・・・
実行時エラーは何か勘違いしてる
168デフォルトの名無しさん:2007/06/07(木) 15:32:37
おそらく、get() の先のcallocで取ったポインタを * つけないで代入してるんだろうな
169デフォルトの名無しさん:2007/06/07(木) 15:32:46
実行時エラーというか実行時警告というか
あれは未初期化ポインタに対するアクセスのエラーだから
リリースビルドにすれば実行時に落ちることは無い
しかしその前にコンパイラの方で未初期化に対するどうたらこうたらっていう
警告が出るはずなんだが…
170デフォルトの名無しさん:2007/06/07(木) 15:34:10
>>169
get で &つけて呼び出してるから、警告は出ないんじゃないかな。
その関数で代入失敗してるっぽい。
171デフォルトの名無しさん:2007/06/07(木) 15:38:09
そうかごめん
試しにそうしたら確かに通っちゃったよ…
172デフォルトの名無しさん:2007/06/07(木) 15:41:04
コンパイルの段階で出てくるのが コンパイルエラー
(リンクの段階で出てくるのが リンクエラー)
出来上がった実行ファイルを実行して出てくるのが 実行時エラー

m(c)alloc で得られたポインタではない非NULL 値を realloc しようとしたんじゃねーかな?
173デフォルトの名無しさん:2007/06/07(木) 15:44:43
って calloc と書いてあったな…
get(struct st**) の実装晒したほうが早いぞ
174デフォルトの名無しさん:2007/06/07(木) 15:52:12
getの実装は既存のライブラリです。でも一応、callocの部分を
確認したところキャストはされていませんでした。
ブロックの先頭・値初期化の不備は、お恥ずかしいミスです。
ところで、C++てエラーメッセージがわかりにくくないですか?
関数や引数のクイックインフォも出なくて、難しすぎて泣けてきます。
175デフォルトの名無しさん:2007/06/07(木) 15:56:37
いや、これそのままなら初期化いらないはずなんだって。
getの仕様によるけどな。
176デフォルトの名無しさん:2007/06/07(木) 15:59:17
あ、>>168はキャストのことじゃなくて、参照を考慮にいれてないって
ことでしょうか?でも多分、get()には問題はないはずです。
たった4行のコードでここまで悩める俺みたいなバカは
プログラマに向いてないんでしょうねorz
177デフォルトの名無しさん:2007/06/07(木) 16:08:38
>>176
だったら get(arg) の仕様は?

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

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

この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)
178デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/07(木) 18:51:14
system関数
180178:2007/06/07(木) 18:51:42
まぁ、要はJAVAのコンパイルが面倒なのでドラッグするだけで出来るソフトをCで作りたいって話なんです。
181178:2007/06/07(木) 18:54:29
>>179
ありがとうございます。
ちょっとやってみます。
182デフォルトの名無しさん:2007/06/07(木) 19:19:13
strcmp(buf, '\0');
でエラーが出るのですが、何か書式を間違ってるでしょうか?
文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。
最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・
183デフォルトの名無しさん:2007/06/07(木) 19:23:49
>>182
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)
184デフォルトの名無しさん:2007/06/07(木) 19:26:23
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん
185デフォルトの名無しさん:2007/06/07(木) 19:37:02
>>183
とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。

>>184
そういう課題なんです・・・
186デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/07(木) 19:46:56
他言語を真似るマクロは愚の骨頂だと俺は思う

なにより読みにくいし、なら java でかけよと言いたい
188デフォルトの名無しさん:2007/06/07(木) 19:52:34
>>186
m9( ´,_‥`)プッ
189デフォルトの名無しさん:2007/06/07(木) 19:56:46
つか
Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ
190デフォルトの名無しさん:2007/06/07(木) 19:57:08
>>186
PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?
191デフォルトの名無しさん:2007/06/07(木) 19:59:41
Bourne shellの作者のSteve BourneがALGOL風のトンチキなマクロを定義して
シェルを書いたのは(勿論悪い意味で)有名
192デフォルトの名無しさん:2007/06/07(木) 20:20:55
>>187
関数一覧をカテゴリ別に並べて書きたくて……

>>188
(´・ω・`)

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

>>190
……ええと、すいません
193デフォルトの名無しさん:2007/06/07(木) 20:23:51
マクロなんだから予約語も糞もないだろ
194デフォルトの名無しさん:2007/06/07(木) 20:26:05
#define for if(0); else for

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

#define public public:

としたとして、

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

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

だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。
196デフォルトの名無しさん:2007/06/07(木) 20:29:41
>>192
あほすぎw
197デフォルトの名無しさん:2007/06/07(木) 20:37:01
>>194
for (int i=0; ...) {
 // スコープ1
}
// スコープ2

でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな
198デフォルトの名無しさん:2007/06/07(木) 20:41:40
ふるっ
199デフォルトの名無しさん:2007/06/07(木) 22:09:01
特殊っていうか、昔はそれで仕様通りだったと思う。
200デフォルトの名無しさん:2007/06/07(木) 23:01:19
そういえばVisual C++で.NETアプリケーションのウィザードを使うと、
public: void Hoge()なんてコードを出していた気がする
201デフォルトの名無しさん:2007/06/07(木) 23:03:36
>>199
それが仕様だったかも知れないが、規格にはなっていない罠。
202デフォルトの名無しさん:2007/06/07(木) 23:06:05
ふるーい規格の話だけど、
それでもなってないの?
203デフォルトの名無しさん:2007/06/07(木) 23:07:51
ARMやドラフトを規格だと言うのなら
規格になっていたと言うがいい
204デフォルトの名無しさん:2007/06/07(木) 23:26:13
なるほど。ドラフト段階でしかこの仕様はなかったわけか。
205178: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でやるときに特別に何かしなければいけない事があるのでしょうか?
206178:2007/06/07(木) 23:49:32
というよりも、system("cd c:\\java");のあとに
system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・
207デフォルトの名無しさん:2007/06/07(木) 23:52:22
system("java c:\\java\\HelloWorld");じゃ駄目なの?
208デフォルトの名無しさん:2007/06/07(木) 23:52:57
それぞれのsystem呼出は、細切れになるから
1度のsystem呼出で済ませるようにしろ
絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか
209178:2007/06/07(木) 23:56:35
一回ごとに細切れなんですか・・・。結構面倒ですねw
とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり
Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld
と出てしまいます。う〜ん・・・
210178:2007/06/08(金) 00:06:01
system("javac c:\\java\\HelloWorld.java");
は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;
211デフォルトの名無しさん:2007/06/08(金) 00:12:18
カレントに存在する必要があるのかな?
それとも区切り文字か。
ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。
212デフォルトの名無しさん:2007/06/08(金) 00:21:01
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?
213デフォルトの名無しさん:2007/06/08(金) 09:35:51
>>212
普通はそれを最初にやるわな
214デフォルトの名無しさん:2007/06/08(金) 10:47:42
C++の参照は、中身はポインタと同じで、参照先のアドレスがメモリに記憶されてるんですか?
(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
215デフォルトの名無しさん:2007/06/08(金) 10:55:06
>(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
質問の意図が読めんが…

関数の引数で
値渡しした場合には 値が持つ大きさ だけスタックに詰まれる
参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる
216デフォルトの名無しさん:2007/06/08(金) 11:34:37
>>214
通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。
217178:2007/06/08(金) 12:13:26
>>212
おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?
218178: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
う〜ん・・・
219178:2007/06/08(金) 12:23:46
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class");
などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;
220デフォルトの名無しさん:2007/06/08(金) 12:32:11
javaの仕様がわかってないな。
まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい
221178:2007/06/08(金) 12:44:54
>>220
ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。
222デフォルトの名無しさん:2007/06/08(金) 12:48:21
まさかとは思うが、Dドライブで作業してたりして。
223デフォルトの名無しさん:2007/06/08(金) 12:49:32
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA");

SetCurrentDirectory(L"c:\\JAVA");
じゃ…
224178:2007/06/08(金) 12:53:25
解決する事が出来ました。
とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。
その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA");
に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。
それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。
原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。
ありがとうございました。
225デフォルトの名無しさん:2007/06/08(金) 13:32:56
SetCurrentDirectory(_T("c:\\JAVA")) なら、unicodeでも設定無しでも動くよ
エラーが出るからってとりあえずキャストすんのはやめとけ
226デフォルトの名無しさん:2007/06/08(金) 13:42:37
あともう一つ。
system("java c:/java/HelloWordl");
これだけど、
system("java -classpath c:/java HelloWordl");

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

>>226
一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが>>211で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。
228デフォルトの名無しさん:2007/06/08(金) 13:56:31
>>227
classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?
229デフォルトの名無しさん:2007/06/08(金) 14:00:32
日本にもう一人いるのか、本人なのか。

http://www.google.co.jp/search?q=hellowordl&lr=lang_ja
230178:2007/06/08(金) 14:04:28
>>228
あ、大丈夫です。ちゃんと半角スペース入れています。

あと、どうやら>>227のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。
231デフォルトの名無しさん:2007/06/08(金) 14:10:49
>>230
ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな

>system("dir");を実行しただけでエラーが・・・。
ふーん
232178:2007/06/08(金) 14:18:29
>>231
ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。
233デフォルトの名無しさん:2007/06/08(金) 14:32:47
わかった。もうキミには言うことは無い
うちでは動いてるけど、君のトコでは動かないんだね
234デフォルトの名無しさん:2007/06/08(金) 14:44:31
>>230
どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)
235178:2007/06/08(金) 15:16:42
>>233
そういう次元でもないような・・・。

>>234
dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw
236デフォルトの名無しさん:2007/06/08(金) 15:18:42
>>233の皮肉に気づけよ
237デフォルトの名無しさん:2007/06/08(金) 15:19:58
なんかさ、やろうとしてることがショートカット作る程度でできそうな事な感じなんだが
複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか?
無理矢理Cで作ろうとするほうが疑問なんだが・・・
238178:2007/06/08(金) 15:30:47
>>236
ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ

>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。
239デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/08(金) 17:59:58
>>243
関数を再帰的に書けば良いじゃん
245デフォルトの名無しさん:2007/06/08(金) 18:05:38
>>244
再帰を使いたくないんです・・・
246デフォルトの名無しさん:2007/06/08(金) 18:07:08
何故?
247デフォルトの名無しさん:2007/06/08(金) 18:09:33
Fdを保存しておけばいい
248デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/08(金) 18:19:05
struct ffblk[MAX_DIR_DEPTH];
251デフォルトの名無しさん:2007/06/08(金) 18:19:21
再帰が不安定とは……
252デフォルトの名無しさん:2007/06/08(金) 18:21:44
普通にスタックに積めばいいじゃん。
253デフォルトの名無しさん:2007/06/08(金) 18:23:20
>>249
再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても>>250みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。
254デフォルトの名無しさん:2007/06/08(金) 18:28:29
何が「再帰は不安定になるんですよ」だよ馬鹿もんが
255249:2007/06/08(金) 18:29:22
速度を上げる為に複数スレッドで読み込みたいんですよ
再帰だと出来ないんです・・・・
256デフォルトの名無しさん:2007/06/08(金) 18:31:38
ここに複数スレッドでうごいているようなソフトがあるんですけど・・・
どうやればいいんですか???


フォルダサイズ調査  『 D-Usage.exe 』
http://hp.vector.co.jp/authors/VA032597/Software/DirMan.html
257デフォルトの名無しさん:2007/06/08(金) 18:32:30
ドライブ資源は1個なのに、複数スレッドでアクセスしたら、
かえって遅くなるような気がしないでもない
258デフォルトの名無しさん:2007/06/08(金) 18:35:07
>>250
進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも
259デフォルトの名無しさん:2007/06/08(金) 18:36:02
(一般的には)無駄なシークが発生して、遅くなります。
260デフォルトの名無しさん:2007/06/08(金) 18:36:15
>>257
実際にデータを読み込む訳ではないんですよ
261デフォルトの名無しさん:2007/06/08(金) 18:37:02
FindFirstFile()が返してきたハンドルをスタックとして
もっとけばいいだけじゃないの?
そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと
続きから返ってこないか?
262257:2007/06/08(金) 18:39:04
>>260
俺は >>259 のことを想定して書いた。 余計なシーク発生するから遅くなるんじゃね? ってこと
263デフォルトの名無しさん:2007/06/08(金) 18:42:22
>>256
そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。
264249:2007/06/08(金) 18:46:10
複数の方が早いですよ

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

単一スレッド
VCDCASE 45s
http://www.hi-ho.ne.jp/hiro30/
265デフォルトの名無しさん:2007/06/08(金) 18:49:33
C言語なんですが
自作関数で実引数で文字列を返す事は可能ですか?
266257:2007/06/08(金) 18:49:52
>>264
どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい
267デフォルトの名無しさん:2007/06/08(金) 18:50:33
>>264
>263
268デフォルトの名無しさん:2007/06/08(金) 18:54:11
スレッド1個でも動くものができないのに
269デフォルトの名無しさん:2007/06/08(金) 19:00:58
しかし、どうでもいいけどD-Usageとかいうソフト、速いのかも知れないけど使い難いなぁ。
作者本人は悦に入っているようだから別にいいけど。

つーか、VCDCASEは目的が違うじゃん。違う目的のソフトを比較して速度云々って>249はどこまで阿呆を晒せば気が済むんだ?
270デフォルトの名無しさん:2007/06/08(金) 19:09:05
>>265
できます
271デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/09(土) 01:56:39
#ifdef _UNICODE
iostream& tcin = cin;
(ry
275デフォルトの名無しさん:2007/06/09(土) 01:57:45
>>272
とりあえず、_MBCS ブロック内のヤツは cin, cerr, clog にしたほうがいいと思うよ。
276デフォルトの名無しさん:2007/06/09(土) 01:57:52
>>272
おそらく、個人・環境等で意見は様々だと思う。
個人的には、4つや5つなら許せるが、こんなことしなくても問題ないようなモノにしたい。

で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。
277デフォルトの名無しさん:2007/06/09(土) 02:01:44
>>274
cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。
278デフォルトの名無しさん:2007/06/09(土) 02:05:01
>>272
実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。
279デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/09(土) 03:17:18
fopen("test.txt", "w");
でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、
C:\C:\Documents and Settings\ユーザ名
のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、
どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、
281デフォルトの名無しさん:2007/06/09(土) 03:24:21
>>280
>普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。
282534: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行程でできちゃいます><
283534: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デフォルトの名無しさん:2007/06/09(土) 04:36:26
>>281
そんなアプリケーション見たことねえw
285534: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デフォルトの名無しさん:2007/06/09(土) 05:58:26
コマンドライン引き数から実行モジュールの場所が得られると思ったら大間違い。
287534:2007/06/09(土) 06:31:11
詳しく^^
288534:2007/06/09(土) 06:49:51
自己解決しました^^
フルパスじゃないと取得できないので
windowsだとGetModuleFileName()を使うのですね^^
この辺は環境依存になるので注意が必要ですね^^
勉強になりました^^^^;;
289デフォルトの名無しさん:2007/06/09(土) 06:51:34
system()関数って凄く謎なのですが・・・。
printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。
これは俺が、system()で使う領域を侵してると考えていいのでしょうか?
290デフォルトの名無しさん:2007/06/09(土) 06:51:36
1.Unix系はarg[0]にパスが入らないんじゃなかったかな。
2.バッファオーバーランしかけたらエラー処理してくれ
3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」
4.const char* argv[]じゃなくてchar const *const argv[]な
291534: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デフォルトの名無しさん:2007/06/09(土) 08:17:05
>>289
その周辺を晒してくれないとなんとも言えないのだが。
293デフォルトの名無しさん:2007/06/09(土) 08:34:05
>>279
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。
294デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/09(土) 09:27:16
>>294
sizeof(fullpath)じゃなんであかんのんですか?
296デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/09(土) 10:05:43
>>296
嘘つくな。氏ね
298デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/09(土) 17:45:36
ヘッダーファイルで
class temp{
public:
int *func();
};
と書いた場合、funcの定義はどう書き始めればいいですか
int temp::*func()
int temp::(*func())
int *temp::func()
300デフォルトの名無しさん:2007/06/09(土) 17:59:13
一番下じゃないとVSのインテリセンスが効かなかったので一番下
301デフォルトの名無しさん:2007/06/09(土) 18:05:51
>>299
コンパイルできるのは一つだけしかないだろ?
302デフォルトの名無しさん:2007/06/09(土) 18:16:44
>>299
int* func();
303デフォルトの名無しさん:2007/06/09(土) 19:58:45
>>279
テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う
304デフォルトの名無しさん:2007/06/10(日) 00:26:59
ちょっと相談。

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

で、その定番仕様に対応したCまたはC++のライブラリがあればお願いします。
305デフォルトの名無しさん:2007/06/10(日) 00:30:56
csvってRFCできてなかったっけ
306304:2007/06/10(日) 00:59:15
RFCあるのか……ありがとう、ちょっと探してみる
307デフォルトの名無しさん:2007/06/10(日) 02:42:21
C++で自分で作ったクラスのVectorを使ってVector aを宣言して
-aを使いたいのですがどのようにすればよいでしょうか
よろしくおねがいします
308デフォルトの名無しさん:2007/06/10(日) 02:44:07
>>307 まず服を脱ぎます。
309デフォルトの名無しさん:2007/06/10(日) 02:46:32
ええとよくわからんけど
-演算子をオーバーロード?
310デフォルトの名無しさん:2007/06/10(日) 02:46:58
単項演算子を使いたいってこと?
2次元ベクトルの例だと、Vectorのメンバに
Vector operator - () const {return Vector(-x, -y);}
みたいな感じか?
311307:2007/06/10(日) 02:54:52
解決しましたありがとうございました
312デフォルトの名無しさん:2007/06/10(日) 04:01:52
linuxで標準ライブラリをインストールしたいのですが
glibc-2.5.0-0exp1
glibc-2.5.0-0exp2
の違いってなんですか?
313デフォルトの名無しさん:2007/06/10(日) 07:16:07
1と2
314デフォルトの名無しさん:2007/06/10(日) 11:47:50
>>312
そのパッケージは Ubuntu にしか無いっぽいな、
俺はFedora使いだからよくわからん

Ubuntu系のスレにでも行ったほうがよさげだ
315デフォルトの名無しさん:2007/06/10(日) 13:20:40
ファイル情報の取得の仕方教えて。
316デフォルトの名無しさん:2007/06/10(日) 13:24:06
stat
317デフォルトの名無しさん:2007/06/10(日) 13:30:01
file
318デフォルトの名無しさん:2007/06/10(日) 14:10:54
Windows環境で,任意のファイルが変更された時に,
変更の種類(作成,更新,削除等)と,変更を与えたプロセスを
出力するプログラムを作成しようと思っています.

変更の検知とその種類に関しては,Win32APIのReadDirectoryChangesWで
取得できるのですが,変更を与えたプロセスの取得方法が
Win32APIや.NETを探しても分かりません.
何か方法があれば教えていただけませんか?
319318:2007/06/10(日) 14:11:45
すみません,
Windows環境 → WindowsXP環境
です
320デフォルトの名無しさん:2007/06/10(日) 14:56:21
VB.NETとC#.NETで、大きく異なる点とは、どういうとこでしょう?
考えたかとか、コーディングの仕方で教えてください。
321デフォルトの名無しさん:2007/06/10(日) 15:09:24
元が VB か C/C++ か、の差
322デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/10(日) 15:19:03
>>322
バグだね。 bcc なんて使わなけりゃいい。
324320:2007/06/10(日) 15:24:40
メモリーの考え方とか、大きく違ったりしませんか?
定数、変数のきり方とか・・・・
インスタンスの方法とか、考え方とか・・・

単に、方言が違うだけ?
325322:2007/06/10(日) 15:38:39
>>323
レスどうもです。
やはりバグですか。
bccはコンパイル速度しか売りがないのかなと感じる今日この頃。
326デフォルトの名無しさん:2007/06/10(日) 15:39:27
>>324
.NETスレは他にあるだろ。なんでここで聞くんだ?

どのくらい違うかの位置関係はこんな感じで、
VB6−−−−−−VB.NET−C#
メモリーの考え方とかインスタンスの考え方はVB6から大きく変更になってる。
327320:2007/06/10(日) 15:55:44
ごめん。
C#スレと勘違いしてた。
328デフォルトの名無しさん:2007/06/10(日) 18:12:08
あれだけ#の種類を変えて頑張っているのにw
329デフォルトの名無しさん:2007/06/10(日) 19:01:15
構造体/クラスを関数に渡すときは、ポインタか参照が使われることが一般的のようですが、
戻り値が構造体/クラスなのは普通ですか?
330デフォルトの名無しさん:2007/06/10(日) 19:08:14
>>329
コピーが重い場合には避けられるけど、単純にポインタや参照にして
置き換えられないこともあるので、引数に比べれば使われる機会は多いでしょう。
331デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/10(日) 19:42:17
>>331
うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ
333デフォルトの名無しさん:2007/06/10(日) 19:48:07
>>329
小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。

演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。
334デフォルトの名無しさん:2007/06/10(日) 20:20:48
>>332
成功しました。ありがとうございます。
335デフォルトの名無しさん:2007/06/10(日) 20:23:04
>>332
暇人乙
336デフォルトの名無しさん:2007/06/10(日) 20:52:44
>>335
暇潰しにもならんかったよ
337デフォルトの名無しさん:2007/06/10(日) 20:54:11
暇過ぎw
338デフォルトの名無しさん:2007/06/10(日) 21:44:29
続けて、質問すみません。
さっきの
ttp://www.cs.bme.hu/~bodon/en/apriori/
のやつなんですが、

http://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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/11(月) 12:26:40
>>340
再現する最小限のソース貼って
342デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/11(月) 12:59:40
エスパー342
348デフォルトの名無しさん:2007/06/11(月) 13:16:15
>>342
>>347
なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。
349デフォルトの名無しさん:2007/06/11(月) 13:19:25
>>348
コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。
350デフォルトの名無しさん:2007/06/11(月) 13:25:20
>>349
でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)
351342:2007/06/11(月) 13:48:27
コンストラクタの呼び出し方は独学でやってると大抵詰まる。
>>342にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。
352デフォルトの名無しさん:2007/06/11(月) 21:21:19
string::find と string::find_first_of 、
string::rfind と string::find_last_of って、
どう違うの? 同じ?
353デフォルトの名無しさん:2007/06/11(月) 21:23:36
rの有無、firstかlastかの違い
begin側から探し始めるかeng側から探し始めるかの違い
354デフォルトの名無しさん:2007/06/11(月) 21:52:19
ごめん。左右の比較の話。

解説を穴が空くほど読んだら
全然違う関数と分かった。
355デフォルトの名無しさん:2007/06/12(火) 14:27:03
ostringstream って、flush も endl もしないで str 呼んだら
不完全なまま出力されることってあるの?

大丈夫だって保証があればいいんだけど。
356デフォルトの名無しさん:2007/06/12(火) 18:12:14
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに
何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?
357デフォルトの名無しさん: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;
361360: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++;
}
}
362360: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デフォルトの名無しさん:2007/06/12(火) 20:25:30
>>360
+=0て
364デフォルトの名無しさん:2007/06/12(火) 20:26:45
caseの後にbreakするんだ
365デフォルトの名無しさん:2007/06/12(火) 20:29:49
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は >>364 の指摘してるとおりだと思うが
366デフォルトの名無しさん:2007/06/12(火) 20:37:55
>>359
実行時に自分で変換すれば。
367MSX++: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/12(火) 20:47:31
よく意味がわからんけど
コマンドプロンプトにD&Dしてんの?

どういうオブジェクトをD&Dしてて、
どううまく動作しないのさ
370デフォルトの名無しさん:2007/06/12(火) 20:49:25
とりあえず引数を表示してみるとか
371デフォルトの名無しさん:2007/06/12(火) 20:53:09
o.txtをフルパスで書いたら?
なんか変なトコに出力してるだけだろ。
372360:2007/06/12(火) 20:54:29
>>364-365 など各位

皆様ありがとうございます。早速配列化と、breakを試してみます
373368: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両者とも同じ引数を受け取っているように見えます。
374368:2007/06/12(火) 21:08:30
>>371
なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。

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

ありがとうございます。
375デフォルトの名無しさん:2007/06/12(火) 21:13:46
バッチファイルをダブルクリックした場合と、D&Dした場合じゃあ
カレントディレクトリの位置が違うんだよね。
よく分からん仕様ではあるよな
376デフォルトの名無しさん:2007/06/12(火) 23:11:47
a != '.'
これの右側(コンマ)の意味がわかりません。
377デフォルトの名無しさん:2007/06/12(火) 23:14:35
>>376
コンマなんてどこにあるんだ?
378デフォルトの名無しさん:2007/06/12(火) 23:15:35
>>376
右側にあるのはシングルクォーテーション「'」とピリオド「.」
379デフォルトの名無しさん:2007/06/12(火) 23:17:00
間違いました。ピリオドです。
380デフォルトの名無しさん:2007/06/12(火) 23:18:29
>>376
じゃあ、' の意味は分かるのか?
381デフォルトの名無しさん:2007/06/12(火) 23:20:53
>>376
aとか!=の意味は?
382デフォルトの名無しさん:2007/06/12(火) 23:25:13
''はAとかの文字リテラルを表示するときに使う物だと思います。
383デフォルトの名無しさん:2007/06/12(火) 23:26:08
>>381
分かります。
384デフォルトの名無しさん:2007/06/12(火) 23:27:31
>>383
本当にわかるのか?!=の意味言ってみ
385デフォルトの名無しさん:2007/06/12(火) 23:29:51
変数aが右オペランドと等しくないということです。
386デフォルトの名無しさん:2007/06/12(火) 23:30:19
そんなに虐めちゃるなよwって思ったけど確かに
>>376 の質問にちゃんと応えようとしたらこうなるのは致し方ないかw
387デフォルトの名無しさん:2007/06/12(火) 23:33:21
>>385
変数aがピリオドと等しくない
388デフォルトの名無しさん:2007/06/12(火) 23:42:32
>>387
これはひどい
389デフォルトの名無しさん:2007/06/12(火) 23:43:55
.は文字リテラルということですね。分かりました。
390デフォルトの名無しさん:2007/06/12(火) 23:47:43
'.' が文字リテラルであって
. が文字リテラルなわけではない。
391デフォルトの名無しさん:2007/06/13(水) 00:15:42
すいません、質問お願いします。
本日 -> という記号が出てきたんですが、どういった意味なんでしょう

よろしくお願いします。
392デフォルトの名無しさん:2007/06/13(水) 00:20:34
アロー演算子といいます

よろぴくね
393デフォルトの名無しさん:2007/06/13(水) 00:23:44
>>391
http://wisdom.sakura.ne.jp/programming/c/c36.html
ここ見ると幸せな予感。
394デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 00:40:02
ファイルの拡張子、.cとかになってねぇか?
Borland詳しく知らないが、C言語でclass使えないぞ。
397デフォルトの名無しさん:2007/06/13(水) 00:44:14
予約識別子死ね。
398デフォルトの名無しさん:2007/06/13(水) 01:16:30
stdにsort()とstable_sort()があるけど
stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない
ってどういうときに重要になるの?
別関数を用意してまで保障する必要性がわからない。
399デフォルトの名無しさん:2007/06/13(水) 01:20:20
ヒント:ソートに使った以外のデータメンバ
400デフォルトの名無しさん:2007/06/13(水) 01:27:34
>>398
すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。
401デフォルトの名無しさん:2007/06/13(水) 01:35:50
あとstable_sortは最悪条件の時の効率がsortより良い。
402デフォルトの名無しさん:2007/06/13(水) 01:37:10
それを気にするなら、
ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。
403デフォルトの名無しさん:2007/06/13(水) 01:48:03
std::sort_heap()
404デフォルトの名無しさん:2007/06/13(水) 03:14:47
インデックスとアドレスを保持した構造体を使ってソートして、
それから位置を変更していけば、
安定かつ高速なソートができると思う。
作業領域が必要にはなるけどね。
405デフォルトの名無しさん:2007/06/13(水) 03:22:42
それでも最適化なら・・・最適化ならきっと何とかしてくれる・・・!!
406デフォルトの名無しさん:2007/06/13(水) 09:22:35
C++のthrow/catch

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

これの存在を知らない組み込みな人たちに伝えるので、
センセーショナルでクールな呼び名を教えて欲しいでつ。
409デフォルトの名無しさん:2007/06/13(水) 09:34:50
C++言語的割り込み処理
410デフォルトの名無しさん:2007/06/13(水) 09:36:43
それだ!

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











でも、自分から見れば八百長っぽくてダサダサ。
411デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 09:41:27
>>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする
413デフォルトの名無しさん:2007/06/13(水) 09:42:02
>>411
そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。
414デフォルトの名無しさん:2007/06/13(水) 09:45:13
>>411
↓こっちのが楽だと思わんか?

std::string str(256);
...
if (...) return;
...
415デフォルトの名無しさん:2007/06/13(水) 09:53:43
そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。
416デフォルトの名無しさん:2007/06/13(水) 09:54:43
>C++言語的割り込み処理

割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ?
なら意味違うかも。。。
417デフォルトの名無しさん:2007/06/13(水) 10:48:04
割り込みはダメだろう・・・常識的に考えて。

例外処理は例外処理。
例外的な動作が起こった場合に行う処理。
418デフォルトの名無しさん:2007/06/13(水) 10:52:15
食い込みはおk?
419デフォルトの名無しさん:2007/06/13(水) 10:56:58
>例外的な動作が起こった場合に行う処理。

C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、
これじゃ、区別付かないじゃん。
420デフォルトの名無しさん:2007/06/13(水) 11:02:07
でも「C++例外処理」じゃ不満なんだろ。
センセーショナルでクールな・・・

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

「禿式例外処理」なんてどうだ?
組み込みのおっさん相手にはかなりセンセーショナルだろ。
421デフォルトの名無しさん:2007/06/13(水) 11:03:25
>でも「C++例外処理」じゃ不満なんだろ。

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

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

オヤジギャグ?
422デフォルトの名無しさん:2007/06/13(水) 11:06:32
別に俺用語を生み出すのは構わないけど
他人とコミュニケーションを取るときには使わないでね
423デフォルトの名無しさん:2007/06/13(水) 11:08:45
洋本でも普通にC++EHだしな
424デフォルトの名無しさん:2007/06/13(水) 11:09:05
禿が作ったんだから禿式ってことね。
http://www.research.att.com/~bs/

エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。
425デフォルトの名無しさん:2007/06/13(水) 11:15:26
儂の例外処理は108式まで……
426デフォルトの名無しさん:2007/06/13(水) 11:27:04
構造化例外ってのは別物だっけ課?
427デフォルトの名無しさん:2007/06/13(水) 11:38:04
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう
428デフォルトの名無しさん:2007/06/13(水) 12:42:32
>>419
それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。
429デフォルトの名無しさん:2007/06/13(水) 13:04:41
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age
430デフォルトの名無しさん:2007/06/13(水) 13:14:35
memsetのこと?
431デフォルトの名無しさん:2007/06/13(水) 14:27:31
fill() だろ。
432デフォルトの名無しさん:2007/06/13(水) 15:00:43
ostream::write って引数 const char* だけど、
何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?
433デフォルトの名無しさん:2007/06/13(水) 15:05:48
>>432
writeは何をする関数かな?
434デフォルトの名無しさん:2007/06/13(水) 15:12:29
あなたに愛を届ける関数です。
435デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 16:26:24
>>435
それで大丈夫なように見えるけど、どうダメだったの?
437デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 16:34:43
cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる
439デフォルトの名無しさん:2007/06/13(水) 16:36:49
文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様
440デフォルトの名無しさん:2007/06/13(水) 16:48:56
>>439
ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。
441デフォルトの名無しさん:2007/06/13(水) 17:32:27
>>406-
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない
442デフォルトの名無しさん:2007/06/13(水) 17:58:33
>Windowsの例外処理

これってなんだけ?
443デフォルトの名無しさん:2007/06/13(水) 18:16:48
>>433
そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。
444デフォルトの名無しさん:2007/06/13(水) 18:19:30
関係ある。ちゃんと読め。
fwrite は、サイズと数を指定するだろ。
ストリームはストリームを指定するんだ
445デフォルトの名無しさん:2007/06/13(水) 18:21:58
>>442
「構造化例外」つってんのにググりもしないとは。

>>443
それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?
446デフォルトの名無しさん:2007/06/13(水) 18:22:12
>>442
__try
__except
__finally
447デフォルトの名無しさん:2007/06/13(水) 18:23:58
>>445
ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。
448デフォルトの名無しさん:2007/06/13(水) 18:24:54
>>444
要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?
449デフォルトの名無しさん:2007/06/13(水) 18:26:38
文字列をbyte列と言い換えればいいのでは、streamは
450デフォルトの名無しさん:2007/06/13(水) 18:34:58
クラステンプレートbasic_ostreamのこともたまには思い出してあげてください
writeの引数はただのcharではなくテンプレート引数よ
451デフォルトの名無しさん:2007/06/13(水) 18:36:15
ああ、そうか。
そういうことか・・・。
了解。分かった。
452デフォルトの名無しさん:2007/06/13(水) 18:42:34
俺が思うに、basic_ostream::writeに対応するCの関数は、
fwriteではなくfputs/fputwsなのだろう

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

用途的には fwrite と ostream::write が対応するんだろうけど。
454デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 19:29:12
new されたサイズをプログラマが知る方法はないですか?
456デフォルトの名無しさん:2007/06/13(水) 19:37:32
>>455
標準にはない
457デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 20:05:26
"wchat_t"?
459デフォルトの名無しさん:2007/06/13(水) 20:11:26
>>457
それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる

write()で書いたものが変換をバイパスできるわけではないし
460デフォルトの名無しさん:2007/06/13(水) 20:34:48
>>457
それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。

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

バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。
461デフォルトの名無しさん:2007/06/13(水) 21:14:07
>>455 >>456
replacement newを書くというのはだめなのかな。
462デフォルトの名無しさん:2007/06/13(水) 21:16:49
>>459
エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?

>>459
うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。
463デフォルトの名無しさん:2007/06/13(水) 21:21:27
>>462
まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。
464デフォルトの名無しさん:2007/06/13(水) 21:38:59
C言語でプログラムを作ってコンパイルまでできているのに
いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、
数回入力するとエラーがでるんだけどなんでなんだい?
465デフォルトの名無しさん:2007/06/13(水) 21:40:41
コンパイルが通るからってバグが無いわけじゃないだろ

その情報だけじゃ何が原因かはわからんけど
466デフォルトの名無しさん:2007/06/13(水) 21:42:18
文てきには間違ってないんだけど、
長い文を書いて作ると絶対なるんだよね。
行数の限界とかってないよね?
467デフォルトの名無しさん:2007/06/13(水) 21:47:43
>>457
char 以外のストリームでバイナリ出入力っていうのがそもそも無理。
468デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/13(水) 22:14:47
>>468
足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。
471デフォルトの名無しさん:2007/06/13(水) 22:18:50
>>469
どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ
472デフォルトの名無しさん:2007/06/13(水) 22:19:40
>>469
}が全角だとか言う落ちはないよな?
473デフォルトの名無しさん:2007/06/13(水) 22:24:58
キタ━━━━(゚∀゚)━━━━!!!!
474デフォルトの名無しさん:2007/06/13(水) 22:35:19
>>471 >>472
半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz
475デフォルトの名無しさん:2007/06/13(水) 22:50:00
問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。

コマンドプロンプトで実行したら絶対途中でエラーがでる。
なぜだよおい。
476デフォルトの名無しさん:2007/06/13(水) 22:51:56
環境もコードも示さずにその質問に答えられるのはエスパーだけだな
まぁexeとかコマンドプロンプトとか言ってるし
Windowsなんだろうなってことぐらいはわかるが
477デフォルトの名無しさん:2007/06/13(水) 22:53:56
まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード
で、VS2003のIDEのデフォルト設定がMBCSで、
VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、
こけてるんじゃないか。
478デフォルトの名無しさん:2007/06/13(水) 22:54:51
素人なもんですみません。windowsです。
でなにを示せばいいんだい。
ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。
479デフォルトの名無しさん:2007/06/13(水) 23:00:51
>>459
Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど

>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う
480デフォルトの名無しさん:2007/06/13(水) 23:02:34
>>478
素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。
481デフォルトの名無しさん:2007/06/13(水) 23:04:08
>>480
おそらくコマンドプロンプトがバグってると思われるんだけどな
482デフォルトの名無しさん:2007/06/13(水) 23:10:04
ソース出せばいいと思うよ
483デフォルトの名無しさん:2007/06/13(水) 23:11:04
>>481
わらた、おもしろすぎ。
484デフォルトの名無しさん:2007/06/13(水) 23:13:38
>>481
windows入れなおせばいいと思うよ
485デフォルトの名無しさん:2007/06/13(水) 23:26:52
>>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。
486デフォルトの名無しさん:2007/06/13(水) 23:39:48
>>474
/* */ 型のコメントなら大丈夫だよ
487デフォルトの名無しさん:2007/06/13(水) 23:46:04
>>857
へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?
488デフォルトの名無しさん:2007/06/13(水) 23:47:30
何誤爆しとんねんw
489487:2007/06/13(水) 23:51:37
誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><
490デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/14(木) 00:54:41
>>355
それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。
492デフォルトの名無しさん:2007/06/14(木) 00:56:23
493デフォルトの名無しさん:2007/06/14(木) 01:24:47
>>491
d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。

まあ、flush しといた方が無難そうだな。
494デフォルトの名無しさん:2007/06/14(木) 19:27:21
http://pc11.2ch.net/test/read.cgi/tech/1181087371/l2
↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?
495デフォルトの名無しさん:2007/06/14(木) 19:35:50
scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す
496デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/14(木) 20:35:41
int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) {
 scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }
498デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/14(木) 20:53:50
つか、getchar でいいような
500デフォルトの名無しさん:2007/06/14(木) 21:12:28
>>499
getcharって文字入力用じゃないですか?
これで使う方法ってあります?
501デフォルトの名無しさん:2007/06/14(木) 21:26:25
scanf("%*c"); の代わりに使ってみればいいじゃないの。
502デフォルトの名無しさん:2007/06/14(木) 21:34:57
>>501
あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><
503デフォルトの名無しさん:2007/06/14(木) 22:46:34
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。
504デフォルトの名無しさん:2007/06/14(木) 22:48:53
余計複雑になるだけだと思うが。
505デフォルトの名無しさん:2007/06/15(金) 03:24:22
fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし
506デフォルトの名無しさん:2007/06/15(金) 04:02:27
1行につき数値1つ?
507デフォルトの名無しさん:2007/06/15(金) 13:00:46
>>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ
508デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/15(金) 16:36:00
ミスターoperatorでも目指してんのか
519デフォルトの名無しさん:2007/06/15(金) 16:38:22
今見ている本が演算子のオーバーロードの章(6章)なので、
つい上記のような質問ばかりになってしまいました。
520デフォルトの名無しさん:2007/06/15(金) 16:39:39
よっ、ミスターoperator!
521257: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デフォルトの名無しさん:2007/06/15(金) 17:18:12
質問なんですが、C/C++の開発環境でお勧めのものってありますか。
JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね?
ソースコードを書くのが楽したいというのが要望です。

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


環境、WinXP 普通の32ビット
(MacやLinuxでもおk)
当方のスペック 大学3年 Javaは普通に使いこなせるという程度
525デフォルトの名無しさん:2007/06/15(金) 17:19:06
よろしくお願いします。
526デフォルトの名無しさん:2007/06/15(金) 17:54:37
Eclipseが使えるんなら、そいつにCDTを入れてみたら?
527デフォルトの名無しさん:2007/06/15(金) 18:22:25
operator&&、operator||、operator, をオーバーロードすると短絡評価でなくなってしまう
見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない
528デフォルトの名無しさん:2007/06/15(金) 19:50:20
>>505
sscan系でも%iというものがあってな

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

>>513
> operator||()が定義できてよかった、という状況って
Boost.Lambda
529デフォルトの名無しさん:2007/06/15(金) 19:57:07
samp じゃなくて smap に見えた
530デフォルトの名無しさん:2007/06/15(金) 19:57:36
>>524
VC++のアカデミックは?
アカデミックは超安かった希ガス

ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。
531デフォルトの名無しさん:2007/06/15(金) 20:10:29
VC++2005expressは無料だよ
532デフォルトの名無しさん:2007/06/15(金) 20:40:21
express だな。
商用には使えないが、それはアカデミックも同じだな。
533デフォルトの名無しさん:2007/06/15(金) 21:12:36
嘘言ってはいけません。
Expressも他のEditionと同じように、
商用利用を禁止する条項はない
534デフォルトの名無しさん:2007/06/15(金) 21:27:41
VC++EEはリソースの扱いが難点だけど
それ以外は十分だな
535デフォルトの名無しさん:2007/06/15(金) 21:30:29
>>533
前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。
536デフォルトの名無しさん:2007/06/15(金) 23:32:57
アカデミックも商用可能だな。
537デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/16(土) 01:26:58
よく判らんけど、バッファリングされているからじゃないの?
フラッシュしたら?
539デフォルトの名無しさん:2007/06/16(土) 01:27:16
ロケールの設定
540デフォルトの名無しさん:2007/06/16(土) 01:34:54
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです

>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・
541デフォルトの名無しさん:2007/06/16(土) 01:40:59
542デフォルトの名無しさん:2007/06/16(土) 01:47:35
>>541
おお!解決しました!
ありがとうございます!
543デフォルトの名無しさん:2007/06/16(土) 02:41:07
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?
544デフォルトの名無しさん:2007/06/16(土) 05:12:13
>>543
gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。
545デフォルトの名無しさん:2007/06/16(土) 05:36:40
wchar_t wfunc[sizeof __FUNCTION__];
swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);

とか自分で変換するしかないのかな。
バッファが必要だから、マクロ化するのも難しいな。
グローバル変数を使うのもアレだし・・・。
546デフォルトの名無しさん:2007/06/16(土) 09:33:44
>>540
"japanese"より""を勧める
547デフォルトの名無しさん:2007/06/16(土) 11:10:16
>>528
scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし
548デフォルトの名無しさん:2007/06/16(土) 11:16:07
>>530
普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる

今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする
549デフォルトの名無しさん:2007/06/16(土) 11:21:21
>>547
それはわかる
1行目の10進以外もに反応しただけ
550デフォルトの名無しさん:2007/06/16(土) 11:21:59
>>547
つ[%i]

って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。
551デフォルトの名無しさん:2007/06/16(土) 11:23:48
ツーか、むしろ突っ込むならここだな。
>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
552デフォルトの名無しさん:2007/06/16(土) 11:30:18
通りすがりのものだけど、>>550-551 のほうが変なこと言ってる
553デフォルトの名無しさん:2007/06/16(土) 11:38:37
知らないくせに偉そうな事を言うってのが
とてもみっともないんだよね
554デフォルトの名無しさん:2007/06/16(土) 11:41:57
あ、ちょっと違うか。
>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。
555デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/16(土) 12:08:01
MFCをやる利点てあるかな?
全部C#でことたりね?
558デフォルトの名無しさん:2007/06/16(土) 12:10:30
>>544 >>545
ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。
559デフォルトの名無しさん:2007/06/16(土) 13:44:46
>>557
.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。

個人的には今からMFCやる意味はあんまり無いと思うけど。
560デフォルトの名無しさん:2007/06/16(土) 14:02:04
ファイルに関するたくさんの情報を保持するクラスを作りたいんですが、
こういう時のメンバ変数はprivateにするのが基本なんですよね?
Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?
561デフォルトの名無しさん:2007/06/16(土) 14:16:15
>>560
必要に応じて。
562デフォルトの名無しさん:2007/06/16(土) 14:30:56
>>561
ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。
563デフォルトの名無しさん:2007/06/16(土) 14:41:34
どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら
クラスじゃなくて構造体を使うとかしたら?
564デフォルトの名無しさん:2007/06/16(土) 15:00:11
>>562
駄目な理由を考えてみる
565デフォルトの名無しさん:2007/06/16(土) 15:17:27
クラスにしたのはコンストラクタとデストラクタが使いたかったからです。
このクラスの変数には別のクラスから頻繁にアクセスする必要があって、
こういう場合隠蔽する意味あるのかな〜?と。
かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・
とか思ってなかなか決められないんです。
566デフォルトの名無しさん:2007/06/16(土) 15:20:29
あ、構造体でもコンストラクタとデストラクタは使えますね。
結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。
567デフォルトの名無しさん:2007/06/16(土) 15:22:57
好きにしろ
568デフォルトの名無しさん:2007/06/16(土) 15:28:29
>このクラスの変数には別のクラスから頻繁にアクセスする必要があって
まずこの設計が間違ってないかどうかを考えるべきだと思う
569デフォルトの名無しさん:2007/06/16(土) 15:35:22
ですよね。
ちょっと検討しなおします。
ありがとうございました。
570デフォルトの名無しさん:2007/06/16(土) 16:54:32
横からなんですけど>>556さんの質問に関連して、
現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?


571デフォルトの名無しさん:2007/06/16(土) 17:00:38
>>570
とりあえず.NETかそうでないほうをやるかで決めては
572そう思えるかどうかが分岐点:2007/06/16(土) 17:06:41
MFCやればいいじゃん。趣味なら何の問題もないよ。
もう後がないとか、2005EEでできないとか、どうでもいいじゃん。
573デフォルトの名無しさん:2007/06/16(土) 17:11:21
さすがにMFCはもうやめといたほうがいいだろ。
どうせまだ入り口程度しかやってないんだろ。
だったら早いうちに.Netへ移行しておけ。
574デフォルトの名無しさん:2007/06/16(土) 17:15:07
>>571
今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz

>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。
575デフォルトの名無しさん:2007/06/16(土) 17:17:10
>>573
やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?
576デフォルトの名無しさん:2007/06/16(土) 17:21:08
>>575
プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。
577デフォルトの名無しさん:2007/06/16(土) 17:21:19
プログラマになるなら最低7つは言語を習得しないとダメです。
578デフォルトの名無しさん:2007/06/16(土) 17:34:41
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について
579デフォルトの名無しさん:2007/06/16(土) 17:36:31
そもそも何を持ってマスターと言うのか?
C++0xとかまだ定まっていないというのに
580デフォルトの名無しさん:2007/06/16(土) 17:36:53
難易度高くても、C++しかできないとな。
つぶしが利かない。
581デフォルトの名無しさん:2007/06/16(土) 17:39:32
>>580
C++できたら他の言語なんて楽勝だろ。
582デフォルトの名無しさん:2007/06/16(土) 17:41:42
楽勝だったら、7つ覚えておけよw
583デフォルトの名無しさん:2007/06/16(土) 17:45:08
仕事で必要になるたびに覚えていけばいい
584デフォルトの名無しさん:2007/06/16(土) 17:46:28
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。
585デフォルトの名無しさん:2007/06/16(土) 17:47:52
いやぁ、C++からJavaはちょっと壁があるぞ。
C++言語を覚えただけじゃ、GUIもスレッドもないしな。
586デフォルトの名無しさん:2007/06/16(土) 17:49:11
さらに言うと、現状javaの案件といえば、サーバーサイドだな。
587デフォルトの名無しさん:2007/06/16(土) 17:50:03
>>585
でも逆の Java → C++ と違って挫折することはまずないだろ。
588デフォルトの名無しさん:2007/06/16(土) 17:51:10
それで挫折する人間なら、C++覚える時点で挫折するよ。
589デフォルトの名無しさん:2007/06/16(土) 17:59:05
GUI は言語の問題じゃなくてライブラリの問題だと思うが。
590デフォルトの名無しさん:2007/06/16(土) 18:00:40
言語だけのC言語ベースでイインジャネ?
設計まで絡んだら知らん。
591デフォルトの名無しさん:2007/06/16(土) 18:01:50
reinterpretって何て読むの?
ネット辞典で調べてもでてこん。
592デフォルトの名無しさん:2007/06/16(土) 18:03:55
リインタープリット
593デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/16(土) 19:20:14
>>594
慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。
596デフォルトの名無しさん:2007/06/16(土) 20:22:02
俺はC++からJavaScript+HTMLをやったんだが。
C#には簡単に移行出来たな。
597W:2007/06/16(土) 20:25:34
JavaScript+HTML
598デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/16(土) 20:34:46
a = (b = (c = d))
c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
600デフォルトの名無しさん:2007/06/16(土) 20:40:25
なるほど!
わかりやすい説明をありがとうございます!!
601デフォルトの名無しさん:2007/06/16(土) 20:43:43
HTMLってプログラミング言語?
602デフォルトの名無しさん:2007/06/16(土) 20:46:19
・変数がない
・ループ、条件分岐が書けない
・関数も書けない

修飾言語ではあるが、プログラム言語ではないかな
603デフォルトの名無しさん:2007/06/16(土) 20:53:07
HTMLはマークアップ言語です。
604デフォルトの名無しさん:2007/06/16(土) 21:01:38
>>602-603
トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。
605デフォルトの名無しさん:2007/06/16(土) 21:03:45
プリコンパイル済みヘッダーを作ったですが
デバッグモードではビルドできるのに、リリースにすると

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

というエラーが全部のファイルで発生してしまいます。
これは何故なんでしょうか?
環境はVS2005です
606デフォルトの名無しさん:2007/06/16(土) 21:28:39
>>605 エラーです
607デフォルトの名無しさん:2007/06/16(土) 21:32:24
特異な言語といえばSQLもそうだな。
一応Languageと名前についてるけど、
これをプログラミング言語と呼ぶのは
ちょっと抵抗ある。
608デフォルトの名無しさん:2007/06/16(土) 21:49:46
ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が
609デフォルトの名無しさん:2007/06/16(土) 21:51:48
SQLに制御構造をつけたのがストアドじゃないかね
610デフォルトの名無しさん:2007/06/16(土) 21:58:45
HTMLだってLanguageと名前についてるだろ
SQLはプログラミング言語じゃなくて、データベース言語だろ
611デフォルトの名無しさん:2007/06/16(土) 21:59:39
Languageは「言語」であって「プログラミング言語」ではないからな。
612デフォルトの名無しさん:2007/06/16(土) 23:07:19
>>594
for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。

グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。
613デフォルトの名無しさん:2007/06/16(土) 23:08:18
HTML はプログラミング言語じゃなくてマークアップ言語。

TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
614デフォルトの名無しさん:2007/06/16(土) 23:56:37
SQLがチューリング完全でないことは明白。
615デフォルトの名無しさん:2007/06/17(日) 00:22:00
何言ってるの?
616デフォルトの名無しさん:2007/06/17(日) 08:02:03
わからないなら調べてから聞けよ
617デフォルトの名無しさん:2007/06/17(日) 08:07:53
あ〜い、とぅいまてぇ〜ん♪
618デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/17(日) 12:46:05
そう理解しておけばおk
そしてプライベートが最強と
621デフォルトの名無しさん:2007/06/17(日) 12:55:24
>>620
ありがとうございました。
そう理解しときます。
622デフォルトの名無しさん:2007/06/17(日) 14:57:34
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、
thisポインタを戻り値にしない書き方ってありますか?
623デフォルトの名無しさん:2007/06/17(日) 14:58:53
ありますよ
624デフォルトの名無しさん:2007/06/17(日) 15:01:58
それは例えばどういった書き方でしょうか?
625デフォルトの名無しさん:2007/06/17(日) 15:03:17
>>624 void operator = (...
626デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/17(日) 15:06:25
デバッグ
628デフォルトの名無しさん:2007/06/17(日) 15:06:57
デバッグする環境がありません・・・すいません。
629デフォルトの名無しさん:2007/06/17(日) 15:09:12
>>625
マジサンキュー
課題が終わった
630デフォルトの名無しさん:2007/06/17(日) 15:10:36
>>626
その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。
631デフォルトの名無しさん:2007/06/17(日) 15:13:46
いや待て、a = b + (c + d)という解釈をしているかも知らん。
632デフォルトの名無しさん:2007/06/17(日) 15:28:39
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから
b+cが先だろ
633デフォルトの名無しさん:2007/06/17(日) 16:40:39
>>630
しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。
634デフォルトの名無しさん:2007/06/17(日) 16:56:56
>>633
コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
635デフォルトの名無しさん:2007/06/17(日) 17:08:24
???
誰もそんな事言ってないぞ?
636デフォルトの名無しさん:2007/06/17(日) 17:14:59
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。
637デフォルトの名無しさん:2007/06/17(日) 18:18:51
a = b() + c() + d();

で、b, c, d の呼び出される順番は未定義だっけ?
結合順と、各項の評価順はまた別の話だよな。
638デフォルトの名無しさん:2007/06/17(日) 18:37:07
fgetsの使い方で

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

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

こういった書き方は問題ないのでしょうか。
639デフォルトの名無しさん:2007/06/17(日) 18:40:16
>>638
sizeof(char)は常に1
640デフォルトの名無しさん:2007/06/17(日) 18:41:57
>>638
sizeof(char)は絶対に1だから安心しる。

ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。
641デフォルトの名無しさん:2007/06/17(日) 18:43:56
charが1バイトじゃなくて1バイトの定義がchar?
642デフォルトの名無しさん:2007/06/17(日) 18:44:21
charは常に1バイト
643638:2007/06/17(日) 18:47:09
レスありがとうございます。
charが常に1バイトというのは、規格で決まっているのですか?
644デフォルトの名無しさん:2007/06/17(日) 18:48:49
>>643
決まってる。

ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。
645デフォルトの名無しさん:2007/06/17(日) 18:50:14
誤解があるといけないから念のために言うけど、
char が 1 バイトというのは決まってるが、
1 バイトが 8 ビットである保証はない。
1 バイトが 9 ビットの環境もある。
646デフォルトの名無しさん:2007/06/17(日) 18:51:29
1バイトのビット数を取得するマクロってありますか?
647638:2007/06/17(日) 18:51:48
皆さんありがとうございました。勉強になりました。
648デフォルトの名無しさん:2007/06/17(日) 18:57:42
アルバイトのヒト数を取得するユニクロってありますか?
649デフォルトの名無しさん:2007/06/17(日) 19:19:40
>>646
CHAR_BIT
650デフォルトの名無しさん:2007/06/17(日) 20:31:59
>>637
未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。
651デフォルトの名無しさん:2007/06/17(日) 21:06:51
たまにはlimits.hも眺めよう
652デフォルトの名無しさん:2007/06/17(日) 21:08:10
float.h も眺めようぜ
653デフォルトの名無しさん:2007/06/17(日) 21:10:15
眺めすぎて惚れるなよ
654デフォルトの名無しさん:2007/06/17(日) 21:21:25
やだ・・///
655デフォルトの名無しさん:2007/06/17(日) 21:22:24
構造体やクラスを関数内で定義すること、
つまり、以下のようなことがしたいのですが
これは規格でできることが保証されていますか?

void hoge() {
 struct hage {
  ...
 };
 ...
}
656デフォルトの名無しさん:2007/06/17(日) 21:23:44
>>655 C89 の頃から余裕で使える。
657デフォルトの名無しさん:2007/06/17(日) 21:26:15
ちなみに関数内で関数は定義できません
658デフォルトの名無しさん:2007/06/17(日) 21:33:03
>>656
ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。

>>657
構造体やクラスの静的関数で代用するのが常套句になってますね。
659デフォルトの名無しさん:2007/06/17(日) 21:44:49
GCC の拡張でよければ関数内関数は使えるんだけどな。確か。
660デフォルトの名無しさん:2007/06/17(日) 22:29:53
関数内クラスをテンプレート引数に出来たらなぁ
と思うことがある
661デフォルトの名無しさん:2007/06/17(日) 23:05:55
charのバイト数の件で便乗質問。
shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか?
決まってないのなら確実に2byteの型は有りますか?
また確実に4byteの型はありますか?
662デフォルトの名無しさん:2007/06/17(日) 23:07:51
longは32bit以上というのはK&Rに書かれていた気がする。
というか規格原理主義者によると、1バイトが何ビットかも決められていないとか
663デフォルトの名無しさん:2007/06/17(日) 23:17:52
>>661
#include <stdint.h> で int16_t と int32_t でおk。
664デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/17(日) 23:32:47
C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?
666デフォルトの名無しさん:2007/06/17(日) 23:48:09
必要以上に移植性を求めるのは不毛。
必要以上に移植性を失うのも愚かしいこと。
667デフォルトの名無しさん:2007/06/17(日) 23:53:10
俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^
668デフォルトの名無しさん:2007/06/17(日) 23:56:15
どうせ他の部分も環境依存しまくりなんだろ?
どんどん使っちゃえYO!
669デフォルトの名無しさん:2007/06/18(月) 00:04:53
>>667
__closureも活用してもっと便利に!
670デフォルトの名無しさん:2007/06/18(月) 00:13:58
勉強になるな。
671デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 00:48:22
そりゃそうだろ
674デフォルトの名無しさん:2007/06/18(月) 00:49:09
>>673
すんません
分かり易く解説お願いします
675673:2007/06/18(月) 00:49:19
>>671
の事ね

VC6が出来たのはだいぶ前だから
676672:2007/06/18(月) 00:50:28
>>675
あ、すんません
タイミング良かったんで即レス来たのかと思っちゃいましたw
677デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 01:04:08
>>677
おぉ、なるほど

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

勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz
679デフォルトの名無しさん:2007/06/18(月) 01:05:32
別に動きは変わらんと思うが
680デフォルトの名無しさん:2007/06/18(月) 01:11:32
>>679
あ、そうなんですか?
ありがとうございます

個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな〜と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)
681デフォルトの名無しさん:2007/06/18(月) 01:12:16
失礼、
×他から
○他からも
682デフォルトの名無しさん:2007/06/18(月) 01:13:48
動きは変わらないが、
後者は関数呼び出しのオーバーヘッドが発生する。
683デフォルトの名無しさん:2007/06/18(月) 01:20:02
関数本体の中にやたらと#ifdefなんかが入ってるのは、
あんまりいいコードとはいえないな。
「見づらくてしょうがない」というその感覚は限りなく正しい。
改善する方法をいろいろ考えるべきだな。
684デフォルトの名無しさん:2007/06/18(月) 01:25:43
>>682
すいません

そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?

>>683
ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです
685デフォルトの名無しさん:2007/06/18(月) 01:39:54
関数を呼び出すという処理は、それ自体スタック操作や
プログラムカウンタの移動などの処理が行われる。
だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で>>677の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。

ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。

でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?
686デフォルトの名無しさん:2007/06/18(月) 01:47:04
>>685
なるほど、詳しい解説ありがとうございます

せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね
687デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 02:01:41
リリース版ではインライン関数にして、
コンパイラの最適化に期待する手もある。
689デフォルトの名無しさん:2007/06/18(月) 02:02:11
/* 古いコンパイラで使える技 */
#if DEBUG
#define DebugPrint(args) printf args
#else
#define DebugPrint(args)
#endif

/* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */
DebugPrint(("%d\n", 1234));
690デフォルトの名無しさん:2007/06/18(月) 02:03:19
古くなくてもできることないか?
691デフォルトの名無しさん:2007/06/18(月) 02:03:47
>>687,>>689
おぉ、凄いですね

色々ご教授ありがとうございます

>>688
もし良ければその方法も教えて頂けないでしょうか・・・
692デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 02:16:49
#if DEBUG
#define DebugPrint printf
#else
#define DebugPrint (int)sizeof
#endif
694デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 02:21:38
>>694 リリースでエラーにならないか?
696デフォルトの名無しさん:2007/06/18(月) 02:30:28
>>695
エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。
697デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 02:33:27
VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。
699デフォルトの名無しさん:2007/06/18(月) 02:34:36
if(1); else に置換するという技もある。
多分最適化で消える。
700デフォルトの名無しさん:2007/06/18(月) 02:39:27
>>697
関数 f が副作用を持ってたら問題があるな。
701デフォルトの名無しさん:2007/06/18(月) 02:39:55
VC++ならTRACEで以上では?
702デフォルトの名無しさん:2007/06/18(月) 02:41:56
皆さん
感謝、感激雨あられです

ちょっとF1見てる隙にこんなに書き込みが・・・

色々参考にさせてもらいます
703デフォルトの名無しさん:2007/06/18(月) 02:52:34
何F1見てんだよこのヤロー
704デフォルトの名無しさん:2007/06/18(月) 02:55:55
ああ、F1押すと長々と待たされた後で
役に立たないヘルプが出るよね
705デフォルトの名無しさん:2007/06/18(月) 02:56:43
>>700
まあ、必要なら>>699で多分消せるじゃね?

>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん
706デフォルトの名無しさん:2007/06/18(月) 02:57:53
必要ならって言うか、必須なんだぜ。
707デフォルトの名無しさん:2007/06/18(月) 03:02:02
>>706
いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?
708デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 03:18:04
>>708
これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy
711デフォルトの名無しさん:2007/06/18(月) 03:18:48
>>709
static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。
712デフォルトの名無しさん:2007/06/18(月) 03:19:32
>>709
Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです

通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。

例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません
713デフォルトの名無しさん:2007/06/18(月) 03:21:19
>>711
charが抜けた。すいません。
714デフォルトの名無しさん:2007/06/18(月) 03:25:49
>>707
そういやそうだな。
715709:2007/06/18(月) 03:28:23
即レスサンクス。
やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。

>711
とりあえず1万バイトくらいでがんばろうと思います。

>712
バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)
716デフォルトの名無しさん:2007/06/18(月) 09:01:59
>>715
え、本当にどうしようもないの?
仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?

そりゃDLLの設計が糞としか言いようがないが…
717デフォルトの名無しさん:2007/06/18(月) 09:45:43
gets を安全に使うにはどうすればいいですか?
っていう質問と一緒だね。残念ながら無理だ。
718デフォルトの名無しさん:2007/06/18(月) 10:59:41
仕様上から決まる例で32bit整数が最大値だとわかれば
常にその大きさの配列渡せば安心、かな
719デフォルトの名無しさん:2007/06/18(月) 11:10:29
メモリ使い切って落ちるに1票
720デフォルトの名無しさん:2007/06/18(月) 11:12:45
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ?
それにしても 32bit 最大値はやりすぎだろうけど。
721デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 14:53:20
>>722
>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;
725709:2007/06/18(月) 15:00:50
>716
一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。
726デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 18:09:09
自己解決しました
bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗
729デフォルトの名無しさん:2007/06/18(月) 19:34:13
>>722
class sub3 : public sub1, public sub2
{
  sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
730デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 20:53:19
>>731
では、その元々汚いものを綺麗にする方法を教えてください。
734デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 21:14:01
なぜに&
737デフォルトの名無しさん:2007/06/18(月) 21:15:51
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」
738デフォルトの名無しさん: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がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。
739730:2007/06/18(月) 21:18:19
あ、私は730で>>734さんに対してのコメントです
740デフォルトの名無しさん:2007/06/18(月) 21:20:20
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。
741デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 21:27:19
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。
743デフォルトの名無しさん:2007/06/18(月) 21:44:32
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど
744デフォルトの名無しさん: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のプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。

746730: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がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも
747594デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/18(月) 21:58:46
>>745
とりあえずグダグダうるせえ。


749デフォルトの名無しさん:2007/06/18(月) 22:00:47
>730
というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。
750デフォルトの名無しさん:2007/06/18(月) 22:03:07
>747
ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。
751デフォルトの名無しさん:2007/06/18(月) 22:17:19
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか?
継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?
752デフォルトの名無しさん:2007/06/18(月) 22:21:47
classでレガシーな初期化はできなかった希ガス。
class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。
753デフォルトの名無しさん:2007/06/18(月) 22:39:10
>752
全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。
754デフォルトの名無しさん:2007/06/18(月) 22:49:14
サンクス。
しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。
755デフォルトの名無しさん:2007/06/18(月) 23:00:50
質問
 1. 死ぬまでenumハックを使うべきなのか。
 2. 死ぬまでexportは使ってはならないのか。
756デフォルトの名無しさん:2007/06/18(月) 23:07:21
>>755
1. そうです
2. そうです

早死にしないように気をつけて
757デフォルトの名無しさん:2007/06/18(月) 23:10:24
1 VC6を窓から投げ捨てりゃいいんじゃね
2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね
758デフォルトの名無しさん:2007/06/18(月) 23:16:47
759デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/19(火) 06:38:16
いくつかのサイトで見られたのですが、
STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。
761760:2007/06/19(火) 07:24:58
あ、すみません。
構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?
762デフォルトの名無しさん:2007/06/19(火) 07:59:43
>>760
定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。

>STARTUPINFO si = {};
コンパイル通った?
763760:2007/06/19(火) 08:56:24
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。
コンパイル通らない可能性もあるんですね。それなら使いません。

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?
764デフォルトの名無しさん:2007/06/19(火) 08:56:28
>>761
全部省略できるのは C++ だけ。
765デフォルトの名無しさん:2007/06/19(火) 09:59:42
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。
766デフォルトの名無しさん:2007/06/19(火) 10:21:17
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。
767760:2007/06/19(火) 11:07:01
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。
768766:2007/06/19(火) 12:48:11
解決しますた
769デフォルトの名無しさん:2007/06/19(火) 12:57:26
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。
770デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/19(火) 13:11:07
どうせWindowsだろ
猫でも読んどけ
773デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/19(火) 14:56:41
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?
778デフォルトの名無しさん:2007/06/19(火) 16:30:34
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています
779デフォルトの名無しさん:2007/06/19(火) 16:40:49
try catchじゃ例外は出せない
780デフォルトの名無しさん:2007/06/19(火) 16:42:51
tryの中でcatchに飛ばす方法を教えてください
781デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/19(火) 17:24:35
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1
784デフォルトの名無しさん:2007/06/19(火) 17:35:43
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。
785783: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デフォルトの名無しさん:2007/06/19(火) 20:14:08
最適化で消されてるだけじゃないかな
/Faで.asm見ればわかるよ
789デフォルトの名無しさん:2007/06/19(火) 22:00:05
スカトロCGを激しく集めるスレver27
http://sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537

537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528

 試 し た の か ? 

IDがC++
790デフォルトの名無しさん:2007/06/19(火) 22:08:56
よりにもよってスカかよw
791デフォルトの名無しさん:2007/06/19(火) 22:12:52
しかも logK か。
何か化学的な雰囲気を感じるぞ。
792730:2007/06/19(火) 22:17:42
>>759
Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?
793デフォルトの名無しさん:2007/06/19(火) 23:26:19
>>792
テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない
794730: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デフォルトの名無しさん:2007/06/19(火) 23:55:57
いかん
最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん
796デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/20(水) 02:00:31
問題はないけど、
プリミティブ型だと結構遅くなる。
798デフォルトの名無しさん:2007/06/20(水) 02:37:39
>>796
boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか
799デフォルトの名無しさん:2007/06/20(水) 08:26:49
>>783
>>788
ありがとう。「最適化で消された」みたいです。腑に落ちました。
800デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/20(水) 12:51:30
>>800
各変数の値がどうなってるかくらい調べろよ
802デフォルトの名無しさん:2007/06/20(水) 12:56:12
>>800
とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?
803800:2007/06/20(水) 13:04:12
>>801
すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。

>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。
804デフォルトの名無しさん:2007/06/20(水) 13:13:25
C++で安全なコードを書きたいなら、キャスト前のチェックとか、
->の元がNULLでないことを保証するassertなんかは必須かと

というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?
805デフォルトの名無しさん:2007/06/20(水) 13:17:03
>>803
予測なんてしなくていいから、デバッグ実行しろ。
806800:2007/06/20(水) 13:41:47
>>804
lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。

>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。
807デフォルトの名無しさん: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に直接アクセスしてクラス名を取得しようとするな
ってことじゃねえの。
808800: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オブジェクトを作りたいと考えています。

改行が多いといわれたので続きます
810809の続き: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)のエラーが起きました。
配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?
811809、810:2007/06/20(水) 19:24:44
すいません。書き忘れです。

(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。
812デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/20(水) 19:42:09
constな(C++の)参照

宣言自体の読み解き方がわからなければ、ここでも読んでおけ
http://kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ
816デフォルトの名無しさん:2007/06/20(水) 20:19:12
>>812-813
あ、*の扱い方が間違ってたのか。ありがとうございました。
817デフォルトの名無しさん:2007/06/20(水) 21:05:47
windowsで、C++builder使用してます。

質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。

これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
 とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
 で、できそうでしょうか?

2番目だと簡単そうですか?
818デフォルトの名無しさん:2007/06/20(水) 21:56:04
ソフト単体ならパケット監視してどうこうということもできるだろうけど、
windowsのばあい、システムに対してユーザーが介入するのは難しい。

アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。
819デフォルトの名無しさん:2007/06/20(水) 22:05:58
820デフォルトの名無しさん:2007/06/20(水) 22:29:39
>>818
レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。

>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。
821デフォルトの名無しさん:2007/06/20(水) 22:47:33
>>820
そんなあなたにフィルタドライバか、DLLインジェクション。
822デフォルトの名無しさん:2007/06/20(水) 23:07:41
なんで具体的にそのソフト名をいわんのかね。
823デフォルトの名無しさん:2007/06/20(水) 23:36:12
改造する気?
824デフォルトの名無しさん:2007/06/20(水) 23:45:03
C++でLinkポインタというのを作りました
所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります

質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…
825デフォルトの名無しさん:2007/06/20(水) 23:53:56
Lockできないboost::weak_ptrを実装したって話?
826デフォルトの名無しさん:2007/06/21(木) 00:31:22
あのー

(unsigned int) ((context->count[0] >> 3) & 0x3F)

これがなぜ64のあまりになるのですか?
827デフォルトの名無しさん:2007/06/21(木) 00:33:42
>>826
0x3fは2^6-1だから。
828デフォルトの名無しさん:2007/06/21(木) 00:47:40
0x3f=16*3+1*15
829デフォルトの名無しさん:2007/06/21(木) 00:50:06
えーとじゃあ
45と120の場合いくらになるんだろ
なんか計算あわない
830デフォルトの名無しさん:2007/06/21(木) 00:52:38
>>826
一瞬、LISPあたりのコードかと思った。
831デフォルトの名無しさん:2007/06/21(木) 00:53:37
ところでなんで
(context->count[0] >> 3)してるんだろう。

これすると値辺になる気がするのですが
832デフォルトの名無しさん:2007/06/21(木) 13:05:29
つーかそれ、
8で割った後に64で割った余りを求めてる事になるが
833デフォルトの名無しさん:2007/06/21(木) 13:14:49
あっそ、よかったね
834デフォルトの名無しさん:2007/06/21(木) 14:30:08
よくないという話だな
835デフォルトの名無しさん: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
すみません。長いソース打ち込みたいとおもって、本屋で長いソースが載っている本を買ってきました。
http://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デフォルトの名無しさん:2007/06/21(木) 17:10:28
>>838
QuickC……

その本は今すぐ返品しなさいw
ソースが欲しいなら、
http://sourceforge.jp/
http://sourceforge.net/
なんかで探しなさい。
もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。
840デフォルトの名無しさん:2007/06/21(木) 17:57:25
94年じゃしょうがないな
841デフォルトの名無しさん:2007/06/21(木) 18:27:59
unsigned conv_in:1;
という記述を見かけたのですが
このコロンはなんですか?
842デフォルトの名無しさん:2007/06/21(木) 18:31:58
>>841
ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。
843838:2007/06/21(木) 18:33:45
>>839
どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。

>>840
やっぱだめですよね。。どうもありがとうございました。
844デフォルトの名無しさん:2007/06/21(木) 18:35:49
おいおい独学社ならそれくらい嫉妬家よ
845841:2007/06/21(木) 18:44:33
>>842
ありがとうございます
846デフォルトの名無しさん:2007/06/21(木) 18:55:12
>>844
今日始めたばかりの独学者なんだろ。事情を察しろ。
847デフォルトの名無しさん:2007/06/21(木) 19:06:10
そういうところのリンクをまとめて貼ってもいいんだが
見つける喜びってのがあるからなあ
848デフォルトの名無しさん:2007/06/21(木) 19:09:04
>>847
急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。
849デフォルトの名無しさん:2007/06/21(木) 22:20:52
長いソースを打ち込みたいならCプログラミング診断室


いや本気にしないでね
850デフォルトの名無しさん:2007/06/21(木) 22:22:08
>>825
おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い
851デフォルトの名無しさん:2007/06/21(木) 22:45:49
OfficeのWORDの文字だけをいじるプログラムを組みたいのです。
ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。
DCOMを使うのも、避けたいのです。

そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、
UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。

よろしくお願いします、
852デフォルトの名無しさん:2007/06/21(木) 22:51:51
あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、
853デフォルトの名無しさん:2007/06/22(金) 01:10:31
あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。
854デフォルトの名無しさん:2007/06/22(金) 01:17:29
POIでいいじゃん。
がんばって移植すれ。
855デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/22(金) 08:20:41
>>852
ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?
857デフォルトの名無しさん:2007/06/22(金) 10:06:54
>>856
バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。
858デフォルトの名無しさん:2007/06/22(金) 10:10:48
夏カシス昔よくやった
859デフォルトの名無しさん:2007/06/22(金) 11:00:27
>>855
g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。
860デフォルトの名無しさん:2007/06/22(金) 11:55:40
>>851
WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。
861デフォルトの名無しさん:2007/06/22(金) 13:26:29
0〜9の数字をランダムに発生させて
数字が被らないように
どのような順番で数字が来たか表示させるという処理をしたいのですが
このようなプログラムを作るにはどうすればいいのでしょうか
乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます

862デフォルトの名無しさん:2007/06/22(金) 13:30:14
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。
C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。
863デフォルトの名無しさん:2007/06/22(金) 13:30:39
>>861
絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。
864861: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デフォルトの名無しさん:2007/06/22(金) 13:40:26
力抜けよ
866デフォルトの名無しさん:2007/06/22(金) 13:56:17
そう、もっと・・・力を抜いてごらん・・・。
867デフォルトの名無しさん:2007/06/22(金) 13:59:44
for (;;) { >>865 >>867 >>866 }
868デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/22(金) 14:38:20
>>869
何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。
871デフォルトの名無しさん:2007/06/22(金) 15:43:43
つまり、gotoで分岐する範囲では宣言できないということだ。
872デフォルトの名無しさん:2007/06/22(金) 15:46:05
switch - case で、caseで宣言できないのと同じだな
873デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/22(金) 17:01:09
boost::lexical_castなどはどうだろう
876874:2007/06/22(金) 17:10:29
>>875
おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。
877デフォルトの名無しさん:2007/06/22(金) 17:20:04
>>873
一文字ずつアスキーコードで比較して行けばいいのでは?
878デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/22(金) 18:25:06
>>880
おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!
882デフォルトの名無しさん:2007/06/22(金) 19:30:17
突然すみません。質問させていただきます
自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。
883デフォルトの名無しさん:2007/06/22(金) 19:35:30
分割コンパイルで検索
884デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/22(金) 23:27:23
>885
プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ

七行プログラミング part5
ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/
889デフォルトの名無しさん:2007/06/22(金) 23:38:11
>>880
sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?
890デフォルトの名無しさん:2007/06/22(金) 23:41:30
>>889
別にカッコつけなくても生きていけるんです
891デフォルトの名無しさん:2007/06/22(金) 23:46:17
sizeofというのは「関数」じゃない。
だから、sizeof(buf)のbufは、関数の「引数」じゃない。
関数じゃないから、括弧は「関数呼び出し演算子」ではない。
sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。

「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。
892889:2007/06/23(土) 00:11:33
ありがとうございます。付けなくてもいいんですね。
なのに()付きのサンプルコードが多いのは何故なんでしょうか?
893デフォルトの名無しさん:2007/06/23(土) 00:15:46
>>892
型のサイズを知るには、sizeof(int)のように括弧が必要。
それに倣って、括弧をつける人が多数。
894889:2007/06/23(土) 00:19:49
なるほど、そういうことだったんですね。
ありがとうございました。
895デフォルトの名無しさん:2007/06/23(土) 00:22:27
括弧つけても優先順位に全く影響与えないしな。
無駄だし勘違いする人も出るからと嫌う人もいるし、
括弧を付けた方が統一性が出ると付ける人もいる。

そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。
896デフォルトの名無しさん:2007/06/23(土) 00:56:10
何でtypeidはカッコ必須なの?
897デフォルトの名無しさん:2007/06/23(土) 00:58:17
typeidの場合はsizeofと違って対象が型だろうが値だろうが括弧が必要。

だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。
898デフォルトの名無しさん:2007/06/23(土) 01:07:29
>887
>まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。

不定じゃなくて未定義でしょ。
鼻から悪魔がでてくるじょ
899デフォルトの名無しさん:2007/06/23(土) 06:59:03
いや不定だろ
900デフォルトの名無しさん:2007/06/23(土) 07:11:10
JISX3010 6.5式 (70)によれば、
「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」
901デフォルトの名無しさん:2007/06/23(土) 13:33:55
せいぜい言葉遊び。
「未定義」だから、コンパイラにより「不定」になるんだろ。
902デフォルトの名無しさん:2007/06/23(土) 14:02:30
903デフォルトの名無しさん:2007/06/23(土) 14:44:39
C++とはちょっと違うのですが、適当なスレが見つからなかったので、すみませんが質問させてください。
VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を
外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか
そもそもこいつが何者なのかがさっぱりわかりません。
マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが
外部プログラムの実行だけがどうしてもできません。
どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。
904855:2007/06/23(土) 21:13:36
>>859
遅くなってすみません。キャスト外せませんか…ありがとう。
俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、
でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。
905デフォルトの名無しさん:2007/06/23(土) 21:15:34
>>904
const の有無で2つある。
906855: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/24(日) 00:03:12
どうでもいいが関数名はEscDQuoteのほうがいいんじゃないの?
909デフォルトの名無しさん:2007/06/24(日) 05:33:08
今では vector のメモリ上での連続性は保証されてますけど、
昔は少なくとも規格上では保証されていませんでした。

で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか?
実在しなければ、メモリ上での連続性を仮定したプログラムは
過去の処理系との互換性があるということで安心できるのですが。
910デフォルトの名無しさん:2007/06/24(日) 07:15:16
俺は聞いたことがない

普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、
連続していなかった処理系なんてないと思って差し支えないはず
911デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/24(日) 14:04:56
普通は、fin.read(s, 100 )とかstd::getline( fin, str )とか使うけどね。
914デフォルトの名無しさん:2007/06/24(日) 14:14:46
>>912
配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。
915デフォルトの名無しさん:2007/06/24(日) 14:31:41
>.912
(1)についてはそのとおり
(2)についてはちがう。
空白文字(スペース、タブ、改行等)を読み飛ばし、
次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。
scanfの%sと同じと思っておけばよい。
916デフォルトの名無しさん:2007/06/24(日) 14:35:50
まあ、折角 istream 使ってるんなら、
char じゃなくて string 使った方が安全でいいね。
917デフォルトの名無しさん:2007/06/24(日) 14:52:06
そもそも、なんでifstreamへの書き込みについての質問なのに読み込む話ばかりなんだ?
918デフォルトの名無しさん:2007/06/24(日) 14:54:29
>>917
2行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。
919デフォルトの名無しさん:2007/06/24(日) 15:22:55
>>910
設計時点で C 配列の代用という用途は考えられていて、
規格への明記が漏れていただけだと思われ。

↓でも現状の実装についての考察なんて問題にならなかったみたいだし。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69
920デフォルトの名無しさん:2007/06/24(日) 15:59:49
>>919
なるほど。確かに。

ただ、仕様上 one-past-the-end の問題は無い、
と言ってる点がいまいち分からんのですが。
5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証)
あたりとは矛盾しないのですか?
921デフォルトの名無しさん:2007/06/24(日) 16:17:52
>>920
!v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が
有効なことと 5.7p4 の
「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」
っていうルールから導き出せるから、特に vector について書くことは無い
ってことじゃないかな?

まぁ、そうだとしてもわかりにくいね。
922デフォルトの名無しさん:2007/06/24(日) 16:26:54
なるほど・・・。確かに。
923デフォルトの名無しさん:2007/06/24(日) 17:10:37
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。
924デフォルトの名無しさん:2007/06/24(日) 17:28:14
925デフォルトの名無しさん:2007/06/24(日) 17:30:07
早速ダウンロードしました
926デフォルトの名無しさん:2007/06/24(日) 17:33:48
ないのならないで結構です。
927デフォルトの名無しさん:2007/06/24(日) 18:24:12
>>923
半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう

そして、そんなものが作れるなら…
928デフォルトの名無しさん:2007/06/24(日) 18:35:00
>>927
そうなんですか。
イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。
ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html
プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、
中身を開けませんでした。
929デフォルトの名無しさん:2007/06/24(日) 18:36:55
難しいようですね、お騒がせして申し訳ありませんでした。
930ちんこ:2007/06/24(日) 19:27:46
http://www.uploda.org/uporg872561.cc.html

g++です。
三目並べのゲームを作ります。
show_stateがばぐります。どこがおかしいか教えてください
931デフォルトの名無しさん:2007/06/24(日) 19:34:07
こんなのコンパイルとおるんだな。
932デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/24(日) 20:38:40
>3通りを表現するのに一番適したデータ型はなんですか?
boost::triboolってのがある
これはtrue, false, indeterminateの3値を表現できる
これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定
とでも使えばちょうど良いんじゃないかな
936デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/24(日) 20:58:59
ちょっとすれ違いですが、
eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?
940デフォルトの名無しさん:2007/06/24(日) 21:02:43
>>939
あります。スレ違いなので詳細は割愛。

>>937
サイズが大きいから遅いとは簡単にはいえません。
まずは真っ当に作り上げることが先決でしょう。
941デフォルトの名無しさん:2007/06/24(日) 21:07:12
>>937
そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。
って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。
ほとんどintの処理速度=charの処理速度だと思うが。
実際型のビット幅が決まってないのって弊害にしかならん気がする。
942デフォルトの名無しさん:2007/06/24(日) 21:12:39
typedef int TRIBOOLとでも定義しておいて
とりあえず組んでみたら?
出来てから速度とか使用メモリーを測定してそれから決めればいい
943デフォルトの名無しさん:2007/06/24(日) 21:16:21
>>937
高速になる理由は>940-941のとおり。
charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。

1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。
ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに
配列として持つより設計を見直すほうがいいと思われる。
944デフォルトの名無しさん:2007/06/24(日) 21:20:22
メモリアクセスの遅延により、メモリの節約自体が速度に効くだろうから
やっぱり最終的に実測しないと決まらない。
945ちんこ:2007/06/24(日) 21:21:39
うお、その話ならどっかで聞いたことがあったような。
じゃあintにしてみます。
9路盤で5目並べする時用にプログラムをあらかじめ
N // 盤の大きさ
M // これだけ並べば勝ちだぜぃな数
として組んだ方がいいですかね?

しかしどうやればいいかはさっぱりなんですがね。
何しろゆとりなもんでwww
946デフォルトの名無しさん:2007/06/24(日) 21:25:46
>>945
とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ
話はそれからだ
947ちんこ:2007/06/24(日) 21:27:00
まじ難しい。
948ちんこ:2007/06/24(日) 21:29:53
クラスの依存関係がイミフ
949デフォルトの名無しさん:2007/06/24(日) 21:33:39
日記帳にでも書いてろ
950デフォルトの名無しさん:2007/06/24(日) 21:43:37
あきらめろ
951デフォルトの名無しさん:2007/06/24(日) 21:45:30
>>937
メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok

ちなみにC++ではbool型のサイズは環境によって違う
普通はintかcharになってるようなのでメモリの節約にはならない

でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから
まず動くもの作ってそれから考えるほうがいいよ
952デフォルトの名無しさん:2007/06/24(日) 21:58:34
>>945
ちなみに、見た目簡単そうな5目並べだが、
まともな思考エンジン作れたら結構な額で売れる

昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw
953ちんこ:2007/06/24(日) 21:58:57
Playerクラスとかいるか・・・?
でもないとオブジェクト指向っぽくないよなぁ・・
954デフォルトの名無しさん:2007/06/24(日) 22:00:34
>>945
この辺参考にして頑張ってくれ
http://www.h6.dion.ne.jp/~game296o/GameMain.html
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

後はひたすら試行錯誤
考えて分からなければとりあえず書いたら最低限何が駄目か何が必要かとかわかってくるんじゃね?
955デフォルトの名無しさん:2007/06/24(日) 22:05:01
>>953
お前には無理だ
せいぜい無駄な時間を浪費するがよい
956デフォルトの名無しさん:2007/06/24(日) 22:42:47
957デフォルトの名無しさん:2007/06/24(日) 23:48:42
くだらない質問だと思いますがお願いします。
STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか?
Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。
958デフォルトの名無しさん:2007/06/24(日) 23:49:27
std::copy
959デフォルトの名無しさん:2007/06/25(月) 00:06:23
>>958
どうもです。
960デフォルトの名無しさん:2007/06/25(月) 00:09:28
&vector_instance[0]ではいかんのか?
961こんにちは:2007/06/25(月) 03:30:00
こんにちは
962デフォルトの名無しさん:2007/06/25(月) 04:45:34
次期仕様のドラフトだと data 関数があるみたいだが、
今の所は &v[0] か &v.front() だな。
963デフォルトの名無しさん:2007/06/25(月) 04:47:50
>>953
Player インタフェースクラスを作って、
PlayerCom と PlayerHuman クラスを派生して・・・
964デフォルトの名無しさん:2007/06/25(月) 06:03:54
GameMaster クラスを用意して本物の盤面をいじれるのはそのクラスだけにして…
965デフォルトの名無しさん:2007/06/25(月) 06:05:41
PlayerCom からも複数のクラスを派生して・・・
966ちんこ:2007/06/25(月) 07:14:38
そんなにクラス作るのか。
PlayerからPlayerComとPlayerHumanを継承
PlayerComから複数はなんで?
もしや思考パターンを変える為?
967デフォルトの名無しさん:2007/06/25(月) 07:32:33
ちんこ死ね
968ちんこ:2007/06/25(月) 07:36:38
初心者歓迎スレなのに・・・
クラスを使ったものとしてはC++かつGUI以外でははじめて
もう何がなんだか分からんとです。
まずUML勉強した方がいいかな?
生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。
969デフォルトの名無しさん:2007/06/25(月) 07:53:01
はいはいわろすわろす
970デフォルトの名無しさん:2007/06/25(月) 07:53:12
○×ゲーム程度なら、まず非オブジェクト指向で作ってから
設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。
971デフォルトの名無しさん:2007/06/25(月) 07:59:30
>>968
愚かな一貫性は小人物に憑いたお化けである
972デフォルトの名無しさん:2007/06/25(月) 08:03:07
まあ、色々なパターンで作って、
それぞれのプログラムの性質を比較してみるのも勉強になるよね。
973デフォルトの名無しさん:2007/06/25(月) 08:13:38
そろそろ次スレの季節だな。
974デフォルトの名無しさん:2007/06/25(月) 09:55:20
定刻も、過ぎてることだしな
975デフォルトの名無しさん:2007/06/25(月) 12:02:09
次スレ立てた

【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/
976デフォルトの名無しさん:2007/06/25(月) 12:03:14
977デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/25(月) 22:38:42
case 1 に飛んだ場合はいいけど、
case 2 に飛んだ場合は i が使えるのに
初期化の位置を飛ばしてしまう。
だから、そういうことはできないようになってる。

case 1: {
 int i = 1;
} break;

みたいにブロックで囲むといいよ。
979977:2007/06/25(月) 22:54:36
ありがとうございます。そのようにします。
980デフォルトの名無しさん:2007/06/26(火) 21:11:34
>>913-918
ありがとうございました。
981デフォルトの名無しさん:2007/06/26(火) 22:34:30
>>978
横レスだが
なるほど
時間があれば言語仕様もきっちり読んでおけってことか
982デフォルトの名無しさん:2007/06/26(火) 22:55:00
時間が無くても言語仕様は嫁
983デフォルトの名無しさん:2007/06/26(火) 23:21:51
必須かよorz
プログラム開発の面接を受けた感触として
ひょっとしたら読まなきゃかもなーとは思ってたが
984デフォルトの名無しさん:2007/06/26(火) 23:24:17
必要があれば読みたくなるだろうからそれまでは別に無理して読まなくて良いよ
経験があってこそ初めて理解できるような部分もあるし
985デフォルトの名無しさん:2007/06/26(火) 23:52:05
C++で一時オブジェクトを関数に渡す時に値渡しするしかないんですか?
boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが
右辺値を参照で渡せるような何か良い手段ありますか?
986デフォルトの名無しさん:2007/06/26(火) 23:52:50
constのことかーーーーーー?
987デフォルトの名無しさん:2007/06/26(火) 23:59:47
あああ、const参照にはこういう使い方もあったんでうsね
どうもです
988デフォルトの名無しさん:2007/06/27(水) 00:09:12
亀だが
charとかshortは演算途中で内部的にintに無理矢理キャストされることがある
理由は>>941の通り
だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い
989デフォルトの名無しさん:2007/06/27(水) 00:23:42
>>988
「ことがある」じゃなくて、その動作が標準として規定されている。
990デフォルトの名無しさん: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デフォルトの名無しさん:2007/06/27(水) 00:29:54
>>989
そうか、すまん俺の勉強不足だった
992デフォルトの名無しさん:2007/06/27(水) 01:19:35
sdk\include>grep typedef.*BOOL WinDef.h
File WinDef.h:
typedef int BOOL;
993デフォルトの名無しさん:2007/06/27(水) 03:34:17
>>989
格上げされない場合もあるわけだが。
994デフォルトの名無しさん:2007/06/27(水) 03:52:27
>>993 sizeof ぐらいじゃね?
995デフォルトの名無しさん:2007/06/27(水) 04:18:22
今更だけど、C/C++とC99は別物だと思う。
996デフォルトの名無しさん:2007/06/27(水) 05:44:06
「演算途中で」となるとまあ sizeof くらいなのかな?
あ、いや、キャストもか。
997デフォルトの名無しさん:2007/06/27(水) 07:02:02
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/

念のためにもう一度貼っとくよ〜
二重に立てるような無駄を防ぐためだよ〜
998デフォルトの名無しさん:2007/06/27(水) 12:26:27
>>992
MSのやつはバージョンによって違うらしいぞ
999デフォルトの名無しさん:2007/06/27(水) 14:45:41
1000ゲトー
1000デフォルトの名無しさん: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 に 超 感 動 !
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。