【初心者歓迎】C/C++室 Ver.25【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※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
2デフォルトの名無しさん:2006/02/26(日) 23:18:21
3
3デフォルトの名無しさん:2006/02/27(月) 01:23:34
VC8でopenFileDialogを使いたくて
MSDNのソースを試してみようと
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' : 定義されていない識別子です。
4デフォルトの名無しさん:2006/02/27(月) 01:26:57
すいませんsageは駄目だったんですね
ついでにエラーが出ている場所ですが
if ( openFileDialog1->ShowDialog() == ::DialogResult::OK )
ここです
5デフォルトの名無しさん:2006/02/27(月) 01:43:19
>3
良く分からんが、さすがにそこまで特殊な環境だとスレ違いじゃないのか?
【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/
6デフォルトの名無しさん:2006/02/27(月) 01:54:24
(>Д<)ゝ”ラジャー!!
7デフォルトの名無しさん:2006/02/27(月) 02:07:23
質問です。まず4種類のプログラムを見て下さい。
void 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どちらのほうが早くて安全でしょうか?
これもコンパイラによりけりだったり好みの問題かもしれませんが教えて頂きたいです。
8デフォルトの名無しさん:2006/02/27(月) 02:08:50
好きに汁
9デフォルトの名無しさん:2006/02/27(月) 02:21:20
>>7
速度は実測が基本。
10デフォルトの名無しさん:2006/02/27(月) 02:43:12
>>7
最適化でどうなるかわからないのと、
CPUがどういう動きをするのかわからないからわからない。
俺も>>9と同じで「速度は実測が基本」だと思う。
11デフォルトの名無しさん:2006/02/27(月) 02:47:09
また、計測の仕方も問題になると思う。
同じプログラムをループで何回も実行させる形だと、CPUがまたそれ用に最適化してしまってまたわからない。
それだけの機能をもったexeを作ってそれを何回も実行させる形にしてもやはりCPUがそう判断してしまうと計測ができないと思う。
つまり、よくわからいw
実際に速度が問題になってそのときその場所、その場面で速度を測ってやっとこさわかる問題だと思う。
構造的に遅いっつーならアルゴリズムを考える余地はあるけど
コード的にどうっつーのは正直、ようわからんw
12デフォルトの名無しさん:2006/02/27(月) 05:53:43
>>7
コンパイラがまともに最適化できるのなら、AとB、CとDはそれぞれ同じコードを吐くだろう。
#Bは*out_no = in_no + 10;の間違いと仮定して。
次にA或いはBとC或いはDの差だが、A/Bにはアドレスを関数に渡すと言うコードが必要になるので
恐らくは、C/Dよりも効率のいいコードを吐くと言うことはなさそうだ。

まぁなんだ、愚作を弄せず真っ当なプログラミングをしろ、と。
その上で、速度が重要な要素ならば実測しろ。
13デフォルトの名無しさん:2006/02/27(月) 05:54:15
ある結果のときに外部プログラムを呼び出すってのはどうすればよいのでしょう?
たとえば、IE起動するとか.

よろしくおねがいします.
14デフォルトの名無しさん:2006/02/27(月) 05:57:18
>>13
質問が曖昧すぎ。
・「ある結果のとき」に意味があるのか。あるなら具体的に。
・外部プログラムを起動してどうしたいのか。ただ起動するだけでいいのか、なんらかの連携をしたいのか。
・そもそもC標準関数だけでやりたいのか、WinAPIを使いたいのか、Unix系関数を使いたいのか、云々。
15デフォルトの名無しさん:2006/02/27(月) 06:08:24
質問・・・。
VC.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 の説明とも違っているように感じる。
誰か詳しい人に図を付けて説明してもらいたくて仕方がない。
16デフォルトの名無しさん:2006/02/27(月) 06:08:57
速度ってどうやって計るの?
コンパイラのプロファイラだとインライン展開や自力で埋め込んだコードは計ってくれないよね。
皆さんの方法教えてください。
実際に最適化したものを計りたいんですが。
17デフォルトの名無しさん:2006/02/27(月) 06:19:57
埋めたコード呼んでる関数とかでいいじゃん。
マクロの差分がミクロの速度差で。
18デフォルトの名無しさん:2006/02/27(月) 06:26:20
>>13です。

「ある結果のとき」に意味はないです。
演算結果が1ならIE、2ならワードぐらいで考えてください。
ただ起動するだけでいいです。
C標準関数だけでお願いします。

あいまいで申し訳なかったです。
19デフォルトの名無しさん:2006/02/27(月) 06:28:45
>>15
>処理したい範囲は [ a , b ) とする。
それなら、
for ( set<int>::iteretor itr1 = i.lower_bound( a ) ; itr1 != i.lower_bound( b ) ; itr1++ ){
じゃないか?
20デフォルトの名無しさん:2006/02/27(月) 06:37:08
>>15
upper_bound(k)は、kより大きな最初の要素を指す。
lower_bound(k)は、k以上の最初の要素を指す。
(23.1.2より)
21デフォルトの名無しさん:2006/02/27(月) 06:38:28
あと、ループ内でlower_bound()を毎回呼ぶのは禿げしく無駄が多いと思うぞ
2215:2006/02/27(月) 06:48:45
>>19
自分のソースを修正しました。感謝。

>>20
>lower_bound(k)は、k以上の最初の要素を指す。

lower_boundの定義がこの通りだとしたら、今の処理が上手くいかないのは確かに納得です。
もしかして>>15のサイトの説明が間違っていると?
間違っているとしたら、 『 k より小さな( 又は、k以下の ) 最後の要素を指す 』 という関数は何でしょうか?

>>21
forの前に itr2 = i.lower_bound( b ) と代入して、forを高速化しました。感謝。
23デフォルトの名無しさん:2006/02/27(月) 07:02:29
>>22
>もしかして>>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;
}
24デフォルトの名無しさん:2006/02/27(月) 07:21:03
>>22
for (xxx::iterator it = i.lower_bound(a), last = i.upper_bound(b); it != last; ++it) {
 //
}
に汁。
2515:2006/02/27(月) 08:05:42
>>23
上手く動きました。感謝。

>>24
forのスコープでメモリ節約感謝。
26デフォルトの名無しさん:2006/02/27(月) 08:58:01
>>18
つ[system()]
27デフォルトの名無しさん:2006/02/27(月) 10:25:35
system("iexplore.exe");
だと内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイル
として認識されていません。
となってしまいます。
どうすればよいでしょう。
28デフォルトの名無しさん:2006/02/27(月) 12:21:45
>>27
パスも指定汁
29デフォルトの名無しさん:2006/02/27(月) 17:29:30
HTMLファイルを開いたり特定のURLを開かせたいのなら、
Internet Explorer固定だなんてやめてくれよ。
30デフォルトの名無しさん:2006/02/27(月) 18:26:19
Accelerated C++ で C++を勉強中です。
Accelerated 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;
    }
}
3130:2006/02/27(月) 18:30:30
すみません、よく見たら上記関数に std::vector 渡していました。
イテレータ渡したら通りました、ごめんなさい。
32デフォルトの名無しさん:2006/02/27(月) 18:35:24
まぁ、慌てず落ち着いてやりんさいや
33デフォルトの名無しさん:2006/02/27(月) 22:55:06
下のプログラムの※1の部分で仮想関数のfoo()を呼び出して欲しいのですが、
B::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;
}
34デフォルトの名無しさん:2006/02/27(月) 22:57:39
>>33
class B : public A {
public:
using A::foo;
void foo(int a);
};
35デフォルトの名無しさん:2006/02/27(月) 23:24:11
class B : public A {
public:
void foo(int a) {A::foo();}
};
36デフォルトの名無しさん:2006/02/27(月) 23:46:43
>>34
なんと、3分とたたずに返事がきていたとは……。解決しますた。
ありがとうございます。

>>35
実際はB::foo(int)は引数を使った内容になるのですが、それを抜いても
※1の部分を変更しないと駄目ですので >34さん案でいきます。
37デフォルトの名無しさん:2006/02/28(火) 07:19:53
ていうかさぁ、

た だ の 関 数 の オ ー バ ー ロ ー ド じ ゃ ね ぇ か バ カ

Aの方のvirtual外せばそっちが呼ばれるわ
38デフォルトの名無しさん:2006/02/28(火) 08:15:27
>>37
お前のレスだけが
質問文のさらに2ターンくらい前の段階で止まってるw
39デフォルトの名無しさん:2006/02/28(火) 09:11:37
>>37
謙虚にな
40デフォルトの名無しさん:2006/02/28(火) 11:48:29
こうですか?わかりません!(><)
41デフォルトの名無しさん:2006/02/28(火) 18:46:09
42デフォルトの名無しさん:2006/02/28(火) 23:29:49
cを学びたいのですがオススメの本はあるでしょうか?
43デフォルトの名無しさん:2006/02/28(火) 23:54:05
書籍スレ池
44デフォルトの名無しさん:2006/03/01(水) 04:27:22
VCで、bool型の代わりに、intの別名のBOOLが使われている物が多いのですが、
何か意図があるのでしょうか?

trueかfalseの状態しかないのなら、コンパイラのチェックも入るboolを使ったほうが良いと思うのですが。
45デフォルトの名無しさん:2006/03/01(水) 04:38:09
素朴な疑問なんですが、プログラミングって個人でやる限りAdobeもんとか作るのって不可能に近いじゃないですか〜
猫でも分かるみたいなプログラム組んでもしょーがないような気がするんですけど・・
46デフォルトの名無しさん:2006/03/01(水) 04:49:52
>>45
個人で書けるレベルのアプリでいまだ実現されていない(あるいは、誰も思い付いていない)
ものは大量にあると思う。

個人で書くのに限界を感じたら集団で書くこともできる。
47デフォルトの名無しさん:2006/03/01(水) 04:54:57
釣りにしてはお粗末だな
48デフォルトの名無しさん:2006/03/01(水) 05:39:49
>>44
一般的にVC++でBOOLというとWi32APIで定義されているそれのことである。
Win32APIはC専用ではないし、ましてやC++に特化しているわけではない。
よってBOOLはBOOLであってboolで代用できるものではない。

まー、それ以前に戻り値がBOOLのはずになのに1,0,-1を返す可能性があるAPIが(以下略
49デフォルトの名無しさん:2006/03/01(水) 13:55:28
>>44
Win16が定義されたときは(Win32はその後継だが) boolは存在し無かった。
当時は Cか Pascalだったから。
50デフォルトの名無しさん:2006/03/01(水) 14:06:00
>>44
ついでに、trueかfalseかしか無いならboolのほうがいいってのは別にどうでもいい
必要なのはtrueかfalseかという言葉ではなく、
「Aという状態かBという状態か」という概念だけ
そしてBOOLは基本的に「0かそうでないか」
なのでなんの問題も無い
51デフォルトの名無しさん:2006/03/01(水) 14:11:19
いやTRUEと比較するおばかさんがいるでしょ。
52デフォルトの名無しさん:2006/03/01(水) 14:21:02
勉強になっていいじゃない?
5350:2006/03/01(水) 14:21:52
そんな超おバカさんのこと言われてもなぁ
俺はどうせboolだろうがBOOLだろうが条件で==とかしないし・・・
54デフォルトの名無しさん:2006/03/01(水) 14:25:38
>>53
だからBOOLは-1も返すんだってば。
55デフォルトの名無しさん:2006/03/01(水) 14:42:40
BOOLは思い切りTRUEかFALSEですと書かれているよな
あれはいつになったら直すのだ
56デフォルトの名無しさん:2006/03/01(水) 14:56:01
-1を返すあれがあるから下手にBOOLをboolにすると罠に嵌まる。
だから俺は引数や戻り値がBOOLならBOOLを使うが、それ以外ではboolを使う。

けれど肝心の-1を返す関数の戻り値を受けるときにはintを使うけどな。

ところでダイアログプロシージャもときどきハンドルを返したりするのに昔は戻り値がBOOLだった。
57デフォルトの名無しさん:2006/03/01(水) 15:01:41
キャストしまくれってことなんだろう
58デフォルトの名無しさん:2006/03/01(水) 15:03:09
BOOL foo(){...}

void hoge() {
if(foo()) {
...
} else {
...
}
}

なんの問題も無い
59デフォルトの名無しさん:2006/03/01(水) 16:39:24
んなの、ヘッダを勝手にintに書き換えれば良いだけ。
60デフォルトの名無しさん:2006/03/01(水) 20:29:25
なんか、釣り糸が絡まってるよ
61デフォルトの名無しさん:2006/03/01(水) 20:33:10
C++で、あるテキストファイルから特定の文字列(日本語も)を含む行をすべて抜き出すには、どのようにコードを書けばよいですか?
62デフォルトの名無しさん:2006/03/01(水) 20:33:55
そのように
63デフォルトの名無しさん:2006/03/01(水) 23:13:47
namespaceの中にoperator << とか書いて、
そのoperatorをnamespace外部で使うにはどうすればよいですか?
# using namespaceつかわないで。

namespace ns{
class Foo { ... };
ostream &operator << (ostream &o, Foo &foo) { ... }
}
int main(){
std::cout << Foo(); // using namespace ns; しないと使えないよー
}

教えてエライ人!
64デフォルトの名無しさん:2006/03/01(水) 23:23:17
std::cout << ns::Foo();

にすれば良い

詳しくは Koenig lookup (Koenig の照合規則) で調べてみれ
65デフォルトの名無しさん:2006/03/01(水) 23:29:10
すいません、微妙に例を間違えました。

class 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使う以外に方法無いんでしょうか?
66デフォルトの名無しさん:2006/03/01(水) 23:32:43
すいません、できました。(スマートな書き方じゃないけど・・・)
ns::operator << (std::cout, Foo());

すれ汚しスマソです
67デフォルトの名無しさん:2006/03/01(水) 23:52:48
>>65
なんでFooをnsの中に入れない?
入れられないとしたら、なんでoperator <<を外に出さない?
68デフォルトの名無しさん:2006/03/01(水) 23:56:13
>>66のやり方で満足するなら、
class Foo
{
69デフォルトの名無しさん:2006/03/01(水) 23:58:42
Orz途中で書き込んでしまった。

Class Foo
{
  std::ostream & to_stream() ;
} ;


これでも十分という気がしてならない。
70デフォルトの名無しさん:2006/03/02(木) 01:36:51
VisualC++6.0でaccelerated C++を読んでC++の勉強してるんですが、
<algorithm>ヘッダに定義されているmaxという関数を使っています。
と本には書いていて、ソースに
#include <algorithm>
...
using std::max;
と書いてるのですが、コンパイルすると'max' : 'std' のメンバではありません。
と出てしまうのですが、これは何がだめなんでしょうか?
71デフォルトの名無しさん:2006/03/02(木) 01:41:52
>>70
VisualC++6.0かな?
72デフォルトの名無しさん:2006/03/02(木) 01:44:54
VisualC++6.0がだめなんですかorz
その部分は自分で作って脳内補完します・・・
73デフォルトの名無しさん:2006/03/02(木) 01:55:35
つVC++ express edition
つVC++ toolkit 2003
74デフォルトの名無しさん:2006/03/02(木) 02:02:02
min, maxマクロも悪さをするからヘッダをincludeする前にNOMINMAXも定義しておくと桶
75デフォルトの名無しさん:2006/03/02(木) 07:34:51
>>70
もし<winodws.h>を読み込んでいるのなら>>74
76デフォルトの名無しさん:2006/03/02(木) 11:41:31
http://japan.linux.com/enterprise/06/02/27/0719245.shtml
この記事の、作業領域を使わずに文字を反転させるプログラム、
って一体どうやるんですか?
作業領域ってことはauto変数もダメなんですよね?
77デフォルトの名無しさん:2006/03/02(木) 11:45:31
78デフォルトの名無しさん:2006/03/02(木) 12:02:51
>>76
for (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];
}

こういう事か?
79デフォルトの名無しさん:2006/03/02(木) 12:06:55
C++でMKLを使って複素固有値問題を解きたいんですけど、
複素数はMKL_Complex16で定義できるんですけど
その行列はどのように定義するんですか?
MKL_Complex16 a[N]こんなふうにはできませんよね
80デフォルトの名無しさん:2006/03/02(木) 12:20:16
>>79
行列といえば二次元配列じゃないのか?
複素固有値問題ってのを知らないから何とも言えんが
81デフォルトの名無しさん:2006/03/02(木) 12:33:14
>>80
a(b,c)こういうことでしょうか?
82デフォルトの名無しさん:2006/03/02(木) 12:38:52
>>76
再帰で(w
83デフォルトの名無しさん:2006/03/02(木) 12:42:02
>>76
こんな試験出す会社に受かる自信無いや
84デフォルトの名無しさん:2006/03/02(木) 13:09:35
>>79ちなみにMKLにおける複素数は
/* Complex type (double precision). */
typedef
struct _MKL_Complex16 {
double real;
double imag;
} MKL_Complex16;
このように与えられてる
85デフォルトの名無しさん:2006/03/02(木) 14:33:29
virtual void end() = 0;

の =0 には何の意味があるんですか?
86デフォルトの名無しさん:2006/03/02(木) 14:39:40
あります。
87デフォルトの名無しさん:2006/03/02(木) 14:46:43
>>85
純粋仮想関数
88デフォルトの名無しさん:2006/03/02(木) 15:20:08
質問です、STLがうまく使えず困っています。
目的は"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で配列化すると不具合があるのでしょうか?
解決策を教えてください。
89デフォルトの名無しさん:2006/03/02(木) 15:21:57
>>87
意味がわかりました
ありがとう
90デフォルトの名無しさん:2006/03/02(木) 15:23:07
reserve
resize
の違いかな?
91デフォルトの名無しさん:2006/03/02(木) 15:26:43
使ってるコンパイラのバージョン、及びコンパイラに標準添付以外のSTLを使ってるならその旨書いたほうがいいとは思うが。

Index < m_StringArray.size()ぐらいはチェックしてるか?
9288質問者:2006/03/02(木) 15:28:52
>>90
resizeにしたら難なく実行できました。
reserveでは実領域が確保されていないのですね、勉強になりました。
ありがとうございます。
93デフォルトの名無しさん:2006/03/02(木) 19:19:37
>>67-69
レス遅くなってしまいましたが...

今やってるのは、GUIDをstd::ostream/istreamに流すoperator<<, >>を
自作utilライブラリ内に作りたいと思いまして。
んで、グローバルに書くよりnamespace util内の方が名前空間汚さなくていいかな
と思ったんですが、それだとそのnamespace外では結局usingが必要になるんで、
とりあえずグローバルに書くことで落ち着こうかと思います。
94デフォルトの名無しさん:2006/03/02(木) 19:28:13
>>93
分かってるかもしれないけど
using namespaceはスコープがあるよ

{
using namespace ns;
std::cout << Foo(); // OK
}
std::cout << Foo(); // エラー
95デフォルトの名無しさん:2006/03/02(木) 19:28:37
VUSUAL C++のインストールしてからプログラミングを動かすまでの設定を
することができません、どこか説明がわかりやすいサイトしりませんか?
96デフォルトの名無しさん:2006/03/02(木) 19:32:56
猫でもわかる(有名)
http://www.kumei.ne.jp/c_lang/net/index.html
97デフォルトの名無しさん:2006/03/02(木) 20:20:52
>>96

ありがとうございました。
98デフォルトの名無しさん:2006/03/02(木) 20:24:57
>>94
あー、なるほど。使用する部分だけスコープで限定すればいいわけですね。

しかし、非operatorな関数はns::func()で呼べるのに、
operatorはusingつかったり、ns::operator<<(...)みたいに書き方変えないといけなくて、
サクっと書けないのが悲しい今日この頃です。
99デフォルトの名無しさん:2006/03/02(木) 20:54:22
グローバルに定義するのが正しい
あとはラッパーでも書くしかない
100デフォルトの名無しさん:2006/03/02(木) 21:08:11
VUSUAL C++ってなんですかせんせい
101デフォルトの名無しさん:2006/03/02(木) 22:23:50
ビュジュアル
102デフォルトの名無しさん:2006/03/02(木) 22:29:49
>>100
MicrosoftのC/C++コンパイラとIDEとその他ツールのセット。
103デフォルトの名無しさん:2006/03/02(木) 22:40:00
>>102
それはVisual C++
104デフォルトの名無しさん:2006/03/02(木) 23:16:15
>>103
それはMucrosoftのC/C++コンパイラとIDEとその他ツールのセット。
105デフォルトの名無しさん:2006/03/02(木) 23:20:56
>>104
それはVisual C++
106デフォルトの名無しさん:2006/03/03(金) 00:47:03
VC6.0 コンソールAPで使える簡単なJPEGエンコーダ、デコーダってありませんか?
107デフォルトの名無しさん:2006/03/03(金) 00:48:15
BCBなら標準でTJPEGBitmapが‥‥
108デフォルトの名無しさん:2006/03/03(金) 01:03:01
libjpegでもGDI+でも好きなの使え
109デフォルトの名無しさん:2006/03/03(金) 01:15:39
別スレッドからcoutをすると出力文字列がバグるんですが、
正しく表示させるにはどうすればよいでしょうか?
110デフォルトの名無しさん:2006/03/03(金) 01:16:42
>>109 出力の排他制御をすればいい。
111デフォルトの名無しさん:2006/03/03(金) 01:39:14
>>110
排他制御で調べてみましたが、いまのところ方法がみつかっていません。
関数一個で手軽にというわけにはいかないのでしょうか?
112デフォルトの名無しさん:2006/03/03(金) 02:10:34
環境がわからんからなんとも言えない。
113デフォルトの名無しさん:2006/03/03(金) 04:15:15
System::Windows::Forms::Label
って配列として扱えんと?
無理ならJavaに戻らんといけんね
C#でもよかと?
114デフォルトの名無しさん:2006/03/03(金) 04:39:31
>>112
6畳の和室でちょっと寒いです・・・
115デフォルトの名無しさん:2006/03/03(金) 06:31:14
>>114
隣が深夜に45分おきにドン!と音をたてる
死んで欲しい
116デフォルトの名無しさん:2006/03/03(金) 08:07:19
#include <stdio.h>
#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;
}
117デフォルトの名無しさん:2006/03/03(金) 08:08:03
int max(int x, int y)
{
if(x >y)
return x;
else
return y;
}
118myfanc.h:2006/03/03(金) 08:08:52
int max(int x,int y);
119デフォルトの名無しさん:2006/03/03(金) 08:10:20
sample.c
Error: 外部シンボル '_max' が未解決をコンパイルしようとするとこういう文が出てきます
なぜでしょうかおしえt
120デフォルトの名無しさん:2006/03/03(金) 08:16:10
>>119
maxの定義を見付けられないから。
121デフォルトの名無しさん:2006/03/03(金) 13:03:22
>>119
maxの定義を見付けられないから。

詳しくお願いします
maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
122デフォルトの名無しさん:2006/03/03(金) 13:04:35
追記
分割でやる奴なんです
123デフォルトの名無しさん:2006/03/03(金) 13:07:39
>>121
>maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
適当なソースファイルに書けばいい。
で、それとsample.cを一緒にコンパイル。
124デフォルトの名無しさん:2006/03/03(金) 14:12:54
すんまそ
3次元座標をfscanfで読み込んで加工したいのですが
エラーの時に吐き出される文字列が入ってプログラムが止まります

while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){
データに対して処理
}

データ
1 2 3
1 4 5
1 * 6
1 5 6

アスタリスクで止まってしまうのですが
どなたか、回避方法教えてくださいませんか
125デフォルトの名無しさん:2006/03/03(金) 14:19:51
>>124
%c, %sで読んで、*か判定して数値に変えたら?
126デフォルトの名無しさん:2006/03/03(金) 14:31:02
xyzをstr[]にして、atoiとかで変換ということで上手くいくでしょうか?
*か判定するのがstr型だとどうなるのか…そこのところの例とか見せていただけませんか
127デフォルトの名無しさん:2006/03/03(金) 14:38:52
>>126
エラーがあるかだけ判断する方法。
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.
}
}
128デフォルトの名無しさん:2006/03/03(金) 14:41:23
>>127
ありがとうございます。参考にしてやってみます
129デフォルトの名無しさん:2006/03/03(金) 14:46:58
>>125
こんな感じか

#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;
}
130デフォルトの名無しさん:2006/03/03(金) 14:58:56
>>127
個別に検出
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. */}
}
131ごめんなさい:2006/03/03(金) 15:14:34
プログラムを一緒にコンパイルする方法がわかりません
入門書にも載ってない
132デフォルトの名無しさん:2006/03/03(金) 15:32:01
>>131の意味が分からない。
日本語から勉強してきてね。
133デフォルトの名無しさん:2006/03/03(金) 15:39:03
>>131
コンパイラのマニュアルを読むべし。
134デフォルトの名無しさん:2006/03/03(金) 15:57:10
>>129-130
なんとか無事にできました
これまでchar→数へ変換したことが無かったので、勉強になりました
ありがとうございました
135デフォルトの名無しさん:2006/03/03(金) 17:15:35
コンパイラノマニュアルないお;;::::::::::::::::::::
C言語の入門書ってそういうと個おざなりだよな
136デフォルトの名無しさん:2006/03/03(金) 17:27:03
>>135
コンパイラ何使ってる?

>C言語の入門書ってそういうと個おざなりだよな
コンパイラによって違うんだから書きようがないだろ。
137デフォルトの名無しさん:2006/03/03(金) 17:28:22
コンパイラの入門書を読めばよかったのに
138デフォルトの名無しさん:2006/03/03(金) 18:06:07
あ、そっかコンパイラってたくさんあるんだっけ
cigwynって奴とBorland C++ Compilerって奴
このcigwynはC言語入門とかについてきた奴だからマニュアルがないし
Borland C++ Compileって奴もウェブのC言語入門の奴に入れとけって書いてあっただけ
コンパイルの方法も書いてない
139デフォルトの名無しさん:2006/03/03(金) 18:17:16
・Cygwin
→Cygwin関係のみならず、Linux関係、Unix関係の入門書でことが足りる。
#不明な点はCygwinスレへ。

・BCC
→BCC関連の書籍もあるはずだし、これもやはりBCCスレがある。


結論:
調べもしないでぐだらぐだらいってんじゃねぇ。
140デフォルトの名無しさん:2006/03/03(金) 18:46:39
>>138
cygwinはコンパイラじゃない。コンパイラはgcc。
gccだと、
gcc foo.c bar.c
という具合にすれば良い。
BCCは知らんが、似たようなものだろ。

>>139
コンパイルのしかたが分からんと言ってる奴にLinux, Unixの入門書を勧めてどうするんだ?
141デフォルトの名無しさん:2006/03/03(金) 18:49:59
>>140
コンパイルの仕方くらい出てるべ。
142デフォルトの名無しさん:2006/03/03(金) 18:50:02
gcc foo.c bar.c だと、a.out がデキルケドナー
143デフォルトの名無しさん:2006/03/03(金) 18:52:27
cygwin だとa.exeだった希ガス
144デフォルトの名無しさん:2006/03/03(金) 18:52:59
なんで無知な奴ほど特殊な環境使うの?
145デフォルトの名無しさん:2006/03/03(金) 18:55:02
何が一般的な環境かも知らないから。
146デフォルトの名無しさん:2006/03/03(金) 19:17:53
>>139うるせー馬鹿答えやがれ コンパイルできないっつってんじゃん調べてよ
>>140そのコマンドひらめいて試したけどできなかった。
>>144無知で悪かったな。じゃあお高く留まってるお前が手ほどきしてくれぃ
>>145一般的な環境について詳しく
つーか標準的な環境教えてよ
そうすりゃこんなUZEE質問しないんだからさ〜
147デフォルトの名無しさん:2006/03/03(金) 19:24:16
ただ「できない」と書かれても、「エスパーきぼんぬ」としか答えられん。

コマンドラインとか環境変数とかPATHとかからはじめないとならないのかな・・・
148デフォルトの名無しさん:2006/03/03(金) 19:37:22
逆ギレする無能ほどたちの悪い物は無い。
149デフォルトの名無しさん:2006/03/03(金) 20:02:05
>つーか標準的な環境教えてよ
>そうすりゃこんなUZEE質問しないんだからさ〜
「優しくしてくんなきゃ暴れるぞ!」みたいな。
150デフォルトの名無しさん:2006/03/03(金) 20:47:35
おねがいだよおおおおおお
bcpadっていうの使ってるんだけどできないの
151デフォルトの名無しさん:2006/03/03(金) 20:48:32
わkった。じゃあ標準的なC言語を学べる環境を教えて
それ用意してprintfカラ勉強しなおすから
152デフォルトの名無しさん:2006/03/03(金) 21:00:05
別に勉強しなくてもいいと思うよ
だってお前が出来なくても、お前以外誰も困らないし


つーか氏ねば?^^
153デフォルトの名無しさん:2006/03/03(金) 21:16:48
勉強しようと思ってる人間が他人に聞くのか。
おまえには無理だから諦めろ。
真性厨房ウザいし。

家に帰ってママのちんちんでもしゃぶってろよw
154デフォルトの名無しさん:2006/03/03(金) 21:35:26
またわけのわからんこと言う
155デフォルトの名無しさん:2006/03/03(金) 21:46:09
>>151は基地外のリア厨だろ
親も頭オカシイからこんな基地外のガキにネット環境を与える
基地外一家だな
156デフォルトの名無しさん:2006/03/03(金) 22:09:45
あれ・・・ここって厨房板?
>>152->>155
こういう奴がいるからだめなんだよな。フゥ
>>151
出直して来い。としか言いようがない
ここは2chのなかでも頭のおかしい基地外が多いから(自分が頭がいいと思ってる
本当に勉強したいならハテナとかあるからそこできいたほうがいいよ
157デフォルトの名無しさん:2006/03/03(金) 22:28:27
したり顔で溜息ついてみせる奴が一番寒いレス書く傾向は
どの板も変わらんな。
158デフォルトの名無しさん:2006/03/03(金) 22:43:32
>>146
標準的な環境?ないよ。どいつもこいつも一長一短。
山ほどのコンパイラがあり、それだけ選択肢があることがC/C++の利点でもあり欠点でもある。
159デフォルトの名無しさん:2006/03/03(金) 22:50:20
>>157
刺激すんな、暴れる厨房がまた増える。
160デフォルトの名無しさん:2006/03/03(金) 23:04:53
try catch の仕組みって、どうなってるの?
勝手にいろいろと実現方法を妄想してたら、
なんかものすごくオーバヘッドが必要な気が・・・

考えすぎ?もっと単純にこの仕組みは、実現できるの?
161デフォルトの名無しさん:2006/03/03(金) 23:08:15
if (関数()==エラー定数)
{
  エラー時の処理
}
162デフォルトの名無しさん:2006/03/03(金) 23:08:20
つ[ 逆アセンブラ ]
163デフォルトの名無しさん:2006/03/03(金) 23:10:43
>>160
ISO/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"
164デフォルトの名無しさん:2006/03/03(金) 23:11:17
>>160
ぱっと思いつく方法はsetjmp〜longjmpにデストラクタの呼び出しをくっつけること。
どうくっつけるかが問題だけど。
165デフォルトの名無しさん:2006/03/03(金) 23:42:41
普通に例外つきの関数書いてアセンブラ出力読めば?
166デフォルトの名無しさん:2006/03/04(土) 07:33:10
C++で質問です。
クラスライブラリ(?)を使用してファイルオープンさせたいときは
 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を使うということなんでしょうか?


167デフォルトの名無しさん:2006/03/04(土) 07:58:16
言語と環境の区別がついているか微妙だな。
168デフォルトの名無しさん:2006/03/04(土) 08:02:11
typedef void *HANDLE;
と定義されてる
typedefはわかるよな?
169デフォルトの名無しさん:2006/03/04(土) 08:35:58
>168 typedef int seisuu; のような使い方はわかります
typedef void *HANDLE; の意味よくわかりません
170デフォルトの名無しさん:2006/03/04(土) 09:00:43
>>169
void*型は知っているか?知らなければそういう型があることを覚えておけ。

typedefは型に別名を付けるためのものだ。
168ではvoid*にHANDLEという別名を付けている。(ただしHANDLEは何からtypedefされているのかと言うことは本来どうでもいい)
かくしてHANDLEはHANDLEという型なのだ。
だからHANDLE hfile;はHANDLE型のhfileという変数の宣言になる。
171デフォルトの名無しさん:2006/03/04(土) 14:10:11
>>166
そもそも、後者はファイルのオープンじゃない。
172デフォルトの名無しさん:2006/03/04(土) 18:44:47
FindFirstFileって単にファイルをオープンしたい場合に
わざわざ使うようなAPI関数じゃないだろ
ファイル列挙の際には便利だが
173デフォルトの名無しさん:2006/03/04(土) 18:53:29
>>166
全然違います
っていうか定義を調べりゃ分かるだろ
174デフォルトの名無しさん:2006/03/04(土) 19:47:17
おまいら釣られすぎ・・・
175デフォルトの名無しさん:2006/03/04(土) 19:54:51
Win32プログラミング って書いてある本を買って来い。
176デフォルトの名無しさん:2006/03/05(日) 01:41:46
>>168 >>170
ありがとうございました。理解できました。
typedef宣言入門レベルより上のレベルの本かってきたら
typedef void の使い方掲載されていました。


>>171 >>172
すみません、CreateFile()の間違いでした。徹夜してたもんで・・・

だけど、これは WIN32_FIND_DATAの構造体の変数w32fdを宣言したと考えていいのでしょうか?
WIN32_FIND_DATA w32fd;
hfile = FindFirstFile("a.txt",&w32fd);

177デフォルトの名無しさん:2006/03/05(日) 02:12:41
>>176
いいんでないかい。宣言つーか定義だし、
FindFirstFile()で値をセットするための入れ物程度の意味だけど。
178デフォルトの名無しさん:2006/03/05(日) 03:24:00
夜遅くお願いいたします。
UNIXのsched_yield関数やWindows SDKの
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
のように、他のタスクに処理を渡す関数のwindowsコンソールアプリ版を探しています。
一応Windows SDKは利用しているのですが、上記のソースを書くとCPUが振り切れます。
何が使えますでしょうか?
179デフォルトの名無しさん:2006/03/05(日) 06:16:09
PeekMessage止めてGetMessageに汁
180デフォルトの名無しさん:2006/03/05(日) 06:54:50
>>178

CPU負荷率はメッセージを握ると一気に100%になる。
大体、コンソールアプリで、そこまで単純なメッセージループを作成する意図が良くわからないけど、
いったい何をしたいの?

他のタスクに処理を渡すなら、Sleep(0);とかになるけど。まさか、Win16じゃないよね?
181デフォルトの名無しさん:2006/03/05(日) 10:04:43
初歩的な質問で申し訳ないですが、
char str[] = "-1.1234567890123456e+000";
な%1.16e形式の文字列をそのままdoubleに変換するにはどうしたらいいですか?
sscanf(str, "%1.16e", num);
とかやってみましたがうまくいきませんでした
182デフォルトの名無しさん:2006/03/05(日) 10:19:23
>>181
sscanf(str, "%1.16e", num);

sscanf(str, "%1.16e", &&&&&&&&&&&&&&&&&num);
と&を17(1+16)個並べれば逝ける。
183デフォルトの名無しさん:2006/03/05(日) 10:49:25
BYTE bd[1024]を初期化する際、
BYTE bd[1024]="test";
という風な書き方はできるようなのですが、
char* hoge(char *age)
な感じで関数の引数としてもらってきたageの内容をBYTE bdに入れたい場合、
どうやってキャスト(っていうんでしょうか?)して入れたらよいでしょうか?
(BYTE bd の初期化と同時に入れなくてもかまいません。)
教えてくださいお願いします。
184デフォルトの名無しさん:2006/03/05(日) 10:54:29
>>183
完全に勘で答えるが、
strcpyとかいいんじゃない?
185デフォルトの名無しさん:2006/03/05(日) 10:55:17
>>183
コピーしたいならstrcpy
bdを経由して*ageを書き換えたいなら代入
186デフォルトの名無しさん:2006/03/05(日) 10:56:44
>>185に自己レス
後半は無視してくれ。寝ぼけてた
187デフォルトの名無しさん:2006/03/05(日) 10:58:15
>>183
ポインタと配列について勉強するといいよ。
188デフォルトの名無しさん:2006/03/05(日) 11:25:34
>>182
: error C2059: syntax error : '&&'
と出ますたorz
189デフォルトの名無しさん:2006/03/05(日) 11:31:25
>>188
少なくともCでは仕様でトークンの区切りが曖昧なときは
なるだけ長く取るというように規定されてるから
あれだけ&が並んでれば&& && && &&(略)と解釈されるだろうな
190デフォルトの名無しさん:2006/03/05(日) 11:54:31
  .。oO(どうすればいいのだろう・・・)
191デフォルトの名無しさん:2006/03/05(日) 12:18:44
std::string str;
std::cin >> str;
このとき入力された文字列の中にエスケープシークエンスがあれば
有効にしたいんですけどいい解決法教えてエロイ人!
192183: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 です。よろしくお願いします。
193デフォルトの名無しさん:2006/03/05(日) 13:29:27
>>192
+1するのは、文字列の最後を表す'\0'が入る領域を取らないといけないからでは。
そしてhoge関数の中では、+1をしていないから、落ちるのでは。
194デフォルトの名無しさん:2006/03/05(日) 13:36:22
>>188
「&」をいくつも並べるときは、間にスペースを挟んでおかないと、
コンパイラが「&&」と誤認識するよ。
他にも、テンプレートの実体化、つまり、「map<int, vector<int> >」とかの「>」もそう。
195183:2006/03/05(日) 13:44:41
>>193
レスありがとうございます。
strlenは終端文字は含まないんですね。+1する意味は納得できました。
で、改造の方で落ちるのは「+1」をした場合です。
さっきまでよく意味がわかってなかったので
+1をとりあえず外してみたら動いたのですが、
すると結果がちょっとサンプルとずれたものになりました。
(+1してないので違って当然ですが)
やはり+1をしたほうが正しいはずですが、
そうしたときになぜ落ちるのかが分かりません。
196183:2006/03/05(日) 13:55:32
なんかよくわかりませんが、

BYTE pbData[1024]="";

と、とりあえず何も入れないで初期化するようにしてみたら
+1しても落ちなくなり、結果もサンプルと同じになりました。
でも理由がわからないのですっきりしません。
どなたか分かる方が居たら教えてください。お願いします。
197デフォルトの名無しさん:2006/03/05(日) 14:00:50
>>180
void 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が振り切れることはなくなりましたが、こんなんでいいのでしょうか。
198デフォルトの名無しさん:2006/03/05(日) 14:08:47
>何も入れないで初期化

'\0'を入れてるが、何か?
199183:2006/03/05(日) 14:13:48
>>198
あ、そういう意味になるんですね。
それで、それを入れたときと入れないときで
どういう意味的なというか、処理上の違いが出てくるのでしょうか?
とりあえず意味も理解しないで適当にやってみただけなので。。。
どうしてそうしないと落ちるのでしょうか?
200デフォルトの名無しさん:2006/03/05(日) 14:16:53
文字列を操作してるんだろ?
なんらかの文字(0文字を含む) + 終端'\0' が文字列だって知らないの?
201デフォルトの名無しさん:2006/03/05(日) 14:22:14
>>199
つまり、終端が入っていないと、どこまで読めば終わりか
分からないってことだ。極めて初歩の内容なので、しっかり
復習しておいた方がいいと思われ。
202デフォルトの名無しさん:2006/03/05(日) 14:22:23
>>194
error 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);
}
203183:2006/03/05(日) 14:23:52
>>200
知ってますが件の不具合とそれがどう関連してるのかわかりません。
204183:2006/03/05(日) 14:26:23
>>201
でもエディットボックスから取ってきた文字列を
strcpyした時点で終端文字もコピーされてるんじゃないのでしょうか?
205デフォルトの名無しさん:2006/03/05(日) 14:32:39
BYTEpbData[1024];
こうやった時に何が入ってると思ってんだ?

BYTE pbData[1024]="";
こうやったら '\0' が入るのは理解したんだよな?
206デフォルトの名無しさん:2006/03/05(日) 14:42:41
environ変数ってwindowsでも使えますか?
207>204:2006/03/05(日) 14:43:33
>エディットボックスから取ってきた文字列
こっちが終端ないのかな?
208183:2006/03/05(日) 14:44:18
>>205
>BYTEpbData[1024];
>こうやった時に何が入ってると思ってんだ?
分かりませんorz
何も入ってないんじゃないかと。
何も入ってないところにstrcpyで終端文字を含む文字列がコピーされるんじゃなんいでしょうか?

>BYTE pbData[1024]="";
>こうやったら '\0' が入るのは理解したんだよな?
""は文字列の印で、とりあえず文字は空で終端文字列だけ代入されてるんだろうな、というくらいの理解です。
209183:2006/03/05(日) 14:53:27
>>207
調べてみたらGetDlgItemTextは終端を含まないみたいですね。
でも、そうなると
BYTE pbData[1024]="";
で初期化したところで
終端含まない文字列(らしきもの)をstrcpyして
どうして上手くいってるのでしょう?
210183:2006/03/05(日) 14:57:36
すいません、>>209は違いました。
GetDlgItemTextで取得した文字列にはちゃんと終端が含まれるようです。
この関数自体の戻り値として、「終端を含まない文字数」が返るのだそうです。
211デフォルトの名無しさん:2006/03/05(日) 15:12:09
>>202
めんごめんご。

最初の質問を見ずに、>>188>>189から勝手に想像して答えちゃったよ。

ttp://www.kouno.jp/home/c_faq/c12.html#13
212デフォルトの名無しさん:2006/03/05(日) 15:19:11
>>208
>何も入ってないんじゃないかと。
話にならん。出直してこい
213デフォルトの名無しさん :2006/03/05(日) 15:23:16
つうかなんで答えるほうも小出し小出しで勿体ぶってんの?
分からないなら答えるなよ。
214デフォルトの名無しさん:2006/03/05(日) 15:25:04
>>208の回答が全て間違っている件について
215183:2006/03/05(日) 15:28:25
あの、分からないから聞いてるんで、
間違ってたら教えてくださいorz
216デフォルトの名無しさん:2006/03/05(日) 15:33:44
>>211
でたゎぁ!!!
ありがd!!!

特許とったらこのスレで報告しまつ
217デフォルトの名無しさん: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);
218217:2006/03/05(日) 15:52:51
あ、ごめん。
よく見たら、解決策のとこは間違いだ。
急いだので間違えた。
219デフォルトの名無しさん:2006/03/05(日) 16:02:37
>>216
ちょっとまて。特許って?ひょっとしてすげーエロい人?
220183:2006/03/05(日) 16:05:09
>>217
はい。その辺の事です。
で、+1の件はとりあえず解決はしたんですが、
BYTE pbData[1024]; のように初期化しないと落ちて
BYTE pbData[1024]="";のように初期化すると落ちない
ってことの意味がよく分からないんでスッキリできないんですが。
221デフォルトの名無しさん:2006/03/05(日) 16:15:23
>>220
だから出直せと言っただろうが
ついでだから書いておくと、未初期化変数の内容は保証されない
配列を""で初期化することは{ '\0', }で初期化と同値
これの結果がどうなるかすら分からんのなら回線切って氏ね
222183:2006/03/05(日) 16:17:17
教える気がねぇならいちいち出てくんなよ。うぜぇ。
223デフォルトの名無しさん:2006/03/05(日) 16:18:16
>>220 は何も質問してないんだからスルーでいいだろ。
224183:2006/03/05(日) 16:18:58
>>223
日本語読めないのですか?
225デフォルトの名無しさん :2006/03/05(日) 16:22:52
初期化しないと0で初期化されるんじゃないの?
226デフォルトの能無しさん:2006/03/05(日) 16:24:16
>>225
されないよ 試してみな
227デフォルトの名無しさん:2006/03/05(日) 16:25:08
228デフォルトの名無しさん:2006/03/05(日) 16:25:23
>>224
ガタガタ言わずにヌルターミネートについて調べてこいヴォケ
229183:2006/03/05(日) 16:29:34
>>228
知ってるなら教えろよボケ。
答えねぇなら偉そうにいちいち書き込むな。
ウゼーだけだから。
230217:2006/03/05(日) 16:31:40
なんか火に油注いじゃったみたいだけど、

>>220
なんか情報が錯綜しててわかりにくいんだけど、
落ちる場合の192のhoge関数の先頭3行のコードと
どの辺で落ちてるか提示して。
231183:2006/03/05(日) 16:33:23
初期化してないがために中身がゴミであっても
strcpyでヌル文字含んだ文字列いれたんだから
それでいいんでないのですか?
232デフォルトの名無しさん:2006/03/05(日) 16:46:57
できればOSやコンパイラなど、もう少し情報があった方がいいと思うんだけど。
233デフォルトの名無しさん:2006/03/05(日) 16:53:25
誰か>>183の話をまとめて。
234183:2006/03/05(日) 16:57:48
>>230
192で落ちると書きましたが、実際は↓のように書いたときは落ちなくて、
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してるんだから
問題はないのではないのかなと。
235デフォルトの名無しさん:2006/03/05(日) 17:02:07
>>234
そもそもpbDataをどう利用するのかすら分からんのに答えられる訳が無い
このスレにエスパーが居るとでも思ってるのなら氏ね
236183:2006/03/05(日) 17:11:17
>>235
BYTE pbData[1024]を初期化するかしないかで
DWORDdwDataLen = (DWORD)strlen((char*)pbData) + 1;
の部分で落ちるか落ちないかが決まっているのですから、
そこまでの手続きで既に何か違いが出ているのは明らかで、
初期化した時にはそれ以降きちんと動いて
望みどおりの結果が得られていると言っているのですから、
pbDataのその後の利用法は関係ないと思うのですが。
237デフォルトの名無しさん:2006/03/05(日) 17:12:07
>>236
そこで落ちると言うことはほんとに確認したのか?
238デフォルトの名無しさん:2006/03/05(日) 17:17:47
#include <assert.h>

int main()
{
int a = 1; // a = 0だと異常終了する

/*
>>235はここまで読めば、なぜa = 0だと異常終了するのか答えられるんだよね。
すごいなあ。
*/








assert(a == 1);
return 0;
}
239デフォルトの名無しさん:2006/03/05(日) 17:28:43
>>237
あれだけ断言しているんだから、確認したんじゃない?
240183:2006/03/05(日) 17:30:04
>>237
普通の文字列もらってきてるだけですから、
strlenに+1をしないといけないのは正しいですよね?
で、BYTE pbData[1024]をきちんと初期化しない時は
strlenに+1をすると落ちてしまうのですから、
そこまでの処理で既に違いが出ているのは明らかですよね?
だって違いはそこ以前の部分だけですから。
初期化をきちんとして、strlenに+1をすれば
正しい結果も出ているのですから、その後の処理も正しいと思います。
っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
キレられてたんですが、そこではないのですか。
241デフォルトの名無しさん:2006/03/05(日) 17:34:59
>>240
だからまさにその「strlenの行」で確かに落ちてることを確認したのかと聞いてるわけだが?
242217:2006/03/05(日) 17:35:00
>>234,236
いまやってるのは217で書いたような「暗号化」なんだろ。

暗号CryptEncrypt、復号CryptDecryptの両関数は
文字列ではなく単なるBYTE配列を扱うものだから、終端がどうのこうのは関係ない。
(\0で元データの長さを判断しているわけではない)
だからCryptEncryptには第六引数にdwDataLenで長さを指定して
その長さを見て暗号化してるんだと思うよ。
+1してるのは\0の範囲まで暗号化する意思を示しただけであって、
+1しないで暗号化しても何ら構わないはず。

今こっちでVC6,Win2000で確認したところやはり落ちない。
もう一度書くけど、
落ちてるんだとしたらどこで落ちてるか提示して、
落ちるケースのhoge関数の先頭3行ずばりそのものを192と同じように書いてくれ。


>>240
>っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
>キレられてたんですが、そこではないのですか。

ほかの回答者の方々は「暗号化」の問題だと知らない時点で
回答してくれてるんだから、そのような判断をするのはしかたがない。
一般的な文字列の問題だと思って回答してくれてるんだから。
そっちが情報を出さないのが悪い。
243デフォルトの名無しさん:2006/03/05(日) 17:36:32
このやりとりよりソースが長いとも思えんなw
もうアップすればいいじゃんw
244217:2006/03/05(日) 17:38:59
>>243
217のリンク先のコードちょっと改変しただけ。
VC6で80行弱なんだが、どう貼り付けたらいいんだっけ?
245デフォルトの名無しさん:2006/03/05(日) 17:40:05
宿題スレのうpろだ使えばいいんじゃないか?
246デフォルトの名無しさん:2006/03/05(日) 17:41:10
>>192
#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;
}

ってコードを書いてみたけど落ちないよ。
なんで原因は別のところにあるんじゃない?
247デフォルトの名無しさん:2006/03/05(日) 17:41:29
リンク先があるなら、答える人はリンク先を見ればいいかもね。
・・・私はあまりに情報を小出しにするので、悪いけど下ろさせてもらいまする
248デフォルトの名無しさん:2006/03/05(日) 17:54:16
>>240
初期化してない場合その中がどうなってるのか、見てみればいい
249217:2006/03/05(日) 17:54:59
宿題アプロダーにアップした。
検証してくれ。環境はVC6+Win2000で質問者と同じようだ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1679.txt

>>192のエディットボックスうんぬんは本質とは関係ないのでコンソールで検証してみた)
250デフォルトの名無しさん:2006/03/05(日) 18:10:17
>>249
VC8のclに/link advapi32.lib付けて試したが
コンパイル・実行ともに問題なかった
strcpyで警告は出てるがな
251デフォルトの名無しさん:2006/03/05(日) 18:17:51
まさかとは思うが Unicodeオプションとかじゃなかろうなぁ...
252183:2006/03/05(日) 18:38:22
>>249
わざわざすいません。
試してみましたが、ちゃんと動きました。
何が違うのかわかんないのでUPしてみました。
txtだとUPできないのでjpgになってます。そのまま読めると思います。
ttp://gamdev.org/up/img/4875.jpg
253デフォルトの名無しさん:2006/03/05(日) 18:41:53
> txtだとUPできないのでjpgになってます。そのまま読めると思います

キミは実にバ(以下略
254デフォルトの名無しさん:2006/03/05(日) 18:48:36
戻り値がchar*の時点で怪しいと思ってたけどな。
255デフォルトの名無しさん:2006/03/05(日) 18:52:22
char*を受け取ってるから戻り値char*でも悪くはない気はする
256デフォルトの名無しさん:2006/03/05(日) 18:53:12
俺の脳内コンパイラが>>252は73行目で落ちるとWarn出してるんだが
おまいらはどうよ?
257183:2006/03/05(日) 19:12:28
>>254
どうするのが正しいとされてますか。
258183:2006/03/05(日) 19:18:34
>>253>>254
小出しに答えるな糞野郎。
259デフォルトの名無しさん:2006/03/05(日) 19:23:26
char*云々はモンダイなくね?
260183:2006/03/05(日) 19:27:47
>>259
仮にそこで問題が出るとしても、
そこで問題が出るに至った根本原因は
例の三行くらいの改造個所の部分しかないと思います。
そこをオリジナルのままにすれば落ちないで正常に結果も出るのですから、
少なくとも改造した個所は
オリジナルとは意味的に異なる事をしているのは明らかだと思います。
261デフォルトの名無しさん:2006/03/05(日) 19:29:47
>>259
俺もchar*云々関係ないと思う。
262デフォルトの名無しさん:2006/03/05(日) 19:30:46
>>183
おそらくだけど・・・
CryptEncryptはpbDataをdwDataLen分だけ暗号化するんだけど、
そうするとこの場合は文字列終端の\0まで含まれちゃう。
pbDataを初期化している場合はpdData[dwDataLen+1] が\0だから、一応ヌルターミネイト文字列になるんだけど、
初期化されてない場合は\0が無いので、その後のstrlenで落ちてしまうんじゃないかな?
サンプルだとpbDataはたいてい初期化されてるね。

で、この場合の解決策は
1) 暗号化するデータ長に+1を足さない
2) pdDataを事前に初期化(pdData[dwDataLen+1]=\0ならOK)する
のどちらかがいいと思う。
263デフォルトの名無しさん:2006/03/05(日) 19:37:24
なぁ、どうせコピーした文字列の長さを取得してんなら、
strlen(plaintext)でやっときゃpbDataの初期化だなんだと騒がなくていいじゃねぇかとか
そう思った俺は異端なのか?
264デフォルトの名無しさん:2006/03/05(日) 19:43:18
>>263
異端じゃないと思う。ただ理由は知らんが、どのサンプルソースをみても
暗号化バイト長 = 文字列長 + 1
となっている。
265183:2006/03/05(日) 19:50:09
>>262
では242の方のソースではなんで落ちないのでしょう?
このソースでもpdDataは初期化されてないようですが。
266183:2006/03/05(日) 19:51:00
>>262
更に、データ長に+1を足しても足さなくても落ちません。
267デフォルトの名無しさん:2006/03/05(日) 19:53:41
ていうか、このAPIの仕様は良く知らんが
暗号化後のデータをヌルターミネイト文字列扱いするのがまずいんじゃね?

暗号化後のデータって普通、ヌルターミネート文字列じゃなくて、単なるバイナリだと思うんだが・・・
268デフォルトの名無しさん:2006/03/05(日) 19:58:33
ねぇ。
もうバイナリになった時点でどこに0がくるかこないかわからないからねぇ。
269デフォルトの名無しさん:2006/03/05(日) 19:59:57
>>265
CryptEncrypt後のpdDataに対してstrlenを使ってないからじゃない?
270217:2006/03/05(日) 20:06:20
>>252
「初期化する・しない」と「+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で表示される。

続く
271183:2006/03/05(日) 20:09:07
>>269
初期化してなくてもstrcpy使って文字列入れてる時点で
ヌル文字は入ってると思うのですが。
272デフォルトの名無しさん:2006/03/05(日) 20:13:09
こんなもうおかしいのがわかってるプログラムの変更に検証なんているのだろうか?
273デフォルトの名無しさん:2006/03/05(日) 20:13:51
>>271
+1してた場合ヌル文字も一緒に暗号化するから、
暗号化後のヌル文字はヌル文字では無くなってしまうのよ。
274217: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に説明してやってるの。
275183:2006/03/05(日) 20:20:56
>>273
ああ、そういうことですね。納得しました。
276183:2006/03/05(日) 20:33:58
>>217
お手数をおかけしました。納得しました。
初期化とその後の処理で違いが出るのも理解しました。
ありがとうございました。

ところで単純に
char a[1024];
SetDlgItemText(hDlg,IDC_CIPHERTEXT,a);
とテストしてみたら「フフフフフフ・・・・」でしたが落ちませんでした。
277デフォルトの名無しさん:2006/03/05(日) 20:37:50
落ちるのは、returnのところのstrcpyじゃね?
plaintextはスタックにあるし。
278デフォルトの名無しさん:2006/03/05(日) 20:40:50
つか、デバッガでちゃんとみればすぐにわかったバグだよね。
279183:2006/03/05(日) 20:41:45
>>278
デバッガの使い方を今回覚えましたorz
それで納得できました。
280デフォルトの名無しさん:2006/03/05(日) 20:47:29
最初の方であれだけ値はどうなってるの?とか
ホントにそこで落ちてるの?とか聞かれてたのに終わってみれば
結局確認してないわけねw
おもしろいな。お前。
281217:2006/03/05(日) 20:48:46
>>277
ごめん、落ちるのそこ。
282183:2006/03/05(日) 21:05:21
>>280
うるせーよ野郎のくせして小姑みてぇに
ボソボソ言いやがってよ。
283デフォルトの名無しさん:2006/03/05(日) 21:08:17
何はともあれ解決してよかった。
284デフォルトの名無しさん:2006/03/05(日) 21:09:56
>>282
そりゃてめーだろ。
そんなもん実行して値確認すりゃ済む話なのになんでなんで聞きにきやがってアホかw
アフォ丸出しだなw
アフォの世界チャンピオンだなw
285183:2006/03/05(日) 21:17:42
>>284
すいませんでした。許してください。
286183:2006/03/05(日) 21:28:52
ところで今回みたいな場合の関数の文字列の受け渡しって
結局どうやって書くのが普通ですか。
なんか嫌味っぽく変だと言われたままなので気持ち悪いです。
287アフォの世界チャンピオン:2006/03/05(日) 21:30:06
ハンドルを間違えましたすいません。
288デフォルトの名無しさん:2006/03/05(日) 21:32:39
いつもstrcatとかで普通にうけとってんのと同じでいいんじゃねぇの?
289デフォルトの名無しさん:2006/03/05(日) 21:35:09
今回みたいなのとかはmemcpyとかと同じでいいんじゃね?
290デフォルトの名無しさん:2006/03/06(月) 06:32:28
質問も小出し
回答も小出し

中身空っぽのくせに、何をそんな隠し持とうとするの、君ら?
291デフォルトの名無しさん:2006/03/06(月) 06:37:46
質問が小出しなのに一発回答できるエスパー募集中
292デフォルトの名無しさん:2006/03/06(月) 07:01:07
>>290
昨日のアフォのチャンプかw
293デフォルトの名無しさん:2006/03/06(月) 09:18:01
途中で寝たが、結局落ちてる行は確認してなかったんだな
しかも俺がreturnの所のstrcpyで落ちると言ってるのにスルーしてるしな
294デフォルトの名無しさん:2006/03/06(月) 10:24:20
>>291
頭わるいなぁ・・・
ここでいう回答が小出しというのは、不完全な質問に完全な回答が無いということではなく
今自分ができる回答の中から言葉を小出しにし、それによって混乱気味の質問者を
さらに混乱に落とし込んで流れを余計しっちゃかめっちゃかにする言動のことだよ

回答者ならアフォでも許されるというわけではないよ
馬鹿は馬鹿にされる
295デフォルトの名無しさん:2006/03/06(月) 10:28:09
あーでもこれ、アホ回答者は論理を捨てて必死に煽り出すだろうなぁ・・・
彼らにメチャクチャ都合悪いのに、論理的に完全だもんなぁ・・・
296デフォルトの能無しさん:2006/03/06(月) 10:28:10
能無しはカエレ
297デフォルトの名無しさん:2006/03/06(月) 10:29:06
>>296
はいご苦労さん

ま、できもしない回答をするから痛い目に遭うんだ
298デフォルトの名無しさん:2006/03/06(月) 10:32:48
これが春厨って奴か
299デフォルトの名無しさん:2006/03/06(月) 10:34:58
投下したジャッジはそれ自体もジャッジされる、という事実に気付いてない人は意外と多いのだよ
他人の不完全性を一方的に叩くだけでいられる、自分の言動は一切不問だ、と思ってた奴に
お前アイツと同じ不出来を持ってるよ、と華麗に指摘したあとのファビョりようは各板共通
300デフォルトの名無しさん:2006/03/06(月) 10:37:07
ここにも春厨って湧くんだな
301デフォルトの名無しさん:2006/03/06(月) 10:46:35
以後しばらくの間
なんか切れちゃってる人の
不思議系一行レスが続きます
302デフォルトの能無しさん:2006/03/06(月) 10:50:17
>>297
この人妄想癖でもあるのかな?
ま、俺は回答したことがないわけだが。

>ま、できもしない回答をするから痛い目に遭うんだ
すました回答しても妄想厨は妄想厨
303デフォルトの名無しさん:2006/03/06(月) 10:54:15
妄想でしかレスできねぇ香具師を相手にすんな。同情を求めてるだけだから。
304デフォルトの名無しさん:2006/03/06(月) 10:55:23
見事に煽りばかりになったな
すべて書いた通り
305デフォルトの名無しさん:2006/03/06(月) 11:01:40
なんか自分ができると思ってる馬鹿が多いような気がする。
そういう奴が一番痛い。
自分ができないことを分かってないからな。
中途半端でも回答して、
その批評を期待してる奴のほうが向上心があってまだマシ。
306デフォルトの名無しさん:2006/03/06(月) 11:07:10
目クソ鼻クソの煽り合いは他でやってくださいよ、と


/*------------------------------------------------------------*/
次の方、どうぞ
307デフォルトの名無しさん:2006/03/06(月) 12:12:25
>>293
お前そんなこと言ったっけ?
308デフォルトの名無しさん:2006/03/06(月) 12:19:43
309デフォルトの名無しさん:2006/03/06(月) 12:25:16
>>308
行数なんかシラネってヌルーしてた
310デフォルトの名無しさん:2006/03/06(月) 13:30:48
で、なぜstrcpyで落ちるのか?
311デフォルトの名無しさん:2006/03/06(月) 13:35:27
310はヌルーしてくれ。
312デフォルトの名無しさん:2006/03/06(月) 13:35:57
だが、断る!
313デフォルトの名無しさん:2006/03/06(月) 13:41:42
文字列に終端がないからでそ。終了。
314デフォルトの名無しさん:2006/03/06(月) 13:46:43
自分から見て「実兄」の「嫁」の姉妹や兄弟は何ていいますか?
実兄の嫁は姉ですよね?
実兄と嫁の間の娘は姪ですよね?
315デフォルトの名無しさん:2006/03/06(月) 14:00:05
>314
スレタイ読め
316デフォルトの名無しさん:2006/03/06(月) 14:05:06
余談だが、あの暗号化のキーを一度ハッシュにする意味って何?
317デフォルトの名無しさん:2006/03/06(月) 14:33:19
>>314
> 実兄の嫁は姉ですよね?

義姉

> 自分から見て「実兄」の「嫁」の姉妹や兄弟は何ていいますか?

義姉妹や義兄弟
318デフォルトの名無しさん:2006/03/06(月) 15:25:53
・義姉(あね)
・義姉妹(しまい)
・義兄弟(きょうだい)
319デフォルトの名無しさん:2006/03/06(月) 15:31:29
ここから義姉にハァハァするスレになりました。
320デフォルトの名無しさん:2006/03/06(月) 15:58:20
しかしここから義妹にハァハァするスレになります
321デフォルトの名無しさん:2006/03/06(月) 16:51:55
>>317-320
カエレ
322デフォルトの名無しさん:2006/03/06(月) 17:36:00
>>321
カエラ
323デフォルトの名無しさん:2006/03/06(月) 18:11:51
てゆうか、いくらグチグチ付け加えたところで
質問者がデバッカも使えないアフォの世界チャンプだった事実は消せないわけですがなにか?
324デフォルトの名無しさん:2006/03/06(月) 18:16:48
と、タイトルを奪われた元チャンプは語るのであった。

/*------------------------------------------------------------*/
次の方、どうぞ
325デフォルトの名無しさん:2006/03/06(月) 18:27:33
浪速の弁慶かどうかは知らないが、
ただの悪ぶっているヤンチャ坊主だろ?
44秒で倒すと言ってるらしいが、
自分にはパワーも手数もあるから、負けるわけがない。
逆に俺の右アッパーをブチ込むよ。
326デフォルトの名無しさん:2006/03/06(月) 18:36:35
と、巨乳美女は語るのであった。

/*------------------------------------------------------------*/
次の方、どうぞ
327デフォルトの名無しさん:2006/03/06(月) 18:37:39
どうして朝しかハッシュポテトを売ってくれないのですか?
328デフォルトの名無しさん:2006/03/06(月) 18:39:45
ハッシュ?ハッシュとポテトがどう関係あるんだ?





ローソンのハッシュドポテトは少々脂っこい。
普通のハッシュドポテトよりかなり脂っこい。
329デフォルトの名無しさん:2006/03/06(月) 18:42:46
脂っこいというかネチネチしてるんだよな。
だがそれが旨い。
330デフォルトの名無しさん:2006/03/06(月) 18:44:49
ハッシュ
331デフォルトの名無しさん:2006/03/06(月) 18:45:51
age忘れた
332デフォルトの名無しさん:2006/03/06(月) 19:35:22
std::mapつかっとけ
333デフォルトの名無しさん:2006/03/06(月) 19:35:29
ハッシュドポテトは軽く揚げないとな。
#ホントは焼く方が油が少なくていいのだが。
334デフォルトの名無しさん:2006/03/06(月) 19:53:34
>>332
解決しました
335デフォルトの名無しさん:2006/03/06(月) 20:45:02
スタックトレースの処理を作ろうと思います。
スタック領域を見れば、どの関数から呼ばれたのかを解析できると聞いたので。
そこで、何か参考とすべきWebサイトはありましたら教えてもらえないでしょうか?

とりあえず、BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。
336デフォルトの名無しさん:2006/03/06(月) 20:47:54
>>335
> BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。

スタック構造に違いがある可能性が高いので、
その手順は踏めないと思われ。
337デフォルトの名無しさん:2006/03/06(月) 21:11:26
>>335
x86ならcall/ret命令。つまり、機械語かアセンブラについて解説してるページ。
ほかのCPUでも似たようなもん。
338デフォルトの名無しさん:2006/03/06(月) 21:31:29
return アドレスがどの関数内にあるか調べたらわかると思うけど、
SH とか ITRON とかどうなってるかシラネなので何とも。
339デフォルトの名無しさん:2006/03/06(月) 23:10:11
int形の割り算で端数切り上げで解を求めたいんですけど、どうすればよいですか?
340デフォルトの名無しさん:2006/03/06(月) 23:17:09
剰余を求めるか、固定小数点を使うといいんじゃないか?
341デフォルトの名無しさん:2006/03/06(月) 23:24:59
val % dev == 0 ? val / dev : val / dev + 1;
342デフォルトの名無しさん:2006/03/06(月) 23:27:05
>>339
(val + (dev - 1)) / dev
343339:2006/03/06(月) 23:59:31
>>340-342

ありがとうございます!!
344デフォルトの名無しさん:2006/03/07(火) 00:46:09
>>339
ところで、int形ってどんな形?
345デフォルトの名無しさん:2006/03/07(火) 01:01:45
>>344
1024TBの虚数型だ。
346デフォルトの名無しさん:2006/03/08(水) 01:02:02
C++でサイズn×n(nが可変)の二次元配列を引数に受け取る関数を作りたいのですが、この場合引数の型などはどうすればよいのでしょうか?
347デフォルトの名無しさん:2006/03/08(水) 01:02:37
すいません、sageてしまいました。
348デフォルトの名無しさん:2006/03/08(水) 01:06:00
>>346
vectorとかvalarrayとか使うのが吉。
349デフォルトの名無しさん:2006/03/08(水) 01:10:57
>>348
ありがとうございます。vector< vector<int> >ってところでしょうか。使ってみます。
350デフォルトの名無しさん:2006/03/08(水) 02:13:56
windows2000でVC8を使っているのですが、
DrawTextの関数を使うときの文字列を指定する2番目の引数の型がLPCWSTRに変換できませんとエラーが出ます。
むりやりキャストをすると表示はされるのですが文字化けしているようでした
VC6時代の本についてたサンプルでは#define DrawText DrawTextAとなっていて
エラーが出ることが無かったので
VC8のデフォルトの#define DrawText DrawTextWを↑の定義に直したら
エラーは出なくなったんですが、正しい対処の仕方ではない気がします。
本当はどうすればよかったのでしょうか。
351デフォルトの名無しさん:2006/03/08(水) 08:15:36
>>350
1. (正攻法)きちんとTCHARやTEXTを使ってプログラムを書く。
2. (逃げ技)プロジェクトのプロパティから文字セットの設定をUnicodeからマルチバイトへ変更する。
352デフォルトの名無しさん:2006/03/08(水) 08:32:15
派生クラスのインスタンスを生成する時に引数としてもらった値を
基底クラスのコンストラクタの引数にそのまま渡したいのですが
どうやって書いたらいいでしょうか?
353デフォルトの名無しさん:2006/03/08(水) 08:34:23
質問です。

構造体のコンストラクタで、以下の様な記述はありですか?

SHoge::SHoge()
{
 ZeroMemory(this, sizeof(SHoge));
}

大量のメンバ変数を持つ場合、初期化子を延々と並べると煩雑になります。
これ方法だと、メンバ変数を追加したときにも初期化し忘れることがないというメリットがあり、
特にデメリットも思い当たりませんでした。
ですが、こういった記述は見たことがなく、何か気持ち悪くて不安なのです。
354デフォルトの名無しさん:2006/03/08(水) 09:10:43
>>352
class Base
{
public:
    Base(int n) {}
};

class Derived : public Base
{
public:
    Derived(int n) : Base(n) {}
};

>>353
仮想関数を持っていたり、仮想継承していたり、メンバに非PODのクラスがあったり
(移植性を考えるなら)メンバにポインタ・参照・浮動小数点数があったりするのであればやめたほうがよい。
355デフォルトの名無しさん:2006/03/08(水) 09:45:11
>>354
>353はZeroMemory()の段階で移植性は捨てていると思われ。
356デフォルトの名無しさん:2006/03/08(水) 10:16:59
未定義動作。鼻から悪魔というやつかな。
357デフォルトの名無しさん:2006/03/08(水) 10:32:34
WIN32に依存しない形でsjis→UTF-8を行ってくれる関数はありませんか?
何か知ってる方がいましたら教えてください
358デフォルトの名無しさん:2006/03/08(水) 11:06:09
>>357
ICUを使うとか。
359質問:2006/03/08(水) 13:00:01
プログラムのSTEP数って何のことですか?
360デフォルトの名無しさん:2006/03/08(水) 13:11:58
COBOL換算の行数
361デフォルトの名無しさん:2006/03/08(水) 13:59:54
デバッガにSTEP実行ってあるだろ。
そこから考えればSTEP数が何かはすぐわかるだろ。

362デフォルトの名無しさん:2006/03/09(木) 07:26:55
あるクラスに void m_hoge(int); というメンバ関数があるとして、
この関数を外から呼べるようにポインタをGetできるような 関数って
どう書いたらよいでしょうか?(GetHogeとかいう名前にするとして)
363デフォルトの名無しさん:2006/03/09(木) 07:34:23
>>362
メンバ関数から関数ポインタは取れない。
メンバ関数へのポインタなら取れるが、これには
&classname::m_hoge
と書く。
364デフォルトの名無しさん:2006/03/09(木) 08:07:36
>メンバ関数から関数ポインタは取れない。
>メンバ関数へのポインタなら取れるが、

すいません、違いがよく分からないのですが…
365デフォルトの名無しさん:2006/03/09(木) 08:21:46
m_hogeが静的メンバなら、普通の関数とまったく同じ。
そうでない場合、メンバ関数へのポインタはただの関数へのポインタとは違う型。

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で。
366デフォルトの名無しさん:2006/03/09(木) 08:32:21
そもそも >>362 の「ポインタをGet」は関数ポインタのことなのか?
367デフォルトの名無しさん:2006/03/09(木) 08:46:31
>>365
なるほど。納得しました。
分かりやすくありがとうございました。
368デフォルトの名無しさん:2006/03/09(木) 10:13:54
test
369デフォルトの名無しさん:2006/03/09(木) 10:54:42
VC6で編集しています。エディタ内で開いているファイルを
外部ツールで編集した時に、「このファイルは外部のエディタで
変更されています。ロードしますか?」と、出て更新出来たと思うのですが、
これが全く出なくなってしまいました。

オプションの[外部でファイルの変更時、自動的に再ロード]の話ではなく、
更新自体が感知されていないようで…。

VC6というより、OS側の問題っぽい気もしますが…
原因を御存知の方、アドバイス頂ければ幸いです。
370デフォルトの名無しさん:2006/03/09(木) 11:04:54
>>369
これはひどいスレ違いですね
371デフォルトの名無しさん:2006/03/09(木) 11:12:06
日本語学校にワープロを教わりに来たようなもんだな
372369:2006/03/09(木) 12:08:40
ありゃ、IDE固有の質問もここで良かったと思ってました。
こちらに移動します
http://pc8.2ch.net/test/read.cgi/tech/1140269442/
373デフォルトの名無しさん:2006/03/09(木) 12:44:36
>>372
言語とIDEは別物。
374デフォルトの名無しさん:2006/03/09(木) 13:25:24
以前は普通に答えていたけどな
375デフォルトの名無しさん:2006/03/09(木) 13:35:06
俺はここでいいと思うけど、固有のスレのほうが答えられる人間がいるのではとも思う。
376デフォルトの名無しさん:2006/03/09(木) 16:18:01
>>375
> 俺はここでいいと思うけど

「アプリの使い方」と「C/C++」に何の関係があるのかと(ry
377デフォルトの名無しさん:2006/03/09(木) 18:09:52
Win32のアプリケーションです

ダイアログリソースでダイアログと、そのコントロールを作って、
コントロールに"〜のコントロールにマウスが乗った・外れた""フォーカスが入った"
などを調べたいとき、どうしたらいいですか?

最初、素直にダイアログプロシージャのWM_MOUSEMOVEメッセージから来るマウスの位置から調べようと思ったのですが、
Static Text以外のEdit Control上とか、Radio Button上とかではWM_MOUSEMOVEメッセージが来ないので…
378デフォルトの名無しさん:2006/03/09(木) 18:23:38
>>377
・サブクラス化
・WM_NCHITTESTを捕まえてポインタ位置とコントロール位置の比較

お好きなようにどうぞ

あとスレ違いな
379デフォルトの名無しさん:2006/03/09(木) 18:52:04
>>378
これはすまんでした。
え〜っと、WM_NCHITTESTもWM_MOUSEMOVEと同様に、
エディットコントロール上やラジオコントロール上だと、マウスのポインタ位置が取得できません…
(そもそもメッセージが来ない)

Win32APIスレに行ってきます…
380デフォルトの名無しさん:2006/03/09(木) 21:23:07
>>378
1も読めないアフォ
381デフォルトの名無しさん:2006/03/10(金) 00:14:07
一般的にどのレベルまでできるようになると
初心者から中級者、上級者というくくりになるんですか?
382デフォルトの名無しさん:2006/03/10(金) 00:16:44
>>381 そんなくくりは一般的には無い。そんなくくりに意味は無いから気にスンナ。
383デフォルトの名無しさん:2006/03/10(金) 08:46:19
自作のウィンドウシステムみたいなのを作ってるんですが、
どういう設計にしたらよいか分からないので教えてください。

まず、ウィンドウのパーツ(コントロールと呼びます)類のクラスがいろいろあります。
ボタンクラス、スクロールバークラス、フレーム(ウィンドウの枠)クラス、等です。
これらは全て共通の基底クラスから派生していて、その基底クラスには
「それぞれのコントロール類が発行するイベントメッセージを処理させる関数へのポインタ」
をメンバ変数として持たせています。

とりあえず「コントロール自身のID」と「メッセージの種類」を飛ばせればよいので
の関数ポインタの型は、「void (*)(int, int)」とします。

それでここが問題なのですが、
例えば「スクロールバークラス」の内部にメンバとして「ボタンクラス」のオブジェクトを持たせ、
上下左右のスクロールボタンとして使いたい場合、
このボタンオブジェクトが持つ「メッセージ処理関数へのポインタ」には
「スクロールバークラスのメンバ関数へのポインタ」を指定したいので、
「void (*)(int, int)」では型が合いません。

また、このウィンドウシステムをライブラリ化してユーザーに使ってもらうときなどを考えた場合、
ウィンドウをまとめて管理したいためにマネージャクラスなんかを作って
そのクラスのメンバ関数でメッセージ処理などをしたくなるでしょうから、その時も型の問題が出てきます。

こういう場合、皆さんだったらどういう設計にしますでしょうか?
何か使えるテクニックなどはありますでしょうか?
384383:2006/03/10(金) 08:51:27
もちろん、全てのメッセージ処理関数を
グローバルで定義すればこれでもいけるのですが、
それでは使い勝手も悪いし気持ち悪いので、
どうにかすっきりした方法があれば知りたいです。お願いします。
385デフォルトの名無しさん:2006/03/10(金) 08:52:23
わからないのに何で作ろうと思うんだろ・・・
386デフォルトの名無しさん:2006/03/10(金) 09:05:50
>>383
まず、既存のウィンドウ系システム(WindowsやX-Windowなど)が、
どの様な作りになっているのか、を調査するべき。
387デフォルトの名無しさん:2006/03/10(金) 09:51:46
>>383
void (*)(int, int)ではなく、boost::function<void (int, int)>にすれば解決。

え、ABI?何それ。
388デフォルトの名無しさん:2006/03/10(金) 09:56:59
この板に初めて来ました
私はある工学部の学生ですが,今の分野ではやりたい就職がないのでC言語をやろうと思ってます。
そこですぐに勉強を始めたいのですが,CやC++などはどの言語を勉強するべきなのでしょうか?
初めはどのような参考書から始めるべきですか?
389デフォルトの名無しさん:2006/03/10(金) 09:57:58
そんな理由で始められてもどうせ物にならないので、あきらめれ
390デフォルトの名無しさん:2006/03/10(金) 10:23:07
>>389
スルーで
391デフォルトの名無しさん:2006/03/10(金) 10:42:14
書店でC++ Primerを手に取る→重さにめげて挫折。

オススメ
392383:2006/03/10(金) 11:12:54
>>387
なんかとても便利そうなのですが、
それを使えばどんなクラスのメンバ関数へのポインタだろうが
グローバルで宣言された普通の関数へのポインタだろうが
入れられるんですかね?

とりあえず、
boost::function1<void,UINT> m_MsgFunc;
のように「メッセージ処理関数へのポインタ」のメンバ変数を定義して、
void SetMsgFunc(boost::function1<void,UINT> pfunc){m_MsgFunc = pfunc;}
と、ポインタのセッターを作って、
m_hoge->SetMsgFunc(&CBar::MsgFunc)
と呼んでみたらエラーがでました。(boostの中のほうで)
書き方はこれであってますでしょうか。

あとABIってなんですか。
これ使うとなんか問題があるんでしょうか?
393デフォルトの名無しさん:2006/03/10(金) 11:47:15
>書店でC++ Primerを手に取る→通学時に読破して無事ガテンの道へ

こうですか? わかりません。
394デフォルトの名無しさん:2006/03/10(金) 11:57:49
書店でC++ Primerを手に取る→頭上に持ち上げる→手を離す
395デフォルトの名無しさん:2006/03/10(金) 11:59:57
必要なページだけ破いて持ち帰ればいいんだよ
396デフォルトの名無しさん:2006/03/10(金) 12:03:47
>>388
スレ違い。
397デフォルトの名無しさん:2006/03/10(金) 12:07:35
>>392
メンバ関数呼び出しには this が必要になるんで、
いっしょに渡してやらないと呼び出せないだろ。
boost::bind, boost::lambda::bind 好きなの選んでバインドしろ。

あと、最低でも自分で調べてから聞こうな。
http://e-words.jp/w/ABI.html
398383:2006/03/10(金) 13:13:06
なんかワケわかんなくなってきました。

「返り値の型」や「引数の数や型」が同じでも、
あるクラスのメンバ関数へのポインタとグローバルな関数へのポインタは
同じ関数ポインタに入れられないのは分かりましたが、
ではまず、boost::functionを使うことでこの問題の何が解決するんですか?
これを使うことでメンバ関数かグローバル関数かの違いを吸収できるのかと考えたのですが、
そうかと思っていたらそうでもない様子でboost::bindを使えとのこと。
ではboost::functionの意味とはなんなのでしょうか?
399デフォルトの名無しさん:2006/03/10(金) 13:17:43
>>398
関数オブジェクト(bindしたものなども含む)と普通の関数の違いを吸収できるとでも言えばいいかな。

400デフォルトの名無しさん:2006/03/10(金) 13:51:48
>>398
お前、言われたそばからまた自分で調べずにわめいてるだろ。
とりあえず bind 試してみるぐらいしろよ。
401383:2006/03/10(金) 14:00:59
書き方がさっぱりわかりません。
誰かサンプル書いてください。
もう禿げそうです。
402デフォルトの名無しさん:2006/03/10(金) 14:02:41
君には無理、あきらめろ
403383:2006/03/10(金) 14:06:32
お前に聞いてないから返っていいよ。
404402:2006/03/10(金) 14:18:56
お前に言ってないから返っていいよ。
405383:2006/03/10(金) 14:26:49
俺に言ってないなら俺は帰らなくていいですね。
よかったです。でもあなたは帰ってくださいね。
質問スレに必要のない邪魔なだけの存在ですから。
406デフォルトの名無しさん:2006/03/10(金) 14:28:54
#include <iostream>
#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#のイベントっぽくて悪くなさそうに思うが。
407402:2006/03/10(金) 14:29:17
俺に聞いてないなら俺は帰らなくていいですね。
よかったです。でもあなたは帰ってくださいね。
質問スレに必要のない邪魔なだけの存在ですから。
408402:2006/03/10(金) 14:57:15
あんっ……やめて……そんなに……激しく答えられたら……私の………いゃ……ぁ…………
409383:2006/03/10(金) 15:01:06
うざいなぁ
410デフォルトの名無しさん:2006/03/10(金) 15:11:49
>書き方がさっぱりわかりません。
>誰かサンプル書いてください。
こいうことを書く基地外がいるから荒れるんだよ。
本でも買ってくれば?
411383:2006/03/10(金) 15:12:26
>>406
すいません、↓みたいな事をやりたいとしたら正しくはどう書いたらよいですか?
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);
}
412383:2006/03/10(金) 15:15:56
>>410
説明されてもわからないから、サンプル書けって言ってるだけなんだが。
何が悪い?
413383:2006/03/10(金) 15:17:47
>>412
やめてくださいホントに。
414デフォルトの名無しさん:2006/03/10(金) 15:19:35
>>412
説明してもわからないから、本買えって言ってるだけなんだが。
何が悪い?
415383:2006/03/10(金) 15:22:05
>>414
説明の仕方が悪いんじゃね。本買えで済んだらこのスレいらないじゃん。
416デフォルトの名無しさん:2006/03/10(金) 15:39:35
説明しても分からない奴はこのスレに来る以前の問題だと思う。
417デフォルトの名無しさん:2006/03/10(金) 15:41:46
いつまで釣られてんだ
418デフォルトの名無しさん:2006/03/10(金) 15:42:44
>>411
正しいも何もそれでコンパイルできると思うが。
419383:2006/03/10(金) 15:52:15
>>418

error C2440: 'initializing' : '' から 'class boost::function2<void,int,int,int>' に変換することはできません。(新しい動作 ; ヘルプを参照)

というエラーがでました。VC6ですけど
もしかしてコンパイラが対応してないとか…
420デフォルトの名無しさん:2006/03/10(金) 15:59:39
言われた事そのまま実行するだけなら、オマイいらないじゃん。
421383:2006/03/10(金) 16:08:24
消えろキチガイ。
422デフォルトの名無しさん:2006/03/10(金) 16:08:26
嵐を呼ぶ男だなw
423デフォルトの名無しさん:2006/03/10(金) 16:09:21
sageて書き込め いけぬまさん
424デフォルトの名無しさん:2006/03/10(金) 16:10:35
>言われた事そのまま実行するだけなら、オマイいらないじゃん。
その通り、いけぬま>>383はこの世に必要ない
少なくとも日本の社会には必要ない
425デフォルトの名無しさん:2006/03/10(金) 16:12:28
>>419
もう帰ってくれるか?
426383:2006/03/10(金) 16:15:59
ここもID表示するようになればいいのに
427383 ◆vp/58lzmEY :2006/03/10(金) 16:17:24
テスト
428383:2006/03/10(金) 16:21:52
Handler g = &gfunc;

にしたらいけました。とりあえずなんか凄いのは分かりました。
429デフォルトの名無しさん:2006/03/10(金) 16:31:13
ttp://aibm4.main.eng.hokudai.ac.jp/~takty/#programming
こっちのcallbackのほうがわかりやすいぞ
430383:2006/03/10(金) 17:10:15
>>429
こういうことをやりたいときに結構ありがちな問題なんですかね、もしかして。
でもちょっと見たところ難しそうです。
きっと後で参考になると思うので保存しておきました。ありがとうございます。

でも、とりあえずbindとfunctionを使ったやり方を知っておきたいです。
ですがいまだにbindの意味がわかりません。
どなたか、↓を日本語ふうに訳していただけませんでしょうか。
Handler h = boost::bind(&Hoge::f, x, _1, _2);
431デフォルトの名無しさん:2006/03/10(金) 17:15:38
はんどらー えいち いこーる ぶーすところんころんばいんどかっこあんぱさんどほげころんころんえふかんま えっくすかんま あんだーばーいちかんま あんだーばーにとじかっこせみころん
43230:2006/03/10(金) 17:22:58
今更ながら恥ずかしい限りですが教えてください。

char* s;

という変数があって、上記変数に値を代入した後

int hogehoge( const char* a )

という関数に渡したいのですがエラーになります。
どうすればいいのでしょう?
433デフォルトの名無しさん:2006/03/10(金) 17:25:14
どう渡したらどういうエラーになったのか。
434デフォルトの名無しさん:2006/03/10(金) 17:35:07
>>430
boost::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に代入しているという具合。
43530:2006/03/10(金) 17:51:06
const char* と char* には互換性がありませんというようなエラーです。
436デフォルトの名無しさん:2006/03/10(金) 17:54:32
>>435
そうではわからないからコード見せろ。
437デフォルトの名無しさん:2006/03/10(金) 18:12:34
int hogehoge( const char *a ){
char *s;
s = a;
....
}
というふうにはできない
変数aとsの両方ともにconstつけるか、はずせ
438デフォルトの名無しさん:2006/03/10(金) 18:13:26
あ、ごめん、違うね
439デフォルトの名無しさん:2006/03/10(金) 19:00:04
基本的すぎる話なんですけど…

char *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)で実行結果が違うのはなぜ?
440デフォルトの名無しさん:2006/03/10(金) 19:41:28
>>439
ヒント:static
441デフォルトの名無しさん:2006/03/10(金) 19:42:53
>>439
よく、そんな鼻から悪魔が出る様なソースを思い付けるね
442デフォルトの名無しさん:2006/03/10(金) 20:24:17
>>432
char * 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++の文字列クラスのような安全な文字列を返す。
443デフォルトの名無しさん:2006/03/10(金) 21:37:49
ファイラーを造りたいと思ってます。
いろいろかんがえてみたのですが(FindFirstFileとレジストリを直接いじってみたり)、右クリックしたらExplorerと同じメニューが出るようにしたいのです。
いろいろなファイラーでもそのようになっているので可能な関数か、構造体などがあると思うのですが。
いちいちレジストリを呼び出しているようにも見えません。
どなたか簡単にその方法を解説していただけませんでしょうか。
参考サイトやソースコードなどもあったらお願いいたします。
444デフォルトの名無しさん:2006/03/10(金) 21:44:32
>>439
まだ納得いかないかもしれないので>>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ビルドすると同じ結果になった
445439:2006/03/10(金) 22:57:23
>>440
>>442
>>444
やっと解りました。

関数の評価の順番は必ずしも毎回同じとは限らないんですね
勉強になりました。ありがとうございました。
446デフォルトの名無しさん:2006/03/10(金) 23:42:01
その辺でバグが出るとやっかいだよなー
447デフォルトの名無しさん:2006/03/10(金) 23:57:19
>>443
IShellなんちゃらっていうCOMインターフェースを使った希ガス
448デフォルトの名無しさん:2006/03/11(土) 00:07:24
>>447
ありがとうございます。
早速調べて試してみます。
もしまた解決しないことが出てきたらよろしくお願いします。
449デフォルトの名無しさん:2006/03/11(土) 00:48:48
>>444
初めて知った。こりゃ順番通りに書いてったほうがいいや
450デフォルトの名無しさん:2006/03/11(土) 06:56:07
atan2(rand(), rand());
みたいなプログラム書いたときに
「Seed値同じなのに、DebugとReleaseで結果が違うぞ!」
っていうので死ぬほど悩んだな

まさかこの式が原因だとは思いつかなくて問題の絞り込みが全然うまくいかなかった
451383:2006/03/11(土) 07:27:20
>>434
ありがとうございました。
大変丁寧に教えていただいて、
今整理しているところですがこれなら理解できそうです。
ひとまず、ありがとうございました。
45230:2006/03/11(土) 08:59:41
>442

> それならば、
> 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* はキャストできないと考えるべきなのでしょうか?
453デフォルトの名無しさん:2006/03/11(土) 09:06:44
>>452
char* → const char* は暗黙の変換が効く。
const char* → char* は明示的なキャストが必要。

で、さっきから例で挙げられているパターンでは
暗黙の変換が効くはずなんだけど、ほんとに書いてあるケースで
エラーが出てるの?なんか勘違いしてるんじゃないの?
エラーメッセージもソースもコピペで貼ってほしいな。
454デフォルトの名無しさん:2006/03/11(土) 09:13:05
質問があります。windowsのドスプロンプトでディレクトリのファイル一覧を表示させる
プログラムを作成していますがファイルを表示することはできましたがタイムスタンプ
の年だけ表示しようと思っても
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);

455デフォルトの名無しさん:2006/03/11(土) 09:18:17
>>454
GetFileTime() の引数はファイルハンドル。
fhandle は検索ハンドル。ファイルハンドルじゃない。
456デフォルトの名無しさん:2006/03/11(土) 09:18:43
>>454
WORD 16-bit unsigned integer.
457デフォルトの名無しさん:2006/03/11(土) 09:20:02
あ、>456はスルーで。
#何勘違いしたんだろ。
458デフォルトの名無しさん:2006/03/11(土) 09:20:11
>>454
失敗する可能性のある API の戻り値をテストしてないのがいけない。
459デフォルトの名無しさん:2006/03/11(土) 09:38:48
>>454です。
有難うございます。でわ恐らく直接
WIN32_FIND_DATA構造体の中のFILETIME ftCreationTimeとFileTimeToSystemTime
を組み合わせて表示するのですね。
皆様有難うございました。
460デフォルトの名無しさん:2006/03/11(土) 09:41:15
>>459
一般に「タイムスタンプ」って言ったら ftLastWriteTime のことだと思うよ。
461デフォルトの名無しさん:2006/03/11(土) 10:00:30
例えばこのようなファイルがあります


あかさたな/
はまやらわ/
いきしちに/
ひみゆらわ/…

これをfopenで開きfscanfとforで、は「まやらはから」%s/でtempに検索保存したいのですが「はまやらわ」から検索できません
fseekを使わずに正常に検索保存するためにはどうしたらいいでしょうか?
462デフォルトの名無しさん:2006/03/11(土) 10:06:20
環境はMACOS9.2
使用アプリmi2.0、コンパイラMWP SIOW APP
463デフォルトの名無しさん:2006/03/11(土) 10:06:32
>>461
人に通じる文章になっていないからコードを張りなさい。
464デフォルトの名無しさん:2006/03/11(土) 10:06:54
>>461
ファイルがテキストな時点で上から下まで読んでくしかないでしょ?
465461:2006/03/11(土) 10:07:46
>>463
君には頼んでないので、お帰りください
466デフォルトの名無しさん:2006/03/11(土) 10:33:03
str=%d
vit=%d
dex=%d
men=%d
int=%d
HP=%d
MP=%
----
ファイヤーボール/%d
アイスストーム/%d
サンダーフレア/%d

実際のファイルです
これからfscanfで----\n%s/%dを
forを使って繰り返しさせて見たのですがうまくいきません
467デフォルトの名無しさん:2006/03/11(土) 10:44:32
ファイアーボールの行しか保存できないと言いたいんだろうか。
468デフォルトの名無しさん:2006/03/11(土) 10:45:53
>>466
それは実際のファイルじゃないっしょ?

実際のファイルってのは

ファイヤーボール/10
アイスストーム/20
サンダーフレア/40

とかなってんじゃないの?
それとも本当に%dとかなってんの?
469デフォルトの名無しさん:2006/03/11(土) 11:08:12
よく

#ifndef AAA
#define AAA 1
#endif

ってありますが、これってtypedefでも通用するのですか?

つまり
#ifndef BBB
typedef short BBB
#endif

みたいな
470デフォルトの名無しさん:2006/03/11(土) 11:09:35
なぜ試さない・・
471デフォルトの名無しさん:2006/03/11(土) 12:50:56
>>469
通用しない
472デフォルトの名無しさん:2006/03/11(土) 13:06:49
今、Cの超初心者向けの本を何とか一通り読み終わった程度の理解度なのですが、
C++のコードを読めてなぞれるようになるまでどれくらいの期間が必要なんでしょう
コードの内容は大学の物理化学、計算後に簡単な3Dグラフィックの表示を行うものです
473デフォルトの名無しさん:2006/03/11(土) 13:14:55
>>472
その人の能力により数日〜一生
474デフォルトの名無しさん:2006/03/11(土) 13:56:01
>>472
普通の分野では人ごとの能力差は数倍からせいぜい10倍程度のものだけど、
プログラミングにおいては数百倍以上の生産性の差がつくこともあると言われてる。
もし、自分に適性がないと思ったら早々にあきらめるのが吉。
475デフォルトの名無しさん:2006/03/11(土) 14:04:37
>>472
宿題スレで、人の出したC++の設問に何回か答えてみるといい。
かなりC++を勉強したはずなのに、なかなか答えを書くのに時間が
掛かりすぎるようだと、適性があまりないかもしれんね。
476デフォルトの名無しさん:2006/03/11(土) 14:22:57
まず>>474は人生諦めた方がいいんじゃないだろうか。
人間に適性がなさそうだから。
477デフォルトの名無しさん:2006/03/11(土) 14:29:34
VC++で、

typedef 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かは環境依存だからということですか?
478デフォルトの名無しさん:2006/03/11(土) 15:14:37
>>477
cout << (typeid (char) == typeid (signed char)) << endl;
cout << (typeid (char) == typeid (unsigned char)) << endl;
479デフォルトの名無しさん:2006/03/11(土) 15:15:14
charとsigned charとunsigned charは全て異なる型。
480デフォルトの名無しさん:2006/03/11(土) 15:21:27
でも、intとsigned intは同じなんだな。
よくわからん。
481477:2006/03/11(土) 15:24:32
>>478
>>479
ガーン・・・
そうだったのか、知らなかった。
ちなみにCでも一緒ですか?
482デフォルトの名無しさん:2006/03/11(土) 15:46:27
intは常にsignedですが、charはsignedかunsignedかは環境依存です。
483デフォルトの名無しさん:2006/03/11(土) 15:50:17
>>482
最近の規格ではどっちかに既定されたんじゃなかったっけ?
484デフォルトの名無しさん:2006/03/11(土) 16:20:40
char→文字型
signed/unsigned char→整数型
485デフォルトの名無しさん:2006/03/11(土) 16:35:53
VC++6.0を使っていますが、全部のヘッダに#pragma once って書いてるのに

error LNK2005: "public: virtual void __thiscall 〜はすでに 〜 で定義されています

みたいなエラーがでまくるんですけど、
なぜか分かるエスパーの方はいらっしゃいませんでしょうか?
486デフォルトの名無しさん:2006/03/11(土) 16:41:29
>>485
リンクの段階だから、その関数の実体が複数あるんじゃないか?
487デフォルトの名無しさん:2006/03/11(土) 16:47:20
>>485
ヘッダにメンバ関数定義を書いてるんじゃないか?
その場合、クラス定義の内部に書かないといけない。
488デフォルトの名無しさん:2006/03/11(土) 16:47:44
>>486
申し訳ないですがもうちょっと偏差値低い人用に平易に教えていただけないでしょうか。
例えばどんな状態でしょうか?

あと、ヘッダのなかで
class CHoge{
CAge* age;
}
みたいな定義をするとしたら、普通は
CAgeを定義してるヘッダを#includeしないと駄目ですよね?
今眺めてるサンプルは、そのサンプルのオリジナルなクラス型のメンバがあるにもかかわらず
何も#includeしてなくてもなぜかコンパイルできるんですけど、
理由がさっぱりわからないです。
なもんで試しにCHogeの中に自分で適当に作ったクラス型のメンバを追加してみると、
やっぱりそれに関してはちゃんとそれを定義したヘッダを#includeしないと
そこだけエラーになってかなり謎なんですが、いったいどういうことでしょうか。
489デフォルトの名無しさん:2006/03/11(土) 16:50:11
>>487
あ!!それかも知れません。ちょっと直してみます。
490デフォルトの名無しさん:2006/03/11(土) 16:50:45
>>484
文字型と整数型の違いは?
491デフォルトの名無しさん:2006/03/11(土) 17:02:56
>>486>>487
直りました!!ありがとうございました。
492デフォルトの名無しさん:2006/03/11(土) 17:10:39
469みたいなのができないなら
どうすればtypedefを
#ifndef AAA
#define AAA 1
#endif
みたいにできますか?

493デフォルトの名無しさん:2006/03/11(土) 17:12:41
>>491
inline付けとけばクラス定義の内部に書かなくても大丈夫
494デフォルトの名無しさん:2006/03/11(土) 17:15:15
>>492
#ifndef AAA_DEFINED
#define AAA_DEFINED
typedef ほげ AAA;
#endif
495デフォルトの名無しさん:2006/03/11(土) 17:16:27
>>492
#ifndef AAA_DEFINED
 typedef short AAA
 #define AAA_DEFINED
#endif
みたいにすればどうでしょうか?
496デフォルトの名無しさん:2006/03/11(土) 17:22:55
>>493
件のサンプルではinlineは特に見当たらないです。。
ごく普通に別ファイルで定義&実装されているクラスを使っているにもかかわらず
ヘッダーをインクルードしないで使えています。
自分で試しに定義したクラスはやはりヘッダをインクルードしなければ使えません。
むしろこれが普通だと思うのですが、他に何か考えられる事ってあるでしょうか。
497デフォルトの名無しさん:2006/03/11(土) 17:25:54
あれ、>>493>>485への別解だったですかね?
498デフォルトの名無しさん:2006/03/11(土) 17:26:26
>494-495
ありがとうございます。

たしかにこのやり方しかなさそうですね。
なぜこの質問をしたかというと、仕事でOSの入れ替えがあったのですが
エラーでBOOLがおかしいと怒られました。
原因は、ユーザ定義ファイルで
typedef unsigned char BOOL
と設定してあり、昔のOSではそのような定義がされていませんでした。
なので正常でしたが、新しいOSにはあらかじめ
typedef int BOOL
となっており、エラーが出ました。
その回避方法を探していたんです。
(結局今は、ユーザ定義ファイルのBOOLを削除しました)
499デフォルトの名無しさん:2006/03/11(土) 17:27:38
//超初心者質問で申し訳ありませんがよろしくお願いします。

main() {

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 )というエラーが出ます。
//どうしてなのか教えてくらはい。
500デフォルトの名無しさん:2006/03/11(土) 17:32:38
500!!

int y
の後ろにprintfをおいてみれば?
501デフォルトの名無しさん:2006/03/11(土) 17:39:48
表\示
502499:2006/03/11(土) 17:48:46
ありがとうございました。
int y;
の後ろに
printf
入れたら上手くいきました。
どうしてなんですか?教えてください。
503デフォルトの名無しさん:2006/03/11(土) 17:54:46
Cでは変数宣言はブロックの先頭で行わなければならない。
504デフォルトの名無しさん:2006/03/11(土) 18:03:41
ただし、C99では大丈夫。
505499:2006/03/11(土) 18:04:17
ブロックとは{}で囲まれた範囲のことですよね。
分かりました、ありがとうございました。
506デフォルトの名無しさん:2006/03/11(土) 18:04:48
>498
OSの入れ替えでBOOL?よくわからんが・・・
507デフォルトの名無しさん:2006/03/11(土) 18:09:58
OSと開発ツールの区別がついてないんだろ。
508デフォルトの名無しさん:2006/03/11(土) 18:13:53
組み込み系です。
OSを大昔のITRON(HI-SH77の昔のもの)から最新のITRON(NORTi4.0)に変えた仕事です。
オープン系とは違い電源投入直後の処理からOSの設定などしないといけないんですよ。

ようやく一人前になりかけた?段階なので、色々とがんばります。
509デフォルトの名無しさん:2006/03/11(土) 18:31:45
最近c始めたんですが皆さんはどういったやりかたで覚えたのでしょうか?
本読んでプログラム書いての繰り返ししかないのかな…周りに知ってる人いないからつらいorz
510デフォルトの名無しさん:2006/03/11(土) 18:32:13
>>506
OSにBOOLが宣言されているんだ
511デフォルトの名無しさん:2006/03/11(土) 18:32:34
ここに沢山居るじゃないか。
512デフォルトの名無しさん:2006/03/11(土) 18:34:22
>>509
おれも周りにプログラミングやる人などいなく、完全に独学だ
たしかに本を読むだけじゃなかなか身に付かないかもしれない

たくさんプログラム書いて、あとは慣れじゃないかな
513デフォルトの名無しさん:2006/03/11(土) 18:44:35
>>508
老婆心だが、μITRONはOS仕様のバージョンが異なると、
同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
514デフォルトの名無しさん:2006/03/11(土) 19:07:54
>513
たしかに、今色々調べていたら違いがありました
なにしろ旧OSのヘッダが92だの95だの数字がありました。(つまり1995年もの)
コンパイラもSHC4.1Aというかなり古いものでしたし(今最新は9.0)

ただ、気になったのは私も仕事をするようになり色々とCを勉強するようになりました。
独学はモチベーションが上がりづらいですが、がんばってください。
515デフォルトの名無しさん:2006/03/11(土) 19:14:47
>>513
>同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
これってAPI設計者が絶対に避けるべき事なんじゃねーの?
まぁその所為で、Win32APIみたいに名前と型・用途が一致してないのが出てくるわけだが
516デフォルトの名無しさん:2006/03/11(土) 19:15:46
モチベーションが上がらないのは目的のない独学だろ。
517デフォルトの名無しさん:2006/03/11(土) 19:51:12
>>472->>475
ありがとうございます。
適性があるかどうかも分からん状態なので、しばらく勉強してみようと思います。感謝です。
518デフォルトの名無しさん:2006/03/11(土) 20:05:58
適正なんてものを気にするようではおしまいだ
やりたいことをやって生きていけることこそが幸せ
519デフォルトの名無しさん:2006/03/11(土) 20:53:14
>>515
仕様書に書かれてあることを実装していれば問題ないことになっている。
もっとも、APIの細かい動きが異なると当然再利用がしにくい。
それを解消しようとして、T-Engineが生まれたわけで。
520デフォルトの名無しさん:2006/03/11(土) 22:21:16
たしかに弱い標準化だからね>ITRON
強い標準化にしようとT-Engineを生んだんだけど実際どうなんだろう・・・
521デフォルトの名無しさん:2006/03/12(日) 05:03:48
ActiveX コントロール初体験です。

FLASH(開発環境の方)は手元にないのですが、
ActiveXコントロールのShockwave Flash Objectを使ってswfファイルを読み込み、
ダイアログ上のFlash Playerコントロールで再生させることはカンタンに出来るのですね。

ところでFlash Player内のオブジェクトがクリックされるなどイベントが起きたとき、
外部に何かメッセージは出しているのでしょうか?またFLASH開発時の設定次第で出すことは可能なのでしょうか?
それをFlashPlayerコントロール利用側のwindowsアプリで受け取ることが出来るのかなとふと思ったもので。
また逆に、windowsアプリ側からFlashPlayerコントロールに向けてメッセージを送ることは出来るのでしょうか?
522デフォルトの名無しさん:2006/03/12(日) 10:06:47
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
wchar_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' に変換できません。
となってしまいます。
523522:2006/03/12(日) 10:12:20
失礼しました
環境はVisual Studio 2005 VC8で
CLRオブジェクトを作成しています。
524デフォルトの名無しさん:2006/03/12(日) 11:24:34
>>523
CLRはスレ違いという気もしなくもないが、hex_convert()は文字列を返すべきなんじゃないの?
String hex_convert(...) {...; return tmp;}とか。
525デフォルトの名無しさん:2006/03/12(日) 11:35:20
>>524さん、ありがとうございます
CLRはスレは初心者の質問は今後スルーするそうなので、行き場が無くて
ここで質問させて頂きました
呼び出す形が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;
}
526デフォルトの名無しさん:2006/03/12(日) 11:50:17
String^hex_convert(UInt64 hoge){
    return String::Format("{0:X}",n);
}
527526:2006/03/12(日) 11:51:13
あ、間違い間違い
× hoge
○ n
528デフォルトの名無しさん:2006/03/12(日) 12:54:35
>>526さんへ
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 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
529デフォルトの名無しさん:2006/03/12(日) 13:27:34
いいから帰れよ。スレ違いだっての。
530デフォルトの名無しさん:2006/03/12(日) 14:02:06
>523
だから何で初心者がC++/CLIなんてゲテモノに手を出す?
初心者だと自負するなら、やめろ。
531デフォルトの名無しさん:2006/03/12(日) 16:23:04
>>528
C++/CLIスレにいたときから全く進歩していないな。
そんなんだから追い出されるんだよ。
inline System::String^ hex_convert(System::UInt64 n)
{
    return n.ToString("X");
}
532デフォルトの名無しさん:2006/03/12(日) 17:24:39
#include <iostream>

void 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のプログラムではこの形でできてたような気がするんだけど・・
533デフォルトの名無しさん:2006/03/12(日) 17:30:01
>>532
もしかして、sizeof(*test)の値みてそう思っている?
newしたサイズではなく、testのサイズが帰っているんじゃないかな。
実際に入れた値を確認してみたらいいよ
534デフォルトの名無しさん:2006/03/12(日) 17:30:33
>>532
× *test[i] = i
○ (*test)[i] = i
535デフォルトの名無しさん:2006/03/12(日) 17:30:43
>>532
sizeof(*test) = sizeof(int *)
であって、要素数とは無関係。
536デフォルトの名無しさん:2006/03/12(日) 17:39:58
動的に確保した配列の要素数をsizeofで得られますっけ?
537デフォルトの名無しさん:2006/03/12(日) 17:45:00
得られない。
sizeofはコンパイル時に静的に求められる。
538532:2006/03/12(日) 17:49:04
>>533>>535
sizeofの値見た後、ループが動かなかったので
sizeofの値は関係ないですか・・
>>534
どうも、できました
539デフォルトの名無しさん:2006/03/12(日) 18:32:41
質問1
#pragma asmと__asmはどちらもCの中にアセンブリを埋め込むものだと思うのですが
違いがわかりません。違いを教えてください。

質問2
#define AAA int

typedef int AAA
はどちらも同じ気がしますが、型名を変更する際は基本的にtypedefを使う理由は何ですか?
とりあえず#defineはプリプロセッサでtypedefはコンパイラで解釈するということはわかったのですが
それ以上のメリットデメリットなどがわかりません。
教えてください。
540デフォルトの名無しさん:2006/03/12(日) 18:41:33
>>539
1について
#pragmaも__asmも環境依存だから一概には応えようがない。だから、違いは
あなたの環境に添付されている説明に従う。ヘルプを見ればあるかも。

2について
#defineは、通常置換後の名前でしか表示されないからコンパイラが吐いた
エラーが読みにくくなるしデバッグもしにくい。だから、できる限りインクルード
ガードくらいでしか使わないようにしてる。
C++においては#defineは名前空間をまたいでしまうので、A::AAAとB::AAAが
区別できなくなるために嫌われることが多い。ただ、あえて名前空間を跨ぎたい
時には#defineの方が便利。例えばboost見たいな(いい意味で)変態的ライブラリは
ないと困る部分があるのかもしれない。
541デフォルトの名無しさん:2006/03/12(日) 18:46:17
>>539
#define AAA int*
typedef int* AAA;
この2つだと const AAA の型が違う結果になる。
542デフォルトの名無しさん:2006/03/12(日) 18:46:52
>>539
質問2:
前者はshort AAA foo;ができて後者はできない。
543デフォルトの名無しさん:2006/03/12(日) 20:42:55
メンバにwstring m_wtext を持ってるクラスCHogeがあります。
CHogeのコンストラクタのなかで

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++です。よろしくお願いします。
544デフォルトの名無しさん:2006/03/12(日) 20:47:23
>>543 setlocale?
545デフォルトの名無しさん:2006/03/12(日) 20:53:41
>>544
それだ!!
もう試す前から間違いないです。絶対それです。
すっかり忘れてました。
あなたは神ですか?
546デフォルトの名無しさん:2006/03/12(日) 21:18:22
>>543
ちなみにその例なら、MessageBoxW(NULL, m_wtext.c_str(), L"", MB_OK);でいける。
MessageBoxWはWin 9xでも使えるから使っていいと思う。
547デフォルトの名無しさん: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;
}
548デフォルトの名無しさん:2006/03/12(日) 21:31:11
>期待したとおりに
期待した内容を書かずに分かるわけねぇだろ
もうこなくていいよ。
ついでに氏ねば?
549デフォルトの名無しさん:2006/03/12(日) 21:32:16
>>547は初心者じゃなくてただの基地外
550デフォルトの名無しさん:2006/03/12(日) 21:33:15
デバッグ放棄する奴って何考えてるんだろう。
551デフォルトの名無しさん:2006/03/12(日) 21:34:51
頭おかしいんだろ。
それでこのスレで手直ししてもらおうって考えてんじゃねーの。
552デフォルトの名無しさん:2006/03/12(日) 21:39:40
すみません、スレ汚しだったみたいですね。
ほんとに馬鹿で、情けないです。
もう消えますから、気にせず元の流れに戻ってください。
553デフォルトの名無しさん:2006/03/12(日) 21:53:53
おまえら容赦ないなwww
554デフォルトの名無しさん:2006/03/12(日) 22:03:15
初心者なら優しく教えてやるが
基地外に教えてやる必要はない
どうせこんな感じだろ

プログラムが思い通りに動かない → 何で俺の思い通りに動かねえんだよ
回答者がやりたいことを察してくれない → 何で俺の考えてることが伝わらねえんだよ
555デフォルトの名無しさん:2006/03/12(日) 22:04:25
初心者以下の教えてクンは氏ね
556デフォルトの名無しさん:2006/03/12(日) 22:49:01
初心者なのは全然かまわないが、他力本願な奴には教えたくない。
557539:2006/03/12(日) 23:01:11
>540-542
ありがとうございました。

ところで、Cにアセンブリを埋め込む際に、環境依存ではありますが
__asmや#pragma inline_asm
などありますが、それらを切り替える際に

#if defined(AAA)
#pragma inlene_asm
何かしらのしょり

#else
__asm{
何かしらの処理
}
#endif

みたいにするとできると思うのですが、このAAAに何を入れれば
よいのでしょうか?たぶんコンパイラごとに分ける必要があると思うので
コンパイラごとで定義されているもの(例:_SHなど)を使用すればいいと思うのですが・・・

558デフォルトの名無しさん:2006/03/12(日) 23:09:54
>>557
>コンパイラごとで定義されているものを使用すればいいと思うのですが・・・

答え出てるじゃん。
559デフォルトの名無しさん:2006/03/13(月) 00:23:10
>>539
>質問2

・define:コンパイラに渡す前処理で、文字列の単純な置換を行う。
・typedef:ある型に対する別名を定義する。


根本が違う。
560デフォルトの名無しさん:2006/03/13(月) 00:52:01
>>557
個別のコンパイラごとに調べていくしかない
561デフォルトの名無しさん:2006/03/13(月) 03:54:38
>>550
ふつーにいる。
VCのコンパイルオプションみただけでぜってー動くはずねーのに終わったつもりでいやがるから、
「コンパイルして自分の環境で動くことは確認しましたか?」
って何回も聞いたのに
「同じこと何度も言わせないでください!確認しましたよ!」
とかブチキレるから「あー、直したのかなー」とか思ってたら、
ただ動かしてないだけでその場で何時間も他の人間の作業止めて悩む馬鹿。マジでいる。
ここまでアフォだと付き合ってられない級の奴はどこにでもいるっぽい。
562デフォルトの名無しさん:2006/03/13(月) 08:35:24
563デフォルトの名無しさん:2006/03/14(火) 12:01:51
フォーマットが不規則なテキストファイルをfscanfで読み込み変数に書き込むことは可能ですか?
例えば以下のようなファイルがあります
国語/70点
数学/82点
英語/68点
次の目標「平均80点をとる」

点数と目標の中の変数は任意に変化して
この試行を5回繰り返します
for if fopen fscanfで
何とかなりませんか?
fscanf(fp,゙%s/%d%s/%d%s/%d゙,k1,s1,k2,s2,k3,s3);の先のやりかたが思い付きません
564デフォルトの名無しさん:2006/03/14(火) 12:10:29
n/x点
で科目を表す「n」は家庭科だったり水泳だったり英語だったりなんでも対応できるようにするってこと?
565デフォルトの名無しさん:2006/03/14(火) 12:20:15
文字列に文字列として入っている数値を
DWORD型に変換したいのですが、どうしたらよいですか?
566デフォルトの名無しさん:2006/03/14(火) 12:24:24
C標準にchar*>long変換のatol(const char* str)がある
DWORDってunsigned longだけど大丈夫だろうか
567デフォルトの名無しさん:2006/03/14(火) 12:25:15
素直にsscanf使っとけ
568デフォルトの名無しさん:2006/03/14(火) 12:27:40
>>566>>567
いけたようです。ありがとうございました。
569デフォルトの名無しさん:2006/03/14(火) 12:33:09
>>563は、まずフォーマットの意味を辞書で調べ直す事から始めるべき。
570デフォルトの名無しさん:2006/03/14(火) 12:41:35
>>565

sscanf(str,"%lu",&dwVal) ;

または

dwVal = (DWORD)atol(str);

MFC::CString使いなら
str.Format("%lu",&dwVal);

STL::string使いなら
sscanf(str.c_str(),"%lu",&dwVal);
#汚いコードじゃ…orz

多分boost使いならformatを使ってもっとエレガントにやる。
571デフォルトの名無しさん:2006/03/14(火) 12:42:48
570だったり。

や、ごめ。嘘書いた。
MFC::CStringのFormatは出力にしか使えない。
572デフォルトの名無しさん:2006/03/14(火) 12:50:42
>570
boost使いならlexical_castじゃないの?
573デフォルトの名無しさん:2006/03/14(火) 12:53:11
570=571だったり。

>>572

その通り。
恥の上塗りだ…鬱出汁脳orz
回線切ってry
574デフォルトの名無しさん:2006/03/14(火) 13:15:04
>>570
STL::stringならstringstreamじゃないの?
575デフォルトの名無しさん:2006/03/14(火) 18:56:17
無駄に長くて申し訳ないです。。orz
途中までを記載しています。
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
576575:2006/03/14(火) 18:56:57
動揺しすぎて日本語まで変に。恥ずかしい。
577デフォルトの名無しさん:2006/03/14(火) 19:00:10
>>575
コンソールから起動してる?
578デフォルトの名無しさん:2006/03/14(火) 19:00:43
>>575
scanfでdoubleを読むときは%lf
579デフォルトの名無しさん:2006/03/14(火) 19:01:58
printfは%fね
580575:2006/03/14(火) 19:03:48
ググルでコンソールを検索しましたが、まだまだ無知なようで意味がわかりませんでした。
ごめんなさい。
"C言語を始めよう"というエディタ?とBCC5を使っています。
実行するとコマンドプロンプトが開きます。
581575:2006/03/14(火) 19:04:56
>>578
あああ、まるっきり忘れてました…。
ありがとうございます。

>>579
う。それは普通に間違えました…orz
582575:2006/03/14(火) 19:12:09
最後に…

>>577-579の方へ。
こんな質問にも答えていただきありがとうございました。
583デフォルトの名無しさん: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
というコンパイラエラーが出てくるのですが、どのように対処したらよいのか教えていただけませんか?
584デフォルトの名無しさん:2006/03/15(水) 11:37:57
すいません、g++の不具合だと分かり事故解決しました。
585デフォルトの名無しさん:2006/03/17(金) 01:31:21
C++の予約語にfinallyというのがあるようなのですが、
これってどういう時に使うものなんですか?

一応ネタ元。
ttp://www.asahi-net.or.jp/~wv7y-kmr/memo/old/cpp_bas.html
586デフォルトの名無しさん:2006/03/17(金) 02:08:28
>>585
そんな予約語C++にはない。
587デフォルトの名無しさん:2006/03/17(金) 07:10:39
>>585
http://www.asahi-net.or.jp/~wv7y-kmr/memo.html
「古くてあまり役に立ちそうにないもの」
588デフォルトの名無しさん:2006/03/17(金) 11:24:31
>>585
finallyはないが、環境によっては__finallyとして定義されてる。
tryブロック内で例外が発生したりして処理が中断されても__finallyブロック内は無条件で処理が行われる。
主にtryブロック内の後始末に使われることが多い。
589デフォルトの名無しさん:2006/03/17(金) 11:30:21
C++にはRAIIがあるからね
finallyは必要ない
それにしてもひどいサイトだな>585
590デフォルトの名無しさん:2006/03/17(金) 11:35:33
いや、だって参考文献から終わってるし
591デフォルトの名無しさん:2006/03/17(金) 11:42:40
厨房ほど自己顕示欲があるのはどうにかならんのか
ホームページなんか作らずに黙って勉強に励んでればいいのに
592デフォルトの名無しさん:2006/03/17(金) 13:01:12
んなこと言ったら2chはどうなる
593デフォルトの名無しさん:2006/03/17(金) 13:40:40
Windowsのリストビューコントロールで、仮想リストビューにするために、
各要素をvectorで持っておこうと思いました。

そのvectorの中から、条件に一致するものだけ表示ということがしたいのですが、
どういう風にやるのがいいんでしょうか。

class Elem ; //リストビューに表示する要素のクラス
std::vector<Elem> v1 ; //要素のvector

std::vector< std::vector<Elem>::iterator > v2 ;//v1の型のイテレータのvector

表示する要素へのイテレータのvectorを作って、
v1にはすべての要素を入れておき、
v2には、実際に表示する要素へのイテレータをいれ、
要素の参照はv2から行うということを考えたのですが、
これは方法としてどうなのでしょうか?

もっといい方法はありませんか?
594デフォルトの名無しさん:2006/03/17(金) 23:31:36
条件に一致したものを std::vector<Elem*> に突っ込んで使うとか?
595デフォルトの名無しさん:2006/03/17(金) 23:46:02
>>594
それではstd::vector<Elem>::iteratorがElem*になっただけで本質的な違いは無いと思う。
596593:2006/03/17(金) 23:56:29
>>594
そもそも、vectorのイテレータは、
普通は、たんなる要素へのポインタになると思うのですが。
597デフォルトの名無しさん:2006/03/18(土) 12:43:25
>>593
iteratorは生存期間が問題になるから、Elemがよっぽど大きくなければ普通に
std::vector<Elem> v2にcopy_if()かなにかでコピーすればいい希ガス。
598デフォルトの名無しさん:2006/03/18(土) 19:40:21
WIN32APIが使ってあるCで書かれたソースをVC8でコンパイルすると
error C2731: 'WinMain' : 関数はオーバーロードできません。
だと言ってくるんだけど、どうしたらええの?
因みにソースは猫のところのこんな奴どえす

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance ,
      HANDLE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
  MessageBox(NULL,
    (LPCSTR)"メッセージ・ボックスのテストです。",
    (LPCSTR)"猫でもわかるプログラミング",
    MB_OK);
  return 0;
}
599デフォルトの名無しさん:2006/03/18(土) 19:55:42
スマソ
×int WINAPI WinMain( HINSTANCE hInstance ,
○int WINAPI WinMain( HANDLE hInstance ,
だった、結果はどっちも失敗だけど
600デフォルトの名無しさん:2006/03/18(土) 20:02:30
>>598
それ、エラーの出たコード(自分の書いたコード)コピペしてる?
よくあるのが LPSTR と LPTSTR の違いなんだけど。

>>599
HINSTANCE で正解だろ。
601デフォルトの名無しさん:2006/03/18(土) 20:03:16
>>598
もしかしてExpressか?
602デフォルトの名無しさん:2006/03/18(土) 20:05:38
第一引数も、第二引数もHINSTANCEだな。
603デフォルトの名無しさん:2006/03/18(土) 20:29:06
>>601proのほうです
文字セットはマルチバイトで
共通言語ランタイムサポートは/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;
}
604http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 20:32:11
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
605デフォルトの名無しさん:2006/03/18(土) 20:35:32
オーバーロードってことはどっかに二重定義しちゃってるんじゃないの?
606デフォルトの名無しさん:2006/03/18(土) 20:39:31
windows.h の中に WinMain の宣言があるから、それと衝突してるんだろう。
607デフォルトの名無しさん:2006/03/18(土) 20:41:11
>>603
普通にできたよ。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
ってコンパイルしてみそ。
608デフォルトの名無しさん:2006/03/18(土) 20:42:14
あれ、でもこれってC言語用だからオーバーロードもくそもねえよな
もしかして拡張子cppにしてるとか?
わしWinAPIようわからんが
609デフォルトの名無しさん:2006/03/18(土) 20:43:05
ぐぐってみたらコレか
http://www.kumei.ne.jp/c_lang/intro/no_57.htm

HANDLEになってるぞ(゚д゚;)
610デフォルトの名無しさん:2006/03/18(土) 20:50:25
cpp だったら extern "C" が要る予感。
611607:2006/03/18(土) 20:54:21
>>609
猫先生も、お疲れ気味かw

.cppにして試してみた。結果、相変わらず問題なかった。
612デフォルトの名無しさん:2006/03/18(土) 20:59:49
>>610
extern "C"しても一緒デツ
>>611
( ´゚д゚`)エー
まじっすか??
613デフォルトの名無しさん:2006/03/18(土) 21:01:13
>>609
まぁ、いいじゃねぇの?

HINSTANCEの定義: DECLARE_HANDLE(HINSTANCE)

DECLARE_HANDLEの定義: #define DECLARE_HANDLE(name) typedef HANDLE name

だしな
614デフォルトの名無しさん:2006/03/18(土) 21:09:11
.\foo.cpp(7) : error C2373: 'WinMain' : 再定義されています。異なる型修飾子です。
C:\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定義してるのここだけだったし
615デフォルトの名無しさん:2006/03/18(土) 21:10:55
それをキミが再定義してんだr
616デフォルトの名無しさん:2006/03/18(土) 21:11:57


クラス確保していらなくなったら破棄するとかあるの?
放置プレイ?
617デフォルトの名無しさん:2006/03/18(土) 21:14:11
あ〜
delete 使えばいいのか!
618デフォルトの名無しさん:2006/03/18(土) 21:16:23
>>603

#include <windows.h>
を消して
#include "stdafx.h"
だけにしてみ
619デフォルトの名無しさん:2006/03/18(土) 21:23:37
>>614 それは宣言、な。定義じゃない。
620デフォルトの名無しさん:2006/03/18(土) 21:32:26
ちょっとあやふやなので教えてください。
int a[5] = {0,1,2};
と初期化した場合って、a[3]とa[4]て必ず0に初期化されますか?
(C言語とC++の両方の規格上)
621デフォルトの名無しさん:2006/03/18(土) 21:33:04
>>620
されるよ。規格で決まってる。
622デフォルトの名無しさん:2006/03/18(土) 21:33:06
不定
623デフォルトの名無しさん:2006/03/18(土) 21:35:44
>>607
コマンドラインから
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: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
になります

624デフォルトの名無しさん:2006/03/18(土) 21:37:55
625620:2006/03/18(土) 21:39:57
レスありがとうございます。
これで安心して眠れます。
626デフォルトの名無しさん:2006/03/18(土) 21:41:14
>>620
悩むくらいならちゃんと{0,1,2,0,0}って書けばいいじゃない(´・ω・`)
627デフォルトの名無しさん :2006/03/18(土) 21:42:08
>>620
コンパイラによるけど、ANSI準拠なら、array[2][5] = { 0}で全部0に初期化されるはず
コンパイラ次第によると思う。
628デフォルトの名無しさん:2006/03/18(土) 21:44:24
>>623
ええ〜違うってばよ〜なんで?
2005proなら、Microsoft Visual Studio 8\VCの下にvcvarsall.batってファイルが
あるでな、cmd.exeからそれを起動すんだ。
629デフォルトの名無しさん:2006/03/18(土) 22:07:28
>>628
出来たけど、C++で出来ないのが残念だす
猫のHPも一応古くてもC++で解説してあるのに
orz
630デフォルトの名無しさん:2006/03/18(土) 22:21:38
おお〜い、C++でできるべな〜
hoge.cをhoge.cppにしても問題ないがな。C++でできないって、
どういうことだがや?
631デフォルトの名無しさん:2006/03/18(土) 22:32:08
>>629♪♪♪ d(`Д´)b♪♪♪サンキュ
ヮ(゚д゚)ォ!
できたお
ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
処でvcvarsall.batでコンパイルできるソースって、同じ場所じゃないと駄目なんだね
今までコンパイルできなかった、ソースもできるかも
((o(´∀`)o))ワクワク
しかし何でVC8のファイルダイアログからはコンパイルできへんのや
632デフォルトの名無しさん:2006/03/18(土) 22:44:44
>>631
いや、ソースどこに置いてもいいがな。vcvarsall.bat実行したら、cdコマンドで
行きたいところ行きや。IDE使うと余計なオプションとか仰山つけおるから、
IDE使うときはよく確認し〜や。
633デフォルトの名無しさん:2006/03/18(土) 22:55:47
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
cl hoge.c /link user32.lib >> hoge.txt
こうしたら、コンパイルの吐き出す情報も良く分かるしNE^^
コマンドラインコンパイル(・∀・)イイ!!
昔に戻ったみたいだおwww
634デフォルトの名無しさん:2006/03/18(土) 23:21:50
>>609>>611
今はHINSTANCEだが、昔はHANDLEだった。

>>610
extern "C"を不要にするためにWindows.hの中の中ではextern "C"でWinMainの宣言がなされている。

>>613
それはSTRICTでないときの場合。今はデフォルトでSTRICTになっている。


635デフォルトの名無しさん:2006/03/19(日) 10:04:47
CTime::TimeChk(2);←だめ

obj.TimeChk(2←OK!

636デフォルトの名無しさん:2006/03/19(日) 10:30:31

関数の名前は

MovePos
Move_Pos
movepos
Movepos

変数は

map_x
Map_X
mapx
MAPX
MAPx

どれがいい?
637デフォルトの名無しさん:2006/03/19(日) 10:38:09
m_O_v_E_p_O_s
M_a_P_x
638デフォルトの名無しさん:2006/03/19(日) 10:41:54
THX
がんばってみるわ!

でも逆見にくいような・・・?
639デフォルトの名無しさん:2006/03/19(日) 10:56:37
movePos mapX
640デフォルトの名無しさん:2006/03/19(日) 11:55:33
>>636ハンガリアン記法
641デフォルトの名無しさん:2006/03/19(日) 12:18:34
クラス宣言で
typedef HRESULT (WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD);
こういう書き方がしてあったのですが、
(WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD)の関数を
呼び出してHRESULTにエラーコードを返すのだけの処理なのでしょうか?
typedefに続く構文で括弧が二つ続くものをあまり見たことが無いので戸惑っています。
642デフォルトの名無しさん:2006/03/19(日) 13:14:26
>>641

・IPStore **とDWORDとDWORDとDWORDを取って、
・HRESULTを返す、
・WINAPIな呼び出し規約の
関数」
へのポインタを、PStoreCreateInstancePtrと呼ぶ、という宣言。
643デフォルトの名無しさん:2006/03/19(日) 13:31:39
>>642ありがd、
もう一点だけ質問させてください
IPStore **というのはIPStoreの指すポインターのポインターだと
思うのですが、
IPStore *でポインター(メモリー上でIPStore関数を示すアドレス)で
IPStore **となるとどういう解釈になるのでしょうか?
644デフォルトの名無しさん:2006/03/19(日) 13:36:23
>>643
IPStore *型の値はポインタで、変数に格納できる。
これがIPStore *型の変数。
IPStore *型の変数へのポインタがIPStore **型の値。
645デフォルトの名無しさん:2006/03/19(日) 13:41:37
AA::BB
って関数みるんだけど::って何よ!
646デフォルトの名無しさん:2006/03/19(日) 13:42:00
実際自分でソース書いて検証してみます^^
647デフォルトの名無しさん:2006/03/19(日) 13:43:46
>>645
「の」
648デフォルトの名無しさん:2006/03/19(日) 13:45:55
クラスって構造体みたいなものなんだね・・・・orz
649デフォルトの名無しさん:2006/03/19(日) 13:49:01
わかったーーー!!
クラスだと思っていたけど
namespace
だった!!!!
うほぉぉぉ!!!!
650デフォルトの名無しさん:2006/03/19(日) 14:14:34
>>645
AAクラスのBBメソッド
651デフォルトの名無しさん:2006/03/19(日) 14:16:03
あれ、クラスでもつかうよな・・・?
俺間違ってる?(´・ω・)
652デフォルトの名無しさん:2006/03/19(日) 14:17:48
酔っ払ってんのか。
653デフォルトの名無しさん:2006/03/19(日) 15:23:02
#include <iostream>
#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;
}

エラーでる
654デフォルトの名無しさん:2006/03/19(日) 15:27:45
>>653
#includeとか#defineでスペースはいってないとかそういうんじゃなくて?
655デフォルトの名無しさん:2006/03/19(日) 15:28:54
そんじゃない。
656デフォルトの名無しさん:2006/03/19(日) 15:30:21
&timeか
657デフォルトの名無しさん:2006/03/19(日) 15:31:56
そうなのか
658デフォルトの名無しさん:2006/03/19(日) 15:34:32
time(time[0]じゃなく)の意味、&timeを考えて見ましょう
659デフォルトの名無しさん:2006/03/19(日) 15:41:55
GTime::Set(i,5);
消すとエラー消える
660デフォルトの名無しさん:2006/03/19(日) 15:56:15
timeという名前が悪い。
グローバルネームスペースに同名の関数がある。
661デフォルトの名無しさん:2006/03/19(日) 15:57:30
そりゃあ5以上になったらやばいだろ
662デフォルトの名無しさん:2006/03/19(日) 16:02:20
>>646デツ
こんな感じかなポインターのポインターって
#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);
}
663デフォルトの名無しさん:2006/03/19(日) 16:04:17
>660
名前変えて、も無理
664デフォルトの名無しさん:2006/03/19(日) 16:26:16
>>662
ちょっと違う。それからポインタを表示するときは%p。
printf("varのアドレスpは? ⇒ %p\n",p);
printf("pのアドレスppは? ⇒ %p\n",pp);
printf("ppのアドレスpppは? ⇒ %p\n",ppp);
665デフォルトの名無しさん:2006/03/19(日) 16:29:19
>>661に一票
666デフォルトの名無しさん:2006/03/19(日) 16:32:40

GTime::Set(i,5);
5は配列ではなく代入する値です。
3やに2変えても変わりません。
iが配列の番号
667デフォルトの名無しさん:2006/03/19(日) 16:33:50
namespace GTime {

struct st_time time[CTIME_MAX];

自分ではここが怪しいと思うんだが。。。
668デフォルトの名無しさん:2006/03/19(日) 16:36:37
このスレには初心者しかいないのかwwww
669デフォルトの名無しさん:2006/03/19(日) 16:41:35
>>668
【初心者歓迎】C/C++室 Ver.25【環境依存OK】ですが、なにか?
670デフォルトの名無しさん:2006/03/19(日) 16:42:50
>>664
あり〜
671デフォルトの名無しさん:2006/03/19(日) 17:35:30
struct st_time time[5];

void Set(int 9,int nm2) {
time[9].max=nm2;
return;
};
672デフォルトの名無しさん:2006/03/19(日) 18:15:30
本当だw
forよく見たらi<10になってる
i<CTIME_MAX(最大値)になってると思ったorz
673デフォルトの名無しさん:2006/03/19(日) 18:15:59
死にたい・・・・
すごい時間を無駄にしたorz
674デフォルトの名無しさん:2006/03/19(日) 21:06:29
C/C++を用いてWinsockとSMTP熱い関係語ったサイトご存知ありませんか
Winsock+VBのサイトはチラホラ見かけるんですが、
Winsockの解説自体は大体何処のサイトも
C/C++なんですがSMTPの解説少ないんですよね
宜しくオナガイシマス
675デフォルトの名無しさん:2006/03/19(日) 21:27:07
>>674
SMTPだけなら殆どWinsockを意識する必要もないだろ。
Winsock自体を使えるようになっていれば、SMTP喋らせるにはUnix系のソースで充分。
#確か、smtpsendなんてものがソースつきでどっかに転がってた希ガス。
676デフォルトの名無しさん:2006/03/19(日) 22:40:06
>>675
レスサンクス、書いた後にこの板でネットワークプログラミングのスレがあったので
ちょっとスレ違いだったような気がしたが、答えてもらったのでよかった^^
SMTPでメールを送信するソースは沢山見かけたのですが
漏れのプロバではPOP before SMTPで認証してPOP3サーバーにアクセスするので、
どれも使えなくて自分で実装しようと思い調べていたら、
Berkeleyソケット(Winsock)+SMTPという
組み合わせじゃないと、Outlookや鶴亀メールのようなソフトは作れないの
じゃないかと思い尋ねました、漏れの考え方が外れていたら指摘してください
677デフォルトの名無しさん:2006/03/19(日) 22:50:34
×Berkeleyソケット
○Berkeley API
678デフォルトの名無しさん:2006/03/19(日) 23:16:50
>>676
POP3認証をしてからSMTPするだけ。
679デフォルトの名無しさん:2006/03/20(月) 00:59:03
>>648
クラスと構造体はほぼ同じものです。
クラスのアクセス制限を全てpublicにすれば、それはとりもなおさず構造体の事です。
680デフォルトの名無しさん:2006/03/20(月) 01:43:31
>>679
その説明だと、構造体はメンバをprivateにできないと言っているようだ。
681デフォルトの名無しさん: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 で読み込まないといけないから、適用できなかった。
682デフォルトの名無しさん:2006/03/20(月) 02:01:23
>>681
動的 dll でググれ
683デフォルトの名無しさん:2006/03/20(月) 02:11:32
>>682
おかげでなんとかなりそうです。感謝。
684デフォルトの名無しさん:2006/03/20(月) 02:13:27
>>680
構造体、と言ったときは、Cの構造体(C++でいうPOD)のことをさしていると思うのだけれど。
C++のstructはクラスだろ?
685デフォルトの名無しさん:2006/03/20(月) 02:16:24
おれも、POD型を構造体と呼んで
それ以外のstructとclassはクラスと呼んでる
686デフォルトの名無しさん:2006/03/20(月) 03:34:33
>>684
俺もそれでいいと思うが
679の説明は、おかしいもしくは足りない。
687679:2006/03/20(月) 09:26:32
ごめ
688デフォルトの名無しさん:2006/03/20(月) 17:02:47
ヌルかもしれないメンバ変数ポインタの参照渡したいんですが
やはりヌルだったらどうなりますか?
689デフォルトの名無しさん:2006/03/20(月) 17:30:37
>>688
ポインタの参照渡すのにヌルかどうかは関係ないだろ。
渡した先でポインタの中身をどう使うかだ。
690デフォルトの名無しさん:2006/03/20(月) 19:31:57
Cではグローバル変数は良くないと聞いていて、↓の作ってみた
class 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();};
}

どこでも呼び出せるようにしたんだけど
どうみても効率が悪そう。
素直にグローバル変数にしたほうがいいでしょうか?
691デフォルトの名無しさん:2006/03/20(月) 19:35:13
void AA(){
STime::TimeGo();
return;
}

int main() {
STime::TimeGo();
AA();
return 0;
}
↑こんな風にどこでも使える。
int mainで変数初期化すると関数にいちいちポインタ渡すのが面倒なので。

・・・・意味プーかも。
692デフォルトの名無しさん:2006/03/20(月) 19:35:26
>>690
単純に置き換えればいいってもんじゃなくて、
C++にはC++の「設計」ってもんがあるんだ。
693デフォルトの名無しさん:2006/03/20(月) 19:41:22
結論からするとどれ?

・グローバル変数でどこからでもアクセス!
・ポインタを渡して渡して渡してがんばるぞ!
>>690のやつでめちゃくちゃにまとめて使うぞ!
694デフォルトの名無しさん:2006/03/20(月) 19:43:47
ケースバイケース
695デフォルトの名無しさん:2006/03/20(月) 19:46:54
>>694
エ〜〜〜><

じゃ、グローバルにしようかな一番簡単だし・・・><
696デフォルトの名無しさん:2006/03/20(月) 19:48:26
別に問題無い
697デフォルトの名無しさん:2006/03/20(月) 19:48:48
俺もそういうときどうすればいいのかいつも困るんだが、ケースバイケースか、まあそうか・・・

俺の場合>>693に加えて、クラスの関数をどれもこれもstaticにしてしまうこともある
もちろん必要なメンバ変数もstatic

デザインパターンとか学ぶと参考になったりするものあるのかな
698デフォルトの名無しさん:2006/03/20(月) 20:00:43
グローバル変数がよくないのは、
・どこからからでも参照できるので発見しにくいバグの原因になりやすい。
・マルチスレッド対応を難しくする
といった点である。特に後者の弊害が顕著な糞実装の例としてRubyを挙げておこう。
699デフォルトの名無しさん:2006/03/20(月) 20:05:04
マルチスレッドじゃなくても、コールバック関数内で
グローバル変数扱うときにも注意が必要だな
700デフォルトの名無しさん:2006/03/20(月) 20:12:31
>>696
OKですか^^

>>697
お互いがんばりましょう><

>>698
やっぱり危ないんですね。
>>690でのやりかたでがんばってみます><

>699
マルチスレットつかってないので平気です^^
コールバック?
分かりません><
701デフォルトの名無しさん:2006/03/20(月) 20:22:16
>>690の使い方であってますか? クラスと空間。

正常に動くのですが、関数をまた関数でまとめてるし う〜〜ん^^;
適当に作ったので、ちゃんとした書き方なのか、わかりません><
702デフォルトの名無しさん:2006/03/20(月) 21:17:40
プログラム板で全角英数使う奴って、プログラマに必要な何かが無い気がする。
703デフォルトの名無しさん:2006/03/20(月) 21:19:40
>>702
突っ込むところ、そこですか><
704デフォルトの名無しさん:2006/03/20(月) 21:32:50
>>702
なんとなくワカル。
>>より>>の方が無駄がない、という感覚的な話だと思っているが。
705デフォルトの名無しさん:2006/03/20(月) 21:37:48
>>704
いちいち変えるのが面倒なのです。
見た目は良くないですが><
706デフォルトの名無しさん:2006/03/20(月) 22:00:09
>いちいち変えるのが面倒
>見た目は良くなくてもOK

なるほど
707デフォルトの名無しさん:2006/03/20(月) 23:04:45
>>689
あり^^
708デフォルトの名無しさん:2006/03/20(月) 23:07:00
>>690
せめてSingletonパターンにしようよ。
709デフォルトの名無しさん:2006/03/21(火) 00:02:33
べつに、シングルトンにする意味はないんじゃないの?
普通に必要なときにインスタンス作って使えば?
710デフォルトの名無しさん:2006/03/21(火) 05:14:30
例外処理に関して独習C++(P360)を読んで勉強してたのですが、

「・・・例外が投げられると、制御はcatchに写り、tryブロックは終了します。
このときcatchは呼び出されるのではなく、プログラムの制御がcatchに移動します。
このためスタックは自動的に再設定されます・・・」

と説明されていましたが、「スタックが自動的に再設定」とは何がどうなることでしょうか?
(stackというとLIFOしか出てこない
誰か説明おねがいします
711デフォルトの名無しさん:2006/03/21(火) 05:15:48
独習C++ウンコだなwwwww
712デフォルトの名無しさん:2006/03/21(火) 06:16:24
そこでLoki::SingletonHolderですよ
ところでboostに似たようなのあったっけ?
713デフォルトの名無しさん:2006/03/21(火) 06:22:07
スタック〜の部分は重要じゃないので無視していいよww
制御が移動するってことだけで十分www
714デフォルトの名無しさん:2006/03/21(火) 06:39:48
スタックレジスタを再設定するっていいたいんだろうが
んなこといきなり言われてもな。
混乱するつーの
715710:2006/03/21(火) 06:45:09
つまり、CPU内部のぷろぐらむかうんたーだとかレジスタのすたっくがどうのこうの、
という認識で宜しいでしょうか

//独習Cはまあそれなりに読みやすかったので、著者ではなく訳&監修がイマイチなのではないかと
716710:2006/03/21(火) 07:17:01
訂正

tryブロックでデフォルト(auto)で宣言された変数などは、スコープからはずれて・・・という解釈でもイイですか?
717デフォルトの名無しさん:2006/03/21(火) 08:05:31
>>716
あー、たぶんそうだよ。
718710:2006/03/21(火) 08:16:15
>>713-714
>>717
どうもです。
719デフォルトの名無しさん:2006/03/21(火) 12:57:47
C++で無効ポインタは整数定数0を代入するということを
本に書いてあるとおりやってきましたが、実際なぜにNULLで
なくて0なのでしょうか。
720デフォルトの名無しさん:2006/03/21(火) 13:02:16
そういう仕様だからとしかいえない。
721デフォルトの名無しさん:2006/03/21(火) 13:02:34
722デフォルトの名無しさん:2006/03/21(火) 13:28:13
>>719
CでもC++でもヌルポインタは(ポインタ型の)0と決まっている。

しばしばCでは#define NULL (void *)0という定義がなされるが、
C++ではvoid*型から他のポインタ型への変換はできないので、
大抵#define NULL 0という定義になる。

だったら初めから0を使えばいいだろということ。
723デフォルトの名無しさん:2006/03/21(火) 13:41:39
まあ、俺は NULL を使うけどな。
正直、ヌルポインタとして 0 を直接書くのは
マジックナンバーだと思う。
724デフォルトの名無しさん:2006/03/21(火) 13:51:33
コンパイラ実装者からすれば、ポインタかどうかとは関係なく
数値「0」として一言でまとめたほうが楽だろうしな。
クラスメンバの初期値しかり。
725デフォルトの名無しさん:2006/03/21(火) 14:00:38
そこでNullClassですよ。
726719:2006/03/21(火) 14:00:43
レスどうもです。
例えば関数の仮引数がint*型だったとして、
そこに実引数NULLをわたすとコンパイルでエラーになるかも
しれないけど、0なら大丈夫ってこと?
727デフォルトの名無しさん:2006/03/21(火) 14:06:11
>>726
エラーになることはない。どちらを使っても同じ意味。
ただし NULL を使うためにはヘッダのインクルードが必要。
728719:2006/03/21(火) 14:15:06
#define NULL (void *)0
とされているC++コンパイラはないってこと?
729デフォルトの名無しさん:2006/03/21(火) 14:19:50
>>728
その通り。
730デフォルトの名無しさん:2006/03/21(火) 14:23:19
勘違いしていないか?
「無効ポインタが0」というのは、「ポインタ変数の値が0だとコンパイルエラーになる」というわけではないぞ。
ポインタ変数が0だった場合に無効だと判断してエラールーチンを書くのがプログラマの仕事だ。
そして、0ポインタに対するエラー処理を書か書かなければ、それは実行時のエラーとして発現することになる。
731730:2006/03/21(火) 14:25:03
勘違いは俺か。型の話をしているのね。
732デフォルトの名無しさん:2006/03/21(火) 15:43:59
0 というリテラルがヌルポインタとして判断されるわけじゃなく、
0 になる整数定数値がヌルポインタとして判断されるんだよね。

 static const int a = 0;
 static const int b = 1;
 int* p = a;
 int* q = b - 1;

こういうのも通る。
こんな仕様でええんかいとは思うが。
733デフォルトの名無しさん:2006/03/21(火) 15:59:25
どうでもいいが、STATIC_ASSERTに使えるな。

#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)))}
734デフォルトの名無しさん:2006/03/21(火) 16:04:34
>>733
つBOOST_STATIC_ASSERT
735デフォルトの名無しさん:2006/03/21(火) 20:19:48
クラスaをメンバに持つクラスbにおいて、
aのデフォルトコンストラクタを定義しておいても
bを宣言しただけではメンバのaオブジェクトは初期化されないのですか?
bのコンストラクタで初期化しないと駄目ですか?
736デフォルトの名無しさん:2006/03/21(火) 20:24:45
>>735
必要ない。
737デフォルトの名無しさん:2006/03/21(火) 20:27:21
>>732
D&Eでもそれには呆れるルールだと書いてある。
738デフォルトの名無しさん:2006/03/21(火) 20:30:52
>>736
あり^^
739デフォルトの名無しさん:2006/03/21(火) 20:48:58
ぬるぽ
740デフォルトの名無しさん:2006/03/21(火) 21:23:54
非デフォルトコンストラクタの引数の全てにデフォルト値を記入してある場合、
デフォルトコンストラクタはつくらなくともデフォルトコンストラクタの要請に耐えられますか?
741デフォルトの名無しさん:2006/03/21(火) 21:40:35
>>740
//例えば
class foo {
type member1;
type member2;
foo(type arg1 = 0, type arg2 = 0) : member1(arg1), member2(arg2) {}
};
//こういうクラスで
foo bar;
//こうできるかってこと?
742デフォルトの名無しさん:2006/03/21(火) 21:49:47
privateメンバなのでそれはできませんね
743デフォルトの名無しさん:2006/03/21(火) 21:58:49
>>740
少し勘違いしているようだが、「引数なしで呼び出すことができるコンストラクタ」を
「デフォルトコンストラクタ」と呼ぶことになっているので、すべての引数に
デフォルト値があればそれがデフォルトコンストラクタになる。
744デフォルトの名無しさん:2006/03/21(火) 22:35:09
>>741
>>742さんのチャチャ入れを考慮して、そういうことです。

>>743
分かりました。あり^^
745デフォルトの名無しさん:2006/03/21(火) 22:58:36
return と exit はどう違うの? どう使い分ければいいの?
746デフォルトの名無しさん:2006/03/21(火) 23:02:36
e---------!!!
747デフォルトの名無しさん:2006/03/21(火) 23:06:37
>>745
returnはC/C++の予約語で、exitは標準関数。
C++ではexitは使わない方がいい。オブジェクトのデストラクタが走らない。
748デフォルトの名無しさん:2006/03/22(水) 04:36:10
走らないと即ちメモリリークですか?
749デフォルトの名無しさん:2006/03/22(水) 05:07:17
メモリは開放されるが、適切な終了処理が行われない。
例えば、設定が保存されないとか。
まあ、どういう実装にしてるかによるけど。
C++ なら、exit じゃなく素直に例外機構を使うべし。

>>745 は main での話っぽいので、その場合は常に return を使うべし。
つーか、C でもそうしろ。
750デフォルトの名無しさん:2006/03/22(水) 12:39:23
>>745
return … 呼び元に値を返す
exit() … プロセスを終了する

但し、main()でのreturnは、exit()と等価の動作を行う。
751デフォルトの名無しさん:2006/03/22(水) 15:14:36
>>750
mainでexitしてもグローバルオブジェクトのデストラクタは走らないんじゃね?
752デフォルトの名無しさん:2006/03/22(水) 15:31:40
>>751
どこでexitしようがグローバルオブジェクトのデストラクタは走る。
753デフォルトの名無しさん:2006/03/22(水) 15:52:10
一体誰を信じて生きてゆけばいいんだ
754デフォルトの名無しさん:2006/03/22(水) 15:54:37
実際の振る舞いを信じればいいよ
755デフォルトの名無しさん:2006/03/22(水) 15:58:11
つまりVC++6.0を信じろと。
756デフォルトの名無しさん:2006/03/22(水) 15:59:25
それは無理
757デフォルトの名無しさん:2006/03/22(水) 16:03:24
ていうかきちんと終了処理がされないexitは何のためにあるんだ?
758デフォルトの名無しさん:2006/03/22(水) 18:53:52
STLのstringの派生クラスを作ろうとして

class exstring : public std::string {
};

てなのを取り合えず書いてexstringのオブジェクトを
生成したんですが、stringのメンバが使えません。
どこが悪いのでしょうか?
759デフォルトの名無しさん:2006/03/22(水) 18:57:36
exit時に終了処理をさせたいときは、atexit を事前に呼ぶ。
Cで使うときのためにあるんでないの?
760デフォルトの名無しさん:2006/03/22(水) 19:39:13
>>758
それだけじゃ何も悪いと思えませんが、なぜ使えないんですか?
761デフォルトの名無しさん:2006/03/22(水) 19:51:42
コンストラクタや演算子が使えないという話かと予想してみる
762デフォルトの名無しさん:2006/03/22(水) 19:54:43
>>758
よくわからんけどこうしてみたら?
class exstring : public std::string{
public:
exstring() : std::string(){}
exstring(const char *str) : std::string(str) {}
};
763758:2006/03/22(水) 20:11:54
>>761
すみません、そうでした。
メンバ関数や変数は使えたんですが、演算子が使えません。

>>762
それで大体上手くいきましたが、
exstring es;
es = es + "aaa";
てなコードが通りません。
exstring型を扱える演算子を宣言しなおさないとダメだんでしょうか?
764デフォルトの名無しさん:2006/03/22(水) 20:15:43
すっぱりと継承するのをあきらめたほうがいい。
765デフォルトの名無しさん:2006/03/22(水) 20:19:40
宣言しなおさないとダメだと思うおwww
766デフォルトの名無しさん:2006/03/22(水) 20:31:31
operator string()を実装すれば通ることは通る。

・・・・・・いまいち使いどころが分からんが。
767758:2006/03/22(水) 20:42:37
どうもありがとうございます。
継承するのあきらめました。
768デフォルトの名無しさん:2006/03/22(水) 20:43:35
stringを拡張したいって思っただけだろ?
769758:2006/03/22(水) 20:51:18
>>768
ええ、そのとおり。
メンバ関数増やしたり、一部の演算子を変えたり
したかったんですが、派生以外の方法でやってみますわ。
770デフォルトの名無しさん:2006/03/22(水) 20:54:36
関係ないがみんなは
return 0;派?
return(0);派?
771デフォルトの名無しさん:2006/03/22(水) 21:01:36
>>770
> return(0);
おれ、こんなの見たことあったかなぁ・・・・
772デフォルトの名無しさん:2006/03/22(水) 21:09:50
retrun(-1);
773デフォルトの名無しさん:2006/03/22(水) 21:11:16
return();
が通らないし打つのめんどいし絶対括弧つかわね
774デフォルトの名無しさん:2006/03/22(水) 21:15:58
>>758
std::stringは仮想デストラクタじゃないし継承しちゃダメ。
775デフォルトの名無しさん:2006/03/22(水) 21:29:13
直接STLのソースを書き換えるのがいいよwww
776デフォルトの名無しさん:2006/03/22(水) 22:26:32
>>774
× 継承しちゃダメ
○ 公開継承しちゃダメ
777デフォルトの名無しさん:2006/03/22(水) 23:10:15
BCC5.5です
Cソース内のある関数内の変数の値の変化を全て txt に書き出したいのですが
どうすればいいですか fprint などを試したのですがいい方法が浮かびません
778デフォルトの名無しさん:2006/03/23(木) 00:00:04
>>777
fprintfでいいと思うが。
779デフォルトの名無しさん:2006/03/23(木) 00:25:35
>>776
言葉が足りなかった。ありがとう。
780デフォルトの名無しさん:2006/03/23(木) 00:40:22
>>777 どんな結果を期待しているのかわからない。
781デフォルトの名無しさん:2006/03/23(木) 00:42:10
値を代入したりするたびにfprintfするの面倒だから自動化できないか
とかって言いたいんじゃね?
782デフォルトの名無しさん:2006/03/23(木) 00:54:01
>>777
> fprint などを試したのですがいい方法が浮かびません
とは何を意味するのか(ただの脱字だよね)?
 1.fprintfを試したが上手くいかなかった。
 2.fprintfを試し上手くいったが、もっといい方法はないのか。
どちらかな。
783デフォルトの名無しさん:2006/03/23(木) 02:56:03
>>781
そこでAspect指向
784誤字脱字あったらすいません:2006/03/23(木) 05:36:52
「stackクラスを修正し、型の異なる2つのオブジェクトをスタックに格納できるように〜」という問題で、解答が↓の様になっていました

template <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などは作れるのでしょうか?
785デフォルトの名無しさん:2006/03/23(木) 05:42:44
>>784
作れる。
学習中っぽいので実際にどう作るかを教えるつもりは無いが、
とりあえずその問題と解答出したやつは殺していい。
786デフォルトの名無しさん:2006/03/23(木) 05:50:42
超ド級の無能教官だな
とりあえず
template <class X, class Y>
class stack {
X stck[SIZE];
Y stck[SIZE];
...
};
ってな感じになるんだろうが、激しく使いづらいなw
787デフォルトの名無しさん:2006/03/23(木) 06:04:31
BCCの無料バージョンを使っています
自作ヘッダファイルを機能させるには、どうしたらいいですか
788デフォルトの名無しさん:2006/03/23(木) 06:06:48
インクルードすればいい
789787:2006/03/23(木) 06:09:59
したのですが、よみこんでくれません
790784:2006/03/23(木) 06:11:34
>>785-786 分かりました。ありがとうございます。

template <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種類(別の型で)生成するのが良いのでしょうか?
791デフォルトの名無しさん:2006/03/23(木) 06:12:50
>>786
それはスタックなのか?
あえて書くと、こんなものだと思うのだが。

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() ;
} ;

何にせよ、こんなもの使いたくないな。
792787:2006/03/23(木) 06:29:42
といいますか、ヘッダのPATHをMAKEで設定するにはどうしたらいいですか
793デフォルトの名無しさん:2006/03/23(木) 09:02:03
template<class T1, class T2>
class stack2 : public stack<std::pair<T1, T2> >
{
...
};
794デフォルトの名無しさん:2006/03/23(木) 09:30:24
>>788
自分のなら#include "〜"でいいだろ。
795デフォルトの名無しさん:2006/03/23(木) 10:30:28
>>789
#include <XXXX.h> //環境変数 INCLUDE から探してインクルード
#include "XXXX.h" //include元のファイルと同じディレクトリから探して、
         //無かったら環境変数 INCLUDE から探してインクルード
796デフォルトの名無しさん:2006/03/23(木) 10:42:36
>>795
環境変数とは限らんがな。
797デフォルトの名無しさん:2006/03/23(木) 10:52:56
いやまあそうだが長くなるので・・・
798デフォルトの名無しさん:2006/03/23(木) 11:28:40
まぁ要は何かの設定による
799デフォルトの名無しさん: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;//ひっくり返す
800デフォルトの名無しさん:2006/03/24(金) 09:16:58
>799
動くかどうかよく分かってないものを「作ってみた」と言えるかどうかはさておき、
まずは適切に改行をすることから始めてみようか。
あと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方向じゃないので斜めもちゃんとやれな。
801デフォルトの名無しさん:2006/03/24(金) 13:34:15
>>799
>if(i == 1)e=2;//敵を判断
好みもあるけど、こういうのはコメントを入れるよりは
名前のついた関数(あるいはマクロ)を使った方が良いと思う。例えば、
e = opponent_of(i);

>for(...
これも好みだが、for文の第一式、第三式ではループに関係ない変数をいじらない方が良いと思う。
最初のforではcntはループに無関係だし、
二番目ではsxが無関係。

>>800
>・おそらく2人対戦オセロだろうからiやeのとりうる値は2種類だと推測するが、
iやeはそうだが、boardの各要素は俺なら「先手、後手、未着手」の三種類だと推測する。
このコードのままでも外周に「未着手」状態の番兵があれば範囲外アクセスは起こらないな。
802デフォルトの名無しさん:2006/03/24(金) 13:58:58
いつも思うのだが、
count を cnt と書くといいことがあるのだろうか・・

ってすれ違いだな
803デフォルトの名無しさん:2006/03/24(金) 14:02:51
ときどき cout を count とタイプミスする。
指がかってに n を追加してしまうのだ。
804デフォルトの名無しさん:2006/03/24(金) 14:06:42
その昔、C++を始めたころ
cout を「コォゥト」と読んでいた。
あるとき、「シーアウト」であることに気づいた。
同時に、cin の読みも「シン」から「シーイン」にかわった。
805デフォルトの名無しさん:2006/03/24(金) 14:14:03
    _____
   /二二ヽ
   ||・ω・||  <いやどっちでもいいし
.  ノ/  / >  <いやどっちでもいいし
  ノ ̄ゝ
806デフォルトの名無しさん:2006/03/24(金) 14:19:30
>>804がcerrをなんと読んでいたのか気になる。
807デフォルトの名無しさん:2006/03/24(金) 14:22:09
俺なんかいまだに gets() を「ゲッツ」と読んでいるぜ。
あ、当然 puts() は「プッツ」な。
808デフォルトの名無しさん:2006/03/24(金) 14:31:26
俺はgets()関数を使うときダンディ坂野を思い出してしまう。
809デフォルトの名無しさん:2006/03/24(金) 14:43:50
>806
804じゃないがセラーと呼んでいた。
今でも脳内では呼ぶが他人と話すときにはシーエラー。

>808
gets()を使っちゃいけませんと茶々を入れてみる。
810デフォルトの名無しさん:2006/03/24(金) 14:45:20
非標準関数のgetch()をゲッチと呼んでいた。putch()はプッチ。
stdinをストゥドゥインとか。これは誰でもそうか。
>>808
あー懐かしいですね。
811デフォルトの名無しさん:2006/03/24(金) 14:48:34
このあいだNHK教育で見たぞ坂野
812デフォルトの名無しさん:2006/03/24(金) 15:11:25
略語の意味もちゃんと説明してほしかった>入門書
ソース音読したらどうみてもオレ語です。
813デフォルトの名無しさん:2006/03/24(金) 15:26:08
Cは識別子の長さをC89以降でようやく31文字認識するように
なったが、それ以前は6文字だったから、やたらと略語が多い。
FORTRANと同じだなそこら辺の事情は。
814デフォルトの名無しさん:2006/03/24(金) 15:28:53
create()ではなくてcreat()なのが未だに理由がわからん。
815デフォルトの名無しさん:2006/03/24(金) 15:32:30
>814
そこはKen Thompsonに言え。
むかーーーしの話だし、メモリ節約したかったとか?
816デフォルトの名無しさん:2006/03/24(金) 15:35:19
>>814
ある音に、どういうアルファベットの羅列を当てるかというのは、かなり曖昧。
言後ごとに、音の崩れや、無音になることもあるし。

日本語だと、そういうことは気にならないけどね。
817デフォルトの名無しさん:2006/03/24(金) 15:38:04
>816
え?
818デフォルトの名無しさん:2006/03/24(金) 15:46:09
配列でクラスのコンストラクタに引数を渡したいのですが
そういった場合はどのように指定すればいいのでしょうか?
myclass data[10][10](1234);
と言うようにしたらエラーになってしまいコンパイルすることができませんでした。
819デフォルトの名無しさん:2006/03/24(金) 15:46:48
>>816
おまえ高卒?
820デフォルトの名無しさん:2006/03/24(金) 15:53:08
myclass data[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
data[i][j] = new myclass(1234);
821デフォルトの名無しさん:2006/03/24(金) 15:58:35
>>820
一つ一つやっていくしかないんですね。
ありがとうございます。
822デフォルトの名無しさん:2006/03/24(金) 16:35:32
>>820
C++でそりゃないだろ。
823デフォルトの名無しさん:2006/03/24(金) 16:51:10
>>822
考え方
824デフォルトの名無しさん:2006/03/24(金) 16:54:28
考え方はともかくmyclassの配列にmyclass*を代入してどうする
825デフォルトの名無しさん:2006/03/24(金) 17:03:59
>>823
初心者はシコシコ入門書でも読んでろよw
826デフォルトの名無しさん:2006/03/24(金) 17:37:42
>>825のがよっぽど初心者
827デフォルトの名無しさん:2006/03/24(金) 17:56:33
myclass *data[10][10];
こうだよな?
828デフォルトの名無しさん:2006/03/24(金) 18:06:01
myclass* data[10][10];
こうだよ。
829デフォルトの名無しさん:2006/03/24(金) 18:24:26
どう違うんだ?
830デフォルトの名無しさん:2006/03/24(金) 18:28:44
気持ち
831デフォルトの名無しさん:2006/03/24(金) 18:39:25
myclass * data[10][10];
間をとって。
832デフォルトの名無しさん:2006/03/24(金) 18:44:13
そういう中途半端なのは許せない。
833デフォルトの名無しさん:2006/03/24(金) 18:51:18
じゃあ思い切って
*myclass data[10][10];
834デフォルトの名無しさん:2006/03/24(金) 20:05:47
typedef myclass *pmyclass;
pmyclass data[10][10];
でいいよ
835デフォルトの名無しさん:2006/03/24(金) 20:18:53
n?
836デフォルトの名無しさん:2006/03/24(金) 21:32:30
operator =が十分に使えるなら、一時オブジェクトもありだな。
myclass data[10][10];
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++)
        data[i][j] = myclass(1234);
837デフォルトの名無しさん:2006/03/25(土) 03:09:31
>>820
std::auto_ptr data[10][10] にして data[i][j].reset(new myclass(1234)) にしないと漏れる。
838デフォルトの名無しさん:2006/03/25(土) 03:10:25
>>836
デフォルトコンストラクタも必要になってる。
839デフォルトの名無しさん:2006/03/25(土) 03:21:08
も、もれちゃう
840デフォルトの名無しさん :2006/03/25(土) 03:58:30
DirectXの、あるオブジェクトを初期化するときに
コールバック関数を設定する必要のある部分があるんですけど、
それの実装がどういう風になっているのか気になっています。

g_pHoge->Initialize(NULL, MessageHandler, 0 );

第一引数は、コールバックがグローバルならNULLでよくて、
コールバックがクラスのメンバで、そのクラスの中で初期化するときなどは(PVOID*)thisを渡したります。
第二引数は、指定の型を満たした、ユーザーがコールバックとして使いたい関数へのポインタです。
第三引数は特にここでは関係ないです。

一応、こんな感じの構文です。

HRESULT Initialize(
PVOID const pvUserContext,
const PFNDPNMESSAGEHANDLER pfn,
const DWORD dwFlags
);

このようにクラスの型(グローバルならNULL)と関数へのポインタを渡したとして、
ライブラリ内部ではどんな感じで呼んでいるのでしょうか?
こんな感じで書かれてるんじゃないか?というのがありましたら、
可能でしたら具体的に例示して教えてください。お願いします。
841デフォルトの名無しさん:2006/03/25(土) 04:20:07
if(pvUserContext)
(pvUserContext->*pfn)(〜);
else
(*pfn)(〜);

こんな感じだっけ。
842840:2006/03/25(土) 04:37:54
(pvUserContext->*pfn)(〜);

なるほどこういう書き方ができるんですね。
以前コールバックの実装について伺ったときに、boostを使った
実装法などを教えていただいて結構勉強になったのですが、
呼ぶときに分岐するのさえ我慢すれば
グローバルかメンバかを問わないコールバックは
簡単につくれるんですね。ありがとうございました。
843デフォルトの名無しさん:2006/03/25(土) 04:43:21
俺、コールバック使わせるAPI嫌いだから使わなーいw
844デフォルトの名無しさん:2006/03/25(土) 04:49:35
コールバック使えないとソートもできない罠
845デフォルトの名無しさん:2006/03/25(土) 04:55:36
は?
846デフォルトの名無しさん:2006/03/25(土) 05:04:59
あれだろ。
リストビューのあの上っちょにあるボタンを押したときの動作をソートっていってんだろ?
あんなもんメッセージ拾って自前で格納しなおせばできるんだよ。>>>844

コールバックなんて強制されるのはウィンドウプロシージャとかDirectXのデバイスの列挙ぐらいなもんだろ。
847デフォルトの名無しさん:2006/03/25(土) 05:42:28
>>840-842
なに言ってんの?
その pfn には非 static メンバ関数は渡せないだろ。
PFNDPNMESSAGEHANDLER の第1引数を
pvUserContext で設定できるだけ。
848840:2006/03/25(土) 06:19:16
>>847
ああ、ほんとですね、staticでした。
コールバック関数としたいのがメンバの場合はstaticにしないといけないけど、
実際それが呼ばれるときには、設定時にあらかじめ一緒に渡しておいたthisを貰うことで、
同クラスの非staticなメンバ変数とかにアクセスできるようにしてるって感じでしょうか。
849デフォルトの名無しさん:2006/03/25(土) 06:20:58
つか、>>840は何が気になっててそんなこと調べてるのかわからん。
どうせ聞くなら問題そのものをズバっと聞きたまえ。

「どんな感じで呼んでるのでしょうか?」それが予想できたところで
アホなんだからどうすればいいか?までどうせわからないんでしょw
どうせ聞くなら全部聞いてけやw
850840:2006/03/25(土) 06:26:57
なにこのキチガイ。
851デフォルトの名無しさん:2006/03/25(土) 06:33:38
>>850
それはお前のほうでしょ?
さっきから、何が問題なのかいいもしないで「どんななってますか?」みたいな
あいまいな質問して時間の無駄まるだしなことしてんだから。
いきてる時間が無駄だと思わないの?w
852840:2006/03/25(土) 06:39:15
いやもういいです。
話の通じる人に答えてもらって解決してるんで。
酔っ払いは新でください。
853840:2006/03/25(土) 06:40:33
キチガイは氏ね。
854デフォルトの名無しさん:2006/03/25(土) 06:40:53
おまいら落ち着けw
855840:2006/03/25(土) 06:42:44
>>854
私は落ち着いてますよ。
そういうことは>>851みたいな嫌がらせしかできないキチガイに言ったらどうですか。
856840:2006/03/25(土) 06:45:43
やはりここはID表示した方がいいと思う。
857840 ◆bknIp0a9D. :2006/03/25(土) 06:47:28
>>856
誰だお前?
858デフォルトの名無しさん:2006/03/25(土) 06:48:21
->*とか.*演算子って美しいと思いませんか?
859デフォルトの名無しさん:2006/03/25(土) 06:48:46
>>855
いや、俺はちゃんと「何が問題」で「どうしてそれを知る必要があるのか?」ってのをちゃんと書けといっただけなんだけど?
なんでいきなり「嫌がらせ」なのかわけわからんね。

だいたい知りたいのはAPIの使い方なんだろ?
そしたら、「どうなってます?」ってより、「こうしたいです。」の方が得られるリターンが多いとは思わん?
レスから君にも考えがあることはわかるけど、ライブラリの内部の処理とかわからんこと聞くより、
APIをどう使っているか?の詳細を聞いたほうがよっぽどいいんじゃないの?

ってことだけど。
いきなり怒り出すし、沸点無駄に低いと損するよw
860デフォルトの名無しさん:2006/03/25(土) 06:52:35
>>858
たしかにそれらはかなり美しいのだが
operator,()には負けると思う
861デフォルトの名無しさん:2006/03/25(土) 06:54:26
なんかカオスになってますね
862デフォルトの名無しさん:2006/03/25(土) 08:28:55
>860
boost::spiritの演算子の変態的使いっぷりには負けるな
863デフォルトの名無しさん:2006/03/25(土) 10:59:29
>>856
ID表示の変更は一切受け付けないのが2chの方針。
864デフォルトの名無しさん:2006/03/25(土) 11:03:41
VC8です、なんか荒れているみたいで質問しずらいのですが
宜しくオナガイシマス
comboBox1のプロパティItemsに
hoge1
hoge2
hoge3
を追加して
comboBox1から選択してbutton1をクリックしたら、変数fooに代入したいのですが
どう書いたらいいですか?
865デフォルトの名無しさん:2006/03/25(土) 11:07:33
>863
それっていつの話? 明文化されてる?
途中からID表示制になった例を2件ほど知ってるけど。
866864:2006/03/25(土) 11:15:11
スマソ続きです
this->comboBox1->Items->AddRange( objectArray );
String^ foo;
comboBox1->Items->Add( foo );
MessageBox::Show( foo );
こう書いたんですが
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
中略
値をNullにすることはできません。
パラメーター名:item
となってしまいます。
867デフォルトの名無しさん:2006/03/25(土) 11:24:02
String^ foo = comboBox1->SelectedItem->ToString();
とかじゃね?C++/CLIはようわからん。
868デフォルトの名無しさん:2006/03/25(土) 11:29:08
>>867
どうもありがとうございました
例外エラーも発生せずに、プログラムが動きました
Addじゃあなく、SelectedItemメソッドだったのか
MSDNで使い方よく調べます。
869デフォルトの名無しさん:2006/03/25(土) 11:55:30
870デフォルトの名無しさん:2006/03/25(土) 12:13:03
>869
なるほど、「設定変更依頼に答えるという形では」一切ダメなわけね。

ちなみに、ライトノベル板とアーケード板。
871初心者:2006/03/25(土) 12:17:54
質問

コマンドラインから

int main(int argc , char * argv[]){---------------------------}
みたいな
ポインタポインタが引き数であるmain関数に

ポインタポインタを引数を指定するにはどうしたら良いのですか?

また、
int main(int argc , char * argv){---------------------------}
みたいな時は、どう指定したら良いの?
872デフォルトの名無しさん:2006/03/25(土) 12:24:47
main関数はOSから呼ばれます
その際の引数は、プログラム実行時の文字列となります

また、int main(int argc, char * argv)のような引数は
コンパイルは通りますが正しくないと考えてください

int main(int argc, char *argv[]){ ...
int main(void){ ... }
873デフォルトの名無しさん:2006/03/25(土) 12:36:51
(出来上がったファイル名abc.exe)

中身
int main(int argc , char * argv[]){---------------------------}

にコマンドラインから数値と文字列(例:abc)を与えると
argvと*argvと**argvは何になりますか?


(その与え方もわからないですすいません)
ファイル名+スペース区切りですか?
例の場合の与え方を教えてください

874デフォルトの名無しさん:2006/03/25(土) 12:40:47
argcとargvでググレ
875デフォルトの名無しさん:2006/03/25(土) 12:47:26
与え方とか気にする必要無いし
876デフォルトの名無しさん: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
877デフォルトの名無しさん:2006/03/25(土) 13:36:25
どうも親切にありがとう>>876


argv:OSから与えられるポインターポインターで
(sample.exe test test )の3つの要素の配列の1つめを指して全体を指す

そしてアスタリスクをつけて
*argv=argv[0]="test"

って事でOK?
878デフォルトの名無しさん:2006/03/25(土) 13:43:52
ごめん間違った
*argv=argv[0]=sampleを指すポインター
ですね

printf("%dつ目の引数:%s\n", i, argv[i]);
ってつまり、ポインターから文字列を表示してくれるのかな?
879デフォルトの名無しさん:2006/03/25(土) 13:55:51
試してみれば?
880デフォルトの名無しさん:2006/03/25(土) 14:32:55
自分でやってみれば尤も手っ取り早くかつ確実なものを・・・
881デフォルトの名無しさん:2006/03/25(土) 14:36:52
自分で試したら教えてクンになれないだろ?
882デフォルトの名無しさん:2006/03/25(土) 14:54:54
質問スレなんだし答える気があるやつ以外書き込むなと
883デフォルトの名無しさん:2006/03/25(土) 14:56:54
>>882
オマイの事か?
884デフォルトの名無しさん:2006/03/25(土) 15:05:08
尤も
犬も
太も
大も
木も
ホモ
885デフォルトの名無しさん:2006/03/25(土) 15:12:15
>>879-881は不要かな
どうせ馬鹿が俺にもレス付けるんだろうけど
886デフォルトの名無しさん:2006/03/25(土) 17:06:21
自演乙
887デフォルトの名無しさん:2006/03/25(土) 20:02:00
C++で、nullポインタに対してDeleteしても何も行われないことが
保証されているようですが、C言語で同様のポインタにfreeすると
何か危険はありますか?
888デフォルトの名無しさん:2006/03/25(土) 20:12:24
void __cdecl _free_base (void * pBlock)
{
  if (pBlock == NULL)
    return;
889デフォルトの名無しさん:2006/03/25(土) 20:19:14
>>888
これってANSI C標準の実装ですか?
890デフォルトの名無しさん:2006/03/25(土) 20:32:49
>>889
違うはず
891デフォルトの名無しさん:2006/03/25(土) 20:38:01
とすると、やはりC言語ではnullに対してfreeしまくっては
まずいかもという感じですか
892デフォルトの名無しさん:2006/03/25(土) 20:52:39
>>887
何も行われない事が保証されている。
893デフォルトの名無しさん:2006/03/25(土) 20:53:31
>>891
規格上はfreeにNULLを渡すと無視することになってたはずだが。
894デフォルトの名無しさん:2006/03/25(土) 20:54:16
それお前の規格?
895デフォルトの名無しさん:2006/03/25(土) 20:55:47
>>894
ANSI だよ
896デフォルトの名無しさん:2006/03/25(土) 20:59:11
そもそもNULLを渡すという状況が信じられない。糞コードの可能性大。
897デフォルトの名無しさん:2006/03/25(土) 21:04:29
普通にあると思うが。
898デフォルトの名無しさん:2006/03/25(土) 21:15:54
>>896はif(p) free(p);とかやってるド低脳
899デフォルトの名無しさん:2006/03/25(土) 21:21:42
if(x) x->Release();
900デフォルトの名無しさん:2006/03/25(土) 21:21:55
K&Rに書いてますな・・・。
free(p);
pがNULLのときは何も起きないと。
901初心者:2006/03/25(土) 21:30:13
nullポインタを書き換えなければOKと違うの?
902デフォルトの名無しさん:2006/03/25(土) 21:33:18
出張してきますた。
  ∧_∧
 ( ´∀`) <NullPointerException
903デフォルトの名無しさん:2006/03/25(土) 21:47:01
>>902
      \       /       /              _ , .. - .....
 ┼┐\          \ | / _________----- ̄ ̄  /、):.:.:.:.:.:.:.:.:.:.:ヽ
 ││   ツ      イ  。 ‐‐‐‐‐‐‐───‐   /.:.::/::.:.:.:.:.:.:.:.:.:.:.:.:.:..i
               / | \  ̄ ̄──___  /.:.:.::ト;::::::::.:.::.:.:.:.;':.:.:.:.:}>
            / / |  \          l:;:i:.:.l、ノ;;:::.::::::.::::::::.::.:./::.:ヽ
           /  / │   \         川:.::|ゝ-'';;::;''"';:;::_:ノ ´!::.:.:l
         /   /  |         __ .. - ─ ナ!:lヽ    ̄ `ヽ  l::.:.:!
        /    /  │  __ --‐‐ ´       _リ ノ,,.:'      }   !::.:!
      /     ./      /           _ -'ー-'/::       '、  l:i.:l
     /             ノ._ノ´ヽ     _ -‐ ´    /    .. : : : : . ヽ 〃ノ
              _ -"´     }.   /      / _..=_.ニ,~_ヽ、   ヽ
          __ -‐ ´      /   /       ///::.::.::.::.::`:..、ヽ、  ヽ
     __.. -‐ ´ ̄ ヽ       / ..∠ノ      /, '/::.::.::.::.::.; -‐  ̄` 、_ヽ、l
__ -‐ ´         ヽ   /ー "´        { /::.::.::.::.:/      ヽヽ}
                 l. /               ヽ|::.:::::::::/         | /
                l/               {::::::::::/         l´
              /                |、:_::/             /
            /                     l /            /
          /                   V           /、
         /                     /         / ヽ

904デフォルトの名無しさん:2006/03/25(土) 22:33:56
ぱんつみえた
905デフォルトの名無しさん:2006/03/25(土) 23:03:15

        ┼─┐─┼─  /  ,.          `゙''‐、_\ | / /
        │  │─┼─ /| _,.イ,,.ィ'    ─────‐‐‐‐ 。 ←>>902
        │  |  │     |  |  | イン ,'´ ̄`ヘ、   // | \
                          __{_从 ノ}ノ/ / ./  |  \
                    ..__/   .` `,)((/  ./   |
        /,  -‐===≡==‐-`つ/ /| ノ ./' )))  /   ;∵|:・.
     _,,,...//〃ー,_/(.      / /ミ ノ   .{´ (('´ ./   .∴・|∵’
  ,,イ';;^;;;;;;;:::::""""'''''''' ::"〃,,__∠_/ ./ .,   .|゙
/;;::◎'''::; );_____       @巛  ( .,i.   ゙}
≧_ノ  __ノ))三=    _..、'、"^^^     \ !  }
  ~''''ー< ___、-~\(          ,'~"'/
      \(                 ,'.. /
906デフォルトの名無しさん:2006/03/25(土) 23:08:48
しかし。厳密に、「何も起きない」コードって何よ?
nopですら、タイミングをとる役目があるのに…。

free(NULL)をコンパイルすると、最適化では削除されると言うことか?
907デフォルトの名無しさん:2006/03/25(土) 23:08:50
質問です。

unsigned long l = 0;
LPCTSTR s = reinterpret_cast<LPCTSTR>(l);

↑をコンパイルすると、
warning C4312: 'reinterpret_cast' : 'unsigned long' からより大きいサイズの 'LPCTSTR' へ変換します。

と出ます。sizeofで調べても、共に4になるのですが、なぜwarningなのでしょうか。

VS2005です。
908デフォルトの名無しさん:2006/03/25(土) 23:12:01
C++のトレンドは?
909デフォルトの名無しさん:2006/03/25(土) 23:17:48
>>907
C4312で調べてみた?
「この警告は、/Wp64 が使用されている場合にのみ出されます。」とあるから
このオプション切ってみたら?
910nlp:2006/03/25(土) 23:23:58
>>909
ありがとうございます。解決しました。
64ビットで問題になるのは、intだけだと勘違いしていました。
911デフォルトの名無しさん:2006/03/25(土) 23:29:51
>>907
現在のVC++はWin64移行の手助けとして、/Wp64オプションがあり、それを使うと、
Win64で8バイトになる型とWin64でも4バイトのままの型との相互の変換は警告になる。

ようするにunsigned longをULONG_PTRにしてみろ。
912デフォルトの名無しさん:2006/03/26(日) 14:41:21
質問です。

A,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です。
913デフォルトの名無しさん:2006/03/26(日) 14:47:11
>>912
void*なんて使わないにこしたことはないこと、こんな設計になること自体がすでに糞ってのはわかった上での質問だよな?
現在じゃコールバック関数とかを無理やりクラスの中に封じ込めようとすると必要になるぐらいだろう。

まあ、そういうときはポインタを強引にキャストする。
ここ↓を

ActivePtr->call();←ここでクラス型がわからないのでエラーになる。

こう↓する

((A*)ActivePtr)->call();

だ。
914デフォルトの名無しさん:2006/03/26(日) 14:53:56
せめてもうちょっとマイルドに、 static_cast にしとけ。
915デフォルトの名無しさん:2006/03/26(日) 14:54:53
>>912
call() を定義したインターフェースクラスを作る。
916デフォルトの名無しさん:2006/03/26(日) 14:55:18
>>912
class Parent {
 ・
 ・
 ・
virtual void call() = 0;
};

class A : public Parent{...};
class B : public Parent{...};
class C : public Parent{...};

Parent* p;
p = &a;
p->call();

これじゃダメなのか?
917デフォルトの名無しさん:2006/03/26(日) 14:58:17
ポリモーフィズム
918デフォルトの名無しさん:2006/03/26(日) 14:58:52
漏れは>>915と同じことくらいしか思いつかなかったが、
これだけのためにクラスを一つ追加するのもなんだか気が進まないなぁ
919デフォルトの名無しさん:2006/03/26(日) 14:59:49
interace callable {
    void call();
}
920デフォルトの名無しさん:2006/03/26(日) 15:28:53
#include<memory>
struct 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();
}
921912:2006/03/26(日) 15:30:44
>>913
なにぶんCからC++をはじめたばっかりで設計もぼろぼろ
なのは自覚しております。
キャストしようにもActivePtrに保持しているのがどのクラス
のポインタなのかを意識せずに行いたいのですよね。

>>914〜919
実はC++はじめたばっかりなのでインターフェースもポリモー
フィズムもなんのことかいまいちよくわかっておりません。
せっかくアドバイス下さったのに不甲斐なくて申し訳ない。
これから調べてやってみますね。

アドバイス下さった方々、有り難うございました。
922デフォルトの名無しさん:2006/03/26(日) 15:37:55
>>918
なんとなく気持ちはわかるが作らんとどうしようもないんじゃないかね
923デフォルトの名無しさん:2006/03/26(日) 15:55:09
>>921
ならばひとつ聞くが、Cでそのような場合、同じ名前のメンバにアクセスする方法あるか?
924デフォルトの名無しさん:2006/03/26(日) 15:59:00
よく考えたらポインタしか格納しないから、
void* + 関数ポインタで十分か......

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();
}
925デフォルトの名無しさん:2006/03/26(日) 16:18:11
unsigned int x = 1;
signed 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));
}
926デフォルトの名無しさん:2006/03/26(日) 16:21:11
(signed)xじゃだめなの?
927デフォルトの名無しさん:2006/03/26(日) 16:26:30
>>926
x が signed int の上限を超えるとアウト。
unsigned int x = ~0;
signed int y = 1;
(signed)x > y; // => false
928デフォルトの名無しさん:2006/03/26(日) 16:26:43
>>925
signedとunsignedを比較するとき、signedはunsignedに型変換されるというルールがあるからね
自分で明示的にunsignedな変数をsingedにキャストするか、もっと大きなサイズの型にキャストするといい
929デフォルトの名無しさん:2006/03/26(日) 16:30:33
んじゃ(signed long)x

って、こんな表現あったっけw
930デフォルトの名無しさん:2006/03/26(日) 16:42:38
>>929
多くのコンパイラで sizeof(int) == sizeof(long) なので、それはダメ。
931デフォルトの名無しさん:2006/03/26(日) 16:43:57
じゃあlong long
932デフォルトの名無しさん:2006/03/26(日) 19:52:34
前略
ifstream 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");
をもう一度使うのは良くないでしょうか?他によい方法があったら教えてください。
933デフォルトの名無しさん:2006/03/26(日) 19:56:22
seekg()は入力ストリームに対して使用される。この関数は現在のストリームの"読み込み"位置を開始位置 からオフセット バイト分移動した位置か、位置 で指定された場所まで移動する。
934デフォルトの名無しさん:2006/03/26(日) 19:56:48
>>932
同じファイルを繰り返し読み込むのはよくないな。
"ABC" の検索と "DEF" の検索を両方1度にやればいいんじゃないの?
935デフォルトの名無しさん:2006/03/26(日) 20:21:14
>>933
上手くいきました、ありがとうございます。

>>934
そうですね、そちらの方法だとよりコードが綺麗になるかもしれないので試してみます。


皆様ありがとうございました。
936デフォルトの名無しさん:2006/03/26(日) 22:44:10
環境:VC2005 Express Edition

//--
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;
//--
937デフォルトの名無しさん:2006/03/26(日) 22:48:40
質問を書いている途中に送信してしまいましたorz

環境: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で書き込まれた領域はうまく開放できないのでしょうか?
938デフォルトの名無しさん:2006/03/26(日) 22:51:50
>>937
char* strA = new char[strALength];
strA[strALength] = '\0';
delete[] strA;
これだけで死ねるだろう。
939デフォルトの名無しさん:2006/03/26(日) 22:53:28
>>937じゃないが詳細きぼん
940デフォルトの名無しさん:2006/03/26(日) 22:58:09
937です。
とりあえず回線切って吊ってきます・・・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
すばやいご指摘ありがとうございました。
941デフォルトの名無しさん:2006/03/26(日) 23:03:04
       /つ 
  /つ   〈( ゚д゚)
  |( ゚д゚) ヽ ⊂ニ)
  ヽ__と/ ̄ ̄ ̄/ |
   ̄\/___/

       /つ 
  /つ   〈( ゚д゚ )
  |( ゚д゚ ) ヽ ⊂ニ)
  ヽ__と/ ̄ ̄ ̄/ |
   ̄\/___/

942デフォルトの名無しさん:2006/03/26(日) 23:04:10
>>940
memset() に渡すときのキャストは不要。っていうかヤメロ。
実は new char[strALength + 1]() と書けばゼロ埋めできる。
std::vector 使うと delete を書かなくて良くなる。ゼロ埋めも不要。
API の戻り値はチェックしとけよ。
943デフォルトの名無しさん:2006/03/26(日) 23:14:35
こっち見んな
944デフォルトの名無しさん:2006/03/26(日) 23:14:35
>>942
いろいろとご指摘ありがとうございます。参考にします。

独学だと気づいていない変なところいっぱいあるんだろうな・・・
945デフォルトの名無しさん:2006/03/27(月) 03:29:08
だから参考書を買うんだよ
#なかには char str = '本'; みたいなキチガイじみた参考書もあるけどねえ
946デフォルトの名無しさん:2006/03/27(月) 04:19:14
最初からあるint型とかdouble型とかに対してoperatorで演算子のオーバーロードってできないですか?
947デフォルトの名無しさん:2006/03/27(月) 04:39:49
やる意味があるかどうかはさておき、
class One{};

int operator+(One one, int i){
return i+1;
}
int operator+(int i, One one){
return i+1;
}

とかみたいなことはできるよ
組み込み型同士の演算子は再定義できないけど
948デフォルトの名無しさん:2006/03/27(月) 05:19:11
>>947ありがとうございます。やっぱり無理なんですね。
949デフォルトの名無しさん:2006/03/27(月) 09:16:34
>>945
それはさすがにJavaか何かだろ
950デフォルトの名無しさん:2006/03/27(月) 09:55:22
C#とか
951デフォルトの名無しさん:2006/03/27(月) 10:49:41
>>945
それ、前にどこかのスレで出てたな
見て驚愕した覚えがある

ちなみに確かにCの本だった
952デフォルトの名無しさん:2006/03/27(月) 10:56:42
>>951
うはwww夢がポンデリングwwwwwww
うp
953デフォルトの名無しさん:2006/03/27(月) 11:01:02
>951
前スレで出てたと思う
954デフォルトの名無しさん:2006/03/27(月) 11:03:30
Cをより原始的に簡単にしたC--があるとおもろいかも
955デフォルトの名無しさん:2006/03/27(月) 11:15:20
>>951
大当たり
ちなみにタイトルは「図解入門 よくわかる最新C言語の基本と仕組み」
956デフォルトの名無しさん:2006/03/27(月) 11:24:57
>>954
実は既にあったりする
957デフォルトの名無しさん:2006/03/27(月) 13:09:55
>>952
ttp://www.f-site.com/down.html
前スレから拾ってきた>>955を書いてる横田とかいう糞馬鹿のサイト
ここからサンプルコード落とせるからまぁ見てみれ
958デフォルトの名無しさん:2006/03/27(月) 14:04:20
エラッタ見てみるとおもろいな。
>※お詫びと訂正: 編集プロダクションとの行き違いにより、本書には多くの誤字があります。
なんじゃそりゃ。
959デフォルトの名無しさん:2006/03/27(月) 15:41:02
こいつが書いてるC#の本ちょっと読んだけどすさまじくだめそうだったなぁ・・・w
960デフォルトの名無しさん:2006/03/27(月) 15:51:10
libc(ランタイム)ってCの仕様に書かれてましたっけ?
961デフォルトの名無しさん:2006/03/27(月) 15:52:41
>>960
ライブラリ関数の事なら規格票(JIS X3010:1999)の第7章に列挙してある
962デフォルトの名無しさん:2006/03/27(月) 15:56:01
>>961
ライブラリ関数のことです。


未だにライブラリ関数がないOSがあるんで困るんだよね・・・
963デフォルトの名無しさん:2006/03/27(月) 17:04:32
そうそう、BTRONとかBTRONとかBTRONとか。
#ディレクトリの概念がないのはいいけど、そこに無理やりシェルを移植するから……
964デフォルトの名無しさん:2006/03/27(月) 17:25:17
>>963
そういやBTRONにも泣かされたなw

今はMona OSで中途半端なlibcが複数あるから困ってるww
965デフォルトの名無しさん:2006/03/27(月) 18:30:46
構造体Aのメンバに構造体Bを指すポインタを持たせ、
構造体Bのメンバに構造体Aを指すポインタを持たせるにはどうすればいい?

もちろん↓の様に書いてもだめなことはわかってるんだが。

struct A{
B *p;
};

struct B{
A *p;
};
966デフォルトの名無しさん:2006/03/27(月) 18:44:07
>965
struct B;
struct A{
B *p;
};

struct B{
A *p;
};

あ、あと前スレのごたごたの蒸し返し禁止ね。>各位
967デフォルトの名無しさん:2006/03/27(月) 18:47:39
ごたごた
968デフォルトの名無しさん:2006/03/27(月) 18:52:35
>>966
サンクス
969デフォルトの名無しさん:2006/03/27(月) 21:11:23
>>968
クラスでも同じことできるから覚えておくといい
970デフォルトの名無しさん:2006/03/28(火) 07:38:35
>>957
STEP2がまともに表示されないんですが
971デフォルトの名無しさん:2006/03/28(火) 20:02:59
質問です
しょうもない関数
例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合
オブジェクト指向で考えるとどこ設置するのでしょうか?
色々と調べた感じだと、名前空間をどうのこうのってのがあったんですが・・。
メソッドとするにはあまりにもひどすぎるし・・。
972デフォルトの名無しさん:2006/03/28(火) 20:06:05
大きいか小さいか、の定義はそのオブジェクト自身が知ることじゃない?
973デフォルトの名無しさん:2006/03/28(火) 20:11:25
>>971
そんなものオブジェクト指向にせず、ただの関数にしろ。
そして名前空間はオブジェクト指向と直接の関係があるのでは無い。

全部が全部クラスに閉じ込めればオブジェクト指向になるわけではないし、完璧なオブジェクト指向なんて存在できない。
たとえばグローバルな変数や関数を廃止したJavaやC#だとそんな関数は静的メソッドになっていて、クラスのありがたみは0だ。

ちなみにその例なら<algorithm>のstd::maxが使える。
974デフォルトの名無しさん:2006/03/28(火) 20:12:19
>>971
>例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合
何と何の値を比較するかによる。
1つのインスタンスの中の値を2つ比べるだけならクラスのメンバ関数になる。
でも、2つのインスタンスが比べる対象になるならその関数は1つ上の存在を管理している奴にあずけなければならない。
また、1つはクラス、もう1つの値は別のどっかの変数の場合でも同様。
975デフォルトの名無しさん:2006/03/28(火) 20:18:33
すみません。
ちょっと、記述が足りませんでした。
int とか dubule です。
つまるところ、math.h みたいな感じで使えるのかな〜?と思ったんです。
C言語なら、そういったモジュールを自作でつくって、使いまわしてたんで・・。
976デフォルトの名無しさん:2006/03/28(火) 20:19:00
inline int gyaaa(int a, int b){return (a>b)?a:b;};
ヘッダファイルに置いて比較を使いたいファイル内でインクルード
色々対応したいならテンプレート使うといいかも
977デフォルトの名無しさん:2006/03/28(火) 20:23:21
ふむふむ。
mymath.h
inlinle ナンチャラ
inlinle ナンチャラ 

みたいな感じで使えるってことですね。
ていうか、こんなやり方でいいんでしょうかね・・?
スマートなやりかたってないんだろうか。
978デフォルトの名無しさん:2006/03/28(火) 20:33:51
979デフォルトの名無しさん:2006/03/28(火) 20:39:09
int max(int a, int b){ return ((a^b)&((a-b)>>31))^a
};
980デフォルトの名無しさん:2006/03/28(火) 20:55:54
xの2次方程式です。Cのプログラムで答えを書いてください。

a*x*x + b*x + c = 0
981デフォルトの名無しさん:2006/03/28(火) 21:02:16
>980
宿題片付けて欲しいんなら宿題スレで
982デフォルトの名無しさん:2006/03/29(水) 00:29:30
C99使えばこんなんかな?
#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
983デフォルトの名無しさん:2006/03/29(水) 00:48:42
んじゃあ3次以降はどうするよ?
984デフォルトの名無しさん:2006/03/29(水) 01:16:49
3, 4次は公式に当てはめる。
5次以上はシラネ。
985デフォルトの名無しさん:2006/03/29(水) 01:33:51
>>982
確か絶対値の大きい方をまず求めて、
その値を使って他方を求める。
そうしないと引き算の桁落ちで
真値と大きく異なる値が得られることがある。
986デフォルトの名無しさん:2006/03/29(水) 02:13:52
>>985
どこのことを言ってるんだ?
987デフォルトの名無しさん:2006/03/29(水) 05:22:14
classオブジェクトをnewで作成するときにlistに
そのポインタを保存して、終了するときにまとめて
deleteしたいんですが、異なるclassもまとめて管理
しようとしてvoid*で保存すると、deleteでデストラクタが
呼ばれないんですが、呼び出すべきデストラクタを
listに一緒に保存する上手い方法は無いものでしょうか?
988デフォルトの名無しさん:2006/03/29(水) 05:43:08
listに登録する異なるクラスに共通のスーパクラスを作り
void*でなくこのスーパクラスのポインタを持つようにする

それか、void*の代わりにboost::shared_ptr<void>を使う
989デフォルトの名無しさん:2006/03/29(水) 06:38:17
>>988
boostを調べてみたら、他にも色々面白いクラスがあるみたいですね。
教えていただいて感謝。
990デフォルトの名無しさん:2006/03/29(水) 07:17:10
>>989
ていうか、そんなのが普通に出てくる設計って何かがおかしいと思わないのか?w
991デフォルトの名無しさん:2006/03/29(水) 08:09:51
>>990
いや、要はdeleteしなくて済む(し忘れてもいい)方法は
無いものかと思っただけで。
shared_ptrやarrayなんてのがあることを知らなかったので。
992デフォルトの名無しさん:2006/03/29(水) 08:16:17
スマートポインタぐらいは知っておこうぜ・・・
993デフォルトの名無しさん:2006/03/29(水) 11:02:49
ブースト無いとC++はカスだってJava信者さんにいじめられました。
994デフォルトの名無しさん:2006/03/29(水) 11:04:34
C++にはC++にしかできないことがある
995デフォルトの名無しさん:2006/03/29(水) 11:06:59
operator, operator->* とか
996デフォルトの名無しさん:2006/03/29(水) 11:17:58
演算子再定義さえできんJavaに言われたくはないな。なぜかStringだけ+やら+=やら使えるが。

boost::spiritは実にアレゲで素敵ですよコンパイル速度遅すぎだけど
997デフォルトの名無しさん:2006/03/29(水) 11:19:39
存在からしてカスのJavaに言われたく無い
998デフォルトの名無しさん:2006/03/29(水) 11:26:43
C++は匿名クラスかラムダ式か、そのあたりの使い捨ての仕組みが
あればいいんだがなー。
そうすると、クロージャとか考え出して、メモリ管理の問題にいきつくので、
ガベコレなしでクロージャはきついな、クロージャなしだと、無名関数の
パワーは半減だなーと思う。
ちょっと構文を拡張してくれれば、あとはboostの人がshared_ptr使って、
なんとかしてくれそうな気がするんだけど。
999デフォルトの名無しさん:2006/03/29(水) 11:52:55
>>998
クロージャ無しで十分使えるboost::lamdaがあるじゃないか。
1000デフォルトの名無しさん:2006/03/29(水) 11:59:57
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/l50
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。