くだすれC++Builder(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/10/23(金) 09:06:16もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
C++Builder使いが優しくコメントを返しますが、
お礼はC++Builderの布教と初心者の救済をお願いします。
Embarcadero Home Page
http://www.codegear.com/jp/
<過去スレ>
くだすれC++Builder(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1117225464/l50
くだすれC++Builder(超初心者用)その2
http://pc10.2ch.net/test/read.cgi/tech/1144308804/l50
くだすれC++Builder(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1171219191/
<兄妹スレ>
くだすれDelphi(超初心者用)その50
http://pc12.2ch.net/test/read.cgi/tech/1246340765/l50
0261250
2010/04/20(火) 11:36:58まじですか
とりあえず2007はバグって受信すらできないので
俺もBuilder5のNMUDPでやってみたんですが、やっぱ送信できても受信ができなかった。
チラっとコード教えて。
ちなみにWindowsのFWはOFFってるしPFWも入れてない。
0262260
2010/04/20(火) 11:58:58void __fastcall TADataModule::NMUDP1DataReceived(TComponent *Sender, int NumberBytes, AnsiString FromIP, int Port)
{
scoped_array<char> buf(new char[NumberBytes+1]);
int s = 0;
TNMUDP& aNMUDP = dynamic_cast<TNMUDP&>(*Sender);
aNMUDP.ReadBuffer(buf.get(), NumberBytes+1, s);
buf[s] = 0;
// ...
}
0263250
2010/04/20(火) 12:52:21あ、どうもありがとう。
むしろ、それ以前にDataReceivedイベントが入らないので
その前のポート設定とかを教えてくださ。
これってbindしなくても勝手に受信できる状態になってるんですかね?
0264260
2010/04/20(火) 13:11:15ReportLevel は 1 にしてる
それだけだよ
0265250
2010/04/20(火) 13:27:32あ、ありがとうありがとう。でけますた。
RemotePortとLocalPortの設定が逆でした馬鹿でした俺はゴミです。
2007のTUdpSocketもそれがアレで受信できなかったのかなあ
とりあえず試してみまふ
0266250
2010/04/20(火) 13:37:012007でもLocalPortとRemotePortを逆にしてやってみたりはしてたんだが
こっちの場合はRemotePortに目的のポート番号を指定しないと出力もできなくなる
だから5のNMUDPでもRemotePortに指定してたんですが・・・
ちなみに、俺は昨日から何をほざいてるかと言うと、
最初はWinsocket APIでUDPで通信していて、相手から受信してから
返答を返す時に、相手が受け取ってくれない(SNMPのアレ)
勿論こっちはちゃんと返答を返しているのはターミナルソフトやWiresharkで確認済み。
んで、WiresharkでよくよくみるとSrcポートとDstポートがどうも逆っぽいみたいな
Winsocket APIでこれを逆にできれば一番いいのだが、調べたがやり方がわからない
そこでVBのうんこコンポで試してみたらLocalPortとRemotePortがあったので
それでアレしてみたら見事にちゃんとなってくれたので
それならBuilderのコンポでやってみるかってことで、
0267250
2010/04/20(火) 13:55:15これ送信するときはLocalPort=0、RemotePort=目的ポート番号で
受信するときはLocalPort=目的ポート番号、RemotePort=0
じゃないとダメなのかこれ
つーことはこれって送信と受信したいなら2つNMUDPを使えってことか!!
なんじゃこの糞仕様はw
0268250
2010/04/20(火) 14:05:36送受信するならLocalPorとRemotePortにポート番号をぶち込めってことだったぽ。。
いろいろすまんこったい
0269250
2010/04/20(火) 14:09:05LocalとRemoteポートを同じにしたら結局APIでやてtるのと同じだこれ。
うんこしてくる
0270デフォルトの名無しさん
2010/04/20(火) 14:10:11ひとつで送受信は一応できると思う。
LocalPort : 待ち受けポート番号
RemotePort: 送信先ポート番号
っていうことで、送信元ポート番号や受信元ポート番号を
指定できない糞仕様だったと思う。
0271250
2010/04/20(火) 15:13:44VBのアレが同じLocalPort、RemotePortって名前で
向こうはしっかりとSrcポートとDstポートがアレできてたから
こっちもてっきり出来ると思っていたんですが、どうやらうんこだったようで・・・
0272260
2010/04/20(火) 15:25:32なのでググりながらwinsock使ったことあるけど
難しくはないと思うよ
0273250
2010/04/20(火) 15:30:37ええええ!!
winsockでは普通に送受信はしてたんですがー
それでSrcポートとDstポートって制御できましたか??
その辺を是非教えて頂きたいです
0274デフォルトの名無しさん
2010/04/21(水) 16:37:04解決なり時間費やすはめになる。
0275デフォルトの名無しさん
2010/04/21(水) 17:41:18マイナーかどうかは余り関係がないと思う。
それを補って余りあると考えている人間が使っているのだから
以下略
0276デフォルトの名無しさん
2010/04/26(月) 10:53:03ListView1->SortType = stData;
ってすると、stDataが曖昧だってコンパイルエラーがでます。
これどうやってキャストしたら馬鹿な2007は納得してくれますか?
0277デフォルトの名無しさん
2010/04/26(月) 10:59:510278デフォルトの名無しさん
2010/04/26(月) 11:01:57今度は馬鹿な僕が理解できませんでした。
それでキャストしたらエラーでましたが、どやって記述しますか?
0279デフォルトの名無しさん
2010/04/26(月) 11:09:09今回の件に関してだけなら
stDataが定義されているComctrls::stDataとかで足りるかもしれないけどな。
0280デフォルトの名無しさん
2010/04/26(月) 11:13:18まあお前が答えるより先に解決したから礼なんて言わないし役立たずとかしおもってないし
0281デフォルトの名無しさん
2010/04/26(月) 11:21:02ホント、バカは何をやってもバカなんだな。
0282デフォルトの名無しさん
2010/04/26(月) 11:35:3302832068
2010/04/26(月) 14:27:01くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
くだすれC++Builder(超初心者用)その4
02842068
2010/04/26(月) 14:28:05>もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
>C++Builder使いが優しくコメントを返しますが、
>お礼はC++Builderの布教と初心者の救済をお願いします。
0285デフォルトの名無しさん
2010/04/28(水) 11:08:33Builder2007では↓のような関数を呼ぶときに
void hoge( const char *buff )
{
}
↓のコードでよかったのですが
hoge( Edit1->Text.c_str( ) );
Builder2010で同じコードだと
E2034 'wchar_t *' 型は 'const char *' 型に変換できない
ってエラーがでます・・・
これどうやってキャストしたらいいですか?
0286デフォルトの名無しさん
2010/04/28(水) 11:13:46けどこれって全部AnsiStringでキャストしないとダメですかね。。。
はぁ・・・何この糞仕様・・・
0287デフォルトの名無しさん
2010/04/28(水) 11:27:202007で作ったのを2010でコンパイルすると
2010で作ったexeは2007のよりサイズが倍になってるんだが・・・
これ以前にBuilder5で同じバグがあってアップデートで多少小さくなったんですが
これ2010もひょっとして同じバグ?
それとも単純に無駄な機能が増えまくってexeが肥大化しただけですか?
うーむどっちみち気持ちいいものではないなあ。
0288デフォルトの名無しさん
2010/04/28(水) 11:35:12思われる
吐いたコードを逆アセンブルで見てみな
0289デフォルトの名無しさん
2010/04/28(水) 11:58:020290デフォルトの名無しさん
2010/04/28(水) 12:03:07なんだとこのぶた
0291デフォルトの名無しさん
2010/04/28(水) 12:50:480292デフォルトの名無しさん
2010/04/28(水) 13:56:420293デフォルトの名無しさん
2010/04/28(水) 16:08:510294デフォルトの名無しさん
2010/04/28(水) 18:11:44超初心者用でない質問スレがなくて、ここが超初心者用だと認識していなかった阿呆のせいか?
0295デフォルトの名無しさん
2010/04/29(木) 00:19:572010ではString=UnicodeString(UTF-16)となった。hogeがconst char *をパラメータで
受け取る仕様とは食い違いがある。Stringを一旦ANSI(Shift_JIS)に変換してから受け取るか、
const wchar_t *を受け取るように変えるか、どっちかが必要。
>287
2010の新機能である属性(Attribute)の影響かと。
0296デフォルトの名無しさん
2010/04/30(金) 14:10:19wchar_t filename[256];
::lstrcpy( filename, ExtractFilePath( Application->ExeName ).c_str( ) );
普通にコピーしたいんですがエラー出ます
これwchar用の関数かなにかあるんですか?
0297デフォルトの名無しさん
2010/04/30(金) 15:44:38lstrcpy が lstrcpyA にマッピングされている。ということは
UNICODE モードでコンパイルされていないようだから、
よい機会なのでアプリケーション全体を UNICODE モードでコンパイルしてみたら?
ANSI 規格準拠で書きたければ wcscpy で。
C/C++ 言語は10年以上まえから UNICODE サポートを行っているので、必要なものは
そろっていると思ってよいですよ
0298デフォルトの名無しさん
2010/04/30(金) 15:47:57ありがとうございます。
この機会にアレするとして今後の事を考えると
どういう書き方がいいですかね?
0299デフォルトの名無しさん
2010/04/30(金) 16:09:34「TCHAR を wchar_t にする」みたいなオプションがあるから
それを有効に。
これで Windows API と関連する部分が UNICODE に切り替わるので
コンパイルエラーが出てきたところを _T 系マクロでラップ。
T マクロを使う分には、ANSI/WIDE 両方で動くコードを作れる「はず」なので
「WIDE モードでエラーをつぶす」
「ANSI に戻して動作チェック」
「WIDE にして動作チェック」
を繰り返す。
最終的に ANSI/WIDE 両方で動く(C/C++)コードができて
WIDE モードでコンパイルすれば UNICODE-VCL との親和性も高くなる。
というところ。
0300デフォルトの名無しさん
2010/04/30(金) 16:24:31あ、プロジェクトオプションのそれをアレしたら普通にlstrcpyでもコンパイル通った。
基本的にTCHARの設定はアレしないほうがいいんですかね?
これから新たに作るとかのときは
0301デフォルトの名無しさん
2010/04/30(金) 16:46:13lstrcpy (を含む Windows API で、文字を扱うもの)は、
lstrcpyA と lstrcpyW が実体として定義、提供されていて、
Windows.H とその配下がマクロ(単純な #define)で plain な lstrcpy にマップしているのです。
296 で提示されているコードでは wchar_t (と c_str())を直に使っているので、
WIDE 版の API である lstrcpyW を明示的に呼ぶほうが素直かも知れません。
ここら辺は各自の判断でよいかと。
0302デフォルトの名無しさん
2010/04/30(金) 16:52:31色々とありがとうございます。
ちょっとwchar_t等の知識が乏しいのでまずはその辺を勉強してみます。
ご教授ありがとう。
0303デフォルトの名無しさん
2010/04/30(金) 16:59:40以下のコードなら、ANSI でも WIDE でも動きますよ。
TCHAR filename[256];
_tcscpy( filename, ExtractFilePath( Application->ExeName ).t_str( ) );
0304デフォルトの名無しさん
2010/04/30(金) 17:00:150305デフォルトの名無しさん
2010/04/30(金) 17:28:33確かにそれでコンパイル通りましたが・・・
filenameの中身をみてみると??になってました・・・
ちなみにTCHARって1バイトなんですねこれ。
0306デフォルトの名無しさん
2010/04/30(金) 17:36:38CBuilder2010でやるとコンパイルエラーはでないのですが、実行するとアクセス違反エラーが出ます。
Variant cat = Variant::CreateObject("ADOX.Catalog");
cat.Exec(Function("Create") << "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\test.mdb");
これ、どうしたら正常にmdbファイルを作成することができますか?
0307デフォルトの名無しさん
2010/05/01(土) 05:57:24どこで?
0308219
2010/05/01(土) 09:06:17機能はVCLにありますか?
0309デフォルトの名無しさん
2010/05/01(土) 10:23:40TCHARはマクロ
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
0310デフォルトの名無しさん
2010/05/01(土) 10:28:01http://docwiki.embarcadero.com/RADStudio/ja/TCHAR_%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0
0311デフォルトの名無しさん
2010/05/04(火) 11:50:150312デフォルトの名無しさん
2010/05/05(水) 17:01:47WriteTimeにしたからといって引数の日付値が消えるわけではないんでしょうか?
0313デフォルトの名無しさん
2010/05/06(木) 10:42:27プログラミング初心者かC++初心者かC++Builder初心者かで違う。
前ふたつはできて、C++Builder初心者ならDelphiの参考書とマニュアルのC++拡張見れば十分。
0314デフォルトの名無しさん
2010/05/06(木) 21:50:240315デフォルトの名無しさん
2010/05/06(木) 22:22:25WriteDateTimeとWriteDate/WriteTimeは同一の動作。つまり
> WriteTimeにしたからといって引数の日付値が消えるわけではない
で正解。
0316デフォルトの名無しさん
2010/05/06(木) 23:12:34Amazonで検索してみれば?
0317デフォルトの名無しさん
2010/05/07(金) 20:33:390318デフォルトの名無しさん
2010/05/07(金) 20:34:21やっとあくきんがとけた
cat.Execの行でエラーでます。
これ何とかなる方法はありますか?
0319デフォルトの名無しさん
2010/05/08(土) 02:40:30表示されているアドレス等、一式が欲しかったんだな。
多くのダイアログは、Ctrl-C でテキスト部分がコピーできるので、
気楽に保存できるよ
0320デフォルトの名無しさん
2010/05/10(月) 12:22:32エラーはEAccessViolationって書いてあるダイアログが出るだけです・・・
0321デフォルトの名無しさん
2010/05/11(火) 11:07:17あ、DBはアクセスのmdbでいいです。
0322デフォルトの名無しさん
2010/05/11(火) 11:13:480323デフォルトの名無しさん
2010/05/11(火) 11:24:260324デフォルトの名無しさん
2010/05/12(水) 09:49:170325デフォルトの名無しさん
2010/05/12(水) 10:59:49Variant::CreateObject("ADOX.Catalog");を利用して
フィールドの型とサイズを取得する方法を教えてください
0326デフォルトの名無しさん
2010/05/12(水) 12:37:07スタックオーバーフローとか例外を吐かれたので解決方法調べてたんだが
AutoSelect = false にすると収まったんで、とりあえずここにチラ裏していく。
ブレークポイント&ステップ実行使うと再現しなくなる例外でしたよ
0327デフォルトの名無しさん
2010/05/12(水) 13:28:04col.name, col.type, col.size
0328デフォルトの名無しさん
2010/05/12(水) 16:28:430329デフォルトの名無しさん
2010/05/12(水) 21:32:420330デフォルトの名無しさん
2010/05/12(水) 22:06:450331デフォルトの名無しさん
2010/05/13(木) 15:33:350332デフォルトの名無しさん
2010/05/13(木) 16:15:570333デフォルトの名無しさん
2010/05/14(金) 12:17:12Memo1にAnsiStringに貯めこんだ改行含みの文字列を表示させて計算結果を表示しています。
数が多くなると処理が遅くなっています。高速化の定石があれば教えてください。
Ansi
0334デフォルトの名無しさん
2010/05/14(金) 12:20:47bcb2007使用しています。
Memo1にAnsiStringに貯めこんだ改行含みの文字列を表示させて計算結果を表示しています。
数が多くなると処理が遅くなっています。高速化の定石があれば教えてください。
AnsiString s="";
for(){
…
s+=文字
}
…
for(){
…
s+=文字
}
…
for(){
s+=文字
…
}
Memo1->Text=str;
このような形です。
Memoにはこだわっていません。sのサイズがわからないので、
とりあえず、AnsiStringを使っています。
よい文字格納変数型とよい表示コンポーネントはあるでしょうか?
0335デフォルトの名無しさん
2010/05/14(金) 16:26:250336デフォルトの名無しさん
2010/05/14(金) 18:11:42std::string str;
str.reserve(64*1024);
...
Memo1->Text = str.c_str();
でどうかね。
0337デフォルトの名無しさん
2010/05/14(金) 18:18:44C++BuilderにはStringBuilderがないからか
0338デフォルトの名無しさん
2010/05/14(金) 18:28:43どれくらいの量の文字列を扱っていますか?
文字列処理が遅いのか、描画が遅いのか。をまず分けたほうがよいですね。
Memo1->Text=str;
をコメントアウトして
あと、速度の話をするときは、ちゃんと時間を計りましょう。
LARGE_INTEGER _start, _end;
QueryPerformanceCounter(&_start);
QueryPerformanceCounter(&_end);
__int64 lap = _end.QuadPart - _start.QuadPart;
こんなんで、CPU のクロック単位の経過時間が計れます。
0339デフォルトの名無しさん
2010/05/14(金) 21:32:23レスありがとうございます。
std::string str; を検討してみたいと思います。(BCBではつかえない?)
時間に関しては、文字蓄積時はあちこちなので、
時間がはかりづらいですが、
コンポーネントへの表示処理とそれまでの計算時間を
指標にして表示処理を時間的に評価してみたいと思います。
計算結果をテキストに表示する手法の常套手段が
知りたいのもありました。
なお計算は動的計画法なるもので、計算量はピンからキリまでありますので、
組み合わせが多い状態の高速化を図る予定です。
0340デフォルトの名無しさん
2010/05/15(土) 03:19:55「速度をあげたい」と思ったら、まずそれを測定することを考えましょう。
測定するために対象を調査していく過程で、問題点そのものが分かってしまう場合があります。
定期的に速度を計測、比較することで、少なくとも、改造の結果かえって遅くなった。ということは
避けられるでしょう。
テストするときは単一データではなく、複数のデータを使うこと。テストデータの量を変えること。
10, 20, 50, 100, 200, 500.... といった (1, 2, 5) パターンがおすすめ。
時間がかかるので端折るときでも、桁が異なる複数のデータ量での計測を忘れずに。
ある程度、対象データ構造、アルゴリズムの癖が分かったら、本質的にどこまで速くなるのか。
を考えてみること。データが(毎回)ディスクから読み取られるなら、ディスクアクセス速度より
速くはできない。(キャッシュとか考えないと)
CPU のキャッシュを超える量のデータを扱うなら、メインメモリのアクセススピードを超えることはできない。
まぁ、ここら辺は厳密に計算する必要はなく、桁合わせ程度の概算で十分ですが、
原理上不可能な速度を追求して時間を浪費するのは避けたいですし、
逆に「もう一桁速くできるはずだ」となるかもしれません。
0341デフォルトの名無しさん
2010/05/15(土) 12:27:07TStringStreamを使ってみてはどうだろうか?
0342デフォルトの名無しさん
2010/05/17(月) 22:05:25ありがとうございます。
検討中なので結果報告できないですが、ご容赦ください
0343デフォルトの名無しさん
2010/05/26(水) 11:40:300344デフォルトの名無しさん
2010/05/26(水) 21:21:460345デフォルトの名無しさん
2010/05/27(木) 11:04:130346デフォルトの名無しさん
2010/06/02(水) 14:01:190347デフォルトの名無しさん
2010/06/02(水) 17:25:050348デフォルトの名無しさん
2010/06/02(水) 22:59:11TImagePicture.Bitmap.HandleもHDCなので、ここに向かってBitBltすればいいんじゃない?
0349デフォルトの名無しさん
2010/06/03(木) 09:41:54できました
0350デフォルトの名無しさん
2010/06/04(金) 15:55:05実行するとデスクトップの横幅と同じサイズになってしまうのですが
これちゃんと指定したサイズになる方法を教えてください
0351デフォルトの名無しさん
2010/06/04(金) 18:06:020352350
2010/06/04(金) 19:11:01役にたたん奴らばぁじゃのぉ
ウンコでも食うとれや
0353デフォルトの名無しさん
2010/06/04(金) 22:27:33クレームはゲイツかカトラーにどうぞ。
0355デフォルトの名無しさん
2010/06/07(月) 10:03:470356デフォルトの名無しさん
2010/06/11(金) 19:36:52コンパイルするとその都度違うファイルが出来ますがこれは何故なんでしょうか?
0357デフォルトの名無しさん
2010/06/12(土) 00:01:15フルビルドすると同じになるはず
0358デフォルトの名無しさん
2010/06/12(土) 00:26:020359356
2010/06/12(土) 00:56:43インクリメンタルリンクは切ってあります
ステートファイルの作成をしないにチェックが入っていて/Gnオプションがオプションソースに書かれています
でも毎回違うファイルになってしまいます
>>358
そういうことなのでしょうか?
どこかにオプションはありますか?
0360デフォルトの名無しさん
2010/06/12(土) 12:26:33プロジェクト→オプション→バージョン情報とかじゃね?
ビルドの日付を埋め込むオプションは見つからんなあ
■ このスレッドは過去ログ倉庫に格納されています