【初心者歓迎】C/C++室 Ver.70【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/11/22(日) 16:04:30ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0153デフォルトの名無しさん
2009/12/07(月) 20:48:58ありがとうございます。大変参考になりました。
0154デフォルトの名無しさん
2009/12/08(火) 16:54:58デバッグ用のmsvcrtは配布されてないから、デバッグビルドは開発環境のないところで動かないよ
0155デフォルトの名無しさん
2009/12/08(火) 21:05:24家のパソコンで同じようにやってみてもエラーが出て出来ません。
「'gcc'は内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
↑こういうメッセージが出ます。どうすればよいでしょうか?
OSはどちらもVistaです。
0156デフォルトの名無しさん
2009/12/08(火) 21:11:580157デフォルトの名無しさん
2009/12/08(火) 21:12:110158デフォルトの名無しさん
2009/12/08(火) 21:47:270159デフォルトの名無しさん
2009/12/08(火) 21:51:160160デフォルトの名無しさん
2009/12/08(火) 22:09:240161デフォルトの名無しさん
2009/12/08(火) 23:10:28ADLとテンプレート周りが腐ってるからだめだ
0162デフォルトの名無しさん
2009/12/08(火) 23:30:170163デフォルトの名無しさん
2009/12/08(火) 23:43:01例外処理もないんじゃなかったか?
それに16bit専用だったと思うが
0164デフォルトの名無しさん
2009/12/09(水) 00:07:420165デフォルトの名無しさん
2009/12/09(水) 00:19:24詳しい説明ありがとうございます
0166デフォルトの名無しさん
2009/12/09(水) 12:49:50つまり組み込み向け?
0167デフォルトの名無しさん
2009/12/09(水) 15:59:320168デフォルトの名無しさん
2009/12/10(木) 00:38:58C++のstaticなメソッドもjavaと同じような感覚でいいのでしょうか?
0169デフォルトの名無しさん
2009/12/10(木) 00:41:510170デフォルトの名無しさん
2009/12/10(木) 01:21:110171デフォルトの名無しさん
2009/12/10(木) 01:32:06staticしか持ってない管理クラスで一般的な作業させてるんだけど、おかしいか?
0172デフォルトの名無しさん
2009/12/10(木) 01:34:15関数はグローバル関数にするのが一般的。
グローバル関数で実現可能なことは、わざわざメンバ関数にしない方が安全だ。
0173デフォルトの名無しさん
2009/12/10(木) 01:37:23安全っていうと、どう違うん?
実質グローバルと変わらないと認識してたんだけど・・・。
0174デフォルトの名無しさん
2009/12/10(木) 01:52:42privateなデータメンバにアクセスできるものは極力減らした方が、安全性や保守性が高まる。
friendでないグローバル関数ならprivateメンバにアクセスできないことは自明なので、
privateメンバに手を加えるとき、考慮しなくてすむよね。
0175デフォルトの名無しさん
2009/12/10(木) 02:02:060176デフォルトの名無しさん
2009/12/10(木) 02:46:11はっきりしてほしいところ
Monostateパターンなのかどうなのかも
はっきりしてほしいところ
そこらへんが曖昧だから話が噛み合わない
0177デフォルトの名無しさん
2009/12/10(木) 05:38:21それは通常namespaceを使うんじゃないだろうか
0178デフォルトの名無しさん
2009/12/11(金) 00:40:28class make
{
public:
template<class xxx> static std::tr1::shared_ptr<xxx> shared(void)
{
return std::tr1::shared_ptr<xxx>(create<xxx>(), destroy<xxx>);
}
private:
template<class xxx> static xxx *create (void)
{
std::cout << "create" << std::endl;
return new xxx;
}
template<class xxx> static void destroy (xxx *ptr)
{
std::cout << "destroy" << std::endl;
delete ptr;
}
};
いい例がぱっと思いつかんけどこんなのとか
あとはてんぷらプログラミングとかやろうとすると、グローバルじゃなくてクラスメンバのほうが使い易い
既存のクラスにstaticを継ぎ足し継ぎ足しするのは危険だけどそうじゃなきゃグローバルよりできることは多いと思う
0179デフォルトの名無しさん
2009/12/11(金) 22:56:050180デフォルトの名無しさん
2009/12/11(金) 23:06:03あって助かってる。
が、意味不明なオーバーロードされてると殺意を抱く。
0181デフォルトの名無しさん
2009/12/11(金) 23:24:37俺も>>180と同じ感想。
数をあつかうクラス書くときは凄い便利。
0182デフォルトの名無しさん
2009/12/12(土) 03:03:380183デフォルトの名無しさん
2009/12/12(土) 05:19:40これの結果は環境によって変わったりしますか?
0184デフォルトの名無しさん
2009/12/12(土) 05:25:030185デフォルトの名無しさん
2009/12/12(土) 05:25:51実行するごとに変わったり変わらなかったり。
0186デフォルトの名無しさん
2009/12/12(土) 07:01:00必須だよな
スマポやイテレータなんか、演算子オーバーロード無かったら糞以下だろう
そういう振る舞いを求められてないクラスで面白がって使う演算子オーバーロードは
ほとんどが害悪だけど
0187デフォルトの名無しさん
2009/12/12(土) 07:05:500188デフォルトの名無しさん
2009/12/12(土) 13:35:300189デフォルトの名無しさん
2009/12/12(土) 13:52:02例えば << や >> を streamとの入出力に使うとかって、最低だよな。
いやマジで。
0190デフォルトの名無しさん
2009/12/12(土) 15:51:520191デフォルトの名無しさん
2009/12/12(土) 16:34:13Boost.Spirit で発狂した経験がある。
0192デフォルトの名無しさん
2009/12/12(土) 16:53:150193デフォルトの名無しさん
2009/12/12(土) 16:55:12それは要するに "hoge" という文字列の置かれたアドレスの一部あるいは全部を
unsigned int として返す、という式になるけど、処理系によってメモリの使い方が
ことなるから、当然定数のアドレスも異なる。
コードを書き換えてコンパイルし直せば、定数の配置も変わりうるからアドレスも変わりうる。
また、Windows や Linux では(バージョンやディストリビューションや設定によって変わるが)
ヒープやスタックの位置をランダムに変えているので、プロセスの起動ごとに変数や定数の
アドレスが変わるが、Mac OS X はそういうことはしていないので起動ごとにアドレスが
変わったりはしない。
0194デフォルトの名無しさん
2009/12/12(土) 20:55:27struct _TAG_ELEMENT *next;
char str[ 256 ];
} ELEMENT;
上の構造体を使って、線形リスト?を作りました。
で、strcmp()の仕様にのっとり、昇順にソートをしようとしたのですが、うまくいきません。
いったいどうしたらいいのでしょうか?
0195デフォルトの名無しさん
2009/12/12(土) 21:05:23どんなコードを書いて、どう上手くいかなかったの?
0196デフォルトの名無しさん
2009/12/12(土) 21:11:090197デフォルトの名無しさん
2009/12/13(日) 00:11:57関数ポインタに渡すときはつけないとダメなんでしょうか?
0198デフォルトの名無しさん
2009/12/13(日) 00:26:28MS様がここはCALLBACKだとお決めになられた箇所には、CALLBACKを付ける
MS様がルールで、俺たち平民はそれに従うのみよ
関数ポインタならなんでも付けるわけじゃなくて、CALLBACK規約の関数ポインタの場合だけ付ける
まぁ呼び出し規約でぐぐってくれ
0199デフォルトの名無しさん
2009/12/13(日) 00:30:59それは呼出規約というものを指定しているんだ。
呼出規約というのは、関数の呼び出し方と値の戻し方を機械語レベルで規定したもので、
それが異なるとCのソースレベルでは同じに見える関数でも機械語レベルでは別物に
なってしまい、呼び出すことが出来なくなる。
0200デフォルトの名無しさん
2009/12/13(日) 00:31:030201デフォルトの名無しさん
2009/12/13(日) 00:31:42関数の呼び方にstdcallとpascalって二つあって、CALLBACKはその
どちらかに設定されてるんじゃないの?
0202デフォルトの名無しさん
2009/12/13(日) 00:34:44あるよ。というか、もともと呼出規約なんてものは処理系ごとに異なっているものだ。
さすがにそれじゃあ開発に支障をきたすので、ある程度規格化されているけど。
0203デフォルトの名無しさん
2009/12/13(日) 00:36:52もちろん呼び出し規約を指定することは出来るけど、わざわざ指定するような例は見たことないな・・
0204デフォルトの名無しさん
2009/12/13(日) 08:42:15誰も書かないので書いとくが、引数をスタックに積む順番が変わる。
関数呼び出しのエンディアンみたいなもんだね。
0205デフォルトの名無しさん
2009/12/13(日) 08:55:14VCのnaked規約なんかに至っては、スタックフレームの生成もret命令もてめーで書け、
という潔さ
0206デフォルトの名無しさん
2009/12/13(日) 13:05:33gccだと__attribute__((naked))
0207デフォルトの名無しさん
2009/12/13(日) 13:43:100208デフォルトの名無しさん
2009/12/16(水) 22:56:57可変の3次元配列を利用したい場合はどうしたらよいですか。
たとえば、int arrray[x_max][y_max][z_max]の3次元配列を使いたい場合、
1.十分大きな配列を確保して、array[i][j][k]とアクセス
2.array = malloc(sizeof(int) * x_max * y_max * z_max)とし、
array[ (i*y_max + j)*z_max + k] でアクセスする。
の方法を考えたんですが、他に良い手法はありますでしょうか。
0209デフォルトの名無しさん
2009/12/16(水) 23:09:16としてループでmallocしまくる
遅いからおすすめはしないが
0210デフォルトの名無しさん
2009/12/17(木) 00:09:500211デフォルトの名無しさん
2009/12/17(木) 00:27:33可変ってどゆこと?
0212デフォルトの名無しさん
2009/12/17(木) 00:39:04標準Cなら俺の知る限りその2つの方法しかない。
しかし、1は容易にスタックオーバーフローを引き起こすのでお勧めできない。
int a[10][10][10]くらいですむならいいけどね。
0213212
2009/12/17(木) 00:43:56でも1と同じでスタックオーバーフローに繋がるから、お勧めはできない。
0214デフォルトの名無しさん
2009/12/17(木) 00:44:173.int (*p)[Y][Z] = malloc(sizeof(int) * x_max * y_max * z_max)
とすればp[0][1][2]でアクセスできるよ。
ただしY, Zは固定。
Y,Zも可変にしたければ>209の方法しかない。
0215208
2009/12/17(木) 14:23:43すみません、説明不足でしたね。
例えば、プログラム中で設定ファイルを読み込んだり、
途中で入力した数をx_max,y_max,z_maxに代入して、
arrray[x_max][y_max][z_max] を使いたいと言う事です。
>>209-214
結局は、可変な3数を使う配列を使いたい場合、
2.が良いと言う事ですね。
そうやって作ってみようと思います。
皆さんどうもありがとうございました。
0216デフォルトの名無しさん
2009/12/17(木) 17:12:131,・・・,100の整数から10個の整数を
非復元抽出でランダムで取り出すプログラムを教えてください。
0217デフォルトの名無しさん
2009/12/17(木) 17:18:320218デフォルトの名無しさん
2009/12/17(木) 17:20:020219デフォルトの名無しさん
2009/12/17(木) 17:41:06途中の課題のソースファイルを自宅に持ち帰ったのですが、
学内のLinuxで見た時には一つだったのにWinでひらくと「Cファイル」と「C〜ファイル」の二つになっていました。
ワードパットで編集できるみたいですが、この場合両方に同じ編集を施して、
両方をファイルサーバーにコピーすると1つのファイルに戻ったりするのでしょうか?
いきなりファイルが増えて混乱してます。
よろしくお願いします。
0220デフォルトの名無しさん
2009/12/17(木) 17:48:19~がついているほうはエディタのバックアップファイルだと思う。
おそらくそっちは削除して、.cファイルだけ編集して書き戻せば平気。
0221デフォルトの名無しさん
2009/12/17(木) 18:02:54ホント助かりました!
ありがとうございます!
0222デフォルトの名無しさん
2009/12/17(木) 20:25:130223デフォルトの名無しさん
2009/12/17(木) 22:00:32Test *t = new Test();
この2つは何が違うんですか?どっちも、自動で破棄されない点は同じですが
Test *t;はdelete t;をしても、デストラクタを実行してくれない
0224デフォルトの名無しさん
2009/12/17(木) 22:12:03前者はTest型へのポインタ、つまり「Test型のインスタンスのアドレス値の置き場」を
作っただけで、Test型のインスタンスを作っていません。
従って、デストラクタも実行されません。生まれていない生物が死ぬことはできないので。
0226デフォルトの名無しさん
2009/12/17(木) 22:24:10Test *t();
は、
「Test *を返すtという名前の関数の宣言」であって
Test *t;
とは全く別物だし。
0227デフォルトの名無しさん
2009/12/18(金) 00:47:54int a[100], i, j;
for (i = 0; i < 100; i[a] = i + 1, i++);
for (i = 0; i < 100; i++)
{
j = (int)((rand() / (RAND_MAX + 1.0)) * 100);
j[a] != -1 ? printf("%d\n", j[a]), j[a] = -1 : i--;
}
0228デフォルトの名無しさん
2009/12/18(金) 01:33:520229デフォルトの名無しさん
2009/12/18(金) 01:44:16int main()
{
static int const range = 100;
static int const num_samples = 10;
int source[range];
for (int i = 0; i < range; ++i) { source[i] = 1 + i; }
srand(time(0));
assert(num_samples <= range);
for (int done = 0; done < num_samples; ++done)
{
int const num_remains = range - done;
int const x = (int)((rand() / (RAND_MAX + 1.0)) * num_remains);
printf("%d\n", source[x]);
source[x] = source[num_remains - 1];
}
return 0;
}
0230デフォルトの名無しさん
2009/12/18(金) 05:11:58include <stdio.h>が普通に通るけど
stdio.hってファイルだよね?なんでこれでコンパイルが通る?
C:\Windows\System.なんとか.h
みたいに直接書かなくても良いのはなぜ?あとstdio.hの本体はどこにある?
0231デフォルトの名無しさん
2009/12/18(金) 05:22:29#include <c:\\vc\\include\\stdio.h>
#include </vc/include/stdio.h>
のように絶対パスで指定することもできる。
ちなみに、
#include "stdio.h"
"" で囲むと先にカレントディレクトリから探してくれる。
で、無ければ INCLUDE で指定したパスから。
0232デフォルトの名無しさん
2009/12/18(金) 05:22:55ツール→オプション→プロジェクトおよびソリューション→V++ディレクトリ
0233デフォルトの名無しさん
2009/12/18(金) 05:24:26ここでインクルードファイルやらライブラリやらのパス設定を管理できる。
0234デフォルトの名無しさん
2009/12/18(金) 06:04:100235デフォルトの名無しさん
2009/12/18(金) 09:02:170236デフォルトの名無しさん
2009/12/18(金) 18:39:51MyClass a;
MyClass b = MyClass;
MyClass c = MyClass();
上記それぞれ動きます。
MyClass d = new MyClass;
これはエラーがでます。なぜでしょうか。
0237デフォルトの名無しさん
2009/12/18(金) 18:47:42MyClass* d=new 略
0238デフォルトの名無しさん
2009/12/18(金) 18:48:19入門書読み直したほうがいい
0239デフォルトの名無しさん
2009/12/18(金) 18:48:500240デフォルトの名無しさん
2009/12/18(金) 19:06:16のb,cはどう動作するの?
0241デフォルトの名無しさん
2009/12/18(金) 19:13:570242236
2009/12/18(金) 19:44:28>>238
とてもわかりやすい説明ありがとうございます。
>>239がいけるのは知っていたのでとても納得しました。
>>240
>>236の上3つは同じ処理です。省略したものです。
僕は new はもしかしたら省略可能で省略されているのかと思って質問したわけです。
0243デフォルトの名無しさん
2009/12/18(金) 22:44:50b はコンパイルエラーになるだろ。
ほんとに動くんなら、コンパイラどれ使ってるか教えて。
0244デフォルトの名無しさん
2009/12/18(金) 23:54:590245デフォルトの名無しさん
2009/12/19(土) 00:03:200246デフォルトの名無しさん
2009/12/19(土) 16:11:06Java だとそんな感じだよな。
0248デフォルトの名無しさん
2009/12/21(月) 02:54:41static class使わないの?
0249デフォルトの名無しさん
2009/12/21(月) 10:49:11Java はスレ違いです。
0250デフォルトの名無しさん
2009/12/21(月) 12:46:47すまん、C#スレ行ってくる
0251デフォルトの名無しさん
2009/12/21(月) 13:28:220252デフォルトの名無しさん
2009/12/21(月) 13:36:37= 0 を見つめ続けるとやがてゲシュタルト崩壊が始まる。
■ このスレッドは過去ログ倉庫に格納されています