【初心者歓迎】C/C++室 Ver.47【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.47【環境依存OK】 - 暇つぶし2ch798:デフォルトの名無しさん
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なの?

884:デフォルトの名無しさん
08/02/03 19:32:59
intよりは節約できるし、IDは0~65535なんだろ?

885:デフォルトの名無しさん
08/02/03 19:37:16
サンプルコード見ながら勉強してるのですが

this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide;
#pragma endregion
private:

の、->、::、#、:、の意味がよくわかりません
調べたいのですが、記号はGoogleで検索できないので、この記号の名称を教えてください


886:デフォルトの名無しさん
08/02/03 19:42:26
サンプルコードを見る域に達してないな

887:デフォルトの名無しさん
08/02/03 19:45:39
だから質問しているんです

888:デフォルトの名無しさん
08/02/03 19:45:51
それどころか勉強すら始まってないな

889:デフォルトの名無しさん
08/02/03 19:46:37
なんか本買えよ。
というか、そんな変態言語じゃなくて、普通のC++から勉強しろ

890:デフォルトの名無しさん
08/02/03 19:50:40
>>887
無料で見れる情報、無料で協力してくれる人だけをあてにして勉強する気?

独学で身につけるだけの基礎的な力をもっているならまだしも、
まったく何も持っていないなら勉強するための最低限の準備くらいはしたら?

891:デフォルトの名無しさん
08/02/03 19:52:27
>>885
何でも良いからCの入門書を読んでからにしようぜ


892:デフォルトの名無しさん
08/02/03 20:00:57
質問ていうか相談なんだけど
TXTファイルの文字列置換ツール作たいんだけどさ
置換箇所だけ更新かけたいんだよ
でもさ、fopenでファイル開くと一箇所変えると全部上書きしないといけないじゃん
置換箇所だけ更新かける方法ない?

893:デフォルトの名無しさん
08/02/03 20:07:34
C++/CLIの文法はアレだからなー。

894:デフォルトの名無しさん
08/02/03 20:07:49
一旦、別のファイルに書き出す。
その後、元ファイルを削除し、
さっき書き出したファイルの名前を元の名前に変える。

895:デフォルトの名無しさん
08/02/03 20:08:21
文字数変わらないなら、fseekとかfwriteあたりを駆使して
上書きすりゃいいじゃん。 ずれるのならご愁傷様。

896:デフォルトの名無しさん
08/02/03 20:29:30
>>892
ファイルの途中でサイズが増減しても、局所的な更新だけですむような
ファイルシステムを実装する。

897:デフォルトの名無しさん
08/02/03 21:08:44
>>874
> ランダムに返却され再利用されるならそれしかない。

そんなことはないだろ。

組み込み用途だと、8KB なんて言うテーブルなんてとんでもないと言う
こともあるだろうし、PC でも ID を 32bit にしたいとか言われたら、
どうするんだよ。(w

>>868
ID の範囲に比べて、同時使用ユーザ数が極端に少ないなら普通にリニア
サーチして管理することもできるし、同時使用ユーザ数がそれなりで
ID の割り当て・回収の処理コストが問題になるならハッシュとかBツリー
を使うこともできる。

898:デフォルトの名無しさん
08/02/03 21:09:38
stl::map<stl::string, Animal> animals;
Animal &a = animals["cat"];

この時点で、aに入る物は出来ていますか?

899:デフォルトの名無しさん
08/02/03 21:13:50
stlの定義による。
stlがstdの間違いなら、aは正しく要素を指している。

900:デフォルトの名無しさん
08/02/03 21:16:27
>897
「何」を、リニアサーチするんだ?

901:デフォルトの名無しさん
08/02/03 21:16:42
>>897
また組み込み厨がでたよ。
特殊な環境を持ち出して、いちいち反論するヤツ。

902:デフォルトの名無しさん
08/02/03 21:25:25
>>897
ランダムに返却されれば、2^65536の組み合わせが発生する。それを記録処理するには65536bit必要になる。すなわち8Kバイトだ。
それ以下にするには、IDの消費が均一ではなく偏らせる必要がある。
たとえば、連続してIDを取得する。そういう特徴があれば、それに応じた処理にして節約すればいい。しかし、それはランダムとは言えない。


903:デフォルトの名無しさん
08/02/03 21:29:51
>>897
どこに極端に少ないと書いてある?

904:デフォルトの名無しさん
08/02/03 21:31:54
その次に「なら」ってかいてあるがな

905:デフォルトの名無しさん
08/02/03 21:33:18
>>884
いまさらだけど、配列の中身は0か1って書いてあるんだからshortは必要ないだろ

906:デフォルトの名無しさん
08/02/03 21:34:05
そこかしこのレスから揚げ足を取りたがってるオーラを感じるのは俺だけでいい

907:デフォルトの名無しさん
08/02/03 21:34:51
文章構成がアレだね。
前半は、「パターンがランダムでも、メモリ8KBも取る必要はない」って言ってて、
後半は、「パターンがランダムでなければ、節約する方法がある」みたいな。

908:881=884
08/02/03 21:37:43
えと、つまり、vectorのvがあるとして、
初期値として、(65535~0)を入れとくわけね
で、こうするとO(N)で触れる、ってだけの話。
要求(){ return v.pop_back() }
解放(id){ v.push_back( id ); }

909:デフォルトの名無しさん
08/02/03 21:41:34
それ O(N) じゃなくて O(1) だろ。

解放でデタラメな id 食わされたら死ぬとか言う問題もあるかもね。

910:デフォルトの名無しさん
08/02/03 21:43:20
あーそうそうO(1)だね。
でたらめなIDって言っても、if文一発で済むでしょう。
同じIDが複数解放されてきたららドナノヨって話は知らない。

911:883=905
08/02/03 21:47:39
>>908
大きな配列の変わりにvector使うのかと思ってたw

同じIDのチェックまでするならsetの方がよさそうだな

912:デフォルトの名無しさん
08/02/03 22:01:19
Cでbool型って使えたっけ?

913:デフォルトの名無しさん
08/02/03 22:04:18
>>902
もちろん、同時利用者数が最大 65536 と言うなら、ビットマップの方が
効率がいいのは自明だけど、>>868 が「そんな大きな配列」とか書いて
るから同時利用者数はそれほどじゃないのかも知れないと思っただけの
こと。

914:デフォルトの名無しさん
08/02/03 22:09:43
同時利用がたとえば30なら、IDを65535も用意しとく必要無いじゃん。

915:デフォルトの名無しさん
08/02/03 22:26:06
>>890
いいえ違います
ほかの単語は検索すればわかる、だけど記号は検索できないから質問してるの
検索できない単語が他にも沢山あるならまた質問しまくるかもしれませんが
幸い、検索不可能な記号はこれだけのようなので質問しました

>>891
手持ちの入門書には「System::~と書けばこう動く」という記述はあったが
「::は~という意味です」という記述はなかった

916:デフォルトの名無しさん
08/02/03 22:26:54
>>915
もうちょっとまともな本を買うべきです。

917:デフォルトの名無しさん
08/02/03 22:30:37
入門書どころか入門サイトにも名前つきで紹介されている件について。

918:デフォルトの名無しさん
08/02/03 22:31:15
>>915
いいから、独習Cと独習C++あたりでも一通り読んできなさい。

919:デフォルトの名無しさん
08/02/03 22:35:38
>>915
>>918の言うとおりだが、立ち読みは迷惑なのでちゃんと買おうな。

920:デフォルトの名無しさん
08/02/03 22:37:49
つうか碌に参考書やサイト読み込んでないのバレバレじゃん

921:デフォルトの名無しさん
08/02/03 22:39:07
大漁大漁^^

922:デフォルトの名無しさん
08/02/03 22:39:47
今時釣り宣言とかwww

923:デフォルトの名無しさん
08/02/03 22:43:09
ファイル書き込みについての質問なんですが
#include <stdio.h>
typedef struct{
char no[6];
char name[21];
int tanka;
}SHOHIN;
void main(void)
{
int i;
SHOHIN shohin[5];
FILE *fp;
if((fp=fopen("shohin.txt","w"))!=NULL);
{
for(i=0;i<LEN;i++){
printf("商品番号、商品名、単価\n");
scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka);

fprintf(fp,"%s",shohin[i].no);
fprintf(fp,"%s",shohin[i].name);
fprintf(fp,"%d\n",shohin[i].tanka);
}
fclose(fp);
}
return;
}
文字化けが起きてうまくいきません
例えば a,a,1と入力すると
a,a,11245072
となってしまいます
単純なミスだと思うのですがどうか教えてください!
コンパイラはbcc55を使用しています

924:デフォルトの名無しさん
08/02/03 22:46:09
>>923
<scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka);
>scanf("%s,%s,%d",shohin[i].no,shohin[i].name,shohin[i].tanka);
こうするとどうだ

925:デフォルトの名無しさん
08/02/03 22:46:48
>>923
次の二行を削除(もしくはコメントアウト)してみな
fprintf(fp,"%s",shohin[i].name);
fprintf(fp,"%d\n",shohin[i].tanka);

926:デフォルトの名無しさん
08/02/03 22:48:33
>>924
同じでした・・・

927:デフォルトの名無しさん
08/02/03 22:49:37
,の認識どうなってんだろうね

928:デフォルトの名無しさん
08/02/03 22:50:22
>>925
文字化けが消えました!
どうもありがとうございました!!!

929:デフォルトの名無しさん
08/02/03 22:52:00
>>914
将来の拡張のために ID の範囲は余裕を持っておく

ぐらいのことは普通にあるだろ。


930:デフォルトの名無しさん
08/02/03 22:53:40
>>928
そうじゃなくて %s でひと続きの文字列として shohin[i].no 以下に格納されてるだけってのを見て欲しい

931:デフォルトの名無しさん
08/02/03 23:04:56
突然ですが、実際のプログラム(main)って、
tryの中にほとんどの記述を入れるのでしょうか。
とある本で例外処理の部分を読んでいる初心者ですが、
この章だけは、mainのほとんど(catch以外)を
tryの中に入れてます。だけど、この後の章では
ざっと見た限りほとんど入れてないように思います。
例外をことごとく捕まえたいときには、実際の
現実的なプログラムだとどうなるのでしょうか。
先走っているのかもしれませんが気になるので教えてください。

932:デフォルトの名無しさん
08/02/03 23:10:06
例外がキャッチされなかった場合、
自動変数のデストラクタが走る保証はない。
もしそれで致命的なリソースリークが起こるなら、
例外をキャッチするべきなんだろうな。

933:デフォルトの名無しさん
08/02/03 23:10:57
  ~皿


    只只  只只只只
    只只  只只只
      |

      凸



934:デフォルトの名無しさん
08/02/03 23:13:57
エラー処理と復帰処理のできるところで捕まえればいい。
mainの処理全体をtryで囲むのは、例外即終了でおkな場合でしょ。

935:デフォルトの名無しさん
08/02/03 23:15:43
>>931
mainでキャッチしても、エラーメッセージ出すくらいしか使い道無くないかな
例外でアプリを落としてもいい場合は、キャッチしなくてもいいかな
落としたくない場合は、落としたくない箇所でキャッチすれば良い。たとえばメッセージループとかかな

質問だけど、DLL書いたとき、エントリのところで例外全部キャッチしたほうがいいかな

936:デフォルトの名無しさん
08/02/03 23:18:34
>>934
基本は全部囲っておかないと、 catch 漏れが無いか気をつけないといけなくなる。

937:デフォルトの名無しさん
08/02/03 23:41:16
>935
まあ、COM入門で出てくる話だが、「例外はDLL境界
超えられないものとして扱うべき」だな。

938:931
08/02/03 23:43:24
>>932-
どうもでした。
mainの中で全部っていうのは、
この本の(この章の)説明の都合なんですね。

こういうことでよろしいのでしょうか。
・mainの中でcatchしてもエラーメッセージを出すくらいの
処理しかできないので、基本は処理できるところで捕まえる。
・ただし、catchもれの心配もあるのでmainも全部囲う。
(もしかしてここはプロの方でも人によるとか、、?)


939:デフォルトの名無しさん
08/02/04 00:12:56
例外なんかキャッチしない仕事の人もいるぜ

940:デフォルトの名無しさん
08/02/04 00:17:20
>>932
確認させてください。スタックの巻き戻しってのは
例外だろうが何だろうが、スコープを抜けたら
構築済みのローカルオブジェクトは正しくデストラクタ
が呼ばれて解放されるんではないんだっけ?
これがRAIIを使ったリソース管理のメリットだと
思ってたんだけど。throwされた例外は確実にcatch
されないとリークするの?

{
boost::shared_ptr<Widget>(new Widget);
throw Reigai();
}

この場合、例外でスコープを抜けても
どこかでcatchされないとデストラクタ
が呼ばれずに、そのままterminateしてしまう?

941:デフォルトの名無しさん
08/02/04 00:24:00
terminate da Human.

942:デフォルトの名無しさん
08/02/04 01:15:31
試したけど本当に呼ばれないな。
そういう規格なんだろうか。
ハーブサッターの本の例外の話は嘘か?

943:デフォルトの名無しさん
08/02/04 01:17:15
例外を捕まえるハンドラがなければ、
throwした時点でterminate呼んでも良いみたいな話?

944:デフォルトの名無しさん
08/02/04 01:25:56
本当だ。
規格に書いてあった。


945:デフォルトの名無しさん
08/02/04 01:29:13
>>943
Exceptional C++の例外安全の話
項目13 P53とか
”例外が投げられてスコープから出たときにデストラクタが
呼び出され。。。”

って書いてあるから勘違いしてたかも。

946:デフォルトの名無しさん
08/02/04 01:49:51
最終的にどっかでcatchされるという前提なんだろうな。


947:デフォルトの名無しさん
08/02/04 02:05:31
しかしわかりにくい。。。
それじゃ、”例外が投げられてスコープから出たときに
デストラクタが 呼び出され。。。” じゃなくて、
「その例外がcatchされたとき、。。。」って書けよなあ。

948:デフォルトの名無しさん
08/02/04 02:10:42
本当そう思う。
でもわかって良かった。

949:デフォルトの名無しさん
08/02/04 02:35:22
要するにmainで全ての例外をcacheすればいいってことか。

950:デフォルトの名無しさん
08/02/04 02:40:10
そういうことになるね。こんな記事見つけた。

Stack Unwinding in the Event of an Uncaught Exception

When an exception is thrown and no matching handler can be found for it,
C++ invokes the function terminate(). By default, terminates invokes the
function abort(). (ここまでは規格の話だろうね)

Some compilers guarantee that at this point, the stack
has been unwound, i.e., all local automatic objects have been fully
destructed, streams have been flushed, and open files have been closed.
Other compilers don't unwind the stack in this case. In other words,
whether the stack is unwound in the case of an uncaught exception is
platform-defined. Therefore, you should check your compiler's
documentation to know how it behaves in the event of an uncaught
exception.


951:デフォルトの名無しさん
08/02/04 04:16:27
testというクラスがあって、
test::test(){各変数の初期化}というコンストラクタがあった場合

test *p;
p=new test [n];
とした場合も*p[0~(n-1)]の全てがコンストラクタが実行されて初期化されますか?

952:デフォルトの名無しさん
08/02/04 04:32:25
初期化されます

953:デフォルトの名無しさん
08/02/04 04:36:09
>>952
ありがとうございます。
かなり時間かけてクラス作ったのにコンストラクタ実行されなかったら泣くところだった

954:デフォルトの名無しさん
08/02/04 07:36:14
>>949
本当にそれした方がいいかどうかは分からんね。
どちらにしろ強制的に terminate される状況もあるわけだし、
よほど呼んでもらわないと困る処理は
set_terminate 側で対処した方がいい気もする。

955:951
08/02/04 10:45:38
vector使った方が上手く処理できそうなのでvectorを使ってみたんですが、デバッグ
で追いかけてみたところコンストラクタが実行されてません。
もしかしてvectorで確保した場合はコンストラクタ実行されないんでしょうか?

956:デフォルトの名無しさん
08/02/04 10:49:29
STLのvectorでintとかdoubleなどの値を保持しているとき、それらの和は
どうやって計算するのが一番よいですか?
自分は、boost::lambdaをつかってるんですが、なんかもっと他の書き方が
ありそうな気がして。(自分的にはboostがインストールされてないとダメなのが
嫌なんだけど、和、積、など他の演算にも対応がしやすくていいと思ってる)
int tmp = 0;
for_each(v.begin(), v.end(), tmp += boost::lambda::_1);
ここのスレの他の人のやり方を見せてください。


957:デフォルトの名無しさん
08/02/04 10:54:39
ふつうは0からv.size()-1まで足すだろ

958:デフォルトの名無しさん
08/02/04 11:24:24
>>957
そうか、、、。
そういわれると、そういう気もする。
なんだか956が恥ずかしいな。わすれてください。


959:デフォルトの名無しさん
08/02/04 11:29:25
しかもSTLにあるしなw
tmp = accumulate(v.begin(), v.end(), 0);

960:デフォルトの名無しさん
08/02/04 11:44:37
>>955
コピーコンストラクタ書いてる?

961:デフォルトの名無しさん
08/02/04 11:45:08
a > b であるunsigned int同士の引き算 b - aの動作は仕様によると
どうなるのでしょうか?

それと、ビットシフト演算子が算術シフトか論理シフトになるかどうかは
環境依存であってますか?

962:デフォルトの名無しさん
08/02/04 11:55:12
すみません。windowsXPで、eclipse+CDT+cygwinで勉強しています。
scanfなどで変数値を入力するプログラムを書いたとき、
事前に表示する「数字を入れてください」などの文章が出ず、
scanfに値を入力する待機状態になってしまいます。
どうしたらよいのでしょうか。
すみません。お教えください。

963:デフォルトの名無しさん
08/02/04 11:56:55
>>961
1) b - a + (UINT_MAX+1)
2) 左右シフトともに負の値のシフトに関して未定義。
  いきなりエラーで落ちても文句は言えない。

C規格の専用スレもあるので活用してください。

964:962
08/02/04 12:11:12
すみません。自己解決しました。
putsなりprintfなりを書いた後、fflush(stdout)をしました。
失礼しました。

965:デフォルトの名無しさん
08/02/04 12:17:35
>>963
すばやい回答ありがとうございます。もうひとつ質問がありました。
たびたびすいません。

両方ともunsigned intであるa * bが表現可能な数値の範囲を超える場合、
仕様による動作は未定義であってますでしょうか?

その動作に依存するコードを発見したので、書き直そうかどうか迷ってます。
ただ、画像処理(アルファブレンディング)に関するコードなので、書き直す
と命令数が増大して遅くなってしまうので、躊躇してます。

>C規格の専用スレもあるので活用してください。
初心者お断りと書いてあるのですが、このような質問でも大丈夫
なのでしょうか?

966:デフォルトの名無しさん
08/02/04 12:20:57
>>965
a * b % (UINT_MAX+1)
符号なし整数型の算術演算の結果があらわせる範囲を超えた場合はループする

頭の悪いやつがつけたスレタイを気にする必要はない。

967:デフォルトの名無しさん
08/02/04 12:25:26
>>966
ループするのですね、ありがとうございます。
コード書き直す必要が無いとわかって助かりました。

今度からこのような質問は規格スレに持っていく事にします。

968:デフォルトの名無しさん
08/02/04 12:26:25
>>959
<numeric>ですね。これほとんど使ってなかったんだよな。
恥ずかしいが、自分的にはaccumulateとか知ったからよかったよ。
ありがとう。


969:デフォルトの名無しさん
08/02/04 14:04:32
>>965
そもそもαブレンディングでオーバフローするような数字を扱うわけじゃないだろ。
そこを吟味せずにオーバフロー対策なんて意味ないぞ。

例えば、rgb各8ビットの画像から画素の値を取り出す場合は通常0-255の値域を取る。
そこで、unsigned intのr, g, b, ra, ga, baがあるとしたらr * raは何があってもオーバフローしないわけだ。

970:デフォルトの名無しさん
08/02/04 14:34:43
なんかずれてる気がするんだけどなあ。

971:デフォルトの名無しさん
08/02/04 17:34:53
猫でもわかるC言語プログラミングという本で勉強し始めたのだが、
誤字脱字ありすぎで正直自分が悪いのか本が間違ってるのかコンパイラの問題なのかわからん。
Borland C++ Compiler 5.5


#include <stdio.h>
#include <float.h>

int main()
{
double pai = 3.14159265358979;
int mon = 2;

printf("%d\n", mon = 3);
printf("%e\n", pai);
printf("%05d\n", mon);
printf("%20.18f\n", pai);

return 0;
}



3
3.141593e+000
00003
3.141592653589790000

と表示されるらしいのだが、
①二行目が 3.141593e+00 、四行目が 3.141592653589790007 になる。
②コンパイラが警告を出す。('mon'に代入した値は使われていない)
どうしたらいいのか教えてください。

972:デフォルトの名無しさん
08/02/04 17:46:50
>>971
正常。浮動小数点演算は丸め込みとかでコンパイラによって結果が若干変わる場合がある

gcc 3.2.2 [FreeBSD]
3
3.141593e+00
00003
3.141592653589790007

bcc32 5.6.4
3
3.141593e+00
00003
3.141592653589790007

cl(VC++) 13.00.9466
3
3.141593e+000
00003
3.141592653589790000

警告はint mon = 2;の後に値を読み出さずに3だを代入してるから出る。基本的に無害。

973:デフォルトの名無しさん
08/02/04 17:52:22
>>972
安心した、ありがとうございます。

974:デフォルトの名無しさん
08/02/04 18:03:21
>>969
コードは載せられませんが、アルファブレンディングは

alpha*src + (1 - alpha)*dst

になりますが、そのコードでは一時変数を嫌って、

alpha * ( src - dst ) + dst

になってました。

975:デフォルトの名無しさん
08/02/04 22:20:29
演算子オーバーロードのような感覚で、
クラスのインスタンス名を書いたときに、特定の処理結果を返すようにする方法はありませんか?
具体的には

class ClassA{
int val;
}

ClassA ca;

があったとして

cout<<ca.val;

と書くところを

cout<<ca;

で出来るようにするという事です。
宜しくお願いします。

976:デフォルトの名無しさん
08/02/04 22:22:42
>>975
<<演算子をオーバーロードしろよ

977:975
08/02/04 22:31:18
すみません、<<は確かにそうでした。
条件式に単独で入れたときにvalの値でboolに変換されるようには出来ませんか?

978:デフォルトの名無しさん
08/02/04 22:34:31
bool ClassA::isPlus(){ return val > 0; }
とかじゃだめなん?

979:デフォルトの名無しさん
08/02/04 22:34:45
bool operator !()constと operator void *()constあたりを定義するのが常套手段だが。

980:デフォルトの名無しさん
08/02/04 22:39:46
operator bool をオーバーロードするだけじゃダメなのか?

981:デフォルトの名無しさん
08/02/04 22:40:27
intへの暗黙のキャストが許せるなら、それでもいい。

982:デフォルトの名無しさん
08/02/04 22:54:31
>>980
訳わかんねえことがいっぱい起こるから、やめといた方がいい。

983:デフォルトの名無しさん
08/02/04 23:00:47
0xではこの辺の暗黙的型変換を禁止できるようになるんだよな、たしか。

984:975
08/02/04 23:19:06
変換関数を定義しておけば良いんですね。
そういうものがあるというのは読んだんですが用途まで考えていませんでした…。
>>980の方法で良さそうです。

>>979のoperator void*でも上手くいきましたが
条件式の中身はboolにキャストされると思っていたんですが、
void*でも動くのはどういう意味なのか教えてもらえないでしょうか。

985:975
08/02/04 23:23:45
すみません、>>981以降リロードしてませんでした…。

986:デフォルトの名無しさん
08/02/04 23:26:16
if( x )はif( x!=0 )と等価、というか。
void *m = malloc(len);
if( m ) { return m; } else { abort(); }
みたいな処理ってやったことないの?

987:デフォルトの名無しさん
08/02/04 23:27:42
>>984
982でも書いたが、operator boolのオーバーロードはやめとけ。

ClassA a, b;
int c = a + b;
int d = abs(a);

みたいのがコンパイル通っちまう。
>>979 が常道。

988:975
08/02/05 00:02:09
わかってきました。
条件式に入るクラスは数値かポインタへの変換を持っていれば良くて、
operator void*を定義しておけばそちらに変換されると。
でintからboolよりもintからポインタの方が予期せぬ動作が少ないのでvoid*を使うべきと。
知識が足りてなくてレス読みつつググったりして勉強になりました。
どうもありがとうございました。

989:デフォルトの名無しさん
08/02/05 00:03:21
>>984
ポインタはboolへの暗黙の変換がある。
cinもそれを利用してif(cin)を可能にしている。
その方法が>>979の方式だ。
boolへの暗黙の変換はおすすめできない。

990:デフォルトの名無しさん
08/02/05 00:03:40
>>987
bool 値として使用したいのならそんなもんじゃね?
そうでないならそもそも演算子オーバーロードで解決すべきじゃないと思う。

991:デフォルトの名無しさん
08/02/05 00:23:35
boostは徹底してて、関数ポインタとか返してくるし(w

992:デフォルトの名無しさん
08/02/05 00:31:24
int a = 123;
bool b = !!a;

993:デフォルトの名無しさん
08/02/05 00:33:44
>>991
すごー。でもそのくらいの方が有り難い。
まえに operator bool()を定義してて、コンパイラがブッ壊れたかと思った。

994:デフォルトの名無しさん
08/02/05 00:44:42
>>991
つまり、関数呼べちゃうってことか?
メンバポインタとかの方が良くね?

995:デフォルトの名無しさん
08/02/05 00:48:01
・ ・ ・ ・ ・ ・ ・ ・ 
メンバ関数ポインタだぜ?

そうそう呼べはしないとおもうが。

996:デフォルトの名無しさん
08/02/05 00:49:29
なんだ。メンバ関数ポインタか。
ならいいが。

997:デフォルトの名無しさん
08/02/05 01:19:14
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
スレリンク(tech板)

998:デフォルトの名無しさん
08/02/05 01:20:11
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
スレリンク(tech板)

999:デフォルトの名無しさん
08/02/05 01:22:10
さーて来週のスレは?

1000:デフォルトの名無しさん
08/02/05 01:24:41
お疲れ様でした。次週も環境依存コードをお楽しみください。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch