【初心者歓迎】C/C++室 Ver.72【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/05(金) 16:51:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0449デフォルトの名無しさん
2010/04/15(木) 22:57:542008作る時に2005に残ってた大量のバグ潰したらしいよ!と言い返してみよう
0450デフォルトの名無しさん
2010/04/15(木) 22:59:39でも2010に移行しようってときにあえて2005ってどうなの・・・
0451デフォルトの名無しさん
2010/04/15(木) 23:00:180452デフォルトの名無しさん
2010/04/15(木) 23:33:11デバッグ中にD&Dができなくて困ってた
0453デフォルトの名無しさん
2010/04/15(木) 23:53:230454デフォルトの名無しさん
2010/04/15(木) 23:54:380455447
2010/04/15(木) 23:57:05ありがとうございます
教えてくれる人?は特にいないです
みんなでゲーム作ろう!ってなって、学校で配ってるのが2008と2005でした
斡旋機なので、全員同じスペックのWin7のノートPCをもってます
こういう場合はどっちがおすすめですか?
新しいほうがいいのかな?
一応、どっちかに統一しないとコンパイルが通らなくなるといわれたので
0456デフォルトの名無しさん
2010/04/16(金) 00:06:50tr1使えるしなー
0457デフォルトの名無しさん
2010/04/16(金) 00:11:430458デフォルトの名無しさん
2010/04/16(金) 00:21:190459デフォルトの名無しさん
2010/04/16(金) 07:12:270460デフォルトの名無しさん
2010/04/16(金) 08:03:18Expressかもよ。 配ってるってのはDVD媒体に焼いて配ってるのかもしれないし。
>>447
特にDirectXはバンバン古い開発環境を切り捨てるから、新しいのを入れといた方がいいと思うけど。
0461デフォルトの名無しさん
2010/04/16(金) 09:33:49くばってるというのは、インストールできる場所が大学の図書館にあってCDを借りてインストール
職員がプロダクトキーを打ち込んで
CDを返却して帰るみたいな感じです
0462デフォルトの名無しさん
2010/04/16(金) 11:40:39EEなら大丈夫だと思うが・・
0463デフォルトの名無しさん
2010/04/16(金) 12:52:27ただ、太っ腹だなぁと思う。
0464デフォルトの名無しさん
2010/04/16(金) 15:43:050465デフォルトの名無しさん
2010/04/16(金) 18:26:01それ大丈夫なのかww
0466デフォルトの名無しさん
2010/04/16(金) 20:09:48ってところが味噌だわな
胡瓜に附けて食べちゃう
0467デフォルトの名無しさん
2010/04/16(金) 22:40:510468デフォルトの名無しさん
2010/04/16(金) 23:44:17論文をコピーするのと同じ感覚で、ソフトもコピー
してるんじゃないかと勘繰ってしまう…
0469デフォルトの名無しさん
2010/04/16(金) 23:55:47教材費として徴収済みなんじゃないのかな
Linux&gccやEEでも十分だとは思うけど
アカデミックなら安いし
0470デフォルトの名無しさん
2010/04/17(土) 00:08:24訳がわからない運用ということになるだろうけど・・・
0471デフォルトの名無しさん
2010/04/17(土) 00:28:00生徒と職員の人数分のボリュームライセンスでOKなんじゃね?
生徒数と職員数さえ把握しておけば、卒業の時に消して貰う運用にして、
学校の全てのPCにインストールすることも、
生徒であることを確認するだけで、持ってきたPCにインストールもOKなのでは?
まぁ、細かいライセンス条項を覚えてないから間違えてるかも知れんが…
0472447
2010/04/17(土) 07:58:37結局2005いれてSP1あてたら正常に動きました
ちなみに、Officeも2003と2008?最新のやつ無料でいれられます
2005も2008もオフィスも全員分とってるのかな?
なにはともあれ本当にありがとうございました
0473デフォルトの名無しさん
2010/04/17(土) 09:42:15うちの学校は大学のPCじゃないとvs使わせてもらえないぜ
0474デフォルトの名無しさん
2010/04/17(土) 10:35:430475デフォルトの名無しさん
2010/04/18(日) 11:41:36C言語で日本語が表示されるプログラムを作ったのですが、コマンドプロンプトでそのプログラムを実行しても日本語が表示されません(記号と変な文字のオンパレードになります)。どうやったら日本語で表示されるのでしょうか?
ちなみに参考書の通りプログラムを書いているので、間違いというのは無いはずです
0476デフォルトの名無しさん
2010/04/18(日) 11:49:50ソースコードを保存するときの文字コードをシフトJISにしてみるとか
0477デフォルトの名無しさん
2010/04/18(日) 12:02:512005 C++
WinXP SP3
Form1、Form2と作成し、Form2内部で実処理部分を関数で呼び出しています。
Form1からはForm2を呼び出せるのですが、実処理部分の関数からForm2を呼び出すことができません。
Form2^ ff = gcnew Form2();
としていますがこれがコンパイルエラーとなります。
(error C2065: 'Form2' : 定義されていない識別子です。)
Form1からは同じ宣言で呼び出せるのですが・・・
助言をお願いします。
0478デフォルトの名無しさん
2010/04/18(日) 12:11:19#include "Form2.h"
0480デフォルトの名無しさん
2010/04/18(日) 16:10:38よう分からんけどForm2が定義されてる名前空間と
実装処理部の名前空間が違うんじゃない?
0481デフォルトの名無しさん
2010/04/18(日) 16:39:170482デフォルトの名無しさん
2010/04/18(日) 21:42:57Form2を定義している名前空間をそのnewしてるトコで参照してない希ガス
或いは参照してるつもり->スペルミスとか
0483デフォルトの名無しさん
2010/04/18(日) 22:16:43Form2.hでForm1.hをインクルードしているのでは?
0484477
2010/04/18(日) 22:33:07ありがとうございます。
>>481さんの助言をもとに色々と調べた結果、Form2と実処理の関数の間で循環参照が起きてしまっています。
(>>483さんのおっしゃられているとおりです)
実処理の関数はForm2の実行ボタンを押したときに実行するようになっており、
その実処理の進捗をForm2内のLabelやProgressBarに表示したいのですが、
根本的に考え方が間違ってますかね?
Form2内でLabelやProgressBarにアクセスする関数を宣言して、実処理関数の中で使いたいのですが・・・
0485デフォルトの名無しさん
2010/04/20(火) 21:46:400486デフォルトの名無しさん
2010/04/22(木) 09:59:27VisualStudioスレへどうぞ。
>>484
C++/CLIスレへどうぞ。
0487デフォルトの名無しさん
2010/04/22(木) 19:52:220488デフォルトの名無しさん
2010/04/22(木) 19:56:06適切にたらいまわしてくれる人も必要なんだよ
0489デフォルトの名無しさん
2010/04/22(木) 19:56:43たらいまわしじゃねーよ
0490デフォルトの名無しさん
2010/04/22(木) 20:06:04何でC/C++スレで、関係ない言語の話やソフトウェアについて話をしたがってるんだっていう。
肉屋で野菜や包丁買おうとしてるのが普通に思えるんだろか。
0491デフォルトの名無しさん
2010/04/22(木) 20:10:21初心者歓迎、環境依存OKを謳っているスレでそれは言いすぎ
単に、より適切な回答がつきやすいスレに誘導したほうがお互い効率的だという
だけの話
0492デフォルトの名無しさん
2010/04/23(金) 22:40:51このメタ関数は何のために存在するんですか?
0493デフォルトの名無しさん
2010/04/23(金) 23:26:15template<class T>cast(typename identity<T>::type v){ return v; }
とか
typedef boost::mpl::eval_if<is_const<T>, identity<const int>, identity<int> > iint;
とか
0494デフォルトの名無しさん
2010/04/23(金) 23:31:17>>493
相変わらずC++ TMPは難しすぎだろ
0495デフォルトの名無しさん
2010/04/23(金) 23:35:48・変数宣言
○int *p1, *p2;
×int* p1, p2;
○boost::mpl::identity<int*>::type p1, p2;
・メタ関数をつくるヘルパ(例:osteram等から同じ文字型とTraitsのbasic_stringをつくる、strメタ関数
template<typename Stream> struct str : public boost::mpl::identity<
std::basic_string<typename Stream::char_type, typename Stream::traits_type>
> { };
0496デフォルトの名無しさん
2010/04/23(金) 23:39:04×osteram
○ostream
0497デフォルトの名無しさん
2010/04/23(金) 23:48:41template<class T>cast(typename identity<T>::type v){ return v; }
これがちょっとわからなかった
0498デフォルトの名無しさん
2010/04/23(金) 23:52:02自分で書いておいてなかなかひどい
template<class T> T cast(typename identity<T>::type v){ return v; }と
typedef boost::mpl::eval_if<is_const<T>, identity<const int>, identity<int> >::type iint;
だな
前者はTの型の推論ができなくなる(=明示的に型を指定してほしい関数に使える)
template<class T>void f(T v);
char c;
f(cast<int>(c));
的な
0499デフォルトの名無しさん
2010/04/23(金) 23:52:26なーーーるほど!!
いやー、気がくるっとルなぁ
0500デフォルトの名無しさん
2010/04/25(日) 19:32:40virtual継承にも実行時コストがあるのはなぜ何ですか?
コンパイル時に解決出来そうな気がするんですが
0502デフォルトの名無しさん
2010/04/25(日) 23:07:04解決できそう?
#include <iostream>
#include <vector>
class Animal {
public: virtual void bark() { };
};
class Dog : public virtual Animal {
public: virtual void bark() { std::cout << "bow wow" << std::endl; }
};
class Cat : public virtual Dog {
public: virtual void bark() { std::cout << "meaow" << std::endl; }
};
int main() {
std::vector<Animal*> animal;
animal.push_back(new Dog());
animal.push_back(new Cat());
animal[0]->bark(); // Dog
animal[1]->bark(); // Cat
}
0503デフォルトの名無しさん
2010/04/26(月) 02:46:240504デフォルトの名無しさん
2010/04/26(月) 03:57:090505デフォルトの名無しさん
2010/04/26(月) 05:32:170506デフォルトの名無しさん
2010/04/26(月) 05:56:15じゃなくて、virtual継承が仮想継承のことを言っていると見せかけて
実は仮想関数のオーバーライドを指してるんじゃないかと思ったから
両方入れてみたんだよ
0507デフォルトの名無しさん
2010/04/26(月) 06:28:240508デフォルトの名無しさん
2010/04/26(月) 07:50:34>>506
それはわかったけど、クラス名のチョイスがじわじわ来た
0509デフォルトの名無しさん
2010/04/26(月) 09:32:24「犬だってにゃぁ」とか「猫だってわん」とかって歌詞があるのを思い出した。
0510デフォルトの名無しさん
2010/04/26(月) 09:41:180511デフォルトの名無しさん
2010/04/26(月) 14:55:14public: virtual void bark() = 0;
};
0512デフォルトの名無しさん
2010/04/26(月) 21:04:13大きいファイルを読もうとしてるので、バッファ領域を確保して、その領域にちまちま
ファイルを読み込んでいこうという魂胆ですが、出力してみると全て0のままです。
小さいファイルなら読み込めるようですが、大きい(200MB以上)では読み込んでくれません。
アドバイスをください。
以下ソース
ifs = fopen("C:\\TEST.wav","rb");
/*** ヘッダー読む ***/
int blockSize = waveHeader.getBlockAlign(); //ブロックサイズを得る
//12000バイトのバッファを確保したつもり
unsigned char *buffer = (unsigned char*)calloc(4000, blockSize);
do {
//12000バイト分のデータを読み込んだつもり
readSize = fread( buffer , blockSize , 4000 , ifs );
for( int i = 0; i < readSize; ++i)
{
//読み込んだデータを出力してみても 0 のままで出力される
cout << ((short*)buffer)[ i * 2] << ":" << ((short*)buffer)[ i * 2 + 1] << endl;
}
} while (readSize == 4000);
0513デフォルトの名無しさん
2010/04/26(月) 21:23:35取り敢えず、blockSizeが幾つになっているのか確認するところからだな。
つーか、通常fread()は失敗しないからdo-whileは要らんだろ。
0514デフォルトの名無しさん
2010/04/26(月) 21:24:27ファイル終端まで読み続けたいんじゃないかと
0515デフォルトの名無しさん
2010/04/26(月) 21:32:360516デフォルトの名無しさん
2010/04/26(月) 21:45:13>>513
blockSizeは4が入ってます。
一応RIFF , fmt , dataなどの文字を確認してヘッダー読み込みOKとしてます。
>>515
変えても何も起こりませんでしたが、確かにマイナスが入るというのは考えにくいですね
こうしておきました。
0517512
2010/04/26(月) 22:00:48char riff[4];
int fileSize;
char formatType[4];
}RIFF;
typedef struct _FORMATCHUNK{
char id[4];
int idFormatSize;
short int formatId;
short int channel;
int sampleRate;
int bytePerSec;
short blockAlign;
short bitsWidth;
}FORMATCHUNK;
typedef struct _DATACHUNK
{
char id[4];
int size;
}DATACHUNK;
ちなみにwaveHeaderは各構造体を持っているだけで
主要な部分のみgetメソッドを作りました。読み込まれたか確認するのは>>516の通りで
ヘッダーの最後にあるDATACHUNK内のsizeを見ても正しいデータが入ってますので
構造体の値はOKかと
0518デフォルトの名無しさん
2010/04/26(月) 22:13:49全て0ってのはどうやって確認してるのかな
出力の一部分だけ覗いてるならその部分がたまたま無音だったとか
0519512
2010/04/26(月) 22:25:12そこはバイナリエディタで開いて確認しました。
最初の方は確かに0でしたが、一回目のfreadで全部読み込める程度しか
なかったので、全部0になっていると判断しました。
あと、いい忘れていましたが、小さいファイルなら do whileを抜けてプログラムが終了しますが
大きいファイルは do whileを抜けてきません。
0520デフォルトの名無しさん
2010/04/26(月) 22:36:11ソースうp!
0521デフォルトの名無しさん
2010/04/26(月) 22:39:060522512
2010/04/26(月) 22:49:34今日は一旦締めせていただきます。
みなさんお付き合いいただき。どうもありがとうございました。m( _ _ )m
>>520
また後日お伺いする機会があれば
是非、よろしくお願いします。
>>521
その通りですね。恥ずかしいです。( /// )
0523デフォルトの名無しさん
2010/04/28(水) 06:34:300524デフォルトの名無しさん
2010/04/29(木) 04:37:54POINT GetPoints() 戻り値が座標の場合
関数が失敗したかどうか分からないので
・bool GetPoints( POINT &out )
戻り値をboolで関数の成功判定、結果を入れる変数渡す
・POINT GetPoints()
失敗の場合(-1,-1)の座標を戻り値とする
どちらの方がいいかな?
両方のパターンを見たことがあるので気になった
0525デフォルトの名無しさん
2010/04/29(木) 05:01:18・例外を投げる
・boost::optional<POINT>を返す
0526デフォルトの名無しさん
2010/04/29(木) 08:14:57その用途で言えば -1,-1 の座標を返すのだけは無しだと思う
個人的には bool 戻す形だな。もしも関数の失敗が通常は起こらない純粋な失敗なら例外でもいいけど、
もしもそれが有効範囲/リージョン判定等でも利用される想定ならシンプルに bool戻す
0527デフォルトの名無しさん
2010/04/29(木) 08:18:010528デフォルトの名無しさん
2010/04/29(木) 08:27:42にして NULL を返すのはあり?
0529デフォルトの名無しさん
2010/04/29(木) 08:28:57それはないわ
0530デフォルトの名無しさん
2010/04/29(木) 08:33:560531デフォルトの名無しさん
2010/04/29(木) 14:25:59例外を投げろ。
C++なら例外と、例外安全くらいはどっちみち知らなきゃだめだから
勉強しよう。
。
0532デフォルトの名無しさん
2010/04/29(木) 15:16:46例外も例外安全もC++だけの話じゃないぜ。どの言語でも同じ。
例外機能の無い言語なら、より広い意味での「エラー安全」ね。
0533デフォルトの名無しさん
2010/04/29(木) 15:17:23エラーがほんとに例外的におきるものなら、例外がいいな
普通にありえるものならそんなのに例外使っちゃいかん
0534デフォルトの名無しさん
2010/04/29(木) 18:20:09if(IsPointsValid()){
POINT pt = GetPoints();
...
}
0535デフォルトの名無しさん
2010/04/29(木) 19:27:48最近、例外安全って言葉を覚えたばかりの人とかは何でもそれを使いたがるかもしれないが、
それはそもそも 「例外的な何かが起こった場合の対処」 を行い、安全にしようって事なので、
元の質問にある「関数が失敗した場合」が何を指すのかによって話しは違ってくるぜ。
他の人も言ってるが、それが本当に例外的な意味での失敗なら例外投げた方がいいが、
そうでない場合、別の手段の方がいい。 そして勉強って意味だと、これらの話を理解して、
何でもそれにする、みたいな頭悪い処理は書かないようにした方がいいぜ
意味がちゃんと伝わると嬉しいが。
0536デフォルトの名無しさん
2010/04/29(木) 19:30:27両方実装したっていいんだぜ。 内容次第じゃ冗長にはなるけども、
しかしあえて冗長に書いて勉強の内にするって手もある。
・・・が、そもそも勉強の意図があるのかどうか不明なので、余計なお世話かもしれないけどもw
0537デフォルトの名無しさん
2010/04/29(木) 19:48:21Win32 API風なら エラー判定値を返す HRESULT GetPoints(POINT *out)
最近のboost風なら 例外を投げる POINT GetPoints( ) と
空値を返す optional<POINT> GetPointsOpt( ) を両方用意するとか。
設計思想によるとしか。
0538デフォルトの名無しさん
2010/04/29(木) 20:18:13D3DXVECTOR2 b = a;
D3DXVECTOR2に自分で定義したVECTOR2を代入したいので以下のようにやったんですが
ランタイム スタック オーバーフローの警告が出ます。
警告を出さないようにするにはどうしたらいいのでしょうか。
class VECTOR2{
VECTOR2():x(0), y(0){}
operator D3DXVECTOR2() const { return static_cast< D3DXVECTOR2>( *this); }
FLOAT x, y;
};
0539デフォルトの名無しさん
2010/04/29(木) 20:26:54operator D3DXVECTOR2() const { return D3DXVECTOR2(x, y); }
0540デフォルトの名無しさん
2010/04/29(木) 20:27:08なんでキャストなんか使うの?
ちゃんとオブジェクト作って返せよ。
0541デフォルトの名無しさん
2010/04/29(木) 20:40:380542デフォルトの名無しさん
2010/04/29(木) 20:52:270543デフォルトの名無しさん
2010/04/29(木) 21:03:091.
> D3DXVECTOR2 b = a; // VECTOR2->D3DXVECTOR2の暗黙の変換を呼び出そうとする
2.
で、VECTOR2::operator D3DXVECTOR2() const がlookupされるわけだが
3.
> static_cast< D3DXVECTOR2>( *this) // ここで、さらにVECTOR2->D3DXVECTOR2の暗黙の変換を呼び出そうとする
以下2-3の繰り返し
そのため> ランタイム スタック オーバーフローの警告
無限再帰でスタック溢れるぞ、って警告が出たんじゃないかと想像。
C++の規格的にどうかが知らん。たぶん未定義動作だと思うが。
0544デフォルトの名無しさん
2010/04/29(木) 21:19:01コンパイルが通るってのがあったな
C++相談室 part79 の955
http://pc12.2ch.net/test/read.cgi/tech/1268846738/955
http://www.unkar.org/read/pc12.2ch.net/tech/1268846738/#l955
vc……
0545デフォルトの名無しさん
2010/04/29(木) 21:28:33元質問者のモデルで (2次元空間での)2直線の交点を返す関数 だったとする
与えられた2直線が平行だった場合
例外投げる? 戻りは解なしを通達・非引数は書き換えず?
俺は後者を選択したくなるけど… 意見を聞いてみたい
0546デフォルトの名無しさん
2010/04/29(木) 21:38:35(HUGE_VAL, HUGE_VAL) を返したくなるな。
(数学座標を扱うものと仮定すれば要素の値は実数だろうし)
0547デフォルトの名無しさん
2010/04/29(木) 21:47:49運用時の前提条件(呼び出される頻度や例外/エラーの頻度等)をがんがん絞り込んでいかないと
決められない部類の問いになっちゃうねー
思想がしっかりしてて、一貫してれば混乱しないだろうけど、取捨選択が難しいな
0548デフォルトの名無しさん
2010/04/29(木) 22:22:23535だけど、そのモデルっていうか、ケースで言えば俺も後者と言うか、
「解無しだ」っていう明示的な何らかの値なりBOOLなりを返して終了かな。
別に俺の意見がどうこうって言うより、そういうもんじゃね?
そして繰り返しになるけど、要はどういう使われ方を想定してるかって話なので
解が無いってのが例外と言うよりただの答え、って言う使われ方なら解がありませんって値を返してあげる方が自然かなと思う。
でも想定するその関数の使われ方の中で、「この関数に与えられる2直線として平行な値が与えられるのは異常なのだ」 って事なら
例外投げて明示するかもしれない。 要点はそこ。 セマンティクスというか考え方っていうか
■ このスレッドは過去ログ倉庫に格納されています