【初心者歓迎】C/C++室 Ver.25【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/02/26(日) 23:15:40ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1135828083/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2006/02/26(日) 23:18:210003デフォルトの名無しさん
2006/02/27(月) 01:23:34MSDNのソースを試してみようと
ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx
説明を読み
フォームに Button を配置して
using namespace System;を宣言して、
下記のコードを試したのですがエラーが出ます、何か読み込んでいないファイルがあるか設定のミスだと思うのですが、原因が分かりませんよろしくお願いします。
private:
voidbutton1_Click(Object^/*sender*/,System::EventArgs^/*e*/)
{
Stream^myStream;
OpenFileDialog^openFileDialog1=gcnewOpenFileDialog;
openFileDialog1->InitialDirectory="c:\\";
openFileDialog1->Filter="txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*";
openFileDialog1->FilterIndex=2;
openFileDialog1->RestoreDirectory=true;
if(openFileDialog1->ShowDialog()==::DialogResult::OK)
{
if((myStream=openFileDialog1->OpenFile())!=nullptr)
{
//Insertcodetoreadthestreamhere.
myStream->Close();
}
}
}
error C3083: 'DialogResult': '::' の左側のシンボルには、型を指定しなければなりません
error C2039: 'OK' : '`global namespace'' のメンバではありません。
error C2065: 'OK' : 定義されていない識別子です。
0004デフォルトの名無しさん
2006/02/27(月) 01:26:57ついでにエラーが出ている場所ですが
if ( openFileDialog1->ShowDialog() == ::DialogResult::OK )
ここです
0005デフォルトの名無しさん
2006/02/27(月) 01:43:19良く分からんが、さすがにそこまで特殊な環境だとスレ違いじゃないのか?
【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/
0006デフォルトの名無しさん
2006/02/27(月) 01:54:240007デフォルトの名無しさん
2006/02/27(月) 02:07:23void A( int in_no, int *out_no )
{
int no = in_no + 10;
*out_no = no;
}
void B( int in_no, int *out_no )
{
*out_no = *in_no + 10;
}
int C( int in_no )
{
int no = in_no + 10;
return no;
}
int D( int in_no )
{
return (in_no + 10);
}
質問したいのは2つです。
まず1つ目は計算結果を返すための関数内のローカル変数を宣言について。
その変数で計算して返す形のほうがいいみたいなことをききました。
これはどうなんでしょうか?ローカル変数でもその関数が呼ばれる回数が
多ければ遅くなりそうです。(コンパイラに依存する部分も多少あるかもしれませんが)
2つ目は関数A・BとC・Dどちらのほうが早くて安全でしょうか?
これもコンパイラによりけりだったり好みの問題かもしれませんが教えて頂きたいです。
0008デフォルトの名無しさん
2006/02/27(月) 02:08:500009デフォルトの名無しさん
2006/02/27(月) 02:21:20速度は実測が基本。
0010デフォルトの名無しさん
2006/02/27(月) 02:43:12最適化でどうなるかわからないのと、
CPUがどういう動きをするのかわからないからわからない。
俺も>>9と同じで「速度は実測が基本」だと思う。
0011デフォルトの名無しさん
2006/02/27(月) 02:47:09同じプログラムをループで何回も実行させる形だと、CPUがまたそれ用に最適化してしまってまたわからない。
それだけの機能をもったexeを作ってそれを何回も実行させる形にしてもやはりCPUがそう判断してしまうと計測ができないと思う。
つまり、よくわからいw
実際に速度が問題になってそのときその場所、その場面で速度を測ってやっとこさわかる問題だと思う。
構造的に遅いっつーならアルゴリズムを考える余地はあるけど
コード的にどうっつーのは正直、ようわからんw
0012デフォルトの名無しさん
2006/02/27(月) 05:53:43コンパイラがまともに最適化できるのなら、AとB、CとDはそれぞれ同じコードを吐くだろう。
#Bは*out_no = in_no + 10;の間違いと仮定して。
次にA或いはBとC或いはDの差だが、A/Bにはアドレスを関数に渡すと言うコードが必要になるので
恐らくは、C/Dよりも効率のいいコードを吐くと言うことはなさそうだ。
まぁなんだ、愚作を弄せず真っ当なプログラミングをしろ、と。
その上で、速度が重要な要素ならば実測しろ。
0013デフォルトの名無しさん
2006/02/27(月) 05:54:15たとえば、IE起動するとか.
よろしくおねがいします.
0014デフォルトの名無しさん
2006/02/27(月) 05:57:18質問が曖昧すぎ。
・「ある結果のとき」に意味があるのか。あるなら具体的に。
・外部プログラムを起動してどうしたいのか。ただ起動するだけでいいのか、なんらかの連携をしたいのか。
・そもそもC標準関数だけでやりたいのか、WinAPIを使いたいのか、Unix系関数を使いたいのか、云々。
0015デフォルトの名無しさん
2006/02/27(月) 06:08:24VC.NET, 標準STL, WinXP SP2
set<int> i;
i = { ...とにかく沢山のint、値域はなんだかめっちゃ広い ... };
…という set<int> がある。
ここから任意の範囲の集合について、ある処理を行いたい。
処理したい範囲は [ a , b ) とする。
i の中に a, b が含まれているとは限らない。
この時、処理したい範囲の最初と最後のイテレーターを得るにはどうすればいいんだろう。
これでいいのか?と思って↓みたいなソースを書いたけどダメだった。
i.lower_bound が i.end() になってるかのような結果になる。
set付属の関数だけでなくアルゴリズムの方でも試したけど、同じくダメだった。
for ( set<int>::iteretor itr1 = i.upper_bound( a ) ; itr1 != i.lower_bound( b ) ; itr1++ ){
(ある処理)
}
STLの解説サイトの情報だと、
> upper_bound … keyより大きな要素の最初を指すイタレーターを返します。
> lower_bound … key以下の要素(pair)の最後を指すイタレーターを返します。
だから、間違っていないような気もするんだけど、解説サイトによって微妙に言い方が変わるから混乱してる。
別の解説サイトの、アルゴリズムの方の lower_bound, upper_bound の説明とも違っているように感じる。
誰か詳しい人に図を付けて説明してもらいたくて仕方がない。
0016デフォルトの名無しさん
2006/02/27(月) 06:08:57コンパイラのプロファイラだとインライン展開や自力で埋め込んだコードは計ってくれないよね。
皆さんの方法教えてください。
実際に最適化したものを計りたいんですが。
0017デフォルトの名無しさん
2006/02/27(月) 06:19:57マクロの差分がミクロの速度差で。
0018デフォルトの名無しさん
2006/02/27(月) 06:26:20「ある結果のとき」に意味はないです。
演算結果が1ならIE、2ならワードぐらいで考えてください。
ただ起動するだけでいいです。
C標準関数だけでお願いします。
あいまいで申し訳なかったです。
0019デフォルトの名無しさん
2006/02/27(月) 06:28:45>処理したい範囲は [ a , b ) とする。
それなら、
for ( set<int>::iteretor itr1 = i.lower_bound( a ) ; itr1 != i.lower_bound( b ) ; itr1++ ){
じゃないか?
0020デフォルトの名無しさん
2006/02/27(月) 06:37:08upper_bound(k)は、kより大きな最初の要素を指す。
lower_bound(k)は、k以上の最初の要素を指す。
(23.1.2より)
0021デフォルトの名無しさん
2006/02/27(月) 06:38:28002215
2006/02/27(月) 06:48:45自分のソースを修正しました。感謝。
>>20
>lower_bound(k)は、k以上の最初の要素を指す。
lower_boundの定義がこの通りだとしたら、今の処理が上手くいかないのは確かに納得です。
もしかして>>15のサイトの説明が間違っていると?
間違っているとしたら、 『 k より小さな( 又は、k以下の ) 最後の要素を指す 』 という関数は何でしょうか?
>>21
forの前に itr2 = i.lower_bound( b ) と代入して、forを高速化しました。感謝。
0023デフォルトの名無しさん
2006/02/27(月) 07:02:29>もしかして>>15のサイトの説明が間違っていると?
>>20は規格からの引用。信じられないなら自分で確かめてくれ。
>間違っているとしたら、 『 k より小さな( 又は、k以下の ) 最後の要素を指す 』 という関数は何でしょうか?
用意されていない。あったとしてもそれほど便利じゃないと思うが。
/* kより小さな最後の要素 */
template <typename Assoc>
typename Assoc::iterator f(Assoc &x, const typename Assoc::key_type &k)
{
typename Assoc::iterator i = x.lower_bound(k);
if(i == x.begin()) return x.end();
return --i;
}
0024デフォルトの名無しさん
2006/02/27(月) 07:21:03for (xxx::iterator it = i.lower_bound(a), last = i.upper_bound(b); it != last; ++it) {
//
}
に汁。
0026デフォルトの名無しさん
2006/02/27(月) 08:58:01つ[system()]
0027デフォルトの名無しさん
2006/02/27(月) 10:25:35だと内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイル
として認識されていません。
となってしまいます。
どうすればよいでしょう。
0028デフォルトの名無しさん
2006/02/27(月) 12:21:45パスも指定汁
0029デフォルトの名無しさん
2006/02/27(月) 17:29:30Internet Explorer固定だなんてやめてくれよ。
0030デフォルトの名無しさん
2006/02/27(月) 18:26:19Accelerated C++ の151頁、以下のコードが VC++.NET2002 でコンパイルできません。
*os++ = string( i, j );
でエラーが出ます。本ではコンパイル通るようですが、VC++だと通らないのでしょうか?
template < class T >
void split( const string &str, T os )
{
vector<string> ret;
typedef string::const_iterator iter;
iter i = str.begin();
while ( i != str.end() )
{
i = find_if( i, str.end(), not_space );
iter j = find_if( i, str.end(), space );
if ( i != str.end() )
{
*os++ = string( i, j );
}
i = j;
}
}
003130
2006/02/27(月) 18:30:30イテレータ渡したら通りました、ごめんなさい。
0032デフォルトの名無しさん
2006/02/27(月) 18:35:240033デフォルトの名無しさん
2006/02/27(月) 22:55:06B::foo(int)の呼び出しと見做されコンパイルが通りません。
何か、かっちょいい解決方法はないでしょうか?
#include <iostream>
class A {
public:
virtual void foo() { std::cout << "foo" << std::endl; }
};
class B : public A {
public:
void foo(int a) {}
};
int main()
{
B b;
b.foo(); //※1
return 0;
}
0034デフォルトの名無しさん
2006/02/27(月) 22:57:39class B : public A {
public:
using A::foo;
void foo(int a);
};
0035デフォルトの名無しさん
2006/02/27(月) 23:24:11public:
void foo(int a) {A::foo();}
};
0036デフォルトの名無しさん
2006/02/27(月) 23:46:43なんと、3分とたたずに返事がきていたとは……。解決しますた。
ありがとうございます。
>>35
実際はB::foo(int)は引数を使った内容になるのですが、それを抜いても
※1の部分を変更しないと駄目ですので >34さん案でいきます。
0037デフォルトの名無しさん
2006/02/28(火) 07:19:53た だ の 関 数 の オ ー バ ー ロ ー ド じ ゃ ね ぇ か バ カ
Aの方のvirtual外せばそっちが呼ばれるわ
0038デフォルトの名無しさん
2006/02/28(火) 08:15:27お前のレスだけが
質問文のさらに2ターンくらい前の段階で止まってるw
0039デフォルトの名無しさん
2006/02/28(火) 09:11:37謙虚にな
0040デフォルトの名無しさん
2006/02/28(火) 11:48:290041デフォルトの名無しさん
2006/02/28(火) 18:46:09ttp://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
0042デフォルトの名無しさん
2006/02/28(火) 23:29:490043デフォルトの名無しさん
2006/02/28(火) 23:54:050044デフォルトの名無しさん
2006/03/01(水) 04:27:22何か意図があるのでしょうか?
trueかfalseの状態しかないのなら、コンパイラのチェックも入るboolを使ったほうが良いと思うのですが。
0045デフォルトの名無しさん
2006/03/01(水) 04:38:09猫でも分かるみたいなプログラム組んでもしょーがないような気がするんですけど・・
0046デフォルトの名無しさん
2006/03/01(水) 04:49:52個人で書けるレベルのアプリでいまだ実現されていない(あるいは、誰も思い付いていない)
ものは大量にあると思う。
個人で書くのに限界を感じたら集団で書くこともできる。
0047デフォルトの名無しさん
2006/03/01(水) 04:54:570048デフォルトの名無しさん
2006/03/01(水) 05:39:49一般的にVC++でBOOLというとWi32APIで定義されているそれのことである。
Win32APIはC専用ではないし、ましてやC++に特化しているわけではない。
よってBOOLはBOOLであってboolで代用できるものではない。
まー、それ以前に戻り値がBOOLのはずになのに1,0,-1を返す可能性があるAPIが(以下略
0049デフォルトの名無しさん
2006/03/01(水) 13:55:28Win16が定義されたときは(Win32はその後継だが) boolは存在し無かった。
当時は Cか Pascalだったから。
0050デフォルトの名無しさん
2006/03/01(水) 14:06:00ついでに、trueかfalseかしか無いならboolのほうがいいってのは別にどうでもいい
必要なのはtrueかfalseかという言葉ではなく、
「Aという状態かBという状態か」という概念だけ
そしてBOOLは基本的に「0かそうでないか」
なのでなんの問題も無い
0051デフォルトの名無しさん
2006/03/01(水) 14:11:190052デフォルトの名無しさん
2006/03/01(水) 14:21:02005350
2006/03/01(水) 14:21:52俺はどうせboolだろうがBOOLだろうが条件で==とかしないし・・・
0054デフォルトの名無しさん
2006/03/01(水) 14:25:38だからBOOLは-1も返すんだってば。
0055デフォルトの名無しさん
2006/03/01(水) 14:42:40あれはいつになったら直すのだ
0056デフォルトの名無しさん
2006/03/01(水) 14:56:01だから俺は引数や戻り値がBOOLならBOOLを使うが、それ以外ではboolを使う。
けれど肝心の-1を返す関数の戻り値を受けるときにはintを使うけどな。
ところでダイアログプロシージャもときどきハンドルを返したりするのに昔は戻り値がBOOLだった。
0057デフォルトの名無しさん
2006/03/01(水) 15:01:410058デフォルトの名無しさん
2006/03/01(水) 15:03:09void hoge() {
if(foo()) {
...
} else {
...
}
}
なんの問題も無い
0059デフォルトの名無しさん
2006/03/01(水) 16:39:240060デフォルトの名無しさん
2006/03/01(水) 20:29:250061デフォルトの名無しさん
2006/03/01(水) 20:33:100062デフォルトの名無しさん
2006/03/01(水) 20:33:550063デフォルトの名無しさん
2006/03/01(水) 23:13:47そのoperatorをnamespace外部で使うにはどうすればよいですか?
# using namespaceつかわないで。
namespace ns{
class Foo { ... };
ostream &operator << (ostream &o, Foo &foo) { ... }
}
int main(){
std::cout << Foo(); // using namespace ns; しないと使えないよー
}
教えてエライ人!
0064デフォルトの名無しさん
2006/03/01(水) 23:23:17にすれば良い
詳しくは Koenig lookup (Koenig の照合規則) で調べてみれ
0065デフォルトの名無しさん
2006/03/01(水) 23:29:10class Foo{};
namespace ns{
ostream &operator << (ostream &o, Foo &foo) { ... }
}
int main(){
std::cout << Foo(); // using namespace ns; しないと使えないよー
}
Fooとoperatorがns内に有ればOKなんですが、
Fooがns外部にあると、コンパイルエラーになるとです。
std::cout ns::<< Foo();
とかやっても駄目だし、using namespace使う以外に方法無いんでしょうか?
0066デフォルトの名無しさん
2006/03/01(水) 23:32:43ns::operator << (std::cout, Foo());
すれ汚しスマソです
0067デフォルトの名無しさん
2006/03/01(水) 23:52:48なんでFooをnsの中に入れない?
入れられないとしたら、なんでoperator <<を外に出さない?
0068デフォルトの名無しさん
2006/03/01(水) 23:56:13class Foo
{
0069デフォルトの名無しさん
2006/03/01(水) 23:58:42Class Foo
{
std::ostream & to_stream() ;
} ;
これでも十分という気がしてならない。
0070デフォルトの名無しさん
2006/03/02(木) 01:36:51<algorithm>ヘッダに定義されているmaxという関数を使っています。
と本には書いていて、ソースに
#include <algorithm>
...
using std::max;
と書いてるのですが、コンパイルすると'max' : 'std' のメンバではありません。
と出てしまうのですが、これは何がだめなんでしょうか?
0071デフォルトの名無しさん
2006/03/02(木) 01:41:52VisualC++6.0かな?
0072デフォルトの名無しさん
2006/03/02(木) 01:44:54その部分は自分で作って脳内補完します・・・
0073デフォルトの名無しさん
2006/03/02(木) 01:55:35つVC++ toolkit 2003
0074デフォルトの名無しさん
2006/03/02(木) 02:02:020075デフォルトの名無しさん
2006/03/02(木) 07:34:51もし<winodws.h>を読み込んでいるのなら>>74
0076デフォルトの名無しさん
2006/03/02(木) 11:41:31この記事の、作業領域を使わずに文字を反転させるプログラム、
って一体どうやるんですか?
作業領域ってことはauto変数もダメなんですよね?
0077デフォルトの名無しさん
2006/03/02(木) 11:45:31ttp://www.sun-inet.or.jp/~yaneurao/rsp/rspA9toB0.html
xorを使ったswapのことか?
0078デフォルトの名無しさん
2006/03/02(木) 12:02:51for (int i=0, int len=strlen(str); i<len;++i) {
str[i] ^= str[len-i];
str[len-i] ^= str[i];
str[i] ^= str[len-i];
}
こういう事か?
0079デフォルトの名無しさん
2006/03/02(木) 12:06:55複素数はMKL_Complex16で定義できるんですけど
その行列はどのように定義するんですか?
MKL_Complex16 a[N]こんなふうにはできませんよね
0080デフォルトの名無しさん
2006/03/02(木) 12:20:16行列といえば二次元配列じゃないのか?
複素固有値問題ってのを知らないから何とも言えんが
0081デフォルトの名無しさん
2006/03/02(木) 12:33:14a(b,c)こういうことでしょうか?
0082デフォルトの名無しさん
2006/03/02(木) 12:38:52再帰で(w
0083デフォルトの名無しさん
2006/03/02(木) 12:42:02こんな試験出す会社に受かる自信無いや
0084デフォルトの名無しさん
2006/03/02(木) 13:09:35/* Complex type (double precision). */
typedef
struct _MKL_Complex16 {
double real;
double imag;
} MKL_Complex16;
このように与えられてる
0085デフォルトの名無しさん
2006/03/02(木) 14:33:29の =0 には何の意味があるんですか?
0086デフォルトの名無しさん
2006/03/02(木) 14:39:400087デフォルトの名無しさん
2006/03/02(木) 14:46:43純粋仮想関数
0088デフォルトの名無しさん
2006/03/02(木) 15:20:08目的は"hogehoge/hugahuga/homehome"という文字列を'/'を境界にした文字列に分割し、
それぞれをstring に格納、それをvectorで配列化するものですが、途中エラーで処理が終わってしまいます。
● クラスメンバー
CCommand::vector<string> m_StringArray;
● クラス関数内の一部
m_StringArray.reserve(10);
要素数分ループ処理
{
...
m_StringArray[Index].assign(pStart,StrLength);// ここでエラー
}
エラー直前でchar* pStart は上記文字列の先頭のポインタを指していることが確認されています。
int StrLength には8(hogehogeの文字数)がしっかり格納されていました。
Index は初回(0)ですでに失敗します。
具体的には
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int 8, unsigned char 1) line 551 + 26 bytes
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * 0x00372fd0, unsigned int 8) line 133 + 43 bytes
でスタックは止まっていました。
もしかしてstringをvectorで配列化すると不具合があるのでしょうか?
解決策を教えてください。
0089デフォルトの名無しさん
2006/03/02(木) 15:21:57意味がわかりました
ありがとう
0090デフォルトの名無しさん
2006/03/02(木) 15:23:07resize
の違いかな?
0091デフォルトの名無しさん
2006/03/02(木) 15:26:43Index < m_StringArray.size()ぐらいはチェックしてるか?
009288質問者
2006/03/02(木) 15:28:52resizeにしたら難なく実行できました。
reserveでは実領域が確保されていないのですね、勉強になりました。
ありがとうございます。
0093デフォルトの名無しさん
2006/03/02(木) 19:19:37レス遅くなってしまいましたが...
今やってるのは、GUIDをstd::ostream/istreamに流すoperator<<, >>を
自作utilライブラリ内に作りたいと思いまして。
んで、グローバルに書くよりnamespace util内の方が名前空間汚さなくていいかな
と思ったんですが、それだとそのnamespace外では結局usingが必要になるんで、
とりあえずグローバルに書くことで落ち着こうかと思います。
0094デフォルトの名無しさん
2006/03/02(木) 19:28:13分かってるかもしれないけど
using namespaceはスコープがあるよ
{
using namespace ns;
std::cout << Foo(); // OK
}
std::cout << Foo(); // エラー
0095デフォルトの名無しさん
2006/03/02(木) 19:28:37することができません、どこか説明がわかりやすいサイトしりませんか?
0096デフォルトの名無しさん
2006/03/02(木) 19:32:56http://www.kumei.ne.jp/c_lang/net/index.html
0097デフォルトの名無しさん
2006/03/02(木) 20:20:52ありがとうございました。
0098デフォルトの名無しさん
2006/03/02(木) 20:24:57あー、なるほど。使用する部分だけスコープで限定すればいいわけですね。
しかし、非operatorな関数はns::func()で呼べるのに、
operatorはusingつかったり、ns::operator<<(...)みたいに書き方変えないといけなくて、
サクっと書けないのが悲しい今日この頃です。
0099デフォルトの名無しさん
2006/03/02(木) 20:54:22あとはラッパーでも書くしかない
0100デフォルトの名無しさん
2006/03/02(木) 21:08:110101デフォルトの名無しさん
2006/03/02(木) 22:23:500102デフォルトの名無しさん
2006/03/02(木) 22:29:49MicrosoftのC/C++コンパイラとIDEとその他ツールのセット。
0103デフォルトの名無しさん
2006/03/02(木) 22:40:00それはVisual C++
0104デフォルトの名無しさん
2006/03/02(木) 23:16:15それはMucrosoftのC/C++コンパイラとIDEとその他ツールのセット。
0105デフォルトの名無しさん
2006/03/02(木) 23:20:56それはVisual C++
0106デフォルトの名無しさん
2006/03/03(金) 00:47:030107デフォルトの名無しさん
2006/03/03(金) 00:48:150108デフォルトの名無しさん
2006/03/03(金) 01:03:010109デフォルトの名無しさん
2006/03/03(金) 01:15:39正しく表示させるにはどうすればよいでしょうか?
0110デフォルトの名無しさん
2006/03/03(金) 01:16:420111デフォルトの名無しさん
2006/03/03(金) 01:39:14排他制御で調べてみましたが、いまのところ方法がみつかっていません。
関数一個で手軽にというわけにはいかないのでしょうか?
0112デフォルトの名無しさん
2006/03/03(金) 02:10:340113デフォルトの名無しさん
2006/03/03(金) 04:15:15って配列として扱えんと?
無理ならJavaに戻らんといけんね
C#でもよかと?
0114デフォルトの名無しさん
2006/03/03(金) 04:39:316畳の和室でちょっと寒いです・・・
0115デフォルトの名無しさん
2006/03/03(金) 06:31:14隣が深夜に45分おきにドン!と音をたてる
死んで欲しい
0116デフォルトの名無しさん
2006/03/03(金) 08:07:19#include "myfunc.h"
int main(void)
{
int num1,num2,ans;
printf("整数入力");
scanf("%d",&num1);
printf("整数入力");
scanf("%d",&num2);
ans=max(num1,num2);
printf("%d\n",ans);
return 0;
}
0117デフォルトの名無しさん
2006/03/03(金) 08:08:03{
if(x >y)
return x;
else
return y;
}
0118myfanc.h
2006/03/03(金) 08:08:520119デフォルトの名無しさん
2006/03/03(金) 08:10:20Error: 外部シンボル '_max' が未解決をコンパイルしようとするとこういう文が出てきます
なぜでしょうかおしえt
0120デフォルトの名無しさん
2006/03/03(金) 08:16:10maxの定義を見付けられないから。
0121デフォルトの名無しさん
2006/03/03(金) 13:03:22maxの定義を見付けられないから。
詳しくお願いします
maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
0122デフォルトの名無しさん
2006/03/03(金) 13:04:35分割でやる奴なんです
0123デフォルトの名無しさん
2006/03/03(金) 13:07:39>maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
適当なソースファイルに書けばいい。
で、それとsample.cを一緒にコンパイル。
0124デフォルトの名無しさん
2006/03/03(金) 14:12:543次元座標をfscanfで読み込んで加工したいのですが
エラーの時に吐き出される文字列が入ってプログラムが止まります
while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){
データに対して処理
}
データ
1 2 3
1 4 5
1 * 6
1 5 6
アスタリスクで止まってしまうのですが
どなたか、回避方法教えてくださいませんか
0125デフォルトの名無しさん
2006/03/03(金) 14:19:51%c, %sで読んで、*か判定して数値に変えたら?
0126デフォルトの名無しさん
2006/03/03(金) 14:31:02*か判定するのがstr型だとどうなるのか…そこのところの例とか見せていただけませんか
0127デフォルトの名無しさん
2006/03/03(金) 14:38:52エラーがあるかだけ判断する方法。
char buf[LENGTH_AS_YOU_NEED];
while (fgets(buf, sizeof(buf), fp) != NULL) {
if (sscanf(buf, "%d%d%d", x, y, z) < 3) {
// Illegal data.
}
}
0128デフォルトの名無しさん
2006/03/03(金) 14:41:23ありがとうございます。参考にしてやってみます
0129デフォルトの名無しさん
2006/03/03(金) 14:46:58こんな感じか
#include <string.h>
#include <stdlib.h>
char str[3][9]; int i; int x[3];
中略
for( i=0 ; i<3 ; i++){
if( strcmp( &str[i][0], "*") != 0 ) x[i] = atoi( &str[i][0] );
else x[i] = 0;
}
0130デフォルトの名無しさん
2006/03/03(金) 14:58:56個別に検出
while (fgets(buf, sizeof(buf), fp) != NULL) {
char str[3][10];
if (sscanf(buf, "%s%s%s", str[0], str[1], str[2]) < 3) {/* Illegal line.*/}
char * p;
x = strtol(str[0], &p, 0);
if (p == str[0]) {/* Illegal x.*/}
y = strtol(str[1], &p, 0);
if (p == str[1]) {/* Illegal y. */}
z = strtol(str[2], &p, 0);
if (p == str[2]) {/* Illegal z. */}
}
0131ごめんなさい
2006/03/03(金) 15:14:34入門書にも載ってない
0132デフォルトの名無しさん
2006/03/03(金) 15:32:01日本語から勉強してきてね。
0133デフォルトの名無しさん
2006/03/03(金) 15:39:03コンパイラのマニュアルを読むべし。
0134デフォルトの名無しさん
2006/03/03(金) 15:57:10なんとか無事にできました
これまでchar→数へ変換したことが無かったので、勉強になりました
ありがとうございました
0135デフォルトの名無しさん
2006/03/03(金) 17:15:35C言語の入門書ってそういうと個おざなりだよな
0136デフォルトの名無しさん
2006/03/03(金) 17:27:03コンパイラ何使ってる?
>C言語の入門書ってそういうと個おざなりだよな
コンパイラによって違うんだから書きようがないだろ。
0137デフォルトの名無しさん
2006/03/03(金) 17:28:220138デフォルトの名無しさん
2006/03/03(金) 18:06:07cigwynって奴とBorland C++ Compilerって奴
このcigwynはC言語入門とかについてきた奴だからマニュアルがないし
Borland C++ Compileって奴もウェブのC言語入門の奴に入れとけって書いてあっただけ
コンパイルの方法も書いてない
0139デフォルトの名無しさん
2006/03/03(金) 18:17:16→Cygwin関係のみならず、Linux関係、Unix関係の入門書でことが足りる。
#不明な点はCygwinスレへ。
・BCC
→BCC関連の書籍もあるはずだし、これもやはりBCCスレがある。
結論:
調べもしないでぐだらぐだらいってんじゃねぇ。
0140デフォルトの名無しさん
2006/03/03(金) 18:46:39cygwinはコンパイラじゃない。コンパイラはgcc。
gccだと、
gcc foo.c bar.c
という具合にすれば良い。
BCCは知らんが、似たようなものだろ。
>>139
コンパイルのしかたが分からんと言ってる奴にLinux, Unixの入門書を勧めてどうするんだ?
0141デフォルトの名無しさん
2006/03/03(金) 18:49:59コンパイルの仕方くらい出てるべ。
0142デフォルトの名無しさん
2006/03/03(金) 18:50:020143デフォルトの名無しさん
2006/03/03(金) 18:52:270144デフォルトの名無しさん
2006/03/03(金) 18:52:590145デフォルトの名無しさん
2006/03/03(金) 18:55:020146デフォルトの名無しさん
2006/03/03(金) 19:17:53>>140そのコマンドひらめいて試したけどできなかった。
>>144無知で悪かったな。じゃあお高く留まってるお前が手ほどきしてくれぃ
>>145一般的な環境について詳しく
つーか標準的な環境教えてよ
そうすりゃこんなUZEE質問しないんだからさ〜
0147デフォルトの名無しさん
2006/03/03(金) 19:24:16コマンドラインとか環境変数とかPATHとかからはじめないとならないのかな・・・
0148デフォルトの名無しさん
2006/03/03(金) 19:37:220149デフォルトの名無しさん
2006/03/03(金) 20:02:05>そうすりゃこんなUZEE質問しないんだからさ〜
「優しくしてくんなきゃ暴れるぞ!」みたいな。
0150デフォルトの名無しさん
2006/03/03(金) 20:47:35bcpadっていうの使ってるんだけどできないの
0151デフォルトの名無しさん
2006/03/03(金) 20:48:32それ用意してprintfカラ勉強しなおすから
0152デフォルトの名無しさん
2006/03/03(金) 21:00:05だってお前が出来なくても、お前以外誰も困らないし
つーか氏ねば?^^
0153デフォルトの名無しさん
2006/03/03(金) 21:16:48おまえには無理だから諦めろ。
真性厨房ウザいし。
家に帰ってママのちんちんでもしゃぶってろよw
0154デフォルトの名無しさん
2006/03/03(金) 21:35:260155デフォルトの名無しさん
2006/03/03(金) 21:46:09親も頭オカシイからこんな基地外のガキにネット環境を与える
基地外一家だな
0156デフォルトの名無しさん
2006/03/03(金) 22:09:45>>152->>155
こういう奴がいるからだめなんだよな。フゥ
>>151
出直して来い。としか言いようがない
ここは2chのなかでも頭のおかしい基地外が多いから(自分が頭がいいと思ってる
本当に勉強したいならハテナとかあるからそこできいたほうがいいよ
0157デフォルトの名無しさん
2006/03/03(金) 22:28:27どの板も変わらんな。
0158デフォルトの名無しさん
2006/03/03(金) 22:43:32標準的な環境?ないよ。どいつもこいつも一長一短。
山ほどのコンパイラがあり、それだけ選択肢があることがC/C++の利点でもあり欠点でもある。
0159デフォルトの名無しさん
2006/03/03(金) 22:50:20刺激すんな、暴れる厨房がまた増える。
0160デフォルトの名無しさん
2006/03/03(金) 23:04:53勝手にいろいろと実現方法を妄想してたら、
なんかものすごくオーバヘッドが必要な気が・・・
考えすぎ?もっと単純にこの仕組みは、実現できるの?
0161デフォルトの名無しさん
2006/03/03(金) 23:08:15{
エラー時の処理
}
0162デフォルトの名無しさん
2006/03/03(金) 23:08:200163デフォルトの名無しさん
2006/03/03(金) 23:10:43ISO/IEC TR 18015:2006 C++ Performance - draft TR
http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
"5 Language Features: Overheads and Strategies"
"5.4 Exception Handling"
0164デフォルトの名無しさん
2006/03/03(金) 23:11:17ぱっと思いつく方法はsetjmp〜longjmpにデストラクタの呼び出しをくっつけること。
どうくっつけるかが問題だけど。
0165デフォルトの名無しさん
2006/03/03(金) 23:42:410166デフォルトの名無しさん
2006/03/04(土) 07:33:10クラスライブラリ(?)を使用してファイルオープンさせたいときは
ifstream fin;
fin.open("a.txt");
のようにプログラムを書くことはわかったのですが、
WINDOWSのAPIのファイル関連の解説書を読むと、
HANDLE hfile;
WIN32_FIND_DATA w32fd;
hfile = FindFirstFile("a.txt",&w32fd);
のような書き方をしているのですが、 HANDLE hfile; のような文法を、いくらC++の解説書で調べても出てきません。(C言語なら HANDLE *hfileのような書き方は理解できます)
これって、構造体HANDLEの変数hfileを使うということなんでしょうか?
0167デフォルトの名無しさん
2006/03/04(土) 07:58:160168デフォルトの名無しさん
2006/03/04(土) 08:02:11と定義されてる
typedefはわかるよな?
0169デフォルトの名無しさん
2006/03/04(土) 08:35:58typedef void *HANDLE; の意味よくわかりません
0170デフォルトの名無しさん
2006/03/04(土) 09:00:43void*型は知っているか?知らなければそういう型があることを覚えておけ。
typedefは型に別名を付けるためのものだ。
168ではvoid*にHANDLEという別名を付けている。(ただしHANDLEは何からtypedefされているのかと言うことは本来どうでもいい)
かくしてHANDLEはHANDLEという型なのだ。
だからHANDLE hfile;はHANDLE型のhfileという変数の宣言になる。
0171デフォルトの名無しさん
2006/03/04(土) 14:10:11そもそも、後者はファイルのオープンじゃない。
0172デフォルトの名無しさん
2006/03/04(土) 18:44:47わざわざ使うようなAPI関数じゃないだろ
ファイル列挙の際には便利だが
0173デフォルトの名無しさん
2006/03/04(土) 18:53:29全然違います
っていうか定義を調べりゃ分かるだろ
0174デフォルトの名無しさん
2006/03/04(土) 19:47:170175デフォルトの名無しさん
2006/03/04(土) 19:54:510176デフォルトの名無しさん
2006/03/05(日) 01:41:46ありがとうございました。理解できました。
typedef宣言入門レベルより上のレベルの本かってきたら
typedef void の使い方掲載されていました。
>>171 >>172
すみません、CreateFile()の間違いでした。徹夜してたもんで・・・
だけど、これは WIN32_FIND_DATAの構造体の変数w32fdを宣言したと考えていいのでしょうか?
WIN32_FIND_DATA w32fd;
hfile = FindFirstFile("a.txt",&w32fd);
0177デフォルトの名無しさん
2006/03/05(日) 02:12:41いいんでないかい。宣言つーか定義だし、
FindFirstFile()で値をセットするための入れ物程度の意味だけど。
0178デフォルトの名無しさん
2006/03/05(日) 03:24:00UNIXのsched_yield関数やWindows SDKの
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
のように、他のタスクに処理を渡す関数のwindowsコンソールアプリ版を探しています。
一応Windows SDKは利用しているのですが、上記のソースを書くとCPUが振り切れます。
何が使えますでしょうか?
0179デフォルトの名無しさん
2006/03/05(日) 06:16:090180デフォルトの名無しさん
2006/03/05(日) 06:54:50CPU負荷率はメッセージを握ると一気に100%になる。
大体、コンソールアプリで、そこまで単純なメッセージループを作成する意図が良くわからないけど、
いったい何をしたいの?
他のタスクに処理を渡すなら、Sleep(0);とかになるけど。まさか、Win16じゃないよね?
0181デフォルトの名無しさん
2006/03/05(日) 10:04:43char str[] = "-1.1234567890123456e+000";
な%1.16e形式の文字列をそのままdoubleに変換するにはどうしたらいいですか?
sscanf(str, "%1.16e", num);
とかやってみましたがうまくいきませんでした
0182デフォルトの名無しさん
2006/03/05(日) 10:19:23sscanf(str, "%1.16e", num);
↓
sscanf(str, "%1.16e", &&&&&&&&&&&&&&&&&num);
と&を17(1+16)個並べれば逝ける。
0183デフォルトの名無しさん
2006/03/05(日) 10:49:25BYTE bd[1024]="test";
という風な書き方はできるようなのですが、
char* hoge(char *age)
な感じで関数の引数としてもらってきたageの内容をBYTE bdに入れたい場合、
どうやってキャスト(っていうんでしょうか?)して入れたらよいでしょうか?
(BYTE bd の初期化と同時に入れなくてもかまいません。)
教えてくださいお願いします。
0184デフォルトの名無しさん
2006/03/05(日) 10:54:29完全に勘で答えるが、
strcpyとかいいんじゃない?
0185デフォルトの名無しさん
2006/03/05(日) 10:55:17コピーしたいならstrcpy
bdを経由して*ageを書き換えたいなら代入
0186デフォルトの名無しさん
2006/03/05(日) 10:56:44後半は無視してくれ。寝ぼけてた
0187デフォルトの名無しさん
2006/03/05(日) 10:58:15ポインタと配列について勉強するといいよ。
0188デフォルトの名無しさん
2006/03/05(日) 11:25:34: error C2059: syntax error : '&&'
と出ますたorz
0189デフォルトの名無しさん
2006/03/05(日) 11:31:25少なくともCでは仕様でトークンの区切りが曖昧なときは
なるだけ長く取るというように規定されてるから
あれだけ&が並んでれば&& && && &&(略)と解釈されるだろうな
0190デフォルトの名無しさん
2006/03/05(日) 11:54:31&
0191デフォルトの名無しさん
2006/03/05(日) 12:18:44std::cin >> str;
このとき入力された文字列の中にエスケープシークエンスがあれば
有効にしたいんですけどいい解決法教えてエロイ人!
0192183
2006/03/05(日) 12:49:05今、あるサンプルを改造してまして、一瞬解決したと思ったのですが、
ちょっと結果に違いがでてしまいました。
どう違いが出るかを言葉で説明するのは難しいところなので改造した所だけ載せます。
サンプル:
BYTE pbData[1024] = "This is a test data.";
DWORD dwDataLen = (DWORD)strlen((char*)pbData) + 1;
改造ソース:
//エディットボックスに入力した文字列を取得してhoge関数に渡す
GetDlgItemText(hDlg,IDC_TEXT,text,sizeof(text));
hoge(text);
//hoge関数
char* hoge(char* text){
BYTEpbData[1024];
strcpy((char*)pbData,text);
DWORDdwDataLen = (DWORD)strlen((char*)pbData);
〜省略
サンプルではpbDataに直接文字列が入ってるところを、
エディットボックスから取得した文字列を渡すように改造しただけです。
なぜかサンプルのように、dwDataLenに +1 すると、
コンパイルは通るものの、動作させると落ちてしまいます。
なぜでしょうか?正しくはどう書いたらよいでしょうか。
(そもそもサンプルの方で+1する意味がわかりません)
環境は VC++6 、win2k です。よろしくお願いします。
0193デフォルトの名無しさん
2006/03/05(日) 13:29:27+1するのは、文字列の最後を表す'\0'が入る領域を取らないといけないからでは。
そしてhoge関数の中では、+1をしていないから、落ちるのでは。
0194デフォルトの名無しさん
2006/03/05(日) 13:36:22「&」をいくつも並べるときは、間にスペースを挟んでおかないと、
コンパイラが「&&」と誤認識するよ。
他にも、テンプレートの実体化、つまり、「map<int, vector<int> >」とかの「>」もそう。
0195183
2006/03/05(日) 13:44:41レスありがとうございます。
strlenは終端文字は含まないんですね。+1する意味は納得できました。
で、改造の方で落ちるのは「+1」をした場合です。
さっきまでよく意味がわかってなかったので
+1をとりあえず外してみたら動いたのですが、
すると結果がちょっとサンプルとずれたものになりました。
(+1してないので違って当然ですが)
やはり+1をしたほうが正しいはずですが、
そうしたときになぜ落ちるのかが分かりません。
0196183
2006/03/05(日) 13:55:32BYTE pbData[1024]="";
と、とりあえず何も入れないで初期化するようにしてみたら
+1しても落ちなくなり、結果もサンプルと同じになりました。
でも理由がわからないのですっきりしません。
どなたか分かる方が居たら教えてください。お願いします。
0197デフォルトの名無しさん
2006/03/05(日) 14:00:50void HandOverExection()
{
#ifdef WIN32
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg); DispatchMessage(&msg);
}
#endif // WIN32
#ifdef UNIX
sched_yield();
#endif // UNIX
}
int main()
{
bool ExitFrag = false;
while(!ExitFrag)
{
// 様々な処理
HandOverExection();
}
return 0;
}
かなり要約するとやっていることはこんな感じです。
最終的にはLINUX上で動かすことを想定していますが、開発が楽なのでwindows上でも動くように機種に依存するところは分けています。
ループしているところには実際にはサーバーとしての機能を持たせてあり、速い速度で一周します。
これではダメなのでとりあえずSleep(10)にしたところ、CPUが振り切れることはなくなりましたが、こんなんでいいのでしょうか。
0198デフォルトの名無しさん
2006/03/05(日) 14:08:47'\0'を入れてるが、何か?
0199183
2006/03/05(日) 14:13:48あ、そういう意味になるんですね。
それで、それを入れたときと入れないときで
どういう意味的なというか、処理上の違いが出てくるのでしょうか?
とりあえず意味も理解しないで適当にやってみただけなので。。。
どうしてそうしないと落ちるのでしょうか?
0200デフォルトの名無しさん
2006/03/05(日) 14:16:53なんらかの文字(0文字を含む) + 終端'\0' が文字列だって知らないの?
0201デフォルトの名無しさん
2006/03/05(日) 14:22:14つまり、終端が入っていないと、どこまで読めば終わりか
分からないってことだ。極めて初歩の内容なので、しっかり
復習しておいた方がいいと思われ。
0202デフォルトの名無しさん
2006/03/05(日) 14:22:23error C2102: '&' requires l-value
なエラーが出てしまったよぅ
#include <stdio.h>
#include <string.h>
void main(void)
{
char str[] = "-7.6338252785456362e+000";
double num;
sscanf(str, "%1.16e", & & & & & & & & & & & & & & & & & num);
printf("%1.16e\n", num);
}
0203183
2006/03/05(日) 14:23:52知ってますが件の不具合とそれがどう関連してるのかわかりません。
0204183
2006/03/05(日) 14:26:23でもエディットボックスから取ってきた文字列を
strcpyした時点で終端文字もコピーされてるんじゃないのでしょうか?
0205デフォルトの名無しさん
2006/03/05(日) 14:32:39こうやった時に何が入ってると思ってんだ?
BYTE pbData[1024]="";
こうやったら '\0' が入るのは理解したんだよな?
0206デフォルトの名無しさん
2006/03/05(日) 14:42:410207>204
2006/03/05(日) 14:43:33こっちが終端ないのかな?
0208183
2006/03/05(日) 14:44:18>BYTEpbData[1024];
>こうやった時に何が入ってると思ってんだ?
分かりませんorz
何も入ってないんじゃないかと。
何も入ってないところにstrcpyで終端文字を含む文字列がコピーされるんじゃなんいでしょうか?
>BYTE pbData[1024]="";
>こうやったら '\0' が入るのは理解したんだよな?
""は文字列の印で、とりあえず文字は空で終端文字列だけ代入されてるんだろうな、というくらいの理解です。
0209183
2006/03/05(日) 14:53:27調べてみたらGetDlgItemTextは終端を含まないみたいですね。
でも、そうなると
BYTE pbData[1024]="";
で初期化したところで
終端含まない文字列(らしきもの)をstrcpyして
どうして上手くいってるのでしょう?
0210183
2006/03/05(日) 14:57:36GetDlgItemTextで取得した文字列にはちゃんと終端が含まれるようです。
この関数自体の戻り値として、「終端を含まない文字数」が返るのだそうです。
0211デフォルトの名無しさん
2006/03/05(日) 15:12:09めんごめんご。
最初の質問を見ずに、>>188と>>189から勝手に想像して答えちゃったよ。
つ ttp://www.kouno.jp/home/c_faq/c12.html#13
0212デフォルトの名無しさん
2006/03/05(日) 15:19:11>何も入ってないんじゃないかと。
話にならん。出直してこい
0213デフォルトの名無しさん
2006/03/05(日) 15:23:16分からないなら答えるなよ。
0214デフォルトの名無しさん
2006/03/05(日) 15:25:040215183
2006/03/05(日) 15:28:25間違ってたら教えてくださいorz
0216デフォルトの名無しさん
2006/03/05(日) 15:33:44でたゎぁ!!!
ありが�d!!!
特許とったらこのスレで報告しまつ
0217デフォルトの名無しさん
2006/03/05(日) 15:50:05>>183,192
素直にやってること書けばいいのに。
野暮だけど検索してしまったよ。やってるのは↓だろう。
ttp://www.trustss.co.jp/smnEncrypt010.html
ttp://forums.belution.com/ja/vc/000/334/81s.shtml
ttp://www015.upp.so-net.ne.jp/HMMN/CryptoAPI/Crypto_1.html
ざっと見た感じ、そのコードはBYTE配列を暗号化するものであって
+1があろうが無かろうが本質的に関係ないよ。
+1した分まで暗号化するかどうか決めてるだけだろうから。
極端な話、初期化されてない「フフフフフフフフフ」な文字列だって暗号化できるだろう。おそらく。
で、解決策だが>>192のhoge関数内で
DWORDdwDataLen = (DWORD)strlen((char*)pbData);となっているところを
↓のどちらかに変えてみてどうだ?
DWORD dwDataLen = (DWORD)strlen((char*)text) + 1;
DWORD dwDataLen = (DWORD)strlen((char*)text);
0218217
2006/03/05(日) 15:52:51よく見たら、解決策のとこは間違いだ。
急いだので間違えた。
0219デフォルトの名無しさん
2006/03/05(日) 16:02:37ちょっとまて。特許って?ひょっとしてすげーエロい人?
0220183
2006/03/05(日) 16:05:09はい。その辺の事です。
で、+1の件はとりあえず解決はしたんですが、
BYTE pbData[1024]; のように初期化しないと落ちて
BYTE pbData[1024]="";のように初期化すると落ちない
ってことの意味がよく分からないんでスッキリできないんですが。
0221デフォルトの名無しさん
2006/03/05(日) 16:15:23だから出直せと言っただろうが
ついでだから書いておくと、未初期化変数の内容は保証されない
配列を""で初期化することは{ '\0', }で初期化と同値
これの結果がどうなるかすら分からんのなら回線切って氏ね
0222183
2006/03/05(日) 16:17:170223デフォルトの名無しさん
2006/03/05(日) 16:18:160225デフォルトの名無しさん
2006/03/05(日) 16:22:520226デフォルトの能無しさん
2006/03/05(日) 16:24:16されないよ 試してみな
0227デフォルトの名無しさん
2006/03/05(日) 16:25:08ttp://www.kouno.jp/home/c_faq/c1.html#30
氏ね
0228デフォルトの名無しさん
2006/03/05(日) 16:25:23ガタガタ言わずにヌルターミネートについて調べてこいヴォケ
0230217
2006/03/05(日) 16:31:40>>220
なんか情報が錯綜しててわかりにくいんだけど、
落ちる場合の192のhoge関数の先頭3行のコードと
どの辺で落ちてるか提示して。
0231183
2006/03/05(日) 16:33:23strcpyでヌル文字含んだ文字列いれたんだから
それでいいんでないのですか?
0232デフォルトの名無しさん
2006/03/05(日) 16:46:570233デフォルトの名無しさん
2006/03/05(日) 16:53:250234183
2006/03/05(日) 16:57:48192で落ちると書きましたが、実際は↓のように書いたときは落ちなくて、
DWORDdwDataLen = (DWORD)strlen((char*)pbData);
サンプルどおりにサイズに「+1」を書いた時に落ちてました。
で、+1を削ったらなぜか落ちずに動いたのですが、
出力結果がたまにサンプルとは異なるものになりました。
(サイズに+1して無いのですから、サンプルとは違いがでて当たり前だったのですが)
文字列のサイズはヌル文字も含めないといけないので、
DWORDdwDataLen = (DWORD)strlen((char*)pbData) + 1;
のように「+1」をしなきゃいけないのは分かったのですが、
192のコードでサイズに+1をして実行するととなぜか落ちてしまう。
で、その後に当てずっぽうで
BYTE pbData[1024];
を
BYTE pbData[1024]="";
というふうに初期化してみたら、+1をしても落ちなくなり
結果も正しい物が出力されるようになった。という次第です。
で、今の疑問は、なぜこうやって初期化する必要があるのか、ということです。
初期化した場合としない場合でどうちがうのかがわかりません。
ゴミが詰まってたとしてもきちんと終端を含んだ文字をstrcpyしてるんだから
問題はないのではないのかなと。
0235デフォルトの名無しさん
2006/03/05(日) 17:02:07そもそもpbDataをどう利用するのかすら分からんのに答えられる訳が無い
このスレにエスパーが居るとでも思ってるのなら氏ね
0236183
2006/03/05(日) 17:11:17BYTE pbData[1024]を初期化するかしないかで
DWORDdwDataLen = (DWORD)strlen((char*)pbData) + 1;
の部分で落ちるか落ちないかが決まっているのですから、
そこまでの手続きで既に何か違いが出ているのは明らかで、
初期化した時にはそれ以降きちんと動いて
望みどおりの結果が得られていると言っているのですから、
pbDataのその後の利用法は関係ないと思うのですが。
0237デフォルトの名無しさん
2006/03/05(日) 17:12:07そこで落ちると言うことはほんとに確認したのか?
0238デフォルトの名無しさん
2006/03/05(日) 17:17:47int main()
{
int a = 1; // a = 0だと異常終了する
/*
>>235はここまで読めば、なぜa = 0だと異常終了するのか答えられるんだよね。
すごいなあ。
*/
assert(a == 1);
return 0;
}
0239デフォルトの名無しさん
2006/03/05(日) 17:28:43あれだけ断言しているんだから、確認したんじゃない?
0240183
2006/03/05(日) 17:30:04普通の文字列もらってきてるだけですから、
strlenに+1をしないといけないのは正しいですよね?
で、BYTE pbData[1024]をきちんと初期化しない時は
strlenに+1をすると落ちてしまうのですから、
そこまでの処理で既に違いが出ているのは明らかですよね?
だって違いはそこ以前の部分だけですから。
初期化をきちんとして、strlenに+1をすれば
正しい結果も出ているのですから、その後の処理も正しいと思います。
っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
キレられてたんですが、そこではないのですか。
0241デフォルトの名無しさん
2006/03/05(日) 17:34:59だからまさにその「strlenの行」で確かに落ちてることを確認したのかと聞いてるわけだが?
0242217
2006/03/05(日) 17:35:00いまやってるのは217で書いたような「暗号化」なんだろ。
暗号CryptEncrypt、復号CryptDecryptの両関数は
文字列ではなく単なるBYTE配列を扱うものだから、終端がどうのこうのは関係ない。
(\0で元データの長さを判断しているわけではない)
だからCryptEncryptには第六引数にdwDataLenで長さを指定して
その長さを見て暗号化してるんだと思うよ。
+1してるのは\0の範囲まで暗号化する意思を示しただけであって、
+1しないで暗号化しても何ら構わないはず。
今こっちでVC6,Win2000で確認したところやはり落ちない。
もう一度書くけど、
落ちてるんだとしたらどこで落ちてるか提示して、
落ちるケースのhoge関数の先頭3行ずばりそのものを192と同じように書いてくれ。
>>240
>っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
>キレられてたんですが、そこではないのですか。
ほかの回答者の方々は「暗号化」の問題だと知らない時点で
回答してくれてるんだから、そのような判断をするのはしかたがない。
一般的な文字列の問題だと思って回答してくれてるんだから。
そっちが情報を出さないのが悪い。
0243デフォルトの名無しさん
2006/03/05(日) 17:36:32もうアップすればいいじゃんw
0245デフォルトの名無しさん
2006/03/05(日) 17:40:050246デフォルトの名無しさん
2006/03/05(日) 17:41:10#include "stdafx.h"
#include <stdio.h>
char *hoge(char* text);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
hoge("This is a pen");
return 0;
}
char* hoge(char* text){
BYTE pbData[1024];
strcpy((char*)pbData,text);
DWORD dwDataLen = (DWORD)strlen((char*)pbData)+1;
return NULL;
}
ってコードを書いてみたけど落ちないよ。
なんで原因は別のところにあるんじゃない?
0247デフォルトの名無しさん
2006/03/05(日) 17:41:29・・・私はあまりに情報を小出しにするので、悪いけど下ろさせてもらいまする
0248デフォルトの名無しさん
2006/03/05(日) 17:54:16初期化してない場合その中がどうなってるのか、見てみればいい
0249217
2006/03/05(日) 17:54:59検証してくれ。環境はVC6+Win2000で質問者と同じようだ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1679.txt
(>>192のエディットボックスうんぬんは本質とは関係ないのでコンソールで検証してみた)
0250デフォルトの名無しさん
2006/03/05(日) 18:10:17VC8のclに/link advapi32.lib付けて試したが
コンパイル・実行ともに問題なかった
strcpyで警告は出てるがな
0251デフォルトの名無しさん
2006/03/05(日) 18:17:510252183
2006/03/05(日) 18:38:22わざわざすいません。
試してみましたが、ちゃんと動きました。
何が違うのかわかんないのでUPしてみました。
txtだとUPできないのでjpgになってます。そのまま読めると思います。
ttp://gamdev.org/up/img/4875.jpg
0253デフォルトの名無しさん
2006/03/05(日) 18:41:53キミは実にバ(以下略
0254デフォルトの名無しさん
2006/03/05(日) 18:48:360255デフォルトの名無しさん
2006/03/05(日) 18:52:220256デフォルトの名無しさん
2006/03/05(日) 18:53:12おまいらはどうよ?
0259デフォルトの名無しさん
2006/03/05(日) 19:23:260260183
2006/03/05(日) 19:27:47仮にそこで問題が出るとしても、
そこで問題が出るに至った根本原因は
例の三行くらいの改造個所の部分しかないと思います。
そこをオリジナルのままにすれば落ちないで正常に結果も出るのですから、
少なくとも改造した個所は
オリジナルとは意味的に異なる事をしているのは明らかだと思います。
0261デフォルトの名無しさん
2006/03/05(日) 19:29:47俺もchar*云々関係ないと思う。
0262デフォルトの名無しさん
2006/03/05(日) 19:30:46おそらくだけど・・・
CryptEncryptはpbDataをdwDataLen分だけ暗号化するんだけど、
そうするとこの場合は文字列終端の\0まで含まれちゃう。
pbDataを初期化している場合はpdData[dwDataLen+1] が\0だから、一応ヌルターミネイト文字列になるんだけど、
初期化されてない場合は\0が無いので、その後のstrlenで落ちてしまうんじゃないかな?
サンプルだとpbDataはたいてい初期化されてるね。
で、この場合の解決策は
1) 暗号化するデータ長に+1を足さない
2) pdDataを事前に初期化(pdData[dwDataLen+1]=\0ならOK)する
のどちらかがいいと思う。
0263デフォルトの名無しさん
2006/03/05(日) 19:37:24strlen(plaintext)でやっときゃpbDataの初期化だなんだと騒がなくていいじゃねぇかとか
そう思った俺は異端なのか?
0264デフォルトの名無しさん
2006/03/05(日) 19:43:18異端じゃないと思う。ただ理由は知らんが、どのサンプルソースをみても
暗号化バイト長 = 文字列長 + 1
となっている。
0267デフォルトの名無しさん
2006/03/05(日) 19:53:41暗号化後のデータをヌルターミネイト文字列扱いするのがまずいんじゃね?
暗号化後のデータって普通、ヌルターミネート文字列じゃなくて、単なるバイナリだと思うんだが・・・
0268デフォルトの名無しさん
2006/03/05(日) 19:58:33もうバイナリになった時点でどこに0がくるかこないかわからないからねぇ。
0269デフォルトの名無しさん
2006/03/05(日) 19:59:57CryptEncrypt後のpdDataに対してstrlenを使ってないからじゃない?
0270217
2006/03/05(日) 20:06:20「初期化する・しない」と「+1する・しない」で4組あるのでそれぞれ検証
前提:暗号化する文字列は abc
encrypt(char *plaintext)に渡されるのは abc\0(バイト配列で言うと[61 62 63 00])
strlenは3、+1すると4
■初期化しない&+1する
・pbData[1024]:[cc cc cc cc cc cc cc 〜 cc](初期化てされない)
・strcpy後:[61 62 63 00 cc cc 〜 cc]
・暗号化前:[61 62 63 00]
・暗号化後:[89 9a 48 3d]
・pbData[1024]:[89 9a 48 3d cc cc cc 〜 cc](結果が返ってくる)
・plaintextにコピー:[89 9a 48 3d cc cc cc 〜 cc]
・結果:終端を判断する\0がないため、SetDlgItemTextの時に落ちてしまう。
■初期化する&+1する
・pbData[1024]:[00 00 00 00 00 00 〜 00](初期化)
・strcpy後:[61 62 63 00 00 00 00 〜 00]
・暗号化前:[61 62 63 00]
・暗号化後:[89 9a 48 3d]
・pbData[1024]:[89 9a 48 3d 00 00 00 〜 00]
・plaintextにコピー:[89 9a 48 3d 00 00 00 〜 00]
・結果:3dの後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
続く
0272デフォルトの名無しさん
2006/03/05(日) 20:13:090273デフォルトの名無しさん
2006/03/05(日) 20:13:51+1してた場合ヌル文字も一緒に暗号化するから、
暗号化後のヌル文字はヌル文字では無くなってしまうのよ。
0274217
2006/03/05(日) 20:18:37■初期化しない&+1しない
・pbData[1024]:[cc cc cc cc cc cc cc 〜 cc]
・strcpy後:[61 62 63 00 cc cc 〜 cc]
・暗号化前:[61 62 63]
・暗号化後:[89 9a 48]
・pbData[1024]:[89 9a 48 00 cc cc cc 〜 cc]
・plaintextにコピー:[89 9a 48 00 cc cc cc 〜 cc]
・結果:48の後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
■初期化する&+1しない
・pbData[1024]:[00 00 00 00 00 00 〜 00](初期化)
・strcpy後:[61 62 63 00 00 00 00 〜 00]
・暗号化前:[61 62 63]
・暗号化後:[89 9a 48]
・pbData[1024]:[89 9a 48 00 00 00 00 〜 00]
・plaintextにコピー:[89 9a 48 00 00 00 00 〜 00]
・結果:48の後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
>>272
おかしいのは分ってる。それを183に説明してやってるの。
0276183
2006/03/05(日) 20:33:58お手数をおかけしました。納得しました。
初期化とその後の処理で違いが出るのも理解しました。
ありがとうございました。
ところで単純に
char a[1024];
SetDlgItemText(hDlg,IDC_CIPHERTEXT,a);
とテストしてみたら「フフフフフフ・・・・」でしたが落ちませんでした。
0277デフォルトの名無しさん
2006/03/05(日) 20:37:50plaintextはスタックにあるし。
0278デフォルトの名無しさん
2006/03/05(日) 20:40:500280デフォルトの名無しさん
2006/03/05(日) 20:47:29ホントにそこで落ちてるの?とか聞かれてたのに終わってみれば
結局確認してないわけねw
おもしろいな。お前。
0283デフォルトの名無しさん
2006/03/05(日) 21:08:170284デフォルトの名無しさん
2006/03/05(日) 21:09:56そりゃてめーだろ。
そんなもん実行して値確認すりゃ済む話なのになんでなんで聞きにきやがってアホかw
アフォ丸出しだなw
アフォの世界チャンピオンだなw
0286183
2006/03/05(日) 21:28:52結局どうやって書くのが普通ですか。
なんか嫌味っぽく変だと言われたままなので気持ち悪いです。
0287アフォの世界チャンピオン
2006/03/05(日) 21:30:060288デフォルトの名無しさん
2006/03/05(日) 21:32:390289デフォルトの名無しさん
2006/03/05(日) 21:35:090290デフォルトの名無しさん
2006/03/06(月) 06:32:28回答も小出し
中身空っぽのくせに、何をそんな隠し持とうとするの、君ら?
0291デフォルトの名無しさん
2006/03/06(月) 06:37:460292デフォルトの名無しさん
2006/03/06(月) 07:01:07昨日のアフォのチャンプかw
0293デフォルトの名無しさん
2006/03/06(月) 09:18:01しかも俺がreturnの所のstrcpyで落ちると言ってるのにスルーしてるしな
0294デフォルトの名無しさん
2006/03/06(月) 10:24:20頭わるいなぁ・・・
ここでいう回答が小出しというのは、不完全な質問に完全な回答が無いということではなく
今自分ができる回答の中から言葉を小出しにし、それによって混乱気味の質問者を
さらに混乱に落とし込んで流れを余計しっちゃかめっちゃかにする言動のことだよ
回答者ならアフォでも許されるというわけではないよ
馬鹿は馬鹿にされる
0295デフォルトの名無しさん
2006/03/06(月) 10:28:09彼らにメチャクチャ都合悪いのに、論理的に完全だもんなぁ・・・
0296デフォルトの能無しさん
2006/03/06(月) 10:28:100297デフォルトの名無しさん
2006/03/06(月) 10:29:06はいご苦労さん
ま、できもしない回答をするから痛い目に遭うんだ
0298デフォルトの名無しさん
2006/03/06(月) 10:32:480299デフォルトの名無しさん
2006/03/06(月) 10:34:58他人の不完全性を一方的に叩くだけでいられる、自分の言動は一切不問だ、と思ってた奴に
お前アイツと同じ不出来を持ってるよ、と華麗に指摘したあとのファビョりようは各板共通
0300デフォルトの名無しさん
2006/03/06(月) 10:37:070301デフォルトの名無しさん
2006/03/06(月) 10:46:35なんか切れちゃってる人の
不思議系一行レスが続きます
0302デフォルトの能無しさん
2006/03/06(月) 10:50:17この人妄想癖でもあるのかな?
ま、俺は回答したことがないわけだが。
>ま、できもしない回答をするから痛い目に遭うんだ
すました回答しても妄想厨は妄想厨
0303デフォルトの名無しさん
2006/03/06(月) 10:54:150304デフォルトの名無しさん
2006/03/06(月) 10:55:23すべて書いた通り
0305デフォルトの名無しさん
2006/03/06(月) 11:01:40そういう奴が一番痛い。
自分ができないことを分かってないからな。
中途半端でも回答して、
その批評を期待してる奴のほうが向上心があってまだマシ。
0306デフォルトの名無しさん
2006/03/06(月) 11:07:10/*------------------------------------------------------------*/
次の方、どうぞ
0307デフォルトの名無しさん
2006/03/06(月) 12:12:25お前そんなこと言ったっけ?
0308デフォルトの名無しさん
2006/03/06(月) 12:19:43>>256
0309デフォルトの名無しさん
2006/03/06(月) 12:25:16行数なんかシラネってヌルーしてた
0310デフォルトの名無しさん
2006/03/06(月) 13:30:480311デフォルトの名無しさん
2006/03/06(月) 13:35:270312デフォルトの名無しさん
2006/03/06(月) 13:35:570313デフォルトの名無しさん
2006/03/06(月) 13:41:420314デフォルトの名無しさん
2006/03/06(月) 13:46:43実兄の嫁は姉ですよね?
実兄と嫁の間の娘は姪ですよね?
0315デフォルトの名無しさん
2006/03/06(月) 14:00:05スレタイ読め
0316デフォルトの名無しさん
2006/03/06(月) 14:05:060317デフォルトの名無しさん
2006/03/06(月) 14:33:19> 実兄の嫁は姉ですよね?
義姉
> 自分から見て「実兄」の「嫁」の姉妹や兄弟は何ていいますか?
義姉妹や義兄弟
0318デフォルトの名無しさん
2006/03/06(月) 15:25:53・義姉妹(しまい)
・義兄弟(きょうだい)
0319デフォルトの名無しさん
2006/03/06(月) 15:31:290320デフォルトの名無しさん
2006/03/06(月) 15:58:200321デフォルトの名無しさん
2006/03/06(月) 16:51:55カエレ
0322デフォルトの名無しさん
2006/03/06(月) 17:36:00カエラ
0323デフォルトの名無しさん
2006/03/06(月) 18:11:51質問者がデバッカも使えないアフォの世界チャンプだった事実は消せないわけですがなにか?
0324デフォルトの名無しさん
2006/03/06(月) 18:16:48/*------------------------------------------------------------*/
次の方、どうぞ
0325デフォルトの名無しさん
2006/03/06(月) 18:27:33ただの悪ぶっているヤンチャ坊主だろ?
44秒で倒すと言ってるらしいが、
自分にはパワーも手数もあるから、負けるわけがない。
逆に俺の右アッパーをブチ込むよ。
0326デフォルトの名無しさん
2006/03/06(月) 18:36:35/*------------------------------------------------------------*/
次の方、どうぞ
0327デフォルトの名無しさん
2006/03/06(月) 18:37:390328デフォルトの名無しさん
2006/03/06(月) 18:39:45ローソンのハッシュドポテトは少々脂っこい。
普通のハッシュドポテトよりかなり脂っこい。
0329デフォルトの名無しさん
2006/03/06(月) 18:42:46だがそれが旨い。
0330デフォルトの名無しさん
2006/03/06(月) 18:44:490331デフォルトの名無しさん
2006/03/06(月) 18:45:510332デフォルトの名無しさん
2006/03/06(月) 19:35:220333デフォルトの名無しさん
2006/03/06(月) 19:35:29#ホントは焼く方が油が少なくていいのだが。
0334デフォルトの名無しさん
2006/03/06(月) 19:53:34解決しました
0335デフォルトの名無しさん
2006/03/06(月) 20:45:02スタック領域を見れば、どの関数から呼ばれたのかを解析できると聞いたので。
そこで、何か参考とすべきWebサイトはありましたら教えてもらえないでしょうか?
とりあえず、BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。
0336デフォルトの名無しさん
2006/03/06(月) 20:47:54> BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。
スタック構造に違いがある可能性が高いので、
その手順は踏めないと思われ。
0337デフォルトの名無しさん
2006/03/06(月) 21:11:26x86ならcall/ret命令。つまり、機械語かアセンブラについて解説してるページ。
ほかのCPUでも似たようなもん。
0338デフォルトの名無しさん
2006/03/06(月) 21:31:29SH とか ITRON とかどうなってるかシラネなので何とも。
0339デフォルトの名無しさん
2006/03/06(月) 23:10:110340デフォルトの名無しさん
2006/03/06(月) 23:17:090341デフォルトの名無しさん
2006/03/06(月) 23:24:590342デフォルトの名無しさん
2006/03/06(月) 23:27:05(val + (dev - 1)) / dev
0344デフォルトの名無しさん
2006/03/07(火) 00:46:09ところで、int形ってどんな形?
0345デフォルトの名無しさん
2006/03/07(火) 01:01:451024TBの虚数型だ。
0346デフォルトの名無しさん
2006/03/08(水) 01:02:020347デフォルトの名無しさん
2006/03/08(水) 01:02:370348デフォルトの名無しさん
2006/03/08(水) 01:06:00vectorとかvalarrayとか使うのが吉。
0349デフォルトの名無しさん
2006/03/08(水) 01:10:57ありがとうございます。vector< vector<int> >ってところでしょうか。使ってみます。
0350デフォルトの名無しさん
2006/03/08(水) 02:13:56DrawTextの関数を使うときの文字列を指定する2番目の引数の型がLPCWSTRに変換できませんとエラーが出ます。
むりやりキャストをすると表示はされるのですが文字化けしているようでした
VC6時代の本についてたサンプルでは#define DrawText DrawTextAとなっていて
エラーが出ることが無かったので
VC8のデフォルトの#define DrawText DrawTextWを↑の定義に直したら
エラーは出なくなったんですが、正しい対処の仕方ではない気がします。
本当はどうすればよかったのでしょうか。
0351デフォルトの名無しさん
2006/03/08(水) 08:15:361. (正攻法)きちんとTCHARやTEXTを使ってプログラムを書く。
2. (逃げ技)プロジェクトのプロパティから文字セットの設定をUnicodeからマルチバイトへ変更する。
0352デフォルトの名無しさん
2006/03/08(水) 08:32:15基底クラスのコンストラクタの引数にそのまま渡したいのですが
どうやって書いたらいいでしょうか?
0353デフォルトの名無しさん
2006/03/08(水) 08:34:23構造体のコンストラクタで、以下の様な記述はありですか?
SHoge::SHoge()
{
ZeroMemory(this, sizeof(SHoge));
}
大量のメンバ変数を持つ場合、初期化子を延々と並べると煩雑になります。
これ方法だと、メンバ変数を追加したときにも初期化し忘れることがないというメリットがあり、
特にデメリットも思い当たりませんでした。
ですが、こういった記述は見たことがなく、何か気持ち悪くて不安なのです。
0354デフォルトの名無しさん
2006/03/08(水) 09:10:43class Base
{
public:
Base(int n) {}
};
class Derived : public Base
{
public:
Derived(int n) : Base(n) {}
};
>>353
仮想関数を持っていたり、仮想継承していたり、メンバに非PODのクラスがあったり
(移植性を考えるなら)メンバにポインタ・参照・浮動小数点数があったりするのであればやめたほうがよい。
0355デフォルトの名無しさん
2006/03/08(水) 09:45:11>353はZeroMemory()の段階で移植性は捨てていると思われ。
0356デフォルトの名無しさん
2006/03/08(水) 10:16:590357デフォルトの名無しさん
2006/03/08(水) 10:32:34何か知ってる方がいましたら教えてください
0358デフォルトの名無しさん
2006/03/08(水) 11:06:09ICUを使うとか。
0359質問
2006/03/08(水) 13:00:010360デフォルトの名無しさん
2006/03/08(水) 13:11:580361デフォルトの名無しさん
2006/03/08(水) 13:59:54そこから考えればSTEP数が何かはすぐわかるだろ。
0362デフォルトの名無しさん
2006/03/09(木) 07:26:55この関数を外から呼べるようにポインタをGetできるような 関数って
どう書いたらよいでしょうか?(GetHogeとかいう名前にするとして)
0363デフォルトの名無しさん
2006/03/09(木) 07:34:23メンバ関数から関数ポインタは取れない。
メンバ関数へのポインタなら取れるが、これには
&classname::m_hoge
と書く。
0364デフォルトの名無しさん
2006/03/09(木) 08:07:36>メンバ関数へのポインタなら取れるが、
すいません、違いがよく分からないのですが…
0365デフォルトの名無しさん
2006/03/09(木) 08:21:46そうでない場合、メンバ関数へのポインタはただの関数へのポインタとは違う型。
class foo
{
void m_hoge(int);
public:
typedef void (foo::*bar)(int);
bar get() {return &foo::m_hoge;}
};
foo obj;
foo::bar fn = obj.get();
obj.*fn(1);
&foo::m_hogeはvoid (foo::*)(int)型。
もっと普通の関数ポインタみたいに使いたいならboost::functionとboost::mem_fnで。
0366デフォルトの名無しさん
2006/03/09(木) 08:32:210367デフォルトの名無しさん
2006/03/09(木) 08:46:31なるほど。納得しました。
分かりやすくありがとうございました。
0368デフォルトの名無しさん
2006/03/09(木) 10:13:540369デフォルトの名無しさん
2006/03/09(木) 10:54:42外部ツールで編集した時に、「このファイルは外部のエディタで
変更されています。ロードしますか?」と、出て更新出来たと思うのですが、
これが全く出なくなってしまいました。
オプションの[外部でファイルの変更時、自動的に再ロード]の話ではなく、
更新自体が感知されていないようで…。
VC6というより、OS側の問題っぽい気もしますが…
原因を御存知の方、アドバイス頂ければ幸いです。
0370デフォルトの名無しさん
2006/03/09(木) 11:04:54これはひどいスレ違いですね
0371デフォルトの名無しさん
2006/03/09(木) 11:12:060372369
2006/03/09(木) 12:08:40こちらに移動します
http://pc8.2ch.net/test/read.cgi/tech/1140269442/
0373デフォルトの名無しさん
2006/03/09(木) 12:44:36言語とIDEは別物。
0374デフォルトの名無しさん
2006/03/09(木) 13:25:240375デフォルトの名無しさん
2006/03/09(木) 13:35:060376デフォルトの名無しさん
2006/03/09(木) 16:18:01> 俺はここでいいと思うけど
「アプリの使い方」と「C/C++」に何の関係があるのかと(ry
0377デフォルトの名無しさん
2006/03/09(木) 18:09:52ダイアログリソースでダイアログと、そのコントロールを作って、
コントロールに"〜のコントロールにマウスが乗った・外れた""フォーカスが入った"
などを調べたいとき、どうしたらいいですか?
最初、素直にダイアログプロシージャのWM_MOUSEMOVEメッセージから来るマウスの位置から調べようと思ったのですが、
Static Text以外のEdit Control上とか、Radio Button上とかではWM_MOUSEMOVEメッセージが来ないので…
0378デフォルトの名無しさん
2006/03/09(木) 18:23:38・サブクラス化
・WM_NCHITTESTを捕まえてポインタ位置とコントロール位置の比較
お好きなようにどうぞ
あとスレ違いな
0379デフォルトの名無しさん
2006/03/09(木) 18:52:04これはすまんでした。
え〜っと、WM_NCHITTESTもWM_MOUSEMOVEと同様に、
エディットコントロール上やラジオコントロール上だと、マウスのポインタ位置が取得できません…
(そもそもメッセージが来ない)
Win32APIスレに行ってきます…
0380デフォルトの名無しさん
2006/03/09(木) 21:23:071も読めないアフォ
0381デフォルトの名無しさん
2006/03/10(金) 00:14:07初心者から中級者、上級者というくくりになるんですか?
0382デフォルトの名無しさん
2006/03/10(金) 00:16:440383デフォルトの名無しさん
2006/03/10(金) 08:46:19どういう設計にしたらよいか分からないので教えてください。
まず、ウィンドウのパーツ(コントロールと呼びます)類のクラスがいろいろあります。
ボタンクラス、スクロールバークラス、フレーム(ウィンドウの枠)クラス、等です。
これらは全て共通の基底クラスから派生していて、その基底クラスには
「それぞれのコントロール類が発行するイベントメッセージを処理させる関数へのポインタ」
をメンバ変数として持たせています。
とりあえず「コントロール自身のID」と「メッセージの種類」を飛ばせればよいので
の関数ポインタの型は、「void (*)(int, int)」とします。
それでここが問題なのですが、
例えば「スクロールバークラス」の内部にメンバとして「ボタンクラス」のオブジェクトを持たせ、
上下左右のスクロールボタンとして使いたい場合、
このボタンオブジェクトが持つ「メッセージ処理関数へのポインタ」には
「スクロールバークラスのメンバ関数へのポインタ」を指定したいので、
「void (*)(int, int)」では型が合いません。
また、このウィンドウシステムをライブラリ化してユーザーに使ってもらうときなどを考えた場合、
ウィンドウをまとめて管理したいためにマネージャクラスなんかを作って
そのクラスのメンバ関数でメッセージ処理などをしたくなるでしょうから、その時も型の問題が出てきます。
こういう場合、皆さんだったらどういう設計にしますでしょうか?
何か使えるテクニックなどはありますでしょうか?
0384383
2006/03/10(金) 08:51:27グローバルで定義すればこれでもいけるのですが、
それでは使い勝手も悪いし気持ち悪いので、
どうにかすっきりした方法があれば知りたいです。お願いします。
0385デフォルトの名無しさん
2006/03/10(金) 08:52:230386デフォルトの名無しさん
2006/03/10(金) 09:05:50まず、既存のウィンドウ系システム(WindowsやX-Windowなど)が、
どの様な作りになっているのか、を調査するべき。
0387デフォルトの名無しさん
2006/03/10(金) 09:51:46void (*)(int, int)ではなく、boost::function<void (int, int)>にすれば解決。
え、ABI?何それ。
0388デフォルトの名無しさん
2006/03/10(金) 09:56:59私はある工学部の学生ですが,今の分野ではやりたい就職がないのでC言語をやろうと思ってます。
そこですぐに勉強を始めたいのですが,CやC++などはどの言語を勉強するべきなのでしょうか?
初めはどのような参考書から始めるべきですか?
0389デフォルトの名無しさん
2006/03/10(金) 09:57:580390デフォルトの名無しさん
2006/03/10(金) 10:23:07スルーで
0391デフォルトの名無しさん
2006/03/10(金) 10:42:14オススメ
0392383
2006/03/10(金) 11:12:54なんかとても便利そうなのですが、
それを使えばどんなクラスのメンバ関数へのポインタだろうが
グローバルで宣言された普通の関数へのポインタだろうが
入れられるんですかね?
とりあえず、
boost::function1<void,UINT> m_MsgFunc;
のように「メッセージ処理関数へのポインタ」のメンバ変数を定義して、
void SetMsgFunc(boost::function1<void,UINT> pfunc){m_MsgFunc = pfunc;}
と、ポインタのセッターを作って、
m_hoge->SetMsgFunc(&CBar::MsgFunc)
と呼んでみたらエラーがでました。(boostの中のほうで)
書き方はこれであってますでしょうか。
あとABIってなんですか。
これ使うとなんか問題があるんでしょうか?
0393デフォルトの名無しさん
2006/03/10(金) 11:47:15こうですか? わかりません。
0394デフォルトの名無しさん
2006/03/10(金) 11:57:490395デフォルトの名無しさん
2006/03/10(金) 11:59:570396デフォルトの名無しさん
2006/03/10(金) 12:03:47スレ違い。
0397デフォルトの名無しさん
2006/03/10(金) 12:07:35メンバ関数呼び出しには this が必要になるんで、
いっしょに渡してやらないと呼び出せないだろ。
boost::bind, boost::lambda::bind 好きなの選んでバインドしろ。
あと、最低でも自分で調べてから聞こうな。
http://e-words.jp/w/ABI.html
0398383
2006/03/10(金) 13:13:06「返り値の型」や「引数の数や型」が同じでも、
あるクラスのメンバ関数へのポインタとグローバルな関数へのポインタは
同じ関数ポインタに入れられないのは分かりましたが、
ではまず、boost::functionを使うことでこの問題の何が解決するんですか?
これを使うことでメンバ関数かグローバル関数かの違いを吸収できるのかと考えたのですが、
そうかと思っていたらそうでもない様子でboost::bindを使えとのこと。
ではboost::functionの意味とはなんなのでしょうか?
0399デフォルトの名無しさん
2006/03/10(金) 13:17:43関数オブジェクト(bindしたものなども含む)と普通の関数の違いを吸収できるとでも言えばいいかな。
0400デフォルトの名無しさん
2006/03/10(金) 13:51:48お前、言われたそばからまた自分で調べずにわめいてるだろ。
とりあえず bind 試してみるぐらいしろよ。
0401383
2006/03/10(金) 14:00:59誰かサンプル書いてください。
もう禿げそうです。
0402デフォルトの名無しさん
2006/03/10(金) 14:02:410403383
2006/03/10(金) 14:06:320404402
2006/03/10(金) 14:18:560405383
2006/03/10(金) 14:26:49よかったです。でもあなたは帰ってくださいね。
質問スレに必要のない邪魔なだけの存在ですから。
0406デフォルトの名無しさん
2006/03/10(金) 14:28:54#include <boost/function.hpp>
#include <boost/bind.hpp>
class Hoge
{
public:
void f(int x, int y) {std::cout << x << ' ' << y << std::endl;}
};
typedef boost::function<void (int, int)> Handler;
int main()
{
Hoge x;
Handler h = boost::bind(&Hoge::f, x, _1, _2);
h(10, 20);
}
俺はboost::signalもC#のイベントっぽくて悪くなさそうに思うが。
0407402
2006/03/10(金) 14:29:17よかったです。でもあなたは帰ってくださいね。
質問スレに必要のない邪魔なだけの存在ですから。
0408402
2006/03/10(金) 14:57:150409383
2006/03/10(金) 15:01:060410デフォルトの名無しさん
2006/03/10(金) 15:11:49>誰かサンプル書いてください。
こいうことを書く基地外がいるから荒れるんだよ。
本でも買ってくれば?
0411383
2006/03/10(金) 15:12:26すいません、↓みたいな事をやりたいとしたら正しくはどう書いたらよいですか?
bind の意味とか書式が解説読んでも何やってるか全く理解できないです。
class Hoge
{
public:
void f(int x, int y) {std::cout << x << ' ' << y << std::endl;}
};
typedef boost::function2<void ,int, int> Handler;
void gfunc(int x, int y) {std::cout << x << ' ' << y << std::endl;}
int main()
{
Hoge x;
Handler h = boost::bind(&Hoge::f, x, _1, _2);
h(10, 20);
Handler g = gfunc;
g(100,200);
}
0412383
2006/03/10(金) 15:15:56説明されてもわからないから、サンプル書けって言ってるだけなんだが。
何が悪い?
0413383
2006/03/10(金) 15:17:47やめてくださいホントに。
0414デフォルトの名無しさん
2006/03/10(金) 15:19:35説明してもわからないから、本買えって言ってるだけなんだが。
何が悪い?
0415383
2006/03/10(金) 15:22:05説明の仕方が悪いんじゃね。本買えで済んだらこのスレいらないじゃん。
0416デフォルトの名無しさん
2006/03/10(金) 15:39:350417デフォルトの名無しさん
2006/03/10(金) 15:41:460418デフォルトの名無しさん
2006/03/10(金) 15:42:44正しいも何もそれでコンパイルできると思うが。
0419383
2006/03/10(金) 15:52:15error C2440: 'initializing' : '' から 'class boost::function2<void,int,int,int>' に変換することはできません。(新しい動作 ; ヘルプを参照)
というエラーがでました。VC6ですけど
もしかしてコンパイラが対応してないとか…
0420デフォルトの名無しさん
2006/03/10(金) 15:59:390421383
2006/03/10(金) 16:08:240422デフォルトの名無しさん
2006/03/10(金) 16:08:260423デフォルトの名無しさん
2006/03/10(金) 16:09:210424デフォルトの名無しさん
2006/03/10(金) 16:10:35その通り、いけぬま>>383はこの世に必要ない
少なくとも日本の社会には必要ない
0425デフォルトの名無しさん
2006/03/10(金) 16:12:28もう帰ってくれるか?
0426383
2006/03/10(金) 16:15:590427383 ◆vp/58lzmEY
2006/03/10(金) 16:17:240428383
2006/03/10(金) 16:21:52にしたらいけました。とりあえずなんか凄いのは分かりました。
0429デフォルトの名無しさん
2006/03/10(金) 16:31:13こっちのcallbackのほうがわかりやすいぞ
0430383
2006/03/10(金) 17:10:15こういうことをやりたいときに結構ありがちな問題なんですかね、もしかして。
でもちょっと見たところ難しそうです。
きっと後で参考になると思うので保存しておきました。ありがとうございます。
でも、とりあえずbindとfunctionを使ったやり方を知っておきたいです。
ですがいまだにbindの意味がわかりません。
どなたか、↓を日本語ふうに訳していただけませんでしょうか。
Handler h = boost::bind(&Hoge::f, x, _1, _2);
0431デフォルトの名無しさん
2006/03/10(金) 17:15:38043230
2006/03/10(金) 17:22:58char* s;
という変数があって、上記変数に値を代入した後
int hogehoge( const char* a )
という関数に渡したいのですがエラーになります。
どうすればいいのでしょう?
0433デフォルトの名無しさん
2006/03/10(金) 17:25:140434デフォルトの名無しさん
2006/03/10(金) 17:35:07boost::bind(&Hoge::f, x, _1, _2)は
boost::bind(boost::mem_fn(&Hoge::f), x, _1, _2)と考えることができる。
boost::mem_fnはメンバ関数呼び出しを、普通の関数オブジェクトへ変形する効果がある。
つまりa = boost::mem_fn(&Hoge::f)とすると、
x.f(10, 20)というのはa(x, 10, 20)と同じことになる。
void f(int, int);
b = boost::bind(f, 2, _1);
というのがあったとして、b(5)というのはf(2, 5)と同じことになる。
bindの中の_1は、(bindが返す関数オブジェクトが呼ばれたときの)1番目の引数を意味する。
元のfは2引数あったが、bindで1つ目の引数に2を束縛したので、bは1引数で呼ぶことができるようになったというわけだ。
a(x, 10, 20)のように、aを呼び出すには3引数必要だ。
そこをbindで最初の引数にxを束縛させて、2引数(これはちょうどHoge::fの引数に一致する)で呼べるようにしている。
それをhに代入しているという具合。
043530
2006/03/10(金) 17:51:060436デフォルトの名無しさん
2006/03/10(金) 17:54:32そうではわからないからコード見せろ。
0437デフォルトの名無しさん
2006/03/10(金) 18:12:34char *s;
s = a;
....
}
というふうにはできない
変数aとsの両方ともにconstつけるか、はずせ
0438デフォルトの名無しさん
2006/03/10(金) 18:13:260439デフォルトの名無しさん
2006/03/10(金) 19:00:04char *ItoS(const int i){
static char DtoS_Buf[32];
sprintf(DtoS_Buf, "%d", i);
return DtoS_Buf;
}
int main(){
int i = 73; //1001001
char str_buf[128];
//動作1
printf(
strcat(
strcat(
strcpy(str_buf, ItoS(i >> 4))
,ItoS(i & 15))
, ItoS(i)));
printf("\n\n\n");
//動作2
strcpy(str_buf, ItoS(i >> 4));
strcat(str_buf, ItoS(i & 15));
strcat(str_buf, ItoS(i));
printf(str_buf);
printf("\n\n\n");
}
動作1(444)と動作2(4973)で実行結果が違うのはなぜ?
0440デフォルトの名無しさん
2006/03/10(金) 19:41:28ヒント:static
0441デフォルトの名無しさん
2006/03/10(金) 19:42:53よく、そんな鼻から悪魔が出る様なソースを思い付けるね
0442デフォルトの名無しさん
2006/03/10(金) 20:24:17char * s = "foo";
hogehoge(s):
でエラーが出ると言うことか?
それならば、
const char * s = "foo";
hogehoge(s);
とすればいい。
>>439
ItoS()の静的バッファは唯一のものなので、呼び出しごとに再利用されることになる。
従って、動作1ではたまたま最後に呼ばれたItoS(i >> 4)の結果が保持され、
それが3回str_bufに連結されたわけだ。
文字列を返す関数を作る場合、以下の3つの戦略があるわけだが、結局1が尤も妥当と言うことになる。
1. 呼び出し側でバッファを用意し、それを関数に渡して格納してもらう。
→呼び出し側で用意したバッファの長さは別途関数に渡す(strftime()流)か、お任せにする(gets()流)。
2. 関数側でメモリをアロケートしそこに格納し、呼び出し側に戻す。
→呼び出し側で後ほど確実に解放する必要がある。これはしばしば忘れられてメモリリークの原因となる。
3. 関数側で静的バッファを用意してそこに格納し、呼び出し側に戻す(>439の戦略)。
→呼び出し側では即座に値を引き取る必要がある。また、マルチスレッド対応できない。
番外. C++の文字列クラスのような安全な文字列を返す。
0443デフォルトの名無しさん
2006/03/10(金) 21:37:49いろいろかんがえてみたのですが(FindFirstFileとレジストリを直接いじってみたり)、右クリックしたらExplorerと同じメニューが出るようにしたいのです。
いろいろなファイラーでもそのようになっているので可能な関数か、構造体などがあると思うのですが。
いちいちレジストリを呼び出しているようにも見えません。
どなたか簡単にその方法を解説していただけませんでしょうか。
参考サイトやソースコードなどもあったらお願いいたします。
0444デフォルトの名無しさん
2006/03/10(金) 21:44:32まだ納得いかないかもしれないので>>442の説明に補足させてもらう
>>439のコードでも、処理系によっては動作1と2が同じ結果になることもある
ようするに、関数呼び出しにおいて引数を評価する順番は処理系定義であるからだ
たとえばわかりやすいコードを示すと
int num(){
static int i = 0;
i += 1;
return i;
}
という関数について
printf("%d, %d", num(), num());
とすると、どちらのnum()が先に呼び出されるか次第で、表示される結果が異なるのがわかるだろうか?
ようするに、>>439の動作1の結果は後ろの引数から順番に評価された結果ですな
どういうことかしらないけど、自分が試したことについて言うと
Visual C++ 2005で、Debug版とRelease版か、というだけでも
引数を評価する順序が異なることがたびたびあった
最適化の違いかな?
ちなみに>>439のコードも2005でReleaseビルドすると同じ結果になった
0445439
2006/03/10(金) 22:57:23>>442
>>444
やっと解りました。
関数の評価の順番は必ずしも毎回同じとは限らないんですね
勉強になりました。ありがとうございました。
0446デフォルトの名無しさん
2006/03/10(金) 23:42:010447デフォルトの名無しさん
2006/03/10(金) 23:57:19IShellなんちゃらっていうCOMインターフェースを使った希ガス
0448デフォルトの名無しさん
2006/03/11(土) 00:07:24ありがとうございます。
早速調べて試してみます。
もしまた解決しないことが出てきたらよろしくお願いします。
0449デフォルトの名無しさん
2006/03/11(土) 00:48:48初めて知った。こりゃ順番通りに書いてったほうがいいや
0450デフォルトの名無しさん
2006/03/11(土) 06:56:07みたいなプログラム書いたときに
「Seed値同じなのに、DebugとReleaseで結果が違うぞ!」
っていうので死ぬほど悩んだな
まさかこの式が原因だとは思いつかなくて問題の絞り込みが全然うまくいかなかった
0451383
2006/03/11(土) 07:27:20ありがとうございました。
大変丁寧に教えていただいて、
今整理しているところですがこれなら理解できそうです。
ひとまず、ありがとうございました。
045230
2006/03/11(土) 08:59:41> それならば、
> const char * s = "foo";
> hogehoge(s);
> とすればいい。
そうしたいの山々なのですが、実は某SDKで提供されてるグローバル関数
int acedGetString( int cronly, const char * prompt, char * result);
で取得した result を
int strcoll( const char *string1, const char *string2 );
に渡して文字列比較したいのですが、互換性がないというエラーがでます。
acedGetString() は使わざるを得ないので頭を痛めてます。
基本的に char* と const char* はキャストできないと考えるべきなのでしょうか?
0453デフォルトの名無しさん
2006/03/11(土) 09:06:44char* → const char* は暗黙の変換が効く。
const char* → char* は明示的なキャストが必要。
で、さっきから例で挙げられているパターンでは
暗黙の変換が効くはずなんだけど、ほんとに書いてあるケースで
エラーが出てるの?なんか勘違いしてるんじゃないの?
エラーメッセージもソースもコピペで貼ってほしいな。
0454デフォルトの名無しさん
2006/03/11(土) 09:13:05プログラムを作成していますがファイルを表示することはできましたがタイムスタンプ
の年だけ表示しようと思っても
AUTOEXEC.BAT 3204
boot.ini 3204
bootfont.bin 3204
CONFIG.SYS 3204
マイ ダウンロード 3204
のようになり、全然年が表示されません(変な値になる)。
どこがいけないのか教えてください。お願いします(以下プログラムの一部)
HANDLE fhandle;
WIN32_FIND_DATA win32finfo;
FILETIME filetime;//ファイルタイム構造体
SYSTEMTIME systemtime;//システムタイム構造体
fhandle = FindFirstFile("C:\\*.*", &win32finfo);
if (fhandle == INVALID_HANDLE_VALUE) exit(0);
do {
printf("%s", win32finfo.cFileName);
GetFileTime(fhandle, &filetime ,NULL ,NULL);
FileTimeToSystemTime(&filetime,&systemtime);
printf(" %d \n",systemtime.wYear);
}
while (FindNextFile(fhandle,&win32finfo) != 0);
}
0455デフォルトの名無しさん
2006/03/11(土) 09:18:17GetFileTime() の引数はファイルハンドル。
fhandle は検索ハンドル。ファイルハンドルじゃない。
0456デフォルトの名無しさん
2006/03/11(土) 09:18:43WORD 16-bit unsigned integer.
0457デフォルトの名無しさん
2006/03/11(土) 09:20:02#何勘違いしたんだろ。
0458デフォルトの名無しさん
2006/03/11(土) 09:20:11失敗する可能性のある API の戻り値をテストしてないのがいけない。
0459デフォルトの名無しさん
2006/03/11(土) 09:38:48有難うございます。でわ恐らく直接
WIN32_FIND_DATA構造体の中のFILETIME ftCreationTimeとFileTimeToSystemTime
を組み合わせて表示するのですね。
皆様有難うございました。
0460デフォルトの名無しさん
2006/03/11(土) 09:41:15一般に「タイムスタンプ」って言ったら ftLastWriteTime のことだと思うよ。
0461デフォルトの名無しさん
2006/03/11(土) 10:00:30「
あかさたな/
はまやらわ/
いきしちに/
ひみゆらわ/…
」
これをfopenで開きfscanfとforで、は「まやらはから」%s/でtempに検索保存したいのですが「はまやらわ」から検索できません
fseekを使わずに正常に検索保存するためにはどうしたらいいでしょうか?
0462デフォルトの名無しさん
2006/03/11(土) 10:06:20使用アプリmi2.0、コンパイラMWP SIOW APP
0463デフォルトの名無しさん
2006/03/11(土) 10:06:32人に通じる文章になっていないからコードを張りなさい。
0464デフォルトの名無しさん
2006/03/11(土) 10:06:54ファイルがテキストな時点で上から下まで読んでくしかないでしょ?
0466デフォルトの名無しさん
2006/03/11(土) 10:33:03vit=%d
dex=%d
men=%d
int=%d
HP=%d
MP=%
----
ファイヤーボール/%d
アイスストーム/%d
サンダーフレア/%d
実際のファイルです
これからfscanfで----\n%s/%dを
forを使って繰り返しさせて見たのですがうまくいきません
0467デフォルトの名無しさん
2006/03/11(土) 10:44:320468デフォルトの名無しさん
2006/03/11(土) 10:45:53それは実際のファイルじゃないっしょ?
実際のファイルってのは
ファイヤーボール/10
アイスストーム/20
サンダーフレア/40
とかなってんじゃないの?
それとも本当に%dとかなってんの?
0469デフォルトの名無しさん
2006/03/11(土) 11:08:12#ifndef AAA
#define AAA 1
#endif
ってありますが、これってtypedefでも通用するのですか?
つまり
#ifndef BBB
typedef short BBB
#endif
みたいな
0470デフォルトの名無しさん
2006/03/11(土) 11:09:350471デフォルトの名無しさん
2006/03/11(土) 12:50:56通用しない
0472デフォルトの名無しさん
2006/03/11(土) 13:06:49C++のコードを読めてなぞれるようになるまでどれくらいの期間が必要なんでしょう
コードの内容は大学の物理化学、計算後に簡単な3Dグラフィックの表示を行うものです
0473デフォルトの名無しさん
2006/03/11(土) 13:14:55その人の能力により数日〜一生
0474デフォルトの名無しさん
2006/03/11(土) 13:56:01普通の分野では人ごとの能力差は数倍からせいぜい10倍程度のものだけど、
プログラミングにおいては数百倍以上の生産性の差がつくこともあると言われてる。
もし、自分に適性がないと思ったら早々にあきらめるのが吉。
0475デフォルトの名無しさん
2006/03/11(土) 14:04:37宿題スレで、人の出したC++の設問に何回か答えてみるといい。
かなりC++を勉強したはずなのに、なかなか答えを書くのに時間が
掛かりすぎるようだと、適性があまりないかもしれんね。
0476デフォルトの名無しさん
2006/03/11(土) 14:22:57人間に適性がなさそうだから。
0477デフォルトの名無しさん
2006/03/11(土) 14:29:34typedef char sint8;
sint8 s[] = "abc";
sint8* a = s;
strstr( a, "abc" );
だと通るのですが、
typedef signed char sint8;
sint8 s[] = "abc";
sint8* a = s;
strstr( a, "abc" );
だと、
error C2664: 'strstr' : 1 番目の引数を 'sint8 *' から 'const char *' に変換できません。
とコンパイルエラーがでるのは何故ですか?
char型がsignedかunsignedかは環境依存だからということですか?
0478デフォルトの名無しさん
2006/03/11(土) 15:14:37cout << (typeid (char) == typeid (signed char)) << endl;
cout << (typeid (char) == typeid (unsigned char)) << endl;
0479デフォルトの名無しさん
2006/03/11(土) 15:15:140480デフォルトの名無しさん
2006/03/11(土) 15:21:27よくわからん。
0482デフォルトの名無しさん
2006/03/11(土) 15:46:270483デフォルトの名無しさん
2006/03/11(土) 15:50:17最近の規格ではどっちかに既定されたんじゃなかったっけ?
0484デフォルトの名無しさん
2006/03/11(土) 16:20:40signed/unsigned char→整数型
0485デフォルトの名無しさん
2006/03/11(土) 16:35:53error LNK2005: "public: virtual void __thiscall 〜はすでに 〜 で定義されています
みたいなエラーがでまくるんですけど、
なぜか分かるエスパーの方はいらっしゃいませんでしょうか?
0486デフォルトの名無しさん
2006/03/11(土) 16:41:29リンクの段階だから、その関数の実体が複数あるんじゃないか?
0487デフォルトの名無しさん
2006/03/11(土) 16:47:20ヘッダにメンバ関数定義を書いてるんじゃないか?
その場合、クラス定義の内部に書かないといけない。
0488デフォルトの名無しさん
2006/03/11(土) 16:47:44申し訳ないですがもうちょっと偏差値低い人用に平易に教えていただけないでしょうか。
例えばどんな状態でしょうか?
あと、ヘッダのなかで
class CHoge{
CAge* age;
}
みたいな定義をするとしたら、普通は
CAgeを定義してるヘッダを#includeしないと駄目ですよね?
今眺めてるサンプルは、そのサンプルのオリジナルなクラス型のメンバがあるにもかかわらず
何も#includeしてなくてもなぜかコンパイルできるんですけど、
理由がさっぱりわからないです。
なもんで試しにCHogeの中に自分で適当に作ったクラス型のメンバを追加してみると、
やっぱりそれに関してはちゃんとそれを定義したヘッダを#includeしないと
そこだけエラーになってかなり謎なんですが、いったいどういうことでしょうか。
0489デフォルトの名無しさん
2006/03/11(土) 16:50:11あ!!それかも知れません。ちょっと直してみます。
0490デフォルトの名無しさん
2006/03/11(土) 16:50:45文字型と整数型の違いは?
0491デフォルトの名無しさん
2006/03/11(土) 17:02:56直りました!!ありがとうございました。
0492デフォルトの名無しさん
2006/03/11(土) 17:10:39どうすればtypedefを
#ifndef AAA
#define AAA 1
#endif
みたいにできますか?
0493デフォルトの名無しさん
2006/03/11(土) 17:12:41inline付けとけばクラス定義の内部に書かなくても大丈夫
0494デフォルトの名無しさん
2006/03/11(土) 17:15:15#ifndef AAA_DEFINED
#define AAA_DEFINED
typedef ほげ AAA;
#endif
0495デフォルトの名無しさん
2006/03/11(土) 17:16:27#ifndef AAA_DEFINED
typedef short AAA
#define AAA_DEFINED
#endif
みたいにすればどうでしょうか?
0496デフォルトの名無しさん
2006/03/11(土) 17:22:55件のサンプルではinlineは特に見当たらないです。。
ごく普通に別ファイルで定義&実装されているクラスを使っているにもかかわらず
ヘッダーをインクルードしないで使えています。
自分で試しに定義したクラスはやはりヘッダをインクルードしなければ使えません。
むしろこれが普通だと思うのですが、他に何か考えられる事ってあるでしょうか。
0497デフォルトの名無しさん
2006/03/11(土) 17:25:540498デフォルトの名無しさん
2006/03/11(土) 17:26:26ありがとうございます。
たしかにこのやり方しかなさそうですね。
なぜこの質問をしたかというと、仕事でOSの入れ替えがあったのですが
エラーでBOOLがおかしいと怒られました。
原因は、ユーザ定義ファイルで
typedef unsigned char BOOL
と設定してあり、昔のOSではそのような定義がされていませんでした。
なので正常でしたが、新しいOSにはあらかじめ
typedef int BOOL
となっており、エラーが出ました。
その回避方法を探していたんです。
(結局今は、ユーザ定義ファイルのBOOLを削除しました)
0499デフォルトの名無しさん
2006/03/11(土) 17:27:38main() {
printf("うるう年を表示します\n"); //←この行を入れるとエラー、消すと正常に作動する
int y;
for (y = 1900; y <= 2000; y++) {
if ((y%4 == 0 && y%100 != 0 )||y%400 == 0) {
printf("%d", y);
printf("年\n");
}
}
printf("Enter押せば終了");
rewind(stdin);
getchar();
return 0;
}
//例のprintf行を入れると、なぜかint行あたりで
//エラーE2140ここでは宣言はできない(関数 main )というエラーが出ます。
//どうしてなのか教えてくらはい。
0500デフォルトの名無しさん
2006/03/11(土) 17:32:38int y
の後ろにprintfをおいてみれば?
0501デフォルトの名無しさん
2006/03/11(土) 17:39:480502499
2006/03/11(土) 17:48:46int y;
の後ろに
printf
入れたら上手くいきました。
どうしてなんですか?教えてください。
0503デフォルトの名無しさん
2006/03/11(土) 17:54:460504デフォルトの名無しさん
2006/03/11(土) 18:03:410505499
2006/03/11(土) 18:04:17分かりました、ありがとうございました。
0506デフォルトの名無しさん
2006/03/11(土) 18:04:48OSの入れ替えでBOOL?よくわからんが・・・
0507デフォルトの名無しさん
2006/03/11(土) 18:09:580508デフォルトの名無しさん
2006/03/11(土) 18:13:53OSを大昔のITRON(HI-SH77の昔のもの)から最新のITRON(NORTi4.0)に変えた仕事です。
オープン系とは違い電源投入直後の処理からOSの設定などしないといけないんですよ。
ようやく一人前になりかけた?段階なので、色々とがんばります。
0509デフォルトの名無しさん
2006/03/11(土) 18:31:45本読んでプログラム書いての繰り返ししかないのかな…周りに知ってる人いないからつらいorz
0510デフォルトの名無しさん
2006/03/11(土) 18:32:13OSにBOOLが宣言されているんだ
0511デフォルトの名無しさん
2006/03/11(土) 18:32:340512デフォルトの名無しさん
2006/03/11(土) 18:34:22おれも周りにプログラミングやる人などいなく、完全に独学だ
たしかに本を読むだけじゃなかなか身に付かないかもしれない
たくさんプログラム書いて、あとは慣れじゃないかな
0513デフォルトの名無しさん
2006/03/11(土) 18:44:35老婆心だが、μITRONはOS仕様のバージョンが異なると、
同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
0514デフォルトの名無しさん
2006/03/11(土) 19:07:54たしかに、今色々調べていたら違いがありました
なにしろ旧OSのヘッダが92だの95だの数字がありました。(つまり1995年もの)
コンパイラもSHC4.1Aというかなり古いものでしたし(今最新は9.0)
ただ、気になったのは私も仕事をするようになり色々とCを勉強するようになりました。
独学はモチベーションが上がりづらいですが、がんばってください。
0515デフォルトの名無しさん
2006/03/11(土) 19:14:47>同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
これってAPI設計者が絶対に避けるべき事なんじゃねーの?
まぁその所為で、Win32APIみたいに名前と型・用途が一致してないのが出てくるわけだが
0516デフォルトの名無しさん
2006/03/11(土) 19:15:460517デフォルトの名無しさん
2006/03/11(土) 19:51:12ありがとうございます。
適性があるかどうかも分からん状態なので、しばらく勉強してみようと思います。感謝です。
0518デフォルトの名無しさん
2006/03/11(土) 20:05:58やりたいことをやって生きていけることこそが幸せ
0519デフォルトの名無しさん
2006/03/11(土) 20:53:14仕様書に書かれてあることを実装していれば問題ないことになっている。
もっとも、APIの細かい動きが異なると当然再利用がしにくい。
それを解消しようとして、T-Engineが生まれたわけで。
0520デフォルトの名無しさん
2006/03/11(土) 22:21:16強い標準化にしようとT-Engineを生んだんだけど実際どうなんだろう・・・
0521デフォルトの名無しさん
2006/03/12(日) 05:03:48FLASH(開発環境の方)は手元にないのですが、
ActiveXコントロールのShockwave Flash Objectを使ってswfファイルを読み込み、
ダイアログ上のFlash Playerコントロールで再生させることはカンタンに出来るのですね。
ところでFlash Player内のオブジェクトがクリックされるなどイベントが起きたとき、
外部に何かメッセージは出しているのでしょうか?またFLASH開発時の設定次第で出すことは可能なのでしょうか?
それをFlashPlayerコントロール利用側のwindowsアプリで受け取ることが出来るのかなとふと思ったもので。
また逆に、windowsアプリ側からFlashPlayerコントロールに向けてメッセージを送ることは出来るのでしょうか?
0522デフォルトの名無しさん
2006/03/12(日) 10:06:47wchar_t foo[16];
memset(foo, 0, 16*sizeof(wchar_t));
_i64tow_s (hoge,foo,16,16);
String ^tmp = gcnew String(foo);
UInt64 hogeを入力したら、16進数変換して、文字変数tmpを返す処理を
関数化したいのですが、書き方を教えてもらえませんか
UInt64 hex_convert(UInt64 hoge)
{
wchar_t foo[16];
memset(foo, 0, 16*sizeof(wchar_t));
_i64tow_s (hoge,foo,16,16);
String ^tmp = gcnew String(foo);
return foo;
}
: error C2440: 'return' : 'wchar_t [16]' から 'System::Type' に変換できません。
となってしまいます。
0523522
2006/03/12(日) 10:12:20環境はVisual Studio 2005 VC8で
CLRオブジェクトを作成しています。
0524デフォルトの名無しさん
2006/03/12(日) 11:24:34CLRはスレ違いという気もしなくもないが、hex_convert()は文字列を返すべきなんじゃないの?
String hex_convert(...) {...; return tmp;}とか。
0525デフォルトの名無しさん
2006/03/12(日) 11:35:20CLRはスレは初心者の質問は今後スルーするそうなので、行き場が無くて
ここで質問させて頂きました
呼び出す形がString型なので
↓の様に書き直したら、: error C2065: 'tmp' : 定義されていない識別子です。
となりました、関数内で
String^tmp=gcnew String(foo);
と定義してるのですが、駄目だと思ったのですが本体側で
String^ tmp;
と定義してもエラーは出ませんが、変数tmpの中身が空になってしまいます。
String^ hex_convert(UInt64 hoge)
{
wchar_t foo[16];
memset(foo,0,16*sizeof(wchar_t));
_i64tow_s(hoge,foo,16,16);
String^tmp=gcnew String(foo);
return tmp;
}
本体側のソース
{
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
//String^ tmp;
hex_convert(hoge);
textBox2->Text = tmp;
}
0526デフォルトの名無しさん
2006/03/12(日) 11:50:17return String::Format("{0:X}",n);
}
0527526
2006/03/12(日) 11:51:13× hoge
○ n
0528デフォルトの名無しさん
2006/03/12(日) 12:54:35String^hex_convert(UInt64 hoge)
{
wchar_t foo[16];
memset(foo,0,16*sizeof(wchar_t));
_i64tow_s(hoge,foo,16,16);
String^tmp=gcnew String(foo);
return String::Format("{0:X}",hoge);
}
hoge
: error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)' : 1 番目の引数を 'unsigned __int64' から 'System::String ^' に変換できません。(新しい機能 ; ヘルプを参照)
n
: error C2065: 'n' : 定義されていない識別子です。
となってしまいます。
orz
0529デフォルトの名無しさん
2006/03/12(日) 13:27:340530デフォルトの名無しさん
2006/03/12(日) 14:02:06だから何で初心者がC++/CLIなんてゲテモノに手を出す?
初心者だと自負するなら、やめろ。
0531デフォルトの名無しさん
2006/03/12(日) 16:23:04C++/CLIスレにいたときから全く進歩していないな。
そんなんだから追い出されるんだよ。
inline System::String^ hex_convert(System::UInt64 n)
{
return n.ToString("X");
}
0532デフォルトの名無しさん
2006/03/12(日) 17:24:39void newtest(int** test)
{
*test = new int[5]; //配列確保
printf("%d",sizeof(*test)); //配列のサイズを表示
for(int i=0;i<5;i++) //配列にデータ詰め込み
*test[i] = i;
}
int main()
{
int* test;
newtest(&test);//配列確保
return 0;
}
int型ポインタを専用の関数にポインタへのポインタの形で渡して配列確保をしたいんだけど、
どうしても1個分しか確保されてないっぽい
以前作ったCのプログラムではこの形でできてたような気がするんだけど・・
0533デフォルトの名無しさん
2006/03/12(日) 17:30:01もしかして、sizeof(*test)の値みてそう思っている?
newしたサイズではなく、testのサイズが帰っているんじゃないかな。
実際に入れた値を確認してみたらいいよ
0534デフォルトの名無しさん
2006/03/12(日) 17:30:33× *test[i] = i
○ (*test)[i] = i
0535デフォルトの名無しさん
2006/03/12(日) 17:30:43sizeof(*test) = sizeof(int *)
であって、要素数とは無関係。
0536デフォルトの名無しさん
2006/03/12(日) 17:39:580537デフォルトの名無しさん
2006/03/12(日) 17:45:00sizeofはコンパイル時に静的に求められる。
0538532
2006/03/12(日) 17:49:04sizeofの値見た後、ループが動かなかったので
sizeofの値は関係ないですか・・
>>534
どうも、できました
0539デフォルトの名無しさん
2006/03/12(日) 18:32:41#pragma asmと__asmはどちらもCの中にアセンブリを埋め込むものだと思うのですが
違いがわかりません。違いを教えてください。
質問2
#define AAA int
と
typedef int AAA
はどちらも同じ気がしますが、型名を変更する際は基本的にtypedefを使う理由は何ですか?
とりあえず#defineはプリプロセッサでtypedefはコンパイラで解釈するということはわかったのですが
それ以上のメリットデメリットなどがわかりません。
教えてください。
0540デフォルトの名無しさん
2006/03/12(日) 18:41:331について
#pragmaも__asmも環境依存だから一概には応えようがない。だから、違いは
あなたの環境に添付されている説明に従う。ヘルプを見ればあるかも。
2について
#defineは、通常置換後の名前でしか表示されないからコンパイラが吐いた
エラーが読みにくくなるしデバッグもしにくい。だから、できる限りインクルード
ガードくらいでしか使わないようにしてる。
C++においては#defineは名前空間をまたいでしまうので、A::AAAとB::AAAが
区別できなくなるために嫌われることが多い。ただ、あえて名前空間を跨ぎたい
時には#defineの方が便利。例えばboost見たいな(いい意味で)変態的ライブラリは
ないと困る部分があるのかもしれない。
0541デフォルトの名無しさん
2006/03/12(日) 18:46:17#define AAA int*
typedef int* AAA;
この2つだと const AAA の型が違う結果になる。
0542デフォルトの名無しさん
2006/03/12(日) 18:46:52質問2:
前者はshort AAA foo;ができて後者はできない。
0543デフォルトの名無しさん
2006/03/12(日) 20:42:55CHogeのコンストラクタのなかで
m_wtext.empty();
m_wtext = L"あああ";
MessageBox(NULL,narrow(m_wtext).c_str(),"",NULL);
のようなことをしてみると、なぜか文字列がヘヘヘヘへ・・・・ンンンンのように既に壊れて表示されます。
narrowはCHogeの基底クラスで定義されている、wstringをstringに変換する関数です。
string CBase::narrow(const wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX + 1);
string result = buffer;
delete[] buffer;
return result;
}
別のもっと単純なアプリの中で同じ事を試しても問題はでないのですが、
なぜか今回ちょっと大きめなプロジェクトに組み込んでみたところおかしくなりました。
アプリごとの何かしらの動作順序の違いかなにかでこういうことは起こり得ることでしょうか?
でもコンストラクタのなかで関数を一個挟んだだけなのにアプリによって違いがでるというのは
理由がさっぱりわかりません。何かここが怪しげってところがあったら教えてください。
環境はW2k VC6.0++です。よろしくお願いします。
0544デフォルトの名無しさん
2006/03/12(日) 20:47:230545デフォルトの名無しさん
2006/03/12(日) 20:53:41それだ!!
もう試す前から間違いないです。絶対それです。
すっかり忘れてました。
あなたは神ですか?
0546デフォルトの名無しさん
2006/03/12(日) 21:18:22ちなみにその例なら、MessageBoxW(NULL, m_wtext.c_str(), L"", MB_OK);でいける。
MessageBoxWはWin 9xでも使えるから使っていいと思う。
0547デフォルトの名無しさん
2006/03/12(日) 21:26:45「3人分の番号、指名、給与、評価(a、b、c)を構造体型配列に格納して、
表示する」という問題に対してわけわかめながら以下のプログラムを
作ってみたのですが期待したとおりに動きません。
どこを直せばいいんでしょ、もしくは根本的に間違ってます?
#include<stdio.h>
struct person{ /* 構造体の宣言 */
int no;
char name[20];
int salary;
int point;
};
int main(void) {
int i;
struct person menber[30]; /* 構造体変数と構造体配列の宣言 */
for(i = 0; i<3; i++) {
scanf("%d", &menber[i].no);
scanf("%s", menber[i].name);
scanf("%d", &menber[i].salary);
scanf("%c", &menber[i].point);
}
for(i = 0; i<3; i++) {
printf("no:%d name:%s salary:%d point:%c\n",
menber[i].no, menber[i].name, menber[i].salary, menber[i].point);
}
return 0;
}
0548デフォルトの名無しさん
2006/03/12(日) 21:31:11期待した内容を書かずに分かるわけねぇだろ
もうこなくていいよ。
ついでに氏ねば?
0549デフォルトの名無しさん
2006/03/12(日) 21:32:160550デフォルトの名無しさん
2006/03/12(日) 21:33:150551デフォルトの名無しさん
2006/03/12(日) 21:34:51それでこのスレで手直ししてもらおうって考えてんじゃねーの。
0552デフォルトの名無しさん
2006/03/12(日) 21:39:40ほんとに馬鹿で、情けないです。
もう消えますから、気にせず元の流れに戻ってください。
0553デフォルトの名無しさん
2006/03/12(日) 21:53:530554デフォルトの名無しさん
2006/03/12(日) 22:03:15基地外に教えてやる必要はない
どうせこんな感じだろ
プログラムが思い通りに動かない → 何で俺の思い通りに動かねえんだよ
回答者がやりたいことを察してくれない → 何で俺の考えてることが伝わらねえんだよ
0555デフォルトの名無しさん
2006/03/12(日) 22:04:250556デフォルトの名無しさん
2006/03/12(日) 22:49:010557539
2006/03/12(日) 23:01:11ありがとうございました。
ところで、Cにアセンブリを埋め込む際に、環境依存ではありますが
__asmや#pragma inline_asm
などありますが、それらを切り替える際に
#if defined(AAA)
#pragma inlene_asm
何かしらのしょり
#else
__asm{
何かしらの処理
}
#endif
みたいにするとできると思うのですが、このAAAに何を入れれば
よいのでしょうか?たぶんコンパイラごとに分ける必要があると思うので
コンパイラごとで定義されているもの(例:_SHなど)を使用すればいいと思うのですが・・・
0558デフォルトの名無しさん
2006/03/12(日) 23:09:54>コンパイラごとで定義されているものを使用すればいいと思うのですが・・・
答え出てるじゃん。
0559デフォルトの名無しさん
2006/03/13(月) 00:23:10>質問2
・define:コンパイラに渡す前処理で、文字列の単純な置換を行う。
・typedef:ある型に対する別名を定義する。
根本が違う。
0560デフォルトの名無しさん
2006/03/13(月) 00:52:01個別のコンパイラごとに調べていくしかない
0561デフォルトの名無しさん
2006/03/13(月) 03:54:38ふつーにいる。
VCのコンパイルオプションみただけでぜってー動くはずねーのに終わったつもりでいやがるから、
「コンパイルして自分の環境で動くことは確認しましたか?」
って何回も聞いたのに
「同じこと何度も言わせないでください!確認しましたよ!」
とかブチキレるから「あー、直したのかなー」とか思ってたら、
ただ動かしてないだけでその場で何時間も他の人間の作業止めて悩む馬鹿。マジでいる。
ここまでアフォだと付き合ってられない級の奴はどこにでもいるっぽい。
0562デフォルトの名無しさん
2006/03/13(月) 08:35:24ttp://www.ksky.ne.jp/~seahorse/cpp/swtcomp.html
0563デフォルトの名無しさん
2006/03/14(火) 12:01:51例えば以下のようなファイルがあります
国語/70点
数学/82点
英語/68点
次の目標「平均80点をとる」
点数と目標の中の変数は任意に変化して
この試行を5回繰り返します
for if fopen fscanfで
何とかなりませんか?
fscanf(fp,゙%s/%d%s/%d%s/%d゙,k1,s1,k2,s2,k3,s3);の先のやりかたが思い付きません
0564デフォルトの名無しさん
2006/03/14(火) 12:10:29で科目を表す「n」は家庭科だったり水泳だったり英語だったりなんでも対応できるようにするってこと?
0565デフォルトの名無しさん
2006/03/14(火) 12:20:15DWORD型に変換したいのですが、どうしたらよいですか?
0566デフォルトの名無しさん
2006/03/14(火) 12:24:24DWORDってunsigned longだけど大丈夫だろうか
0567デフォルトの名無しさん
2006/03/14(火) 12:25:150568デフォルトの名無しさん
2006/03/14(火) 12:27:40いけたようです。ありがとうございました。
0569デフォルトの名無しさん
2006/03/14(火) 12:33:090570デフォルトの名無しさん
2006/03/14(火) 12:41:35sscanf(str,"%lu",&dwVal) ;
または
dwVal = (DWORD)atol(str);
MFC::CString使いなら
str.Format("%lu",&dwVal);
STL::string使いなら
sscanf(str.c_str(),"%lu",&dwVal);
#汚いコードじゃ…orz
多分boost使いならformatを使ってもっとエレガントにやる。
0571デフォルトの名無しさん
2006/03/14(火) 12:42:48や、ごめ。嘘書いた。
MFC::CStringのFormatは出力にしか使えない。
0572デフォルトの名無しさん
2006/03/14(火) 12:50:42boost使いならlexical_castじゃないの?
0573デフォルトの名無しさん
2006/03/14(火) 12:53:11>>572
その通り。
恥の上塗りだ…鬱出汁脳orz
回線切ってry
0574デフォルトの名無しさん
2006/03/14(火) 13:15:04STL::stringならstringstreamじゃないの?
0575デフォルトの名無しさん
2006/03/14(火) 18:56:17途中までを記載しています。
kaze_tateの部分で計算がむちゃくちゃになるんですが、めちゃくちゃな答えに。
よくわからなくてごめんなさい。
ご教示お願いいたします。
#include <stdio.h>
#include <stdio.h>
int main(void){
double kaze,kaze_tate,kakudo,kakudo01;
printf("風の強さ:"); scanf("%f",&kaze);
printf("風の角度:"); scanf("%f",&kakudo);
printf("\n");
if(kakudo == 1){
kakudo01 = 0.018;
}else if(kakudo == 2){
kakudo01 = 0.035;
}else if(kakudo == 3){
kakudo01 = 0.052;
}else if(kakudo == 4){
kakudo01 = 0.070;
}else{
kakudo01 = 0.087;
}
kaze_tate = kakudo01 * kaze;
printf("%d",kaze_tate);
return(0);
}
kakudo01が1でkazeが5だった場合、kaze_tateは0.09になるはず。
そして結果が表示されるまでに落ちちゃいます…orz
0576575
2006/03/14(火) 18:56:570577デフォルトの名無しさん
2006/03/14(火) 19:00:10コンソールから起動してる?
0578デフォルトの名無しさん
2006/03/14(火) 19:00:43scanfでdoubleを読むときは%lf
0579デフォルトの名無しさん
2006/03/14(火) 19:01:580580575
2006/03/14(火) 19:03:48ごめんなさい。
"C言語を始めよう"というエディタ?とBCC5を使っています。
実行するとコマンドプロンプトが開きます。
0583デフォルトの名無しさん
2006/03/15(水) 11:34:08//...
template<typename T> class Queue{
//...
template<typename U> friend ostream& operator<< (ostream&, const Queue<U>); //...α
};
//実装
int main(){
Queue<class1> hoge;
//...
cout<<hoge;
}
コンパイルしようとするとリンカーが「undefined reference to 'std::basic_ostream...... &operator<< <class1>...」
と文句を言ってくるので α の部分を
template<typename U> friend ostream& operator<< <>(ostream&, const Queue<U>);
と変えてみたら今度は
template-id 'operator<< <>' in declaration of primary template
というコンパイラエラーが出てくるのですが、どのように対処したらよいのか教えていただけませんか?
0584デフォルトの名無しさん
2006/03/15(水) 11:37:570585デフォルトの名無しさん
2006/03/17(金) 01:31:21これってどういう時に使うものなんですか?
一応ネタ元。
ttp://www.asahi-net.or.jp/~wv7y-kmr/memo/old/cpp_bas.html
0586デフォルトの名無しさん
2006/03/17(金) 02:08:28そんな予約語C++にはない。
0587デフォルトの名無しさん
2006/03/17(金) 07:10:39http://www.asahi-net.or.jp/~wv7y-kmr/memo.html
「古くてあまり役に立ちそうにないもの」
0588デフォルトの名無しさん
2006/03/17(金) 11:24:31finallyはないが、環境によっては__finallyとして定義されてる。
tryブロック内で例外が発生したりして処理が中断されても__finallyブロック内は無条件で処理が行われる。
主にtryブロック内の後始末に使われることが多い。
0589デフォルトの名無しさん
2006/03/17(金) 11:30:21finallyは必要ない
それにしてもひどいサイトだな>585
0590デフォルトの名無しさん
2006/03/17(金) 11:35:330591デフォルトの名無しさん
2006/03/17(金) 11:42:40ホームページなんか作らずに黙って勉強に励んでればいいのに
0592デフォルトの名無しさん
2006/03/17(金) 13:01:120593デフォルトの名無しさん
2006/03/17(金) 13:40:40各要素をvectorで持っておこうと思いました。
そのvectorの中から、条件に一致するものだけ表示ということがしたいのですが、
どういう風にやるのがいいんでしょうか。
class Elem ; //リストビューに表示する要素のクラス
std::vector<Elem> v1 ; //要素のvector
std::vector< std::vector<Elem>::iterator > v2 ;//v1の型のイテレータのvector
表示する要素へのイテレータのvectorを作って、
v1にはすべての要素を入れておき、
v2には、実際に表示する要素へのイテレータをいれ、
要素の参照はv2から行うということを考えたのですが、
これは方法としてどうなのでしょうか?
もっといい方法はありませんか?
0594デフォルトの名無しさん
2006/03/17(金) 23:31:360595デフォルトの名無しさん
2006/03/17(金) 23:46:02それではstd::vector<Elem>::iteratorがElem*になっただけで本質的な違いは無いと思う。
0597デフォルトの名無しさん
2006/03/18(土) 12:43:25iteratorは生存期間が問題になるから、Elemがよっぽど大きくなければ普通に
std::vector<Elem> v2にcopy_if()かなにかでコピーすればいい希ガス。
0598デフォルトの名無しさん
2006/03/18(土) 19:40:21error C2731: 'WinMain' : 関数はオーバーロードできません。
だと言ってくるんだけど、どうしたらええの?
因みにソースは猫のところのこんな奴どえす
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance ,
HANDLE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
MessageBox(NULL,
(LPCSTR)"メッセージ・ボックスのテストです。",
(LPCSTR)"猫でもわかるプログラミング",
MB_OK);
return 0;
}
0599デフォルトの名無しさん
2006/03/18(土) 19:55:42×int WINAPI WinMain( HINSTANCE hInstance ,
○int WINAPI WinMain( HANDLE hInstance ,
だった、結果はどっちも失敗だけど
0600デフォルトの名無しさん
2006/03/18(土) 20:02:30それ、エラーの出たコード(自分の書いたコード)コピペしてる?
よくあるのが LPSTR と LPTSTR の違いなんだけど。
>>599
HINSTANCE で正解だろ。
0601デフォルトの名無しさん
2006/03/18(土) 20:03:16もしかしてExpressか?
0602デフォルトの名無しさん
2006/03/18(土) 20:05:380603デフォルトの名無しさん
2006/03/18(土) 20:29:06文字セットはマルチバイトで
共通言語ランタイムサポートは/clr:pure
です
これでもムリッポした
#include "stdafx.h"
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance ,
HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
MessageBox(NULL,
(LPCSTR)"メッセージ・ボックスのテストです。",
(LPCSTR)"猫でもわかるプログラミング",
MB_OK);
return 0;
}
0604http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 20:32:11もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0605デフォルトの名無しさん
2006/03/18(土) 20:35:320606デフォルトの名無しさん
2006/03/18(土) 20:39:310607デフォルトの名無しさん
2006/03/18(土) 20:41:11普通にできたよ。hoge.cに
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
MessageBox(NULL,
(LPCSTR)"メッセージ・ボックスのテストです。",
(LPCSTR)"猫でもわかるプログラミング",
MB_OK);
return 0;
}
ってやって、コマンドラインから
cl hoge.c /link user32.lib
ってコンパイルしてみそ。
0608デフォルトの名無しさん
2006/03/18(土) 20:42:14もしかして拡張子cppにしてるとか?
わしWinAPIようわからんが
0609デフォルトの名無しさん
2006/03/18(土) 20:43:05http://www.kumei.ne.jp/c_lang/intro/no_57.htm
HANDLEになってるぞ(゚д゚;)
0610デフォルトの名無しさん
2006/03/18(土) 20:50:250612デフォルトの名無しさん
2006/03/18(土) 20:59:49extern "C"しても一緒デツ
>>611
( ´゚д゚`)エー
まじっすか??
0613デフォルトの名無しさん
2006/03/18(土) 21:01:13まぁ、いいじゃねぇの?
HINSTANCEの定義: DECLARE_HANDLE(HINSTANCE)
DECLARE_HANDLEの定義: #define DECLARE_HANDLE(name) typedef HANDLE name
だしな
0614デフォルトの名無しさん
2006/03/18(土) 21:09:11C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winbase.h(1875) : 'WinMain' の宣言を確認してください。
ビルドログは "file://d:\Visual Studio 2005\Projects\foooo\foo\Debug\BuildLog.htm" に保存されました。
foo - エラー 1、警告 0
winbase.h(1875)みたら
WinMain (
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in_opt LPSTR lpCmdLine,
__in int nShowCmd
);
後にも先にもWinMain定義してるのここだけだったし
0615デフォルトの名無しさん
2006/03/18(土) 21:10:550616デフォルトの名無しさん
2006/03/18(土) 21:11:57クラス確保していらなくなったら破棄するとかあるの?
放置プレイ?
0617デフォルトの名無しさん
2006/03/18(土) 21:14:11delete 使えばいいのか!
0618デフォルトの名無しさん
2006/03/18(土) 21:16:23#include <windows.h>
を消して
#include "stdafx.h"
だけにしてみ
0619デフォルトの名無しさん
2006/03/18(土) 21:23:370620デフォルトの名無しさん
2006/03/18(土) 21:32:26int a[5] = {0,1,2};
と初期化した場合って、a[3]とa[4]て必ず0に初期化されますか?
(C言語とC++の両方の規格上)
0621デフォルトの名無しさん
2006/03/18(土) 21:33:04されるよ。規格で決まってる。
0622デフォルトの名無しさん
2006/03/18(土) 21:33:060623デフォルトの名無しさん
2006/03/18(土) 21:35:44コマンドラインから
cl hoge.c /link user32.lib
ってコンパイルしてみそ。
Microsoft .NET Framework SDK v2.0のSDK コマンド プロンプトだよね
>>618
error C2146: 構文エラー : ';' が、識別子 'WinMain' の前に必要です。
error C2065: 'HINSTANCE' : 定義されていない識別子です。
error C2146: 構文エラー : ')' が、識別子 'hInstance' の前に必要です。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
error C2059: 構文エラー : ')'
.\foooo.cpp(5) : error C2143: 構文エラー : ';' が '{' の前にありません。
.\foooo.cpp(5) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
になります
0624デフォルトの名無しさん
2006/03/18(土) 21:37:55C は 6.5.8 の 21
http://www.vmunix.com/~gabor/c/draft.html
C++ は 8.5.1 の 7
http://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init.aggr
>>622 プギャー
0625620
2006/03/18(土) 21:39:57これで安心して眠れます。
0626デフォルトの名無しさん
2006/03/18(土) 21:41:14悩むくらいならちゃんと{0,1,2,0,0}って書けばいいじゃない(´・ω・`)
0627デフォルトの名無しさん
2006/03/18(土) 21:42:08コンパイラによるけど、ANSI準拠なら、array[2][5] = { 0}で全部0に初期化されるはず
コンパイラ次第によると思う。
0628デフォルトの名無しさん
2006/03/18(土) 21:44:24ええ〜違うってばよ〜なんで?
2005proなら、Microsoft Visual Studio 8\VCの下にvcvarsall.batってファイルが
あるでな、cmd.exeからそれを起動すんだ。
0629デフォルトの名無しさん
2006/03/18(土) 22:07:28出来たけど、C++で出来ないのが残念だす
猫のHPも一応古くてもC++で解説してあるのに
orz
0630デフォルトの名無しさん
2006/03/18(土) 22:21:38hoge.cをhoge.cppにしても問題ないがな。C++でできないって、
どういうことだがや?
0631デフォルトの名無しさん
2006/03/18(土) 22:32:08ヮ(゚д゚)ォ!
できたお
ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
処でvcvarsall.batでコンパイルできるソースって、同じ場所じゃないと駄目なんだね
今までコンパイルできなかった、ソースもできるかも
((o(´∀`)o))ワクワク
しかし何でVC8のファイルダイアログからはコンパイルできへんのや
0632デフォルトの名無しさん
2006/03/18(土) 22:44:44いや、ソースどこに置いてもいいがな。vcvarsall.bat実行したら、cdコマンドで
行きたいところ行きや。IDE使うと余計なオプションとか仰山つけおるから、
IDE使うときはよく確認し〜や。
0633デフォルトの名無しさん
2006/03/18(土) 22:55:47cl hoge.c /link user32.lib >> hoge.txt
こうしたら、コンパイルの吐き出す情報も良く分かるしNE^^
コマンドラインコンパイル(・∀・)イイ!!
昔に戻ったみたいだおwww
0634デフォルトの名無しさん
2006/03/18(土) 23:21:50今はHINSTANCEだが、昔はHANDLEだった。
>>610
extern "C"を不要にするためにWindows.hの中の中ではextern "C"でWinMainの宣言がなされている。
>>613
それはSTRICTでないときの場合。今はデフォルトでSTRICTになっている。
0635デフォルトの名無しさん
2006/03/19(日) 10:04:47obj.TimeChk(2←OK!
0636デフォルトの名無しさん
2006/03/19(日) 10:30:31関数の名前は
MovePos
Move_Pos
movepos
Movepos
変数は
map_x
Map_X
mapx
MAPX
MAPx
どれがいい?
0637デフォルトの名無しさん
2006/03/19(日) 10:38:09M_a_P_x
0638デフォルトの名無しさん
2006/03/19(日) 10:41:54がんばってみるわ!
でも逆見にくいような・・・?
0639デフォルトの名無しさん
2006/03/19(日) 10:56:370640デフォルトの名無しさん
2006/03/19(日) 11:55:330641デフォルトの名無しさん
2006/03/19(日) 12:18:34typedef HRESULT (WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD);
こういう書き方がしてあったのですが、
(WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD)の関数を
呼び出してHRESULTにエラーコードを返すのだけの処理なのでしょうか?
typedefに続く構文で括弧が二つ続くものをあまり見たことが無いので戸惑っています。
0642デフォルトの名無しさん
2006/03/19(日) 13:14:26「
・IPStore **とDWORDとDWORDとDWORDを取って、
・HRESULTを返す、
・WINAPIな呼び出し規約の
関数」
へのポインタを、PStoreCreateInstancePtrと呼ぶ、という宣言。
0643デフォルトの名無しさん
2006/03/19(日) 13:31:39もう一点だけ質問させてください
IPStore **というのはIPStoreの指すポインターのポインターだと
思うのですが、
IPStore *でポインター(メモリー上でIPStore関数を示すアドレス)で
IPStore **となるとどういう解釈になるのでしょうか?
0644デフォルトの名無しさん
2006/03/19(日) 13:36:23IPStore *型の値はポインタで、変数に格納できる。
これがIPStore *型の変数。
IPStore *型の変数へのポインタがIPStore **型の値。
0645デフォルトの名無しさん
2006/03/19(日) 13:41:37って関数みるんだけど::って何よ!
0646デフォルトの名無しさん
2006/03/19(日) 13:42:000647デフォルトの名無しさん
2006/03/19(日) 13:43:46「の」
0648デフォルトの名無しさん
2006/03/19(日) 13:45:550649デフォルトの名無しさん
2006/03/19(日) 13:49:01クラスだと思っていたけど
namespace
だった!!!!
うほぉぉぉ!!!!
0650デフォルトの名無しさん
2006/03/19(日) 14:14:34AAクラスのBBメソッド
0651デフォルトの名無しさん
2006/03/19(日) 14:16:03俺間違ってる?(´・ω・)
0652デフォルトの名無しさん
2006/03/19(日) 14:17:480653デフォルトの名無しさん
2006/03/19(日) 15:23:02#include<stdio.h>
#include <windows.h>
#defineCTIME_MAX5
//time
struct st_time {
int no;
long now;
long max;
};
namespace GTime {
struct st_time time[CTIME_MAX];
void Init() { ZeroMemory(&time,sizeof(st_time)*CTIME_MAX);};
void Set(int nm,int nm2) {
time[nm].max=nm2;
return;
};
}
int main() {
GTime::Init();
for(int i=0;i<10;i++)
GTime::Set(i,5);
return 0;
}
エラーでる
0654デフォルトの名無しさん
2006/03/19(日) 15:27:45#includeとか#defineでスペースはいってないとかそういうんじゃなくて?
0655デフォルトの名無しさん
2006/03/19(日) 15:28:540656デフォルトの名無しさん
2006/03/19(日) 15:30:210657デフォルトの名無しさん
2006/03/19(日) 15:31:560658デフォルトの名無しさん
2006/03/19(日) 15:34:320659デフォルトの名無しさん
2006/03/19(日) 15:41:55消すとエラー消える
0660デフォルトの名無しさん
2006/03/19(日) 15:56:15グローバルネームスペースに同名の関数がある。
0661デフォルトの名無しさん
2006/03/19(日) 15:57:300662デフォルトの名無しさん
2006/03/19(日) 16:02:20こんな感じかなポインターのポインターって
#include <stdio.h>
main()
{
int var;
int *p;
int **pp;
int ***ppp;
var = 19;
p=&var;
pp=&p;
ppp=&pp;
printf("varの値は? ⇒ %d\n",var);
printf("varのアドレスpは? ⇒ %d\n",&p);
printf("pのアドレスppは? ⇒ %d\n",&pp);
printf("ppのアドレスpppは? ⇒ %d\n",&ppp);
}
0663デフォルトの名無しさん
2006/03/19(日) 16:04:17名前変えて、も無理
0664デフォルトの名無しさん
2006/03/19(日) 16:26:16ちょっと違う。それからポインタを表示するときは%p。
printf("varのアドレスpは? ⇒ %p\n",p);
printf("pのアドレスppは? ⇒ %p\n",pp);
printf("ppのアドレスpppは? ⇒ %p\n",ppp);
0665デフォルトの名無しさん
2006/03/19(日) 16:29:190666デフォルトの名無しさん
2006/03/19(日) 16:32:40GTime::Set(i,5);
5は配列ではなく代入する値です。
3やに2変えても変わりません。
iが配列の番号
0667デフォルトの名無しさん
2006/03/19(日) 16:33:50struct st_time time[CTIME_MAX];
自分ではここが怪しいと思うんだが。。。
0668デフォルトの名無しさん
2006/03/19(日) 16:36:370669デフォルトの名無しさん
2006/03/19(日) 16:41:35【初心者歓迎】C/C++室 Ver.25【環境依存OK】ですが、なにか?
0670デフォルトの名無しさん
2006/03/19(日) 16:42:50あり〜
0671デフォルトの名無しさん
2006/03/19(日) 17:35:30void Set(int 9,int nm2) {
time[9].max=nm2;
return;
};
0672デフォルトの名無しさん
2006/03/19(日) 18:15:30forよく見たらi<10になってる
i<CTIME_MAX(最大値)になってると思ったorz
0673デフォルトの名無しさん
2006/03/19(日) 18:15:59すごい時間を無駄にしたorz
0674デフォルトの名無しさん
2006/03/19(日) 21:06:29Winsock+VBのサイトはチラホラ見かけるんですが、
Winsockの解説自体は大体何処のサイトも
C/C++なんですがSMTPの解説少ないんですよね
宜しくオナガイシマス
0675デフォルトの名無しさん
2006/03/19(日) 21:27:07SMTPだけなら殆どWinsockを意識する必要もないだろ。
Winsock自体を使えるようになっていれば、SMTP喋らせるにはUnix系のソースで充分。
#確か、smtpsendなんてものがソースつきでどっかに転がってた希ガス。
0676デフォルトの名無しさん
2006/03/19(日) 22:40:06レスサンクス、書いた後にこの板でネットワークプログラミングのスレがあったので
ちょっとスレ違いだったような気がしたが、答えてもらったのでよかった^^
SMTPでメールを送信するソースは沢山見かけたのですが
漏れのプロバではPOP before SMTPで認証してPOP3サーバーにアクセスするので、
どれも使えなくて自分で実装しようと思い調べていたら、
Berkeleyソケット(Winsock)+SMTPという
組み合わせじゃないと、Outlookや鶴亀メールのようなソフトは作れないの
じゃないかと思い尋ねました、漏れの考え方が外れていたら指摘してください
0677デフォルトの名無しさん
2006/03/19(日) 22:50:34○Berkeley API
0678デフォルトの名無しさん
2006/03/19(日) 23:16:50POP3認証をしてからSMTPするだけ。
0679デフォルトの名無しさん
2006/03/20(月) 00:59:03クラスと構造体はほぼ同じものです。
クラスのアクセス制限を全てpublicにすれば、それはとりもなおさず構造体の事です。
0680デフォルトの名無しさん
2006/03/20(月) 01:43:31その説明だと、構造体はメンバをprivateにできないと言っているようだ。
0681デフォルトの名無しさん
2006/03/20(月) 01:47:16環境: VC.NET, WinXP SP2
以下のようなメイン関数を持つアプリケーションを作りたいとする。
-- Winmain.cpp -----------------
Winmain(){
Cscene scene;
while(true){
scene.loop();
}
return 0;
}
------------------------------------
Csceneの宣言 Cscene.h には、メンバ関数 loop(void) 以外のものがどんどん追加されることがわかっている。
Winmainから呼び出すCsceneの関数は、loop(void) だけであり、Winmainの記述はこれで決定である。
Csceneが更新される度に Winmain をビルドしなおすということはしたくないので、Winmain.cpp では Cscene.h を読み込みたくない。
更新作業を楽にするために、Csceneの実装は、実行ファイルの外部で行いたい。
何かいい方法はありますか?
ttp://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/05.html
Cdrivenを外部DLLで実装すればよいのではないかと考えてこのページで勉強してみたけど、
このページの方法だと Cscene.h を Winmain.cpp で読み込まないといけないから、適用できなかった。
0682デフォルトの名無しさん
2006/03/20(月) 02:01:23動的 dll でググれ
0683デフォルトの名無しさん
2006/03/20(月) 02:11:32おかげでなんとかなりそうです。感謝。
0684デフォルトの名無しさん
2006/03/20(月) 02:13:27構造体、と言ったときは、Cの構造体(C++でいうPOD)のことをさしていると思うのだけれど。
C++のstructはクラスだろ?
0685デフォルトの名無しさん
2006/03/20(月) 02:16:24それ以外のstructとclassはクラスと呼んでる
0686デフォルトの名無しさん
2006/03/20(月) 03:34:33俺もそれでいいと思うが
679の説明は、おかしいもしくは足りない。
0687679
2006/03/20(月) 09:26:320688デフォルトの名無しさん
2006/03/20(月) 17:02:47やはりヌルだったらどうなりますか?
0689デフォルトの名無しさん
2006/03/20(月) 17:30:37ポインタの参照渡すのにヌルかどうかは関係ないだろ。
渡した先でポインタの中身をどう使うかだ。
0690デフォルトの名無しさん
2006/03/20(月) 19:31:57class CTime {
public:
struct st_time time[STIME_MAX];
CTime();
void CTime::TimeGo();
};
CTime::CTime() {
ZeroMemory(&time,sizeof(st_time)*STIME_MAX);//メモリ初期化
return;
}
void CTime::TimeGo() {
for(int i=0;i<STIME_MAX;i++)
time[i].now+=1;
return;
}
namespace STime {
class CTime obj;
void Go() { obj.TimeGo();};
}
どこでも呼び出せるようにしたんだけど
どうみても効率が悪そう。
素直にグローバル変数にしたほうがいいでしょうか?
0691デフォルトの名無しさん
2006/03/20(月) 19:35:13STime::TimeGo();
return;
}
int main() {
STime::TimeGo();
AA();
return 0;
}
↑こんな風にどこでも使える。
int mainで変数初期化すると関数にいちいちポインタ渡すのが面倒なので。
・・・・意味プーかも。
0692デフォルトの名無しさん
2006/03/20(月) 19:35:26単純に置き換えればいいってもんじゃなくて、
C++にはC++の「設計」ってもんがあるんだ。
0693デフォルトの名無しさん
2006/03/20(月) 19:41:22・グローバル変数でどこからでもアクセス!
・ポインタを渡して渡して渡してがんばるぞ!
・>>690のやつでめちゃくちゃにまとめて使うぞ!
0694デフォルトの名無しさん
2006/03/20(月) 19:43:470695デフォルトの名無しさん
2006/03/20(月) 19:46:54エ〜〜〜><
じゃ、グローバルにしようかな一番簡単だし・・・><
0696デフォルトの名無しさん
2006/03/20(月) 19:48:260697デフォルトの名無しさん
2006/03/20(月) 19:48:48俺の場合>>693に加えて、クラスの関数をどれもこれもstaticにしてしまうこともある
もちろん必要なメンバ変数もstatic
デザインパターンとか学ぶと参考になったりするものあるのかな
0698デフォルトの名無しさん
2006/03/20(月) 20:00:43・どこからからでも参照できるので発見しにくいバグの原因になりやすい。
・マルチスレッド対応を難しくする
といった点である。特に後者の弊害が顕著な糞実装の例としてRubyを挙げておこう。
0699デフォルトの名無しさん
2006/03/20(月) 20:05:04グローバル変数扱うときにも注意が必要だな
0700デフォルトの名無しさん
2006/03/20(月) 20:12:31OKですか^^
>>697
お互いがんばりましょう><
>>698
やっぱり危ないんですね。
>>690でのやりかたでがんばってみます><
>699
マルチスレットつかってないので平気です^^
コールバック?
分かりません><
0701デフォルトの名無しさん
2006/03/20(月) 20:22:16正常に動くのですが、関数をまた関数でまとめてるし う〜〜ん^^;
適当に作ったので、ちゃんとした書き方なのか、わかりません><
0702デフォルトの名無しさん
2006/03/20(月) 21:17:400703デフォルトの名無しさん
2006/03/20(月) 21:19:40突っ込むところ、そこですか><
0704デフォルトの名無しさん
2006/03/20(月) 21:32:50なんとなくワカル。
>>より>>の方が無駄がない、という感覚的な話だと思っているが。
0705デフォルトの名無しさん
2006/03/20(月) 21:37:48いちいち変えるのが面倒なのです。
見た目は良くないですが><
0706デフォルトの名無しさん
2006/03/20(月) 22:00:09>見た目は良くなくてもOK
なるほど
0707デフォルトの名無しさん
2006/03/20(月) 23:04:45あり^^
0708デフォルトの名無しさん
2006/03/20(月) 23:07:00せめてSingletonパターンにしようよ。
0709デフォルトの名無しさん
2006/03/21(火) 00:02:33普通に必要なときにインスタンス作って使えば?
0710デフォルトの名無しさん
2006/03/21(火) 05:14:30「・・・例外が投げられると、制御はcatchに写り、tryブロックは終了します。
このときcatchは呼び出されるのではなく、プログラムの制御がcatchに移動します。
このためスタックは自動的に再設定されます・・・」
と説明されていましたが、「スタックが自動的に再設定」とは何がどうなることでしょうか?
(stackというとLIFOしか出てこない
誰か説明おねがいします
0711デフォルトの名無しさん
2006/03/21(火) 05:15:480712デフォルトの名無しさん
2006/03/21(火) 06:16:24ところでboostに似たようなのあったっけ?
0713デフォルトの名無しさん
2006/03/21(火) 06:22:07制御が移動するってことだけで十分www
0714デフォルトの名無しさん
2006/03/21(火) 06:39:48んなこといきなり言われてもな。
混乱するつーの
0715710
2006/03/21(火) 06:45:09という認識で宜しいでしょうか
//独習Cはまあそれなりに読みやすかったので、著者ではなく訳&監修がイマイチなのではないかと
0716710
2006/03/21(火) 07:17:01tryブロックでデフォルト(auto)で宣言された変数などは、スコープからはずれて・・・という解釈でもイイですか?
0717デフォルトの名無しさん
2006/03/21(火) 08:05:31あー、たぶんそうだよ。
0719デフォルトの名無しさん
2006/03/21(火) 12:57:47本に書いてあるとおりやってきましたが、実際なぜにNULLで
なくて0なのでしょうか。
0720デフォルトの名無しさん
2006/03/21(火) 13:02:160721デフォルトの名無しさん
2006/03/21(火) 13:02:340722デフォルトの名無しさん
2006/03/21(火) 13:28:13CでもC++でもヌルポインタは(ポインタ型の)0と決まっている。
しばしばCでは#define NULL (void *)0という定義がなされるが、
C++ではvoid*型から他のポインタ型への変換はできないので、
大抵#define NULL 0という定義になる。
だったら初めから0を使えばいいだろということ。
0723デフォルトの名無しさん
2006/03/21(火) 13:41:39正直、ヌルポインタとして 0 を直接書くのは
マジックナンバーだと思う。
0724デフォルトの名無しさん
2006/03/21(火) 13:51:33数値「0」として一言でまとめたほうが楽だろうしな。
クラスメンバの初期値しかり。
0725デフォルトの名無しさん
2006/03/21(火) 14:00:380726719
2006/03/21(火) 14:00:43例えば関数の仮引数がint*型だったとして、
そこに実引数NULLをわたすとコンパイルでエラーになるかも
しれないけど、0なら大丈夫ってこと?
0727デフォルトの名無しさん
2006/03/21(火) 14:06:11エラーになることはない。どちらを使っても同じ意味。
ただし NULL を使うためにはヘッダのインクルードが必要。
0728719
2006/03/21(火) 14:15:06とされているC++コンパイラはないってこと?
0729デフォルトの名無しさん
2006/03/21(火) 14:19:50その通り。
0730デフォルトの名無しさん
2006/03/21(火) 14:23:19「無効ポインタが0」というのは、「ポインタ変数の値が0だとコンパイルエラーになる」というわけではないぞ。
ポインタ変数が0だった場合に無効だと判断してエラールーチンを書くのがプログラマの仕事だ。
そして、0ポインタに対するエラー処理を書か書かなければ、それは実行時のエラーとして発現することになる。
0731730
2006/03/21(火) 14:25:030732デフォルトの名無しさん
2006/03/21(火) 15:43:590 になる整数定数値がヌルポインタとして判断されるんだよね。
static const int a = 0;
static const int b = 1;
int* p = a;
int* q = b - 1;
こういうのも通る。
こんな仕様でええんかいとは思うが。
0733デフォルトの名無しさん
2006/03/21(火) 15:59:25#define CAT_P(x, y) x##y
#define CAT(x, y) CAT_P(x, y)
#define STATIC_ASSERT(exp) enum{CAT(STATIC_ASSERTION_FAILURE, __LINE__)=sizeof(static_cast<char *>(!(exp)))}
0734デフォルトの名無しさん
2006/03/21(火) 16:04:34つBOOST_STATIC_ASSERT
0735デフォルトの名無しさん
2006/03/21(火) 20:19:48aのデフォルトコンストラクタを定義しておいても
bを宣言しただけではメンバのaオブジェクトは初期化されないのですか?
bのコンストラクタで初期化しないと駄目ですか?
0736デフォルトの名無しさん
2006/03/21(火) 20:24:45必要ない。
0737デフォルトの名無しさん
2006/03/21(火) 20:27:21D&Eでもそれには呆れるルールだと書いてある。
0738デフォルトの名無しさん
2006/03/21(火) 20:30:52あり^^
0739デフォルトの名無しさん
2006/03/21(火) 20:48:580740デフォルトの名無しさん
2006/03/21(火) 21:23:54デフォルトコンストラクタはつくらなくともデフォルトコンストラクタの要請に耐えられますか?
0741デフォルトの名無しさん
2006/03/21(火) 21:40:35//例えば
class foo {
type member1;
type member2;
foo(type arg1 = 0, type arg2 = 0) : member1(arg1), member2(arg2) {}
};
//こういうクラスで
foo bar;
//こうできるかってこと?
0742デフォルトの名無しさん
2006/03/21(火) 21:49:470743デフォルトの名無しさん
2006/03/21(火) 21:58:49少し勘違いしているようだが、「引数なしで呼び出すことができるコンストラクタ」を
「デフォルトコンストラクタ」と呼ぶことになっているので、すべての引数に
デフォルト値があればそれがデフォルトコンストラクタになる。
0745デフォルトの名無しさん
2006/03/21(火) 22:58:360746デフォルトの名無しさん
2006/03/21(火) 23:02:360747デフォルトの名無しさん
2006/03/21(火) 23:06:37returnはC/C++の予約語で、exitは標準関数。
C++ではexitは使わない方がいい。オブジェクトのデストラクタが走らない。
0748デフォルトの名無しさん
2006/03/22(水) 04:36:100749デフォルトの名無しさん
2006/03/22(水) 05:07:17例えば、設定が保存されないとか。
まあ、どういう実装にしてるかによるけど。
C++ なら、exit じゃなく素直に例外機構を使うべし。
>>745 は main での話っぽいので、その場合は常に return を使うべし。
つーか、C でもそうしろ。
0750デフォルトの名無しさん
2006/03/22(水) 12:39:23return … 呼び元に値を返す
exit() … プロセスを終了する
但し、main()でのreturnは、exit()と等価の動作を行う。
0751デフォルトの名無しさん
2006/03/22(水) 15:14:36mainでexitしてもグローバルオブジェクトのデストラクタは走らないんじゃね?
0752デフォルトの名無しさん
2006/03/22(水) 15:31:40どこでexitしようがグローバルオブジェクトのデストラクタは走る。
0753デフォルトの名無しさん
2006/03/22(水) 15:52:100754デフォルトの名無しさん
2006/03/22(水) 15:54:370755デフォルトの名無しさん
2006/03/22(水) 15:58:110756デフォルトの名無しさん
2006/03/22(水) 15:59:250757デフォルトの名無しさん
2006/03/22(水) 16:03:240758デフォルトの名無しさん
2006/03/22(水) 18:53:52class exstring : public std::string {
};
てなのを取り合えず書いてexstringのオブジェクトを
生成したんですが、stringのメンバが使えません。
どこが悪いのでしょうか?
0759デフォルトの名無しさん
2006/03/22(水) 18:57:36Cで使うときのためにあるんでないの?
0760デフォルトの名無しさん
2006/03/22(水) 19:39:13それだけじゃ何も悪いと思えませんが、なぜ使えないんですか?
0761デフォルトの名無しさん
2006/03/22(水) 19:51:420762デフォルトの名無しさん
2006/03/22(水) 19:54:43よくわからんけどこうしてみたら?
class exstring : public std::string{
public:
exstring() : std::string(){}
exstring(const char *str) : std::string(str) {}
};
0763758
2006/03/22(水) 20:11:54すみません、そうでした。
メンバ関数や変数は使えたんですが、演算子が使えません。
>>762
それで大体上手くいきましたが、
exstring es;
es = es + "aaa";
てなコードが通りません。
exstring型を扱える演算子を宣言しなおさないとダメだんでしょうか?
0764デフォルトの名無しさん
2006/03/22(水) 20:15:430765デフォルトの名無しさん
2006/03/22(水) 20:19:400766デフォルトの名無しさん
2006/03/22(水) 20:31:31・・・・・・いまいち使いどころが分からんが。
0767758
2006/03/22(水) 20:42:37継承するのあきらめました。
0768デフォルトの名無しさん
2006/03/22(水) 20:43:350770デフォルトの名無しさん
2006/03/22(水) 20:54:36return 0;派?
return(0);派?
0771デフォルトの名無しさん
2006/03/22(水) 21:01:36> return(0);
おれ、こんなの見たことあったかなぁ・・・・
0772デフォルトの名無しさん
2006/03/22(水) 21:09:500773デフォルトの名無しさん
2006/03/22(水) 21:11:16が通らないし打つのめんどいし絶対括弧つかわね
0774デフォルトの名無しさん
2006/03/22(水) 21:15:58std::stringは仮想デストラクタじゃないし継承しちゃダメ。
0775デフォルトの名無しさん
2006/03/22(水) 21:29:130776デフォルトの名無しさん
2006/03/22(水) 22:26:32× 継承しちゃダメ
○ 公開継承しちゃダメ
0777デフォルトの名無しさん
2006/03/22(水) 23:10:15Cソース内のある関数内の変数の値の変化を全て txt に書き出したいのですが
どうすればいいですか fprint などを試したのですがいい方法が浮かびません
0778デフォルトの名無しさん
2006/03/23(木) 00:00:04fprintfでいいと思うが。
0779デフォルトの名無しさん
2006/03/23(木) 00:25:35言葉が足りなかった。ありがとう。
0780デフォルトの名無しさん
2006/03/23(木) 00:40:220781デフォルトの名無しさん
2006/03/23(木) 00:42:10とかって言いたいんじゃね?
0782デフォルトの名無しさん
2006/03/23(木) 00:54:01> fprint などを試したのですがいい方法が浮かびません
とは何を意味するのか(ただの脱字だよね)?
1.fprintfを試したが上手くいかなかった。
2.fprintfを試し上手くいったが、もっといい方法はないのか。
どちらかな。
0783デフォルトの名無しさん
2006/03/23(木) 02:56:03そこでAspect指向
0784誤字脱字あったらすいません
2006/03/23(木) 05:36:52template <class X>
class stack {
X stck[SIZE][2];
int tos;
public:
void push(X ob1, X ob2)
{ ...
stck[tos][0] = ob1;
stck[tos][1] = ob2;
}
X pop(X &ob2);
{ ...
tos--;
ob2 = stck[tos][1];
return stck[tos][0];
}
};
......
これでは「同じ型のオブジェクトを2つ格納できる汎用stack」では無いかと思うのですが、
実際に型の異なるオブジェクトを同時に扱うstackなどは作れるのでしょうか?
0785デフォルトの名無しさん
2006/03/23(木) 05:42:44作れる。
学習中っぽいので実際にどう作るかを教えるつもりは無いが、
とりあえずその問題と解答出したやつは殺していい。
0786デフォルトの名無しさん
2006/03/23(木) 05:50:42とりあえず
template <class X, class Y>
class stack {
X stck[SIZE];
Y stck[SIZE];
...
};
ってな感じになるんだろうが、激しく使いづらいなw
0787デフォルトの名無しさん
2006/03/23(木) 06:04:31自作ヘッダファイルを機能させるには、どうしたらいいですか
0788デフォルトの名無しさん
2006/03/23(木) 06:06:480789787
2006/03/23(木) 06:09:590790784
2006/03/23(木) 06:11:34template <class X, class Y>
class list {
public:
list *head;
list *tail;
list *next;
X data;
list() {head=tail=next=NULL;}
virtual void store(X d);
virtual void store(Y d);
virtual X retrieve();
virtual Y retrieve();
};
template <class X, class Y>
class stack : public list<X,Y> {
void store(X d);
void store(Y d);
X retrieve();
Y retrieve();
};
最初は別の例題を参考に、↑のようなのを作っていて時間がなくて諦めたのですが、これは非現実的でしょうか?
もしくは、単純に汎用クラスstackを2種類(別の型で)生成するのが良いのでしょうか?
0791デフォルトの名無しさん
2006/03/23(木) 06:12:50それはスタックなのか?
あえて書くと、こんなものだと思うのだが。
template <typename T1, typename T2>
class Stack
{
size_t pos_ ;
std::vector< boost::any > stack_ ;
public :
void push(T1 t) ;
void push(T2 t) ;
//あるいはこうか?
//void push_first(T1 t) ;
//void push_second(T2 t) ;
T1 const & pop_first() ;
T2 const & pop_second() ;
} ;
何にせよ、こんなもの使いたくないな。
0792787
2006/03/23(木) 06:29:420793デフォルトの名無しさん
2006/03/23(木) 09:02:03class stack2 : public stack<std::pair<T1, T2> >
{
...
};
0794デフォルトの名無しさん
2006/03/23(木) 09:30:24自分のなら#include "〜"でいいだろ。
0795デフォルトの名無しさん
2006/03/23(木) 10:30:28#include <XXXX.h> //環境変数 INCLUDE から探してインクルード
#include "XXXX.h" //include元のファイルと同じディレクトリから探して、
//無かったら環境変数 INCLUDE から探してインクルード
0796デフォルトの名無しさん
2006/03/23(木) 10:42:36環境変数とは限らんがな。
0797デフォルトの名無しさん
2006/03/23(木) 10:52:560798デフォルトの名無しさん
2006/03/23(木) 11:28:400799デフォルトの名無しさん
2006/03/24(金) 06:57:52関数の引数で自分の置いた場所をx,yに入れています。
上下左右8方向に走査を繰り返します。
int i = board[x][y];//プレイヤーを判断
int cnt,sx,sy,e;
if(i == 1)e=2;//敵を判断
else e=1;
for (cnt = 0,sx = x+1,sy = y;board[sx][sy] == e ;sx++)cnt++; //→方向(x+1)を走査し、敵の数をカウント
if(board[sx][sy] == i)for(sx--;cnt != 0;cnt--,sx--)board[sx][sy] = i;//ひっくり返す
0800デフォルトの名無しさん
2006/03/24(金) 09:16:58動くかどうかよく分かってないものを「作ってみた」と言えるかどうかはさておき、
まずは適切に改行をすることから始めてみようか。
あとiやeに代入してるのが1とか言われても意味が良くわからんからenumやらなんやらでわかりやすい名前の定数にするべし。
enum{BLACK, WHITE}とか。
ざっと見た感じ。
・↓のような並びだと配列外にアクセスしてセグフォる。盤の端っこに来た時の条件も入れれ。
これを打つ
↓
○●●●●|
↑
盤の端っこ
・おそらく2人対戦オセロだろうからiやeのとりうる値は2種類だと推測するが、
1個目のforのboard[sx][sy] == eを抜けている時点でboard[sx][sy]==iは確定なのでif(board[sx][sy] == i)が無駄。
あと上下左右は8方向じゃないので斜めもちゃんとやれな。
0801デフォルトの名無しさん
2006/03/24(金) 13:34:15>if(i == 1)e=2;//敵を判断
好みもあるけど、こういうのはコメントを入れるよりは
名前のついた関数(あるいはマクロ)を使った方が良いと思う。例えば、
e = opponent_of(i);
>for(...
これも好みだが、for文の第一式、第三式ではループに関係ない変数をいじらない方が良いと思う。
最初のforではcntはループに無関係だし、
二番目ではsxが無関係。
>>800
>・おそらく2人対戦オセロだろうからiやeのとりうる値は2種類だと推測するが、
iやeはそうだが、boardの各要素は俺なら「先手、後手、未着手」の三種類だと推測する。
このコードのままでも外周に「未着手」状態の番兵があれば範囲外アクセスは起こらないな。
0802デフォルトの名無しさん
2006/03/24(金) 13:58:58count を cnt と書くといいことがあるのだろうか・・
ってすれ違いだな
0803デフォルトの名無しさん
2006/03/24(金) 14:02:51指がかってに n を追加してしまうのだ。
0804デフォルトの名無しさん
2006/03/24(金) 14:06:42cout を「コォゥト」と読んでいた。
あるとき、「シーアウト」であることに気づいた。
同時に、cin の読みも「シン」から「シーイン」にかわった。
0805デフォルトの名無しさん
2006/03/24(金) 14:14:03/二二ヽ
||・ω・|| <いやどっちでもいいし
. ノ/ / > <いやどっちでもいいし
ノ ̄ゝ
0806デフォルトの名無しさん
2006/03/24(金) 14:19:300807デフォルトの名無しさん
2006/03/24(金) 14:22:09あ、当然 puts() は「プッツ」な。
0808デフォルトの名無しさん
2006/03/24(金) 14:31:260809デフォルトの名無しさん
2006/03/24(金) 14:43:50804じゃないがセラーと呼んでいた。
今でも脳内では呼ぶが他人と話すときにはシーエラー。
>808
gets()を使っちゃいけませんと茶々を入れてみる。
0810デフォルトの名無しさん
2006/03/24(金) 14:45:20stdinをストゥドゥインとか。これは誰でもそうか。
>>808
あー懐かしいですね。
0811デフォルトの名無しさん
2006/03/24(金) 14:48:340812デフォルトの名無しさん
2006/03/24(金) 15:11:25ソース音読したらどうみてもオレ語です。
0813デフォルトの名無しさん
2006/03/24(金) 15:26:08なったが、それ以前は6文字だったから、やたらと略語が多い。
FORTRANと同じだなそこら辺の事情は。
0814デフォルトの名無しさん
2006/03/24(金) 15:28:530815デフォルトの名無しさん
2006/03/24(金) 15:32:30そこはKen Thompsonに言え。
むかーーーしの話だし、メモリ節約したかったとか?
0816デフォルトの名無しさん
2006/03/24(金) 15:35:19ある音に、どういうアルファベットの羅列を当てるかというのは、かなり曖昧。
言後ごとに、音の崩れや、無音になることもあるし。
日本語だと、そういうことは気にならないけどね。
0817デフォルトの名無しさん
2006/03/24(金) 15:38:04え?
0818デフォルトの名無しさん
2006/03/24(金) 15:46:09そういった場合はどのように指定すればいいのでしょうか?
myclass data[10][10](1234);
と言うようにしたらエラーになってしまいコンパイルすることができませんでした。
0819デフォルトの名無しさん
2006/03/24(金) 15:46:48おまえ高卒?
0820デフォルトの名無しさん
2006/03/24(金) 15:53:08for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
data[i][j] = new myclass(1234);
0821デフォルトの名無しさん
2006/03/24(金) 15:58:35一つ一つやっていくしかないんですね。
ありがとうございます。
0822デフォルトの名無しさん
2006/03/24(金) 16:35:32C++でそりゃないだろ。
0823デフォルトの名無しさん
2006/03/24(金) 16:51:10考え方
0824デフォルトの名無しさん
2006/03/24(金) 16:54:280825デフォルトの名無しさん
2006/03/24(金) 17:03:59初心者はシコシコ入門書でも読んでろよw
0826デフォルトの名無しさん
2006/03/24(金) 17:37:420827デフォルトの名無しさん
2006/03/24(金) 17:56:33こうだよな?
0828デフォルトの名無しさん
2006/03/24(金) 18:06:01こうだよ。
0829デフォルトの名無しさん
2006/03/24(金) 18:24:260830デフォルトの名無しさん
2006/03/24(金) 18:28:440831デフォルトの名無しさん
2006/03/24(金) 18:39:25間をとって。
0832デフォルトの名無しさん
2006/03/24(金) 18:44:130833デフォルトの名無しさん
2006/03/24(金) 18:51:18*myclass data[10][10];
0834デフォルトの名無しさん
2006/03/24(金) 20:05:47pmyclass data[10][10];
でいいよ
0835デフォルトの名無しさん
2006/03/24(金) 20:18:530836デフォルトの名無しさん
2006/03/24(金) 21:32:30myclass data[10][10];
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
data[i][j] = myclass(1234);
0837デフォルトの名無しさん
2006/03/25(土) 03:09:31std::auto_ptr data[10][10] にして data[i][j].reset(new myclass(1234)) にしないと漏れる。
0838デフォルトの名無しさん
2006/03/25(土) 03:10:25デフォルトコンストラクタも必要になってる。
0839デフォルトの名無しさん
2006/03/25(土) 03:21:080840デフォルトの名無しさん
2006/03/25(土) 03:58:30コールバック関数を設定する必要のある部分があるんですけど、
それの実装がどういう風になっているのか気になっています。
g_pHoge->Initialize(NULL, MessageHandler, 0 );
第一引数は、コールバックがグローバルならNULLでよくて、
コールバックがクラスのメンバで、そのクラスの中で初期化するときなどは(PVOID*)thisを渡したります。
第二引数は、指定の型を満たした、ユーザーがコールバックとして使いたい関数へのポインタです。
第三引数は特にここでは関係ないです。
一応、こんな感じの構文です。
HRESULT Initialize(
PVOID const pvUserContext,
const PFNDPNMESSAGEHANDLER pfn,
const DWORD dwFlags
);
このようにクラスの型(グローバルならNULL)と関数へのポインタを渡したとして、
ライブラリ内部ではどんな感じで呼んでいるのでしょうか?
こんな感じで書かれてるんじゃないか?というのがありましたら、
可能でしたら具体的に例示して教えてください。お願いします。
0841デフォルトの名無しさん
2006/03/25(土) 04:20:07(pvUserContext->*pfn)(〜);
else
(*pfn)(〜);
こんな感じだっけ。
0842840
2006/03/25(土) 04:37:54なるほどこういう書き方ができるんですね。
以前コールバックの実装について伺ったときに、boostを使った
実装法などを教えていただいて結構勉強になったのですが、
呼ぶときに分岐するのさえ我慢すれば
グローバルかメンバかを問わないコールバックは
簡単につくれるんですね。ありがとうございました。
0843デフォルトの名無しさん
2006/03/25(土) 04:43:210844デフォルトの名無しさん
2006/03/25(土) 04:49:350845デフォルトの名無しさん
2006/03/25(土) 04:55:360846デフォルトの名無しさん
2006/03/25(土) 05:04:59リストビューのあの上っちょにあるボタンを押したときの動作をソートっていってんだろ?
あんなもんメッセージ拾って自前で格納しなおせばできるんだよ。>>>844
コールバックなんて強制されるのはウィンドウプロシージャとかDirectXのデバイスの列挙ぐらいなもんだろ。
0847デフォルトの名無しさん
2006/03/25(土) 05:42:28なに言ってんの?
その pfn には非 static メンバ関数は渡せないだろ。
PFNDPNMESSAGEHANDLER の第1引数を
pvUserContext で設定できるだけ。
0848840
2006/03/25(土) 06:19:16ああ、ほんとですね、staticでした。
コールバック関数としたいのがメンバの場合はstaticにしないといけないけど、
実際それが呼ばれるときには、設定時にあらかじめ一緒に渡しておいたthisを貰うことで、
同クラスの非staticなメンバ変数とかにアクセスできるようにしてるって感じでしょうか。
0849デフォルトの名無しさん
2006/03/25(土) 06:20:58どうせ聞くなら問題そのものをズバっと聞きたまえ。
「どんな感じで呼んでるのでしょうか?」それが予想できたところで
アホなんだからどうすればいいか?までどうせわからないんでしょw
どうせ聞くなら全部聞いてけやw
0850840
2006/03/25(土) 06:26:570851デフォルトの名無しさん
2006/03/25(土) 06:33:38それはお前のほうでしょ?
さっきから、何が問題なのかいいもしないで「どんななってますか?」みたいな
あいまいな質問して時間の無駄まるだしなことしてんだから。
いきてる時間が無駄だと思わないの?w
0852840
2006/03/25(土) 06:39:15話の通じる人に答えてもらって解決してるんで。
酔っ払いは新でください。
0853840
2006/03/25(土) 06:40:330854デフォルトの名無しさん
2006/03/25(土) 06:40:530856840
2006/03/25(土) 06:45:430857840 ◆bknIp0a9D.
2006/03/25(土) 06:47:28誰だお前?
0858デフォルトの名無しさん
2006/03/25(土) 06:48:210859デフォルトの名無しさん
2006/03/25(土) 06:48:46いや、俺はちゃんと「何が問題」で「どうしてそれを知る必要があるのか?」ってのをちゃんと書けといっただけなんだけど?
なんでいきなり「嫌がらせ」なのかわけわからんね。
だいたい知りたいのはAPIの使い方なんだろ?
そしたら、「どうなってます?」ってより、「こうしたいです。」の方が得られるリターンが多いとは思わん?
レスから君にも考えがあることはわかるけど、ライブラリの内部の処理とかわからんこと聞くより、
APIをどう使っているか?の詳細を聞いたほうがよっぽどいいんじゃないの?
ってことだけど。
いきなり怒り出すし、沸点無駄に低いと損するよw
0860デフォルトの名無しさん
2006/03/25(土) 06:52:35たしかにそれらはかなり美しいのだが
operator,()には負けると思う
0861デフォルトの名無しさん
2006/03/25(土) 06:54:260862デフォルトの名無しさん
2006/03/25(土) 08:28:55boost::spiritの演算子の変態的使いっぷりには負けるな
0863デフォルトの名無しさん
2006/03/25(土) 10:59:29ID表示の変更は一切受け付けないのが2chの方針。
0864デフォルトの名無しさん
2006/03/25(土) 11:03:41宜しくオナガイシマス
comboBox1のプロパティItemsに
hoge1
hoge2
hoge3
を追加して
comboBox1から選択してbutton1をクリックしたら、変数fooに代入したいのですが
どう書いたらいいですか?
0865デフォルトの名無しさん
2006/03/25(土) 11:07:33それっていつの話? 明文化されてる?
途中からID表示制になった例を2件ほど知ってるけど。
0866864
2006/03/25(土) 11:15:11this->comboBox1->Items->AddRange( objectArray );
String^ foo;
comboBox1->Items->Add( foo );
MessageBox::Show( foo );
こう書いたんですが
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
中略
値をNullにすることはできません。
パラメーター名:item
となってしまいます。
0867デフォルトの名無しさん
2006/03/25(土) 11:24:02とかじゃね?C++/CLIはようわからん。
0868デフォルトの名無しさん
2006/03/25(土) 11:29:08どうもありがとうございました
例外エラーも発生せずに、プログラムが動きました
Addじゃあなく、SelectedItemメソッドだったのか
MSDNで使い方よく調べます。
0869デフォルトの名無しさん
2006/03/25(土) 11:55:30どの板、それ?
http://qb5.2ch.net/test/read.cgi/operate/1139854336/
0870デフォルトの名無しさん
2006/03/25(土) 12:13:03なるほど、「設定変更依頼に答えるという形では」一切ダメなわけね。
ちなみに、ライトノベル板とアーケード板。
0871初心者
2006/03/25(土) 12:17:54コマンドラインから
int main(int argc , char * argv[]){---------------------------}
みたいな
ポインタポインタが引き数であるmain関数に
ポインタポインタを引数を指定するにはどうしたら良いのですか?
また、
int main(int argc , char * argv){---------------------------}
みたいな時は、どう指定したら良いの?
0872デフォルトの名無しさん
2006/03/25(土) 12:24:47その際の引数は、プログラム実行時の文字列となります
また、int main(int argc, char * argv)のような引数は
コンパイルは通りますが正しくないと考えてください
int main(int argc, char *argv[]){ ...
int main(void){ ... }
0873デフォルトの名無しさん
2006/03/25(土) 12:36:51中身
int main(int argc , char * argv[]){---------------------------}
にコマンドラインから数値と文字列(例:abc)を与えると
argvと*argvと**argvは何になりますか?
(その与え方もわからないですすいません)
ファイル名+スペース区切りですか?
例の場合の与え方を教えてください
0874デフォルトの名無しさん
2006/03/25(土) 12:40:470875デフォルトの名無しさん
2006/03/25(土) 12:47:260876デフォルトの名無しさん
2006/03/25(土) 12:48:36#include<stdio.h>
main(int argc, char *argv[])
{
int i;
printf("引数の数:%d\n", argc);
for(i = 0; i < argc; i++)
printf("%dつ目の引数:%s\n", i, argv[i]);
}
実行例
C:\...\sample>sample.exe test "test"
引数の数:3
0つ目の引数:sample.exe
1つ目の引数:test
2つ目の引数:test
0877デフォルトの名無しさん
2006/03/25(土) 13:36:25argv:OSから与えられるポインターポインターで
(sample.exe test test )の3つの要素の配列の1つめを指して全体を指す
そしてアスタリスクをつけて
*argv=argv[0]="test"
って事でOK?
0878デフォルトの名無しさん
2006/03/25(土) 13:43:52*argv=argv[0]=sampleを指すポインター
ですね
printf("%dつ目の引数:%s\n", i, argv[i]);
ってつまり、ポインターから文字列を表示してくれるのかな?
0879デフォルトの名無しさん
2006/03/25(土) 13:55:510880デフォルトの名無しさん
2006/03/25(土) 14:32:550881デフォルトの名無しさん
2006/03/25(土) 14:36:520882デフォルトの名無しさん
2006/03/25(土) 14:54:540883デフォルトの名無しさん
2006/03/25(土) 14:56:54オマイの事か?
0884デフォルトの名無しさん
2006/03/25(土) 15:05:08犬も
太も
大も
木も
ホモ
0885デフォルトの名無しさん
2006/03/25(土) 15:12:15どうせ馬鹿が俺にもレス付けるんだろうけど
0886デフォルトの名無しさん
2006/03/25(土) 17:06:210887デフォルトの名無しさん
2006/03/25(土) 20:02:00保証されているようですが、C言語で同様のポインタにfreeすると
何か危険はありますか?
0888デフォルトの名無しさん
2006/03/25(土) 20:12:24{
if (pBlock == NULL)
return;
0889デフォルトの名無しさん
2006/03/25(土) 20:19:14これってANSI C標準の実装ですか?
0890デフォルトの名無しさん
2006/03/25(土) 20:32:49違うはず
0891デフォルトの名無しさん
2006/03/25(土) 20:38:01まずいかもという感じですか
0892デフォルトの名無しさん
2006/03/25(土) 20:52:39何も行われない事が保証されている。
0893デフォルトの名無しさん
2006/03/25(土) 20:53:31規格上はfreeにNULLを渡すと無視することになってたはずだが。
0894デフォルトの名無しさん
2006/03/25(土) 20:54:160895デフォルトの名無しさん
2006/03/25(土) 20:55:47ANSI だよ
0896デフォルトの名無しさん
2006/03/25(土) 20:59:110897デフォルトの名無しさん
2006/03/25(土) 21:04:290898デフォルトの名無しさん
2006/03/25(土) 21:15:540899デフォルトの名無しさん
2006/03/25(土) 21:21:420900デフォルトの名無しさん
2006/03/25(土) 21:21:55free(p);
pがNULLのときは何も起きないと。
0901初心者
2006/03/25(土) 21:30:130902デフォルトの名無しさん
2006/03/25(土) 21:33:18∧_∧
( ´∀`) <NullPointerException
0903デフォルトの名無しさん
2006/03/25(土) 21:47:01\ / / _ , .. - .....
┼┐\ \ | / _________----- ̄ ̄ /、):.:.:.:.:.:.:.:.:.:.:ヽ
││ ツ イ 。 ‐‐‐‐‐‐‐───‐ /.:.::/::.:.:.:.:.:.:.:.:.:.:.:.:.:..i
/ | \  ̄ ̄──___ /.:.:.::ト;::::::::.:.::.:.:.:.;':.:.:.:.:}>
/ / | \ l:;:i:.:.l、ノ;;:::.::::::.::::::::.::.:./::.:ヽ
/ / │ \ 川:.::|ゝ-'';;::;''"';:;::_:ノ ´!::.:.:l
/ / | __ .. - ─ ナ!:lヽ  ̄ `ヽ l::.:.:!
/ / │ __ --‐‐ ´ _リ ノ,,.:' } !::.:!
/ ./ / _ -'ー-'/:: '、 l:i.:l
/ ノ._ノ´ヽ _ -‐ ´ / .. : : : : . ヽ 〃ノ
_ -"´ }. / / _..=_.ニ,~_ヽ、 ヽ
__ -‐ ´ / / ///::.::.::.::.::`:..、ヽ、 ヽ
__.. -‐ ´ ̄ ヽ / ..∠ノ /, '/::.::.::.::.::.; -‐  ̄` 、_ヽ、l
__ -‐ ´ ヽ /ー "´ { /::.::.::.::.:/ ヽヽ}
l. / ヽ|::.:::::::::/ | /
l/ {::::::::::/ l´
/ |、:_::/ /
/ l / /
/ V /、
/ / / ヽ
0904デフォルトの名無しさん
2006/03/25(土) 22:33:560905デフォルトの名無しさん
2006/03/25(土) 23:03:15┼─┐─┼─ / ,. `゙''‐、_\ | / /
│ │─┼─ /| _,.イ,,.ィ' ─────‐‐‐‐ 。 ←>>902
│ | │ | | | イン ,'´ ̄`ヘ、 // | \
__{_从 ノ}ノ/ / ./ | \
..__/ .` `,)((/ ./ |
/, -‐===≡==‐-`つ/ /| ノ ./' ))) / ;∵|:・.
_,,,...//〃ー,_/(. / /ミ ノ .{´ (('´ ./ .∴・|∵’
,,イ';;^;;;;;;;:::::""""'''''''' ::"〃,,__∠_/ ./ ., .|゙
/;;::◎'''::; );_____ @巛 ( .,i. ゙}
≧_ノ __ノ))三= _..、'、"^^^ \ ! }
~''''ー< ___、-~\( ,'~"'/
\( ,'.. /
0906デフォルトの名無しさん
2006/03/25(土) 23:08:48nopですら、タイミングをとる役目があるのに…。
free(NULL)をコンパイルすると、最適化では削除されると言うことか?
0907デフォルトの名無しさん
2006/03/25(土) 23:08:50unsigned long l = 0;
LPCTSTR s = reinterpret_cast<LPCTSTR>(l);
↑をコンパイルすると、
warning C4312: 'reinterpret_cast' : 'unsigned long' からより大きいサイズの 'LPCTSTR' へ変換します。
と出ます。sizeofで調べても、共に4になるのですが、なぜwarningなのでしょうか。
VS2005です。
0908デフォルトの名無しさん
2006/03/25(土) 23:12:010909デフォルトの名無しさん
2006/03/25(土) 23:17:48C4312で調べてみた?
「この警告は、/Wp64 が使用されている場合にのみ出されます。」とあるから
このオプション切ってみたら?
0910nlp
2006/03/25(土) 23:23:58ありがとうございます。解決しました。
64ビットで問題になるのは、intだけだと勘違いしていました。
0911デフォルトの名無しさん
2006/03/25(土) 23:29:51現在のVC++はWin64移行の手助けとして、/Wp64オプションがあり、それを使うと、
Win64で8バイトになる型とWin64でも4バイトのままの型との相互の変換は警告になる。
ようするにunsigned longをULONG_PTRにしてみろ。
0912デフォルトの名無しさん
2006/03/26(日) 14:41:21A,B,Cという異なるクラスのオブジェクトへのポインタを、ある
ひとつの変数に保持し、任意のタイミングでそのオブジェクトを
呼び出したいのですが、Void型で保持するとそのままだとメンバ
を呼び出せないので困っています。
class A{省略};
class B{省略};
class C{省略};
A a;
B b;
C c;
void * ActivePtr;
ActivePtr = (void *)a;
ActivePtr->call();←ここでクラス型がわからないのでエラーになる。
上でAもBもCもcallというメンバ関数を持っているとして、ActivePtrから
その型を意識せずにそのメンバ関数を呼び出したいのですが、この場合
どうするのがスマートでしょうか。
環境はVC6.0です。
0913デフォルトの名無しさん
2006/03/26(日) 14:47:11void*なんて使わないにこしたことはないこと、こんな設計になること自体がすでに糞ってのはわかった上での質問だよな?
現在じゃコールバック関数とかを無理やりクラスの中に封じ込めようとすると必要になるぐらいだろう。
まあ、そういうときはポインタを強引にキャストする。
ここ↓を
ActivePtr->call();←ここでクラス型がわからないのでエラーになる。
こう↓する
((A*)ActivePtr)->call();
だ。
0914デフォルトの名無しさん
2006/03/26(日) 14:53:560915デフォルトの名無しさん
2006/03/26(日) 14:54:53call() を定義したインターフェースクラスを作る。
0916デフォルトの名無しさん
2006/03/26(日) 14:55:18class Parent {
・
・
・
virtual void call() = 0;
};
class A : public Parent{...};
class B : public Parent{...};
class C : public Parent{...};
Parent* p;
p = &a;
p->call();
これじゃダメなのか?
0917デフォルトの名無しさん
2006/03/26(日) 14:58:170918デフォルトの名無しさん
2006/03/26(日) 14:58:52これだけのためにクラスを一つ追加するのもなんだか気が進まないなぁ
0919デフォルトの名無しさん
2006/03/26(日) 14:59:49void call();
}
0920デフォルトの名無しさん
2006/03/26(日) 15:28:53struct call_handle {
virtual void call()=0;
virtual ~call_handle(){}
};
template<typename T>
struct call_impl : call_handle{
T&ref;
call_impl(T&ref):ref(ref){}
void call(){ref.call();}
};
struct call_body{
std::auto_ptr<call_handle>p;
call_body(){}
template<typename T>
call_body&operator=(T&body){p.reset(new call_impl<T>(body));return *this;}
call_handle*operator->(){return p.get();}
};
struct A{void call(){}};struct B{void call(){}};struct C{void call(){}};
main(){
A a;B b;C c;
call_body ActivePtr;
ActivePtr = a;
ActivePtr->call();
}
0921912
2006/03/26(日) 15:30:44なにぶんCからC++をはじめたばっかりで設計もぼろぼろ
なのは自覚しております。
キャストしようにもActivePtrに保持しているのがどのクラス
のポインタなのかを意識せずに行いたいのですよね。
>>914〜919
実はC++はじめたばっかりなのでインターフェースもポリモー
フィズムもなんのことかいまいちよくわかっておりません。
せっかくアドバイス下さったのに不甲斐なくて申し訳ない。
これから調べてやってみますね。
アドバイス下さった方々、有り難うございました。
0922デフォルトの名無しさん
2006/03/26(日) 15:37:55なんとなく気持ちはわかるが作らんとどうしようもないんじゃないかね
0923デフォルトの名無しさん
2006/03/26(日) 15:55:09ならばひとつ聞くが、Cでそのような場合、同じ名前のメンバにアクセスする方法あるか?
0924デフォルトの名無しさん
2006/03/26(日) 15:59:00void* + 関数ポインタで十分か......
template<typename T>void call_impl(void*ptr){return ((T*)ptr)->call();}
class call_body{
void*ptr;
void(*call_fp)(void*);
public:
void call(){call_fp(ptr);};
call_body():ptr(0),call_fp(0){}
template<typename T>
call_body(T*ptr):ptr(ptr),call_fp(call_impl<T>){}
};
#include<stdio.h>
struct A{void call(){}};
struct B{void call(){}};
struct C{void call(){}};
int main(){
A a;B b;C c;
call_body ActivePtr;
ActivePtr = &a;
ActivePtr.call();
}
0925デフォルトの名無しさん
2006/03/26(日) 16:18:11signed int y = -1;
(x > y); // => false ( gcc on i386 )
ビット列をそのまま unsigned とみなして比較したらこうなるというのは
分かるんだけど、これってどう対処すべき?
最初から↓みたいになっていればいいのに…。
bool operator>(unsigned int x, signed int y) {
return (y < 0) ? true : (x > unsigned(y));
}
0926デフォルトの名無しさん
2006/03/26(日) 16:21:110927デフォルトの名無しさん
2006/03/26(日) 16:26:30x が signed int の上限を超えるとアウト。
unsigned int x = ~0;
signed int y = 1;
(signed)x > y; // => false
0928デフォルトの名無しさん
2006/03/26(日) 16:26:43signedとunsignedを比較するとき、signedはunsignedに型変換されるというルールがあるからね
自分で明示的にunsignedな変数をsingedにキャストするか、もっと大きなサイズの型にキャストするといい
0929デフォルトの名無しさん
2006/03/26(日) 16:30:33って、こんな表現あったっけw
0930デフォルトの名無しさん
2006/03/26(日) 16:42:38多くのコンパイラで sizeof(int) == sizeof(long) なので、それはダメ。
0931デフォルトの名無しさん
2006/03/26(日) 16:43:570932デフォルトの名無しさん
2006/03/26(日) 19:52:34ifstream fin("hoge.txt");
int a,b,c,d;
char hoge[20];
//"ABC"の文字列があったときに、ファイルのint型データをa,bに入力する。
while(!fin){
fin >> hoge;
if(fin=="ABC"){
fin >> a;
fin >> b;
break;
}
}
*ここにfinをファイル初期に戻す文を挿入したい*
//"DEF"の文字列があったときに、ファイルのint型データをc,dに入力する。
while(!fin){
fin >> hoge;
if(fin=="DEF"){
fin >> c;
fin >> d;
break;
}
}
後略
このとき、finをファイル初期に戻す構文として
ifstream fin("hoge.txt");
をもう一度使うのは良くないでしょうか?他によい方法があったら教えてください。
0933デフォルトの名無しさん
2006/03/26(日) 19:56:220934デフォルトの名無しさん
2006/03/26(日) 19:56:48同じファイルを繰り返し読み込むのはよくないな。
"ABC" の検索と "DEF" の検索を両方1度にやればいいんじゃないの?
0935デフォルトの名無しさん
2006/03/26(日) 20:21:14上手くいきました、ありがとうございます。
>>934
そうですね、そちらの方法だとよりコードが綺麗になるかもしれないので試してみます。
皆様ありがとうございました。
0936デフォルトの名無しさん
2006/03/26(日) 22:44:10//--
const wchar_t* strW = L"テストtest";
size_t strWLength = wcslen(strW);
int strALength = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL);
if ( strALength <= 0 ) {
//error
}
char* strA = new char[strALength];
::memset((void*)strA, '\0', strALength);
WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL);
strA[strALength] = '\0';
//適当な処理
delete[] strA;
//--
0937デフォルトの名無しさん
2006/03/26(日) 22:48:40環境:VC2005 Express Edition
下記コードをデバッグモードで実行中、 delete[] strA の部分で、
HEAP CORRUPTION DETECTEDと出てプログラムが強制終了してしまいます。
//--
const wchar_t* strW = L"テストtest";
size_t strWLength = wcslen(strW);
int strALength = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL);
if ( strALength <= 0 ) {
//error
}
char* strA = new char[strALength];
::memset((void*)strA, '\0', strALength);
WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL);
strA[strALength] = '\0';
//適当な処理
delete[] strA;
//--
なにか変なところあるのでしょうか。
WideCharToMultiByteで書き込まれた領域はうまく開放できないのでしょうか?
0938デフォルトの名無しさん
2006/03/26(日) 22:51:50char* strA = new char[strALength];
strA[strALength] = '\0';
delete[] strA;
これだけで死ねるだろう。
0939デフォルトの名無しさん
2006/03/26(日) 22:53:280940デフォルトの名無しさん
2006/03/26(日) 22:58:09とりあえず回線切って吊ってきます・・・orz
char* strA = new char[strALength + 1];
::memset((void*)strA, '\0', strALength + 1);
WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL);
strA[strALength] = '\0';
delete[] strA;
ということでFAということですね。
>>938
すばやいご指摘ありがとうございました。
0941デフォルトの名無しさん
2006/03/26(日) 23:03:04/つ 〈( ゚д゚)
|( ゚д゚) ヽ ⊂ニ)
ヽ__と/ ̄ ̄ ̄/ |
 ̄\/___/
/つ
/つ 〈( ゚д゚ )
|( ゚д゚ ) ヽ ⊂ニ)
ヽ__と/ ̄ ̄ ̄/ |
 ̄\/___/
0942デフォルトの名無しさん
2006/03/26(日) 23:04:10memset() に渡すときのキャストは不要。っていうかヤメロ。
実は new char[strALength + 1]() と書けばゼロ埋めできる。
std::vector 使うと delete を書かなくて良くなる。ゼロ埋めも不要。
API の戻り値はチェックしとけよ。
0943デフォルトの名無しさん
2006/03/26(日) 23:14:350944デフォルトの名無しさん
2006/03/26(日) 23:14:35いろいろとご指摘ありがとうございます。参考にします。
独学だと気づいていない変なところいっぱいあるんだろうな・・・
0945デフォルトの名無しさん
2006/03/27(月) 03:29:08#なかには char str = '本'; みたいなキチガイじみた参考書もあるけどねえ
0946デフォルトの名無しさん
2006/03/27(月) 04:19:140947デフォルトの名無しさん
2006/03/27(月) 04:39:49class One{};
int operator+(One one, int i){
return i+1;
}
int operator+(int i, One one){
return i+1;
}
とかみたいなことはできるよ
組み込み型同士の演算子は再定義できないけど
0948デフォルトの名無しさん
2006/03/27(月) 05:19:110949デフォルトの名無しさん
2006/03/27(月) 09:16:34それはさすがにJavaか何かだろ
0950デフォルトの名無しさん
2006/03/27(月) 09:55:220951デフォルトの名無しさん
2006/03/27(月) 10:49:41それ、前にどこかのスレで出てたな
見て驚愕した覚えがある
ちなみに確かにCの本だった
0952デフォルトの名無しさん
2006/03/27(月) 10:56:42うはwww夢がポンデリングwwwwwww
うp
0953デフォルトの名無しさん
2006/03/27(月) 11:01:02前スレで出てたと思う
0954デフォルトの名無しさん
2006/03/27(月) 11:03:300955デフォルトの名無しさん
2006/03/27(月) 11:15:20大当たり
ちなみにタイトルは「図解入門 よくわかる最新C言語の基本と仕組み」
0956デフォルトの名無しさん
2006/03/27(月) 11:24:57実は既にあったりする
0957デフォルトの名無しさん
2006/03/27(月) 13:09:55ttp://www.f-site.com/down.html
前スレから拾ってきた>>955を書いてる横田とかいう糞馬鹿のサイト
ここからサンプルコード落とせるからまぁ見てみれ
0958デフォルトの名無しさん
2006/03/27(月) 14:04:20>※お詫びと訂正: 編集プロダクションとの行き違いにより、本書には多くの誤字があります。
なんじゃそりゃ。
0959デフォルトの名無しさん
2006/03/27(月) 15:41:020960デフォルトの名無しさん
2006/03/27(月) 15:51:100961デフォルトの名無しさん
2006/03/27(月) 15:52:41ライブラリ関数の事なら規格票(JIS X3010:1999)の第7章に列挙してある
0962デフォルトの名無しさん
2006/03/27(月) 15:56:01ライブラリ関数のことです。
未だにライブラリ関数がないOSがあるんで困るんだよね・・・
0963デフォルトの名無しさん
2006/03/27(月) 17:04:32#ディレクトリの概念がないのはいいけど、そこに無理やりシェルを移植するから……
0964デフォルトの名無しさん
2006/03/27(月) 17:25:17そういやBTRONにも泣かされたなw
今はMona OSで中途半端なlibcが複数あるから困ってるww
0965デフォルトの名無しさん
2006/03/27(月) 18:30:46構造体Bのメンバに構造体Aを指すポインタを持たせるにはどうすればいい?
もちろん↓の様に書いてもだめなことはわかってるんだが。
struct A{
B *p;
};
struct B{
A *p;
};
0966デフォルトの名無しさん
2006/03/27(月) 18:44:07struct B;
struct A{
B *p;
};
struct B{
A *p;
};
あ、あと前スレのごたごたの蒸し返し禁止ね。>各位
0967デフォルトの名無しさん
2006/03/27(月) 18:47:390968デフォルトの名無しさん
2006/03/27(月) 18:52:35サンクス
0969デフォルトの名無しさん
2006/03/27(月) 21:11:23クラスでも同じことできるから覚えておくといい
0970デフォルトの名無しさん
2006/03/28(火) 07:38:35STEP2がまともに表示されないんですが
0971デフォルトの名無しさん
2006/03/28(火) 20:02:59しょうもない関数
例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合
オブジェクト指向で考えるとどこ設置するのでしょうか?
色々と調べた感じだと、名前空間をどうのこうのってのがあったんですが・・。
メソッドとするにはあまりにもひどすぎるし・・。
0972デフォルトの名無しさん
2006/03/28(火) 20:06:050973デフォルトの名無しさん
2006/03/28(火) 20:11:25そんなものオブジェクト指向にせず、ただの関数にしろ。
そして名前空間はオブジェクト指向と直接の関係があるのでは無い。
全部が全部クラスに閉じ込めればオブジェクト指向になるわけではないし、完璧なオブジェクト指向なんて存在できない。
たとえばグローバルな変数や関数を廃止したJavaやC#だとそんな関数は静的メソッドになっていて、クラスのありがたみは0だ。
ちなみにその例なら<algorithm>のstd::maxが使える。
0974デフォルトの名無しさん
2006/03/28(火) 20:12:19>例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合
何と何の値を比較するかによる。
1つのインスタンスの中の値を2つ比べるだけならクラスのメンバ関数になる。
でも、2つのインスタンスが比べる対象になるならその関数は1つ上の存在を管理している奴にあずけなければならない。
また、1つはクラス、もう1つの値は別のどっかの変数の場合でも同様。
0975デフォルトの名無しさん
2006/03/28(火) 20:18:33ちょっと、記述が足りませんでした。
int とか dubule です。
つまるところ、math.h みたいな感じで使えるのかな〜?と思ったんです。
C言語なら、そういったモジュールを自作でつくって、使いまわしてたんで・・。
0976デフォルトの名無しさん
2006/03/28(火) 20:19:00ヘッダファイルに置いて比較を使いたいファイル内でインクルード
色々対応したいならテンプレート使うといいかも
0977デフォルトの名無しさん
2006/03/28(火) 20:23:21mymath.h
inlinle ナンチャラ
inlinle ナンチャラ
みたいな感じで使えるってことですね。
ていうか、こんなやり方でいいんでしょうかね・・?
スマートなやりかたってないんだろうか。
0978デフォルトの名無しさん
2006/03/28(火) 20:33:510979デフォルトの名無しさん
2006/03/28(火) 20:39:09};
0980デフォルトの名無しさん
2006/03/28(火) 20:55:54a*x*x + b*x + c = 0
0981デフォルトの名無しさん
2006/03/28(火) 21:02:16宿題片付けて欲しいんなら宿題スレで
0982デフォルトの名無しさん
2006/03/29(水) 00:29:30#include <complex.h>
double complex x1 = (-b + csqrt(b * b - 4 * a * c)) / 2 * a
double complex x2 = (-b - csqrt(b * b - 4 * a * c)) / 2 * a
0983デフォルトの名無しさん
2006/03/29(水) 00:48:420984デフォルトの名無しさん
2006/03/29(水) 01:16:495次以上はシラネ。
0985デフォルトの名無しさん
2006/03/29(水) 01:33:51確か絶対値の大きい方をまず求めて、
その値を使って他方を求める。
そうしないと引き算の桁落ちで
真値と大きく異なる値が得られることがある。
0986デフォルトの名無しさん
2006/03/29(水) 02:13:52どこのことを言ってるんだ?
0987デフォルトの名無しさん
2006/03/29(水) 05:22:14そのポインタを保存して、終了するときにまとめて
deleteしたいんですが、異なるclassもまとめて管理
しようとしてvoid*で保存すると、deleteでデストラクタが
呼ばれないんですが、呼び出すべきデストラクタを
listに一緒に保存する上手い方法は無いものでしょうか?
0988デフォルトの名無しさん
2006/03/29(水) 05:43:08void*でなくこのスーパクラスのポインタを持つようにする
それか、void*の代わりにboost::shared_ptr<void>を使う
0989デフォルトの名無しさん
2006/03/29(水) 06:38:17boostを調べてみたら、他にも色々面白いクラスがあるみたいですね。
教えていただいて感謝。
0990デフォルトの名無しさん
2006/03/29(水) 07:17:10ていうか、そんなのが普通に出てくる設計って何かがおかしいと思わないのか?w
0991デフォルトの名無しさん
2006/03/29(水) 08:09:51いや、要はdeleteしなくて済む(し忘れてもいい)方法は
無いものかと思っただけで。
shared_ptrやarrayなんてのがあることを知らなかったので。
0992デフォルトの名無しさん
2006/03/29(水) 08:16:170993デフォルトの名無しさん
2006/03/29(水) 11:02:490994デフォルトの名無しさん
2006/03/29(水) 11:04:340995デフォルトの名無しさん
2006/03/29(水) 11:06:590996デフォルトの名無しさん
2006/03/29(水) 11:17:58boost::spiritは実にアレゲで素敵ですよコンパイル速度遅すぎだけど
0997デフォルトの名無しさん
2006/03/29(水) 11:19:390998デフォルトの名無しさん
2006/03/29(水) 11:26:43あればいいんだがなー。
そうすると、クロージャとか考え出して、メモリ管理の問題にいきつくので、
ガベコレなしでクロージャはきついな、クロージャなしだと、無名関数の
パワーは半減だなーと思う。
ちょっと構文を拡張してくれれば、あとはboostの人がshared_ptr使って、
なんとかしてくれそうな気がするんだけど。
0999デフォルトの名無しさん
2006/03/29(水) 11:52:55クロージャ無しで十分使えるboost::lamdaがあるじゃないか。
1000デフォルトの名無しさん
2006/03/29(水) 11:59:57http://pc8.2ch.net/test/read.cgi/tech/1143601166/l50
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。