- 1 名前:デフォルトの名無しさん [2006/08/22(火) 09:21:31 ]
- はきだめのスレへようこそ
ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。 なお、質問する人は回答はあまり期待しないでください。 前スレ:はきだめC/C++下級者の質問箱 pc8.2ch.net/test/read.cgi/tech/1124256027/
- 267 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 02:33:31 ]
- つーか、今まで「もろはのけん」だと思ってたよ。
ついでに正しい知識が身についてよかった。 ・・・・吉野家コピペくらいでしか使わないかもしれないが。
- 268 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 10:57:54 ]
- うかつなこと書くなよ
剣がケツの穴に刺さったところ想像しちゃったじゃないか
- 269 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 19:58:59 ]
- C++で例外と入ったら、性能よりも例外安全のほうがよっぽど心配になる。
- 270 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 00:59:54 ]
- そいつもいちいちごもっとも。
- 271 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:38:49 ]
- 質問失礼します。
stringに入っている文字列を char* に変換したいのですが 良い知恵はありますでしょうか。 const char* では無く char* にしたいのです。 今のところ思いつくのは、自前で char* の領域を確保して そこに c_str() の内容をコピーすれば問題は無いかと思うのですが せっかく便利なクラスがあるのに、何だか冗長な気がします。 一応調べた限りでは const_cast という物があるようですが const_castした文字列にアクセスした場合の動作は未定義という 記述がされていたりするのでそれはちょっと無いかな、と思います。
- 272 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:54:43 ]
- >>271
std::vector<char>でも使えば?
- 273 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 01:59:47 ]
- const_castは古いライブラリの機能を無理やり使いたい時とかのためだけに用意されてる様なもん。
基本的に使っちゃ駄目。 で、const_castを止めておきながら、こんなコードを薦めるのは激しくナニなんだが、 std::stringは添え字演算子が使える。 ので、一応 std::string str = "nullpo"; char* p = &str[0]; みたいな書き方はできないわけじゃない。 やっちゃ駄目よ? 問題起こしたところも見たことは無いけど。
- 274 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 02:29:31 ]
- >>271
>stringに入っている文字列を char* に変換したいのですが これが何を言っているかはっきりしないんだけど、 char *型の引数を要求するけど実際には渡した領域を更新することはない、 という関数に渡すというような使い方なら、const_castで問題ないと思う。 >const_castした文字列にアクセスした場合の動作は未定義 参照するだけなら問題ないんじゃなかったっけ? 文字列を更新する目的で char*型にしたいといっているなら、 自分で更新可能な領域にコピーするしかない。
- 275 名前:271 mailto:sage [2006/10/21(土) 03:05:01 ]
- >272-274
参考になります。 今回の場合、実際は更新しない文字列だったので >274さんの言う通りconst_cast使っても問題はあまり無さそうです。 ただ、更新する文字列のことも考えると 自前で確保する方法も覚えて損はなさそうですね。 std::vector はまだ使った事がありませんが覚えておきます。 ありがとうございました。
- 276 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 07:38:19 ]
- >>273
そのうちstd::vector同様にstd::basic_stringでも認められるという噂を聞いたことがあるんだ。
- 277 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 10:49:27 ]
- >>276
いや、あれは実際に採用されるかどうかはまだ怪しい話。
- 278 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:30:53 ]
- このレベルで「はきだめ」なのか…orz
ここ以下のおいらはどこに行けばいい?
- 279 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:39:19 ]
- こんなスレもあるぜ
【初心者歓迎】C/C++室 Ver.32【環境依存OK】 pc8.2ch.net/test/read.cgi/tech/1160893851/ でも、余程頓珍漢な事を書かない限りここでもokだと個人的には思うが。
- 280 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 20:05:10 ]
- まぁ、ここは下級者の質問をネタに半可通が自爆するスレだからこそ掃き溜めというわけだからな。
- 281 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 11:02:39 ]
- int function(const int x)
と int function(int x) の違いを教えてください。
- 282 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 12:09:53 ]
- >>281
前者はxがconstだから関数の中で代入できない 関数に渡す値は非constでもOK
- 283 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 17:21:12 ]
- #include <iostream>
using namespace std; //avg関数の宣言 double avg(int t[]); int main() { int test[5]; cout << "5人のテストの点数を入力してください。\n"; for(int i=0; i<5; i++){ cin >> test[i]; } double ans = avg(test); cout << "5人の平均点は" << ans << "点です。\n"; return 0; } //avg関数の定義 double avg(int t[]) { double sum = 0; for(int i=0; i<5; i++){ sum += t[i]; } return sum/5; }
- 284 名前:283 mailto:sage [2006/10/23(月) 17:24:23 ]
- 配列を関数で引数として使う場合は実引数として配列名を渡しますよね
でも配列名は先頭要素のアドレスを表しますよね。 関数のdouble avg(int t[])の仮引数、t[]に先頭要素のアドレスを渡すことで 何で上のソースが動くのですか? もし配列の各要素の値が渡されるとしたなら納得できるのですが、 アドレスが渡されるのにこの関数が動く理由がわかりません・・・ どなたか納得できるように説明していただけませんか?
- 285 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 18:03:33 ]
- >284
C言語の配列がメモリにどう配置されるかを学ぶと良い Cの配列は要素[0]を先頭に 連続したメモリ領域に配置される 例えば char s[255]; と書いた場合 s[0] のアドレスが 54322 バイト目なら s[1] のアドレスは 54323 バイト目になる char は1バイトだから1バイト毎 short なら2バイトだから2バイト毎な だから配列の先頭要素のアドレスが判れば その先の要素のアドレスも判る
- 286 名前:284 mailto:sage [2006/10/23(月) 20:29:26 ]
- >>285
詳しい説明ありがとうございます。 何となくですが分かりました。 もうちょっと詳しく勉強してみます
- 287 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 21:22:18 ]
- 関数を使う立場からすれば、大きさの分かっている配列を渡しているが
渡された立場からみると、配列の大きさがわからない。 で、範囲外のアクセスでバグる と。
- 288 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 04:00:10 ]
- そこでテンプレートです。
- 289 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 08:26:57 ]
- #include <string.h>
と #include <string> と #include <cstring> の違いを教えてください。 cmath等と同様、cstringが最新のC++にあっているのかと思っていたのですが、 bcc32でcstringでコンパイルできたものがvc7ではstringにしないと、 二項演算子 '!=: 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) というエラーが出てコンパイルできませんでした。時期的には、vc7の方が新しいはずなのですが・・・
- 290 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 08:45:25 ]
- >>289
そもそも何がしたいんだ? Cの<string.h>のC++版が<cstring>で、 strlenとかstrcpyなどの関数を使用するときにインクルードする。 C++での<string>はstd::stringという文字列クラスを扱うときに用いる。
- 291 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 12:15:02 ]
- >289
・C言語の "string.h" 文字列操作の為のライブラリ ・C++ の <string> 文字列クラス std::string を使う為のライブラリ ・C++ の <cstring> C言語の "string.h" 風味のライブラリ C言語の str〜 系の関数を使いたいなら cstring をインクルードする もしくは、ソースには"string.h" と書いて 大概の処理系にある C言語としてコンパイルするオプション(や拡張子 .c) でコンパイルすれば良い
- 292 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 16:58:06 ]
- #include <iostream>
using namespace std; //func関数の宣言 void func(); int a = 0; //main関数 int main() { for(int i=0; i<5; i++) func(); return 0; } //func関数の定義 void func() { int b = 0; static int c = 0; cout << "変数aは" << a << "変数bは" << b << "変数cは" << c << "です。\n"; a++; b++; c++; }
- 293 名前:292 mailto:sage [2006/10/24(火) 17:02:11 ]
- staticをつけると、そのローカル変数はグローバル変数と同じ記憶寿命を持つんですよね?
同じ記憶寿命を持っても上のコードでfunc()関数が呼び出される度にstatic int c = 0;と初期化しているのに何故実行結果では 0,1,2,3,4と増えていくのでしょうか? staticをつけて初期化されるのは一回目だけということでしょうか?
- 294 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 17:48:49 ]
- その通り
「初期化」は最初だけ 毎回0にしたければ「代入」をするべし
- 295 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 17:52:36 ]
- >>294
一つ謎がとけました ありがとうございます
- 296 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 05:43:46 ]
- まだまだ謎がありそうだけど、
あなたを犯人です。
- 297 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 07:00:13 ]
- >296
中国語でおk
- 298 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 12:14:07 ]
- スレ違いかと思いますが、どこで聞けばいいのかもわからないアフォです。どうか助けてください。
普段からコンパイラにbcc5.5を使っているのですが、 今回、グラフィックスを描く必要があって、 ftp://spdg1.sci.shizuoka.ac.jp/pub/GrWinlib/index.htmlに置いてあるlGrWn0999b-f2bcc.exeでインストールして、 www005.upp.so-net.ne.jp/h-masuda/grwin/grwin01.htmlにある以下のサンプルを 動かしてみました。 #include <GrWin.h> int main(void) { int width = 640, height = 400; /* ウィンドウサイズ640×400 */ GWopen(0); /* ウィンドウのオープン */ GWsize(-5, &width, &height); /* ウィンドウサイズ設定 */ GWsize(-3, NULL, NULL); /* フレーム(枠)サイズ設定 */ GWvport(0.0, 0.0, (float)width / (float)height, 1.0); /* ビューポート設定 */ GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0); GWquit(); /* 終了処理 */ /* ↑ワールド座標系設定 */ return 0; } 普段課題を出されたときと同じようにbcc32 sample.c のように打ち込んだのですが、 Error:外部シンボル '_GWopen'が未解決(C:\CWORK\SAMPLE.OBJが参照) Error:外部シンボル '_GWsize'が未解決(C:\CWORK\SAMPLE.OBJが参照) Error:外部シンボル '_GWvport'が未解決(C:\CWORK\SAMPLE.OBJが参照) Error:外部シンボル '_GWindow'が未解決(C:\CWORK\SAMPLE.OBJが参照) Error:外部シンボル '_GWquit'が未解決(C:\CWORK\SAMPLE.OBJが参照) というエラーが出てしまいどうしても動いてくれません。 一度bccとGrwinをインストールし直したり、手動でインストールしようとして他のプログラムまで動かなくなったり、 あの手この手を尽くしたつもりなのですがダメでした。 googleで似たような症状を探しても見つけられないし、八方塞がりです。 どなたか解決法のわかる方、いらっしゃいませんでしょうか?
- 299 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 12:35:41 ]
- GrWinとやらはダウンロードしてないがlibファイルは入ってなかったか?
入ってたとしたらそれをリンクすればいけるかもしれない
- 300 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 18:06:14 ]
- すいません教えて下さい。
ClassDef のオブジェクトを他の関数らで使いまわしたいのです。 その場合、ClassDefのオブジェクトが無ければ作り 作られていればそのオブジェクトを使いたいのです。 そこで GetObjという関数を作り、そこで上記の判断を させようと思うのですが、どのように作れば良いのかが・・・ 下記の他にも良い書き方があればご教授の程お願い致します。 ClassDef* ObjDefP = NULL; ClassDef GetObj() { if( ObjDefP = NULL ){ ClassDef ObjDef; ObjDefP = &ObjDef; return AppObj; }else{ //return ObjDefP//ここが良くわかりません・・・ } } func1() { ClassDef Obj = GetObj(); Objに対して処理1 } func2() { ClassDef Obj = GetObj(); Objに対して処理2 }
- 301 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 18:23:11 ]
- シングルトンパターンだな.
new 使わない微妙なやつだけど、参照返しで class ClassDef { private: ClassDef() {} ~ClassDef() {} public: static ClassDef& GetObj() { static ClassDef body; return body; } // その他公開メソッド }; ////// 利用側 func1() { ClassDef& cObj = ClassDef::GetObj(); } func2() { ClassDef& cObj = ClassDef::GetObj(); }
- 302 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:48:35 ]
- 以下で、どれが一番清く正しく美しいですか?
お兄ちゃんはどんな風に書く? int main(void) {} int main() {} main(void) {} main() {}
- 303 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:53:14 ]
- >>302
Cならばint main(void) {} C++ならばint main() {}
- 304 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 09:33:03 ]
- ちょっとしたテストコードは main() { で書いてる。
でもある程度長くなりそうなら 値返すだけでなくコマンド引数も受け取る。
- 305 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 18:58:32 ]
- ああ、コマンド引数は考えなくてもいいですけど。
そっか、Cではint main(void)が厳密なんですね? C++ではvoidが省略できるみたいな?
- 306 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 20:55:41 ]
- C++ は main() って書くと int main() 扱いじゃなかったか?
んで暗黙に return 0; が書かれたことになるって仕様だったような。
- 307 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 21:21:34 ]
- >>306
暗黙のintはなくなった。2文目は正しい。
- 308 名前:302 mailto:sage [2006/10/31(火) 22:01:45 ]
- 自分の得たい答えは得られました。
ありがとうございました。
- 309 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 10:04:14 ]
- iostreamで質問があります。
文字列を入力するとき string s; cin >> s; とすると、長さ1以上の場合は問題ないのですが 長さ0の文字列が入力できません。 エンターキーだけ押せば長さ0の文字列と見なして欲しいのですが、 どうすればいいでしょうか。
- 310 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 10:13:02 ]
- getline(cin,s)
- 311 名前:309 mailto:sage [2006/11/02(木) 17:12:16 ]
- >>310
ありがとうございました!
- 312 名前:デフォルトの名無しさん [2006/11/13(月) 00:50:01 ]
- 初学者の下らない質問ですがお許しください。
VC.Net2005を買ってきたのですがマシンパワーが足りないのでIDEを 使いたくなくてコマンドラインコンパイラとして使用しようと思っています。 C:\Program Files\Microsft VisualStudio 8にインストールし、 C:\ComLineCode\Cpp\にソースコードを置こうと思っています。 テストという事でcpptest.cppと名前を付けたコードをコンパイルしようと したのですが、includeファイルが見つからないといわれたので、 OS(Win2k)の環境変数にINCLUDEを作り、iostreamを検索した結果出てきた フォルダを指定してやったのですが、 C++例外処理を使っていますが、アンワインドセマンティクスは有効にはなりません。 と出てコンパイルできません。 // cpptest.cpp #include <iostream> using namespace std; void main(void) { cout << "表示されれば設定OK"; } //EOF cl cpptest.cpp ソースは間違って居ないと思うので設定が不味いだけだとおもうのですが、 どのようにしたら上手くコンパイルできるでしょうか? C++以前の問題ですが、どうぞアドバイスを下さい。お願いします。
- 313 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:18:59 ]
- >>312
「スタート→プログラム→Visual C++ 2005 Express Edition →Visual Studio Tools→Visual Studio 2005 コマンド プロンプト」 で必要な環境変数が設定された状態のコマンドプロンプトが起動できる。 その例外処理がなんたらというのはエラーではなく警告。一応実行ファイルは作られている。 そしてその警告文には、その後に「/EHsc を指定してください。」と書いてあるはずだ。そのとおりにしろ。
- 314 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:21:20 ]
- >>312
エラーメッセージはちゃんと全部読め。 cl /? を見ろ。オンラインマニュアルを読め。
- 315 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:21:24 ]
- INCLUDEはvcvars32.batとか使えば勝手に設定されるからそっち使えよ。
でもってアンワイ(ryに関しては warning って書いてあるでしょ? エラーじゃなくて警告だから気にしないのなら気にしなくていいし、 気になるんなら警告に書いてある通りにオプションつけろ。
- 316 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:22:22 ]
- >>313-315
3P汁
- 317 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 01:27:36 ]
- いまだにデフォルトになってなかったのか。なんでだろうな?
- 318 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 04:10:14 ]
- vcvars32.batに
SET CL=/EHsc の行を加えておくことを推奨
- 319 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 10:16:37 ]
- int* p;
と int *p; って同じもの?
- 320 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 14:49:47 ]
- >>319
同じ。だが int *p, *q; と int* p, q; は違うから初心者は注意するように。
- 321 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:05:25 ]
- どう違うんだろう
int *p, *q; は int *p; int *q; で int* p, q; は int *p; int q; であってる?
- 322 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:15:32 ]
- あってる
- 323 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:16:00 ]
- ありがとう
- 324 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 12:49:06 ]
- ディレクトリの中を*を含んだ文字で検索するプログラム作っています。
windowsだと _findfirst,_findnextがあって、*を含んだ検索が出来ます。 linuxだと opendir,readdirがありますが、*を含んだ検索が出来ません。 そこで質問なんですが、 struct dirent *dir;とすると、 readdirを読んで、dir->name比較する関数で毎回調べて、 繰り返さないといけないでしょうか? なにか他に簡単な方法あるとよいのですが。 よろしくお願いします。
- 325 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 12:56:06 ]
- まあ普通にreaddir+fnmatchで大した手間にはならないと思うけど
他にやり方があるのかは知らない。
- 326 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 13:09:21 ]
- >>325
実は、_findfirst,_findnextで作ってしまいまして。 コンパイルできないと思ったら、linuxだからということがわかりました。 似たような関数があればー。と思ったのですが。 確かに、そんなに大変ではないかもしれないです。 ありがとうございました。
- 327 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 23:55:59 ]
- C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。
例えば template <T> hogehoge(T val){
- 328 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:00:53 ]
- すみません、途中で書き込んでしまった・・・。
C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。 例えば template <T> void hogehoge(T val){ if(T == int) { 処理1 } else if (T == char) { 処理2 } } のようなことをやりたいのです。もちろん上のコードはコンパイルなどできませんが・・・。 void process(int val){...} void process(char val){...} .... みたいなものを型ごとにひたすら用意して、 void hogehoge(T val){ process(val); } とすればできますが、それだとコード量がふくらんでしまいます。他に良い方法ありますか?
- 329 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:13:53 ]
- >>328
明示的特殊化を使えば?
- 330 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 07:29:32 ]
- >>326
つ[popen("/bin/ls *", "r")]
- 331 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 11:58:02 ]
- >>328
typeid
- 332 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 17:56:02 ]
- >>328
BoostにMPLとかtype_traitsとかいろいろあるよ。 まあこんなところで勧めていいかわからないが。
- 333 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 03:34:45 ]
- 質問です。
今までファイルからデータをストリームとして呼んでいたのですが、ファイルの内容を簡易的に隠蔽したくて、 ヘッダファイルにchar filedata[] = "(ファイルの内容)"; として、ソースに埋め込んだのですが、これをファイルからの読み込みと同じように、ストリームとして読み込み処理を行いたいのです。 char配列をストリームにする方法ってあるのでしょうか。
- 334 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 08:10:49 ]
- >>333
iostream の実装は自分で定義することができるようになってるから、 いちおう可能なはず。簡単かどうかは知らない。 ↓ここらへんから始めれ。 www.google.co.jp/search?q=iostream+%E5%AE%9F%E8%A3%85
- 335 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 09:58:12 ]
- つstd::istringstream <sstream>
- 336 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:36:06 ]
- vector<T>ってTがbool型以外の時はメモリが連続していると聞いたのですが、
vector<float> *vec = new vector<float>(5000); for(int i=0; i<5000; i++) { float *tmp = (float *)&vec[i]; cout << *tmp << endl; *tmp = 100; } Visual C++ 2005 でこのコードを実行するとエラーになります。 Visual C++だとメモリが連続していないのでしょうか?
- 337 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:47:32 ]
- >>336
× (float *)&vec[i]; ○ &(*vec)[i] 無茶なキャストした時点でなんかおかしいって気づけよ。
- 338 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:57:10 ]
- >>337
gcc4.0だとこれでも上手くいくのですが・・・・。
- 339 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:59:45 ]
- ちなみにこのページを参考にしました。
ttp://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html
- 340 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:03:26 ]
- >>338
未定義動作。 >>339 そのページを見て vector を new するとは、本末転倒。
- 341 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:08:10 ]
- >>338
間接参照のレベルが一段違うだろうが。
- 342 名前:336 mailto:sage [2006/11/18(土) 23:11:33 ]
- >>336
あ、分かりました。 float *tmp = (float *)&vec[i]; でなくて float *tmp = &(*vec)[i]; とすべきだったんですね。vec[i]ではvector<float>の配列としてi番目のvector<float>オブジェクトにアクセスする意味になってしまう・・・。 寝ぼけてました。すみません。
- 343 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:13:03 ]
- 意味を持つのはvec[0]だけ。
vec[1]〜はメモリのどこを指しているのかわからない。
- 344 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:21:04 ]
- >>343
ばかですか?
- 345 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:23:37 ]
- どこを指してるかはわかるだろ
- 346 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:29:59 ]
- 要するにvec[1]をアクセスした時点で未定義動作だろ
- 347 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:30:08 ]
- >>344
危険いっぱいの所を指している、という事を言いたかっただけなんじゃまいか
- 348 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:35:43 ]
- 配列の要素を指していないポインタに対して +/- した時点で未定義動作。
p[i] は (*(p+i)) と定義されているので、 vec[0] も未定義。
- 349 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:43:49 ]
- vec[0]は*vecなので、vector<float>を指しているだろ。
何言ってんの?
- 350 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:47:44 ]
- × vec[0]は*vec
○ vec[0]は*(vec+0)
- 351 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:49:32 ]
- >>350
本気で信じてるのか?規格書のどこに書いてあるか出せよ。
- 352 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:52:42 ]
- >>348の1行目が本当だとしても
NULLは0とは限らないがNULLが0でないコンパイラなんてまずない ってのと一緒で、ほとんどのコンパイラじゃ問題にならないんだよな?
- 353 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:54:30 ]
- C++ では 5.7p5 に >>348 の言ってることは書いてあるが、
その前に 5.7p4 で配列じゃないオブジェクトを指すポインタは 要素数1の配列と同等に扱うとなっているので、問題ない。 5.7p4 を読まずに 5.7p5 だけ読んだんだろう。 C では 6.5.6p7, p8 に同様のことが書いてある。
- 354 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:54:33 ]
- いやいや、そんな些末な納得の仕方よりも、規格書で該当する部分を
出してもらえばそれで完全に決着するから。
- 355 名前:348 mailto:sage [2006/11/18(土) 23:56:46 ]
- 正直スマンカッタ
- 356 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 23:56:54 ]
- というわけで>>348>>350は無知だと証明されました。終わり。
- 357 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 12:42:11 ]
- linuxなんですが質問です。
ただ単にファイルをコピーするプログラムと lsコマンドを自作したのですが、 もし、lsコマンドするフォルダに書き込み中のファイルがあったら、 「書き込み中」を表示したり、違う処理をしたいのですが、 書き込み中か調べる方法ってありますでしょうか? 考えてみたのですが ■lsコマンド側で解決方法 sleepを入れて容量の増減を調べる。 (これだと返ってくるまで、すごい時間が掛かってしまいます。) ■書き込むプログラム側の解決方法 ・元のファイルをA,コピー先のファイルをA'とすると 1、A'を作ります 2、ファイルディスクリプタ指定してA'をlockします 3、書き込みします。 4、lock解除 ・何かCOPYコマンドにオプション付けるとコピーが終わるまで 読めなくなるとないでしょうか。
- 358 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 13:40:39 ]
- >>357
357です。 なんか質問の内容がぼけてしまってますね。 ちょっと質問内容変更させてください。 書き込むプログラムは、自分で作ったもので 無い場合(lockしてない場合)でも書き込み中か 知る方法ってあるでしょうか? sleep使って調べると時間かかってします。
- 359 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 14:14:40 ]
- 「書き込み中」を、「コピープログラムがコピーを完了していない」状態と考えていいのかな?
それならば、コピー完了を知る手段は一般的にはないと思う。 解決策としては、こんなもんかなぁ…… ・コピー元ファイルのサイズを知り、コピー先ファイルのサイズと較べる。 ・コピー対象ファイルの終端の特徴を知り、コピー先ファイルの終端がその特徴に一致するか調べる。 #汎用性はないが、コピー対象が特定のフォーマットに従っているならそれなりに実用的か。 ・コピープログラムに完了を通知してもらう。 #通知方法は色々考えられる。signalでもいいし、ファイルでもipcでもいいだろう。 ・コピープログラムに一旦別の名前でコピーしてもらい、コピー完了後に目的の名前に変えてもらう。
- 360 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 19:59:29 ]
- >>359
何通りもありがとうございます! どれもすごい参考になりました。 上2つは、初心者の僕でもすぐにできそうです。 signalも勉強してみます。
- 361 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 18:25:45 ]
- どうして
static const int Size = 256; int a[Size]; for (int i = 0; i < Size; ++i) ではなく static const std::size_t Size = 256; int a[Size]; for (std::size_t i = 0; i < Size; ++i) の方が正しいの?
- 362 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 00:34:24 ]
- >>361
誰がそんなことを言ってたかは知らんが、その範囲を見ただけでは 上が間違っているとは思えないが。 下のほうは、size_tが64bitのような環境ではかえって無駄なことをしているだけのように思える。
- 363 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 03:39:31 ]
- >誰がそんなことを言ってたか
cppllから引っ張ってきたネタでしょ www.tietew.jp/cppll/archive/12803 話題を提供しつつ小遣いを稼ぐという視点は無かったな
- 364 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 03:51:10 ]
- cppll って、技術コミュニティとしてはもう崩壊してるよね。
C/C++ コミュニティで「昔の C コンパイラでも void を書くか書かないで・・・」に 突っ込みが入らないのは異常だろ。
- 365 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 05:34:30 ]
- >>362
そりゃ実装依存の話であって、誰が悪いかっつったら断りなしにsize_tを64ビット化した環境のが悪い気が。 もっとも、size_tは基本sizeofの返り値用の型だし、要素数表現に使われてるのはちょっと微妙なわけだが。
- 366 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 17:03:25 ]
- size_tを要素数や文字列長に使うのは自然だと思うけど。
無符号というのも意味的にスッキリしてるし。 ビット長はその処理系で必要な長さになってるんだから無駄と言うのも変な話だ。
- 367 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 02:07:17 ]
- 例えばmallocの引数型がsize_tなのは、
そのままsizeof演算子の結果に配慮したからで、 これを要素数倍するのは構わないのだが、 要素数を扱う型にくくってしまうのは、少々短絡的。 文字列長に使うのは、charがなんだかんだで バイト単位と認められてしまってるところから。 一番悪いのはlengthof演算子だのlength_tだのを 用意しなかったCそのものだと思われるが、 C++に世代が移ってループもイテレータで回す昨今、激しくどうでもいい。 俺も上のようなことは正直こじつけそのもので、自分でもまったく信じてない。 最近だとptr_diffなんかも64ビット化してるんで、 細かい目で見るとポインタの加減算もコストが嵩んでる。 無視するのがいいのだろうが、世の中ままならぬ。
|

|