【初心者歓迎】C/C++室 Ver.47【環境依存OK】
at TECH
[前50を表示]
650:デフォルトの名無しさん
08/01/30 07:31:28
C++で開発をする際、他言語以上にいつもクラス設計で悩まされます
何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?
651:デフォルトの名無しさん
08/01/30 15:11:37
ATLにSTLのコンテナ使う仕掛けが合ったよな。
652:デフォルトの名無しさん
08/01/30 15:12:25
有った
653:デフォルトの名無しさん
08/01/30 15:30:11
C言語の質問です。コンパイラはgccです。
while(fgets(buffer,filesize,fp)){
flug=strstr(buffer,str);
if(flug!=NULL)puts(flug);
}
これでなぜ出力文字列が検索できないのでしょうか。
教えてくださいませんか?
私の頭の中ではまず改行までのファイルの一行をbufferに読み込む。
その後、bufferに格納されている文字列とstr(検索したい文字列)を比較して検索。
その返り値がflugに入るので、NULLポインタ以外(失敗)のflugは出力。
これで検索した値からの文字列が出力されると思っておりました。
654:デフォルトの名無しさん
08/01/30 15:40:40
cin.getline
って文字列を入力させるときに使うの?
普通に50桁の配列に数字を入れたいときって
cin >> a[50]
でいいのかな??
655:デフォルトの名無しさん
08/01/30 15:43:25
きもい
656:デフォルトの名無しさん
08/01/30 15:49:42
>>653
その部分だけじゃわからん。
つーか、その部分に問題は無い。
657:デフォルトの名無しさん
08/01/30 15:50:58
>>653
・flugという変数名がキモい
・filesizeは本当にbufferが指すバッファのサイズ?
buffer, filesize, str の宣言や初期化などを詳しく開示しましょう。
658:デフォルトの名無しさん
08/01/30 17:03:00
>> 654
getlineの使い方(ファイルからの一行単位の読み込み)
string line;
ifstream ifs(filename);
while (getline(ifs, line)) {
lineには一行がはいってる。
}
> cin >> a[50];
これでは配列aの51番目の要素に代入してるだけでは?
659:デフォルトの名無しさん
08/01/30 18:54:56
>>658
やっぱりだめなんですね・・
cin>>a[50]
だと50桁も入力できないんです
ありがとうございました
660:デフォルトの名無しさん
08/01/30 19:19:46
例外がcatch{}の中では生存していると仮定して
関数でnew | malloc した文字列を返して
デストラクタでdelete[] | freeするのはありですか?
661:デフォルトの名無しさん
08/01/30 19:29:05
言っている意味が分からん。
コードで書いてくれ。
662:デフォルトの名無しさん
08/01/30 19:47:17
エスパーな俺が翻訳すると、
catch内で作ったインスタンスでもデストラクタは呼ばれるのか?
ではないかと。
663:デフォルトの名無しさん
08/01/30 19:59:41
ふつうにわかるだろ
664:デフォルトの名無しさん
08/01/30 20:03:22
>>660
文字列クラス返せば?
665:デフォルトの名無しさん
08/01/30 21:42:46
>>659
「桁」が何のことか分からん
配列のサイズのことならfor引数足してまわせばいいだけ
50桁の数値(10の50乗とか)を扱いたいなら普通には無理
666:デフォルトの名無しさん
08/01/30 21:43:28
引数じゃなかった添え字だ
667:デフォルトの名無しさん
08/01/30 22:27:02
自作クラス内に、CreateWindowというメソッドを作りたいんですが、エラーが出てしまいます。
エラーメッセージを見るとどこかで定義されてるようなんですが、
クラス内は独立した名前領域で、同じ関数名を使えるのではないのですか?
どなたか、回答をお願いします。
668:デフォルトの名無しさん
08/01/30 22:29:10
>>667
windows.h から同名のマクロが include されているのかも知れない
669:デフォルトの名無しさん
08/01/30 22:32:01
回答ありがとうございます。
windows.hは確かにインクルードしていました。
windows.hをインクルードしないわけにはいかないし、
CreateWindowという名称を使うのはあきらめたほうがよさそうですね。
670:デフォルトの名無しさん
08/01/30 23:10:41
すみません、質問です.
C++言語のソースを読んでいて、疑問に感じた所があります。
struct Hoge{
unsigned Wakeup(void) const { return wakeup_time; }
Hoge(Container& container);
~Hoge();
private:
unsigned int hoge_time;
Container& fuga;
};
これ構造体ですよね?クラスみたいですけど・・・。
本を読んだりしてクラスと構造体はまったく別物と認識していたんですが。
混乱しています。
671:デフォルトの名無しさん
08/01/30 23:12:12
C++では同じ
違いはデフォルトのアクセスがpublicな事
672:デフォルトの名無しさん
08/01/30 23:19:54
>>670
実装は同じだけど、考え方としては区別したほうが良いんじゃないかな、
673:デフォルトの名無しさん
08/01/30 23:21:02
>>671
もうちょい違うっしょ。
674:デフォルトの名無しさん
08/01/30 23:21:53
メンバ変数を public にした方が何かと便利そうなのは構造体に、
そうでないのものはクラスに。
そう考えると、自然と構造体を使う状況は限定される。
675:デフォルトの名無しさん
08/01/30 23:23:22
>>673
デフォルトで public 継承になる、というやつのことか?
676:デフォルトの名無しさん
08/01/30 23:30:12
テンプレート絡み。
677:デフォルトの名無しさん
08/01/30 23:32:36
最近どこかで目にした流れだな
678:デフォルトの名無しさん
08/01/30 23:36:09
はい、STLスレの受け売りです。
679:デフォルトの名無しさん
08/01/30 23:38:38
だからテンプレート引数の話とここの話とは
ちょっと違うんじゃないか、と。
680:670
08/01/30 23:43:33
C++だと若干の違いはあるにせよ、classの代わりにstructと書くこともできるんですね。
ありがとうございました。
681:デフォルトの名無しさん
08/01/31 00:26:32
newで多次元配列分の確保ってできない?
char *c;
int p=20;
c=new char[p][255];
こんな感じでしたいんだけどこれだとエラーでる
682:デフォルトの名無しさん
08/01/31 00:26:53
char (*c)[255] = new char[p][255];
683:デフォルトの名無しさん
08/01/31 00:32:46
>>682
ありがとうございます。原理はよく分からないけどできました
勉強してきます
684:デフォルトの名無しさん
08/01/31 00:36:46
配列へのポインタを使ってる。
typedef 使うと多少分かりやすいかと。
typedef char BUF[255]; // BUF は char 型 255 要素の配列型
BUF *c = new BUF[p];
やっぱそうでもないか。
685:デフォルトの名無しさん
08/01/31 00:40:26
つまり、char 型 255 要素の配列を p 個確保して、
c[i] とすると i 個目の配列が得られ、
c[i][j] とするとその配列の j 番目の要素にアクセスできる、と。
686:デフォルトの名無しさん
08/01/31 00:53:06
>>684-685
分かり易くありがとうございます。何となく分かったような気がする
とりあえずもう一度newについて再勉強してきます
687:デフォルトの名無しさん
08/01/31 01:23:02
newでもmallocでも同じだよ
688:デフォルトの名無しさん
08/01/31 04:56:35
template <int N, typename T>
struct array_str {
T array[N];
T &operator[](int n) {
return array[n];
}
};
int p = 20;
const int ssize = 255;
vector< array_str<ssize,char> > c(p);
として、以下のように使う方法は?
c[1][1];
689:デフォルトの名無しさん
08/01/31 05:15:04
>>688 使い方を示しながら使い方を聞く意味がわからん。
690:デフォルトの名無しさん
08/01/31 05:19:04
proxy classの話かな?
691:デフォルトの名無しさん
08/01/31 05:37:32
this->template func<type>(arg); という書き方を見たんですが、
this->func<type>(arg); との違いを教えてください。
692:デフォルトの名無しさん
08/01/31 05:48:03
>>691
template付けないとエラーでコンパイルできない場合がある。
.演算子、->演算子、::演算子の後ろにメンバテンプレート特殊化の
名前があり、それがテンプレート仮引数に属している場合がそう。
693:デフォルトの名無しさん
08/01/31 05:52:19
>>691
テンプレート内で、 this の型がテンプレート引数に依存するとき、前者のように
template を明示しないと、コンパイラは this->func<type という部分を
(this->func) < (type) のような比較式と認識してしまう。
694:デフォルトの名無しさん
08/01/31 08:21:51
"ab"でaとbの間に「"」を入れたい場合って「"a""b"」でおk?
695:デフォルトの名無しさん
08/01/31 08:23:28
>>694
"a\"b"
696:デフォルトの名無しさん
08/01/31 08:23:51
\"
697:デフォルトの名無しさん
08/01/31 08:29:43
ありがとう。あぶなく間違って使うところだった
698:デフォルトの名無しさん
08/01/31 09:05:56
まぁやったところで別に問題はないけどね、表示されないだけで
699:デフォルトの名無しさん
08/01/31 09:07:00
確かになw
エスケープを "" で表現するのって、どこの文化だっけ?
どっかで見た気はするんだが。
700:デフォルトの名無しさん
08/01/31 09:46:44
昔のBASICだろ
701:デフォルトの名無しさん
08/01/31 09:50:26
だっけか。全然覚えてないや。
702:デフォルトの名無しさん
08/01/31 10:45:56
試しにVBでやってみたら通ったわ。""
703:デフォルトの名無しさん
08/01/31 11:36:23
演算子の優先度と結合規則がいまいちよく分かりません。
下の式を意味が変わらない範囲でカッコを外すとどうなりますか?
a = ( b *= ( ( c+d ) << e ) )
( ( * ( a[b] ) ) . c ) -> d
( a - ( ( b-c ) * d ) ) - e
( + ( ++a ) ) + ( ( b&c ) << ( d+e ) )
( ( ( * ( a.b ) ) . c ) -> d ) ++
あと下の4つは順序を明確にするためにカッコを付ける問題です。
a + b * c - d
a <<= b << c <= d
a = b &= c ==d
* a . b * c
参考になるサイトとかありますか?アドバイスお願いします。
704:デフォルトの名無しさん
08/01/31 11:39:36
参考になるのは優先順位表
高低だけじゃなくて、右左にも注意
705:デフォルトの名無しさん
08/01/31 13:06:37
テスト問題とか、与えられた式を最適化するようなプログラムを作っているのでなければ
素直にカッコをつけておくというのはどうだろうか。
前提無視ですね、すみません。
706:デフォルトの名無しさん
08/01/31 13:40:09
言語仕様とはちょっと違うけど今でもDB2のSQLは文字列中の"を""で表すぞ
707:デフォルトの名無しさん
08/01/31 15:44:34
>>703
そんなの、K&Rにかいてあるだろ
708:デフォルトの名無しさん
08/01/31 19:40:40
ビット演算の優先順位をちゃんと把握してる人なんてそんないないわ。
709:デフォルトの名無しさん
08/01/31 20:09:03
>>703
優先順位がわかりにくいときは括弧つければいいと思うよ。別にかっこ悪くないと思うよ
括弧減らしてもバグが増えたら意味が無いしな。
710:デフォルトの名無しさん
08/01/31 21:35:35
VC++8使ってるんですけど、グローバルスコープの関数ってやっぱり
::CreateWindowEx とかスコープ演算子つけた方が良いのですか?
ネットにあるサンプルコードだと、両方見かけますが…
711:デフォルトの名無しさん
08/01/31 21:42:54
boostを使わずにstringの文字列を小文字の文字列に変換するにはどうすればよいですか?
712:デフォルトの名無しさん
08/01/31 22:06:34
>>711
string str("HeLLo");
for (int i = 0; i < str.size(); i++) {
str[i] = tolower(str[i]);
}
cout << str.c_str() << endl;
あまりよろしくないかも。
713:デフォルトの名無しさん
08/01/31 22:12:35
std::transform(str.begin(), str.end(), str.begin(), tolower);
714:デフォルトの名無しさん
08/01/31 22:20:35
ざんねん、あなたのじっそうでは、tolowerは、「まくろ」だった
715:デフォルトの名無しさん
08/01/31 22:30:15
hoge.hで
// 構造体
struct POI{
int n;
float x;
};
// クラス
class hoge
{
public:
hoge(void ); // コンストラクタ
~hoge( void ); // デストラクタ
private:
POI poi[4];
};
と書き、
hoge.cppの
hogeコンストラクタ上で
poiの初期化を行いたいのですがうまくいきません。
今下のようにやっているのですがどのように直せばいいのでしょうか、どうぞよろしくお願いします。
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
716:デフォルトの名無しさん
08/01/31 22:30:29
そ、そんな実装もあるのか・・・。
717:デフォルトの名無しさん
08/01/31 22:31:24
for(int i = 0; i < sizeof poi / sizeof *poi; ++i) {
poi[i].n = 1;
poi[i].x = 0.5;
}
718:デフォルトの名無しさん
08/01/31 22:37:12
>>710
好きなほうでどーぞ
719:デフォルトの名無しさん
08/01/31 22:40:15
>>715
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
その形式が使えるのは宣言時だけなので
>>717
みたいにしないといけません
720:715
08/01/31 22:40:59
>>717
できれば
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
こういう風に一括でやりたいのですがこれは無理なのでしょうか?
721:715
08/01/31 22:42:07
>>719
すいません、見逃しました。
そうですか、わかりました。ご丁寧にありがとうございます。
722:デフォルトの名無しさん
08/01/31 22:43:14
>>720
POI poi_src[] = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
std::copy(poi_src, pos_src + sizeof poi_src / sizeof *pos_src, poi);
723:デフォルトの名無しさん
08/01/31 22:44:45
POI poi_src[sizeof poi / sizeof *pos] = { ... };
とサイズ指定してた方が安全か。
724:デフォルトの名無しさん
08/01/31 22:45:24
それでもC++0xなら、C++0xならなんとかしてくれる……
725:デフォルトの名無しさん
08/01/31 22:47:00
static const POI poi_src[sizeof poi / sizeof *pos] = { ... };
とした方がいいか。
726:デフォルトの名無しさん
08/01/31 23:06:46
>>713
ありがとうございます。でもコンパイル通りません。
下のソースだと、
char my_tolower(char s) {
return tolower(s);
}
int main() {
string s = "Hello world";
transform(s.begin(), s.end(), m.begin(), toupper); // コンパイル通らない
transform(s.begin(), s.end(), m.begin(), my_tolower); // コンパイル通る
下のような結果になります。
test.cpp:14: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
<unresolved overloaded function type>)'
727:デフォルトの名無しさん
08/01/31 23:08:32
>>726
>>714 ということか。
728:デフォルトの名無しさん
08/01/31 23:10:03
何かオーバーロードされてるのか・・・
729:デフォルトの名無しさん
08/01/31 23:12:44
>>726
transform(s.begin(), s.end(), m.begin(), static_cast<int(*)(int)>toupper);
730:デフォルトの名無しさん
08/01/31 23:20:45
>>714
両方あるんじゃなかったっけ?
731:デフォルトの名無しさん
08/01/31 23:26:50
インクルードするヘッダによって違わなかったっけ
732:デフォルトの名無しさん
08/01/31 23:46:02
両方あるなら (tolower) でいいってことか
733:デフォルトの名無しさん
08/01/31 23:46:41
#undef tolowerじゃだめなの?
734:デフォルトの名無しさん
08/02/01 00:00:42
>>732
括弧無くても大丈夫だな。
後ろに ( ) がついてないから。
それにしても、うちの gcc じゃ >>726 みたいなエラーでないんだがなあ。
バージョンが違うのか。
735:デフォルトの名無しさん
08/02/01 00:11:15
tolower(int)のほかに、tolower(char)とかtolower(wchar_t)とかあるんでしょ。
736:デフォルトの名無しさん
08/02/01 00:20:07
Cとの互換関数だから、規格的にオーバーロード出来ないと思うが。
737:デフォルトの名無しさん
08/02/01 00:20:08
なら static_cast<int(*)(int)>(tolower) とかしないといけないのか。
面倒臭いな。
738:デフォルトの名無しさん
08/02/01 00:43:56
<locale>かどこかに、第2引数にロカールをとるバージョンがあったと思う。
739:デフォルトの名無しさん
08/02/01 00:45:47
古いヘッダ .h なら通るんだよな
謎だ
740:デフォルトの名無しさん
08/02/01 01:22:21
>>730
Cでは、関数に加えてマクロを用意しても良かったが、
C++だとそれは認められていない。
(JIS X3014:2003では17.4.1.2の6段落目。更に注(159)で明確に指摘されている)
741:デフォルトの名無しさん
08/02/01 01:28:39
double pai(){
double i,imax,n;
double x,y,pi;
n=0.0;
imax=10000000.0;
for(i=0;i<=imax;i++) {
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<1.0) {
n+=1.0;
}
}
pi=n/imax*4.0;
return pi;
}
double px(double t){
double pi=pai();
double x,ans;
ans=exp(-x*x/2t)/sqrt(2*pi*t);
return ans;
}
としたら
エラー E2121 kadai1.c 27: 関数呼び出しに ) がない(関数 px )
と出ましたorz
誰か解決策わかるようでしたら教えてください(;´Д`)
742:デフォルトの名無しさん
08/02/01 01:34:28
exp(-x*x/2t)/sqrt(2*pi*t);
2t?
743:デフォルトの名無しさん
08/02/01 01:43:52
あとx初期化してないよね。
744:デフォルトの名無しさん
08/02/01 01:44:15
c++でswitch文のcaseの中では変数宣言できないですか
745:デフォルトの名無しさん
08/02/01 01:46:26
case HOGE:
{ int t = 0;}
break;
ブロックで囲めばいいんじゃね
746:741
08/02/01 01:58:11
>742
解決しましたw
あざす!!
747:デフォルトの名無しさん
08/02/01 03:31:40
>>745
こっちも解決しました。ありがとう酢。
748:デフォルトの名無しさん
08/02/01 18:16:42
空を自由に飛びたいな
はーい つLSD
749:デフォルトの名無しさん
08/02/01 19:11:19
LoadLibraryでもらったHMODULEはCloseHandleで処分できますか?
750:デフォルトの名無しさん
08/02/01 19:24:52
どこで質問すればいいのかわからないほどくだらない質問なのですが、
よく引数であるchar* pszMessageのpszってどういう意味ですか?
Pointer Stringはわかるんですが、Zがいったいなんなのか・・・
751:デフォルトの名無しさん
08/02/01 19:27:11
zはzero、szはヌル終端文字列のこと。
752:デフォルトの名無しさん
08/02/01 19:29:52
pointer string zero-terminated
753:749
08/02/01 19:30:06
間違えました。
754:デフォルトの名無しさん
08/02/01 19:31:13
>>751-752
なるほど・・ゼロでしたか
謎がとけました、ありがとうございます!
755:デフォルトの名無しさん
08/02/01 21:29:40
c++のプログラムを書いてます。
コンソールからstringを入力させたいのですが、getline()とcinを併用すると
何回目かのcinがユーザの入力待ちにならずにそのまま長さゼロの入力を受け取った
と誤解して処理が先に進んでしまうようです。何かフラッシュとかの処理が必要なので
しょうか?
756:デフォルトの名無しさん
08/02/01 22:01:29
エラーが発生したなら
cin.clear(); するまで関数に失敗するが、
そういうわけではなくて?
757:デフォルトの名無しさん
08/02/02 01:13:42
Pointer to a String terminated by Zero
758:デフォルトの名無しさん
08/02/02 01:38:32
std::map<CString, CComPtr<ID3DXFont>> fonts;
に問題はありますか?
759:デフォルトの名無しさん
08/02/02 01:39:47
エラーが出なければ問題は無い。
エラーが出るなら問題。
760:デフォルトの名無しさん
08/02/02 01:41:21
質問させてください.
c言語でscanfで入力を受けるプログラムをつくりました.
バッチファイルとかシェルスクリプトで入力してやりたいのですが、つまづいています.
要するに、
(実行ファイル)enter(入力)enter
では無く、
(実行ファイル)(入力)enter
のような感じに書く方法がありますか?ということです.
761:デフォルトの名無しさん
08/02/02 01:46:08
int argc, char* argv[]
でググれ。
762:デフォルトの名無しさん
08/02/02 01:48:35
>>760
そのレベルは……ぐぐるとかじゃなくて、本を読んできちんとした知識を身に付けた方が良いよ。
いや、マジで……
763:デフォルトの名無しさん
08/02/02 01:54:08
>>758
STLのこんてなにオートポインタの類入れると
764:デフォルトの名無しさん
08/02/02 01:59:29
とりあえず>>だとコンパイルエラーになったりするので> >にしとけ。
765:デフォルトの名無しさん
08/02/02 02:37:31
760です.確かに知識は無いです.
実は数値計算だったので簡単に済ませたかったんです.
リダイレクトでパラメータをいれる代わりに、
そのまま数値を書く方法があるのかなと思って質問してみたんですが.
どうやら場違いでした.
766:デフォルトの名無しさん
08/02/02 03:34:39
ウィンドウつくったり図を表示したりするのってWin32API勉強しないとできない?
767:デフォルトの名無しさん
08/02/02 03:49:03
>763
std::aut_ptrが例外的にダメなオートポインタで、
大抵のスマートポインタは入れても大丈夫じゃねーの。
768:デフォルトの名無しさん
08/02/02 12:09:24
VC6 だが、std::vector に CComPtr 入れると
resize でアサーションエラーが出た。
769:デフォルトの名無しさん
08/02/02 12:31:21
intrasive_ptr?だっけ?
まさにCOMみたいに自前でカウントしてるクラス用のスマポ
770:デフォルトの名無しさん
08/02/02 12:46:10
string型の変数の中身をlistコンテナに一文字ずつ移そうとしてます。
for_each(string.begin(), string.end(), XXXX);
みたいにfor_eachを使って書けないでしょうか?
771:デフォルトの名無しさん
08/02/02 12:49:16
push_backとmem_fun_ptr
772:デフォルトの名無しさん
08/02/02 12:50:12
mem_fun_refだったorz
773:デフォルトの名無しさん
08/02/02 13:03:58
これはだめ?
std::list<char> l;
std::copy(string.begin(), string.end(), std::back_inserter(l));
774:デフォルトの名無しさん
08/02/02 14:48:54
std::list<char> l(s.begin(), s.end());
または
l.assign(s.begin(), s.end());
だろ。
775:デフォルトの名無しさん
08/02/02 15:35:03
for_each(s.begin(), s.end(), mem_fun_ref(v.push_back));
ということですか?
でもこれはコンパイルできなかった。
776:デフォルトの名無しさん
08/02/02 16:06:20
>>775
>>773は正しい処理だが、
効率が悪いということじゃないの?
初期化の話だよな?
>>775
そりゃ、あらゆる点で無理だ。
777:デフォルトの名無しさん
08/02/02 16:16:22
v.push_backではなくて&std::list<char>::push_backだろ
まあstd::back_inserterを使うのが最適なわけだが
778:デフォルトの名無しさん
08/02/02 16:18:57
最適は774だって。 EffectiveSTL嫁。
779:デフォルトの名無しさん
08/02/02 16:20:27
元の質問は for_each が使いたいらしいから、 >777 でも間違いではない。
780:デフォルトの名無しさん
08/02/02 16:51:44
>>777
それでもダメ。引数の数が一致しない。
せめてbind1stを使えといいたいところだが
ほとんどの実装でunary_functionで参照の参照が
発生してはじかれる。
781:デフォルトの名無しさん
08/02/02 16:55:14
>>778
範囲指定のイテレータか
782:デフォルトの名無しさん
08/02/02 17:07:39
ぶっちゃけ、メンバ関数をforeachみたいな連中に渡すのは
面倒くさいのでboost使おう、という話になるw
783:デフォルトの名無しさん
08/02/02 17:11:23
だからfor_each使わずに>>774でいいって。
784:784
08/02/02 19:38:53
質問です。
//正規分布を求めるメソッド
float BestFitInfo::norDis(float x, float mean, float var){
return 1 / ( sqrt( 2 * 3.14 ) * sqrt(var) ) *
exp( - (x - mean) * ( x - mean ) / ( 2 * var ) );
}
//BestFitInfoというクラスを作って、
//正規分布を求めるメソッドを書いたところ、
warning C4244: 'return' : 'double' から 'float' への変換です。データが失われる可能性があります。
と言われました。すべて引数は float だし、
exp や sqrt の戻り値もそれに合わせて float のはずなので、
どこで double 型が発生しているのかわかりません。
なぜこのようなエラーとなっているのでしょうか?
分かる方がいらっしゃいましたら教えてください。
よろしくお願いします。
785:デフォルトの名無しさん
08/02/02 19:45:47
>>784
>exp や sqrt の戻り値もそれに合わせて float のはずなので、
本当か?
floatのはsqrtfとかexpfじゃないのか?
あと、3.14はdouble型だ。float型リテラルは3.14fと書く。
786:784
08/02/02 19:59:47
785さん、お返事ありがとうございます。
3.14fと書いたら「データが失われる可能性があります」と言われなくなりました。
sqrtについて調べたところ、
double sqrt(
double x
);
float sqrt(
float x
); // C++ only
long double sqrt(
long double x
); // C++ only
float sqrtf(
float x
);
このように sqrt は多重定義されているようです。
sqrtf はC言語のときの名残のようですね。
解決しました。みなさまありがとうございました。
787:デフォルトの名無しさん
08/02/02 22:11:07
質問です
僕はインクルードガードシンボルにuuidを含ませる事があるんですが
Cのプリプロセッサで処理するシンボルは最大何文字までいけるんでしょう?
#define HOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE
ぐらいのものは処理できるならまぁ十分なんですが気になります
あと変数名や名前空間名も何文字までいけるか気になります
ADLバリアを使うと結構文字数増えますし、
もしあまりに少ない文字数(例えば31文字)だったとしたら怖いんで
788:デフォルトの名無しさん
08/02/02 22:23:36
プリプロセッサの制限はわからんけど、
C89までは厳密には識別子は先頭6文字位じゃなかったっけ
C99で32文字になったような気がしないでもない
789:デフォルトの名無しさん
08/02/02 22:39:22
プリプロセッサの制限はわからんけど、
内部識別子は最低32
外部が8くらいだったと思う。6かもしれん。
VC6なんかでは外部256とかで、複雑なtemplateとかで警告が出るね。
790:デフォルトの名無しさん
08/02/02 22:40:07
あ、これはC89ね
791:デフォルトの名無しさん
08/02/02 23:21:31
完全にうろ覚えだけど、マクロ名などの内部識別子は、
C89が31文字で、C99は63文字だったと思う。
792:791
08/02/02 23:50:16
C++98ではCにはあったtranslation limitの既定がなくなって、長さに制限はないと明記されているね。
付録のBで内部外部ともに1024文字以上を推奨ってことになってる。(これは一応調べてきた
793:デフォルトの名無しさん
08/02/03 00:14:52
クラスあったら構造体いらないと思うんですが、構造体で宣言する利点って何ですか?
794:デフォルトの名無しさん
08/02/03 00:20:15
メッセージループ(DispatchMessage)に入る前にウィンドウプロシージャにメッセージが飛んでしかも処理されてるっぽいんですが
当たらしく作られた別スレッドで動いてるんですか?このウィンドウプロシージャってやつは
795:デフォルトの名無しさん
08/02/03 00:26:14
ある種のAPIは、直接プロシージャを呼び出して配送する。
有名なのは、UpdateWindowのWM_PAINTなど。
796:デフォルトの名無しさん
08/02/03 00:32:13
ほかにもWM_CREATEやそれより前にやってくるメッセージはCreateWindow(Ex)内部で呼ばれるし、
Send系で送る場合も同一スレッドなら直接呼ばれる。
797:デフォルトの名無しさん
08/02/03 00:33:50
>>795
ああ、なるほど、そういうことですか
そういうパターンをすっかり見落としてました
798:デフォルトの名無しさん
08/02/03 00:37:05
>>793
ただの構造体が欲しいときかな。
たとえば
APIにパラメータを渡したいとき。
ハードウェアをアクセスするとき
オフセットをがっちりあわせたいとき
799:デフォルトの名無しさん
08/02/03 00:37:18
>>793
しかしだね、
class Hoge { public: int id; double data; };
に対して
hogeInst.id = 1;
hogeInst.data = M_PI;
なんて操作をするのは背筋がぞわぞわしないか?
800:デフォルトの名無しさん
08/02/03 00:59:29
char* str = "aあいう"
みたいに日本語とアルファベットが混在した文字列の、
文字数を数えるにはどうすればいいのでしょうか?
strlen(str);
とすると7になってしまいます。
環境はWindows XPでWin32APIを使ってプログラミングをしてます。
801:デフォルトの名無しさん
08/02/03 01:04:38
wchar_t* str = "aあいう";
wcslen(str);
802:デフォルトの名無しさん
08/02/03 01:05:10
L"aあいう"; だた
803:デフォルトの名無しさん
08/02/03 01:12:01
すいません、少し説明が足りませんでした。
そもそも何がやりたいかというと、
char*からwchar_t*への変換をしたいのですが、
char*変数のstrに'L'をつけて、L(str);とするとエラーになってしまいます。
そこで、MultiByteToWideCharで変換しようと思ったのですが、
wchar_t* wstr = new wchar_t[len];
というふうに、変換後文字のためのバッファをとろうとして、
その長さのlenをどう数えたらいいか分からなくなりました。
804:デフォルトの名無しさん
08/02/03 01:16:44
>>803
MultiByteToWideCharの仕様をMSDNで良く見直すこと。
とくに戻り値の説明を。
805:デフォルトの名無しさん
08/02/03 01:22:44
>>798-799
ありがとう。構造体で出来るなら構造体で済ました方が楽ってことですね
806:803
08/02/03 01:25:33
>>804
ありがとうございます!
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
これで長さがとれました。
807:デフォルトの名無しさん
08/02/03 01:30:13
ある関数の返り値を配列でほしいのですが
関数の返り値にvectorやらlistを返すのってありですか?
それとも引数から参照渡しで変更させたほうがよいですか?
808:デフォルトの名無しさん
08/02/03 01:36:04
コストを気にしなければあり。
809:デフォルトの名無しさん
08/02/03 02:08:30
参照渡しで変更させたほうがいいなぁ。
要素数一桁だとか、RVOが可能な記述が出来るならともかく。
どうしても戻り値がいい場合はshared_ptrで包む。
810:デフォルトの名無しさん
08/02/03 02:31:06
バイナリでのファイル入出力って普通のと何がちがうの?
バイナリ形式で保存したのをメモ帳で開いても普通に出力したのと変らないんだけど
811:デフォルトの名無しさん
08/02/03 02:53:33
>>799
C++ にもプロパティがあればいいんだけどね。
拡張機能で用意されてる事もあるが。
812:デフォルトの名無しさん
08/02/03 02:59:27
>>807
配列の先頭アドレスを返す、じゃダメなのかな
>>810
普通のっていうのはテキストモードのことだよね
テキストモードだと改行文字をいじったりしてる
詳しく知りたい場合は「fopen テキストモード」とかでググれば出てくると思う
813:デフォルトの名無しさん
08/02/03 03:15:45
C++の参照渡しって、結局中ではアドレスが渡されてるんですか?
そうじゃないとしたら一体どうなってるんでしょうか?
814:デフォルトの名無しさん
08/02/03 03:21:35
結局中ではアドレスが渡されてる実装しかないだろうな。
815:デフォルトの名無しさん
08/02/03 03:29:27
>>812
ありがとうございます
「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」みたいな文字化けしたような感じで
書き込まれるのかと思ってたけど違うのね
こんな文字化けしたようなdatファイルとかってどうやって作ってるの?
816:デフォルトの名無しさん
08/02/03 03:36:58
文字以外を書き込めばなりやすいな
817:デフォルトの名無しさん
08/02/03 03:44:10
>>815
書きたい内容をそのまま書けばいい。
static const unsigned char data[] = {
0xBF, 0x83, 0xC3, 0x32, 0x3A, 0xCE, 0x53, 0x53,
0xB6, 0xA2, 0x38, 0x8A, 0x49, 0x4D, 0xC0, 0xD7,
0x92, 0x6A, 0xD5, 0xD1, 0xA9, 0x74, 0x6E, 0x8C,
0x7B}; // 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」
FILE* fp = fopen("test.dat", "wb");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);
818:デフォルトの名無しさん
08/02/03 03:47:54
そのデータだと
FILE* fp = fopen("test.dat", "w");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);
でも同じ物が書き込まれるがね。
バイナリモードとテキストモードの違いは
メモリ上で 0x0D('\n') となるバイトを
ファイル上でその環境の改行コードに変換するか否かしかない。
819:デフォルトの名無しさん
08/02/03 08:05:56
>>817-818
ありがとう。でも全然分からない
おれにはまだ早かったみたいです
とりあえずテキストとバイナリモードの違いは\nとかが違うだけで文字は変わら
ないんですね
勉強してきます
820:デフォルトの名無しさん
08/02/03 09:13:33
>>811
なければ自分で作ればいいじゃん。
俺は処理系非依存のプロパティ変数クラスを作った。
821:デフォルトの名無しさん
08/02/03 11:00:39
>>819
結果はメモ帳で見るよりバイナリエディタで見た方が分かりやすいかと思う。
何かバイナリモードとテキストモードでもの凄く違うと考えてるみたいだが、
動作的には大した違いはない。
普通は fprintf はテキストモードで、fwrite はバイナリモードで使うが、
別にそう使わないといけないという決まりはないんで、
バイナリモードとテキストモードで同じ物を書き込んで
それぞれどうなるか実験してみればいい。
822:デフォルトの名無しさん
08/02/03 11:25:33
>>820
プロパティリストではなくて、delphiのプロパティ宣言みたいなものが作れるの?
823:デフォルトの名無しさん
08/02/03 12:01:34
>>820
初期化が必要なのは面倒臭い。
824:デフォルトの名無しさん
08/02/03 12:57:16
複数のソースで使うヘッダファイルの変数や関数が、
多重に宣言されないように、externの宣言がありますが、
ヘッダファイルに↓みたいな多重インクルードガードをつけたときも、
externは必要なのでしょうか?
#ifndef AAA_H
#define AAA_H
//ヘッダの内容
#endif
825:デフォルトの名無しさん
08/02/03 13:01:13
extern はリンク時の多重宣言を回避するための物。
インクルードガードはコンパイル時の多重宣言を回避するための物。
全く別の物。
826:デフォルトの名無しさん
08/02/03 13:26:37
>>824
必要。
827:824
08/02/03 13:32:45
>>825
>>826
ありがとうございます。
今は、複数ソースで共有する変数/関数にはextern、
全ヘッダにとりあえずインクルードガードをつけてます。
違いがよくわからず、不安なんですが、
こんなんでいいのでしょうか?
ちなみに、関数の方はexternをつけなくても動きました。
828:デフォルトの名無しさん
08/02/03 13:42:54
関数はデフォルトでextern
829:デフォルトの名無しさん
08/02/03 13:45:22
コンパイルとリンクの違いを調べるといいよ
830:デフォルトの名無しさん
08/02/03 13:51:38
c++で、int [] hoge(適当な引数)
みたいに、配列を返す関数って定義できますか?
上記はできなかったので、結局int []を持つstructを定義して、それを返すように
したのですが、、
831:デフォルトの名無しさん
08/02/03 13:54:14
普通は効率を考えて配列を渡してそこに書き込むようにする。
832:824
08/02/03 13:54:51
>>828
そうなのですか。一つ大きな疑問が解決しました。
ありがとうございます。
>>829
勉強してみます。
833:デフォルトの名無しさん
08/02/03 13:58:36
>>827
関数でも、関数定義を複数書けばエラーになるよ。
エラーにならないのは関数定義は1つしか書いてなくて、
他は関数プロトタイプしか書いてないから。
834:デフォルトの名無しさん
08/02/03 14:30:12
>>825
うそん。
>extern はリンク時の多重宣言を回避するための物。
多重宣言どうこうっていうか、外部結合を明示するだけの物じゃないのか?
そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?
突っ込み入らないってことは俺が誤解してるんだろうか。
835:デフォルトの名無しさん
08/02/03 14:37:54
>>834
>そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?
そのとおりだよ。
extern指定子の無い宣言は仮の宣言。
コンパイル単位に定義が見つかったら、仮の宣言は冗長な定義として
無視される。そうでなければ0で初期化される単一の定義になる。
と思ってる。
836:デフォルトの名無しさん
08/02/03 14:38:09
C は仮定義があるから初期化しなけりゃ
複数の記憶クラス指定子のない変数宣言があっても大丈夫。
C++ は仮定義が廃止されたので
複数の記憶クラス指定子のない変数宣言があるとエラー。
837:デフォルトの名無しさん
08/02/03 14:40:39
gcc用で配布されているコードを,
VisualStudio2005でコンパイルしたところ,
エラー 1 error C2143: 構文エラー : '{' が ':' の前にありません。 c:\program files\microsoft visual studio 8\vc\include\cmath 18
エラー 2 error C2059: 構文エラー : ':' c:\program files\microsoft visual studio 8\vc\include\cmath 18
といった無数のエラーが出ました.
ちなみにcmathはインクルードしておらず,
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<complex>
だけです.
どなたかアドバイス頂けませんでしょうか?
838:デフォルトの名無しさん
08/02/03 14:45:22
>>831
ありがとうございます。
参照渡しとかですね。
すいません、あと1つ質問させてください。
stringを継承して、[]をつかって[-1]と[サイズ+1]の要素にアクセスに行ったときだけ
動作の異なるクラスを定義できますか?自分でやろうとしたのですが、コンストラクタ
は継承されないから自分で定義しなおさないとダメなのですよね。そうすると、コンストラクタ
を書くのが結構大変なような気がしたので。
839:デフォルトの名無しさん
08/02/03 14:49:14
>>838
コンストラクタだけじゃなくて演算子だって定義する必要があるんだぜ。
戻り値の型が変わるから。
at 関数を使うと範囲チェックして out_of_range 例外投げるから
それ使えばいいんじゃね?
840:デフォルトの名無しさん
08/02/03 14:51:57
a.exe から LoadLibrary で b.dll を呼び出すんだけど、
b.dll から右側では .NET を使いたい。
a.exe → b.dll
このような場合、b.dllをC++/CLIで作成することになるのかしらん?
841:デフォルトの名無しさん
08/02/03 14:54:13
>>839
なるほど、それでやってみます。
サンクス!
842:デフォルトの名無しさん
08/02/03 14:58:05
>>838
stringは仮想デストラクタを定義していないから
public継承するのはどうかと思うけど、コンストラクタ
の呼び出しに関しては、stringのコンストラクタ
を派生クラスのコンストラクタ初期設定リストで
指定すればいいだけじゃないの。
843:デフォルトの名無しさん
08/02/03 14:58:47
>>840
a.exeからC++/CLIでどぞ
844:デフォルトの名無しさん
08/02/03 15:01:44
>>840
C#でもVB.NETでもお好きにどうぞ
845:840
08/02/03 15:16:22
>>843
a.exeは他所で作ったものだから、漏れはいじれないんだ。
>>844
LoadLibraryでもマネージDLLを呼び出すことができるってこと?
846:デフォルトの名無しさん
08/02/03 15:31:59
>>808>>809>>812
返答ありがとうございます
色々とやり様があるみたいですが、c++的にはやはり生の配列を返すよりコンテナを返したほうがよいのでしょうか?
そうするとやはりlistを引数に取る関数に参照渡しが無難なのかなぁ・・・?
847:デフォルトの名無しさん
08/02/03 15:33:16
class Hoge1
{
void hatena(void)
{
Hoge2 ht;
ht.nazo(*this);
}
};
class Hoge2
{
void nazo(const Hoge2 &rho){}
};
みたいなのがあって
ht.nazo(*this);のところでエラーになります。
どうす
848:デフォルトの名無しさん
08/02/03 15:36:10
>>847
nazo(const Hoge1・・・にす
849:デフォルトの名無しさん
08/02/03 15:37:13
&rho
850:デフォルトの名無しさん
08/02/03 15:37:17
>void nazo(const Hoge2 &rho){}
nazoは引数にHoge2を取るようだが
thisポインタってhoge1のアドレスを示してるんじゃないの?
851:837
08/02/03 15:38:34
>>837
の質問はVC++スレに書き直しました.
マルチポストすいませんでした.
852:デフォルトの名無しさん
08/02/03 15:41:31
Hoge &rho
853:デフォルトの名無しさん
08/02/03 15:41:53
化けるのね。
854:デフォルトの名無しさん
08/02/03 15:42:31
hoge piyo fuga
855:デフォルトの名無しさん
08/02/03 15:45:11
&
856:デフォルトの名無しさん
08/02/03 15:46:57
&a
857:デフォルトの名無しさん
08/02/03 15:51:34
&rh
858:デフォルトの名無しさん
08/02/03 15:53:17
&abcd
859:デフォルトの名無しさん
08/02/03 15:55:04
&rho
860:デフォルトの名無しさん
08/02/03 18:14:16
なぜか、参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます。
#include <stdio.h>
int main(void)
{
int i, j, ln;
printf("何段ですか:");
scanf("%d", &ln);
for (i=1; i<=ln; i++); {
for (j=1; j<=i; j++)
putchar('*');
putchar('\n');
}
return (0);
}
ちなみにOSはVistaです。どこか違っていたら教えてください。
861:デフォルトの名無しさん
08/02/03 18:19:32
for (i=1; i<=ln; i++);
これ。
「;」という何の処理もしない文をforでループさせることになってる。
862:デフォルトの名無しさん
08/02/03 18:21:39
>>860
正解が何か知らんからわからんが
改行の位置がおかしいんじゃないか?
863:デフォルトの名無しさん
08/02/03 18:23:03
>>861
スマソ
そうだね
改行は問題ないわ
864:デフォルトの名無しさん
08/02/03 18:23:08
test
865:デフォルトの名無しさん
08/02/03 18:25:57
>>860
>参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます
このスレを見ている人はその参考書のことなんてしらない。
どのような結果を求めているのかを提示しないと、どこが違っているのか答えられないよ。
明らかにおかしいコードだから答えは>>861の通りだろうけど、もうちょっと質問の仕方を考えたほうがいいよ。
866:デフォルトの名無しさん
08/02/03 18:26:15
>>861
サンクス
無事実行できました。
867:デフォルトの名無しさん
08/02/03 18:26:28
861に書かれていることと
その下の行の { が足りないことで
たまたま{ }の対応がうまくいってコンパイルは通ってるんだな。
なので2ヶ所修正
868:デフォルトの名無しさん
08/02/03 18:26:51
C言語でのアルゴリズムの質問をさせて下さい。
現在以下のようなプログラムを作ろうと思っています。
0〜65535までの数字をIDとしてユーザに割当てる。
ユーザが割当てられたIDを使わなくなったときはそのIDを返却し、
返却されたIDは回収されて他のユーザに割当てられる。
最も簡単なやり方は、user_id[65536]などの大きな配列を作って、
使用状況を配列の中身の0か1で判断する、といったものかと思います。
しかしこのやり方よりもっと効率的なものはないでしょうか?
このような大きな配列を作るのは実装としてまずいのかな…と感じています。
初心者で申し訳ありませんがアドバイスよろしくお願いします。
869:867
08/02/03 18:27:59
あ、違った。
ごめん
870:デフォルトの名無しさん
08/02/03 18:29:28
とはいえ入門書で{}略すのはイクナイと思う。
871:デフォルトの名無しさん
08/02/03 18:29:56
>>868
64Kなら、オンメモリで処理してもいいんじゃね?
ビットで処理したら、8Kで収まる。
872:デフォルトの名無しさん
08/02/03 18:31:50
>>868
更に上限を増やさなければならない可能性があるなら、
別のやり方を考えたほうがいいと思うけど、
それぐらいなら問題ないと思うね。
873:デフォルトの名無しさん
08/02/03 18:32:16
>>870
ぜんぜんOK
874:デフォルトの名無しさん
08/02/03 18:36:59
>>868
その、配列やり方でいいと思うよ。
ランダムに返却され再利用されるならそれしかない。>>871のようにビットマップで配列は小さくできる。
連続の範囲でとりますとか特徴があれば、それを使って効率的に管理することもできる。
875:デフォルトの名無しさん
08/02/03 18:37:36
ある静的メンバ変数を含むクラスをテンプレート化しました。
この場合、静的メンバ変数は、テンプレート引数ごとに別々の実体が
作られるということで、このことは確認できました。
で、質問なのですが、この静的メンバ変数の初期化は、
いつ行われるのでしょうか?
テンプレート化してない場合は、mainが始まる前ということで、
これは手元の本にも載っているのですが、
テンプレート化した場合、実際にどんなテンプレート引数で
クラスが作られるかわからない段階で初期化ってできるのか、と
思ったものですから。
実際、mainの最初で、静的メンバ変数の値を見てみてみても、
なぜかちゃんと初期化した値が入っているように動きます。
なぜなのでしょうか。
876:デフォルトの名無しさん
08/02/03 18:41:47
コンパイル終わったときにはわかってるから。
877:デフォルトの名無しさん
08/02/03 18:43:13
テンプレートはビルド時に、
初期化コードも含めてすべて実体化されるだろ。
878:デフォルトの名無しさん
08/02/03 18:44:51
>>876
>>877
むむむ、そういうことですかーーー。
考えが至りませんでした。
ありがとうございました。
879:868
08/02/03 18:56:06
>> 871,872,874
アドバイスありがとうございます。
特に問題がないようですので、このやり方で続行します!
880:デフォルトの名無しさん
08/02/03 19:14:04
C++だとbitsetでやるのが楽なんだろうけどな
881:デフォルトの名無しさん
08/02/03 19:20:13
それだとフリー探索がO(N)になるから、vector<unsigned short>(65536)という
手もよくあるパターンではある。
882:デフォルトの名無しさん
08/02/03 19:23:17
set<>は使えんの?
883:デフォルトの名無しさん
08/02/03 19:24:46
>>881
なんでunsigned shortなの?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5009日前に更新/252 KB
担当:undef