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

このエントリーをはてなブックマークに追加
891デフォルトの名無しさん:2005/10/07(金) 18:56:05
>>890
ヘッダでの変数宣言なら2重定義をはじくマクロくらい入れとけ
てか、普通入れる物だと思ってた俺ってアホ?
892デフォルトの名無しさん:2005/10/07(金) 19:13:32
(・∀・)ニヤニヤ
893デフォルトの名無しさん:2005/10/07(金) 20:04:10
シッ!
見ちゃいけません・・!
894デフォルトの名無しさん:2005/10/07(金) 20:31:37
こんばんわ。質問させて下さい。

既存のCOMサーバーのATLオブジェクト(シンプルオブジェクト)があり、
これがコネクションポイント非サポートなんですが、
コネクションポイントのサポートをさせる事は可能でしょうか?

コネクションポイントのサポートをウィザードで指定した
ATLオブジェクトを作ってみて、IDL等真似して移植してみたのですが、
クライアントから DispEventAdvise した時に
0x80004002:インターフェイスがサポートされていません
エラーが出てしまいました。

素直にイベント配信用に新しいATLオブジェクトを作成した方がいいのでしょうか。。。

開発環境はVC6.0です。

よろしくお願いします。
895デフォルトの名無しさん:2005/10/07(金) 22:05:35
下のプログラムの c[0] のところで
コンパイルエラーが発生してしまうのですが、
このような使い方はできないのでしょうか?

class CHoge {
public:
int& operator[]( int i ) { return x[i]; }
protected:
int x[1];
};

void main() {
CHoge a;
CHoge& b = a;
const CHoge& c = a;

a[0];
b[0];
c[0];
}
896デフォルトの名無しさん:2005/10/07(金) 22:23:33
何故エラーメッセージを晒さないくせに質問するんだろうな。
897デフォルトの名無しさん:2005/10/07(金) 22:24:09
>>895
constなオブジェクトはconstなメンバ関数しか呼び出せない。

const int& operator[](int i) const { return x[i]; }

を用意すれ
898デフォルトの名無しさん:2005/10/07(金) 22:25:00
httpでアクセスして,ページのソースをmyDataBufferに格納しました↓
InternetReadFile(hFile,myDataBuffer,(DWORD)(size),&dwSize);

ただヤフーのページのため,EUC-JPでエンコード(ディコード?)しないと文字化けします
C++ではどのようにしてエンコードするのでしょうか?
調べてみたところ,使えそうなのが
HRESULT ConvertINetString( LPDWORD lpdwMode,
DWORD dwSrcEncoding,
DWORD dwDstEncoding,
LPCSTR lpSrcStr,
LPINT lpnSrcSize,
LPBYTE lpDstStr,
LPINT lpnDstSize
);
ここでEUC-JP → UNICODEやShift-JISとしてみたものの,文字化けします
どのようにするのがいいでしょうか?
C#の場合は,非常に簡単にできるみたいです↓

//C#の場合
Encoding.GetEncoding("EUC-JP").GetString(myDataBuffer);
899デフォルトの名無しさん:2005/10/07(金) 22:36:33
>>897
通りました〜。
ありがとうございます。
900デフォルトの名無しさん:2005/10/07(金) 22:50:10
>>884
そもそも自作のライブラリで piを提供する必要があるとは思わないが、
(普通に math.h M_PIとか使いたい)
その糞ライブラリはオブジェクト.o,.aを提供するんだろうから、
警告もマクロもdefineも嫌ならヘッダには extern const double PI;
ぐらいしか書きようがないのでは。
901デフォルトの名無しさん:2005/10/08(土) 00:38:53
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
902デフォルトの名無しさん:2005/10/08(土) 00:39:36
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
903デフォルトの名無しさん:2005/10/08(土) 00:43:34
double型で確保した二次元配列にファイルからfreadでbitサイズの物を格納または
fwriteでunsigned charサイズのものをファイルに出力できないのでしょうか。
キャストしなくてはいけないはずなのですが、二次元配列のキャストも(int)のようなものを
変数の前につけるだけでいいのでしょうか。試してみたのですがうまく値を格納・出力できなかったもので。
どこにキャストの宣言をつけるのか解らないのでよろしくお願いします。
C言語、 VC 6.0、Win2000です。
double **arr2;
double *buff;
buff = (double *)malloc(sizeof(double) * (x * y));
arr2 = (double **)malloc(sizeof(double) * (y));

fread(&test1, sizeof(bit), 1, fp);
arr2[i][j] = test1;

fwrite(&arr2[i][j], sizeof(unsigned char), 1, fp);
904デフォルトの名無しさん:2005/10/08(土) 02:15:45
>>902
まさしくデバッグ中のプログラムが動きっぱなしなんだろ。

>>903
エラーメッセージを貼れ。
キャストは誤魔化しのためにあるのではない。
905デフォルトの名無しさん:2005/10/08(土) 02:17:24
arr2[i][j] = *((double *)&test1);
ってことがやりたいんじゃないの?
その文面だけじゃよくわからんけど
906デフォルトの名無しさん:2005/10/08(土) 06:41:22
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
907デフォルトの名無しさん:2005/10/08(土) 08:14:24
>>906
パソコンの電源落として窓から投げ捨てろ
908デフォルトの名無しさん:2005/10/08(土) 08:17:22
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
909デフォルトの名無しさん:2005/10/08(土) 09:18:37
サーバーとクライアントを作り、
クライアントから、IPアドレス・ポート番号を入力せずに、又はIPアドレスのみ入力せずに、
起動しているサーバーを自動検索するにはどうすればよろしいでしょうか?

知っている方いましたらお教えください。
宜しくお願いします。

環境はVC6.0です。
910デフォルトの名無しさん:2005/10/08(土) 09:23:55
>>909
考えられる全IP、全ポートにpostして応答が返ってきたもの
911デフォルトの名無しさん:2005/10/08(土) 09:25:57
相当限定された環境でないと不可能だな
912デフォルトの名無しさん:2005/10/08(土) 09:57:05
>>910
その方法は一番最初に考えついてつくってみたんですが、
検索にかなりの時間がかかってしまって、実用的ではなかったです。

時間短縮さえできれば、その方法でもいいとおもっているんですが。

>>911
やはり不可能なんですね。

ポート番号から、サーバーを探すことはできますか?
913デフォルトの名無しさん:2005/10/08(土) 09:59:33
逆接続にするのはどうだろう。
クライアントがサーバのIPを使って接続するのではなく、
クライアントのIPを使ってサーバが接続するの。
#実は某官庁系ネットワークがそういうつくりだったり。
914デフォルトの名無しさん:2005/10/08(土) 10:00:32
>>912
無理だろ。
IPとポート番号が揃ってはじめてアクセスできる。
お前の家へは市町村だけ書いて番地を書かずとも郵便は届くのか。
915デフォルトの名無しさん:2005/10/08(土) 10:02:35
UDPのブロードキャストを利用して、
専用のプロトコル作れば良いだけでは?
916デフォルトの名無しさん:2005/10/08(土) 11:39:24
ピュア型P2Pのノード探索とかが近いかも名
917デフォルトの名無しさん:2005/10/08(土) 12:25:43
>>912
もともとその発想自体が実用的でも適切でもないんじゃね?
サーバ側が約束のportで適時ブロードキャストで情報をアナウンスするか、
クライアントからのリクエスト(ブロードキャスト)に返信するようにするか…
無駄だなあ。
918903:2005/10/08(土) 12:46:48
>>904
自分のやり方は
fwrite((unsigned chart*)&arr2[i][j], sizeof(unsigned char), 1, fp);
でやったのですが、エラーがでなくてファイルが空のままでした。
読み込み時も同じ感じでやった後に配列の中身をprintfで調べても空でした。

>>905
ありがとうございます。今すぐには試せないのですが。

最初から配列をint型で確保した時は出来たのですが、double型でなってしまったので確保しなくてはいけないので、
キャストは一時しのぎで使う時だけ型を変えればいいと言われたのでして。
919デフォルトの名無しさん:2005/10/08(土) 13:06:14
>>918,903
論理的に意味の取れない断片だけ提示してもまったく無意味だぞ。
動かせる程度の最小例ぐらいにまとめないと。
bitサイズだとかtest1の型だとか、不明な点ばかりなので。
そもそも何をしたいのかまったく意味をとれないようなコードだし、
int型で本当にできたのかどうかも怪しいぐらいだ…
920デフォルトの名無しさん:2005/10/08(土) 13:41:48
>>918
もともとdouble型をsizeof(bit)だけ読んだりsizeof(unsigned char)だけ
書いたりするって、何か勘違いしてやしないか?
エラーが出なくて空って、ちゃんと fwriteの返値でエラーチェックやってる?
まさか、double値の bitがちょうど zeroの部分を 1byte書き込んだのを
zero==空 と勘違いしてやしないよね?
921デフォルトの名無しさん:2005/10/08(土) 13:55:28
>>918
IEEE754を知らないとか言わないよな?
922918:2005/10/08(土) 14:04:08
test1は構造体でunsigned char型で宣言してました。
for(i=0; i<20; i++){
  for(j=0; j<20; j++){
    fread(&Ko.test1, sizeof(bit), 1, fp);
    log[i][j] = Ko.test1;
 }
}
のように二次元配列に入れるもしくは出すことがしたかったものでして。
質問の仕方が悪かったのと基本的なところを理解しきれていなかったみたいです。
申し訳ありませんでした。基礎的なところをもっと詳しく調べてやり直してみます。
すみませんでした。
923デフォルトの名無しさん:2005/10/08(土) 14:13:31
>>922
ならなんで fread(&Ko.test1, sizeof(unsigned char), ... じゃないんだ?
初心者のトラブルなんだし返値のチェックぐらいきちんとしろよ。
つか、*何も*理解してないが故に質問さえまともにできないだけだな。終了。
924デフォルトの名無しさん:2005/10/08(土) 15:17:35
SuperCon課題レベルの、高度なC言語の問題が沢山載った本を、どなたがご存じないでしょうか?
925 ◆95zCfWeGH2 :2005/10/08(土) 21:33:18
C++に関する基本的な質問です。
開発環境は WinXP Pro SP2 、VC++.NET です。

現在C++勉強のために多倍長整数のクラスを自作しております。
http://aploda.net/dl.php?mode=pass&file_id=0000004834
のような形で、クラスを書いてみました。 (operator+ はまだ実装してません。)

このクラスを使って
void CtestDlg::OnBnClickedOk() {
{
CInteger a(1);
CInteger b(2);
CInteger c;
c = a+b;
}
}
という関数を作ったところ、
c=a+b; から抜けたあたりで、 プログラムが落ちてしまいます。
エラーメッセージは
test.exe の 0x1020a702 (msvcr71d.dll) でハンドルされていない例外が発生しました :
0xC0000005: 場所 0xccccccc8 を読み込み中にアクセス違反が発生しました。 。
というものです。


よろしくお願いいたします。
926デフォルトの名無しさん:2005/10/08(土) 21:37:43
くそプログラムのデバッグを他人にやらせようとはいい度胸をしているじゃないか。
927デフォルトの名無しさん:2005/10/08(土) 21:42:23
とりあえず、確保もしてないメモリにmemcpyを呼ぶ奴は死ね。
928デフォルトの名無しさん:2005/10/08(土) 21:59:00
>>925
operator +=はどうした。
あと、CIntegerのメンバ関数の中でもCInteger::を付けずにzeroとかの列挙へアクセスできる。
929925 ◆95zCfWeGH2 :2005/10/08(土) 22:25:58
なんとか、解決しました。

>>926
すいません。 以後気をつけます。

>>927
確かにそうでした。

>>928
operator += はまだ実装していません。 なにぶん、作っている最中なので。
後者の列挙型へのアクセスについては知りませんでした。 ありがとうございます。

ちなみに、未熟な腕で書き直して、こんな感じになりました。
http://aploda.net/dl.php?mode=pass&file_id=0000004837

しっかし、今度はoperator+の宣言が
CInteger operator+(CInteger&,CInteger&);
になってしまいました…… 値渡しは避けたいのですが、
なんとか、調べてみます。

どうもです。
930デフォルトの名無しさん:2005/10/08(土) 22:28:14
>>925
NULL を使うな! 0 にしろ
931デフォルトの名無しさん:2005/10/08(土) 22:39:20
>>929
operator +()の戻り値が値渡しになるのは仕方がない。

operator +=()があればoperator +()はすぐに作れる常套手段がある。friendにする必要もない。
CInteger operator +(const CInteger& left, const CInteger& right)
{
    return CInteger(left) += right;
}
932デフォルトの名無しさん:2005/10/08(土) 22:43:37
nullpo inter
933925 ◆95zCfWeGH2 :2005/10/08(土) 22:51:36
>>930
そうなんですか……orz
でも、見ててポインタと区別つかない……

>>931
おぉ、 確かにそうですね。
今から書いてみます。

みなさん、どうもです。
934デフォルトの名無しさん:2005/10/09(日) 01:49:42
>>794
if( boost::is_pod<TYPE>::value )
でできるみたいですね。ありがとう御座いました。
935デフォルトの名無しさん:2005/10/09(日) 03:59:04
一番シンプルな四捨五入のコードを教えてください。
936デフォルトの名無しさん:2005/10/09(日) 04:07:28
int n;
n=(n+5)/10*10;
937デフォルトの名無しさん:2005/10/09(日) 05:25:10
(int)(d + 0.5);
938935:2005/10/09(日) 05:36:45
すみません。浮動小数点でお願いします。
939デフォルトの名無しさん:2005/10/09(日) 05:39:54
そもそも四捨五入ったって、小数点以下何位を四捨五入したいの?
それを指定した上での四捨五入が欲しいのか?
940デフォルトの名無しさん
第三位なら
(int)(d*1000 + 0.5)/(double)1000;
とか