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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/05(金) 16:51:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0002デフォルトの名無しさん2010/03/05(金) 16:52:01
 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!
0003デフォルトの名無しさん2010/03/07(日) 13:09:23
姉妹スレ

C言語なら俺に聞け(入門編)Part 61
http://pc12.2ch.net/test/read.cgi/tech/1267799238/
C言語初心者質問総合(だいぶ過疎っているが)
http://yutori7.2ch.net/test/read.cgi/pc2nanmin/1080308026/
C++相談室 part78
http://pc12.2ch.net/test/read.cgi/tech/1266070683/
スレを勃てるまでもないC/C++の質問はここで 13
http://pc12.2ch.net/test/read.cgi/tech/1260842197/.
C/C++小心者スレッドPart1
http://pc12.2ch.net/test/read.cgi/tech/1186262298/
0004デフォルトの名無しさん2010/03/08(月) 12:31:09
今まで特に考えもせずにstd::size_tとstd::ptrdiff_tをポインタサイズ互換の整数型として
扱ってたんだけどこれって問題ない?急に気になって昼寝も出来ません。
0005デフォルトの名無しさん2010/03/08(月) 12:38:17
>>4
全然根拠が無くてダメ。
intptr_t または uintptr_t と void* を使え。
0006デフォルトの名無しさん2010/03/08(月) 13:01:57
>>5
C++ではヘッダが無いので使えないんだけど。自前で用意?
0007デフォルトの名無しさん2010/03/08(月) 13:11:16
>>6
boost/cstdint.hpp が使える環境か C++0x 対応のコンパイラじゃなければ、自前で。
sizeof を確認して使えばだいたいの環境では望む結果が得られるかと。
0008デフォルトの名無しさん2010/03/08(月) 13:17:00
boost/cstdint.hppにはintptr_tなんて無いように見えるけども
0009デフォルトの名無しさん2010/03/08(月) 13:26:20
>>8
あ・・・、そうみたいだね。ごめん。

あと、 C99 対応のコンパイラでも stdint.h がたぶん使える。
0010デフォルトの名無しさん2010/03/08(月) 15:01:47
intptr_t/uintptr_tはoptionalだから環境によっては定義されないこともある
まあそこまで気にしなくていいだろうとは思うけど
0011デフォルトの名無しさん2010/03/11(木) 03:00:20
C言語の処理速度が速いと聞いて
一度はやっておかないとと思いここにきました
よろしくお願いします
0012デフォルトの名無しさん2010/03/11(木) 13:07:24
Cに入る者、汝一切の便利機能を棄てよ
0013デフォルトの名無しさん2010/03/11(木) 15:54:42
>>11
アルゴリズムを勉強したほうが効果的
0014デフォルトの名無しさん2010/03/11(木) 18:11:51
(DXライブラリというものを使っています。)

typedef 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:47
>>14
DrawFormatString(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
>>15
お!できましたありがとうございます
0017デフォルトの名無しさん2010/03/11(木) 21:12:51
質問です
std::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();
}
////////
0018172010/03/11(木) 21:13:45
すみません、std::vectorと通常の配列とだと、どれくらいの差が、でした・・・。
0019デフォルトの名無しさん2010/03/11(木) 21:56:49
ああ、まずは実測だ
0020デフォルトの名無しさん2010/03/11(木) 22:12:31
実測が基本だが、vectorの性質上、デバッグビルドでもしない限りは差
がないだろうなあ。
0021デフォルトの名無しさん2010/03/11(木) 22:28:41
http://codepad.org/kFwYJHQs
#define _SECURE_SCL 0
しない場合2と3が遅くなる

VC以外は知らない
0022デフォルトの名無しさん2010/03/11(木) 23:02:18
>>21
2と3が遅くなるのに4は遅くならないの?
0023デフォルトの名無しさん2010/03/12(金) 02:05:55
CLI SDK MFCの3種類があるらしいけど
CLIは.NETというのがわかった
あとの二つがよくわからない
0024デフォルトの名無しさん2010/03/12(金) 02:20:47
>>23
Windows向けの開発をしたいということだね?

MFCは過去の遺物なので忘れていい。CLIは筋が悪いので忘れていい
(.NETを使うならC#を使えばいい)。なので、C++なら Windows SDK
(Win32 APIとか呼ばれる)が無難だと思う。
0025デフォルトの名無しさん2010/03/12(金) 02:49:46
>>24
ども
SDKもVC++2008EEもそれぞれ無料のを落とせるんですよね?
それとその3つの中で処理速度を順番で表すとどうなりますか?
0026デフォルトの名無しさん2010/03/12(金) 11:53:02
newをするとメモリが確保されますが
メモリを確保する機能は言語の物ですか、それともOSの物なんですか?
0027デフォルトの名無しさん2010/03/12(金) 12:00:39
>>21
ECC 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:15
OSのものです
0029デフォルトの名無しさん2010/03/12(金) 13:03:16
>>26
実際に何がメモリを確保しているか(実装)という点ではOSの機能であるかもしれない。
でも、どこで動作が定められているか(インターフェース)という点では言語の機能と言える。
プログラマから見たnewの動作はOSが無い環境でも同じになる。
0030デフォルトの名無しさん2010/03/12(金) 14:58:55
この言語はちょっとミスったらOS暴走して
再起動しないといけなくなったりするの?
0031デフォルトの名無しさん2010/03/12(金) 15:03:25
>>30
今時、まともなOS上ではそんな言語はない。
尤も、実装されているOSによっては当然そうなる場合もあるが。
0032デフォルトの名無しさん2010/03/12(金) 15:17:40
ひどいときには爆発するから気をつけろ
0033262010/03/12(金) 16:15:13
>>29
ありがとう
0034デフォルトの名無しさん2010/03/12(金) 19:49:37
>>32
ミサイルに載せる奴じゃないはずさ
0035デフォルトの名無しさん2010/03/12(金) 19:57:49
よくわかんないんだけど
もしポインタの使い方が間違った場合
ソフトだけが暴走して終了すればなんともないの?
OSにダメージが及ぶことはない?
0036デフォルトの名無しさん2010/03/12(金) 20:02:36
運が悪いと爆発するっていってんだろ
0037デフォルトの名無しさん2010/03/12(金) 21:01:47
組み込み怖い組み込み怖い
0038デフォルトの名無しさん2010/03/12(金) 21:03:29
>>35
まずありえないだろうけど
最悪の場合にはコンピュータでできることならなんでも起こりうる

HDDがフォーマットされたり
ウイルスをばら撒いたり
恥ずかしいファイルが流出したりね
0039デフォルトの名無しさん2010/03/12(金) 21:33:46
意図的に扱いを間違えるとコンピュータウィルスと呼ばれるものが出来上がるわけだ
0040デフォルトの名無しさん2010/03/12(金) 21:50:57
>>30
DOSやWin3.1のころはそうだったな。
今はアプリが落ちるだけですむ。
0041デフォルトの名無しさん2010/03/12(金) 22:02:27
windows95の頃は一般保護違反で済むようになってたんだっけ
それでも何度か青画面出したと思うけどあれは一体なんだったんだろう
0042デフォルトの名無しさん2010/03/12(金) 22:12:03
95は完全じゃないけどそこそこプロテクトは掛かってる。けどまあよく落ちた。
0043デフォルトの名無しさん2010/03/12(金) 23:33:38
昔はC言語は怖くて使えなかったけど
今は安心して使えるんですね
VC++はじめようと思います
0044デフォルトの名無しさん2010/03/13(土) 18:23:46
namespace ns
{
static const hoge HOGE;
}

const hoge ns::Hoge = hoge();


定数としてのグローバル変数をcppじゃなくてヘッダだけで定義したいんだけどできますか?
0045デフォルトの名無しさん2010/03/13(土) 18:36:45
処理系依存なら__declspec(selectany)とか__attribute__ ((selectany))とか
0046デフォルトの名無しさん2010/03/13(土) 19:24:48
>>44
namespace 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:34
なるほどーthx
0048デフォルトの名無しさん2010/03/14(日) 13:18:04
*.hと*.cppが1対1でもexternって使わないとダメなんですか?
externの動きがいまいちわからない
0049デフォルトの名無しさん2010/03/14(日) 13:34:31
extern=どこかにあるやつを使うぜ!実際どこにあるかはリンカまかせ
0050デフォルトの名無しさん2010/03/14(日) 13:44:01
拡張する予定が有るならextern
無いなら無名名前空間かstatic
0051492010/03/14(日) 14:01:47
>>49
>extern=どこかにあるやつを使うぜ!
・*.hに1つだけ変数を宣言する
・2つの*.cppから*.hに宣言した変数を使う
ってことができるわけですか?

>>50
>拡張する予定が有るならextern
ここの拡張は、*.hと*.cppが1対nになること可能性があるって意味ですよね
0052512010/03/14(日) 14:02:29
名前間違えました
>>51は48です
0053デフォルトの名無しさん2010/03/14(日) 14:09:54
>>51
そう

hoge.cpp
int g_val;//実体はコレ
hoge.h
extern int g_val;

使う人
foo.cpp extern int g_valするかhoge.hをインクルード
hage.cpp 以下同様
0054482010/03/14(日) 14:19:47
>>53
そうと言われても、>>49なのか>>50か分からないんですけど...

・1つの*.hを2つの*.cppで共有している
・しかし2つも*.hに変数を2つ書くのが(考えるのが)面倒い
・それじゃ、*.hに1つだけ変数を宣言して、あたかも2つ宣言したようしよう
ってのがexternですね
0055デフォルトの名無しさん2010/03/14(日) 14:26:46
とりあえず宣言と定義の違い、翻訳単位やリンケージについて調べてください
0056デフォルトの名無しさん2010/03/14(日) 20:27:08
http://wisdom.sakura.ne.jp/programming/cpp/cpp24.html
の一番下のmain関数
Neko obj(::obj);
の ::obj は何を指すんですか?
0057デフォルトの名無しさん2010/03/14(日) 20:29:45
グローバル変数のobj。クラスの宣言と同時に定義してるやつ
0058デフォルトの名無しさん2010/03/14(日) 20:53:19
>>57
ありがとうございます
0059デフォルトの名無しさん2010/03/14(日) 20:59:28
friendって使い道あるの?
ネストクラスとかstaticメンバ関数つかえばよくね?
0060デフォルトの名無しさん2010/03/14(日) 21:01:41
>>59
テンプレートが絡んでくるとそう簡単じゃないんだよ。
Effective C++ぐらい嫁。
0061デフォルトの名無しさん2010/03/14(日) 23:32:10
iostreamやstdioなどの標準的なライブラリは
/usr/includeの下にヘッダファイルが保存されています

標準的なライブラリの実態はどこにあるのですか
OS or コンパイラ?
0062デフォルトの名無しさん2010/03/14(日) 23:33:33
大抵ファイルシステム上のどこかです
0063デフォルトの名無しさん2010/03/15(月) 00:00:06
>>61
ものによる。
/usr/include ってことはUNIX系だろうから、たいていOS付属で
/usr/lib など。
0064612010/03/15(月) 00:11:33
>>63
普通に考えてみれば、/usr/lib/以下にありますよね
/usr/libはソフトの実体が入っているな〜程度の事しか思っていませんでした
/usr/libの中のデータは*.soが多いわけですし

わかりました、ありがとうございます
0065デフォルトの名無しさん2010/03/15(月) 02:10:20
>>61,64
もしかして、実体ってライブラリのことじゃなくてソースのことだった
りする?

それももちろん環境依存だけども。
0066デフォルトの名無しさん2010/03/15(月) 12:09:33
Windowsでの話なのですが、

std::locale loc = std::locale();
loc = std::locale(loc, "japanese", std::locale::ctype);
std::locale::global(loc);

といった記述をDLLの冒頭に書いた場合、それを読み込むソフトや他のDLLにも影響は及ぶのでしょうか?
0067デフォルトの名無しさん2010/03/15(月) 13:12:48
hoge.h
extern void hoge();
hoge.c
void hoge(){内容}

なんで、hoge.cには#include "hoge.h"と書かなくてもシンタックスエラーにならないんですか?
C++でクラスを定義する時は、#include "hoge.h"と書かないとシンタックスエラーになるのに
0068デフォルトの名無しさん2010/03/15(月) 13:16:19
>C++でクラスを定義する時は、#include "hoge.h"と書かないとシンタックスエラーになるのに
ならねーよ
0069デフォルトの名無しさん2010/03/15(月) 13:21:41
>>67
何にも理解してねぇんだな。
#includeがおまじないの類だと思っている節が。

だれかおせーてやれ
0070デフォルトの名無しさん2010/03/15(月) 13:28:23
>>66
個々のランタイムで管理しているので同じランタイムにリンクされているモジュール間で影響を受ける
VC++2005で動的リンクで作ったなら同じプロセスに読み込まれてるVC++2005で動的リンクしているDLLが影響を受ける
VC++6や2008で作ったものや2005でも静的リンクしたものは別のランタイムに属するので影響されない
0071デフォルトの名無しさん2010/03/15(月) 13:28:54
// 関数hogeの宣言
extern void hoge();
// 関数hogeの定義
void hoge(){内容}
// 関数hogeの参照
hoge();

// クラスFooの定義
class Foo {
Foo() {}
static FOO() {}
};
// クラスFooの参照、インスタンスfooの定義
Foo foo;
// クラスFooの参照
Foo::FOO();
// インスタンスfooの参照
func(foo);
0072672010/03/15(月) 13:33:57
>>71
thx

でもさ、C++の時は#include "hoge.h"って書かないと
コンパイラ様が怒ってくるんだよ
0073692010/03/15(月) 13:42:44
>>72
それは
> C++の時は
というか、単に "hoge.h" に クラスFooの定義 を書いているってだけじゃないのか?

#include "hoge.h"
の #include ってのは、"hoge.h" をその場所に取り込め(コピペ的に機械的に取り込め)
って意味だから、これがないと
"hoge.h" に クラスFooの定義 を書いている場合は
クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。

でも#include "hoge.h"をしなくてもソースファイルにもう一度 クラスFooの定義 を
書けば別に#include "hoge.h"しなくてもエラーにはならない。

意味分かってくれる?
0074692010/03/15(月) 13:58:57
>"hoge.h" に クラスFooの定義 を書いている場合は
>クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。
クラスの定義はどうやって見つけるんですか?
知りたいことは、そこなんです
0075デフォルトの名無しさん2010/03/15(月) 15:32:51
// hoge.c

class Hoge {
};

Hoge hoge;
0076デフォルトの名無しさん2010/03/15(月) 18:35:13
よくライブラリで構造体を
struct tagHOGE{}HOGE;
みたいにtagなんちゃらにするのは何でですか
0077デフォルトの名無しさん2010/03/15(月) 18:44:00
>>76
慣習です。
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:36
了解しました
0079デフォルトの名無しさん2010/03/15(月) 19:28:15
同じにしてもC/C++共にエラーにならない
まあそういうコンパイラもあるのかもしれないけど
0080デフォルトの名無しさん2010/03/15(月) 19:32:54
>typedef struct Hoge {...} Hoge;とするとC++ではエラーになります。
ならんならん
JIS X3014 附随書C 7.1.3 にも全く同じ例が載ってる
0081デフォルトの名無しさん2010/03/15(月) 20:28:50
class Hoge{
private:
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:46
>>81
std::vector を使う
0084デフォルトの名無しさん2010/03/15(月) 20:51:36
class aaa
{
static const int bbb = 100; double ccc[bbb];
};
0085デフォルトの名無しさん2010/03/15(月) 20:54:46
struct ar{double*const p;ar(size_t a):p(new double[a]){};~ar(){delete[] p;}double&operator[](size_t a){return *(p+a);}}*huge;
// を new deleteでつかう。
0086662010/03/16(火) 09:18:35
>>70
詳しく説明していただき、大変参考になりました。
ありがとうございました。
0087デフォルトの名無しさん2010/03/16(火) 09:50:03
>>85
コピーコンストラクタと代入演算子は書こうぜ
0088デフォルトの名無しさん2010/03/16(火) 10:06:23
>>76
http://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
>>80
実はまだ active issue になってたりする。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
0090デフォルトの名無しさん2010/03/17(水) 01:33:03
JIS版C++ではOKだがISO版C++ではNG…ということか?
■ このスレッドは過去ログ倉庫に格納されています