【初心者歓迎】C/C++室 Ver.48【環境依存OK】 at TECH
[2ch|▼Menu]
[前50を表示]
150:デフォルトの名無しさん
08/02/08 02:04:09
スタート

標準入力からデータがcinに行く

cinがtrueになる

while(cin)が評価される

というかんじなんじゃね?

151:デフォルトの名無しさん
08/02/08 02:12:09
>>147
C++では汎用ポインタへのポインタって合法だったっけ。

152:デフォルトの名無しさん
08/02/08 03:44:28
問題ない。

153:デフォルトの名無しさん
08/02/08 03:55:20
coutとfstream(適当なファイルに対してオープン済みのもの)とのそれぞれに、ほぼ同じ処理を書くのですが、
1つの関数にまとめたいと思うのですが、どうすればいいでしょうか?

void print((型が分からない) stream) {
stream << "hogehoge" << endl;
 ...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。


154:デフォルトの名無しさん
08/02/08 07:25:40
>>138
new ヘッダをインクルードする前に
new をマクロで置き換えてないか?

155:デフォルトの名無しさん
08/02/08 10:49:42
>>153
std::ostream

156:デフォルトの名無しさん
08/02/08 11:53:19
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。
@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。

157:デフォルトの名無しさん
08/02/08 11:57:37
>>156
つ[Doxygen]

158:デフォルトの名無しさん
08/02/08 11:59:11
まさに、それですね。
ありがとうございました。

159:デフォルトの名無しさん
08/02/08 13:23:53
例外処理の使い方がいまいち分かりません

例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか

なんというか感覚的に掴みにくいというかなんというか

160:デフォルトの名無しさん
08/02/08 13:25:33
無用物

161:デフォルトの名無しさん
08/02/08 13:32:44
参照を返すとオブジェクトが捨てられたときに
帰ってきたものも向こうに?

162:デフォルトの名無しさん
08/02/08 13:34:05
>>159
自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる

普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ

163:デフォルトの名無しさん
08/02/08 13:34:37
>>161
日本語で

164:デフォルトの名無しさん
08/02/08 13:48:01
>>162
そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・

165:デフォルトの名無しさん
08/02/08 14:03:21
とある3種類の計測器をモニターするプログラムなんですが
似てるけど若干ちがう命令が3つあるとします

この場合
クラス分けをしていくとき
計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか

機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか

どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか

166:デフォルトの名無しさん
08/02/08 14:07:41
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。

なんてことは兎も角、使い易いように作れば?

167:138
08/02/08 15:05:04
返信遅くなってすいません!

>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。

>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。

>>154
マクロも使ってないので違うと思うのですが…

Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・

168:デフォルトの名無しさん
08/02/08 15:22:22
class Fruit;
class Apple : Fruit;

std::vector<Fruit> fruits;を作ると

抽象クラスをインスタンス化できません。
と言われるです。どうするですか?

169:デフォルトの名無しさん
08/02/08 15:23:31
Fruit がそういうつくりになってるんじゃないの?

170:デフォルトの名無しさん
08/02/08 15:24:38
>>168
class Fruitを具体化してください。

171:デフォルトの名無しさん
08/02/08 15:36:19
std::vector<Fruit*> fruits;

172:デフォルトの名無しさん
08/02/08 16:14:45
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?


173:デフォルトの名無しさん
08/02/08 16:23:52
>>167
俺、解決方法知ってるんだが…

174:デフォルトの名無しさん
08/02/08 16:25:09
vevtorにvcの_com_ptrは入りますか?

175:デフォルトの名無しさん
08/02/08 16:59:55
コピー初期化もコピー代入もできるから問題ないはず。

176:デフォルトの名無しさん
08/02/08 22:22:37
すいませんちょっとお聞きしたいんですが、

#include <iostream>
using namespace std;

int main(){
char ss[80] = "これは文字列です";

cout << ss[0] << ss[1];

return 0;

}

ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??

177:デフォルトの名無しさん
08/02/08 22:24:09
UTF-8 なら3バイト必要だが、そういうわけではなくて?

178:デフォルトの名無しさん
08/02/08 22:34:20
>>176
ひょっとしてなんか変な文字がでたりしてるか?

179:176
08/02/08 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m

180:デフォルトの名無しさん
08/02/08 22:40:31
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)

181:デフォルトの名無しさん
08/02/08 22:44:58
それはお前がソースをSJISで書いてるだけ

182:デフォルトの名無しさん
08/02/08 22:55:36
>>175

ども。

183:デフォルトの名無しさん
08/02/08 23:42:34
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。

184:デフォルトの名無しさん
08/02/08 23:43:11
>>181
UTF-16 でも出るがな。

185:デフォルトの名無しさん
08/02/09 00:17:28
他で聞いてきます

186:デフォルトの名無しさん
08/02/09 00:20:35
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか

187:デフォルトの名無しさん
08/02/09 00:33:08
ファイルはあるの?

188:デフォルトの名無しさん
08/02/09 00:40:25
pathの設定はしたか?

189:デフォルトの名無しさん
08/02/09 01:58:17
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。

190:デフォルトの名無しさん
08/02/09 02:00:08
ちなみにコレ
VC++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;

}



191:デフォルトの名無しさん
08/02/09 02:06:46
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?

192:デフォルトの名無しさん
08/02/09 02:15:25
コンパイルできないときはエラーメッセージを書こう

なんてのは宿題スレでも徹底されてるような気がする。

193:デフォルトの名無しさん
08/02/09 02:17:41
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。

194:デフォルトの名無しさん
08/02/09 02:20:34
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。

195:デフォルトの名無しさん
08/02/09 04:37:38
たぶん、ここでしか聞けないのかなと思い書き込みさせてください!
File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって

(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
  extern double a[10][5];
 ・・・・・・・・
}

と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。

196:デフォルトの名無しさん
08/02/09 07:49:02
>>191
ここに見やすく貼るために全角にしてるんよ

>>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だったのかもしれんです。


197:デフォルトの名無しさん
08/02/09 08:25:12
>>191

198:デフォルトの名無しさん
08/02/09 08:27:28
空白orタブ <-> /**/
の置換スクリプトを希望

199:デフォルトの名無しさん
08/02/09 08:28:26
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。

200:デフォルトの名無しさん
08/02/09 08:55:15
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。

201:デフォルトの名無しさん
08/02/09 09:50:51
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。


202:デフォルトの名無しさん
08/02/09 09:59:52
>>195
CGridDlg の 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;

203:デフォルトの名無しさん
08/02/09 10:37:35
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。

204:デフォルトの名無しさん
08/02/09 10:39:09
>>203
ちなみにC言語です。よろしくお願いします。

205:デフォルトの名無しさん
08/02/09 10:41:09
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください

それより多少分かりやすいと評判のものもありますが、大差はありません


それとも環境が用意できないとかそういうことですか?

206:デフォルトの名無しさん
08/02/09 11:54:33
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。

手で入力して試すのが肝心。

付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。


207:デフォルトの名無しさん
08/02/09 13:26:37
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?

208:デフォルトの名無しさん
08/02/09 13:37:27
コピーしようとすると見るエラーだな

209:デフォルトの名無しさん
08/02/09 13:55:53
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。

210:デフォルトの名無しさん
08/02/09 14:04:36
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる

211:デフォルトの名無しさん
08/02/09 15:06:27
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

212:デフォルトの名無しさん
08/02/09 15:07:47
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

>>208さんへのレスでした。

213:デフォルトの名無しさん
08/02/09 15:24:28
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし

214:デフォルトの名無しさん
08/02/09 15:33:48
>>198
つかってやってください
スレリンク(unix板:55番)

215:デフォルトの名無しさん
08/02/09 16:41:15
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?

216:デフォルトの名無しさん
08/02/09 16:49:08
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。

Wikipedia項目リンク

217:デフォルトの名無しさん
08/02/09 16:52:43
あ、なんかすげー誤爆ってた。失礼orz

218:デフォルトの名無しさん
08/02/09 16:58:08
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?

219:203
08/02/09 17:03:06
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。

自分には向いてないのかな…orz

220:デフォルトの名無しさん
08/02/09 17:05:32
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); }

こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです

221:デフォルトの名無しさん
08/02/09 17:12:11
const char *piyo 

222:デフォルトの名無しさん
08/02/09 17:13:49
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。

223:デフォルトの名無しさん
08/02/09 17:14:36
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)

224:220
08/02/09 17:17:20
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました


225:デフォルトの名無しさん
08/02/09 17:18:01
>>219
とりあえず、なにか揮発環境は持っているのか?


226:デフォルトの名無しさん
08/02/09 17:18:34
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。

227:デフォルトの名無しさん
08/02/09 17:19:23
>>225
はい。
ジクロルボスは揮発するので大丈夫です。

228:デフォルトの名無しさん
08/02/09 17:22:30
俺のチームのメンバも先週揮発したぜ。

229:デフォルトの名無しさん
08/02/09 17:23:57
ちょっと待て、それは「蒸発」じゃないのか?

230:デフォルトの名無しさん
08/02/09 17:24:28
>>226
それって問題あるのか?パッと見わからん

231:デフォルトの名無しさん
08/02/09 17:26:23
>>230
char であるときには問題にはならないが int とかになると…

232:デフォルトの名無しさん
08/02/09 17:26:24
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

233:デフォルトの名無しさん
08/02/09 17:26:31
>>229
そうだな。揮発は性質で、蒸発は現象だからな。

234:デフォルトの名無しさん
08/02/09 17:27:47
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw

235:デフォルトの名無しさん
08/02/09 17:27:55
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?

236:デフォルトの名無しさん
08/02/09 17:28:25
>>234
ごめん間違えた

237:デフォルトの名無しさん
08/02/09 17:28:46
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。

238:デフォルトの名無しさん
08/02/09 17:29:06
sizeof(*name)にするべきとか。

239:デフォルトの名無しさん
08/02/09 17:29:46
>>238
阿呆ですか?

240:デフォルトの名無しさん
08/02/09 17:30:00
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ

241:203
08/02/09 17:46:21
>>225
>>240
すいません。もう一度調べなおしてみます。

242:デフォルトの名無しさん
08/02/09 17:47:29
>>238-239
&5[name] でいいだろ。

243:デフォルトの名無しさん
08/02/09 17:49:48
>>242
>232

244:デフォルトの名無しさん
08/02/09 17:58:03
char ch='a';
cout <<(int) ch << '\n'; // 97
int dt=97;
cout << (char)dt<< '\n'; // 'a'
とできるのに、

wchar_t ch1='あ';
cout <<(int) ch1 << '\n'; // 33340
int dt1=33440;
cout << (wchar_t)dt1<< '\n'; // 0x82a0

と'あ'がでないで、82a0が出るのはなぜですか?
(82a0は33440の16進です)

245:デフォルトの名無しさん
08/02/09 18:03:03
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

とすると
(msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。
こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが
str = new char[len+1];部分でエラーが出ているようです、これを
str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね?
一体なんででしょうか?

246:デフォルトの名無しさん
08/02/09 18:10:38
書いてないところのバグを見つけろって言う話?

247:デフォルトの名無しさん
08/02/09 18:10:39
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。

248:デフォルトの名無しさん
08/02/09 18:10:53
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?

249:245
08/02/09 18:12:34
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます

250:245
08/02/09 18:15:42
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです

251:デフォルトの名無しさん
08/02/09 18:16:08
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。

252:251
08/02/09 18:22:16
ごめん、違うな

253:デフォルトの名無しさん
08/02/09 18:23:47
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある

254:デフォルトの名無しさん
08/02/09 18:24:42
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?

255:245
08/02/09 18:36:41
>>253
提示した部分以外をコメントアウトしているのですがエラーが出る状態です

>>254
その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です

test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
 strcpy_s(str, len+1, str0);
 printf("%s\n", str0);
 printf("%d\n", len);
 printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます

256:デフォルトの名無しさん
08/02/09 18:44:34
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?

257:デフォルトの名無しさん
08/02/09 18:44:45
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。

258:デフォルトの名無しさん
08/02/09 18:44:52
おかしいなあ、ちゃんと動くぞよ。

259:デフォルトの名無しさん
08/02/09 18:46:07
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

int main(int, char**)
{
char* buff = "abcdefghijklmnop";
test hoge(buff);
return 0;
}

これで、エラーになるって事?

260:デフォルトの名無しさん
08/02/09 18:53:05
少なくともうちでは落ちない。

VC++ 2005 Express Edition SP1 + Win2KSP4

261:デフォルトの名無しさん
08/02/09 18:59:59
>>255
どの行で例外発生してるか突き止めたのか?

262:244
08/02/09 19:00:55
こちらもヨロ

263:デフォルトの名無しさん
08/02/09 19:02:03
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。

264:244
08/02/09 19:05:57
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。

265:デフォルトの名無しさん
08/02/09 19:06:46
2005はさすがにtypedefじゃないんじゃないか?

266:244
08/02/09 19:10:30
どうすれば確かめられますか?

267:デフォルトの名無しさん
08/02/09 19:14:15
>>266
wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。

268:デフォルトの名無しさん
08/02/09 19:15:47
wchar_tを組み込み型として扱うコンパイルオプションがあったはず

269:244
08/02/09 19:25:45
>>267
すいません、よくわかりません。
>>268
MSDN
------
Visual C++ コンパイラ オプション
/Zc:wchar_t (wchar_t をネイティブ型として認識)
/Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または
wchar_t が定義された多数のヘッダー ファイルのいずれか
(wchar.h など) をインクルードする必要があります。
通常、wchar_t は unsigned short として定義されます。
----
とあったので、このオプションをON/OFFしてみましたが、
結果は変わりませんでした。

270:デフォルトの名無しさん
08/02/09 19:50:27
namespace hoge
{
 int main(int argc, char *argv[])
 {

 }
}

これをコンパイルすると、↓と言われます。どうすればいいですか?
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。


271:デフォルトの名無しさん
08/02/09 19:51:37
>>244
coutはワイド文字に対応していない。
wcoutを使えば良い。

wcout.imbue(locale(""));
wchar_t ch1= L'あ';
wcout << (int)ch1 << L'\n';
int dt1 = 12354;
wcout << (wchar_t)dt1 << L'\n';

272:デフォルトの名無しさん
08/02/09 19:52:06
>>270 何がしたいのか考え直すといいです。

273:デフォルトの名無しさん
08/02/09 20:03:51
>>270

namespace hoge
{
 extern "C" int main(int argc, char *argv[])
 {

 }
}

274:デフォルトの名無しさん
08/02/09 20:18:31
テラ反則w

275:244
08/02/09 20:24:00
>>271
動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!

276:デフォルトの名無しさん
08/02/09 20:29:58
ちょっとお尋ねしたいのですが、
char *p
というポインタに、なにかしらのアドレスが格納されていて、
cout << p;
とした時に、仮に
ss[100] = {a b, c ...}; (ss[100] = \0 とする)
p = ss;
だった場合は、ss[0]から順に\0が出てくるまで走査して、
cout << p;
で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。

では、もしポインタpに格納されているアドレスが普通の変数のアドレス
p = &a
みたいな場合だった時は、
cout << p;
では、単純に変数aのアドレスが出力されるだけですよね。

で、ここで疑問なのですが、
p = &a;
cout << p;
だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、
「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら
毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。
ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?

277:デフォルトの名無しさん
08/02/09 20:30:49
>>274
正しい。

278:デフォルトの名無しさん
08/02/09 20:43:53
>>276
単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。

  char a = 'A';
  char* p = &a;
  cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。


279:デフォルトの名無しさん
08/02/09 20:43:57
>>276
コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。

280:デフォルトの名無しさん
08/02/09 20:47:05
>>276

> p = &a
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。

(aがたとえば int であるとして。)
それは間違い。

> p = &a
これをやった時点でコンパイラは型が違うとエラーにする。
p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。

>処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが
charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。

aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、
そうでなければ制御コードを出力したり文字化けしたりする。



281:デフォルトの名無しさん
08/02/09 20:58:25
>>276は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。

282:176
08/02/09 21:37:59
そーかそもそも文字列を扱うのはchar型だけだから、
<< がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。
ありがとうございましたm(_ _)m


283:デフォルトの名無しさん
08/02/09 23:57:11
こんにちは。角度の比較のよい方法が思いつかずに苦労しています。
 
角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。

角度系は時計の3時が0度、反時計回りに360まであります。
(CはAから見て反時計方向に92度離れています)

単純な比較式
A<B && B<C
とすると、A=350度、B=0度、C=30度のときうまく成立しません。

A,B,Cそれぞれがどの象限にいるかによって
判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。

何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?


284:デフォルトの名無しさん
08/02/10 00:00:30
>>283
そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが?
AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか?
その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?

285:デフォルトの名無しさん
08/02/10 00:11:50
>>283
Aが0度になるようにBとCを回転させればいいよ。

286:デフォルトの名無しさん
08/02/10 00:11:56
>>284

> CはAから見て反時計方向に92度離れています
って記述があるからそれは気にしなくていいんじゃね?
> A=350度、B=0度、C=30度のときうまく成立しません。
ってのは例のつもりだろう。

287:デフォルトの名無しさん
08/02/10 00:15:25
>>283
A' = A - A (=0), C' = C - A (=92), B' = B - A とすれば、
BがAとCの間 <=> B'がA'とC'の間

288:デフォルトの名無しさん
08/02/10 00:15:56
角度を図なしで表現すると難しいですね。 

AとCの作る角の小さいほうにBがあることを確認したい。
(大きい角のほうには「挟まれていない」という認識)

AとCは180度未満(想定は92度です)離れています。




289:デフォルトの名無しさん
08/02/10 00:21:23
B-A, C-Aの角度を-180~+180に換算して、

C-A<B-A<0 または、 C-A>B-A>0なら、AとCの間にBがあるんじゃないかな。

290:デフォルトの名無しさん
08/02/10 00:22:38
AとBの角度 + BとCの角度 < 180
なら挟まれてるよ。

291:デフォルトの名無しさん
08/02/10 00:32:45
どなたか、助けてください。

#include <iostream.h>
#include <stdlib.h>

int main(void)
{
int i,n,*ptr;
cin >> n;
ptr = (int *)calloc(n,sizeof(int));

for(i=0;i<=n-1;i++)
{
cin >> *ptr;
ptr++;
}

for(i=0;i<=n-1;i++)
{
cout << i << "," << ptr << "," << *ptr << endl;
ptr++;
}
return 0;
}

うまく動きません。 orz... どこが間違ってるでしょうか?

292:291
08/02/10 00:38:34
自己解決しますたw

293:デフォルトの名無しさん
08/02/10 00:39:10
すみません。理解できていません
>>287
A'=A-A = 350 - 350 = 0
C'=C-A = 30 - 350 = -320 = fmod( -320+360, 360) = 40
B'=B-A = 0 - 350 = -350 = fmod( -350 + 360, 360) = 10
としておいて A' < B' < C' ( 0 < 10 < 40)
と比較すればよいのでしょうか?

294:デフォルトの名無しさん
08/02/10 00:49:20
C言語より数学を勉強しろよ

295:デフォルトの名無しさん
08/02/10 00:49:21
>>287
うまく行きました。皆さんありがとうございました


296:デフォルトの名無しさん
08/02/10 00:58:44
>>283
リーマン幾何学

297:デフォルトの名無しさん
08/02/10 02:41:34
C++で、以下のようなコードを見たのですが、

int res = 0;
int a = 0;
res >?= a;

こんな書き方はありえないですよね?
>?= の書き手の意図は res > a ? res = a: res
と思うのですが、macroによる置き換えも、>?=のような書き方に
対してはできないですよね?


298:デフォルトの名無しさん
08/02/10 02:49:35
gcc拡張

299:デフォルトの名無しさん
08/02/10 03:53:53
>>298
マジで?
どういう奴ですか?
というか、手元のg++だとコンパイル通らないけど、、、
こんなソースです。(元のソースから問題部分だけ抜き出したもの)
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}


300:デフォルトの名無しさん
08/02/10 03:58:31
ちゃんとC++になってる?

301:デフォルトの名無しさん
08/02/10 04:26:18
>>300
こんな感じです。環境はlinuxです。(version 4.2.1)
$ cat test.cpp
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}
$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:5: error: expected primary-expression before '?' token
test.cpp:5: error: expected primary-expression before '=' token
test.cpp:5: error: expected `:' before ';' token
test.cpp:5: error: expected primary-expression before ';' token


302:デフォルトの名無しさん
08/02/10 08:39:32
まったくの初心者なのですがC言語を勉強しようと思ってます
入門書で独習Cと独習C++がありますが、どちらを買えばいいでしょうか?
また他に良い入門書があれば教えて頂けませんか?

303:デフォルトの名無しさん
08/02/10 08:42:31
>>302
うすい本にしとけ あとはネットで調べればよい 100ページ以下が必須

304:デフォルトの名無しさん
08/02/10 08:43:31
その二つだったら間違いなく独習C。

305:デフォルトの名無しさん
08/02/10 08:48:21
>>302
言葉のあやなのかもしれないが
CとC++は別物だからね

306:デフォルトの名無しさん
08/02/10 08:48:40
日本語学者でなくてもしゃべれるのと同じ うすいやつにしとけ ネットで調べたページだけで勉強しても良い
なるべく動かし方がわかったらSTLに進むべき 
古典的なCプログラムのほとんどはSTLで簡単に書ける

307:デフォルトの名無しさん
08/02/10 08:50:02
たとえばクイックソートや、スタックや、日本語処理など面倒なプログラムは勉強しなくてもSTLなどで置き換えられる

308:デフォルトの名無しさん
08/02/10 08:54:23
unicodeもろくに扱えない糞ライブラリがナニ言ってるんだか

309:デフォルトの名無しさん
08/02/10 09:03:20
>とにかく薄いやつ
これには同意。
入門書で分厚いの買ってもダラダラ無駄に難しく書いてるだけで理解しにくいだけ
基礎中の基礎さえ理解したら実際作って必要になった処理をネットで調べる方がいい

310:デフォルトの名無しさん
08/02/10 09:20:07
STLってunicode扱えないんだっけ?

311:デフォルトの名無しさん
08/02/10 09:21:58
つかえる 一語が判別できないのは charでもおなじ

312:デフォルトの名無しさん
08/02/10 09:41:39
ここ勉強すれば良いよ

URLリンク(www.geocities.co.jp)
URLリンク(rina.jpn.ph)
URLリンク(www.asahi-net.or.jp)

313:デフォルトの名無しさん
08/02/10 09:54:05
>>310
STLに限らずC++にろくなUnicodeサポートがないというだけのこと。
特に気にする必要はない。気にするな。
ただのwchar_tか何かをコンテナに突っ込んで使うだけだ。

314:デフォルトの名無しさん
08/02/10 09:59:53
ああそういうことか
STLが何か文字コードに依存してるのかと思ったよ

315:デフォルトの名無しさん
08/02/10 10:01:29
たとえば10文字目が何バイト目とか判別できないだけ

316:デフォルトの名無しさん
08/02/10 10:20:58
>>301
GCC 4.0.4, 4.1.2 と 4.2.3 のマニュアルには...

| The G++ minimum and maximum operators (‘<?’ and ‘>?’) and
| their compound forms (‘<?=’) and ‘>?=’) have been deprecated
| and will be removed in a future version. Code using these operators
| should be modified to use std::min and std::max instead.

[Excite 翻訳]
| そして、'G++最小の、そして、最大のオペレータ、(‘<?'、‘>、'、)、
| 彼らの合成フォーム(‘<?=')と‘>=') 非難して、将来のバージョンで取り
| 除くでしょう。 これらのオペレータを使用するコードはstdに以下を使用
| するように変更されるべきです:分とstd:、:代わりに最大限にしてください。

となってるから、4.2.1 なら使えるはずだが、なんかオプションがいるのかも
しれないな。

ちなみに 4.0.4 の一つ前の 3.4.6 のマニュアルには '>?=' 自体の説明がな
いから、実験的に付け加えられた拡張に思える。

317:デフォルトの名無しさん
08/02/10 10:36:34
excite翻訳ひどいなw
g++の最小・最大演算子とその合成形はすでに非推奨であり
将来のバージョンでは廃止されます。これらの演算子を使用
しているコードは代わりに std::min と std::max を使用するように変更すべきです。

318:デフォルトの名無しさん
08/02/10 11:03:47
T"なんたら"

L"なんたら"
に置き換えるマクロはどう書くですか?

319:デフォルトの名無しさん
08/02/10 11:04:42
#define T Lでできなければ無理。
Windowsは関数形式のマクロにして対処している。

320:デフォルトの名無しさん
08/02/10 12:13:50
template<class L>

321:デフォルトの名無しさん
08/02/10 12:17:02
gcc だと wchar_t は4バイトで UTF-32 を入れるようになっている。
wchar_t はあくまでその環境で扱える最大の文字コードを格納できる文字型でしかなく、
2バイト固定でもなければ UTF-16 や UCS-2 専用のものでもない。

C++0x ではそこんとこ困るってことで
UTF-16 と UTF-32 を直接サポートするようになる予定のようだ。
また VC++ が対応遅らせそうな気がして憂鬱になるが。

322:デフォルトの名無しさん
08/02/10 12:36:12
NT3.1時代からUnicode使ってきたOSに従うべき。

323:デフォルトの名無しさん
08/02/10 13:33:02
先日こちらでアドバイスをいただき、プログラムを
書いてみました。学校でできなかった分を家で作成しようと
ソースを持ち帰ったのですが文字化けしてしまい開くことが
できなくて困っています。

学校では秀丸エディタで「.cpp」の拡張子で保存をして
gccでコンパイルをしているようなのですが、同じ様な
環境を作ることは可能なのでしょうか?

winのメモ帳でも開けるものだと思っていたので困っています。
どうかよろしくお願いします。

324:291
08/02/10 13:34:37
おそらく文字コードが違うんだろ。
nkf使うか、メモ帳以外のエディタでソースコード見れ

325:デフォルトの名無しさん
08/02/10 13:36:29
まずはまともなエディタを使うんだ
秀丸にあわせるのがよいかと思うがサクラエディタなど他にもいろいろある

*.cppをgccでコンパイルというのもなんか引っかかるが・・・

326:デフォルトの名無しさん
08/02/10 13:37:13
>>323
秀丸のエンコーディングを一時的に変えるか、まともなフリーなエディタを拾って使えばいいんでない?

327:デフォルトの名無しさん
08/02/10 13:56:49
つーかC/C++全然関係ない問題なのなw

328:デフォルトの名無しさん
08/02/10 14:42:18
回答いただきありがとうございます。
327さんの仰るとおり、C以前の問題でした申し訳ありません。

>>325
gccでコンパイルというのは、なにかおかしいのでしょうか?
コンパイル時のコマンドがそのようなコマンドを入力すると
教えられたのです。

まずはエディタを探してみることからはじめてみます。
ありがとうございました。

329:デフォルトの名無しさん
08/02/10 14:48:08
.cppなら普通gccではなくg++を使う。

330:デフォルトの名無しさん
08/02/10 14:55:04
結局はgccだけどな

331:デフォルトの名無しさん
08/02/10 15:44:22
質問です。
最近Cを勉強していますが、コンパイルが上手く出来ません。

コンパイラーはBorland C++ Compiler5.5を使ってます。
コンパイルすると、「指定されたパスが見つかりません」となります。
原因は何が考えられますか?

332:デフォルトの名無しさん
08/02/10 15:45:20
#include <iostream>

#include <iomanip>
ってどういうとき使うの?


333:デフォルトの名無しさん
08/02/10 15:46:08
Pathを通してないのが原因。

setbccでぐぐるとよい。

334:デフォルトの名無しさん
08/02/10 15:46:20
宣言や定義を使用するとき。

335:デフォルトの名無しさん
08/02/10 15:47:03
std::coutとかstd::cinとか使いたければ、まず<iostream>をインクルードする。
その上で、引数のあるマニピュレータが集められているのが<iomanip>。

336:デフォルトの名無しさん
08/02/10 15:49:39
>>332レベルの質問する奴に只「マニピュレータ」なんて書いたって通じないだろ

と思って解説を書こうとしたけど、うんこしたくなったので中止

337:デフォルトの名無しさん
08/02/10 15:54:56
でもそれ見てマニピュレータで検索すればすぐ解決すると思うけどw

338:デフォルトの名無しさん
08/02/10 16:08:51
用途としては>>49みたいな場合に。

339:デフォルトの名無しさん
08/02/10 22:21:50
test

340:デフォルトの名無しさん
08/02/10 22:28:40
十進数の入力を二進数表示するコードを書いてみたんですが、
最初MASKを0x01に設定して1とか255とか入力したら桁が上下逆になりました。
0x80000000に設定して頭からチェックさせてやったらうまくいったんですが、
intel系のプロセッサはリトルエンディアンだからビットを上下逆に扱うんじゃないんですか?

/* d2b.c */

#include <stdio.h>

#define MASK 0x80000000

int main(void)
{
unsigned int x;
int n;

scanf("%d", &x);

for(n = 0; n < 32; n++){
if( ((x << n) & MASK) == 0)
putchar('0');
else
putchar('1');
if( (n+1) % 4 == 0)
putchar(' ');
}

return(0);
}


341:デフォルトの名無しさん
08/02/10 22:34:58
>>340
×ビットを上下逆
○バイトの並びが逆

342:デフォルトの名無しさん
08/02/10 22:35:39
エンディアン関係ナス

343:340
08/02/10 22:37:25
>>341
バイト単位で逆なんですね。
>>342
あ、全然関係ないんですか;

ありがとうございましたm(__)m

344:デフォルトの名無しさん
08/02/10 23:18:02
stdio.hのremove関数の使い方は下記で問題ないでしょうか?
remove("ファイルのパス");

今現在、例えば
remove("D:\\test\\test.txt");
こんな具合の1文だけを試しても成功しません、-1が返ってきて失敗しているようです
パスは絶対パスで問題ないと思いますし、testフォルダとtest.txtは試しに作ってみたものです
プログラム中で開いてもいませんし読み取り専用でもありません

見当がつかず困っています、何かご存知の方いたらよろしくお願いします

345:デフォルトの名無しさん
08/02/10 23:21:13
>>344 perror() してみれ

346:デフォルトの名無しさん
08/02/10 23:22:15
>>344
そのパスと同じままfopenして開けるのか?
つまりほんとにそのファイルをプログラムから認識できているのかをチェキラ!
あと、strerrorでエラー内容を取得してみては?

347:デフォルトの名無しさん
08/02/10 23:23:36
test.txt.txtだったりして・・・ いやさすがにそれはないか

348:デフォルトの名無しさん
08/02/10 23:26:52
Dドライブは実はDVD-ROMドライブだったりして・・・いやさすがにそれはないか

349:デフォルトの名無しさん
08/02/10 23:30:58
そもそもDドライブが存在しな・・・ないか ないよな

350:344
08/02/10 23:32:54
permission deniedというエラーが・・
ファイルのプロパティは読み取り専用とか隠しファイルとかチェック入っていないんですが
全く違う部分なんでしょうか?

351:デフォルトの名無しさん
08/02/10 23:33:25
chmod a+w FILENAME

352:デフォルトの名無しさん
08/02/10 23:35:53
Dドライブがネットワークドライブ・・
のわけないよな

353:デフォルトの名無しさん
08/02/10 23:36:33
>>351
ahodesuka?

354:344
08/02/10 23:36:53
>>351
うわぁ・・そういうの必要なんですか・・
Cじゃ書けないですよね?

Dはあります

355:デフォルトの名無しさん
08/02/10 23:37:30
^^;

356:デフォルトの名無しさん
08/02/10 23:37:45
WindowsXP と仮定して

1.コマンドプロンプトを開く
[スタートメニュー]-[ファイル名を指定して実行]
cmd

2.コマンドプロンプトで下記の三つのコマンドを打つ
D:
cd \test
dir

これで
test.txt
があるかどうか確認する

357:デフォルトの名無しさん
08/02/10 23:38:17
>>351
それはUNIXだろ。
DOSとWindowsは
rd /s/q c:\
だろ。


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

4943日前に更新/249 KB
担当:undef