【初心者歓迎】C/C++室 Ver.65【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/04/10(金) 10:19:59ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.64【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1234193151/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2009/04/10(金) 13:49:25ほかに良い方法はあるのでしょうか?
0003デフォルトの名無しさん
2009/04/10(金) 13:57:520004デフォルトの名無しさん
2009/04/10(金) 13:58:20MFCを使うとか、その手のライブラリを使えばWinAPIは明示的に記述する必要はないよ。
0005デフォルトの名無しさん
2009/04/10(金) 13:59:51いつからC#はC++になりましたか?
0006デフォルトの名無しさん
2009/04/10(金) 14:04:22http://www.ultimatepp.org/
0007デフォルトの名無しさん
2009/04/10(金) 14:09:29http://downloads.sourceforge.net/upp/upp-mingw-2008.1.exe
0008デフォルトの名無しさん
2009/04/10(金) 14:16:08特徴として、新しいプロジェクトであること API がかなりすっきりしていることなどが挙げられる。
ウェブサイトに掲載されている wxWidgets との比較では、同様のプログラムを 1/3 程度のコードで実現している。
http://0xcc.net/pub/uu-2004-08/
0009デフォルトの名無しさん
2009/04/10(金) 14:20:25http://gdk.thegamecreators.com/
ゲーム開発ミドルウェアとして Dark はどうかというと、これはなかなか使えそうです。
とにかくシンプルで、初心者にとって使いやすい、やさしい仕様になっています。
変数と関数の使い方さえ知っていれば、なんとなくゲームが作れてしまいそうです。
初心者を強く意識した設計になっているので、あとは日本語の入門書でもあれば、
小学生がひとりで、3Dゲームを作ってしまう、なんてこともできそうです。
http://myhome.cururu.jp/kacom/blog/article/21001671006
0010デフォルトの名無しさん
2009/04/11(土) 09:12:08class Singleton {
Singleton(){}
~Singleton(){}
public:
const Singleton* getInstance() const {
static Singleton s;
return &s;
}
};
こういう風に書くとコンパイルが通るのですが、
const Singleton& getInstance() const {
のように参照を返すと、デストラクタがプライベートだとだめというエラーになります。
どうしてだめなのでしょうか?
0011デフォルトの名無しさん
2009/04/11(土) 09:55:190012デフォルトの名無しさん
2009/04/11(土) 10:01:48static const Singleton* getInstance() const {
です。
こうやっても、 C2248が出ます。
0013デフォルトの名無しさん
2009/04/11(土) 10:12:03シングルトンなんか使おうとするからダメなんだ
と思っとけ。そして悔い改めよ。
0014デフォルトの名無しさん
2009/04/11(土) 10:49:25みんな使ってるじゃないですか
一応デストラクタをパブリックにするとコンパイル通るんですが、普通シングルトンの
デストラクタってプライベートですよね?
パブリックにしても問題はないとも思うけど。
0015デフォルトの名無しさん
2009/04/11(土) 11:17:19> みんな使ってるじゃないですか
あぁ初心者はすぐに手を出すからな。しかも問題に気づくのはずっと後だ。罠だよ罠。
0016デフォルトの名無しさん
2009/04/11(土) 11:35:18使うことになると?
0017デフォルトの名無しさん
2009/04/11(土) 11:49:34なんでそうなるの?
グローバル変数に問題があるのはわかってるのに、それをシングルトンにすれば
問題がなくなるとでも思ってるの?
0018デフォルトの名無しさん
2009/04/11(土) 11:59:49でもシングルトン使ってるコード多いじゃないですか?
0019デフォルトの名無しさん
2009/04/11(土) 12:10:100020デフォルトの名無しさん
2009/04/11(土) 13:35:23だけ教えてください。それとも、シングルトンの場合は必ずポインタ返しにして、メモリ確保は
静的にしておき、デストラクタは呼ばれないようにしておくべきなのでしょうか?
(呼ばれないから、プライベートでもOK)
0021デフォルトの名無しさん
2009/04/11(土) 14:07:250022デフォルトの名無しさん
2009/04/11(土) 15:17:47ありがとうです。
そうか、それを書いとけばいいですね。
0023デフォルトの名無しさん
2009/04/11(土) 16:05:00って時に1つであることの制御を簡単にするためのものって聞いたんだけど
どんな使い方しようとしてんの?
0024デフォルトの名無しさん
2009/04/11(土) 20:16:19なんで参照にする必要があるのか知らないけど
0025デフォルトの名無しさん
2009/04/11(土) 20:22:480026デフォルトの名無しさん
2009/04/11(土) 21:19:27個人的には、いつも >>24 の書き方 ( 参照返し ) にしてる。
インスタンスは、それを取得する関数内で静的に確保するから、NULL を返す意味がない。
取得関数をシングルトンクラスのメンバにするなら、コンストラクタとデストラクタ も private にしておく。
シングルトンクラスのマルチインスタンス化を許可すると、思わぬトラブルを招くから、こうしている。
あと、コンパイルエラー云々は、const の扱いが原因な気がする。
0027デフォルトの名無しさん
2009/04/11(土) 22:01:53あと、23>>とか24>>とか26>>とか、ありがとうございました。使い方はグローバル変数の代わりに使ってました。
勉強になりました。
0028デフォルトの名無しさん
2009/04/12(日) 05:20:37#define UNICODE
#define _UNICODE
#include <iostream>
int wmain(void)
{
std::wcout << L"Test書き込み" << std::endl;
return 0;
}
結果、「Test」 としか表示されないんだけど、何が悪いの?
0029デフォルトの名無しさん
2009/04/12(日) 08:45:320030デフォルトの名無しさん
2009/04/12(日) 21:24:36#include <locale.h>
_wsetlocale(LC_ALL, L"");
でいけたけど、何でこんなことしなくちゃいけないの?
0031デフォルトの名無しさん
2009/04/12(日) 22:50:59setlocale( LC_CTYPE, "Japanese" );
0032デフォルトの名無しさん
2009/04/13(月) 01:39:55setlocaleしなかったときの"C" localeは最小限のことさえできれば十分という思想でできているから。
あと、VC6だと上手くいかないのかもしれないけど、本当はstd::wcout.imbue(std::locale(""))が好ましい。
0033デフォルトの名無しさん
2009/04/14(火) 17:46:35代入処理は同じものになるケースが多いのですが、
コピーコンストラクタの中で
*this = rSrc; // rSrcは自クラス型の参照
とoperator=を呼んでそちらに処理をまとめてしまってもよいものなのでしょうか?
それとも、通常は両方に同じ処理を入れておくものでしょうか?
0034デフォルトの名無しさん
2009/04/14(火) 19:03:49コピーコンストラクタ(とswap)を使ってoperator =を定義する。
class hoge
{
public:
hoge(hoge const&);
void swap(hoge& x); // *thisとxの中身を入れ替える。
hoge& opeartor =(hoge const& x)
{
hoge_t tmp(x);
swap(tmp);
return *this;
}
};
inline void hoge(hoge& lhs, hoge& rhs) {lhs.swap(rhs);} //おまけ
0035デフォルトの名無しさん
2009/04/14(火) 21:27:18>>34の言うように、理想的にはswapもつけて>>34のように書きたい。
でも現実にはめんどくさいことも多いので、どちらかに処理をまとめるだけで妥協する。
あんまり両関数に同じコードを書くのは好ましくない。 後に変更したりするのが二度手間になったり変更し忘れたり。
003634
2009/04/14(火) 21:36:160037デフォルトの名無しさん
2009/04/15(水) 06:23:54更に言うとstd::swapの特殊化を書くべき。
0038デフォルトの名無しさん
2009/04/15(水) 08:35:18まともな処理系ならADLもできるように書くから問題ない。
ただ、VCのDinkumwareだと、2008以降だったはずだが。
0039デフォルトの名無しさん
2009/04/15(水) 08:40:07inline フリー関数 swap() と、うっかり std::swap() された場合に備えて std::swap() の
特殊化も inline で定義しておけば、完璧?
0040デフォルトの名無しさん
2009/04/15(水) 08:53:230041デフォルトの名無しさん
2009/04/15(水) 17:30:51sscanfとstrtolはどちらを使った方が良いでしょうか?
0042デフォルトの名無しさん
2009/04/15(水) 17:47:540043デフォルトの名無しさん
2009/04/15(水) 20:04:230044デフォルトの名無しさん
2009/04/15(水) 20:13:56引数によってget出来る内部情報を換えています
Aは基本クラスで実際は多態的に利用するわけですが
get関数を呼び出す側がパラメータの意味を知っていないといけない、と言う状態は
やはりクラスAとその派生クラスの抽象度を下げてしまっているのでしょうか
派生によって引き出せる情報量が異なるため
情報ごとにget関数を作るのは出来ないのですがどうしたらよいでしょうか
0045デフォルトの名無しさん
2009/04/15(水) 22:34:55抽象度と言うより、凝集度かな。たしか悪い方から2番目の。
オブザーバーパターン的に、情報を引き出したいクラスを相手に渡すとか。
あるいは、パラメータオブジェクトを作るかかなぁ。
0046デフォルトの名無しさん
2009/04/15(水) 23:06:14abstract class Object<T>{
int getA(T param)
}
class Dog<Chain>{
int getA(Chain param) { ... }
class Chain { ... }
}
class Horse<Bridle>{
int getA(Bridle param) { ... }
class Bridle { ... }
}
見たいな感じ
しかし getA の意味が継承したサブクラスで無意味になるから面白くない
0047デフォルトの名無しさん
2009/04/15(水) 23:34:440048デフォルトの名無しさん
2009/04/16(木) 12:19:23したいのですが、どう書けばよいでしょうか。
C++ってパズルみたいだわ。
/// 前方参照
template<class _T>
class TDerived;
// ---> TDerivedのインナークラスにしたい。記法調査中
template<class _T>
class TOther
{
//...内容
TDerived<_T>* m_pDerived;
};
// <--- TDerivedのインナークラスにしたい。記法調査中
template<class _T>
class TDerived :public TBase< TOther<_T> >
{
//...内容
TOther<_T> m_Other;
};
0049デフォルトの名無しさん
2009/04/16(木) 12:32:530050デフォルトの名無しさん
2009/04/17(金) 03:26:410051デフォルトの名無しさん
2009/04/19(日) 01:16:57ttp://lancet.mit.edu/galib-2.4/Installation.html
英語が読めないのでエキサイト翻訳が頼りなのですが、インストールの仕方がよくわかりません。
単にインクルードだけしてビルドするとリンクエラーが発生します。
また、URLのドキュメントとDLしたライブラリについているドキュメントの内容が違ったりします。
環境はWinXP、VC2008EEです。
どなたか助けてください。
0052デフォルトの名無しさん
2009/04/19(日) 02:52:10全く一文字も読めないならプログラム自体を諦めた方が今後のためにいい
0053デフォルトの名無しさん
2009/04/19(日) 03:07:02うーん、プログラミングやるには英語は避けて通れないんですかねぇ・・・。
全く読めないわけじゃないですけど、日本語で書いてあっても難しいと思われるものが英語で書いてあるとつらいです。
0054デフォルトの名無しさん
2009/04/19(日) 03:15:39いいや、避けて通れる。英語のを使わなければ良い。
0055デフォルトの名無しさん
2009/04/19(日) 03:38:40この程度のインストールができないなら、英語が読めるかどうかに関わらずプログラミングを諦めるのが一番手っ取り早い。
0056デフォルトの名無しさん
2009/04/19(日) 03:43:240057デフォルトの名無しさん
2009/04/19(日) 03:50:13>単にインクルードだけしてビルドするとリンクエラーが発生します。
GAlib 自体のビルドはやらずに自分のプログラムに組み込もうとして失敗している、という認識でいい?
VC2008 だけど、galib247.zip を展開して makefile.vcpp のあるフォルダで
nmake /f makefile.vcpp
すると ga フォルダ以下に普通にライブラリがビルドできてるっぽいし、
nmake /f makefile.vcpp test
でテストプログラムがビルドされて実行されるわけだが。
後は、自作プログラム側でライブラリ検索パスを指定して ga.lib をリンク対象にすればOK。
0058デフォルトの名無しさん
2009/04/19(日) 13:56:59もともと翻訳に強いマイクロソフト日本法人でさえ
自社開発ツールのマニュアルを完全に日本語化していないくらいだし。
そして日本の英語教育は絶望的な状況だから
日本がITで遅れてるのもさもありなんという気がする。
0059デフォルトの名無しさん
2009/04/19(日) 14:17:360060デフォルトの名無しさん
2009/04/19(日) 14:24:190061デフォルトの名無しさん
2009/04/19(日) 14:36:29もともと書いてある内容はたいしたことないから。
問題は技術書の類だ。
日本語に翻訳されるのは本国で出版された2年後とか。
マウスイヤーのIT産業じゃ化石だ。
0062デフォルトの名無しさん
2009/04/19(日) 15:02:250063デフォルトの名無しさん
2009/04/19(日) 17:11:04しかし和訳第一版を積んで放置してたら、和訳第二版が出てる件。
0064デフォルトの名無しさん
2009/04/19(日) 17:53:19できました。
ありがとうございました。
0065デフォルトの名無しさん
2009/04/19(日) 18:13:07int mein(void)
{
printf("Hello, world!\n");
return 0;
}
コンパイルは通るのですがリンクでエラーになります。
0066デフォルトの名無しさん
2009/04/19(日) 18:14:26mein→main
0067デフォルトの名無しさん
2009/04/19(日) 18:15:01エントリーポイントを指定するか
デフォルトのエントリーポイントである main を使うかすればおk
0068デフォルトの名無しさん
2009/04/19(日) 22:18:27中学英語で読めるなら、more effective C++ みたいな悲惨なことにはなってない。
0069デフォルトの名無しさん
2009/04/19(日) 22:37:190070デフォルトの名無しさん
2009/04/19(日) 22:49:390071デフォルトの名無しさん
2009/04/19(日) 23:26:48#define MYDEF 1
みたいなときって、警告すらでないのですが、有効な文法なのでしょうか?
さすがに値が異なると警告が出るのですが・・・
0072デフォルトの名無しさん
2009/04/20(月) 00:42:14有効ってわけぢゃないな
0073デフォルトの名無しさん
2009/04/20(月) 00:53:27正しい。 全く同じ#defineの再定義は有効。
0074デフォルトの名無しさん
2009/04/20(月) 06:21:580075デフォルトの名無しさん
2009/04/20(月) 09:26:52sudo make installしたところまではよかったのですが、そのあと実行しようとすると、
ライブラリが見つからないといわれます。
そのライブラリは/usr/local/lib/以下にインストールされているので、
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
すると見つかるようになるのですが、こういう情報をmakeしたバイナリの方に
書いておくことは出来ないのでしょうか?
置かれる場所は決まっている場合、いちいち環境側で設定するよりもMakeされる
バイナリ側に書いておいたほうが楽かなと思ったのですが。。。
0076デフォルトの名無しさん
2009/04/20(月) 09:31:08勿論、makefileに書けばいいことですね。gccなら、-Lでライブラリサーチパスを設定できます。
それ以上の質問は、makeスレかgccスレでどうぞ。
0077デフォルトの名無しさん
2009/04/20(月) 09:55:22binaryにshared libraryのpathを埋め込まないのはdynamic linker/loaderに任せるため
後はLinux板で聞け
0078デフォルトの名無しさん
2009/04/20(月) 11:15:070079デフォルトの名無しさん
2009/04/20(月) 12:03:20どういうところが非常識なのか教えてください。
ライブラリを特別な場所(/opt/MyCompany/lib/とか)にインストールしつつ、バイナリから使用するには
ライブラリの場所をバイナリに埋め込むのが最善じゃないかと思ったんですけど。
0080デフォルトの名無しさん
2009/04/20(月) 12:19:150081デフォルトの名無しさん
2009/04/20(月) 12:42:39アリガト。
0082デフォルトの名無しさん
2009/04/20(月) 19:37:37int x;
struct{int f(){return x;}}B;
public:
int f(){return B.f();}
A():x(0){};
}
なして return x; が "err invaliduse of nonstatic data member 'A::x'" に成るか論理的に教えて
0083デフォルトの名無しさん
2009/04/20(月) 19:45:21このエラーメッセージだけでは、どの添え字アクセスで落ちたのか特定できません。
効率よくエラー箇所を特定するには、どんな方法がありますか?
0084デフォルトの名無しさん
2009/04/20(月) 19:55:280085デフォルトの名無しさん
2009/04/20(月) 20:03:43もしAの外でBのインスタンスを作成すると、return x; で何を返せばいいのかわからなくなってしまう。
この時コンパイラは、実際にAの外でBが作成可能かどうかは区別しない。
だと思う。
0086デフォルトの名無しさん
2009/04/20(月) 20:11:24#define assert_sfx(x,m) asssert((x)<(m))
#else
#define assert_sfx(x,m) x
#endif
int x[10];
for (i=0;i<11;++i) x[assert_sfx(i,10)] = i;
0087デフォルトの名無しさん
2009/04/20(月) 20:37:34名詞でそのものが表せる場合は良いのですが
「〜する」というものを体現するようなクラスの命名をどうしたらよいでしょうか
「例えばアプリケーション領域に描画する」クラスの場合
DrawなのかDrawingなのか
DrawAppAreaなのかDrawingAppAreaなのかそれとももっと適切な命名法があるのか
どのようにしたらよいのでしょうか
0088デフォルトの名無しさん
2009/04/20(月) 21:06:54erをつけるとか。
Drawerは元々「引き出し」とか「たんす」っていう意味があるけど、気にしなくてもいいよね。
0089デフォルトの名無しさん
2009/04/20(月) 21:07:29FileReader, TextWriter, ImageViewer, WebBrowser
0090デフォルトの名無しさん
2009/04/20(月) 21:09:090091デフォルトの名無しさん
2009/04/20(月) 23:03:35string line;
while (std::getline(ifs,line) && !line.empty()){
cout << line << endl;
}
ファイルを一行ずつ読み込んで処理しようとして上記のようなコードを書いたのですが、
cout << line << endl; の結果が何も表示されません。ファイルは存在して、オープンは
成功しています。なにかコード上で問題はありますか?
ちなみにファイルはWindowsで作成し、改行コードは<LR><LF>です。
どうかよろしくお願いします。
0092デフォルトの名無しさん
2009/04/20(月) 23:06:59コマンドプロンプト上から実行してみてはいかが?
0093デフォルトの名無しさん
2009/04/20(月) 23:25:13そのとおりにやって、問題がわかりました。
getline(ifs,line)の前の、ファイルオープンが出来ていませんでした。
0094デフォルトの名無しさん
2009/04/21(火) 00:12:25if (ifs) とか書いておくとか
009583
2009/04/21(火) 00:24:19>>84
使い方がよくわからなくて使っていなかったのですが・・・使うべきですね。
>>86
添え字アクセスの度にチェックコード書くのはしんどいです。
vectorがああいうエラーを出すということは、そのチェックをoperator[]の中に閉じ込めることができないということですかね。
0096デフォルトの名無しさん
2009/04/21(火) 00:32:11vector.at()使えば?
おれはつかわないけどさ。
0097デフォルトの名無しさん
2009/04/21(火) 00:35:40#define ベクターオブジェクト (printf("%d",__LINE__), ベクターオブジェクト)
みたいに乗っ取ればええんじゃ?
面倒だからデバッガ使え
0098デフォルトの名無しさん
2009/04/21(火) 00:36:140099デフォルトの名無しさん
2009/04/21(火) 00:38:08DBは今のところMySQLだけなのですが、mysql++というライブラリを使ってVC++2008でDB接続のコードを書く場合、
ADO.NETを使うべきなのでしょうか?
0100デフォルトの名無しさん
2009/04/21(火) 07:10:45授業でteratermを使って、emacsでプログラミングをしているのですが
とりあえず、先生の用意したプログラムをコピペして起動してみろとのことで
普通にコピペして、コンパイルしようとしたのですが
警告: null 文字は無視されました
という文章が何十行にも渡ってでて、コンパイルできません。
調べてもなかなか対処がわからず、過去ログでの質問は自己解決していたりでわかりません。
断片的な情報から、文字コードの問題かと設定をUFT-8からEUCなどに変えてみましたが
UFT-8以外では文字化けしてしまいます。
とりあえず、インデントをしっかりTabに書き換えたりもしましたが、解決しませんでした。
どなたか、解決法を教えてください。
p.s.先生にメールで質問しましたが、すでに試した見当違いの方法しか言わないので、2chだけが頼りです
・・・あの人は日本語読めてないのか? orz
0101デフォルトの名無しさん
2009/04/21(火) 07:25:20>p.s.先生にメールで質問しましたが、すでに試した見当違いの方法しか言わないので、2chだけが頼りです
>・・・あの人は日本語読めてないのか? orz
見当違いの方法について詳しく書けよ
可能性としては
1.terminal の文字コードを間違えている
2.日本語を使えないコンパイラ
が有力
0102デフォルトの名無しさん
2009/04/21(火) 07:28:34あきらめた
0103デフォルトの名無しさん
2009/04/21(火) 07:42:36すいません。
先生からの返答は
「tera termの設定から文字コードをUTF-8にすると文字化けは無くなります」
→まず標準がUFT-8なので文字化けしてないし、項目中の全ての文字コードで
コピペ&コンパイルをすでに試しています。
「(自分の使用している)Tera taerm pro ver.4.62はUFT-8に対応しているか確認してください」
→対応しています。てか、標準文字コードがUFT-8だとメールに明記してます。
「何が問題かわからないときは、パンチミスを防ぐためにもコピペが有効です」
→すでにコピペは何度も繰り返してます。コピペしてることもメールで書いてます。
むしろファイルの中身だけではなく、コマンドすらコピペして試しました。
・・・こんな感じです。
0104デフォルトの名無しさん
2009/04/21(火) 07:56:45・teratermは送信と受信の文字コードを設定できたと思うけど、両方ともUTF-8にしてある?
・コマンドコピペは動いたの?
・日本語使わなければコマンドもemacsも動く?
0105100
2009/04/21(火) 08:09:48>・鯖の文字コードは何?
わかりませんが、UFT-8以外では日本語が文字化けし、先生も確認してきていることから
UFT-8ではないかと思われます。
>・teratermは送信と受信の文字コードを設定できたと思うけど、両方ともUTF-8にしてある?
両方してみました。
>・コマンドコピペは動いたの?
コマンドコピペ(?)はよくわかりませんが、メニューバーから編集→貼り付けでやってます。
>・日本語使わなければコマンドもemacsも動く?
先ほど、プログラム内の日本語を全て修正してコンパイルしましたが、無理でした。
・・・警告は日本語で出ますしね。
あと、通常は学校のPCでtera termを使うので自宅から、というのが問題かもしれません。
今日あたり、学校で一度試してみたいと思います。
ただ、自宅から試した友人は全くエラーなしで軒並み成功しているので
・自分のPCの設定、環境の問題
・自分のIDのサーバーでの扱いがおかしい
じゃないかと勝手に思ってます。
学校で問題なければ前者。学校でもできなければ後者かと。
0106デフォルトの名無しさん
2009/04/21(火) 09:05:54コンパイルが通らない原因は、
コンパイルしているソースファイルの文字コードが問題なのでは。
0107デフォルトの名無しさん
2009/04/21(火) 09:09:56emacsだと何て呼んでるか知らないけど。
0108100
2009/04/21(火) 09:13:41一応文字コード設定を変えてからコピペもしてみました。
UFT-8にしていないと、コピペした段階で日本語が文字化けするので
UFT-8が正しいと思うのですが・・・
>>107
すみません、よくわかりません。
文字コード設定の中にはUFT-16はありませんでした。
0109デフォルトの名無しさん
2009/04/21(火) 09:15:180110デフォルトの名無しさん
2009/04/21(火) 09:21:190111100
2009/04/21(火) 09:23:33いや、自分はよくわかってないんですが。
以前はmuleでした。
0112デフォルトの名無しさん
2009/04/21(火) 09:27:200114デフォルトの名無しさん
2009/04/21(火) 09:43:19つーか、どこがC/C++の質問なのかと。
0115デフォルトの名無しさん
2009/04/21(火) 09:44:390116デフォルトの名無しさん
2009/04/21(火) 09:54:22cat > hoge.c , cat >foo.cやってみましたが、改行されて反応無し
コマンドの意味と用法をしらないのでたぶん自分の使いかたが悪いのだと思います。
0117デフォルトの名無しさん
2009/04/21(火) 09:58:27catの標準入力に対して、簡単なソースを打ち込んで見ろってこった。
% cat > foo.c
int main() {return 0;}
^D
% gcc foo.c
% ./a.out
こう書いても意味が判らないなら諦めろ。
0118デフォルトの名無しさん
2009/04/21(火) 10:07:48コピペした後からコンパイルするまでの手順は?
emacs上でコンパイルしてるのかとか、
シェルに抜けてcc打ってコンパイルしてるのかとか。
どっかの段階でUTF-16/32に変換されたソースをコンパイルしている可能性が高い。
0119デフォルトの名無しさん
2009/04/21(火) 10:18:20なんとなくはわかりますが、うまくいきませんでした。
Linuxは個人的にやりたいとは思っているのですがまだ勉強はしてません。
今回は、Linuxを使ってプログラミングしろとのことで、Linuxはメインではなく
cd mv mkdir など本当に初歩の初歩しか教わっていない段階です。
むしろ使わせてるだけで、Linuxについて教える気は皆無のようです。
>>118
シェルに抜けて gcc -o 〜 でコンパイルしてます。
どの段階でuft-16/32に変換されるのかはさっぱり。
実際、上記のようにLinuxは初心者以前の問題なのでUFT-8や16だと
どうなるのかといったこともわかっておりません。
ただ、友達が同じやり方で成功しているので自分のPCの何かが悪いのかと。
0120デフォルトの名無しさん
2009/04/21(火) 10:21:26UFTじゃなくてUTF
0123デフォルトの名無しさん
2009/04/21(火) 10:27:27こうなるともう、鼬害だな。
0124デフォルトの名無しさん
2009/04/21(火) 17:10:20> catの標準入力に対して、簡単なソースを打ち込んで
ではなくて、コピペしてみろ、では?
それでエディタが問題かどうかはわかりそう。
0125デフォルトの名無しさん
2009/04/21(火) 17:15:36作り方は分かったんですが、どんな時にそれぞれを使うのかいまいち分かりません。
使い方や手順をみると Lib の方が楽そうで Dll の出番が無いように見えるのですが…
こんな時に Dll もしくは Lib を使う・使う場合が多いというような
指針というか判断基準みたいなモノがあれば参考にしたいので聞かせてくれませんか
0126デフォルトの名無しさん
2009/04/21(火) 18:59:03常に必要なものは Lib、参照をなるべく遅延したいなら Dll が向く。
例えば、プラグイン的なものは Dll にする。
応用として、機能を Dll に分割し、それらを並列にロードする事で、アプリケーション
の起動を短縮する方法も考えられる。
また、処理を Dll として分割しておくと、その部分のバグを修正した場合、Dll だけの差
し替えで済むという、メンテナンス上の利点もある。
でも、管理は Lib の方が圧倒的に楽なので、Lib で済めばそれにこした事はない。
0127デフォルトの名無しさん
2009/04/21(火) 19:24:44何となく違いが分かったような気がします。
Dll は機能を分けられる分、修正がしやすい
Lib は一括でまとめられる分、保守がしやすい
と、いう感じでしょうか。
ありがとうございます。
0128デフォルトの名無しさん
2009/04/21(火) 19:36:322秒くらいかかった処理が一瞬で終わった
0129デフォルトの名無しさん
2009/04/21(火) 19:37:17・上にもある通り差し替えが楽
・DLLファイルを共有するのでディスク効率がいい
・コードセグメントを共有するのでメモリ効率がいい(二回目以降のロードも速い)
短所は、DLLが増えてくると依存関係がぐちゃぐちゃになること。(いわゆるDLL地獄)
0130デフォルトの名無しさん
2009/04/21(火) 19:48:08ありがとうございます
素人目には Dll も Lib も同じ処理速度に見えますが
Dll の方が早いんですね
0131デフォルトの名無しさん
2009/04/21(火) 20:44:27LIBを使えるのは事実上、C/C++/アセンブリ言語くらい(それですべてとは言わないが)。
それと、プラグインのように事前にどういうものが来るか分からない場合もDLLでないと難しい。
なぜなら、LIBを組み込むには、ソースコードからビルドするとこから始めないといけないため。
Apacheなんかではそういう選択肢も可能だけど、
こっちはむしろApache本体と一体の実行ファイルになるので、
DLLの柔軟性を失う代わりに速くなるとされている。
0132デフォルトの名無しさん
2009/04/22(水) 00:06:33DLLを使ったプログラムで、プログラム本体とDLLのデバッグを
一緒にやる場合(たとえばVSでとか)ってどうやるの?
0133デフォルトの名無しさん
2009/04/22(水) 00:15:44DLLの関数内にステップインすれば、該当する部分のソースファイルへ飛ぶし、
ブレイクポイントも自由に仕掛けられる。
013413二
2009/04/22(水) 00:27:44なんとなく、大変そうな感じがしたんですが、よく出来てるんですね。
0135デフォルトの名無しさん
2009/04/22(水) 00:35:230136デフォルトの名無しさん
2009/04/22(水) 00:48:000138デフォルトの名無しさん
2009/04/22(水) 00:59:45std::pair<string,int>だと、単にstringとintを一緒にして保持できるだけ。
std::map<string,int>だと、stringとintを一緒に保持できるのに加えて、
stringがあれば、対応するintの値をO(N)の時間で得られる。
という理解でいいですか?
0139デフォルトの名無しさん
2009/04/22(水) 01:05:57コンテナとそれ以外
0140デフォルトの名無しさん
2009/04/22(水) 01:07:08ありがとうございます。
でも両方ともコンテナじゃないんですか?
0141デフォルトの名無しさん
2009/04/22(水) 01:08:190143デフォルトの名無しさん
2009/04/22(水) 01:10:55operator []など使い勝手をよくしたものという感じ。
>>138の1文1文は間違っていないけど、
pairとmapを並べられると理解しているのか怪しく感じてしまう。
0144デフォルトの名無しさん
2009/04/22(水) 03:20:06ありがとうございます。寝てました
set<>は結局二分木ですよね?
map<a,b>も結局(a,b)のペアを二分木に入れたものだから、それをset<pair<string, int>>
と書いてくれたのですよね。
だからpairは要素数2個の配列と同じようなものだということでいいですかね。
0145デフォルトの名無しさん
2009/04/22(水) 03:32:54まあそういうこと。
ちなみに、pairは2つだけど、好きな個数に設定できるのがtuple。
0146デフォルトの名無しさん
2009/04/22(水) 03:43:38set や map の実装が二分木とは限らない。
それもふくめて、一連の解釈についてここで同意を得ることに何の意味があるのかわからん。
0147デフォルトの名無しさん
2009/04/22(水) 06:23:25平衡二分木以外の実装は考えられないけどね。
まあ普通は赤黒木だね。
0148解答テンプレート
2009/04/22(水) 07:11:36とりあえず Linux はコマンドプロンプトで cat、gcc この2つだけ覚えてればいい。
TeraTerm で emacs 使うのはその後でいい。
コピペは $ cat >file.c [Enter]と打った後に貼り付けて、最後にCtrl+D
$ に戻るので、$ cat file.c で「カタカナひらがな漢字」が文字化けしてないか?
$ head file.c | od [Enter] の表示結果をここで待つ。
0149デフォルトの名無しさん
2009/04/22(水) 08:08:360150デフォルトの名無しさん
2009/04/22(水) 09:33:010151デフォルトの名無しさん
2009/04/22(水) 16:28:13nkf -g file.c
してみようぜ
0152デフォルトの名無しさん
2009/04/22(水) 19:17:54関数をマウスオーバーするとちゃんと型やら引数がポップアップされのになぜエラーになるのでしょうか?
0153デフォルトの名無しさん
2009/04/22(水) 19:23:210154デフォルトの名無しさん
2009/04/22(水) 19:27:430155デフォルトの名無しさん
2009/04/22(水) 19:39:420156デフォルトの名無しさん
2009/04/22(水) 22:11:460157デフォルトの名無しさん
2009/04/23(木) 11:40:330158デフォルトの名無しさん
2009/04/24(金) 23:36:42std::ifstream::seekg(ifstream::beg);
std::ifstream::seekg(0, ifstream::beg);
の違いについて質問したものです。上のやつはどっちでも同じ動きだったのですが、
以下のものは1つ目の引数が0のものでないと、ストリームの最後に移動できません。
std::ifstream::seekg(ifstream::end);
std::ifstream::seekg(0, ifstream::end);
このあと、自分で調べてたら解決したので、書いておきます。
Seekgの引数が1個のタイプは、バイトで場所を書かないとだめ。ifstream::endはただの数字の2
なので、上のような書き方をすると、2バイト目の場所に移動してしまう。
コンパイルエラーだしてほしかったよ。
0159デフォルトの名無しさん
2009/04/24(金) 23:39:100160デフォルトの名無しさん
2009/04/24(金) 23:49:17そりゃ引数1個のほうは型がpos_typeだからだ。
pos_typeの値は、tellgで得られるので、それと組み合わせて使われることが意図されているのだろう。
0161デフォルトの名無しさん
2009/04/25(土) 01:24:17ifstream::seekg()という関数と、ifstream::endというのがあれば、
ifstream::seekg(ifstream::end);
って書いてしまいたくなりません?
しかも、(実装依存かもしれませんが)
ifstream::seekg(ifstream::beg);
はちゃんと動くし。
やっぱりちゃんと定義をみないとだめということですかね。
0162デフォルトの名無しさん
2009/04/25(土) 01:39:49そう考えると、beg/cur/endだけを引数に取るものがなくても当然(Cになかったのだから)と思えてくる。
それがいいか悪いかはともかく。
0163デフォルトの名無しさん
2009/04/25(土) 02:16:32ある構造体Xがあったとして
その構造体を主な対象として関数を作ったときに
関数名を void X_Print みたいにアンダーバーを使うのってあんまり良くないでしょうか?
クラスを使いたくないもので・・・
0164デフォルトの名無しさん
2009/04/25(土) 03:04:16派生クラスA'とB'、A''とB''が常に対になるとして
GetVal()の返り値を
構造体にしてダウンキャストすることで渡すのとのと
配列やlistを利用して渡すのはどちらがよいでしょうか
0165デフォルトの名無しさん
2009/04/25(土) 03:10:45A'→B'とA''→B''で渡したい値の数が異なる場合
がぬけてました
0166デフォルトの名無しさん
2009/04/25(土) 04:45:00逆に問おう。何故それがよくないと思うのかね。
>>164
階層ごとにパラメータが異なるのなら、パラメータクラスを作るか設計を見直すべきかと。
0167デフォルトの名無しさん
2009/04/25(土) 04:47:05意味がわからないけど、A::GetValが仮想関数なら
A::GetValの戻り値の型はA',A''::GetValの戻り値の実際の型の
基底クラスにすればFactory Methodになるんじゃないのかな?
名前が納得いかないけど。
0168デフォルトの名無しさん
2009/04/25(土) 06:59:14class A
{
A(int n); //コンストラクタ
}
class B
{
private:
A m_a(100); //Aのコンストラクタに定数100をセットしたメンバ変数のつもり
}
上のようにしてクラスB内でメンバ変数を定義したつもりなのに、
どうもm_aという関数の宣言だと認識されてしまいます。
どうすれば正しく宣言出来るのでしょうか?
ググろうにもシチュエーションが上手く表現出来なくてヒットしません。
よろしくお願いします。
0169デフォルトの名無しさん
2009/04/25(土) 07:24:15コンストラクタの初期化指定で初期化しろ。
0170デフォルトの名無しさん
2009/04/25(土) 07:28:56C++0xではできるようになる。
0171168
2009/04/25(土) 08:07:18Bのコンストラクタ内で初期化する事にします。
0172デフォルトの名無しさん
2009/04/25(土) 09:44:05struct StudentData : PersonData { int id; string school_name; };
みたいにまとめて返したいということじゃないの?
*PersonData返して、school_nameにアクセスしたいけどダウンキャストしないとムリ?って。
同じ型なら配列でもいいけど、返した配列をBで解釈するのはオブジェクト指向に反するような気もする。
0173デフォルトの名無しさん
2009/04/25(土) 14:16:27構造体やポインタがなぜ必要なのかが良く分からないです。
大体の機能は入門書を読んで分かったんですが…
0174デフォルトの名無しさん
2009/04/25(土) 14:21:25少しプログラムを書いてみれば解るようになる。
0175デフォルトの名無しさん
2009/04/25(土) 14:42:25CにポインタがなかったらBASICみたいな不自由さを感じるよ
逆に言えばCはポインタがある事で思った通りにプログラムできる言語と
なっている
使い方を誤ると一見して何をしているか分からないコードになるけど
0176デフォルトの名無しさん
2009/04/25(土) 14:43:270177デフォルトの名無しさん
2009/04/25(土) 14:59:05構造体は関数呼び出しやファイル操作の時に便利だなあ
関連するデータを一度に読み書き出来るし関数の引数が
少なくて済む=バグが出にくくなる
0178デフォルトの名無しさん
2009/04/25(土) 15:56:22>>166
A'→B'ではパラメータa・b・cを
A''→B''ではa・b・d・eを渡したいと思うのですが
どういうクラス設計、受け渡し機構ならすっきりいくでしょうか・・・?
>>167
struct paramという構造体を用意して
param* A::GetVal(){〜〜};としてparamの派生系を渡すと
渡された側がparam*をダウンキャストしないと派生部分が扱えないから・・・ということなのですが
ダウンキャストはしないほうがいいとも言いますしどうなんでしょう?
0179デフォルトの名無しさん
2009/04/25(土) 16:24:52class AD:A{int d();int e();}
class B{virtual void kureA(class A a){b_a=a.a();b_b=a.b();b_c=a.c();}}
class BD:B{virtual void kureA(class AD a){b_a=a.a()〜b_e=a.e();}}
0180デフォルトの名無しさん
2009/04/25(土) 16:56:530181デフォルトの名無しさん
2009/04/25(土) 17:00:340182デフォルトの名無しさん
2009/04/25(土) 17:03:26ちょっと有用なプログラムを書くと
ポインタのポインタとポインタの配列は頻繁に出てくるようになる。
0183デフォルトの名無しさん
2009/04/25(土) 17:15:51rubyといったお猿さん向け言語の存在は罪深いわ。
0184デフォルトの名無しさん
2009/04/25(土) 17:30:500185デフォルトの名無しさん
2009/04/25(土) 17:31:160186デフォルトの名無しさん
2009/04/25(土) 17:46:57業務で使うことはとりあえずはなさそうなのでちょっと練習したいんですが、
初心者向けのいい問題ってありますか?
0187デフォルトの名無しさん
2009/04/25(土) 17:50:12例えばだな
長さの違う文字列を100個ほどランダムで生成して
それを長さでソートするとか
ただし配列はポインタ配列でポインタでソートすること
0188デフォルトの名無しさん
2009/04/25(土) 18:40:48どう書く?orgにいろいろあるよ。
0189デフォルトの名無しさん
2009/04/25(土) 18:53:24void h() { printf("h"); }
void e() { printf("e"); }
void l() { printf("l"); }
void o() { printf("o"); }
void w() { printf("w"); }
void r() { printf("r"); }
void d() { printf("d"); }
void space() { printf(" "); }
これが書けたらポインタの初心者は脱却したと思っていいんじゃないかな。
0190デフォルトの名無しさん
2009/04/25(土) 19:15:12ところで、標準入力から数字(例えば99)を得たい場合に関数を使うと思うんですが、
gets
getchar
fgets
scanf
の使い分けはどうすればいいでしょうか?
0191デフォルトの名無しさん
2009/04/25(土) 19:22:01まず、getsとscanfは使わない。
0192デフォルトの名無しさん
2009/04/25(土) 19:51:41#include <stdio.h>
main()
{
int b = 0;
printf("1桁の数字を入力して下さい。\n");
b = getchar();
printf("%d\n", b);
}
0193デフォルトの名無しさん
2009/04/25(土) 19:53:21printf("%c\n", b); にすればいい。
それは、'9'の文字コードが表示されてる。
0194デフォルトの名無しさん
2009/04/25(土) 19:57:57ありがとう。直りました。
でも変数bは最初にintで定義していて、getcharもintで返すって思ってます。
なぜprintfでint出力する%dが駄目なのでしょう?
ちなみにputcharは使わないほうがいいでしょうか?
0195デフォルトの名無しさん
2009/04/25(土) 20:06:20なぜって言われても。
c = getchar(); で入力された文字の文字コードがcに入る。
printf("%d", c); で文字コードが表示される。
printf("%c", c); で文字コードの文字が表示される。
としか言いようがない。
putchar()でもいいよ。
0196デフォルトの名無しさん
2009/04/25(土) 20:06:58getchar(), putchar(), "%c"は文字を扱う。
一方、"%d"は数値を扱う。
0197デフォルトの名無しさん
2009/04/25(土) 20:10:23そんなレベルの奴が作ったもん納入してもらいたくないわ
恐い恐いw
0198デフォルトの名無しさん
2009/04/25(土) 20:13:58どの関数を使うのが普通なんでしょうか?
教科書にはgetsやscanf,などが普通に使われていますが、実際は
使われていないんですよね。
0199デフォルトの名無しさん
2009/04/25(土) 21:45:00使われてないね。
fegts(s, sizeof s, stdin);
で入力を受け付けて、変換関数を使う。
複雑な書式ならsscanf()あたり。
数値だけならatoi()とか。
エラーチェックをしっかりする必要があるなら strtol()とか。
0200デフォルトの名無しさん
2009/04/25(土) 22:02:36scanf("%s", &buff) も同じ理由。
0201デフォルトの名無しさん
2009/04/25(土) 22:03:42& が余計じゃね?
0202デフォルトの名無しさん
2009/04/25(土) 22:14:49scanf()はscanf("%100s", s)とすればバッファオーバーフローは防げるけど、
サイズを定数で埋め込まないといけないのがダサいな。
0203デフォルトの名無しさん
2009/04/25(土) 22:44:520204デフォルトの名無しさん
2009/04/25(土) 23:20:100205デフォルトの名無しさん
2009/04/25(土) 23:24:000206デフォルトの名無しさん
2009/04/25(土) 23:33:27使い方いまいち分らないんですけど。
どう使うのか教えてください
0207デフォルトの名無しさん
2009/04/25(土) 23:55:51それもまたダサい。
0208デフォルトの名無しさん
2009/04/26(日) 00:24:23scanf()の"%*s"はprintf()の"%*s"とは意味が違う。
>>206
"%99[^\n]"として空白も含む文字列を取得するとか、使い道は色々ある。
0209デフォルトの名無しさん
2009/04/26(日) 23:00:03"%99[^\n]" でなんで空白も含む文字列を取得出来るんですか?
トークン分割取り込みとか出来るんですか? たとえば
AAA BBB CCCC ZZZZ 3333\n
空白をトークンとして
AAA、BBB、CCCC、ZZZZ、3333 を取り込む
マッチする文字列範囲を取り込む
AAA*CCCC とした場合
AAA BBB CCCCを取り込む
とか出来るんですか?
0210デフォルトの名無しさん
2009/04/26(日) 23:02:11マニュアル嫁
0211デフォルトの名無しさん
2009/04/27(月) 02:44:40何を言いたいのか判らん。
>"%99[^\n]" でなんで空白も含む文字列を取得出来るんですか?
除外文字セットで改行文字を指定しているから。
>トークン分割取り込みとか出来るんですか? たとえば
トークンを除外文字に指定すればいい。
>空白をトークンとして
"%[^ ]"でもいいけれど、それなら普通に"%s"でいい気もする。
>マッチする文字列範囲を取り込む
そんな器用なことはできない。
0212デフォルトの名無しさん
2009/04/27(月) 20:31:25どういう発想から変数や関数(およびその引数)、全体のロジックを
決めてるのかさっぱり分かりません。
なきたい…
0213デフォルトの名無しさん
2009/04/28(火) 02:11:353,5,7,9...年経ったらまた読み返してみるといい
0214デフォルトの名無しさん
2009/04/28(火) 02:13:46なら今回は諦めるんだな
0215デフォルトの名無しさん
2009/04/28(火) 02:27:43解らないなら、諦めて
本屋で立ち読みで自分のレベルにあった本をさがせば
0216デフォルトの名無しさん
2009/04/28(火) 17:51:56使用環境はVS2005です
0217デフォルトの名無しさん
2009/04/28(火) 18:13:320218デフォルトの名無しさん
2009/04/28(火) 21:01:17#defineは>>217の通り。
テンプレートはないと思う。 一応、テンプレート中でエラーになったときはどんなテンプレート引数で呼ばれたのか表示してくれたりはするけど。
0219デフォルトの名無しさん
2009/04/29(水) 17:19:20GAPopulation::writeはちゃんと実装されてるのに、GAPopulation::readの実装が空なのはなぜなんでしょう?
ファイルへの書き込みはできるのに、読み込みができないのは不便で仕方ないです。
ファイルからの読み込みはどうやればいいのでしょうか?
0220デフォルトの名無しさん
2009/04/29(水) 18:29:41_SCL_SECURE_NO_WARNINGS を指定すれば出ないと書いてあるのですが、
#pragma warning(disable,4996)
と書いても出ます。どうすればよいでしょうか。
0221デフォルトの名無しさん
2009/04/29(水) 18:30:310222デフォルトの名無しさん
2009/04/29(水) 18:35:150223デフォルトの名無しさん
2009/04/29(水) 18:37:180224デフォルトの名無しさん
2009/04/29(水) 18:39:24ttp://msdn.microsoft.com/ja-jp/library/ttcz0bys(VS.80).aspx
指定の仕方が違うんだろう
0225デフォルトの名無しさん
2009/04/29(水) 18:39:520226デフォルトの名無しさん
2009/04/29(水) 18:47:23お歳はいくつなの?
0227デフォルトの名無しさん
2009/04/29(水) 18:50:41>#pragma warning(disable,4996)
#pragma warning(disable:4996)
カンマじゃなくてコロンみたいだが
0228デフォルトの名無しさん
2009/04/29(水) 19:10:38でもまだ出ます。警告のある呼び出しをやっている箇所のあるファイルごとに
Pragmaを書かないとだめそうです。
>>226
20代後半くらい。
0229デフォルトの名無しさん
2009/04/29(水) 19:20:38全ファイルに効くよ。
0230デフォルトの名無しさん
2009/04/29(水) 19:27:14とやればいいですか?
0231デフォルトの名無しさん
2009/04/29(水) 20:39:28その若さで自分で調べない病に罹患されているようでご愁傷様です。
プロジェクト→C/C++→詳細→指定の警告を無効にする、で 4996 を入力。
0232デフォルトの名無しさん
2009/04/29(水) 22:01:46どうもやり方が色々あるようなので、どれがいいのか知りたいと思って聞きました。
ありがとうございました。
0233デフォルトの名無しさん
2009/04/30(木) 00:16:500234デフォルトの名無しさん
2009/04/30(木) 03:54:39あるんじゃないでしょうか?
ちなみに私はさっき自分でつくりました
あなたの環境に有るかどうかはわかりません
0235デフォルトの名無しさん
2009/04/30(木) 12:20:34オブジェクトを破棄して新規作成するしかないんでしょうか。
また、シングルトンパターンを適用しているオブジェクトに対してはどのように初期化を行えばよいでしょうか。
0236デフォルトの名無しさん
2009/04/30(木) 12:24:360237デフォルトの名無しさん
2009/04/30(木) 12:54:050238デフォルトの名無しさん
2009/04/30(木) 12:54:35何が不満なのかわからん。コード晒せ。
0239デフォルトの名無しさん
2009/04/30(木) 13:03:230240デフォルトの名無しさん
2009/04/30(木) 13:08:52遅らせたい場合は遅らせたい機能を別のクラスにしてコンポジションを使う
初期化関数なんてアンチパターンだよ
0241デフォルトの名無しさん
2009/04/30(木) 13:12:19placement newでできる。
ところで、ふとおもったが、ローカル変数に対して呼び出すのはどうなんだろうな。
こんなの。
struct A
{ } ;
int main()
{
A a ;
a.~A() ;
new(&a) A() ;
}
0242デフォルトの名無しさん
2009/04/30(木) 13:21:09const 掛けた変数が何処にあるかでジッソウイゾンガドウタラコウタラと騒ぎ出す輩への釣餌になるかも知れんが
0243241
2009/04/30(木) 13:31:010244デフォルトの名無しさん
2009/04/30(木) 13:33:410245デフォルトの名無しさん
2009/04/30(木) 13:49:42ってのが気になる
存在してないっていうのはどういう事なのか?
0246デフォルトの名無しさん
2009/04/30(木) 13:52:03大丈夫みたいだよ。
規格の 3.8 Object Lifetime p7 の Example がこうなってる。
[Example:
struct C {
int i;
void f();
const C& operator=( const C& );
};
const C& C::operator=( const C& other)
{
if ( this != &other ) {
this->?C(); //lifetime of *this ends
new (this) C(other); // new object of type C created
f(); //well-defined
}
return *this;
}
C c1;
C c2;
c1 = c2; // well-defined
c1.f(); //well-defined; c1 refers to a new object of type C
?end example]
0247デフォルトの名無しさん
2009/04/30(木) 13:55:21それならデストラクタも自動的に呼ばれるから使えそうな気がするけど。
再初期化なテクニックになるのかな。再初期化テンプレート関数ってのも面白いかもしれないな。
0248241
2009/04/30(木) 13:59:22と思っていたら、こんな文面もあった。
>Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the
>destructor is invoked for an object whose lifetime has ended (3.8). [Example: if the destructor for an automatic
>object is explicitly invoked, and the block is subsequently left in a manner that would ordinarily
>invoke implicit destruction of the object, the behavior is undefined.
うーん、>>241はwell-formedに思えてきた。
ただし、placement newをしている途中に例外を投げたら死ねる。
>>246
おっと、そんなものが。
大丈夫そうだね。
0249241
2009/04/30(木) 14:03:41その辺も気になったんだよね。あくまで妥当なオブジェクトが存在しなくなると言う意味だけならいいんだが。
オブジェクトを載せているメモリはどうなるのか。
デストラクタはそのオブジェクトのスコープの終わりに自動的に呼び出されるのであって、
その間、オブジェクトがどう扱われようと関係なく呼び出されるらしいが、
>and the block is subsequently left in a manner that would ordinarily
>invoke implicit destruction of the object
となっているから、メモリはスコープの終わりまで残るものと考えていいのか。
0250デフォルトの名無しさん
2009/04/30(木) 14:05:500252235
2009/04/30(木) 14:38:180253デフォルトの名無しさん
2009/04/30(木) 14:49:44それぞれ別メソッド用意して明示的に呼び出したほうが後々楽だよ
0254デフォルトの名無しさん
2009/04/30(木) 14:49:55それじゃ、ふつうに新しいオブジェクトを作ればいいとしか言えないな。
まだ話を続けたいなら >238
0255デフォルトの名無しさん
2009/04/30(木) 14:51:01なんで「ゲーム作る」という条件でそんなところの方針が変わるんだ?
0256デフォルトの名無しさん
2009/04/30(木) 14:53:26そっちの本職だから。
他の分野のことは確定的に言えないし
0257デフォルトの名無しさん
2009/04/30(木) 14:57:58パフォーマンスの問題?
リソースの問題? (狭いメモリ空間で断片化を極力避けたい とか)
0258デフォルトの名無しさん
2009/04/30(木) 14:58:06別にあんたの身分はどうでもいいよ。
コンストラクタとデストラクタを使わないほうがいい理由って何なの?
一般的には >240 にもあるように初期化関数なんてバグの元でしかないんだが。
せっかくデストラクタで自動になった破棄まで明示的な関数呼び出しにするなんて
正気の沙汰とは思えない。
0259デフォルトの名無しさん
2009/04/30(木) 15:04:34あとは無理矢理再利用したいときが多々あるくらいで
これらはメモリが足りないということを回避するために
バッファはstaticで確保しておくことも関係するかも
(デバッグの手間を省くため)
まぁ余計な一言だったらしいから完全撤回して以後黙る
0260259
2009/04/30(木) 15:08:35実行順番というより実行タイミングだ
それぞれグローバルに置いた時のね
0261デフォルトの名無しさん
2009/04/30(木) 15:14:57if(status.dead) status = data(status.stage_value);
みたいにするんじゃないかな
0262デフォルトの名無しさん
2009/04/30(木) 15:18:57いろいろ突っ込みどころがあるような気がするけど、撤回して黙るってことなんで、もういいや。
0263デフォルトの名無しさん
2009/04/30(木) 15:19:480264デフォルトの名無しさん
2009/04/30(木) 15:42:16明示的なデストラクタ呼び出しによってすでに生存期間の終了したオブジェクトに対して
スコープアウトでのデストラクタ呼び出しが行われ、その結果として未定義動作に入る。
0265デフォルトの名無しさん
2009/04/30(木) 15:47:520266デフォルトの名無しさん
2009/04/30(木) 16:16:30死亡時にスコープから出るようにしてやればきれいさっぱりなくなるんじゃないか。
0267デフォルトの名無しさん
2009/04/30(木) 18:57:38どうも説明を読んでも分かったような気にはなるのですが、いい例がなかなか見つからず、
ピンときません。どうかお願いします。
0268デフォルトの名無しさん
2009/04/30(木) 23:33:510269デフォルトの名無しさん
2009/04/30(木) 23:42:460270デフォルトの名無しさん
2009/05/01(金) 00:54:30これは何をしてるの?
0271デフォルトの名無しさん
2009/05/01(金) 00:57:100272デフォルトの名無しさん
2009/05/01(金) 01:05:49class ostream;
template< class S, class T> class Hoge;
template<class S, class T>
ostream &operator << (ostream&, const Hoge<S, T>&);
これは何をしてるのでしょうか?
0273デフォルトの名無しさん
2009/05/01(金) 01:11:390274デフォルトの名無しさん
2009/05/01(金) 01:16:300275デフォルトの名無しさん
2009/05/01(金) 02:12:20void func1(char *format, ...)
{
func2(format)
}
void func2(char *format, ...)
{
va_list ap;
va_start(ap, format);
0276デフォルトの名無しさん
2009/05/01(金) 02:17:59C言語の可変引数の関数について質問があります。
以下のように可変引数の関数を入れ子にして、
func2()の中でvfprintfを実行するとSegmentationFaultになります。
何が問題なのでしょうか?よろしくお願いします。
void func2(char *format, ...)
{
va_list ap;
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
}
void func1(char *format, ...)
{
va_list ap;
va_start(ap, format);
func2(format, ap);
va_end(ap);
}
int main()
{
char *str = "test";
int i = 1000;
func1("%s %i\n", str, i);
return 0;
}
0277デフォルトの名無しさん
2009/05/01(金) 03:23:24これでいいだろ。
void func2(char *format, va_list ap)
{
vfprintf(stdout, format, ap);
}
0278デフォルトの名無しさん
2009/05/01(金) 04:55:19observableが実数で、observerが関数の引数として渡されているような、そんなソース
(すごく分かりにくい)を渡されて、機能追加するように言われたのですが、ぜんぜん進捗が
ありません。
observableとなっている実数が変更されると、関数がよばれて再計算が行われるように
なっているようなのですが。
サンプルじゃなくてもいいので、Observerパターンがどういう場合に使われるのが教えてください。
ちなみに自分のデザインパターンの知識は、ストラテジーと、シングルトンくらいです。
0279デフォルトの名無しさん
2009/05/01(金) 05:18:06ダイアログバーをツールボックスのように使用しており、
メニューから該当ツールボックスの表示非表示をして、なおかつ該当メニューにチェックのONOFFを入れる
処理は完成しました。
ここで行き詰ったのですが、ダイアログバーの×ボタンを押した時に表示状態の整合性が取れなくなってしまいます。
これはどういうイベントに対する処理を入れるべきでしょうか?SPY++を使うと自分のPCがフリーズしてリセットボタンしか対応策なくなるので
使うのをやめてます。
また、メニューからの表示非表示はShowControlBar関数を使用してますが、
その関数使用することで×ボタン押下時と同じ処理が走ってしまうのではないかとも思ってます。
ググってみてもメッセージをフックするやらなんやら難しそうな事が書いてありますが、
ツール作成者なら誰でも躓きそうな問題だと思うのですが簡単に解決する方法はありますでしょうか?
×ボタン自体は残して機能させたいと考えています。
よろしくお願いします。
0280デフォルトの名無しさん
2009/05/01(金) 07:41:34あるオブジェクトがあり、それは可変個の子オブジェクトを持っている。
加えてそれらのオブジェクトが持つ内部状態の計算は複雑なのでupdateメンバ関数で行うとする。
子の状態は親の状態に依存しているので、親オブジェクトの状態を変更したら
子オブジェクトの状態も変更しなければならない。
当然、親のupdateから子のupdateも呼び出させるようにするだろう。
これでObserverパターンの出来上がり。
ぶっちゃけ新聞配達パターン(登録&配信)に改名したほうがいいと思う。
0281デフォルトの名無しさん
2009/05/01(金) 07:48:19Observerパターンの典型的な実装は次の通り。
(2.で通知するときにObservableを引数とすることもある)
1.Observable(監視可能なオブジェクト)にObserver(監視役)をAdd
2.Observableに変更があった場合、1.で追加したObserverに対して、Observable内から通知
実際のアプリで言うと、モデル(データの実体を持つオブジェクト)と
ビュー(データを表示するオブジェクト)がObservableとObserverの
関係になることが多いかな。
データが変更されたらビューに通知してもらい、ビューは変更された
データの内容に基づいて表示内容を更新する、という具合。
下記も参考に。
http://ja.wikipedia.org/wiki/Observer_パターン
0282デフォルトの名無しさん
2009/05/01(金) 09:07:48MFCスレへどうぞ。
0283276
2009/05/01(金) 10:46:38その方法は知っているのですが、入れ子にしたい場合に
どのようにすればいいのか分からないです。
va_arg()で1つずつfunc2NO
0284276
2009/05/01(金) 10:59:42その方法は知っているのですが、入れ子にしたい場合に
どのようにすればいいのか分からないです。
va_arg()で1つずつパラメータをfunc2の引数として
指定するしかないのでしょうか?
0285デフォルトの名無しさん
2009/05/01(金) 11:11:410286デフォルトの名無しさん
2009/05/01(金) 11:33:00可変長引数の関数を別の可変長引数の関数から再利用したいなら
va_list を受け取るバージョンが必要。
それが要らないんなら標準に vfprintf() が存在する理由も無かっただろうね。
0287276
2009/05/01(金) 11:48:03ちょっと経緯を話しますと、func2がC++のクラスメソッドとしてあって、
それをC言語からどう呼び出すんだ?というのが疑問でした。
もしfunc2もC言語の関数だったら直接呼ぶんですけど…。
無理やり入れ子でやるとしたらマクロ関数を噛ますしか思いつきません。
#define fnc1(format, ...) func2(format, __VA_ARGS__)
0288デフォルトの名無しさん
2009/05/01(金) 12:08:03va_list を受け取るバージョンを追加すればいいじゃないか。
それが無理だとしても C でマクロ使うことに何か不満でもあるの?
ついでに、その __VA_ARGS__ の使い方だと fnc1("x") みたいに呼び出したときに
エラーになるよ。
0289276
2009/05/01(金) 12:32:54マクロ関数は引数の型があいまいなので、
個人的に使いたくないだけです。
>ついでに、その __VA_ARGS__ の使い方だと fnc1("x") みたいに呼び出したときに
>エラーになるよ。
そうなんですか?そうすると、、、
va_listを引数に持つメソッドを用意してもらって、
さらにそれをC言語で使うためのラッパー関数を作る、
それしか方法がなさそうですね。
0290デフォルトの名無しさん
2009/05/01(金) 12:41:33可変長引数使うところで型があいまいとか、中途半端なところ気にするのね。
__VA_ARGS__ の話は「使い方」さえ修正すれば問題ないよ。
結局のところ最善の選択肢に落ち着いたみたいなんで、それでいいんだけど。
0291デフォルトの名無しさん
2009/05/01(金) 12:58:30>ちょっと経緯を話しますと、func2がC++のクラスメソッドとしてあって、
>それをC言語からどう呼び出すんだ?というのが疑問でした。
C++で可変長引数関数を定義しようというのがそもそも間違ってない?
0292デフォルトの名無しさん
2009/05/01(金) 13:12:09書式指定が使えたほうがいいことはあるかもしれない。
0293デフォルトの名無しさん
2009/05/01(金) 13:12:21--
typedef struct {
char item_id[ITEM_ID_LENGTH];
someType someMember;
};
int CompareItemId(const void * a, const void * b)
{
return strcmp((char *) a, ((ITEM_t *) b)->item_id);
}
--
このように呼び出すのって、keyと各要素の型が違うけど合法なんだろうか。
--
ITEM_t * pnt = (ITEM_t *) bsearch("item name", itemTable, numItem, sizeof(ITEM_t), CompareItemId);
--
実は移植する羽目になったこのソース、bsearch()の前にソートしていないと言う異常品。
移植前に本当に動いてたのか些か疑問なのだが、案外入力は運用でソート済みのデータしか与えてなかったのかもしれない。
移植に当たっては(明文化されていない)運用制限はなくさないといけないのでqsort()を掛けるのだけど、
qsort()ではこの比較関数を使うわけにはいかないしねぇ。
0294デフォルトの名無しさん
2009/05/01(金) 13:19:24問題ない。
比較関数の第1引数が bsearch() に渡されたキーで、第2引数が配列要素を指すって決まってる。
7.20.5.1 The bsearch function
void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
...
The comparison function pointed to by compar is called with two arguments that point
to the key object and to an array element, in that order.
0296デフォルトの名無しさん
2009/05/01(金) 13:36:37おそらくほとんどの処理系において
typedef struct {
char item_id[ITEM_ID_LENGTH];
someType someMember;
}ITEM_t;
ITEM_t a;
のとき(型は違うが)アドレスは &a == a.item_id になるから大丈夫なだけであって
本来は第一引数の型は ITEM_t * でなければならない
0297デフォルトの名無しさん
2009/05/01(金) 13:41:52qsort の比較関数と bsearch の比較関数は同じものを使う
というかbsearch は同じ比較関数でソート済みのデータに対してのみ正しく動作する
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/bsearch.3.html
だから、新しく作っちゃダメ
bsearch の比較関数を修正すべき
0298294
2009/05/01(金) 14:04:51何を根拠にそんなことを言うのかね?
294 で引用した箇所より少し後にある配列に対する要件は以下のとおり。
The array
shall consist of: all the elements that compare less than, all the elements that compare
equal to, and all the elements that compare greater than the key object, in that order.
んで、それに添えられた「注釈」にこうある。
In practice, the entire array is sorted according to the comparison function.
要件を単純なソート済みというものよりも緩くして、引数の順番に対する規定も合わせて、
>293 のような使い方を意図的に認めていると考えられる。
リンクされたドキュメントを見ると Linux ではダメなのかもわからんけど、 C99 準拠と
書いておきながら要件が厳しくなってるのはおかしい。
0299デフォルトの名無しさん
2009/05/01(金) 14:29:18#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int id;
char name[100];
}ITEM_t;
int compare_id(const void *a, const void *b){
ITEM_t *x=(ITEM_t*)a, *y=(ITEM_t*)b;
return x->id-y->id;
}
int compare_name(const void *a, const void *b){
ITEM_t *x=(ITEM_t*)a, *y=(ITEM_t*)b;
return strcmp(x->name, y->name);
}
int main(void){
ITEM_t data[]={{4,"apple"},{1,"banana"},{3,"grape"},{2,"cherry"},{5,"orange"}};
ITEM_t key={5, "banana"}, *p;
qsort(data, 5, sizeof(ITEM_t), compare_id);
p=bsearch(&key, data, 5, sizeof(ITEM_t), compare_id);
if(p) printf("%d %s\n", p->id, p->name);
qsort(data, 5, sizeof(ITEM_t), compare_name);
p=bsearch(&key, data, 5, sizeof(ITEM_t), compare_name);
if(p) printf("%d %s\n", p->id, p->name);
return 0;
}
0301デフォルトの名無しさん
2009/05/01(金) 14:37:50>>293 のままだと >>293 の構造体
typedef struct {
char item_id[ITEM_ID_LENGTH];
someType someMember;
}ITEM_t;
を次のように変数の宣言順序を変更すると正しく動作しなくなる
typedef struct {
someType someMember;
char item_id[ITEM_ID_LENGTH];
}ITEM_t;
ってのがいいたかった
0304デフォルトの名無しさん
2009/05/01(金) 15:04:210305デフォルトの名無しさん
2009/05/01(金) 15:09:18インライン指定自体に余り意味がありません。
>>301
>295は別の関数を用意すると言っているのだから大丈夫だろ。
0306294(=298)
2009/05/01(金) 15:17:08↓こんなん出たけど、これが何か?
5 orange
1 banana
>>301
C99 規格に沿った実装の範囲であればそんなことにはならないはずなんだけど、
何を根拠にそんなことを言うの?
0307デフォルトの名無しさん
2009/05/01(金) 15:17:59他の関数と同じ。コピーコンストラクタだからって何も変わらない。
0309デフォルトの名無しさん
2009/05/01(金) 23:46:39そして自分はstring型を使いたいのですが、string型はconst char *型と
認識されてその関数に渡せません
何か解決する方法があるでしょうか?
0310デフォルトの名無しさん
2009/05/02(土) 00:04:07変更するならstringを使うべきではない。
0311デフォルトの名無しさん
2009/05/02(土) 00:04:33もうちょっと日本語をだな…
0312デフォルトの名無しさん
2009/05/02(土) 00:05:59俺だったらc_str()をstrlen()+1でnewかけてそれを関数に渡した後
帰ってきたらdeleteするな
返す必要がないならauto_ptrという手もあるし
あ、でも呼び出し先の関数は変更できないのか
0313デフォルトの名無しさん
2009/05/02(土) 00:07:25auto_ptrはnew[]したメモリを正しく解放できない。
0314デフォルトの名無しさん
2009/05/02(土) 00:09:32あっそうかペチ
0315デフォルトの名無しさん
2009/05/02(土) 00:10:30stringが便利なのでできればstringで統一したかったんですが・・・
0316デフォルトの名無しさん
2009/05/02(土) 00:12:040317デフォルトの名無しさん
2009/05/02(土) 00:13:260318デフォルトの名無しさん
2009/05/02(土) 00:16:44大抵はstringで同じ事をする方法がC++に用意されてるからそんな物使うな
0319デフォルトの名無しさん
2009/05/02(土) 00:20:28大変ためになりました
0320デフォルトの名無しさん
2009/05/02(土) 00:21:250321デフォルトの名無しさん
2009/05/02(土) 00:37:25// vecに色々とpush_back()
std::list<int> li;
std::copy(forward_iterator(li), vec.begin(), vec.size());
ベクタからリストに要素をコピーしようとしてこう書いたのですが、コンパイルできません。
どうしてでしょうか?
0322デフォルトの名無しさん
2009/05/02(土) 00:40:160323デフォルトの名無しさん
2009/05/02(土) 01:02:06ありがとうです。できました。
0324デフォルトの名無しさん
2009/05/02(土) 01:15:36std::list<int>の中にユニークな数字が入っている時に、与えられた数字を検索する場合、
イテレータを使ってForループを見つかるまでまわして検索するよりも、std::find()を
使ったほうが速い(手元のノートブックだと3倍くらい)ような結果になるのですが、
なにか間違ってるでしょうか?
重ね重ねすいません。
0325デフォルトの名無しさん
2009/05/02(土) 01:23:460326デフォルトの名無しさん
2009/05/02(土) 01:35:17#if 1
std::list<int>::iterator p = std::find(li.begin(), li.end(), i);
#else
for (std::list<int>::iterator p = li.begin(); p != li.end(); ++p){
if (*p == i){break;}
}
#endif
}
測定したのはこんな感じのコードなんですけど、、、アホなコードにはなってないですよね?
0327デフォルトの名無しさん
2009/05/02(土) 01:46:31最適化に都合いいからじゃね?
0328デフォルトの名無しさん
2009/05/02(土) 02:08:04for (std::list<int>::iterator p = li.begin(), end = li.end(); p != end; ++p){
のようにすると、毎回list::end()を参照するコストが無くなる(std::find()はそうなっている)が
これが原因かどうかは知らん。
0329デフォルトの名無しさん
2009/05/02(土) 02:45:24std::list<int> li(vec.begin(), vec.end());
または
std::list<int> li;
li.assign(vec.begin(), vec.end());
0330デフォルトの名無しさん
2009/05/02(土) 13:31:30cout
cin
のcってなんの言葉の略なんですか?
0331デフォルトの名無しさん
2009/05/02(土) 13:35:460332デフォルトの名無しさん
2009/05/02(土) 13:36:19console
0333デフォルトの名無しさん
2009/05/02(土) 13:42:08>The header <iostream> declares objects that associate objects with the standard C streams provided for
>by the functions declared in <cstdio> (27.8.2).
って書いてあるんで、実はそのまま C なのかもしれない。
0334デフォルトの名無しさん
2009/05/02(土) 13:44:46http://www.research.att.com/~bs/bs_faq2.html#cout
> The "c" stands for "character" because iostreams map values to and from byte (char) representations.
"character" らしいぜ。
0335デフォルトの名無しさん
2009/05/02(土) 13:45:06という意味のstandard C streamsなのかな?
0336デフォルトの名無しさん
2009/05/02(土) 13:46:000337330
2009/05/02(土) 13:55:25C++でした・・
普通に間違えた^^;
>>334
"character"が一番しっくり来ますね
みなさんありがとうございました
0338デフォルトの名無しさん
2009/05/02(土) 14:14:01TCHAR の文字列の長さを取得する際に _tcslen を使用しています
Unicode 文字セットを使う環境の場合は、正常に文字数が取得できますが
マルチバイト文字セットを使う環境では、strlen の動作になるので
文字数ではなく、全角文字を2バイトとするバイト数取得になってしまいます
TCHAR から環境に依存せず文字数を取得する関数、マクロなどは
SDKで提供されていますでしょうか?
よろしくお願いします
0339デフォルトの名無しさん
2009/05/02(土) 14:19:19おとなしく変換すれば?
0340デフォルトの名無しさん
2009/05/02(土) 14:20:55たぶん無いと思う。
ネットとかでジェネリックテキスト(TCHARとか)使えって薦めてる人をよく見るけど、
WCHARとか_wcs系を使ってワイド文字だけ対応のほうがいいと思う。
0341デフォルトの名無しさん
2009/05/02(土) 14:22:130342338
2009/05/02(土) 14:31:56取りあえず、マルチバイト環境の場合は
wchar_t に変換してから文字数取得するようにしてみます
ありがとうございました
0343デフォルトの名無しさん
2009/05/02(土) 14:58:00[A] for (int i = 0; i < n; i++)
のように書いてあるのですが、友達に聞いたらこれはC++やJavaの
書き方で、Cでは
[B] for (i = 0; i < n; i++)
みたいに書かなくてはいけないということでした。これは大学の先生が
間違ってるということでしょうか。確かにいくつかの本をみても[A]
みたいな書き方はしていませんし、コンパイラもエラーを出します。
0344デフォルトの名無しさん
2009/05/02(土) 14:59:46新しい規格だとAでも書ける。
0345デフォルトの名無しさん
2009/05/02(土) 15:06:180346デフォルトの名無しさん
2009/05/02(土) 15:07:57Aみたいな書き方はC99という比較的新しいC言語の規格によるものです。
でもまだサポートしていないコンパイラも多いので、多くの人は昔ながら
の書き方で書いています。
授業の資料にコンパイルの仕方が書いてありませんか?
0347デフォルトの名無しさん
2009/05/02(土) 15:08:460348デフォルトの名無しさん
2009/05/02(土) 15:12:38参考書が少なくて苦労したことを思い出した。
まあ、がんばって勉強してくれ >>343
0349デフォルトの名無しさん
2009/05/02(土) 15:18:44{
int i = 0;
for(;i<n;++i){
}
}
0350343
2009/05/02(土) 15:30:21gcc -std=c99
のようにせよと書いてありました。お騒がせしてすみません。
ただ手元にはLSI-C86試食版というコンパイラしかなくて、
これではうまくいかないようです。
0351デフォルトの名無しさん
2009/05/02(土) 15:43:16大学ではgccを使ってるみたいだから、MinGWかCygwinにしてgccを
いれた方がいいと思うよ。
0352デフォルトの名無しさん
2009/05/02(土) 16:01:40聞いたので、整数は
const int STR_MAX = 256;
とこのように定義したんですが、文字列を定義するときはどうするのが
一番良いですか?
#defineを使うのが一番ですか?
0353デフォルトの名無しさん
2009/05/02(土) 16:06:500354デフォルトの名無しさん
2009/05/02(土) 16:24:29char *p = "test";
*(p+1) = '*'; //or p[1]='*';
のようにしたら実行時エラー(?)になって代入のところで止まってしまいます。
char p[] = "test";
*(p+1) = '*'; //or p[1]='*'
のように配列で宣言すると正常に動作するようです。
文字列(のアドレス)で初期化したポインタでは操作はできないのでしょうか?
環境はWindowsVista、MinGWで、C++でコンパイルしています。
0355デフォルトの名無しさん
2009/05/02(土) 16:31:18(const) char *p = "test";
これは定文作成
char p[] = "test";
これは配列作成、初期化
0356デフォルトの名無しさん
2009/05/02(土) 16:36:49文字列リテラルの書き換えは未定義動作なので、
そのような操作をしてはダメ
0357デフォルトの名無しさん
2009/05/02(土) 16:53:26ご回答、ありがとうございます。
なるほど、データの確保方法が違うためなんですね。
未定義動作になっているということでスッキリしました。
配列のほうで作成するようにします。
関数の引数でもらったポインタについて、どちらで作られたデータか
を判別する方法はあるんでしょうか?
0358デフォルトの名無しさん
2009/05/02(土) 17:00:30書き換えちゃいけないやつは const を付ける。
付いてなければ書き換えていい。
0359デフォルトの名無しさん
2009/05/02(土) 17:27:11コンパイラが勝手に const はずししてしまう変換を「死の変換」と呼んでいた。
ところで、こういう初歩的な問題で苦悩する初心者を見るにつけ
やはり K&R はバイブルだと感じる。
K&Rではちゃんとこの問題について注意が喚起されている。
(5.5 文字ポインタと関数 p.127-128 あたり)
0360デフォルトの名無しさん
2009/05/02(土) 17:42:55をコンパイルエラーにしないC、つまりK&Rがアホってことだろ
0361デフォルトの名無しさん
2009/05/02(土) 17:48:450362デフォルトの名無しさん
2009/05/02(土) 17:49:170363デフォルトの名無しさん
2009/05/02(土) 17:49:350364デフォルトの名無しさん
2009/05/02(土) 17:50:40だって、昔のCは実際に書き換えできるのが当然だったんだから。
そもそもK&Rの時代にはconstなんて無かったし。
導入されたのは最初にANSIドラフトが発表されてから。
0365デフォルトの名無しさん
2009/05/02(土) 17:53:000366デフォルトの名無しさん
2009/05/02(土) 17:56:17文字列リテラルは書き換え可能。const自体無し。
・C89以降
文字列リテラルは書き換え不可領域に置くことが許される。
過去の資産との互換性から、強制const化は見送り。
・C++
何故か、強制const化しなかった。
void*からのキャスト等は強制されるようになったのに。
0367デフォルトの名無しさん
2009/05/02(土) 18:00:45const char* p = "Any";
と char *p = "Any";
は違う動作をして当然だよな
0368デフォルトの名無しさん
2009/05/02(土) 18:01:23三日もあれば読める本なんだから、読んで損はない。
0369デフォルトの名無しさん
2009/05/02(土) 18:02:110370354
2009/05/02(土) 18:18:151990年くらいにプログラミング言語Cは読んだのですが、それ以来ゆるい言語しか
使わずふやけたプログラムばかり書いていたので、すっかり忘れてしまってます。
もう一度初心に帰って基本から学びなおそうと思います。
皆さんありがとうございました。
0371デフォルトの名無しさん
2009/05/02(土) 18:21:25char *p = "test";
*(p+1) = '*'; //or p[1]='*';
がOKな環境ってあるのか?
0372デフォルトの名無しさん
2009/05/02(土) 18:23:48許可するしかなかったんだろ。今更愚痴っても仕方ねえよ。
>>367
その認識は間違っている。
コンパイラが暗黙のうちにconstを外すキャストをしていると見るべき。
本来constだったポインタに書き込んだら、どうなろうと自己責任。
0373デフォルトの名無しさん
2009/05/02(土) 18:25:12×非constなポインタ
○非constなcharへのポインタ
0374デフォルトの名無しさん
2009/05/02(土) 18:39:07char *p = _p;
というのを裏でこっそりやるのは無理だったのかな
0375デフォルトの名無しさん
2009/05/02(土) 18:57:56K&Rは初版と第2版で全然違う。
第2版は、ANSIドラフト後に改定されたもので、C89とほぼ一致するが
初版はまったく違う。
「K&RのC」とは、初版の時代の「標準規格が無かった時代のC」を指す。
0376デフォルトの名無しさん
2009/05/02(土) 20:08:120377デフォルトの名無しさん
2009/05/02(土) 20:55:00ここは初心者歓迎スレだぞ
初心者に優しくない基地はこのスレでは荒らし
どっか別のスレで基地ろだ
0378デフォルトの名無しさん
2009/05/02(土) 21:43:19unsigned Data1:8*3;
unsigned Data2:8*3;
unsigned Data3:8*3;
unsigned Data4:8*3;
} TestStrct;
TestStrct TestSt;
このときのsizeof(TestSt)の数値を12と期待したのですが16になりました。
12になる書き方はありますか?
環境はVC2008+XPです。
0379デフォルトの名無しさん
2009/05/02(土) 21:57:150380デフォルトの名無しさん
2009/05/02(土) 21:59:400381デフォルトの名無しさん
2009/05/02(土) 22:01:15アラインされてるんじゃないの?
VC2008ならやってみてないけど __declspec(align(8))
で行けそうな気がするけど
0382デフォルトの名無しさん
2009/05/02(土) 22:04:000383デフォルトの名無しさん
2009/05/02(土) 22:15:550384デフォルトの名無しさん
2009/05/02(土) 22:16:37typedef struct __declspec(align(8)) {
省略
と試してみましたが結果は変わりませんでした。
諦めて1バイトづつ読み込んで計算することにします。
ありがとうございました。
0385デフォルトの名無しさん
2009/05/02(土) 22:25:17どうせx86限定で、データのエンディアン等に依存しているんだろうから。
0386デフォルトの名無しさん
2009/05/02(土) 22:29:090387デフォルトの名無しさん
2009/05/02(土) 22:30:460388デフォルトの名無しさん
2009/05/02(土) 22:56:440389デフォルトの名無しさん
2009/05/02(土) 22:59:210390デフォルトの名無しさん
2009/05/02(土) 23:06:17お前らもプリン好きだろ
0391デフォルトの名無しさん
2009/05/02(土) 23:07:190392デフォルトの名無しさん
2009/05/03(日) 03:56:18で
warning C4800: 'BOOL' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)
が出るんですがどういうことですか?
0393デフォルトの名無しさん
2009/05/03(日) 04:14:26とりあえず何のコンパイラでのコンパイラ書け
0394デフォルトの名無しさん
2009/05/03(日) 04:18:20すいません警告行は
findFlag = fileFind.FindNextFile();
からでした。どういうことですか?
0395デフォルトの名無しさん
2009/05/03(日) 05:09:13ということです。
0396デフォルトの名無しさん
2009/05/03(日) 10:55:17boolかtrueが#defineされてないか確認してごらん。C++では#defineされてなくても使える。
0397デフォルトの名無しさん
2009/05/03(日) 12:18:34リターン値がboolじゃなくてBOOLだな > FindNextFile()
0398デフォルトの名無しさん
2009/05/03(日) 12:36:50breakがswitch内にとらわれてしまうので、gotoでループ構文直後にジャンプするしかないですか。
0399デフォルトの名無しさん
2009/05/03(日) 12:44:20gotoにするか、switchをifにするか。
0400デフォルトの名無しさん
2009/05/03(日) 12:45:35そのとーり。
0401デフォルトの名無しさん
2009/05/03(日) 12:49:560402デフォルトの名無しさん
2009/05/03(日) 12:52:000403デフォルトの名無しさん
2009/05/03(日) 13:44:48禁止だそうなのですが、マルチスレッドの代替ってありますか?
会社の偉い役職のアーキテクト?とかいう人がそういってました
0404デフォルトの名無しさん
2009/05/03(日) 13:47:140405デフォルトの名無しさん
2009/05/03(日) 14:35:38> C++ではマルチスレッドは危険
ということはない。マルチスレッドの塊にようなJava本体だってC++で書かれてんだぞ。
その言葉は、正確には「能力の低いプログラマにC++でマルチスレッドプログラムを書かせると危険」だろう。
0406デフォルトの名無しさん
2009/05/03(日) 15:08:52> C++ではマルチスレッドは危険なので
# (日本語の不自由なお前たちに)C++ではマルチスレッド(を使うプログラムを書かせるの)は危険なので
0407デフォルトの名無しさん
2009/05/03(日) 16:30:06って聞いて来い。上でOK出なければなに選んでも無駄になるだろ。
0408デフォルトの名無しさん
2009/05/03(日) 16:36:51> 正確には「能力の低いプログラマにC++でマルチスレッドプログラムを書かせると危険」
「重要な部分とそうでない部分を切分けて設計できるアーキテクトが居ないと
危険」とも言えるな。
0409デフォルトの名無しさん
2009/05/03(日) 16:42:390410デフォルトの名無しさん
2009/05/03(日) 16:48:490411デフォルトの名無しさん
2009/05/03(日) 17:40:32マルチスレッドを理解してないとどんな言語を使っても危険。
Windowsなら重複I/Oでマルチスレッドを使わずに並列処理ができるよ。
0412デフォルトの名無しさん
2009/05/03(日) 18:08:44変数のアクセス順序を気にするだけじゃん
0413デフォルトの名無しさん
2009/05/03(日) 18:20:360414デフォルトの名無しさん
2009/05/03(日) 18:25:280415デフォルトの名無しさん
2009/05/03(日) 18:26:090416デフォルトの名無しさん
2009/05/03(日) 18:36:32そういうことを気にする必要がありません。
C++は危険極まりない言語ですね。
0417デフォルトの名無しさん
2009/05/03(日) 18:46:07クションの整合性を保とうと思うとあまり嬉しくない。
C++ だとロックオブジェクトをスコープ宣言して割と簡単かつ明示的に排他で
きるんで重宝してる。ロックオブジェクトは一発めはスピンロックで、取れな
かったらキューにいれるとかさ。
synchronized は重いんだよね。AtomicInteger 辺りを使うといいんだっけか。
0418デフォルトの名無しさん
2009/05/03(日) 18:58:15とか自信満々に抜かす輩が蔓延ってるからなぁ
0419デフォルトの名無しさん
2009/05/03(日) 19:11:100420デフォルトの名無しさん
2009/05/03(日) 19:16:12備えてて当然
0421デフォルトの名無しさん
2009/05/03(日) 19:34:58Javaでも危険すぎる。
C++は話にならない。
0422デフォルトの名無しさん
2009/05/03(日) 20:11:030423デフォルトの名無しさん
2009/05/03(日) 20:32:49安全な道を進めないことを嘆いても何も始まらない
それがじんせー
0424デフォルトの名無しさん
2009/05/03(日) 21:06:38____
/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ Javaはライブラリが全部やってくれるからデッドロックなんて絶対に起こらない!
| |r┬-| |
\ `ー'´ /
ノ \
/´ ヽ
___
/ \
/ノ \ u. \ !?
/ (●) (●) \
| (__人__) u. | クスクス>
\ u.` ⌒´ /
ノ \
/´ ヽ
____
<クスクス / \!??
/ u ノ \
/ u (●) \
| (__人__)|
\ u .` ⌒/
ノ \
0425デフォルトの名無しさん
2009/05/03(日) 22:04:07ここはお前の来る所じゃないぞ
0426デフォルトの名無しさん
2009/05/04(月) 03:51:16それとも可能な限り変数を使いたい関数ごとに変数を導き出す処理を書いて独立性を強くしたほうがいいんでしょうか?
いつも同じ値になる変数をメインの部分で一回だけ計算してそれを参照して関数内で使ってるんですが、関数の再利用とかしたことないんです
これ重要ですか?どうすればいいですか?
0427デフォルトの名無しさん
2009/05/04(月) 04:09:120428デフォルトの名無しさん
2009/05/04(月) 04:16:48がちがちにいろいろなところを参照するよりは多少計算がダブっても独立性を強くしたほうがいいと思いますか?
0429デフォルトの名無しさん
2009/05/04(月) 04:29:49簡単に書くとこんな感じでいいんじゃないか?
int hoge(int index){
static int table[N];
if(!table[index]) table[index]=calc(index);
return table[index];
}
0430デフォルトの名無しさん
2009/05/04(月) 04:30:38関数内で計算結果をstatic変数に置いておいて、変更がなければそのまま返すようにすればいいと思う
0431デフォルトの名無しさん
2009/05/04(月) 04:42:02その計算がそうとうな負荷にならない限り
余計な小細工はしないほうがいい
呼び出される回数だとか実行時間は
プロファイラを使えば大体分かる
0432デフォルトの名無しさん
2009/05/04(月) 04:53:06自分なんかコード書く時行数の節約とかメモリの節約とかが先に来るんですが、再利用性が異常に低いというか
なんか他のところでも使える気がしないんです。
やはり相当重い計算がダブることが無い限りは何度も同じコードを書くべきですよね
でもなんか同じ部分を抜きだして関数にまとめてしまって結局いつのまにか関数どうしが網の目のようになって独立できないんです
もっと細かく関数を1目的づつに分割して、ブロックを組み合わせるようなプログラミングができるようようにはやくなりたいです
0433デフォルトの名無しさん
2009/05/04(月) 04:56:12何度も同じコードを書くのはできる限りやめておけw
0434デフォルトの名無しさん
2009/05/04(月) 09:39:22プログラムセンスの無い人がやると、却ってスパゲティになるね。
複数の呼び元とのつじつまを合わせるために、その関数が10個ちかい
引数の数になったりとか
0435デフォルトの名無しさん
2009/05/04(月) 09:53:18class Base0{
protected:
int bs0;
public:
Base0(int b0=0){bs0 = b0;} //←ここのところ" } " か " }; " か
void showBs();
};
解説書に特にことわりもなく、"};"の例が出てきて、
試しにコンパイルしたらエラーもでなかったからどっちでもよさそうだけど
なんか違うの?
その本はほとんどのところは "}" だけど、一部"};"になってる
0436デフォルトの名無しさん
2009/05/04(月) 09:58:51この場合、実質同じ意味
0437デフォルトの名無しさん
2009/05/04(月) 10:04:36"この場合"というのは厳密には
" } " と " }; "は区別されてるって事?
区別されるとすればどの場合?
・・・って聞こうと思ったけど
>>435の最後の行のことか
0438デフォルトの名無しさん
2009/05/04(月) 10:19:14ブロックを閉じるところで}と書こうが};と書こうが実質同じ意味
0439デフォルトの名無しさん
2009/05/04(月) 10:26:00ありがとう
0440デフォルトの名無しさん
2009/05/04(月) 13:56:14#include <stdio.h>
class Test
{
private:
int value;
public:
Test(void);
void getValue(int*);
void printValue(void);
};
Test::Test(void)
{
value = 10;
}
void Test::getValue(int* x)
{
x = &value;
}
void Test::printValue(void)
{
printf("value: %d\n", value);
}
int main(void)
{
Test test;
int* value;
test.getValue(value);
*value = 20;
test.printValue();
}
0441デフォルトの名無しさん
2009/05/04(月) 14:18:51test.getValue(value);
0442デフォルトの名無しさん
2009/05/04(月) 14:24:290443デフォルトの名無しさん
2009/05/04(月) 15:09:37該当行を↓にそれぞれ差し替えれば意図したとおりになると思うよ。
void getValue(int**);
void Test::getValue(int** x)
*x = &value;
test.getValue(&value);
0444デフォルトの名無しさん
2009/05/04(月) 15:19:380445デフォルトの名無しさん
2009/05/04(月) 18:04:18int* Test::getValue(void)
{
return &value;
}
value = test.getValue();
*value = 20;
こうじゃね?
0446デフォルトの名無しさん
2009/05/04(月) 20:17:24引数がポインタの場合は何がconstになるんですか?アドレスを変更できないんですか?アドレスの指定先の変数値が変更できないんですか?
0447デフォルトの名無しさん
2009/05/04(月) 20:25:430448デフォルトの名無しさん
2009/05/04(月) 20:29:470449デフォルトの名無しさん
2009/05/04(月) 20:33:52いろいろと書き方があるので場合による
void myputs(const char *p); // void myputs(char const * p);
void myputs(const char * const p); // void myputs(char const * const p);
void myputs(char * const p);
0450デフォルトの名無しさん
2009/05/04(月) 20:38:00C++プライマー買おうね?全部載ってるよ?
0451デフォルトの名無しさん
2009/05/04(月) 20:46:51引数に*じゃなくてクラスとか配列の場合もアドレスってことですよね
ちょうど次買うのプライマーとエフェクティブどっちにしようかと思ってたんですプライマー先に買うことにしますどうもです!
0452デフォルトの名無しさん
2009/05/04(月) 20:48:46int main(){
int a;
char b,c,d;
c = 'z';
printf("10個の英字を入力してください\n");
for(a = 0; a < 10; a++)
{
b = getchar();
if (c > b){
c = b;
}
}
printf("一番最初にくるアルファベットは%cです。\n", c);
return 0;
}
これを実効するとうまくいかないのですが、何がだめなのでしょうか?
このソースが載っていた本にgetcharはラインバッファ処理を採用しているのでなんとやら〜
と書いてあったのですが、それ関係なんでしょうか?
ちなみにgetcharをgetcheに変えてconioというヘッダファイルをインクルードするとうまくいきました
0453デフォルトの名無しさん
2009/05/04(月) 21:00:230454デフォルトの名無しさん
2009/05/04(月) 21:55:31以下のように、各変数を明示的に初期化しないで出力してみたところ、
# include <stdio.h>
int global_var;
static int global_static_var;
int main(){
int local_var;
static int local_static_var;
printf("%d\n", global_var);
printf("%d\n", global_static_var);
printf("%d\n", local_var);
printf("%d\n", local_static_var);
}
出力結果は、
0
0
11277776
0
でした。
これは関数内の自動変数以外では、自動的に0で初期化してくれると考えていいのでしょうか?
Javaの場合はintに限らず全ての型においてフィールドは自動的に初期化されるのが仕様で定められているので明示的な初期化の記述は不要です。
Cの初期化にも仕様が定まってるのでしょうか?あるいは処理系依存ですか?
0455デフォルトの名無しさん
2009/05/04(月) 22:37:05Cも同様に仕様みたら良いでない
0456デフォルトの名無しさん
2009/05/04(月) 22:42:01もし local_var も 0 になったら、どういう推論をしたんだろうか
0457デフォルトの名無しさん
2009/05/04(月) 22:54:41たまたま10000回0でも、次の1回が0以外でも、誰にも文句言えないぞ
0458デフォルトの名無しさん
2009/05/04(月) 23:02:22ただしJavaのように厳格では無いから環境によっては確かではない。
0459デフォルトの名無しさん
2009/05/04(月) 23:21:320460デフォルトの名無しさん
2009/05/04(月) 23:29:47それだと結果がzとなって失敗してしまいます
まあ元のままだと結果すらでないのですが・・・
どちらにしろ実効すると5回までしかforループが続かないし
なにが原因なんだろう
0461デフォルトの名無しさん
2009/05/04(月) 23:37:24世の中にはな、0クリアすると1.0になる実数表現もあったりするね。
0462デフォルトの名無しさん
2009/05/04(月) 23:44:14改行が残っててそれを読み込むから。
b = getchar();
の後に
fflush(stdin);
をするとか。(ただし、全ての環境で正しく動く保証はない)
0463デフォルトの名無しさん
2009/05/04(月) 23:46:340464デフォルトの名無しさん
2009/05/04(月) 23:51:520465デフォルトの名無しさん
2009/05/04(月) 23:58:59while(getc() != EOF);
0466デフォルトの名無しさん
2009/05/05(火) 00:49:05enter読み取ったとか。
'a'〜'z'でなかったら読み直しにしたら?
あとCAPS入って大文字で入力された場合は考慮しなくていいの?
0467デフォルトの名無しさん
2009/05/05(火) 01:07:59>>466
ありがとうございます
たしかに改行も読み取ったことが原因のようでした
大文字読み取った場合の処理や例外の文字が入力されたときの処理はあとで付け加えときます
0468デフォルトの名無しさん
2009/05/05(火) 05:40:33時間のかかる計算中にウインドウをフリーズさせたくないので、計算の1ステップごとに
メッセージ処理をさせることにしました。
ところが、計算中にウインドウを閉じるとプロセスが終了しないで残ってしまいます。
どうすればいいですか? よろしくお願いします。
WndProc()
{
case BUTTON_ID1: calculation(); //ボタン1が押されたら計算開始。
}
WinMain()
{
while(GetMessage)
{
TranslateMessage;
DispatchMessage;
}
}
calculation()
{
for(長いループ)
{
//計算の1ステップ
GetMessage;
TranslateMessage;
DispatchMessage;
}
}
0469デフォルトの名無しさん
2009/05/05(火) 07:02:57ちゃんとWinMainのメッセージるぷで処理しろよ。
0470デフォルトの名無しさん
2009/05/05(火) 07:43:45すみません、メッセージるぷで何の処理をするんですか?
0471デフォルトの名無しさん
2009/05/05(火) 07:45:35UIスレッドとは別のスレッドで計算するのが常道じゃないかね。
0472デフォルトの名無しさん
2009/05/05(火) 07:53:00ですから、計算の1ステップごとにメッセージ処理をさせることにしたんです。
0473デフォルトの名無しさん
2009/05/05(火) 08:06:42case CAL_QUIT:{後始末} break;
case CAL_CONTINUE: if(calculation())SendMessage(hwnd,CAL_CONTINUE, ,);else SendMessage(hwnd,CAL_QUIT, ,);break;
0474デフォルトの名無しさん
2009/05/05(火) 08:07:560475デフォルトの名無しさん
2009/05/05(火) 08:35:39この場合は calculation() を1ステップだけ計算するように書き換えた上で、
ということですよね? これはcalculation()を大幅に書き換えないといけないのでできたらやりたくありません。
Application.DoEventsメソッドのように数行適当な場所に付け足すだけでメッセージ処理を行ってくれるような方法はないのでしょうか?
0476デフォルトの名無しさん
2009/05/05(火) 08:38:200477デフォルトの名無しさん
2009/05/05(火) 08:45:25てめーの概念コードの通りならforの初期化に渡す変数をparamに持たして回すだけじゃねーの?
0478デフォルトの名無しさん
2009/05/05(火) 09:01:391ステップだけ計算する関数にするにはかなり改造が必要そうです。
実を言うとこのような数値計算するコンソールアプリケーションがたくさんあって、
それを全部windowsで動くようにしないといけないんです。
できるだけもとのコードをいじらないで移植したいです。
>471 >476 PeekMessageを使った場合というのはこのような感じでいいのでしょうか?
ボタンを押したときに開始させるにはどうすればいいですか?
WinMain内にもメッセージループをもうひとつ作るのでしょうか?
WndProc()
{
}
WinMain()
{
calculation();
}
calculation()
{
for(長いループ)
{
//計算の1ステップ
PeekMessage(&msg)
if(msg.message==WM_QUIT){return 0;}else{DispatchMessage(&msg)};
}
}
0479デフォルトの名無しさん
2009/05/05(火) 09:13:400480478
2009/05/05(火) 09:22:31結局こんな感じでいいのでしょうか?
WndProc()
{
case BUTTON_ID1: calculation();
}
WinMain()
{
while(GetMessage){TranslateMessage;DispatchMessage;}
}
calculation()
{
for(長いループ)
{
//計算の1ステップ
if(PeekMessage(&msg)){
GetMessage;if(msg.message==WM_QUIT){return 0;}else{DispatchMessage(&msg)};}
}
}
0481デフォルトの名無しさん
2009/05/05(火) 09:47:20いや、俺はそういうやり方自分で書いたこと無いけどさ
WM_QUITが来たらWinMainの中のループまで抜けなきゃいけない
http://msdn.microsoft.com/ja-jp/library/cc410954.aspx
のに、内側のループで処理してそのままにしちゃうと、外側のGetMessageが制御を戻さないんじゃないの?
もちろんWM_CLOSE等は処理されてるから、ウィンドウは閉じられるけど。
WinMainのループ抜けるには
・フラグを使って抜ける
・Peek処理内で例外を投げて抜ける
・同PostQuitMessageを呼ぶ
等(最後のはちゃんと動くか知らない)が考えられそうだけど。
と思って検索したら、(当然だけど)同じ疑問を持つ人が居て
解決策等も示してあるようだけど。
http://www.google.co.jp/search?q=peekmessage+wm_quit+postquitmessage
0482デフォルトの名無しさん
2009/05/05(火) 10:12:41ああぁ、調べてみたけど難しいです。フラグを使って抜けるというのはこうで良いのでしょうか?
BOOL run;
WndProc()
{
case BUTTON_ID1: calculation();
}
WinMain()
{
run=TRUE;
while(GetMessage){if(run==FALSE){return msg.wParam;};TranslateMessage;DispatchMessage;}
}
calculation()
{
for(長いループ)
{
//計算の1ステップ
if(PeekMessage(&msg)){
GetMessage;if(msg.message==WM_QUIT){run=FALSE; return 0;}else{DispatchMessage(&msg)};}
}
}
0483デフォルトの名無しさん
2009/05/05(火) 10:46:15よほど楽だと思うのだが
0484デフォルトの名無しさん
2009/05/05(火) 11:17:220485デフォルトの名無しさん
2009/05/05(火) 12:23:00フラグ(みたいな処理)になるんじゃないの?
0486デフォルトの名無しさん
2009/05/05(火) 12:37:46「中間ステートを切り出せない程に複雑でメッセージ処理が滞る程処理に時間がかかる関数」に
再投入を防ぐフラグは必要だろう?
0487デフォルトの名無しさん
2009/05/05(火) 12:43:25コンソールアプリとしてコンパイルすれば?
0488デフォルトの名無しさん
2009/05/05(火) 12:55:59> マルチスレッドは恐ろしい物らしいので使いたくないのです。
などと言って逃げて、マルチスレッドにすればすぐ済むのにシングルスレッド
にこだわって無駄に複雑化させるのは馬鹿の所業。
それでもどうしてもマルチスレッドが使いたくないなら、プログラムを
計算用のコンソールアプリと進行状況表示用GUIアプリの2つに分けて、
計算アプリは単に進行状況を標準出力に出力、進行状況アプリは計算アプリ
をサブプロセスで起動してその標準出力をイベントで拾い、画面表示
すればいいんじゃない?
いや、計算アプリにウィンドウメッセージを投げてもらった方が楽か?
(WIN32APIはよく知らんので)
0489デフォルトの名無しさん
2009/05/05(火) 12:57:140490デフォルトの名無しさん
2009/05/05(火) 13:02:150491デフォルトの名無しさん
2009/05/05(火) 13:06:21どっちも馬鹿なのは変わらん。
0492デフォルトの名無しさん
2009/05/05(火) 14:16:080493デフォルトの名無しさん
2009/05/05(火) 15:25:07s.erase( s.find_last_not_of( "1234567890" ) + 1 );
としているんですが、sが数字だけだったら
s.erase( s.npos + 1 );
が行われていると思うんです。
この時予定通りsは""になるんですが、npos + 1が0になることは決まってるんですかね。。。
0494デフォルトの名無しさん
2009/05/05(火) 21:27:32ググってみたら、-1とはかぎらないって書いてるページもあるね。
0495494
2009/05/05(火) 21:29:110496デフォルトの名無しさん
2009/05/05(火) 23:07:070497デフォルトの名無しさん
2009/05/06(水) 00:23:590498デフォルトの名無しさん
2009/05/06(水) 00:38:380499デフォルトの名無しさん
2009/05/06(水) 00:51:140500デフォルトの名無しさん
2009/05/06(水) 01:43:22アンダーフローした時の挙動は決まっていないが、決まっていないと言うことは、
別にエラーにしなければならないというわけでもないからな。
とはいえ、現行ではconstexprがあるわけじゃないので、
static const size_type npos = std::numeric_limits<size_type>::max() ;
とはできないしな。
なんでnumeric_limitsは関数にしたんだか。
0501デフォルトの名無しさん
2009/05/06(水) 01:48:31>unsigned で -1と決まってるなら、+1したら0
そうとは限らない。
0502デフォルトの名無しさん
2009/05/06(水) 01:55:20static const size_type npos = -1;
と決められている。
で、size_typeというのはAllocator::size_typeのtypedefになっていて、
Allocatorはbasic_stringのテンプレートパラメータとして指定するアロケータ
で、20.1.5でアロケータの要件としてsize_typeはunsigned integral typeであるべしと要求されてる
だから規格に違反した自作アロケータがsize_typeに変な型を指定したりしてなければ多分大丈夫
0503501
2009/05/06(水) 02:01:580504デフォルトの名無しさん
2009/05/06(水) 02:23:00確実に決まってるよ
unsigned整数は2^nを法とする演算に従わなければならないと決められてる(nは表現可能なビット数)
3.9.1のパラグラフ4参照
0505デフォルトの名無しさん
2009/05/06(水) 02:45:59注41にも、オーバーフローしないとしか書かれてない。
0506デフォルトの名無しさん
2009/05/06(水) 03:14:12そもそも負の方向にはみ出すこともオーバーフローの一種だ
アンダーフローという言葉は全然違う意味を指す(浮動小数点数が小さくなりすぎて表現できなくなること)
といっても納得しなそうだから順番に説明する
まず-1というのはint型のリテラルだ(厳密にはリテラル1に単項-演算子を適用したint型の結果)
それがsize_typeの初期化に使われるから、-1がsize_typeに変換される
この時何が起こるかは4.7で規定されていて、変換元と2^nを法として合同な、
変換先で表現できる最小の値に変換されると決まっている。
つまり、-1は2^n-1に変換されて、nposは2^n-1で初期化される
で、これに1を足すことを考えると、
(2^n-1)+1は2^nだが、これはsize_typeでは表現できないので
2^nを法として合同で表現可能な値、つまり0になる
これは505で言う所の正真正銘の「オーバーフロー」だから文句はないだろう
かくしてunsignedの-1に+1すると0になることは間違いなく規格で保証されている
よろしいか
0507デフォルトの名無しさん
2009/05/06(水) 05:05:14それがprivate:でもpublic:でもなくprotected:に置かれてます。これって何か意味があるのでしょうか?
0508デフォルトの名無しさん
2009/05/06(水) 05:08:02よろしくない。
-1をunsingedな整数に代入した時点で、その値は不定、
不定な値に1を足しても、不定なままであることに変わりはない。
>変換先で表現できる最小の値に変換されると決まっている
がどうして、
>つまり、-1は2^n-1に変換されて
になるんだ? unsinged型の表現できる最小値は0だぞ。
-1を代入してどうなるかは実装の問題なんだよ。
まさか、整数は2の補数で表現されなければならないと規定されている、と思っているんじゃないだろうな?
0509デフォルトの名無しさん
2009/05/06(水) 08:20:30派生クラスからアクセッサを経由せずに操作したい理由があるのだろう。
0510デフォルトの名無しさん
2009/05/06(水) 08:31:22ただ単に外から見えなくしたいだけでしょ。
0511デフォルトの名無しさん
2009/05/06(水) 09:32:35データメンバはprivateではないのが殆ど。
というかprivateにある実装を見たこと無い。publicな実装もある。
まあ理由は、stackなどで使うためだと想像されるが。
0512デフォルトの名無しさん
2009/05/06(水) 09:49:41gcc バージョン 4.2.4
wgetを、外部プログラムとして、起動したくてこのようにしましたら
poppen: Invalid argument
となります、引数が無効、poppenへの引数の与え方がまずいといっているのですが、manを見ても何処が間違っているのかわかりません、ご教示願います。
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 256
int main(void)
{
FILE* p = popen("wget", "http://www.foo.com/");
char buf[BUFSIZE];
if( p == NULL ) {
perror("poppen");
exit(EXIT_FAILURE);
}
while((fgets(buf, BUFSIZE, p)) != NULL){
printf("%s", buf);
}
pclose(p);
return 0;
}
0513デフォルトの名無しさん
2009/05/06(水) 09:55:11man popen で即解決
0514デフォルトの名無しさん
2009/05/06(水) 10:02:00よく読め。
>manを見ても何処が間違っているのかわかりません
0515デフォルトの名無しさん
2009/05/06(水) 10:05:06popenの第2引数は読み書きのモード指定で、第1引数はコマンドだけ
ではなくコマンドライン全体とmanにわかりやすく書いてある。
今回の場合は
popen("wget http://www.foo.com", "r")
みたいになるんじゃないかな。
つか、manが読めないってバカ?
0516デフォルトの名無しさん
2009/05/06(水) 10:08:56> -1をunsingedな整数に代入した時点で、その値は不定、
だったらnposが-1ってのはガセかね。
0517デフォルトの名無しさん
2009/05/06(水) 10:47:16> まあ理由は、stackなどで使うためだと想像されるが。
これはどういう意味ですか?
0518デフォルトの名無しさん
2009/05/06(水) 11:12:330519デフォルトの名無しさん
2009/05/06(水) 11:28:29課題で、2数の四則演算機能しかない電卓のプログラミングがでたんですけど、さっぱり出来ません
35+468
と入力したら、
35+468=503
とでる感じです。
C言語でemacsを使ってます。
誰か親切な方がいらしたら、よろしくお願いします。
0520デフォルトの名無しさん
2009/05/06(水) 11:36:21#include <stdio.h>
int main()
{
int a, b;
char op;
scanf("%d%c%d", &a, &op, &b);
if (op == '+')
printf("%d + %d = %d\n", a, b, a + b);
else if (op == '-')
printf("%d - %d = %d\n", a, b, a - b);
else if (op == '*')
printf("%d * %d = %d\n", a, b, a * b);
else if (op == '/')
printf("%d / %d = %f\n", a, b, (double)a / b);
return 0;
}
0521デフォルトの名無しさん
2009/05/06(水) 12:27:29もしかして、「〜を法として合同」の意味がわからないのかな?
でなけりゃ、「-1と2^nを法として合同な変換先で表現できる最小の値」が0だなんて恥ずかしいことは言えないよな?
>まさか、整数は2の補数で表現されなければならないと規定されている、と思っているんじゃないだろうな?
内部表現なんかぜんぜん関係ないぞ?1の補数だろうとバイアス表現だろうと同じこと
表してる数についての問題なんだから
「法として合同」でぐぐって、意味を理解してからもう一度規格を読み直すんだ
>>516
騙されんなよ
規格にハッキリきっぱり「static const size_type npos = -1; 」と書いてあるし
それがsize_typeの最大値になることも保証されてるし
+1すると0になることも完璧に保証されている
0522デフォルトの名無しさん
2009/05/06(水) 12:36:16あとこれ
>-1をunsingedな整数に代入した時点で、その値は不定、
そこまで自信満々に言うなら、その根拠が規格のどこの記述にあるか教えて下さい
Chapter3と4を読んだ限り不定どころか紛れなく明確に決まっているように読めたが
何か見落としてるのかもしれない
0523デフォルトの名無しさん
2009/05/06(水) 12:38:240524デフォルトの名無しさん
2009/05/06(水) 12:43:100525デフォルトの名無しさん
2009/05/06(水) 12:45:50前々から疑問に思ってたところなんで、明確ならすっきりするんでそのURLを教えてくれないか。
0526デフォルトの名無しさん
2009/05/06(水) 12:49:22http://handasse.blogspot.com/2007/07/c.html
草案にも載ってるからそれで十分
0528デフォルトの名無しさん
2009/05/06(水) 13:45:48>>508は気にするな。規格に書かれているとおりだ。
0529デフォルトの名無しさん
2009/05/06(水) 14:26:339+1=10
99+1=100
...
...9...9+1=...0...0=0 (0が無限に続くので,表現として"...00000..."となる)
って感じになって
...9...9=-1
よって
...999.999...=-1+1=0
って導いているサイトがどこかにあったんだけど忘れた
0530デフォルトの名無しさん
2009/05/06(水) 14:35:14...0...0=0がおかしくね?
0531デフォルトの名無しさん
2009/05/06(水) 14:37:16ってねーよ
0532デフォルトの名無しさん
2009/05/06(水) 14:42:56http://ja.wikipedia.org/wiki/0.999...#p-.E9.80.B2.E6.95.B0
0533デフォルトの名無しさん
2009/05/06(水) 15:24:39現在、
1. OnLButtonDown内で、MoveToにより、始点を決める
2. OnMouseMove()内で、直前のラバーバンドを背景色でLineToすることで消し、新しいラバーバンドを描画色でLineToする
ということをやっているのですが、これだと線が重なった場合、以前に書かれた直線が、2.の「直前のラバーバンドを背景色でLineToする」によって消えてしまってうまくいかず、うまく解決する方法が思いつきません。
よろしくお願いします。
0534デフォルトの名無しさん
2009/05/06(水) 15:27:370535デフォルトの名無しさん
2009/05/06(水) 15:28:200536デフォルトの名無しさん
2009/05/06(水) 15:32:12小数点より左を有限の桁数とすればいいんじゃないかな。
例えば4桁とするなら
9999+1=10000=0(オーバーフロー桁は切り捨て)という世界で考える。(BCD4桁のCPU?)
-1=0-1=9999+1-1=9999
あるいは
0=9999+1=9999+0.999999....=9999.999...として
-1=0-1=9999.999...-0..999....=9999
0537デフォルトの名無しさん
2009/05/06(水) 15:51:25int を unsigned(または,その逆)に代入する時の変換測って決まってるんですか?
unsigned ui = -2;
int i = ui;
その変換測が>>527なんですか?
0538デフォルトの名無しさん
2009/05/06(水) 15:53:21CPUもメモリもカツカツという状況でもないなら、
1.絵を描く機能(LineTo/MoveTo)
2.絵を描くための情報(マウスイベントによる座標取得結果)
3.絵の描画結果(デバイスコンテキストの情報)
は分けて管理した方が良いですよ。
MFCなら上記のような、イベントドリブンのDocument-Viewアーキテクチャの
ソフトウェアの練習を勉強するにはちょうど良いです。
0539デフォルトの名無しさん
2009/05/06(水) 16:21:00struct IMAGE * img;
readImage(filename,img);
とし、readImage中で、
img = GFunc_AllocImage(width,height,depth);
としましたが、処理終了後のimgの値がNULLになってしまいます。
GFunc_AllocImageは以下のようになっています。また、readimage,GFunc_AllocImageともにDLLからの関数です。
DLLAPI IMAGE* WINAPI GFunc_AllocImage(int width, int height, int depth)
{
IMAGE* img;
int bpp;
if(width<0 || height<0) return NULL;
if(depth!=8 && depth!=24) return NULL;
if((img= (IMAGE*)malloc(sizeof(IMAGE)) ) == NULL) return NULL;
bpp=depth/8;
img->pixels = malloc(sizeof(BYTE)*bpp*width*height);
if(img->pixels==NULL)
{
free(img);
return NULL;
}
img->width=width;
img->height=height;
img->depth=depth;
return img;
};
デバッグしてみたところ、GFunc_AllocImage内では正しくmallocされているようです。
どのようにすればGFunc_AllocImageが生成したIMAGE構造体をimgに渡すことができるでしょうか。
0540デフォルトの名無しさん
2009/05/06(水) 16:25:010541デフォルトの名無しさん
2009/05/06(水) 16:48:15readimageがimgのアドレスを取得できると思うのですが・・・
また、&imgとしてreadFileにimgを渡したところ、IMAGE**からIMAGE*に変換できません
とエラーになりました。あと、わかりにくい表現でしたが、
”処理終了後のimgの値”とはGFunc_AllocImage終了後の値です。
変な書き方ですいません。
0542デフォルトの名無しさん
2009/05/06(水) 17:09:11>”処理終了後のimgの値”とはGFunc_AllocImage終了後の値です。
ってGFunc_AllocImage関数の戻り値がってこと?
>>539のGFunc_AllocImage内では正しくmallocは
この二つのmalloc戻り値はNULLではなかったということ?
if((img= (IMAGE*)malloc(sizeof(IMAGE)) ) == NULL) return NULL;
img->pixels = malloc(sizeof(BYTE)*bpp*width*height);
0543デフォルトの名無しさん
2009/05/06(水) 18:03:31>>”処理終了後のimgの値”とはGFunc_AllocImage終了後の値です。
は、visualstudioデバッガの使い方を間違えた為の勘違いでした。
GFunc_AllocImageの返値を受けたimgは正しくメモリを割り当てられていました。
問題は、readImageに渡したimg変数に対し、
関数の終了後メモリが割り当てられていないことです。
プログラムの元ネタの本を読み直したのですが、同readImage関数に渡すIMAGE構造体
が、ダブルポインタになっていることに気づきました。自分で勝手にシングルポインタを引数とする
関数に変更していたことがエラーの原因だったようです。
疑問なのですが、なぜ直接シングルポインタを入れてはいけないのでしょうか?
IMAGE構造体の配列を作るわけでもないのに、わざわざimgをダブルポインタで宣言し、
readImage(filename,&img)としなければならない理由が分かりません。
0544デフォルトの名無しさん
2009/05/06(水) 18:09:55int x = 0;
readInt(x);
void readInt(int v) { v = 5; }
IMGHANDLE x = 0;
readImage(x);
void readImage(IMGHANDLE v) { v = GFunc_AllocImage(); }
上も下も同じ事
0545デフォルトの名無しさん
2009/05/06(水) 18:33:57元の変数がポインタか否かにかかわらず、
関数の引数としてその変数を使う場合には、明示的に&を使わなければ
変数を値渡ししたと見なされてしまい、関数終了後に変数の中身は消えてしまう、
と言うことでしょうか。理解できました。ソースを書き直してみます。
ありがとうございました!
0546デフォルトの名無しさん
2009/05/06(水) 18:54:26書き直しの前にこれ解ける?
int *p;
funcp(?){???}
int *pのp値を設定したいとき?の部分どう記述する。
int i = 100;
funci(?){???}
int iのi値を他の値に変更したい時?の部分どう記述する。
0547デフォルトの名無しさん
2009/05/06(水) 19:03:57こわいよこわいよ2重ポインタ怖いよ
怖い怖い
助けて
0548デフォルトの名無しさん
2009/05/06(水) 19:07:43言い忘れてた。書いた本人の俺、解けないんだ,orz
0549デフォルトの名無しさん
2009/05/06(水) 19:09:33int *p;
funcp(int** p, int x){
*p=(int*)malloc(sizeof(int) );
**p= x;
}
使うとき、
funcp(&p, x);
int i = 100;
funci(int* i, int x){*i = x;};
使うとき、
funci(&i, x)
でしょうか。
0550デフォルトの名無しさん
2009/05/06(水) 19:42:32void funcp(int** p,int x)
{
*p= (int*)malloc(sizeof(int*));
**p= x;
}
が正解でした。やっとダブルポインタが理解できました。
お付き合い頂いて、本当にありがとうございました。
0551デフォルトの名無しさん
2009/05/06(水) 19:58:390552デフォルトの名無しさん
2009/05/06(水) 22:39:03static void func() {}
}
という記述で、staticがあるのとないのとでは、何か違いがありますか?
0553デフォルトの名無しさん
2009/05/06(水) 22:40:590554デフォルトの名無しさん
2009/05/06(水) 22:49:49namespace XXX {
void func() {}
}
extern void XXX::func();
int main() {
func();
return 0;
}
見えません。
0555デフォルトの名無しさん
2009/05/06(水) 22:51:50100% FREEEE XXXにしとき。
0556デフォルトの名無しさん
2009/05/06(水) 23:07:44もちろん4行目までと5行目以降は違う翻訳単位だろうな?
0557デフォルトの名無しさん
2009/05/06(水) 23:17:380558デフォルトの名無しさん
2009/05/06(水) 23:23:08名前空間が違うし
0559デフォルトの名無しさん
2009/05/06(水) 23:33:15/*extern*/ void func();
}
int main()
{
XXX::func();
}
0560デフォルトの名無しさん
2009/05/07(木) 19:37:00unsigend への変換で、元の値が範囲外のときの結果は決まってる。
>527 は規格中のその規定に関する記述の一部。
ただし sigend への変換では、元の値が範囲外のときの結果は実装依存。
0561デフォルトの名無しさん
2009/05/07(木) 19:45:140 で初期化されることが標準規格で決まっている。
>>461
関係ない。
そういう表現を使う環境では未初期化の静的な実数を bss には置けないというだけで、
0 (或いはこれを変換した結果の 0.0 やヌルポインタ)で初期化されることに変わりは無い。
0562デフォルトの名無しさん
2009/05/07(木) 20:52:25だから0初期化を当てにするなってことだろ。
0563デフォルトの名無しさん
2009/05/07(木) 21:09:480564デフォルトの名無しさん
2009/05/07(木) 21:17:12規格をあてにするなって馬鹿か?
0565デフォルトの名無しさん
2009/05/07(木) 22:12:44規格に則ってない環境なんてザラ。
>>454
ANSI-Cに則った処理系なら main 関数に入る前にイニシャライズ
されるけれど、単に"C言語"と言ったらその限りではない。
InitializerをリンクせずにROM容量を削るのはよくあること。
562の言うように、明示的に自分で初期化するソースは移植性も高い。
こういうのはパソコンの人はあまり気にしてないみたい。
0566デフォルトの名無しさん
2009/05/07(木) 22:33:41自分の経験を一般論のように見せかけて変な主張をするのはやめてください。
ましてや初心者歓迎スレで。
明示的な初期化が望ましい理由は、単に >564 のような心配無しに読めるから。
それだけのこと。
未初期化変数のデフォルトの初期値についての規則は >561 のとおり。
0567デフォルトの名無しさん
2009/05/07(木) 22:39:070568デフォルトの名無しさん
2009/05/07(木) 22:39:51デタラメ書いたら規格票を楯に反論させていただきますよ?
0569デフォルトの名無しさん
2009/05/07(木) 22:45:36どこが嘘なの?
0570デフォルトの名無しさん
2009/05/07(木) 22:45:390571デフォルトの名無しさん
2009/05/07(木) 22:47:300=NULLって保障されてるの?
0572デフォルトの名無しさん
2009/05/07(木) 22:51:22根拠に反論するそうです。
0573デフォルトの名無しさん
2009/05/07(木) 22:52:020574デフォルトの名無しさん
2009/05/07(木) 22:53:220575デフォルトの名無しさん
2009/05/07(木) 22:55:01あそこまで言明するなら、もっと正確に言うべきである。あれではうそになる。
初期化されるのは。
・すべての初期化していない静的に確保される変数は.bssセクションに入っていて、0で初期化される。
中身は
・初期値を持たない大域変数
・初期値が0の大域変数
・初期値を持たない静的局所変数
・初期値が0の静的局所変数
ローカル変数は関係ない。その他メモリー等を確保する領域も関係ない。
0576デフォルトの名無しさん
2009/05/07(木) 23:03:26内部表現のことを言ってるなら違う可能性はある
ポインタに0を代入した場合等のことを言ってるなら問題ない
0577デフォルトの名無しさん
2009/05/07(木) 23:19:12これ読んでおいて。ググって最初のリンクね。
ttp://www.google.co.jp/search?q=.bss%83Z%83N%83V%83%87%83%93
0578デフォルトの名無しさん
2009/05/07(木) 23:19:21NULLならば0は真
0ならばNULLは真とは限らない
プロトタイプに従って整数拡張させるから大抵問題ないけど、型情報のない可変引数ではまずいってばっちゃが言ってた
0579デフォルトの名無しさん
2009/05/08(金) 00:02:12何を根拠にそんなことを言うのかね?
>577 の検索結果のトップにある記事を引用しているようだが、その記事は
C/C++ の規格と ELF での .bss の定義とがまったく別のスコープで行われている
ことを見落とし、2つのスコープを混同した上で、間違った結論を出している。
ELF での .bss の定義に C/C++ 変数の初期化の有無なんて関係ないし、
逆に C/C++ の規格は ELF の .bss なんて知ったこっちゃ無い。具体的には、
ELF の .bss の定義にある「ゼロで初期化」と、 C/C++ での「ゼロで初期化」は
それぞれ意味が違う。(前者はメモリ領域の全ビットをゼロにすること。後者は
C/C++ で "= 0" と書いた場合と同じ初期化をすること。)
これらを正しく(効率よく)結びつけるのがコンパイラの仕事。たとえば gcc では
3.3 あたりで "= 0" と明示的に初期化された変数も .bss に配置されるように
変更された(以前は .data に配置されていた)。これは C/C++ 規格でも ELF でも
規定されていない部分の動作であり、コンパイラの実装が自由に選んでいい。
また、各型の「ゼロ」の内部表現を知っているコンパイラにしかできない選択でもある。
0580デフォルトの名無しさん
2009/05/08(金) 00:33:11・ゼロ初期化の規格上の定義とその実装の議論
・規格上の初期化がそうはならない環境も良くある事と、そんなの糞と言う平行線
の2つの話が>>577のリンクにより微妙にごっちゃになっておりますが、
頑張ってついて行きましょう。
0581デフォルトの名無しさん
2009/05/08(金) 01:42:05値が見れない(デバッグのウィンドウに表示されない)変数があるんですけど、なぜなんでしょう?
その変数はforの{}内で宣言した変数なんですけど関係ありますかね?
0582581
2009/05/08(金) 01:43:52別スレできいてきます。
0583デフォルトの名無しさん
2009/05/08(金) 01:45:33もっと適切な↓専用スレがありそう。
Visual Studio 2008 Part 16
http://pc12.2ch.net/test/read.cgi/tech/1238941772/
Visual Studio IDE環境
http://pc12.2ch.net/test/read.cgi/tech/1115707321/
★初心者にVisual C++を教えるスレ★ Part33
http://pc12.2ch.net/test/read.cgi/tech/1235292263/
0584583
2009/05/08(金) 01:46:140585デフォルトの名無しさん
2009/05/09(土) 00:07:38なぜ規格の話をしたがっていたのに見知らぬ他人のサイトなんぞ見なきゃいけないんだ
しかもgoogle検索リンク貼り付けるとかアホもいい加減に
0586デフォルトの名無しさん
2009/05/09(土) 00:17:080587デフォルトの名無しさん
2009/05/09(土) 06:13:27「.bssセクション」をGoogleで検索
「初期化してない変数と.bssセクション」
http://www.ertl.jp/~takayuki/readings/info/no03.html
0588デフォルトの名無しさん
2009/05/09(土) 12:36:14ファイル1にオブジェクト、ファイル2にexternオブジェクト(同じオブジェクトを参照したい)を作成しました
ファイル2でオブジェクトを削除するとファイル1のオブジェクトも削除されますか?
また、ファイル3でexternオブジェクトをもうひとつ作って削除するとファイル2のオブジェクトはどうなりますか?
0589デフォルトの名無しさん
2009/05/09(土) 12:44:13C++でexternは禁止だぼけ
198日ROMってろ春日
0590デフォルトの名無しさん
2009/05/09(土) 13:20:550591デフォルトの名無しさん
2009/05/09(土) 14:34:39小数点以下を絡めた計算を行う際に、
double を使用した場合に、丸め誤差が発生してしまいました。
C++ にて巨大な数値を厳密に計算する場合、どのような型を使うのでしょうか?
.NET の Decimal、Java の BigDecimal のような型はあるのでしょうか?
よろしくお願いします。
0592デフォルトの名無しさん
2009/05/09(土) 14:36:360593デフォルトの名無しさん
2009/05/09(土) 14:56:44早く、なぜ198日なのか教えて
0594デフォルトの名無しさん
2009/05/09(土) 15:09:15十進法ベースの浮動小数点数が使いたければ、
ほかのライブラリを使うか自分で計算するかしかない。
ちなみに、一応WindowsにもDECIMAL構造体とその計算をする関数(VarDecAddなど)が一通り揃っていて、
これは.NETのDecimalと同精度。
0595デフォルトの名無しさん
2009/05/09(土) 15:26:14DECIMAL を実際に使ってみました。
代入や計算が他の型のように、直感的にはできないですが(関数経由のため)
それらを気にしなければ、厳密な計算でも使えそうな感じです。
必要に応じてラッパークラスを作ってしまうのも手ですね。
レスありがとうございました。
0596デフォルトの名無しさん
2009/05/09(土) 16:39:25つNTLライブラリー
ttp://www.shoup.net/ntl/
0597デフォルトの名無しさん
2009/05/09(土) 18:14:25勤労感謝の日かっ!?
…とマジレスしてみる
0598デフォルトの名無しさん
2009/05/09(土) 18:19:04これまでの資産を引き継いで以下のような文字列を扱うクラスを含むコードを
ビルドするとコンパイルエラーになってしまいます
↓(ソースはめちゃくちゃ簡略化しています)
0599598
2009/05/09(土) 18:19:24{
public:
...
operator char* ( ) { return ( str ); }
char operator [ ] ( unsigned int i ) { return ( str [ i ] ); }
bool operator < ( string& s ) { return ( strcmp ( str, s.str ) < 0 ); }
...
private:
...
char *str;
...
};
int main ( )
{
...
string str1 ( "abcde" ),
string str2 ( "fghij" );
char ch;
ch = str1 [ 2 ]; // ←(1)コレがダメ
strcpy ( str2, str1 );
if ( str1 < str2 ) { // ←(2)コレがダメ
...
}
...
}
0600598
2009/05/09(土) 18:19:50発生するエラーは C2666 です
で、MSDN で調べてみると以下のようなページが。。。
ttp://msdn.microsoft.com/ja-jp/library/dyafzty4.aspx
要は(1)と(2)で変換演算子(キャスト演算子)も適用できてしまうので
あいまいになるということらしいです
これはもう .NET 2003 以降の仕様としてあきらめるしかないんでしょうか?
しかしそうなると今までの資産の全てのコードを書き換えないと。。。
何か良い方法を知っている人がいれば教えてください
0601デフォルトの名無しさん
2009/05/09(土) 18:53:36stringとstringの比較なのにchar*が優先されるわけがない
多分曖昧になるのはstringとchar*を比較しようとしたときだろうから、
bool operator< ( string&, char* )とbool operator< ( char*, string& )を用意してやれば解決すると思う
operator[]の方はunsignedのせいで[]の中身の変換が必要になるから曖昧になる
その証拠に「ch = str1[2u];」では曖昧にならない
特に必要がないならunsignedを取ればいい
でも本当はoperator char*を普通のメンバ関数に置き換えたほうがいいと思う
0602デフォルトの名無しさん
2009/05/09(土) 19:02:51曖昧だってことは他にもオーバーロードがあるんだろ?
そこが省略されてるんじゃ、これはもう、エスパーに頼むしかない。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0603598
2009/05/09(土) 19:30:43ああごめんなさい間違えてました
ソースコードを読み返してみたら
確かに string と char* の比較でした
そうか
グローバルで比較演算子を両方の場合についてオーバーロードすれば良いのですね
ありがとうございます
unsigned については実際は size_t を使っているんですが
これがいけなかったんですね
キャスト演算子についてはおっしゃる通り今では極力使用しない方が
良いことは分かっているんですが
ライブラリを作ったのがかなり昔のことで
ソースコードを書き換えるのがめんどくさくて今に至っています
とにかく解決できて良かったです
ありがとうございました
0604533
2009/05/09(土) 21:29:07XORでやろうとしたのですが、線を重ねて描画した際に線が消えてしまうため、
後者の方法で実現しました。
>>538
1. ViewクラスのOnDrawに描画機能をまとめる
2. ,3. Documentクラスに持たせる
って感じにしました。
Document-Viewアーキテクチャで書かれたの良いソースって落っこちてないんですかね^^;
ありがとうございました。m(_ _)m。
0605デフォルトの名無しさん
2009/05/09(土) 21:33:15エスパー乙
0606604
2009/05/09(土) 22:57:21外部アプリを起動できる機能を実装しようと思っていますがうまくいきません。
どなたかアドバイスをよろしくお願いします。
(2)のメモリ診断ツールを実行しようとすると以下のエラーとなってしまいます。
Win32Exceptionはハンドルされませんでした。
指定されたファイルがみつかりません。
(1)のメモ帳は正常に起動できたのですが、なぜ(2)のメモリ診断ツールでエラーが出てしまうのでしょうか?
プログラムを作ろうと思っていますが、うまくできません。どなたかアドバイスください。
# 次の書き込みへ・・
0607606
2009/05/09(土) 22:58:49# 606の続き・・
(1)
// フォーム上のButtonをクリックすると「メモ帳」を起動する。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Diagnostics::Process::Start("C:\\Windows\\System32\\notepad.exe");
}
(2)
// フォーム上のButtonをクリックすると「メモリ診断ツール」を起動する。
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
Diagnostics::Process::Start("C:\\Windows\\System32\\MdSched.exe");
}
試しにVB .NETで以下のプログラムを実行したところ正常に動作できました。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Process.Start("C:\Windows\System32\MdSched.exe")
End Sub
お手数をおかけしますが、何が原因で正常に動作できないのかご教示願います。
環境:
OS Windows Vista Ultimate SP1
Visual Studio 2005 SP2
0608デフォルトの名無しさん
2009/05/10(日) 01:28:58よけいこんらんするかもだけどさんこうに
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12172&forum=7&start=8
0609デフォルトの名無しさん
2009/05/10(日) 02:08:41Windowsが64ビット版だなんてことはない?
そうだとすれば、VB.NETのプログラムではAny CPUで64ビットプロセスとして実行されてうまくいき、
C++のは32ビットプロセスとして実行され、System32がSysWOW64にリダイレクトされて
うまくいかないと説明できるんだけど。
notepad.exeだと上手くいくのは、System32とSysWOW64の両方に存在するため。
ようするにC++でもx64ビルドすればいい(C++でAny CPUは厳しいからパス)。
あるいはWow64DisableWow64FsRedirectionと書こうとしたが、
Process::Startには効かなかった。systemでは通用したけど。
0610606
2009/05/10(日) 04:59:15参考にさせて頂きます。
>609
うおーありがとうございます。Windows Vista 64ビット使ってます。(誤記多いし、情報不足ですみません。)
構成マネージャでx64設定に変えてリビルドしたところ正常に動くようになりました。
デフォルトのインストール設定では、「x64 コンパイラおよびツール」がないようなので、
コンパイル設定を変えるのに苦労しました・・。
まだまだ609様の書き込み内容を理解できませんので、理解できるよう精進したいと思います。
ありがとうございました。
0611デフォルトの名無しさん
2009/05/11(月) 04:57:14こういうスレは見ててなんだか楽しいなw
0612デフォルトの名無しさん
2009/05/11(月) 08:52:51その行で終わるようにするとエラー出ないんですが、これ問題ありますか?関数の戻り値とかどこへ行ってどうなるんでしょうか
0613デフォルトの名無しさん
2009/05/11(月) 09:00:450614デフォルトの名無しさん
2009/05/11(月) 09:18:140615デフォルトの名無しさん
2009/05/11(月) 09:32:49すぐ return すればいいだけで
0616デフォルトの名無しさん
2009/05/11(月) 09:34:17http://ch.cri-mw.co.jp/hirase/187.html
delete *this でぐぐったら多量に出てくるな
0617デフォルトの名無しさん
2009/05/11(月) 09:35:180618デフォルトの名無しさん
2009/05/11(月) 09:55:400619デフォルトの名無しさん
2009/05/11(月) 10:25:180620デフォルトの名無しさん
2009/05/12(火) 11:36:51自分は簡単なHTTPDくらいならCで書ける(と思ってる)のですが、C++ではどう書くのか方法を探してます。
よろしくお願いします。
0621デフォルトの名無しさん
2009/05/12(火) 14:20:27参照数0になったときに自分をメモリから削除するときは必ずやってる
0622デフォルトの名無しさん
2009/05/12(火) 14:44:34char buff[1024];
fp = fopen("file.txt", "r");
fgets(buff, 1024, fp);
fclose(fp);
のようなコードが多く見つかりました。
一応動作はするのですが、もしファイルサイズが予め想定した大きさ(1024バイト)以上だった場合にどのように対処するのが一般的なのでしょうか?
環境はWinXP
それと出来れば勉強のために特別なライブラリ等は使用しない方法が望ましいです。
よろしくお願いいたします。
0623デフォルトの名無しさん
2009/05/12(火) 16:41:28ファイルサイズってのは行の長さのこと?
どう処理するかは、処理の内容で適当にきめればいいよ。
0624デフォルトの名無しさん
2009/05/12(火) 16:44:29fgets()は一行読み込みの関数なので、想定以上に長い行をどうしても一回で読み込みたい場合は使えない。
普通は、そんな長い行のことは考えなくていいと思う。
勿論、ファイル全体を一気に読み込みたい場合はfgets()は使えないと言うことになるが、
普通は1行単位で処理すれば充分だろう。
0625デフォルトの名無しさん
2009/05/12(火) 19:46:13#include <boost/shared_ptr.hpp>
class Test {
public:
Test(const Test& orig) {
std::cout << "Test: copy constructor" << std::endl;
}
Test(const boost::shared_ptr<Test>& orig) {
std::cout << "Test: copy constructor& const boost" << std::endl;
}
Test(const boost::shared_ptr<Test> orig) {
std::cout << "Test: copy constructor const boost" << std::endl;
}
Test() {std::cout << "Test: constructor" << std::endl;}
~Test() {std::cout << "Test: destructor" << std::endl;}
private:
int resource;
};
int main() {
const boost::shared_ptr<Test> pT(new Test());
boost::shared_ptr<Test> pT2(pT);★
return 0;
}
このソースで、★を付けた箇所はコピーコンストラクタが呼ばれると思ってたのですが、
コピーコンストラクタを色々と書いてみても呼び出されません。
★の箇所ではどういうコンストラクタが呼ばれているのでしょうか?
0626デフォルトの名無しさん
2009/05/12(火) 20:02:53でつくったポインタ引き回してるだけだからどのコンストラクタもよばねーよ
強いて言うならshared_ptrのが
0627デフォルトの名無しさん
2009/05/12(火) 22:37:08boost::shared_ptr<Test> pT2(pT);
だと、スマポの宣言してるだけだけど、
Test pT3(pT);
とか書けば、スマポ引数のコピーコンストラクタが呼ばれるということですね。
0628デフォルトの名無しさん
2009/05/12(火) 22:48:05上と下でpTの型が変わってる。
なんか分かってなさそう。
0629デフォルトの名無しさん
2009/05/12(火) 22:58:27外部関数の中で使えるんですか?
0630デフォルトの名無しさん
2009/05/12(火) 23:03:58アドレスとかを渡すってこと?問題なくできるよ
0631デフォルトの名無しさん
2009/05/12(火) 23:04:48どうもっす
0632デフォルトの名無しさん
2009/05/14(木) 16:02:53MFCもあるんですが。一番簡単にファイルのダウンロードとかも全部カスタマイズできて
ネットにデータを送信受信する基本は何を使えばいいんですか?
0633デフォルトの名無しさん
2009/05/14(木) 18:17:550634デフォルトの名無しさん
2009/05/14(木) 18:27:320635デフォルトの名無しさん
2009/05/15(金) 18:11:32他のクラスの関数にインスタンス化しないでアクセスする方法ってありますか?
0636デフォルトの名無しさん
2009/05/15(金) 18:13:420637デフォルトの名無しさん
2009/05/15(金) 18:21:48ヘッダ作って#includeすりゃいいじゃん
0638デフォルトの名無しさん
2009/05/15(金) 19:11:140639デフォルトの名無しさん
2009/05/15(金) 19:39:020640デフォルトの名無しさん
2009/05/15(金) 19:41:42とても嫌な予感。
0641デフォルトの名無しさん
2009/05/15(金) 19:46:180642デフォルトの名無しさん
2009/05/15(金) 20:45:31ソースファイルを分けたいのかソースコードを分けたいのかどっちなんだ
むしろエディタ上で折りたためるようなのないのかと
0643デフォルトの名無しさん
2009/05/15(金) 21:57:300644デフォルトの名無しさん
2009/05/16(土) 00:43:470645デフォルトの名無しさん
2009/05/16(土) 00:47:29floatの精度は24bitだからfloatでは情報落ちする。よってdoubleを使う。
0646デフォルトの名無しさん
2009/05/16(土) 00:57:03どこまで望まれる動作なのか?ってこと
2^100とか3.1^-100とか+INFとかNaNとか-0とか+0…なんかもIEEE 754で表せれるけど,人が読む表現としてどこまで望んでるの?
0647デフォルトの名無しさん
2009/05/16(土) 01:07:340648デフォルトの名無しさん
2009/05/16(土) 03:43:00>647を読むとなんだか違うように思える…。
0649デフォルトの名無しさん
2009/05/16(土) 05:49:010650デフォルトの名無しさん
2009/05/16(土) 07:48:52いまいちやりたいことがわからん。
何のビット列をどうしたいの?
0651デフォルトの名無しさん
2009/05/16(土) 08:21:26正直ビット列に直す必要すらないかと
「計算結果を保持した内部のビット列が」っつってるけど,そもそもビット列のケーサンなんて高度なことする必要性がどこから出てきたの?
"0"と"1"から成る文字列を実数値のなんちゃら表現にするんだから,先にどんな表現にするか決めないと.
0652デフォルトの名無しさん
2009/05/16(土) 08:25:19整合性をとるため浮動小数点数を IEEE754 形式に合わせたいのだとエスパー
0653デフォルトの名無しさん
2009/05/16(土) 08:33:450654デフォルトの名無しさん
2009/05/16(土) 19:22:15VisualStudioでは、プリプロセッサーの種別で適時、マクロを定義できますが
linuxでカーネルのバージョン毎に、インクルードするファイルパスを変えたい場合
どのように、記述すればいいのでしょうか?
Makefileを作成して、そこで指示するのが普通なのでしょうか?
0655デフォルトの名無しさん
2009/05/17(日) 08:12:50Linux板のカーネル総合スレで聞いたほうが詳しい人いそうだが・・・
向こうの流れを見た感じだと、もしかして向こうから来たのか?
0656デフォルトの名無しさん
2009/05/17(日) 13:51:00>LocalFree()ってなんですか?
LocalAlloc, LocalReAllocと一緒に使うWin32のmalloc,realloc,freeみたいな
メモリ管理の関数。
0657デフォルトの名無しさん
2009/05/17(日) 16:16:20thx
0658デフォルトの名無しさん
2009/05/17(日) 16:18:32プログラム作ってビルドは成功する(警告はたくさんありますが)のですが、その後VC内の実行ボタンを押しても真黒なウインドウが出るだけで動きません。
ところがDebugフォルダ内の出来たexeファイルをクリックして実行させるとまともに動きます。
何回ビルドしてもこの調子です。
これは何が原因なんでしょうか?
0659デフォルトの名無しさん
2009/05/17(日) 16:34:440660デフォルトの名無しさん
2009/05/17(日) 16:41:24主な違いはプログラム実行時のカレントディレクトリの扱いぐらい。
相対パスでファイルを読んだり、argv[0]を参照したりといったことをしていないなら
>>659の言うような問題かも。
0661658
2009/05/17(日) 17:03:18ソフト替えるか・・・
0662658
2009/05/17(日) 17:04:05×なりほど
('A`)
0663デフォルトの名無しさん
2009/05/17(日) 17:08:150664デフォルトの名無しさん
2009/05/17(日) 17:09:580665デフォルトの名無しさん
2009/05/17(日) 17:17:13VC関連で何百回も出てる質問だ
0666デフォルトの名無しさん
2009/05/17(日) 17:23:42終了が当たり前じゃない世代
0668デフォルトの名無しさん
2009/05/17(日) 19:56:10LLONG_MAX,LLONG_MIN
とかってlimits.hの中に定義されていないのですか?
環境はubntu9.04です。
0669デフォルトの名無しさん
2009/05/17(日) 21:06:070670デフォルトの名無しさん
2009/05/17(日) 21:38:57あとifやforのネストは何回くらいまでが基本でしょうか
0671デフォルトの名無しさん
2009/05/17(日) 21:40:50そんなもん場合によるとしかいえん
そうするのが自然なら別にかまわない
0672デフォルトの名無しさん
2009/05/17(日) 21:41:42チーム制作になるなら、ルールはその時決めるだろ
0673デフォルトの名無しさん
2009/05/17(日) 21:41:57好ましくないと思うから聞いてるんだろ?
ネストした時点ですぐに関数の分割を考えるぐらいでいいよ。
0674デフォルトの名無しさん
2009/05/17(日) 21:50:42switch文がネスとするのは、私の場合ほとんど無い。どうしても必要なときはするけど
普通はまず無い。だから何かの設計の仕方が私と違うと思う。
ifやforは,場合によってはネスとする場合があるが、その中身は小さなも物がほとんど。
だから、for、ifの重なった先が大きなブロックなら、私とは設計の概念が違う。
実物を見たら、もっと具体的な話が出来るが。ネットで長いリストは読む気がしない。
0675デフォルトの名無しさん
2009/05/17(日) 22:07:15>>654です、Thxです。
DKERNEL_VER=`uname -r` これを、カーネルのバージョンを変数、DKERNEL_VERに取得して
その内容で、インクルードするファイルを決める事と、理解しましたが、やはりMakefileに記述すれば良いですよね?
0676デフォルトの名無しさん
2009/05/17(日) 22:16:04変数じゃなくてマクロ
-Dはマクロを定義するコンパイラオプション
ここまで分かればあとは自明だと思うが
0677デフォルトの名無しさん
2009/05/17(日) 23:12:29関数内クラス最高。
0678デフォルトの名無しさん
2009/05/18(月) 00:16:55テンプレートパラメータとして渡せないお前なんかイラネーヨ
0679デフォルトの名無しさん
2009/05/18(月) 10:34:05> VC++6.0が古すぎだと思う。
言語仕様も古いしね。デバッグバージョンで
for (;;) {
T* p = new T();
delete p;
}
↑のコードで放っておくと(今時のマシンなら)数時間
で停止するしね(内部で使っているデバッグ用のメモリ
アロケータのカウンタが 0 に戻ってどうの、だったと
思う)。
0680デフォルトの名無しさん
2009/05/18(月) 10:44:32http://www.kouno.jp/home/c_faq/c16.html
0681デフォルトの名無しさん
2009/05/18(月) 15:40:01error: expected `;' before ‘itr’
というエラーが出るのですが、
対処方法が分かりません。
ご指導お願いします m(_ _)m
-----------------
template<class Type>
class List{
private:
list<Type> tlist;
public:
List(){}
void show(){ list<Type>::iterator itr; }
};
int main()
{
List<vector<int> > tl;
return 0;
}
0682デフォルトの名無しさん
2009/05/18(月) 15:53:18それだけのコードで再現するの? 普通にどこかで文法を間違ってるだけだと思うんだが
0683681
2009/05/18(月) 16:08:40コンパイル通りますか!?
今 >>681 をコピペしてやったけどダメでした。
なぜだろ・・・
------------------------------
以下原文
#include<iostream>
#include<vector>
#include<list>
using namespace std;
template<class Type>
class List{
private:
list<Type> tlist;
public:
List(){}
void show(){ list<Type>::iterator itr; }
};
int main()
{
List<vector<int> > tl;
return 0;
}
0684681
2009/05/18(月) 16:12:16以下 gcc -v 結果
Using built-in specs.
Target: i486-linux-gnu
コンフィグオプション: ../src/configure -v --with-pkgversion='Ubuntu 4.3.2-1ubuntu12'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3
--program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-mpfr --enable-targets=all --enable-checking=release
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
スレッドモデル: posix
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12)
0685デフォルトの名無しさん
2009/05/18(月) 17:59:46共有ライブラリ内のクラスでメンバやメンバ関数を追加した後ライブラリを再コンパイル
して置き換えると、どうもプログラムの挙動がおかしくなる (e.g. コンストラクタが正しく
呼ばれなくなる)のですが、もしかしてこれがいわゆるC++でバイナリ互換性を失った状態、
でしょうか?
こういう場合、メインプログラムを動く状態に保つためのノウハウみたいなものは
ありますかね?
とりあえずメインプログラムも再コンパイルし直せばいいみたいですが、それだと
ライブラリとプログラムを分けている意味が... これ以外にも方法はあるでしょうか?
なお、プラットフォームはLinuxとMac OS Xです。
0686デフォルトの名無しさん
2009/05/18(月) 18:08:51デザインパターンの出番だな
よく知らないけどファクトリーなんとかってのでいけるかもしれんw
詳しくはググるなり書籍なりでどうぞ
とりあえずインターフェースが変わらない部分のみについては大丈夫だと思う
0687デフォルトの名無しさん
2009/05/18(月) 18:37:070688681
2009/05/18(月) 19:02:30できました。
ありがとうございます!
typename を使うことで list<Type>::iterator が型であると明示するんですね。
これを使わないと、list<Type>::iterator っていう変数とも考えられてしまうと、、、。
勉強になりました。m(_ _)m
0689デフォルトの名無しさん
2009/05/18(月) 23:39:50という感じの四捨五入関数を書きたいのですが、四則演算だけで書けるでしょうか?
0690デフォルトの名無しさん
2009/05/18(月) 23:42:00return (int)(input + 0.5)
0691デフォルトの名無しさん
2009/05/18(月) 23:55:200692デフォルトの名無しさん
2009/05/19(火) 00:27:480693デフォルトの名無しさん
2009/05/19(火) 00:29:020694デフォルトの名無しさん
2009/05/19(火) 06:47:030695デフォルトの名無しさん
2009/05/19(火) 07:33:52return (int)(input - 0.5)
0696デフォルトの名無しさん
2009/05/19(火) 07:51:520697デフォルトの名無しさん
2009/05/19(火) 09:26:28あれだと実装するの面倒なのよね。
0698デフォルトの名無しさん
2009/05/19(火) 09:50:080699デフォルトの名無しさん
2009/05/20(水) 02:20:27作ったのですが、リリースビルドにすると、LNK1257エラーが出ます。
今まではデバッグビルドでうまくビルドできており、ライブラリの場所などは同じになってます。
ライブラリもデバッグ用ではなく、リリース用のものを指定してあります。
C++でデバッグビルドで開発してたプロジェクトをリリースビルドにする際に、なにか
やらないとだめな設定ってありますか?
0700デフォルトの名無しさん
2009/05/20(水) 02:24:060701デフォルトの名無しさん
2009/05/20(水) 03:47:39それは次の方法で解決できる。(つづく)
0702デフォルトの名無しさん
2009/05/20(水) 09:06:11VisualStuidoスレへどうぞ。
つーか、指定しているライブラリがデバッグビルドとリリースビルドで名前が違うとか、
そもそもリリースビルド用がないとか、そんな落ちじゃないよな。
0703デフォルトの名無しさん
2009/05/20(水) 09:46:40なさそうですね。リンクしてるライブラリをコンパイルしたコンパイラと、現在使用中のコンパイラ
がバージョンが違うのかな。。。
0704699
2009/05/20(水) 10:12:43すいません。
> つーか、指定しているライブラリがデバッグビルドとリリースビルドで名前が違うとか、
> そもそもリリースビルド用がないとか、そんな落ちじゃないよな。
それは全部確かめてあります。名前が違うので、それは指定しなおしたし、ライブラリが存在することも確かめました。
とりあえずVisual Studioスレに逝ってきます。失礼しました。
0705デフォルトの名無しさん
2009/05/20(水) 12:28:34XPはメモリのチェックなど厳しくなってるのでしょうか?
0706デフォルトの名無しさん
2009/05/20(水) 12:29:220707705
2009/05/20(水) 12:40:13そもそもがおかしいのでなんとも言えないのですがNTでは問題なく動作していました。
0708デフォルトの名無しさん
2009/05/20(水) 12:48:34…
a[5] = 1;
…
i = a[5];
…
配列の範囲外読み込み/書き込みは 未定義
鼻から悪魔 〜 一見正常に動作しちゃうように見える まで
"メモリ共有違反で落ちまくり" も未定義の動作としては正しいな
0709デフォルトの名無しさん
2009/05/20(水) 14:31:51いつかきっと俺の所へも二次元嫁が…
0710デフォルトの名無しさん
2009/05/20(水) 14:37:270711デフォルトの名無しさん
2009/05/20(水) 14:38:440712デフォルトの名無しさん
2009/05/20(水) 14:48:520713デフォルトの名無しさん
2009/05/20(水) 17:47:09t=hoge;
t.メンバ名;みたいな感じでhogeの中のメンバの取得ってできますか?
0714デフォルトの名無しさん
2009/05/20(水) 17:48:51t が参照なら可能
0715デフォルトの名無しさん
2009/05/20(水) 17:51:300716デフォルトの名無しさん
2009/05/20(水) 19:08:28STLなんかは実際に利用すると非常に便利ですが
自分でテンプレートを使用するとなると使い所とかメリットがさっぱり思いつきません
皆さんどのように、どんな場面で利用されてるのでしょうか?
0717デフォルトの名無しさん
2009/05/20(水) 19:21:41Effective C++やC++ Coding Standardsを、
テンプレートの高度な活用についてはModern C++ Designを参照。
Boostの中身をのぞくというのもあり。
0718デフォルトの名無しさん
2009/05/20(水) 21:03:44C++の基本的な知識があれば、さっくり読めるレベル。
0719デフォルトの名無しさん
2009/05/20(水) 21:35:25違う
参照にヌルは入らない
配列の参照も作れない
0720デフォルトの名無しさん
2009/05/20(水) 21:36:490721デフォルトの名無しさん
2009/05/20(水) 21:43:02構造体型* t;とか?
0722デフォルトの名無しさん
2009/05/20(水) 21:46:15hoge_t& t = hoge;
0723デフォルトの名無しさん
2009/05/20(水) 22:04:32今度やってみる
0724デフォルトの名無しさん
2009/05/20(水) 22:49:26Java厨はお呼びでないです
0725デフォルトの名無しさん
2009/05/20(水) 23:13:10C/C++ をマッタク触ったことがない訳じゃないだろうけど
配列の初期化や演算子の優先順辺りで躓いて孤独に力技してる可哀相な人なんだろうな
0726デフォルトの名無しさん
2009/05/20(水) 23:15:18いやまてその脳内補完はどうかとおもうぞい
0727デフォルトの名無しさん
2009/05/20(水) 23:26:04参照の配列とやらを見せてほしいな
C/C++とか言ってる時点であれだけど
配列の参照と参照の配列は違うし
演算子の順序の問題でもない
0728デフォルトの名無しさん
2009/05/20(水) 23:27:16内容より読みやすさで重視ですか
0729デフォルトの名無しさん
2009/05/20(水) 23:27:340730デフォルトの名無しさん
2009/05/20(水) 23:30:40どう作るの?
0731デフォルトの名無しさん
2009/05/20(水) 23:31:46やったことないけどこれでどう?
char a;
char b;
char& c[]={a,b};
0732デフォルトの名無しさん
2009/05/20(水) 23:43:34もちろんコンパイルエラー
0733デフォルトの名無しさん
2009/05/20(水) 23:54:41char a[1];
char (&b)[1] = a;
ところでこれ意味あるのかな
0734デフォルトの名無しさん
2009/05/20(水) 23:58:540735デフォルトの名無しさん
2009/05/20(水) 23:59:50ある
配列にsizeof演算子がちゃんと適用できる
0736デフォルトの名無しさん
2009/05/21(木) 00:01:44要素数を求める関数テンプレートが作れる。
template<typename T, std::size_t N>
std::size_t size(T (&)[N])
{
return N;
}
0737デフォルトの名無しさん
2009/05/21(木) 00:04:07いいからコード書いてよw
0738デフォルトの名無しさん
2009/05/21(木) 00:26:52過去に似たようなこと試して
参照の配列は作れません
と明確にエラー吐かれた(msvc)
0739デフォルトの名無しさん
2009/05/21(木) 00:38:59#include <math.h>
int main()
{
int i;
for(i = 0; i < 20; i++)
{
double a = pow(0.5, i+50);
double b = 1.0 + a;
printf("n=%d, %d, %d\n", i+50, 1.0==1.0+a, 1.0==b);
}
}
これ実行すると2列目も3列目もn=52で境目ができると思ったんですが、
VC9はその通りになるもののgccだと2列目の境がn=63にずれます。なんででしょうか?
gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/
doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with
-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-g
xx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --
enable-objc-gc --enable-mpfr --enable-targets=all --enable-cld --enable-checking=release --build=i486-linu
x-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)
0740デフォルトの名無しさん
2009/05/21(木) 00:40:56配列のポインタと同じじゃね?と勘違いしてた
ポインタだと*p[0]とかになるのか
>>736
テンプレートは便利だよな、テンプレートと参照の組み合わせはよく使う
0741デフォルトの名無しさん
2009/05/21(木) 01:04:13推測だけど、x86のfpレジスタは80ビットあるから、計算の途中で
(メモリに書くなどして)64bitに落とすか落とさないかで結果が違うんじゃないかね
# VC9でも最適化をかけると、gccと同じになったりするかも
0742デフォルトの名無しさん
2009/05/21(木) 01:23:55ありがとうございます。
「浮動小数点 80bit」でぐぐったらいろいろ出てきました。
0743699
2009/05/21(木) 07:02:55public:
hoge(int i);
};
のように、引数を1つ取るコンストラクタしかないクラスの場合に、これの配列を
作ることは出来ますか?
0744699
2009/05/21(木) 07:19:18こんな感じで出来ました。でもトリッキーですね。
0745デフォルトの名無しさん
2009/05/21(木) 10:26:13#include <iostream>
class Foo {
int i, j;
public:
Foo(int i, int j = 0) : i(i), j(j) {
std::cout << "constructor " << i << " " << j << std::endl;
}
~Foo() {
std::cout << "destructor " << i << " " << j << std::endl;
}
void print() {
std::cout << i << " " << j << std::endl;
}
};
int main()
{
Foo foo[3] = {
0,
Foo( 1, 1 ),
2,
};
for (int i = 0; i < 3; ++i) {
foo[i].print();
}
return 0;
}
0746デフォルトの名無しさん
2009/05/21(木) 10:29:00それともヘッダのような物に分離しておいていますか?
メンバ関数についても直接クラスに書いていますか?
それとも宣言だけをクラスに書いて実際の関数の中は
別にわけていますか?
0747デフォルトの名無しさん
2009/05/21(木) 10:47:100748デフォルトの名無しさん
2009/05/21(木) 11:28:02書き換え時はメンバ関数のみとして参照の際は直接見るようなことはできますでしょうか?
0749デフォルトの名無しさん
2009/05/21(木) 11:37:08#include <conio.h>
int main(void) {
int tn, ti, tsum;
printf("正の整数nを入力せよ: ");
scanf("%d", &tn);
tsum = 0;
for(ti = 1; ti <= 100; ti++) {
if (ti % tn == 0) {
printf("%d\tn", ti);
tsum += ti; }
}
printf("%d\n", tsum);
getch();
return 0;
}
これを実行すると表示される整数の前にnが出てきます。
これを消すにはどこを変えればいいのでしょうか?
0750699
2009/05/21(木) 11:37:16それはポインタ1個分だけ増えると思えばいいでしょうか?
0751デフォルトの名無しさん
2009/05/21(木) 11:38:58見辛すぎますが、どうかよろしくお願いします。
0752デフォルトの名無しさん
2009/05/21(木) 11:42:470753デフォルトの名無しさん
2009/05/21(木) 11:46:29ありがとうございました。
0754デフォルトの名無しさん
2009/05/21(木) 11:49:25x^2 や、√x などを、上手く表示したいのです。
簡単な数式をCDC::OutTextなどで表記する方法って無いでしょうか?
0755デフォルトの名無しさん
2009/05/21(木) 11:53:07ない。自分で作るしかない。
0756デフォルトの名無しさん
2009/05/21(木) 12:32:07まだ書かないの?
0757デフォルトの名無しさん
2009/05/21(木) 12:35:180758デフォルトの名無しさん
2009/05/21(木) 12:43:08全ての型に対応しなければならないかという質問なら、そんなことはない。
対応してない型なら意味不明なエラーを返すようなのは現行ライブラリにもいっぱいある。
それをなんとかしようぜというのがC++0x(次期規格)に盛り込まれているが、
いつ実装されることやら。。。
0759デフォルトの名無しさん
2009/05/21(木) 12:45:09ウィキペにあった静的継承の例文なんですが
template <class Derived>
struct base
{
void interface() {
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
};
struct derived : base<derived>
{
void implementation();
};
この例だと<class Derived>には明らかにimplementation()という関数をもった型が入ることが期待されてるわけですが
この場合は、不適当な型が入った場合コンパイルエラーになるから問題なしという考え方なのでしょうか?
0760デフォルトの名無しさん
2009/05/21(木) 12:48:25ありがとうございました
0761デフォルトの名無しさん
2009/05/21(木) 15:23:55内部変数を格納する構造体struct HogeVal 、HogeValから派生したHogehogeVal、HageValをもっています
HogeVal* GetVla();と言う関数でclass HogeViewやその派生系に内部変数を渡して
class Hogehoge、class HageではHogeValをdynamic_castして中身を確認していますが
dynamic_castは出来ることなら使わない方が良いとききます。
もっとよい値の渡し方はないでしょうか?
0762デフォルトの名無しさん
2009/05/21(木) 16:02:22matrix[a][b]みたいにするか、それに近い動作はできないでしょうか?
vector.hは使っています。
0763デフォルトの名無しさん
2009/05/21(木) 16:51:230764デフォルトの名無しさん
2009/05/21(木) 16:59:021. vector<vector<なんか> >
2. boostを使ってもいい環境なら、ググってboost::multi_arrayを導入する。
3. new
0765デフォルトの名無しさん
2009/05/21(木) 18:57:37C++だと無いんだっけ。
0766デフォルトの名無しさん
2009/05/21(木) 19:05:18STLあるし
0767デフォルトの名無しさん
2009/05/21(木) 19:35:410768デフォルトの名無しさん
2009/05/21(木) 19:41:51HogeとHogeView、つまりModelとViewが常に適切な一対であるような仕組みを用意してあげるなら
dynamic_castしても良いんじゃない?
AbstractFactoryパターンを適用してFactoryにHogeとHogeViewのインスタンスの生成を丸投げしてしまえばいい
Abstract Factoryが解らないならググってください、為になるんで
いつも書き捨てでめんどくさいからcastしちゃうけどもっと良いやり方あるものなの?
0769デフォルトの名無しさん
2009/05/21(木) 19:41:560770デフォルトの名無しさん
2009/05/21(木) 19:46:300771769
2009/05/21(木) 21:16:060772デフォルトの名無しさん
2009/05/21(木) 21:16:510773デフォルトの名無しさん
2009/05/21(木) 23:25:35Hoge Hoge::operator*(double rhs);
というのを定義すれば、Hoge×doubleはできますが、
逆も出来るようにするには、Friend関数を使わないと駄目ですか?
0774デフォルトの名無しさん
2009/05/21(木) 23:28:15フレンドにしなくても、
Hoge operator*(double, const Hoge&);
ってできなかったっけ?
0775デフォルトの名無しさん
2009/05/21(木) 23:36:03以下のFriend関数だとコンパイルは通るんですが、、、
こう書くしかだめですかね?
friend Hoge operator*(double lhs, const Hoge& rhs) {
Hoge tmp;
tmp.m_x = rhs.m_x * lhs;
return tmp;
}
Hoge operator*(double lhs, const Hoge& rhs) {
Hoge tmp;
tmp.m_x = rhs.m_x * lhs;
return tmp;
}
0776デフォルトの名無しさん
2009/05/21(木) 23:42:092008のVC++で確認したけど、frendじゃなくても引数が多いなんて
エラーは出ないよ。
0777デフォルトの名無しさん
2009/05/22(金) 00:03:29ほんと?
手元の環境もVS2008 SP1だけど、C2804というエラーが出るよ。
バイナリオペレータの引数が多すぎますとか言ってる。
0778デフォルトの名無しさん
2009/05/22(金) 00:16:57クラス定義の外に書け。
0779デフォルトの名無しさん
2009/05/22(金) 00:31:30Hoge operator*(double lhs) {
Hoge tmp;
tmp.m_x = this->m_x * lhs;
return tmp;
}
0780デフォルトの名無しさん
2009/05/22(金) 00:36:00まずいだろそれ。
0781デフォルトの名無しさん
2009/05/22(金) 00:49:04自分は779じゃないけど、779の書き方で問題ないと思うけどな。
例外が考慮されてないとか、そういう話?
0782デフォルトの名無しさん
2009/05/22(金) 00:52:00メンバ関数での演算子のオーバーロードではオブジェクト型が左辺に来るようにしないといけない約束だから
friend指定でグローバル関数にしないとダメ
0783デフォルトの名無しさん
2009/05/22(金) 01:41:52例えば、その*が可換なら、こう定義できるでしょ。
class Hoge
{
Hoge operator *(double rhs) const;
};
inline Hoge operator *(double lhs, const Hoge& rhs)
{
return rhs * lhs;
}
0784デフォルトの名無しさん
2009/05/22(金) 02:16:06T operator* ( T , T ) を定義するんだけど、それはいやなのかしら?
暗黙の型変換がいやなので必ずexpliciteをつける主義とか。
0785デフォルトの名無しさん
2009/05/22(金) 07:36:59Lispみたいにいつまでも生き残ってほしい。
0786デフォルトの名無しさん
2009/05/22(金) 07:52:57大部分の仕事がCとJavaだけで済ませちゃってるもんな
C++はだんだん現実の言語とは乖離するような方向に行っちゃってる
ような危機感を覚えるのは俺だけではないだろう
0787デフォルトの名無しさん
2009/05/22(金) 07:55:44ただc#などのオブジェクト指向の言語を経験してしまうと
Cで書いててもなぜかそれっぽい書き方をしてしまうので
C++は必要だとは思う。
でもC++を使いこなしすぎると乖離していくんだろうな
0788デフォルトの名無しさん
2009/05/22(金) 08:15:49とかを使って頑張って書いても、正直性能が一番いいわけでもないし、一番速く書けるわけでもないし。
自分の場合は、楽をするためにRubyとかC#とかを選択することは結構多い。でもC++の場合STLとかBoost
とかを使って楽をしようとすると、C++の利点である性能から見るとマイナスだと思うし、しかもあんまり
楽じゃないし…
そんな感じ。
0789788
2009/05/22(金) 08:20:25なんつーか、自分が「C++を選びたい!」というモチベーションが昔と比べて低くなってきたというか、、、
みんなはこれからもC++の技量を磨き続けていこうと思っていますか?
0790デフォルトの名無しさん
2009/05/22(金) 08:22:26問題は個人の自由じゃなく仕事があるかどうかで
仕事によってはC++を信望してる痛い上司がいるとC++でやるしかないわけで・・・
0791デフォルトの名無しさん
2009/05/22(金) 09:30:230792デフォルトの名無しさん
2009/05/22(金) 09:54:17仕事はこれからもあると思うし、それなりにペイもいいんじゃないかと思う。
今じゃ大学で教えるのはJavaだし、Cでアセンブラに近いところが書けてC++
のオブジェクト指向なコードも分かるプログラマって、今後は減ることはあっても
増えないでしょ。
ところで、今でもC++が一番性能が出せる言語なのかな?
最近CのコードをC++に書き直す仕事をやってて、わかりにくいコードをクラスとか
定義して書き直していくと、コードの抽象度が高まるにつれて、実行速度が低下して
いくのをみて、「性能ならC++」という世間の風評に疑問をもつようになった。
0793デフォルトの名無しさん
2009/05/22(金) 09:58:16何言ってんだ
0794デフォルトの名無しさん
2009/05/22(金) 10:01:26それでもまぁ他の言語に比べれば早いんじゃないの?適切に組まれてれば
0795デフォルトの名無しさん
2009/05/22(金) 10:13:30まあそれは分かる。それでもコンパイラの力でCで書いたのと同じくらいになるのかなと思ってたんだよ。
Javaやスクリプト系の言語とかと比べた場合に、性能重視ならC++って言うでしょ。
でも、スマートポインタを使えば速度ガタ落ち、DB関係は苦労してC++で書いてもRubyやC#で適当に書いたのと
ほぼ同じ性能(DB側が時間を食ってるから)、、、とかさ。
テンプレートくらいだよ、最近C++使ってて楽しいのは。
いまさら新しい言語とか覚えられないしな。かりに覚えられても、俺の今のC++の水準まで行こうとしたら、
どれだけ大変か、、、
0796デフォルトの名無しさん
2009/05/22(金) 10:18:51C++の便利な部分を利用すればするほどコストが増大していく
betterCで使えばCと大差ないんじゃない?(当たり前か
0797デフォルトの名無しさん
2009/05/22(金) 10:23:28Cと比較するとやっぱりC++は速度が落ちる。
0798デフォルトの名無しさん
2009/05/22(金) 12:48:580799デフォルトの名無しさん
2009/05/22(金) 12:58:39> コードの抽象度が高まるにつれて、実行速度が低下し
> ていく
C++ には C++ なりの速度の出し方がある。malloc/free
をそのまま new/delete に置き換えるだけじゃ駄目だぞ?
0800デフォルトの名無しさん
2009/05/22(金) 13:07:410801デフォルトの名無しさん
2009/05/22(金) 13:28:520802デフォルトの名無しさん
2009/05/22(金) 13:29:35Java遅すぎる
0803デフォルトの名無しさん
2009/05/22(金) 13:31:54しかし、そこそこの実行速度が出る便利な言語
異様な言語仕様とトレードオフになったが・・・
0804デフォルトの名無しさん
2009/05/22(金) 13:32:35開発が遅いC++ or Cに言われたくないな
0805デフォルトの名無しさん
2009/05/22(金) 13:33:36Javaってまだ開発案件あるの?
0806デフォルトの名無しさん
2009/05/22(金) 13:41:340807デフォルトの名無しさん
2009/05/22(金) 13:55:11ある
今の所Javaが一位
これとセットで速くて高価なハードウェアを売りつける
それで糞遅いJavaの欠点を隠蔽するわけ
0808デフォルトの名無しさん
2009/05/22(金) 14:02:34でアプリを動かす条件さえ飲んでもらえば、最適
今の所二位
Linux上でもMonoを使えばC#3.0までは動くしSIMDもついにサポートした
速度もどんどん速くなってるしC#3.5もそのうち出来るでしょう
マルチコアCPUでGCを分担作業するというのはなかなかいい
0809デフォルトの名無しさん
2009/05/22(金) 14:24:30プログラマ視点だと「またかよ」感があるけど
0810デフォルトの名無しさん
2009/05/22(金) 14:30:24C#触りだしたら気に行っちゃって、何でもこれでいけないか考えちゃうようになってしまった。
上から下までこれで行きたいわ。サーバはJavaクライアントはC++がまだ多いけど。
0811デフォルトの名無しさん
2009/05/22(金) 16:15:44public:
void SetT(T input);
}
Base<int> base1;
Base<double> base2;
このbase1とbase2は別の型扱いで良いのでしょうか?
また、このBaseから派生したクラスを作るときは
template <class T> class Derived : public Base<T>
{//〜〜〜//}
という形で良いのでしょうか
で、やはりこれもテンプレート引数が異なれば別の型扱いでしょうか?
0812デフォルトの名無しさん
2009/05/22(金) 17:18:41これ多言語で組もうとしたら大変な事になる
0813デフォルトの名無しさん
2009/05/22(金) 17:19:46○他言語
>>811
別の型
typeid().name()を見てみ
0814デフォルトの名無しさん
2009/05/22(金) 17:22:22後で出来た言語なんだからそういう親和性があって当然かと
過去の言語の不味かったところとかを解消するために出来上がってるんだし。
そういう意味ではC++は中途半端なんだよな
0815デフォルトの名無しさん
2009/05/22(金) 17:28:00普及しなきゃ終わりっていう現実と戦った結果だからしかたなかんべ。
javaのような成功は稀。ほとんどの言語は理想だけで消えていく。
0816デフォルトの名無しさん
2009/05/22(金) 17:39:45そのJavaもそろそろ役目終えそうな気配ではあるが
0817デフォルトの名無しさん
2009/05/22(金) 17:45:37初めは酷い言われようだったな
0818デフォルトの名無しさん
2009/05/22(金) 18:44:32いつもの数倍増しで低レベルでキモイ進行
0819デフォルトの名無しさん
2009/05/22(金) 19:11:350820デフォルトの名無しさん
2009/05/22(金) 19:15:420821デフォルトの名無しさん
2009/05/22(金) 19:30:110822デフォルトの名無しさん
2009/05/22(金) 19:32:27#ifdef AAA || BBB
#endif
と書いても駄目でした。どうすればいいですか?
VC++です。
0823デフォルトの名無しさん
2009/05/22(金) 19:34:36keybrd_event
0824デフォルトの名無しさん
2009/05/22(金) 19:56:50#if defined(AAA) || defined(BBB)
0825デフォルトの名無しさん
2009/05/22(金) 19:59:430826デフォルトの名無しさん
2009/05/22(金) 20:24:30助かりました。
0827デフォルトの名無しさん
2009/05/22(金) 20:27:35意味不明
名前欄に名前を入れて
環境について書いてください
0828ははは
2009/05/22(金) 20:42:130829デフォルトの名無しさん
2009/05/22(金) 21:11:44例えば CTRL + C を送る場合、
kill(プロセスID, SIGINT);
0830デフォルトの名無しさん
2009/05/22(金) 21:20:51静的な配列 hoge[2][4] を動的に宣言した関数 test(char **hoge) に渡す場合どうすれば
変換エラーが無くなるのでしょうか。
試しに関数呼び出しに (char **) と添え字したらメモリ関連で止まる感じでした。
0831830
2009/05/22(金) 21:22:36あくまで動的宣言でのポインタ受け渡しをしたくて・・・。言葉足らずでした。
0832デフォルトの名無しさん
2009/05/22(金) 21:23:58無理です。強引に型キャストすればエラーは出なくなりますが
配列の構造が異なるため正常に動作しません。
0833830
2009/05/22(金) 21:37:26他の形式で対応してみます。。
よくよく考えてみたら動的に割り振った方はブロックサイズが解らないんですね。
0834デフォルトの名無しさん
2009/05/22(金) 21:40:12宣言
test(char*hoge[4]);
呼出し
char hoge[2][4];
test(hoge);
0835デフォルトの名無しさん
2009/05/22(金) 21:48:06メモリ上で連続しているオブジェクトに対しては
そのポインタに整数の加減算が可能ということを
シンタックスシュガーである[]を使って実行しているだけ
と考えるべきなんじゃないか、と。
そうすれば char [][] を char ** で置き換えることは不可能だと
自然に理解できる。できない?あ、そう。
0836デフォルトの名無しさん
2009/05/22(金) 22:06:17void f (int m, int n, int a[m][n]) { ... }
みたいな書き方ができるはず。
0837デフォルトの名無しさん
2009/05/22(金) 22:20:28char[][]は無いだろう。ひどい説明だ。
>>836
せめてa[][n]にしてくれ。ひどい説明だ。
0838デフォルトの名無しさん
2009/05/22(金) 22:23:58test(char*hoge[4]);
はエラーだけどね。
0839デフォルトの名無しさん
2009/05/22(金) 22:24:29だから二次元配列(配列へのポインタ)とポインタへのポインタは
構造が異なるから書けたとしても渡せないわけ
0840デフォルトの名無しさん
2009/05/22(金) 22:27:50そりゃ int a[m][n] のmはあってもなくても同じだけど、あっても文法違反じゃないからいいじゃん。
なんとなく書いた方がm*nの配列を渡したいという意図が伝わるような気がしないでもない。
0841デフォルトの名無しさん
2009/05/22(金) 22:33:09うひ。これでちゃんとうごくのね。いいこと教えてもらった。
#include <stdio.h>
int f(int m, int n, int a[m][n]) {
int x = 0, i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
x += a[i][j];
return x;
}
int main (void) {
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int b[2][3] = {{2, 3, 4}, {5, 6, 7}};
printf("%d¥n", f(3, 2, a));
printf("%d¥n", f(2, 3, b));
return 0;
}
0842デフォルトの名無しさん
2009/05/22(金) 22:35:34#include <stddef.h>
#define SIZE_Y 4
void bar( int *p, size_t s ) {
size_t i;
for ( i = 0; i != s; ++i ) {
printf( "%d ", p[i] );
}
printf( "\n" );
}
int main() {
int i[][SIZE_Y] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9,10,11,12 },
{ 13,14,15,16 },
};
size_t s = sizeof i / sizeof i[0][0];
bar( ( int * )i, s );
return 0;
}
0843デフォルトの名無しさん
2009/05/22(金) 22:39:120844デフォルトの名無しさん
2009/05/22(金) 22:44:56void g (int m, int n) {
int a[m][n], i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
a[i][j] = m * i + j;
printf("%d¥n", f(m, n, a));
}
0845デフォルトの名無しさん
2009/05/22(金) 22:49:55決まってなければならないと習ったのですが、>>844 みたいに引数を使っ
て宣言するのはありなんでしょうか。
0846デフォルトの名無しさん
2009/05/22(金) 22:52:150847デフォルトの名無しさん
2009/05/22(金) 22:52:30C99(ISO/IEC 9899:1999)なら通ります
Indel C++が100%対応
gccが部分的に対応
***しかし大部分のコンパイラは対応しておりません***
0848デフォルトの名無しさん
2009/05/22(金) 22:55:16世界を征服しているのかと思ってた。つか対応してないコンパイラって何?
0849デフォルトの名無しさん
2009/05/22(金) 22:57:12どっかの大学の先生が自分のブログに、C99を教育に使うのは時期尚早だとか書いてたのを思い出した。
0850デフォルトの名無しさん
2009/05/22(金) 22:57:58Visual C++ のCコンパイラはいまだにC99の大部分の機能が使えないんじゃなかったっけ?
0851845
2009/05/22(金) 23:03:01ありがとうございます。講義で使っているのはLinux上のgccなので
たぶん大丈夫なのかも。でも宿題のプログラムで >>844 みたいな
書き方をすると×を喰らいそう。小学校の算数で習ってない解き方を
して×を喰らったトラウマが…
>>846
講義を担当されている先生は結構お年寄りで、ご専門はソフトウェア
工学じゃなく信号処理らしいので、必ずしも最近のプログラミング
言語事情には詳しくないのかもしれません。
0852デフォルトの名無しさん
2009/05/22(金) 23:03:54いくら何でも世の中を知らなすぎる。
0853デフォルトの名無しさん
2009/05/22(金) 23:14:50つまり10年も前に制定されたのよ?
マウスイヤーとさえ呼ばれるIT業界で、どこまで進化を拒む気なのだ^^
0854デフォルトの名無しさん
2009/05/22(金) 23:19:310855デフォルトの名無しさん
2009/05/22(金) 23:43:19特にライブラリ関係で
0856デフォルトの名無しさん
2009/05/22(金) 23:50:150857デフォルトの名無しさん
2009/05/23(土) 00:13:05なんであんなバカな国際規格を無理矢理通そうとするかねえ
0858デフォルトの名無しさん
2009/05/23(土) 00:16:010859デフォルトの名無しさん
2009/05/23(土) 00:33:24主要コンパイラメーカーが無視して対応しようとしない
C++の上位互換性が大きく損なわれてしまい未だに
C89が使い続けられる結果に
0860デフォルトの名無しさん
2009/05/23(土) 00:52:47C規格改定 1999年
まずこれがおかしい
摺り合わせろよ
0861デフォルトの名無しさん
2009/05/23(土) 01:25:09メタなところ(制定プロセス)から反省すべきだったんだろうと思う。
0862デフォルトの名無しさん
2009/05/23(土) 01:44:38C++がCの上位互換として作られたのに、その土台となるCがC++規格化後に大幅改定になったらだめだろうってこと?
0863デフォルトの名無しさん
2009/05/23(土) 01:56:30互換ガン無視で物凄く便利な言語に移ればいい
0864デフォルトの名無しさん
2009/05/23(土) 01:58:18過去の言語よりいいべ
で生まれた互換性がん無視なんていっぱいあるけどどれも微妙じゃん
0865デフォルトの名無しさん
2009/05/23(土) 02:52:10さすがtemplate,genericsにはできないことがちゃんと出来ている
0866デフォルトの名無しさん
2009/05/23(土) 02:57:09VC++6.0だけど関数宣言時に 定数式が必要 ってエラー吐くなぁ・・・。
0867デフォルトの名無しさん
2009/05/23(土) 02:58:170868デフォルトの名無しさん
2009/05/23(土) 03:00:21Cソースの書き方であっても拡張子をcppにしておけばC++側でコンパイルするので
結果C99な書き方ができるんじゃなかったっけ?
0869デフォルトの名無しさん
2009/05/23(土) 03:03:22趣味レベルでCを扱う場合は.cppでCライクな書き方をしてる
0870デフォルトの名無しさん
2009/05/23(土) 03:10:130871デフォルトの名無しさん
2009/05/23(土) 03:42:37int a;
int* ptr_array[5] = {&a,&a,&a,&a,&a};
これはポインタの配列。で、参照の配列が出来るなら
int a;
int& ref_array[5] = {a,a,a,a,a};
で出来るのかなと思ってやってみたけど、駄目でした。
できるのでしょうか?
0872デフォルトの名無しさん
2009/05/23(土) 04:20:32基本的に出来ない
struct ref_int{ int &a; ref_int(int&a):a(a){;} };
int a;
ref_int ref_array[5] = {a,a,a,a,a};
無理矢理やればそれっぽいことはできるけど意味があるのかは不明
0873デフォルトの名無しさん
2009/05/23(土) 05:33:33通信条件を設定するメソッドですが
void SetProperty(DCB &dcb)
としてユーザー側にDCBを設定させるのと
void SetProperty(const char* portname , 〜〜〜)
と、最低限のプロパティを引数で受けて、制御クラスがDCBを弄るのはどっちがよいでしょうか?
0874デフォルトの名無しさん
2009/05/23(土) 09:44:41一部を許可するなら後者。っていうか「最低限」て書いてあるから結論出てる?
0875デフォルトの名無しさん
2009/05/23(土) 13:52:57MFC ってどうなの?
0876デフォルトの名無しさん
2009/05/23(土) 14:29:01C++ Builder ってどうなの?
0877デフォルトの名無しさん
2009/05/23(土) 15:16:430878デフォルトの名無しさん
2009/05/23(土) 15:47:33すごく初歩的な質問で申し訳ないのですが、教えて頂けると助かります。
あるクラスAをクラスBの中でインスタンス化し、
それをクラスBの中で使おうかと考えています。
Javaっぽく書くと
class A{
B b
A(param){
b = new B(param)
}
someFunc(){
b.hogehoge()
}
}
って感じです。
ただ、C++の本に書いてある初期化方式
A a(param);
だと、宣言と実体化が同一箇所でやる必要があるため、
コンストラクタの中でインスタンス化した場合、
他のメソッドでそのインスタンスを使えません。
これってどうやって解決すればよいのでしょうか?
よろしくお願いします。
0879デフォルトの名無しさん
2009/05/23(土) 15:54:14class A {
B b;
public:
A(param) : b(param) {} // 引数渡して初期化
void someFunc() { b.hogehoge(); }
};
という感じ。
0880デフォルトの名無しさん
2009/05/23(土) 15:54:40逆じゃないか?
0882デフォルトの名無しさん
2009/05/23(土) 16:03:43フィールドの変数を、コンストラクタ以外のメソッドで初期化するには、
同様に
method(): hogehoge{
}
って形になるのですか?
0883882
2009/05/23(土) 16:14:360884デフォルトの名無しさん
2009/05/23(土) 16:23:12ポインタでやるのがいいんじゃ?
B* b;
b = new B(param);
b->hoge();
delete b;
0885デフォルトの名無しさん
2009/05/23(土) 16:24:24コンストラクタ以外でやりたければ、単に代入すればいい。
0886デフォルトの名無しさん
2009/05/23(土) 16:25:08class C{int x;public:C(int x_):x(x_){}};
class A{public:B b: C c;};
A a={0,(0)};
みたいな感じ
0887882
2009/05/23(土) 16:28:10おお、動きました。感動です。
文法的にはJavaに似ていると思っていたのですが、
実際にやってみるとだいぶ違うみたいですね。
ありがとうございました。
0888デフォルトの名無しさん
2009/05/23(土) 16:28:53Javaのようなインスタンス化なんて考えなくていい。
0889882
2009/05/23(土) 16:33:10もうちょっと詳しく教えてもらえませんか。
さっき、
class A{
B b;
somefunc(){
b = B(hogehoge);
}
とやったら、エラーが出て無理でした。
884の人みたいに、ポインタに代入しろって意味でしょうか。
>>886
よく意味がわかりません。
コンストラクタも、メソッドも使わずに
フィールドに代入できるってことでしょうか?
0890デフォルトの名無しさん
2009/05/23(土) 16:46:18b = B(hogehoge);とやりたければ、クラスBに代入演算子を定義する。
が、Bの意味として代入できるのが相応しくないというのは割とよくあることなので、
(だからJavaのクラスは参照型でnewしてやるのはJavaでは適切な判断だったと思う)
そういうときは>>884のようにポインタを使う。
0891882
2009/05/23(土) 17:00:15なるほど。
ただ、自分で代入演算子を定義すると面倒くさいので、
ポインタを使う方針でいくことにします。
ありがとうございました。
0892デフォルトの名無しさん
2009/05/23(土) 20:19:06C#3.5て何よwww
そして参照の配列はどうなった
0893デフォルトの名無しさん
2009/05/23(土) 23:58:28class{
void func(Type0 t0, Type1 t1){ t0 * t1; }
};
としたときに、
Type0 * Type1 となるような演算子オーバーロードがされていない場合、
コンパイルエラーになるような方法ってありますか?
0894デフォルトの名無しさん
2009/05/24(日) 00:11:53何がしたいのか意味不明だけど。
0895893
2009/05/24(日) 00:40:52ありがとうございます。
挙げた例は実際のものではありませんが、
Type0 と Type1 となるクラスの条件が、
Type0 * Type1 が定義されていること したかったのでお聞きしました。
0896デフォルトの名無しさん
2009/05/24(日) 00:45:340897893
2009/05/24(日) 01:53:23ありがとうございます。
確かに私の想定しているものに近いです。
先日、std::mapのKeyに自分で定義した型を使用したときに、
<演算子が無い、と怒られたのですが、あれはどうなってるんですかね?
0898デフォルトの名無しさん
2009/05/24(日) 01:56:43map は整列させるときに < の演算子を使うから
key の < 演算子をオーバーロードしないかぎり使えないだけ
0899893
2009/05/24(日) 03:09:23再度質問になってしまうのですが、
map のエラーと、
>>893 のコンパイルが通ってしまうことの違いが分かりません。
>>893 は > ではなく * を使ってるだけで、
(プリミティブ以外)オーバーロードしなければならない演算子という意味では同じように見えてしまうのですが。
0900デフォルトの名無しさん
2009/05/24(日) 04:23:19という関数で、ファイルからcountバイト分だけ読み出してbufferに書き込みたいのですが
bufferの示す先が何バイト確保されてるか確認する方法はあるのでしょうか?
0901デフォルトの名無しさん
2009/05/24(日) 04:37:410902デフォルトの名無しさん
2009/05/24(日) 04:51:11そうするとオーバーラン上等な仕様にするしかないのか・・・
それとも他に良い方法はあるでしょうか?
0903デフォルトの名無しさん
2009/05/24(日) 05:02:07それが嫌ならもっと安全で高級な言語を使えばよい。
0904デフォルトの名無しさん
2009/05/24(日) 05:24:23C++でいいならvectorとか
0905デフォルトの名無しさん
2009/05/24(日) 05:51:480906デフォルトの名無しさん
2009/05/24(日) 06:45:53というかchar x count バイトだろ?
0907デフォルトの名無しさん
2009/05/24(日) 09:47:08map でも使うまではエラーにならなくないか?
>>893 の場合だと func を使おうとしたらコンパイルエラーになるはず
0908デフォルトの名無しさん
2009/05/24(日) 13:04:08バッファは、Read()の中でmalloc()して返して、呼び出し側で責任もってfree()してもらうとか。
0909デフォルトの名無しさん
2009/05/24(日) 13:42:51伸ばしてくれるのを希望なら
std::getline(std::string&) を使えばよい
std::string は何も文字列だけを入れるわけじゃなくバイナリを
入れてもよい
0910デフォルトの名無しさん
2009/05/24(日) 13:57:170911デフォルトの名無しさん
2009/05/24(日) 14:01:230912デフォルトの名無しさん
2009/05/24(日) 16:03:250913デフォルトの名無しさん
2009/05/24(日) 16:30:560914デフォルトの名無しさん
2009/05/24(日) 16:50:58C/C++の配列はそうやって扱う決まりだ。
0915デフォルトの名無しさん
2009/05/24(日) 16:53:050916デフォルトの名無しさん
2009/05/24(日) 16:58:08そっちの方が圧倒的に遅いしvetctorの遅さは問題になりにくいんじゃないか?
0917デフォルトの名無しさん
2009/05/24(日) 17:17:17バッファサイズ>countを期待するけど、呼び出し側のバグを回避するために
実際にbufferで確保されているメモリサイズが知りたいということじゃないの?
WindowsならAPIで上のことができたような気がするけど、ハンドルが必要だったかも・・・
0918デフォルトの名無しさん
2009/05/24(日) 18:59:200919デフォルトの名無しさん
2009/05/24(日) 21:06:45というスマポがあるときに、これにNULLを代入したい場合、
pT.reset();
pT.reset(NULL);
のどちらが正しいでしょうか?
どちらも可能みたいなのですが…
0920デフォルトの名無しさん
2009/05/24(日) 21:11:30ソースをちらっと見てみるといい
本当に簡単だから読めると思うよ
まったく一緒です
0921919
2009/05/24(日) 22:56:31pTがScoped_ptrの場合には
pT.reset(NULL);
と書けたのですが、pTがShared_ptrの場合には書けなかったので、
Explicitのせいかと思ったのですが、両方のコンストラクタが
Explicit指定になってました。それなのにどうしてScoped_ptrの場合に
NULL指定でResetできるのでしょうか?
0922デフォルトの名無しさん
2009/05/25(月) 00:01:21文字系の入出力とバイト文字系の入出力を混ぜたとき、ちゃんと動くことは
規格上保証されてるんでしょうか?
0923デフォルトの名無しさん
2009/05/25(月) 08:02:50[1] blitz::Array< T, 3 > ってあったとき、これはテンプレート型の…3は何を表しているんでしょうか?
というかそもそもblitz::Arrayって何ですか。行列か何か…?
[2] C++のヘッダファイルで、***.hと***.hppはどう違う?どう使い分けたらいい?
こういうC++の初心者の質問ってこのスレでいいんですかね…初心者歓迎って書いてあったからこっちにしたんですが
C++相談室 part69 の方が・・・?
0924デフォルトの名無しさん
2009/05/25(月) 08:21:421. 三次元
2.別にどっちでもいい
0925デフォルトの名無しさん
2009/05/25(月) 11:19:20A-B-C1--C2-----D
|-C'2-C'3-|
-C''2-C''3-
となっていてどのC2に移項するかはC1の結果次第となっているとき
C1からC2への動的な繋ぎ換え、C処理の末端からDへの動的な繋ぎ換えをどう実装したらよいでしょうか?
0926デフォルトの名無しさん
2009/05/25(月) 11:33:250927デフォルトの名無しさん
2009/05/25(月) 11:53:18クラスメソッドが、クラスのインスタンスから呼び出せるんだけど
これって当たり前だっけ?
class A
{
public:
static void func(){ ::OutputDebugStr( _T(__FUNCTION__) );}
};
A a;
a.func(); // OK
A::func(); // OK
0928デフォルトの名無しさん
2009/05/25(月) 11:54:58無理なのは逆な方
0929デフォルトの名無しさん
2009/05/25(月) 11:56:430930デフォルトの名無しさん
2009/05/25(月) 12:49:02もしかしてC#出身?
0931デフォルトの名無しさん
2009/05/25(月) 13:32:03いや、C#はあんまり経験はない。
むしろ>>927は、C#やJavaから許された
シンタックスシュガー的なもんだと思っていた。
0932デフォルトの名無しさん
2009/05/25(月) 13:40:05struct Int2Type{enum {value = v};};
というテンプレートを見たのですが、これって一体何に使うのでしょうか?
いまいち使い道がよくわからんです。
cout<<Int2Type<100>::value<<endl;
とかやると、100と表示されるんですが、これって何か意味あるんでしょうか?
0933デフォルトの名無しさん
2009/05/25(月) 13:54:41値によって異なる型を作るので、 オーバーロードを利用していろいろ使ったりする
静的なif文消滅させたり
0934デフォルトの名無しさん
2009/05/25(月) 15:15:53もしかして文系?
0935デフォルトの名無しさん
2009/05/25(月) 16:32:07プログラムがドラッグされたファイルを知る方法はありませんか?
0936デフォルトの名無しさん
2009/05/25(月) 17:01:27mainのchar**argvで分かる。
0937デフォルトの名無しさん
2009/05/25(月) 17:21:57整数を型に変換しているんだよ
テンプレートで型引数があってint引数が無い場合に int をいったん型にしてから使う。
value は型から元の値を引っ張り出すのに必要。
0938デフォルトの名無しさん
2009/05/25(月) 21:43:01ありがとうございます!
でも、テンプレート引数にint引数を追加すれば、わざわざInt2Typeとかを定義しなくても
やりたいことができませんか?
0939デフォルトの名無しさん
2009/05/25(月) 21:50:39できるときもあればできない時もある、定数の取り扱いと型のマッチングはちょっと違うので。
そもそもライブラリを書く側にしてみれば、全部型に統一して取り扱うほうがライブラリ側も統一できて便利だし統一されていればそれだけバグも少ないのだが、
逆に使う側からすれば指定するは毎回型ではたまったものではないと、折衷案を考えるとこうなる。
0940デフォルトの名無しさん
2009/05/25(月) 21:52:230941デフォルトの名無しさん
2009/05/25(月) 22:19:29難しいス。つまり
template <class T> class ccc{};
というクラスがあったときに、ccc<double>とも書けるし、ccc<Int2Type<100> >とも
書けるということが長所なんですかね。
0942デフォルトの名無しさん
2009/05/25(月) 22:47:23ググっても何かって説明が出てこないっす
0943デフォルトの名無しさん
2009/05/25(月) 22:55:24型の名前をバイナリに入れて、strcmpでもして調べているのでしょうか。
// SDKとして
class MyException : public std::exception {};
// DLLのホストで
typedef (void *DllFunc)();
DllFunc func = (DllFunc)GetProcAddress(..., "ExportedFunc");
try { func(); } catch (const MyException &) { /* 例外検出 */ }
// DLLで
extern "C" { __declspec(dllexport) void ExportedFunc() { throw MyException(); } }
とかやった場合、ホスト側とDLL側の実行ファイルは同じコンパイラで作られたものでないと、正常に動かないと言うことになりますか。
0944デフォルトの名無しさん
2009/05/25(月) 22:57:47これは直接使うものではなくてライブラリの中で使うのが一般的。
ライブラリを使う側には利便性を上げる、作る側には一般性の向上をもたらすもの。
0945デフォルトの名無しさん
2009/05/26(火) 00:04:250946デフォルトの名無しさん
2009/05/26(火) 00:09:13どういう状態を「空」と呼ぶかは設計次第なので、なんとも言えないが、
空の文字列、いわゆるヌル文字列なら先頭を'\0'にすればよい。
0947デフォルトの名無しさん
2009/05/26(火) 00:12:42ありがとうございます^^
0948デフォルトの名無しさん
2009/05/26(火) 01:22:19というプログラムを作っているのですが、
空行はどうやって表せばいいのですか?
0949デフォルトの名無しさん
2009/05/26(火) 01:31:580950デフォルトの名無しさん
2009/05/26(火) 08:35:30ちゃんと動くというのがどういうことかはわからないがプログラムは書いたとおりにちゃんと動く
sjisのファイルを読み込んでユニコードに変換して出力とか普通に可能
0951デフォルトの名無しさん
2009/05/26(火) 13:28:15ビルドに成功したあと、プログラムに書き加えたらビルドに失敗するということが良くあります
それでソースを別名でどんどん何種類も保存して必要があれば古いソースにさかのぼって
ビルドしたいと思ってるのですが、それがどうにもうまくいきません
昔使ったボーランドのbuilderXだとそういうことが楽にできたんですが
ちょっとVisual C++は慣れてないせいかお手上げ状態です
具体的には
1.ビルドに成功したソースファイルを別名で複製保存しておく
2.オリジナルか複製ファイルどちらかを改変する
3.それでビルドに失敗した場合
4.保存ファイルにさかのぼって1と同様のことをする
これだけのことがしたいのですがわかりやすい手順を教えてくださいませんでしょうか
0952デフォルトの名無しさん
2009/05/26(火) 13:37:36EEでなければAnkhSVNとか入れるのがいいと思うけど。
0953951
2009/05/26(火) 13:52:08ありがとうございます
Version 9.030729.1SP および Version 3.5 SP1となっています
すみませんEEとはなんでしょうか
AnkhSVNってのはなにかアドインみたいなものらしいことはググッてわかりました
これを入れればいいのですか?
0954デフォルトの名無しさん
2009/05/26(火) 13:54:250955デフォルトの名無しさん
2009/05/26(火) 13:56:12EEはアドイン使えないからね。
AnkhSVN入れるなら、それ自身ではリポジトリ作れないから他の
Subversionツールも必要。TortoiseSVNなんかお勧め。
バージョンあわせるなら、AnkhSVNは1.6サポートのDailyBuildのほうがいいよ。
でもまあSubversionの使い方覚えないとならんからやること多そうだな。
0956デフォルトの名無しさん
2009/05/26(火) 14:00:01残念ながらExpress Edition です
となると以外に難しいのかな
0957デフォルトの名無しさん
2009/05/26(火) 14:07:09バージョン管理ツールそのものをあまり使ったことがないのかな。
builderXは調べてみたけどバージョン管理ツール対応ってなってるね、
この機能使ってたのだろうか。
0958デフォルトの名無しさん
2009/05/26(火) 14:16:33お察しの通りバージョン管理ツールという言葉自体初耳でして
PCを新調したら使い慣れたbuilderXがダウンロードできなくなってるみたいなので
EEを使い始めてまだ全然慣れていない状況です
といってほかに使えそうなのもないのでTortoiseSVNってのを調べてみますが
意外と大変そうですね
0959デフォルトの名無しさん
2009/05/26(火) 14:22:37そうでもないよ
TortoiseSVNはエクスプローラーに拡張を施すだけなので
TortoiseSVNで管理させたいフォルダを設定すれば右クリックであれこれできる
最近オプソに参加するのに導入して使い出して、昨日自分のローカルプロジェクトを
ローカル鯖立てて管理するようにした。
まあweb鯖とアクセスするようなものだよ
0960デフォルトの名無しさん
2009/05/26(火) 19:30:41粒子を動かすシミュレーションをやっていて、運動量を計算する必要が無くなったので
その運動量を計算する部分を削ったのですが削る前と比べて明らかに遅くなりました。
そこで、削る前の状態から一つずつ式を削っていったのですが全く速度が変わらなかったため
最後に関数外の宣言部分を削ったところ、また遅くなりました。
宣言部分を復活させたところ、速度が元に戻ったので宣言だけダミーとして残しています。
削った部分が他のところで使われてないか検索してもヒットしなかったので、やはり宣言の有無だけで
速度が変わっているのだと推測できます。
無駄に宣言してるのに速くなるってことがあるのでしょうか・・・。
0961デフォルトの名無しさん
2009/05/26(火) 19:39:18ライブラリの内部で使われてる関数のリンクがおかしくなってると見た
変な空っぽの関数とリンクされて計算結果が狂ってないか確認した方がいい
あと削った関数の名前はひねくれた物に変えておけ
0962デフォルトの名無しさん
2009/05/26(火) 19:52:55結果を見比べたところ、全く変わっていませんでした。違うのは速度だけ・・・。
今まで、double MomX,MomY,MomZ;としてたのをdummyx,dummyy,dummyzとしても
遅くならなかったのでdummyxと宣言してますが使ってない変数を宣言するのは何か気持ち悪い・・・
0963デフォルトの名無しさん
2009/05/26(火) 20:03:01>>963 と同じ意見
ソースコードを見てみないことには分からない
ソースコードを晒せない場合
仕様を書いてくれれば新規に作るよ
高速化もやってみるよ
現在の処理時間の目安も書いてくれると嬉しいな
作ってみたい
0965デフォルトの名無しさん
2009/05/26(火) 20:28:49一つの要素に数値を1つ入れるのと、4つ入れるのでは、違いはやっぱり処理速度ですか?
0966デフォルトの名無しさん
2009/05/26(火) 20:30:450967棚大生
2009/05/26(火) 20:37:26時間があまりないのでお願いします。
大学の課題です。
言語:C++
提出期限:5/27 0時
�@
int i=99;と設定されていたら、
i/3 と i/3. では結果が異なる。
プログラミングを作成することによって、i/3 と i/3.を評価せよ。
(a,bを実数としてi/3 と i/3.をa,bに代入することとする。)
�A
a=10, b=3, c=2 として
!aかつb>cの戻り値、!aまたはb>cの戻り値を求めるプログラムを作成せよ。
�B
a=1,b=10,c=100のとき
c<b && b<a と c<b<a は同じものではない。
上記のことをプログラム化して確かめよ。
�C
i=100で a=i++, a=++iの値を確かめるプログラムを作成せよ。
�D
1から10までの和を計算するプログラムをインクリメント演算子を用いて、作成せよ。
デクリメント演算子を用いて、nCmを計算するプログラムを作成せよ。但し、n,mは cin を使って
キーボードから読み取ること。
0968デフォルトの名無しさん
2009/05/26(火) 20:48:12期限が短くなっとるwww
両方のスレ見てる人が多いから回答率が低くなるぞ
おとなしく向こうで待ってろよ
0969デフォルトの名無しさん
2009/05/26(火) 20:54:01printf("1から10までの和: %d\n", i++);
0970デフォルトの名無しさん
2009/05/26(火) 21:18:10CLASSA
と
Pre-CLASSA
の2つの名前付されているクラスのPre-ってどういう意味なんでしょうか?
0971デフォルトの名無しさん
2009/05/26(火) 21:32:320972デフォルトの名無しさん
2009/05/26(火) 21:34:150973デフォルトの名無しさん
2009/05/26(火) 21:40:020974デフォルトの名無しさん
2009/05/26(火) 22:19:31え〜と、ソースコードを晒せないし高度な物理の法則を使ってるから仕様を書くのも難しいのです・・・。
1500行書くの疲れた・・・
0975デフォルトの名無しさん
2009/05/26(火) 22:22:38状況としては、Cygwin-1.7.0-48で、
setlocale(LC_ALL, "ja_JP.UTF-8"); wprintf(L"Test\n"); printf("Test\n");
を実行すると、最後のprintfで派手に文字化けします。
で、これは正しく動くよう直すべきなのか、それとも、そもそもワイド文字系
I/Oとバイト文字系I/Oは、規格上「混ぜるな危険」なのかを知りたいのです。
正しく動くべきなら、もうちょっと気合入れて解析しようかと。
(だいたい当たりは付けたんですが、まだ解析途中)
0976デフォルトの名無しさん
2009/05/26(火) 22:32:17詳しくはよくわからんが宣言することによってたまたまCPUキャッシュ上に
効率よく乗る形になって速度でてるけど宣言しないことによって分岐予測失敗とかで
CPUキャッシュの無駄な破棄や転送が起きてるとか
ちなみに計算が必要なくなったので外したというのはその関数がやっていた計算を
あらかじめ配列などに収まるようにプールしておいて参照するだけにしたとか?
0977デフォルトの名無しさん
2009/05/26(火) 23:14:51粒子間に働く力を計算する関数と粒子を動かす関数を作ったのですが、粒子を動かす関数内部で
各粒子の運動量の総和をMomX+=vxで取り、最後に粒子数で割るという処理をしていました。
しかしデータとして出力する結果に運動量の項目は必要なかったので上記の処理を消したという次第です。
処理を消すだけなら速度も変わらず問題無いのですが上のレスで書いた通り宣言まで消すと遅くなるのです。
また、今度は極端に削除した例としてデータを出力する部分(ここは数値計算はしておらずofstreamで出力するだけ)
を消してみたのですがこっちはより遅くなるという結果でした。
自分もキャッシュ関連かと思っているのですが、まだプログラミングには詳しくないのでちょっと対策は勉強しないと考えられません・・・。
0978デフォルトの名無しさん
2009/05/27(水) 00:24:51アセンブリコードレベルでの違いがあるかどうか。次は、
アライメントがあっているかどうか。
を調べてみて
x86 はそれほど影響はないと思うけど。
Itanium の例だけど、アライメントがずれると数分の1に遅くなってた。
0979デフォルトの名無しさん
2009/05/27(水) 01:31:36Sleep()を使うと動作がカクカクになってしまいます
システムに負荷をかけない形で待機をするほうほうはないでしょうか?
0980デフォルトの名無しさん
2009/05/27(水) 01:35:20MS-Windows なら WaitForSingleObject
0981デフォルトの名無しさん
2009/05/27(水) 02:59:22insertの引数を何にすればいいか教えてください
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9264.txt
0982デフォルトの名無しさん
2009/05/27(水) 08:37:230983デフォルトの名無しさん
2009/05/27(水) 20:04:41データ保存先をstd::vector<char>にしたいのですが、read()の第一引数としては受け付けてくれません。
reinterpret_cast<char*>やstatic_cast<char*>を試してみたのですが駄目でした。
このような場合は、一度charの配列に入れてからvector<char>に入れなおすしかないでしょうか?
0984デフォルトの名無しさん
2009/05/27(水) 20:07:32buffer.resize(1024);
istream.read(&buffer[0], 1024);
0985デフォルトの名無しさん
2009/05/27(水) 20:14:04出来ました。
ありがとうです。
0986デフォルトの名無しさん
2009/05/27(水) 22:36:35どうしてもグローバル変数だらけになったり関数や構造体が増えてくると統一性がなくなったりしてしまいます
グローバル変数をやめると他の関数からアクセスしにくくなるし宣言するまで実体がないしで困っています
この先勉強をしていく上で参考になるような書籍等はないでしょうか?
0987デフォルトの名無しさん
2009/05/27(水) 23:04:500988デフォルトの名無しさん
2009/05/27(水) 23:22:54下1行が本題なんだろ
0989デフォルトの名無しさん
2009/05/27(水) 23:28:420990デフォルトの名無しさん
2009/05/27(水) 23:32:230991デフォルトの名無しさん
2009/05/27(水) 23:39:49C++BuilderではSHCreateDirectoryを使うことは出来ますか?
0992デフォルトの名無しさん
2009/05/27(水) 23:50:18それ以上の勉強は、実際のソースをみるしかないと思う。
おれとしては、自分の興味のある分野のオープンソースなのを探して
それをよみながら使うのを勧める。
それが出来なければ、Cの実力は現状止まりだろうな。
0993デフォルトの名無しさん
2009/05/28(木) 00:10:570994デフォルトの名無しさん
2009/05/28(木) 00:19:00反吐を吐きそうになりながら、与えられたソースと格闘して、
思ったとおりに動かないソースのせいで何日も苦しみ、そのあと
今まで発見されなかったバグのせいだと分かり、、、、
というのをやるしかないんだよ。
0995デフォルトの名無しさん
2009/05/28(木) 00:23:48学生さん?
録音テープに法的な証拠能力は無いんだが
0996デフォルトの名無しさん
2009/05/28(木) 00:37:24ダイクストラとかバックトラックとかFFTとかルンゲクッタとかそういうのをCで実装してみる。
そういうのに慣れると他のソースが読みやすくなる。
さらに完全なCでなくてもいいからある程度Cっぽい言語のコンパイラを自分で書いてみるといい。
externとか、staticとか、auto変数とかそういう部分の理解がしやすくなる。
あと、アセンブラも軽くやっとけ。ダブルポインタとかそこらへんが理解しやすくなる。
まあ毎日3時間づつくらいやれば、半年だよ。
0997975
2009/05/28(木) 00:57:14は混ぜるな危険。
入出力ストリーム(要はFILEオブジェクトの内部)には、どっちで入出力して
いるかの「入出力単位」というものがあって、一度でもどちらかのI/O関数を
使うと、入出力単位がそれに固定されます。要は、一度でもwprintf()を使っ
たらprintf()しちゃダメです。
どうしても途中で入出力単位を変更したい場合は、freopen()してからfwide()
する必要があります。(って書いてあったけど、freopen()したら入出力単位が
リセットされるんだから、明示的なfwide()は不要のような……^^;)
ソースを追いかけてたらfwide()にぶち当たって、これをキーワードに
あらためて調べてみると、手持ちの本に思いっきり書いてありました……orz
0998デフォルトの名無しさん
2009/05/28(木) 01:00:50ついでに参考にしてたソースが最初
「なんでこんな面倒で分かり難いことやるんだよ!」
と思ってた箇所が実は合理的だったことに気づく・・・かも。
0999デフォルトの名無しさん
2009/05/28(木) 01:02:231000デフォルトの名無しさん
2009/05/28(木) 01:09:2910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。