トップページ⇒tech
1001コメント325KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2007/06/03(日) 22:33:55
エスケープシーケンスや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
0002デフォルトの名無しさん2007/06/03(日) 22:35:41
乙
0003デフォルトの名無しさん2007/06/03(日) 22:57:43
3ならC++は廃れる。
0004デフォルトの名無しさん2007/06/03(日) 22:59:14
殺す
0005デフォルトの名無しさん2007/06/03(日) 23:00:47
           ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < 通報しますた!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < しますた!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ!! .スタ!!
0006デフォルトの名無しさん2007/06/03(日) 23:01:44
おいおい
ここはいつからネタスレになったんだ
000722007/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/
000822007/06/03(日) 23:12:01
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < ころしますだ!!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д`) < 殺します!!!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚)  シマスタ!!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >   (・∀・)シマスタ!! .マスタ-ベーション!!
0009デフォルトの名無しさん2007/06/04(月) 00:05:40
構造体の初期化で
={0}とmemsetによる初期化ってどう違うのでしょうか?
またどちらの方がいいですか?
0010デフォルトの名無しさん2007/06/04(月) 00:11:34
>>9
前者の方が普遍的。
後者は間違いの元。
積極的に使う理由がないなら前者でOK。
0011デフォルトの名無しさん2007/06/04(月) 00:14:09
動作はそんなに変わらないけど
={0} : 他のメンバが初期化されてない、って警告が出る場合がある。
memset : ビットパターンが0であると保証されているわけではない型
(ポインタとか)でぐだぐだ言われる場合もないわけでもない。それと、
ゼロクリア処理であって、初期化ではないので、挟もうと思えば処理を
挟むことができてしまう。
001292007/06/04(月) 00:29:40
>>10-11
ありがとうございます。できるだけ前者を使う事にします。
0013デフォルトの名無しさん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
0014デフォルトの名無しさん2007/06/04(月) 04:53:15
Borland C++ 5.5.1+BCC Developerを使っています。
あるクラスのメンバ関数を別ファイルにし#includeしているのですが

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

というエラーが出ます。

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

つーか、何で #include してるかが気になる。
0016デフォルトの名無しさん2007/06/04(月) 09:23:11
system関数でunixのコマンドを実行する際に、結果が戻ってくる前に、次の行へ実行を移したいのですが、
どのようにすればよいのでしょうか?
コマンドラインでいうところの&をつけてバックグラウンドで実行するような形にしたいのです。
0017デフォルトの名無しさん2007/06/04(月) 10:15:54
>>16
一般的にsystem()はシェルを経由してコマンドを呼び出すので、単に&をつければいい。
Ex.
system("sleep 86400&");
0018デフォルトの名無しさん2007/06/04(月) 10:19:54
情報系学部の大学2年です。将来はプログラマ・システム関係に就きたいと思っています。
環境は自分のパソコンにCygwinを入れて使っています。
今まではアスキー出版の「C言語入門」という本で勉強してきて基本的なことは理解しています。
それでC++にはいつ頃から入ればいいでしょうか?まだ早いでしょうか?
またこれから何を勉強していったらいいかいまいち先がわかりません。
簡単なゲームを製作することが目標です。
ただプログラミングは楽しんでいるのでこれからも続けていきたいです。
大学の授業ではC言語のアルゴリズムを勉強中です。
0019デフォルトの名無しさん2007/06/04(月) 10:30:28
いつでも
0020デフォルトの名無しさん2007/06/04(月) 13:23:33
車のナンバーと色の情報を100台分入れるArrayを作るために
struct car {int number;
string color;
};
car cars[100];
のように宣言したのですが。

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

質問がわかりにくくて、申し訳ないです。
0021デフォルトの名無しさん2007/06/04(月) 13:25:30
void function(struct car*)とか
void function(struct car[])で良いんじゃないの。
0022デフォルトの名無しさん2007/06/04(月) 13:26:46
>>20
AoSよりSoAを使え。
0023デフォルトの名無しさん2007/06/04(月) 13:26:55
それでいいと思うけど、高々並び替えるだけの目的なら関数を自作する必要はないと思うよ。
その構造体の比較関数をオーバーロードして、std::sort()呼ぶだけでいいんだから。
0024デフォルトの名無しさん2007/06/04(月) 13:29:38
>>22
パフォーマンスを気にするようなレベルじゃないならAoSでいいんでね?
どうせ100台分だってことだし。
0025202007/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;
}
0026デフォルトの名無しさん2007/06/04(月) 13:48:34
コンパイルエラー出まクリスティ
0027デフォルトの名無しさん2007/06/04(月) 13:53:26
同一のスコープ内で 同じシンボル名の変数(fin な)を2回宣言してる
0028202007/06/04(月) 13:54:52
二種類のファイルを呼ぶには、どうしたらいいのでしょうか・・・
0029デフォルトの名無しさん2007/06/04(月) 13:57:17
違う名前にするかopen使うかすればいいんじゃねーの
入門書読めばわかる
0030デフォルトの名無しさん2007/06/04(月) 14:27:31
クラスでnew,delete演算子をオーバーロードしたいんですが、
staticじゃないといけないんでしょうか?
エラーが出て困ってます。
0031デフォルトの名無しさん2007/06/04(月) 14:30:56
そうですか。
0032デフォルトの名無しさん2007/06/04(月) 14:55:06
そうですね。
0033デフォルトの名無しさん2007/06/04(月) 15:17:32
そうですく。
そうですれ。
0034デフォルトの名無しさん2007/06/04(月) 15:28:45
>>31-33金くれ
0035デフォルトの名無しさん2007/06/04(月) 18:32:08
>>30
staticを付けなくてもstatic扱いされる。だって実体がまだ/もう存在していないから。
これに限らず静的メンバは、ただそのクラスに関連があるからクラス宣言の中に入っているだけと思えばいい。
0036デフォルトの名無しさん2007/06/05(火) 00:51:23
>>9
遅レスなんだが、みんな{0}初期化なの?

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


c - '0' の意味がわかりません
これは何をやってるんですか?
0132デフォルトの名無しさん2007/06/06(水) 19:18:36
c - '0' は普通数字を 0 〜 9 の数値に変換するときに使うけど
0133デフォルトの名無しさん2007/06/06(水) 19:43:22
ざっと C++ のドラフトを見ても、
仮想関数テーブルに関する記述がないんですが、
仮想関数テーブルは C++ の仕様上には
全く存在しない概念なんでしょうか?
0134デフォルトの名無しさん2007/06/06(水) 19:50:11
ABIとか、Implementation Specificな話は規格には載らないんじゃないの
0135デフォルトの名無しさん2007/06/06(水) 19:53:29
>>131
'0'ってのは数値的には0x30、そこから順に0x39('9')まで並んでる
だから文字として入力したものを数値に変換するときはそういうこともするけど・・・

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

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

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

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

そもそも無理なのか、または指定のやり方が間違っているのでしょうか?
0137デフォルトの名無しさん2007/06/06(水) 20:02:41
歯医者に風邪治してくれと言ってるようなもの
スレ違い
0138デフォルトの名無しさん2007/06/06(水) 20:14:38
下手な例えだな
0139デフォルトの名無しさん2007/06/06(水) 20:43:07
>>134
つまり、仮想関数テーブルは Implementation Specific な話ということなんですね。
了解しました。
01401/22007/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;
}
01412/22007/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;
}
01422/22007/06/06(水) 20:53:38
上記のプログラムを作ったのですがコンパイルして実行すると
「演算子を入力してください」
でプログラムが終了してしまいます。
何故でしょうか?
環境はcygwinです。
0143デフォルトの名無しさん2007/06/06(水) 20:58:13
>>142
getchar() で改行文字を読み込んでいるから
01441422007/06/06(水) 21:09:30
>>143
"改行文字を読み込んでいる"、とはどういうことでしょうか?
0145デフォルトの名無しさん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');

としてみては?
01461422007/06/06(水) 21:29:59
>>145
無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。
0147デフォルトの名無しさん2007/06/06(水) 23:46:17
Google Booksすげーな。言語の本無料でみれんじゃん
0148デフォルトの名無しさん2007/06/06(水) 23:57:06
>>147
それって、前にTVでやっていた著作権切れの本を公開する奴?
0149デフォルトの名無しさん2007/06/07(木) 06:26:40
NULLが0でない環境が存在するのと同様に、
0がぬるぽじゃない環境ってのもあるんでしょうか?
0150デフォルトの名無しさん2007/06/07(木) 06:28:41
0がぬるぽでない環境が存在するのと同様に、
NULLが0じゃない環境ってのもあるんでしょうか?
0151デフォルトの名無しさん2007/06/07(木) 06:49:24
トートロってんじゃねぇよって事ですか
よく考えると自分も質問の意図を把握できてないのに気づいたので取り下げます
0152デフォルトの名無しさん2007/06/07(木) 09:12:19
>>149
0 こそが真のヌルポインタだよ。
ただ、これだけだと整数型とか小数型の値としてもとれるから、
NULL ってマクロを使ってそれを回避できるようにもしてるだけ。
0153デフォルトの名無しさん2007/06/07(木) 09:53:37
>>152
そんな隙だらけの説明しかできないんならヌルポインタについて語るのはやめとけ。
↓これでいいだろ。
http://www.kouno.jp/home/c_faq/c5.html
0154デフォルトの名無しさん2007/06/07(木) 09:57:54
自分の読解力の無さを人の文章力のせいにするな
0155デフォルトの名無しさん2007/06/07(木) 10:10:02
確かに隙が多かったな。

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

これは、

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

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

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

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

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

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

この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)
0178デフォルトの名無しさん2007/06/07(木) 18:47:58
コマンドプロンプトで色々なコマンドが用意されていると思うのですが、
それをC言語で使用するにはどうすればいいのでしょうか?
具体的に言いますと、とりあえずexeファイルにa.txtをD&Dしたらそのディレクトリに
copy_a.txtというファイルを作成したりしたいです。コマンドプロンプトでいうとcp a.txt copy_a.txtですね。
まぁやりたいのはcpコマンドではなくて、javacコマンドとjavaコマンドなのですが・・・。
0179デフォルトの名無しさん2007/06/07(木) 18:51:14
system関数
01801782007/06/07(木) 18:51:42
まぁ、要はJAVAのコンパイルが面倒なのでドラッグするだけで出来るソフトをCで作りたいって話なんです。
01811782007/06/07(木) 18:54:29
>>179
ありがとうございます。
ちょっとやってみます。
0182デフォルトの名無しさん2007/06/07(木) 19:19:13
strcmp(buf, '\0');
でエラーが出るのですが、何か書式を間違ってるでしょうか?
文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。
最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・
0183デフォルトの名無しさん2007/06/07(木) 19:23:49
>>182
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)
0184デフォルトの名無しさん2007/06/07(木) 19:26:23
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん
0185デフォルトの名無しさん2007/06/07(木) 19:37:02
>>183
とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。

>>184
そういう課題なんです・・・
0186デフォルトの名無しさん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++の常識からは外れた書き方?
0187デフォルトの名無しさん2007/06/07(木) 19:46:56
他言語を真似るマクロは愚の骨頂だと俺は思う

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

>>188
(´・ω・`)

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

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

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

#define public public:

としたとして、

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

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

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

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

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

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

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

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

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

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

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

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

>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。
0239デフォルトの名無しさん2007/06/08(金) 15:32:32
strncpy()は鬼門。積極的に使う理由がないなら、sprintf()を使え。
0240デフォルトの名無しさん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));
0241デフォルトの名無しさん2007/06/08(金) 17:45:49
>>240
何も分からない
0242デフォルトの名無しさん2007/06/08(金) 17:48:57
>>241
再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです
0243デフォルトの名無しさん2007/06/08(金) 17:50:47
A_dir
B_dir
C_dir
というディレクトリがあったとき、B_dirを調べ終わったとき
次にC_dirを検索するにはどのデータを保存しておけば良いんですか??
0244デフォルトの名無しさん2007/06/08(金) 17:59:58
>>243
関数を再帰的に書けば良いじゃん
0245デフォルトの名無しさん2007/06/08(金) 18:05:38
>>244
再帰を使いたくないんです・・・
0246デフォルトの名無しさん2007/06/08(金) 18:07:08
何故?
0247デフォルトの名無しさん2007/06/08(金) 18:09:33
Fdを保存しておけばいい
0248デフォルトの名無しさん2007/06/08(金) 18:10:05
末尾再帰型で書いてからループ化すれば?
ttp://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0
0249デフォルトの名無しさん2007/06/08(金) 18:13:57
>>246 再帰は不安定になるんですよ

>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした
0250デフォルトの名無しさん2007/06/08(金) 18:19:05
struct ffblk[MAX_DIR_DEPTH];
0251デフォルトの名無しさん2007/06/08(金) 18:19:21
再帰が不安定とは……
0252デフォルトの名無しさん2007/06/08(金) 18:21:44
普通にスタックに積めばいいじゃん。
0253デフォルトの名無しさん2007/06/08(金) 18:23:20
>>249
再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても>>250みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。
0254デフォルトの名無しさん2007/06/08(金) 18:28:29
何が「再帰は不安定になるんですよ」だよ馬鹿もんが
02552492007/06/08(金) 18:29:22
速度を上げる為に複数スレッドで読み込みたいんですよ
再帰だと出来ないんです・・・・
0256デフォルトの名無しさん2007/06/08(金) 18:31:38
ここに複数スレッドでうごいているようなソフトがあるんですけど・・・
どうやればいいんですか???


フォルダサイズ調査  『 D-Usage.exe 』
http://hp.vector.co.jp/authors/VA032597/Software/DirMan.html
0257デフォルトの名無しさん2007/06/08(金) 18:32:30
ドライブ資源は1個なのに、複数スレッドでアクセスしたら、
かえって遅くなるような気がしないでもない
0258デフォルトの名無しさん2007/06/08(金) 18:35:07
>>250
進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも
0259デフォルトの名無しさん2007/06/08(金) 18:36:02
(一般的には)無駄なシークが発生して、遅くなります。
0260デフォルトの名無しさん2007/06/08(金) 18:36:15
>>257
実際にデータを読み込む訳ではないんですよ
0261デフォルトの名無しさん2007/06/08(金) 18:37:02
FindFirstFile()が返してきたハンドルをスタックとして
もっとけばいいだけじゃないの?
そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと
続きから返ってこないか?
02622572007/06/08(金) 18:39:04
>>260
俺は >>259 のことを想定して書いた。 余計なシーク発生するから遅くなるんじゃね? ってこと
0263デフォルトの名無しさん2007/06/08(金) 18:42:22
>>256
そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。
02642492007/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/
0265デフォルトの名無しさん2007/06/08(金) 18:49:33
C言語なんですが
自作関数で実引数で文字列を返す事は可能ですか?
02662572007/06/08(金) 18:49:52
>>264
どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい
0267デフォルトの名無しさん2007/06/08(金) 18:50:33
>>264
>263
0268デフォルトの名無しさん2007/06/08(金) 18:54:11
スレッド1個でも動くものができないのに
0269デフォルトの名無しさん2007/06/08(金) 19:00:58
しかし、どうでもいいけどD-Usageとかいうソフト、速いのかも知れないけど使い難いなぁ。
作者本人は悦に入っているようだから別にいいけど。

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

で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。
0277デフォルトの名無しさん2007/06/09(土) 02:01:44
>>274
cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。
0278デフォルトの名無しさん2007/06/09(土) 02:05:01
>>272
実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。
0279デフォルトの名無しさん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の定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが
0280デフォルトの名無しさん2007/06/09(土) 03:17:18
fopen("test.txt", "w");
でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、
C:\C:\Documents and Settings\ユーザ名
のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、
どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、
0281デフォルトの名無しさん2007/06/09(土) 03:24:21
>>280
>普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。
02825342007/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行程でできちゃいます><
02835342007/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;
}
0284デフォルトの名無しさん2007/06/09(土) 04:36:26
>>281
そんなアプリケーション見たことねえw
02855342007/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;
}
0286デフォルトの名無しさん2007/06/09(土) 05:58:26
コマンドライン引き数から実行モジュールの場所が得られると思ったら大間違い。
02875342007/06/09(土) 06:31:11
詳しく^^
02885342007/06/09(土) 06:49:51
自己解決しました^^
フルパスじゃないと取得できないので
windowsだとGetModuleFileName()を使うのですね^^
この辺は環境依存になるので注意が必要ですね^^
勉強になりました^^^^;;
0289デフォルトの名無しさん2007/06/09(土) 06:51:34
system()関数って凄く謎なのですが・・・。
printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。
これは俺が、system()で使う領域を侵してると考えていいのでしょうか?
0290デフォルトの名無しさん2007/06/09(土) 06:51:36
1.Unix系はarg[0]にパスが入らないんじゃなかったかな。
2.バッファオーバーランしかけたらエラー処理してくれ
3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」
4.const char* argv[]じゃなくてchar const *const argv[]な
02915342007/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;
}
0292デフォルトの名無しさん2007/06/09(土) 08:17:05
>>289
その周辺を晒してくれないとなんとも言えないのだが。
0293デフォルトの名無しさん2007/06/09(土) 08:34:05
>>279
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。
0294デフォルトの名無しさん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;
}
0295デフォルトの名無しさん2007/06/09(土) 09:27:16
>>294
sizeof(fullpath)じゃなんであかんのんですか?
0296デフォルトの名無しさん2007/06/09(土) 09:54:28
>>294だけど、
GetModuleFileNameの第3引数はバイト単位のサイズでなく配列要素数を
指定する。Unicodeビルドの時はsizeof(TCHAR)が2なので、TCHAR buf[10]は
 sizeof buf = 20
 sizeof buf / sizeof *buf = 10

違ってたらごめん
0297デフォルトの名無しさん2007/06/09(土) 10:05:43
>>296
嘘つくな。氏ね
0298デフォルトの名無しさん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であってる
0299デフォルトの名無しさん2007/06/09(土) 17:45:36
ヘッダーファイルで
class temp{
public:
int *func();
};
と書いた場合、funcの定義はどう書き始めればいいですか
int temp::*func()
int temp::(*func())
int *temp::func()
0300デフォルトの名無しさん2007/06/09(土) 17:59:13
一番下じゃないとVSのインテリセンスが効かなかったので一番下
0301デフォルトの名無しさん2007/06/09(土) 18:05:51
>>299
コンパイルできるのは一つだけしかないだろ?
0302デフォルトの名無しさん2007/06/09(土) 18:16:44
>>299
int* func();
0303デフォルトの名無しさん2007/06/09(土) 19:58:45
>>279
テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う
0304デフォルトの名無しさん2007/06/10(日) 00:26:59
ちょっと相談。

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

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

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

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

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

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

演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。
0334デフォルトの名無しさん2007/06/10(日) 20:20:48
>>332
成功しました。ありがとうございます。
0335デフォルトの名無しさん2007/06/10(日) 20:23:04
>>332
暇人乙
0336デフォルトの名無しさん2007/06/10(日) 20:52:44
>>335
暇潰しにもならんかったよ
0337デフォルトの名無しさん2007/06/10(日) 20:54:11
暇過ぎw
0338デフォルトの名無しさん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

ってでて、動きません。

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

0341デフォルトの名無しさん2007/06/11(月) 12:26:40
>>340
再現する最小限のソース貼って
0342デフォルトの名無しさん2007/06/11(月) 12:29:24
class A {
A(){}
A(int n){}
};

class B:A {
B(){}
B(int n){}
};

B b(1);

って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる?
とESPしてみる
0343デフォルトの名無しさん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;
}
0344デフォルトの名無しさん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

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

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

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

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

大丈夫だって保証があればいいんだけど。
0356デフォルトの名無しさん2007/06/12(火) 18:12:14
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに
何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?
0357デフォルトの名無しさん2007/06/12(火) 18:15:59
__DATE__ と __TIME__
0358デフォルトの名無しさん2007/06/12(火) 18:23:26
>357
感謝するわよ。
0359デフォルトの名無しさん2007/06/12(火) 18:34:03
もう一つ教えてちょうだい。
Jun 12 2007
って出るのを、
2007年6月12日にするにはどうしたらいいかしら?
0360デフォルトの名無しさん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;
03613602007/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++;
}
}
03623602007/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文がおかしいのか分からず迷っております

よろしくお願いします
0363デフォルトの名無しさん2007/06/12(火) 20:25:30
>>360
+=0て
0364デフォルトの名無しさん2007/06/12(火) 20:26:45
caseの後にbreakするんだ
0365デフォルトの名無しさん2007/06/12(火) 20:29:49
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は >>364 の指摘してるとおりだと思うが
0366デフォルトの名無しさん2007/06/12(火) 20:37:55
>>359
実行時に自分で変換すれば。
0367MSX++2007/06/12(火) 20:42:32
while(b--) {
*(int *)(((void *)(&c1))+(rand()&3))++;
}
ただし、c1からc4までが連続定義されているものとする。ANSI

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

かな?
0368デフォルトの名無しさん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;
}
0369デフォルトの名無しさん2007/06/12(火) 20:47:31
よく意味がわからんけど
コマンドプロンプトにD&Dしてんの?

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

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

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

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

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

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

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

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

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











でも、自分から見れば八百長っぽくてダサダサ。
0411デフォルトの名無しさん2007/06/13(水) 09:38:21
C++ってなんでfinallyがないの?
あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか?

char *str = new char[256];
try {
  ...
  if (...) return;
  ...
} finally {
  delete [] str;
}
と、C/C++初めて1年の俺が適当に言ってみる。
0412デフォルトの名無しさん2007/06/13(水) 09:41:27
>>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする
0413デフォルトの名無しさん2007/06/13(水) 09:42:02
>>411
そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。
0414デフォルトの名無しさん2007/06/13(水) 09:45:13
>>411
↓こっちのが楽だと思わんか?

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

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

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

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

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

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

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

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

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

エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。
0425デフォルトの名無しさん2007/06/13(水) 11:15:26
儂の例外処理は108式まで……
0426デフォルトの名無しさん2007/06/13(水) 11:27:04
構造化例外ってのは別物だっけ課?
0427デフォルトの名無しさん2007/06/13(水) 11:38:04
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう
0428デフォルトの名無しさん2007/06/13(水) 12:42:32
>>419
それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。
0429デフォルトの名無しさん2007/06/13(水) 13:04:41
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age
0430デフォルトの名無しさん2007/06/13(水) 13:14:35
memsetのこと?
0431デフォルトの名無しさん2007/06/13(水) 14:27:31
fill() だろ。
0432デフォルトの名無しさん2007/06/13(水) 15:00:43
ostream::write って引数 const char* だけど、
何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?
0433デフォルトの名無しさん2007/06/13(水) 15:05:48
>>432
writeは何をする関数かな?
0434デフォルトの名無しさん2007/06/13(水) 15:12:29
あなたに愛を届ける関数です。
0435デフォルトの名無しさん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をどう変えたら良いでしょうか?
0436デフォルトの名無しさん2007/06/13(水) 16:26:24
>>435
それで大丈夫なように見えるけど、どうダメだったの?
0437デフォルトの名無しさん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;
}

正しくはこうでした。
0438デフォルトの名無しさん2007/06/13(水) 16:34:43
cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる
0439デフォルトの名無しさん2007/06/13(水) 16:36:49
文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様
0440デフォルトの名無しさん2007/06/13(水) 16:48:56
>>439
ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。
0441デフォルトの名無しさん2007/06/13(水) 17:32:27
>>406-
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない
0442デフォルトの名無しさん2007/06/13(水) 17:58:33
>Windowsの例外処理

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

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

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

用途的には fwrite と ostream::write が対応するんだろうけど。
0454デフォルトの名無しさん2007/06/13(水) 18:56:35
ところで、例えば int 値をバイナリでファイルに書き込みたいときは、

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

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

という風に使うんだよね?(エラー処理は略)
0455デフォルトの名無しさん2007/06/13(水) 19:29:12
new されたサイズをプログラマが知る方法はないですか?
0456デフォルトの名無しさん2007/06/13(水) 19:37:32
>>455
標準にはない
0457デフォルトの名無しさん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* を引数にするとわけ分からなくならないか?
0458デフォルトの名無しさん2007/06/13(水) 20:05:26
"wchat_t"?
0459デフォルトの名無しさん2007/06/13(水) 20:11:26
>>457
それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる

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

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

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

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

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

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

>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う
0480デフォルトの名無しさん2007/06/13(水) 23:02:34
>>478
素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。
0481デフォルトの名無しさん2007/06/13(水) 23:04:08
>>480
おそらくコマンドプロンプトがバグってると思われるんだけどな
0482デフォルトの名無しさん2007/06/13(水) 23:10:04
ソース出せばいいと思うよ
0483デフォルトの名無しさん2007/06/13(水) 23:11:04
>>481
わらた、おもしろすぎ。
0484デフォルトの名無しさん2007/06/13(水) 23:13:38
>>481
windows入れなおせばいいと思うよ
0485デフォルトの名無しさん2007/06/13(水) 23:26:52
>>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。
0486デフォルトの名無しさん2007/06/13(水) 23:39:48
>>474
/* */ 型のコメントなら大丈夫だよ
0487デフォルトの名無しさん2007/06/13(水) 23:46:04
>>857
へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?
0488デフォルトの名無しさん2007/06/13(水) 23:47:30
何誤爆しとんねんw
04894872007/06/13(水) 23:51:37
誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><
0490デフォルトの名無しさん2007/06/14(木) 00:52:31
NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、
「NULLは 0」ということを前提としたプログラムは書くべきではないですか?
例えば…
void hoge(Foo *bar)
{
  // bar が NULL じゃなかったら
  if (bar != NULL) // こっちはいいけど
  if (bar)       // こう書く奴は死ぬべきでしょうか
    bar->...;
}
0491デフォルトの名無しさん2007/06/14(木) 00:54:41
>>355
それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。
0492デフォルトの名無しさん2007/06/14(木) 00:56:23
>>490 http://www.kouno.jp/home/c_faq/c5.html
0493デフォルトの名無しさん2007/06/14(木) 01:24:47
>>491
�d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。

まあ、flush しといた方が無難そうだな。
0494デフォルトの名無しさん2007/06/14(木) 19:27:21
http://pc11.2ch.net/test/read.cgi/tech/1181087371/l2
↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?
0495デフォルトの名無しさん2007/06/14(木) 19:35:50
scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す
0496デフォルトの名無しさん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
0497デフォルトの名無しさん2007/06/14(木) 20:35:41
int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) {
 scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }
0498デフォルトの名無しさん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の入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><
0499デフォルトの名無しさん2007/06/14(木) 20:53:50
つか、getchar でいいような
0500デフォルトの名無しさん2007/06/14(木) 21:12:28
>>499
getcharって文字入力用じゃないですか?
これで使う方法ってあります?
0501デフォルトの名無しさん2007/06/14(木) 21:26:25
scanf("%*c"); の代わりに使ってみればいいじゃないの。
0502デフォルトの名無しさん2007/06/14(木) 21:34:57
>>501
あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><
0503デフォルトの名無しさん2007/06/14(木) 22:46:34
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。
0504デフォルトの名無しさん2007/06/14(木) 22:48:53
余計複雑になるだけだと思うが。
0505デフォルトの名無しさん2007/06/15(金) 03:24:22
fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし
0506デフォルトの名無しさん2007/06/15(金) 04:02:27
1行につき数値1つ?
0507デフォルトの名無しさん2007/06/15(金) 13:00:46
>>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ
0508デフォルトの名無しさん2007/06/15(金) 13:48:27
すまんす
0509デフォルトの名無しさん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;
}

引数の順序が反対の関数も内部は同じです。
今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、
0510デフォルトの名無しさん2007/06/15(金) 15:43:21
samp operator+(samp & obj, int const & i) ;
samp operator+(int const & i, samp & obj) ;
0511デフォルトの名無しさん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&)
0512デフォルトの名無しさん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だからかな。
0513デフォルトの名無しさん2007/06/15(金) 16:13:55
やたらと質問ばかりですいません。

operator||()って、定義するのが何か変な感じなのですが、
||って、そもそも
式A || 式B
などと書いて、
式Aまたは式Bのどちらかが真なら、真。
という意味ですよね?このとき、||の右側の値と左側の値とを
特にoperator||(式A, 式B)としてひとつの関数内で一緒に処理しなくては
ならないような状況ってないんじゃないか
と思うのですが、
,,,
ここまで書いてきて、なんだか自分でも意味が分からなくなってきました。
ぶっちゃけた話、operator||()が定義できてよかった、という状況って
ありますでしょうか?
よろしくお願いします。

0514デフォルトの名無しさん2007/06/15(金) 16:18:52
C++再考かなにかで、画像をくっつける演算子に使っていた気がするな。
実装例では簡単にするため、たんなる文字列だったが。

operator , () より使い道はあるだろ。
こんなものBoostを実装できるような変態なやつらしか使わない。
0515デフォルトの名無しさん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;
}
0516デフォルトの名無しさん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++をやればそれなりに力が付く、とだれかが
書いていたのでこの本を勉強しているのですが、たしかにいい本だと
思ってます。でも、この本にも書いてないことがあるのですね。
この本を終えたら次はどういう本で勉強すべきでしょうか?

0517デフォルトの名無しさん2007/06/15(金) 16:34:28
>>514
C++再考ですね。見てみます。
ありがとうございます。
0518デフォルトの名無しさん2007/06/15(金) 16:36:00
ミスターoperatorでも目指してんのか
0519デフォルトの名無しさん2007/06/15(金) 16:38:22
今見ている本が演算子のオーバーロードの章(6章)なので、
つい上記のような質問ばかりになってしまいました。
0520デフォルトの名無しさん2007/06/15(金) 16:39:39
よっ、ミスターoperator!
05212572007/06/15(金) 16:40:19
friend samp operator+(samp const & obj1, samp const & obj2);
が必要

((10 + obj3) +obj3) + 100 の順に評価される

operator 演算子呼ばれた後のの戻り型を並べると
((samp) + samp) + int
~~~~~~~~~~~~~~~~ ここの演算定義がいない
0522デフォルトの名無しさん2007/06/15(金) 17:03:04
>>521
なるほど。。。。その通りですね。定義したらコンパイルできました。
あと、constの役割(とくにint const &iのあたりとか)が気になるのですが、
それはもうすこし自分で調べてみます。

ありがとうございました。
0523デフォルトの名無しさん2007/06/15(金) 17:10:09
>>520
いやいや。。
それにしても、C++はいろいろ複雑ですね。

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

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


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

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

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

ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。
0531デフォルトの名無しさん2007/06/15(金) 20:10:29
VC++2005expressは無料だよ
0532デフォルトの名無しさん2007/06/15(金) 20:40:21
express だな。
商用には使えないが、それはアカデミックも同じだな。
0533デフォルトの名無しさん2007/06/15(金) 21:12:36
嘘言ってはいけません。
Expressも他のEditionと同じように、
商用利用を禁止する条項はない
0534デフォルトの名無しさん2007/06/15(金) 21:27:41
VC++EEはリソースの扱いが難点だけど
それ以外は十分だな
0535デフォルトの名無しさん2007/06/15(金) 21:30:29
>>533
前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。
0536デフォルトの名無しさん2007/06/15(金) 23:32:57
アカデミックも商用可能だな。
0537デフォルトの名無しさん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:

としか出力されません。何故でしょうか?
0538デフォルトの名無しさん2007/06/16(土) 01:26:58
よく判らんけど、バッファリングされているからじゃないの?
フラッシュしたら?
0539デフォルトの名無しさん2007/06/16(土) 01:27:16
ロケールの設定
0540デフォルトの名無しさん2007/06/16(土) 01:34:54
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです

>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・
0541デフォルトの名無しさん2007/06/16(土) 01:40:59
>>540
imbue()

ただし
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
0542デフォルトの名無しさん2007/06/16(土) 01:47:35
>>541
おお!解決しました!
ありがとうございます!
0543デフォルトの名無しさん2007/06/16(土) 02:41:07
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?
0544デフォルトの名無しさん2007/06/16(土) 05:12:13
>>543
gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。
0545デフォルトの名無しさん2007/06/16(土) 05:36:40
wchar_t wfunc[sizeof __FUNCTION__];
swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);

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

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

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

って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。
0551デフォルトの名無しさん2007/06/16(土) 11:23:48
ツーか、むしろ突っ込むならここだな。
>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
0552デフォルトの名無しさん2007/06/16(土) 11:30:18
通りすがりのものだけど、>>550-551 のほうが変なこと言ってる
0553デフォルトの名無しさん2007/06/16(土) 11:38:37
知らないくせに偉そうな事を言うってのが
とてもみっともないんだよね
0554デフォルトの名無しさん2007/06/16(土) 11:41:57
あ、ちょっと違うか。
>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。
0555デフォルトの名無しさん2007/06/16(土) 11:51:44
最近Cの勉強を始めたのですが、いくつか質問したいことがあります。

講座などを見ると、Javaにできることは全部できると感じましたが、
Javaと同じようにやるのが難しいこととか、
Javaの感覚でやると間違いやすいこととか、ありますか?

それからヘッダというのはプログラム本体と同じように、
関数を定義したり、グローバルに使う変数を保持してもいいのでしょうか?

VCにはJavaのEclipseのように、打った瞬間コンパイルエラーを表示してくれたり、
3,4字打ったら当てはまる構文や変数名やクラス名を出してくれる機能はないのでしょうか?
それがないと、打ち間違いしそうです。
0556デフォルトの名無しさん2007/06/16(土) 12:03:58
すみません。6年ほど前にVC++6.0を買ったんですが、入門者だった私にはどうにも難しくて
C言語のコマンドラインプログラムを勉強した程度です(独習C)のレベルです。

それから、JavaやPHPやASP.NETのWeb系の仕事をしたりしていたんですが、最近、Win32プログラムの昔買った本とかを
読んでみると結構理解できます。自分としてはVCへの憧れが強いので、MFCとかも勉強したいとおもっているのですが
いまさらMFCを勉強しても無駄でしょうか?C++の文法的知識はあります。
0557デフォルトの名無しさん2007/06/16(土) 12:08:01
MFCをやる利点てあるかな?
全部C#でことたりね?
0558デフォルトの名無しさん2007/06/16(土) 12:10:30
>>544 >>545
ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。
0559デフォルトの名無しさん2007/06/16(土) 13:44:46
>>557
.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。

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


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

>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。
0575デフォルトの名無しさん2007/06/16(土) 17:17:10
>>573
やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?
0576デフォルトの名無しさん2007/06/16(土) 17:21:08
>>575
プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。
0577デフォルトの名無しさん2007/06/16(土) 17:21:19
プログラマになるなら最低7つは言語を習得しないとダメです。
0578デフォルトの名無しさん2007/06/16(土) 17:34:41
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について
0579デフォルトの名無しさん2007/06/16(土) 17:36:31
そもそも何を持ってマスターと言うのか?
C++0xとかまだ定まっていないというのに
0580デフォルトの名無しさん2007/06/16(土) 17:36:53
難易度高くても、C++しかできないとな。
つぶしが利かない。
0581デフォルトの名無しさん2007/06/16(土) 17:39:32
>>580
C++できたら他の言語なんて楽勝だろ。
0582デフォルトの名無しさん2007/06/16(土) 17:41:42
楽勝だったら、7つ覚えておけよw
0583デフォルトの名無しさん2007/06/16(土) 17:45:08
仕事で必要になるたびに覚えていけばいい
0584デフォルトの名無しさん2007/06/16(土) 17:46:28
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。
0585デフォルトの名無しさん2007/06/16(土) 17:47:52
いやぁ、C++からJavaはちょっと壁があるぞ。
C++言語を覚えただけじゃ、GUIもスレッドもないしな。
0586デフォルトの名無しさん2007/06/16(土) 17:49:11
さらに言うと、現状javaの案件といえば、サーバーサイドだな。
0587デフォルトの名無しさん2007/06/16(土) 17:50:03
>>585
でも逆の Java → C++ と違って挫折することはまずないだろ。
0588デフォルトの名無しさん2007/06/16(土) 17:51:10
それで挫折する人間なら、C++覚える時点で挫折するよ。
0589デフォルトの名無しさん2007/06/16(土) 17:59:05
GUI は言語の問題じゃなくてライブラリの問題だと思うが。
0590デフォルトの名無しさん2007/06/16(土) 18:00:40
言語だけのC言語ベースでイインジャネ?
設計まで絡んだら知らん。
0591デフォルトの名無しさん2007/06/16(土) 18:01:50
reinterpretって何て読むの?
ネット辞典で調べてもでてこん。
0592デフォルトの名無しさん2007/06/16(土) 18:03:55
リインタープリット
0593デフォルトの名無しさん2007/06/16(土) 18:12:53
文法だけではプログラマになれないよ。
そもそも質問主は、MFCか.Netかで迷ってるんだよ?
それでもライブラリだから論点が外れてるといえるか?
0594デフォルトの名無しさん2007/06/16(土) 18:17:30
俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね
いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ
for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ
イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ
0595デフォルトの名無しさん2007/06/16(土) 19:20:14
>>594
慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。
0596デフォルトの名無しさん2007/06/16(土) 20:22:02
俺はC++からJavaScript+HTMLをやったんだが。
C#には簡単に移行出来たな。
0597W2007/06/16(土) 20:25:34
JavaScript+HTML
0598デフォルトの名無しさん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が代入される
と言うことでいいのでしょうか?
詳しく教えてほしいです
0599デフォルトの名無しさん2007/06/16(土) 20:34:46
a = (b = (c = d))
c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
0600デフォルトの名無しさん2007/06/16(土) 20:40:25
なるほど!
わかりやすい説明をありがとうございます!!
0601デフォルトの名無しさん2007/06/16(土) 20:43:43
HTMLってプログラミング言語?
0602デフォルトの名無しさん2007/06/16(土) 20:46:19
・変数がない
・ループ、条件分岐が書けない
・関数も書けない

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

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

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

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

TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
0614デフォルトの名無しさん2007/06/16(土) 23:56:37
SQLがチューリング完全でないことは明白。
0615デフォルトの名無しさん2007/06/17(日) 00:22:00
何言ってるの?
0616デフォルトの名無しさん2007/06/17(日) 08:02:03
わからないなら調べてから聞けよ
0617デフォルトの名無しさん2007/06/17(日) 08:07:53
あ〜い、とぅいまてぇ〜ん♪
0618デフォルトの名無しさん2007/06/17(日) 09:34:26
>>602
IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ
0619デフォルトの名無しさん2007/06/17(日) 12:43:27
親クラスのprotectedな変数が、public継承した子クラスでは
publicにならずにprotectedなままなのは何故ですか?

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

publicよりもprotectedの方が強いと理解しておけばよいのでしょうか
0620デフォルトの名無しさん2007/06/17(日) 12:46:05
そう理解しておけばおk
そしてプライベートが最強と
0621デフォルトの名無しさん2007/06/17(日) 12:55:24
>>620
ありがとうございました。
そう理解しときます。
0622デフォルトの名無しさん2007/06/17(日) 14:57:34
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、
thisポインタを戻り値にしない書き方ってありますか?
0623デフォルトの名無しさん2007/06/17(日) 14:58:53
ありますよ
0624デフォルトの名無しさん2007/06/17(日) 15:01:58
それは例えばどういった書き方でしょうか?
0625デフォルトの名無しさん2007/06/17(日) 15:03:17
>>624 void operator = (...
0626デフォルトの名無しさん2007/06/17(日) 15:04:43
a = b + c + d;の処理の流れって、

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

最後に aに代入という流れで理解してよいのでしょうか?
詳しく教えてください。
0627デフォルトの名無しさん2007/06/17(日) 15:06:25
デバッグ
0628デフォルトの名無しさん2007/06/17(日) 15:06:57
デバッグする環境がありません・・・すいません。
0629デフォルトの名無しさん2007/06/17(日) 15:09:12
>>625
マジサンキュー
課題が終わった
0630デフォルトの名無しさん2007/06/17(日) 15:10:36
>>626
その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。
0631デフォルトの名無しさん2007/06/17(日) 15:13:46
いや待て、a = b + (c + d)という解釈をしているかも知らん。
0632デフォルトの名無しさん2007/06/17(日) 15:28:39
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから
b+cが先だろ
0633デフォルトの名無しさん2007/06/17(日) 16:40:39
>>630
しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。
0634デフォルトの名無しさん2007/06/17(日) 16:56:56
>>633
コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
0635デフォルトの名無しさん2007/06/17(日) 17:08:24
???
誰もそんな事言ってないぞ?
0636デフォルトの名無しさん2007/06/17(日) 17:14:59
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。
0637デフォルトの名無しさん2007/06/17(日) 18:18:51
a = b() + c() + d();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん
0706デフォルトの名無しさん2007/06/18(月) 02:57:53
必要ならって言うか、必須なんだぜ。
0707デフォルトの名無しさん2007/06/18(月) 03:02:02
>>706
いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?
0708デフォルトの名無しさん2007/06/18(月) 03:06:34
>>699 だと式のつもりが文になってしまうね。
0709デフォルトの名無しさん2007/06/18(月) 03:10:09
ちょっと相談です。
言語はCでもC++でも構いません。
ちなみに開発環境はWin2000+VisualStudio2005です。

DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。
この関数は、処理結果を文字列として str に返してくれます。
strに渡される文字列の長さは *不明* です。
DLL、および関数Funcの中身を弄ることは出来ないものとします。

この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。
0710デフォルトの名無しさん2007/06/18(月) 03:18:04
>>708
これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy
0711デフォルトの名無しさん2007/06/18(月) 03:18:48
>>709
static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。
0712デフォルトの名無しさん2007/06/18(月) 03:19:32
>>709
Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです

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

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

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

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

そりゃDLLの設計が糞としか言いようがないが…
0717デフォルトの名無しさん2007/06/18(月) 09:45:43
gets を安全に使うにはどうすればいいですか?
っていう質問と一緒だね。残念ながら無理だ。
0718デフォルトの名無しさん2007/06/18(月) 10:59:41
仕様上から決まる例で32bit整数が最大値だとわかれば
常にその大きさの配列渡せば安心、かな
0719デフォルトの名無しさん2007/06/18(月) 11:10:29
メモリ使い切って落ちるに1票
0720デフォルトの名無しさん2007/06/18(月) 11:12:45
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ?
それにしても 32bit 最大値はやりすぎだろうけど。
0721デフォルトの名無しさん2007/06/18(月) 11:50:56
パイプとかその辺のOSの用意したプロセス間通信機能でどうにかするしかないんじゃね?
0722デフォルトの名無しさん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指定で継承すると、引数のない
コンストラクタを呼ぶというルールなのでしょうか?
0723デフォルトの名無しさん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;
}
そのようですね
なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです
0724デフォルトの名無しさん2007/06/18(月) 14:53:20
>>722
>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;
07257092007/06/18(月) 15:00:50
>716
一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。
0726デフォルトの名無しさん2007/06/18(月) 15:21:26
>>725
>一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
>3000とか4000とか飛んでるのを何度か見たことはありますが。

そりゃーDLLが糞でFAじゃね?
もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。
仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。
仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。

まぁがんがれw
0727デフォルトの名無しさん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)が落ちます(汗
どうすればこの動作を実現できるんでしょうか?
0728デフォルトの名無しさん2007/06/18(月) 18:09:09
自己解決しました
bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗
0729デフォルトの名無しさん2007/06/18(月) 19:34:13
>>722
class sub3 : public sub1, public sub2
{
  sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
0730デフォルトの名無しさん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なグローバルの定数はヘッダなので避けたいです。
0731デフォルトの名無しさん2007/06/18(月) 20:48:52
元々汚いんだからエレガントなんて求めなくて良い
0732デフォルトの名無しさん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って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?
0733デフォルトの名無しさん2007/06/18(月) 20:53:19
>>731
では、その元々汚いものを綺麗にする方法を教えてください。
0734デフォルトの名無しさん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;
  //...
};
0735デフォルトの名無しさん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

0736デフォルトの名無しさん2007/06/18(月) 21:14:01
なぜに&
0737デフォルトの名無しさん2007/06/18(月) 21:15:51
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」
0738デフォルトの名無しさん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がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。
07397302007/06/18(月) 21:18:19
あ、私は730で>>734さんに対してのコメントです
0740デフォルトの名無しさん2007/06/18(月) 21:20:20
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。
0741デフォルトの名無しさん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。
0742デフォルトの名無しさん2007/06/18(月) 21:27:19
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。
0743デフォルトの名無しさん2007/06/18(月) 21:44:32
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど
0744デフォルトの名無しさん2007/06/18(月) 21:49:54
>>741
理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。
0745デフォルトの名無しさん2007/06/18(月) 21:51:47
>>736
頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。

>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。

>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。


>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。

07467302007/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がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも
0747594デフォルトの名無しさん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
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。
0748デフォルトの名無しさん2007/06/18(月) 21:58:46
>>745
とりあえずグダグダうるせえ。


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

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

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

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?
0764デフォルトの名無しさん2007/06/19(火) 08:56:28
>>761
全部省略できるのは C++ だけ。
0765デフォルトの名無しさん2007/06/19(火) 09:59:42
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。
0766デフォルトの名無しさん2007/06/19(火) 10:21:17
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。
07677602007/06/19(火) 11:07:01
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。
07687662007/06/19(火) 12:48:11
解決しますた
0769デフォルトの名無しさん2007/06/19(火) 12:57:26
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。
0770デフォルトの名無しさん2007/06/19(火) 13:01:28
>>769
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。
0771デフォルトの名無しさん2007/06/19(火) 13:10:27
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>

int main(){
printf("今現在BMPの画像");
return 0;
}
0772デフォルトの名無しさん2007/06/19(火) 13:11:07
どうせWindowsだろ
猫でも読んどけ
0773デフォルトの名無しさん2007/06/19(火) 13:47:09
丸投げは宿題スレ以外はだめ
今どこまで理解しててどこら辺がわからないのか書け
0774デフォルトの名無しさん2007/06/19(火) 14:38:22
>>729
ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)

0775デフォルトの名無しさん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;
}
0776デフォルトの名無しさん2007/06/19(火) 14:49:43
win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり
win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか?
また、両者の使い分け基準って何かあるのですか?
たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか
0777デフォルトの名無しさん2007/06/19(火) 14:56:41
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?
0778デフォルトの名無しさん2007/06/19(火) 16:30:34
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています
0779デフォルトの名無しさん2007/06/19(火) 16:40:49
try catchじゃ例外は出せない
0780デフォルトの名無しさん2007/06/19(火) 16:42:51
tryの中でcatchに飛ばす方法を教えてください
0781デフォルトの名無しさん2007/06/19(火) 16:48:03
「C++ 例外」でググれ
0782デフォルトの名無しさん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;
}
0783デフォルトの名無しさん2007/06/19(火) 17:24:35
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1
0784デフォルトの名無しさん2007/06/19(火) 17:35:43
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。
07857832007/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;
}
0786デフォルトの名無しさん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;
}

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

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

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

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

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

(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。
0812デフォルトの名無しさん2007/06/20(水) 19:29:47
(1)のところには、余計なカンマが付いている
(2)の最初の箇所は、余計な*が付いている
2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ
0813デフォルトの名無しさん2007/06/20(水) 19:31:34
(1)で*付ける意味も分からんし

nextStone = groupHead = nextGroup = 0;

とか
0814デフォルトの名無しさん2007/06/20(水) 19:33:43
すみません、質問させてください。

void foo(const char *const& hoge);

のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします
0815デフォルトの名無しさん2007/06/20(水) 19:42:09
constな(C++の)参照

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

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

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

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

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

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

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

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

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

これすると値辺になる気がするのですが
0832デフォルトの名無しさん2007/06/21(木) 13:05:29
つーかそれ、
8で割った後に64で割った余りを求めてる事になるが
0833デフォルトの名無しさん2007/06/21(木) 13:14:49
あっそ、よかったね
0834デフォルトの名無しさん2007/06/21(木) 14:30:08
よくないという話だな
0835デフォルトの名無しさん2007/06/21(木) 14:54:13
>>826
10進数で下6桁残して上の桁を0にしたら
それは100万 (10^6) で割った余りになる。

それと同じように、0x3F で AND とると
(=2進数の下6ビットを残して上のビットをクリア)
64 (2^6) で割った余りになるわさ。
0836ひろみつ2007/06/21(木) 16:29:58
Cって何言語で一版最初書かれたの?今のC言語はCで書かれてるとかいうのはなしね。

K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?
0837デフォルトの名無しさん2007/06/21(木) 16:33:43
ひろみつ死ね
0838デフォルトの名無しさん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でも大丈夫ですか?
0839デフォルトの名無しさん2007/06/21(木) 17:10:28
>>838
QuickC……

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

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


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

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

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

0862デフォルトの名無しさん2007/06/22(金) 13:30:14
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。
C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。
0863デフォルトの名無しさん2007/06/22(金) 13:30:39
>>861
絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。
08648612007/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
0865デフォルトの名無しさん2007/06/22(金) 13:40:26
力抜けよ
0866デフォルトの名無しさん2007/06/22(金) 13:56:17
そう、もっと・・・力を抜いてごらん・・・。
0867デフォルトの名無しさん2007/06/22(金) 13:59:44
for (;;) { >>865 >>867 >>866 }
0868デフォルトの名無しさん2007/06/22(金) 14:02:50
5→6→4じゃね?
0869デフォルトの名無しさん2007/06/22(金) 14:27:56
C++では変数の宣言をどこにでも置けると聞いたのですが、
goto文で変数の宣言を飛ばすことはできないのですか?
以下の文をコンパイルできません。

int main() {
goto end;
int a = 100;
end:
return 0;
}
0870デフォルトの名無しさん2007/06/22(金) 14:38:20
>>869
何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。
0871デフォルトの名無しさん2007/06/22(金) 15:43:43
つまり、gotoで分岐する範囲では宣言できないということだ。
0872デフォルトの名無しさん2007/06/22(金) 15:46:05
switch - case で、caseで宣言できないのと同じだな
0873デフォルトの名無しさん2007/06/22(金) 16:18:11
最初に格納する数値を入力して、
以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
fgetsとstrtolを使うといけそうな気がするのですが
頑張ったものの自分ではどうにもならない状況ですorz

【実行画面】
個数を入力したください>>5
5a11bbb7
88yew99

数値1:5
数値2:11
数値3:7
数値4:88
数値5:99
0874デフォルトの名無しさん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() + "です";
みたいに使いたいのですが、これはエラーがでます。
0875デフォルトの名無しさん2007/06/22(金) 17:01:09
boost::lexical_castなどはどうだろう
08768742007/06/22(金) 17:10:29
>>875
おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。
0877デフォルトの名無しさん2007/06/22(金) 17:20:04
>>873
一文字ずつアスキーコードで比較して行けばいいのでは?
0878デフォルトの名無しさん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;
}
0879デフォルトの名無しさん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);
こんな感じでずらしていく感じにするのでしょうか?
0880デフォルトの名無しさん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;
}
0881デフォルトの名無しさん2007/06/22(金) 18:25:06
>>880
おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!
0882デフォルトの名無しさん2007/06/22(金) 19:30:17
突然すみません。質問させていただきます
自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。
0883デフォルトの名無しさん2007/06/22(金) 19:35:30
分割コンパイルで検索
0884デフォルトの名無しさん2007/06/22(金) 19:43:54
解凍したディレクトリで、./configure か、counfigure.bat したあと、make か nmake
0885たろう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 が決定しないので、
なんとなくその中の引数の評価が後のような気がしますが。
0886じろう2007/06/22(金) 22:12:25
やあ、たろう
この勝負は俺がもらった
約束通りお婆ちゃんの貞操は頂いて逝くぜ
0887デフォルトの名無しさん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++が二つある場合の評価順序は不定と言うことで。
0888デフォルトの名無しさん2007/06/22(金) 23:27:23
>885
プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ

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

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

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

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

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

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

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

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

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

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

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。
0924デフォルトの名無しさん2007/06/24(日) 17:28:14
これですか?

http://www5e.biglobe.ne.jp/~me-jin_k/
0925デフォルトの名無しさん2007/06/24(日) 17:30:07
早速ダウンロードしました
0926デフォルトの名無しさん2007/06/24(日) 17:33:48
ないのならないで結構です。
0927デフォルトの名無しさん2007/06/24(日) 18:24:12
>>923
半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう

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

g++です。
三目並べのゲームを作ります。
show_stateがばぐります。どこがおかしいか教えてください
0931デフォルトの名無しさん2007/06/24(日) 19:34:07
こんなのコンパイルとおるんだな。
0932デフォルトの名無しさん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ではだめかと。
0933ちんこ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のクラスです)
とかです。オブジェクト指向的に考えて適切ですか?

うまい人ならどういうクラスを考えるんでしょうか。
0934ちんこ2007/06/24(日) 20:35:34
これが出来たら9*9盤くらいで5目並べをしてみたいです。
最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。
0935デフォルトの名無しさん2007/06/24(日) 20:38:40
>3通りを表現するのに一番適したデータ型はなんですか?
boost::triboolってのがある
これはtrue, false, indeterminateの3値を表現できる
これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定
とでも使えばちょうど良いんじゃないかな
0936デフォルトの名無しさん2007/06/24(日) 20:39:14
>>933
intでもメモリには大差なくね?
ってより、intのほうが高速になる可能性を秘めていると思うが・・・
あくまでも可能性だけど
0937ちんこ2007/06/24(日) 20:53:33
>>935
不定か、なんか怪しいデータ型ですね。
>>936
intの方が高速になる理由は?
intって4byteですよね、boolがダメならcharかなと思っています
0938デフォルトの名無しさん2007/06/24(日) 20:55:37
ちんこあほすぎでわろたw
0939デフォルトの名無しさん2007/06/24(日) 20:58:59
ちょっとすれ違いですが、
eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?
0940デフォルトの名無しさん2007/06/24(日) 21:02:43
>>939
あります。スレ違いなので詳細は割愛。

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

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

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

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

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

昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw
0953ちんこ2007/06/24(日) 21:58:57
Playerクラスとかいるか・・・?
でもないとオブジェクト指向っぽくないよなぁ・・
0954デフォルトの名無しさん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/

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

【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/
0976デフォルトの名無しさん2007/06/25(月) 12:03:14
乙
0977デフォルトの名無しさん2007/06/25(月) 22:36:14
VisualC++2005です。switch文で以下のように下にcaseが続くと変数の宣言と同時に初期化できません。
これは何故でしょうか?
case 1:
 int i=1;//int i; i=1;ならOK
 break;
case 2:
 break;
0978デフォルトの名無しさん2007/06/25(月) 22:38:42
case 1 に飛んだ場合はいいけど、
case 2 に飛んだ場合は i が使えるのに
初期化の位置を飛ばしてしまう。
だから、そういうことはできないようになってる。

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

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

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