【初心者歓迎】C/C++室 Ver.70【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0002デフォルトの名無しさん
2009/11/22(日) 16:05:480003デフォルトの名無しさん
2009/11/22(日) 16:07:14自分は立てたくても立てられなかった
>>2
ガッ
0004デフォルトの名無しさん
2009/11/22(日) 19:49:450005デフォルトの名無しさん
2009/11/22(日) 19:59:40どうしたらいいのかがわからないんだけど。
一応ひとつ思いついた方法としては、構造体の中に、自分自身へのポインタを持たせて、
そのポインタをはじめは0にしておく。で、新しくnewかなにかをして、そのポインタを既存の要素に
持たせる・・・って感じなんだけど、これだと、途中で要素が消失したとき、その後の要素が
行方不明(ポインタが何処にも存在しない状態)になってしまう・・・ね。
はじめからポインタを用意してたら、上限数が決まっちゃうし、どうしたらいいかな?
0006デフォルトの名無しさん
2009/11/22(日) 20:08:37どうしても自分で書きたいならリンクリストでググれば望みのものがでてくる
で、なんで生態系シミュレートにリンクリストがいるんだ?
生物を数珠つなぎにしてなにかいいことあるのか?
0007デフォルトの名無しさん
2009/11/22(日) 20:16:060008デフォルトの名無しさん
2009/11/22(日) 20:26:49消える要素の後の要素のポインタを、消える要素の前の要素のポインタにつっこめばいい。
0009デフォルトの名無しさん
2009/11/22(日) 21:13:54char *func(){
char str[]="hogehoge";
return str;
}
void func2(){
char *str;
str=func();
}
とした場合、
func2内での、strの配列の領域が保証される寿命ってどこまでなのでしょうか?
func()抜けた瞬間、strが解放されると思ったんですが、一応暫く使えてるんですが・・・
0010デフォルトの名無しさん
2009/11/22(日) 21:23:04抜けた瞬間消えるけど、わざわざクリアしないし、しばらくは残ってるな。
基本、アクセスしちゃだめ。
0011デフォルトの名無しさん
2009/11/22(日) 21:27:04void func(char *str){
str = "hogehoge";
}
void func2(){
char *str;
str = func(str);
}
0012デフォルトの名無しさん
2009/11/22(日) 21:27:11解放されない。
いつでも使える。
0013デフォルトの名無しさん
2009/11/22(日) 21:29:38void func(char *str){
str = "hogehoge";
}
void func2(){
char *str;
func(str);
}
0014デフォルトの名無しさん
2009/11/22(日) 21:35:50何がしたいの
0015デフォルトの名無しさん
2009/11/22(日) 21:38:03馬鹿はほっとけ
0016デフォルトの名無しさん
2009/11/22(日) 21:39:31間違えたw。
馬鹿は13でよろしこw。
0017デフォルトの名無しさん
2009/11/22(日) 22:10:45>char str[]="hogehoge";
これ結構な高コストだからあまり多用しないほうがいいよ。
static char str[]="hogehoge";
なら良いけど。
0018デフォルトの名無しさん
2009/11/22(日) 22:18:00ポケモンカードでいうと、エネルギーカード2枚分くらいのコストですか?
0019デフォルトの名無しさん
2009/11/22(日) 22:18:540020デフォルトの名無しさん
2009/11/22(日) 22:19:09分かってないなぁw
改悪になってる・・・
ひょっとして"hogehoge"用に領域が9バイト確保された後、コピーされると思っていない?
違うんだなぁ、これがw。
プログラムがRAMにロードされたとき、
データとして"hogehoge"はメモリ上に展開されて、
その代入ではホゲ文字列の先頭アドレスがstrに設定されるだけ。
分かる?スタティックにする理由は何?
0021デフォルトの名無しさん
2009/11/22(日) 22:29:15つりか?
0022デフォルトの名無しさん
2009/11/22(日) 22:30:170023デフォルトの名無しさん
2009/11/22(日) 22:41:34char *str = "hogehoge"; ならともかく。
0024デフォルトの名無しさん
2009/11/22(日) 22:43:40まあ、ループ展開しないと比較演算は必要だから同じか。
002520
2009/11/22(日) 23:01:28おぉ、すまんすまんw。
自分のコーディングスタイルと違うので間違っちゃったw。
char str[]="hogehoge";
ってすると、スタックに積まれてたw。
これは危険だ!
なにげに勉強になっちゃったw。
では、さらばだ!
0026デフォルトの名無しさん
2009/11/22(日) 23:37:40いや、数珠つなぎにしたいとかじゃなくて、無限に要素を増やしたいから、どうしたものか・・・と。
で、自分がとりあえず考えた方法があれだったっていう
>>8
だなぁ・・・。
やっぱ、そうしかないのかな?
とりあえず、回答ありがとう。
0027デフォルトの名無しさん
2009/11/22(日) 23:50:55遅くていいならディスク上にファイルとして配列を持ち、ガリガリやれよ
相当遅いが、1TBの配列だって持てるわけだ
0028デフォルトの名無しさん
2009/11/23(月) 00:02:45要素数がNを超えそうなら*tmpに大きさ2Nの配列を確保して*dataの内容をコピー後ポインタをスワップ
スワップ後のtmpを解放
まあただのvector実装なんだが
0029デフォルトの名無しさん
2009/11/23(月) 00:09:320030デフォルトの名無しさん
2009/11/23(月) 01:51:22だから、無制限に要素を増やそうとすると数珠繋ぎとかになるんだよ
じゃなきゃ、溢れた時にでかい領域を再確保してコピーするとかな
で、それらをきっちりやってくれるのがSTLコンテナだが、原理知らないで使うと
えらいパフォーマンス落としたりもするから、一度自分でそれらしく書いてみても
いい
理屈が理解できたら、STLコンテナを使っちゃった方が安心で軽くて楽だが
0031デフォルトの名無しさん
2009/11/23(月) 01:56:40HDDのクラスタと同じようなもん。
vectorなどは、再配置するから効率悪い。
ブロックで管理すれば再配置無し。
0032デフォルトの名無しさん
2009/11/23(月) 02:02:35それなりに高速なデータ構造となるとstd::dequeかな。
悩んだらとりあえずdequeつかっとけというのが俺の経験則。
0033デフォルトの名無しさん
2009/11/23(月) 15:16:12高速、低メモリでチェックするはどうすればいいですか。
0034デフォルトの名無しさん
2009/11/23(月) 15:20:460035デフォルトの名無しさん
2009/11/23(月) 15:25:28とりあえず何の処理?
0036デフォルトの名無しさん
2009/11/23(月) 15:26:270037デフォルトの名無しさん
2009/11/23(月) 15:35:010038デフォルトの名無しさん
2009/11/23(月) 15:49:58名前空間でクラス名を分けた場合、
-> Hoge::Foo
FooはHogeで完全に修飾しています(のはず)
このように、よく、C++で「完全修飾」という言葉を聞くのですが、
この「完全」とはどういう意味が有るのでしょうか。
また、「不完全修飾」みたいなものがあるのでしょうか。
今まで単純に、「修飾している」という感覚しかなかったので……
よろしくお願いいたします。
0039デフォルトの名無しさん
2009/11/23(月) 23:16:06そもそも10億個の64bit値を格納するメモリが最低でも8GBほど必要だけど、
低メモリとか言っていられるのか?
0040デフォルトの名無しさん
2009/11/23(月) 23:23:320041デフォルトの名無しさん
2009/11/23(月) 23:36:110042デフォルトの名無しさん
2009/11/23(月) 23:46:390043デフォルトの名無しさん
2009/11/24(火) 00:04:34Hoge::Hoge(Fuga fuga)
{
Hoge::Hoge();
〜
}
これっていいの?
0044デフォルトの名無しさん
2009/11/24(火) 07:35:25現在の名前空間関係無しに、グローバルから全部書いたときじゃない?
0045デフォルトの名無しさん
2009/11/24(火) 07:37:38たぶん良くない。
何がしたいのかよくわかんないけど。
あ、コンストラクタから同じ this を初期化するコンストラクタを呼び出したいなら、
現行規格では無理。 C++0x を待ちつつ、 private メンバ関数に分けるとかする。
0046デフォルトの名無しさん
2009/11/25(水) 02:03:00MinGWかVCで使えるやつありますか。
Google perftools はビルド可能なんですか
0047デフォルトの名無しさん
2009/11/25(水) 07:18:38n階層ビットマップとか
0048デフォルトの名無しさん
2009/11/25(水) 12:03:43x.leftとx.rightはA = struct A or struct Bですが、下の記述の方がわかりやすいだけですか。
typedef struct A {
struct A *left;
struct A *right;
} A;
typedef struct B {
struct B *left;
struct B *right;
} A;
0049デフォルトの名無しさん
2009/11/25(水) 12:11:210050デフォルトの名無しさん
2009/11/25(水) 12:25:470051デフォルトの名無しさん
2009/11/25(水) 12:32:10それと同じってこと。
0052デフォルトの名無しさん
2009/11/25(水) 13:10:42実際には struct A と struct B であって
それぞれは別物。
つーか、質問の意図が不明確だから答えづらい。
0053デフォルトの名無しさん
2009/11/25(水) 14:41:15#include <time.h>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int qsort_cmp(const int* a, const int* b) { return *a - *b; }
class stl_sort_functor_cmp { public: int operator()(const int &a, const int &b) const { return b > a; } };
unsigned int xor128() { static unsigned int t, x=123456789UL,y=362436069UL,
z=521288629UL,w=88675123UL; t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
void do_stl_sort_functor(int size) {
vector<int> v(size);for (int n=0; n<size; n++) v[n] = xor128();
double start_time = clock();
sort(v.begin(), v.end(), stl_sort_functor_cmp());
double elapsed = clock() - start_time;
cout<< " STL functor sort " << elapsed / CLOCKS_PER_SEC<<endl; }
void do_qsort(int size) {
int *v= new int [size];for (int n=0; n<size; n++) v[n] = xor128();
double start_time = clock();
qsort(v, size, 4, (int (*)(const void*, const void*))qsort_cmp);
double elapsed = clock() - start_time;
cout<< " qsort " << elapsed / CLOCKS_PER_SEC<<endl;
delete v; }
int main() {
int size = 10000000;
do_qsort(size); do_stl_sort_functor(size);
do_qsort(size); do_stl_sort_functor(size); }
0054デフォルトの名無しさん
2009/11/25(水) 16:09:50qsort() は関数ポインタを大量に呼び出す分、stl に比べて分が悪いですね。
0055デフォルトの名無しさん
2009/11/25(水) 17:16:110056デフォルトの名無しさん
2009/11/25(水) 17:32:490057デフォルトの名無しさん
2009/11/25(水) 18:07:32Boost.Serialization
0058デフォルトの名無しさん
2009/11/25(水) 18:42:33ECC(Embarcadero C++ Compiler 6.2.0)だとSTLの方が速かった
BCCもバージョンによって違うよ
特にヘッダーファイルはコロコロメーカーを変えているからね
0059デフォルトの名無しさん
2009/11/25(水) 20:48:27代入演算子でコピーする STL の方が速くなるのは当然。
0060デフォルトの名無しさん
2009/11/27(金) 22:53:02必要に迫られて、勉強を始めました。
しかし、配列すら宣言できないひよっこです。
どなたか助けて下さい…。
あまりに巨大なツールキットなので、質問の意味が支離滅裂になるかもしれませんが、
ご了承下さい。
使用しているシミュレーターはGEANT4という高エネルギー放射線のシミュレーションツールキットです。
OSはFedora11を使用しています。
コンパイラはgcc-g++です。
検出器を定義するソースコード部に、配列を定義したいのですが、できません。
書式は、
G4double mc[1000];
G4というのは、GEANT4内で使われている接頭詞のような物みたいで、G4intやG4string等もあります。
多分、Cで言う所のdoubleと同じかと思います。
こう書けば、ダブルのタイプを持つmcという配列が1000個、準備されると認識していたのですが…
makeにかけると…
src/BodySD.cc:86: error: invalid types ‘G4double [1000][const G4double]’ for array subscript
と出て、エラーとなってしまいます。
書く場所がマズいのでしょうか…。
とりあえず、読み込まれているヘッダーの中や、定義したいソースの中、使いたい関数の中等
試してみたのですが、どれもダメでした…。
どうすればいいでしょうか。
006160
2009/11/27(金) 23:04:55編集中のソースをアップしてみました。
が、巨大なツールキットの為、ファイル一個では何ともならないのが現実です。
どう読み進めるのかすら分からない為、とりあえず、BodySD.ccのみアップしました。
0062デフォルトの名無しさん
2009/11/27(金) 23:45:400063デフォルトの名無しさん
2009/11/27(金) 23:46:31G4doubleはプロトン粒子砲を発射するためのスイッチでした。
006460
2009/11/28(土) 03:58:43ttp://codepad.org/UGM9339c
ApplicationManager.hh
ttp://codepad.org/CIkJITXy
EventAction.cc
ttp://codepad.org/TEcY4hyR
この3つが、おそらくシミュレーション中に密に連携を取り合っている部分だと
思っています。BodySDで検出器の動作を定義し、エネルギー沈着が起これば逐一
ApplicationManagerを用いてデータを更新し、イベントが終了した段階で、EventActionを呼び出し
ファイルに、各検出器での沈着エネルギーを出力したいと考えています。
が、このように改変しても、先程の現象に変わりは無く…。
どなたか、助けていただけないでしょうか。
出力の場面については、多分ですがミスってる気がしてます。
検出器ナンバーを呼びにいかなくても、ループで回して出力すればいいだけだと、
貼り付けながら思ってしまいました。
0065デフォルトの名無しさん
2009/11/28(土) 06:28:22されてるじゃないか
添え字の型がおかしいぞボケ!ってエラー出てるんだから
theEdepPerDetector[copy_number]のcopy_numberを整数型にしろ
0066デフォルトの名無しさん
2009/11/28(土) 08:11:49そんなとこで研究してる人なら自力でできる
0067デフォルトの名無しさん
2009/11/28(土) 10:40:460068デフォルトの名無しさん
2009/11/28(土) 14:41:53namespaceはjavaのパッケージの事で、
namespace hoge;はjavaのimport hoge.*;と同じような事をしているのですか?
0069デフォルトの名無しさん
2009/11/28(土) 14:52:380071デフォルトの名無しさん
2009/11/28(土) 17:53:57Javaのオブジェクト確保の実態や
ガベージコレクションの概要なんかを理解してからの方が無難。
0072デフォルトの名無しさん
2009/11/28(土) 23:57:15>>65
>>67
ヒント、ありがとうございました!!!!!!
検出器ナンバーをdoubleからintにすると、コンパイルが通りました!
なんとも初歩的なミスでお恥ずかしい限りです。
とりゃえず、全力でシミュレーションしていきたいと思います。
本当にありがとうございました。
>>66
初歩的なミスでパニクってしまっていました。
励まして下さってありがとう。頑張ります。
0073デフォルトの名無しさん
2009/11/29(日) 09:26:090074デフォルトの名無しさん
2009/11/29(日) 09:26:400 を使いたいとき
0075デフォルトの名無しさん
2009/11/29(日) 12:57:17string にも '\0' は入るんだが。
まぎらわしいってこと?
0076デフォルトの名無しさん
2009/11/29(日) 13:32:22std::string はメモリの連続性が保障されていない(?)から
sprintf のようなC言語よりの関数には
メモリの連続性が保障されている
std::vector<char> を使うことがある
0077デフォルトの名無しさん
2009/11/29(日) 13:37:290078デフォルトの名無しさん
2009/11/29(日) 18:01:59std::ropeははなっから連続してない
0079デフォルトの名無しさん
2009/11/29(日) 18:54:53C#やJavaだとこんな感じでメソッドを宣言していますが、
public:
void setXXX(string s);
みたいな感じにC++は宣言していますが、これがデフォルトなんですかね?
おまけの質問で申し訳ありませんが
private:
int test;
int hoge;
hogeもprivateになるってことで、おk?
0080デフォルトの名無しさん
2009/11/29(日) 19:03:02そうだよ。
こんどから自分で試してから聞こうね。
0081デフォルトの名無しさん
2009/11/29(日) 19:03:29008279
2009/11/29(日) 19:17:27ありがとうございます
試したいとは思っているのですが、メモリリークが怖くて怖くてやる気になれません
まだ、簡単なメモリの管理の仕方もわからないのでorz
そのうち、自分でも試してみるようにします
0083デフォルトの名無しさん
2009/11/29(日) 19:42:59メモリリークをなんだと思ってるんだ?
コンパイルしただけでメモリリークなんか発生しないし、
そんなコード片だけじゃ実行したとしてもメモリリークの原因になんかならないし、
本当に発生したとしても普通の OS 使ってるなら、プロセス殺せば何も残らん。
変な理由で怖がってないでコンパイルぐらい自分でやれ。
0084デフォルトの名無しさん
2009/11/29(日) 22:27:01Javaではオブジェクトを確保するのに必ずnewを使うけど
C++ではこれはちょっと厄介。もっと素直になりなさい。
0085デフォルトの名無しさん
2009/11/29(日) 22:46:51とりあえず、スタック領域とヒープ領域の違いを明確にすれば、
そのうちJAVAのテクニックも使えるようになると思うよ。
0086デフォルトの名無しさん
2009/11/30(月) 15:50:35boost 鬼車 posix bregexp
だとどれがいいですか。
bregexpは長い正規表現を間違える経験があります
0087デフォルトの名無しさん
2009/11/30(月) 15:56:07bregexpはまとめれば1ファイルのヘッダに収まる位なんですが
posix regex.hは割と多くが対応していると思うんですがBCCだと無いです。
別名で互換のが入ってますが、完全な互換ではないです。
拡張正規表現が使えるかどうかが判明しないです
0088デフォルトの名無しさん
2009/11/30(月) 16:05:51客観的に考えて、比較的枯れていて移植性というならBOOSTが一番だと思う。
素人のたわごとなんだが。。。
0089デフォルトの名無しさん
2009/11/30(月) 16:11:260090デフォルトの名無しさん
2009/11/30(月) 16:45:13Cコンパイラから、OSへは返還していない。
0091デフォルトの名無しさん
2009/11/30(月) 16:52:54安定性は知らん
0092デフォルトの名無しさん
2009/11/30(月) 21:02:31boost行ってみる。
0093デフォルトの名無しさん
2009/11/30(月) 21:09:42bregexpか、マイナーなやつ発掘してくる。
0094デフォルトの名無しさん
2009/11/30(月) 21:56:420095デフォルトの名無しさん
2009/11/30(月) 22:00:34標準のCコンパイラ単体でビルド完了したいんです。
0096デフォルトの名無しさん
2009/11/30(月) 22:18:17class Test {
private:
string s("str);
}
なぜ、ダメなんですか?
0097デフォルトの名無しさん
2009/11/30(月) 22:20:230098デフォルトの名無しさん
2009/11/30(月) 22:35:13一応確認しとくと正規表現パターンは動的に変わる必要があるんだね?
0099デフォルトの名無しさん
2009/11/30(月) 22:56:34Bregexpをヘッダオンリーで出来るように書き換えたのでこれ使うことにした。
鬼車も手を加えたら、軽量化してヘッダーオンリーに出来そうだけど。
文字コードの部分をばっさり削れそうだけど
0100デフォルトの名無しさん
2009/11/30(月) 23:08:14Cオンリーかいな。
0101デフォルトの名無しさん
2009/12/01(火) 09:11:160102デフォルトの名無しさん
2009/12/01(火) 10:49:000103デフォルトの名無しさん
2009/12/02(水) 18:39:06なんか、関数呼び出し順がソースで見て左から呼ぶのかと思ったら、右から呼び出してて、値がおかしくてハマッた。
規格だと関数の引数としての実行順番って規定されてないんだっけ??
それとも64bit整数使うと挙動変わったりする?まったく64bit整数使わないから挙動が解らん。
以下のような感じ。
printf("%u %u %.2lf\n",R(),R.Last(),R.LastDouble());
Rは乱数クラスでオペレータ()を呼び出している。クジも引いてる。
Last()は最後に引いたuint32を返却。
LastDouble()はLast()をdoubleに正規化して返却。
わけわからん。。。
0104デフォルトの名無しさん
2009/12/02(水) 18:41:060105デフォルトの名無しさん
2009/12/02(水) 19:15:340106デフォルトの名無しさん
2009/12/02(水) 19:43:550108デフォルトの名無しさん
2009/12/02(水) 21:27:29コンパイラで適宜に決められてはいる。
0109デフォルトの名無しさん
2009/12/03(木) 01:45:08そのプラグインの内部データを監視・変更するためにGUIを付けたいと思っております。
本体からDLL関数が呼ばれたときにダイアログを生成し、
また呼ばれたときは本体に影響しないようすぐリターンを返したいのですが、
モーダルはダイアログを閉じるまで制御が返ってこないし、
モードレスでも結局ウィンドウメッセージは処理しなければならないので
すぐに返せないのではないのではないかと思いますが、
この場合スレッドを別に立ち上げなければならないのでしょうか。
0110デフォルトの名無しさん
2009/12/03(木) 04:06:420111109
2009/12/03(木) 07:49:29DLL関数の中で延々メッセージループを回されたら本体側が困ると思うのですが。
0112デフォルトの名無しさん
2009/12/03(木) 09:05:080113デフォルトの名無しさん
2009/12/03(木) 10:05:55モーダルは自分でメッセージループ持ってる
モードレスは本体のと共用
0114デフォルトの名無しさん
2009/12/03(木) 12:08:32p=malloc(1);
*p=10;
と
int x=10;
は同じような機能と考えていいの?
0115デフォルトの名無しさん
2009/12/03(木) 12:15:44いいえ、原則的に前者は確保した領域の解放が必要になります。
また、最適化が阻害されるので後者に較べて不利なコードになる可能性が考えられます。
0116デフォルトの名無しさん
2009/12/03(木) 12:26:540117デフォルトの名無しさん
2009/12/03(木) 12:28:440118デフォルトの名無しさん
2009/12/03(木) 13:09:27p=(int*)malloc(sizeof(int)); // ヒープ領域にメモリを確保する
*p=10;
free(p) // ヒープ領域は明示的に解放してあげないとだめ
int x=10; // スタック領域にメモリを確保する
// スタック領域は関数を抜けると自動的に解放される
ヒープ領域・スタック領域はggr
0119デフォルトの名無しさん
2009/12/03(木) 13:13:380120デフォルトの名無しさん
2009/12/03(木) 16:03:350121デフォルトの名無しさん
2009/12/03(木) 19:00:58デバッグ方法について質問します。
普段デバッグを行う際には、プログラムを止めたい場所でF9でブレークポイントを張った後、デバッグをしているのですが
以下のようなメモリ破壊を起こすようなバグを取り除く際にいつも苦労しています。
プログラムのどこかでメモリ破壊が起こる<-問題個所
該当個所を呼び出そうとした際にプログラムが停止する<-エラーが発覚してプログラムが止まる場所
「どこが破壊されているのかは分かるけど、どのタイミングで破壊されたのかが分からない」という状況です。
これまでは、プログラムが止まった場所から少しずつ前の処理でブレークポイントを張り続けて、該当箇所のメモリ破壊がいつ起こってるのかを突き止めているのですが
こういうタイプの不具合に対応するために、
「指定したメモリ領域に変更が起こったらプログラムを止める」
ということができればもっと楽なのに・・・
なんてふと思ったのですが、VC++の機能として該当するような機能はないでしょうか?
0122デフォルトの名無しさん
2009/12/03(木) 19:09:10止まった場所がライブラリの中ではなくライブラリを呼んだ自分のコードで起きた場所が知りたいなら、
スタックトレースウインドウがあるのでそれでさかのぼる。
条件ブレークもあるみたいだがつかったことねー。。。orz
0123デフォルトの名無しさん
2009/12/03(木) 19:42:07ご返答ありがとうございます。
スタックトレースウインドウって言うのは「呼び出し履歴」ってタブのウィンドウのことでいいですか?
「呼び出し履歴」のことだとすると、今回のケースでは、関数の引数がポインタで、処理しようとしているアドレス自体は正しいけど、アドレス先のデータが破壊されている
という状況なので、呼び出し履歴を見ながら変数を追うという方法がとれなくて・・・orz
いつもだと、エラーが起こる前に通る場所にブレークポイントを張りまくって、該当のアドレスに変更がかかったタイミングを突き止めるということをやってるのですが
破壊されるアドレスを指定して、そこに変化がかかったら(これがいわゆる条件ブレーク?)みたいなことができたら楽だな〜と^^;
debug_all()って関数を適当に作って、全ての関数の頭に追加して、問題が発生しないことが分かっているところで
global_debug = チェックしたいデータのアドレス;
って打ってあげれば、どの時点でデータ破壊が起こったのか分かるのかな〜と思ってやろうとしたのですが、開発環境レベルでこんな機能があったらいいのにと思いまして^^;
void* global_check_address;
void debug_all(){
static int before;
if( (int*)global_check_address != before )
{
printf("error\n"); /* ここにブレークポイントを張る */
}
before = (int*)global_check_address;
}
hoge()
{
#ifdef _DEBUG
debug_all();
#endif
・・・
}
0124デフォルトの名無しさん
2009/12/03(木) 20:00:28オイラの環境
os:gentoo linux
ide:netbeans 6.7
0125デフォルトの名無しさん
2009/12/03(木) 20:13:45そう、呼び出し履歴であってると思う。
で、俺も不明瞭だから、条件ブレークをテストしてみた。
IDEにブレークポイントウインドウがあるんだが、
F9でブレークポイントを貼ると、そのウインドウのリストに載るのでそれを改変。
方法は対象のリストを右クリックして、条件というメニューから条件を書き込む。
trueの場合だと、たとえばi==jなどのブーリアンになるように設定する。
変更されたら。の場合だと、変数名をそこに書き込んでダイアログを閉じる。
あと、ブレークポイントの貼る位置は、値を評価したり変更したりする次の行。
以下のコードを使った。初めて触ったけど何とかなったから大丈夫だと思う。
#include <stdio.h>
int function(int& i){
int k=0;
k=i;
i++;//この行にブレークをはって、条件をkが変更されたら。にする。
printf("%d",k);
return i;
}
int main(){
int i=10;
for(int j=0;j<i;j++){
if(j%2) function(i);
printf("%d\n",j);
}
return 0;
}
0126デフォルトの名無しさん
2009/12/03(木) 20:17:31俺は
Win7Home 64bit & VC9EE
でも、64ビットな事はやったことない。。。
0127デフォルトの名無しさん
2009/12/03(木) 21:12:25レゴのMindstorm・・・nxcに関する質問ってどこですればいいですかね
0128デフォルトの名無しさん
2009/12/03(木) 21:35:56おまえ犬糞なんて使ってんのかよ
ギャハハ
0129デフォルトの名無しさん
2009/12/03(木) 22:42:36[hogehoge]================> [ 73%]
みたいな表示を標準入出力ライブラリ関数だけでやってみたいと思うのですがどうしたらよいでしょうか?
0130デフォルトの名無しさん
2009/12/03(木) 22:51:40iostreamの存在自体を知らない(いまこのレスで初めてこの言葉を見た)とか、
そういう段階の質問?
0131デフォルトの名無しさん
2009/12/03(木) 23:00:14ヒントとしては、
printf("[hogehoge]=> [%2d%%]\r", percent);
printf("[hogehoge]==> [%2d%%]\r", percent);
というかんじ。\r がポイント。画面の横幅は標準では扱えないから80固
定でいいだろう。
0132デフォルトの名無しさん
2009/12/03(木) 23:51:56昔のLHA風に.....が増えていくなら簡単だが
0133デフォルトの名無しさん
2009/12/03(木) 23:53:530134デフォルトの名無しさん
2009/12/03(木) 23:57:13どんな特殊環境を使ってやがんだよカス
0135デフォルトの名無しさん
2009/12/04(金) 00:07:06おおおおできた!!これは便利だw
ありがとうございました^^
0136デフォルトの名無しさん
2009/12/04(金) 00:11:57つたない説明で申し訳ないね。
お役に立てて何より。
0137デフォルトの名無しさん
2009/12/04(金) 03:50:06環境は、VC++2008 XPです。
エラーではなくワーニングが出ています。
warning LNK4006 Hoge<struct Matrix>::hoge(struct Matrix const &) はHOGE.obj で定義されています。2 つ目以降の定義は無視されます。
といった内容です。
エラー個所のソースは
template<class T>
class Hoge {
public:
void hoge(const T &test);
};
template<class T>
void Hoge<T>::hoge(const T &test)
{}
template<>
void Hoge<Matrix>::hoge(const Matrix &test)
{}
といった具合です。
クラスのメンバ関数をオーバーロードして、Matrixクラスが引数に来た時だけ
処理の内容を変えようとしているのですが、上手くいきません。
ご教授ください。
よろしくお願いします。
0138137
2009/12/04(金) 04:19:34原因は、(当たり前かもしれませんが)テンプレートでクラスTを取っているのに
そのTを使わないことでのオーバーロードを行うことはできないということでしょうか。
違っていればやり方を教えてください。
解決したやり方は
・クラステンプレートの特殊化としてMatrix用のテンプレートクラスを作成
・テンプレートクラスの記述を全てクラス内部に入れ込み、インラインとした
という方法です。
0139デフォルトの名無しさん
2009/12/04(金) 10:43:050140デフォルトの名無しさん
2009/12/05(土) 03:08:41class c {
std::string s;
std::tr1::function f;
などとスコープ演算子を付けまくるのがとっても面倒なんですが、
大抵の宣言はヘッダに書くのでusingするわけにも行かず、
class c {
namespace std {
string s;
}
とか
class c {
namespace tr1 = std::tr1;
tr1::function
という書き方がしたいところなんですが、何とかなりませんか?
或いは代替案がないものでしょうか?
0141デフォルトの名無しさん
2009/12/05(土) 03:22:08using std::string;
using std::tr1::function;
0142デフォルトの名無しさん
2009/12/05(土) 04:23:04classの宣言内で無理でしょ
0143デフォルトの名無しさん
2009/12/05(土) 04:26:31namespace class_local {
using namespace std;
class hoge {
string s;
};
}
typedef class_local::hoge hoge;
何かもっと良い方法があったらお願いします。
0144デフォルトの名無しさん
2009/12/05(土) 04:35:49じゃぁ typedef で。
>>143
それでいいなら using declaration のほうがおすすめ。
using directive は影響が大きすぎるし危険でもある。
0145デフォルトの名無しさん
2009/12/05(土) 04:47:16using declarationってusing std::stringみたいな書き方ですよね?
typedef でも using declaration でもそもそもの目的のタイプ量を
減らす効果が薄いかなぁ。
using directive は影響が大きすぎるから、>143の例では
namespaceで囲ってスコープ外にusingが漏れないようにした訳です。
0146デフォルトの名無しさん
2009/12/05(土) 04:55:260147デフォルトの名無しさん
2009/12/05(土) 04:56:190148デフォルトの名無しさん
2009/12/05(土) 11:07:00usingだと>>143みたいに無理やり感のある方法をとらないといけないし、衝突するかもしれない
2回以上使うならtypedefでタイプ量は確実に減るし
0149デフォルトの名無しさん
2009/12/07(月) 17:05:26VC++ 2008 Express Edition と Windows SDK for Windows Server 2008 and .NET Framework 3.5 を導入しました
試しに、
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
{
printf("hello\n");
}
}
というプログラムのビルドを行い成功したのですが
exe実行時に「このアプリケーションの構成が正しくないため、アプリケーションの開始に失敗しました。
マニフェストファイルを参照して原因を調べてください。...」とエラーが出てしまいます
Dependency Walker を使い赤字のDLLは一つずつ潰していったのですが解決しません
どうかご助力お願いします
0150149
2009/12/07(月) 19:12:08何が解決に繋がったかわかりません
相変わらずデバックモードでは動きませんが、これはインストールした環境ではデバック版のライブラリがないためのようです
スレ汚し失礼しました
0151デフォルトの名無しさん
2009/12/07(月) 20:10:34が、導入以前に疑問が。
初歩的な質問で恐縮なのですが、Linuxでは、gcc等でコンパイルされた実行ファイルは、
コンパイル環境に左右されず、どのディストリビューションやバージョンでも実行できるのでしょうか?
0152デフォルトの名無しさん
2009/12/07(月) 20:29:43それどころかディストリやバージョン違いでも
不具合が出る可能性有り。
ソースレベルでなら大抵は互換してるけどな。
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 を見つめ続けるとやがてゲシュタルト崩壊が始まる。
0253デフォルトの名無しさん
2009/12/21(月) 16:27:07=)
0254デフォルトの名無しさん
2009/12/21(月) 16:28:440255デフォルトの名無しさん
2009/12/21(月) 16:30:020256デフォルトの名無しさん
2009/12/21(月) 16:31:14単に予約語を増やしたくなかっただけ?
0257デフォルトの名無しさん
2009/12/22(火) 02:36:41関数の中身は無いってことは空値みたいなもんだよな
てことは=NULLか
どーせNULLはプリプロセッサで0になるから=0でいいや
0258デフォルトの名無しさん
2009/12/22(火) 05:47:07そういうこと。
新しい予約語を入れるのが無理な状況だったから、= 0になった。
0259デフォルトの名無しさん
2009/12/22(火) 12:01:04フレーム制御関数をmain関数のどこで呼び出せばいいのかわかりません
while(bIdle){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
// メッセージ処理
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
// アイドル処理実行
bIdle = mainframe_Idle( );
}
}
小さい画像をブロック崩しの弾を動かす感じにしたいんですが
いろんなサイトを見て回って、何度やっても画像が彗星みたいな尾を引いて
その場で止まったままになってしまいます
0260デフォルトの名無しさん
2009/12/22(火) 12:14:520261デフォルトの名無しさん
2009/12/22(火) 15:16:15意味解ってんのか?
0262デフォルトの名無しさん
2009/12/23(水) 22:22:16変数を全部floatで宣言したら動くプログラムがdoubleにすると全部NaNになるんですが
なんでですか(><)
0263デフォルトの名無しさん
2009/12/23(水) 22:48:40バグ取りすればいいじゃないですか(><)
0264デフォルトの名無しさん
2009/12/23(水) 23:04:30厳密じゃなくていいならタイマー使ったほうが簡単だよ。
その場合 PeekMessage じゃなく GetMessage でいい。
0265デフォルトの名無しさん
2009/12/23(水) 23:43:50それは元々バグっているんです(><)
0266デフォルトの名無しさん
2009/12/24(木) 00:28:39map<string,int> *foo(int n){
map<string,int> data;
data["a"]=0;
data["b"]=1;
data["c"]=2;
map<string,int> re[n];
for(int i = 0; i < n; i++){
re[i] = data;
}
return re;
}
この関数のmap<string,int> re[n]の部分で警告が出てプログラムが正常に動きません。
static をつけると引数のnが使えずグローバル変数を使うことになるのですが、
グローバル変数や配列の代わりにvectorを使う以外にいい方法はないでしょうか?
OSはWindows vistaでコンパイラはg++.exe (GCC) 3.4.5 (mingw-vista special r3)です。
0267デフォルトの名無しさん
2009/12/24(木) 00:35:02動的配列はnewしてください。
使い終わったらdeleteもわすれずに。
0268デフォルトの名無しさん
2009/12/24(木) 00:37:340269デフォルトの名無しさん
2009/12/24(木) 00:39:30やっぱダサいのかな
それとも最近のmallocなら下手に自分でメモリ管理するよりは性能いいかな
0270デフォルトの名無しさん
2009/12/24(木) 01:05:11とりあえずローカル変数のアドレスを返すのはやめよう
0271デフォルトの名無しさん
2009/12/24(木) 01:23:52基本的にはシステム標準のmallocでいいと思うけど、
それで物足りないなら、自分でメモリ管理のコードを書く前に、
既存のメモリ管理のライブラリを試してみよう。dlmalloc、tcmalloc、jemallocとか。
0272デフォルトの名無しさん
2009/12/24(木) 01:44:24scanf("%f", &hoge);
とか値を格納した時点で既にNaNなんですが/(^o^)\
0273デフォルトの名無しさん
2009/12/24(木) 01:47:15double値を読み込むときは%lfだけど、そこ直した?
0274デフォルトの名無しさん
2009/12/24(木) 01:50:23でキタ - .∵・(゚∀゚)・∵. - ッ!!
ありがとうございました(´;ω;`)ウッ…
0275デフォルトの名無しさん
2009/12/24(木) 23:06:130276デフォルトの名無しさん
2009/12/24(木) 23:42:270277デフォルトの名無しさん
2009/12/25(金) 00:51:520278デフォルトの名無しさん
2009/12/26(土) 00:35:010279デフォルトの名無しさん
2009/12/26(土) 01:33:57メモリでMbitと見るんですが
例えば32Mbitと書かれてあったらwikiだと
1,048,576(bit)×32=33,554,432で
16進数だと0x2000000になる計算でいいのでしょうか?
よろしくお願いします。
0280デフォルトの名無しさん
2009/12/26(土) 01:40:400281デフォルトの名無しさん
2009/12/26(土) 02:02:190282デフォルトの名無しさん
2009/12/26(土) 10:57:58void AAA::AAA(){
内にある命令を、一定時間間隔で繰り返し実行したいのですが、どういった方法があるでしょう。
一応自分で考えたのは、
int repeat=0;
if( repeat <= 繰り返し回数) {
命令
Sleep(待ち時間) ;
repeat++;
}
なのですが、これだとなぜか全体の速度が遅くなってしまいました。
環境はWindows、Bolrand C++です。DXライブラリも使用しています。
なのでSleepの代わりにWeitTimerも試したのですが、結果は同じでした。
SetTimerも考えたのですが、どこに置いていいかわからず…。
(サンプルの改変のため、.hも.cppもいくつかある状態です)
0283デフォルトの名無しさん
2009/12/26(土) 11:31:100284デフォルトの名無しさん
2009/12/26(土) 12:16:12FPS(frames per second)について勉強しよう
0285デフォルトの名無しさん
2009/12/26(土) 13:08:23え?
0286デフォルトの名無しさん
2009/12/26(土) 13:26:48そのAAA()が頻繁に呼ばれてるなら、clock()とかgetTickCount()みたいな
関数で、前回呼ばれた時間を記録しておいて、前回の呼ばれた時刻から
一定以上の間隔が開いていたら処理を実行するって方式にすればいい。
0287284
2009/12/26(土) 13:33:25マジレスすると、俺は>282の文面を見て
下記のサイトに記述されてるような処理を望んでいるんだろうと推測した
ttp://www.clks.jp/csg/gt002.html
ttp://d.hatena.ne.jp/mitsu_chie/20081108/1226131801
まあ、君は無理に理解しなくてもいいと思う
0288デフォルトの名無しさん
2009/12/26(土) 14:35:10その方式でやりたいなら、マルチスレッド使わないと駄目だな。
んで、多分お前さんには無理だ。
解決法は上の方の人が言ってるから参考にしれ。
0289デフォルトの名無しさん
2009/12/26(土) 14:38:380290デフォルトの名無しさん
2009/12/26(土) 14:57:30指定時間ごとに実行するようにしたかったんですが・・・。
現在はこの中の命令が連続で実行されている状態です。
printfを使っているとしたら無数に文字が出てきている状態です。
>>286よりGetNowCountを使う方法を考えたのですが、
1000をかけて4などで割って余りが0のとき実行、はうまくいきませんでした。
試しにランダム(10)でif X=3になったときだけ実行をしたら無数に出てくる状態のままでした。
なので、命令自体が繰りかえし呼ばれているのでifでいいかなと思ったのですが…
0291デフォルトの名無しさん
2009/12/26(土) 15:07:17ググってみたら、GetNowCount()ってミリ秒単位の関数みたいだけど、
1000を掛けるって?
0292デフォルトの名無しさん
2009/12/26(土) 15:13:03void AAA::AAA()
{
static unsigned lastCount = 0;
unsigned now = GetNowCount();
if (now - lastCount <= 1000)
return;
lastCount = now;
// 処理
}
こういう感じで、一秒感覚で動くと思う。
0293デフォルトの名無しさん
2009/12/26(土) 15:14:48>286 をやってみるなら前回実行からの時間を見ろよ。
0294デフォルトの名無しさん
2009/12/26(土) 15:15:32DXライブラリを使ってるってことは描画とかしてるんじゃない?
描画込みでループ処理とかするなら
コード晒すなりしないと
誰もまともな回答出せないぞ
念の為に貼っとく
DXライブラリ 総合スレッド その5
http://pc11.2ch.net/test/read.cgi/gamedev/1259912953/
0295デフォルトの名無しさん
2009/12/26(土) 15:27:53#include <stdio.h>
#include <time.h>
bool CycleTimer(clock_t Interval){
static clock_t LastClock=0;//これがボトルネック
clock_t Now =clock();
if((LastClock+Interval)-Now <= 0){
LastClock = Now;
return true;
}
return false;
}
int main(){
int i=0;
while(i<60){
if(CycleTimer(1000)){
i++;
printf("A");
}
}
return 0;
}
0296デフォルトの名無しさん
2009/12/26(土) 15:31:28{
int count = 0;
while()
{
if(count < 60) {
繰り返したい処理
++count;
}
DXライブラリ固有の処理、FPSに関する処理
}
}
こんな感じの処理で済む話じゃないのか?
0297296
2009/12/26(土) 15:33:240298デフォルトの名無しさん
2009/12/26(土) 15:34:39もうフレームでいいんじゃね。
0300デフォルトの名無しさん
2009/12/26(土) 15:36:48現在サンプルを触ってみている状態です。
void TekiControl::move(float jx, float jy){
list<CharaData>::iterator it;
it = tekilist.begin();
(*it).anim->draw(0, (*it).x, (*it).y);
//子機発射処理 ※この部分を指定秒数ごとに実行したい
float dy = GameFrame::IdouHosei(8);
podsally( (*it).x+64, (*it).y+32, 20, 0,-dy);
podsally( (*it).x+64, (*it).y+32, 10, 0,-dy);
podsally( (*it).x+64, (*it).y+32, 20, 0,dy);
podsally( (*it).x+64, (*it).y+32, 10, 0,dy);
podmove(jx,jy); //子機移動
}
上スレのほうが適切でしたら移動します。
これはteki.cpp内で、
main.cppでTekiControl tekicnt;で宣言した後、tekicnt.move(jikicnt.getx(), jikicnt.gety());で呼び出しています。
(なぜintなどではなくTekiControlで宣言できているのかは実はわかっていません)
>>291
ミリ秒なんで1000をかけたら秒になって、適当な数で割って余りが0ならそのタイミングにならないかな?
と考えたのですが、もしかしたら考え方自体が間違っているかもしれません。
0301デフォルトの名無しさん
2009/12/26(土) 15:47:08>ミリ秒なんで1000をかけたら秒になって、
秒単位にしたいなら割らないと。
0302デフォルトの名無しさん
2009/12/26(土) 16:13:50WinMain
{
bool koki_hassha_chuu = false;
int frame_count = 0;
int koki_count = 0;
while()
{
if(!koki_hassha_chuu && 子機発射の条件) {
koki_hassha_chuu = true;
}
if(koki_hassha_chuu) {
++frame_count;
if(frame_count >= 子機発射間隔) {
frame_count = 0;
子機発射処理
++koki_count;
if(koki_count >= 子機発射最大数) {
koki_hassha_chuu = false;
koki_count = 0;
}
}
}
DXライブラリ固有の処理、FPSに関する処理
}
}
敵コントロールクラスの内部にゲームループを作るのはNG
0303デフォルトの名無しさん
2009/12/26(土) 16:15:36int count = 0;
while(){
if(count<60){
float dy = GameFrame::IdouHosei(8);
//podsally( (*it).x+64, (*it).y+32, 20, 0,-dy);
//podsally( (*it).x+64, (*it).y+32, 10, 0,-dy);
podsally( (*it).x+64, (*it).y+32, 20, 0,dy);
podsally( (*it).x+64, (*it).y+32, 10, 0,dy);
//lastCount = now;
++count;
}
}
このような形でしょうか?
(whileには{が必要だったかと思ったので、勝手に足してしまいました。もし間違っていたら申し訳ありません。)
ただ、これだとwhileに)がないというエラーが出るので…
(1)で常に真にすると無限ループになるのか、固まってしまうので。
0304前ジャンル
2009/12/26(土) 16:24:48ごめんなさい、これがどの部分を指すのかわかりません。
>>298
DXライブラリ公式サイトの落ちものゲームの時間処理を参考に作ってみたのですが、
void TekiControl::move(float jx, float jy){ 内に
最初にWAITを宣言して、
int WaitCounter ; // 下に勝手に落とすまでの時間計測用
int NowTime ; // 現在のフレームで経過した時間
int OldTime ; // 前のフレームのときにGetNowCount関数で得たタイム
// 時間関係処理
//int TimeFunc(){
int Time ;
// 現在の時間を得る
Time = GetNowCount() ;
// 今フレームで経過した時間を得る
NowTime = Time - OldTime ;
// 現在の時間を保存
OldTime = Time ;
// ウエイトカウンタに経過時間を加算する
WaitCounter += NowTime ;
// 一定時間が経過していたら勝手に下にブロックを落す
if( WaitCounter > WAIT )
{
// float dy 〜の処理
// カウンターを0に戻す
WaitCounter = 0 ;
}
// 終了
return 0;
値を返せないと言われてしまいました。
この部分を削ると以前の状態に戻ってしまいます。
0305デフォルトの名無しさん
2009/12/26(土) 16:37:55TekiControl::move の子機発射処理のところ だけ を
>302の子機発射処理のところに持ってくる
てか内容を理解せずにコピペするだけじゃ
まともなプログラムは書けないぞ
0306デフォルトの名無しさん
2009/12/26(土) 16:44:49>>302自体をどこに持ってくるべきかが分からないんです。ごめんなさい。
TekiControl::move内でいいんですか、それともこのcpp内の別の場所ですか?
なんとなくは理解しているつもりで自分なりに必要そうなところ、たぶんこれが動いているのではと思われるところを
抜いて使っているのですが、よくわかっていなくてすみません。
ここまで当たってみて、次何をしてみたらいいのかが分からないです。
0307デフォルトの名無しさん
2009/12/26(土) 16:45:48C++の知識とゲーム作成の知識もなさすぎ
もうちょっと勉強しろ
0308デフォルトの名無しさん
2009/12/26(土) 16:58:55すみません、移動します。
本は一通り読んだつもりなのですが、この場合にあと調べるべきだったことは何でしょう。
ここから何を勉強したらできるようになるんでしょうか。
ごめんなさい。
0309デフォルトの名無しさん
2009/12/26(土) 18:56:150310デフォルトの名無しさん
2009/12/26(土) 21:17:310311デフォルトの名無しさん
2009/12/26(土) 21:52:380312デフォルトの名無しさん
2009/12/27(日) 00:06:54コンパイラは学校でGCCと自宅でVC++EE2008を使ってます
0313デフォルトの名無しさん
2009/12/27(日) 00:10:58いつ調べるの?
まさかコンパイル時に調べるとかじゃないよね?
0314デフォルトの名無しさん
2009/12/27(日) 00:11:13実際のアセンブリ比較以外ではなかなか難しいと思うが。
コンパイラさんが勝手にやったりするからね。
0315デフォルトの名無しさん
2009/12/27(日) 00:14:59コンパイル時にメッセージとか出してくれたらいいなーとか思ってたんですが・・・
>>314
アセンブリですか
そこまで知識がないので今の自分には無理みたいですね
勉強してきます
即レスサンクスでした
0316デフォルトの名無しさん
2009/12/27(日) 00:18:390317デフォルトの名無しさん
2009/12/27(日) 00:38:46ソース吐き出すオプション付けて出してみればいいじゃん
gccはアセンブリソースに元のソースがコメントで付かなかった
かもしれないが
0318デフォルトの名無しさん
2009/12/27(日) 00:59:39もしかして-gオプションつけてると淫乱展開されない?
0319デフォルトの名無しさん
2009/12/27(日) 01:10:15思わぬところで勉強になったぜ・・・
0320デフォルトの名無しさん
2009/12/27(日) 01:23:34関数その物は別に存在しちゃうんだな。
思わぬところで勉強になったぜ・・・
0321デフォルトの名無しさん
2009/12/27(日) 01:26:16逆だろ。
static つけてヘッダで定義してたらインクルードするたびに別物になってしまう。
0322デフォルトの名無しさん
2009/12/27(日) 01:27:54そいつがリンクされてプログラムに含まれるのは、アドレス取ったりしたときだけじゃないか?
0323デフォルトの名無しさん
2009/12/27(日) 01:35:58プログラムの中にコードだけはある状態だった。
-gつけてたからかもしれんけど
inline int unko(int a, int b){ return a+b; }
main(int argc, char **argv)
{
int a=atoi(argv[1]);
int b=atoi(argv[2]);
int c=unko(a,b);
printf("%d+%d=%d\n",a,b,c);
}
これでunko()のコードがmain()でインライン展開されて、かつ、
unko()のコードがプログラム内に存在してた。
(ブレーク張ってももちろん止まらない)
なんか勉強のネタが増えてしまった。
0324デフォルトの名無しさん
2009/12/27(日) 01:40:32VCなら、警告C4710、C4711、C4714をオンにすればいい。
http://msdn.microsoft.com/ja-jp/library/yd3056cz(VS.90,loband).aspx
http://msdn.microsoft.com/ja-jp/library/k402bt7y(VS.90,loband).aspx
http://msdn.microsoft.com/ja-jp/library/a98sb923(VS.90,loband).aspx
特定の警告のオンオフはコンパイラオプションか#pragma warningで行う。
http://msdn.microsoft.com/ja-jp/library/thxezb7y(VS.90,loband).aspx
http://msdn.microsoft.com/ja-jp/library/2c8f766e(VS.90,loband).aspx
0325デフォルトの名無しさん
2009/12/27(日) 02:38:27そうならないように規格が追加されたんじゃなかったっけ
0326デフォルトの名無しさん
2009/12/27(日) 03:09:42> gccはアセンブリソースに元のソースがコメントで付かなかった
-Wa,-adlh
0327デフォルトの名無しさん
2009/12/27(日) 09:40:48そうなの?
俺は>>321と同じ考えだった。
とりあえずboostを見てみたけど、inline宣言された関数は沢山あるが
それらの中でstaticに宣言されている物はぱっといくつか見渡した限りは1つも無かったよ。
0328デフォルトの名無しさん
2009/12/27(日) 15:59:01書き方を選ぶだろ普通に
0329デフォルトの名無しさん
2009/12/27(日) 16:07:01ああそういう要素もあるのか。
・・・実際はどうなんだろうねぇ?
> 320 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/27(日) 01:23:34
> インライン展開させたい関数にstaticがついてないと、
> 関数その物は別に存在しちゃうんだな。
> 思わぬところで勉強になったぜ・・・
>
> 321 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/27(日) 01:26:16
> >>320
> 逆だろ。
> static つけてヘッダで定義してたらインクルードするたびに別物になってしまう。
>
> 322 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/27(日) 01:27:54
> >>320
> そいつがリンクされてプログラムに含まれるのは、アドレス取ったりしたときだけじゃないか?
>
> 325 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/27(日) 02:38:27
> >>321
> そうならないように規格が追加されたんじゃなかったっけ
だれか有識者plz
0330デフォルトの名無しさん
2009/12/27(日) 17:34:12>321 の言っていることは正しい。
ヘッダで定義する関数に static を付けて内部リンケージにしてはいけない。
具体的には、別の inline 関数から呼び出された場合に ODR 違反となってしまう。
しかし >320 の言っていることも、特定のコンパイラで実験した結果として間違いではない
だろうし、そういう結果を生成するコンパイラの実装が許されないわけじゃない。
具体的には >322 の言うような場合への対応として非 inline な関数のコード生成が必要に
なることは考えられる。
>325 が何のことを言っているのかはわからない。
0331デフォルトの名無しさん
2009/12/28(月) 12:03:43インライン関数がインライン展開されない場合はそうなってリンクでエラーになるCコンパイラは実在する。だけどC++コンパイラではお目にかかったことはないな。
0332デフォルトの名無しさん
2009/12/28(月) 19:04:09gcc4.3.4で実験したんだけど、実在したよ
0333デフォルトの名無しさん
2009/12/28(月) 19:15:40warningじゃなくてerror?
0334デフォルトの名無しさん
2009/12/28(月) 19:18:52あっちこっちで同じ名前の関数が出来れば、そうなるでしょ
0335デフォルトの名無しさん
2009/12/28(月) 19:32:20どんな特殊なソース?
0336デフォルトの名無しさん
2009/12/28(月) 20:36:28C++でインライン展開ができなかった場合やオプションで抑制した場合は、リンクでぶつからない用に細工した名前の関数が翻訳単位ごとに作られるコンパイラもあるようだよ。どうやら無名名前空間のような手法みたいだけど。
0337デフォルトの名無しさん
2009/12/28(月) 23:04:01とりあえずそのソースをうpしてくれ。
0338デフォルトの名無しさん
2009/12/29(火) 03:33:30mapファイル吐かせて関数の存在を確認するだけでいいじゃんと思ったのだが
思っただけで調べてはいないんだがinline展開されても名前は残るのかな?
0339デフォルトの名無しさん
2009/12/29(火) 09:55:510340デフォルトの名無しさん
2009/12/29(火) 09:57:060341デフォルトの名無しさん
2009/12/29(火) 12:33:08>>332
を再現できないんだが。
頼むから再現するソースをうpしてくれ。
0342デフォルトの名無しさん
2009/12/29(火) 14:11:49どうやるんですか?
0344デフォルトの名無しさん
2009/12/29(火) 18:03:03ヘッダで
inlineに宣言した関数の中で、
static int i;
の様な変数があってもよいのでしょうか?
お教えください。
よろしくお願い申し上げます。
0345デフォルトの名無しさん
2009/12/29(火) 18:04:54文法上は、全く問題ない。
0346デフォルトの名無しさん
2009/12/29(火) 19:15:55インライン展開は、1つのコンパイル単位のコードに対して行われます。
extern関数はインライン展開されません。
関数に__inlineを指定すると、他のコンパイル単位からは呼び出せなくなります。
つまり、__inlineがC++のセマンティクスを持つため、「extern __inline」は期待したとおりに動作しない可能性があります。
C++の標準仕様では、インライン関数は、各「変換単位」で個別に定義される必要があります。
そのため、別のファイルのインライン関数とリンクすることはできません。
インライン展開された関数を複数のファイルから利用したい場合には、関数をヘッダファイル(「.h」ファイル)に置いて「extern __inline」と宣言し、この関数が必要な各ファイル内で、このヘッダファイルを「#include」を使用してインクルードします。
コンパイラが関数をインライン展開しないと決めた場合には、リンク後の関数の複製は1つだけになります。
ローカルだけで呼び出される関数(「static」)は、ヘッダファイルに配置しないでください。
これらの「static inline」関数は共有できないので、リンク後に複数の複製が存在することがあります。
ローカルだけで利用される関数に、「inline」ではなく「static inline」と指定する必要は必ずしもありませんが、コーディングスタイルとしては推奨されます。
コンパイラが別の最適化を行うことができるためです。
0347デフォルトの名無しさん
2009/12/29(火) 22:58:02extern inline の場合、内部の static な変数は同一のオブジェクトを参照する事が保証されている。
文字列リテラルも同じ。
14882/2003 7.1.2p4 参照。
0349デフォルトの名無しさん
2009/12/29(火) 23:22:07動作に問題は無いが、いくつかのコンパイラでは関数ローカルな static オブジェクトを
含む場合にインライン展開が抑制されてしまう。
手元の gcc 4.3.4 で試したところ、関数ローカルな static オブジェクトを持たせた場合、
inline 展開自体は行われるものの関数の本体が出力されてしまうという結果になった。
static int i = 0; static inline int f() { return ++i; }
static inline int g() { static int j = 0; return ++j; }
int h() { return f() + g(); }
gcc -O3 -S -o - ↑ | c++filt すると、 f() のコードは出ないが g() のコードは出る。
そもそも inline の効果が本当に必要な場面なんてそんなに無い。
inline 指定がほんとうに必要なのか、たぶん考え直したほうがいい。
0350デフォルトの名無しさん
2009/12/29(火) 23:42:52実際にinline化されてもされなくてもどっちでも良く、
単にヘッダに書きたいがテンプレート関数でない時にやってました。
0351デフォルトの名無しさん
2009/12/30(水) 00:10:11ソースファイルが 10 個ぐらいで済んでる極小プロジェクトならかまわないけど、
いっぱいあるとか複数人で開発してるとかいうときには是非やめてください。
0352344
2009/12/30(水) 00:37:38> ヘッダで
> inlineに宣言した関数の中で、
> static int i;
> の様な変数があってもよいのでしょうか?
その例でいきますと
static inline int g() { static int j = 0; return ++j; }
でなく
inline int g() { static int j = 0; return ++j; }
です。
それでもダメでしょうか?
0353デフォルトの名無しさん
2009/12/30(水) 00:47:58static は関係ない。
無意味な inline 化で実装をヘッダに晒すのをやめて欲しいという話。
くだらない変更で大量のリコンパイルを起こすようなことがないように。
0354デフォルトの名無しさん
2009/12/30(水) 00:49:58普通のことなの?
0355デフォルトの名無しさん
2009/12/30(水) 01:06:51普通のことだよ。短い関数はインライン展開したほうが速いし小さくなる。
だけど、最近のコンパイラは最適化でcppに書いた関数も自動的にインライン展開される。さらに他の翻訳単位の関数までインライン展開される。
0356デフォルトの名無しさん
2009/12/30(水) 09:20:41確かにくだらない変更で大量のリコンパイルを起こすってのは避けたいですねぇ。
0357デフォルトの名無しさん
2009/12/30(水) 11:16:20メモリ直で操作する下のようなコードは安全でしょうか?
VCでテストした限りではAの領域のみ削除されてますが。
struct A {
int x;
int y;
};
struct B : public A {
B(){};
virtual ~B(){};
void clear() {
A* p = this;
ZeroMemory(p, sizeof(*p));
};
}
B b;
b.clear();;
0358デフォルトの名無しさん
2009/12/30(水) 11:22:57B*をA*でアクセスするのは問題ない。ただそれと関係なくメモリ直は色々注意が必要だよ。
A* p = this; //ここで暗黙的型変換でアップキャストが行われている。一般的にこれは安全なので問題ない。
0359デフォルトの名無しさん
2009/12/30(水) 11:25:52何を心配してるのかわからん。
POD だからってメモリフィルを使うのはあまりおすすめしない。普通に代入すればいいのに。
0360デフォルトの名無しさん
2009/12/30(水) 12:06:23AはPODなので安全。
0361デフォルトの名無しさん
2009/12/30(水) 12:21:44返答ありがとうございます。
>普通に代入すればいいのに。
これ、Cの構造体を継承したクラスで、
C側にポインタで渡したときにそっちでメモリフィルされてる
可能性が有ったもので。
0362デフォルトの名無しさん
2009/12/30(水) 12:46:34ちょっとまて、CとC++をgotchaに使ってるの?
0363デフォルトの名無しさん
2009/12/30(水) 12:54:52その辺はどうなんでしょうね
0364デフォルトの名無しさん
2009/12/30(水) 13:27:47その場合は継承は不適切だね。メンバー変数にするべきだよ、
class B
{
private:
A hoge;
public:
A* get_c_ptr()
{
return &hoge;
}
const A* get_c_ptr()const
{
return &hoge;
}
};
>>363
それはメンバーが無いときでも1バイト以上の大きさを持つってことじゃなかった?
0365デフォルトの名無しさん
2009/12/30(水) 13:36:14まあそうだね
確かメンバーが空の場合でもアドレスを取れるようにするためとか
0366デフォルトの名無しさん
2009/12/30(水) 13:43:38ttp://www.kmonos.net/alang/cpp/glossary.html
> EBO (Empty Base Optimization)
> 空の基底クラスの最適化。
>
>
> メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
> しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、 sizeof( EmptyClass ) は 0 にはなりません。
>
> EmptyClass arr[100];
> assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい
>
> 単独で使う時にはこの無駄は仕方のないところですが、 例えばこの空クラスから他のクラスを派生する
> ときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の分だけを確保する、という最適化が可能です。
> C++の規格で許されているこの最適化のことを、Empty Base Optimization と呼びます。
0367デフォルトの名無しさん
2009/12/30(水) 13:47:05うーん、それだと既存野コードで元の構造体を使ってるところを差し替えにくいのが困る。
具体的にはWinAPIで使ってるPOINTとかRECTとかを
継承させようとしてるんですが。
0368デフォルトの名無しさん
2009/12/30(水) 14:06:49MFCのCPointやCRectがまさにその継承をやっていたと思うので、VCでは安全だろう。
規格まで確認したわけではないが、他のコンパイラでも安全だと思う。
(Aへのポインタとして扱うなら、ポインタの指す先の領域がどのように生成されたかに関わらず、同じ構造として操作されるはずだから)
ただ一般的にはメンバー変数として持つほうがコーディングスタイルとして良さそうだが、
>>364がそういうことを言っているのかどうかはわからない。
0369デフォルトの名無しさん
2009/12/30(水) 14:13:31危険か安全かというとVCでは安全だと思う。
0370デフォルトの名無しさん
2009/12/30(水) 14:20:05説明ありがとうございます。
自分もコーディングスタイルとしてはメンバにするべきだと思いますが、
差し替えるときの使い勝手に負けて、継承で行きたかったので、
安全だと判って助かりました。
0371デフォルトの名無しさん
2009/12/30(水) 16:32:53>>364はget_c_ptr()で構造体のポインタが簡単に取り出せるんだけど、それでもだめなん?
0372デフォルトの名無しさん
2009/12/30(水) 17:53:100373デフォルトの名無しさん
2009/12/30(水) 18:56:32その中の自作関数すべて書き直すのはちょっとつらいので・・・
0374デフォルトの名無しさん
2009/12/31(木) 07:12:05class ClsPoint {
POINT p;
public:
long &x;
long &y;
ClsPoint() : x(p.x), y(px) {};
};
0375デフォルトの名無しさん
2009/12/31(木) 14:40:090376デフォルトの名無しさん
2009/12/31(木) 18:31:37どんな特殊化したいの?
0377デフォルトの名無しさん
2009/12/31(木) 19:08:17template<class T>
T operator+(const T& v1, const T& v2);
template<>
T operator+<int>(const T& v1, const T& v2) { return v1 + v2; };
template<>
T operator+<short>〜
0378デフォルトの名無しさん
2009/12/31(木) 19:13:540379デフォルトの名無しさん
2009/12/31(木) 19:41:26class hoge {
int x;
};
〜
template<>
T operator+<hoge>(const T& v1, const T& v2) { return v1; };
0380デフォルトの名無しさん
2009/12/31(木) 19:59:43もしそれが通ったら 1+1でも適用されてしまうような怖い気がするよ。
0381デフォルトの名無しさん
2009/12/31(木) 20:01:24struct XXX {
Type x_;
};
template<class Type>
XXX<Type> operator + (const XXX<Type>&, const XXX<Type>&)
{
return XXX<Type>();
}
XXX<int> a, b;
a + b;
普通に出来る
0382381
2009/12/31(木) 20:02:220383デフォルトの名無しさん
2009/12/31(木) 20:10:40#include <iostream>
class widget {
};
class gadget {
};
template <class T> void operator + (const T &l, const T &r) {
std::cout << "1" << std::endl;
}
template <class T, class U> void operator + (const T &l, const U &r) {
std::cout << "2" << std::endl;
}
void operator + (const widget &l, const widget &r) {
std::cout << "3" << std::endl;
}
int main(void) {
widget w;
gadget g;
g + g;
g + w;
w + w;
return 0;
}
0384デフォルトの名無しさん
2009/12/31(木) 20:20:40そうでした。
template<>
hoge operator+<hoge>(const hoge& v1, const hoge& v2) { return v1; };
こう書かないとダメなんですね。
0385デフォルトの名無しさん
2009/12/31(木) 20:24:35なるほど、template operatorより通常のoperatorが優先されるんですね。
0386デフォルトの名無しさん
2010/01/01(金) 22:23:450387デフォルトの名無しさん
2010/01/01(金) 22:37:010388デフォルトの名無しさん
2010/01/01(金) 23:14:59自分のレスを100回読め。
0389デフォルトの名無しさん
2010/01/01(金) 23:42:100390デフォルトの名無しさん
2010/01/01(金) 23:43:16スレタイが違う
0391デフォルトの名無しさん
2010/01/01(金) 23:47:080392デフォルトの名無しさん
2010/01/02(土) 00:05:15このスレの>>1と
C++相談室の>>1を読もう
0393デフォルトの名無しさん
2010/01/02(土) 00:41:21どっちも似ているような...
0394デフォルトの名無しさん
2010/01/02(土) 02:13:50>>1があんまり機能してないね
C++相談室 part76
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
スレを勃てるまでもないC/C++の質問はここで 13
てかこの3つのスレ似てる
した二つは初心者用だけどね
0395デフォルトの名無しさん
2010/01/02(土) 15:47:45これをb.cppでもこの結果を使いたいのですが、何か方法はありますか?
単純に単一の数値だけの受け渡し方法は出来たのですが、
2次元配列をどう扱っていいかがわからず、困っています。
aもbも.h(ヘッダ)を利用しています。
0396デフォルトの名無しさん
2010/01/02(土) 16:05:24素直に1次元配列として扱う事を奨める
0397デフォルトの名無しさん
2010/01/02(土) 16:18:120398デフォルトの名無しさん
2010/01/02(土) 16:52:110399デフォルトの名無しさん
2010/01/02(土) 19:37:39現在xとyに浮動小数点型の座標が入っています。
printf(%f)でみると(300.00000,480,00000)のように座標が入っており、
キー入力で移動する状態です。
ここから座標の整数部分だけを取り出そうと思い、
(int)x,(int)を%dで出力したところ、とても大きな数になりました。
%fで出力すると、両方とも0.00000…という状態です。
浮動小数点型から整数型へ変換するときは(int)で小数点以下が切り捨てられると調べたのですが、
どこが間違っているのでしょうか。
0400デフォルトの名無しさん
2010/01/02(土) 19:41:10#include<stdio.h>
int main(void){
double x=300.0, y=480.0;
printf("(%f,%f)\n", x, y);
printf("(%.0f,%.0f)\n", x, y); // 四捨五入?
printf("(%d,%d)\n", (int)x, (int)y);
return 0;
}
0401デフォルトの名無しさん
2010/01/02(土) 21:14:55いちいち、クラスの実装を読む為にfind & grepを使うのが面倒くさいんですが
C++のファイル名の命名規則はないのですか?
0402デフォルトの名無しさん
2010/01/02(土) 21:22:300403デフォルトの名無しさん
2010/01/02(土) 21:23:100404デフォルトの名無しさん
2010/01/02(土) 21:25:34ある程度関連の強いクラスやフレンド関数をまとめられる自由度があるほうがいい。
そのときの分かり易いファイル名のつけ方の扇子が問われるよな。
0405デフォルトの名無しさん
2010/01/02(土) 21:27:200406デフォルトの名無しさん
2010/01/02(土) 21:42:31*.hにはstatic hoge intと宣言してありません
何故、シンタックスエラーにならないのですか?
0407デフォルトの名無しさん
2010/01/02(土) 21:52:58何を言っているのか分からん。
意味が分かるようなソースを晒せ。
>>401
> javaみたいに、クラス名=ファイル名じゃないんですかね
むしろそんな言語はJava以外ないだろ。
C++は何でもプログラマ任せになるというところがいいんじゃねーか。
0408デフォルトの名無しさん
2010/01/02(土) 22:00:50ヘッダーの#includeはただのプリプロセッサ。javaやdelphiやc#のusesとは根本的に考え方が異なる。忘れろ。
0409406
2010/01/02(土) 22:15:12hoge.h
class Hoge {
//定数の宣言が無い
}
hoge.cpp
#include "hoge.h"
static const int hoogeNo = 1;
みたいな感じです
>>408
ひとまず忘れてみることにしますが、まだいまいちわからないorz
0410デフォルトの名無しさん
2010/01/02(土) 22:21:35class Hoge {
//定数の宣言が無い
} ← ;が無いよ!
static const int hoogeNo = 1;
0411407
2010/01/02(土) 22:23:30するとプリプロセッサにより、
#include "hoge.h"の部分がhoge.hでそっくり置き換えられ、
次のコードがコンパイラに渡されるわけだ。
//hoge.cpp コンパイラが受け取る
class Hoge {
//定数の宣言が無い
}
static const int hoogeNo = 1;
全然おかしくないだろ?
0412デフォルトの名無しさん
2010/01/02(土) 22:44:220413デフォルトの名無しさん
2010/01/02(土) 23:23:42vector<int> vec[N];
for(int i = 0; i < N; ++i) vec[i].resize(3);
を短く書きたいのですが
vector<int> vec(3)[N];
vector<int> vec[N](3);
などはコンパイルエラーになってしまいました
0414デフォルトの名無しさん
2010/01/02(土) 23:29:50vector<vector<int> >を使うのは駄目?
vector<vector<int> >a(N,vector<int>(3));
0415デフォルトの名無しさん
2010/01/02(土) 23:38:000416デフォルトの名無しさん
2010/01/02(土) 23:44:20template<class T,int N>
class VR :public std::vector<T>
{
VR()
:vector<T>(N)
{
}
};
VR<int,3> vec[100];
0417デフォルトの名無しさん
2010/01/02(土) 23:54:50そんなきもいものを使うなら
boost::arrayかstd::tr1::arrayあたりを使うほうが健全に見える。
まぁこれだと固定長になるから微妙に要望と違うけど
0418デフォルトの名無しさん
2010/01/03(日) 00:06:32良い初期化方法があるか無いか聞いてるだけでしょ
vector<int> v[N] = {
vector<int>(3),
...,
vector<int>(3)
};
残念ながら無い
0419デフォルトの名無しさん
2010/01/03(日) 17:48:56struct Hoge h;とHoge h;の2種類がありますが
何が違うんですか?
0420デフォルトの名無しさん
2010/01/03(日) 17:52:18前者だと Hoge って同名の関数があっても大丈夫。
0421デフォルトの名無しさん
2010/01/03(日) 17:52:52違いは無い。前者はC言語の制約。後者はtypedefされた型としての宣言。
C++だと何も考えず後者。
0422デフォルトの名無しさん
2010/01/03(日) 17:53:10C++ なら同じ事
0424デフォルトの名無しさん
2010/01/03(日) 18:46:11今作っているプログラムが極稀に
例外 0xc0000417
という例外を投げます。
この原因を調査するため、例外をキャッチし、その状況を出力するプログラムを書いたのですがうまくキャッチしてくれません。
VisualStudio2008 Express
プロジェクトのプロパティで
C/C++ > コード生成 > C++の例外を有効にする を「はい - SEHの例外あり」にしています。
0xc0000417をぐぐったところ、どうやらsprintf_sなどに不正な引数を渡した時の例外のようです。
そこでテストとして
try
{
sprintf_s(NULL, NULL, NULL);
}
catch(...)
{
MessageBox(NULL, "error", "error", MB_OK);
}
としてみましたが、メッセージボックスの表示のほうに流れず強制終了ダイアログがでてしまいます。
sprintf_sの代わりに、newで1GB確保のbad_alloc や、ゼロ除算はうまくキャッチしてくれました。
何かキャッチの仕方がおかしいか、設定が足りない部分はありますでしょうか?
よろしくお願いいたします。
0425デフォルトの名無しさん
2010/01/03(日) 18:54:44設定変更してからプログラムがコンパイルしなおされたか確認できる?
しかし VS 使ってるならそんなことしなくても、ふつうにデバッガで例外発生時に
ブレークさせればいいのに。
0426デフォルトの名無しさん
2010/01/03(日) 19:03:060427デフォルトの名無しさん
2010/01/03(日) 19:11:57nullポインター例外等はtry catchではキャッチできないよ。構造化例外ブロックを作らないとキャッチできないよ。
デバッガーはキャッチできるのでデバッガで見るのが簡単。
0428デフォルトの名無しさん
2010/01/03(日) 19:17:01変更してからのリコンパイルはされてるようですし、今もしてみましたけど駄目ですね
デバッガを使うべきについては、ユーザーにリリースしているツールでかつ極稀に発生するので
再現がほとんどとれないのです。
なのでユーザー環境で発生したらデバッグファイルを生成して、サポートに送ってもらおうと考えていました。
これから「構造化例外ブロック」というものについて調べてみようと思いますが、
それを(簡単ではないが)作れば、キャッチできるようになると考えて良いでしょうか?
0429デフォルトの名無しさん
2010/01/03(日) 19:33:48試しにnullポインター例外を発生させてみましたが、きちんとcatchできるようです。
「SEHの例外あり」にすれば構造化例外も単なるtry, catch(...)でとれるような記述が
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html
このサイトにありました。
しかし相変わらずsprintf_s(NULL, NULL, NULL)の時に出る例外はとれません。
下記記述法も試してみましたが、同様でした(nullポインタは捕まえられたが、sprintf_sは捕まえられない)
__try{}__except(EXCEPTION_EXECUTE_HANDLER){}
0430デフォルトの名無しさん
2010/01/03(日) 19:40:49デバッガで止めて、前後のコード見てみ?
0432デフォルトの名無しさん
2010/01/03(日) 20:04:51すいません。
何か根本的なところを間違えているのでしょうか
「sprintf_sは、例外を投げて例外がキャッチされなかったから強制終了ダイアログを出している」のではなく、
「内部でassertを吐き、その場でプロセスを終了している」のでしょうか?
そうなってくると「sprintf_sでアサートが起きたら何か処理をさせてログなどを吐かせる」という方法は無理ということでしょうか?
0433デフォルトの名無しさん
2010/01/03(日) 20:07:00ReleaseビルドしたEXEを実行すると強制終了ダイアログダイアログが出ます。
ここで「エラー報告に含まれるデータの参照 : ここをクリックしてください」をクリックし、
エラー報告に関する技術情報をクリックします。
そうすると
Exception Information
Code: 0xc0000417 Flags 0x00000001
以下略というような内容が表示されます。
そのため「例外が投げられたが、キャッチされなかったので強制終了した」と考えたのですが違うのでしょうか?
0434デフォルトの名無しさん
2010/01/03(日) 20:16:51そのエラー報告を送ってもらえばいいんじゃないの?
0435デフォルトの名無しさん
2010/01/03(日) 20:19:08Windowsの強制終了ダイアログの中身は、EXEファイルそのものと、例外の種類とそれが出たアドレスくらいしか情報が無いため、少々足りないのです。
0436デフォルトの名無しさん
2010/01/03(日) 21:52:22ただ、try-catchでどうにかする例外には見えないっつーか、CPUの吐く例外とかじゃ
ねーの?
0437デフォルトの名無しさん
2010/01/03(日) 22:09:14それが嫌なら強制終了が起こらないようにバグを潰すしかない
0438デフォルトの名無しさん
2010/01/03(日) 22:21:28そもそも論とか意味がない
0439デフォルトの名無しさん
2010/01/03(日) 22:24:05test::hogeA()はstaticなメソッドなのか、それともコンストラクタなのかわかりません
これは、ヘッダを見て解決するしかないのでしょうか?
0440デフォルトの名無しさん
2010/01/03(日) 22:33:26_set_invalid_parameter_handler
http://msdn.microsoft.com/ja-jp/library/a9yf33zb.aspx
こっちのが簡単じゃね?
スタックも保存できるし。
0441デフォルトの名無しさん
2010/01/03(日) 22:34:28そのとおりなんだけど、区別できないことで何か具体的に問題があったりする?
0443デフォルトの名無しさん
2010/01/04(月) 00:32:491.どこかに関数ポインタを渡す
2.あるタイミングの時(ex.ボタンがクリックされた場合)に、関数ポインタが呼び出される
ってことで、おk?
0444デフォルトの名無しさん
2010/01/04(月) 00:44:35そんな理解で充分。
一番基本的なコールバックを使う関数は
C標準に含まれているqsortやbsearchだけどな。
広義では、なんらかのオブジェクトを渡して、そこに含まれるメンバ
(仮想関数だったり関数ポインタだったり)を呼び出す形式のものも
コールバックと呼ばれる。
0445デフォルトの名無しさん
2010/01/04(月) 11:04:31ttp://msdn.microsoft.com/ja-jp/library/ksazx244.aspx
0446デフォルトの名無しさん
2010/01/04(月) 11:14:09ありがとう
0447デフォルトの名無しさん
2010/01/04(月) 15:18:551.TestClass t();
2.TestClass *t = new TestClass();
の2種類がありますが、どうやって使い分ければいいのでしょうか?
GUI系のプログラムはほとんど、2.の方法でインスタンスを宣言しているように思えます
0448デフォルトの名無しさん
2010/01/04(月) 15:21:10似たような質問を何度も見た
検索してみたまえ
0449デフォルトの名無しさん
2010/01/04(月) 15:36:04C++相談室 part76 の523-536
http://pc12.2ch.net/test/read.cgi/tech/1260972593/523-536
0450デフォルトの名無しさん
2010/01/04(月) 15:42:36じゃー本題じゃないところで。
×TestClass t();
○TestClass t;
0452デフォルトの名無しさん
2010/01/04(月) 16:02:04これはTestClassを返すtという関数の宣言だろ
0453447
2010/01/04(月) 16:13:29TestClass t;
この宣言方法だと、TestClass t(1);みたいに引数を付けられなかったのか
知らなかったorz
感謝します
0454デフォルトの名無しさん
2010/01/04(月) 16:18:080455デフォルトの名無しさん
2010/01/04(月) 16:30:03int t(); → 関数の宣言
int t(1); → 変数の宣言
int t(void); → 関数の宣言
こんな感じか
0456447
2010/01/04(月) 16:42:19えぇ〜と、何か勘違いしていましたね
申し訳ありません
>>449 のリンクを読みましたが、
インスタンスの生存時間によって使い分けるのが適切みたいですね
TestClass t;はnewより歴史が長いのかな〜とか、無駄な事も考えていましたが
あんまり関係なさそう
0457デフォルトの名無しさん
2010/01/04(月) 17:04:10だな
C++で空のカッコがあったらvoidを入れてみると読みやすいな
0458デフォルトの名無しさん
2010/01/04(月) 17:24:00std::string s(std::string());
って感じで変数の宣言をしようとしたら、実は関数の宣言でしたーなんてこと、たまにあるよな?
0459デフォルトの名無しさん
2010/01/04(月) 17:36:49空の括弧を見たら怪しいと思え!
0460デフォルトの名無しさん
2010/01/04(月) 18:51:51CのライブラリでC++の例外をキャッチしようというのが無理な話ですの。
boost::formatなどのC++のライブラリに置き換えて試して見るのもひとつの手ですの。
0461デフォルトの名無しさん
2010/01/04(月) 19:13:09if( h ){}
なぜ、インスタンスなのにifで使えるのですか?
0462デフォルトの名無しさん
2010/01/04(月) 19:15:180463デフォルトの名無しさん
2010/01/04(月) 19:19:34ありがとう
0464デフォルトの名無しさん
2010/01/04(月) 20:45:33C++標準ライブラリチュートリアル&リファレンス
が良いとありました。
しかし、Amazonでは取り扱い中止になっています。
内容が古いから取り扱いをやめてしまったということなのでしょうか?
0465デフォルトの名無しさん
2010/01/04(月) 21:09:16内容が古いっていうか、在庫もないし、出版社ももう刷らないってこと。
0466デフォルトの名無しさん
2010/01/04(月) 22:29:01ありがとうございます。
どこにも売ってませんね。Amazonだと1万で中古が売ってるけど・・・
同じような立ち位置の本はどのようなものでしょうか?
0467デフォルトの名無しさん
2010/01/05(火) 10:26:560468デフォルトの名無しさん
2010/01/05(火) 12:17:430469デフォルトの名無しさん
2010/01/05(火) 14:57:03つまり、追加するごとにオブジェクトを作り直すのか?ということです
0470デフォルトの名無しさん
2010/01/05(火) 15:01:13string が保持してるメモリの再確保の話だよね?
それなら reserve() を使って避けられることもあるよ。
0471469
2010/01/05(火) 15:43:22>string が保持してるメモリの再確保の話だよね?
その通りです、reserve()を調べてみる事にします
ありがとうございました
0472デフォルトの名無しさん
2010/01/05(火) 16:37:17C++のリザーブは別の話題だな。
0473デフォルトの名無しさん
2010/01/05(火) 16:56:250474デフォルトの名無しさん
2010/01/06(水) 20:57:40+=で追加する場合はreserveを超えるとメモリの再アロケートが起きる。
+で追加する場合は新しいオブジェクトが作られる。
なお、C++0xで+が+=並みになる可能性がある。
0475デフォルトの名無しさん
2010/01/06(水) 21:55:49JavaのStringやJavaScriptのStringはイミュータブル
JavaのStringBufferやC++のstringはミュータブル
0476デフォルトの名無しさん
2010/01/06(水) 22:13:110477デフォルトの名無しさん
2010/01/06(水) 22:18:42それはC++なのか?
0478デフォルトの名無しさん
2010/01/06(水) 23:16:16それはつまり右辺値参照のことを言っているのか。
0479デフォルトの名無しさん
2010/01/07(木) 00:07:54a = a + bは高速化されないけどな
ま、moveを使うのなら
a = move(a) + b + cと
比較的簡潔高速に書けるから便利だけどね。
0480デフォルトの名無しさん
2010/01/07(木) 01:34:32> a = a + bは高速化されないけどな
operator=(basic_string&& str) があるから、今まで operator=(basic_string const& str) で
必要になってたバッファの再確保とコピーが減らせるんじゃないの?。
0481デフォルトの名無しさん
2010/01/07(木) 02:14:19あーすまん、その通りだ。
(a+b)の部分は高速化されないけど代入の部分は確かに高速化されるね。
さんきゅー
0482デフォルトの名無しさん
2010/01/07(木) 20:55:37__declspec(dllexport) tr1::shared_ptr<iface> CreateObject(param p)
{
return tr1::shared_ptr<iface>(new iface(p));
}
というのがあったとして
これを受け取るEXE側で使うライブラリの実装がDLL側と異なる場合ってヤバイですか?
0483デフォルトの名無しさん
2010/01/07(木) 20:57:40うん
0484デフォルトの名無しさん
2010/01/07(木) 21:08:49しかたがないので生ポで頑張りますわ
0485デフォルトの名無しさん
2010/01/07(木) 21:33:13e=a+b+c+d
だと
a+bで一時オブジェクトが作られた後、残りの+c+dではその一時オブジェクトに+=を適用できる様になるんだな。
0486デフォルトの名無しさん
2010/01/07(木) 22:53:45すすすすすげーーーーー
0487デフォルトの名無しさん
2010/01/08(金) 08:23:07Windows環境です。
fstreamでは存在するかどうかの判定はできませんよね・・?
0488デフォルトの名無しさん
2010/01/08(金) 08:26:40存在しなければエラーになるでしょ。 fstream なら is_open() で調べるんだったかな?
0489デフォルトの名無しさん
2010/01/08(金) 16:51:04エラーコードから推定できる気がする。
0490デフォルトの名無しさん
2010/01/08(金) 21:20:190491デフォルトの名無しさん
2010/01/08(金) 21:21:57むろん。
0492デフォルトの名無しさん
2010/01/08(金) 23:41:000493デフォルトの名無しさん
2010/01/08(金) 23:46:59分かりやすいようなわかりにくいような
0494デフォルトの名無しさん
2010/01/09(土) 00:00:550495デフォルトの名無しさん
2010/01/09(土) 00:44:02すぐわかるのに何でここで聞くんだろう
0496デフォルトの名無しさん
2010/01/09(土) 01:23:03VC++なら_access_s( path, 0 )で存在するかどうかをチェックできる
0497デフォルトの名無しさん
2010/01/09(土) 02:00:44チェックしてから実際に開いたりするまでの間に作られたり削除されたりしないとどうして言い切れるのか
0498デフォルトの名無しさん
2010/01/09(土) 02:06:44>>489
>>496
ありがとうございます! 試してみたいと思います。
>>497
無かったらデフォルト内容で新規作成して、あったらそのファイルを読み込みたいんです。
プログラム内部の動作なので、削除されたりはしないと思います。
0499デフォルトの名無しさん
2010/01/09(土) 06:36:05const_castはconst化じゃなくて非const化専用
0500デフォルトの名無しさん
2010/01/09(土) 06:36:450501デフォルトの名無しさん
2010/01/09(土) 07:57:08ネットワークドライブなら接続切れるかもしれないし
別のユーザーとかが手動で消すかもしれないし
二重起動された自分が消すかもしれないぞ?
開いてみて、失敗したらデフォルトを作るで何が不満なの
0502デフォルトの名無しさん
2010/01/09(土) 09:38:58何らかの理由で、存在はするけどオープンには失敗した、という場合、新規作成に
成功してしまうと既存のファイルが死ぬ
まぁとりあえず、WindowsのAPIを適当に調べればいいんじゃね
0503デフォルトの名無しさん
2010/01/09(土) 10:45:04その場合はエラー処理を変えた方がいいだろうし、予めファイルの存在を調べるのも悪くないと思う
0504デフォルトの名無しさん
2010/01/09(土) 18:28:19fstreamをインクルードしてファイル操作を行いたいのですが
ポインタの位置を変更するseekp()およびseekg()メソッドの1番目の引数
がlong型なので2GBを超えるファイルの操作が出来ません。
4GB程度のファイルの編集を行いたいのですが方法を教えてください。
vipでも同じ質問をしたのでマルチポストになるかもしれないのですが、
こちらのスレに誘導されたのでよろしくお願いします。
0505デフォルトの名無しさん
2010/01/09(土) 18:34:31osのファイル操作API使うのがいいんじゃないかと・・・。
0506デフォルトの名無しさん
2010/01/09(土) 18:41:17なるほど・・そういう方法もあるんですね
0507デフォルトの名無しさん
2010/01/09(土) 18:51:22seekp(), seekg() の引数は実装依存で long とは決まってないはず。
どうやって実際に long だと判断したの?
あと、環境は?
0508デフォルトの名無しさん
2010/01/09(土) 19:01:50そうなんですか。
環境は windows xp home sp3 , visual c++ 2008 express editionです
2GBを超えてからファイルの入出力が正常に行えなくなったのでそう判断しました
0509デフォルトの名無しさん
2010/01/09(土) 19:04:49ググったら、32bitを超えるファイルのseekの対応状況を
調べたページがあった。
0510デフォルトの名無しさん
2010/01/09(土) 19:06:51みてみます!
0511デフォルトの名無しさん
2010/01/09(土) 19:10:24そのサイトの中で下記の様に記述されていたので、fstreamは諦めます
>これがC++では逆転して32bit Windowsではseekgなどは諦めざるをえないようです.
>次のようなコードはWindowsでは2GBを超えるファイルに対して期待通りに動作しません.
>詳しく言うとVC9まではseekg()が失敗します(VC10では大丈夫).
0512デフォルトの名無しさん
2010/01/09(土) 19:13:43下記の様に記述されていたのでこの方法を使おうと思います
>ただしWindowsではstd::ifstream::pos_typeという型が拡張されていて, これを使うとfpos_t + fgetpos的な使い方は可能です.
0513デフォルトの名無しさん
2010/01/09(土) 19:19:580514デフォルトの名無しさん
2010/01/09(土) 20:00:11int n=0;
wchar_t buff[4]={0};
swprintf( buff, 4, L"ABCDE%n", &n );
としたときにnに何が入るかは決まっているのでしょうか?
手元の環境では5が帰ってきたのですが移植性があるか教えて頂きたい。
0515デフォルトの名無しさん
2010/01/09(土) 20:13:37質問とは関係ないけど、buffのサイズが小さすぎないか?
0516515
2010/01/09(土) 20:14:300517514
2010/01/09(土) 20:27:150518デフォルトの名無しさん
2010/01/09(土) 21:35:07とても興味がある。
0519デフォルトの名無しさん
2010/01/10(日) 01:51:49これはなんて名前の技術ですか?
COM?OLEオートメーション?ActiveX?
0520デフォルトの名無しさん
2010/01/10(日) 02:25:35#include<stdio.h>
void autosum(char *addr1, char *addr2, char *ans);
void main(void)
{ char x,y;
char ans[4];
x=10;
y=20;
ans = autosum(&x,&y,&ans);
/*表示用*/
for(int i=0; i<=3; i++)
printf("ans[%d]: %d\n", i, ans[i]);
}
void autosum(char *addr1, char *addr2, char *ans)
{ *ans = *addr1 + *addr2;//加算
*(ans+1)= *addr1 - *addr2;//減算
*(ans+2)= *addr1 * *addr2;//乗算
*(ans+3)= *addr1 / *addr2;//除算
}
四則演算の結果を出したいのですが「 3 番目の引数を 'char (*)[4]' から 'char *' に変換できません」と
エラーがでます。ans[]で試したりしたのですがエラーがでます。
どのように直せばよいのですか?アドバイスお願いします。
環境はVisual C++2008 Express Editionです。
0521デフォルトの名無しさん
2010/01/10(日) 02:28:350522デフォルトの名無しさん
2010/01/10(日) 02:30:180523デフォルトの名無しさん
2010/01/10(日) 02:30:55間違ってたらすまんね。
0524519
2010/01/10(日) 02:36:28ありがとうございます.
0525デフォルトの名無しさん
2010/01/10(日) 02:46:53void autosum(int addr1, int addr2, int *ans);
int main(void) {
int x, y;
int ans[4];
x = 10;
y = 20;
autosum(x, y, ans);
/* 表示用 */
for (int i = 0; i < 4; i++)
printf("ans[%d]: %d\n", i, ans[i]);
return 0;
}
void autosum(int addr1, int addr2, int *ans) {
ans[0] = addr1 + addr2; // 加算
ans[1] = addr1 - addr2; // 減算
ans[2] = addr1 * addr2; // 乗算
ans[3] = addr1 / addr2; // 除算
}
0526デフォルトの名無しさん
2010/01/10(日) 03:08:11これ、テキストの問題でして元が↓でした。
#include<stdio.h>
???????/*算出関数のプロトタイプ宣言(問1)*/
void main(void){
char x,y;
char ans[4];
x=10;
y=20;
???????/*間出関数の呼び出し(変数xyアドレスと配列ansの先頭アドレスを引数で渡す)(問2)*/
}
void autosum(???????)/**addr1,*addr2,*ansで引数を受け取る(問3)*/
{
*ans = *addr1 + *addr2; /*加算*/
*(ans+1)= *addr1 - *addr2; /* 減算*/
*(ans+2)= *addr1 * *addr2; /*乗算*/
*(ans+3)= *addr1 / *addr2; /*除算*/
}
intを使わずにやる方法ってないのでしょうか?
それともテキストの間違い?(結構あったので)
0527デフォルトの名無しさん
2010/01/10(日) 03:26:20その例だと乗算でオーバーフローするけど
0528デフォルトの名無しさん
2010/01/10(日) 03:42:50穴を埋めて四則演算の結果を答えるって問題を
どうしても解けないの質問しました。
0529デフォルトの名無しさん
2010/01/10(日) 03:46:49ans = autosum(&x,&y,&ans);
↓
autosum(&x,&y,ans);
に変えるだけでおkかな?
for文の反復条件は>525氏が書いたように
i < 4
のほうが分かりやすいよ
0530デフォルトの名無しさん
2010/01/10(日) 04:02:14初心者なので質問の仕方自体が適切でないかもしれませんが、どうかよろしくお願いします。
c言語で、テキストファイル(.txt)上の数列を、int型の2次元配列に格納したいのですが、
数値の総数が不明な場合、どのようなプログラムが考えられますか?
【テキストファイルの例】
99 3 5 -3 12 ・・・(データがどこまで続くか不明)
41 -11 0 1 2 ・・・(〃)
・
・
・
※数値の区切りはカンマなどスペース以外でも可です。
※ただできればテキストファイル上の数値は列毎に後端で揃うようにしたいです。
0531デフォルトの名無しさん
2010/01/10(日) 04:29:441列の要素数がすべて同じという保障があるなら、
固定配列で一回1列目の要素数を確認して、mallocでメモリを確保して、処理して、最後にメモリ開放。
って流れじゃないかな??
0532デフォルトの名無しさん
2010/01/10(日) 04:44:29ans = autosum(&x,&y,&ans); の部分の ans= は
戻り値は無いのでいらなかったってことでいいのでしょうか?
助かりました、有難うございました!
0533530
2010/01/10(日) 10:50:48レスありがとうございます。
こちらの説明が足りませんでした。
各行(横方向)の要素数は一律でない上に不明という状況です。
前提条件を覆すようで申し訳ありませんが、
どうも2次元配列で一気に格納するよりは、1次元配列で一行ずつ読み込んだほうがよさそうですね。
現状としては、数列を一行ずつ要素ごとに配列に格納する段階でつまずいています。
できれば全体の処理の流れを示して頂けると助かります。
0534デフォルトの名無しさん
2010/01/10(日) 11:14:28c++でvectorを使えば簡単なんだけど、どうしてもcじゃないとダメなの?
cだと結構めんどくさいよ。
0535デフォルトの名無しさん
2010/01/10(日) 11:19:28そこまでわかってたらアドバイスする余地ねーよw
0536デフォルトの名無しさん
2010/01/10(日) 11:21:40スマートさにはかけるが2度読みするのが一番楽。
1回目にアイテムの数だけ数える。
0537デフォルトの名無しさん
2010/01/10(日) 11:30:010538デフォルトの名無しさん
2010/01/10(日) 11:37:18アクセスがトロくてもいいなら一方向リスト
struct intlist_t
{
int value;
struct intlist_t *next;
};
struct intlistlist_t
{
struct intlit_t *list;
struct intlistlist_t *next;
};
0539デフォルトの名無しさん
2010/01/10(日) 11:53:47効率悪いけど
エラー処理も省略してるけど
いちおう動くのを作ってみたので
参考程度にどうぞ
http://codepad.org/Z5EPboMq
0540デフォルトの名無しさん
2010/01/10(日) 12:32:51ポインタを経由して別クラスのメンバ関数を呼び出すことにしてるんだすけど、
いちいちif(hogePtr != Null)をするのが面倒なんで何か上手い方法とかありませんか?
0541530
2010/01/10(日) 12:34:36とりあえず>>539さんのものを元にやってみます。
int型配列をその後どうしたいのかとか、c出ないといけない理由とか、
いろいろ説明不足ですいませんでした。
0542デフォルトの名無しさん
2010/01/10(日) 12:40:33NULLの代わりにダミーオブジェクトを放り込んでおく
ヌルオブジェクトパターン
0543デフォルトの名無しさん
2010/01/10(日) 12:42:08if(hogePtr) にすれば文字数は半分近くになるよ
0544デフォルトの名無しさん
2010/01/10(日) 12:44:04ありがとう。こんなデザインパターンがあったのか。まだ読んでないけど使えそうっぽい。
しかし、”してるんだすけど”って何だよorz
0545デフォルトの名無しさん
2010/01/10(日) 12:48:54可愛いから許す。
0546540
2010/01/10(日) 12:55:51オブジェクトの生成もせずに済むのかと早合点したけど世の中そんなに上手い話は無いってことか。
0547デフォルトの名無しさん
2010/01/10(日) 13:00:33場合によってはassertで済むんじゃない?
NullObject なんてグローバル変数でおk
0548540
2010/01/10(日) 13:06:27で、そこいらにNullチェックがあってうざいなぁと思って、
ヌルオブジェクトパターン使えばnewも何もせずに済むもんかと先走ってしまった。
Singletonあたりと組み合わせるのが定番みたいなんで検討しみます。
0549デフォルトの名無しさん
2010/01/10(日) 15:04:070550デフォルトの名無しさん
2010/01/10(日) 16:01:57そのクラス内では許される
0551デフォルトの名無しさん
2010/01/10(日) 16:18:27質問させて下さい。構造体のポインタの質問です。
aとbがポインタとして、
a->bという記述は、「ポインタaが指し示すの構造体のメンバであるポインタbの指し示す値」
という認識は間違いでしょうか?
プログラムを読んでいると、a,b,cがポインタとして
c = a->bと記述されていて戸惑っています・・・
*cではなくcなわけだから、cはアドレスなのでc = &a->bと今の理解ではなってしまいます・・・
0552デフォルトの名無しさん
2010/01/10(日) 16:40:22(*a).b の省略記法
0553デフォルトの名無しさん
2010/01/10(日) 16:41:27(*a).b
と
a->b
が等価なところからつきつめていけばどうでしょうか?
0554515
2010/01/10(日) 16:42:54> a->bという記述は、「ポインタaが指し示すの構造体のメンバであるポインタbの指し示す値」
> という認識は間違いでしょうか?
「ポインタaが指し示すの構造体のメンバであるポインタbの値」だな。
0555デフォルトの名無しさん
2010/01/10(日) 16:56:10a->b というのは、(*a).bのことです。
よく考えてみてください。
bはポインタとして宣言されているのだから、
ポインタcに代入しても大丈夫なのです。
0556デフォルトの名無しさん
2010/01/10(日) 17:01:40じゃあ、抽象クラスやインターフェースクラスはどう扱ってるの。継承オンリー?
それらのポインタでコンテナを作ったりしないの?
0557デフォルトの名無しさん
2010/01/10(日) 17:08:49ご教授ありがとうございます。
基礎的な質問ですみません。
少しわかってきました。(間違っているかも・・・)
(*a).bとかんがえると、a->bはアドレスとなります。
では、もしポインタbの値が欲しい場合は、*(a->b)と書けば良いという理解で正しいでしょうか?
このように理解しました。間違っていたらご指摘お願いします。
a->b ←これはアドレス
*(a->b) ←これは値
0558デフォルトの名無しさん
2010/01/10(日) 17:14:40551です。
ありがとうございます。
「ポインタaが指し示すの構造体のメンバであるポインタbの値」にアドレスが
書かれていて、そのアドレスに変数がある(*b)という理解で正しいでしょうか?
0559デフォルトの名無しさん
2010/01/10(日) 17:17:27連続で書き込みすみません。
では、もしポインタbの値が欲しい場合は、*(a->b)と書けば良いという理解で正しいでしょうか?
↓
では、もしポインタbが指し示す値が欲しい場合は、*(a->b)と書けば良いという理解で正しいでしょうか?
の間違いでした。
0560デフォルトの名無しさん
2010/01/10(日) 17:29:44正解でよいと思う。
演算子の優先度は->の方が強いので
*a->b
でかまわない。明示する意味で()つけも悪いわけではない。
構造体の変数a,そのメンバbがあるとき
a->b
はbの型に一致する、というのが正確かな。
0561デフォルトの名無しさん
2010/01/10(日) 18:17:51ありがとうございます。
理解することができました。
0562530
2010/01/10(日) 19:04:18>>539のプログラムで、2次元配列全体の要素数ではなく、
↓のように各行毎の要素数を求めるにはどうしたらよいでしょうか?
99 3 5 -3 12 8 19 3
41 -11 0 1 2
99 3 5 -3 12 8 19 3 89
要素数8
要素数5
要素数9
0563デフォルトの名無しさん
2010/01/10(日) 19:06:41↓
文字列解析
0564デフォルトの名無しさん
2010/01/10(日) 19:17:08文字列処理がわからないっていってるのか?
デリミタ(区切り文字)で調べると大抵の人が何をやってるのかわかるぜ
0565530
2010/01/10(日) 19:38:29[99] [3] ・・・ [\0]
[41] [-11] ・・・ [\0]
data[i][j] = '\0'の時のjがそのままi行目の要素数になるということなら、
かなり乱暴ですが、
for(;;){
if( data[i][j] = '\0'){
printf("i行目の要素数:%d\n", j)
break;
}else{
j++;
}
}
こんな感じで?
0566デフォルトの名無しさん
2010/01/10(日) 19:42:57その程度の問題なら、自分でいろいろプログラム書いて試してみ。
入力は超簡単なテキストファイル、例えば「1 2 3 4 5」だけの奴でいい。
キミのプログラムにこのテキストファイルを読ませて、「5」が出力されれば正解だ。
そうやって自分で試行錯誤しないと身につかないよ。
0567530
2010/01/10(日) 20:43:16ご指摘ありがとうございます。
自分で試行錯誤してみた所、↓のような形になってしまいます。
1行目の要素数:0
2行目の要素数:14
3行目の要素数:8
0 1 2 3 4 5
1 2 3 4 5
1 2 3 0
[ソースコード]
//各行の要素数の取得
for(i = 0; i < nrows; i++){
for(j = 0;; j++){
if( data[i][j] == '\0'){
printf(" %d行目の要素数:%d\n", i+1, j);
break;
}else{
j++;
}
}
}
//2次元配列上の数値の表示
for (i = 0; i < nrows; i++) {
for (j = 0; j < ncols[i]; j++) {
printf(" %2d", data[i][j]);
}
printf("\n");
}
0568デフォルトの名無しさん
2010/01/10(日) 20:46:23「なってしまいます」じゃなくて、直るまで試行錯誤しろよ
0569デフォルトの名無しさん
2010/01/10(日) 21:13:14i行目の要素数はnrows[i]だ
コメントが全くないソースだから仕方ない部分もあるとはいえ
for文ぐらいはちゃんとして理解して欲しいかな
0570デフォルトの名無しさん
2010/01/10(日) 21:14:000571530
2010/01/10(日) 21:16:11やってはいるのですが、なかなかうまくいきません。
テキスト上のデータ上に0があると、そこまでしか要素数を数えてくれないのはどうしたらいいのでしょうか?
0572デフォルトの名無しさん
2010/01/10(日) 21:25:06の文字列解析からわかってなさそうだな
0573デフォルトの名無しさん
2010/01/10(日) 21:43:16dataはchar**じゃなくてint**だからな?
0574530
2010/01/10(日) 21:45:13すいません。やっと>>539のプログラムの流れがつかめてきました。
↓のようにしたらncols[i]がi行目の要素数だと分かりました。
本当にありがとうございます。
[ソースコード]
//2次元配列の表示
for (i = 0; i < nrows; i++) {
printf("%d行目の要素数:%d\n",i ,ncols[i]); //追加部分
for (j = 0; j < ncols[i]; j++) {
printf(" %d", data[i][j]);
}
printf("\n");
}
[実行結果]
1行目の要素数:8
0 1 2 3 4 5 6 7
2行目の要素数:14
1 0 1 2 3 4 5 6 7 8 9 10 11 12
3行目の要素数:19
2 1 0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17
4行目の要素数:1
3
5行目の要素数:26
4 3 2 1 0 1 2 3 4 5 6 7 8 910 11 12 139 10 11 12 13 14 15 16 17 18
0575530
2010/01/10(日) 21:46:51すいません。独学の上、始めて一月くらいなもので許してください。
int型の配列の時もchar型と同じように文字列解析可能なのでしょうか?
やってみたら0が配列上にあるとそこまでしか要素が数えられなかったので。
>>573
そうかもしれません。char型に直さないといけないのでしょうか?
0577530
2010/01/10(日) 22:00:09すいません、>573を誤読しました。
>>539が各行の要素数を配列ncols[i]に入れてfor分を制御していることは分かりました。
もちろんそれで問題は解決しているのですが、>>563-564さんの指摘を考えると、
int型でもchar型と同じように文字列解析できるということなのかと思ったので。
0578デフォルトの名無しさん
2010/01/10(日) 22:03:38こないだ久米井康孝の「猫でもわかるC言語」って本買ってC言語入門したけどマジで超分かりやすいは……
大学にいた女だけに優しいクソ教師のベーシックよりずっとずっと分かりやすいっす
ただ一つ不満を言うと、俺はC言語を習いたかったのに中身はC++だった……何をいってるか(ry
C++とCて全く違うのでしょうか?できればC言語から習ったが良いでしょうか?
正直他にあったC言語の本はハードでとっつきにくそうだったんですけど……
0579デフォルトの名無しさん
2010/01/10(日) 22:09:05でもC++の入門書ってC知ってる前提の多いから気をつけろよ
0580デフォルトの名無しさん
2010/01/10(日) 22:09:27どうせ学ぶならC++をすすめるよ
0582デフォルトの名無しさん
2010/01/10(日) 22:21:40Cというコンピューター言語の区別がついてないとか無い?
0583デフォルトの名無しさん
2010/01/10(日) 22:22:05C言語はさらーっとだけ最初に学んだ方が良いとは思う。
まあなんだ、
小中学生が
いきなりかけ算九九と文字式計算を勉強するか、
かけ算九九をかるく勉強してから文字式計算を勉強するか、
的な感じかな。
0584デフォルトの名無しさん
2010/01/10(日) 22:41:06>>563-564は539のプログラムを読まずに>>562の
> 各行毎の要素数を求めるにはどうしたらよいでしょうか?
にだけ答えたんじゃねーかな
0585578
2010/01/10(日) 22:42:09>>581
信頼のベストセラー類型20万部て帯だったんですけど
Visual C++を例にして解説してありました
>>582
今日は¥ついたエスケープシーケンスてので簡単文章書いたんですけど(ソース書く第一歩です)
『カテゴリから「コード」を選択し、テンプレートから「C++ファイル(cpp)」を選択してください』って書かれてたんですけど
0586デフォルトの名無しさん
2010/01/10(日) 22:44:260589デフォルトの名無しさん
2010/01/10(日) 22:53:08猫のホームページなら読んだことある。
本でも何でも最初はいいから、とにかく読んだり書いたりしてみる
のが良いかと。
>正直他にあったC言語の本はハードでとっつきにくそうだったんですけど……
いや、まともなプログラミングってのはそういうものだ。
厳格な文法の下 書かねばならないのだから、当然解説もそうなる。
0590578
2010/01/10(日) 23:06:20>本でも何でも最初はいいから、とにかく読んだり書いたりしてみる
わかりました!取っ掛かり探す段階なんでとにかく書こうと思います
>>579
プログラミング知らない人用って書かれてて自分でも理解できたんでその点は大丈夫かと
>>588
自分もそう思ったんですけど、515にあるようにC++ってコード選択したんで
…俺は何を勉強してるんだろうw
0591デフォルトの名無しさん
2010/01/10(日) 23:10:38たしかc++はcのコードも動くようにできてるはずだから気にしなくていい
0592515
2010/01/10(日) 23:14:18指定するオプションがあるけど、猫だし、まあいいやってはしょったんだろ。
0593デフォルトの名無しさん
2010/01/10(日) 23:14:280594589
2010/01/10(日) 23:17:15C言語の
>取っ掛かり探す段階なんでとにかく書こうと思います
なら、猫の本でおk。
C++に進級するときは(猫のホームページを読む限り)
猫の本は止めといた方が良いと思う。
C++入門者にはエクスメディアの『ビジュアルラーニングC++』って本が
個人的なオススメだったけど、会社が倒産しちゃったんだよなぁ。
0595デフォルトの名無しさん
2010/01/10(日) 23:21:34↓
適当
↓
Effective C++
0597578
2010/01/10(日) 23:27:41ありがとうございます、参考にします
>>591-592
何度もすいません、自分の勘違いでしたか
本をよく読んだらC言語では空行は無視されますが見やすいから入れますって書かれてました…すいません
0598デフォルトの名無しさん
2010/01/11(月) 01:15:26だけど、C++モードでCを学んだら、後々大変なことになりかねないぞ。
変数の宣言位置とかさ。
それはともかく、入門書にはAcceralated C++を推すぜ。
0599デフォルトの名無しさん
2010/01/11(月) 11:20:36C++からCだと、初期化位置で宣言できないなんて不便だな。って思う程度だけど。
逆にCからC++だと、頭でNULLや0を入れればいいなんて変な癖つけられて余計面倒だよ。
C++を使っていればオブジェクト指向の設計方法を学んでいるから、後からCを使ってもその設計手法が生かせるメリットあるよ。
0600515
2010/01/11(月) 11:32:40Cでもこれはダメでしょ。
0601デフォルトの名無しさん
2010/01/11(月) 12:40:02関数全体を理解しやすいし、正しい思考が出来る。
初心者はC++であってもそうした方がいいと思うよ
0602デフォルトの名無しさん
2010/01/11(月) 12:45:050603デフォルトの名無しさん
2010/01/11(月) 12:46:39また時代に逆行するようなヤツが。
0604デフォルトの名無しさん
2010/01/11(月) 13:00:29>>601
時代に逆行するというか、
単にC++に詳しくない初心者程度だから
そのくらいの使い方しかできないんだろ。
>>601
>Cのように、関数の頭でまとめて宣言する方式の方が、
こいつに至ってはコンストラクタすら理解していないようにしか読めないww
0606デフォルトの名無しさん
2010/01/11(月) 13:11:45初期化の仕方によって違うときもあるから嫌いなんだよね
チェックしようと思ったら動かしてブレークポイントで止めてみないとわかりにくいっていう
C++の機能自体いいと思うもんがない
勉強したての当時は新しいってだけで覚えたけどね
でもいま考えると欠陥言語だな
昔の人がなんで言語に型を入れたのか?とかそういうあえていれた制限を
なにも考えずに無駄にとっぱらって悦にいってる言語にしかみえない
0607デフォルトの名無しさん
2010/01/11(月) 13:14:16バカスw
お前の無知さが恥ずかしい。
<間違い>初期化の仕方によって違うときもあるから嫌いなんだよね
<間違い>C++の機能自体いいと思うもんがない
<間違い>昔の人がなんで言語に型を入れたのか?とかそういうあえていれた制限をなにも考えずに無駄にとっぱらって
だいたいC++も静的型付け言語だろ無能w
0608デフォルトの名無しさん
2010/01/11(月) 13:14:52なんか勘違いしてないか?
C++は型をとっぱらってないだろ。
0609デフォルトの名無しさん
2010/01/11(月) 13:36:000610デフォルトの名無しさん
2010/01/11(月) 13:42:50C++は、もともと抽象データ型をサポートするための C の拡張だし、
型を自由に定義できること自体は悪くない、はず
C++の問題は、言語仕様が混沌としてることもあるけど、ユーザが
やり放題すぎるのが原因にみえる。コンストラクタにしても、メモリ初期化ぐらいなら
まだしも、API 呼ぶとか時間のかかる処理を平気で入れたりするんだよね
あと、なんでこのスレの何人かがこんなにC++マンセーなのか分からん
0611デフォルトの名無しさん
2010/01/11(月) 13:46:45> やり放題すぎるのが原因にみえる。コンストラクタにしても、メモリ初期化ぐらいなら
> まだしも、API 呼ぶとか時間のかかる処理を平気で入れたりするんだよね
必要なら入れるだろ。処理時間でコンストラクタに入れるかどうかなんて決めないよ。
0612デフォルトの名無しさん
2010/01/11(月) 13:51:03C++に限らず、ほかの言語でも、コンストラクタでファイルオープンとか
DB接続とかやるのふつーだしな。
0613デフォルトの名無しさん
2010/01/11(月) 14:21:14抽象度の低い世界しか理解できない人がいるだけにしか見えない
0614デフォルトの名無しさん
2010/01/11(月) 15:08:17しねえよw
initとかconnectとかそれ用の関数を用意するのが常識
FILE作ると同時に勝手にfopen呼んでたら大変なことになるだろ
0615デフォルトの名無しさん
2010/01/11(月) 15:11:12いや、コンストラクタかファクトリメソッドが主流だろ?
MFCみたいにコンストラクタと初期化が別になってるほうが少数派なんじゃね?
0616デフォルトの名無しさん
2010/01/11(月) 15:11:27コンストラクタで用意されてることもある。
どうでもいい処理のときには便利。
0617デフォルトの名無しさん
2010/01/11(月) 15:14:24つRAII
0618デフォルトの名無しさん
2010/01/11(月) 15:16:000619デフォルトの名無しさん
2010/01/11(月) 15:37:200620デフォルトの名無しさん
2010/01/11(月) 15:37:41ttp://cppreference.com/wiki/io/constructors
君の言う常識が本当ならC++のライブラリは非常識ということになるな
0621デフォルトの名無しさん
2010/01/11(月) 15:50:090622デフォルトの名無しさん
2010/01/11(月) 15:53:370623デフォルトの名無しさん
2010/01/11(月) 15:55:55OSと綺麗の基準がですね。
0624デフォルトの名無しさん
2010/01/11(月) 16:00:00綺麗の基準は、使いやすくて薄くてそこそこの移植性があってバグが少ないもので。
0625デフォルトの名無しさん
2010/01/11(月) 16:02:16そうだね。initが必要なんてのはコンストラクト時にすでにクラスの状態が不明なんていい加減な設計だからだろうし。
>>618
そうだよね、保護方法が無いもんね。1回だけしか呼ばれないと保障されているコンストラクタで用事を済ますのが安全だし手間なしだし。
だから、>>606の
>俺はコンストラクタって呼ばれてるのか呼ばれてないのか
>初期化の仕方によって違うときもあるから嫌いなんだよね
が意味不明なんだよね。
0626デフォルトの名無しさん
2010/01/11(月) 16:05:40もちろんコンストラクトはちゃんとしてだが
0627デフォルトの名無しさん
2010/01/11(月) 16:13:41init用のメソッドが別途必要になることもある
コンストラクタ実行中に this を外部に漏らすと構築未完了状態のオブジェクトに
アクセスされる恐れがあるからね(特にマルチスレッド時)
まあコンストラクタで済むならそれで充分
0628デフォルトの名無しさん
2010/01/11(月) 16:15:23僭越ながら申し上げます。
コンストラクタから例外投げても良いんだよ。
0629デフォルトの名無しさん
2010/01/11(月) 16:17:52そういう場合はファクトリで隠蔽した方がいいと思うよ
0630デフォルトの名無しさん
2010/01/11(月) 16:26:27Linuxのことはわからなーい。
だれか、>>624にちからをわけてくれー。
0631デフォルトの名無しさん
2010/01/11(月) 16:45:45boost::asioを試してみてくれないか?
感想を聞きたいんだな。
0632530
2010/01/11(月) 17:45:41グローバル変数でこの先困るのかは何とも言えないところがありますが、原因の見当がまったくつかなくて困っています。
-------------------------
#include <stdio.h>
#include <stdlib.h>
int D[256][1024]; ←グローバル変数にすると処理が実行される。
int main() {
int D[256][1024]; ←ここだと処理が実行されない。
FILE *fp = fopen("data.txt", "r");
int nrows = 0;
int i;
int j;
int n = 0;
int **data = NULL;
int *ncols = NULL;
int *row = NULL;
for (;;) {
int minus = 0;
int value = 0;
int c = getc(fp);
puts("ここまできてる?"); ←表示されない
以下実行処理
-------------------------
0633デフォルトの名無しさん
2010/01/11(月) 17:49:30こっちは例外とか強制的に処理しなきゃなんねーのかよw
失敗したかどうかなんてBOOLで返せよ
なんでてめぇのオナニー例外処理なんてこっちでうけてやんなきゃならねーんだよw
0634デフォルトの名無しさん
2010/01/11(月) 17:49:49Cに手を出すな。LLで遊んでろ。
0635デフォルトの名無しさん
2010/01/11(月) 17:55:35スタックの使いすぎ
0636デフォルトの名無しさん
2010/01/11(月) 17:58:57標準がそうなんだから仕方ない
自分でなんとかするんだ
0637デフォルトの名無しさん
2010/01/11(月) 18:00:31たぶんそうなんだろうが、高々2MBスタック使っただけで落ちるんだったか
0638デフォルトの名無しさん
2010/01/11(月) 18:02:36VC++とかで1MBがデフォルトじゃなかったか
0639デフォルトの名無しさん
2010/01/11(月) 18:02:37正確には覚えてないが
0640デフォルトの名無しさん
2010/01/11(月) 18:06:27失敗をboolで返されるほうが迷惑
0641デフォルトの名無しさん
2010/01/11(月) 18:09:21これって、16進数なんだっけ?
100000 size of stack reserve
1000 size of stack commit
100000 size of heap reserve
1000 size of heap commit
ヒープの数字は使ってないよねこれ?
0642デフォルトの名無しさん
2010/01/11(月) 18:11:39ということでスタックオーバーフローだね。
32bit * 256 * 1024で1MBをスタックに取ろうとしたから。
リンカのオプションでスタックサイズを広げるか
でかい配列をスタックに取らないかどっちかだね。
スタックに取らない様にするには、グローバルにするかstaticをつけるかmalloc等でヒープを使うかだね。
0643デフォルトの名無しさん
2010/01/11(月) 18:14:220644530
2010/01/11(月) 18:28:46static変数にしたら、ローカル変数で宣言できました。
また試しに配列をD[100][100]と小さくしても動きました。
問題が解決した上、ちょっと理解も深まって本当に感謝です。
0645デフォルトの名無しさん
2010/01/11(月) 19:25:310646デフォルトの名無しさん
2010/01/11(月) 19:26:34staticはよしてmalocにしたほうが良いよ。
0647デフォルトの名無しさん
2010/01/11(月) 19:33:14Googleは例外使わないルールだから仕方がない
0648デフォルトの名無しさん
2010/01/11(月) 19:41:58なぜ malloc() の方がいいのか?これだけの条件では static / malloc() の差はないでしょうに。
0649デフォルトの名無しさん
2010/01/11(月) 19:46:41エラー処理に興味ないなら何もしなきゃいいんだよ。
0650530
2010/01/11(月) 19:47:44そうなのですか? よろしければどうか理由を教えてください。
>>643さんのレスは
「mallocを使ってヒープ領域に配列を確保しようとしてもローカル変数のスタック領域と同じようにオーバーフローする」
という意味かと思ったのですが、違うのでしょうか?
0651デフォルトの名無しさん
2010/01/11(月) 19:59:55ローカルのstaticはスタック上に取るのではなくグローバル上に取る。
たとえば、関数が再帰呼び出しされた場合や、マルチスレッドで再入したときに領域が重なってトラブルの元になる。
今回のようにメモリ不足からという理由で使用するのは不適切。
ヒープも有限だからオーバーフローにはなるがスタックよりも取れる領域は広い。
0652デフォルトの名無しさん
2010/01/11(月) 20:09:17まあそれは、1組織のルールだし。
>>647の言うとおり例外を禁止してるけど、グーぐるのコーディングルールには、新規プロジェクトにおいて例外はメリットがあると書いている。
しかし、既存コードが例外に対応していないから禁止していると書いてるね。
そういう事情で使ってないんで例外を否定しているわけじゃないね。
0653530
2010/01/11(月) 20:11:15ちょっと調べてみましたが、確かにヒープ領域のほうが基本的に確保できる領域が大きいようですね。
今のところ再帰やマルチスレッドを実装する予定はないのですが、
今後それらを実装する場合や、データがもっと大きくなりそうな場合に検討してみます。
丁寧にありがとうございました。
0654デフォルトの名無しさん
2010/01/11(月) 20:33:19メリットとデメリットの天秤を考えて選べばいい
0655デフォルトの名無しさん
2010/01/11(月) 21:15:17template<class T>
operator()(T arg) {};
};
上のような関数オブジェクトにテンプレート引数を渡す場合、どう書けば言いのでしょうか?
Functor<t>()(a) でもFunctor()<t>(a)でもないみたいだし。
0656デフォルトの名無しさん
2010/01/11(月) 21:19:38なんのためのファンクタとoperator()なのかって話ですよね…
0657デフォルトの名無しさん
2010/01/11(月) 21:20:03Functor func;
func.operator()<int>(num);
でも普通は↓
func(num);
0658デフォルトの名無しさん
2010/01/11(月) 21:23:18すみません。例の書き方が悪かったですね。
>>657
なるほど、そう書くんでしたか。ありがとうございます
0659デフォルトの名無しさん
2010/01/11(月) 23:34:190660デフォルトの名無しさん
2010/01/11(月) 23:35:460661デフォルトの名無しさん
2010/01/11(月) 23:44:27存在しない。
0662デフォルトの名無しさん
2010/01/11(月) 23:45:340663デフォルトの名無しさん
2010/01/11(月) 23:46:58VCなら_set_new_handler()でできそう。
ちょっとぐぐったら、NULLを返すVC6で例外を投げるって例しか
なかったけど、newでNULLを返すには、NULLをreturnするハンドラを設定すればいいのかな?
0664デフォルトの名無しさん
2010/01/11(月) 23:47:23ゴミアドレスが返るんだっけ?
0665デフォルトの名無しさん
2010/01/11(月) 23:48:170666デフォルトの名無しさん
2010/01/11(月) 23:49:170667デフォルトの名無しさん
2010/01/11(月) 23:51:59std::nothrow つけるか、自分で throw () 付きの operator new 作って使う。
そして同時に、コンストラクタからは例外が発生しないことを保証する。
0668デフォルトの名無しさん
2010/01/12(火) 00:05:58std::nothrow つけるってどうすれば良いの??
0669デフォルトの名無しさん
2010/01/12(火) 00:13:50>>662
0670デフォルトの名無しさん
2010/01/12(火) 00:16:38thx
0671デフォルトの名無しさん
2010/01/12(火) 00:32:03ttp://d.hatena.ne.jp/masugata_k/20071120
ここの
例外を投げない operator new 関数
ってやつか。
0672デフォルトの名無しさん
2010/01/12(火) 09:48:36vector<vector<T>>で実装すると中間要素に空白を持つことが出来ないので
(配列の最大列数*指定行)+指定列をキーとするmapを用いて実装しようと思います
このとき、行と列のそれぞれ最大要素数を求めるには力業で検索していくほか無いのでしょうか?
0673デフォルトの名無しさん
2010/01/12(火) 10:14:16> vector<vector<T>>で実装すると中間要素に空白を持つことが出来ないので
ここ、意味が分からん。
中間要素って何?空白って何?
0674デフォルトの名無しさん
2010/01/12(火) 10:27:35vector<int> array(10)
という配列があったとき
途中の要素に0ではなく要素無し(空白)というのを実装したいと言うことです
0675デフォルトの名無しさん
2010/01/12(火) 10:31:26なら vector<map<int, T> > とか map<int, map<int, T> > とかでいいだろ。
最大要素数とか要らん。
0676デフォルトの名無しさん
2010/01/12(火) 11:29:14C言語でジャンケンの後出しプログラムを作成したいのですが、
どのような風にすれば作れるのでしょうか?
相手のプログラムは状態遷移を使ってくる強敵です。
よろしくお願いします。
ジャンケン回数は10000回です。
0677デフォルトの名無しさん
2010/01/12(火) 11:34:33一番勝率良い奴を出すという戦略で十分じゃね?
0678デフォルトの名無しさん
2010/01/12(火) 11:42:250679デフォルトの名無しさん
2010/01/12(火) 11:50:52とりあえずコード書け。わかんないとこだけ聞け。
0680デフォルトの名無しさん
2010/01/12(火) 11:54:45int ko_no_te ;
int last_oya_no_te ;
float rnd ;
/* 状態遷移確率(親の手がグーであれば,グーを出す確率 1/5, チョキは,1/5, パーは,3/5) */
/* 状態遷移確率(親の手がチョキであれば,グーを出す確率 3/5, チョキは,1/5, パーは,1/5) */
/* 状態遷移確率(親の手ががパーであれば,グーを出す確率 1/5, チョキは,1/5, パーは,1/5) */
float ko_no_te_trans_table[3][3] =
{{1.0/5,1.0/5,3.0/5},
{1.0/5,1.0/5,3.0/5},
{1.0/5,3.0/5,1.0/5}} ;
if(n==0) /* スタートは,相手の手の履歴がないので乱数で状態を決定 */
/* 乱数発生 */
ko_no_te = (int)(rand()/(1.0 + RAND_MAX) * 3) % 3;
0681デフォルトの名無しさん
2010/01/12(火) 11:55:43else{
last_oya_no_te = oyanote[n-1] ;
/* 1までの乱数を発生させ */
rnd = (float)rand()/(1.0 + RAND_MAX) ;
/* 状態遷移確率と照合し */
if (ko_no_te_trans_table[last_oya_no_te][GU] > rnd)
ko_no_te = GU ;
else if((ko_no_te_trans_table[last_oya_no_te][GU]+ko_no_te_trans_table[last_oya_no_te][CHOKI]) > rnd)
ko_no_te = CHOKI ;
else
ko_no_te = PA ;
}
return(ko_no_te);
}
0682デフォルトの名無しさん
2010/01/12(火) 13:23:06まだ書いている途中ですが16行目からのforが機能しません
構造体内部の文字列へのポインタがよくわからないのですが、どう書き直したらよいのでしょうか
0683デフォルトの名無しさん
2010/01/12(火) 13:31:30int *p; じゃなくて student *p; でしょ
0684デフォルトの名無しさん
2010/01/12(火) 13:39:49どうもありがとう
0685デフォルトの名無しさん
2010/01/12(火) 15:32:18C:\Program Files\mp3\LAME\lame.exeに。コマンドラインのオプションを
lame.exe -t -q 0 -b 80 --resample 44100にしたいと思っています。そこで1行目を
#define LAME_EXE "C:\\Program Files\\mp3\\LAME\\lame.exe"
に。8行目を
strcat(cmd, " -t -q 0 -b 80 --resample 44100");
に替えてみたのですが、「音声の変換に失敗しました」とエラーが出て失敗してしまいます
C++はサッパリちゃんなので、どなたか御教示いただけませんでしょうか。宜しくお願いします
ttp://anonymousriver.hp.infoseek.co.jp/lame_wrapper/lame_wrapper.c
0686デフォルトの名無しさん
2010/01/12(火) 15:52:28puts(cmd) で出力されたものをコマンドプロンプトに貼りつけて実行してみればいいよ
0687デフォルトの名無しさん
2010/01/12(火) 16:50:21VC++ラウンジ
http://rararahp.cool.ne.jp/
今朝方、時刻は未明より403エラーでアクセスできません
みなさまも同じでしょうか?
0688デフォルトの名無しさん
2010/01/12(火) 16:58:20同じ。つか、403はアクセス許可をしてないッてことだから
相手側が何か設定ミスったか、不都合があって接続をさせないようにしている。
0689デフォルトの名無しさん
2010/01/12(火) 17:01:30ありがとう、belution.com 閉鎖の件があり、少々不安に感じていました。
0690デフォルトの名無しさん
2010/01/12(火) 17:09:24return system(cmd);をputs(cmd);に入れ替えましたが
うまくいきません。そういうことではないのかな?
本当に無知ですいません
0691デフォルトの名無しさん
2010/01/12(火) 17:19:34そこで動かなきゃsystemで呼んだって同じだろう?
0692685
2010/01/12(火) 17:19:55結果が分からないということです
0693デフォルトの名無しさん
2010/01/12(火) 17:21:36最初からコマンドプロンプトで実行するか、(VC++なら)Ctrl+F5で実行してみては?
0694685
2010/01/12(火) 17:24:20単にコマンドプロンプトから
lame.exe -t -q 0 -b 80 --resample 44100 入力ファイル名 出力ファイル名
とした場合は正常に動きます。cmdの中身については
私には確認する術が分かりません
0695デフォルトの名無しさん
2010/01/12(火) 17:25:480696デフォルトの名無しさん
2010/01/12(火) 17:27:56デバッグのほとんどは、そのcmd等の変数の中身を確認することだぞ
0697デフォルトの名無しさん
2010/01/12(火) 17:31:35途中にブランクが含まれるパスには要注意。
system関数は単純に最初のブランクまでをコマンドとみなす。
サンプルのにはブランクが入ってないだろ。
0698デフォルトの名無しさん
2010/01/12(火) 18:05:34ご指摘いただいた件で検索したところ、下記のページがヒットしました
#define LAME_EXE "C:\\"Program Files"\\mp3\\LAME\\lame.exe"とか
#define LAME_EXE "\"C:\\Program Files\\mp3\\LAME\\lame.exe\""
などを試して、駄目ならスペースが不要な所にlame.exeを置いてみます
それでは時間がかかりますが、検証してみます。皆様ありがとうございます
ttp://okwave.jp/qa/q1965931.html
0699デフォルトの名無しさん
2010/01/12(火) 18:06:450700デフォルトの名無しさん
2010/01/12(火) 18:11:17普通にコマンドプロンプトからの実行方法がわからないor知らないでは?
VCから入って、まともなコンパイル(Makefile含む)を知らないとね。
ついでに、685にアドバイス。
コンソール画面が一瞬で閉じない方法として、
「デバックなしで実行」を使うと、コンソールが閉じずに終了するぞ!!
0701デフォルトの名無しさん
2010/01/12(火) 18:27:29テキストデータを配列に収めるために以下のようなプログラムを作成しましたが
コンパイルで←で示した部分にエラー判定が出てしまいます
打開策をご教授していただけるととても助かります。
while(getline(fin,c_name[i],',')){
getline(fin,a_name[i],',');
getline(fin,c_num[i][0],',');←
getline(fin,c_num[i][1]);←
(*total_num)+=(c_num[i][0]-c_num[i][1]);
for(int j=0;j<c_num[i][1];j++){
getline(fin,n_num[i][j]);←
i++;
}
}
c_name[]とa_name[]はstring型でc_num[][]とn_num[]はint型です。
他に必要な情報があれば書きます。
テキストデータは下記のような感じのものが入っています。
name1,name2,123,4
1
2
3
4
0702デフォルトの名無しさん
2010/01/12(火) 18:35:540703デフォルトの名無しさん
2010/01/12(火) 18:36:35C++標準だよ
0704デフォルトの名無しさん
2010/01/12(火) 18:40:07細かくどういったものなのかはわかりません…ごめんなさい…
0705702
2010/01/12(火) 18:41:08最近俺ボケてるようだ
getlineの定義は
basic_istream<charT,traits>& getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str, charT delim);
わかりやすく書くと
istream& getline(istream&, string&, char);
なので、第2引数は string でなければなりません
0706デフォルトの名無しさん
2010/01/12(火) 18:45:05つまり、int型の配列をgetlineに突っ込んだのが原因ということですね!
ありがとうございました!
int型にはちがう方法でファイルを読み込むように試してみます
0707デフォルトの名無しさん
2010/01/13(水) 00:11:480708デフォルトの名無しさん
2010/01/13(水) 00:25:11vectorは一本でかい配列を取る。だから、&v[0]のようなアクセスができる。
dequeは一本とるかもしれないしとらないかもしれない。上記のようなアクセスは出来ないけど、メモリ効率は多少マシかも。
0709デフォルトの名無しさん
2010/01/13(水) 01:40:46デタラメ言うんじゃねぇ。
deque でも &v[0] はできるし、メモリ効率はどちらも O(N) で deque のほうが係数が大きくなる。
> 672 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/08(火) 14:47:34
> コンテナの使い分けってどうすればいいんですか?
>
> ランダムアクセスが不要な場合は list を使えばいいとして
> vector と deque の使いわけがよく分かりません
http://pc12.2ch.net/test/read.cgi/tech/1231640024/672-
0710デフォルトの名無しさん
2010/01/13(水) 06:25:160711デフォルトの名無しさん
2010/01/13(水) 06:51:26厳密に言うなら&v[0]は使えるが、0番目の要素にしか使えないので意味が無い。
もっと厳密に言えば、ブロックサイズまでは&v[0]で得たアドレスを使えるが、不幸
で分かりにくいバグの元。
>>708が言いたいのは、vectorなら&v[0]で得たポインタをある程度は配列のように
使える(再配置が起きるような操作をしない限り)、ということだろうから、その意
を汲むなら>>709がダウト。とは言っても、&v[0]も不幸なバグの元だが、再配置を
理解した上で、決してうっかりしないような使い方を徹底するなら大丈夫。
で、>>707の質問に戻ると、dequeはバッファを複数ブロックに分けて、マッピング
情報を内部に保持して一つのバッファのように使うのが一般的な実装。
なので、
・push_backも「push_frontも」基本的には軽い
・内部バッファのサイズ変動にそこそこ強い
・vectorのように内部バッファのポインタを得てそのまま使うのは無理
というのが基本的な特徴。
一方vectorは、
・push_backは内部バッファが溢れない限りは一番軽い
・内部バッファのサイズ変動に弱い
・内部バッファのポインタを取り出して使える(危険性をきっちり理解した上で)
といったところ。
つーか、どういう実装になってるかを知ってた方が、コンテナの特性を掴むには早い。
listとかもそうだけど。
0712デフォルトの名無しさん
2010/01/13(水) 07:04:290713デフォルトの名無しさん
2010/01/13(水) 07:09:05固定サイズでいいならboost::arrayもいい
0714デフォルトの名無しさん
2010/01/13(水) 18:30:50PostMessage(hWnd , WM_APP+10 , ローカル変数 , ローカル変数)
したときウィンドウ(hWnd)が「ローカル変数なんかとっくに壊れてるだろ、だらず!」
とか怒るんですが
対策はローカル変数じゃなくてグローバルで何とかするしかないのでしょうか
0715デフォルトの名無しさん
2010/01/13(水) 18:51:23newするなりmallocするなり、staticにするなり、好きなのをどうぞ。
0716デフォルトの名無しさん
2010/01/13(水) 18:53:17ローカル変数のアドレスを流し込むつもりだと何であれ無理なんだが、
場当たり的な解決法だと、先にLPARAM型とWPARAM型を宣言して変換して流し込む。かな??
その他だとSTATIC変数にすると一応できるかも。
0717716
2010/01/13(水) 18:54:140718714
2010/01/13(水) 19:05:03実体をhWndに持たせればなんとかなる・・・か?
もう少し試してみます。多謝。
0719デフォルトの名無しさん
2010/01/13(水) 20:03:03インスタンスのポインタを渡すのも楽だな
0720デフォルトの名無しさん
2010/01/14(木) 05:39:11http://www.sic.shibaura-it.ac.jp/~sasano/lecture/enshu/2009/score.txt
上のプログラムを動かすと29行目でちゃんと値をコピーできてないようです
又偏差値も1078296576見たいな数字になってしまいます。
何が間違っているんでしょう
0721デフォルトの名無しさん
2010/01/14(木) 06:44:18すみません自己解決しました
0722デフォルトの名無しさん
2010/01/14(木) 07:07:32そうすれば間違いも見つけやすくなる
0723デフォルトの名無しさん
2010/01/14(木) 21:40:11配列の要素数が多くなってきたりTのサイズが大きいものだったりすることを考えると
vector<T>のポインタを保持させてvector< *(vector<T>) >とした方が再配置が起こるようなとき有利になるのでしょうか?
0724デフォルトの名無しさん
2010/01/14(木) 21:55:32ふつうのOSで再配置は起きない。
そのように変更しても、そのクラスのサイズはふつう変わらない。
0725デフォルトの名無しさん
2010/01/14(木) 22:07:42それやばいぞ
サイズをswap技法などで縮小した時にvectorのデストラクタが呼ばれない
boost::ptr_vectorに入れとけ
0726デフォルトの名無しさん
2010/01/14(木) 22:15:200727デフォルトの名無しさん
2010/01/15(金) 02:04:43しかし、再配置がネックになると予想できる状況なら
vector以外のコンテナを検討した方がいいんじゃね。
0728デフォルトの名無しさん
2010/01/15(金) 05:10:24問題にはならないと思うけどな
ゲームですら大抵は問題にならないかと
0729デフォルトの名無しさん
2010/01/15(金) 07:36:130730デフォルトの名無しさん
2010/01/15(金) 08:37:150731デフォルトの名無しさん
2010/01/15(金) 11:35:20http://www.microsoft.com/japan/visualstudio/products/2010/default.mspx
0732デフォルトの名無しさん
2010/01/15(金) 19:08:090733デフォルトの名無しさん
2010/01/15(金) 19:11:39とりあえず総合環境っぽいvs2010つかってみますわ
0734デフォルトの名無しさん
2010/01/15(金) 21:49:400735デフォルトの名無しさん
2010/01/15(金) 22:57:33を継承して
template <class T>class FooImple : public Foo<T>{/*〜*/};
としてこのテンプレート引数Tをclass Hogeでのみ使用して
他では実体化できないようにするということは可能でしょうか?
0736デフォルトの名無しさん
2010/01/15(金) 23:05:27ではいけないんかね?
0737デフォルトの名無しさん
2010/01/15(金) 23:06:29{
private:
template <class T> class Foo ・・・
};
0738デフォルトの名無しさん
2010/01/15(金) 23:07:09何難しく考えてたんだろうorz
ありがとうございました
0739デフォルトの名無しさん
2010/01/16(土) 00:11:27クラスの中でコンストラクタでchar配列をnewしたら指定した以上の要素を
確保してしまうんです.助けてください
↓ソースをです.
ttp://www.csync.net/service/file/view.cgi?id=1263568115
0740デフォルトの名無しさん
2010/01/16(土) 00:28:14っていうかね、" \n"がchar配列何個分かわかる?
2と思うかもしれないが、文字列として展開されると長さ4の要素数が必要。'[空白]\r\n\0'
つまり、コンストラクタにおいて、確保したバッファは溢れている。
0741デフォルトの名無しさん
2010/01/16(土) 00:29:520742デフォルトの名無しさん
2010/01/16(土) 00:43:19memcpy(a, b, strlen(b)); みたいなパターンってたまに見るけど
誰かが広めてるのかね。
まったく意味がないよな。
0743デフォルトの名無しさん
2010/01/16(土) 00:48:23変更後,なんとか思った通りの動作を致しました.
お叱りありがとうございました.
ttp://www.csync.net/service/file/view.cgi?id=1263570379
0744デフォルトの名無しさん
2010/01/16(土) 00:48:470745デフォルトの名無しさん
2010/01/16(土) 00:49:54え!?おれもやってるんだけど
どうすりゃいいんだ?
イコール代入でもすんのか?
0746デフォルトの名無しさん
2010/01/16(土) 00:51:30一部にstr系よりセキュアになるって説があるけど、
俺が働いてるような底辺なところだと、使い方間違って、
よけい危なくなってる。
0747デフォルトの名無しさん
2010/01/16(土) 00:53:42長さをstrlen()でとってると、strcpy()使うのとぜんぜん変わらないだろ。
>>742は+1するの忘れてた。
0748デフォルトの名無しさん
2010/01/16(土) 00:54:57ぜんぜん変わらないということはない
ゼロ終端するかしないかが違う
メインフレームか何かのスペース埋めされた固定長バッファに
文字列を貼り付けてるコードなんじゃないの
見てないけどw
0749デフォルトの名無しさん
2010/01/16(土) 00:58:36長さをコピー元からstrlen()+1でとってたらまったく同じ。
0750デフォルトの名無しさん
2010/01/16(土) 00:59:59>>742だけ見てレスしてたよ
0751デフォルトの名無しさん
2010/01/16(土) 01:01:23menverとか書いてんじゃねーよ
0752デフォルトの名無しさん
2010/01/16(土) 01:07:53完全うろ覚えで書いてました.すみません
0753デフォルトの名無しさん
2010/01/16(土) 13:10:35'\n' が "\r\n" に展開されるのはiostreamレベルだから
" \n" をコピーするにはヌル文字も含めて3バイトあれば充分。
0754デフォルトの名無しさん
2010/01/16(土) 13:43:280755デフォルトの名無しさん
2010/01/16(土) 18:13:36FILE *fp = stdout;
fputs("Pikachu", fp);
C++ の std::istream とか std::ostream とかのインスタンスではできないの?
0756デフォルトの名無しさん
2010/01/16(土) 18:14:390757デフォルトの名無しさん
2010/01/16(土) 18:16:13thx
0758デフォルトの名無しさん
2010/01/16(土) 19:25:47それからシリアライズの時の例外処理ってMFCで定義している例外マクロを使ってるんですが
C++の例外処理に変えるってできないでしょうか?
TRY
{
Serialize(ar);
}
CATCH_ALL(e)
{
AfxMessageBox( "save error!");
}
END_CATCH_ALL;
0759デフォルトの名無しさん
2010/01/16(土) 20:46:01void Deleter(const Hoge *p){ delete p; }
これってどっちでもおkですか?
個人的にはオブジェクトの内容を破壊するのでconstじゃない方がいいのかなと思うんですが
コンパイラ的にはどっちでもいいようなので・・・
0760デフォルトの名無しさん
2010/01/16(土) 20:50:25細い物体を、画素をずらして除去するという以下のようなプログラムを作成しましたが
画面全体がずれてしまいます。
imgNの配列に入っている画素の部分だけずらすにどのように書けば良いのでしょうか?
打開策をご教授していただけるととても助かります。
C言語(ライブラリとしてOpenCVを使用しています)
↓
0761デフォルトの名無しさん
2010/01/16(土) 20:51:47for(y=0; y < img->height; y++){
for(x=0; x < img->width; x++){
tmpp[0] = imgN->imageData[img->widthStep * y + x*3]; // B
tmpp[1] = imgN->imageData[img->widthStep * y + x*3 + 1]; // G
tmpp[2] = imgN->imageData[img->widthStep * y + x*3 + 2]; // R
tmppp[0] = imgS->imageData[img->widthStep * y + x*3]; // B
tmppp[1] = imgS->imageData[img->widthStep * y + x*3 + 1]; // G
tmppp[2] = imgS->imageData[img->widthStep * y + x*3 + 2]; // R
0762デフォルトの名無しさん
2010/01/16(土) 20:52:39へー、constでもdeleteできるんだ。
デストラクタって、const付じゃなくても呼び出しOKなんだな。
0763デフォルトの名無しさん
2010/01/16(土) 20:52:43if (tmpp[2]==255 && tmpp[1]==255 && tmpp[0]==255) {
if (tmppp[2]==0 && tmppp[1]==0 && tmppp[0]==0) {
img2->imageData[img->widthStep * (y) + (x)*3] =
img->imageData[img->widthStep * (y) + (x-30)*3];
img2->imageData[img->widthStep * (y) + (x)*3 + 1] =
img->imageData[img->widthStep * (y) + (x-30)*3 + 1];
img2->imageData[img->widthStep * (y) + (x)*3 + 2] =
img->imageData[img->widthStep * (y) + (x-30)*3 + 2];
}
else {
img2->imageData[img->widthStep * (y) + (x)*3] =
img->imageData[img->widthStep * (y) + (x+30)*3];
img2->imageData[img->widthStep * (y) + (x)*3 + 1] =
img->imageData[img->widthStep * (y) + (x+30)*3 + 1];
img2->imageData[img->widthStep * (y) + (x)*3 + 2] =
img->imageData[img->widthStep * (y) + (x+30)*3 + 2];
}
}
0764デフォルトの名無しさん
2010/01/16(土) 20:55:01img2->imageData[img->widthStep * (y) + (x)*3] = img-
>imageData[img->widthStep * (y) + (x)*3];
img2->imageData[img->widthStep * (y) + (x)*3 + 1] = img-
>imageData[img->widthStep * (y) + (x)*3 + 1];
img2->imageData[img->widthStep * (y) + (x)*3 + 2] = img-
>imageData[img->widthStep * (y) + (x)*3 + 2];
}
}
}
0765デフォルトの名無しさん
2010/01/16(土) 21:14:42void myscanf(const char *fmt, ...){
int j, argc = 0;
while (*fmt){
if (*fmt == '%'){
fmt++;
argc++;
switch (*fmt){
case 'd':
j = *((int *)((char *)&fmt + argc * sizeof(void *)));
read_int(j);
break;
}
} else {
...
}
fmt++;
}
}
myscanf("%d", &n); で数値を入力
これを出力するとおかしな数値が出るんだがどこが問題?
0766デフォルトの名無しさん
2010/01/16(土) 21:19:48だらだらしたコードを貼る、お前の神経が問題だ、もうこなくていいよ
0767デフォルトの名無しさん
2010/01/16(土) 21:24:55どうすりゃいいの。
0768デフォルトの名無しさん
2010/01/16(土) 21:25:370769デフォルトの名無しさん
2010/01/16(土) 21:26:30まともな返事が来なくてもへこたれない
0770デフォルトの名無しさん
2010/01/16(土) 21:29:08argcをインクリメントするタイミングがおかしいな
0771デフォルトの名無しさん
2010/01/16(土) 21:52:18プログラミングやめればいいんじゃない?
・・・とまでは言わないけど、
小学生の作文じゃないんだから、長ければいいとおもうのは間違い。
エッセンスを抽出したまえ
0772デフォルトの名無しさん
2010/01/16(土) 21:56:56コード貼らないと問題が見えないが、長文のコードは読みづらい。
アップローダがあれば色々解決。後は解るな?
0773デフォルトの名無しさん
2010/01/16(土) 21:59:08/********************************************/
codepad
ttp://codepad.org/
長いソースを貼るときはここへ!
/********************************************/
これをテンプレに加えようぜ
0774デフォルトの名無しさん
2010/01/16(土) 22:02:380775デフォルトの名無しさん
2010/01/16(土) 22:03:41上に貼ってるのはそこまで長くないだろ。
0776デフォルトの名無しさん
2010/01/16(土) 22:05:25間違えた。
で置換だ。
0777デフォルトの名無しさん
2010/01/16(土) 22:43:55va_listの動きを知るため
0778デフォルトの名無しさん
2010/01/16(土) 22:49:31詳しいことはファイルに書いてあります。
http://www.dotup.org/uploda/www.dotup.org567007.zip.html
環境
OS:Windows
コンパイラ名とバージョン:VisualC++2008
言語:C言語(ライブラリとしてARToolkit、OpenCVを使用しています)
アップローダーのパスワードは8756です。
自力で出来る限りのところまでやってみたのですが限界を感じました。
ご指摘お願い致します。
0779デフォルトの名無しさん
2010/01/16(土) 23:30:170780デフォルトの名無しさん
2010/01/16(土) 23:35:12いやエッセンスを抽出できる能力がないやつは…(ryってことだ
0781デフォルトの名無しさん
2010/01/17(日) 11:02:51あなたが要求したファイルは存在しません。
あなたが要求したファイルは削除されました。
0782デフォルトの名無しさん
2010/01/17(日) 11:49:440784デフォルトの名無しさん
2010/01/17(日) 15:18:52標準ライブラリを使うのが邪道なわけがない。
MFCの例外について詳しくは知らないけど、普通の C++ 例外との兼ね合いとか
MSDN に載ってるんじゃないかね?
0785デフォルトの名無しさん
2010/01/17(日) 15:46:00http://msdn.microsoft.com/ja-jp/library/19z28s5c(VS.80).aspx
ググったら、置き換えの記事があった。
CATCH_ALLは載ってないけど、マクロの中身見るか、さらにググれば
どっかあるんじゃないの?
0787デフォルトの名無しさん
2010/01/17(日) 18:56:04構造体のテストとして下のようなプログラムを作ったのですが、
セグメンテーション違反が出て動作しません。
Initの中身をそのままmainに入れると動くのですが原因は何でしょうか
0788デフォルトの名無しさん
2010/01/17(日) 18:57:32#include <stdlib.h>
#define N 4
typedef struct {
int *data;
int len;
} Number;
void Init(Number);
int main(void)
{
Number a;
int i;
Init(a);
a.data[0] = 0;
a.data[1] = 1;
for(i = 0;i<N;i++) printf("%d",a.data[i]);
printf("\n");
return 0;
}
void Init(Number a)
{
a.len = N;
a.data = (int*) malloc( N * sizeof(int));
int i;
for(i=0;i<N;i++) a.data[i] = 0;
}
0789デフォルトの名無しさん
2010/01/17(日) 18:59:44値渡しだから
0790デフォルトの名無しさん
2010/01/17(日) 19:00:11値渡しだからだ
Init(a);
してもaは全く変化しない
Init(&a);
で宣言は
void Init(Number *);
みたいにしないとだめだな
当然なかみもそれに合わせて少し変える
0791デフォルトの名無しさん
2010/01/17(日) 19:00:46○void Init(Number*);
こうじゃないのか?あと、0初期化するならcalloc使えば?
0792デフォルトの名無しさん
2010/01/17(日) 19:30:51言われたとおりポインタを渡してInit内で参照させれば同じ動作しました。
callocも勉強になりました。
0793デフォルトの名無しさん
2010/01/17(日) 20:11:350794デフォルトの名無しさん
2010/01/17(日) 20:18:52Init(a) を見ても、中身が変化してると気づかないからその書き方は嫌い
0795デフォルトの名無しさん
2010/01/17(日) 20:21:02Init関数内の変数iの宣言位置が問題になるけどね
0796デフォルトの名無しさん
2010/01/17(日) 20:31:21見た目で中身が変化してるとわかるっていうけどInit(const Number*)だったら中身変わらないじゃん
結局のところ本当に見た目で中身が変わったかどうかは判断できないんだから、そんな区別の仕方は無意味だよ
0797デフォルトの名無しさん
2010/01/17(日) 20:51:29pNumber pNmalloc(size_t);
void pNfree(void);
0798デフォルトの名無しさん
2010/01/18(月) 00:01:53#include <math.h>
rotate(double a[2][3], double b[3][3], double c[2][3]);
int main()
{
int i, j;
double A[2][3] = { {3, 1, 4},{2, 7, 1}, };
double B[3][3] = { {cos(30), sin(30), 0},{-sin(30), cos(30), 0},{0, 0, 1}, };
double C[2][3];
rotate(A,B,C);
for (i=0; i<2; i++){
for (j=0; j<3; j++){
printf("%7.4f ",C[i][j]);
}
printf("\n");
}
}
rotate(double a[2][3], double b[3][3], double c[2][3])
{
int i, j, k;
for (i = 0; i<2; i++) {
for (j = 0; j<3; j++) {
for (k = 0; k<3; k++) {
c[i][j] += a[i][k] * b[k][j];
} }}
return 0;
}
0799デフォルトの名無しさん
2010/01/18(月) 00:03:38おかしい値が出てきてしまいます。
どこ原因なのでしょう?
0800デフォルトの名無しさん
2010/01/18(月) 00:10:36おーい
double B[3][3] = { {cos(30), sin(30), 0},{-sin(30), cos(30), 0},{0, 0, 1}, };
初期化式の中に関数書いたらだめじゃん
0801デフォルトの名無しさん
2010/01/18(月) 00:12:570802デフォルトの名無しさん
2010/01/18(月) 00:14:07これでいいはず
0803デフォルトの名無しさん
2010/01/18(月) 00:20:11double C[2][3] = { {0}, {0}, };
としたらうまくいきました。
0804デフォルトの名無しさん
2010/01/18(月) 02:00:160805デフォルトの名無しさん
2010/01/18(月) 02:30:52Cだとだめと叱られた
0806デフォルトの名無しさん
2010/01/18(月) 04:15:43「ゲームプログラマになる前に覚えておきたい技術」 P314より
補間関数
void Vector2::setInterpolatoin(
Vector2& a,
Vector2& ab,
Vector2& ac,
double u,
double v){
*this = a; // a
Vector2 tmp;
tmp = ab;
tmp *= u; // u(b-a)
*this += tmp; // a + u(b-a)
tmp = ac;
tmp *= v; // v(c-a)
*this += tmp; // a + u(b-a) + v(c-a)
}
0807デフォルトの名無しさん
2010/01/18(月) 05:12:120808デフォルトの名無しさん
2010/01/18(月) 05:15:42自分への代入。
Vector2 obj;
obj.setInterpolatoin(〜略〜);
と呼び出したときの*thisは、objになる。
0809デフォルトの名無しさん
2010/01/18(月) 05:44:460810デフォルトの名無しさん
2010/01/18(月) 07:38:17勿論自分に代入したって自分のアドレスとかが変わるわけではない
0811デフォルトの名無しさん
2010/01/18(月) 10:30:16継承元のクラスのポインタに、継承クラスのインスタンスを持たせることが出来ますが、
メモリの確保とかはどうなっているのでしょうか? サイズが大分違うのに。
newした時に確保されるからそんなの関係ねえのでしょうか?
0812デフォルトの名無しさん
2010/01/18(月) 10:44:35> 継承元のクラスのポインタに、継承クラスのインスタンスを持たせる
この「ポインタにインスタンスを持たせる」という書き方に、
ポインタ周りをまだ理解しきれていないことが表れている気がします。
正確には「ポインタにインスタンスのアドレス値(居場所)を持たせる」んです。
ここを完全にイメージできれば、その疑問は浮かびようがないはずです。
0813デフォルトの名無しさん
2010/01/18(月) 11:20:33気になるならソースが公開されてる malloc/free の実装でも見るといい。
>>812
「ポインタにインスタンスを持たせる」で合ってるだろ。
強いて言うなら「ポインタ変数にインスタンスへのポインタを持たせる」ぐらいだ。
ここで「アドレス」を持ち出すほうがおかしいわ。
0814デフォルトの名無しさん
2010/01/18(月) 11:26:03わかってる人がそう言うなら、まったく問題ないよ。
でもこの質問者はそうじゃないという話。
0815デフォルトの名無しさん
2010/01/18(月) 11:26:540816デフォルトの名無しさん
2010/01/18(月) 11:28:30はぁ?
> 正確には「ポインタにインスタンスのアドレス値(居場所)を持たせる」んです。
こんなこと言っちゃう自分はわかってるつもりなの?
0817デフォルトの名無しさん
2010/01/18(月) 11:30:20なんか謎のベクトルで噛み付いてくるあなたが恐いです。
2万回くらい深呼吸してから、また話しかけて下さい。
0818デフォルトの名無しさん
2010/01/18(月) 13:35:23おまえがおかしいわ。
0819デフォルトの名無しさん
2010/01/18(月) 13:43:320820デフォルトの名無しさん
2010/01/18(月) 13:48:51これの何がおかしいんだろう
C/C++のポインタなら、アドレスを持ち出すのは完全に正しいと思うが
0821デフォルトの名無しさん
2010/01/18(月) 15:21:140822>>821
2010/01/18(月) 18:18:000823デフォルトの名無しさん
2010/01/18(月) 18:37:50しかし、system関数を使ってexeを実行すると、コマンドプロンプトが出て鬱陶しいです。
何もウインドウが出ないようにするにはどうすればいいのでしょうか?環境はwindows7です。
0824デフォルトの名無しさん
2010/01/18(月) 18:53:00実行する側で決めるんじゃないの
0825デフォルトの名無しさん
2010/01/18(月) 18:59:14プログラムを実行する側の環境次第っていう事ですか?
0826デフォルトの名無しさん
2010/01/18(月) 19:01:35無名空間を明示的に指定する場合と省略する場合でのちがいについての質問です。
class A
{
public:
A();
};
class B
{
void function()
{
※
}
};
0827デフォルトの名無しさん
2010/01/18(月) 19:02:360828826
2010/01/18(月) 19:04:04なんで(3-1)はコンパイルがとおり、(3-2)はだめなのでしょうか?
((4-1)(4-2)も同様に)
(1-1) A a = A(); //OK
(1-2) A* a = new A(); //OK
(2-1) A a = ::A(); //OK
(2-2) A* a = new ::A(); //OK
(3-1) A a = A::A(); //OK
(3-2) A* a = new A::A(); //error C2061: 構文エラー : 識別子 '{ctor}'
(4-1) A a = ::A::A();//OK
(4-2) A* a = new ::A::A();//error C2061: 構文エラー : 識別子 '{ctor}'
0829826
2010/01/18(月) 19:05:03no name space
|
|
A
A()
|
|
B
B() ---- function()
|
|
ただし、コンストラクタのみ特別ルールのようなものがあり、
コンストラクタを定義するときのように、
クラス名::クラス名(...)
と、スコープ演算子::を使ってもそのカレントの下の階層を見るのではなく、
これでコンストラクタを示す、と理解していたのですが全然ちがうでしょうか?
0830デフォルトの名無しさん
2010/01/18(月) 19:10:00systemは標準じゃないよ
0831デフォルトの名無しさん
2010/01/18(月) 19:25:10やってみましたが、コマンドプロンプトが出ました。
editbinをググってみたら、「COFF形式のバイナリ ファイルの内容を変更するツール」と出てきたんですが、
editbin /SUBSYSTEM:WINDOWS hoge.exeはどういう処理になるんでしょうか?
>>830
http://www.bohyoh.com/CandCPP/C/Library/system.html
ここに載っていたので標準なのかと思いました。
0832デフォルトの名無しさん
2010/01/18(月) 20:25:11systemの存在自体は標準関数。
ただ、引数に何を与えるとどうなるかということが実装依存であるというだけのこと。
あと、827のやり方は、hoge.exeをコマンドプロンプトを使わないプログラムにする。
systemで起動する先のプログラムも自分が作っているのでもないと意味ない。
相手のプログラムをいじれないなら、Windows APIのCreateProcessでCREATE_NO_WINDOWを指定するなど。
0833デフォルトの名無しさん
2010/01/18(月) 21:12:14ビットマップ画像ファイルをhTreeWndのアイコンに設定するためには
・・・・・・・・・orz
環境。C言語でWINAPIいじくる
BMP画像を開いて、バッファに流し込んでー
ビットマップオブジェクト作るときのDCは・・・
こんがらがってきた。CreateCompatipleDCなのかCreateCompatipleBitmapなのかさっぱりだ
0834デフォルトの名無しさん
2010/01/18(月) 21:27:19以下に書いてあった。開放の云々はシラネ。
ttp://wisdom.sakura.ne.jp/system/winapi/common/common16.html
0835デフォルトの名無しさん
2010/01/18(月) 22:00:51・・・これに書いてあったとかどんだけ調査不足。
ビットマップオブジェクト頑張って作ってきます、ありがとう
0836デフォルトの名無しさん
2010/01/18(月) 22:31:24new 演算子のところに書くのはコンストラクタじゃなくて型だから。
0837デフォルトの名無しさん
2010/01/18(月) 23:00:14なるほど。
CreateProcessを調べてたらShellExecuteというのが出てきて、こっちの方が簡単そうだったので、これを使ったらできました。
ありがとうございました。
0838836
2010/01/18(月) 23:05:23gcc version 4.3.4 20090804 (release) 1 (GCC)
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
だと全部通っちゃう。
Comeau C++ (http://www.comeaucomputing.com/tryitout/ で試せる)だと、(3-1),(3-2),(4-1),(4-2) がエラー。
そして現行規格上はこの挙動が正しいと思われる。
> 14882:2003 3.4.3.1p1a
> If the nested-name-specifier nominates a class C, and the name specified after the nested-name-specifier,
> when looked up in C, is the injected-class-name of C (clause 9), the name is instead considered to name the
> constructor of class C. Such a constructor name shall be used only in the declarator-id of a constructor definition
> that appears outside of the class definition. [Example:
> struct A { A(); };
> struct B: public A { B(); };
> A::A() { }
> B::B() { }
> B::A ba; // object of type A
> A::A a; // error, A::A is not a type name
.> end example]
A::A の形は型名ではなくコンストラクタ名として扱われるが、そのようなコンストラクタ名はクラス定義外での
コンストラクタ定義でのみ用いられる、となっている。
ただしこれ 2003 年版で記述が変更されているところだったりする。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#147
0839デフォルトの名無しさん
2010/01/19(火) 02:22:47俺が見ているのはJIS X 3014:2006なんだけど、5.1 一次式のところで、こんな記述がある。
> 《クラス名》 :: 《クラス名》という形式を用い,その二つの《クラス名》が同じクラスを参照する形式をコンストラクタ(12.1)の記法とする。
そして、12.1 コンストラクタにはこういう記述がある。
> コンストラクタは,そのクラス型のオブジェクトの初期化を行う。コンストラクタは,名前をもたないので,
> 名前検索によってコンストラクタが見つかることはない。しかし,関数記法(5.2.3)を使った明示的型変換のときには,
> コンストラクタが呼び出されてオブジェクトを初期化する。
ちなみに5.3.3 明示的型変換(関数的記法)は,
hoge(foo, bar)のような一時オブジェクトを作成する式。1引数以外でもここに該当する。
これらから、3-1と4-1がコンパイルできるのは仕様通りとだと思う。
一方、3-2と4-2はそのような記述がないのでエラーになるのが正しいのだろう。
0840デフォルトの名無しさん
2010/01/19(火) 03:22:17ありがとうございます。
つかすごいすね、分かっちゃうんですね。
そんな資料見たこともないです。
Exampleのコードを見る限り、class-name::class-name names the constructor when both class-name refer to the same class.
はやっぱり基本中の掟なんですね。だからB::Aはコンストラクタにあらず、と。
で、A::Aはコンストラクタとして認識はされるけど、
それがコンストラクタの定義以外のとこで使われているからご法度ということでしょうか・・・。
な〜るほど・・・
0841デフォルトの名無しさん
2010/01/19(火) 03:40:35おお!なんだかすっごくつかめそうな気が!ただ今宵はこれまでに致しとうございます。
明日また正座してよんで見ます。
0842デフォルトの名無しさん
2010/01/19(火) 12:43:05各種ライブラリの入ったDLLのデフォルト置き場所みたいなのってわかるものなのでしょうか
0843デフォルトの名無しさん
2010/01/19(火) 13:57:190844デフォルトの名無しさん
2010/01/19(火) 15:09:10int id;
}
というクラスがあって
さらにclass Aを継承したclass B、class Cがあります。
それぞれ==演算子をオーバーロードしてidが同じ値であればtureとしたいのですが
A *pB = new B;
A *pC = new C;
(*pB)==(*pC)とした場合、BとCは比較出来てしまうのでしょうか?
0845デフォルトの名無しさん
2010/01/19(火) 15:22:34ちょっと他の手立て探してみます。イメージリスト使えないって致命的じゃないだろうか
0846デフォルトの名無しさん
2010/01/19(火) 15:28:43system32にあるよ
0847デフォルトの名無しさん
2010/01/19(火) 15:31:31↑目から出た鱗
耄碌してた・・・orz
本当にありがとうございますッ!
0848デフォルトの名無しさん
2010/01/19(火) 15:36:19普通の関数と同じだよ
(*pB) == (*pC);というのは(*pB).operator == (*pC);と同じ
operator == (const A &)がvirtualじゃなければA::operator == (const A &)が呼ばれるし、
viartualならB::operator == (const A &)が呼ばれる(ただしB::operator == (const A &)が定義されてれば)
メンバが定義されてなくてグローバルにoperator == (const A &, const A &)が定義されてるなら::operator == (lhs, rhs);が呼ばれる
一回operator == をis_eqに置換してみれば理解しやすいだろう
0849デフォルトの名無しさん
2010/01/19(火) 16:04:14オーバーヘッドは仮想関数ではない関数と同じですか?
0850デフォルトの名無しさん
2010/01/19(火) 16:15:150851デフォルトの名無しさん
2010/01/20(水) 02:19:110852デフォルトの名無しさん
2010/01/20(水) 03:10:57同じにできることもあるが、違うことになるほうが圧倒的に多いはず。
気になるなら実測して確認するべし。
0853デフォルトの名無しさん
2010/01/20(水) 03:16:39関数記法(5.2.3)を使った明示的型変換=5.2.3 Explicit type conversion (functional notation)だと
simple-type-specifier になってるので A::A が型名にならないならやっぱり 3-1, 4-1 も通らないんじゃない?
>851
ShellExecute 諦めて CreateProcess して WaitForSingleObject。詳細はぐぐれ。
0855デフォルトの名無しさん
2010/01/21(木) 11:12:58にしても効果が無いようなんですが、派生クラスを全てfriendにしていくしかないのでしょうか?
template<class T>
class A {
protected:
T x;
template<class T1> friend class A;
public:
template<class SRC>
void copy(SRC& r) {
x = r.x;
};
};
template<class T>
class B : public A<T> 省略
{
A<int> a;
B<short> b;
a.copy(b); //Aの派生型だけどBにはfriendの効果がない
}
0856デフォルトの名無しさん
2010/01/21(木) 17:57:08そのコードでコンパイルエラーになる環境とエラーメッセージをコピペしてくれ。
0857デフォルトの名無しさん
2010/01/21(木) 18:20:380858デフォルトの名無しさん
2010/01/22(金) 01:48:17bはA<short>の派生であって、A<int>の派生じゃないと思うんだが
0859デフォルトの名無しさん
2010/01/22(金) 02:11:32class A {
protected:
T x;
friend class A;
public:
template<T2>
void copy(const A<T2>& r) { x = r.x; }
};
こんな事をしたいのだろうか
0860デフォルトの名無しさん
2010/01/22(金) 11:22:08templateクラスでtemplateパラメータに縛られずに全ての
派生型に対してprotectedメンバにアクセスする方法は無いって
ことですかね。
>>859
それでは派生型でprotectedメンバは使用できないようです。
取り合えずこんな方法しか思いつきませんでした。
template<class T>
typename T::protected_type& RefMember(T& r) { return r.x; };
template<class T>
class A {
protected:
T x;
template<class T1> friend class A;
public:
template<class SRC>
void copy(SRC& r) {
x = r.x;
};
};
0861デフォルトの名無しさん
2010/01/22(金) 11:25:44template<class T>
typename T::protected_type& RefMember(T& r) { return r.x; };
template<class T>
class A {
protected:
typedef protected_type T;
T x;
template<class T1> typename T1::protected_type& RefMember(T1& r)};
public:
template<class SRC>
void copy(SRC& r) {
x = RefMember(r); // Aの派生のxも使用できる
};
};
0862デフォルトの名無しさん
2010/01/22(金) 23:54:13基底でも派生でも仮想関数にはオーバーヘッドがあるよ。
ただし、最適化オーバーヘッドをなくせる場合がある。例えば
Hoge* a=new DerivedHoge();
a->func(); //aはDerivedHogeと明確なので、funcが仮想関数の場合でもオーバーヘッドが無くなる用に最適化される。
0863デフォルトの名無しさん
2010/01/23(土) 09:10:57ttp://codepad.org/8E4ZXSYK
0864デフォルトの名無しさん
2010/01/23(土) 09:42:420865デフォルトの名無しさん
2010/01/23(土) 15:16:400866デフォルトの名無しさん
2010/01/23(土) 15:49:480867デフォルトの名無しさん
2010/01/23(土) 16:23:120868デフォルトの名無しさん
2010/01/23(土) 16:24:56Java から C++ で作った DLL を呼んで、モードレスダイアログを表示しようとしていますがうまくいきません。
ソースコードは以下の通りです。
JNIEXPORT void JNICALL Java_Dummy_openNativeDialog
(JNIEnv * env, jclass obj, jbyteArray className, jbyteArray titleName){
jbyte * cls_name = env->GetByteArrayElements(className, 0);
jbyte * wnd_name = env->GetByteArrayElements(titleName, 0);
HWND hwnd = FindWindow((LPCSTR)cls_name, (LPCSTR)wnd_name);
HWND hDialog = CreateDialog(hInitDll, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, NULL);
if (hDialog != NULL){
ShowWindow(hDialog, SW_SHOW);
}
MessageBox( HWND_DESKTOP, "hogehoge", "hoge", MB_OK | MB_ICONEXCLAMATION );
}
hInitDll は DllMain で取得しています。hwnd は正しく取得できてるみたいです。
CreateDialog 自体は成功しているようで、ShowWindow まで処理は行っています。
(どうも、ShowWindow は返り値 false を返しているようです。)
MessageBox で表示するモーダルダイアログは表示されるのですが、、、、
0869デフォルトの名無しさん
2010/01/23(土) 16:25:27・B<U>はA<U>をpublic継承している
以上のことから、A<T>からB<U>のA<U>部分が参照できるのは当たり前。
だから>>855のコードは機能するはずだが、B<U>がA<T>のfriendになったわけじゃない。
>>860-861の書き方は冗長ていうかコンパイル通らなくね?
ttp://codepad.org/AA6wjAIX
0870デフォルトの名無しさん
2010/01/23(土) 16:46:14>855だとa.copy(b)の部分で、r.xはprotectedでアクセスできないとエラーが出る。
0871デフォルトの名無しさん
2010/01/23(土) 18:11:09もう少しくやしく
0872デフォルトの名無しさん
2010/01/23(土) 18:59:15friendのテンプレート引数はTじゃなくてT1
0873デフォルトの名無しさん
2010/01/23(土) 19:10:18template<class T1> friend class A;
この部分のこと?
T1になってますけど。
0874デフォルトの名無しさん
2010/01/23(土) 19:14:41関数の引数として、「複数のインタフェースクラス」を継承していること
を要求したいのですが、テンプレートなどでうまく表現する方法はあるでしょうか?
foo(IBar1 *p1, IBar2 *p2);
としてp1,p2の両方に同じインスタンスを渡すというような
ルール縛りでは無い方法を知りたいです。
0876デフォルトの名無しさん
2010/01/23(土) 19:45:24同じインスタンスを渡さないでほしいというなら、アドレスチェックでいくらかは解消される気が。
そういう話じゃないとか?
0878デフォルトの名無しさん
2010/01/23(土) 19:51:57インターフェースの数があんまり無いなら、関数内で何らかのキャストで要求型に一度変換してみるのがいいと思う。
結果はコンパイルエラーかバッドキャスト(だっけ?)になるから、一応要求には答えられると思う。
綺麗ではないけどね。
0879デフォルトの名無しさん
2010/01/23(土) 20:21:51boost::concept_checkみたいことがやりたいのだろうか?
ttp://www.kmonos.net/alang/boost/classes/concept_check.html
0880デフォルトの名無しさん
2010/01/23(土) 20:27:52他の言語でもそれがそのまま出来そうなのは思いつかないなぁ
0881デフォルトの名無しさん
2010/01/23(土) 20:37:27こんな感じかな
あとはディスパッチするなりコンパイルエラーにするなり適当に
0882デフォルトの名無しさん
2010/01/23(土) 20:52:11ごめん、通った。
通らないパターンはこうなってました。
ttp://codepad.org/5C3zgNyW
friendは継承しないってのが原因でした。
0883デフォルトの名無しさん
2010/01/23(土) 22:32:59アプレット上のボタンをアプリでクリックしたいのですが、うまくいきません
アプレットウィンドウ、およびボタンのウィンドウハンドルは正しく取得しています
アプレットを SetForegroundWindow() してから
PostMessage(ボタンのウィンドウハンドル, BM_CLICK, 0, 0);
とやってみたところ、フォーカスは当該ボタンに移動しますが変化ありません
根本的に考えが間違っているのでしょうか?
0884デフォルトの名無しさん
2010/01/23(土) 22:36:09BUTTONDOWN にしてみるとか
0885デフォルトの名無しさん
2010/01/23(土) 22:49:21int main()
{
char a[3][3] = { "ab" , "cd" , "ef" };
printf("%s\n%s\n%s\n",a[0],a[1],a[2]);
return 0;
}
実行結果
ab
cd
ef
サイズの宣言でa[3][2]にすると
実行結果
abcdef
abcd
ef
となってしまう理由がわかりません。教えて頂けないでしょうか。
0886デフォルトの名無しさん
2010/01/23(土) 23:27:16a[3][3] の場合は、a のアドレスには
'a', 'b', 0x00, 'c', 'd', 0x00, 'e', 'f', 0x00
というデータが設定されるが、a[3][2] の場合は
'a', 'b', 'c', 'd', 'e', 'f'
となり文字列のデリミタが存在しない
'f' の次のデータがたまたま 0x00 の場合は>>885の実行結果となる
0887883
2010/01/23(土) 23:36:21WM_LBUTTONDOWN と WM_LBUTTONUP を送ってみましたが
変化なしです
実際にクリックしたところを Spy++ で見てみると、WM_PARENTNOTIFY というメッセージが
送られているようで、これと同じメッセージを送ればいいのかもしれません
もう少しいろいろやってみます
0888デフォルトの名無しさん
2010/01/23(土) 23:42:24文字列のデリミタですか…初めて聞きましたw
まだまだ勉強不足のようですね。恥ずかしいです。
ご丁寧にありがとうございました。
0889デフォルトの名無しさん
2010/01/23(土) 23:57:48正しく表示されないのはNULL文字を格納する領域がなく
バッファオーバーランした為
0890デフォルトの名無しさん
2010/01/24(日) 00:01:22NULL文字と表記するのはやめといてほしいな。標準ライブラリのマクロ NULL と
まぎらわしいから。
http://www.kouno.jp/home/c_faq/c5.html
0891デフォルトの名無しさん
2010/01/24(日) 01:56:31NUL文字なんてはじめてきいた
0892デフォルトの名無しさん
2010/01/24(日) 03:12:19それと同じようにbool型は全部falseになるのでしょうか?
あと、構造体のメンバ変数も0全部初期化されるのですか?
0893デフォルトの名無しさん
2010/01/24(日) 03:44:17もぐり。
>>892
基本的にはその通り。
DLLを書く時など特殊な場合を除く。
0894デフォルトの名無しさん
2010/01/24(日) 05:17:460895デフォルトの名無しさん
2010/01/24(日) 10:33:02>NULL文字と表記するのはやめといてほしいな。
MSDN の一部にそういう嘘表記があるんだよな。バカかと思った。
0896デフォルトの名無しさん
2010/01/24(日) 10:58:55NULLを使うなってのはいいんだけど
だからって何でnullじゃなくNULなんだ
ASCII?C/C++とASCIIは関係ないよな
0897デフォルトの名無しさん
2010/01/24(日) 12:16:47NUL文字 に一致する日本語のページ 約 103,000 件
0898デフォルトの名無しさん
2010/01/24(日) 12:26:27そんなん信用できるか。
規格書をだせ!
0899デフォルトの名無しさん
2010/01/24(日) 12:45:07ただそれだけ
0900デフォルトの名無しさん
2010/01/24(日) 12:50:330901デフォルトの名無しさん
2010/01/24(日) 12:51:00出力を捨てるつもりで NULL というファイルを作ったことがあるはず。
0902デフォルトの名無しさん
2010/01/24(日) 12:51:490903デフォルトの名無しさん
2010/01/24(日) 13:01:16なんでやねん
ASCIIコードでNULは'\0'と同義という意味もあるぞ
0904デフォルトの名無しさん
2010/01/24(日) 13:39:27ttp://en.wikipedia.org/wiki/ASCII
0905デフォルトの名無しさん
2010/01/24(日) 13:42:12Cでは問題になるからヌル文字をNULLとは表記しないだけ
0906デフォルトの名無しさん
2010/01/24(日) 14:05:250907デフォルトの名無しさん
2010/01/24(日) 14:08:290908デフォルトの名無しさん
2010/01/24(日) 14:27:550909デフォルトの名無しさん
2010/01/24(日) 14:34:450910デフォルトの名無しさん
2010/01/24(日) 14:38:030911デフォルトの名無しさん
2010/01/24(日) 14:39:280912デフォルトの名無しさん
2010/01/24(日) 15:24:09最近はナルみたいね。
0913デフォルトの名無しさん
2010/01/24(日) 15:37:260914デフォルトの名無しさん
2010/01/24(日) 15:37:290915デフォルトの名無しさん
2010/01/24(日) 15:39:28制御コードの表記は伝統的に3文字ないし2文字だから。
0916デフォルトの名無しさん
2010/01/24(日) 17:35:510917デフォルトの名無しさん
2010/01/24(日) 17:37:440918デフォルトの名無しさん
2010/01/24(日) 17:38:36グッ
0919デフォルトの名無しさん
2010/01/24(日) 17:40:03summがスムならnullはヌル
0920デフォルトの名無しさん
2010/01/24(日) 17:40:43アメリカ人に言わせると、ヌルもナルもどうでもいいだろ とのことだった。
そんなことよりお前ら全員イントネーション直せボケ だそうです。
0921デフォルトの名無しさん
2010/01/24(日) 18:07:420922デフォルトの名無しさん
2010/01/24(日) 18:09:050923デフォルトの名無しさん
2010/01/24(日) 18:16:030924デフォルトの名無しさん
2010/01/24(日) 18:22:38レスを通してひしひしと伝わってくるので非常にイタい
同類だから共感できるのさ
0925デフォルトの名無しさん
2010/01/24(日) 18:48:590926デフォルトの名無しさん
2010/01/24(日) 21:27:35走査を再帰的に行うことはできるのですが
非再帰的に組むことがうまくできません
どうすればできるでしょうか?
0927デフォルトの名無しさん
2010/01/24(日) 21:36:30自分でスタックを作って上げ下げしながらループまわせばできると思うよ。
0928デフォルトの名無しさん
2010/01/25(月) 03:20:46大学の課題でC言語によるサブセットパスカルコンパイラを作成しています.
最近MacOS 10.5からMacOS 10.6にアップデートしたところ,
以前動いていたプログラムが動かなくなりました.
どうやらstrncpyでおかしなことになってるみたいなんですが全く原因がわからなくて困ってます.
長くなりますが,以下にコードの一部を載せます
typedef struct pid{
char proc_id[ID_MAX_LEN+1];
ID *param_id;
ID *id_root;
struct pid *next;
}PID;
PID *pidp;
if((pidp = (PID *)malloc(sizeof(PID))) == NULL){
fprintf(stderr,"malloc error! 1\n");
return 1;
}
strncpy(pidp->proc_id,"main", ID_MAX_LEN+1);
gcc 4.2.1です.以前動いていたgccのバージョンは分からないです.
gdbで以下のようなエラー(?)が出ます.
141 strncpy(pidp->proc_id,"main", ID_MAX_LEN+1);
(gdb)
__inline_strncpy_chk (__dest=0x100130 "", __src=0x3d76 "main", __len=9) at secure/_string.h:116
116 return __builtin___strncpy_chk (__dest, __src, __len, __darwin_obsz(__dest));
長々と申し訳ありません
0929デフォルトの名無しさん
2010/01/25(月) 04:11:08http://www9.plala.or.jp/sgwr-t/lib/strncpy.html
>�A s2 の長さが n より少ない場合には残りの文字を '\0' で埋めます。
n に配列の長さ以上の値が指定されていても n 文字分を\0で埋める。
>typedef struct pid{
> char proc_id[ID_MAX_LEN+1];
(中略)
>strncpy(pidp->proc_id,"main", ID_MAX_LEN+1);
配列の長さをオーバーしてない?
エラーにならないとか停止しないで動いてるってのは
バグがないこととイコールではないよ。
0930デフォルトの名無しさん
2010/01/25(月) 16:18:59■ClassA.h
class ClassB;
class ClassA
{
public:
void funcA();
ClassB *b;
};
■ClassB.h
#include "ClassA.h"
class ClassB : public ClassA
{
public:
void funcB() {}
};
■ClassA.cpp
#include "ClassA.h"
void ClassA::funcA()
{
b->funcB();
}
このような構成にすると
>error C2027: 認識できない型 'ClassB' が使われています。
と言われてコンパイルエラーになってしまいます。
ClassBのメンバ関数を使わない限りはコンパイルできるようなのですが、
メンバ関数を使いたい場合どのように解決するのが良いのでしょうか?
環境はVisual C++ 2008 Express Editionです。宜しくお願いします。
0931デフォルトの名無しさん
2010/01/25(月) 16:26:00■ClassA.cpp
#include "ClassA.h"
#include "ClassB.h"
void ClassA::funcA()
{
b->funcB();
}
0932デフォルトの名無しさん
2010/01/25(月) 16:36:39試してみたら実際のプロジェクトの方も含めて上手くいきました
cpp側で確実に宣言が終わってから定義するように書けば良かったんですね…
助かりました。どうもありがとうございます!
0933デフォルトの名無しさん
2010/01/25(月) 17:38:53現在、学校の課題で自販機っぽいプログラムをC言語組んでいるのですが、
ループさせるところで、悩んでいます。
このソースで走らせると char c; で定義した変数の数値(ココでは文字です)がリセットされず、
一度登録した変数を保持したまま延々とループし続けます。
変数Cで定義した文字で分岐させ、変数Cの数値をリセット→入力受付時に一旦止まる、
ということをさせたい訳ですが
どのようにしたら宜しいでしょうか?
do{の下に変数Cの宣言を持ってきてもダメでした・・・・
今もっている知識を総動員して書いたソースが以下です。
0934789
2010/01/25(月) 17:42:47short x; /*商品Aの代金を変数xに定義*/
x=100;
short y; /*商品Bの代金を変数yに定義*/
y=100;
short z; /*商品Cの代金を変数zに定義*/
z=120;
short t; /*投入金額の合計を変数tに定義*/
t=0;
char c; /*キーボード入力受付用*/
do{
printf("\x1b[2J");
printf("<<<<<<<< Welcome >>>>>>>\n");
printf("<A/B/C/R/E/[1=1000円投入/2=500円投入/3=100円投入/4=50円投入/5=10円投入]>\n");
/*ABCはそのまま商品名を表す。*/
/*Rは返却(Return)、Eはプログラム終了(End)を表す。*/
/*1000/500/100/50/10は投入するお金を表す*/
/*ワンタッチで指定額を入れられるように*/
0935789
2010/01/25(月) 17:44:23printf("以下の商品が購入可能\です。\n");
printf("ABC\n");
if (t<100){
printf("×××\n");
}
else if (t>=100 && t<120){
printf("〇〇×\n");
}
else{
printf("〇〇〇\n");
}
printf("==>"); /*ここで入力を受け付ける*/
scanf("%[abcre12345]",&c);
if (c== 's') break;
else switch (c){
0936デフォルトの名無しさん
2010/01/25(月) 17:45:56printf("商品Aは%d円です。お金が足りません。",x);break;
}
else{
printf("商品Aは%d円です。ありがとうございました。\n",x);
t=t-x;break;
}
case 'b' :if (t<100){
printf("商品Bは%d円です。お金が足りません",y);break;
}
else{
printf("商品Bは%d円です。ありがとうございました。\n",y);
t=t-y;break;
}
0937デフォルトの名無しさん
2010/01/25(月) 17:46:20改行がバッファに残ってるからそれをクリアしないとな。
scanfの書式に含めた上で、(環境依存だが)fflush()とかでクリアすれば行けるんじゃないかな。
0938デフォルトの名無しさん
2010/01/25(月) 17:49:31printf("商品Cは%d円です。お金が足りません",z);break;
}
else{
printf("商品Cは%d円です。ありがとうございました。\n",z);
t=t-z;break;
}
case 'r':if (t>0){
printf("投入金額%d円をお返しします。\n",t);
t=0;break;
}
else{
printf("投入金額はありません。\n");break;
}
case '1':printf("1000円投入されました。\n");
t=t+1000;break;
case '2':printf("500円投入されました。\n");
t=t+500;break;
case '3':printf("100円投入されました。\n");
t=t+100;break;
case '4':printf("50円投入されました。\n");
t=t+50;break;
case '5':printf("10円投入されました。\n");
t=t+10;break;
default:printf("\a");break;
}
}while(1);
}
0939デフォルトの名無しさん
2010/01/25(月) 17:51:00コンパイラ環境はcygwinでやっとります。
0940デフォルトの名無しさん
2010/01/25(月) 17:55:59バッファ上の数値クリアですか
頑張って調べてみます。
0941928
2010/01/25(月) 21:49:40ありがとうございます.
別のところでおかしかったみたいでなんとか正しく動きました.
ただ配列はオーバーしていないと思うんですが.
gdbで
__inline~
の文はなぜ出るんでしょうか?他のプログラムでもstr系でいくつか出ます.
0942933-940
2010/01/25(月) 22:04:09今頑張って調べていますが、
cygwinでコンパイルしているので、
fflush()ではエラーが出るみたいです。
>scanfか。
>改行がバッファに残ってるからそれをクリアしないとな。
>scanfの書式に含めた上で、(環境依存だが)fflush()とかでクリアすれば行けるんじゃないかな。
どなたか、fflush()を使用せずに、変数の値を改行まで含め、
クリア(又はNULL値)代入出来る方法を教えてください。
0943デフォルトの名無しさん
2010/01/25(月) 22:07:41エラーってコンパイルエラー?
エラーの内容は?
fflush(stdin);
↑こんなんでいいんじゃね?
0944デフォルトの名無しさん
2010/01/25(月) 22:09:33int moji;
while((moji=getchar())!=EOF && moji!='\n');
0945デフォルトの名無しさん
2010/01/25(月) 22:12:17この場合は問題ないけど、ひじょーに危ういコードなので警告してるの
かなあ。ふつう、strncpy()の第3パラメータに渡すのは、「書き込み先
バッファサイズ-1」なので。
コピーする文字列が"main"って決まってるならstrcpy()でいいし、バッ
ファ長を指定して安全に行くならstrncpy()じゃなくてstrlcpy()を使う。
0946デフォルトの名無しさん
2010/01/25(月) 22:12:46ただエラーも出ないと思うが・・・
よく見てないけど、普通に fgets で読んで、sscanf すれば?
0947デフォルトの名無しさん
2010/01/25(月) 22:37:34これってstd::listでは無理ですか?自分でリスト作るしかないですかね?
0948デフォルトの名無しさん
2010/01/26(火) 01:56:110949デフォルトの名無しさん
2010/01/26(火) 10:37:44複数のクラスや関数を一つにまとめてしまっても、
そのライブラリを使うアプリケーション側のビルドでは
使っていないクラスや関数は絶対にリンクされないものでしょうか?
それとも、関連するクラスや関数ごとに大まかに分けて
複数のライブラリにしておいたほうがよいのでしょうか?
0950デフォルトの名無しさん
2010/01/26(火) 11:11:00コンパイラによっては関数単位で参照されていないものを外すこともできる
0951デフォルトの名無しさん
2010/01/26(火) 21:39:42ありがとうございます。
ということはやっぱり複数のライブラリに分けておくほうがよいのでしょうね。
0952デフォルトの名無しさん
2010/01/26(火) 22:51:58気になるなら分けておけばいいじゃん
0953デフォルトの名無しさん
2010/01/26(火) 22:54:200954デフォルトの名無しさん
2010/01/26(火) 23:01:15まぁすまんかった
0955デフォルトの名無しさん
2010/01/26(火) 23:05:200956デフォルトの名無しさん
2010/01/27(水) 00:56:53関数を公開することはできる。やり方はDLLの場合と同じ。
ただし、DLLとして読み込むのは難しいと思う。できる方法を自分は知らない。
0957デフォルトの名無しさん
2010/01/27(水) 09:41:14申し訳ありませんでした。
規格によってリンク時の動作が決まっているものではない
ということを知らなかったのです。
ちなみに、VC6やVC2005やVC2008のリンカだと
使っていないものはリンク時に外してくれるものなのでしょうか?
「便利クラス&関数群」みたいなライブラリを作ろうかと思ったのですが。
0958デフォルトの名無しさん
2010/01/27(水) 10:14:56どこからも参照されてないobjはリンクされないが、一か所でも使われてるとobj全部リンクされる。
関連の無いものはそれぞれ別のc/c++ファイルにしておけばいいよ
0959デフォルトの名無しさん
2010/01/27(水) 10:20:201個の.Cファイルをコンパイルしてobjを作り、それをlibにしたら常に全部リンクされる。
関数一つ一つばらしておけば、使ってるやつだけリンクされる。
0960デフォルトの名無しさん
2010/01/27(水) 10:35:18そういうことでしたか。
基本的にはクラスごとにソースは分けてあるので、
ライブラリ自体は1つにまとめてビルドしてしまっても、
アプリケーションが使っていないクラスは
リンク時に捨ててくれるということですね。
0961デフォルトの名無しさん
2010/01/27(水) 11:59:470962デフォルトの名無しさん
2010/01/27(水) 12:10:30#include <iostream>
void foo(int (&a)[10]) {
a[0] = 42;
}
int main() {
int a[10];
foo(a);
std::cout << a[0] << std::endl;
}
0963デフォルトの名無しさん
2010/01/27(水) 12:42:370964デフォルトの名無しさん
2010/01/27(水) 13:31:06#include <iostream>
template <int N>
void foo(int (&a)[N]) {
a[0] = 42;
};
int main() {
int a[10];
foo(a);
std::cout << a[0] << std::endl;
}
0965デフォルトの名無しさん
2010/01/27(水) 15:44:55難しいですか
DLLにコールバック関数を持たせてアプリケーションを拡張できるように・・・というのをやろうとしてるんですが
そうなるとAPIを提供する仲介用DLLと拡張用DLLを両方用意しないと駄目みたいですね
レスどうもでした
0966デフォルトの名無しさん
2010/01/27(水) 16:17:46アプリケーションを拡張できるように
アプリケーション側が
決まった関数名 を エクスポートする DLL を LoadLibaray で取り込む→GetProcAddress でDLL側の関数保持
状況に応じて その DLL 内関数を呼び出す
こういう構造を容易しておいて
拡張を記述する側は
アプリケーション側の呼び出しルールに応じた 関数を書けばOK
こういう造りが多いんじゃね?
0967デフォルトの名無しさん
2010/01/27(水) 18:30:16EXE内で定義した関数を、関数へのポインタとしてDLL内の関数へ渡すのはできるよ。
難しいと書いたのはEXEファイルをLoadLibraryしたりLIBでリンクしたりということ。俺の勘違いだったらすまない。
0968デフォルトの名無しさん
2010/01/27(水) 18:34:47>>964
すげー。以下のようなコードを書いたら通ってしまった。
スタティック配列始まったな。
template<class T,size_t N>
void Init(T (&Array)[N]){
T Val(0);
for(size_t i=0;i<N;i++){
Array[i] = Val;
}
}
0969933-940
2010/01/27(水) 18:35:14色々調べまくった結果、
scanf("%[abcre12345]",&c);
この部分を
scanf("%c",&c);
こうすることで何とか解決することが出来ました。
ありがとうございました。
これで何とかなりそうです。
0970デフォルトの名無しさん
2010/01/27(水) 21:23:30レスサンクスです
EXE側のオブジェクトを操作するのに操作用のAPIをDLLで提供しなければいけないかなと思ったんですが、なんとか拡張用DLLだけでできそうです
レスをまとめるとこんな感じですかね
//--Main側--
class Hoge
{
public:
Hoge(void) { /* DLLからHogeUpdateをロード */ }
void Update(void);
void SetX(int x) { m_x = x; }
int GetX(void) { return m_x; }
private:
int m_x;
void (*m_HogeUpdate)(void *handle, HogeFunc *hogeFunc); // コールバック用の関数ポインタ
};
//公開する関数
void HogeSetX(void *handle, int x) { ((Hoge *)handle)->SetX(x); }
int HogeGetX(void *handle) { return ((Hoge *)handle)->GetX(); }
struct HogeFunc { void (*SetX)(void *handle, int x); int (*GetX)(void *handle); };
//拡張用関数をコール
void Hoge::Update(void) { HogeFunc hogeFunc = { HogeSetX, HogeGetX }; m_HogeUpdate(this, &hogeFunc); }
//--DLL側--
//公開する関数
void HogeUpdate(void *handle, HogeFunc *hogeFunc) { /* 拡張によって異なる。handleとhogeFuncでオブジェクトを操作 */ }
0971デフォルトの名無しさん
2010/01/27(水) 21:55:26std::listのsplice関数ってこんな感じで自分自身に使っても大丈夫なんでしょうか
↓2番目と3番目の要素を交換するプログラム
typedef list<int> LI;
LI l;
for(int i=0;i<4;++i){l.push_back(i);}
LI::iterator i1=++l.begin();
LI::iterator i2=++(++l.begin());
l.splice(i1,l,i2);
copy(l.begin(),l.end(),ostream_iterator<int>(cout," "));
0972デフォルトの名無しさん
2010/01/27(水) 22:05:48あれ?リンカは賢くて必要にして十分なobjをリンクしてくれるものと思っていましたが、違いましたか。
0973デフォルトの名無しさん
2010/01/27(水) 22:27:42そういう環境もあるのかも知れない
0974デフォルトの名無しさん
2010/01/27(水) 23:20:48良く読め。
「1個の.Cファイルをコンパイルしてobjを作り、それをlibにしたら」
0975デフォルトの名無しさん
2010/01/28(木) 04:29:150976デフォルトの名無しさん
2010/01/28(木) 20:29:39GetProcAddress(NULL, "func");
調べてみたところMSDNには書いてないけどこれでEXEから公開した関数にアクセスできるみたいですね
正しい使い方なのかわかりませんが・・・
0977デフォルトの名無しさん
2010/01/28(木) 22:44:28やはりnamespaceを宣言しておいた方がいいのでしょうか?
0978デフォルトの名無しさん
2010/01/28(木) 23:41:080979デフォルトの名無しさん
2010/01/28(木) 23:43:530980デフォルトの名無しさん
2010/01/28(木) 23:47:35まず、何らかのAをpush_backする。またはリサイズで確保する。
配列的なindexアクセスか、vectorのbackメンバで要素にアクセス。
ドット演算子でAのメンバにアクセス。
vec[0].A_Method();
vec.back().A_Method();
という流れじゃない?
0981980
2010/01/28(木) 23:48:460982デフォルトの名無しさん
2010/01/29(金) 00:00:21ありがとうございます.
0983デフォルトの名無しさん
2010/01/29(金) 00:50:23NULLの代わりにGetModuleHandle(NULL)を使えば心配要らない。
0984デフォルトの名無しさん
2010/01/29(金) 01:40:090985デフォルトの名無しさん
2010/01/29(金) 09:27:41{
static my::AutoPtr<Handle> resource(Load("resource-name"), Rereaser);
return resource.get();
}
これってアプリ終了時にちゃんと開放してくれますかね?
0986デフォルトの名無しさん
2010/01/29(金) 10:04:31「ちゃんと開放」となるかどうかは知らないが、 resource のコンストラクタが成功すれば、
のデストラクタは main() 終了時や exit() 呼び出し時に呼び出されることになってる。
× rerease
○ release
0987デフォルトの名無しさん
2010/01/29(金) 22:17:24○ 解放
0988デフォルトの名無しさん
2010/01/29(金) 23:09:350989デフォルトの名無しさん
2010/01/29(金) 23:16:29次スレだよ
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
0990デフォルトの名無しさん
2010/01/30(土) 02:28:42○開放
×解放
な現場があったな…占有してる「場所を開け放つ」んだから開放だとか…
えぇーって思ったけど
0991デフォルトの名無しさん
2010/01/30(土) 08:52:490992デフォルトの名無しさん
2010/01/30(土) 12:23:390993デフォルトの名無しさん
2010/01/30(土) 13:51:200994デフォルトの名無しさん
2010/01/30(土) 13:57:220995デフォルトの名無しさん
2010/01/30(土) 18:37:140996デフォルトの名無しさん
2010/01/30(土) 18:38:370997デフォルトの名無しさん
2010/01/30(土) 18:39:070998デフォルトの名無しさん
2010/01/30(土) 18:41:260999デフォルトの名無しさん
2010/01/30(土) 18:42:521000デフォルトの名無しさん
2010/01/30(土) 18:43:5810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。