【初心者歓迎】C/C++室 Ver.32【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/15(日) 15:30:51ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.30【環境依存OK】 (重複スレ実質Ver.31)
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153アフォルトの名無しさん
2006/10/21(土) 18:30:35try
{
throw new NullPointerException();
}
catch( NullPointerException e )
{
e.printStackTrace();
}
こんな感じのJavaの例外処理をC++に置き換えたいとすれば、
どうなる?C++にNullPointerExceptionってないよね。
NullPointerExceptionに相当するクラスを作って投げなきゃいけないよね。
でも、どんなクラスにすればいいんでしょうか
0154デフォルトの名無しさん
2006/10/21(土) 18:45:58std::exception から派生させたクラスとして、 what() を適当に実装すればいい。
スタックトレースは無理。 throw するときに new しちゃだめ。 catch は const& で受ける。
0155アフォルトの名無しさん
2006/10/21(土) 19:04:41#include <exception>
class nullpointerexception: public std::exception { };
int main(void){
try{
throw nullpointerexception();
}
catch(std::exception& e){
std::cerr << e.what() << std::endl;
}
return 0;
}
こんなん書いてみたんだけど、
no named exception thrown
ってでるよ。
0156デフォルトの名無しさん
2006/10/21(土) 19:13:060157デフォルトの名無しさん
2006/10/21(土) 19:32:25>>152
ヒープはよくわからないので。
スタックを増やしたら実行できました。
ありがとうございました。
0158144
2006/10/21(土) 19:34:03回答どうもです
配列から生成したイメージを、DirectXをつかってtextureにしたい
のですが、CreateDIBSectionで可能なんですか?
0159デフォルトの名無しさん
2006/10/21(土) 20:12:480160デフォルトの名無しさん
2006/10/21(土) 20:18:15くだすれDirectX(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1132965206/
0161デフォルトの名無しさん
2006/10/21(土) 20:20:510162デフォルトの名無しさん
2006/10/21(土) 23:15:13テンプレートメソッドパターンの勉強中なんですが、
#include<iostream>
template <class T,T>
T ave(T a,T b) {
return (a + b) / 2;
}
main() {
using namespace std;
cout << ave<int,int>(1203, 3344) << endl;
}
とすると、
Question.cpp
Question.cpp(11) : error C2975: 'ave' : 'function-parameter' に対するテンプレート引数が無効です。コンパイル時に評価可能
な定数式が必要です。
Question.cpp(4) : 'ave' の宣言を確認してください。
と出てしまいます。
文法的に正しくするとしたら、どうすればいいですか。
0163162
2006/10/21(土) 23:17:22ただのテンプレートでした。
0164デフォルトの名無しさん
2006/10/21(土) 23:20:54エラーメッセージが遠いな。
× template <class T,T>
○ template <class T>
× ave<int,int>(1203, 3344)
○ ave(1203, 3344)
0165162
2006/10/21(土) 23:29:04ありがとうございます。
他の例で、
template <class T,T>
T max(T a,T b) {
return (a > b) ? a : b;
}
mainの中で、
cout << max(2,5) << endl;
この場合は、<class T>ではなく、<class T,T>にしないと動かないのですが、
違いはなんででしょうか。
0166デフォルトの名無しさん
2006/10/21(土) 23:35:51cass T だと、どうなる?
0167デフォルトの名無しさん
2006/10/21(土) 23:37:51maxは標準に既に用意されている。
別の名前で試してみ。
0168162
2006/10/21(土) 23:41:21max2にしたら、コンパイル通るようになりました。
試していたのが、max min 等だったので、今まで偶然 標準関数ばかりを
試していたようです。
ありがとうございました。
0169デフォルトの名無しさん
2006/10/22(日) 00:03:34int main(){
std::vector<char> v;
func( &*v.begin(), &*v.end() );
}
このコードをVisualC++のSTLを使って
実行すると、*v.end()のところで
"vector iterator not dereferencable"とアサートに引っ掛ります。
STLPortでは引っ掛りません。
言わんとしていることはわかるのですが、これに対する対策をどうしてよいやら
がわかりません。
template< typename iterator >
void func( iterator begin, iterator end );
にすると、関数のオーバーロードに引っ掛りマズー
template< typename value_type >
void func( std::vector<value_type>::iterator begin, std::vector<value_type>::iterator end );
にするとstd::vector以外使えなくなってマズー
いったいどうすればいいと思いますか?
0170デフォルトの名無しさん
2006/10/22(日) 00:18:44if (!v.empty()) { char* begin = &v[0]; func(begin, begin + v.size()); }
0171デフォルトの名無しさん
2006/10/22(日) 00:44:39お答えありがとうございます。
その方法をとって、以下のようにしました。
void func( char* begin, size_t size );
0172アフォルトの名無しさん
2006/10/22(日) 11:08:40例外処理を丸投げする仕組みはないんでしょうか。
ないとしたら、それを再現するようなうまい方法って知りませんか
0173デフォルトの名無しさん
2006/10/22(日) 11:40:49public:
vector<double> db1;//
vector<double> db2;//
};
class Character1 {
public:
vector<Image1> img;// Image1のデータ
};
vector<Character1> chara1;
0174173続き
2006/10/22(日) 11:42:04for(int j = 0; j < 2; j++){
// 5人分キャラクターを作成
chara1.reserve(5);
for(int i = 0; i < 5; i++){
chara1.push_back(Character1());
}
chara1[0].img.reserve(2);
for(int i = 0; i < 2; i++){
chara1[0].img.push_back(Image1());
}
chara1[0].img[0].db1.push_back(0.5);
chara1[0].img[0].db1.push_back(1);
chara1[0].img[0].db1.push_back(1.5);
chara1[0].img[0].db2.push_back(10);
/*
chara1[0].img[0].db1.clear();//
chara1[0].img[0].db2.clear();//
chara1[0].img.clear();//
*/
chara1.clear();// データを消去
}
return 0;
}
こんな風にした場合は、コメントの中の部分は要る?
あってもなくても正常に動きはしたけど…
0175デフォルトの名無しさん
2006/10/22(日) 11:51:53これらじゃ用件を満たさない?
void f0(){
throw exception();}
void f1(){
try{
throw exception();}
catch(...){
throw;}
0176デフォルトの名無しさん
2006/10/22(日) 11:53:20いらない
0177デフォルトの名無しさん
2006/10/22(日) 12:25:01C++にもJavaのthrowsのようなものはあるにはあるが、
コンパイル時にチェックされるわけではないなどの理由から原則使わない。
使わなくても全ての例外はJavaのRuntimeExceptionの如く自動的に呼び出し元へ伝わる。
0178アフォルトの名無しさん
2006/10/22(日) 12:49:11throw;って投げるエラーかかないと何のエラーがどこに投げられるの?
0179デフォルトの名無しさん
2006/10/22(日) 13:46:46catch の中で実行された場合は、現在処理中の例外を外に投げる。
それ以外の場合は死ぬ。
0180デフォルトの名無しさん
2006/10/22(日) 13:49:07catch文の中でthrow;のように投げるものを書かない場合は、
受け取った元の例外オブジェクトを投げるということを意味する。catch(...)以外でも次のように必要。
#include <iostream>
#include <stdexcept>
int main() {
try {
try {
throw std::runtime_error("hoge");
} catch(const std::exception& e) {
throw;
}
} catch(const std::runtime_error&) {
std::cout << "std::runtime_error" << std::endl;
} catch(const std::exception&) {
std::cout << "std::exception" << std::endl;
}
}
もしthrow;をthrow e;とすると、オブジェクトをコピーすることになり、スライシングされてしまう。
つまりeの静的な(つまりソースコード上の)型であるstd::exception型のオブジェクトを投げることになる。
throw;では元のstd::runtime_errorを投げることになり、外側のcatchでもstd::runtime_errorとして受け取ることができる。
0181アフォルトの名無しさん
2006/10/22(日) 14:24:490182デフォルトの名無しさん
2006/10/22(日) 15:08:48#include <limits>
//#include <windows.h> //このコメントはずすとエラー
#include <iostream>
int main(){
std::cout << std::numeric_limits<int>::max() << std::endl;
return 0;
}
0183182
2006/10/22(日) 15:17:06すみません、ググったらでてきました
#define NOMINMAXをwindows.hの前に定義すると
うまくいきました
0184デフォルトの名無しさん
2006/10/22(日) 16:53:06処理をさせているときに突然勝手にウィンドウが閉じて
終了します。何が主な原因でしょうか?
0185デフォルトの名無しさん
2006/10/22(日) 16:56:37エスパーで解答すると、
ウインドウプロシージャの中で使っているswitch文のbreakを書き忘れているとか。
まあ、超エスパーの降臨を待てよ。
0186デフォルトの名無しさん
2006/10/22(日) 17:03:03別スレッドに移すことか。
HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasksの値が1だったら、
一定時間応答のないアプリケーションを自動的に強制終了する。
とはいっても、これデフォで0だから違うだろうけど。
0187デフォルトの名無しさん
2006/10/22(日) 18:15:09あなたが作っているのはコンソールプログラムと見た。
int main(){
略
sleep(10); /*ここを追加*/
return 0; }
でコンパイルしてみ。
0188184
2006/10/22(日) 18:57:10ウィンドウズソフトです。コンソールプログラムではありません
さっきパフォーマンスモニタを観察していたら、強制終了される処理の部分で
Handle Countが異様に増えていきました。ファイルハンドル解放わすれかな
と思いましたので、調べてみます
0189デフォルトの名無しさん
2006/10/22(日) 20:06:06中止となります。また、それに伴いましてクリスマスイヴやプレゼント交換会
も中止となります。ご了承下さい
http://2chart.fc2web.com/2chart/2007kurichuusi.html
また、昨年お伝えしましたように、2006年のクリスマスも中止です。
http://2chart.fc2web.com/2chart/2006kurisumasuchuushi.html
毎年、各所でこのような楽しいクリスマスの風景が見られましたが
自粛でお願いします。
http://2chart.fc2web.com/2chart/tanosiikurisumsu.html
0190デフォルトの名無しさん
2006/10/22(日) 20:32:04* list4a.c
*
*/
#include <stdio.h>
int x = 10;
extern int y; /* externは実はなくても動く */
int main(void)
{
extern int z;
printf("x=%d y=%d z=%d\n", x, y, z);
return 0;
}
/*
* list4b.c
*
*/
int y = 20;
int z = 30;
externの実験なのですが、
これを動作させるにはどうすればいいのでしょうか?
list4a.cだけを実行させても動きません。
0191デフォルトの名無しさん
2006/10/22(日) 20:35:42「動きません」って、どうなるんだ?
list4b.c もコンパイルしてリンクしないとダメだよ。
0192デフォルトの名無しさん
2006/10/22(日) 20:40:32それってどうすればできますか?
とりあえずそれぞれ.objっていうのが出来たんですが。
0193デフォルトの名無しさん
2006/10/22(日) 20:43:070194デフォルトの名無しさん
2006/10/22(日) 20:47:500195デフォルトの名無しさん
2006/10/22(日) 20:48:41環境くらいかけよ
大抵のコンパイラはhoge.c foobar.cのようにファイル名並べてやればうまくやってくれる
.obj作れたんなら自分でリンカでなんとかできるはず
0196デフォルトの名無しさん
2006/10/22(日) 20:59:58できました。
bcc32 hoge.c foobar.c で。
どうもありがとう。
0197デフォルトの名無しさん
2006/10/22(日) 23:00:360198デフォルトの名無しさん
2006/10/23(月) 00:41:13コンパイル済みのobjからexe作成したい場合はリンカ直接呼べばいい。
ilink32 c0x32.obj hoge.obj foobar.obj, hoge.exe, , cw32.lib, ,
※c0x32.objはスタートアップモジュール(コンソールアプリ)。GUIならc0w32.obj、dllならc0d32.obj
cw32.libは標準ライブラリのスタティックリンクライブラリ。マルチスレッドの場合はcw32mt.lib
0199デフォルトの名無しさん
2006/10/24(火) 18:55:44ステータスバーを追加。
起動して、マウスでウィンドウを小さく(タイトルバーだけにする)と下の部分の描写がおかしくなります。
InvalidateRectやUpdateWindowをステータスバーに指定しても変わりません。
どうしたらいいのでしょうか。。。?それともメインウィンドウにWS_CLIPCHILDRENを指定してはいけないのですか?
0200デフォルトの名無しさん
2006/10/24(火) 23:44:28それだけじゃわからん
0201デフォルトの名無しさん
2006/10/24(火) 23:46:20スコープはグローバル変数と関数は全てのファイルで通用、ただし両方ともstaticをつけるとスコープは内部リンゲージになる。
ローカル変数はブロック内でstaticをつけると内部リンゲージになる。
ただしグローバル変数に関して別のファイルの無指定のグローバル変数を利用するときは(staticをつけない場合のことです)
externという指定をつけたヘッドファイルを読み込んでコンパイルしないと正しく使うことができない
という理解でよろしいでしょうか?
分かりにくい文章でごめんなさい
0202デフォルトの名無しさん
2006/10/25(水) 01:42:34ちょっとおかしい。
×リンゲージ
○リンケージ
×ヘッドファイル
○ヘッダファイル
ローカル変数は( extern を付けて宣言しない限り)リンケージなし。
static を付けた場合、記憶クラスが変わる。
0203デフォルトの名無しさん
2006/10/25(水) 02:36:45もともと頭おかしかったみたいだし。
0204デフォルトの名無しさん
2006/10/25(水) 10:40:37Create時に指定するのではなく動的に変更する場合
どのようにしたらいいでしょうか?
0205204
2006/10/25(水) 10:46:580206201
2006/10/25(水) 19:16:08すいませんw ちょっと疲れてたので書き間違いをしてしまいました
リンケージとヘッダファイルですね。
ローカル変数はexternをつけると別のファイルでも通用する
staticをつけるとそのファイルのみ通用する
何もつけないとブロック内のみ通用する
これで完璧ですか?
0207デフォルトの名無しさん
2006/10/25(水) 20:34:320208デフォルトの名無しさん
2006/10/25(水) 20:39:270209デフォルトの名無しさん
2006/10/25(水) 20:41:34外で宣言したのと同じくグローバル変数の宣言になる。
(ただしそれが見えるスコープはそのブロック内限定)
0210デフォルトの名無しさん
2006/10/25(水) 21:03:23そのスコープ内で(ファイル・関数)一回だけ初期化し、その後領域を保持しつづけてくれる
エクス y=ー( ゚д゚)・∵.ターン
誰かが外に造っているはずと期待し本体の置き場は(基本的に)他ソースにあることを想定
0211デフォルトの名無しさん
2006/10/27(金) 12:33:43レベル低くて申し訳ないんですが教えてください。
scanf("%s",str)で^zを判断する方法が知りたいです
おねがいします
0212デフォルトの名無しさん
2006/10/27(金) 12:43:53>>211
DOS系OSならscanf()の戻り値を判断せよ。入力が閉じられている筈だから変換に失敗したことになるので0のはずだ。
Unix系OSなら単純に収容されるからstrchr(str, '\x1a')でもするってところかな。
0213デフォルトの名無しさん
2006/10/27(金) 12:51:16ありがとうございます。
先ほど私もその方法を試してみたのですが
scanfの戻り値の型がわからず代入時にエラーがでてしまいます
int chk;
chk = scanf("%s",str);
if (chk == 0){
〜〜
おかしいでしょうか?
0214デフォルトの名無しさん
2006/10/27(金) 13:01:03おまけにエラーが出たと言いつつエラーメッセージも張らないし。
先ずはコミュニケーションのレベル上げから始めた方がいいんでない?
0215デフォルトの名無しさん
2006/10/27(金) 13:11:16すいませんでした><
環境はbcc5.5.1 + DOS です
エラーメッセージは出ず異常終了します
0216デフォルトの名無しさん
2006/10/27(金) 13:44:15ヘッダファイル見れば?
scanfでぐぐれば?
確かEOFが返った気がする
0217デフォルトの名無しさん
2006/10/27(金) 13:51:530218デフォルトの名無しさん
2006/10/27(金) 14:05:22に反応しただけです。
0219デフォルトの名無しさん
2006/10/27(金) 14:53:010220デフォルトの名無しさん
2006/10/27(金) 15:24:47クラスが巨大なので、クラスを書いたファイルとmainのあるファイルを別にしたのですが、
どうすればmainのあるファイルで、別ファイルにあるクラスが使えるようになるんでしょうか。
ただの関数なら共通ヘッダにプロトタイプを書けば良いというのは分かるんですが。
0221デフォルトの名無しさん
2006/10/27(金) 15:33:08クラスのインターフェースだけをヘッダファイルに書く。
実現部は別ファイルでよい。
0222デフォルトの名無しさん
2006/10/27(金) 15:35:41ありがとうございました。
0223デフォルトの名無しさん
2006/10/27(金) 17:46:42ダイアログで日付と時刻を表示するプログラムを作っています。
日付と時刻が連結された状態で入ってくるのですが、下記のような
コードを記述したところ
Run-Time Check Failure #2 - Stack around the variable 'cBuf' was corrupted.
というエラーが発生してしまいました。
メモリを破壊しているようなのですがなぜ壊れているのかわかりませんでした。
分かる方いましたらお教えください。お願いします。
以下コード抜粋
m_DateStr = _T("2006/10/21 30"); //日付と時刻が入っている。
wchar_t cBuf[2];
_tcscpy_s(cBuf, sizeof(cBuf), m_DateStr.Right(2));
0224デフォルトの名無しさん
2006/10/27(金) 17:58:06その関数には、バッファの「文字数」を指定する必要がある。
バッファの「バイト数」ではない。
char型の場合は、文字数はバイト数と同じだが、
wchar_tの場合は違う。
TCHAR str[256] ;
size_t number_of_chars = sizeof(str) / sizeof(TCHAR) ;
そもそも_tcsとつくのは、マクロで置き換わるわけだから、
wchar_tを直接使うのであれば、wcscpy_s()を直接呼んだほうがいいと思うのだけれど。
0225デフォルトの名無しさん
2006/10/27(金) 18:11:08出来ました。
すごく分かりやすい解説をありがとうございました。
0226デフォルトの名無しさん
2006/10/27(金) 19:57:310227デフォルトの名無しさん
2006/10/27(金) 21:27:27とりあえず何か本でも買って一通り勉強した方がいいよ
0228デフォルトの名無しさん
2006/10/27(金) 22:35:26C++ではメソッドのシグニチャだ。
0229デフォルトの名無しさん
2006/10/27(金) 22:58:190230デフォルトの名無しさん
2006/10/28(土) 03:55:32何段階も継承してるけど、あそこまでやる必要あるの?
0231デフォルトの名無しさん
2006/10/28(土) 07:21:36歩かせるのに指の動作から指示し直してたら効率悪いってことだろ。
納得行かなければ自分で改良してやんな
0232デフォルトの名無しさん
2006/10/28(土) 09:26:54・オブジェクト指向と言えば継承な時代だった(包含しない)
0233デフォルトの名無しさん
2006/10/28(土) 16:12:060234デフォルトの名無しさん
2006/10/29(日) 17:26:02iostreamから1行getlineをしてstringを得たいのですが、途中でchar[128]などのバッファを使わず、一気にstringをとる方法はありますか?
string s = stream.getline(); のようなものを期待しています。
0235デフォルトの名無しさん
2006/10/29(日) 17:31:360236234
2006/10/29(日) 17:33:01fstream >> string
0237デフォルトの名無しさん
2006/10/29(日) 17:34:16それだと空白で途切れるよ。
0238デフォルトの名無しさん
2006/10/29(日) 17:49:54>>237の言うとおりだ。std::getline使え。
0239デフォルトの名無しさん
2006/10/30(月) 00:53:21fgets(buf, sizeof(buf), stdin);
という記述を良く見かけますが、
sizeof(buf)は256なので、もし256文字分入力されたら
bufの最後の\0が入らなくてよろしくない結果になったりしないのですか?
0240デフォルトの名無しさん
2006/10/30(月) 01:01:050241デフォルトの名無しさん
2006/10/30(月) 02:37:051分で自己解決できることをなぜ質問するのか、理解に苦しむ。
0242デフォルトの名無しさん
2006/10/30(月) 03:01:170243デフォルトの名無しさん
2006/10/30(月) 03:16:530244デフォルトの名無しさん
2006/10/30(月) 03:39:360245デフォルトの名無しさん
2006/10/30(月) 15:54:46int *a,
int b=100;
*a=&b;
printf("%d",*a);
char *a="a"
printf("%c",*a);
char *a="abcde";
printf("%s",a);
文字や数字を表示させる時は*をつけるのに、文字列の場合は*をつけないのはなぜですか?
文字の場合は値の内容なのに、文字列の場合はアドレスで文字表示ができるのが
理解できません。何て言えばいいのかよく分からないので、
質問が解りにくくてすみません。
よろしくお願いします。
0246デフォルトの名無しさん
2006/10/30(月) 16:05:40Cの文字列は'\0'で終端するcharの配列だからだよ。
配列の内容を参照するだけなら、直接渡すのではなく
先頭アドレスを渡すことで事足りる。
だからオブジェクトじゃなくて先頭を示すポインタを渡してる。おわり。
0247デフォルトの名無しさん
2006/10/30(月) 16:09:31ってエラーはどういうことでしょうか・・・?
msxmlをimportしようとして、VCならいけるんですが
Solarisではコンパイルエラーになってしまいます。
どなたか救いの手を…。
よろしくおねがいします。
0248247
2006/10/30(月) 16:10:46でした。
よろしくおねがいします。
0249デフォルトの名無しさん
2006/10/30(月) 16:36:31#importはVC++独自拡張。他のコンパイラには存在しない。
0250デフォルトの名無しさん
2006/10/30(月) 16:56:53Solarisに移植ですか・・・xmlライブラリ探してそれ使う所は自分で書かなきゃだね。
0251デフォルトの名無しさん
2006/10/30(月) 17:07:280252250
2006/10/30(月) 17:44:30■ このスレッドは過去ログ倉庫に格納されています