【初心者歓迎】C/C++室 Ver.72【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/05(金) 16:51:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0007デフォルトの名無しさん
2010/03/08(月) 13:11:16boost/cstdint.hpp が使える環境か C++0x 対応のコンパイラじゃなければ、自前で。
sizeof を確認して使えばだいたいの環境では望む結果が得られるかと。
0008デフォルトの名無しさん
2010/03/08(月) 13:17:000009デフォルトの名無しさん
2010/03/08(月) 13:26:20あ・・・、そうみたいだね。ごめん。
あと、 C99 対応のコンパイラでも stdint.h がたぶん使える。
0010デフォルトの名無しさん
2010/03/08(月) 15:01:47まあそこまで気にしなくていいだろうとは思うけど
0011デフォルトの名無しさん
2010/03/11(木) 03:00:20一度はやっておかないとと思いここにきました
よろしくお願いします
0012デフォルトの名無しさん
2010/03/11(木) 13:07:240013デフォルトの名無しさん
2010/03/11(木) 15:54:42アルゴリズムを勉強したほうが効果的
0014デフォルトの名無しさん
2010/03/11(木) 18:11:51typedef struct{
double x, y;
int flag, counter, hp, move, g;
char directory[50];
}ENEMY_INF;
DrawFormatString(0, 20, co_black, "%s", te[i].directory[50]);
デバッグのエラーで
この行番号が指定されて、「Fileshoot.exe の 0x00f8b27f でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xffffffcc を読み込み中にアクセス違反が発生しました」
とでてしまいます。
なにが原因でどうすればいいか分かりません
0015デフォルトの名無しさん
2010/03/11(木) 18:31:47DrawFormatString(0, 20, co_black, "%s", te[i].directory[50]);
↓
DrawFormatString(0, 20, co_black, "%s", te[i].directory);
0016デフォルトの名無しさん
2010/03/11(木) 18:47:17お!できましたありがとうございます
0017デフォルトの名無しさん
2010/03/11(木) 21:12:51std::vectorと[]演算子だとどれくらいの速度差が出ますか?
例:
Object* a[6];
std::vector<Object> b;
for(int i=0; i<6; i++){
a[i] = new Object();
b.push_back(new Object());
}
/// この部分
for(int i=0; i<6; i++){
a[i].test();
}
for(int i=0; i<b.size(); i++){
b[i].test();
}
////////
001817
2010/03/11(木) 21:13:450019デフォルトの名無しさん
2010/03/11(木) 21:56:490020デフォルトの名無しさん
2010/03/11(木) 22:12:31がないだろうなあ。
0021デフォルトの名無しさん
2010/03/11(木) 22:28:41#define _SECURE_SCL 0
しない場合2と3が遅くなる
VC以外は知らない
0022デフォルトの名無しさん
2010/03/11(木) 23:02:182と3が遅くなるのに4は遅くならないの?
0023デフォルトの名無しさん
2010/03/12(金) 02:05:55CLIは.NETというのがわかった
あとの二つがよくわからない
0024デフォルトの名無しさん
2010/03/12(金) 02:20:47Windows向けの開発をしたいということだね?
MFCは過去の遺物なので忘れていい。CLIは筋が悪いので忘れていい
(.NETを使うならC#を使えばいい)。なので、C++なら Windows SDK
(Win32 APIとか呼ばれる)が無難だと思う。
0025デフォルトの名無しさん
2010/03/12(金) 02:49:46ども
SDKもVC++2008EEもそれぞれ無料のを落とせるんですよね?
それとその3つの中で処理速度を順番で表すとどうなりますか?
0026デフォルトの名無しさん
2010/03/12(金) 11:53:02メモリを確保する機能は言語の物ですか、それともOSの物なんですか?
0027デフォルトの名無しさん
2010/03/12(金) 12:00:39ECC 6.2.1では1が最も早く、2は1の2倍掛かり、3と4は10倍掛かる
最適化が糞だな
VC9の場合は2が1の4万倍、3が1の15万倍掛かる
1と4は最適化で消えて行くのだと思う
http://codepad.org/CCYieupw
(Windows専用)
0028デフォルトの名無しさん
2010/03/12(金) 12:04:150029デフォルトの名無しさん
2010/03/12(金) 13:03:16実際に何がメモリを確保しているか(実装)という点ではOSの機能であるかもしれない。
でも、どこで動作が定められているか(インターフェース)という点では言語の機能と言える。
プログラマから見たnewの動作はOSが無い環境でも同じになる。
0030デフォルトの名無しさん
2010/03/12(金) 14:58:55再起動しないといけなくなったりするの?
0031デフォルトの名無しさん
2010/03/12(金) 15:03:25今時、まともなOS上ではそんな言語はない。
尤も、実装されているOSによっては当然そうなる場合もあるが。
0032デフォルトの名無しさん
2010/03/12(金) 15:17:400034デフォルトの名無しさん
2010/03/12(金) 19:49:37ミサイルに載せる奴じゃないはずさ
0035デフォルトの名無しさん
2010/03/12(金) 19:57:49もしポインタの使い方が間違った場合
ソフトだけが暴走して終了すればなんともないの?
OSにダメージが及ぶことはない?
0036デフォルトの名無しさん
2010/03/12(金) 20:02:360037デフォルトの名無しさん
2010/03/12(金) 21:01:470038デフォルトの名無しさん
2010/03/12(金) 21:03:29まずありえないだろうけど
最悪の場合にはコンピュータでできることならなんでも起こりうる
HDDがフォーマットされたり
ウイルスをばら撒いたり
恥ずかしいファイルが流出したりね
0039デフォルトの名無しさん
2010/03/12(金) 21:33:460040デフォルトの名無しさん
2010/03/12(金) 21:50:57DOSやWin3.1のころはそうだったな。
今はアプリが落ちるだけですむ。
0041デフォルトの名無しさん
2010/03/12(金) 22:02:27それでも何度か青画面出したと思うけどあれは一体なんだったんだろう
0042デフォルトの名無しさん
2010/03/12(金) 22:12:030043デフォルトの名無しさん
2010/03/12(金) 23:33:38今は安心して使えるんですね
VC++はじめようと思います
0044デフォルトの名無しさん
2010/03/13(土) 18:23:46{
static const hoge HOGE;
}
const hoge ns::Hoge = hoge();
定数としてのグローバル変数をcppじゃなくてヘッダだけで定義したいんだけどできますか?
0045デフォルトの名無しさん
2010/03/13(土) 18:36:450046デフォルトの名無しさん
2010/03/13(土) 19:24:48namespace ns
{
struct Hoge;
template<bool Dummy = true>
struct HogeHeaderOnlyConstants { static Hoge const HOGE; };
struct Hoge : HogeHeaderOnlyConstants<> {};
template<bool Dummy>
Hoge const HogeHeaderOnlyConstants::HOGE = Hoge();
}
http://d.hatena.ne.jp/Cryolite/20051129#p2
http://d.hatena.ne.jp/Cryolite/20051129#p3
0047デフォルトの名無しさん
2010/03/13(土) 20:21:340048デフォルトの名無しさん
2010/03/14(日) 13:18:04externの動きがいまいちわからない
0049デフォルトの名無しさん
2010/03/14(日) 13:34:310050デフォルトの名無しさん
2010/03/14(日) 13:44:01無いなら無名名前空間かstatic
005149
2010/03/14(日) 14:01:47>extern=どこかにあるやつを使うぜ!
・*.hに1つだけ変数を宣言する
・2つの*.cppから*.hに宣言した変数を使う
ってことができるわけですか?
>>50
>拡張する予定が有るならextern
ここの拡張は、*.hと*.cppが1対nになること可能性があるって意味ですよね
0053デフォルトの名無しさん
2010/03/14(日) 14:09:54そう
hoge.cpp
int g_val;//実体はコレ
hoge.h
extern int g_val;
使う人
foo.cpp extern int g_valするかhoge.hをインクルード
hage.cpp 以下同様
005448
2010/03/14(日) 14:19:47そうと言われても、>>49なのか>>50か分からないんですけど...
・1つの*.hを2つの*.cppで共有している
・しかし2つも*.hに変数を2つ書くのが(考えるのが)面倒い
・それじゃ、*.hに1つだけ変数を宣言して、あたかも2つ宣言したようしよう
ってのがexternですね
0055デフォルトの名無しさん
2010/03/14(日) 14:26:460056デフォルトの名無しさん
2010/03/14(日) 20:27:08の一番下のmain関数
Neko obj(::obj);
の ::obj は何を指すんですか?
0057デフォルトの名無しさん
2010/03/14(日) 20:29:450058デフォルトの名無しさん
2010/03/14(日) 20:53:19ありがとうございます
0059デフォルトの名無しさん
2010/03/14(日) 20:59:28ネストクラスとかstaticメンバ関数つかえばよくね?
0060デフォルトの名無しさん
2010/03/14(日) 21:01:41テンプレートが絡んでくるとそう簡単じゃないんだよ。
Effective C++ぐらい嫁。
0061デフォルトの名無しさん
2010/03/14(日) 23:32:10/usr/includeの下にヘッダファイルが保存されています
標準的なライブラリの実態はどこにあるのですか
OS or コンパイラ?
0062デフォルトの名無しさん
2010/03/14(日) 23:33:330063デフォルトの名無しさん
2010/03/15(月) 00:00:06ものによる。
/usr/include ってことはUNIX系だろうから、たいていOS付属で
/usr/lib など。
006461
2010/03/15(月) 00:11:33普通に考えてみれば、/usr/lib/以下にありますよね
/usr/libはソフトの実体が入っているな〜程度の事しか思っていませんでした
/usr/libの中のデータは*.soが多いわけですし
わかりました、ありがとうございます
0065デフォルトの名無しさん
2010/03/15(月) 02:10:20もしかして、実体ってライブラリのことじゃなくてソースのことだった
りする?
それももちろん環境依存だけども。
0066デフォルトの名無しさん
2010/03/15(月) 12:09:33std::locale loc = std::locale();
loc = std::locale(loc, "japanese", std::locale::ctype);
std::locale::global(loc);
といった記述をDLLの冒頭に書いた場合、それを読み込むソフトや他のDLLにも影響は及ぶのでしょうか?
0067デフォルトの名無しさん
2010/03/15(月) 13:12:48extern void hoge();
hoge.c
void hoge(){内容}
なんで、hoge.cには#include "hoge.h"と書かなくてもシンタックスエラーにならないんですか?
C++でクラスを定義する時は、#include "hoge.h"と書かないとシンタックスエラーになるのに
0068デフォルトの名無しさん
2010/03/15(月) 13:16:19ならねーよ
0069デフォルトの名無しさん
2010/03/15(月) 13:21:41何にも理解してねぇんだな。
#includeがおまじないの類だと思っている節が。
だれかおせーてやれ
0070デフォルトの名無しさん
2010/03/15(月) 13:28:23個々のランタイムで管理しているので同じランタイムにリンクされているモジュール間で影響を受ける
VC++2005で動的リンクで作ったなら同じプロセスに読み込まれてるVC++2005で動的リンクしているDLLが影響を受ける
VC++6や2008で作ったものや2005でも静的リンクしたものは別のランタイムに属するので影響されない
0071デフォルトの名無しさん
2010/03/15(月) 13:28:54extern void hoge();
// 関数hogeの定義
void hoge(){内容}
// 関数hogeの参照
hoge();
// クラスFooの定義
class Foo {
Foo() {}
static FOO() {}
};
// クラスFooの参照、インスタンスfooの定義
Foo foo;
// クラスFooの参照
Foo::FOO();
// インスタンスfooの参照
func(foo);
007369
2010/03/15(月) 13:42:44それは
> C++の時は
というか、単に "hoge.h" に クラスFooの定義 を書いているってだけじゃないのか?
#include "hoge.h"
の #include ってのは、"hoge.h" をその場所に取り込め(コピペ的に機械的に取り込め)
って意味だから、これがないと
"hoge.h" に クラスFooの定義 を書いている場合は
クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。
でも#include "hoge.h"をしなくてもソースファイルにもう一度 クラスFooの定義 を
書けば別に#include "hoge.h"しなくてもエラーにはならない。
意味分かってくれる?
007469
2010/03/15(月) 13:58:57>クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。
クラスの定義はどうやって見つけるんですか?
知りたいことは、そこなんです
0075デフォルトの名無しさん
2010/03/15(月) 15:32:51class Hoge {
};
Hoge hoge;
0076デフォルトの名無しさん
2010/03/15(月) 18:35:13struct tagHOGE{}HOGE;
みたいにtagなんちゃらにするのは何でですか
0077デフォルトの名無しさん
2010/03/15(月) 18:44:00慣習です。
C/C++ではstruct tagHoge {...} hage;としたときにhageの型はstruct tagHogeになります。
C++ではtagHogeのようにstructを省略できますが、Cでは省略できません。
その為、しばしばCではtypedef struct tagHoge {...} Hoge;のようにtypedefすることになります。
このとき、typedef struct Hoge {...} Hoge;とするとC++ではエラーになります。
0078デフォルトの名無しさん
2010/03/15(月) 19:09:360079デフォルトの名無しさん
2010/03/15(月) 19:28:15まあそういうコンパイラもあるのかもしれないけど
0080デフォルトの名無しさん
2010/03/15(月) 19:32:54ならんならん
JIS X3014 附随書C 7.1.3 にも全く同じ例が載ってる
0081デフォルトの名無しさん
2010/03/15(月) 20:28:50private:
int Num;
double huga[Num];
public:
Hoge(int Num);
};
Hoge::Hoge(int Num){
this->Num = Num;
}
0082デフォルトの名無しさん
2010/03/15(月) 20:33:34こういった風にhugaのサイズを宣言したいのですが、これではコンパイルができません。どういう風にかいたらいいでしょうか?
0083デフォルトの名無しさん
2010/03/15(月) 20:35:46std::vector を使う
0084デフォルトの名無しさん
2010/03/15(月) 20:51:36{
static const int bbb = 100; double ccc[bbb];
};
0085デフォルトの名無しさん
2010/03/15(月) 20:54:46// を new deleteでつかう。
0087デフォルトの名無しさん
2010/03/16(火) 09:50:03コピーコンストラクタと代入演算子は書こうぜ
0088デフォルトの名無しさん
2010/03/16(火) 10:06:23http://blogs.msdn.com/oldnewthing/archive/2008/03/26/8336829.aspx
これだな。
標準化前のCではタグ名の名前空間が分かれていなかったことが原因で、
それを受けた Windows プログラミングによってさらに広まったものだろう。
tag ならまだしも下線で始める奴が多くて困る。
http://www.kijineko.co.jp/tech/superstitions/tags-begin-in-underscore.html
0089デフォルトの名無しさん
2010/03/16(火) 10:10:47実はまだ active issue になってたりする。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
0090デフォルトの名無しさん
2010/03/17(水) 01:33:030091デフォルトの名無しさん
2010/03/17(水) 02:06:50んなこたーない。ISOもJISも内容は基本的に同じ。
元々の規格の意図としては同じ名前も使えるようにしたかったようだけど、
厳密に解釈していくとなにやら矛盾のある状態になっているようだという話。
0092デフォルトの名無しさん
2010/03/17(水) 11:36:16編集時にプロパティウィンドの中身が一切表示されません。
サポート対象外なのはわかっていますが、解決策があれば
教えてもらえないでしょうか
0093デフォルトの名無しさん
2010/03/17(水) 18:31:40{
abc(int);
・・・
}
---
list<abc> a1;
for (int i=0;i<10;i++){
a1.push_back( new abc(i));
}
こんな感じで作ったa1を削除する時って、
a1の要素のabcのメモリ解放は、
ループさせて、いちいち要素ごとにメモリ解放をしていかないとダメですか?
それとも、
a1.clear();で、全部やってくれるモンなのですか?
0094デフォルトの名無しさん
2010/03/17(水) 19:10:060095デフォルトの名無しさん
2010/03/17(水) 20:44:35好きなのを選べ
1. WindowsXPをインストールする。
2. VisualStudio2008ExpressEditionをインストールする。
0096デフォルトの名無しさん
2010/03/17(水) 22:13:41このクラスをクラスBがコンポジションします。
クラスAのprotectedメンバー変数にクラスBからアクセスしたいのですが、継承した場合と違ってアクセスできません。
どのようにアクセスすべきでしょうか?
A内にpublicな関数をつくり、その関数がprotectedメンバーの値を返すようにすればいいのでしょうか?
0097デフォルトの名無しさん
2010/03/17(水) 22:29:590098デフォルトの名無しさん
2010/03/17(水) 22:46:37アクセスしたい変数は2個あって、そのために関数を2個用意するのはバカらしい感じがします。
0099デフォルトの名無しさん
2010/03/17(水) 22:49:210100デフォルトの名無しさん
2010/03/17(水) 22:55:41二個用意するのが馬鹿らしいなら設計を見直しましょう。
0101デフォルトの名無しさん
2010/03/17(水) 23:21:25抽出用一時オブジェクトとメンバ関数へのfriend指定を駆使して記述すれ
0102デフォルトの名無しさん
2010/03/17(水) 23:34:18共通のメンバーを抜き出したクラスをクラスA,Bから参照すればいい。
0103デフォルトの名無しさん
2010/03/17(水) 23:42:07このスレッドに書き込む労力を
アクセッサの実装に使ってください
0104デフォルトの名無しさん
2010/03/17(水) 23:49:32getter setterは邪悪
0105デフォルトの名無しさん
2010/03/18(木) 00:01:52それ、
a1.push_back(abc(i));
でよくない?
どうしてもnewしなきゃならないなら、shared_ptrを使うといい。
0106デフォルトの名無しさん
2010/03/18(木) 23:50:38Bに包含されることを前提にAを設計しているなら単にfriend指定すればいい。
そうでなければアクセサを書くか、メンバ変数自体をpublicにすればいい。
■ このスレッドは過去ログ倉庫に格納されています