【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0414デフォルトの名無しさん
2008/05/29(木) 22:31:36もし、ネットワーク回線がボトルネックなら、
VCで書き換えても劇的に速くなるということはないぞ。
0415デフォルトの名無しさん
2008/05/29(木) 22:45:28参考までに同一回線&PCで、
4000ページを取込処理した場合、
自分で作ったVB6だと80秒。
他人の作ったC++だと25秒。
ということでボトルネックはプログラム手法。
だったら作った他人に聞けということはナシね。
0416デフォルトの名無しさん
2008/05/29(木) 22:48:350417デフォルトの名無しさん
2008/05/29(木) 22:49:130418デフォルトの名無しさん
2008/05/29(木) 22:54:28VB6は非同期で4列並列処理していて、もうこれ以上早くするのは無理かと思って。
となるとC++かなぁと思っています。
0419デフォルトの名無しさん
2008/05/29(木) 23:33:08しかも節操無くアクセスしてたらアクセス遮断されることもあるので、
程ほどに。
0420デフォルトの名無しさん
2008/05/30(金) 01:55:53ロジックのチューニングを検討しないあたりがVB育ちなのかね。
それとも十分に検討済みなのかな。
0421デフォルトの名無しさん
2008/05/30(金) 02:03:18variant 型にどんどん追加してるとかじゃないよね?
0422デフォルトの名無しさん
2008/05/30(金) 07:06:55それは知りませんでした。
となると、2コネクションにするとさらに取得時間がかかります。
>>420>>421
VB6をご存じなら分かると思いますが、
GetChunkでデータをString型でバイト配列または文字列として取得しているだけです。
0423デフォルトの名無しさん
2008/05/30(金) 09:37:00うーん
0424デフォルトの名無しさん
2008/05/30(金) 11:35:28あとVC++の一部にアセンブラを入れられますか?
0425デフォルトの名無しさん
2008/05/30(金) 11:38:46入れられます
0426デフォルトの名無しさん
2008/05/30(金) 11:58:58迷ってます。本だとpairといえばmapだったのですが、vectorの方が使い慣れているし
便利な感じがしてます。どういう基準でmapとvectorを使い分ければよいですか?
0427デフォルトの名無しさん
2008/05/30(金) 12:14:18配列を作りたいなら配列を使えばOK。
伸縮できる配列が欲しいならvectorを使えばOK。
pairの中身がkeyとvalueの対応関係があって(複数のpairでkeyが重ならな
い)、「keyに対応するvalueを取りだす」のような操作が必要ならmap。
0428デフォルトの名無しさん
2008/05/30(金) 12:15:07メモリ効率重視・末尾に追加のみならstd::vector
0429デフォルトの名無しさん
2008/05/30(金) 12:59:16ということなら、dequeでその場を凌いでしまうのも手かなぁ。
0430デフォルトの名無しさん
2008/05/30(金) 13:11:120431デフォルトの名無しさん
2008/05/30(金) 13:13:30MultiThread
0432デフォルトの名無しさん
2008/05/30(金) 13:16:330433デフォルトの名無しさん
2008/05/30(金) 13:28:27ボタンにループ処理はありません。
0434デフォルトの名無しさん
2008/05/30(金) 13:41:33>>430みたいな「まったく言えてない」質問に、こちら側で徹底的に頭を回して答えてあげるのは、
「たまたま動いてるだけのコード」を見てる時みたいな、得も言われぬ不安がわいてくるなぁw
適当にエラーを出して、回答できねえよと言ってあげるのが、長い目で見れば本人のためだと思う。
0435デフォルトの名無しさん
2008/05/30(金) 13:45:300436デフォルトの名無しさん
2008/05/30(金) 13:51:59メッセージハンドラ内でループして
他のメッセージが処理されずにウィンドウが固まっていると予想。
なので俺も >>431 だと思う。
他の方法として、WM_TIMER(OnTimer)で
ループ一回分の処理だけ進め、
一旦抜ける、というのを繰り返す。
0437デフォルトの名無しさん
2008/05/30(金) 14:04:41ありがとうございます。
0438デフォルトの名無しさん
2008/05/30(金) 14:59:41stringstream ss;
ss << "0123456789";
const char* p;
p = ss.str().c_str();
cout << p[2];
みたいにすると、ちゃんと2が出力されるのですが
ss.str.c_str()
はss.str()で生成した一時オブジェクトのポインタを返しているのに、なぜちゃんと2が出力されるんでしょうか??
ss.str()で生成した一時オブジェクトは、その部分を過ぎたら消えてしまうのではないかと思っていたのですが、違うのでしょうか??
0439デフォルトの名無しさん
2008/05/30(金) 15:15:12解放されたメモリというのは、以前に書き込まれていたデータがしばらくそのまま残っていることが多い。
なぜなら解放時にわざわざデータを消すっていうのは時間がかかるので。
ただし、後で誰かがどこかで何かのためにメモリをnewやmallocで確保したとき、その解放されたメモリが再利用される。
その「後で」「誰かが」「どこかで」の把握は基本的に無理なので、たまたまそのときはまだデータが残ってるかもしれないが、いつ再利用され他の用途に使われ内容が書き換えられるかわからない。
そういうわけで、解放されたメモリには触ってはいけない。
0440デフォルトの名無しさん
2008/05/30(金) 15:19:100441デフォルトの名無しさん
2008/05/30(金) 15:22:24「有効でなくなる」のと「値が残っている」のとは違う。
殊にポインタの場合、ポイント先が生きていようと死んでいようとアクセスできればデリファレンスしてしまう。
一時的なオブジェクトは恐らくスタックフレームに作られているはずなので、他の一時的なオブジェクトが
作られたときにでも上書きされるだろう。
例えば、私の環境ならこれで"2"ではなく"c"が(その前の出力と並んで)出力される。
--
stringstream ss;
ss << "0123456789";
stringstream sss;
sss << "abcdefg";
const char* p;
p = ss.str().c_str();
cout << sss.str().c_str()[2];
cout << p[2];
0442デフォルトの名無しさん
2008/05/30(金) 15:45:33Error: 外部シンボル 'myclass::set_a(int)' が未解決
Error: 外部シンボル 'myclass::get_a()' が未解決
ってエラーが出て、これのコンパイルが通らないんだ。
//main.cpp
#include "myclass.h"
int main(){
myclass ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
cout << ob1.get_a() << "\n";
cout << ob2.get_a() << "\n";
return 0;
}
0443442続き
2008/05/30(金) 15:46:10#include <iostream>
using namespace std;
class myclass{
int a; //private なメンバ変数
public:
void set_a(int num);
int get_a();
};
//myclass.cpp
#include "myclass.h"
void myclass::set_a(int num){
a = num;
}
int myclass::get_a(){
return a;
}
理由がよく分からないんだが、先輩方、この小僧にご教授くださいませんか
0444442
2008/05/30(金) 15:53:49どうやら、使っていた環境の設定をしてなかったみたいだorz
0445デフォルトの名無しさん
2008/05/30(金) 19:56:02#ifndef GUARD_myclass_h
#define GUARD_myclass_h
// ヘッダ本体
#endif
って書こう。でないとすぐにリンカが文句を・・・。
0446デフォルトの名無しさん
2008/05/30(金) 20:03:53多重インクルード防ぐのは呪文でもなんでもないような。
0447デフォルトの名無しさん
2008/05/30(金) 20:07:530448デフォルトの名無しさん
2008/05/30(金) 20:31:11{
HANDLE hThread;
int parm;
AfxBeginThread(CFT245RMFCDlgNonUnicodeDlg::saboThread, &parm, THREAD_PRIORITY_NORMAL);
}
void CFT245RMFCDlgNonUnicodeDlg::saboThread(LPVOID parma)
{
FT_STATUS ftStatus;
ULONG bytesWritten;
int count = 10;
byte ucMask;
for ( int i=0; i < count; i++ ) {
ucMask = 1;
ftStatus = FT_Write(ftHandle, &ucMask, 1, &bytesWritten);
Sleep(500);
ucMask = 0;
ftStatus = FT_Write(CFT245RMFCDlgNonUnicodeDlg::ftHandle, &ucMask, 1, &bytesWritten);
Sleep(500);
}
}
スレッド勉強してきた。下のエラーから進まなくなった、たすけて!
CFT245RMFCDlgNonUnicodeDlg::saboThread': 関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために '&CFT245RMFCDlgNonUnicodeDlg::saboThread' を使用してください
0449デフォルトの名無しさん
2008/05/30(金) 21:06:33ご丁寧に直し方まで教えてくれているわけだけど、
残念ながらそれに従って直しても別なエラーを目にすることになると思う。
AfxBeginThreadの第一引数にはメンバ関数へのポインタを渡すことが出来ないから。
saboThreadをstaticな関数にして引数としてクラスのポインタを渡すとか、別なやり方が必要。
0450デフォルトの名無しさん
2008/05/30(金) 21:21:30//クラスを定義している箇所
class CFT245RMFCDlgNonUnicodeDlg
{
static UINT __cdecl saboThreadStatic(LPVOID pParam){
static_cast<CFT245RMFCDlgNonUnicodeDlg*>(pParam)->saboThread();
}
...
};
void CFT245RMFCDlgNonUnicodeDlg::OnBnClickedsabo()
{
AfxBeginThread(CFT245RMFCDlgNonUnicodeDlg::saboThreadStatic, this, THREAD_PRIORITY_NORMAL);
}
void CFT245RMFCDlgNonUnicodeDlg::saboThread()
{
...
}
0451デフォルトの名無しさん
2008/05/30(金) 23:08:27ありがとうございました
0452デフォルトの名無しさん
2008/05/31(土) 00:54:48PICをかませないでWindowsのUSBのみで0.01ミリ秒単位安定動作させるプログラミング方法はありますか?
0453デフォルトの名無しさん
2008/05/31(土) 00:59:560454デフォルトの名無しさん
2008/05/31(土) 07:48:50PCでっていうのなら自分でOS書けばいける。
0455デフォルトの名無しさん
2008/05/31(土) 07:50:34USBは定周期転送があるからそれを使えばいいんじゃないか
0456デフォルトの名無しさん
2008/05/31(土) 08:14:07struct sex {
int man;
int woman;
};
struct sex ok;
ok.man = 1;
ok.woman= 2;
cout << sex << endl;
とするとエラーになりますが、なんか昔
sex.man = 1, sex.woman = 2
みたいな表示してくれるのを見た記憶があるのですが、
これって私の勘違いか妄想なのでしょうか?
よろしくお願いいたします。
0457デフォルトの名無しさん
2008/05/31(土) 08:56:05std::ostream& operator<<(std::ostream& ost, const sex& val)
{
return ost << 好きな表示方法;
}
0458デフォルトの名無しさん
2008/05/31(土) 09:03:11自分でドライバ書いてCPU占有すれば出来るかも。
カーネルモードならスケジューラに邪魔されずに処理できるから。
ただ、占有中は当然、キーボードもマウスも利かず、画面描画もされないから
ハングアップ同然の状態になるけど。
周期動作に関しては、自分でループして処理する。
QueryPerformanceFrequencey()とQueryPerformanceCounter()で
1GHzのCPUなら 1/1G秒=0.000001ミリ秒の精度で時間を計測出来る。
0459デフォルトの名無しさん
2008/05/31(土) 09:06:08QueryPerformanceFrequency()とQueryPerformanceCounter()ね。
0460デフォルトの名無しさん
2008/05/31(土) 13:07:380461デフォルトの名無しさん
2008/05/31(土) 13:08:08CPU周波数が動的に変わったときちゃんと動かないとか
0462デフォルトの名無しさん
2008/05/31(土) 13:09:04試してみればわかるんじゃ?
0463デフォルトの名無しさん
2008/05/31(土) 13:09:29そうですね、試してみます。
0464デフォルトの名無しさん
2008/05/31(土) 17:50:35一時期CPUクロックだったこともあったけど、
今はだいたいACPIタイマで、周波数は3579545Hz
0465デフォルトの名無しさん
2008/05/31(土) 19:05:27if(str="ABC")をやろうとすると
error C2678: 二項演算子 '==' : 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
1> 'ビルトイン C++ 演算子==(const char [15], const char [15])' の可能性があります
ってなるんですが何か変わったのですか?
VC++2008です。
0466465
2008/05/31(土) 19:16:03#include<string>にしたら動作しますた
0467デフォルトの名無しさん
2008/05/31(土) 19:56:47を実行させたいです、どうすればいいですか?
0468デフォルトの名無しさん
2008/05/31(土) 19:59:15スマートポインタに包んでおく
etc
0469デフォルトの名無しさん
2008/05/31(土) 20:02:540470デフォルトの名無しさん
2008/05/31(土) 20:14:160471デフォルトの名無しさん
2008/05/31(土) 20:15:37というか普通、何もしなくてもデストラクタ実行されるけど、
どういう終了のさせかたしてる?
0472デフォルトの名無しさん
2008/05/31(土) 20:21:010473デフォルトの名無しさん
2008/05/31(土) 21:10:01環境はWindows VS2005 C++及びLinux g++
0474デフォルトの名無しさん
2008/05/31(土) 21:19:020475デフォルトの名無しさん
2008/05/31(土) 21:27:030476デフォルトの名無しさん
2008/05/31(土) 21:38:570477デフォルトの名無しさん
2008/05/31(土) 22:01:550478デフォルトの名無しさん
2008/05/31(土) 23:04:03ローケルを日本語圏に設定してこれで波ダッシュが出るはずなんですが、何も表示されないみたいです。
更にstd::endlも出力されておらず、これを一般プログラムに使いまわすとそのプログラムが落ちてしまいます。
このような出力すると落ちる文字が書いてある表なんてものは存在するんでしょうか?何とかしたいです。
0479デフォルトの名無しさん
2008/05/31(土) 23:06:37ましてや、intをwchar_tにキャストしてそれをあたかも文字であったかのように扱うなんてとんでもない。
0480デフォルトの名無しさん
2008/05/31(土) 23:15:09環境はvc8です。他の文字はコードをちゃんと設定すればこれで表示されます。
とりあえずUTF-16が内部で使われているみたいなので、その場合に限っての話で進めてもらえませんか?
0481デフォルトの名無しさん
2008/05/31(土) 23:22:300482デフォルトの名無しさん
2008/05/31(土) 23:24:25とにかくデバッグ情報が出力できないので先に進まないです。
聞きたいこと :
コマンドプロンプトで表示が不可能なUTF-16の文字
0483デフォルトの名無しさん
2008/05/31(土) 23:28:170484デフォルトの名無しさん
2008/05/31(土) 23:49:330485デフォルトの名無しさん
2008/05/31(土) 23:55:030486デフォルトの名無しさん
2008/05/31(土) 23:57:43メモ帳にU+307Cの波ダッシュを入力し、ANSIで保存(日本語なのでコードページ932)、
それを開くと?になっていた。
つまり、Windowsの持っているCP932変換では波ダッシュからの変換が存在しないということ。
(全角チルダ0x8160への変換になっていない)
VCもWindowsの変換ルーチンを使っているので、
やはり正しく表示されないことの説明がつく。
Windows APIを使ってUTF-16を直接出力するか(これもフォントの都合でうまく表示されないかもしれないが)、
U+301CをCP932の0x8160にするように自分で予め変換しておくかだな。
0487デフォルトの名無しさん
2008/06/01(日) 00:02:340488デフォルトの名無しさん
2008/06/01(日) 00:13:41MSのCP932では、〜を>>483が書いてるようにU+FF5Eにマップするんだよ
こういう要注意な文字は他にもある
0489デフォルトの名無しさん
2008/06/01(日) 00:38:14上下逆の〜になるんだよね
0490デフォルトの名無しさん
2008/06/01(日) 00:58:24出力出来なくなるってのは何でなんだ?
昔作ったツール経由でコンソールだしたら、
普通にU+307Cだけ?になって、後の出力は問題なく出たんだけど。
0491489
2008/06/01(日) 00:59:29○U+301C
0492490-491
2008/06/01(日) 01:00:130493デフォルトの名無しさん
2008/06/01(日) 01:05:08B b;
A a = b;
って、したとき、
型変換でbの一時オブジェクトが出来て、コピーコンストラクタでaが構築されるのか?
それとも、型変換だけでaが構築されちゃう?
0494デフォルトの名無しさん
2008/06/01(日) 01:07:480495デフォルトの名無しさん
2008/06/01(日) 01:14:23なんで?に置き換わると思うんだ?
そんなもんは変換層の仕様/実装次第だろ
iostreamのエンコード変換に使われるcodecvt<>は、正常に変換できないときには
エラーにする仕様ってだけじゃまいか
0496デフォルトの名無しさん
2008/06/01(日) 01:50:230497デフォルトの名無しさん
2008/06/01(日) 08:52:50その変換って、クラスAにクラスBの参照を引数に取るコンストラクタがあるってこと?だったらそのまま渡される。
でなくて、その変換がクラスBにクラスAへの変換の演算子が定義されてるって意味なら、戻りのオブジェクトがaになるかコピーされるかはコンパイラによるんじゃないか。戻り値の最適化(RVO)でググるべし
0498デフォルトの名無しさん
2008/06/01(日) 10:03:41一応ググってみたんですけど、要注意な文字は
ttp://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.9.2-cp932-patch.html
にある表で全部ですか?
0499デフォルトの名無しさん
2008/06/01(日) 10:44:35493に「クラスAに〜」ってあるから前者かな?
もうちょいソースが必要かな。
0500デフォルトの名無しさん
2008/06/01(日) 10:47:59>>495の通り、変換できないときにはエラーになるなら、
「〜」とかに加えて、ASCIIと日本語以外の文字全部じゃね?
0501デフォルトの名無しさん
2008/06/01(日) 10:50:26たぶん動くw
0502デフォルトの名無しさん
2008/06/01(日) 11:03:23B::operator A()
じゃないかな。
0503デフォルトの名無しさん
2008/06/01(日) 13:41:06どういう意図なのでしょうか?
char* c
c = (char*)NULL;
NULLをポインタに入れるときにあえてその型にキャストする必要はあるのでしょうか?
c = NULL;
ではまずいのでしょうか?
0504デフォルトの名無しさん
2008/06/01(日) 13:58:39のようなソフトはどのようにしてIEと連系を取っているのでしょうか?
OLEやCOMといったようなインタフェース?が関係しているように思っているのですが
よく分かりません。
perlでは、youtube等から動画を保存するモジュールなどがあるようですが、
例えば、上記のようなツールはどこかのサーバに接続してperlスクリプトを走らせた
結果を入力して、URLなどを取得したりしているのでしょうか?
ご教示願います
0505デフォルトの名無しさん
2008/06/01(日) 14:07:50単独で取得できるよ
ブラウザアクセスの履歴を眺めて、それをエミュレートすれば良いだけ
基本のGETアクセスだけで出来る
irvineスレ言ったら、解析済みのコードが見られる。
0506デフォルトの名無しさん
2008/06/01(日) 14:07:58このへん読めばわかるんじゃない?たぶん
http://msdn.microsoft.com/en-us/library/aa753589(VS.85).aspx
0507506
2008/06/01(日) 14:14:240508デフォルトの名無しさん
2008/06/01(日) 14:16:08>>506
ありがとうございます。GETコマンドについて調べてみます。
右クリックメニューは、レジストリキーいじってたんですね。
0509デフォルトの名無しさん
2008/06/01(日) 14:21:490510デフォルトの名無しさん
2008/06/01(日) 14:34:52NULLが(void *)0と定義されていれば暗黙の型変換ができると思うけど
そうじゃなければ型指定しないとだめとかじゃないっけか?
0511デフォルトの名無しさん
2008/06/01(日) 14:36:320512デフォルトの名無しさん
2008/06/01(日) 14:37:51■ このスレッドは過去ログ倉庫に格納されています