【初心者歓迎】C/C++室 Ver.50【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/02/28 00:01:39
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

2:デフォルトの名無しさん
08/02/28 00:02:13
だぶった

3:デフォルトの名無しさん
08/02/28 00:05:35
>>1
こっちのがかっこいいな

4:デフォルトの名無しさん
08/02/28 00:07:13
かっこいいって何だよw
こっちが遅いから、あっちが先だな。

5:デフォルトの名無しさん
08/02/28 00:08:28
1乙です。
こっちもいいな〜

6:デフォルトの名無しさん
08/02/28 00:09:53
再現はさせられないけど・・・これだと一致してしまう

#include <iostream>
#include <string>
using namespace std;

main(){
int n, sz=1024*100, step=8;
string c(sz,'\0'),x="", y(sz,'\0');
for(n=0;n<sz;n++)c[n]=rand();
for(n=0;n<sz;n+=step){
x+=c.substr(n,step);
memcpy(&y[n],&c[n],step);
}
if(x==y)cout<<"一致しました"; else cout<<"異なります";
}

7:デフォルトの名無しさん
08/02/28 00:20:29
まあ同じになるだろうな。
そうやってメモリをちゃんと確保してるなら問題は無い。
string は実は 0 を含むことができるしね。
(string += const char* としようとすると const char* の 0 が現れた時点で代入が止まるが)

現状の規格では string の内部バッファの連続性は保証されてないけど、
次期規格で保証されるようになる位一般的な実装だから心配は無いだろう。

8:前スレ963
08/02/28 01:06:23
前スレ965,966様
よくわかりました。自分が馬鹿でした。ありがとうございました。


9:デフォルトの名無しさん
08/02/28 01:28:45
Visual C++ の質問です。
選択した画像ファイルのヘッダ情報?(フォーマット、カラースペース等)を
取得するにはどうすればいいのでしょうか

質問の意味が分からなければごめんなさい。
始めて右も左も分からないもので…
よろしくお願いします。

10:デフォルトの名無しさん
08/02/28 01:34:12
教えてあげて。
URLリンク(detail.chiebukuro.yahoo.co.jp)

でもその前にこれ見てから。
URLリンク(blogs.yahoo.co.jp)

11:デフォルトの名無しさん
08/02/28 09:37:49
>>9
画像フォーマットに応じてヘッダ解析処理を書く。
画像フォーマットの仕様書はネット探せばあるだろ。

12:デフォルトの名無しさん
08/02/28 12:01:38
こっち使うのか。
まあかっこいいからしょうがないか。

13:デフォルトの名無しさん
08/02/28 13:36:13
コンストラクタでインスタンスの生成が始まって
実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか?

あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良いというのは本当なんでしょうか?

14:デフォルトの名無しさん
08/02/28 13:43:24
>>13
>実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか?
どういうときに気にする必要があるの?

>コンストラクタ内で仮想関数
ケースバイケースだが、派生クラスでオーバーライドされたものが呼ばれると思ってると痛い目に会う。

15:デフォルトの名無しさん
08/02/28 14:14:54
>>13
>あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良い
>というのは本当なんでしょうか?

C++のオブジェクトモデルの観点から言えば、
少しおおざっぱだが(厳密さは省く)、コンストラクタにはコンパイラ
によってvptrが自クラスの仮想関数テーブルへのポインタにセットされる
タイミングがあって、コンストラクタボディでは既にセットされてしまって
いる。基底クラスのコンストラクタボディでは基底クラスの仮想関数テーブル
が参照される。どう頑張ってもポリモルフィズムは起こらない。


16:デフォルトの名無しさん
08/02/28 14:39:19
もしも仮想関数が純粋仮想関数だった場合にはどうなるんだろ
基底クラスには存在しない関数を呼び出すことになるので
コンパイルエラーになるのかな?

17:デフォルトの名無しさん
08/02/28 14:47:24
>>16
定義が無いとリンクエラーだろうな。

18:16
08/02/28 14:54:58
>>17 どうもです
g++でテストしてみたよ
エラーになった…コンパイルエラーっぽいけどリンカエラーなのかな
詳細は不明ですが、エラーになると。まあ当然ではありますが…

>tes.cc: In constructor `A::A()':
>tes.cc:12: error: abstract virtual `virtual void A::func()' called from constructor

19:デフォルトの名無しさん
08/02/28 15:01:24
>>18
認識合ってないかも。>>13からの流れのだよね?

class Widget {
public:
virtual void jyunsui() = 0;
Widget(){ jyunsui(); }
~Widget(){}
};

class Budget : public Widget {
public:
void jyunsui() {}
};

Budget b;

こういうことじゃない?

20:16
08/02/28 15:13:34
>>19
コンストラクタから仮想関数を呼び出すときに仮想関数テーブルにある
関数が呼び出されるという話を聞いて
仮想関数が純粋仮想の場合はどうかなと思った次第であります
あまり深い意味はありません、すみません…

テストしたコードは19さんのコードと同じです
コンパイルすると
>tes.cc: In constructor `Widget::Widget()':
>tes.cc:8: error: abstract virtual `virtual void Widget::jyunsui()' called from constructor

21:デフォルトの名無しさん
08/02/28 15:23:31
>>20
へえ、コンパイルエラーなんだ。
Comeau C++ では警告は出たけどコンパイルできた。

VC++2008だとリンクエラーになったね。
定義すると警告無しでビルドできた。


22:デフォルトの名無しさん
08/02/28 15:30:55
処理系に依存するのか。。

23:デフォルトの名無しさん
08/02/28 17:05:21
VC++2005で "1.wav"などローカルに保存された音声ファイルを再生したいのですが。
標準でそういった関数?はあるのでしょうか?

24:デフォルトの名無しさん
08/02/28 17:23:59
PlaySound()なんていう便利なAPIがあるとか本気で思ってるの!?

25:デフォルトの名無しさん
08/02/28 17:39:49
>>20
g++ 4.0 では警告出たけどコンパイルできたよ。
もちろんリンクはできないけど。
定義するとリンクも通る。

26:デフォルトの名無しさん
08/02/28 17:45:11
>>24
ありがと。

27:デフォルトの名無しさん
08/02/28 18:45:23
すいませんお願いします。
passing `const cell' as `this' argument of
`double cell::cell_input(double)' discards qualifiers
というエラーが出ます。

問題の行は
IT->first.cell_input( OUTPUT*(IT->second) );
でITは
map<cell,double >::iterator IT;
です。
やりたいことはclass cellのオブジェクトA内のpublic関数から
別のオブジェクトB内のpublic関数にアクセスすることです。

28:デフォルトの名無しさん
08/02/28 18:53:14
>>27
map<cell,double >
のcellはconstで修飾されてる。
IT->first.cell_input・・・・
cell::cell_input(double);が非constメンバー関数なんじゃないの?


29:デフォルトの名無しさん
08/02/28 19:02:46
C++の質問です。
コンパイラはbccを使用しています。

別のcppファイルで定義した配列をexternしたいのですが、
"外部シンボルが未解決です"というリンクエラーがでます。

data.cpp
const char namber[5] = { 1, 2, 3, 4, 5 };

show.cpp
extern char namber[];

リンクエラーを解決する方法を教えて頂けないでしょうか?
よろしくお願いします。


30:デフォルトの名無しさん
08/02/28 19:05:53
>>28
ありがとうございます!
非constメンバー関数、で検索かけて調べてみます!

31:27
08/02/28 19:17:50
すいません。。
調べましたがmapに放り込んだ時点でconst cellになってしまうから
もし非constメンバ関数からconstメンバ関数に変えられない場合
私がやりたいことは出来ないということでしょうか?
cell_ouputは非constメンバ関数でありデータメンバを書き換えます。

32:デフォルトの名無しさん
08/02/28 19:23:26
>>31
残念ながらmapのキーはconstだからキーのオブジェクトは
変更できない。他の手段を考えたほうがいいかも。
とにかくcellはconstオブジェクトだから非constメンバー関数
は呼び出せない。

33:デフォルトの名無しさん
08/02/28 19:25:20
>>31
変更する部分をまとめてpimplにするとかはどうよ?


34:27
08/02/28 19:26:18
>>32
まいった。ありがとうございます。
無理やりmap<mutable cell,double >::iterator IT;
とか書いてみたけど無理っぽかったです。
他の手段か・・重ねてありがとう。

35:デフォルトの名無しさん
08/02/28 19:29:49
>>34
mutable使うならメンバーに
あまり好きではないけど

36:27
08/02/28 19:35:30
>>33
pimplちょっと調べてみたんですが難しくて・・覚えておきます、ありがとう。

>>35
メンバー関数の先頭にはmutable付けられなかったです。
変更されることになるデータメンバの先頭につけてみたけど変わらず・・。


37:デフォルトの名無しさん
08/02/28 19:40:31
>>36
mutableデータメンバはconstメンバ関数から変更できる

38:デフォルトの名無しさん
08/02/28 19:41:02
>>36
mutableを非staticなメンバーに指定すれば、constメンバー関数内で
変更できるはずだけど。

39:デフォルトの名無しさん
08/02/28 21:27:49
pair の vector コンテナじゃ駄目ですか><


40:デフォルトの名無しさん
08/02/28 21:41:36
前レス >944
すいません。前回ポインタの格納場所について質問したものですが
お礼を言うのを忘れていました。
ありがとうございます。

41:デフォルトの名無しさん
08/02/28 22:08:50
>>34
キーがconstなのは、キーでソートされるからであって、
mapに格納したまま書き換えたら順序を守れなくなる。
一旦mapから削除して、書き換え後に再度insertすべきでは?

42:sage
08/02/28 22:21:56
質問します。たったこれだけのコードが動きません。
ポインタのポインタを使ってみたのですが。教えてくだされ。

#include <stdio.h>
#include <string.h>

const char* string;
const char** address;
char str[1024];

void inputadd(const char* stradd){

address=&stradd;
}

void inputstr(void){

char teststr[]="abcdefghijklmn";
strcpy(str,teststr);
*address=str;
}

void main(void){

string=NULL;
inputadd(string);
inputstr();
printf(string);
}

43:デフォルトの名無しさん
08/02/28 22:24:24
>>42
address=&stradd; ←これがダメ
straddはinputadd内のローカル変数だ。
関数を抜けると無くなるので、addressはトンでもないところを指すことになる。

44:29
08/02/28 22:30:58
自己解決しました(。。)゛
分割コンパイルを行わないといけないのですね。

記述にばかり目を奪われておりましたが、
やっと問題点に気がつきました。

レスが無いのも納得がいきます。
それでは。


45:デフォルトの名無しさん
08/02/28 22:31:03
>>43
サンクス。ポインタは引数なら直でいけるという思い込みだったわ。
関数内で使っているものはポインタの値のコピーに過ぎないわけだな。
下みたいにして乗り切ったが正解でいいんだよな?

void inputadd(const char** stradd){

address=stradd;
}

46:デフォルトの名無しさん
08/02/28 22:39:56
初心者は、newやポインタを使わない方がいい
STL使えばすべて片付く

47:デフォルトの名無しさん
08/02/28 22:43:40
使わなければいつまで経っても初心者だ。
練習コードなんだから、なんでもやってみればいい。

>>45 OK

48:デフォルトの名無しさん
08/02/28 23:03:04
上級者もnewやポインタを使わない方がいい
使うのは、速度やサイズの気になる場面だけだ
それまで気になるならアセンブラにする

49:デフォルトの名無しさん
08/02/28 23:04:10
極論するとC言語は使わない方がいい

50:デフォルトの名無しさん
08/02/29 00:19:17
極論するとプログラミングなんかしない方がいい

51:デフォルトの名無しさん
08/02/29 00:47:12
速度が気になるんだったら、newを使うのはいけないと思うんだ。
少なくとも考えなしに使うのは。

52:デフォルトの名無しさん
08/02/29 01:12:20
boost::Pool

53:デフォルトの名無しさん
08/02/29 01:27:58
>>51
実測もせずに new を避けるのも良くない。

54:デフォルトの名無しさん
08/02/29 03:16:43
結局のところ重複はこっちでいいんかい?

55:デフォルトの名無しさん
08/02/29 06:28:30
>>53は受け売りでしゃべっているだけですから気にしないでください。


56:デフォルトの名無しさん
08/02/29 10:16:31
newのなにがいけないのだろうか?
動的にオブジェクトの生成をしたらだめ?

57:デフォルトの名無しさん
08/02/29 11:02:47
馬鹿?馬鹿なの?ねえ?

あえてだめっていう理由があるとしたらオーバーヘッドだろうか、ログ読んでないからなんともいえないが

58:27
08/02/29 11:39:19
>>37,38,39,41
昨日は急用で落ちてしまいました27です。
>mutableを非staticなメンバーに指定すれば、constメンバー関数内で
変更できるはずだけど。

を実践したところコンパイル通りました!
constとかややこしくて触らないようにしてたんですけど
これからちょこっと勉強してみようと思います
みなさんありがとうございました!!

59:デフォルトの名無しさん
08/02/29 12:10:15
基本的に動的確保は頻繁にやるべきではない
不安定になる

60:デフォルトの名無しさん
08/02/29 12:16:40
>>59
動的確保が悪いんじゃない。正しく扱わないプログラマが悪いんだ。

C++ なら、 new したらすぐ auto_ptr なりに突っ込んどくとか、
new [] したくなったら標準コンテナを使うとか、そういう正しい対処をしとけば
ミスもほとんど防げる。

原因も把握せずに「不安定になる」とか言ってプログラムの手段を
制限するのは得策じゃないね。

61:デフォルトの名無しさん
08/02/29 12:24:44
あらかじめ必要な領域を見積もって確保すべき

for(n=0;n<100000;n++)
str+="A";
などは解放確保を繰り返し良くない

62:デフォルトの名無しさん
08/02/29 12:29:33
reserve 使っておけばいいし

63:デフォルトの名無しさん
08/02/29 13:45:50
本業はWEBアプリ屋なんですが、必要に迫られてActiveXの開発することになったC++ド素人です。
環境はVS2008、作ろうとしてるモノはMFC ActiveXです。

内部で文字列の暗号化処理(Blowfish)をしたいのですが、以下のソースを書いてコンパイルも
一応通ったものの、案の定うまく動きません。

LPSTR lpszPassword; //パスワード
LPTSTR lpszInputStr;//暗号前文字列

//↑に値を適当にセットした上で↓

UCHAR digest[16];
MD5String(lpszPassword, digest);

CBlowFish bf;
bf.Initialize(digest, sizeof(digest));

unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr));

// エンコード
bf.Encode((unsigned char*)lpszInputStr, outBuf, sizeof(lpszInputStr));

printf("%S", outBuf)


よくわからなくて、ググりつつ適当に書いたソースなのでめちゃくちゃだと思います。
最終的には暗号化されたMD5ハッシュ値のような感じの文字列が出力されることを期待
していたのですが、バケバケな上入力値を変えても同じ値が返ってきますw
若干お手上げなので、皆さんのお知恵を拝借ください

64:63
08/02/29 13:49:43
ちなみに、BlowfishのソースはJim Congerさんが書いたのそのままです。
↓ここから持ってきました。
URLリンク(www.schneier.com)


65:デフォルトの名無しさん
08/02/29 13:56:07
waveファイルを再生しようと思い、playsound()というAPIがあるよ、と教えて貰ったので
調べてみたのですが、
VC++2005
#include <mmsystem.h> // PlaySound()のため
#pragma comment(lib,"winmm")

#define FILENAME "Windows XP Startup.wav"

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN: //再生
PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
return 0;
case WM_RBUTTONDOWN: //停止
PlaySound(NULL,NULL,0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
このようなサンプルを見つけたのでコンパイルしてみたのですが、
error C2065: 'CALLBACK' : 定義されていない識別子です。
error C2065: 'DRIVERPROC' : 定義されていない識別子です。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
なぜでしょうか?

66:デフォルトの名無しさん
08/02/29 13:57:41
>>65
#include <windows.h>

67:デフォルトの名無しさん
08/02/29 14:14:23
>>66
ありがとうございます。ですが、まだエラーが出てしまいます><
VC++2005
#include <windows.h>
#include <mmsystem.h> // PlaySound()のため
#pragma comment(lib,"winmm")

#define FILENAME "Windows XP Startup.wav"

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN: //再生
PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
return 0;
case WM_RBUTTONDOWN: //停止
PlaySound(NULL,NULL,0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [23]' から 'LPCWSTR' に変換できません

68:デフォルトの名無しさん
08/02/29 14:17:28
#define FILENAME TEXT("Windows XP Startup.wav")

69:デフォルトの名無しさん
08/02/29 14:28:38
>>68
ありがとうございます。&重ね重ねすいません。まだ駄目みたいです。
error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。

70:デフォルトの名無しさん
08/02/29 14:33:19
エラーメッセージでぐぐれ

71:デフォルトの名無しさん
08/02/29 14:33:42
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

main(){
PlaySound("C:\\WINDOWS\\system32\\oobe\\images\\clickerx.wav",
NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
Sleep(2000);
PlaySound(NULL,NULL,0);}

72:デフォルトの名無しさん
08/02/29 14:35:57
>>69
main関数がないのに動くわけないだろう

73:デフォルトの名無しさん
08/02/29 14:38:11
>>70
int main を追加する方法や システム>サブシステムをwindowにする方法
エントリポイントにMainを追加してみたりは試した上で質問はしました。。><

74:デフォルトの名無しさん
08/02/29 14:49:57
VCだよね?mainをこう書いてみたら?

int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev,
                LPTSTR lpCmd, int nCmd)
{
...
}

あとWindowProcを呼ばせるにはちゃんとウィンドウを作って、
メッセージ処理しないとだめだと思うぞ。

75:デフォルトの名無しさん
08/02/29 14:59:41
>>72
書き終わった直後に気付いて書いてみたのですが根本的な原因は別にあるようでした。
>>74
そうみたいです!。ありがとうございます。

>>71
これに、文字セットをマルチバイトにしてみたところ。うまくいったので、これをベースにして、考えているプログラムにしてみたいと思います。

みなさんお付き合い頂いてありがとうございました。

76:デフォルトの名無しさん
08/02/29 15:06:52
>>63
>unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr));

俺unix屋だから windows のこと詳しくないけど
lpszInputStr は LPTSTR だからポインタだと思うよ。
上のコードのしていることは文字列の分ではなく
ポインタのサイズの分をmallocで確保している。多分4バイトくらい。

まず文字列のバイト数を正しく求めることから始めないといけないんじゃないかな。
size_t size_of_in = sizeof(TCHAR) * (lstrlen(lpszInputStr)+1); // NUL 文字に+1文字分

あと outBuf には暗号化されたバイナリが入るだろうから
printf("%S") ではうまく表示されないと思うよ。バイナリで扱わないと。
他にも暗号化単位やバイトオーダーなども問題になるかもしれないよ。

77:63
08/02/29 16:02:41
>>76
ども、ありがとうございます。
PHPやASPな人間なもんで、厳密な型変換やったことないんでさっぱりです。
バイナリを文字列(1-9,a-z.A-Z)に戻すのは、どうすればいいんでしょうか。

78:デフォルトの名無しさん
08/02/29 16:04:03
newってそんなに遅いの?

79:デフォルトの名無しさん
08/02/29 16:08:03
その程度のオーバーヘッドも看過できないような状況では十分に「遅い」。

80:デフォルトの名無しさん
08/02/29 16:21:26
まぁ、何を作ってるか、によるよね。
趣味でLisp方言作ってたときは、operator new()を工夫しただけで全体の動作が3割速くなったし。

81:デフォルトの名無しさん
08/02/29 16:33:06
>>79
boost::Poolのほうが断然速かった。

82:デフォルトの名無しさん
08/02/29 17:23:19
>>78
メモリマネージャ次第じゃね?
Windowsに限ってもVCとBCBじゃnewでもメモリ確保の仕方違うし。

83:デフォルトの名無しさん
08/02/29 23:15:19
newを忌避しすぎるのも意味が無い。「まだ最適化するな」。

84:デフォルトの名無しさん
08/03/01 01:01:15
初期化方法おしえてください 全部通りません

vector<int> x={1,2,3};

vector<int> x(3,{1,2,3});

vector<int> x({1,2,3});

85:デフォルトの名無しさん
08/03/01 01:04:48
>>84
static int const initial_x = {1,2,3};
vector<int> x(&initial_x[0], &initial_x[3]);

86:85
08/03/01 01:05:36
ごめん。 [] が抜けてた。
static int const initial_x[] = {1,2,3};

87:デフォルトの名無しさん
08/03/01 01:08:49
そういうやり方しかないですか・・・そしたらint x[]={1,2,3}ですませます
すみません

88:デフォルトの名無しさん
08/03/01 01:16:29
#include <boost/assign/std/vector.hpp>
...
vector<int> v;
v += 3, 1, 4;

89:デフォルトの名無しさん
08/03/01 01:16:34
boost::assignとか

90:89
08/03/01 01:16:55
ごめんリロードしてなかった

91:デフォルトの名無しさん
08/03/01 01:21:24
vectorに関数追加する方法ありませんか?
x={1,2,3}の代入を可能にする関数です

92:デフォルトの名無しさん
08/03/01 01:23:37
配列数が8000ぐらいあるものでそれぞれが4つくらいのアイテムを持っている場合、
vectorやらmapやらを使いたいんですが、メモリ消費や処理速度的にどのようにしたらよいでしょうか?

ちなみに8000くらいあるほうは歯抜けで番号が記録されていてコール元から頻繁にアイテムを求めてきます。(ユニークキー)
4つくらいのアイテムの方は可変になってしまうのでそれぞれをvectorにしようかと思ったのですが、
消費メモリが大きくなりそうだったので悩んでいます。

93:デフォルトの名無しさん
08/03/01 01:23:45
>>91
継承すれば

94:デフォルトの名無しさん
08/03/01 01:24:00
ありません

95:デフォルトの名無しさん
08/03/01 01:35:05
>>92
「なりそう」で悩む前に素直に実装してみて、実際のメモリ消費量見てから考えるのがいいよ。

96:デフォルトの名無しさん
08/03/01 01:44:11
vec x(10, 10, 10, 0);
で初期値0の3次配列を定義できるようにするには、どう書けばいいですか?
int 型限定でよいです 4次や5次もしたいです

97:デフォルトの名無しさん
08/03/01 01:45:17
>91
無理。C++0x を待て。

98:デフォルトの名無しさん
08/03/01 01:46:56
>>95
ありがとうございます。
ちょっと試してみます。
業務で初めてC++使っているので勉強の毎日です。><

99:デフォルトの名無しさん
08/03/01 01:53:25
>>96
コンストラクタ多重定義しとけば。

100:デフォルトの名無しさん
08/03/01 01:56:57
このように書けば可変個の引数をとれますが、内部の型が一つに決まってしまって変更できません
どうすればいいですか?

class vec{
int x;
public:
vec(int n, ...){}
};

101:デフォルトの名無しさん
08/03/01 01:59:21
template使え

102:デフォルトの名無しさん
08/03/01 02:04:43
100次元でもできるようにするためには、テンプレートを再帰的につかうようにすれば
いいと思いますがわかりません どう書けばいいですか

103:デフォルトの名無しさん
08/03/01 02:09:53
まだこれいたのか

104:デフォルトの名無しさん
08/03/01 02:13:35
もう誰も触るなよ。

105:デフォルトの名無しさん
08/03/01 03:20:54
Cのcursesについてお教ください

printw("mojiretsu");

char buf[]="mojiretsu"
printw("%s",buf);

これで前者が表示され後者が表示されないのは何故なんでしょうか。

106:デフォルトの名無しさん
08/03/01 04:17:36
>>105
環境くらい書いた方が。
どちらのコードも問題はないと思う。
refreshはしている?
前者が表示されているってことなので大丈夫だとは思うけど。
お試しコードみたいに短いのを書いていて、
printw→refreshのあと、すぐにendwinとかしてたら表示が見えていない可能性あり。

107:105
08/03/01 04:36:50
OSはクノーピクスのDVD最新ver、コンパイラはgccです。

int main()
{
initscr();

move(5,1);
printw("mojiretsu");
refresh();

char buf[]="mojiretsu";
move(8,1);
printw("%s",buf);
refresh();
getch();

getchで止まった時に上のmojiretsuは表示されているのに下はされないという状態です。
最初はcygwinでやろうかと頑張ったのですが、cursesライブラリがどうやってもリンクできずクノーピクスを使うに至っています。

108:デフォルトの名無しさん
08/03/01 05:28:37
>>107
fedoracoreでは特に問題なく二つの行ともに表示された。
そのソースでcursesを使うプログラムとしては特に問題はないと思うけど、
くのーぴくすに入ってるライブラリのバグなのかな……
windows上でなら、cygwinのcursesでもいいと思うけど、
PDcursesを取ってきて自前でライブラリを自分の得意の環境でコンパイルする手もあるよ。
それならリンクのやりかたが分からないとかって問題もないと思う。

109:デフォルトの名無しさん
08/03/01 05:31:29
printw("mojiretsu");とprintw("%s",buf);の順番が逆の時はどう?

110:105
08/03/01 05:57:14
逆にした場合もprintw("mojiretsu");の側しか表示されません。
どうやら環境が問題のようなので108さんが紹介してくださった方法等試してみます。
ありがとうございました。

111:デフォルトの名無しさん
08/03/01 06:18:59
printwww

112:デフォルトの名無しさん
08/03/01 09:03:27
C++のdeleteについて質問させてください。
環境はWindowsXP VS2005EEです。

newしたポインタをdeleteすると、メモリの中身がfe ee fe eeとなります。
fe ee fe eeという値には何か意味があるのでしょうか?


113:デフォルトの名無しさん
08/03/01 10:36:51
>>112
メモリ管理の都合やらデバッグの都合やらで値を書き換えているのかも
しれない。ともかく、delete後のメモリなんて参照しちゃダメ。ぜった
いダメ。



114:デフォルトの名無しさん
08/03/01 13:27:17
>>113
もちろん、その値を何かに使ったりはしませんが
見るだけでも何かまずいことがおこるんですか?

115:デフォルトの名無しさん
08/03/01 14:00:51
ネットからダウンロードしたデータがシフトJISコードの場合char型のに入れると
文字化けしてしまってまともに処理できないんですが、ecuに変換すればいいんでしょうか?
できたらやり方かサンプルソース公開してくれてるサイト教えて欲しいです

116:デフォルトの名無しさん
08/03/01 14:05:12
間違えたecuじゃなくてEUC

117:デフォルトの名無しさん
08/03/01 14:23:31
GNUのlibiconvでも使えば?
GPLイヤンならIBMのICU

窓限定でいいのなら
URLリンク(forums.microsoft.com)

118:デフォルトの名無しさん
08/03/01 14:42:32
>>117
ありがとう。勘違いしてたEUC→SJISに変換だった
自力で関数作ってどうにかできました

119:デフォルトの名無しさん
08/03/01 14:43:11
>>114
起こらないかもしれないが、起こるかもしれない
まだOSにメモリを返してなければ大丈夫かもしれないが、
返しちゃってた場合はアクセス違反で落ちるかも
処理系の実装と運次第

120:デフォルトの名無しさん
08/03/01 15:22:17
>>114
動作未定義だから鼻から悪魔が出るかもしれんし、HDDが
フォーマットされるかもしれない。

121:デフォルトの名無しさん
08/03/01 16:32:42
VCで定数のアライメントってどうするん?
packじゃ出来なかったYO


122:デフォルトの名無しさん
08/03/01 16:47:33
定数のアライメント に一致する日本語のページ 約 件中 - 件目 ( 0.201466 秒)
定数のアライメント に該当するページは見つかりませんでした。

123:デフォルトの名無しさん
08/03/01 17:32:52
ifとswitchくらいしかまだ使ったことがないのですが、
条件分岐をする際 if を良く使います。ifの中にifその中にif って普通でしょうか?

124:デフォルトの名無しさん
08/03/01 17:48:13
普通

125:デフォルトの名無しさん
08/03/01 17:52:33
あまり深くすると後で読みづらくなったりする。個人的には5段とか行くと分割を考える。

126:デフォルトの名無しさん
08/03/01 18:14:46
C++で、doubleという名前の関数を作れるでしょうか?
void double(int a);
とかそんな感じ。今あるソースをみているんですが、コンパイルできなくて、
どうもそこでひっかかってるんじゃないかと。。できないとおもうんですが、
そう言いきってしまっていいですか?


127:デフォルトの名無しさん
08/03/01 18:25:21
doubleは予約語だから当然ダメ。Doubleならおk

128:デフォルトの名無しさん
08/03/01 18:32:13
>>127
ありがとうございます。

129:デフォルトの名無しさん
08/03/01 18:49:02
コンパイラや標準ライブラリベンダが使用する識別子について質問です

どうやら以下の条件を満たす識別子は使ってはいけないみたいですが
1 _で始まり、大文字が続く名前
2 __(アンダースコア2こ)を含む名前
3 グローバルスコープで _で始まる名前

ケースA int _Hoge;//ダメ(1に抵触)
ケースB int __hoge;//ダメ(2,3に抵触)
ケースC int hoge__hige;//ダメ(2に抵触)
ケースD int _hoge;//ダメ(3に抵触)
ケースE namespace foo{ _hoge;} //これはok?
ケースF class Hage{ int _hoge;} //これはok?

ケースEとFが合法なのかどうかわかりません

この辺を指摘(警告とか)してくれるコンパイラとかないんですかね


130:デフォルトの名無しさん
08/03/01 18:54:36
ないでしょうね、なにろ標準ライブラリが使っているわけですから・・・

しかし、初めてみたなそのルール。
_ __ が最初につく名前は駄目だというのは知ってたけど。
129 ルールでは E F は合法っぽいけどね自分の知っているルールでは非合法だ。

131:デフォルトの名無しさん
08/03/01 19:06:45
>>129
_ に小文字が続く識別子に関しては、
グローバルネームスペースでのみしか禁止されていない。

でも、マクロでは禁止されてた気がする。

132:デフォルトの名無しさん
08/03/01 19:20:17
マクロはnamespace関係ないからな。

133:デフォルトの名無しさん
08/03/01 19:44:45
__FILE__や__LINE__ってどのファイルに定義してあるのでしょうか??

134:デフォルトの名無しさん
08/03/01 19:49:30
大抵は字句解析器が置換する。

135:デフォルトの名無しさん
08/03/01 19:50:50
tryブロックでthrowされた例外がcatchされてcatch内で例外処理が成された後、
正常系はどこから復帰になるのでしょうか?

136:デフォルトの名無しさん
08/03/01 19:52:05
最後のcatch節の下

137:デフォルトの名無しさん
08/03/01 19:53:51
復帰しないよ?そのまま続く。
try{
A; //例外発生
B;
}catch( exception &e ){
C; //例外処理
}
D;

なら、正常は:A, B, D。
Aで例外時は:A, C, D。
もちろん、Cで例外が発生したり、throwしたりしたら別だけど。

138:デフォルトの名無しさん
08/03/01 19:58:13
Win32APIのWindowsアプリケーション開発環境を作るためにPlatform SDKを
インストールしたのですが、corewin_express.vspropsのデータの修正が出来
なくて困っています。 どうしたら、修正する事が出来るようになるのでしょうか?

ちなみに、OSはvistです。


139:デフォルトの名無しさん
08/03/01 20:01:49
visual stdio2008のexpressいれとけ

140:デフォルトの名無しさん
08/03/01 20:13:48
>>134
ありがとうございます。

141:デフォルトの名無しさん
08/03/01 20:34:52
>>136-137
ありがとうございます
tryブロックの範囲の選定も気をつけないといけないようですね

またまた質問なんですが

std::exceptionを継承してMyExceptionクラスを作ってそこに、例外発生時のログ取り機能を追加しました
不正な引数を取ってしまったときinvalid_argumentのような例外クラスを投げたいのですが

多重継承は色々ややこしいのでMyExceptionから派生させて相当の自作クラスを投げる
やっぱりMyExceptionとinvalid_argumentの多重継承を行う

どちらがよいのでしょうか?


142:デフォルトの名無しさん
08/03/01 20:39:40
ログ取り機能を例外クラスから分離した方がいいと思う。

143:デフォルトの名無しさん
08/03/01 20:41:52
MyExceptionからログ鳥部分を分離して、派生のない
ExceptionLogクラスを作り、std::invalid_argumentと
派生した例外を投げる、みたいな。

144:デフォルトの名無しさん
08/03/01 22:02:07
>>142-143
必要な標準例外クラスから派生したmy標準例外クラスを作って
そのクラスにログ取り機能クラスを保有させたほうがいい

ということですよね?
そのほうが系統だった例外クラスの構造になるのでしょうか?

145:138
08/03/01 22:11:41
2005で作りたいのですが、いい方法はありませんか?
どこかの設定をいじると書き込み可能になったりとかないんでしょうか・・・。

146:デフォルトの名無しさん
08/03/01 22:12:05
1クラスに2つ以上の機能を入れるのは一般によくないとされている

147:デフォルトの名無しさん
08/03/01 22:23:16
とりあえずロガークラスを作るのは確定としても、
以降をどう実装するかは結構悩みどころだな。

個人的には throw をマクロ LOG_THROW みたいなので置き換えて、
その中で例外を投げる前にログを取るようにするのがいいと思う。

マクロは使わずに済むなら使わないのが一番いいんだけど、
デバッグ時に __FILE__, __LINE__ を利用したり、
文字列化演算子を使って移植性の高い方法でクラス名を表示したりできるから、
ログ取りには便利だと思う。

148:デフォルトの名無しさん
08/03/01 23:38:52
質問です。
ヘッダをインクルードせずに
class Cls* pCls;
と書くのはOKなんですけど

namespaceで括られた場合に
class Name::Cls* pCls;
と書くと'Namne' : 識別子がクラス名でも名前空間名でもありません。
とエラーが出ます。

インクルードせずに宣言する方法ってあります?






149:デフォルトの名無しさん
08/03/01 23:45:13
>>148
こうかな
namespace Name{
 class Cls;
}
Name::Cls *pCls;

150:デフォルトの名無しさん
08/03/02 00:06:39
ところで標準例外std::exceptionの中身ってどうなってるんだろう?

151:デフォルトの名無しさん
08/03/02 00:12:35
CLASS x={1,2,3,4,5,6};
はどのようにかけばジツゲンできますでしょうか

152:デフォルトの名無しさん
08/03/02 00:14:58
boost::arrayでも見れば?

153:デフォルトの名無しさん
08/03/02 00:26:06
>>150
実装依存としか。

154:デフォルトの名無しさん
08/03/02 00:27:31
>>152
要するにあれは構造体の初期化だよね。
コンストラクタが無ければクラスだろうが
あのタイプの初期化ができることを利用しているという。

155:デフォルトの名無しさん
08/03/02 00:44:18
boost::arrayは {{ }} で囲わないとダメだろう。

156:148
08/03/02 00:49:28
>>149
無事宣言することが出来ました。
ありがとうございます。

お礼にオプーナを買う権利をあげます。

157:デフォルトの名無しさん
08/03/02 01:11:03
「↓」を表示後、キー入力があるまで処理を一時停止させ、
キー入力があればそれに対応した動きをさせたいのですがどうすれば良いでしょうか?
getch()だと入力待ちカーソルが邪魔になってしまい、困ってます

158:デフォルトの名無しさん
08/03/02 01:11:07
>>155
いや、必要ではない。

159:デフォルトの名無しさん
08/03/02 01:13:39
>>157
別スレで環境依存だといわれたろ?
なぜ環境を書かない

160:157
08/03/02 01:17:19
すみません、vidual studio2005のC++です

161:デフォルトの名無しさん
08/03/02 02:15:30
>>147
実装方法ですか。
マクロを使うというとこういう感じになるのでしょうか?

ErrorLogger(char* filename, int linenumber, const char* errmsg)
のようなロガークラスを用意して、
コンストラクタ内でエラー内容を記録させてしまうようにしておいて

#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg);\
throw exeption_type\

というようなマクロを組めばよいのでしょうか?

というか、初めてマクロを組んだのであってるかどうかも判りませんorz

162:デフォルトの名無しさん
08/03/02 02:55:52
>>161
自己レスながらマクロ修正してみた

#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg); \
exception_type e;\
throw e\

これでだいじょうぶですかね?

163:デフォルトの名無しさん
08/03/02 02:58:56
>>161-162
ErrorLogger をクラスにする意味がわからない。関数でいいだろ。
例外オブジェクトにデフォルトコンストラクタしか使えないのは無駄な制限。
マクロ名は動作を表すように LOG_AND_THROW() とかにしたほうがよくない?
あと、最後の \ が余計。

164:デフォルトの名無しさん
08/03/02 03:00:12
inline関数でいいじゃまいか。何故define・・・しかもTHROWはないなw

165:デフォルトの名無しさん
08/03/02 03:03:37
>>164
__FILE__, __LINE__ は inline 関数だとマズイだろ。

166:デフォルトの名無しさん
08/03/02 11:18:51
#define LOG_THROW(type) \
 do { \
  :LogAndThrow(#type, __FILE__, __LINE__); \
  throw type(); \
 } while(false)

void LogAndThrow

167:デフォルトの名無しさん
08/03/02 11:19:13
途中で送ってしまった・・・。

168:デフォルトの名無しさん
08/03/02 11:26:43
#ifdef NDEBUG
#define LOG_THROW(type) \
 do { \
  LogAndThrow(#type); \
  throw type(); \
 } while(false)

void LogAndThrow(const char* type_name)
{
 ErrorLogger log;
 // ここでログをとる
}
#else
#define LOG_THROW(type) \
 do { \
  LogAndThrow(#type, __FILE__, __LINE__); \
  throw type(); \
 } while(false)

void LogAndThrow(const char* type_name, const char* file_name, int line)
{
 ErrorLogger log;
 // ここでログをとる
}
#endif

こんな感じ。
実際には関数の実装は .cpp 側に書くわけだけど。

THROW という名前は何かと使われている恐れがあるので止めた方がいい。
LOG_THROW って名前も、実際には何か接頭辞を付けた方がいいと思う。

169:デフォルトの名無しさん
08/03/02 11:30:39
しまった。ログとるだけにしたから LogAndThrow じゃなくて LogError だな。

170:デフォルトの名無しさん
08/03/02 11:31:38
もちつけ

171:デフォルトの名無しさん
08/03/02 13:09:31
ifstreamで読込みをしているとき、改行を読み込んだことを知るにはどうすればよいですか?


172:デフォルトの名無しさん
08/03/02 13:10:28
読み込んだ内容が改行を含むかどうかチェック。

1行ずつ読み込みたければ getline が使える。

173:デフォルトの名無しさん
08/03/02 13:16:15
>>172
int a;
ifs >> a;
みたいにやってるんですが、
> 読み込んだ内容が改行を含むかどうかチェック。
はどうやればいいですか


174:デフォルトの名無しさん
08/03/02 13:18:17
ああ、そういうことか・・・。
それは無理じゃないかな。

175:デフォルトの名無しさん
08/03/02 13:20:54
>>174
じゃあ、一行ずつ読みたいなら、getline()でやるしかないですか?


176:デフォルトの名無しさん
08/03/02 13:25:32
以下のようなとき、
子クラスのオブジェクトから、func(1)を実行すると、
func(const char* ch)を呼んでしまうのですが、
親クラスのfunc(int i)を呼ぶにはどうすればいいのでしょうか?

/*****こんな感じ*****/
class Parent{
public: void func(int i);
};
class Child : public Parent{
public: void func(const char* ch);
};
/*******************/

177:デフォルトの名無しさん
08/03/02 13:29:35
>>175
そうなる。
getline した後 istringstream に渡してやるとか。

178:デフォルトの名無しさん
08/03/02 13:39:57
>>176
Child ch;
ch.Parent::func(1);

179:デフォルトの名無しさん
08/03/02 13:47:37
>176
子クラス Child の func() によって親クラス Parent の func() が隠蔽されている。普通にオーバーロードしたいなら
class Child : public Parent {
public:
  using Parent::func;
  void func(const char* ch);
};
とすることで Parent での func() も見えるようになる。

180:176
08/03/02 14:07:51
>>178
>>179
ありがとうございます。

181:デフォルトの名無しさん
08/03/02 14:27:55
namespace temp
{
class Test
{
private:
std::ostringstream oss;
public :
~Test() {std::cout << oss.str();}

template <typename T>
friend Test &operator <<(Test &, T t);
};
}

template<typename T>
temp::Test &operator<< (temp::Test& test, T t)
{
test.oss << t;
return test;
}

を、temp::Test() << 2;
と使うと、「operator << が曖昧です」というコンパイルエラーになります。
名前空間を使わないとコンパイルできるのですが、何が問題なのでしょうか

Win2k、VC2005です

182:デフォルトの名無しさん
08/03/02 14:32:37
<< の実装部も temp 名前空間に入れないと。
temp::Test 内で宣言してる friend 関数は temp 名前空間内に入る。
だから、今は temp::operator<< と operator<< の2つがある状態。

183:デフォルトの名無しさん
08/03/02 14:37:08
>>182
なるほど、ありがとうございました!

184:デフォルトの名無しさん
08/03/02 14:39:32
あるいは friend のところを ::operator<< にするかだけど、
temp 名前空間内に入れた方がいいと思う。

185:デフォルトの名無しさん
08/03/02 14:50:17
コマンド等文字列処理で2重のループから抜けるときに
goto文使うのって邪道かな?

いつも使ってるんだが。

186:デフォルトの名無しさん
08/03/02 14:50:54
2重ループから抜ける際に goto を使うのは常套手段

187:デフォルトの名無しさん
08/03/02 15:17:28
俺、今まで一度も使ったことが無い。
使いたい衝動に駆られたことはある。

188:デフォルトの名無しさん
08/03/02 15:19:02
小さい関数内なら結構goto使っちゃうなぁ

189:デフォルトの名無しさん
08/03/02 15:23:44
常套手段ではあるけど、
2重ループから抜ける必要があること自体があまりないよね。

190:デフォルトの名無しさん
08/03/02 15:24:49
まあ関数は一目でざっと目通せる程度にするもんだしちゃんと考えて使うならぜんぜんいいと思う

191:デフォルトの名無しさん
08/03/02 15:36:50
ポインタを解放した後、安全のためNULLを入れると書いてたんですが、
NULLを入れると何が安全なのでしょうか?

192:デフォルトの名無しさん
08/03/02 15:38:35
解放されているかどうかを NULL チェックで確認できる。

193:デフォルトの名無しさん
08/03/02 15:39:18
二重にdeleteすることが無くなる(delete(NULL)は安全なことが保障されている)

194:デフォルトの名無しさん
08/03/02 15:40:13
NULL なら間違って解放後にアクセスした際にエラーになってくれる環境が多い。
NULL じゃない場合は偶然アクセスできるかもしれないが、
メモリ領域を壊したり変な値を取得したりしてしまう。

195:デフォルトの名無しさん
08/03/02 15:41:42
無限ループでポインタインクリメントでもしながら片っ端から表示してみれば良いわけない

196:デフォルトの名無しさん
08/03/02 15:49:10
すみません

keybd_eventみたいに
プログラムからキーボードを押したことにするのは
gccだと何か方法がありますか・・・?

197:デフォルトの名無しさん
08/03/02 16:12:32
>196
keybd_event は Windows API。gcc はいろんな環境向けがあるコンパイラ。
例えば Windows 上で gcc を使っているなら keybd_event になるわけだしやりたいことをもっと正確に書こう。

198:デフォルトの名無しさん
08/03/02 17:26:18
初心者です。

デフォルトコンストラクタっていうのは、
1.引数なしで呼ばれるコンストラクタ
2.なにも記述してなくてもデフォルトで呼ばれるコンストラクタ
のいったいどっちのことなのですか?

1と2の違いは、例えば、引数なしのコンストラクタを
自分で定義したときに、それをデフォルトコンストラクタと
いうかどうかという違いになると思うのですが、、、
1と2の説明ともWEB上で見かけますが、
どちらがより正確なのでしょうか?

199:デフォルトの名無しさん
08/03/02 17:29:15
引数無しで呼ばれるコンストラクタ。
自分で定義しようがデフォルトコンストラクタ。

200:デフォルトの名無しさん
08/03/02 17:34:41
>>198
引数なしで呼ばれるというよりは引数なしで呼ぶことが可能なと
いったほうがいいかもな。デフォルト引数もあるから。

class Widget {
public:
Widget(int i = 0) {}
};

      //例えば
Widget w; //このsyntaxがデフォルトコンストラクタを要求する。
      //Widget::Widget(0)が呼ばれる。


201:198
08/03/02 17:35:37
>>199
ありがとうございます。
すっきりしました。


202:198
08/03/02 17:37:25
>>200
おっと行き違いになりました。
そうですか、
それもデフォルトコンストラクタなんですね。
ありがとうございました。

203:196
08/03/02 18:15:40
>197
すみませんでした
OSはDebianでPDFかパワポのようなものを
C言語で操作したいのです

具体的には下キーかEnterキーをC言語で押したことにして
スライドを進めることを行いたいです

204:191
08/03/02 19:36:37
>>192
>>193
>>194
ありがとうございます。
具体的によく分かりました。


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

5148日前に更新/245 KB
担当:undef