トップページ⇒tech
1001コメント330KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/14(水) 01:00:02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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
0381デフォルトの名無しさん2008/05/29(木) 06:19:10
const char * const p って書いたら、((const-->char) *)型の(const-->p)くらいに思ってたんだけど。
0382デフォルトの名無しさん2008/05/29(木) 06:34:49
右結合で考えてるってことかな?
2番目の位置にconstを書いてみると分かるよ。

const char const * p; // (VC++2005) warning C4114: 同じ型の修飾子が 2 度以上使われています。
0383デフォルトの名無しさん2008/05/29(木) 06:50:34
ほんとだ、普通に右側にだけ置いても大丈夫なんだ。
typedef const char cchar ;
const cchar c = 0;
こういうのはアリなんだ。constつけれた方が分かりやすいから?
0384デフォルトの名無しさん2008/05/29(木) 07:07:31
多分そうだと思う。>>382も警告レベルだしね。
0385デフォルトの名無しさん2008/05/29(木) 08:39:54
>>375
参照やポインタ返しの場合は書き換えを禁止できる点で有効。
0386デフォルトの名無しさん2008/05/29(木) 08:51:52
>>380
そうだったのか!いままで法則性をさっぱり見つけられなくって難儀してたとよ。
0387デフォルトの名無しさん2008/05/29(木) 08:53:56
メンバ関数内でクラスの値を変更しない場合に、関数の後にconstが付けられる。
これはインスタンスのメンバをキャッシュ参照で済ませても良いよという事をコンパイラに伝える役割を持っている。
03883872008/05/29(木) 08:54:35
ごめん
0389デフォルトの名無しさん2008/05/29(木) 10:47:38
doubleの計算の過程で
1.00000000002とか出たときに、
この2の部分を消したい(小数点以下11桁以降を0にしたい)
のですが、何か方法ありますでしょうか?
0390デフォルトの名無しさん2008/05/29(木) 11:19:56
>>389
表示の問題?それとも数を変更する問題?後者なら正確には不可能。
double に 10 進法である桁以降完全に 0 にするという概念は無いから。
近似的には 10^10 かけて floor して 10^-10 かけるとかの関数書くとか。
03913892008/05/29(木) 11:29:32
>>390
なるほど!floor関数とか使ったことなかったので勉強になりました。
これから書いてみます、どうもありがとうございました。
0392デフォルトの名無しさん2008/05/29(木) 11:36:11
>>389
こんな方法もあるよ
#include<stdio.h>
#include<math.h>

int main(void){
double x=1.234567890123456789;

printf("%.12f\n", x);
x-=fmod(x, 1e-10);
printf("%.12f\n", x);

return 0;
}
03933892008/05/29(木) 11:50:50
>>392
あぁ〜〜なるほど!
余りを引いても出来るんですね。
ありがとうございました。
0394デフォルトの名無しさん2008/05/29(木) 14:00:26
mapを使うとき<string , int>ならば、未使用のとき0が入っていますが、
<string , クラス>のときは、未使用の判別はどうやれば良いですか?
0395デフォルトの名無しさん2008/05/29(木) 14:03:38
>>394
デフォルトコンストラクタで初期化されてる。判別できるかどうかはクラスによる。
int だって、未使用の場合と 0 を入れた場合は判別できないね。
0396デフォルトの名無しさん2008/05/29(木) 14:05:06
自己解決しました。

> もし存在しないキーを指定してアクセスした場合には、そのキーを自動的に登録します。
> その キーに対応する値は、その値の型のデフォルトコンストラクタによって初期化されます。
0397デフォルトの名無しさん2008/05/29(木) 14:06:19
>>395
トンクス! 自分で作るクラスなので判別できるように設定したいと思います。
0398デフォルトの名無しさん2008/05/29(木) 14:22:28
未使用かどうか調べたいなら find(key) すればいいと思うぞ。
0399デフォルトの名無しさん2008/05/29(木) 14:28:38
あくまで想像だけど、map::find()やmap::lower_bound()を使うべきところを
全部map::operator[]で済まそうとして、本来遭遇しなくていい問題に遭遇している気がする。
「見るだけなのに要素が生成されちゃう。困ったなぁ」みたいな。
0400デフォルトの名無しさん2008/05/29(木) 14:52:49
トンクス! そっちのほうが良いです
0401デフォルトの名無しさん2008/05/29(木) 17:52:27
Visual Basic 6.0 の配列要素、例えばA(5000),B(5000),C(5000)としたときに、
Visual C++ で作成したDLLからその配列要素に書き込んだり、読み込んだりすることは出来るの?
もちろん、Visual Basic 6.0で起動中にそのDLLを使います。

今はVisual Basic 6.0を使っていますが、これからVisual C++を勉強する自分にとってまだDLLがよく分からないので、
よろしくお願いします。
0402デフォルトの名無しさん2008/05/29(木) 18:42:26
>>401
できる。ここに書いてあることはVB6と今のVC全部でも通用する。
http://support.microsoft.com/kb/410837/ja
0403デフォルトの名無しさん2008/05/29(木) 19:28:16
最近独習Cをかって自力でやろうと思っているんですが、環境vistaで最初の1.2で躓いてます。
技術的な問題じゃないんですが、CD付属のものを使わずに、C言語を扱える環境をつくれませんか?
0404デフォルトの名無しさん2008/05/29(木) 19:33:21
>>402
サンクス。

あと、インターネットからのホームページのHTMLデータを収得する方法がわかりましたら、
これもよろしくお願いします。

今はVB6で収得していますがチョット時間がかかるため、C++に移植したいので。
0405デフォルトの名無しさん2008/05/29(木) 19:56:46
>>404
ここをサポートセンターと勘違いしない方がよい。
0406デフォルトの名無しさん2008/05/29(木) 19:58:30
サポートセンターで吹いてしまった
0407デフォルトの名無しさん2008/05/29(木) 20:25:26
>>405
わからないならレスしないで下さい。スレが汚れます。
せっかく他の人はいい人なのに。
0408デフォルトの名無しさん2008/05/29(木) 20:32:46
>>404=>>407ですね、わかります
多分>>405は方法を知っているんだと思うよ

とりあえず、>>404はWinsockとHTTPでググれ・・・っと
0409デフォルトの名無しさん2008/05/29(木) 20:34:02
Cでスクレイピングなんてまた面倒くさい事を
0410デフォルトの名無しさん2008/05/29(木) 21:40:43
>>408
みなさん、ありがとう。
勉強する糸口がみえました。

>>409
他に早く処理できる方法があるんですか?
VB6でやっている自分としては、C++でやった方が早いと思ったので。
0411デフォルトの名無しさん2008/05/29(木) 22:12:45
VC++で、プログラム中に他のexeに引数を渡して実行するという事をしたいんですがどうすれば良いんでしょうか?
0412デフォルトの名無しさん2008/05/29(木) 22:20:20
>>411
system
spawn
exec
CreateProcess
0413デフォルトの名無しさん2008/05/29(木) 22:23:49
>>412
>>412
>>412
>>412
>>412
>>412
ありがとうございました。
0414デフォルトの名無しさん2008/05/29(木) 22:31:36
>>410
もし、ネットワーク回線がボトルネックなら、
VCで書き換えても劇的に速くなるということはないぞ。
0415デフォルトの名無しさん2008/05/29(木) 22:45:28
>>414

参考までに同一回線&PCで、
4000ページを取込処理した場合、
自分で作ったVB6だと80秒。
他人の作ったC++だと25秒。

ということでボトルネックはプログラム手法。

だったら作った他人に聞けということはナシね。
0416デフォルトの名無しさん2008/05/29(木) 22:48:35
非同期でチョコとずつ読み込めれば速いよ
0417デフォルトの名無しさん2008/05/29(木) 22:49:13
同期で、ひとつ読み込むまで止まっていると幾らでもかかる。
0418デフォルトの名無しさん2008/05/29(木) 22:54:28
>>416
VB6は非同期で4列並列処理していて、もうこれ以上早くするのは無理かと思って。
となるとC++かなぁと思っています。
0419デフォルトの名無しさん2008/05/29(木) 23:33:08
ちなみに1つサーバーに対して3コネクション以上同時に繋いで、
しかも節操無くアクセスしてたらアクセス遮断されることもあるので、
程ほどに。
0420デフォルトの名無しさん2008/05/30(金) 01:55:53
>>418
ロジックのチューニングを検討しないあたりがVB育ちなのかね。
それとも十分に検討済みなのかな。
0421デフォルトの名無しさん2008/05/30(金) 02:03:18
>>418
variant 型にどんどん追加してるとかじゃないよね?
0422デフォルトの名無しさん2008/05/30(金) 07:06:55
>>419
それは知りませんでした。
となると、2コネクションにするとさらに取得時間がかかります。

>>420>>421
VB6をご存じなら分かると思いますが、
GetChunkでデータをString型でバイト配列または文字列として取得しているだけです。
0423デフォルトの名無しさん2008/05/30(金) 09:37:00
>しているだけ

うーん
0424デフォルトの名無しさん2008/05/30(金) 11:35:28
16ミリ秒周期のプログラムはVC++で組めますか?
あとVC++の一部にアセンブラを入れられますか?
0425デフォルトの名無しさん2008/05/30(金) 11:38:46
厳密な正確さを求めないなら組めます
入れられます
0426デフォルトの名無しさん2008/05/30(金) 11:58:58
std::pair<> の配列みたいなものを作りたいのですが、配列としてmapかvectorかで
迷ってます。本だとpairといえばmapだったのですが、vectorの方が使い慣れているし
便利な感じがしてます。どういう基準でmapとvectorを使い分ければよいですか?



0427デフォルトの名無しさん2008/05/30(金) 12:14:18
>>426
配列を作りたいなら配列を使えばOK。
伸縮できる配列が欲しいならvectorを使えばOK。
pairの中身がkeyとvalueの対応関係があって(複数のpairでkeyが重ならな
い)、「keyに対応するvalueを取りだす」のような操作が必要ならmap。
0428デフォルトの名無しさん2008/05/30(金) 12:15:07
挿入・検索が多いならstd::map
メモリ効率重視・末尾に追加のみならstd::vector
0429デフォルトの名無しさん2008/05/30(金) 12:59:16
「あらゆる使い方が同じくらいあり得るから迷う」
ということなら、dequeでその場を凌いでしまうのも手かなぁ。
0430デフォルトの名無しさん2008/05/30(金) 13:11:12
ループ処理のあるボタンを押すとループを抜けるまで他の操作ができないんですが、これはなんの項目を勉強すればいいんですか?
0431デフォルトの名無しさん2008/05/30(金) 13:13:30
>>430
MultiThread
0432デフォルトの名無しさん2008/05/30(金) 13:16:33
Sleep(0); をループの中に入れておけばよかろう
0433デフォルトの名無しさん2008/05/30(金) 13:28:27
>>430
ボタンにループ処理はありません。
0434デフォルトの名無しさん2008/05/30(金) 13:41:33
>>431-432
>>430みたいな「まったく言えてない」質問に、こちら側で徹底的に頭を回して答えてあげるのは、
「たまたま動いてるだけのコード」を見てる時みたいな、得も言われぬ不安がわいてくるなぁw

適当にエラーを出して、回答できねえよと言ってあげるのが、長い目で見れば本人のためだと思う。
0435デフォルトの名無しさん2008/05/30(金) 13:45:30
clickイベント内で重い処理してるんだと思た
0436デフォルトの名無しさん2008/05/30(金) 13:51:59
WindowsのGUIのボタン押した際に発生する
メッセージハンドラ内でループして
他のメッセージが処理されずにウィンドウが固まっていると予想。
なので俺も >>431 だと思う。

他の方法として、WM_TIMER(OnTimer)で
ループ一回分の処理だけ進め、
一旦抜ける、というのを繰り返す。
0437デフォルトの名無しさん2008/05/30(金) 14:04:41
マルチスレッドよりタイマーの方が簡単そうでいいですね。
ありがとうございます。
0438デフォルトの名無しさん2008/05/30(金) 14:59:41
>>214 で質問した者なんですが

stringstream 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
>>438
解放されたメモリというのは、以前に書き込まれていたデータがしばらくそのまま残っていることが多い。
なぜなら解放時にわざわざデータを消すっていうのは時間がかかるので。
ただし、後で誰かがどこかで何かのためにメモリをnewやmallocで確保したとき、その解放されたメモリが再利用される。
その「後で」「誰かが」「どこかで」の把握は基本的に無理なので、たまたまそのときはまだデータが残ってるかもしれないが、いつ再利用され他の用途に使われ内容が書き換えられるかわからない。
そういうわけで、解放されたメモリには触ってはいけない。
0440デフォルトの名無しさん2008/05/30(金) 15:19:10
ファイルを削除しても大抵は本体が残っているのと同じようなものだな。
0441デフォルトの名無しさん2008/05/30(金) 15:22:24
>>438
「有効でなくなる」のと「値が残っている」のとは違う。
殊にポインタの場合、ポイント先が生きていようと死んでいようとアクセスできればデリファレンスしてしまう。
一時的なオブジェクトは恐らくスタックフレームに作られているはずなので、他の一時的なオブジェクトが
作られたときにでも上書きされるだろう。
例えば、私の環境ならこれで"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:33
課題でファイルを分割する練習なんだが…

Error: 外部シンボル '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
// myclass.h
#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;
}

理由がよく分からないんだが、先輩方、この小僧にご教授くださいませんか
04444422008/05/30(金) 15:53:49
すまない。自己解決できました。
どうやら、使っていた環境の設定をしてなかったみたいだorz
0445デフォルトの名無しさん2008/05/30(金) 19:56:02
C++ではヘッダファイルに呪文のように

#ifndef GUARD_myclass_h
#define GUARD_myclass_h
// ヘッダ本体
#endif

って書こう。でないとすぐにリンカが文句を・・・。
0446デフォルトの名無しさん2008/05/30(金) 20:03:53
>>445
多重インクルード防ぐのは呪文でもなんでもないような。
0447デフォルトの名無しさん2008/05/30(金) 20:07:53
おまじないってことだろ。
0448デフォルトの名無しさん2008/05/30(金) 20:31:11
void CFT245RMFCDlgNonUnicodeDlg::OnBnClickedsabo()
{
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
>>448

//クラスを定義している箇所
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:48
すいません・・・
PICをかませないでWindowsのUSBのみで0.01ミリ秒単位安定動作させるプログラミング方法はありますか?
0453デフォルトの名無しさん2008/05/31(土) 00:59:56
Windows自体にそこまでの時間分解能がない。
0454デフォルトの名無しさん2008/05/31(土) 07:48:50
WindowsはリアルタイムOSじゃないので無理。
PCでっていうのなら自分でOS書けばいける。
0455デフォルトの名無しさん2008/05/31(土) 07:50:34
>>452
USBは定周期転送があるからそれを使えばいいんじゃないか
0456デフォルトの名無しさん2008/05/31(土) 08:14:07
coutで構造体メンバまで出力したいのですが

struct 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:05
>>456
std::ostream& operator<<(std::ostream& ost, const sex& val)
{
return ost << 好きな表示方法;
}
0458デフォルトの名無しさん2008/05/31(土) 09:03:11
>>452
自分でドライバ書いてCPU占有すれば出来るかも。
カーネルモードならスケジューラに邪魔されずに処理できるから。
ただ、占有中は当然、キーボードもマウスも利かず、画面描画もされないから
ハングアップ同然の状態になるけど。

周期動作に関しては、自分でループして処理する。
QueryPerformanceFrequencey()とQueryPerformanceCounter()で
1GHzのCPUなら 1/1G秒=0.000001ミリ秒の精度で時間を計測出来る。
0459デフォルトの名無しさん2008/05/31(土) 09:06:08
コピペしたのにスペルミスとかw
QueryPerformanceFrequency()とQueryPerformanceCounter()ね。
0460デフォルトの名無しさん2008/05/31(土) 13:07:38
'このなかで' 『"』 を表記する場合は、"この中と同じ様に" 『\"』 と表記しないとだめだったっけ?
0461デフォルトの名無しさん2008/05/31(土) 13:08:08
QueryPerformance〜系は、
CPU周波数が動的に変わったときちゃんと動かないとか
0462デフォルトの名無しさん2008/05/31(土) 13:09:04
>>460
試してみればわかるんじゃ?
0463デフォルトの名無しさん2008/05/31(土) 13:09:29
>>462
そうですね、試してみます。
0464デフォルトの名無しさん2008/05/31(土) 17:50:35
QueryPerformance〜系は
一時期CPUクロックだったこともあったけど、
今はだいたいACPIタイマで、周波数は3579545Hz
0465デフォルトの名無しさん2008/05/31(土) 19:05:27
std::stringで
if(str="ABC")をやろうとすると

error C2678: 二項演算子 '==' : 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
1> 'ビルトイン C++ 演算子==(const char [15], const char [15])' の可能性があります

ってなるんですが何か変わったのですか?
VC++2008です。
04664652008/05/31(土) 19:16:03
#include<string.h>を
#include<string>にしたら動作しますた
0467デフォルトの名無しさん2008/05/31(土) 19:56:47
Singleton なんだけとアプリ終了するときはデストラクタ
を実行させたいです、どうすればいいですか?
0468デフォルトの名無しさん2008/05/31(土) 19:59:15
staticオブジェクトにする
スマートポインタに包んでおく
etc
0469デフォルトの名無しさん2008/05/31(土) 20:02:54
atexitに登録しておく
0470デフォルトの名無しさん2008/05/31(土) 20:14:16
山ほど方法があるな
0471デフォルトの名無しさん2008/05/31(土) 20:15:37
>>467
というか普通、何もしなくてもデストラクタ実行されるけど、
どういう終了のさせかたしてる?
0472デフォルトの名無しさん2008/05/31(土) 20:21:01
おそらくSingletonクラスの実体そのものをnewしてんだろw
0473デフォルトの名無しさん2008/05/31(土) 21:10:01
C++でコンソール画面を消去する、APIを教えてほすい
環境はWindows VS2005 C++及びLinux g++
0474デフォルトの名無しさん2008/05/31(土) 21:19:02
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
0475デフォルトの名無しさん2008/05/31(土) 21:27:03
system("cls");
0476デフォルトの名無しさん2008/05/31(土) 21:38:57
curses使う
0477デフォルトの名無しさん2008/05/31(土) 22:01:55
山ほど方法があるな
0478デフォルトの名無しさん2008/05/31(土) 23:04:03
std::wcout << static_cast<wchar_t>(0x301C) << std::endl;
ローケルを日本語圏に設定してこれで波ダッシュが出るはずなんですが、何も表示されないみたいです。
更にstd::endlも出力されておらず、これを一般プログラムに使いまわすとそのプログラムが落ちてしまいます。
このような出力すると落ちる文字が書いてある表なんてものは存在するんでしょうか?何とかしたいです。
0479デフォルトの名無しさん2008/05/31(土) 23:06:37
wchar_tがどのような形式で文字を保持しているかは規定されていない。
ましてや、intをwchar_tにキャストしてそれをあたかも文字であったかのように扱うなんてとんでもない。
0480デフォルトの名無しさん2008/05/31(土) 23:15:09
>>479
環境はvc8です。他の文字はコードをちゃんと設定すればこれで表示されます。
とりあえずUTF-16が内部で使われているみたいなので、その場合に限っての話で進めてもらえませんか?
0481デフォルトの名無しさん2008/05/31(土) 23:22:30
よくわからんけど、落ちるのは別の問題な気がする
■ このスレッドは過去ログ倉庫に格納されています