C/C++小心者スレッドP ..
[2ch|▼Menu]
2:デフォルトの名無しさん
07/08/05 07:14:37
     ____
   /__.))ノヽ   
   .|ミ.l _  ._ i.)  
  (^'ミ/.´・ .〈・ リ   このスレはわしが育てる
  .しi   r、_) |  
    |  `ニニ' /       
   ノ `ー―i´

3:デフォルトの名無しさん
07/08/05 20:58:50
1001帰れ

4:デフォルトの名無しさん
07/08/05 22:20:30
前スレ
スレを勃てるまでもないC/C++の質問はここで 2
スレリンク(tech板)l50

5:デフォルトの名無しさん
07/08/11 16:46:20
#include <cstring>

#include <string>

#include <string.h>
の違いを教えてください

6:デフォルトの名無しさん
07/08/11 17:01:51
#include<cstring>
cstringというファイルをincludeする
#include<string>
stringといf(ry

それぞれのファイルの中見てみればきっといい勉強になるに違いない。


7:デフォルトの名無しさん
07/08/11 17:52:10
まあ標準C++の場合だとこうなっている。

<cstring>は、Cの<string.h>相当のヘッダで、
中の宣言はstd名前空間に入っている。

<string>は、basic_string<>のヘッダ。

<string.h>は、内部で<cstring>をインクルードしており、
個々の識別子に対して大域名前空間上でusing std::strcpy;などのように
using宣言がなされていることになっている。

実際には、<cstring>が<string.h>をインクルードして、
std名前空間上でusing宣言を書いている実装がほとんど。

8:デフォルトの名無しさん
07/08/26 14:20:20
ofstreamではバッファの容量は指定できないのでしょうか?

9:デフォルトの名無しさん
07/08/26 14:24:28
>>8
rdbufメンバ関数でそのストリームに関連付けられたバッファが得られる。
その中のメンバにそれっぽいものがあるはず。

10:デフォルトの名無しさん
07/08/27 16:00:38
質問です。
i = (char*)malloc(sizeof(char) * 256);
でメモリ領域を確保したのですが、256バイト以上使用することができます。
なぜでしょうか?教えてください。

11:デフォルトの名無しさん
07/08/27 16:05:01
>>8
std::streambuf::pubsetbuf()がお望みのものだが、
実装によってはopen済みのストリームに対して実行しても無視されるので注意

12:デフォルトの名無しさん
07/08/27 16:08:03
マルチすんなカス

13:デフォルトの名無しさん
07/08/27 16:12:17
うむ、そうだな。小心者スレにしては、随分と大胆だ。

14:デフォルトの名無しさん
07/08/27 21:42:16
>10
memcpy(0x00,1,1)

これでいい

15:デフォルトの名無しさん
07/08/27 22:16:24
別に256バイト使えるのは正常だな

16:デフォルトの名無しさん
07/08/28 07:38:45
>>10
OutOfRange を誰も発行しないから。

17:デフォルトの名無しさん
07/08/29 03:39:55
C++のソースファイルって、
拡張子がたくさんあるみたいですけど
どれが一番メジャーで、どれを使用するべきですか?

18:デフォルトの名無しさん
07/08/29 03:45:31
.cpp

19:デフォルトの名無しさん
07/08/29 10:32:50
.C
.c++
.cxx
.cpp
.cc
バリエーションはこれくらいかな。

20:デフォルトの名無しさん
07/08/29 11:35:05
質問です。
環境
XP
visual C++

for(t=0;t<T;t++){
pw=pow(exp,(1.0*t)/25.0);
printf("pw=%f\n",pw);
}
といった感じで計算結果を表示させていきたいのですが、実行結果が
pw=1.000000
pw=1.#INF00
pw=1.#INF00
pw=1.#INF00

と2番目から#INFというのが表示されてしまいます。計算結果を正しく出力させるにはどうしたらいいのでしょうか?

21:デフォルトの名無しさん
07/08/29 11:38:42
>>20
pwに代入している行のカンマの位置が怪しいけど、要はオーバフローしているんだろ。
それから、"%f"ではなく"%g"推奨。

22:デフォルトの名無しさん
07/08/29 11:39:45
つーか、expはいくつなのかと。

23:20
07/08/29 12:03:41
>>20さん、>>21さんへ
ありがとうございます。
expは下記のように定義し、2.71828としています。

#include <stdio.h>
#include <math.h>
#define T 30
#define exp 2.71828

void main(){

int t=0;
float pw;


24:デフォルトの名無しさん
07/08/29 12:27:45
ただエディタヘ貼り付けただけで、特に手を加えていないんだが、
こんな具合にきちんと出力されていくぞ。
pw=1.000000
pw=1.040811
pw=1.083287

ところで、1.0をかけるのは意味がない。やるならせめてdoubleへのキャストにしろ。
float使うなdoubleにしろ。
eの累乗ならexp関数にしろ、こっちのほうが精度も速度もいい。

25:20
07/08/29 12:50:12
>>24さんへ
レスありがとうございます。
exp関数を用いたところ
error C2064: 1 引数を取り込む関数には評価されません。
とエラーが出てしまいます。
他の部分がおかしいのでしょうか・・・。
fpout=fopen("outputvoltage.txt","w");
p1=vout;
for(t=0;t<=T;t++){
if(0<=t&&t<=t1){
pw=exp(t/25.0);
inver=1.0/pw;
vt=-1.0*vin*(1-inver);
printf("V=%g\n",pw);
*p1=vt;
++p1;
fprintf(fpout,"output voltage = %g\n",vout);
}
として、累乗計算の時点で前述のような計算結果になってしまい質問した次第です。

26:デフォルトの名無しさん
07/08/30 00:20:56
>>25
「C2064」でググれ…と言いたいトコだが。

「exp」っていう名前の変数使ってないか?
こういうのはアウトだぞ

int printf = 0;
printf("Hello world!"); // C2064 error

解決するには

1:関数名にスコープ解決演算子をつける

int printf = 0;
::printf("Hello world!"); // ok

2:変数名を変える

int count = 0;
printf("Hello world!"); // ok


関数名と同じ変数名を使うとロクな事が無い。留意の事。

27:デフォルトの名無しさん
07/08/30 00:34:01
おそらく23に書いてある#define exp 2.71828を
そのままにしているだけだろう。

28:デフォルトの名無しさん
07/09/07 15:06:58
string hogeっていうのがあったとして
hogeのn番目の文字を取り出してcharに入れたいんですが
どうすれば出来ますか?

29:デフォルトの名無しさん
07/09/07 15:13:43
hoge[n]

30:デフォルトの名無しさん
07/09/29 08:13:39
>>29
うまくいきました。本当にありがとうございました。

31:デフォルトの名無しさん
07/10/02 21:49:32
ぬっちゃけ回答者ってプロ級の人ばかり?


32:デフォルトの名無しさん
07/10/02 22:01:02
いいえ

33:デフォルトの名無しさん
07/10/02 23:23:20
プログラミングについて色々お話聞かせて><

34:デフォルトの名無しさん
08/01/16 23:54:59
まだC/C++勉強してんの?

35:デフォルトの名無しさん
08/02/19 11:59:22
一次元の配列を同じ値で埋めたいのですが、何か高速な方法はありませんか?

36:デフォルトの名無しさん
08/02/19 12:05:46
array[10] = {0}
じゃ駄目かい

37:デフォルトの名無しさん
08/02/21 20:09:38
coutで出力するときに最初にたとえば
processing
って表示して
processing.
processing..
processing...
みたいに一文字ずつ書き足していきたいんだけどまじめにどうしたらいい?
cout<<"."とかputchar('.')で実行すると、改行がくるまでターミナルに表示されなくて困ってます。

38:デフォルトの名無しさん
08/02/21 20:16:23
cerrはバッファリング無しだからどうか

39:デフォルトの名無しさん
08/02/21 20:17:39
std::cout << std::flush でいけたような

40:デフォルトの名無しさん
08/02/23 02:43:53
>>38
>>39
エラー出力とバッファリングのメンバー変数(?)ですよね。
勉強になりました。dクス

41:デフォルトの名無しさん
08/03/29 13:33:03
cstringとstringって何が違うのですか?

42:デフォルトの名無しさん
08/03/29 15:49:32
<string.h>と<cstring>はほぼ同じもので、
cの標準ライブラリ(strcatとかstrcpy)が宣言されている
前者は大域名前空間になる
stringはC++の文字列ライブラリで<string>に宣言されている
CStringはまた別のライブラリ
で、だいたいあってると思うw 確認してないが
それぞれの使い方は調べれ

43:デフォルトの名無しさん
08/04/29 19:07:22
メールソフトはタイムゾーンをどのようにして取得しているのでしょうか?
独自にテーブルを持っているのでしょうか?
それともOSから取得できるのでしょうか?

44:デフォルトの名無しさん
08/04/30 00:46:51
<開発環境>[OS:WinXP SP2][コンパイラ:VC++2005 Pro]
<やりたいこと>PC(WinXP pro)の特定ソフトを特定のIPアドレスにアクセスさせたくない。
<前提条件>ルーターではなにもしてはいけない(ソフトで解決すること)
<調べたこと>IPHLPAPIでルーティングテーブルをいじって対応? ルーティングテーブルのゲートウェイをありえないところにする?
これだとすべてのソフトでIPアドレスにアクセスできなくなるが、、、。

上記、ヒントなりをいただければと思います。

45:デフォルトの名無しさん
08/04/30 00:58:42
>>44
・まともなセキュリティソフトをインストールして個別設定でそのアプリの動作を制御する。
・そのアプリを改修する。
・諦める。

46:デフォルトの名無しさん
08/04/30 01:07:24
>>45 
早速の返信ありがとうございます。

>・まともなセキュリティソフトをインストールして個別設定でそのアプリの動作を制御する。
セキュリティソフトについてはすでに導入しているのですが、
設定しても恐らく、"その設定自体をユーザーが変えてしまう"ことが予想されます。

>・そのアプリを改修する。
現状問題となっているアプリケーションは、P2Pソフトだったり、ゲームだったりと多岐にわたります。
(説明不足で申し訳ありません)

>・諦める。
orz

47:デフォルトの名無しさん
08/04/30 01:14:52
> その設定自体をユーザーが変えてしまう
お前の作るソフトウェアも同じだろ。
設定を変えられないとしても、強制終了されればおしまい。

ただ、ユーザが管理者 (Administrators)でないと仮定できるなら、
どのソフトでも結構いける。その手のソフトは
たいてい管理者しか設定をいじれないようにできるはずだから。
サービスなんかにしてしまえばただのユーザは終了させることもできない。


48:デフォルトの名無しさん
08/04/30 01:44:48
>>47
返信ありがとうございます。

>お前の作るソフトウェアも同じだろ。
おっしゃる通りです、、、orz

>ただ、ユーザが管理者 (Administrators)でないと仮定できるなら、
ユーザーはAdminです、、、orz
すでにこの段階で問題なのかも知れません。


もう少しなにかいい方法がないか思案してみます、、、。

49:デフォルトの名無しさん
08/04/30 03:53:28
企業だったら、セキュリティコンサルに相談することお勧め。
最近は、ログ解析だけを定期的に行なうなんてことをするコンサルもあることだし。

50:デフォルトの名無しさん
08/04/30 14:25:35
>>49
返信ありがとうございます。

コンサル入れたりするのも1つかもしれません。
検討してみます。


現状、IPHLPAPIを使用して
GetTcpTableを使い、定期的に監視して、
あらかじめ用意したブラックリストと照らし合わせ、SetTcpTableでアクセスできないようにすることをやってみます。
(サービス用アプリとして作成して様子をみます)


51:デフォルトの名無しさん
08/05/03 13:36:21
Visual C++ 2008 Express Editionのコンソールアプリプロジェクトで
using namespace std;
を使うにはどうしたら良いのでしょうか。

stdafx.hに書くと「C2871: 'std' : この名前を指定された名前空間は存在しません。」と怒られます。

ソールファイルに
std::cout << "orz" << endl;
などど書いても「C2653: 'std' : 識別子がクラス名でも名前空間名でもありません。」と怒られます。

空のプロジェクトで一から書くと出来るようですが、Unicodeアプリにならないので困っています。

52:デフォルトの名無しさん
08/05/03 13:49:42
>>51
標準C++ライブラリをなにかインクルードしてるか?

53:51
08/05/03 14:50:25
標準C++ライブラリが具体的に何を指すのかは解りませんが、stdafx.hに以下内容を追記したらコンパイルが通りました。
初歩過ぎる質問に答えていただき本当にありがとうございました。

#include <iostream>
using namespace std;

54:デフォルトの名無しさん
08/07/13 19:48:30
ユニークな名前ってどうやって生成するの?

55:デフォルトの名無しさん
08/07/13 19:59:03

ひらめきが大事だね。


56:デフォルトの名無しさん
08/08/05 15:26:30
どのクラスにでも当てはまりそうな戻り値はどのように管理するのが一般的なのでしょうか?
例としては無効な引数、〜が見つからない、致命的なエラーなどです。

クラス毎に static const 〜 としてもいいのですが、同じ値に保つのが面倒になりそうだし、、、

専用のクラスを作り下記のようにしようかと考えたのですが、スマートではない気がしています。
皆さんはどうされていますか? よろしくお願いします。


class CResultCode {
static const int s_success = 1;
static const int s_falal_error = -1;
static const int s_invalid_param = -2;
static const int s_file_not_found = -10;

static bool IsSuccessful(int in_result) { return in_result > 0; };
};

class CHoge {
int Hoge(){ return CResultCode::s_successed; };
};


void main() {
CHoge hoge;
int res = hoge->Hoge();
if ( !CResultCode::IsSuccessful(res)){
エラー処理
  }
}


57:デフォルトの名無しさん
08/08/05 15:52:09
// cost.h //
extern PGDLLIMPORT double seq_page_cost;;

を含むヘッダーファイルがあり,PGDLLIMPORTはべつのヘッダーで
#define PGDLLIMPORT __declspec (dllexport)
と定義されてます

これをcostsize.cというファイルにインクルードしてるんですが.
extern PGDLLIMPORT double seq_page_cost;;
ってどういう意味なのかわかりません
どういう意味を持つのか教えてください.
お願いします.
ちなみに __declspec (dllexport)で調べてもようわかりませんでした


58:デフォルトの名無しさん
08/08/05 18:19:11
>>56 enum

59:デフォルトの名無しさん
08/08/05 18:21:13
>>57
> ちなみに __declspec (dllexport)で調べてもようわかりませんでした
↓このサイトがおすすめ。
URLリンク(www.google.co.jp)

60:デフォルトの名無しさん
08/08/05 18:39:28
それで判るくらいだったら聞かねぇよ!

61:デフォルトの名無しさん
08/08/05 18:45:50
公式のドキュメントも使ってる人の記事もいっぱいヒットするのに、
それ以上の説明がここでできるとは思わない。

62:56
08/08/05 19:11:19
>>58
ありがとうございます。 度々すいませんが、その場合は専用のnamespaceを設けてという事でしょうか?
それともヘッダ1つ増やして個々にインクルードするだけで良いのですか?

となると、成否判定に#defineマクロを使いたくなってしまうのですが許されるのでしょうか。。。
「C++ならdefine使うな」って怒られたりしませんか…? よろしくお願いします。





63:デフォルトの名無しさん
08/08/05 21:20:07
>>59
レスどうも
すでに試してまして・・・
で,いかんせん,どこの何というDLLから何を
エクスポートしてるのか,てんでわからんのです

64:デフォルトの名無しさん
08/08/05 21:22:11
>>62
ResultCodeクラスを作るなら、戻り値を整数型にしないでResultCode型にしちゃえばいいじゃん。
で、適当なキャストオペレータを用意しておけば成否判定に使えるし。

65:デフォルトの名無しさん
08/08/05 21:23:14
>>63
>57と>63で質問していることが全然違うわけだが。

66:デフォルトの名無しさん
08/08/05 21:32:06
>>65
自分初心者なもので
質問に一貫性が無いのは,すいません
なんというか両方答えて頂ければと思うんですが…

67:デフォルトの名無しさん
08/08/05 21:48:21
>>57
>どういう意味を持つのか教えてください.
どこぞの何とかいうDLLから何ぞやをエクスポート

>>63
>で,いかんせん,どこの何というDLLから何を
>エクスポートしてるのか,てんでわからんのです
costsize.cで作られるDLLからseq_page_costを

68:56,62
08/08/05 23:44:56
>>64
ありがとうございます。そうしていこうと思います。
値渡しで返して嫌がられたりする事はあるのでしょうか? ← ここが一番心配なのです。
最適化すれば一時オブジェクトは作られないのかなあ…

69:デフォルトの名無しさん
08/08/05 23:51:25
ResultCodeクラスにメンバなんかenum値一個しか要らんでしょ。
そんなもん値渡ししたって参照よりもコンパクトなくらいだ。

70:68
08/08/06 00:01:01
>>69
お蔭で解決する事が出来ました。 何度もありがとうございました。  

71:デフォルトの名無しさん
08/08/18 08:29:05
int *p = new int [4];
の時
delete [] p;
delete p;
って使い分けないといけないの?

72:デフォルトの名無しさん
08/08/18 08:39:40
>>71
new[] の場合は delete[]
使い分けないといけない

73:デフォルトの名無しさん
08/08/18 08:45:23
>>72
さんくす

74:デフォルトの名無しさん
08/08/18 13:19:15
delete p;
だと1個目しか消せない。


75:デフォルトの名無しさん
08/08/18 13:22:42
そうなんか?

そう書き間違えた場合の、文法チェックとか、メモリリーク調査とか、可能?

76:デフォルトの名無しさん
08/08/18 13:25:37
>>74
ダウト
処理系によってはコア吐くぞ

77:デフォルトの名無しさん
08/08/20 08:54:58
intならデストラクタが無いからどっちも同じ

78:デフォルトの名無しさん
08/08/20 08:56:18
どっちも同じってことはない。


79:デフォルトの名無しさん
08/08/20 09:57:39
Visual C++ 2008 ではC++でなくCのコンパイルできないの?

80:デフォルトの名無しさん
08/08/20 10:38:50
できるよ

81:デフォルトの名無しさん
08/08/20 10:48:53
CLRにするとC++/CLI専用になるから *.c はコンパイルできない。
Win32のプロジェクトならできる。

82:デフォルトの名無しさん
08/08/20 11:53:10
サンクス

83:デフォルトの名無しさん
08/08/20 13:17:31
>>74
未定義じゃない?ANSIの仕様とか読んでないけど
処理系によってはdeleteとdelete[]が等価だったりするし

84:デフォルトの名無しさん
08/08/21 01:12:31
PCモニタをオフにするようなコードって,どうやって書けば良いんでしょうか?
下のフリーソフト,アセンブラで見たらWindowsAPIのKernel32.Sleep呼んでるみたいですけど・・・

URLリンク(hp.vector.co.jp)

85:デフォルトの名無しさん
08/08/21 03:01:07
>>83
うん。未定義。

86:デフォルトの名無しさん
08/08/21 09:12:35
>>84
うろ覚えだが
PostMessage(HWND_BROAD_CAST, WM_COMMAND, MONITOR_OFF)みたいな感じで。

87:デフォルトの名無しさん
08/08/21 12:26:14
>>86
ありがとうございます!やってみます。

88:デフォルトの名無しさん
08/08/22 12:32:13
>>86
SendMessageで出来ました。引数はもろにそんな感じでした。
Sleepは一休みしてから電源オフに持ってくためだったんですね。。。

あと,モニタ電源オフの状態からオンに復帰するときに,
マウスの移動は無視して,
マウスのクリックやキーを押すときのみに反応するコードはどんな風に書けばいいんでしょうか?
誰かやさしい人おしえてください。

89:86
08/08/22 20:34:20
>>88
ちょうどそんなフリーソフトを作った。(でもしばらく公開予定はない。)
自分は以下のような方法を使ってる。

・モニタをオフに
・グローバルフックでマウスの操作を監視
・マウスの移動を検地した場合はモニタをオフにする

90:デフォルトの名無しさん
08/08/22 22:35:59
>>89
一体いつモニタをオンにするんだ?

91:86
08/08/23 00:05:54
>>90
プログラムでオンにする必要はない。マウスのボタン押下やキー押下で勝手にオンになるから。

92:デフォルトの名無しさん
08/08/23 11:31:45
int main()
{
unsigned char *s; // 文字列用ポインタ用意

s = "Test";

・・・・
・・・
・・

このようなプログラムがあるのですが、二つほど質問があります。
unsignedでchar型を宣言すると、何かいいことがあるのでしょうか?
また、参考本には載っていなかったのですがこのような文字列の
代入方法は正しいのでしょうか?文字配列を用意して、strcpyで代入するとしか載ってなかったので…

93:デフォルトの名無しさん
08/08/23 13:19:11
>>91
>・マウスの移動を検地した場合はモニタをオフにする
オンではなくてオフ?

94:デフォルトの名無しさん
08/08/23 13:29:57
>>93
>90、>91

>>92
sはローカルな文字列ではなくて、只のポインタ変数。だから、実際にはconst unsigned char * sということになる。
# つまり、s = "Test"の後でs[0] = 't'とはしてはいけない。
尚、charをunsignedで宣言しておくと、標準関数を呼ぶたびに(厳密には)キャストが必要になるので巧くない。
その代わり、2バイト文字などを扱うときに多少扱いやすくなる。

95:86
08/08/23 15:17:23
>>93
>>88
>>あと,モニタ電源オフの状態からオンに復帰するときに,
>>マウスの移動は無視して,

マウスの移動があるとオンになっちゃうからオフにする。

96:デフォルトの名無しさん
08/08/23 19:42:47
>>92
実質的な違いはない。後の処理の関係でどっちにするか選ぶとかその程度。

>>94
>sはローカルな文字列ではなくて、只のポインタ変数。だから、実際にはconst unsigned char * sということになる。
ちがうよね?

97:96
08/08/23 19:44:58
>>92
さっきのは「unsignedでchar型を...」のみの回答でした。

>このような文字列の代入方法は正しいのでしょうか?
正しいです。

98:デフォルトの名無しさん
08/08/23 19:52:38
正しいし便利なのでオススメ

99:デフォルトの名無しさん
08/08/23 23:12:12
>>89
モニターの電源切っておけばいいんじゃね?

100:86
08/08/24 11:33:50
>>99
マウス・キーボード操作でONにならない状態にするってことだよね。
調べた範囲では無理そうだった。
もしかしたら低レベルな方法であるのかも知れないけど。

それにこの場合マウスの移動だけ無視したいので、
マウス操作の監視は必須で、手間は変わらないと思う。

101:デフォルトの名無しさん
08/08/24 20:41:41
一時的にマウスのドライバを無効にしとくのはどう?
クリックも無視していい状況だよね?

102:デフォルトの名無しさん
08/08/24 21:02:48
難しそうだお

103:86
08/08/24 21:24:58
>>101
>>88
クリックは無視しちゃだめ

104:デフォルトの名無しさん
08/08/24 22:19:27
そうか、マウスのクリックでもモニタの電源ONになるのか
知らなかった

105:デフォルトの名無しさん
08/08/24 22:32:36
>>95
>マウスの移動があるとオンになっちゃうからオフにする。
な〜るほどね!うまい。


106:デフォルトの名無しさん
08/08/25 01:15:51
俺はCoolMonitorOffってソフトを使ってて>>86はその作者かと思ったんだけど、
>>89で(でもしばらく公開予定はない。) とあるから別人か。

Pauseキーに割り当てて愛用してるよ。作者さんありがとーね。見てないだろうけど。

107:86
08/08/25 18:57:42
>>106
うん。別人。CoolMonitorOffは知らなかったんだけど似てるな。
コマンドライン引数でモニタオフにするまでの時間の指定やWindowsのロック、
マウス移動での復帰有無などを指定できるようにしてる。

公開して色んな人に使ってもらいたいんだけど、
やり方知らないのと、面倒そうなんでやってないんだよね。
そのうち自分のホームページ作って公開しようかなと考え中。

欲しかったらよかったらあげるよ。ソースもつけて。

108:デフォルトの名無しさん
08/08/25 21:28:21
>>107
ソース見てみたいです。ください。

109:86
08/08/26 10:31:42
>>108

アップしました。

URLリンク(a-draw.com)
ミニアップローダ(〜20MB)の up4006.zip
pass:dispoff

110:デフォルトの名無しさん
08/08/26 23:49:05
>>109
ありがとう。
「アプリケーションが初期化できませんでした。エラー0xc015002〜」
とでるんですが,原因はなんでしょうか。

111:86
08/08/27 20:22:16
>>110
dllとexeでリンクするランタイムのタイプが違ってた。これかな。なぜか自分の環境では動くけど。

修正して再アップしました。

URLリンク(www.hsjp.net)
up38638.zip
パスワード:なし

112:デフォルトの名無しさん
08/08/28 02:04:33
>>111
な〜るほどね!ソースみて納得。勉強になりました。ありがとう。

113:デフォルトの名無しさん
08/09/02 21:57:31
Windows用USBデバイスのインストーラ及びアンインストーラをVCで
作ってます。
汎用性を持たせるためにinf及びdelファイルを書き換えるだけで
インストーラ、アンインストーラは再コンパイル不要とした作りに
したいと思っています。
そこで、特定のINFファイルから"USB\VID_xxxx&PID_xxxx"を
抜き出して行うような方式としたいとおもうのですがなにか
方法(Win32 API)は無いでしょうか。


114:113
08/09/02 22:28:12
デバドラ板で質問してみます。

115:デフォルトの名無しさん
08/09/06 22:55:49
C#がWindowsプログラミングし易いのはわかっているけど、
もうC++にどっぷり浸かっているから。

Javaは演算子のオーバーロードがないから、複素数計算では
致命的だし。

でも、C++0xでまた仕様が大幅にかわるのかな。もういいかげ
んにしてほしいな。

116:デフォルトの名無しさん
08/09/07 00:13:09
C++のことだし、建前としては今までのプログラムも
そのままコンパイルできるってことになっているはず。

117:デフォルトの名無しさん
08/09/07 00:17:27
std::string name = "unko";
std::cout << "name = " << name << std::endl;

error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つかりません (または変換できません)。

コンパイルできません。なにこれ。

118:デフォルトの名無しさん
08/09/07 00:18:58
>>115
仕様が大きく変わった場合、書き直しを辞さないほどのよっぽど有益なメリットが無い限り普及なんてしない。安心して良し。


119:デフォルトの名無しさん
08/09/07 00:22:55
>>117
1行目を読んで、続きを読む気力が失せた

120:デフォルトの名無しさん
08/09/07 00:27:56
>>117
#include <string> 抜けてない?

121:デフォルトの名無しさん
08/09/07 00:32:05
>>120
書いてないですが、std::string はコンパイルエラーになってないので大丈夫です。

122:デフォルトの名無しさん
08/09/07 00:35:42
>>121
「書いてないですが」とかそういう問題じゃない。書け。

123:デフォルトの名無しさん
08/09/07 00:37:27
>>121
現に<<でエラーになっているじゃないか。全然大丈夫じゃないだろ。

124:デフォルトの名無しさん
08/09/07 00:43:05
あまりいじめないでsください

125:デフォルトの名無しさん
08/09/07 03:55:34
つ[s]

126:デフォルトの名無しさん
08/09/07 07:55:24
C++はまったく糞だな

127:デフォルトの名無しさん
08/09/07 10:13:52
おまえがな

128:デフォルトの名無しさん
08/09/07 15:15:09
char c[ 12 ]; // ok

const int dim = 12;
char c[ dim ]; // ok

int x = 12;
const int y = x;
char c[ y ]; // error !

「配列の要素数はコンパイル時に決められていなければならない」
っていうのの意味がわからん・・・ ・_・

129:デフォルトの名無しさん
08/09/07 15:29:05
>>128
コンパイラの気持ちになって出力するアセンブリコードを考えないと、確かにわかんないだろうねぇ。
そういう制約が嫌なら std::vector を使っておけばいいよ。

130:デフォルトの名無しさん
08/09/07 23:06:26
newって中でなにやってるの?
APIでメモリ確保してコンストラクタ呼んでるだけ?

131:デフォルトの名無しさん
08/09/07 23:08:23
>>130
そう思って差し支えない。もっと詳しく知りたければアセンブリの出力を見れ。

132:デフォルトの名無しさん
08/09/08 15:04:21
ググるのにも限界感じたので、教えてください。
BCB 6.0 Personal でTWAIN.DLLを読んで、画像をスキャンするものを作っています。
OSはWindows XPです。

画像をスキャンしてImageコンポーネントに貼り付けるところまで書いたのですが、
Imageに表示される画像が縦に2分割されて、左右反対になってしまうので困って
います。何か考えられる原因はないでしょうか?

TWAINにアクセスする部分はVectorでダウンロードしたフリーのVC++向けライブラリ
を使っていて自作ではないのですが、TWAIN本家サイトの説明書と比べて、取り立
てて変わったことをしてるとは思えません。Imageに貼り付けるのは下のようにしてい
ます。

HANDLE dib;
mTwainManager.Scan(Handle,&dib); //フリーのライブラリに
if ( dib == 0 ) return;
LPBITMAPINFO bmi = (LPBITMAPINFO)::GlobalLock(dib);

ImageScan->Picture->Bitmap->Height = bmi->bmiHeader.biHeight;
ImageScan->Picture->Bitmap->Width = bmi->bmiHeader.biWidth;
SetDIBits(
ImageScan->Picture->Bitmap->Canvas->Handle,
ImageScan->Picture->Bitmap->Handle, 0,
(UINT) bmi->bmiHeader.biHeight,
(Byte*)((Byte*)bmi + sizeof(BITMAPINFOHEADER)),
bmi, DIB_RGB_COLORS );

::GlobalUnlock( dib );
::GlobalFree( dib );



133:デフォルトの名無しさん
08/09/08 21:21:54
あー、一つだけ言えることができる。
ANSI Cあたりまではなんとかなったんだが、C++3.0くらいになると
かなり複雑。あまり触りたくなかった。

134:デフォルトの名無しさん
08/09/09 12:49:51
>>132です。自己解決。
ハンドルとか初期化しまくったら、良く分からないけど直りました。
お騒がせしました。

135:デフォルトの名無しさん
08/09/14 19:35:07
いままでソース分割してコンパイルでなんとも無かったんですが
template入れたとたんソース分割コンパイルが通らなくなってしまいました
分割したファイルをコピペでひとつにするとコンパイルできるのでコードが間違ってるわけではないと思います
templateを使うとソース分割できなくなる仕様なんでしょうか?
コンパイラはBCCを使ってます


136:デフォルトの名無しさん
08/09/14 20:05:48
URLリンク(d.hatena.ne.jp)
ここでも読んでみ

137:デフォルトの名無しさん
08/09/15 15:29:33
500000までの素数を判定して、出力するプログラムを作っているのですが、実行するとカーソルが点滅したまま止まってしまいます。
どのようにすればよろしいでしょうか。よろしくお願いします。
#include<stdio.h>

long i=0,j=0,primecounter=0,chk_prime[500000],x=0,y=0;

int main (void)
{

for(i = 2;i < 500000;i++){
for(j = 1;j < i;j++){
if(i % j == 0){
primecounter++;
}
if(primecounter == 2){
printf("%ld",chk_prime[x]);
chk_prime[x] = i;
x++;
primecounter = 0;
}
else{
primecounter = 0;
}
}
}

for(y = 0;y <= x;y++){
printf("%ld",chk_prime[y]);
}
return 0;
}


138:137
08/09/15 15:39:38
すみません。環境を書き忘れてました。
環境は
OS Mac OS X 10.5.4
コンパイラ GCC4.2
です。
すみませんでした。

139:デフォルトの名無しさん
08/09/15 16:05:26
C++オセロ完成したよー\(^o^)/
URLリンク(www8.uploader.jp)
URLリンク(www8.uploader.jp)

後はあれだ、COMの頭脳を書いていくだけだ・・・。
みんなでCOMクラスのselectメソッドを書き換えて勝負させようぜ!!

140:デフォルトの名無しさん
08/09/15 16:07:16
C言語で素晴らしいオセロを作らないか?
スレリンク(tech板)
こっちでもないか

141:デフォルトの名無しさん
08/09/15 16:07:17
>>139
zipの方にはソースとexeファイルが入ってる。
exeファイルの方は、>>139にテキストでうpしたソースの最後に
system("pause");を足したものをコンパイルしただけ。
心配なら自分でコンパイルしてね!!

142:デフォルトの名無しさん
08/09/15 16:10:00
>>140
俺はこのスレで4日前くらいからC++でオセロを作ってるんだ・・・(´・ω・`)
ム板なんて!!ム板なんて・・・!!時々行くけどね。

C++の勉強がしたいだけだからそのスレには用はないかな・・・。
オセロのアルゴリズムを考えるには参考になりそうだけどね。

143:デフォルトの名無しさん
08/09/15 16:10:50
ごめん、激しく板違いでしたwwww
恥ずかしい誤爆したぜ!!ww

VIPに帰ります。。。

144:デフォルトの名無しさん
08/09/15 16:18:07
次はWindows GUIに挑戦だ

145:デフォルトの名無しさん
08/09/15 16:26:16
>>137
URLリンク(kansai2channeler.hp.infoseek.co.jp)
見るの面倒だったので、てきとうに作ってみた。
無駄が多いけどね。

146:デフォルトの名無しさん
08/09/15 16:30:52
char prime[500000]; を1で初期化して、

n=2 → √500000と動かして
prime[n]==1ならば、nの倍数の配列すべてに0を入れる

するとprimeが1のもの

147:デフォルトの名無しさん
08/09/15 16:32:29
エラトステネスのふるい
でググれ

148:デフォルトの名無しさん
08/09/15 16:42:35
コンピュータの対戦できるソフト

BearRev Professional Edition
URLリンク(www.vector.co.jp)

149:デフォルトの名無しさん
08/09/15 16:43:45
まぁついでなので>>139のソースに関して何かコメントあれば下さい。
C++まだ初めて4日目(多分)なので、オブジェクト指向的なプログラミングになれてません。
ここはこうした方がいいぜ!!ってのあればよろしくお願いします。

>>144
もちろんそのつもりだよん

150:デフォルトの名無しさん
08/09/15 16:46:31
動けばいい 動かなかったら何言語使っていてもだめ

151:デフォルトの名無しさん
08/09/15 16:51:58
>>137
ループの終了条件
{}の位置
ついでにprintの位置


152:137
08/09/15 17:02:14
>>145
ありがとうございます
参考になります
>>146
ありがとうございます。
チェックしてみます。

>>147
ありがとうございます。
その方法でも試してみたいと思います。

>>151
具体的な指摘ありがとうございます。
終了条件がどのように間違っているか指摘していただきたいのですが、よろしければお願いします。

153:デフォルトの名無しさん
08/09/15 17:11:17
>>137
デバッガ

154:デフォルトの名無しさん
08/09/15 19:12:51
>>152

for(j = 1;j < i;j++){
if(i % j == 0){
primecounter++;
}

1とそれ自身で割れるかどうかをチェックしてるのにj < iだと自身で割ることなく終了する
j <= iに変えれば自分で割ったときもチェックできる

155:トミー ◆xb8eIST5.k
08/09/15 21:51:15
初めまして。質問させていただきます。
C言語を始めようと思い、いろいろなページを見てみたら、ほとんどにおいて
「まずコンパイラをダウンロードしましょう」と書いてあり、中でも例として
Borland C++ 5.5がよく書いてあったので、これをダウンロードしてみようと
思いました。
URLリンク(www.codegear.com)で「C++ Compiler
5.5/Turbo Debugger」をクリックし、個人情報も登録しましたが、最後に出てき
たダウンロードボタンを押してみると、「サーバーが見つかりません」と出てしま
いました。
見ると、「上記のダウンロードサイトにアクセスできないときは、CodeCentral の
ダウンロードページをお試しください。CodeCentralのダウンロードページを利用
するには、CDNへのログインが必要です。」と書いてあるので、「CDNへのログイン」
の文字をクリックしてみましたが、英語のページで、Login nameやpasswordを入力
する欄が出てきました。(日本語のページもあるようです。)
わたしはCDNには会員登録していません。CDNに登録しないと、C++ Compiler 5.5/
Turbo Debuggerをダウンロードすることはできないのでしょうか。

回答お願いします。

156:デフォルトの名無しさん
08/09/15 22:02:22
以下のコードでコンパイルエラー(C2440)が出るのですが、何が間違っているのでしょうか?
環境は、VC++6.0です。

class CBase
{
public:
CBase& operator=(int val) {}
};

class CDerived : public CBase {};

int main()
{
CDerived val = 1; // この行で、コンパイルエラー
return 0;
}

エラーメッセージは、
C2440: 'initializing' : 'const int'から'class CDerived'に変換すrことはできません。
 コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。

157:137
08/09/15 23:29:29
>>154
ありがとうございます
肝心なところですね

カーソルが点滅したまま終了しないですが、、
何度も申し訳ございませんが、何が問題か分かる方お願いします。

158:デフォルトの名無しさん
08/09/15 23:33:54
>>156
operator =はCDerivedで定義される暗黙のやつがCBaseのを隠してしまう。
だから、CDerivedで定義し直すなどしないといけない。

もっとも、CDerived val = 1で行われるのは代入ではなく初期化なので、
そういうことをやりたければ、CDerivedにint型の引数を取るコンストラクタを作る必要がある。

159:デフォルトの名無しさん
08/09/15 23:59:55
>>137,157
回している回数じゃないかな
Sigma[i=1...499998]i = 499998*(1+499998)/2 = 124999250001
待っていればいつか終わると思うよ

160:デフォルトの名無しさん
08/09/16 00:05:22
>>157
{}の位置が悪い
自分より小さい数で割るたんびにcountを0に戻してる
自分より小さい数で全部割りおわってからcountが2であるかどうか調べないと


161:156
08/09/16 00:21:21
>>158
なるほど、そういうことか。
確かに、operator=を定義していなくても、オブジェクトの代入とか出来ますからね。
あれは暗黙で定義されているからってことか。一つ賢くなりました。
ありがとうございます。

162:137
08/09/16 01:03:17
>>159
ありがとうございます。
デバッガで見てみると回ってはいるようなので、しばらく待ってみることにします。

>>160
基本的なアルゴリズムが間違っていたのですね、、
ありがとうございます!

163:デフォルトの名無しさん
08/09/17 14:09:12
引数にリファレンスを渡すとオーバーヘッドが小さくなるんですか?


164:デフォルトの名無しさん
08/09/17 14:42:16
値のサイズがリファレンス(=ポインタ)のサイズに比べてかなり大きければなる

165:デフォルトの名無しさん
08/10/04 23:05:01
 今勉強のために文字列クラスを自作しています。
それでoperator+=で文字列の代入結合まではなんとかできたのですが、
operator+の定義がうまくできません。

CString a, b, c;
a = "abc";
b = "def";
c = a + b; //"abcdef"にならない

デバッガで確認したところ、
CString CString::operator+(CString& str)
{
CString temp(*this);
temp += str; //ここまではうまくいっている。
return temp; //ここでデストラクタが呼び出されて、正しい結果を返せない。
}

一応デストラクタはこんな感じです。
CString::~CString()
{
if(ptr) delete[] ptr;
}

tempをstatic宣言したら、結合はうまくいったのですが、プログラム終了時に例外が出るようになってしまいました。
どうすればうまくいくのかどなたか教えて下さい。


166:デフォルトの名無しさん
08/10/04 23:14:22
>>165
コピーコンストラクタとoperator=作ってる?

167:デフォルトの名無しさん
08/10/04 23:16:07
いろいろと辺

168:165
08/10/05 08:09:11
>>166
operator=は作っていたのですが、コピーコンストラクタは作っていませんでした。
(operator= を定義しておけば必要ないと思っていたもので・・・)
コピーコンストラクタを作ったところ、うまく動作するようになりました。
どうもありがとうございました。

169:デフォルトの名無しさん
08/10/05 08:46:10
CString::operator+で、足し算定義しているのに、なんでその関数内部で
足し算が出来るんだよ? コンパイル通るのかよ

170:デフォルトの名無しさん
08/10/05 10:41:38
+ と += は別物だよ

171:デフォルトの名無しさん
08/10/05 11:27:46
べつなのはわかっている ここはなぜいいんだよ

temp += str; //ここまではうまくいっている。

172:デフォルトの名無しさん
08/10/05 11:38:20
// 実は勘違い

173:デフォルトの名無しさん
08/10/05 11:40:14
すまん間違えた

174:デフォルトの名無しさん
08/10/06 14:08:04
単純な事質問するんだけど

型の宣言って複数の関数をまたいでするって出来ないのかな?
うまく説明出来ないんで悪いんだけど
例えば
read.cpp
global.h
test.cpp
の3つがあった場合。

read.cpp内でint型を宣言するとread.cppで宣言した型を使った関数を作る(ここで代入)。
次にglobal.h内でread.cppで作った関数をextern void 何々();とする。
そして、test.cppでglobal.hをインクルードして、test.cpp内でread.cppで作った関数内で代入されたint型を読み込ませたい。

記述は間違ってないと思うんだけど、ビルドするとtest.cppで読み込んだはずの代入されたint型が読み込まれてなくて、定義されてないと出る

・・・初歩的な事で悪いんだけど、根本が違うのかな?ご教授お願いします。

175:デフォルトの名無しさん
08/10/06 14:11:48
>>174
「int型を宣言」とか「int型を読み込む」とか、かなり奇怪な話になっててよくわからん。
どうせ単純なミスかなんかだろ。実際のコード晒してみるのがいいよ。

176:デフォルトの名無しさん
08/10/06 14:19:44
余計な所省いて晒してみる、まだ日が浅くて酷いコードでごめん。
ReadingFile.cpp

int enemy_img;
void readingfile(){
enemy_img = LoadGraph("date/img/enemy.bmp");
}

GlobalM.h
extern void readingfile(); //全ての素材


enemy_move.cpp

void enemy_move_02(){

move02.enx+=sin(PI*move02.eny/80)*5;
move02.eny+=1.5f;

DrawGraph( move02.enx , move02.eny , enemy_img , TRUE ) ;
                           ↑ここでReadingFile内の関数で指定したのを読み込ませたい。
DeleteGraph( enemy_img ) ;


}

177:デフォルトの名無しさん
08/10/06 14:28:55
>>176
extern int enemy_img;

178:デフォルトの名無しさん
08/10/06 14:35:16
>>177
ありがとおおお
でもどうしてintも読み込ませないといけないんだ?

既にReadingFile.cppで読み込んでいるし、多重定義になるかと思ってた。

179:デフォルトの名無しさん
08/10/06 14:47:41
コンパイラは、各ソースファイルを別々にコンパイルしている
他のソースに何か書いてあっても、
今コンパイルしてるソース (と、そのインクルード先) に書いてなければ、コンパイラには判らない

180:デフォルトの名無しさん
08/10/06 15:15:44
>>177は「int型のenemy_imgという変数がどこかにあるはず」という情報。
コンパイラはその「あるはず」という仮定をオブジェクトファイルに埋め込む。

そしてリンカが全部のオブジェクトファイルからその変数を探して、実際のアドレスに直す。
(見つからなかった場合はリンクエラーになる)

181:デフォルトの名無しさん
08/10/16 01:38:42
>>155ではありませんが、今私、全く同じ状況で困っています。
どなたかお答えいただけませんか?

182:デフォルトの名無しさん
08/10/16 02:10:05
>>181
URLリンク(www.microsoft.com)
これじゃだめなの?

183:デフォルトの名無しさん
08/10/16 03:47:20
問題文:2つの円の位置関係(交わる(交点)、含まれる、離れている)

先週C++を始めたばかりなので色々と書き方が解りません;;
考え方は解るのですが……

二乗や平方根などなど……

184:デフォルトの名無しさん
08/10/16 04:27:08
>>183
//
// 2つの円の重なりをチェックする。
//
// 引数
// x1, y1, r1 円1の中心x座標、中心y座標、半径
// x2, y2, r2 円2の中心x座標、中心y座標、半径
//
// 戻り値
// 0: 接する 正: 離れている 負: 重なる
//
int circle_check(int x1, int y1, int r1, int x2, int y2, int r2)
{
return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) - (r1+r2)*(r1+r2);
}

185:デフォルトの名無しさん
08/10/16 15:19:36
srand(0)とsrand(1)が同じ系列を生成するので、ソースコードを見てみたいのですが、
srandのソースコードってどこにありますか?


186:デフォルトの名無しさん
08/10/16 16:02:43
お使いのコンパイラによって実装は異なる

187:181
08/10/16 19:24:11
>>182
参考書を買って勉強しようと思っているのですが、その参考書で
『C++ Compiler 5.5/Turbo Debuggerをダウンロードして、それを使って勉強』
なものだったので、別のソフトだと操作方法がわからないんじゃないかと不安だったのです・・・。
とりあえずこれでやってみます!回答ありがとうございました。

188:デフォルトの名無しさん
08/10/16 20:24:04
C++の質問です。2つお願いします

・CString 形式のデータで""hogehoge""というデータが入っていた場合、
前後のダブルクォーテーションを簡単に除去する方法はありませんか?

・char buff[255][3][255] のようなデータをファイルで入出力したいのですが、
何か良い方法はありませんか?

189:デフォルトの名無しさん
08/10/16 21:18:55
>>188
メモリマップドファイルとstd::stringならsubstr

190:デフォルトの名無しさん
08/10/16 21:36:55
VC++2008proにて
特定のコード上で右クリックすると確実にフリーズするんですが
似たようなケースさらには対処法あったら教えてください。。
ググったけどほとんど情報が無く、似たような質問がされている所も未だ解答がなかったとです。。

原因は調査中です。ヘッダーファイルを適当にインクルードしまくったから無限ループ起きたか?
と思って全部コメントアウトしてみたけど無意味でした。。

他の情報としては、
普通はマウス乗せたらメンバの情報が出てきますが、そのコードではそれすら出てきません。
一応左クリックおよびファイルの編集はできます。
右クリックだけ永久砂時計が発動します。

他も何か手がかりになりそうな所あれば探したいんで
アレがひっかかってるんじゃね? とか言っていただけると助かります。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4740日前に更新/246 KB
担当:undef