【初心者歓迎】C/C++室 Ver.48【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/05(火) 01:18:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0133デフォルトの名無しさん
2008/02/07(木) 20:03:47そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。
>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?
0134デフォルトの名無しさん
2008/02/07(木) 20:22:12下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。
0135デフォルトの名無しさん
2008/02/07(木) 20:47:14/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ
`ーー' γ⌒`ヽ /'⌒⌒ヽ、
,-ーー-、 .|| ̄ ̄ ( ┃ ⌒ヽ
/ ┃ ) || ∧_∧ \ ━┛ )
.(. ┃ ) ||. ( `ハ´;)
ヽ、__,ノ || _(つ¶¶と)__
/||'''''| 三 | |'(⌒)
/ '―――――`  ̄ \
`============'
0136デフォルトの名無しさん
2008/02/07(木) 20:51:06なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。
ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。
0137デフォルトの名無しさん
2008/02/07(木) 21:14:240138デフォルトの名無しさん
2008/02/07(木) 21:17:09C++のプログラムを実行すると
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。
c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。
と出てしまいます。
どんなプログラムでもこのエラーが出てしまい実行できません…
どのようにすればこのエラーはなくなりますか?
0139デフォルトの名無しさん
2008/02/07(木) 21:18:22そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。
0140デフォルトの名無しさん
2008/02/07(木) 21:25:29必要なものが入ってないか入れる設定にしていない。
_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)
俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ
0141デフォルトの名無しさん
2008/02/07(木) 21:37:29>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。
0142デフォルトの名無しさん
2008/02/07(木) 22:03:32Visual C++ 2008 Expressとかだとどうなる?
0143デフォルトの名無しさん
2008/02/07(木) 22:50:19(遅くなりましたが)
ありがとうございました。
0144デフォルトの名無しさん
2008/02/07(木) 23:20:56標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。
どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。
void a( void** p ) {
if( rand() %2 ) delete *p;
}
void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
0145デフォルトの名無しさん
2008/02/08(金) 01:48:100146デフォルトの名無しさん
2008/02/08(金) 01:50:440147デフォルトの名無しさん
2008/02/08(金) 01:59:05if( rand() %2 ){
delete *p;
*p = NULL; // delete後はNULLを入れておく
}
}
void main () {
char*pc = NULL; // ポインタは普通NULLで初期化しておく
if( rand() %2 )
new char[100];
a(&pc);
delete pc; // pcがNULLなら何もしない
}
0148デフォルトの名無しさん
2008/02/08(金) 01:59:41...
}
という処理についてなんですが、cinって最初はとりあえずtrueになるのですか?
すると、いつfalseになるんですか?
エラーフラグがたってればfalse、それ以外はtrueになるのかな?
cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。
0149デフォルトの名無しさん
2008/02/08(金) 02:00:03pc = new char[100] でした。
0150デフォルトの名無しさん
2008/02/08(金) 02:04:09↓
標準入力からデータがcinに行く
↓
cinがtrueになる
↓
while(cin)が評価される
というかんじなんじゃね?
0151デフォルトの名無しさん
2008/02/08(金) 02:12:09C++では汎用ポインタへのポインタって合法だったっけ。
0152デフォルトの名無しさん
2008/02/08(金) 03:44:280153デフォルトの名無しさん
2008/02/08(金) 03:55:201つの関数にまとめたいと思うのですが、どうすればいいでしょうか?
void print((型が分からない) stream) {
stream << "hogehoge" << endl;
...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。
0154デフォルトの名無しさん
2008/02/08(金) 07:25:40new ヘッダをインクルードする前に
new をマクロで置き換えてないか?
0155デフォルトの名無しさん
2008/02/08(金) 10:49:42std::ostream
0156デフォルトの名無しさん
2008/02/08(金) 11:53:19@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。
0157デフォルトの名無しさん
2008/02/08(金) 11:57:37つ[Doxygen]
0158デフォルトの名無しさん
2008/02/08(金) 11:59:11ありがとうございました。
0159デフォルトの名無しさん
2008/02/08(金) 13:23:53例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか
なんというか感覚的に掴みにくいというかなんというか
0160デフォルトの名無しさん
2008/02/08(金) 13:25:330161デフォルトの名無しさん
2008/02/08(金) 13:32:44帰ってきたものも向こうに?
0162デフォルトの名無しさん
2008/02/08(金) 13:34:05自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる
普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ
0163デフォルトの名無しさん
2008/02/08(金) 13:34:37日本語で
0164デフォルトの名無しさん
2008/02/08(金) 13:48:01そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・
0165デフォルトの名無しさん
2008/02/08(金) 14:03:21似てるけど若干ちがう命令が3つあるとします
この場合
クラス分けをしていくとき
計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか
機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか
どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか
0166デフォルトの名無しさん
2008/02/08(金) 14:07:41その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。
なんてことは兎も角、使い易いように作れば?
0167138
2008/02/08(金) 15:05:04>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。
>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。
>>154
マクロも使ってないので違うと思うのですが…
Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・
0168デフォルトの名無しさん
2008/02/08(金) 15:22:22class Apple : Fruit;
std::vector<Fruit> fruits;を作ると
抽象クラスをインスタンス化できません。
と言われるです。どうするですか?
0169デフォルトの名無しさん
2008/02/08(金) 15:23:310170デフォルトの名無しさん
2008/02/08(金) 15:24:38class Fruitを具体化してください。
0171デフォルトの名無しさん
2008/02/08(金) 15:36:190172デフォルトの名無しさん
2008/02/08(金) 16:14:45しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?
0173デフォルトの名無しさん
2008/02/08(金) 16:23:52俺、解決方法知ってるんだが…
0174デフォルトの名無しさん
2008/02/08(金) 16:25:090175デフォルトの名無しさん
2008/02/08(金) 16:59:550176デフォルトの名無しさん
2008/02/08(金) 22:22:37#include <iostream>
using namespace std;
int main(){
char ss[80] = "これは文字列です";
cout << ss[0] << ss[1];
return 0;
}
ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??
0177デフォルトの名無しさん
2008/02/08(金) 22:24:090178デフォルトの名無しさん
2008/02/08(金) 22:34:20ひょっとしてなんか変な文字がでたりしてるか?
0179176
2008/02/08(金) 22:34:23cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m
0180デフォルトの名無しさん
2008/02/08(金) 22:40:310181デフォルトの名無しさん
2008/02/08(金) 22:44:580182デフォルトの名無しさん
2008/02/08(金) 22:55:36ども。
0183デフォルトの名無しさん
2008/02/08(金) 23:42:340184デフォルトの名無しさん
2008/02/08(金) 23:43:11UTF-16 でも出るがな。
0185デフォルトの名無しさん
2008/02/09(土) 00:17:280186デフォルトの名無しさん
2008/02/09(土) 00:20:35とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか
0187デフォルトの名無しさん
2008/02/09(土) 00:33:080188デフォルトの名無しさん
2008/02/09(土) 00:40:250189デフォルトの名無しさん
2008/02/09(土) 01:58:17いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。
0190デフォルトの名無しさん
2008/02/09(土) 02:00:08VC++2008 g++ 4.0 でも不可
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
(argc > 2
? ofstream(argv[2], ios::out | ios::binary)
: cout)
<<
(argc > 1
? ifstream(argv[1], ios::in | ios::binary)
: cin )
.rdbuf();
return 0;
}
0191デフォルトの名無しさん
2008/02/09(土) 02:06:460192デフォルトの名無しさん
2008/02/09(土) 02:15:25なんてのは宿題スレでも徹底されてるような気がする。
0193デフォルトの名無しさん
2008/02/09(土) 02:17:41まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。
0194デフォルトの名無しさん
2008/02/09(土) 02:20:34テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。
0195デフォルトの名無しさん
2008/02/09(土) 04:37:38File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって
(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
extern double a[10][5];
・・・・・・・・
}
と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。
0196デフォルトの名無しさん
2008/02/09(土) 07:49:02ここに見やすく貼るために全角にしてるんよ
>>192
VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。
>>193
ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?
>>194
昔の規格なりコンパイラではOKだったのかもしれんです。
0197デフォルトの名無しさん
2008/02/09(土) 08:25:120198デフォルトの名無しさん
2008/02/09(土) 08:27:28の置換スクリプトを希望
0199デフォルトの名無しさん
2008/02/09(土) 08:28:26>昔の規格なりコンパイラではOKだったのかもしれんです。
0200デフォルトの名無しさん
2008/02/09(土) 08:55:15左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。
0201デフォルトの名無しさん
2008/02/09(土) 09:50:51externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。
0202デフォルトの名無しさん
2008/02/09(土) 09:59:52CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。
class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};
Hoge* a = grid_dlg.GetA();
a[0][0] = 1;
0203デフォルトの名無しさん
2008/02/09(土) 10:37:35超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。
0204デフォルトの名無しさん
2008/02/09(土) 10:39:09ちなみにC言語です。よろしくお願いします。
0205デフォルトの名無しさん
2008/02/09(土) 10:41:09その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください
それより多少分かりやすいと評判のものもありますが、大差はありません
それとも環境が用意できないとかそういうことですか?
0206デフォルトの名無しさん
2008/02/09(土) 11:54:33その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。
手で入力して試すのが肝心。
付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
0207デフォルトの名無しさん
2008/02/09(土) 13:26:37なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?
0208デフォルトの名無しさん
2008/02/09(土) 13:37:270209デフォルトの名無しさん
2008/02/09(土) 13:55:53ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。
0210デフォルトの名無しさん
2008/02/09(土) 14:04:36static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
0211デフォルトの名無しさん
2008/02/09(土) 15:06:27>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
0212デフォルトの名無しさん
2008/02/09(土) 15:07:47無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
は>>208さんへのレスでした。
0213デフォルトの名無しさん
2008/02/09(土) 15:24:28コンソール自体が2個に増えるわけじゃあるまいし
0214デフォルトの名無しさん
2008/02/09(土) 15:33:48つかってやってください
ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55
0215デフォルトの名無しさん
2008/02/09(土) 16:41:15環境が用意できないです。
それでもあきらめた方がいいですか?
0216デフォルトの名無しさん
2008/02/09(土) 16:49:08そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。
ttp://ja.wikipedia.org/wiki/HDV
0217デフォルトの名無しさん
2008/02/09(土) 16:52:430218デフォルトの名無しさん
2008/02/09(土) 16:58:08Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
0219203
2008/02/09(土) 17:03:06自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。
自分には向いてないのかな…orz
0220デフォルトの名無しさん
2008/02/09(土) 17:05:32こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
0221デフォルトの名無しさん
2008/02/09(土) 17:12:110222デフォルトの名無しさん
2008/02/09(土) 17:13:49書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。
0223デフォルトの名無しさん
2008/02/09(土) 17:14:36hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
0225デフォルトの名無しさん
2008/02/09(土) 17:18:01とりあえず、なにか揮発環境は持っているのか?
0226デフォルトの名無しさん
2008/02/09(土) 17:18:34彼は大丈夫だろうか。
0227デフォルトの名無しさん
2008/02/09(土) 17:19:23はい。
ジクロルボスは揮発するので大丈夫です。
0228デフォルトの名無しさん
2008/02/09(土) 17:22:300229デフォルトの名無しさん
2008/02/09(土) 17:23:570230デフォルトの名無しさん
2008/02/09(土) 17:24:28それって問題あるのか?パッと見わからん
0231デフォルトの名無しさん
2008/02/09(土) 17:26:23char であるときには問題にはならないが int とかになると…
0232デフォルトの名無しさん
2008/02/09(土) 17:26:24>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
■ このスレッドは過去ログ倉庫に格納されています