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
ありがとうございます。
具体的によく分かりました。
205:デフォルトの名無しさん
08/03/02 21:56:29
c言語で聞きたいことが1からたくさんあるので、何方かmsnメッセで教えてくれませんか?
kamisama6@hotmail.co.jp までお願いします!
206:デフォルトの名無しさん
08/03/02 22:02:14
>>205
C言語の個人講習をして欲しい訳だな?しかも無料で!
そんな奇特な人は少ないが候補として
C言語を覚えたてで自分のために他人に説明する人がいるが
そんな人を探すくらいなら良書を買ったほうがいくぶんかマシ
C言語をマスターしていながら教えてくれる人がいるとしたら
リタイヤした人くらいだろうな
207:デフォルトの名無しさん
08/03/02 22:08:50
string tmp;
cin >> tmp;
としたとき、改行だけが押されたことを知るにはどうすればいいですか?
208:デフォルトの名無しさん
08/03/02 22:16:47
>>207
フォーマット入力はデフォルトでは空白類記号は読み込まれない。
209:デフォルトの名無しさん
08/03/02 23:29:59
gcc をつかった
分割コンパイルの仕方がわからないのですが
わかりやすく解説したページはないでしょうか?
210:デフォルトの名無しさん
08/03/02 23:33:01
gcc -c hoge1.c
gcc -c hoge2.c
gcc -c hoge3.c
gcc -c hoge4.c
gcc -o hoge hoge1.o hoge2.o hoge3.o hoge4.o
211:デフォルトの名無しさん
08/03/02 23:55:20
>>209
Makefileでググれば、良いと思う。
212:デフォルトの名無しさん
08/03/03 00:35:02
namespace Name
{
class Cls;
}
213:デフォルトの名無しさん
08/03/03 00:48:48
丸一日前のレスにレスか
214:デフォルトの名無しさん
08/03/03 00:52:06
Makefileとbjamとどっちがいい?
やっぱ標準であるmakeは一通りやっとくべきかな?
215:デフォルトの名無しさん
08/03/03 01:14:07
>>208
ありがとうございます。一応自分で書いてみましたが、まだうまく動きません。
noskipwsをした後、おかしくなります。
どうかよろしくお願いします。
std::string filename = "default_file.txt";
while (1) {
std::string tmp;
cout << "Input file name : (hit return to default: " << filename << ") ";
cin >> std::noskipws >> tmp; // 下の(1)でY以外で答えたとき、ここで入力を受け付けてくれない。
if (tmp.empty()) {
// リターンキーだけが押された場合に、ここのIF文に入る
tmp = filename;
}
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin >> std::skipws;
cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
cin >> ans; // (1)
if (ans == "Y") {
filename = tmp;
break;
}
}
216:デフォルトの名無しさん
08/03/03 02:22:41
stdlib.hの中で_CRT_DOUBLE_DECと_LDSUPPORTを定義してないとき_CRT_DOUBLE、_CRT_FLOATといった構造体を用意してるようですが、
_CRT_DOUBLE_DECと_LDSUPPORTとこの2つに囲まれた構造体などは何のために用意してるんですか?
217:デフォルトの名無しさん
08/03/03 02:31:37
>>215
改行は読み込まないからgetlineがいい。
std::string filename = "default_file.txt";
while (1) {
std::string tmp;
std::cout << "Input file name : (hit return to default: " << filename << ") ";
std::getline(std::cin, tmp);
if (tmp.empty()) {
tmp = filename;
}
std::cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
std::getline(std::cin, ans);
if (ans == "Y") {
filename = tmp;
break;
}
}
218:デフォルトの名無しさん
08/03/03 02:43:47
C++ってどういう業界の人がつかってるの?
GUIでMFCやVCL、Qtさわるくらいはあるが、
ゲーム以外でフルスクラッチで書き上げる人たちって
どういう人?
219:デフォルトの名無しさん
08/03/03 02:44:13
趣味
220:デフォルトの名無しさん
08/03/03 03:24:20
やっぱそうか。
抽象化なんて考えてる暇あったら別の仕事が
飛んでくるもんね。
221:デフォルトの名無しさん
08/03/03 03:25:01
最近C#なんか使う企業もねえ
222:デフォルトの名無しさん
08/03/03 03:50:36
つまりCωの時代がやってくると。
223:デフォルトの名無しさん
08/03/03 03:57:12
時代はwebアプリか・・・
224:デフォルトの名無しさん
08/03/03 03:58:37
業務ソフトなら実際C#とか.NETでもなんら問題なくなってきてるご時世だもの
225:デフォルトの名無しさん
08/03/03 03:59:03
俺は金融関係だけど、C++使ってるよ。
matlabを使うとこも多いけど。
226:デフォルトの名無しさん
08/03/03 04:00:20
自動車関係企業のシステム部門ってC/C++使うのかなぁ
227:デフォルトの名無しさん
08/03/03 04:01:14
いかにも使いそうじゃないか
228:デフォルトの名無しさん
08/03/03 04:05:58
>>226
COBOLとか使うと思うんだ、経験則
229:デフォルトの名無しさん
08/03/03 04:51:56
昨日から色々質問させてもらっているものです。
色々分かってきたのですが、getlineとcinとの併用のときにどう書くべきかわかりません。
#include <iostream>
using namespace std;
int main()
{
int a;
string s;
cout << "int: ";
cin >> a;
// cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "string: ";
getline(cin, s);
cout << "int: ";
cin >> a;
return 0;
}
上記のソースでコメントアウトしている箇所がありますが、コメントアウトしたままだと、
真ん中のstringの入力が、1つめのintの入力の改行を拾ってしまうせいで、とばされてしまいます。
そこで質問なのですが、ここにコメントアウトされている行をいれるのは正しいですか?
230:デフォルトの名無しさん
08/03/03 05:00:45
>>229
コメントアウトした行を入れてもだめ。
cin >> a; で改行文字がバッファに残るため、それが次のgetlineで
読み取られてしまう。Cで言う所のscanf()とgets()を混在させた問題と同じ。
解決策はgetline(cin, s); をもう一つ付け足して改行文字を読み飛ばす。
もしくはgetline()に統一する。
231:デフォルトの名無しさん
08/03/03 05:37:29
今の所COBOL、PL/I、Java、JS、Access、Rubyを見たことがある
232:デフォルトの名無しさん
08/03/03 05:42:58
>>225
金融っていってもmatlab使ってるようなところは
複雑な数値計算やってるだろうからちょっと特殊だな。
車でもカーナビのように限られたリソースでGUI作るようなところは
使ってるだろうが、間違っても制御には使わんと思うんだが。
233:デフォルトの名無しさん
08/03/03 05:53:38
>>230
ありがとうございます。
getline()とcinを混在させないのが一番いいと。でも、cinが便利なので、
基本的にはcinを使いつつ、cinだと改行を扱うのが不便なのでその時だけgetline()を
使う、という風になりそうです。(自分としては)
すると、
(1)getline()する前にバッファに改行が残っているか確認して、残っていれば消す。
(2)cinした後には改行を消しておく。
のどっちかになると思うのですが、今回は(1)の方法が分からなかったので、(2)で実装しました。
どっちにしても、cin関係はなんか使いにくい感じ。
234:デフォルトの名無しさん
08/03/03 06:03:00
linux のmmapのこと調べてて疑問に思ったので質問。
mmap でファイルを仮想メモリにマッピングしたとき、OSがファイル上のデータを
ブロック転送する、アプリがその領域に書き込むとOSがファイルにそれを反映すると
書いてあった。
mmapでマップされた領域に上のあるアドレスに代入したとき、
OSは代入されたことを知っているの?
代入演算子で値を放り込むことと、read write のシステムコールを使うのは
根本的に違いますよね?
235:デフォルトの名無しさん
08/03/03 06:03:27
>>218
GEANTは4からC++だよ!
236:デフォルトの名無しさん
08/03/03 06:09:53
>>234
C/C++の問題じゃないと思う
多分OSがマッピングした領域は書き込み不可の属性が付いており
書き込んだらCPUに割り込みがかかってそれを利用してファイルに反映してるか
そんな所だと思う
237:デフォルトの名無しさん
08/03/03 06:14:44
>>236
失礼しました。
環境に依存する内容は避けたほうがよいですね。
238:デフォルトの名無しさん
08/03/03 06:52:21
>>237
環境依存OKのスレだから問題ないんだけどC/C++よりも
linuxの話になるね
ちなみにWindowsの仮想メモリとメモリマップトファイルも似たような
機構で実現している
239:デフォルトの名無しさん
08/03/03 07:59:34
複数ある単語から文字列中最初にマッチする物を探す用途で、
こんなのを考えてみたのですが、こういう2分木辞書ってなんて
名前になるんでしょうか?
サフィックスツリー?(これよりもっと複雑なようですが)
typedef std::map<char, Node> Tree;
//char に単語の1文字が入る
struct Node {
Node *pChild; //次の文字ノード
int No; //登録番号、兼、非末端(-1)
}
単語がab,ba,ac,abcとあるなら、子ノードの繋がりが下記のようになる。
先頭 <a,-1> <b,-1>
/ \ /
<b,0> <c,3> <a,1>
/
<c,3>
240:デフォルトの名無しさん
08/03/03 08:01:07
訂正
struct Node {
Tree *pChild;
int No;
}
241:デフォルトの名無しさん
08/03/03 09:10:06
&ClassName::memberVarName;
って演算はいったい何を行っているのでしょうか?
最初オフセット値を得ているのかと思ったんですが、ためしに出力しても、1が出力
されるだけです。
元ソースでは、これを引数にしてメンバ変数のオフセット値を得ているようですが…
242:デフォルトの名無しさん
08/03/03 09:11:38
>>241
メンバポインタでぐぐれ
243:デフォルトの名無しさん
08/03/03 09:27:45
>>242
ありがとうございます。おかげで理解できました。
メンバポインタからオフセット値を得るには、
&( static_cast<A*>(0)->*memPtr )
で仕様上問題ないでしょうか?
244:デフォルトの名無しさん
08/03/03 09:35:43
単にオフセットが欲しいんなら offsetof を使えばいい
245:デフォルトの名無しさん
08/03/03 11:13:30
>>243
実際には動くだろうけど、仕様上は良くないような
ちゃんとインスタンスを用意した方がいいんじゃない
246:デフォルトの名無しさん
08/03/03 11:30:26
>>243
オフセットは POD 型に対しての offsetof でしか取れないよ。
素直にメンバポインタ通して参照しちゃダメなの?
247:デフォルトの名無しさん
08/03/03 12:07:59
>>229
仕様上正しい。
以下はJosuttis本の記述の要約。
istream& istream::ignore(streamsize count, int delim)
This form ignores up to count characters until delim is extracted and discarded.
(ストリームから改行まで抽出されて捨てられる。)
ちなみにg++ 4.0では無問題だった。
248:デフォルトの名無しさん
08/03/03 12:50:21
>>239
トライ木じゃねえの
249:デフォルトの名無しさん
08/03/03 15:03:37
>>236
割り込みなんかかからない。
ページング機構を備えるどんなプロセッサでも(俺の知る限り)
プロセッサ自体に、書き込まれたかどうかのフラグ
(いわゆる、dirty bit と呼ばれるもの)をセットする機構がある。
例えばx86ならば、ページテーブルの該当ページを示すエントリ内にこれがある。
で、ファイルから読み込んだときにOSがこのフラグをリセットしておき
OSは、ページが不要になった時やsync要求が来たときにこのフラグを確認して
書き戻すか破棄するかを決定する。
250:デフォルトの名無しさん
08/03/03 15:09:16
>>248
それみたいですね。
すっきりしました、感謝。
251:デフォルトの名無しさん
08/03/03 16:48:21
>>245,246
仕様上ダメですか…違う方法を模索することにします。
252:デフォルトの名無しさん
08/03/03 20:58:31
>>249
すみません。
read write のようなシステムコールを実行するとOSデバイスドライバが
あとは処理してくれますよね?
代入演算子を使ってmmapした領域に書き込むとき、
そのフラグもセットするようにgccが実行ファイルを生成してくれるのでしょうか?
でもそれだと操作するアドレスがどこなのかをプログラムソースには書かなくても実行ファイルの中では
毎回見ているということでよろしいのでしょうか?
253:デフォルトの名無しさん
08/03/03 21:15:49
dirty bitを立てるのは249に書いてあるとおりCPUの仕事。
特にコンパイラがすることはない。
254:デフォルトの名無しさん
08/03/03 21:47:57
仮想記憶でぐぐればいいと思うよ。
255:デフォルトの名無しさん
08/03/03 21:51:42
ちなみに、少し前のLinuxカーネルのバグは
この複数からの同一ページへのアクセス時に
このフラグをうまく処理しなかったかららしい。
また、少し違うが
phenomのバグはキャッシュに対するdirty bitの反映が
高負荷時に滞るというものらしい。
256:デフォルトの名無しさん
08/03/03 22:03:13
もう少し補足すると、
普通のページング可能なプロセッサは、
TLBと呼ばれる、ページテーブルのキャッシュを内部に持っている。
(x86以外では呼び方が違うかもしれない)
したがって、該当ページへの書き込みがある度に
毎回物理メモリ上のページテーブルに書き込んだりはしない。
(TLB内の情報と変更があった場合のみ、書き込む)
で、このTLBの内容を書き戻すときにまずキャッシュに書き込むわけだけど
これがうまくいかない場合がある、というのがphenomのバグらしい。
L1とL2の関係もあるとかどっかで読んだが詳しくは覚えてない。
257:デフォルトの名無しさん
08/03/03 22:37:05
enumってプリプロセッサが解釈するのでしょうか??
258:デフォルトの名無しさん
08/03/03 22:41:16
いいえ。コンパイラたんがせっせこお仕事します。
259:デフォルトの名無しさん
08/03/03 22:41:58
>>258
サンクスでちゅ。
260:デフォルトの名無しさん
08/03/03 22:51:12
>>253
ありがとう。
CPUのやるとことまで押さえるのは難しいな。
もちろん仮想記憶で調べたりもしてるんですが、
なかなか自分の知りたいところのたどり着けない。
使い方はソースも含めて載ってたりするんだが。
261:デフォルトの名無しさん
08/03/04 00:31:23
>>260
そういうCPUまわりのことを色々知りたいなら、
URLリンク(www.intel.co.jp)
ここにあるIA-32なんとかなんとか下巻:システム・プログラミング・ガイドが参考になるかも
262:デフォルトの名無しさん
08/03/04 01:00:20
ちょっとお聞きしたいのですが
stringクラスの関数でcompareというのがありますが、参考書によると
int compare(const string& str) const;
のように定義されているとあります。
この定義のconst string& の&ってどういう意味の&なんでしょうか?
最後のconstも、なぜここにconstがあるのか分かりません。
また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
263:デフォルトの名無しさん
08/03/04 01:15:09
>>262
C++をもちっと勉強するといいよん。
&は参照。C++で導入された機能。参照についてはぐぐるよろし。
constは簡単に言うと「この関数はメンバ変数を変更しません」って宣言。
compare関数を呼ぶことで元の文字列を弄られちゃ話にならんだろ?
264:デフォルトの名無しさん
08/03/04 01:15:17
たぶん、これからも山ほど疑問が出てくるだろうから
入門書を読んだほうが早いと思う。
265:デフォルトの名無しさん
08/03/04 01:16:31
あと定義はstring.hではなくてstringの中だ。
string.hはCのヘッダーだからそりゃないだろうね。
266:デフォルトの名無しさん
08/03/04 01:19:45
>>262
> ちょっとお聞きしたいのですが
> stringクラスの関数でcompareというのがありますが、参考書によると
>
> int compare(const string& str) const;
>
> のように定義されているとあります。
> この定義のconst string& の&ってどういう意味の&なんでしょうか?
> 最後のconstも、なぜここにconstがあるのか分かりません。
>
> また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
> 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
例えばcompare(const string str)だとすると引数にstd::string型のオブジェを入れると
std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
compare(const string& str) とする理由は引数に参照を取る事となり
コピーが働かないので無駄なメモリの消費がなくなる。
最後のconstはメンバ関数を呼び出したオブジェクトを修正できないようにすることです
267:252
08/03/04 01:45:56
レスくださった方々ありがとうございます。
>std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
>compare(const string& str) とする理由は引数に参照を取る事となり
>コピーが働かないので無駄なメモリの消費がなくなる。
なるほど!勉強になります。
あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。
268:デフォルトの名無しさん
08/03/04 01:54:48
>>267
更にstringからインクルードしている先にあるんじゃないか?
例えばcygwinのgccだと/lib/gcc/i686-cygwin/3.4.4/include/c++/bits/basic_string.hにある。
269:デフォルトの名無しさん
08/03/04 02:19:09
>>262
VSならソースコード中に#include <string>として
stringの所にカーソルあわせて右クリックでstringを開くを選択すれば
中身は見れるよ
270:デフォルトの名無しさん
08/03/04 04:14:40
適当なcompareのとこで右クリック→定義を参照すれば、basic_string::compare()かなにか出ると思うよ
271:デフォルトの名無しさん
08/03/04 04:15:02
あ、VSの話ね
272:デフォルトの名無しさん
08/03/04 04:30:57
たまにはBCBとかのことも思い出してね
273:デフォルトの名無しさん
08/03/04 08:34:19
grepくらい使えよ(´・ω・`)
274:デフォルトの名無しさん
08/03/04 08:37:41
findも使えよと混ぜ返したらDOSのfind.exeと誤解される罠。
275:デフォルトの名無しさん
08/03/04 08:46:55
プリプロセッサだけ通したモノにエディタで検索かけるのはダメですか…?
276:デフォルトの名無しさん
08/03/04 09:40:08
vector型で
vector<int> num;
num[i*j]=a;
見たいなことしたいのですが
どうやるのでしょうか
277:デフォルトの名無しさん
08/03/04 09:48:22
templateで、特定の型以外が渡された場合にエラーなり
分岐なりする方法ってあるんでしょうか?
たとえば
template<class T>
class Hoge {
void Fuga(T &ref) {
//ここで渡された型を知りたい
};
}
C++だと無理?
278:デフォルトの名無しさん
08/03/04 10:01:47
クラスAからそれぞれ派生したクラスB系統とクラスC系統のクラスがあるのですが
Aのポインタ*pがどちらの系統か判別する方法はありますか?
RTTIだとpの中身は分かるけどどういう系統までは追えないようですが良い方法はありますか?
279:デフォルトの名無しさん
08/03/04 10:04:16
意味が良くわからんかったけどメンバに識別子でもいれればいいんじゃない
280:デフォルトの名無しさん
08/03/04 10:07:13
>>277
テンプレートの特殊化の話かな
281:デフォルトの名無しさん
08/03/04 10:08:10
>>278
dynamic_cast
282:デフォルトの名無しさん
08/03/04 10:08:45
>>279
デコレータパターンのConcreteComponentの型を判別する方法はないかな、ということです
283:デフォルトの名無しさん
08/03/04 10:10:30
>>278
dynamic_castはダウンキャストに失敗すると0を返す。
284:デフォルトの名無しさん
08/03/04 10:14:25
>>282
それ、パターンの使い方っていうか、設計ができてないんじゃないの?
URLリンク(ja.wikipedia.org)
285:デフォルトの名無しさん
08/03/04 10:19:42
>>276
operator[](size_type)があるやん
286:デフォルトの名無しさん
08/03/04 10:20:04
>>284
そうなんですけど
出来れば再帰的に
DecoratorA-DecoratorB-DecoratorC-ConcreteComponent
と順番に型情報をたどって行く必要ができてしまって・・・
最悪でも、根元の情報だけでも何とかならないかと
287:デフォルトの名無しさん
08/03/04 10:22:42
じゃあまさに>>279の方法なんじゃないの?
288:デフォルトの名無しさん
08/03/04 10:26:38
>>285
なんですかそれ
289:デフォルトの名無しさん
08/03/04 10:31:02
>>287
Decoratorの方はいくらでもいじれるのですが
ConcreateComponentの方はこちらの一存ではいじれないので識別子を埋め込むのは難しいかと
やはりcastの成否で判別していくのが無難か・・・
castに失敗するとNULLが返る?
bad_castがthrowされるのは参照のキャストの時だっけ・・・
290:デフォルトの名無しさん
08/03/04 10:38:55
>>288
普通にnum[i * j] = aとすればいいということ。勿論、num.size()がi * jより大きいことが条件になるけど。
291:デフォルトの名無しさん
08/03/04 10:40:16
>>277
テンプレートで先ず全ての型で失敗するコードを書いておいて、
特別な型だけ特殊化しておくとか。
292:デフォルトの名無しさん
08/03/04 10:56:49
全く関係ないが
キャストとくにdynamic_castを使用する度に
クラス設計に問題があったんじゃないかと不安な気分になるのは自分だけか?
293:デフォルトの名無しさん
08/03/04 10:58:43
>>292 それが正常。
294:デフォルトの名無しさん
08/03/04 11:03:25
俺なんか気づいたら継承が全部public、メンバもほとんどpublicだったことがあるぜ!
(´・ω・`)
295:デフォルトの名無しさん
08/03/04 11:32:26
でもcast使わざるをえない時ってあるから嫌らしいよな
296:デフォルトの名無しさん
08/03/04 11:36:08
>>280,291
すみません、説明がたりませんでした。
templateでtemplate型を受け取った時にも対応できる方法が
あるかが知りたかったんです。
例えばtempate関数でstd::vector<何でもOK>は受け取れるが
std::list<>はだめな場合など。
こういう場合、特殊化だとvector<int>、vector<float>~という具合に
OKにしたい型を全て記述しないとダメなんじゃないですか?
297:291
08/03/04 11:45:15
>>296
「特定の(少数の)型」だけ有効にしたいのかと思ったから特殊化を提示した。
そうでないんだったらtypeidで動的に型を調べることになるのかな?
templateスレ辺りの方が喰い付きがいいかも知らん。
298:デフォルトの名無しさん
08/03/04 11:52:37
>>296
こんなの?
#include <vector>
template<typename T> void foo(T const& x);
template<typename E> void foo(std::vector<E> const& x) {}
int main()
{
std::vector<int> vi;
std::vector<float> vf;
foo(vi);
foo(vf);
return 0;
}
299:デフォルトの名無しさん
08/03/04 12:00:49
concept check
300:デフォルトの名無しさん
08/03/04 12:07:36
>>296
mplを駆使すればできるだろ
301:267
08/03/04 13:06:56
grepは使ったのですが、なぜかうまく検索できなかったので困ってました。
Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。
302:267
08/03/04 13:07:28
grepは使ったのですが、なぜかうまく検索できなかったので困ってました。
Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。
303:デフォルトの名無しさん
08/03/04 13:18:46
[゚Д゚] castトキイテラグオルカラキマシタ, アイシテ!
304:デフォルトの名無しさん
08/03/04 13:21:32
野郎銃器ロボはお帰りください。
野郎近接ロボとなおんロボはOK。
305:デフォルトの名無しさん
08/03/04 13:34:47
>>298
>template<typename E> void foo(std::vector<E> const& x) {}
あーこういう書き方でいいんですね。助かりました。
いつかさらに複雑な選別が必要になったら、mplやconcept checkも
調べてみます。どうもでした。
306:デフォルトの名無しさん
08/03/04 14:49:30
ちょっとお尋ねした胃のですが
void qsort(void* base, size_t n, size_t size, int(*fnc)(const void*, const void*));
という定義がありますが、const void* ってなんなのでしょうか?
voidってのは「空の型」ってことだと思うのですが、空のものをconst(固定)するってどういうことなのでしょうか?
何もないのだから固定しようがないと思うのですが・・
また、引数がvoid*になっているのもよく分かりません。void(何もない)のポインタを引数にするってどういうことなのでしょうか??
307:デフォルトの名無しさん
08/03/04 14:51:16
void*は汎用ポインタ。voidとは関係ない。
308:デフォルトの名無しさん
08/03/04 14:53:05
>>306
Cでは「何かへのポインタ」をあらわずときに void* を使う。qsort()で
はソート対象の型が決まっていないので、何でも受け取れるように
void*を使っている。
const void* ってのは、「そのポインタが指している先は書き換えしま
せんよ」という意味。
309:デフォルトの名無しさん
08/03/04 14:56:06
ポインタにはアドレスと「そのアドレスから先にどういうデータが入っているか」という情報が含まれる。
void型ポインタってのは「そのアドレスに何が入っているかを指定しないポインタ」という意味。
受け取った関数内で適切な型にキャストしてやって使うことになる。
qsortはintでもcharでも構造体でもソートできる汎用的な関数にするためそういう形になってる。
constってのは「そのポインタの場所に入ってる変数を変更してはいけません」って意味。
constつけた関数内でうっかり書き換えるとコンパイルエラーになるから、ミスを予防できる。
310:デフォルトの名無しさん
08/03/04 16:30:54
下記のソースを
bcc32 test.cpp
でコンパイルすると★の行で
エラー2423 存在しないテンプレート'show_array'の明示的な特化またはインスタンス化
*** 2 errors in Compail ***
が表示されなす。
存在しないって言われても直前に・・・・
テンプレートの定義が間違ってるのでしょうか?
311:310
08/03/04 16:31:43
--- test.cpp ---
#include <iostream.h>
/*-------------------------------------------------------*/
/* 配列の表示テンプレート */
/*-------------------------------------------------------*/
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
{
T2 index;
if( count == 0 ){ /* 表示しない ? (YES) */
return( 0 ); /* 非表示 */
}
/* 配列を表示 */
for( index = 0; index < count; index++ ){
cout << array[index] << ' ';
}
return( 1 ); /* 表示 */
}
312:310
08/03/04 16:32:59
template char show_array( int *array, int count ); ★
template int show_array( float *array, unsigned char count ); ★
/*-------------------------------------------------------*/
/* main関数 */
/*-------------------------------------------------------*/
void main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };
/* int型の配列 */
show_array( pages, 5 );
cout << '\n';
/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';
return;
}
313:デフォルトの名無しさん
08/03/04 16:53:01
unsigned char String[9] = "S2KTI2G7";
unsigned char KeyTable[11] = "0123456789";
char *id = "0";
int i;
for(i = 0; i < 8; i++)
String[i] ^= *id;
このプログラムの動作がよくわかりません
たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので
String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。
どうして99になるのでしょうか?
314:デフォルトの名無しさん
08/03/04 16:53:46
>>310
>*** 2 errors in Compail ***
恥ずかしいからちゃんとコピペしようね。
315:デフォルトの名無しさん
08/03/04 16:56:05
>>313
Cではハット(^)はビット毎の排他論理和演算子なので、83^48はちゃんと99になる。
316:デフォルトの名無しさん
08/03/04 16:58:09
>>313
83^48
=1010011^0110000
=1100011
=99
317:デフォルトの名無しさん
08/03/04 17:01:12
>>315-316
なるほど
ここしばらく他の言語しかやってなかったのですっかり忘れてました
すばやい回答ありがとうございます
318:デフォルトの名無しさん
08/03/04 17:01:17
>>310
こんな感じじゃないかなたぶん
return( 1 ); /* 表示 */
}; <----- ここテンプレートの最後にセミコロンが必要
template char show_array..... → template<> char show_array.....
template int show_array..... → template<> int show_array.....
show_array( pages, 5 ); → show_array<char>( pages, 5 );
show_array( price, 3 ) → show_array<int>( price, 3 )
show_array( price, 0 ) → show_array<int>( price, 0 )
319:デフォルトの名無しさん
08/03/04 17:02:30
>>310
そのテンプレート関数の目的が意味不明なんだが、取り敢えず「所謂」全角空白が見えるエディタを使おう。
320:デフォルトの名無しさん
08/03/04 17:05:25
>>310
多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して勝手に修正してみた。
--
#include <iostream>
using namespace std;
template<class T> bool show_array(T array[], int N)
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
int main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };
/* int型の配列 */
show_array( pages, 5 );
cout << '\n';
/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';
return 0;
}
321:320
08/03/04 17:09:21
いかん、配列の要素数を勝手に取得するバージョンの名残で引き数Nが大文字だw
ついでなんで、そのバージョンも貼っておこう。
--
template<class T, size_t N> bool show_array(T (& array)[N])
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
--
これだと、show_array(price)で使える。でも戻り値の意味がないw
322:306
08/03/04 17:33:00
なるほど。
レスくださった方々、わかりやすい説明ありがとうございましたm(_ _)m
323:310
08/03/04 17:34:28
レスありがとうございます!
314 >> あ、aが余分でした (;ω;`)
318 >>
テンプレートの最後にセミコロン付加
templateの後に<>付加
show_arrayの後に<型>付加
をやってみましたが、エラー内容は変わりませんでした・・
319 >>
練習用に色々やってみた感じで作りました。
エディタはさくらエディタ使ってます。
320 >>
> 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して
させたい動作はその通りです。
320さんのソース読んできます。
324:310
08/03/04 17:36:39
アンカーの付け方まちがえたぁぁ~
325:デフォルトの名無しさん
08/03/04 17:47:39
>>324
全角空白を見えるようにしろって言うのは、>320に全角空白が入っているからなんだが。
# 勿論、後から追加したであろう★印のところ以外にね。
326:325
08/03/04 17:48:15
いや、全角空白が入っているのは>320じゃなくて>310だった_/ ̄|○
327:310
08/03/04 17:57:39
>>320さんのソースを元に、自分との違いを考えて
>>311-312
のソースの★の記述を削除し、
>>318さんの変更を加えたら、コンパイル通りました~。
ソースの書き方がコテコテ素人なんで、
>>320さんのソース見て勉強します。
>>318さんの追加が無い場合はエラーが出るのですが、内容読んでも
show_array<char>( pages, 5 ); の<char>が何で必要か
わからんです、ヒントお願いできないでしょうか。
エラー内容は↓です。
エラー2285 show_array<T,T1,t2>(int *, int)に一致するものが見当たらない
328:デフォルトの名無しさん
08/03/04 18:00:40
>>327
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
というテンプレートがあるので、show_array( pages, 5 ); は
show_array<char, int*, int> かもしれんし
show_array<int, int*, int> かもしれんし
show_array<long, int*, int> かもしれんし
T1とT2は引数見ればわかるけどTの型は決定できないので
329:310
08/03/04 18:03:50
>>326
!? お
template<class T, class T1, class T2>と
T show_array( T1 *array, T2 count )
の間に全角空白が!!!!!!
コピペした後に入れちゃったみたいです。('A`)
ご指摘ありがとうございます。
330:310
08/03/04 18:13:08
>> 328
なるほど!
分かりやすいご説明ありがとうございます。
試しに
<char>show_array( pages, 5 );
してみたら、構文エラーでしまた。
show_array<char>( pages, 5 );
って書き方なんですね。
ご回答下さった皆様、ありがとうございました(。。)゛
331:デフォルトの名無しさん
08/03/04 19:37:21
oprator void *() const
{ if (state&(badbit|failbit)) return 0; return (void *) this; }
のopratorはここではどういう意味で使われているのでしょうか?
この位置にあるのを初めて見まして、よくわからないんです。
332:デフォルトの名無しさん
08/03/04 19:41:08
>>331
型変換の演算子。
333:デフォルトの名無しさん
08/03/04 20:00:13
>>331
例えば
class Foo {
public:
operator int() { return 42; }
};
main() {
Foo foo;
int x = foo; // <-- ここ
cout << x;
}
というふうに、クラスを別の型に変換するときに呼ばれる。
334:デフォルトの名無しさん
08/03/04 21:54:20
ちなみに、このvoid*への変換演算子は
if (str)のように条件式で用いるために用意されている。
なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。
int x = str;のような想定外の変換を行わせないためである。
335:デフォルトの名無しさん
08/03/04 23:21:45
C#で開発したプログラムを、事情で一部C++.Netで書き直さないといけなくなったのですが
[C#]
List<int[]> foo;
の書式が、C++.Netではどう直せばいいのかわかりません。
intの配列ではテンプレートを適応できないのでしょうか?
336:デフォルトの名無しさん
08/03/04 23:24:05
>>335
List<array<int>^>^ foo;
337:デフォルトの名無しさん
08/03/04 23:24:19
URLリンク(vene.wankuma.com)
これ?
338:335
08/03/04 23:25:39
>>336
ありがとうございます。私の4時間が返ってきた。
これで作業が続きます。
339:336
08/03/04 23:40:27
>>338
ちなみにあなたが書いてるのはC++/CLIなので
分らないことがあったらC++/CLIスレに行くと幸せになれるかも。
340:デフォルトの名無しさん
08/03/04 23:56:55
List<array<int>^>^ foo;
笑ってるように見えて何かムズムズするw
341:デフォルトの名無しさん
08/03/05 00:36:11
List<List<List<array<int>^>^>^>^ foo = gcnew List<List<List<array<int>^>^>^>();
342:デフォルトの名無しさん
08/03/05 00:37:46
積年の疑問なんですが、スタックサイズはいつどうやって決まるんでしょうか。
1. コンパイル時に
2. リンク時に
3. 実行時に
a. 自動的に(コンパイラとかが自動変数の使用状況などを見て)
b. 固定的に
多分、どれかに当てはまると思うんですが。
343:デフォルトの名無しさん
08/03/05 00:40:00
コンパイルしたら
344:デフォルトの名無しさん
08/03/05 00:48:12
>>342
環境依存。
Windowsはリンク時に実行ファイルのヘッダにサイズが書かれるんだった
かな。子スレッドのスタックは実行時。
345:デフォルトの名無しさん
08/03/05 00:48:49
>>342
Windowsではexeにスタックサイズが書かれるので、リンク時以前
組み込みなんかでリセットベクタもコンパイルする必要がある場合は、コンパイル時
と思う。
346:デフォルトの名無しさん
08/03/05 01:31:09
組み込みで開発してたときはスタックサイズのチェックしてたな
どこまで上ってきてるか心配だったから。
あのときはコンパイル時だな。
347:デフォルトの名無しさん
08/03/05 01:34:24
うちもスタックポインタのチェックやってる。んでも、リンク時だと思う。
リンク時にスタックポインタの開始アドレスとかグローバル変数の確保領域アドレスとかの設定ファイルを使うから。
348:デフォルトの名無しさん
08/03/05 01:52:00
>>347
そうだな。何とか形式のファイルのサマリーを
出してくれるツールがあったな。
349:デフォルトの名無しさん
08/03/05 02:57:13
よく、C++ における class と struct の違いはデフォルトで private か
public かの差しかないって言うけど、本当?
class だと継承やらの情報を管理するための暗黙のメンバが最初にくっつかない?
class C {int a;}
struct S{int a;}
C c;
S s;
を実行してデバッガで c と s の中身見てみるとメンバ違わない?
350:デフォルトの名無しさん
08/03/05 03:10:19
クラスはメンバ関数や、オーバーロードが使えるだろ
構造体の拡張だろう
351:デフォルトの名無しさん
08/03/05 03:14:17
本とかだと、class と struct はデフォルトの可視範囲が異なるだけで、
コンパイラレベルでは全く同一ですと書いてある。
352:デフォルトの名無しさん
08/03/05 03:16:08
>>349
structも継承できるのに何でそこが違うとおもったんだ?
353:デフォルトの名無しさん
08/03/05 03:16:27
細かいことは気にするな 使う側として同じなら構わないだろう
354:デフォルトの名無しさん
08/03/05 03:17:46
>>349
大抵の実装では、仮想関数を持つクラス・構造体は、
仮想関数呼出のためのテーブル (vtbl)へのポインタを隠し持っているが、
これもクラス・構造体どちらでも同じ。
規格でも構造体とクラスは完全に同一視され、
構造体について何か独立した規定は存在しない。
全てクラスとしてまとめられている。
355:デフォルトの名無しさん
08/03/05 04:19:31
full bokko
356:デフォルトの名無しさん
08/03/05 07:17:09
そして大抵の実装では
仮想関数を持たないクラス・構造体は
vtbl へのポインタを持っていない。
357:デフォルトの名無しさん
08/03/05 07:38:19
>>347
H8やSHでは#pragma stacksize XXX というのがあるので、
スタックサイズはコンパイル時、スタックアドレスはリンク時ということかな。
358:デフォルトの名無しさん
08/03/05 08:45:07
struct S{ int m_a; int m_b}
として m_b に代入しようとして
void hoge(void *s){
int offset = sizeof(int);
unsgiend char * p = (unsgiend char *)s;
int * m_b = p[offset];
*m_b = 1234
}
みたいなコードが書いてあると位置がずれて死ぬ訳か
359:デフォルトの名無しさん
08/03/05 09:23:24
>>358
いいえ、環境依存です。
360:デフォルトの名無しさん
08/03/05 09:30:41
struct S {
int a;
int b;
void clear() {
ZeroMemory(this, sizeof(*this));
};
}
こういうのもマズイ?
361:デフォルトの名無しさん
08/03/05 09:32:20
>>360
いつか POD の規則から外れる変更を加えたときに忘れずに修正する覚悟が必要。
362:デフォルトの名無しさん
08/03/05 09:42:56
vectorとか追加した場合ですね。
上のほうで出てた、仮想関数を持つクラスを継承して
vtbl へのポインタを持ってる場合は>360で問題無しですか?
363:デフォルトの名無しさん
08/03/05 10:42:35
>>362
仮想関数を持ったものも POD から外れる。
364:デフォルトの名無しさん
08/03/05 10:45:50
>>357
HEWでそれやってたな。てかconfig入力画面でメモリセクションのカスタマイズできた。
365:デフォルトの名無しさん
08/03/05 10:47:58
struct S {
std::vector m_v;
} s;
で
ZeroMemory(&s, sizeof(S));
ってやって死んだ事がある
366:デフォルトの名無しさん
08/03/05 11:46:02
コンパイラBCC55
class PPP{
public:
union{
struct{
int n;
struct{
enum Hoge hoge;
int x;
}aa[32][32];
LPCWSTR name[256];
}a;
struct{
int p;
char i;
float y;
Hoge *o;
}b;
struct{}c;
}data;
};
こんな共用体がクラス変数になってる時に
PPP ppp;
とするとそこでプログラムが例外も吐かずに落ちてしまいます。
しかし、PPPを他のクラスのクラス変数として宣言しておけば落ちません。
class Hoka{
PPP p;
};
分かる人おながいしまつ・・・。
367:デフォルトの名無しさん
08/03/05 11:47:00
ちなみにenum HogeはPPPの中で定義されてます。すいません
368:デフォルトの名無しさん
08/03/05 12:21:18
現象が再現する最小限のソースうp
369:デフォルトの名無しさん
08/03/05 14:39:59
今更ですが>>290のことで
vector<int> num;
num[i*j]=a;
でnum.size()が不定のとき(i*jより小さいときもある)場合
先にnum[i*j]を確保して、num[i*j]=aを入れればよいのでしょうか
確保の仕方を教えてください
370:デフォルトの名無しさん
08/03/05 14:46:08
>>369
num.resize(100) とかで好きなサイズに変更する
371:デフォルトの名無しさん
08/03/05 15:20:53
num.resize(i*j)っていうのも可能ってことでしょうか?
372:デフォルトの名無しさん
08/03/05 15:28:07
>>368最小限が分かりづらいのでエラーの出ないnewで代用しました。
373:デフォルトの名無しさん
08/03/05 15:58:15
>>371
可能だが resize(i*j) ではサイズが足りないと思うぞ
374:デフォルトの名無しさん
08/03/05 16:14:35
もっとも使われていないバッファを解放したいのですがSTLなどで良いライブラリはありますか?
375:デフォルトの名無しさん
08/03/05 16:53:00
>>374
せめてもうちょっと具体的に言わないとどうにもならないと思うよ
376:デフォルトの名無しさん
08/03/05 16:57:59
LRUを実装するのに適したコンテナはどれでしょうかってことだとエスパーしてみる
JavaのLinkedHashMapみたいなやつ?
STLにそれはないから、mapとlistを組み合わせるのかな・・
377:デフォルトの名無しさん
08/03/05 18:39:44
3次元配列(texture)を動的に確保しようと
if( (int)texture.size() < ( temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1] ) )
texture.resize(temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]);
texture[temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]] = num;
こうしたら、格納されません。
現在の3次元配列の幅よりも、大きいのが出てきたら値を取り直して、入るべき所にぶち込む
ってことをやりたいだけなのですが
378:デフォルトの名無しさん
08/03/05 18:58:40
>>377
サイズが 10 だったら、有効なインデックスは 0~9 だ
サイズが temp[0] + .... *maxValue[1] だったら、
有効なインデックスは 0 ~ temp[0] + .... *maxValue[1] - 1 までだ
379:デフォルトの名無しさん
08/03/05 19:07:20
>>378
ありがとうございます、それが抜けていました
ただ 0 0 0 があったときに格納できないというエラーが出てきて
後少しなのに
380:デフォルトの名無しさん
08/03/05 19:20:23
class Aを例外として投げるとき
throw new A;
のようにnewで生成して投げるのと
throw A();
と投げるのはどっちが良いのでしょうか?
381:デフォルトの名無しさん
08/03/05 19:25:04
自プロセスのHWNDを取るにはどうしたらいいのでしょうか?
382:デフォルトの名無しさん
08/03/05 19:25:10
むかーしどっかで見たのですが、3次元以上の配列は使わない方が良いってどういうことでしょうか?
ソースがどこだったか覚えてないのですが、そのときの記憶があり3次元以上はなるたけ使わないようにしてる原状です
383:デフォルトの名無しさん
08/03/05 19:27:31
あんま多いと気づかずやらかす類のバグが増えるかも…しれないけど決定的な理由じゃねえよな
384:デフォルトの名無しさん
08/03/05 19:37:17
>>380
Javaと一緒にすんな
385:デフォルトの名無しさん
08/03/05 19:57:35
>>382
その配列が表すモノが本質的に3次元以上のモノなら3次元配列で良いけど
構造体やクラス等で表すべきモノを配列にしてしまうのは避けるべき
386:デフォルトの名無しさん
08/03/05 20:47:36
数値計算で添字3つ以上の行列とか扱わない限り、
まず必要になることはないと思うけどね。
387:デフォルトの名無しさん
08/03/05 20:52:58
>>380
newするとどこかでdeleteせんといかんよ。
388:デフォルトの名無しさん
08/03/05 21:29:17
>>380
new はしない。
389:デフォルトの名無しさん
08/03/05 22:04:19
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
を定義して、
SAFE_DELETE(ptr);
とすると「構文エラー : ';' が~の前にありません」のエラーになってしまいます。
delete ptr;なら普通にコンパイルできるのですが、
どこが悪いのでしょうか。
390:デフォルトの名無しさん
08/03/05 22:06:01
ちょっと行き詰まってしまったので質問させて下さい。
VC2005、WinXP64で以下のようなプログラムを作ったのですが、うまく動いてくれません。
DWORD WINAPI ThreadPrc(LPVOID lpParameter)
{
while (!ThreadTerminated){
//要求があるまで待機
WaitForSingleObject(hEventHandle,INFINITE);
if (ThreadTerminated) break;
//共有オブジェクトの排他アクセス
WaitForSingleObject(hMutexHandle,INFINITE);
//適当に処理
ReleaseMutex(hMutexHandle);
//処理が終わると相手に通知
//ここがおかしい
SetEvent(hDoneEventHandle);
}
return 0;
}
普段はDelphiでやってますが、64ビットでビルドする必要があったので、Delphiで作ったものをC++に移植しました。
プロセス間通信でいろいろやってるわけなのですが、同じところでいつもタイムアウトしてしまいます。
もちろんINFINITEにするとそのまま固まってしまいます。
32ビットプロセスでSetEventして、64ビットプロセスでWaitForするのは成功するのですが、その逆がうまくいかないのです。
VC固有の問題なのか、64ビットの問題なのか、関係ありそうなのは調べましたが全く原因が分かりません。
この部分さえうまくいけば完成なのですが・・・。
どなたか分かる方いましたらアドバイスお願いします(o*。_。)o