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

【初心者歓迎】C/C++室 Ver.53【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/04/24(木) 07:23:05
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.59【環境依存OK】(実質Ver.52)
http://pc11.2ch.net/test/read.cgi/tech/1206809426/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2008/04/24(木) 07:24:43
【過去ログ】

【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124499/
【初心者歓迎】C/C++室 Ver.51【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1205496128/
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/
【初心者歓迎】C/C++室 Ver.59【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1206809426/
0003デフォルトの名無しさん2008/04/24(木) 07:46:05
3
0004デフォルトの名無しさん2008/04/24(木) 07:53:38
'1'はCだとintだけどC++だとcharなんだよね。
オーバーロードの関係でそうしたのかな。
0005デフォルトの名無しさん2008/04/24(木) 10:43:42
前回59にしてしまったものです。53で立ててくれてありがとう。
0006デフォルトの名無しさん2008/04/24(木) 12:51:25
>>4
簡単に言えばそういうことだ。
「std::cout << '\n';」で「10」とか印字されても困るだろ。
0007デフォルトの名無しさん2008/04/24(木) 17:10:31
C++のtry〜catchって
メソッドの中で入れ子になっていても問題ないですか?

void CHoge::Method()
{
try{
// 処理1
try{
// 処理2
}
catch(...){
// 処理2の例外処理
}
// 処理3
}
catch(...){
// 処理1、3の例外処理
}
}

みたいな感じです
0008デフォルトの名無しさん2008/04/24(木) 17:12:47
問題ない
0009デフォルトの名無しさん2008/04/24(木) 17:13:54
ちなみに、C++ではメソッドじゃなくてメンバ関数という
あと、

void func() try {
} catch (...) {
}

なんて書き方もOK
001072008/04/24(木) 17:18:39
>>8-9
素早い回答ありがとうございました
0011デフォルトの名無しさん2008/04/24(木) 18:17:01
virtual int sample() const; みたいな関数のプロトタイプ宣言があったのですが、なぜこの位置にconstがあるのでしょうか??
またこのような感じの関数はどういった呼び出し方をすればよいのでしょうか。
どなたか教えていただけると幸いです。
0012デフォルトの名無しさん2008/04/24(木) 18:21:01
後ろに付いてるconstはその関数が
(メンバ)変数を書き換えないという指定
0013デフォルトの名無しさん2008/04/24(木) 18:26:24
template <template<class> class T>
このようなテンプレートテンプレートパラメータが
なぜこんな書き方ができるのか今一理解できません。
どこか詳しく解説してるとこはないものでしょうか?
0014デフォルトの名無しさん2008/04/24(木) 19:35:22
すいません、教えてください。

--- ヘッダ ----
typedef struct _STRUCT1{
long code;
CArray<long, long> data;
}STRUCT1;


CArray<STRUCT1, STRUCT1&> code_data;

--- ソース ----
STRUCT1 st;
st.code = 1;
st.data.Add(100);
code_data.Add(st);


みたいな感じでやると、最後の行でコンパイルエラーになるんですが
CArrayの中にCArrayを含む構造ってダメなんでしょうか?

途中までいい気でコーディングして、最後にエラー出てしまって
途方にくれています。
今更ほかの方法で似たような事やるのは大変で・・・。
よい方法ないでしょうか。
0015デフォルトの名無しさん2008/04/24(木) 19:38:36
bool型のa[3]

a[0] = 0; a[1] = 0; a[2] = 0;
a[0] = 1; a[1] = 0; a[2] = 0;
a[0] = 0; a[1] = 1; a[2] = 0;
a[0] = 0; a[1] = 0; a[2] = 1;
a[0] = 1; a[1] = 1; a[2] = 0;
a[0] = 1; a[1] = 0; a[2] = 1;
a[0] = 0; a[1] = 1; a[2] = 1;
a[0] = 1; a[1] = 1; a[2] = 1;
行と行の間には何かしらの処理が入る。
これをfor文でまとめて書くにはにはどうすればいい?
0016デフォルトの名無しさん2008/04/24(木) 19:50:47
0..7で回すのはダメなのかな・・・と思ったけど順番が微妙に違うのか?
0017デフォルトの名無しさん2008/04/24(木) 19:56:28
綺麗なのが思いつかん
くやしいわ
0018デフォルトの名無しさん2008/04/24(木) 19:57:02
>>14
STRUCT1 st;
STRUCT1 st2 = st;
st2 = st;
の3行を書いて、コンパイル通る?

あとコンパイルエラーのメッセージは?
0019デフォルトの名無しさん2008/04/24(木) 20:08:11
>>14
for( int i = 0; i < 7; i++ ) {
a[0]=(0xb2>>i)&1;a[1]=(0xd4>>i)&1:a[2]=(0xe8>>i)&1;
0020デフォルトの名無しさん2008/04/24(木) 20:09:31
もとい>>15です
0021デフォルトの名無しさん2008/04/24(木) 20:10:06
std::bitset<32> bits(0x76534210UL);
for (int i=0; i < 8; ++i)
 std::cout << bits[i * 4] << ", " << bits[i * 4 + 1] << ", " << bits[i * 4 + 2] << "\n";
0022デフォルトの名無しさん2008/04/24(木) 20:10:52
i<8だったorz
0023デフォルトの名無しさん2008/04/24(木) 20:15:16
for( int i = 0 ; i < 7 ; ++i )
{
 const m = 076534210 ;
 bool a[] = { ((m>>(i+0))& )!=0 ,((m>>(i+1))&1)!=0 ,((m>>(i+2))&1)!= 0} ;
 なにかしらの処理
}
うーん、いまいち
0024デフォルトの名無しさん2008/04/24(木) 20:17:41
多重ループで挑戦してるけど・・・
綺麗なのできねぇかなぁ
0025デフォルトの名無しさん2008/04/24(木) 20:19:31
076534210 の 3 と 4 をきれいに入れ替えられたら勝利。
0026デフォルトの名無しさん2008/04/24(木) 20:23:23
素直にやるなら

#define NELEMS(array) (sizeof (array) / sizeof (array)[0])
#define GET_BIT(n, b) ((n) & (1u << (b)))

static const unsigned int flags[] = { 0, 1, 2, 4, 3, 5, 6, 7 };
for (int i = 0; i < NELEMS(flags); i++) {
 GET_BIT(flags[i], 0) と
 GET_BIT(flags[i], 1) と
 GET_BIT(flags[i], 2) を使う
}
0027デフォルトの名無しさん2008/04/24(木) 20:27:54
配列 a[] を四つに拡張したい場合どうするかでも書き方をどうするか変えたくなるな
結構頭の体操としては面白い
0028デフォルトの名無しさん2008/04/24(木) 20:28:05
どこが素直なんだよw
0029デフォルトの名無しさん2008/04/24(木) 20:30:11
長いパスにアクセスするにはどうしたらいいですか?
たとえばファイルオープンするときなどです。
0030デフォルトの名無しさん2008/04/24(木) 20:31:52
長いパスにアクセスすればいい
0031152008/04/24(木) 20:32:32
皆さん考えていただいてありがとうございます。
今回はなんとかできました。

ヒントをいただいたので配列の長さがNの時も考えようと思います
0032デフォルトの名無しさん2008/04/24(木) 20:40:15
一般化するなら再帰使うといいよ。再帰。
0033デフォルトの名無しさん2008/04/24(木) 20:40:34
255文字以上のアクセスできない場合にアクセスする方法ってありますか?
0034デフォルトの名無しさん2008/04/24(木) 20:42:57
Unicode 版の CreateFile を使って、
パスの前に "\\\\\?\\" を付けるといいらしいが、
実際にやってみると出来ないと聞いたこともある。
0035デフォルトの名無しさん2008/04/24(木) 20:45:50
トン!
0036デフォルトの名無しさん2008/04/24(木) 20:48:52
オフラインで使える C と C++ のリファレンスって何か良いのありますか?
0037デフォルトの名無しさん2008/04/24(木) 20:49:52
VC6 の MSDN
0038デフォルトの名無しさん2008/04/24(木) 20:55:01
ttp://cppreference.com/
ttp://www.cppll.jp/cppreference/
0039デフォルトの名無しさん2008/04/24(木) 21:03:17
なんだかんだ言ってMSDNが一番纏まってて読みやすいんだよな…
しかし最近のはwebも新形式ヘルプも重い罠
0040デフォルトの名無しさん2008/04/24(木) 21:08:29
>>36
古めの C/C++ のドラフトとか。英語だけど。
0041デフォルトの名無しさん2008/04/24(木) 21:28:34
>>34
すみません 100文字は出来ますが300文字だと無理になります
どうすればいいですか?

#include <windows.h>

int main(){
int r; wchar_t e[1000]=L"\\\\\?\\c:\\";

//100文字のディレクトリを生成してみる
fore(r,100)e[r+7]=L'a'; e[7+r]=L'\\'; e[8+r]=0;
CreateDirectoryW(e,NULL);

//300文字のディレクトリを生成してみる
fore(r,300)e[r+7]=L'b'; e[7+r]=L'\\'; e[8+r]=0;
CreateDirectoryW(e,NULL);
}
0042デフォルトの名無しさん2008/04/24(木) 21:32:49
Windowsでは生成は出来ないけれど、別の環境で作成されたパスにアクセスはできるという事ですか?
0043デフォルトの名無しさん2008/04/24(木) 21:34:42
確かディレクトリ名やファイル名はMAX_PATHまでだったと思う。
でフルパスの時32767まで。
0044デフォルトの名無しさん2008/04/24(木) 21:37:09
>>43
トン 実験してみます
0045デフォルトの名無しさん2008/04/24(木) 21:55:42
>>43
トン できました!

int main(){
int r;
wchar_t g[1000]=L"\\\\\?\\c:\\",h[]=L"aaaaaaaaaa\\";
for(r=0;r<30;r++){wcscat(g,h); CreateDirectoryW(g,NULL);}
wcscat(g,L"bbbbb\\"); CreateDirectoryW(g,NULL);
}
0046デフォルトの名無しさん2008/04/24(木) 22:48:31
初めてのプログラミングでCをやるのですがお勧めの参考書があったら教えてください
0047462008/04/24(木) 22:52:57
しまった、age
ちなみにVC使う予定です
0048デフォルトの名無しさん2008/04/24(木) 22:59:34
CなのかC++なのかMFC使うのかWIN32APIなのかなど、
どういう使い方をしたいのかで変わってくると思う。
0049デフォルトの名無しさん2008/04/24(木) 23:01:53
それすらチンプンカンプンなのでもう少し調べてみます
0050デフォルトの名無しさん2008/04/24(木) 23:19:42
何でやるのか書いた方が良いよ。
学校の勉強か、趣味か、仕事か、作りたいものでも有るのか、他。

それと基礎知識。
多言語の経験有るとか、プログラミング初心者とか。
0051デフォルトの名無しさん2008/04/24(木) 23:37:03
VCでCの勉強するって書いてあるから
[やさしいC]あたりでいいんじゃないでしょうか?

個人的意見ですけど最初はIDE(VC等の統合開発環境)使わずに
コンパイラだけ用意して勉強したほうがいいかと。
0052デフォルトの名無しさん2008/04/24(木) 23:53:04
仕事ですね
アプリ系らしいけども
プログラミング自体初心者なので何から始めたらいいやらで
0053デフォルトの名無しさん2008/04/24(木) 23:56:43
職場の先輩にでも聞いた方がいいと思うけど
0054デフォルトの名無しさん2008/04/25(金) 00:03:35
初心者なら windows なんてやめて UNIX系で慣れろ

使いもんにならんwindows 育ちなど
0055デフォルトの名無しさん2008/04/25(金) 00:04:38
Windows プログラミングするなら
それでも Windows で慣れてないと困るけどな。
ただ、Web 系するだけなら別に Windows である必要は無いな。
0056デフォルトの名無しさん2008/04/25(金) 00:05:41
>>52
仕事(実務がてらの教育な気もするけど)なら、最短経路ってことで、
プラットホーム(LinuxとかWindowsとか)と、
本当にCなのか、それともC++でもいいのか聞いた方がいい。
0057デフォルトの名無しさん2008/04/25(金) 00:07:49
>>54
概ね同意だけど、一つのプラットホームしか知らない奴も結構使えない。
0058デフォルトの名無しさん2008/04/25(金) 00:32:33
メンバ関数のポインタのとり方教えてください。
コメントの部分でエラーになってしまいます……。

class ca {
public:
int (*pa)();
int nasi(void);
ca(void);
}ca1;
int ca::nasi(void){return 0;}
ca::ca(void) {pa = nasi;} //コンパイルエラー
0059デフォルトの名無しさん2008/04/25(金) 00:36:20
>>58
http://www.google.com/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&btnG=%E6%A4%9C%E7%B4%A2
0060112008/04/25(金) 00:36:57
>>12 さん
なるほど。ありがとうございます!
0061デフォルトの名無しさん2008/04/25(金) 00:42:52
void
0062582008/04/25(金) 00:51:53
>>59
ありがとうございます。おかげでできました。
これからはもう少し自分でも調べるようにします。

class ca {
public:
int (ca::*pa)();
int nasi(void);
ca(void);
}ca1;
int ca::nasi(void){return 0;}
ca::ca(void) {pa = &ca::nasi;}
0063デフォルトの名無しさん2008/04/25(金) 02:53:11
>>13
亀レスですまんけど、何故そういう書き方ができるか、というより
そういう書き方をする意味ならある。
確かそのようにニ重にテンプレート指定すると、
template <template <class> class T> class hoge{};
とした場合に、hogeのインスタンスを宣言するときに
hoge< fuga<monyu> > Hoge;
ではなく
hoge<fuga> Hoge;
で済むというメリットがあったと思う。
fugaもテンプレートクラスであるにも関わらず、fugaのテンプレート引数は
指定しなくていい(ただしデメリットもあったと思うけど)。
あまり覚えてないので大して助言できなくてスマン。
0064デフォルトの名無しさん2008/04/25(金) 04:14:34
補足。確か、そのような二重のテンプレートの場合
hogeクラスがmonyuの型を要求するような実体化を伴う場合、
(hogeクラスからfugaクラスのメンバ関数を呼ぶ場合でも。中でmonyuの型が必要なら)
実体化に失敗するんだったと思う。
その代わり、hogeクラスはfugaクラスのテンプレート引数に自由に型を
指定して利用することが出来る(もちろん文法が通る場合に限るが)。
0065デフォルトの名無しさん2008/04/25(金) 05:06:36
>>63,64
詳しい説明感謝です。
他スレでも聞いてしまってましたが、
そっちとはまた違った説明で、おかげで
かなり納得できました。
0066デフォルトの名無しさん2008/04/25(金) 05:15:30
>>65
すまん、そっちの説明どんなだったか教えて欲しいかもw
あんま使ったことない用法だから自信ないので・・
0067デフォルトの名無しさん2008/04/25(金) 05:22:13
ダイアログ1のOnInitDialogにダイアログ2を1の子としてCreate、ShowWindowするコードを追加したいのですが、ダイアログ2の変数の作り方がわかりません。
ダイアログ1のヘッダーに paintDlg2 m_dlgPaint; を記述しても

';' が、識別子 'm_dlgPaint' の前に必要です。

というコンパイルエラーがでます。
インクルードの順序は確認したのですがうまくいきません。
2008で自動で変数追加しようとしても変数の種類が選べなくてよくわからないんです。
0068デフォルトの名無しさん2008/04/25(金) 06:17:50
>>66
これですわ
http://pc11.2ch.net/test/read.cgi/tech/1205059063/667
0069デフォルトの名無しさん2008/04/25(金) 06:25:20
しかし
template <template <class> class T>
これ、関数ポインタと同じ様な書式で
template <class T<class> >
と書くほうが自然な感じがするのは自分だけ?
0070デフォルトの名無しさん2008/04/25(金) 06:49:43
>>68
thx。
しかし色んな書き方できるんだなぁ・・・
0071デフォルトの名無しさん2008/04/25(金) 08:27:11
templateといえば

template<class T>
class A {
}

template<class T2>
class B {
}

A< B<型> > a;

ってなテンプレート型にテンプレート型を渡したときに、Aのスコープ内で
Bのテンプレート引数(T2の実体型)を知る方法って無いよね?
0072デフォルトの名無しさん2008/04/25(金) 08:53:58
template<class T2>
class B {
  typedef T2 hogeT2;
}

A< B<型> > a;
a::hogeT2 hoge;
で行けない?
0073デフォルトの名無しさん2008/04/25(金) 09:02:14
あ、Aのスコープ内か。
そんならT::T2でいけるかもしれないし、だめなら↑のtypedefで行けるはず
0074デフォルトの名無しさん2008/04/25(金) 20:21:30
>>73
T::T2 は無理。
typedef すればいけましたが、
A<B<x>> が A<C<x>> や A<D<x>> になった時に
対応が大変なので、

template<template<class> class TemplateT, class ParamT>
class Typenamedef {
typedef TemplateT T_TYPE;
typedef ParamT P_TYPE;
};

template<class T>
class A {
T::P_TYPE x ;
};

A< Typenamedef<B, 型> >

こういう形に落ち着きました。
0075デフォルトの名無しさん2008/04/25(金) 20:43:20
そのBにあたるクラスって何個かあるの?
0076デフォルトの名無しさん2008/04/25(金) 21:07:18
それだと直接
template<template<class> class TemplateT, class ParamT>
class A {
ParamT x;
}

でいいじゃんと思うのだが
0077デフォルトの名無しさん2008/04/25(金) 21:37:51
>>75
ありますし、今後増えるかもってことで。

>>76
Bにあたるクラスのテンプレート引数の数が変わった場合でも、
Aを書き換えずに対応できるようにする為に74の用に1クッション
入れたほうが良いかなと思ったのですよね。<Aも何種類かあるので
0078772008/04/25(金) 21:50:44
読み返すと分かり難かったので、もちょっと具体的に書くと、
Aはboost ptr_containerの代替品で、ポインタを格納するコンテナ型を受け取ります。
BはSTLコンテナ、または自作コンテナ。
例えばvectorだとテンプレ引数にアロケータがあるので、
template<template<class, class> class T>と引数が2つになるが、
自作コンテナはアロケータまで取ってないので引数が1つだったりするし、
A内でアロケータまで知る必要もないので >74 で済むってな寸法です。
0079デフォルトの名無しさん2008/04/25(金) 21:52:10
関数でwchar_t *型をリターンするには、newで確保するしかないですか? メモリリークしますよね
いい方法無いですか?
0080デフォルトの名無しさん2008/04/25(金) 21:57:46
>>79
aout_ptr 又は shared_ptr で検索
0081デフォルトの名無しさん2008/04/25(金) 21:58:29
すまん auto_ptr の間違い
0082デフォルトの名無しさん2008/04/25(金) 22:01:51
標準のやつでは無理でしょうか? 
0083デフォルトの名無しさん2008/04/25(金) 22:02:13
>>79
wstringで返すという手もある
0084デフォルトの名無しさん2008/04/25(金) 22:21:35
トン
0085デフォルトの名無しさん2008/04/25(金) 22:50:10
すっげー、意味不明な質問かもしれませんが
四則演算を駆使して16桁の2〜36進数までを10進数に直すプログラムって可能でしょうか?
0086デフォルトの名無しさん2008/04/25(金) 22:55:58
>85
読み直してみろ
それで質問の答えが返ってくると思うか?

何がやりたいのかをきちんとまとめてから文章にしろ
あて主語がなにかはっきりしろ

0087デフォルトの名無しさん2008/04/25(金) 22:58:43
普通に
四則演算だけを用いて16桁のn進数を10進数に変換しろっていうだけだろ?
日頃やらないから、凄く面倒くさい手段しか思いつかん
0088デフォルトの名無しさん2008/04/25(金) 23:07:45
>>85は次に「教えて!」と言う
0089デフォルトの名無しさん2008/04/25(金) 23:16:20
//  ex. "3A"を58に変換する
private static int toDecimal(string hex)
{
int n = 0x0;

switch (hex[0])
{
case '0':
n = 0x00;
break;
case '1':
n = 0x10;
break;



(省略されました・・全てを読むにはここを押してください)
                     ⁻⁻⁻⁻⁻⁻
0090デフォルトの名無しさん2008/04/25(金) 23:24:03
すげー、かったるい方法だけど
配列のCharで取得して0番目なら15回基数をかけた奴と入力された値をかけt(ry
0091デフォルトの名無しさん2008/04/25(金) 23:27:38
>>78
うーん、やっぱり自作コンテナ内で
typedef T value_type;
したほうがいいと思うのは俺だけ?
0092デフォルトの名無しさん2008/04/25(金) 23:36:38
STLのstackは、pushとpopがつかえますが、popしたときに入力した型で帰りますか?
コンパイラがvoidを返すようなメッセージだします。受け取れません
0093922008/04/25(金) 23:38:11
すみません。データ取り出して一つ消すのかと思ったら、消すだけでした。
0094デフォルトの名無しさん2008/04/25(金) 23:50:02
これがうごかないのはなんでですか?

class cls{ public: string a; int n; };
cls x=(cls)("aaa",5);
0095デフォルトの名無しさん2008/04/26(土) 00:00:08
>>85
strtolとかstrtoulとか。
宿題なんで使用禁止なら宿題スレ行け。

>>92
なるべく厳しい例外安全を達成するため、
stackの先頭を読み取るのはtopメンバ関数として、popから分離されている。

>>94
そういう構文が存在しないから。
cls x = {"aaa", 5};
0096デフォルトの名無しさん2008/04/26(土) 01:36:33
>>91
それ以前に、B<T>とTをそれぞれ引数として渡した方が
遥かに楽だったことにさっき気が付いたorz
0097デフォルトの名無しさん2008/04/26(土) 01:54:11
>>96
それってstd::vectorなど標準コンテナののテンプレート引数では、
Tと(デフォルト引数で)std::allocator<T>を渡すのと同じ感じだよね。
0098デフォルトの名無しさん2008/04/26(土) 10:19:59
>>80
配列と想像される可能性が高いのに
そんなもんを薦めるなよ
0099デフォルトの名無しさん2008/04/26(土) 12:02:16
emun型を宣言してVSC++でビルドしようとすると
宣言の前に"{"がないって怒られて通らないんですがどうしてでしょう・・orz
0100デフォルトの名無しさん2008/04/26(土) 12:16:45
この初期化方法に名前ついてますか? ググり方教えて下さい。
見た事、やったことないです。

class Meibo{
public:
int GakuseiNo;
string Name;
Meibo() : GakuseiNo( -1 ), Name( "" ) {}
Meibo(int n, string name) : GakuseiNo( n ), Name( name ){}
bool operator<(const Meibo& a)const{ return GakuseiNo < a.GakuseiNo; }
};
0101デフォルトの名無しさん2008/04/26(土) 12:22:31
エラーの行かそれより前で{か;を忘れてるところがある
■ このスレッドは過去ログ倉庫に格納されています