- 1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 110 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 07:20:58 ]
- (UNDEF+1) * 1000 + 0
だから恐らく1000
- 111 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 07:52:49 ]
- 有り難うございます。
マクロってこんな事も出来たんですねぇ。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 09:21:26 ]
- eclipse,CDTで開発しています。
普通はprintf("1"); scanf("%d",&num);とやれば1が表示された後入力を求められるのですが、 何故か私の環境では1が表示されずいきなり入力を求められ、 printf("1"); fflush(stdout); scanf("%d",&num); とやらないと正常に表示されません 何か出力ストリームの挙動がおかしいです。 ググってみたところfflush(stdout);をするとそれなりに処理時間がかかってしまうそうですし・・・ これってスピードを求められるcでは致命的ですよね? ググると同じような現象が起こった方が数人居るようですが、解決方がfflush(stdout); しか載っていません。fflush(stdout);以外の解決法教えてください。 コンパイラはMinGW5.0 + msys1.0 CDTはeclipse3.3の更新サイトでついてくる奴 使ってます。
- 113 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 09:34:40 ]
- ユーザー入出力にスピード求めるのか?
対象ユーザーどんだけニュータイプなんだよw
- 114 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 09:38:27 ]
- 対象ユーザーじゃなく112がニュータイプ
- 115 名前:112 mailto:sage [2007/07/20(金) 09:54:59 ]
- そうですか。では普通にfflush(stdout);で解決しても無問題ということですね。
ご回答thx
- 116 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 11:01:57 ]
- >>112
その辺は微妙な話だと思う。 stdoutは端末に結び付けられている場合は行バッファリングされ、 そうでない場合はフルバッファリングされるのが伝統的実装のようだが、 規格でそうしろと決まっているわけでもないようだ。 stderrがバッファリングなしというのは決まっていたはずだが。 さらに、入力を行う際は、行バッファリングされている出力を 前もってフラッシュすることになっていたと思うが、よく分からん。 stdoutが行バッファリングされている場合に、>>112のような コードで、改行なしのプロンプトを表示後に入力できるためには、 そうなっていなければならないのだが。 もしかしたら、>>112の環境ではstdoutがフルバッファリングされているのかもな。 確実に即座に出力を表示したい場合は、stderrを使うというのが一つの手だが、 いちいち fprintf(stderr, ...) と書きたくないのなら、 setvbuf()を使ってstdoutをバッファリングなしに設定するという方法もある。 stdoutはリダイレクトされることもあるのだから、できれば isatty()などを用いて標準出力が端末かどうかを見たほうが良いのだが、 残念ながらこの方法は移植性があるとは言えないのが難点だ。
- 117 名前:デフォルトの名無しさん [2007/07/20(金) 14:49:27 ]
- C++の認定試験てあるの?
- 118 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 14:51:36 ]
- ある。俺が創った。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 14:57:04 ]
- そしてオレが認定。
- 120 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:27:53 ]
- そして俺が脱落
- 121 名前:電通女 ◆v1Uy5WkQ7k mailto:sage [2007/07/20(金) 20:38:06 ]
- #include<stdio.h>
struct complex{ double re,im; }; この意味を教えてください。
- 122 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:43:17 ]
- ストラクトは構造体、コンプレックスはそれにつけた名前(intとか、charとかに匹敵)
その次のダブルはその構造体の構成要素、だと思います 私はc言語暦1週間くらいなので当てにならないかもしてませんが
- 123 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:43:42 ]
- 電通女 ◆v1Uy5WkQ7k に一致するページは見つかりませんでしたからダメです。
- 124 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:45:06 ]
- >>121
構造体って習った?
- 125 名前:電通女 ◆v1Uy5WkQ7k mailto:sage [2007/07/20(金) 20:47:29 ]
- 構造体で、"re"と"im"という変数を定義してるって事ですか?
- 126 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:49:57 ]
- それって複素数でそ?
私にもわかるよww
- 127 名前:電通女 ◆v1Uy5WkQ7k mailto:sage [2007/07/20(金) 20:53:36 ]
- それは分かってるんですが、プログラムの意味がわからなくて。
- 128 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:57:50 ]
- >>121
struct kozotai{ double a; double b; }; これが何か分かるならそれもわかるはず
- 129 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:58:40 ]
- double型の変数reとimを含む構造体complexを宣言した。
それだけ
- 130 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:04:39 ]
- >>127
子宮で考えるんじゃない、脳で考えるんだ!!
- 131 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:26:39 ]
- あまりにも初心者すぎる質問ですが、お願いします。
VC++2005EEで新規作成->Win32コンソールアプリケーションを作成(オプションで "空のプロジェクト"を選択)した後、 #include<iostream> int main(){ std::cout << "hello"; return 0; } だけのmain.cppをソースファイルフォルダに作成し、これをビルドしようとすると 以下3つのエラー: main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。 main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。 fatal error LNK1120: 外部参照 2 が未解決です。 が発生します。 思い当たるところがあればお教えください。よろしくお願いします。
- 132 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:29:55 ]
- "空のプロジェクト"がダメなんじゃ?
"こんにちは、世界"でどうぞ
- 133 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:37:00 ]
- >>131
別にその通りにやって普通にコンパイルできるけどな。 MSSDKをインストールしていて、そのlibディレクトリにlibcp.libとかいう 怪しいライブラリが入っていたりしない?
- 134 名前:131 mailto:sage [2007/07/20(金) 23:41:11 ]
- libcp.libより怪しい133が入ってますた!!
- 135 名前:131 mailto:sage [2007/07/20(金) 23:55:59 ]
- >>134
誰てめえw >>132 すいません、もう少し分かり易く・・・ "空のプロジェクト"のチェックをはずしても同様のエラーが出ました。 (そういう意味じゃなかったですか?) >>133 確かにありました。しかしそのlibファイルをリネームしてみたり、 プロジェクトのプロパティからライブラリの無視リストに入れてみたり しましたが変化なしでした。 133さんで問題なくビルドできるということは、自分の特有の環境が 原因ということなのでしょうか(MSSDKあたり?)。調べてみます。
- 136 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:01:04 ]
- >>135
ふうん、変化なしか。 libcp.libはC++のランタイムで、本来はVC++に付属のものが使われるべきで SDKになぜか入っていたりする怪しいのが優先参照されちゃうとマズかったりする。 てっきりそのせいかと思ったんだがな。 コマンドプロンプトからvcvars32.batを実行後に普通にcl.exeでコンパイル するとどうなる?
- 137 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:35:42 ]
- >>136
動きました!なぜ。 cl.exeでmain.cppを直接コンパイルすると、下のような警告が大量に出ましたが 問題なく動きました。 C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\ostream(751) : warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティ クスは有効にはなりません。/EHsc を指定してください。 main.cpp(6) : コンパイルされたクラスの テンプレート のインスタンス化 'st d::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::b asic_ostream<_Elem,_Traits> &,const char *)' の参照を確認してください with [ _Elem=char, _Traits=std::char_traits<char> ] これで動くということは、VC++の設定の方でどこか変えてはいけない部分を 触っちゃって(かつ忘れて)いるといったところでしょうか。
- 138 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:41:58 ]
- >>137
その警告はまぁオプション指定しないと普通に出るね。言われたとおりに /EHscを指定すればよい。 後はまぁ、clで無オプションでコンパイルしたんならデバッグ版のライブラリ じゃないから、IDEからリリースビルドでやってみるとか、 ツール→オプションでVC++ディレクトリの優先順位をチェックするとか、 プロジェクトファイルの中を見てみて、どうなってるかチェックするとか、 色々やってみるんだね。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:52:24 ]
- まあ、vcvars32.bat内に
set CL=/EHsc /Ox /W4 程度を適当に入れとくべきだろ。
- 140 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:56:24 ]
- 親切にありがとうございました。
一応動くようにはなったので、いろいろ試しつつ 何が原因だったのか調べてみようと思います。
- 141 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:34:54 ]
- 今思ったんだが、「空のプロジェクト」ってなんかカッコよくね?
“Project S・K・Y” とか表記するともっとカコ(・∀・)イイ
- 142 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:35:50 ]
- から
- 143 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:36:00 ]
- 「からのぷろじぇくと」としか読んだこと無い
- 144 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:37:05 ]
- empty project
- 145 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 17:22:05 ]
- ポインタって何ですか?
- 146 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 17:26:58 ]
- >>145
ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29
- 147 名前:145 mailto:sage [2007/07/21(土) 17:29:11 ]
- >>146
ありがとうございました。
- 148 名前:デフォルトの名無しさん [2007/07/21(土) 19:51:49 ]
- HARC HWNDっておなじですか??HARCがエラーになります
- 149 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 20:20:19 ]
- HARC?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 20:26:06 ]
- A SHARK?
No,a dolphin! Watch out!!
- 151 名前:デフォルトの名無しさん [2007/07/21(土) 20:30:47 ]
- 書庫のファイル名を取得したいんですけど・・・どうすればいいかわかりますか??
#include <windows.h> #include <iostream> using namespace std; typedef HWND (__stdcall *FND)(const HWND ,LPCSTR , const DWORD ); typedef int (__stdcall *FNE)(const HWND , LPCSTR ,int ); main(){ char buf[128]; HINSTANCE hd = LoadLibrary("UNZIP32.DLL"); FND pd = (FND)GetProcAddress(hd,"UnZipOpenArchive"); FNE pe = (FNE)GetProcAddress(hd,"UnZipGetFileName"); HWND q=(*pd)((HWND)hd, "file.zip",0); (*pe)(q , buf, 128); cout<<buf<<endl; FreeLibrary(hd);}
- 152 名前:関数はこうなっています・・・ [2007/07/21(土) 20:34:20 ]
- HARC WINAPI UnZipOpenArchive(const HWND hWnd,LPCSTR szFileName, const DWORD dwMode);
機能 指定ファイルが UNZIP32.DLL に有効な書庫ファイルかどうか調べ、 有効であればオープンし、一意の数値(ハンドル)を返します。 以後の書庫ファイルへのアクセスはこのハンドルでおこないます。 アクセスを終了する時は UnZipCloseArchive 関数を呼ばなければなりません。 引数 hWnd UNZIP32.DLL を呼び出すアプリのウィンドウ・ハンドル。 szFileName 書庫ファイル名。 dwMode 処理モードを指定するフラグ。次の値を|(オア)で 組み合わせる。 戻り値 指定の書庫ファイルに対応したハンドル。エラー時は NULL を返します。 int WINAPI UnZipGetArcFileName(HARC hArc,LPCSTR lpBuffer,int nSize); 機能 書庫ファイル名を得ます。 引数 hArc UnZipOpenArchive() で返されたハンドル。 lpBuffer ファイル名を格納するバッファ。 nSize バッファのサイズ。 戻り値 正常終了時に0、異常時にはエラーコード(0以外)が返ります。
- 153 名前:151 [2007/07/21(土) 20:39:24 ]
- 自己解決するかもしれないです・・・
- 154 名前:151 [2007/07/21(土) 20:42:36 ]
- 自己解決しました
- 155 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 20:53:49 ]
- C++(DirectX)でファイルを入出力する関数を作っています。
現在Cのfopenやfreadなどを使っており、スコアデータはこのファイルのxx番目だからfseekで移動して読み込むといった形を取っています。 しかしこれだと、例えばDirectXのXファイルであればMeshNormalsの位置に移動して、必要な数だけ読み込むといった手段が取れません。 検索してもファイルの入出力の解説を扱っているサイト自体少なく、2行目の方法が中心で困っています。 どこか参考になるサイト、もしくは書籍はありませんでしょうか。 また、ExcelデータはC++で読み書き(データの追加・削除)はできるのでしょうか。 ファイルの入出力周りは私の持っている本ではほとんど書かれていませんでしたので放置していたのですが・・ここに来てツケがorz
- 156 名前:151 本物 [2007/07/21(土) 20:57:49 ]
- 自己解決しました
#include <windows.h> #include <iostream> using namespace std; typedef HWND (__stdcall *FND)(const HWND ,LPCSTR , const DWORD ); typedef int (__stdcall *FNE)(const HWND , LPCSTR ,int ); main(){ char buf[128]; HINSTANCE hd = LoadLibrary("UNZIP32.DLL"); FND pd = (FND)GetProcAddress(hd,"UnZipOpenArchive"); FNE pe = (FNE)GetProcAddress(hd,"UnZipGetFileName"); FNE pf = (FNE)GetProcAddress(hd,"UnZipFindFirst"); HWND q=(*pd)((HWND)hd, "file.zip",0); (*pf)(q , "*", NULL); (*pe)(q , buf, 128); cout<<buf<<endl; FreeLibrary(hd); }
- 157 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 20:59:20 ]
- www3.uploader.jp/user/mol/images/mol_uljp00012.txt
11000111101111100011 っていう文字列が与えられた時に、1*2 0*3 1*4 .... って簡易圧縮みたいなのをしたいわけです で、文字列に 1と0以外のものが入ってた時に、とりあえずエラーを出したいんだけれど char buff[1024]; scanf("%s",&buff); for( n=0; buff[n] == '\0'; n++) { if ( buff[n] != '0' || buff[n] != '1' ) { printf("Error!\n"); goto endline; } } ここのifがうまく反応してくれません 初歩的なミスがあると思うのですが、よろしくお願いします
- 158 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 21:03:18 ]
- buff[n] == '\0'の条件を逆にしてみたら?
- 159 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 21:04:56 ]
- for( n=0; buff[n] != '\0'; n++)
- 160 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 21:06:23 ]
- ランレンクス圧縮?
- 161 名前:151 [2007/07/21(土) 21:09:20 ]
- for( n=0; buff[n] != '\0'; n++)
{ if ( buff[n] != '0' && buff[n] != '1' )
- 162 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 21:09:40 ]
- buff[n] != '0' && buff[n] != '1'
- 163 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 21:11:04 ]
- >>155
Xファイルは知らないのでExcelだけ。 Excelのファイルは所詮ただのバイナリファイルなのだから、 C++で読み書きできないわけがない。 しかしWindows上ならプログラムからExcelを操作してやるのが楽。 データ形式を考える必要もなく、しかもオブジェクトという形で取り扱える。 ただ、その独特な仕組みに慣れる必要があるけど。
- 164 名前:151 [2007/07/21(土) 21:14:11 ]
- CSVとかで出力してあとで変換すればいい
- 165 名前:155 mailto:sage [2007/07/21(土) 21:48:55 ]
- レスありがとうございます。
ファイル操作関連の関数は先ほど上げたものぐらいしか知らなかったので、なんとか前進できそうです。 ツール周りをエクセルからデータを引っ張ってくるようにしようかと考えておりましたが >>164で書かれているように拡張子を変えてやれば配布するデータにも加えれそうですね。 バイナリデータである以上、独自に形式を変えない限りユーザ側で改変するのは容易ですしね。
- 166 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 22:08:46 ]
- (>>158),>>159. >>161,>>162
サンクス! for( n=0; buff[n] != '\0'; n++){ if ( buff[n] != '0' && buff[n] != '1' ){ printf("Error!\n"); goto endline; } こうだった
- 167 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 22:15:03 ]
- なんであほの>>151が混ざってるんだ?
- 168 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 22:17:05 ]
- 私には括弧がついてるよーww
- 169 名前:166 mailto:sage [2007/07/21(土) 22:43:40 ]
- あ、そういうことですか。「逆」って||と&&の話かと
んだば、かっこは解除させていただくの方針で
- 170 名前:デフォルトの名無しさん [2007/07/21(土) 22:46:03 ]
- struct , typedef , class だとどれが一番いいとかありますか?
使わないですむやつありますか
- 171 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 22:50:58 ]
- なぜそこにtypedefが
- 172 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 22:51:03 ]
- >>170
日本語でおk
- 173 名前:デフォルトの名無しさん [2007/07/22(日) 03:03:23 ]
- 同じように見えて確保するサイズが全然違いますね
bitset<1> a[1024]; bitset<1024> b; cout<< sizeof(a)<<" "<<sizeof(b);
- 174 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 03:05:48 ]
- >>173
そりゃそうだろ。でもサイズ自体は実装依存。
- 175 名前:デフォルトの名無しさん [2007/07/22(日) 04:45:28 ]
- 配列を引数にして再帰すると駄目なんでしょうか?やってみていませんが
int fnc(int a[10]){ a[]に対して処理をする fnc(a); };
- 176 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 05:08:33 ]
- 何も問題ないが。
まあ、a はポインタだがな。
- 177 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 08:45:09 ]
- static charなポインタ変数って
0で初期化されているのですか?
- 178 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 08:50:24 ]
- されないから宣言時に0を代入するんだよ
- 179 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 09:01:28 ]
- staticな変数はゼロ初期化される。
- 180 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 09:21:33 ]
- >>179 が正解。
おっそろしく古い太古のコンパイラとか 規格に準拠してないコンパイラとかなら知らんがな!
- 181 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 12:15:15 ]
- >>177
K&Rのp.50
- 182 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 12:18:25 ]
- constって時々目にするけど、どういう意味があるの?
- 183 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 12:21:57 ]
- お前ら入門書読んでから質問しろw
- 184 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 12:23:43 ]
- まだはじめたばっかだから、気にしないで!
- 185 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:15:03 ]
- >>182
かなり大雑把なくくりでいうと、その変数の値を変化させることができないということだ。 const int a = 10; a = 5; /* NG */ const int a[10] = {0}; a[5] = 1; /* NG */ int b = 10; const int *a; /* constはポインタが指す値にかかる */ a = &b; /* OK ポインタを変更しているだけ */ *a = 7 /* NG */ b = 7 /* OK コンパイラはaの性質とbの性質の区別ができない*/ int b = 10; int c = 100; int * const a = &b; /* constはポインタにかかる */ *a = 5; /* OK */ a = &c; /* NG */ int b = 10; int c = 100; const int * const a = &b; *a = 5; /* NG */ a = &c; /* NG */ どっか間違ってたら訂正して
- 186 名前:デフォルトの名無しさん [2007/07/22(日) 13:27:31 ]
- VC++2005っていまいくら位でGETできます?
- 187 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:27:51 ]
- static charなポインタ変数が
0で初期化されていることは分かりました。 これはメモリアドレスの0番地を指しているという理解で良いでしょうか。 また、この場合NULLとどこが違うのでしょうか? 自分はNULLはメモリアドレスの0番地を指していると理解していたのですが…
- 188 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:30:12 ]
- NULLの定義による
- 189 名前:デフォルトの名無しさん [2007/07/22(日) 13:33:19 ]
- #define NULL 0 だから NULLって書いても0って書いても同じですよね
それなのに0で初期化したほうがいいと推奨されているのは何故ですか?
- 190 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:36:38 ]
- >>186
Express Edition ならタダ
- 191 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:40:02 ]
- >>182
C++だと、関数にconstを付ける場合もある いや、むしろ可能な限り積極的に付けて欲しい。 class Hoge { public: void foo_set(double d) { x = d; } double foo_get() const { return x; } private: double x; } hoge; ↑の例だと、void hoge.foo_set(double)関数は、メンバ変数 x を変える可能性がある。 同じクラス内のメンバ変数を変える可能性がある関数は、constにできない(コンパイルエラー) double hoge.foo_get()関数は、xの中身を見るだけで、変更する可能性はゼロなので constを **つけることができる** **付けなくてもコンパイルエラーにはならない。** つまり、自分(や、保守のコーダー)に縛りを課すという意味合いがある。
- 192 名前:デフォルトの名無しさん [2007/07/22(日) 13:42:13 ]
- >>189
0で初期化していないと そのポインタを使って何かをしてしまったときに 予期せぬ動作をしてしまうからじゃないの?
- 193 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:42:29 ]
- >>187
ポインタが 0 で初期化されるってのは、 ヌルポインタで初期化されるって意味だ。 static char* p; は static char* p = 0; と同じってこと。 ポインタに 0 を代入するとヌルポインタとして扱われるから、 要するにヌルポインタで初期化されるということ。
- 194 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:43:12 ]
- >>185
>>191 つまり保護のため?
- 195 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:43:24 ]
- >>189
NULLで初期化するなって書いてあった?
- 196 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:51:23 ]
- 静的な変数がビット表現 0 の値ではなくヌルポインタで初期化されるというのは、
C++ ならこんな形で確認できる。 #include <iostream> using namespace std; int main() { class A; static int A::*p; static int A::*null = 0; cout << (int&)p << endl; cout << (int&)null << endl; } p と null はメンバ変数へのポインタってやつなんだが、 こいつのヌルポインタのビット表現は大抵の環境で 0 にはならない。 上のコードを実行すると、p と null とで 0 でない同じ値が出力されると思う。
- 197 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:56:06 ]
- なんだかよくわからないけど、
とにかくNULLは使わない方がいいというのは解りました ありがとうございます
- 198 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:57:53 ]
- >>196
0なんだが
- 199 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:02:46 ]
- なんだってー。
0 になる環境もあるのかー。
- 200 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:06:16 ]
- g++ なら -1 になる。
- 201 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:06:27 ]
- >>189
NULLは、C言語では #define NULL (void *)0 と定義されていた。(今のCは定義を見たことがないから分からない) つまり、このC言語処理系では0はint型。 int *a; a = 0; /* コンパイルエラーまたはウォーニング */ a = NULL; /* OK */ 一方、C++では、0は特別な値に昇格した。 C++では、0はint型と(void *)型の両方の性質を持った。 つまり #define NULL 0 と定義されているが、これはかつて、C++がCの上位互換性的要素が高かったため このように定義してないと移植時に不便であったという意味合いが強い。 int *a; a = 0; // OK(推奨) a = NULL; // OK(互換性のため。推奨されず) C++がなぜそうなったかは私には分からないが、 「ifならカッコの中が0であればif文は実行されない。それ以外は実行される」 という定義のように、C++の構造化の文法に不都合が無かった(むしろ定義上都合がよい)ことや (void *)0 が実用的に不便だったからかもしれない。 その辺はもっと詳しい人に
- 202 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:09:30 ]
- >>201
あんま適当な事言わないで。
- 203 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:14:33 ]
- >>202
遠慮なく訂正していいんだよ
- 204 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:14:55 ]
- まあいいんじゃね。うそをうそと(ry
- 205 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:19:42 ]
- まず、C の時代から 0 はヌルポインタだ。
だというのに C で NULL を ((void*)0) と定義することが許されていたのは、 整数型へそのまま代入できてしまわないようにするためだ。 まあ警告止まりかもしれないが、ないよりゃマシだ。 何で C++ でその定義が許されなくなったかというと、 C では void ポインタから他のポインタへの暗黙のキャストが許されていたけど、 C++ ではそれを禁止するようになったからだ。 いちいち明示的なキャストが必要になるのでは困るので、 NULL は 0 と定義されるようになった。 そして、C でも C++ でも NULL が推奨されないなんて話は聞いたことがない。 ポインタを扱っているという目印になるわけで、プログラムを読みやすくする効果がある。 どんどん使えばいい。
- 206 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:30:56 ]
- 注意する点があるとすれば、
NULL にキャストが必要になるっつー状況がないわけではないことだ。 例えば C++ で NULL を可変個引数に渡す時とか。 そのままだと int 型の 0 が渡されてしまう。 ヌルポインタのビット表現が 0 でない環境だけじゃなく、 ポインタ型のサイズが 64 ビットで int 型のサイズが 32 ビットなんて環境(普通の 64 ビット環境)でも問題になる。 C++ においては NULL は単にプログラムを読みやすくするためだけに使われるもので、 NULL と書いたから安心だ、と思ってはいけない。 そういう意味で NULL には危険性はあるのかもしれないけど、 NULL を使わないと可読性が大きく犠牲になるから NULL を使った方がマシ。
- 207 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:51:39 ]
- >>201
0は単なる整数リテラルだからint型と決まっている。処理系の都合なんかではない。 C++で特別になったわけでもない。 0がポインタ型に変換できて、ヌルポインタになるのはCのときから変わっていない。
- 208 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 14:54:54 ]
- int *p = (1 - 2 + 1); /* ヌルポインタ */
- 209 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 15:06:36 ]
- そもそも、規格でのNULLの定義は、C++の場合「処理系定義の空ポインタ定数」となっている。
つまり0である必要性はなく、例えばGCCでは#define NULL __nullとなっている。 __nullはポインタ型へは暗黙の変換が可能だが、整数型へ暗黙の変換を行うと警告になる独自拡張の定数。 あと、NULLではなく0でいいだろと言っているのはBjarne。 だからC++にはNULL使わない派もそれなりにいる。どれくらいいるのかは知らないけど。 少なくとも、俺もその内の1人。
- 210 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 15:09:31 ]
- FAQ くらい嫁、で済む話じゃね?
ttp://www.kouno.jp/home/c_faq/c5.html#0
|

|