【初心者歓迎】C/C++室 Ver.38【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.38【環境依存OK】 - 暇つぶし2ch2:デフォルトの名無しさん
07/06/03 22:35:41


3:デフォルトの名無しさん
07/06/03 22:57:43
3ならC++は廃れる。

4:デフォルトの名無しさん
07/06/03 22:59:14
殺す

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

6:デフォルトの名無しさん
07/06/03 23:01:44
おいおい
ここはいつからネタスレになったんだ

7:2
07/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
URLリンク(www.gundam00.net)

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

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

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

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

12:9
07/06/04 00:29:40
>>10-11
ありがとうございます。できるだけ前者を使う事にします。

13:デフォルトの名無しさん
07/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、:|:::ト、:!ヾ㌢´::::ヾ`       ゙t._''''ゲ'゙ ! jN 〈〈  ヽ.ヽ
                |! !:トN:::l::l:トィf{!; :;;;;rう          ̄   j,.イ! トi、ヽ\ ) 〉
              | ∧!:l:ト:ト:ljヘ ` `=‐''´             ,小:i:. l |::、 )_)`'"
             /〃X! /人ーヘ        `_       /i.:.li:|::. l l::i
            / // .::::;イ' アー:ヽ、      ‘ー’   ,イ|::i :.i::ト、::| |::!
            /,イ// .::;ィ' j  j/| : :i::|in、_         / |:l::i.:.:i:| }::! |:|
           / / / j .::/l | / / ,! : :i:::li:j::|:「フi ‐ -  '′ |:|::i:.:.i:| j:;! !|
       〃  l / | :/ !l/ ,イ{,/_:_::l:::j⊥'-'"j     ・∵!|:j:::// //  |l

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

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

というエラーが出ます。

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

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

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

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

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

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

19:デフォルトの名無しさん
07/06/04 10:30:28
いつでも

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

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

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

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

22:デフォルトの名無しさん
07/06/04 13:26:46
>>20
AoSよりSoAを使え。


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

24:デフォルトの名無しさん
07/06/04 13:29:38
>>22
パフォーマンスを気にするようなレベルじゃないならAoSでいいんでね?
どうせ100台分だってことだし。

25:20
07/06/04 13:45:11
回答ありがとうございました、助かりました。
また質問で悪いんですけども、下のように2種類のファイルを呼んだんですけども
二個目のexample2の部分でエラーがでてしまいます。
何が悪いんでしょうか?

#include<fstream>

int main(){
ifstream fin("sample1.txt"); /* 入力ファイルストリーム 宣言 */
fin >> x;
fin >> y; /* 読み込み */
cout << x << ' ' << y << endl; /* 表示 */
fin.close(); /* 読み込み終了 */

ifstream fin("sample2.txt"); /* 入力ファイルストリーム 宣言 */
fin >> a;
fin >> b; /* 読み込み */
cout << x << ' ' << y << endl; /* 表示 */
fin.close(); /* 読み込み終了 */

return 0;
}


26:デフォルトの名無しさん
07/06/04 13:48:34
コンパイルエラー出まクリスティ

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

28:20
07/06/04 13:54:52
二種類のファイルを呼ぶには、どうしたらいいのでしょうか・・・

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

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


31:デフォルトの名無しさん
07/06/04 14:30:56
そうですか。

32:デフォルトの名無しさん
07/06/04 14:55:06
そうですね。

33:デフォルトの名無しさん
07/06/04 15:17:32
そうですく。
そうですれ。

34:デフォルトの名無しさん
07/06/04 15:28:45
>>31-33金くれ

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

36:デフォルトの名無しさん
07/06/05 00:51:23
>>9
遅レスなんだが、みんな{0}初期化なの?

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

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

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

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

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




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

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

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

ソース内
XXX_STR strValue;
strValue = INIT_TABLE

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


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

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

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

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

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

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


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

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

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

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

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

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

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

50:49
07/06/05 03:06:39
ここ初心者対象スレだったね。
組み込みの話題は別にします。

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

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

52:デフォルトの名無しさん
07/06/05 03:21:23
>>51
URLリンク(www1.coralnet.or.jp)

53:デフォルトの名無しさん
07/06/05 03:25:23
>>51
 ちょっと行ってみる。ありがとう。

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

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

55:51
07/06/05 03:35:07
>>52
 だった・・

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

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

57:51
07/06/05 03:45:42
>>56
夜中に申し訳ない!

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

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

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

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


60:デフォルトの名無しさん
07/06/05 04:30:00
連結リストを利用したプログラムを作ったんですがうまくいきません
ソース URLリンク(kansai2channeler.hp.infoseek.co.jp)
コンパイラ BCC5.5

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

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

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

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

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

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

66:デフォルトの名無しさん
07/06/05 07:46:12
>>64-65
startPtr + 9で問題ないだろ

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

68:デフォルトの名無しさん
07/06/05 08:30:08
C99だと思えば、ってBCCはC99非対応だけどね

69:デフォルトの名無しさん
07/06/05 13:23:44
>>65
???
chはchar型でそのポインタにintサイズ書き込んだら近くのメモリ壊すのは当たり前だと思うが
まぁ言葉足らずとかのレベルで間違いとも言い切れないな

あとどうでもいいことだが
(startPtr+9)->
って書くよりは
startPtr[9].
のほうがスマートでわかりやすい気がする

さらに言わせてもらえば
startPtrは他の変数にコピーしといて
for(int c=0;c<10;c++;startPtr++){
printf("%d個目の文字を入力してください:",c+1);
scanf("%d",&(startPtr->data));
startPtr->nextPtr=startPtr+1; // ++startPtrにして上のstartPtr++無くしてもいいんだが
}
startPtr->nextPtr=NULL;
でとっといた startPtr のコピーを戻してやればスマートじゃないかと


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


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

72:デフォルトの名無しさん
07/06/05 13:40:54
てんで話にならない。

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

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

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

76:デフォルトの名無しさん
07/06/05 22:00:29
フローチャートを勉強してるの?

77:デフォルトの名無しさん
07/06/05 22:00:50
>>75
擬似でいいからアセンブラ

78:デフォルトの名無しさん
07/06/05 22:04:44
分かりました、専ブラに挑戦してみます。

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

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

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

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

82:デフォルトの名無しさん
07/06/05 22:19:09
>>75
宿題スレで宿題解くのオススメ

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

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

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

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

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


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

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



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

91:デフォルトの名無しさん
07/06/05 23:08:45
>>88
紙とペンさえあれば勉強できる

>>90
C言語で解け

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

93:デフォルトの名無しさん
07/06/05 23:19:30
やべぇ俺頭いいのか

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

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

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

96:デフォルトの名無しさん
07/06/05 23:39:25
じゃあnasmとかどうでしょ?

97:デフォルトの名無しさん
07/06/05 23:40:24
>>95
はいはいかわいい子犬ちゃん

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

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

100:デフォルトの名無しさん
07/06/05 23:50:21
VisualSutudioの環境が重ければPC買い換えればいい

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

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

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

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


103:デフォルトの名無しさん
07/06/06 00:46:43
プログラムの勉強なら環境はなんだっていいだろ

104:デフォルトの名無しさん
07/06/06 00:51:27
いいだろ

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

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

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

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


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

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

108:デフォルトの名無しさん
07/06/06 02:56:46
値段は(学割だけだけど)凄まじいダンピング始めたからなぁ
Visual C++ は単品で持ってたけど、VSのあの安さなら買っちゃうって

109:デフォルトの名無しさん
07/06/06 04:25:45
VC++.net2003でmain.cpp, Sphere.hとSphere.cppとファイルを分割しました
Sphere.hにint Collide( Sphere, Sphere )という関数を定義して, Sphere.cppで実装しました
このint Collide( Sphere, Sphere )をinline関数にしたいのですが、上手く行きません
.h, .cppのどちらにもinlineを書く, どちらか一方に書く場合と試しましたが上手く行きません
どちらにもつけない場合は上手く行きます
どうすればinline関数にできるでしょうか?無理なのでしょうか?
よろしくお願いします


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

111:109
07/06/06 04:36:03
内部リンケージで調べたら分かりました
ありがとうございました

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

113:デフォルトの名無しさん
07/06/06 04:56:48
>>110
inline 関数はヘッダに書くもんだろw

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

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

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

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

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

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

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

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

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

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

124:デフォルトの名無しさん
07/06/06 07:47:01
内部、だ。

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

126:デフォルトの名無しさん
07/06/06 08:03:10
>>125
なるほど。 inline は関係あるな。

7.1.2p4 より
"An inline function shall be defined in every translation unit in which it is used and
shall have exactly the same definition in every case."

inline 関数は使われるソースごとに定義が必要になるってことらしい。
エラーになるのはこのルールに違反するからであって、リンケージは
関係ない。

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

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

129:デフォルトの名無しさん
07/06/06 08:20:18
( ゚д゚)ポカーン

130:デフォルトの名無しさん
07/06/06 08:21:37
分割コンパイルを使わないとC++の意味が・・・・・

131:デフォルトの名無しさん
07/06/06 19:15:39
getchar(c);

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


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

132:デフォルトの名無しさん
07/06/06 19:18:36
c - '0' は普通数字を 0 ~ 9 の数値に変換するときに使うけど

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

134:デフォルトの名無しさん
07/06/06 19:50:11
ABIとか、Implementation Specificな話は規格には載らないんじゃないの

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

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

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

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

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


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

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

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

138:デフォルトの名無しさん
07/06/06 20:14:38
下手な例えだな

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

140:1/2
07/06/06 20:51:48
#include <stdio.h>
int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}

141:2/2
07/06/06 20:52:58
#include <stdio.h>
int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}

142:2/2
07/06/06 20:53:38
上記のプログラムを作ったのですがコンパイルして実行すると
「演算子を入力してください」
でプログラムが終了してしまいます。
何故でしょうか?
環境はcygwinです。

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

144:142
07/06/06 21:09:30
>>143
"改行文字を読み込んでいる"、とはどういうことでしょうか?

145:デフォルトの名無しさん
07/06/06 21:22:48
scanf で数値の後にいれた改行が stdin のバッファに残っている
getchar でバッファに残った改行文字が取り出される

とりあえず

scanf("%d %d", &a, &b);

scanf("%d %d%*[\n]", &a, &b);

または

scanf("%d %d", &a, &b);

scanf("%d %d", &a, &b);
while(getchar()!='\n');

としてみては?

146:142
07/06/06 21:29:59
>>145
無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。

147:デフォルトの名無しさん
07/06/06 23:46:17
Google Booksすげーな。言語の本無料でみれんじゃん

148:デフォルトの名無しさん
07/06/06 23:57:06
>>147
それって、前にTVでやっていた著作権切れの本を公開する奴?

149:デフォルトの名無しさん
07/06/07 06:26:40
NULLが0でない環境が存在するのと同様に、
0がぬるぽじゃない環境ってのもあるんでしょうか?

150:デフォルトの名無しさん
07/06/07 06:28:41
0がぬるぽでない環境が存在するのと同様に、
NULLが0じゃない環境ってのもあるんでしょうか?

151:デフォルトの名無しさん
07/06/07 06:49:24
トートロってんじゃねぇよって事ですか
よく考えると自分も質問の意図を把握できてないのに気づいたので取り下げます

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

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

154:デフォルトの名無しさん
07/06/07 09:57:54
自分の読解力の無さを人の文章力のせいにするな

155:デフォルトの名無しさん
07/06/07 10:10:02
確かに隙が多かったな。

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

これは、

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

という風な意味。

156:デフォルトの名無しさん
07/06/07 10:13:43
自分の文章力の無さを人の読解力のせいにするな

157:デフォルトの名無しさん
07/06/07 10:18:00
コピペうざす

158:デフォルトの名無しさん
07/06/07 10:25:38
自分のうざさを人のうざさのせいにするな

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

160:デフォルトの名無しさん
07/06/07 10:54:04
何もかもみんなお前のせいだ

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

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

163:デフォルトの名無しさん
07/06/07 14:42:07
>>162
その原因の行も書いてよ。

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

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

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

166:デフォルトの名無しさん
07/06/07 15:18:12
161です。レスありがとうございました。自己解決しました。
if(FALSE)break;
struct st* a;
get(&a);
free(a);
だとコンパイルできなくて
struct st* a;
if(FALSE)break;
get(&a);
free(a);
だと実行時エラー。
struct st* a = NULL;
if(FALSE)break;
get(&a);
free(a);
で解決しました。C言語に慣れておらずいまいち理解できないので
すごく変な勘違いしてそうですね…。

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

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

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

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

171:デフォルトの名無しさん
07/06/07 15:38:09
そうかごめん
試しにそうしたら確かに通っちゃったよ…

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

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

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

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

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

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

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

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

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

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

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

179:デフォルトの名無しさん
07/06/07 18:51:14
system関数

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

181:178
07/06/07 18:54:29
>>179
ありがとうございます。
ちょっとやってみます。

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

183:デフォルトの名無しさん
07/06/07 19:23:49
>>182
URLリンク(www.linux.or.jp)
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)

184:デフォルトの名無しさん
07/06/07 19:26:23
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん


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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>188
(´・ω・`)

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

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

193:デフォルトの名無しさん
07/06/07 20:23:51
マクロなんだから予約語も糞もないだろ

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

とかできるんだぜ。

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

#define public public:

としたとして、

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

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

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

196:デフォルトの名無しさん
07/06/07 20:29:41
>>192
あほすぎw

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

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

198:デフォルトの名無しさん
07/06/07 20:41:40
ふるっ

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

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

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

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

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

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

205:178
07/06/07 23:43:26
>>178です。とりあえずサンプルってことで
system("cd c:\\java");
system("java HelloWorld");
で実行したみたのですが、
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
と出てしまいます。普通にコマンドプロンプトでcd c:\javaとjava HelloWorldを打ち込んだときは
正常に動作するのですが、何かsystemでやるときに特別に何かしなければいけない事があるのでしょうか?

206:178
07/06/07 23:49:32
というよりも、system("cd c:\\java");のあとに
system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・

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

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

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

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

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

212:デフォルトの名無しさん
07/06/08 00:21:01
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?

213:デフォルトの名無しさん
07/06/08 09:35:51
>>212
普通はそれを最初にやるわな

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

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

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

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

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

218:178
07/06/08 12:19:35
>>211
system("cd c:\\java; java HelloWorld");
だと、指定されたパスが見つかりませんと出ます。
system("java c:/java/HelloWordl");
だと、Exception in thread "main" java.lang.NoClassDefFoundError: c:/java/HelloWorld
う~ん・・・

219:178
07/06/08 12:23:46
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class");
などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;

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

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

222:デフォルトの名無しさん
07/06/08 12:48:21
まさかとは思うが、Dドライブで作業してたりして。

223:デフォルトの名無しさん
07/06/08 12:49:32
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA");

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

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

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

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

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

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

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

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

229:デフォルトの名無しさん
07/06/08 14:00:32
日本にもう一人いるのか、本人なのか。

URLリンク(www.google.co.jp)


230:178
07/06/08 14:04:28
>>228
あ、大丈夫です。ちゃんと半角スペース入れています。

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

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

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

232:178
07/06/08 14:18:29
>>231
ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。

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

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

235:178
07/06/08 15:16:42
>>233
そういう次元でもないような・・・。

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


236:デフォルトの名無しさん
07/06/08 15:18:42
>>233の皮肉に気づけよ

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


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

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

239:デフォルトの名無しさん
07/06/08 15:32:32
strncpy()は鬼門。積極的に使う理由がないなら、sprintf()を使え。

240:デフォルトの名無しさん
07/06/08 17:32:11
したのようなプログラムで、今調べている位置を出力するにはどうしたら良いですか?
printf("%d\n", Fd)としたら値が変化しません・・・


struct ffblk Fd;
findfirst("*", &Fd, 55);
do {
printf("%s\n", Fd.ff_name);
}
while(!findnext(&Fd));

241:デフォルトの名無しさん
07/06/08 17:45:49
>>240
何も分からない

242:デフォルトの名無しさん
07/06/08 17:48:57
>>241
再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです

243:デフォルトの名無しさん
07/06/08 17:50:47
A_dir
B_dir
C_dir
というディレクトリがあったとき、B_dirを調べ終わったとき
次にC_dirを検索するにはどのデータを保存しておけば良いんですか??


244:デフォルトの名無しさん
07/06/08 17:59:58
>>243
関数を再帰的に書けば良いじゃん

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

246:デフォルトの名無しさん
07/06/08 18:07:08
何故?

247:デフォルトの名無しさん
07/06/08 18:09:33
Fdを保存しておけばいい

248:デフォルトの名無しさん
07/06/08 18:10:05
末尾再帰型で書いてからループ化すれば?
URLリンク(ja.wikipedia.org)

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

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

250:デフォルトの名無しさん
07/06/08 18:19:05
struct ffblk[MAX_DIR_DEPTH];

251:デフォルトの名無しさん
07/06/08 18:19:21
再帰が不安定とは……

252:デフォルトの名無しさん
07/06/08 18:21:44
普通にスタックに積めばいいじゃん。

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

254:デフォルトの名無しさん
07/06/08 18:28:29
何が「再帰は不安定になるんですよ」だよ馬鹿もんが

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

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


フォルダサイズ調査  『 D-Usage.exe 』
URLリンク(hp.vector.co.jp)

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

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

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

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

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


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

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

264:249
07/06/08 18:46:10
複数の方が早いですよ

複数スレッド
D-Usage. 36s
URLリンク(hp.vector.co.jp)

単一スレッド
VCDCASE 45s
URLリンク(www.hi-ho.ne.jp)

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

266:257
07/06/08 18:49:52
>>264
どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい

267:デフォルトの名無しさん
07/06/08 18:50:33
>>264
>263

268:デフォルトの名無しさん
07/06/08 18:54:11
スレッド1個でも動くものができないのに

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

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

270:デフォルトの名無しさん
07/06/08 19:09:05
>>265
できます

271:デフォルトの名無しさん
07/06/08 20:52:54
>>249
A_dir
 - file1
 - file2
B_dir
 - file3

とあった場合に欲しい結果は以下のどっち?
1) A_dir B_dir
2) A_dir file1 file2 B_dir file3

1)ならFdを保存すればOK。

272:デフォルトの名無しさん
07/06/09 01:52:08
windows環境でTCHARに対応した標準出力へのiostreamを使いわけるようにしたいわけですが
#ifdef UNICODE
#define tcout wcout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
#ifdef _MBCS
#define tcout cout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
のようにtc*を定義するのは良くないんでしょうか?
もしそうであるならば、大体案としてはどのようなものがありますか?

273:デフォルトの名無しさん
07/06/09 01:55:20
大体案は代替案のtypoですorz

274:デフォルトの名無しさん
07/06/09 01:56:39
#ifdef _UNICODE
iostream& tcin = cin;
(ry

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

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

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

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

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

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

#ifdef UNICODE
  #ifdef _MBCS
    #error define either only UNICODE or _MBCS.
  #else
    std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::wcout;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::wcerr;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::wclog;
  #endif
#else
  #ifdef _MBCS
    std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::cin;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::cout;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::cerr;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::clog;
  #else
    #error define either only UNICODE or _MBCS.
  #endif
#endif

軽く使っただけなんで不具合は分かりませんが、
iostreamやiosfwdでの定義から考えればこれでいけそうに思えます。
_INC_TCHARの定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが

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

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

282:534
07/06/09 03:49:25
>>280
これ使ってください><
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i = 0;
size_t len;

len = strlen(argv[0]);
while (i < len) {
printf("argv[0][%d]:%c\n", len-i, argv[0][len-i]);
if (argv[0][len-i] == '\\')
break;
++i;
}
if (dest_sz < len-i +2)
return -1;
strncpy(dest, argv[0], len-i+1);
dest[len-i+1] = '\0';
return 0;
}
argvはmain(int argc, char* argv[])のargvで
destは出力先の文字列の先頭ポインタ
dest_szはsizeof(dest)です><
ちなみにこれC++のSTL使うと4行程でできちゃいます><

283:534
07/06/09 04:20:39
改良しました><
// コマンドライン引数配列から実行されたディレクトリを取得する
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;

i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}

if (dest_sz < i +2 || i == 0)
return -1;

strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return (int)i;
}

284:デフォルトの名無しさん
07/06/09 04:36:26
>>281
そんなアプリケーション見たことねえw

285:534
07/06/09 04:48:38
まだ直すところありました(^^
// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;

i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}

if (dest_sz < i +1 || i == 0)
return -1;

strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return i;
}

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

287:534
07/06/09 06:31:11
詳しく^^

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

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

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

291:534
07/06/09 08:06:37
これでどうでしょう?
もうWindows特化ですが(というかUNIXの実行環境が無い(´・ω・`) )

// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(TCHAR* dest, size_t dest_sz) {
_locale_t loc;
size_t len;

// 実行ファイルのフルパスを取得
TCHAR fullpath[4096];
GetModuleFileName(NULL, fullpath, sizeof(fullpath));

// ロケール設定
loc =_create_locale(LC_CTYPE, "japanese");

// 最後の\を見つけて、コピー範囲[fullpath,len)が適用できるようなlenを生成
TCHAR* last_slash = _tcsrchr(fullpath, '\\');
len = last_slash - fullpath +1;

// 出力先の容量が不足ならエラーで-1を返す
if (len-1 == 0 || dest_sz < len) {
if (dest_sz > 0)
dest[0] = '\0';
return -1;
}

// コピーして終端に0
_tcsncpy_l(dest, fullpath, len, loc);
dest[len] = '\0';
return len-1;
}

292:デフォルトの名無しさん
07/06/09 08:17:05
>>289
その周辺を晒してくれないとなんとも言えないのだが。

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

294:デフォルトの名無しさん
07/06/09 09:21:55
1.sizeof(fullpath) → sizeof fullpath / sizeof *fullpath
2._tcsrchr(fullpath, '\\')→ _T('\\')
3._tcsrchr(fullpath, '\\') _UNICDEかMBCSが定義されてないとShift-JISは問題起こす(たぶん)
4.dest[0] = '\0'→_T('\0')
5.return -1→return static_cast<size_t>(-1)とか

↓ これで我慢しろ。(UNCパスだと問題あるかも)
std::basic_string<TCHAR> getExePath()
{
TCHAR exe_path[MAX_PATH];
DWORD r = ::GetModuleFileName(NULL, exe_path, sizeof exe_path / sizeof *exe_path);
if( r == 0 || r == sizeof exe_path / sizeof *exe_path )
throw std::runtime_error("うぎゃあ");

TCHAR drive[_MAX_DRIVE], path[_MAX_PATH];
_tsplitpath(exe_path, drive, path, NULL, NULL);

return std::basic_string<TCHAR>(drive) + path;
}

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

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

違ってたらごめん

297:デフォルトの名無しさん
07/06/09 10:05:43
>>296
嘘つくな。氏ね

298:デフォルトの名無しさん
07/06/09 10:46:05
>>297
URLリンク(msdn2.microsoft.com)
> The size of the lpFilename buffer, in TCHARs.
だから>>296であってる

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

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

301:デフォルトの名無しさん
07/06/09 18:05:51
>>299
コンパイルできるのは一つだけしかないだろ?

302:デフォルトの名無しさん
07/06/09 18:16:44
>>299
int* func();

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

304:デフォルトの名無しさん
07/06/10 00:26:59
ちょっと相談。

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

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

305:デフォルトの名無しさん
07/06/10 00:30:56
csvってRFCできてなかったっけ

306:304
07/06/10 00:59:15
RFCあるのか……ありがとう、ちょっと探してみる

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

308:デフォルトの名無しさん
07/06/10 02:44:07
>>307 まず服を脱ぎます。

309:デフォルトの名無しさん
07/06/10 02:46:32
ええとよくわからんけど
-演算子をオーバーロード?

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

311:307
07/06/10 02:54:52
解決しましたありがとうございました

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

313:デフォルトの名無しさん
07/06/10 07:16:07
1と2

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

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


315:デフォルトの名無しさん
07/06/10 13:20:40
ファイル情報の取得の仕方教えて。


316:デフォルトの名無しさん
07/06/10 13:24:06
stat

317:デフォルトの名無しさん
07/06/10 13:30:01
file

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

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

319:318
07/06/10 14:11:45
すみません,
Windows環境 → WindowsXP環境
です

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

321:デフォルトの名無しさん
07/06/10 15:09:24
元が VB か C/C++ か、の差

322:デフォルトの名無しさん
07/06/10 15:11:46
#include <iostream>

struct A {
  A(){
     std::cout << "A" << std::endl;
   }
   ~A() {
     std::cout << "~A" << std::endl;
   }
   template<class T>
   static void func() {
     std::cout << "func" << std::endl;
   }
};

int main() {
   A().func<int>();
   return 0;
}

以上のプログラムを実行すると
vc, gccでは
A
func
~A
と出力され、bccでは
func
~A
と表示されました。
コンストラクタが呼ばれないのはbccのバグでしょうか?
ちなみにメンバ関数にtemplateを使わなかったりstaticでなければ問題なくコンストラクタは呼ばれるようです。

323:デフォルトの名無しさん
07/06/10 15:19:03
>>322
バグだね。 bcc なんて使わなけりゃいい。

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

単に、方言が違うだけ?

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

326:デフォルトの名無しさん
07/06/10 15:39:27
>>324
.NETスレは他にあるだろ。なんでここで聞くんだ?

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

327:320
07/06/10 15:55:44
ごめん。
C#スレと勘違いしてた。

328:デフォルトの名無しさん
07/06/10 18:12:08
あれだけ#の種類を変えて頑張っているのにw

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

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

331:デフォルトの名無しさん
07/06/10 19:21:23
URLリンク(www.cs.bme.hu)
↑のサイトのプログラムを落として
makeしてみたらエラーがでて、makeできませんでした。
どのようにしたらmakeできますか?

実行はCygwin上で行ってます。

エラー内容は
$ make
g++ Input_Output_Manager.o Apriori.o Trie.o Apriori_Trie.o main.o -o ../apriori

Input_Output_Manager.o: In function `_ZN20Input_Output_ManagerC2ERSt14basic_ifstreamIcSt11char_traitsIcEEPKc':
Input_Output_Manager.cpp:(.text+0x2f): undefined reference to `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'
Input_Output_Manager.cpp:(.text+0x4a): undefined reference to `_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev'



Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x0): undefin
ed reference to `_ZTVN10__cxxabiv120__si_class_type_infoE'
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x8): undefin
ed reference to `_ZTISt14basic_ofstreamIcSt11char_traitsIcEE'
collect2: ld returned 1 exit status
make: *** [../apriori] Error 1

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


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

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

334:デフォルトの名無しさん
07/06/10 20:20:48
>>332
成功しました。ありがとうございます。

335:デフォルトの名無しさん
07/06/10 20:23:04
>>332
暇人乙

336:デフォルトの名無しさん
07/06/10 20:52:44
>>335
暇潰しにもならんかったよ


337:デフォルトの名無しさん
07/06/10 20:54:11
暇過ぎw

338:デフォルトの名無しさん
07/06/10 21:44:29
続けて、質問すみません。
さっきの
URLリンク(www.cs.bme.hu)
のやつなんですが、

URLリンク(kansai2channeler.hp.infoseek.co.jp)
↑のもっと長いようなデータ読み込ませようとすると

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

ってでて、動きません。

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

339:デフォルトの名無しさん
07/06/10 23:51:01
マルチーズ乙

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



341:デフォルトの名無しさん
07/06/11 12:26:40
>>340
再現する最小限のソース貼って


342:デフォルトの名無しさん
07/06/11 12:29:24
class A {
A(){}
A(int n){}
};

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

B b(1);

って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる?
とESPしてみる

343:デフォルトの名無しさん
07/06/11 12:46:26
>>341
#include <iostream>
using namespace std;

class aaa {
public:
  aaa() {printf("%p: [%s]: %s called\n",this,"aaa","constructor");}
  aaa(const aaa &a) {printf("%p: [%s]: %s called\n",this,"aaa","copy constructor");}
  ~aaa() {printf("%p: [%s]: %s called\n", this, "aaa", "destructor");}
};

class bbb : public aaa {
public:
  bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
  bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
  ~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};

void func2(bbb x){return;}

int main()
{
    bbb x;
    func2(x);
    return 0;
}


344:デフォルトの名無しさん
07/06/11 12:47:18
>>343
改行が多すぎるといわれたので、わけました。

実行結果は以下のようになりました。
~/> g++ samp.cpp
~/> ./a.out
0xbfc07bee: [aaa]: constructor called
0xbfc07bee: [bbb]: constructor called
0xbfc07bef: [aaa]: constructor called
0xbfc07bef: [bbb]: copy constructor called
0xbfc07bef: [bbb]: destructor called
0xbfc07bef: [aaa]: destructor called
0xbfc07bee: [bbb]: destructor called
0xbfc07bee: [aaa]: destructor called



345:デフォルトの名無しさん
07/06/11 12:52:34
>>344
class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
- bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
+ bbb(const bbb &b): aaa (b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};


346:デフォルトの名無しさん
07/06/11 12:57:06
>>345
すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。

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

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


347:デフォルトの名無しさん
07/06/11 12:59:40
エスパー342


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


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

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

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

352:デフォルトの名無しさん
07/06/11 21:21:19
string::find と string::find_first_of 、
string::rfind と string::find_last_of って、
どう違うの? 同じ?

353:デフォルトの名無しさん
07/06/11 21:23:36
rの有無、firstかlastかの違い
begin側から探し始めるかeng側から探し始めるかの違い

354:デフォルトの名無しさん
07/06/11 21:52:19
ごめん。左右の比較の話。

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

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

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

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

357:デフォルトの名無しさん
07/06/12 18:15:59
__DATE__ と __TIME__

358:デフォルトの名無しさん
07/06/12 18:23:26
>357
感謝するわよ。


359:デフォルトの名無しさん
07/06/12 18:34:03
もう一つ教えてちょうだい。
Jun 12 2007
って出るのを、
2007年6月12日にするにはどうしたらいいかしら?

360:デフォルトの名無しさん
07/06/12 20:18:53
入力した自然数を4で割り、4つの変数に収めた後、
余りをランダムに割り振るプログラムを書いて見ました
#include<ctime>
#include<cstdlib>
#include<iostream>
using namespace std;

int main()
{
int a;//適当な大きさの変数を読み取らせるための変数
int c1;
int c2;
int c3;
int c4;//aを4で割り、余りをこの4つの数値にランダムに格納する

int b;
c1=c2=c3=c4=0;
scanf("%d",&a);
b=a % 4;
printf("%d,%d\n",a/4,b);
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

while(b>0)
{
srand(time(NULL));
int dice=rand() % 4;

361:360
07/06/12 20:20:06
続きです
switch(dice)
{
case 0:
{
c1++;
c2+=0;
c3+=0;
c4+=0;
}
case 1:
{
c1+=0;
c2++;
c3+=0;
c4+=0;
}
case 2:
{
c1+=0;
c2+=0;
c3++;
c4+=0;
}
case 3:
{
c1+=0;
c2+=0;
c3+=0; c4++;
}
}

362:360
07/06/12 20:22:09
printf("%d\n",dice);
//dice=0;
b--;
}

printf("分配計算後に\n");
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

c1+=(int)a/4;
c2+=(int)a/4;
c3+=(int)a/4;
c4+=(int)a/4;

printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

scanf("%d",&c1);
return 0;
}

このように作ったのですが、余りが2になる場合に
どうしても余分な計算をしているようです。

srand(time(NULL));
int dice=rand() % 4;
に問題があるのか、case文がおかしいのか分からず迷っております

よろしくお願いします

363:デフォルトの名無しさん
07/06/12 20:25:30
>>360
+=0て

364:デフォルトの名無しさん
07/06/12 20:26:45
caseの後にbreakするんだ

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

366:デフォルトの名無しさん
07/06/12 20:37:55
>>359
実行時に自分で変換すれば。

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

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

かな?


368:デフォルトの名無しさん
07/06/12 20:42:47
引数からファイルパスを取得し、同じ内容を別名で出力するプログラムに
関してですが、コマンドプロンプトなどで引数を与えると正常にo.txtが
出力されるのですが、ドラッグアンドドロップだと上手く動作しないです。
ご指南お願いします。
OSはWindowsです。

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

int main(int argc,char **argv)
{
char buf[256];
ifstream ifs(argv[1]);
ofstream ofs("o.txt");

while( ifs.getline(buf,sizeof(buf)))
ofs << buf << endl;

return 0;
}

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

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

370:デフォルトの名無しさん
07/06/12 20:49:25
とりあえず引数を表示してみるとか

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

372:360
07/06/12 20:54:29
>>364-365 など各位

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

373:368
07/06/12 20:55:45
実行ファイルがtest.exeだとしたら、batファイルなどで
test.exe i.txtへの絶対パス
test.exe i.txt
両者ともファイルの書き出しに成功しますが、
エクスプローラー上でi.txtをtest.exeへD&Dするとファイルの書き出しが
行われません。
ちなみに引数を表示するプログラムを追加してみたところ、見た目は
batファイルとD&D両者とも同じ引数を受け取っているように見えます。

374:368
07/06/12 21:08:30
>>371
なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。

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

ありがとうございます。

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

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

377:デフォルトの名無しさん
07/06/12 23:14:35
>>376
コンマなんてどこにあるんだ?

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

379:デフォルトの名無しさん
07/06/12 23:17:00
間違いました。ピリオドです。

380:デフォルトの名無しさん
07/06/12 23:18:29
>>376
じゃあ、' の意味は分かるのか?

381:デフォルトの名無しさん
07/06/12 23:20:53
>>376
aとか!=の意味は?

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

383:デフォルトの名無しさん
07/06/12 23:26:08
>>381
分かります。

384:デフォルトの名無しさん
07/06/12 23:27:31
>>383
本当にわかるのか?!=の意味言ってみ

385:デフォルトの名無しさん
07/06/12 23:29:51
変数aが右オペランドと等しくないということです。

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

387:デフォルトの名無しさん
07/06/12 23:33:21
>>385
変数aがピリオドと等しくない

388:デフォルトの名無しさん
07/06/12 23:42:32
>>387
これはひどい

389:デフォルトの名無しさん
07/06/12 23:43:55
.は文字リテラルということですね。分かりました。

390:デフォルトの名無しさん
07/06/12 23:47:43
'.' が文字リテラルであって
. が文字リテラルなわけではない。

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

よろしくお願いします。


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