トップページ⇒tech
1001コメント314KB

C++なら俺に聞け(入門篇)

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/15(日) 16:37:23
C++の入門者向け解説スレです。

C言語はあってC++が無いのは寂しいので作成
01531512006/12/09(土) 22:20:17
i > 0になったところで、永続ループになりますか?
01541452006/12/09(土) 22:30:20
>>153
問題ない
0155デフォルトの名無しさん2006/12/09(土) 22:33:20
副作用とか大丈夫だったっけ?
0156デフォルトの名無しさん2006/12/09(土) 22:33:27
>>152 家のPCに開発環境なんて入れてません。
というか、スレタイ見てね(はーと

>>154 ありがとうございます。
問題ない=10回繰り返す=i > 0になったところで、永続ループにならない、
と理解しましたが、OKですね。

月曜日に試してみます。
0157デフォルトの名無しさん2006/12/09(土) 22:34:59
俺に聞けスレだったな。スマンカッタ。
0158デフォルトの名無しさん2006/12/09(土) 22:41:36
>>157 そう言われてしまうと、こちらもスマンカッタ。
0159デフォルトの名無しさん2006/12/09(土) 23:00:36
そして二人の間に友情が芽生えた

>>155
なんかあったっけ?
0160デフォルトの名無しさん2006/12/09(土) 23:38:53
聞くのはいいが、開発環境くらい入れとけと
0161デフォルトの名無しさん2006/12/10(日) 16:40:57
vectorのn番目の要素のイテレータをずばっと得るにはどうすりゃいいの?

it = vec.begin();
std::advance(it, n);
は思いついたけどこれって線形時間掛かるんじゃなくて?
0162デフォルトの名無しさん2006/12/10(日) 16:51:35
いいえ。
0163デフォルトの名無しさん2006/12/10(日) 16:52:14
vec.begin()+n
ちなみに大抵の処理系でstd::advanceは各イテレータコンセプトについて
適切に実装されているから上のような書き方をする必要はない。
規格でそう決まっていたかはシラネ
0164デフォルトの名無しさん2006/12/10(日) 17:40:52
規格でそう決まっている。 24.3.4
0165デフォルトの名無しさん2006/12/10(日) 17:46:00
THX
0166デフォルトの名無しさん2006/12/10(日) 18:00:52
advanceなんてあるのか
今までforループ使ってた…
勉強になるな
0167デフォルトの名無しさん2006/12/10(日) 18:14:42
あはは。普通に+演算子オーバーロードされてるじゃーん。気付けよ、俺。orz

>>162-164
�d
0168デフォルトの名無しさん2006/12/10(日) 18:28:56
【標準出力の画面を消去する方法】
一つ目の標準出力   (例) cout << "前画面\n"

をしてから、

二つ目の標準出力   (例) cout << "次画面\n"

をしたときに、
------------------------
前画面
次画面
------------------------
ではなく、最初に出力した内容を消去して
------------------------
次画面
------------------------
とする方法を教えていただけますか?
0169デフォルトの名無しさん2006/12/10(日) 18:36:12
>>168
標準ではできない。たぶんコンソール操作を行うライブラリを使う必要がある。
0170デフォルトの名無しさん2006/12/10(日) 18:53:05
>>169
レスありがとうございます。

少しWEBで検索しました。
>コンソール操作を行うライブラリ
これは、
ttp://www.kumei.ne.jp/c_lang/intro/no_61.htm
みたいなのを自作するということでしょうか?
0171デフォルトの名無しさん2006/12/10(日) 19:11:25
>>170
コンソールアプリなら
#include <conio.h>
void clrscr(void);
これ使えねー?
0172デフォルトの名無しさん2006/12/10(日) 19:33:58
>>171
>void clrscr(void);
使い方は、
ヘッダをインクルードして、
clrscr();
ですよね?
エラーが出てしまいます。(なんで?)
VS EEでは使えないのでしょうか?
(.\main.cpp(73) : error C3861: 'clrscr': 識別子が見つかりませんでした)
0173デフォルトの名無しさん2006/12/10(日) 19:47:18
WindowsSDKを入れましょう
0174デフォルトの名無しさん2006/12/10(日) 20:01:53
>>173
WindowsSDKってのは、Windows Platform SDKのことですか?
これは、

 高機能でパフォーマンスに優れた Windows アプリケーションを
 作成できます。

と書いてありました。

私はコンソールアプリケーションで作成していますが、いいですか?

ダウンロードは、3つくらい候補があるようですが、
英語で私には難しいかもしれません。
 PSDK-amd64.exe 1.3 MB
 PSDK-ia64.exe 1.4 MB
 PSDK-x86.exe 1.3 MB

0175デフォルトの名無しさん2006/12/10(日) 20:08:56
>>172
VS EEって何?
0176デフォルトの名無しさん2006/12/10(日) 20:12:39
>>175
>VS EEって何?
Visual C++ 2005 Express Editionです。
0177デフォルトの名無しさん2006/12/10(日) 20:14:17
>>175
>VS EEって何?
略している人がいましたが、VSなんて略さないかもしれないですね。
略すならVCかも。
0178デフォルトの名無しさん2006/12/10(日) 20:19:48
>>176
変に略さんでくれ

http://msdn2.microsoft.com/ja-jp/library/system.console.clear(VS.80).aspx
これのC++の部分
Console::Clear();  と書いてある
0179デフォルトの名無しさん2006/12/10(日) 20:20:32
>>174
PlatformSDKとWindowsSDKは違う。
Platform SDK + NET SDK = Windows SDK
0180デフォルトの名無しさん2006/12/10(日) 20:21:46
>>178
ドトネトはスレ違い
0181デフォルトの名無しさん2006/12/10(日) 20:28:43
>>179

>PlatformSDKとWindowsSDKは違う。
>Platform SDK + NET SDK = Windows SDK
そうですか。
0182デフォルトの名無しさん2006/12/10(日) 20:30:58
>>168
\nの代わりに\rを使うとそういう風になる環境は結構ある。
Windowsのコンソールもそうなっているはず。
0183デフォルトの名無しさん2006/12/10(日) 20:43:25
>>182
>\nの代わりに\rを使うとそういう風になる環境は結構ある。
これはその行の先頭へ復帰する、というだけだったと思いますが......
0184デフォルトの名無しさん2006/12/10(日) 20:49:24
>>183
いったん画面をクリアしたいんだろ
0185デフォルトの名無しさん2006/12/10(日) 21:04:22
行の先頭に戻れても前の行は消せないだろカス
0186デフォルトの名無しさん2006/12/10(日) 21:07:49
>>185
えっ?
0187デフォルトの名無しさん2006/12/11(月) 16:29:38
システムエラー時以外で例外を使うのはダメプログラム?
例えば、ファイル名を決めていないのに上書き指示を受け取ったときとか。
0188デフォルトの名無しさん2006/12/11(月) 16:53:25
その例外に対処するのが至近距離にいるなら、通常のエラー処理で十分な気はする。
まとめて受け取り処理できる受け皿があるなら、普通に例外投げれば。

上記の例は例外対象じゃないだろ。
設計エラーな気すらする。
0189デフォルトの名無しさん2006/12/11(月) 16:58:35
書き込み禁止になってたりした時には例外飛ばしたいような気もするし、
名無しの場合も例外でもいいんじゃないかという気もする。

Windows でメニューに上書きコマンドを持つソフトなら、
メニューアイテムをグレイにしなきゃならんから事前にチェックする
ことになると思うけど。
0190デフォルトの名無しさん2006/12/11(月) 17:03:26
よくわからんのだが、名無しで書込み禁止なんて状況、あるんだ?
デタラメにハッシュとかで名前作ってみたらたまたま既に居て書込み禁止だったよとか、そんな状況?
0191デフォルトの名無しさん2006/12/12(火) 03:00:24
std::logic_error の出番だな。
0192デフォルトの名無しさん2006/12/12(火) 18:39:09
文字列ストリームのostringstreamへの出力に限界ってあるのでしょうか?

ostringsteam ret;
ret << "****************";

って感じで、文字列ストリームを宣言して、
テキストファイルを読み込んで、
内容を編集し、
文字列ストリームに出力します。

プログラムの最後で、
ofstream fout
と生成した出力オブジェクトfoutに
fout << ret.str();
という風に出力しているんですが、
なぜかある一定サイズ(28行くらい)を超えると、
ダイアログが出て
『問題が発生したため、****.exeを終了します。
ご不便をおかけして申し訳ありません』
と言われます。なぜでしょう?
0193デフォルトの名無しさん2006/12/12(火) 19:01:09
>>192
>なぜでしょう?

バグでしょう。
0194デフォルトの名無しさん2006/12/12(火) 19:01:40
コードと環境晒せよ
0195デフォルトの名無しさん2006/12/16(土) 10:39:27
下で使うメンバ関数のgetはCのgetcharと似ていると思います。
同じくCのgetchに似ている関数ってありますか?

#include <iostream>
using namespace std;
int main()
{
int ich;
while( (ich = cin.get) != EOF ){
cout.put(ich);
 }
}
0196デフォルトの名無しさん2006/12/16(土) 11:05:57
ない。
基本的にC++の入出力はCのそれと同じ機能を持っている。
ちょうどgetchar/(f)getcはstd::istream::getに対応している。
しかしgetchは標準でないので、C++に対応するものはない。
0197デフォルトの名無しさん2006/12/16(土) 11:14:05
>>196
回答感謝です。
そうですか。
わかりました。
0198デフォルトの名無しさん2006/12/16(土) 14:18:46
関数の引数に****.c_str()を入れて、関数内でファイルからデータを読み込むのは
どうすればいいのでしょうか・・・・?

****=ファイル名
0199デフォルトの名無しさん2006/12/16(土) 17:17:56
>>198
日本語でどうぞ。
0200デフォルトの名無しさん2006/12/17(日) 06:58:47
****.c_str()
ていうことは、
****
はstringですよね?
stringにファイル名を入れてそのファイルをreadするなら

○-----○-----○-----○-----○-----○-----○-----○-----
string ----- = "パス名"; ← ----は文字列 (末尾に、"\\")
---- += "ファイル名"
filein.open((----.c_str()), ios::in);
○-----○-----○-----○-----○-----○-----○-----○-----

でだめですか?
0201デフォルトの名無しさん2006/12/17(日) 08:18:52
なにこの頭悪そうな流れ。
0202デフォルトの名無しさん2006/12/17(日) 10:43:59
はぁ? なんのことじゃ? >>201
0203デフォルトの名無しさん2006/12/17(日) 17:07:09
coutで2350000と表示したいんですが、
どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?
0204デフォルトの名無しさん2006/12/17(日) 19:16:58
いきなりすいません。
Visual C++でC++を書いていたのですが、
どこかのショートカットキーを押してしまい、
スペースが・で表示されたり、
Tabが→(矢印)で表示されるようになってしまいました。
どうすれば元に戻せますか?
0205デフォルトの名無しさん2006/12/17(日) 19:23:00
>>204
(VCのエディタの設定が変わったのでしょうかね?[ツール]-[オプション]とか適当にいじってもダメですか)
私は設定にはあまり詳しいわけでないのでお答えできませんが、
VCのシリーズによって、微妙に設定方法って違うかもしれませんね。
(基本的には同じだと思いますが)
0206デフォルトの名無しさん2006/12/17(日) 20:06:57
>>203
double d = 2350000.;
std::cout << std::ios::fixed << d << std::endl;
0207デフォルトの名無しさん2006/12/17(日) 20:11:20
>>204
204です。
205さん、アドバイスありがとうございます。
[ツール]-[オプション]をいじってみたのですが、
今のところ元に戻りません…
0208デフォルトの名無しさん2006/12/17(日) 20:23:25
>>203
このへん
http://www.geocities.jp/cbc_vbnet/vc/console.html
04.マニピュレータ
0209デフォルトの名無しさん2006/12/17(日) 22:37:19
>206>208
どうもありがとうございました。
問題は解決されました・・
0210デフォルトの名無しさん2006/12/18(月) 00:02:30
関数アダプタかまして作り出したオブジェクトって、
元にしたオブジェクトが死んだら使えなくなるの?

関数アダプタって、どう言う仕組みで実装できてるのだ?
0211デフォルトの名無しさん2006/12/18(月) 00:06:56
Visual C++ を使っています。
行列の固有値と固有ベクトルを求めるため、
ttp://www.neuro.sfc.keio.ac.jp/~masato/source/
このサイトにあるヘッダーファイルとリソースファイルを組み込み、マニュアルに示されているとおり、
#include <stdio.h>
#include "matrix.h"
void main(void)
{
Matrix A(2, 2), X;
Vector lamda;

A[0][0] = 3.0; A[0][1] = 2.2; // 行列 A 3.0 1.2
A[1][0] = 1.2; A[1][1] = 2.0; // 1.2 2.0

X = A.eigen(&lamda);

printf("\neigen value = ");
lamda.print();
printf("\neigen vector =\n");
X.print();
}
として、コンパイルしたところ、
 1番目の引数を 'Vector *' から'Vector &'に変換できません。(新しい機能; ヘルプを参照)
というエラーが出ます。どうようにすればよいのかぜひ教えてください。
02122042006/12/18(月) 00:19:44
Visual C++の表示が変わってしまった件が解決しました。
(ctrl+R) + (ctrl+W) で元に戻りました。
205さん、ありがとうございました。
0213デフォルトの名無しさん2006/12/18(月) 00:29:10
>>211
ざっと見た感じ
X = A.eigen(&lamda)ではなくて
X = A.eigen(lamda);じゃないか?

(実際に確かめてないのであしからず)
0214デフォルトの名無しさん2006/12/18(月) 00:34:59
>>213
すでに試してみました。固有値は0が二つ、固有ベクトルは[0.5914,-0.8964]が二つ返され、うまくいきませんでした、
0215デフォルトの名無しさん2006/12/18(月) 00:44:04
ifstreamでファイル名が日本語のものを読み込むにはどうすればいいのでしょうか?
0216デフォルトの名無しさん2006/12/18(月) 00:47:11
>>215
#include <clocale>
setlocale(LC_CTYPE, "");
0217デフォルトの名無しさん2006/12/18(月) 00:48:09
VisualStudio2005Express入れました
一から全部教えてください
m(_ _)m
0218デフォルトの名無しさん2006/12/18(月) 00:49:05
>>215
読み込もうとするとどうなるの?
0219デフォルトの名無しさん2006/12/18(月) 01:00:38
>>216
すごい!解決したかもです。ありがとうございます

>>218
以下のチェックで必ず引っかかってましたが216さんので引っかからなくなりました
ifstream ifs(argv[1]);
if(!ifs)
return 1;
0220デフォルトの名無しさん2006/12/18(月) 01:41:41
>>219
そのままファイルに日本語書き込めるか?
ライブラリがバグッててどうしようもなかったと思うんだが。
0221デフォルトの名無しさん2006/12/18(月) 01:49:29
>>220
バグリました
引数の日本語は消え、変数内に日本語を使用するとそこで処理が止まりアプリが落ちる感じで…
振り出しに戻ったところでございます。よき方法があればご教授をTT
0222デフォルトの名無しさん2006/12/18(月) 11:22:14
>>221
SP1 が出てるから、試してみるといいかもしれない。
むしろ、試してみて報告たのむ。
0223デフォルトの名無しさん2006/12/18(月) 17:13:39
C++で質問です。
String str[] = {"aa", "bbb", "ccccc"};
のような配列の要素数を得るにはどうしたらいいのでしょうか。
0224デフォルトの名無しさん2006/12/18(月) 17:23:02
まさしくそのような配列なら、sizeof(str) / sizeof(str[0]) でOK。
0225デフォルトの名無しさん2006/12/18(月) 17:24:04
Integer型をgcc3以降のg++でも使えるようにするためにはどうすれば良いでしょうか?
今は2.95.3を併用してctype.oでごまかしながら使ってます。
0226デフォルトの名無しさん2006/12/18(月) 17:25:53
Boostを使って良(くてコンパイル時定数でなくても良)ければ、
<boost/range/size.hpp>をインクルードしてboost::size(str)という手もある。
0227デフォルトの名無しさん2006/12/18(月) 18:00:06
>>224>>226
ありがとうございます。
>>224の方法で出来たのですが、それを少し変えて
const string a[] = {"aa", "bbb", "ccccc"};を

int function(const string str[]) const {
return (int)sizeof(str)/sizeof(str[0]);
}

のような関数でfunction(a);として要素数を出すようにしたら、
戻り値が0になってしまうのですが、なんででしょうか。
0228デフォルトの名無しさん2006/12/18(月) 18:12:53
>>227
引数として得た配列のサイズを得ることはできません(固定サイズの場合を除く)。
もし問題がなければ、std::vector などを使うのが良いと思います。
0229デフォルトの名無しさん2006/12/18(月) 18:13:29
template <typename T, std::size_t N>
std::size_t array_size(T (&)[N])
{
  return N;
}
0230デフォルトの名無しさん2006/12/18(月) 18:14:17
>>228
templateで出来るだろ。
0231デフォルトの名無しさん2006/12/18(月) 22:14:53
>>227
仮引数でのTの配列型は、Tへのポインタ型へ変換される規則。

>>228
boost::sizeは、普通の引数として配列の引数を受け取るが。
(配列に対する部分特殊化は、正に229のようなことをやっている)
0232デフォルトの名無しさん2006/12/18(月) 23:13:41
度々申し訳ありません。>>229の方法で、
function() {
const string a[] = {"aa", "bbb", "ccccc"};
array_size(a);
}
のようにした場合、上手くいくのですが、下のようにすると上手くいきません。

function2() {
const string a[] = {"aa", "bbb", "ccccc"};
function1();
}
function1(const string b[]) {
array_size(b);
}

VisualStudio .NET 2003環境で以下のようなエラーが出てしまいます。
「'size_t array_size(T (&)[N])' : 'T1 (&)[N] 用のテンプレート引数を
'const std::string []' から減少できませんでした。」
どこがまちがってるんでしょうか。
0233デフォルトの名無しさん2006/12/18(月) 23:14:44
VisualC++ 2005 Expressを使ってWindowsソフトが作って見たいと思ったのですが
windows.hがインクルードできません。

Cの知識はあるのですが、C++の知識はないです。
何が原因でしょう?
0234デフォルトの名無しさん2006/12/18(月) 23:15:06
すいません訂正です。
function2() {
const string a[] = {"aa", "bbb", "ccccc"};
function1(a); // ←
}
02352332006/12/18(月) 23:23:27
すいません、聞かなかったことにしてください・・・。
0236デフォルトの名無しさん2006/12/18(月) 23:25:20
>>232-233
226/229の方法は、配列にしか使えず、ポインタには使えない。
配列型は引数に取れないが(>231)、配列への参照型は引数に取れる(配列へのポインタ型も可)。
というわけで次のようにすればいい。
template <typename Range>
void function1(Range& b) {
  array_size(b);
}
0237デフォルトの名無しさん2006/12/18(月) 23:51:46
>>236
ありがとうございます。その方法で出来ました。
C++にはtemplateという便利なものがせっかくあるのに
使いこなせないというのはもったいないので、これから勉強し直そうと思います。
0238デフォルトの名無しさん2006/12/19(火) 08:17:38
lseek関数っていうものがいまいちよく分からないんですけど、
分かりやすく教えてください、エロい人。
0239デフォルトの名無しさん2006/12/19(火) 09:54:22
>>238
判らない人は使わなくて宜しい。
ファイルストリーム系のfseek()使えば?
0240デフォルトの名無しさん2006/12/19(火) 14:10:11
一次元配列の問題で、
六個の整数を配列に記憶して配列の中から最大値と最小値を出せって問題なのですが
これは配列に入っている数字をif文で総当りの式書かないとできないのでしょうか?
配列使って応用が効きそうだなとは思うのですがなかなかその先に考えがいけません。
何かヒントなどいただけないでしょうか?

0241デフォルトの名無しさん2006/12/19(火) 14:16:43
C++でHTTP通信をするには、どうすればいいですか?
0242デフォルトの名無しさん2006/12/19(火) 14:17:24
>>240
「ソート」とか、「ソート 配列」でググってみろ
0243デフォルトの名無しさん2006/12/19(火) 14:18:51
>>240
ヒントというか・・・
気に入ったTVが一番安く買える値段を探すときに、あなたならどうしますか?
探している途中、今まで見つけた中でいちばん安い値段をメモしておいたり・・・
0244デフォルトの名無しさん2006/12/19(火) 15:09:01
>242
>243
すいません追記で
使っていいのはif文とfor文だけです。
0245デフォルトの名無しさん2006/12/19(火) 15:14:45
>>244
>>242-243に追記と言ってどうするw
ヒントをくれてるんだから自分でやれよ
ここは宿題スレではない
0246デフォルトの名無しさん2006/12/19(火) 15:23:30
>245
はぁ?w
元からできるよw
ひとつだけ言わせてくれソ−ト使わないとこんな問題もできないんですか?wwwwww
入門スレだからどれくらいできるやついるか試しただけ、
だけどこんな初歩の問題もできないなんてwwwww
このスレの価値なし
0247デフォルトの名無しさん2006/12/19(火) 15:27:06
やれやれ・・。
次の質問どうぞ。
0248デフォルトの名無しさん2006/12/19(火) 16:36:55
>>241
処理系定義の機能を使う必要がある。よって、環境が明示されて
いなければ答えようがない。
0249デフォルトの名無しさん2006/12/19(火) 22:57:39
配列内の整数値を整列させたいのですが、qsort()を始めとしたソートアルゴリズムは使いたくありません。
どういう方法があるでしょうか。
0250デフォルトの名無しさん2006/12/19(火) 23:00:55
整列させたいのにソート使いたくないとはこれ如何に。
0251デフォルトの名無しさん2006/12/19(火) 23:02:06
アルゴリズムを使わない方法と言えば、
・他の機械(やプログラム)にデータを渡してソートしてもらう
・ユーザにデータを示してソートしてもらう
・並べ替えを一切せず、低い確率でのみ正常動作するという仕様で我慢してもらう
くらいしか思いつきません・・・
0252デフォルトの名無しさん2006/12/19(火) 23:51:45
qsort()を始めとしないソートアルゴリズムを使えばいいじゃないか。
■ このスレッドは過去ログ倉庫に格納されています