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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスや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
2デフォルトの名無しさん: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/
3デフォルトの名無しさん:2008/04/24(木) 07:46:05
3
4デフォルトの名無しさん:2008/04/24(木) 07:53:38
'1'はCだとintだけどC++だとcharなんだよね。
オーバーロードの関係でそうしたのかな。
5デフォルトの名無しさん:2008/04/24(木) 10:43:42
前回59にしてしまったものです。53で立ててくれてありがとう。
6デフォルトの名無しさん:2008/04/24(木) 12:51:25
>>4
簡単に言えばそういうことだ。
「std::cout << '\n';」で「10」とか印字されても困るだろ。
7デフォルトの名無しさん:2008/04/24(木) 17:10:31
C++のtry〜catchって
メソッドの中で入れ子になっていても問題ないですか?

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

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

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

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

途中までいい気でコーディングして、最後にエラー出てしまって
途方にくれています。
今更ほかの方法で似たような事やるのは大変で・・・。
よい方法ないでしょうか。
15デフォルトの名無しさん: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文でまとめて書くにはにはどうすればいい?
16デフォルトの名無しさん:2008/04/24(木) 19:50:47
0..7で回すのはダメなのかな・・・と思ったけど順番が微妙に違うのか?
17デフォルトの名無しさん:2008/04/24(木) 19:56:28
綺麗なのが思いつかん
くやしいわ
18デフォルトの名無しさん:2008/04/24(木) 19:57:02
>>14
STRUCT1 st;
STRUCT1 st2 = st;
st2 = st;
の3行を書いて、コンパイル通る?

あとコンパイルエラーのメッセージは?
19デフォルトの名無しさん: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;
20デフォルトの名無しさん:2008/04/24(木) 20:09:31
もとい>>15です
21デフォルトの名無しさん: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";
22デフォルトの名無しさん:2008/04/24(木) 20:10:52
i<8だったorz
23デフォルトの名無しさん: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} ;
 なにかしらの処理
}
うーん、いまいち
24デフォルトの名無しさん:2008/04/24(木) 20:17:41
多重ループで挑戦してるけど・・・
綺麗なのできねぇかなぁ
25デフォルトの名無しさん:2008/04/24(木) 20:19:31
076534210 の 3 と 4 をきれいに入れ替えられたら勝利。
26デフォルトの名無しさん: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) を使う
}
27デフォルトの名無しさん:2008/04/24(木) 20:27:54
配列 a[] を四つに拡張したい場合どうするかでも書き方をどうするか変えたくなるな
結構頭の体操としては面白い
28デフォルトの名無しさん:2008/04/24(木) 20:28:05
どこが素直なんだよw
29デフォルトの名無しさん:2008/04/24(木) 20:30:11
長いパスにアクセスするにはどうしたらいいですか?
たとえばファイルオープンするときなどです。
30デフォルトの名無しさん:2008/04/24(木) 20:31:52
長いパスにアクセスすればいい
3115:2008/04/24(木) 20:32:32
皆さん考えていただいてありがとうございます。
今回はなんとかできました。

ヒントをいただいたので配列の長さがNの時も考えようと思います
32デフォルトの名無しさん:2008/04/24(木) 20:40:15
一般化するなら再帰使うといいよ。再帰。
33デフォルトの名無しさん:2008/04/24(木) 20:40:34
255文字以上のアクセスできない場合にアクセスする方法ってありますか?
34デフォルトの名無しさん:2008/04/24(木) 20:42:57
Unicode 版の CreateFile を使って、
パスの前に "\\\\\?\\" を付けるといいらしいが、
実際にやってみると出来ないと聞いたこともある。
35デフォルトの名無しさん:2008/04/24(木) 20:45:50
トン!
36デフォルトの名無しさん:2008/04/24(木) 20:48:52
オフラインで使える C と C++ のリファレンスって何か良いのありますか?
37デフォルトの名無しさん:2008/04/24(木) 20:49:52
VC6 の MSDN
38デフォルトの名無しさん:2008/04/24(木) 20:55:01
39デフォルトの名無しさん:2008/04/24(木) 21:03:17
なんだかんだ言ってMSDNが一番纏まってて読みやすいんだよな…
しかし最近のはwebも新形式ヘルプも重い罠
40デフォルトの名無しさん:2008/04/24(木) 21:08:29
>>36
古めの C/C++ のドラフトとか。英語だけど。
41デフォルトの名無しさん: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);
}
42デフォルトの名無しさん:2008/04/24(木) 21:32:49
Windowsでは生成は出来ないけれど、別の環境で作成されたパスにアクセスはできるという事ですか?
43デフォルトの名無しさん:2008/04/24(木) 21:34:42
確かディレクトリ名やファイル名はMAX_PATHまでだったと思う。
でフルパスの時32767まで。
44デフォルトの名無しさん:2008/04/24(木) 21:37:09
>>43
トン 実験してみます
45デフォルトの名無しさん: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);
}
46デフォルトの名無しさん:2008/04/24(木) 22:48:31
初めてのプログラミングでCをやるのですがお勧めの参考書があったら教えてください
4746:2008/04/24(木) 22:52:57
しまった、age
ちなみにVC使う予定です
48デフォルトの名無しさん:2008/04/24(木) 22:59:34
CなのかC++なのかMFC使うのかWIN32APIなのかなど、
どういう使い方をしたいのかで変わってくると思う。
49デフォルトの名無しさん:2008/04/24(木) 23:01:53
それすらチンプンカンプンなのでもう少し調べてみます
50デフォルトの名無しさん:2008/04/24(木) 23:19:42
何でやるのか書いた方が良いよ。
学校の勉強か、趣味か、仕事か、作りたいものでも有るのか、他。

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

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

使いもんにならんwindows 育ちなど
55デフォルトの名無しさん:2008/04/25(金) 00:04:38
Windows プログラミングするなら
それでも Windows で慣れてないと困るけどな。
ただ、Web 系するだけなら別に Windows である必要は無いな。
56デフォルトの名無しさん:2008/04/25(金) 00:05:41
>>52
仕事(実務がてらの教育な気もするけど)なら、最短経路ってことで、
プラットホーム(LinuxとかWindowsとか)と、
本当にCなのか、それともC++でもいいのか聞いた方がいい。
57デフォルトの名無しさん:2008/04/25(金) 00:07:49
>>54
概ね同意だけど、一つのプラットホームしか知らない奴も結構使えない。
58デフォルトの名無しさん: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;} //コンパイルエラー
59デフォルトの名無しさん:2008/04/25(金) 00:36:20
6011:2008/04/25(金) 00:36:57
>>12 さん
なるほど。ありがとうございます!
61デフォルトの名無しさん:2008/04/25(金) 00:42:52
void
6258:2008/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;}
63デフォルトの名無しさん:2008/04/25(金) 02:53:11
>>13
亀レスですまんけど、何故そういう書き方ができるか、というより
そういう書き方をする意味ならある。
確かそのようにニ重にテンプレート指定すると、
template <template <class> class T> class hoge{};
とした場合に、hogeのインスタンスを宣言するときに
hoge< fuga<monyu> > Hoge;
ではなく
hoge<fuga> Hoge;
で済むというメリットがあったと思う。
fugaもテンプレートクラスであるにも関わらず、fugaのテンプレート引数は
指定しなくていい(ただしデメリットもあったと思うけど)。
あまり覚えてないので大して助言できなくてスマン。
64デフォルトの名無しさん:2008/04/25(金) 04:14:34
補足。確か、そのような二重のテンプレートの場合
hogeクラスがmonyuの型を要求するような実体化を伴う場合、
(hogeクラスからfugaクラスのメンバ関数を呼ぶ場合でも。中でmonyuの型が必要なら)
実体化に失敗するんだったと思う。
その代わり、hogeクラスはfugaクラスのテンプレート引数に自由に型を
指定して利用することが出来る(もちろん文法が通る場合に限るが)。
65デフォルトの名無しさん:2008/04/25(金) 05:06:36
>>63,64
詳しい説明感謝です。
他スレでも聞いてしまってましたが、
そっちとはまた違った説明で、おかげで
かなり納得できました。
66デフォルトの名無しさん:2008/04/25(金) 05:15:30
>>65
すまん、そっちの説明どんなだったか教えて欲しいかもw
あんま使ったことない用法だから自信ないので・・
67デフォルトの名無しさん:2008/04/25(金) 05:22:13
ダイアログ1のOnInitDialogにダイアログ2を1の子としてCreate、ShowWindowするコードを追加したいのですが、ダイアログ2の変数の作り方がわかりません。
ダイアログ1のヘッダーに paintDlg2 m_dlgPaint; を記述しても

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

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

template<class T>
class A {
}

template<class T2>
class B {
}

A< B<型> > a;

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

A< B<型> > a;
a::hogeT2 hoge;
で行けない?
73デフォルトの名無しさん:2008/04/25(金) 09:02:14
あ、Aのスコープ内か。
そんならT::T2でいけるかもしれないし、だめなら↑のtypedefで行けるはず
74デフォルトの名無しさん: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, 型> >

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

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

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

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

87デフォルトの名無しさん:2008/04/25(金) 22:58:43
普通に
四則演算だけを用いて16桁のn進数を10進数に変換しろっていうだけだろ?
日頃やらないから、凄く面倒くさい手段しか思いつかん
88デフォルトの名無しさん:2008/04/25(金) 23:07:45
>>85は次に「教えて!」と言う
89デフォルトの名無しさん: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;



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

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

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

>>94
そういう構文が存在しないから。
cls x = {"aaa", 5};
96デフォルトの名無しさん:2008/04/26(土) 01:36:33
>>91
それ以前に、B<T>とTをそれぞれ引数として渡した方が
遥かに楽だったことにさっき気が付いたorz
97デフォルトの名無しさん:2008/04/26(土) 01:54:11
>>96
それってstd::vectorなど標準コンテナののテンプレート引数では、
Tと(デフォルト引数で)std::allocator<T>を渡すのと同じ感じだよね。
98デフォルトの名無しさん:2008/04/26(土) 10:19:59
>>80
配列と想像される可能性が高いのに
そんなもんを薦めるなよ
99デフォルトの名無しさん:2008/04/26(土) 12:02:16
emun型を宣言してVSC++でビルドしようとすると
宣言の前に"{"がないって怒られて通らないんですがどうしてでしょう・・orz
100デフォルトの名無しさん: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; }
};
101デフォルトの名無しさん:2008/04/26(土) 12:22:31
エラーの行かそれより前で{か;を忘れてるところがある
102デフォルトの名無しさん:2008/04/26(土) 12:23:10
>>100
初期化リストのことか?
103デフォルトの名無しさん:2008/04/26(土) 12:25:58
トン
104デフォルトの名無しさん:2008/04/26(土) 12:39:27
>>101
そう思ったんですが、enumの宣言行をコメントつけるとエラーでなくなるんです
105デフォルトの名無しさん:2008/04/26(土) 12:40:36
enumの最後にセミコロンないだけなんじゃないのか・・・
106デフォルトの名無しさん:2008/04/26(土) 12:43:02
enum { HOGE = 0 }; ←このセミコロンだな
107デフォルトの名無しさん:2008/04/26(土) 12:44:35
>>105
ソレも確認しましたが、ついてます。
どうして通らないのかちんぷんかんぷんで・・・orz
108デフォルトの名無しさん:2008/04/26(土) 12:47:18
その前後のコードをコピペしようよ…。
109デフォルトの名無しさん:2008/04/26(土) 12:56:12
emun ってところがミソだな
110デフォルトの名無しさん:2008/04/26(土) 12:58:42
#include <iostream>

using namespace std ;

int main ( void )
{
enum baba_t {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g,};
baba_t zizi;
return 0;
}


たった、これだけの最低限にしても}が定数の前にないっておこられます
111デフォルトの名無しさん:2008/04/26(土) 13:02:33
enumって普通
enum baba_t { A = 0, B, C, D, E };
baba_t zizi;
こういう風に使うんじゃないのか
112デフォルトの名無しさん:2008/04/26(土) 13:03:14
enumが何なのかわかってるんだろうか…
113デフォルトの名無しさん:2008/04/26(土) 13:04:47
そもそも>>110って書いた場合どういう風に使うの?
114デフォルトの名無しさん:2008/04/26(土) 13:05:30
>>110
整数リテラル0の前に}がないって怒られてるんだよ。
そんなものenumの要素になりえないから。
115デフォルトの名無しさん:2008/04/26(土) 13:06:24
enumってキーワードに数値を割り当てるんですね、判ります。
116デフォルトの名無しさん:2008/04/26(土) 13:08:34
本読みながら適当に打ってみたら通らなかったので悩んでました
あほでごめんなさい・・・orz
117デフォルトの名無しさん:2008/04/26(土) 13:08:46
これは酷い。
ってか、ちょっとでも解説書やサイトを見ていれば
こんな記述は考えもつかないと思うんだけど…。
118デフォルトの名無しさん:2008/04/26(土) 14:01:32
最大公倍数をユークリッド互除法を用いて求めたいんだが
入力した2数の小さいほうがそのまま出力してしまう…

#include<iostream>
using namespace std;
int func(int x,int y);
int main(){
int a,b,gcd;
cout <<"数値を二つ入力してください\n";
cin >>a>>b;
gcd=func(a,b);
cout <<"最大公約数は"<<gcd<<"です\n";
return 0;
}
int func(int x,int y){
int r;
if(x<=y){r=x; x=y; y=r;}
while(1){
x%=y;
if(x==0) break;
r=x; x=y; y=x;
}
return y;
}

すごく初歩なんだろうけどお願いします
119118:2008/04/26(土) 14:02:59
ミスった
最大公倍数なんて求まるわけないwww
最大公約数の間違い
120デフォルトの名無しさん:2008/04/26(土) 14:47:09
>>118
r=x; x=y; y=x;

r=x; x=y; y=r;
121デフォルトの名無しさん:2008/04/26(土) 15:01:57
>>120 サンクス
122デフォルトの名無しさん:2008/04/26(土) 15:02:39
r=x; x=y; y=x;

x ^= y; y ^= x; x ^= y;
123デフォルトの名無しさん:2008/04/26(土) 15:36:11
それは邪悪な誘惑だぞw
124デフォルトの名無しさん:2008/04/26(土) 16:33:16
それよりもC++なら<algorithm>のstd::swapだろ。
125デフォルトの名無しさん:2008/04/26(土) 17:15:32
クラスに^=演算子を定義して>>122だろ、常考・・・。
126デフォルトの名無しさん:2008/04/26(土) 17:24:42
???
127デフォルトの名無しさん:2008/04/26(土) 17:59:46
ブラインドタッチで[とか]とかどうやって打ってるんだお前ら
128デフォルトの名無しさん:2008/04/26(土) 18:04:43
Enterの横に薬指引っかけて人差し指で押す
129デフォルトの名無しさん:2008/04/26(土) 19:34:40
そこで英字配列
130デフォルトの名無しさん:2008/04/26(土) 20:20:45
第六感
131デフォルトの名無しさん:2008/04/26(土) 20:51:07
>>127
他の人はどうか知らないけど、俺は頻繁にホームポジションを崩す。
[]←たとえばこれは、半角/全角キーを左手の中指で押して日本語入力切って、
そのあと右手の中指と親指でタタンと上から下に流すように[と]を打って、
すぐまた半角/全角キー押して日本語入力モードにしてホームポジションに戻った。
これくらいの動きなら、手元をみなくてもまず間違えないし。
132デフォルトの名無しさん:2008/04/26(土) 20:53:41
そもそもホームポジションの無い俺には関係無い話だな
133デフォルトの名無しさん:2008/04/26(土) 20:56:09
小指で押すだろ普通
134デフォルトの名無しさん:2008/04/26(土) 21:08:43
[を入力したら適切に]も挿入するようにスクリプト組む
でそれを@に割りあてる
@なんか連打しないでしょ?@@@@@@@@@@@@
135デフォルトの名無しさん:2008/04/26(土) 21:54:35
C++で変数の名前に変数って使う方法ってありませんか?
Perlで言う$$testみたいなものです
具体的に言うと、
id1 id2 id3と末尾だけ変わっていく変数の処理が同じなのでforループしたいんです。
現状だと
if( id1 != 0 ){ ... }
if( id2 != 0 ){ ... }
となってしまうので。
136デフォルトの名無しさん:2008/04/26(土) 22:01:12
無理
最初から配列にしとけばいいんじゃね
137デフォルトの名無しさん:2008/04/26(土) 22:01:23
本読みながら勉強してて、よくわからないのですが
cherの中に整数値として16進数を入れた時、これをint型の整数に変換する事は可能なのでしょうか?
138デフォルトの名無しさん:2008/04/26(土) 22:02:58
>>137
cherってなんですか?
139デフォルトの名無しさん:2008/04/26(土) 22:04:11
cherじゃなかった・・・charだった・・・orz
ごめんなさい
140デフォルトの名無しさん:2008/04/26(土) 22:06:05
何が死体の川からンが、これは理解できるか?
char foo = 0x41;
printf("%d, %x, %c\n", foo, foo, foo);
foo = 'A';
printf("%d, %x, %c\n", foo, foo, foo);
foo = 65;
printf("%d, %x, %c\n", foo, foo, foo);
141デフォルトの名無しさん:2008/04/26(土) 22:12:32
>>140
文字コードを16進数で突っ込んで表示させてるだけですよね?
入力された文字コードからソレゾレ差分を引けばいいのかもしれないと考えて見ましたが
どうしたらいいのかと、どんどん泥沼にはまりました・・・
142デフォルトの名無しさん:2008/04/26(土) 22:20:02
>>136
やっぱり無理ですよねorz
配列にしとけって指摘は完全同意なのですが、
あほな先輩が作った部分でそこいじっちゃいけない空気なので・・・
143デフォルトの名無しさん:2008/04/26(土) 22:20:47
>>141
どういうコードを書きたいの?
144デフォルトの名無しさん:2008/04/26(土) 22:21:30
char a = 0x41;
int b = a;

って話じゃなく?
145デフォルトの名無しさん:2008/04/26(土) 22:22:20
先輩に向かってあほ呼ばわりって時点で終わってるな
146デフォルトの名無しさん:2008/04/26(土) 22:23:46
>>142
    int id0, id1, id2, id3;
    int *id[4] = { &id0, &id1, &id2, &id3 };
    for(size_t i = 0; i < 4; ++i) *id[i] = 0;
どうしてもって言うならこういう弄り方しかないな。
147デフォルトの名無しさん:2008/04/26(土) 22:28:18
だがあほ・だめな上司・先輩がいるのは業界問わずいるのは事実。
一度採用しちゃうとなかなか切れないからね。組合強いとこは。
148デフォルトの名無しさん:2008/04/26(土) 22:45:05
veector<string>で小さくリサイズすると、stringは自動で解放されますか?
149148:2008/04/26(土) 22:51:52
自己解決しました メモリーリークしました。
x.resize(1);をx.swap(vector<string>());にしても駄目でした。
STLもまだまだ駄目なんですか?

main(){
vector<string> x(100);
for(int n=0;n<100;n++)x[n].resize(1000000);
getchar();
x.resize(1);
getchar();}


150デフォルトの名無しさん:2008/04/26(土) 22:53:23
そりゃぁ、正しく使わなければ使えないだろう。
151148:2008/04/26(土) 22:56:37
これでうまくいきましたよ

class str{
public: string s;
str() { s.resize(1000000); }
~str() { s.swap(string()); }};

main(){
vector< str > x(100);
getchar();
x.resize(1);
getchar();}
152148:2008/04/26(土) 22:59:55
STLは関数のリターンで消滅するというのは本当と思いますが、
resizeでは消滅しないですよね なんでですか?
153デフォルトの名無しさん:2008/04/26(土) 23:01:29
vector<int>だと、また増やすことがあるので、消えない方が良いですけど
<>内で巨大な確保していると困りますよね?
154デフォルトの名無しさん:2008/04/26(土) 23:06:51
>>153
swapなら消えたと思ったが
155デフォルトの名無しさん:2008/04/26(土) 23:08:54
149のコードで、stringが消滅しないのが不便です…
156デフォルトの名無しさん:2008/04/26(土) 23:15:40
>>149 では2度目の getchar 時にもメモリ使用量は変わらないと思うが、
メモリリークしてるわけではない。
単に、delete されたメモリがすぐ OS に返されるわけではないというだけの話。
157デフォルトの名無しさん:2008/04/26(土) 23:22:31
>>155
VC++2005で普通に解放された。↓のBの時点で。

    std::vector<std::string> x(100);
    for(int n=0;n<100;n++){
        x[n].resize(1000000);
    }
    std::cout << "A" << std::endl;
    getchar();

    x.resize(1);
    std::cout << "B" << std::endl;
    getchar();
158デフォルトの名無しさん:2008/04/26(土) 23:46:45
トンクス
159デフォルトの名無しさん:2008/04/26(土) 23:49:44
>>154
swapは必要最小限のメンバ交換だから、
それ以上の処理をすることは無いんじゃないかな。

>>155
newの裏にいるmallocが再利用するために持ってるだけだと思う。
stringのデストラクタは呼ばれてるはずなので。
↓でも1GB確保しっぱなしになる?

//※テストコードなので例外安全とか無視。
std::vector< std::vector<std::string>* > xv;
for(int i=0;i<100;i++){
    xv.push_back( new std::vector<std::string>(100) );
    std::vector<std::string>& x = xv.back();

    for(int n=1;n<100;n++){
        x[n].resize(100*1024);
    }
    x.resize(1);
}
std::cout << "A" << std::endl;
getchar();

for(int i=0;i<100;i++){
    delete xv[i];
}
160159:2008/04/26(土) 23:52:39
× x = xv.back();
○ x = *xv.back();
ごめん、コンパイル通してなかったから。
161デフォルトの名無しさん:2008/04/27(日) 00:26:38
3Dアクションゲームを作りたくてアマゾンで3DRPGの作り方系の本を数冊買おうと思うのですが
数学や物理ができないとかなり無謀ですか?
一応高校は卒業していて、やる気は◎です。
数学と物理の評定はだいたい3〜4でした
162デフォルトの名無しさん:2008/04/27(日) 00:26:59
間違ってあげちゃいました すいません;;
163デフォルトの名無しさん:2008/04/27(日) 00:29:59
>>161
かなり無謀だけど、そこはやる気でカバー。
164デフォルトの名無しさん:2008/04/27(日) 00:30:52
>>161
いいから本屋に行って立ち読みしてこい
発言内容からするとプログラミング初心者か?
いきなりそんな本買ってもムダだ
165デフォルトの名無しさん:2008/04/27(日) 00:35:06
>>161
質問はageで良いよ
無謀かどうかは作るものによると思う
エンジン自作とかは無茶だろうし

本買うのは良いけど、言語(C++?)とかプラットホーム(Win+DirectX?)の知識は大丈夫?
本が前提としてる知識が無いと読んでも躓くだろうから
166デフォルトの名無しさん:2008/04/27(日) 00:37:11
>>161
ホットスーププロセッサーでサンプル動かして様子を見る。
167デフォルトの名無しさん:2008/04/27(日) 00:39:14
とりあえずウィンドウ出す
      ↓
点とかでいいから図形描く
      ↓
一点透視の簡単な3Dを出す

とか?DirectXとか使うなら余計な部分でやる気削がれないようにすればできる
168デフォルトの名無しさん:2008/04/27(日) 01:01:40
初心者が3D作れるとしたら、ホットスーププロセッサかDarkGDKしかないとおもうよ


ホットスーププロセッサ
【じゃ】HSP初質P52【自己解決ゥ!】 http://pc11.2ch.net/test/read.cgi/tech/1192531041/

VC++2008 + DarkGDK
DarkGDK http://pc11.2ch.net/test/read.cgi/tech/1208941132/
169デフォルトの名無しさん:2008/04/27(日) 01:12:52
170デフォルトの名無しさん:2008/04/27(日) 01:37:29
const オブジェクトは変更できないとでるのですが、わかりません 間違い教えて下さい


class A { public: int a; A(int n){a=n;}
bool operator < (const A &z) const {return a < z.a; }};

void fnc(set<A>::iterator p) {p->a=0; }

main(){
set<A> w; w.insert(5);
set<A>::iterator p=w.begin();
fnc(p);
}
171170:2008/04/27(日) 01:38:33
イテレータを引数にして、その内容を変更したいんです…
172170:2008/04/27(日) 01:39:56
エラーのでる箇所は、p->a=0;の部分です。 なにがいけないのかわかりません。教えて下さい。
173デフォルトの名無しさん:2008/04/27(日) 01:43:30
set は平衡木で実装されるが、
平衡木のノードの内容は勝手に変えられると
順番変わる恐れがあるから、
set のイテレータは内容を変えられないようになってる。
174デフォルトの名無しさん:2008/04/27(日) 01:48:45
ありがとう。 わかりました 削除して新たに追加します。
175デフォルトの名無しさん:2008/04/27(日) 02:04:23
【環境】 WindowsXP + VisualC++ 9.0
【質問】
色々なページを見て回ってサンプルコードをコンパイルしようと思ったのですが、うまくコンパイル出来ません。
以下ソースコード

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL,lpCmdLine,"MessageBox",MB_OK);

return 0;
}

cl c:\test.cpp としても
test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。
と出て失敗します。どうすればコンパイルできるのでしょうか?
176デフォルトの名無しさん:2008/04/27(日) 02:19:31
cl test.cpp kernel32.lib user32.lib
177デフォルトの名無しさん:2008/04/27(日) 02:23:45
>>176
素早い回答、どうもありがとうございます。本当に助かりました。
178デフォルトの名無しさん:2008/04/27(日) 03:16:47
>>159
std::string().swap(str);
こう書くとswap先のインスタンスが即デストラクトされるて元の中身が解放される。

自分はこんな風に使ってる
template<class T>
void SwapDelete(T &rCn) {T().swap(rCn);};
179デフォルトの名無しさん:2008/04/27(日) 03:23:52
vector<string> x(100);
string が 100 個確保される。

for(int n=0;n<100;n++)x[n].resize(1000000);
それぞれの string のサイズが 1000000 になる。

x.resize(1);
x[0] を除いた全ての string が破棄される。
string が破棄されるということは、string 内のメモリは解放される。
ただし、vector 内のメモリの最確保は行われない。

また、メモリが解放されても即座に OS にメモリが返されるわけではない。

これだけの話。
180デフォルトの名無しさん:2008/04/27(日) 06:55:38
virtualなテンプレート関数って無理なのか。
STLコンテナ汎用な関数をテンプレートで実装する
クラスの継承で詰まった・・・
181デフォルトの名無しさん:2008/04/27(日) 09:13:49
残念ながら無理だね。仕様的に。
182デフォルトの名無しさん:2008/04/27(日) 09:16:43
virtual なメンバ関数テンプレートは無理だが
クラステンプレートの virtual メンバ関数は可能なので
それを間に入れて何とかするしか
183161:2008/04/27(日) 10:36:41
スレ違いかもしれませんが最後に質問させてください。
英雄○説Yみたいなゲームを作りたいのですが
今C言語とWindowsAPIというやつを勉強しています。
↑のようなゲームを作るためにはどんな言語を覚えれば
ベストですか?
ゲームの専門学校の入ったのですが先輩が2年間学んでも
テトリスくらしか作れないと言っていたので自分で勉強しようと思いました。
184デフォルトの名無しさん:2008/04/27(日) 10:39:45
とりあえず、DirectXを学んでくるといいと思うよ。



RPGツクールでもやってろ
185デフォルトの名無しさん:2008/04/27(日) 10:41:23
>>183
ゲーム会社にアルバイトに行く 技術を現場で学ばないと無理 独学では一生でも無理かもしれない
186デフォルトの名無しさん:2008/04/27(日) 10:43:13
初心者は何をどうやれば作れるのかわからない物 しかしゲーム会社は生産しないと利益でないから
入れば生産方法がわかる
187デフォルトの名無しさん:2008/04/27(日) 10:47:48
>>183
やる気は大事だね。持ってる事はいいこと。
coding はしなければできるようにはならない。
どうせ C 勉強してるなら C++ を勉強するのが良いと
思うけど。今更 C から学ぶ必要は無い。

Java とか ruby とか python とかでもいろいろゲームを
作れるし、そちらの方が手軽かもしれん。けど、プログラミング
初心者ならいろいろ手を出すより一つ言語をある程度使いこなせる
ようにするのが良いと思う。

ゲームが専門で2年間でテトリスは寂しすぎる…




188デフォルトの名無しさん:2008/04/27(日) 10:48:22
連絡取ってみれば?

日本ファルコム株式会社 採用情報:応募方法
http://www.falcom.com/kaisya/recruit/howto.html
189デフォルトの名無しさん:2008/04/27(日) 10:50:53
ゲーム作りたいのか、プログラムやりたいのかはっきりさせよう。
堀井雄二はプログラム出来ないけど大ヒットゲームを何本も作った。
190デフォルトの名無しさん:2008/04/27(日) 10:53:54
アドバイスありがとうございます。
やる気出てきました、がんばります!
191デフォルトの名無しさん:2008/04/27(日) 10:57:32
bcpadがダウンロードできなくなったね。
あれ便利だったのにorz
まあ運良く404になる前にパソコンに入れてたからいいけど。
192デフォルトの名無しさん:2008/04/27(日) 11:05:47
もはやbccの需要なんてあるの?
193デフォルトの名無しさん:2008/04/27(日) 11:07:40
BCC使ってるよ コンパイル速度が速くて実験・学習向き
中身は5.5.1ではなくて最新版のやつに変更してる GUIは使わない
194デフォルトの名無しさん:2008/04/27(日) 11:21:41
>>187
なるほど、
学校の先生はc++は一行のプログラムで色々処理できるから便利と言っていたけど
普通のCからやらないと絶対ダメ!と言っていましたw
195デフォルトの名無しさん:2008/04/27(日) 11:25:48
皆インターネットが悪いんだろうな。単なるプラザ表
示のゲームだから昔の人は偉かったなすべて、何もか
も最初から造る。本の通り出来る訳ない。みんな嘘構
造文に嘘説明。神田の明倫館とか書泉もう時代遅れ。
高岡が儲かり指南の教本がインターネットだから楽な
んだろうな。
196デフォルトの名無しさん:2008/04/27(日) 11:33:35
>>194
とにかく書かなきゃ書けるようにはならんから便利な方から
やりゃいいのよ。目的達成できればいいし、オブジェクト
やテンプレートがある思考法に初めから慣れた方が良い。

C++ に自信が無い人は大抵 C からやらなきゃダメ、と言って
C だけ教えるんだよね。好意的に解釈すると、プロになるならば
C も読めなきゃいけないし、C 的文法も知る必要がある、という
事は言えるかも。ただ、それを初めにしなきゃいかん理由は無い。
197デフォルトの名無しさん:2008/04/27(日) 11:44:56
C言語よりも、C++のほうが易しいと思う。 失敗しにくいような工夫が盛り込まれている為。
ポインタが面倒なので参照いれたり、
型が厳密な為に複雑になるのをオーバーロードやテンプレートで単純化したり
誰もがよく使う処理をSTLとしてまとめたりしてある。
STLを実現する為に必要な文法を勉強するとなると大変だが、使う分には易しい。
198デフォルトの名無しさん:2008/04/27(日) 12:25:08
charとstringにはほぼ互換性ありますけど(変換したときに内容は同じ)
wchar_tとwstringの中身も同じになりますか?
199デフォルトの名無しさん:2008/04/27(日) 12:28:59
はい
200デフォルトの名無しさん:2008/04/27(日) 12:35:17
サンクス 実験しても平気でした。

main(){
int n,k;
char a[]="あいうえおアイウエオ";
string b=a;
k=b.size();
for(n=0;n<k;n++) if(a[n]!=b[n]) cout<<"kobetu err\n";
if(memcmp(a, &b[0], k))cout<<"memcmp err\n";

wchar_t c[]=L"あいうえおアイウエオ";
wstring d=c;
k=d.size();
for(n=0;n<k;n++) if(c[n]!=d[n])cout<<"kobetu err\n";
if(memcmp(c,&d[0],2*k))cout<<"memcmp err\n";
return 0;
}
201デフォルトの名無しさん:2008/04/27(日) 12:42:27
>>200
int書かない派?
202198:2008/04/27(日) 12:45:30
memcpyで送っても同じになりました。

main(){
wchar_t a[]=L"あいうえおアイウエオ";
wstring b,c=a;
b.resize(10); memcpy(&b[0],a,20);
if(b==c)cout<<"itti\n"; }
203デフォルトの名無しさん:2008/04/27(日) 12:51:55
現時点ではbasic_stringのバッファは連続性が保証されてないはずなので
memcpyはダメだ。
204デフォルトの名無しさん:2008/04/27(日) 12:53:11
もうひとつ質問いいですか? wchar_tはUTF16なんですよね?
これは基本単位が16bitで一語が32bitになることもありますよね?
char を wchar_tに変換しようとするとき、確保を2倍にしたら不都合でますか?
205デフォルトの名無しさん:2008/04/27(日) 12:55:00
>>204
> wchar_tはUTF16なんですよね?
そんな決まりはありません。

> char を wchar_tに変換しようとするとき、確保を2倍にしたら不都合でますか?
もちろん。
206デフォルトの名無しさん:2008/04/27(日) 13:12:10
wchar_t が UTF16 なのは VC 限定の話。
一般的にはどうなるか不明。
207デフォルトの名無しさん:2008/04/27(日) 13:53:57
>>204
gccのwchar_tはUCS4。
208デフォルトの名無しさん:2008/04/27(日) 15:40:44
学校のテキストにc++のはなかったので
TUTAYAに売っている入門書でも大丈夫でしょうか?
209デフォルトの名無しさん:2008/04/27(日) 15:46:06
>>208
どの入門書がオヌヌメなのか聞きたいの?
210デフォルトの名無しさん:2008/04/27(日) 15:49:36
アマゾンのレビューで★が一番多い奴でも選べば
211デフォルトの名無しさん:2008/04/27(日) 15:52:11
amazonの専門書関係で日本人が書いた奴って自演レビューがひどいんじゃなかったっけ?
ttp://vipprog.net/wiki/book_review.html#jc9e7713
VIPのところのだけど、参考にするといいと思うよ。
VIPはふざけてる奴はふざけてるけど、こういうデータ収集とかは物凄い勢いでやるから。
212デフォルトの名無しさん:2008/04/27(日) 15:55:07
ありがとうございます!
213デフォルトの名無しさん:2008/04/27(日) 15:59:22
>>211
入門書のレビューがほとんど無いじゃん。
214デフォルトの名無しさん:2008/04/27(日) 16:02:34
VIP とかどうでもいいからこっちで聞け。
というか過去ログ読め。

推薦図書/必読書のためのスレッド 39
http://pc11.2ch.net/test/read.cgi/tech/1202273631/
215デフォルトの名無しさん:2008/04/27(日) 16:05:57
Cが分かるなら、C++って入門書じゃなくって仕様書読めば分かると思うが
216デフォルトの名無しさん:2008/04/27(日) 16:07:36
それはない。
217デフォルトの名無しさん:2008/04/27(日) 17:27:28
CとC++は全く異なる言語だ。
218デフォルトの名無しさん:2008/04/27(日) 17:33:49
全くってことはないだろ
Cのソースの拡張子をcppに変えてもちゃんと動くのは偶然じゃないだろ?
219デフォルトの名無しさん:2008/04/27(日) 17:36:43
一部はちゃんと動かないよ。
220デフォルトの名無しさん:2008/04/27(日) 17:38:43
>>219
そりゃそうだけどさ・・・

最初っから「C++はCをベースに作られた言語だよ」って書けばよかったのか
221デフォルトの名無しさん:2008/04/27(日) 17:41:00
C で組んだプログラムと C++ で組んだプログラムは、
両方がその機能を十分に発揮している場合、
全く異なる感じになるだろう。
もしそうなっていないようなら、C++ をちゃんと使いこなせてないってこった。
222デフォルトの名無しさん:2008/04/27(日) 17:41:48
そうだけど、CとC++の差は、
少なくともC++未経験者にとって仕様書を読んだだけでは分からないだろ。
オブジェクト指向やジェネリックプログラミングなどの概念を身に付けないと。
223デフォルトの名無しさん:2008/04/27(日) 17:54:11
C++でバイナリファイルから浮動小数点を読む時の定番手法はどんな感じでしょうか?

整数読むときみたいに、ios::binaryを設定した後、ifstreamのreadで読もうとしても
ifstream.read( char*, int)
なので1byte単位での読み込みになり、1bit仮数部だけの読み込みはできないですし、
atofはアスキーデータからしか変換できません。

どんな方法で浮動小数点読み込むのがベターですか?
やっぱり<cstdio>のfread使うのでしょうか。
224デフォルトの名無しさん:2008/04/27(日) 17:55:35
系統的に近い言語ならCを理解できる頭があるなら
日本語で方言扱うのと同じ様にC++分かるつってるだけなんだけどなぁ・・・
225223:2008/04/27(日) 17:56:33
仮数部じゃなく符号部ですね。
226デフォルトの名無しさん:2008/04/27(日) 18:01:59
方言程度の違いしか無い訳が無いだろう・・・。
227デフォルトの名無しさん:2008/04/27(日) 18:05:19
>>224
かなり無理があると思うな。他の人も言っているが、class や
template の考え方や override みたいな使いかたは経験無ければ
仕様書読んだだけでは普通無理。Java バリバリ使っていて C も
知っています、というのならまだわかるが。

もちろん C も基本的に C++ として有効なので、仕様書読んだだけでも
使える、と言って C++ のメリットを生かしていない場合は結構あるだろうな。
228デフォルトの名無しさん:2008/04/27(日) 18:08:57
>>223
reinterpret_castしてそのistream.readの引数に渡せばいい。
229デフォルトの名無しさん:2008/04/27(日) 18:09:13
>>223
普通に
double d;
read((char*)&d, sizeof d);
みたいに読むけど。
230デフォルトの名無しさん:2008/04/27(日) 18:09:35
あ、こういう感じね。
double d;
is.read(reinterpret_cast<char*>(&d), sizeof d);
231デフォルトの名無しさん:2008/04/27(日) 18:17:38
俺の感覚が変なんですね・・・。
まぁ、初めてC触ったのが幼稚園で小学校でアセンブラとかやってた
変態チックな俺が世間とずれてるのはよくあることですよね
232デフォルトの名無しさん:2008/04/27(日) 18:20:58
逆に低級言語で頭が止まってるんじゃないかと
233223:2008/04/27(日) 18:25:15
>>228-230
ありがとうございます。納得です。
reinterpret_castの使いどころなんですね。
234デフォルトの名無しさん:2008/04/27(日) 18:42:37
>>231
アセンブラを教えてくれる幼稚園や小学校があるならぜひ紹介してくれ
235デフォルトの名無しさん:2008/04/27(日) 18:45:52
>>234
関係ないが、ロシアにはハッキング教室がある。
企業情報を盗んで生計を立ててる卒業生もいるらしい。
236デフォルトの名無しさん:2008/04/27(日) 18:53:07
俺も幼稚園からやってたな小学校でアナログ時計とか作ってた
本の英小文字とキーボードの大文字がリンクとれなくて大文字のフリガナを親に書いてもらってたのを思い出した
237デフォルトの名無しさん:2008/04/27(日) 18:55:59
なんかPC6001に会いたくなってきた
238デフォルトの名無しさん:2008/04/27(日) 19:53:59
***.exe 等の実行可能ファイルを実行したらどうなりますか?
いったんメモリに命令群が展開されてそこから(?)実行されると思うのですが、
プログラムがメモリのどの位置に配置されたか分る方法ってないのでしょうか?
メモリに配置されたプログラムをダンプするプログラムを作りたいです (´・ω・`)
ヒントだけでもいいので教えてください。よろしくお願いします。
239デフォルトの名無しさん:2008/04/27(日) 20:26:07
240デフォルトの名無しさん:2008/04/27(日) 20:35:26
>>239
ヒントどうもありがとうございます。色々調べてるんですが、なにぶん初心者なもので理解に苦しみます ^^;
OpenProcess に ReadProcessMemory , CloseHandle 色々あって難しいですね。。。
241デフォルトの名無しさん:2008/04/27(日) 20:45:43
あまり好き勝手に他のプロセスに干渉できる作りだとセキュリティ的に問題アリだろ。
それでもWindowsはヌルい方なんだけどな。
242デフォルトの名無しさん:2008/04/27(日) 21:22:54
ファイルを削除する処理のあるコード書くときはいつも緊張する
243デフォルトの名無しさん:2008/04/27(日) 21:50:59
わかるw
244デフォルトの名無しさん:2008/04/27(日) 21:54:35
削除するだけじゃなくて上書きがありうる場合もね。
必ずテスト気を付けてしてるよ。
245デフォルトの名無しさん:2008/04/27(日) 22:00:16
テンプレートクラスの親クラスを作って、それを継承した子クラスを作ったとき、子クラスから親クラスのメソッドを
参照できないのは、どうしてそういう仕様になっているのでしょうか?
this->付けたりとかusingしたりすれば良いのは知識としては知っているのですが、いまいちこの仕様に納得できません。
template <typename T>
class base {
public:
void func() {}
};

template <typename T>
class deri : public base<T> {
public:
void func2() {func();}
};
みたいにしたときです。
246デフォルトの名無しさん:2008/04/27(日) 23:00:06
func2 から見えるところにフリー関数の func があったりすると
T によって呼ばれる関数がフリー関数になったり、メンバ関数になったりするのが
わかりにくくて嫌な挙動だからだと思う
247デフォルトの名無しさん:2008/04/27(日) 23:15:46
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
MessageBox(NULL,"Kitty on your lap","メッセージです", MB_OK);
return 0;
}

これってどこか間違ってますか?
248デフォルトの名無しさん:2008/04/27(日) 23:16:30
Linux環境なんだけど、gccとg++から両方リンクできるライブラリってどうやって作るの?

gcc -c func1.c func2.c
ar rcs libtest.a func1.o func2.o

だとオブジェクトファイルを生成したコンパイラでしかリンクできない
249デフォルトの名無しさん:2008/04/27(日) 23:33:32
>>247
bccならそれでコンパイル通るけど、VC++なら

#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
TCHAR *lpCmdLine,
int nCmdShow
){
MessageBox(NULL,_T("Kitty on your lap"),_T("メッセージです"), MB_OK);
return 0;
}

こうやってうにこーどにしなきゃ駄目
250デフォルトの名無しさん:2008/04/27(日) 23:34:04
>>248
つ[extern "C"]
251249:2008/04/27(日) 23:35:05
あ、#include <tchar.h>を追加するの忘れてた
252デフォルトの名無しさん:2008/04/28(月) 00:15:18
>>246
返答ありがとうございます。
でも、先の例だとTに何が来ても、func()はbaseクラスに必ず存在すると思うんですが、、、
違いますか?
フリー関数というのは、baseクラスやderiクラスの外部にある関数ということですよね?
253デフォルトの名無しさん:2008/04/28(月) 00:15:39
>>250
おお、できた
サンクス!
254デフォルトの名無しさん:2008/04/28(月) 00:18:45
>>252
T内でtypedef 〜 func
とかやってる可能性もあるから。
255デフォルトの名無しさん:2008/04/28(月) 00:21:55
質問です。
テンプレートクラス内で、別のテンプレートクラスを使用する時にエラーが出ます。


例:
template< class TYPE > class List
{
// Listに使うメソッドなど
};

template< class TYPE > class AAA
{
public :
List< TYPE > m_List; // ←エラー
};


凄く初歩的な質問かもしれませんが、何が悪いんでしょうか?
256デフォルトの名無しさん:2008/04/28(月) 00:26:44
どんなエラーが出るんだよ
257デフォルトの名無しさん:2008/04/28(月) 00:27:13
>T内でtypedef 〜 func
ごめんよく読んでなかった。間違い
258246:2008/04/28(月) 00:29:08
>>252
template<> class base<int> {};
259223:2008/04/28(月) 00:29:30
typename List<TYPE> m_LIST;
でどうよ?
260デフォルトの名無しさん:2008/04/28(月) 00:35:43
>>256
すいませんちょっと違いました。

例:
template< class TYPE > class List
{
  // Listに使うメソッドなど
};

template< class TYPE > class AAA
{
public :
  function() { m_List.Add( new T ); }  // ←「m_List」は宣言されていません

  List< TYPE > m_List;
};

って感じにエラーが出ます。


>>258
やってみましたが、やっぱりエラーが出ます。。。
261デフォルトの名無しさん:2008/04/28(月) 00:39:16
だから、どんなエラーが出るんだよ
262デフォルトの名無しさん:2008/04/28(月) 00:41:49
説明が・・・orz

function() { m_List.Add( new TYPE ); }  の間違いです。


>>258
エラーは、「m_Listが宣言されてません」と出ます。
また、この例ではメソッドをクラス内で書いてありますが、
実際にはクラス定義のすぐ下で、

{
〜〜〜クラス定義
};

templeate< class TYPE > typename
class AAA::function()
{
  m_List.Add( new TYPE );
}

のような感じでヘッダーファイルに記述してあります。
263デフォルトの名無しさん:2008/04/28(月) 00:43:00
>>261
C2065 m_Listは定義されていない識別子です。

とでます。
264デフォルトの名無しさん:2008/04/28(月) 00:47:33
>>260
g++ ならそのまま普通に通る。VCの場合は知らんけど
g++ -ansi -pedantic
でも通るからC++標準からみて問題はなさそう。

問題が再現するソース作ってコピペし、VC++使いに見てもらうのが良し。
265デフォルトの名無しさん:2008/04/28(月) 00:53:11
VC9でも>>260の例の部分はコンパイル通る
266デフォルトの名無しさん:2008/04/28(月) 00:54:05
すいません、単純に「m_List」に当たる名前を間違えてましたorz

本当にすいません;
お騒がせしました。
267デフォルトの名無しさん:2008/04/28(月) 00:55:00
あと回答してくださってありがとうございました。
もう少し勉強してからまた来ます;
268デフォルトの名無しさん:2008/04/28(月) 00:57:34
もう来なくていいように勉強してください。
269デフォルトの名無しさん:2008/04/28(月) 00:57:53
>>257
>>258
ありがとうです。
テンプレートの特殊化があるために、baseクラスの定義が信用できないということですね?
270デフォルトの名無しさん:2008/04/28(月) 02:46:37
メモリダンプツール作りたいが手順がよく分らない。。。
プロセスIDの指定→メモリ上の位置の取得→指定されたサイズだけデータを読み込む→ファイルに保存
といった感じかな??メモリ上の位置の取得とデータの読み込みの方法が分らない。。。。
誰かサンプルコードを書いてくれ。いや、サンプルコードを提供して頂けないでしょうか?
よろしくお願いします。
271デフォルトの名無しさん:2008/04/28(月) 02:51:20
自分で作るよりソフトを探した方が早そうだけど
272デフォルトの名無しさん:2008/04/28(月) 03:01:29
>>271
ツール自体は持ってるんですけど、どんな風に動作してるのか、動作原理に興味があって質問しました。
邪魔になるようだったら以降控えます。すみませんでした。
273デフォルトの名無しさん:2008/04/28(月) 03:13:10
>>272
OSは?
274デフォルトの名無しさん:2008/04/28(月) 03:15:25
すみません。OSはXPです。
275デフォルトの名無しさん:2008/04/28(月) 03:21:52
274の脳内にはOSと言えばWindowsしか存在しないようだ。
それはともかくReadProcessMemory。
あとOpenProcessも必要になるかな。
276デフォルトの名無しさん:2008/04/28(月) 04:36:53
質問ばかりですいません。
テンプレート化されたクラスは、特殊化すれば中身は全然違うクラスになりうるということですよね?
どうしてこんな仕様になっているのでしょうか?特殊化する際は、インターフェイスは特殊化する前の
ものと同じにしないとだめ、という仕様の方がよっぽど自然な感じがするのですが、、
なんかいいことがあるんですか?
template <typename T>
class base {
public:
int a;
};
template <>
class base<int> {
public:
void a() {
std::cout << "aaaa" << std::endl;
}
};
277デフォルトの名無しさん:2008/04/28(月) 07:13:54
すいません、最近C言語を始めた初心者です。
Borland C++Compilerとbcpadがあればcとc++の開発はだいたいできますか?
278デフォルトの名無しさん:2008/04/28(月) 07:51:40
gccとVisual C++ Expressを勧める。
279デフォルトの名無しさん:2008/04/28(月) 07:57:21
C++(またはC++0x)の規格に完全に準拠したコンパイラはありますか。exportとかも使えたり。
その代わりpragmaが一切ないとか、実用性0でもいいです。
280デフォルトの名無しさん:2008/04/28(月) 10:55:20
内部にファンクタへのポインタを持っているクラスがあるとして、そのクラスからファンクタを呼び出すときは、
operator()(引数)と書かなくてはならないですか?
class aaa {
public:
functor* fp;
};
class functor {
public:
int operator()(int);
};

aaa A;
A.fp->operator()(10); // これはコンパイルできる
A.fp(10); // これはできない。
これはしょうがないですか?
281デフォルトの名無しさん:2008/04/28(月) 11:23:21
これでは駄目?


class A {
public:
int m;
A(){m=0;}
A(int n) {m=n;} };


class B {
public:
A *p;
B(int n){p=new A; p->m=n;}
};


main(){
B z(10);
}
282デフォルトの名無しさん:2008/04/28(月) 11:37:39
functor& rf = *A.fp;
rf(10);
283デフォルトの名無しさん:2008/04/28(月) 11:38:59
(*A.fp)(10)
284デフォルトの名無しさん:2008/04/28(月) 14:49:29
aaaのoperator()(int)からfp->()(int)呼べばいいんじゃね
285デフォルトの名無しさん:2008/04/28(月) 15:20:08
>>276
メタプロにおけるテンプレート特殊化というのは、通常プログラミングの
文脈で言う条件分岐(switch)にあたる。
実利的には、特殊化が無いとboostライブラリの大半が実現できなかったり
能力が落ちたりする。
boost/utility/enable_if.hppなんかは何やってるか解りやすいと思う。
286デフォルトの名無しさん:2008/04/28(月) 18:32:09
>>279
export が使える、準拠率の最も高いコンパイラとして知られているのは Comeau C++ だな。
287デフォルトの名無しさん:2008/04/28(月) 20:14:24
#include <stdio.h>

main()
{
printf("hello!");
return 0;
}
をコンパイルしてできたexeファイルをダブルクリックしてもコマンド
プロントっぽいのが一瞬でて消えてしまいます

コマンドプロントからhello.exeで使用するとちゃんとhello!と表示されます
前者のほうはOSが壊れていたりするからですか?
不安なのでアドバイスください;;
288デフォルトの名無しさん:2008/04/28(月) 20:16:41
コマンドプロンプト用のプログラムをダブルクリックで起動した場合は
プログラムが終了するとコマンドプロンプトも一緒に終了する。
そういうもん。
289デフォルトの名無しさん:2008/04/28(月) 20:20:18
>>288
ありがとうございます

自己解決しました
290デフォルトの名無しさん:2008/04/28(月) 20:23:24
氏ね
291デフォルトの名無しさん:2008/04/28(月) 20:28:20
おいおい、とんでもない発言してやがるな…。
292デフォルトの名無しさん:2008/04/28(月) 20:29:26
>>285
みてみましたが、使い方とかがよくわかりません。ソースも中身がカラで無意味そうに見える(けど本当は意味があるんだろう)テンプレートばっかりで
ピンと来ませんでした。とりあえず
boost.org/libs/utility/
でも見てみます。あと、メタプログラミングを知れば利点がわかるということですか?
ありがとうございました。
293デフォルトの名無しさん:2008/04/28(月) 22:07:28
実際に使えば納得できるよ
294デフォルトの名無しさん:2008/04/28(月) 22:25:51
>>290 >>291
ごめんなさい、コンパイルしないで書き込んじゃいました
コンパイルしたらまた書き込みます
295デフォルトの名無しさん:2008/04/29(火) 01:47:26
今まで学校でC++やってたんですが、家でやろうとVC++9.0インストールしたら単純なプログラムもコンパイル出来ません(Тωヽ)

error C4430ってのが出て、もう意味不明です。どういう事なんでしょう?
296デフォルトの名無しさん:2008/04/29(火) 01:48:54
顔文字貼る余裕があるならソースくらい貼ろうよ…
297デフォルトの名無しさん:2008/04/29(火) 01:50:01
>>295
オマイが今まで書いてきたプログラムはC++のような何かだったってこと
298デフォルトの名無しさん:2008/04/29(火) 01:56:00
>>296

#include<studio.h>
main()
{
}

これすらコンパイル出来ません…
299デフォルトの名無しさん:2008/04/29(火) 01:57:18
ミス

<stdio.h>
300デフォルトの名無しさん:2008/04/29(火) 01:59:34
int main()
{
}
301デフォルトの名無しさん:2008/04/29(火) 02:01:23
学校に騙されてたんだな
「C++はintを既定値としてサポートしていません」とか書かれてないか?
302デフォルトの名無しさん:2008/04/29(火) 02:01:36
#include <stdio.h>

int main(void)
{ return 0; }
303デフォルトの名無しさん:2008/04/29(火) 02:02:32
拡張子を.cppから.cに変更する
304デフォルトの名無しさん:2008/04/29(火) 02:04:36
出来ました。ありがとうございますm(__)m

>>301
書いてあります。
305デフォルトの名無しさん:2008/04/29(火) 02:06:18
>>304
次からはそういう大事な情報を隠さないでくださいね
306デフォルトの名無しさん:2008/04/29(火) 02:07:55
>>305

はい、すみません。
307デフォルトの名無しさん:2008/04/29(火) 03:49:16
>>292 これならわかるだろうか?

template<class X, class Xs>
struct List;

struct Nil;

template<class Xs, class X>
struct Cons
{
typedef List<X, Xs> type;
};


template<class Xs, class X>
struct Append;

template<class X, class Xs, class Y>
struct Append<List<X, Xs>, Y>
{
typedef Cons<X, typename Append<Xs, Y>::type> type;
};

template<class X>
struct Append<Nil, X>
{
typedef typename Cons<X, Nil>::type type;
};
308デフォルトの名無しさん:2008/04/29(火) 06:10:13
>>307
ありがとうございます。でもmain関数が書けません(泣)
簡単でいいですから、main関数も書いてもらえませんか?

309デフォルトの名無しさん:2008/04/29(火) 07:17:22
int main(){return 0;}
310デフォルトの名無しさん:2008/04/29(火) 07:39:34
>>309
それくらいなら書けます。
311デフォルトの名無しさん:2008/04/29(火) 14:06:38
はじめまして質問させていただきます。
class MyShip{
private:
float x;
float y;
public:
void GetMyShipLocation(float* X,float* Y);
void SetMyShipDefault();
void MoveMyShip(int keybordstate);
};
void GetMyShipLocation(float* X,float* Y){
*X = x;
*Y = y;
}
GetMyShipLocation関数を使って、描画関数に値を渡したいのですが、
値がぶっとんでしまい、-107374176.000000と表示されてしまいます
自分ではもう訳がわからなくなってしまいました。解決方法をご教示願います。
312デフォルトの名無しさん:2008/04/29(火) 14:10:31
メンバのx,y初期化した?
313デフォルトの名無しさん:2008/04/29(火) 14:11:46
はい。
SetMyShipDefault関数を初回に動かして、
x = -55.0f;
y = 100.0f;
という値を入れています。
314デフォルトの名無しさん:2008/04/29(火) 14:27:10
>>311
色々とダメすぎ。C++を真面目に勉強することをお勧めする。
それはさておき、「描画関数」と「値を渡す」ところと、「値がぶっ飛んでしまう」ところのソースを晒せ。
315デフォルトの名無しさん:2008/04/29(火) 14:30:20
[値を渡す場所]
VOID GameBody( HWND hWnd ){

FPS_NOW = timeGetTime();
if(FPS_FLAG < 0){ FPS_FPS = 1000/(FPS_NOW-FPS_LAST) ; FPS_FLAG = 20 ;}
else{FPS_FLAG--;}
int keystatus = getKeybordState( g_pKeyboard );
char bill[256];
sprintf( bill, "%f %f %.02f" , g_Billbord[9].objPos.x , g_Billbord[9].objPos.y , FPS_FPS);
if(g_FullScreenFlag == FALSE){SetWindowText( hWnd , bill );}
switch(GameFlag){
case GAME_STANDBY:
MyShip Player;
Player.SetMyShipDefault();
GameFlag = GAME_START ;
break;
case GAME_START:
//Player.MoveMyShip(keystatus);
Player.GetMyShipLocation(&g_Billbord[9].objPos.x , &g_Billbord[9].objPos.y );
break;
}


FPS_LAST = FPS_NOW;
return;
}
316デフォルトの名無しさん:2008/04/29(火) 14:36:05
謎の関数とか定数とか多すぎ
DxLibって奴か?
317デフォルトの名無しさん:2008/04/29(火) 14:39:04
ダメだこりゃ。
318デフォルトの名無しさん:2008/04/29(火) 14:39:53
-107374176は0xccccccccだから
vcのデバッグビルド時の未初期化変数の値と一致する
319デフォルトの名無しさん:2008/04/29(火) 14:40:52
とりあえず、メンバの初期化はコンストラクタでやろうね
320デフォルトの名無しさん:2008/04/29(火) 14:43:20
case GAME_STANDBY:
MyShip Player; どう見ても原因はここだろ
321デフォルトの名無しさん:2008/04/29(火) 14:45:08
そんなんでコンパイル通るんだ…
322デフォルトの名無しさん:2008/04/29(火) 14:46:00
スコープがまったく理解できてないの?
323デフォルトの名無しさん:2008/04/29(火) 14:50:34
>>320
その通りでしたorz
すみません、自分でもすっかり見落としてました。
回答してくださった皆様、お手数おかけしました。
324デフォルトの名無しさん:2008/04/29(火) 14:53:48
自分でもまさかそんな事は無いだろうと、GameBody側のソースを全く見直してませんでした。
久々に寝ることにします・・・。
325デフォルトの名無しさん:2008/04/29(火) 22:29:14
エラー出るんだけどなぜですか?
#include <stdio.h>


main()
{
int c;
scanf("%c", &c);
printf("%c", c);[
return 0;
}
エラー E2188 001.cpp 8: 式の構文エラー(関数 main() )
326デフォルトの名無しさん:2008/04/29(火) 22:29:46
その[なにw
327デフォルトの名無しさん:2008/04/29(火) 22:31:28
>>325
どんまいw
328325:2008/04/29(火) 22:37:25
あ・・・
すいません;; ありがとうございました
329デフォルトの名無しさん:2008/04/30(水) 02:41:59
すいません、質問したいのですが・・・。

VisualStudio2005でライブラリを作りたくて色々試行錯誤してみたのですが・・・。
いまいちよくわからない状態でして。

用途についてですが、自分は学生でゲームを作っています。
言語では
DirectX
OpenGL
を使っています。
それに自分で使いやすいようにライブラリを作るつもりで調べてみました。

どうかやさしくおねがいします・・・・。
330デフォルトの名無しさん:2008/04/30(水) 02:43:21
>>329
さっさと質問すれば?
331デフォルトの名無しさん:2008/04/30(水) 02:45:47
332デフォルトの名無しさん:2008/04/30(水) 02:46:21
>言語では
>DirectX
>OpenGL
>を使っています。
やさしく突っ込むと意味不明。

まずは自分の使ってる言語がCかC++のどちらなのか、
DirectXとOpenGLのどちらのライブラリを使うつもりなのか
基本的な部分を書くべきだと思う
333デフォルトの名無しさん:2008/04/30(水) 02:46:38
Dark GDKはDirectX9cフルサポート。マイクロソフトVS2008/VC++のオプションとして無料配布。
初心者を強く意識した設計になっているので、あとは日本語の入門書でもあれば、小学生がひとりで、
3Dゲームを作ってしまう、なんてこともできそうです。もともと DarkBasic というホビーユーザー向けのゲーム開発ツールがあって、 その開発スタイルを C++ に持ってきたのが DarkGDK ということらしいですが、悪くありません。
334デフォルトの名無しさん:2008/04/30(水) 02:47:01
>>332
今のDirectXはC++だよ
335デフォルトの名無しさん:2008/04/30(水) 02:52:29
新しいプロジェクトの作成

Win32プロジェクト

スタティック ライブラリ

int.cppに

int test ( int a ){
return ( a );
}

ビルド

フォルダにlibが生成
336デフォルトの名無しさん:2008/04/30(水) 02:52:50

libをVisualStudioのlibフォルダに入れる

新しいプロジェクトを作る

リンクさせる

int main ( void )
{
int a = 10;
a = my_print ( a );
printf ( "%d", a );
return ( 0 );
}




でerrorがでました・・・。
そもそもmy_printが使えてないので、libがだめなのか、リンクがだめなのか。。。
その次元でわからないのです。。。
337デフォルトの名無しさん:2008/04/30(水) 02:54:27
>>321

ありがとうです


>>332
すいません、説明が不十分でした。
DirectXかOpenGLでゲームをつくり、ライブラリはC++をつかっています。

338デフォルトの名無しさん:2008/04/30(水) 02:55:27
あ、ライブラリがDirectXかOpenGL
です。

あほだ俺・・・
339デフォルトの名無しさん:2008/04/30(水) 02:56:23
>>336
それだと my_print が存在しないんじゃね?
340デフォルトの名無しさん:2008/04/30(水) 02:57:05
DirectXかOpenGLのどっちを使うんだよ
まだ決まって無いってことか?まずそこから選べよ
341デフォルトの名無しさん:2008/04/30(水) 02:57:34
>>339

うぉっと、すいませんmy_printじゃなくってtestです・・・
ごめんなさい
342デフォルトの名無しさん:2008/04/30(水) 02:59:01
errorが出たならそのエラーを貼付けろ
343デフォルトの名無しさん:2008/04/30(水) 02:59:51
>>341
#pragma comment(lib, "ほにゃらら.lib")
とかやってみては?
344デフォルトの名無しさん:2008/04/30(水) 03:00:22
>>340

DirectXでやると思うんですが、OpenGLでもつくるつもりです。
345デフォルトの名無しさん:2008/04/30(水) 03:01:53
>>342

失敗した後色々弄ったので廃棄してしまったんで・・・
もう一回やり直してエラー貼り付けます

>>343

やってみたんですが駄目でした
346デフォルトの名無しさん:2008/04/30(水) 03:03:09
ヘッダをインクルードしてなくてコンパイルエラー出てるんじゃないの
347デフォルトの名無しさん:2008/04/30(水) 03:04:40
まずはエラーをよく読むクセをつけないと駄目だな
最近のコンパイラは日本語で懇切丁寧に解説してくれるだろ
348デフォルトの名無しさん:2008/04/30(水) 03:06:24
VCならMSDNでエラー番号で調べれば説明もあるし
349デフォルトの名無しさん:2008/04/30(水) 03:08:27
#include <stdio.h>


#pragma comment(lib, "test.lib")
int main ( void )
{
int a = 10;
a = test ( a );
printf ( "%d", a );
return ( 0 );
}

エラー

test 識別子が見つかりませんでした
350デフォルトの名無しさん:2008/04/30(水) 03:09:50
>>346

ヘッダってどのヘッダでしょうか?


>>347
>>348

以後注意します
351デフォルトの名無しさん:2008/04/30(水) 03:11:04
>>349
関数プロトタイプを含んだヘッダはどこ?
C++としてコンパイルしているなら必須
352デフォルトの名無しさん:2008/04/30(水) 03:13:35
>>351

prototypeのヘッダ・・・

もしかしてtestのprototypeをヘッダで宣言している必要があるということでしょうか。
全くやってないです
353デフォルトの名無しさん:2008/04/30(水) 03:14:54
>>352
これでどう?
#include <stdio.h>

#pragma comment(lib, "test.lib")
int test ( int a ); // <- これ追加

int main ( void )
{
int a = 10;
a = test ( a );
printf ( "%d", a );
return ( 0 );
}
354デフォルトの名無しさん:2008/04/30(水) 03:18:00
>>352

やってみました

test.libを開けませんでした

とエラーが吐かれました
355デフォルトの名無しさん:2008/04/30(水) 03:18:38
>>354

>>353です、すいません
356デフォルトの名無しさん:2008/04/30(水) 03:23:02
test.libのあるフォルダにパスが通ってないだろ
357デフォルトの名無しさん:2008/04/30(水) 03:27:32
>>356

ソリューションエクスプローラのプロジェクトを右クリック → プロパティ
リンカ → 追加のライブラリ → libを入れたフォルダを指定

じゃだめなんでしょうか
358デフォルトの名無しさん:2008/04/30(水) 03:28:54
だあーーーー。

すいません、本当にすいません。

作成したlibが


test2.lib
でした・・・・
吊ってきます
359デフォルトの名無しさん:2008/04/30(水) 04:44:23
だれか307のカキコに、テンプレート使ったカッコいいmain関数をつけてください
お願いします。
360デフォルトの名無しさん:2008/04/30(水) 08:11:10
自己解決しました
361デフォルトの名無しさん:2008/04/30(水) 19:30:23
http://i-get.jp/upload500/src/up16228.txt

基数計算のプログラムを書いて来いという宿題が出たのですが何度コンパイルしてもエラーが出てしまいます・・。
直しかた教えてください;;
エラー 1 error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。 MSVCRTD.lib c++001
エラー 2 fatal error LNK1120: 外部参照 1 が未解決です。 C:\Documents and Settings\igumasatosi\My Documents\Visual Studio 2008\Projects\c++001\Debug\c++001.exe 1 c++001
362デフォルトの名無しさん:2008/04/30(水) 19:30:59
基数変換のプログラムでした
連投すいません
363デフォルトの名無しさん:2008/04/30(水) 19:32:14
h抜き忘れた・・・
樹海行ってきます・・・
ごめんなさい
364デフォルトの名無しさん:2008/04/30(水) 20:07:42
main()の部分を、
int main(int argc, CHAR* argv[])

int wmain(int argc, WCHAR* argv[])
に置き換えても通らない?
365デフォルトの名無しさん:2008/04/30(水) 20:22:38
だめみたいです;;
366デフォルトの名無しさん:2008/04/30(水) 20:29:10
エラーメッセージも変わってないのかな?

いっそのこと「Win32コンソールアプリケーション」
で新しくプロジェクトを作っちゃって、
最初から書いてある
int _tmain(int argc, _TCHAR* argv[])
の中にmain()の中身をコピペしてしまったほうが早いかもしれん。
367デフォルトの名無しさん:2008/04/30(水) 21:06:06
これが問題です
ttp://akm.cx/2d2/src/1209557106123.jpg
スキャンして載せてみました。
どうしても成功できない・・・。
368デフォルトの名無しさん:2008/04/30(水) 21:50:22
VC++ 9.0だが正常にコンパイルできた。バージョンによるのかもね。
それともどこか書き間違えてるとか?
どうでもいいが、ユーザー名・・・・ igumasatosi さんw
369デフォルトの名無しさん:2008/04/30(水) 21:58:15
ここまでスルーしてたのにw
370デフォルトの名無しさん:2008/04/30(水) 22:04:49
>>368
なるほど、ありがとうございます
もうちょいがんばってやってみます。

ユーザ名^^; うっかり^p^
371デフォルトの名無しさん:2008/04/30(水) 22:11:41
あ、Visualstdioでやったらだめだったけど
BCCでやったらできました
連投失礼しました
372デフォルトの名無しさん:2008/05/01(木) 01:41:16
>>359 少しの修正を加えて

template<class X, class Xs> struct List {};

struct Nil {};

template<class X, class Xs>
struct Cons
{
typedef List<X, Xs> type;
};


template<class Xs, class X>
struct Append;

template<class X, class Xs, class Y>
struct Append<List<X, Xs>, Y>
{
typedef typename Cons<X, typename Append<Xs, Y>::type>::type type;
};

template<class X>
struct Append<Nil, X>
{
typedef typename Cons<X, Nil>::type type;
};

↓つづく
373デフォルトの名無しさん:2008/05/01(木) 01:41:51
つづき

#include <iostream>
#include <typeinfo>

typedef Append<Nil , unsigned char >::type UC;
typedef Append<UC , unsigned short>::type UCS;
typedef Append<UCS , unsigned int >::type UCSI;
typedef Append<UCSI, unsigned long >::type unsigned_ints;

void print(std::ostream& s, Nil)
{}

template<class X, class Xs>
void print(std::ostream& s, List<X, Xs>)
{
s << typeid(X).name() << std::endl;
print(s, Xs());
}

int main()
{
print(std::cout, unsigned_ints());
return 0;
}
374デフォルトの名無しさん:2008/05/01(木) 03:57:25
>>373
すげえ、まだみたばかりで内容はよくわからんけど、勉強させてもらいます。
ありがとうス。
375デフォルトの名無しさん:2008/05/01(木) 08:49:16
>>371
コンソールじゃなかったんだろうね
376デフォルトの名無しさん:2008/05/01(木) 09:17:27
Visualなstdio・・・
377デフォルトの名無しさん:2008/05/01(木) 09:18:25
コンソールアプリ選択してなかったって意味だろ
378デフォルトの名無しさん:2008/05/01(木) 09:50:57
stdio.hをstudio.hって書く人はよく見るけど、
Visual StudioをVisualstdioなんて書く人はじめてみたよw
379デフォルトの名無しさん:2008/05/01(木) 11:12:23
>378
ごめん、なんか胸が痛い…… もう何年も前なのに……。
380厨房:2008/05/01(木) 14:38:31
1)下の実験プログラムでWaitForSingleObject関数から抜けなくなります。
2)Sleep(1000) が無いとプログラムは最後まで通ります。
環境はVC++6.0です。
理由がわかる方、原因をお教えください。

-------------------------------------------------------------
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include "resource.h"

int isContLoop;
HWND hDlg;

unsigned __stdcall thFunc(void* arg)
{
while(isContLoop)
SetWindowText(hDlg, "string");
_endthreadex(0);
return 0;
}
// 次に続く
381厨房:2008/05/01(木) 14:39:15
// 前の続き

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pchCmdLine,
int iCmdShow)
{
HANDLE hTh;
unsigned int idTh;

// Create Dialog
hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);
ShowWindow(hDlg, SW_SHOW);

// Start Thread
isContLoop = 1;
hTh = HANDLE(_beginthreadex(NULL, 0, &thFunc, NULL, 0, &idTh));

// Wait
Sleep(1000);

// Stop Thread
isContLoop = 0;
WaitForSingleObject(hTh, INFINITE);
CloseHandle(hTh);

return 0;
}
382厨房:2008/05/01(木) 14:41:50
補足
3)SetWindowTextを使わないと、プログラムは最後まで通ります。
383デフォルトの名無しさん:2008/05/01(木) 14:54:11
Sleep してる間にもの凄い勢いで SetWindowText を実行しようとして
何か変な事が起こってるんじゃなかろうか。
384デフォルトの名無しさん:2008/05/01(木) 14:56:52
他スレッドが作ったウィンドウに対して、SendMessage系使うとデッドロックの可能性がある
PostMessageを使うのが良い
385デフォルトの名無しさん:2008/05/01(木) 14:57:10
別スレッドからSetWindowTextしても問題ないんだっけ
386デフォルトの名無しさん:2008/05/01(木) 15:22:59
ttp://msdn.microsoft.com/en-us/library/ms633546.aspx
> If the target window is owned by the current process,
> SetWindowText causes a WM_SETTEXT message to be sent to the specified window or control.

SetWindowTextはWM_SETTEXTをsendしようとするが
ダイアログを所有するメインスレッドがメッセージを受け取れる状態ではないので
SetWindowTextから返って来なくなる。
メインスレッド→WaitForSingleObjectで待つ(メッセージを受け取れる状態ではない)
別スレッド→メインスレッドがメッセージを処理するのを待つ
となり、デッドロックに陥る。

Sleepを抜くと通るのは、スレッドがwhileループに入る前にisContLoop = 0;が実行され
SetWindowTextが呼ばれないため。

ttp://msdn.microsoft.com/en-us/library/ms644927.aspx
この辺読むといいよ。
387厨房:2008/05/01(木) 16:47:21
>>386
ご回答ありがとうございます。
やっと理由を理解できたような気がします。

このようなスレッドの終了法を未だ自分で思いつくことができないのですが、
とりあえずあるサイトに提示されていた下記の方法を参考にさせていただきます。

ご提示いただいたサイトやヘルプを元に改めて勉強しなおします。

------------------------------------------------------------
// メインスレッド側
MSG msg;
// 正常にWaitForが終了するまで最大50msecづつ待つ
while(WAIT_TIMEOUT == WaitForSingleObject(hTh, 50))
{
// おそらくタイムアウトになるので、
// 立ち上げたスレッド内でSendMessageされていた?メッセージを適当に処理する
GetMessage(&msg, NULL, 0, 0);
if(!IsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
388デフォルトの名無しさん:2008/05/01(木) 17:08:33
for (;;) {
const DWORD r = MsgWaitForMultipleObjects(1, &hTh, FALSE, INFINITE, QS_SENDMESSAGE);

if (r == WAIT_OBJECT_0 + 1) {
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
}
else
break;
}

こういう方法もある。
ttp://msdn.microsoft.com/en-us/library/ms644927.aspxのMessage Deadlocksに書いてあるけど
PeekMessageを呼ぶとSendされてたメッセージを処理できる。
389デフォルトの名無しさん:2008/05/01(木) 22:16:34
デストラクタをバーチャルにしろ、って言うけど、
Aクラスを継承してBクラスを作った場合、

B* b = new B();
A* a = b;
delete a;

で、Aクラスのデストラクタが呼ばれる代わりに
Bクラスのデストラクタが呼ばれるのだよな?

でも、ちゃんとインスタンスが消滅するには、
Bクラスのデストラクタが呼ばれた後、Aクラスのデストラクタが
呼ばれないといけないのじゃない?

結局、デストラクタをバーチャルにしても、
よく本に書いてあるような、その目的を達成することが出来ない
気がするのだが、違うのか?
390デフォルトの名無しさん:2008/05/01(木) 22:21:30
Bのデストラクタが呼ばれた後にAのデストラクタが呼ばれるのはもちろんのことだよ。
391デフォルトの名無しさん:2008/05/01(木) 22:22:25
> Bクラスのデストラクタが呼ばれた後、Aクラスのデストラクタが
> 呼ばれないといけないのじゃない?

ちゃんとそうなってる
392デフォルトの名無しさん:2008/05/01(木) 23:46:27
B のコンストラクタが呼ばれる前に A のコンストラクタが呼ばれるのと同じくらい当然に
B のデストラクタが呼ばれた後に A のデストラクタが呼ばれる。
393厨房:2008/05/02(金) 02:39:42
>>388
ありがとうございます。
大変参考になります。
394デフォルトの名無しさん:2008/05/02(金) 05:22:11
デストラクタをvirtualにしてないと、基底クラスのポインタに
派生クラスを突っ込んだときの後始末で、基底クラスの
デストラクタしか呼ばれないから。

派生クラスがこういう使い方をされないのなら、virtualに
しなくても問題ない。
395デフォルトの名無しさん:2008/05/02(金) 12:05:28
>394
デストラクタの呼び出しは特別だ、て話だと思ってたけど。
基底ポインタからの呼び出しに関して、
ふつーの仮想メンバ関数は、「派生のみ」しか呼ばれないけど、
仮想デストラクタは「派生」のあとに「基底」も呼ばれる、みたいな。
396デフォルトの名無しさん:2008/05/02(金) 12:52:23
A のデストラクタが呼ばれなかったら
{ B b; } でも困ることになるよなー、と。
397デフォルトの名無しさん:2008/05/02(金) 17:15:26
>>395派生クラスのデストラクタの終わりに基底クラスのデストラクタ呼び出しが
自動挿入されてるみたいな感じだから、呼び出すこと自体は普通のvirtual関数と
同じ扱いですよね
398デフォルトの名無しさん:2008/05/02(金) 19:23:55
wchar_t ***buffer;
buffer[y][x] = new wchar_t[3];

質問です。上記のようにnewでメモリを確保しようとすると、
6つぐらい余分に確保してしまうのですが、何が原因でしょうか?
環境はVC++です
399デフォルトの名無しさん:2008/05/02(金) 19:34:18
初心者も上級者も
vector<string>やvector<wstring>
つかう
400デフォルトの名無しさん:2008/05/02(金) 20:05:04
buffer = new wchar_t**[ysize];
for(int y = 0; y < ysize; ++y) {
 buffer[y] = new wchar_t*[xsize];
 for(int x = 0; x < xsize; ++x) {
  buffer[y][x] = new wchar_t[3];
 }
}
401デフォルトの名無しさん:2008/05/02(金) 20:22:52
>>400
それは398も既にやっているんじゃないの?
やっていないとしたら、アクセス違反で落っこちるって質問になるはず。
402デフォルトの名無しさん:2008/05/02(金) 20:29:06
>>398
適当なことを書くと
4byte が new で確保したサイズ
6byte が自由にアクセスできる領域
2byte がアラインメント
ただし、根拠は無いので信用するなよw

どうやって監視してるのかどうかしらんけど
デバッグ用に先頭と末尾にマジックナンバー埋め込んでる可能性もある
403デフォルトの名無しさん:2008/05/02(金) 20:49:21
どうやってチェックしたかと、デバッグ版かどうかの情報が欲しいな。
404398:2008/05/02(金) 21:05:26
みなさんどうも。
newした直後にブレークポイントを設置してみた結果、
buffer[y][x] = "???######gg"
と見られますし、またwcslen(buffer[y][x])で長さを調べても
上記の余分な配列幅が観測できました。

 ?は想定している数の分、#は四角の絵文字で6つぐらい。
405398:2008/05/02(金) 21:07:12
追記

コンパイルはReleaseではなくDebag、
VC++は2008Expressです。
406デフォルトの名無しさん:2008/05/02(金) 21:08:35
まあ、初心者のうちは、
最初からちゃんとやったことを話すことだね。
407デフォルトの名無しさん:2008/05/02(金) 21:11:03
>>404
wcslen でどうやって確保したメモリの長さを調べられるんだ?
まあそれはいいが、デバッグ版の場合はバッファオーバーランを検知するために
前後に余分にメモリを確保し、そこを特定のデータで埋めるようになっている。
408デフォルトの名無しさん:2008/05/02(金) 21:12:27
フフフフフフwww
409デフォルトの名無しさん:2008/05/02(金) 21:14:00
それは初期化されていない変数に埋められる値だな。
確か前後を埋める値はそれとは別だったと記憶している。
410デフォルトの名無しさん:2008/05/02(金) 21:14:23
>>408
あるあるw
411デフォルトの名無しさん:2008/05/02(金) 21:17:22
DEADBEEF
412398:2008/05/02(金) 21:36:40
int m_Col=m_Row=0;

void fReadData()
{
 char c;
 int row = col = 1;
 fstream stream;
 // [1][1][0]
 vector<vector<vector<char>>> buffer;
 buffer.resize(row);buffer[row-1].resize(col);buffer[row-1][col-1].clear();
 stream.open(m_FileName,ios::in | ios::binary);if(!stream.is_open()) { return; }
 while(!stream.eof())
 {
  stream.get(c);
  if(c == EOF) { return; }
  if(c == ',')
  {
   col++;
   buffer[row-1].resize(col);
  } else if( c == '\r') { // \nだと余計なスペース入っちゃうから
   m_Col = max(m_Col,col);
   row++;
   col = 1;
   buffer.resize(row);
   buffer[row-1].resize(col);
  } else {
   buffer[row-1][col-1].push_back(c);
  }
 }
413398:2008/05/02(金) 21:38:43
m_Row = max(m_Row,row)-1;
m_Col = max(m_Col,col);

char sb[2];
wchar_t wb;
int sBuf;
m_String = new wchar_t**[m_Row];
for(int y=0; y<m_Row; y++)
{
m_String[y] = new wchar_t*[m_Col];
for(int x=0; x<m_Col; x++)
{
int size = (int)buffer[y][x].size();
// ワイド文字の字数とANSIの字数の差異を調整
int wSize = size;
for(int i=0; i<size; i++)
{
if(IsDBCSLeadByteEx(CP_ACP,buffer[y][x][i]))
{
wSize--;
}
m_String[y][x] = new wchar_t[wSize];
414398:2008/05/02(金) 21:42:55
良く考えれば長々と見せても鬱陶しいだけか・・・
>>407 が答えかも。

作ろうとしていたのはCSVの文字列を格納する関数です…。
415デフォルトの名無しさん:2008/05/02(金) 21:44:40
悪い事言わないから vector< vector<wstring> > 使おうぜ。
delete し忘れて泣きたくないだろ?
416デフォルトの名無しさん:2008/05/02(金) 22:10:26
>>414
実装やOSの都合上、指定したサイズ以上確保される事があるが
そんなことは気にする必要ないし、それを期待して書いてもいけない。
417デフォルトの名無しさん:2008/05/02(金) 23:40:12
>>415
まぁ、基礎知識として知っといた方が良いだろう。
使うのはvectorで良いけど。
418デフォルトの名無しさん:2008/05/03(土) 00:11:11
すみませんが、質問させて頂きます。
fgets( buf, 256, stdin );
で入力を取りたいのですが、コンパイラがgccだと
何故かこの処理が華麗にスルーされてしまいます

gccだと使えないんでしょうか?
gccはcygwinに入っていたのを使ってます
419デフォルトの名無しさん:2008/05/03(土) 00:22:45
普通に使えるけど fgets(buf, 256, stdin);

ちなみに gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) だよ
420デフォルトの名無しさん:2008/05/03(土) 00:25:27
それはないと思います
その問題を再現する簡単なコードとgccのバージョンを
421デフォルトの名無しさん:2008/05/03(土) 00:50:18
レス有難うございます。
gccのバージョンですが >>419 さんのと全く同じです
問題のソースですが、少し長いのでその部分だけを抜粋しますので
改めてレスさせて頂きます
422デフォルトの名無しさん:2008/05/03(土) 01:04:57
問題のコードです

#include <stdio.h>

main( ) {
char buf[256];
int i;

scanf("%d",&i);
rewind(stdin);
fgets(buf,256,stdin);
printf( "%s\n", buf );
}

このコードでfgetsがスルーされてしまいます
423デフォルトの名無しさん:2008/05/03(土) 01:16:02
>>422
fscanf の %d の後にスペースを1つ入れると良いでしょう
理由は調べてください
424デフォルトの名無しさん:2008/05/03(土) 01:31:31
てst
425デフォルトの名無しさん:2008/05/03(土) 03:24:12
>422

まず、これ↓
 rewind(stdin);
は無いだろw
それから、scanf()を止めて、fgets()+sscanf()にしてみてはどうだろう?
※想像だがscanf()への入力に[Enter]していると思うんだが、そいつが次のfgets()にひろわれていると思われ
426デフォルトの名無しさん:2008/05/03(土) 05:08:51
いいか、ここで間違ってもEOFがどうとか言うんじゃないぞ。判ったな。
427デフォルトの名無しさん:2008/05/03(土) 07:29:14
>>423
有難うございます。まだ試してはいませんが、調べてみます

>>425
getchar( );
を実行すると改行コードが残るので
rewind(stdin);として、stdinを先頭に持っていくと
次回からgetchra( )でとれたもので・・・

このコードはgcc以外では動作しましたので安心していましたorz
428デフォルトの名無しさん:2008/05/03(土) 08:18:33
確か stdinをrewindすると内容はクリアされると記憶してたけど
ちょっと調べてみたら コンパイラに依存するみたい
VC, BCはクリアするみたいだけど、gccは何もしない
そのため、rewind(stdin)->単純にポインタが先頭に移動するだけなのでfgetsで拾われていると思われる
429デフォルトの名無しさん:2008/05/03(土) 08:26:48
>>428
生半可なことを書くとまた変な人が沸くから要注意。
標準入力をrewindしても、(対象がブロックデバイスでないから)巻き戻しは発生しませんよ。
430デフォルトの名無しさん:2008/05/03(土) 08:34:52
>>429
指摘サンクス
stdinをrewindしても、stdin自体が移動するわけではないんだな
VCとかではrewind(stdin)でバッファをクリアされるけど、gccでは何もしないから
クリアされずに次にfgetsで拾われているに訂正します
431デフォルトの名無しさん:2008/05/03(土) 08:38:49
蛇足ながら、ファイルにリダイレクトすれば、きちんと巻き戻しするけどね。
432デフォルトの名無しさん:2008/05/03(土) 17:17:29
ファイルにリダイレクトされてるかどうかを判別する
規格準拠コードって書けるの?
433デフォルトの名無しさん:2008/05/03(土) 17:27:26
>>432
AnsiCではファイルシステムに依存する関数は極力排除する方針なので書けない。
POSIXなら、isatty()で判る。
434デフォルトの名無しさん:2008/05/03(土) 17:30:54
>>433
サンクス。
435デフォルトの名無しさん:2008/05/03(土) 20:13:21
ちょっとした疑問なのですが、C++で自作クラスなどに演算子を定義することを
演算子オーバーロードと言いますよね。オーバーロードは多重定義という意味
なのに、どうして多重に演算子の定義をしない時でもオーバーロードと言うのでしょうか。
単に演算子の定義で良いような気がするのですが。
436デフォルトの名無しさん:2008/05/03(土) 20:17:02
演算子てのは組み込みかつグローバルに既に定義されてるじゃん?
それをユーザー定義型に適用するためにオーバーロード(多重定義)するんじゃん?
437デフォルトの名無しさん:2008/05/03(土) 20:22:36
int operator+(int, int)
double operator+(double, double)
     :
     :
と沢山オーバーロードされている演算子の定義に
さらに定義を追加するから演算子のオーバーロード。

まあ、単に演算子の定義でいいような気もするけど。
438デフォルトの名無しさん:2008/05/03(土) 20:40:11
演算子の「上書き」のニュアンスがあるからじゃないかな。
まぁ、日本人にゃoverloadとoverwriteとoverrideの微妙な違いなんて判らないよね。
439435:2008/05/03(土) 20:47:25
>>436,437
レス有り難うございます。
なるほど、と思いましたが、グローバルに定義する他にクラスのメンバとして
定義する場合もありますよね。
440デフォルトの名無しさん:2008/05/03(土) 20:49:19
メンバとして定義しようが定義を追加する事に変わりはない。
441435:2008/05/03(土) 21:00:39
>>440
ああ、なるほど。
「演算子」と「普通のメンバ関数」の違いを意識すると、確かに多重定義ということになりますね。
すっきりしました。レスして下さった方、ありがとうございました。
442デフォルトの名無しさん:2008/05/03(土) 22:50:12
本読み見ながらC++勉強してるんですが、2元配列の初期化がよくわからないのですが
ループ処理でChar型の2元配列を初期化するとき、どのような記述を行えばいいのでしょうか?

VC++のスレに、間違えて書いてしまった・・・OTL
443デフォルトの名無しさん:2008/05/03(土) 22:55:43
一口に初期化と言われても、いろいろあるわけで。
444デフォルトの名無しさん:2008/05/03(土) 22:57:29
char[][2] ={"a","b","c","d"};
char型ってことはこういうことか?
445デフォルトの名無しさん:2008/05/03(土) 23:04:16
>>443
入力された年・月のカレンダーを出すプログラムを書いてみようと思ったんで
5*7の配列に対して一度0書きしようと思ったんですが、全てに0書きするために
for文を以下のように書いてみたんですが

for ( r=0; r<5; r++){
for ( c=0; c<7; c++) {
cal [ r ] [ c ] = '0' ;
}
}
これじゃ、だめみたいなんです。
int r, c;
char cal [ 5 ] [ 7 ];
と、宣言しています。
446デフォルトの名無しさん:2008/05/03(土) 23:07:30
何が駄目だったんだろう
というかカレンダーを作るのに5*7で足りるんだろうか
447デフォルトの名無しさん:2008/05/03(土) 23:10:04
>>446
初期化した状態でとりあえず(0, 0)を呼び出すとメモリーエラーで落ちます。
一月最大五週じゃないですか・・・ね?一週間七日なのは、固定ですし。

448デフォルトの名無しさん:2008/05/03(土) 23:12:12
>>445
間違いすぎのような気がする
あなたの質問力では正解にたどり着くのに手間が掛かりすぎるだろう
落ち着いて本をよく読んだほうが早い
449デフォルトの名無しさん:2008/05/03(土) 23:16:48
カレンダーをよく見るのが先だろ
450デフォルトの名無しさん:2008/05/03(土) 23:22:40
>>448
どこが間違ってるんですか?
451デフォルトの名無しさん:2008/05/03(土) 23:23:35
延々と読んでるけど、そう理解したのが間違ってるのか・・・orz
いくつ進んだのか?だから実際、6*8確保してて8列目は\0書きさせて

7以下の時だと、実質的8列目は初期化されませんね。
452デフォルトの名無しさん:2008/05/03(土) 23:40:35
そもそも、一ヶ月は最大6週必要だし一日一文字じゃ表示できない。
453デフォルトの名無しさん:2008/05/03(土) 23:45:00
>>452
最大6週必要という意味が分かりません。
31日なら最大五週ではないでしょうか?
何もない一週間がない限り6週にならないと思うんですが。
454デフォルトの名無しさん:2008/05/03(土) 23:48:38
455デフォルトの名無しさん:2008/05/03(土) 23:58:19
万年カレンダーなら必ず5行で足りるよね。
456デフォルトの名無しさん:2008/05/04(日) 00:13:08
>>447
つきのコードを私の環境で実行してみましたが、特に問題はありませんでした。
実行環境:WindowsXP/cygwin, 処理系 gcc 3.4.4
#include <stdio.h>
int main() {
int r, c;
char cal [5][7];
for (r = 0; r < 5; r++)
for (c = 0; c < 7; c++)
cal[r][c] = '0';
printf(">%c\n", cal[0][0]);
return 0;
}
実際に問題のあるコードを見せていただければ、なにか問題がわかるかもしれません。
457デフォルトの名無しさん:2008/05/04(日) 00:22:19
0 クリアならこれでおkだろ。

char cal[5][7] = { 0 };

あるいは

char cal[5][7];
memset(cal, 0, sizeof cal);
458デフォルトの名無しさん:2008/05/04(日) 00:27:41
メモリエラーで落ちるなら初期化以外の場所が問題だろ
0クリアの方法を複数知ったところで意味がない

まずはカレンダーがどんなものだったかを思い出すのが先だと思うが
459デフォルトの名無しさん:2008/05/04(日) 00:37:43
>>457
'0'と0は違う気がするが
460デフォルトの名無しさん:2008/05/04(日) 00:50:51
>459
違う気はするが、とりあえず今は関係ないからいいんじゃね?
461デフォルトの名無しさん:2008/05/04(日) 00:50:54
大抵の場合同じだと思っちゃって良いと思うけどな。
462デフォルトの名無しさん:2008/05/04(日) 00:51:58
>>461
大体の場合違うだろ?
463デフォルトの名無しさん:2008/05/04(日) 00:54:42
0x00じゃねーの?
464デフォルトの名無しさん:2008/05/04(日) 00:56:31
うん。48ぐらい違うな。
465デフォルトの名無しさん:2008/05/04(日) 00:56:44
>>463が何を言いたいのか、これが分からない。
466デフォルトの名無しさん:2008/05/04(日) 00:57:34
ごめん、今ナチュラルに間違えた。
467デフォルトの名無しさん:2008/05/04(日) 00:58:35
>>459
同じだよ。規格でそうなってる。
468デフォルトの名無しさん:2008/05/04(日) 01:00:20
幻のバックスラッシュが見える人がいる
469デフォルトの名無しさん:2008/05/04(日) 01:03:23
'0'と'\0'は全然別物だよね。
470デフォルトの名無しさん:2008/05/04(日) 01:04:39
金に目がくらんだのか
471デフォルトの名無しさん:2008/05/04(日) 01:06:39
うん。48ぐらい別物だな。
472デフォルトの名無しさん:2008/05/04(日) 01:28:08
ソースファイルの分割ってどのような決まりに沿ってやってますか?

たとえばクラスの系列ごとにとか機能郡ごとにとか
473デフォルトの名無しさん:2008/05/04(日) 01:33:50
クラス毎に分割。
Cにはクラスは無いが、考え方は同じで。
474デフォルトの名無しさん:2008/05/04(日) 01:35:23
ちょっとしたプログラムのはずなのにクラスの数が膨れ上がって
ソースファイルの管理も面倒になってきたのでどうしたものかと・・・
475デフォルトの名無しさん:2008/05/04(日) 01:45:55
単純にJavaみたいに1クラス1ファイルにしとけば
476デフォルトの名無しさん:2008/05/04(日) 01:46:38
フォルダや名前空間を分ける
477デフォルトの名無しさん:2008/05/04(日) 01:47:11
むしろとりあえずetagsか何か導入したら?
478デフォルトの名無しさん:2008/05/04(日) 02:02:58
>>469
正直すまんかった。
479デフォルトの名無しさん:2008/05/04(日) 02:30:35
マルチスレッドのプログラムで
無限ループしてるスレッド関数を終了させるにはどうするのが良いでしょうか?

やはりクラス化してメンバ変数に終了フラグを用意してあげるのが無難ですかね
480デフォルトの名無しさん:2008/05/04(日) 02:46:43
ヴぉぁちぇ も忘れずに。
481デフォルトの名無しさん:2008/05/04(日) 02:54:13
>>480
最適化抑制ですか


最適化抑止といえばイマイチ何処を最適化抑止していいのかわからんのです
482デフォルトの名無しさん:2008/05/04(日) 02:56:38
別スレッドから変更される変数に。
483デフォルトの名無しさん:2008/05/04(日) 08:00:07
volatle ってクラスや構造体につけると
中身全部の抑止してくれるんだっけ?
あとポインタに付けた場合はポイント先も
抑止するんでしたっけ?
484デフォルトの名無しさん:2008/05/04(日) 10:29:12
してくれる。
ただ、volatile クラスや構造体には面倒くさい話があって、
volatile オブジェクト用のコピーコンストラクタや代入演算子が自動的に生成されないので
自分で作らなければならないのと、
volatile メンバ関数か const volatile メンバ関数しか呼ぶ事ができないという制約がある。
485デフォルトの名無しさん:2008/05/04(日) 16:06:18
Releaseとdeleteの違いって何かあるんですか?
486デフォルトの名無しさん:2008/05/04(日) 16:22:27
Releaseとやらが何なのかによる
487デフォルトの名無しさん:2008/05/04(日) 17:36:50
コンパイラの最適化がどのようなところに働くのかイマイチ判らん

どういうシーンで抑止しておけば良いの?
488デフォルトの名無しさん:2008/05/04(日) 17:50:31
C/C++ でオーバーフローを検知する手段は用意されているのでしょうか? 調べてみてもよく分りません。
あと、オーバーフローが発生しないことがほぼ確実に保証されてるとき、
if( a と b が等しいとき) return 1; を if( オーバーフローが発生していないとき) return 1;
に書き換えても問題ないような気がします。実際にこのような書き換えをおこなったとき
発生しうる問題はどのようなものが考えられるでしょうか?

お暇な方いましたら、ご回答のほどお願いします。
489デフォルトの名無しさん:2008/05/04(日) 18:00:27
>>487
最適化 抑制 volatile あたりで検索すると、例が幾つか出てくると思う。
490デフォルトの名無しさん:2008/05/04(日) 18:17:15
このプログラムってちゃんと解放されてますか?

class Test{
  int x;
public:
  Test(int x){
    this->x=x;
  }
  ~Test(void){
    delete this;
  }
};

Test *New(int x){
  return new Test(x);
}

void main(void){
  Test *data;
  data=New(20);
}
491デフォルトの名無しさん:2008/05/04(日) 18:23:37
>>488
C/C++ の範囲ではオーバーフローを検知する手段はない
浮動小数点なら処理系が関数を用意しているかも知れない

前の if と後の if では意味が違うんでは?
492デフォルトの名無しさん:2008/05/04(日) 18:38:16
>>491
> C/C++ の範囲ではオーバーフローを検知する手段はない
なるほど、そうですか。分りました。
> 前の if と後の if では意味が違うんでは?
そうですね。

if( a と bが等しいとき)
{
return 1; // 入力されたパスワードが正しいものとする
}else{ exit(-1); // 入力されたパスワードが間違っているので終了 }

if( オーバーフローが発生していないとき)
{
return 1:
}else{ exit(-1); }

としたとき何か問題はあるかな?条件を書き換えて常にフラグが立つ(立たない)ようにしてやれば
パスワードチェックが意味をなさなくなるかな?かな?というのが疑問。
493デフォルトの名無しさん:2008/05/04(日) 19:21:43
>>490
そのデストラクタはいつ呼ばれるのかね。
deleteしたときではないのかね。
494デフォルトの名無しさん:2008/05/04(日) 19:22:27
>>490
入門サイトなどで「スコープ」「自動変数」「delete」「デストラクタ」について勉強。

>>492
オーバーフローが何か分かってる?
意味が分からないよ。
495デフォルトの名無しさん:2008/05/04(日) 20:31:45
>>490
if(デストラクタが呼ばれる == 今まさに開放される途中){
 デストラクタ内でdeleteする = 開放途中のオブジェクトを開放;
}
496デフォルトの名無しさん:2008/05/04(日) 21:12:48
>>493-495
ありがとう、これでは解放されないんだね。
497デフォルトの名無しさん:2008/05/04(日) 21:20:22
class Test{
  int x;
public:
  Test(int x){
    this->x=x;
  }
  ~Test(void){
    //delete this;   そもそもこれは危険なコード
  }
};

Test *New(int x){
  return new Test(x);
}

void main(void){
  Test *data;
  data=New(20);
  delete data;      //デストラクタが呼ばれる

  Test data2(20);    //こうした場合コンストラクタが呼ばれスコープを抜けると自動的にデストラクタが呼ばれる
}
498デフォルトの名無しさん:2008/05/04(日) 21:46:55
>>488
matherr(3M) が使えるはず、と思ってググったのですが、どうもうまくコンパイルできません。
何が間違っているのでしょうか?

>cat matherr.c
#include <stdio.h>
#include <math.h>
int matherr(struct exception *x) {
switch(x->type) {
case DOMAIN:
case SING:
printf("%s domain error %lf\n", x->name, x->arg1);
break;
default:
printf("%s range error %lf\n", x->name, x->arg1);
}
return 1;
}
int main() {
double x, y, z;
x = log(10.0);
y = sqrt(-1.0);
z = log(-10.0);
printf("%lf:%lf:%lf\n", x, y, z);
}

>gcc matherr.c -lm
499498:2008/05/04(日) 21:48:14
環境は
cygwin/WindowsXP, gcc 3.4.4
Vine Linux 4.2/gcc4
です。
500デフォルトの名無しさん:2008/05/04(日) 21:54:27
メソッド内で、引数に対して変更を加えない場合は、
引数に対して const修飾子 を付加すべきという説明を見かけて、
それ以来、上記に該当するメソッドは全て引数に const を付加しています
また、クラスのメンバに変更を加えないメソッドは、
全てメソッド宣言の後に const を付加しています。

しかし、他所のソースを見ていると、
const をいちいち付けてるソースをあまり見かけません。
const を付けるソースって無駄な労力を費やしてるのでしょうか。
勉強不足で申し訳ありません、よろしくお願い致します。
501デフォルトの名無しさん:2008/05/04(日) 21:56:06
>>498
普通に compile できるけど。出力は 2.302585:nan:nan で予想どおり。
matherr 定義して全然使ってないんじゃない? compile には問題ないはずだけど。
502デフォルトの名無しさん:2008/05/04(日) 21:58:33
>>498
>何が間違っているのでしょうか?
「うまくコンパイルできない」のにエラーメッセージも書かない捻くれた根性。
503デフォルトの名無しさん:2008/05/04(日) 21:59:07
>>500
基本的にプログラマは怠け者ってことと、通常教えたりする時には
const はかえって説明する事を増やすからそれを説明する時じゃ
なければ使わない事が多い。しかし const を使うのは決して無駄な労力じゃない。

実際 coding していれば compile error が出る事が事があるはずで
それから教えられる事はあるはず。安全のために付けましょう。
付けて悪いことはない。
504デフォルトの名無しさん:2008/05/04(日) 22:00:41
>>501
エラー発生時にユーザーが定義した matherr() を呼び出さないのでしょうか?
私が挙げた例では、ソースに記述している matherr() にある、
printf("%s domain error %lf\n", x->name, x->arg1);
を実行したいのです。
505デフォルトの名無しさん:2008/05/04(日) 22:01:00
>>500
引き数にconstをつけると、その関数内で変更することを防止できる。
逆に言えば、判ってて変更するなら別に制限する必要もないから書かない人が多い。
ポインタ参照先やメンバ関数に関しては、呼び出し側に対する制限なのでつける方がいい。
506デフォルトの名無しさん:2008/05/04(日) 22:01:50
matherrはPOSIX標準じゃねーからLinuxではサポートしてませんから。残念。
ってぐぐったら出てきたけどホンマかな
507デフォルトの名無しさん:2008/05/04(日) 22:03:11
>>502
私の語句が稚拙でした。
コンパイル自体は通り、エラーも warning もないです。
508デフォルトの名無しさん:2008/05/04(日) 22:03:56
>>503
>>505
レスありがとうございました、勉強になります。
509デフォルトの名無しさん:2008/05/04(日) 22:04:47
いや、間違いが無いようにconstつけたほうがいい
510デフォルトの名無しさん:2008/05/04(日) 22:04:53
>>506
なつかしいなw
511デフォルトの名無しさん:2008/05/04(日) 22:08:47
>>506
たしかに/usr/include/math.h を覗いてみると、「 SVID のもとで定義されている」みたいですね。
コンパイルしてもエラーにならないのに、使えないのは不思議なのですが。
512デフォルトの名無しさん:2008/05/04(日) 23:12:07
_beginthreadの第一引数に仮想関数を取ることは可能でしょうか?

仮想関数のアドレスを取ろうとしました。
と怒られてしまうのでやっぱり無理なのでしょうか?
513デフォルトの名無しさん:2008/05/04(日) 23:18:40
仮想関数もメンバ関数も無理です
514デフォルトの名無しさん:2008/05/04(日) 23:19:36
マジですかorz
515デフォルトの名無しさん:2008/05/04(日) 23:27:46
staticなメンバ関数ならおk
516デフォルトの名無しさん:2008/05/04(日) 23:31:06
そういうのってクラス関数って言うのかな?なんて言うんだっけ・・
517デフォルトの名無しさん:2008/05/04(日) 23:31:16
>>515
staticならOKですか・・・

純粋仮想関数を引数にとっていて
継承によって渡す関数を変えたかったのですが
staticならOKとなると結構変更が大きいなぁ
518デフォルトの名無しさん:2008/05/04(日) 23:34:22
staticな奴にthis渡してそれ経由で呼び出すのが常道だろうに
519デフォルトの名無しさん:2008/05/04(日) 23:37:13
大変部もないでしょ

struct A { virtual void f() = 0; };
struct B : A { void f(){} };

void g(void*p) { ((A*)(p))->f(); }

void h()
{
B b;
_beginthread(f, 0, &b);
}

つまり、g を書けば良いだけ
520デフォルトの名無しさん:2008/05/04(日) 23:38:23
>>517
void*型のデータを別に渡せるから、そこにthisを注入すべし
521デフォルトの名無しさん:2008/05/05(月) 00:01:13
>>520
第3引数にthisを渡すんですよね

そうすると、今まで使ってた第3引数は別のメンバ関数でクラス内部に持たさないといけないか・・・
522デフォルトの名無しさん:2008/05/05(月) 00:06:51
>>521
必要なら構造体を渡す手もあるぞ

struct ThreadData {
 ...
};
_beginthread(.., new ThreadData(...));

とやって、スレッド関数の中でデータをdeleteする。
523デフォルトの名無しさん:2008/05/05(月) 00:23:05
boost::bindで生成した関数オブジェクトとか渡せたら面白いのにな・・・
え、そのためのboost::threadって?
524デフォルトの名無しさん:2008/05/05(月) 00:29:18
>>523
boost:function渡せばいいんだから、余裕でできるでしょ。
525デフォルトの名無しさん:2008/05/05(月) 02:26:45
こんなの考えた
class ThreadCallback {
public:
    template <class F> explicit ThreadCallback(const F& f) : f_(f) {}

    static void callback(void* arg) {
        const std::auto_ptr<ThreadCallback> callbacker(static_cast<ThreadCallback*>(arg));

        callbacker->run();
    }

private:
    void run() const { f_(); }

    const boost::function<void ()> f_;
};

struct Hoge { void f() {} } hoge;
_beginthread(&ThreadCallback::callback, boost::bind(&Hoge::f, &hoge)); // Hoge のメンバ関数でスレッド作成

でもこれだと void () なメンバ関数しか渡せない・・・こういうことやってくれるライブラリってありそうだけど、どうやってんだろ
526デフォルトの名無しさん:2008/05/05(月) 02:40:24
別に任意の関数をバインドできなくてもいいような。
527デフォルトの名無しさん:2008/05/05(月) 12:00:43
スーパークラスと派生クラスがあるとき、派生クラスのコンストラクタからスーパークラスのコンストラクタを
呼び出す時、派生クラスのメンバ初期化を先に書くべきですか?それともスーパークラスの初期化を先に書く
べきですか?
super::super(int a); というコンストラクタがある時
hasei::hasei() : super(10), hasei_member1(10),... と書くべきか、
hasei::hasei() : hasei_member1(10), super(10),... と書くべきでしょうか?
よろしくお願いします。
528デフォルトの名無しさん:2008/05/05(月) 12:15:24
記述の順番に関係なく初期化順はBase→Derived
529デフォルトの名無しさん:2008/05/05(月) 13:12:27
実行順は 基底クラスのコンストラクタ→メンバののコンストラクタ→自身のコンストラクタ で、
それぞれ宣言順に実行される。

例えば
class E : public A, public B { C c; D d; };
なら、A, B, c, d, E の順にコンストラクタが呼ばれる。

だから、初期化子もこの順に書いた方が紛らわしくないし、
そう書かなかった場合に警告出すコンパイラもあるから、
この順に書いた方がいい。
530デフォルトの名無しさん:2008/05/05(月) 15:02:59
void dice(int*, int*);

int main()
{
int dice_a, dice_b;
dice(&dice_a, &dice_b);
return 0;
}

void dice(int *a, int *b)
{
srand((unsigned)time(NULL));
*a = rand % 6 + 1;
*b = rand % 6 + 1;
return;
}
このスクリプトなのですが、コンパイル時に「ポインタの不正な使用」と出てきてコンパイルできません。
ググってみたのですがよくわかりませんでした。何がおかしいのでしょうか?
531デフォルトの名無しさん:2008/05/05(月) 15:08:47
>>530
エラーメッセージを貼れと何度言ったら…
randってなんだよ?ってことだ。
532デフォルトの名無しさん:2008/05/05(月) 15:10:09
あとsrandは一回でいいんじゃね?
533デフォルトの名無しさん:2008/05/05(月) 15:11:11
>>531
すみません。下のようなエラーが出ます。
エラー E2087 testx.c 17: ポインタの不正な使用(関数 dice )
エラー E2087 testx.c 18: ポインタの不正な使用(関数 dice )
警告 W8057 testx.c 20: パラメータ 'a' は一度も使用されない(関数 dice )
警告 W8057 testx.c 20: パラメータ 'b' は一度も使用されない(関数 dice )

stdlib.hは一応インクルードしているのですが……。
534デフォルトの名無しさん:2008/05/05(月) 15:18:07
rand()
535531:2008/05/05(月) 15:20:41
>>533
だからrandが何か考えればわかるだろってこと。
randは関数なのにそのアドレスを6で割ろうとすれば型があわねぇからポインタの不正な使用ということになる。
536デフォルトの名無しさん:2008/05/05(月) 15:21:12
>>532
てゆーかこの使い方だと同じ値しかでないなw
537デフォルトの名無しさん:2008/05/05(月) 15:21:54
>>531 >>534
そういう意味でしたか、てっきりポインタの利用に間違いがあるのかと思っていました。
ありがとうございました!
538デフォルトの名無しさん:2008/05/05(月) 15:22:11
>>533
randの使い方を調べてみれ
539デフォルトの名無しさん:2008/05/05(月) 16:21:41
関数名を括弧なしで使うと、関数のポインタを表すことになる
540デフォルトの名無しさん:2008/05/05(月) 16:40:59
和む質問だなw
541デフォルトの名無しさん:2008/05/05(月) 16:46:37
>>532
いいえ。「一回でいい」のではなく、「一回でなければいけない」のです。
542デフォルトの名無しさん:2008/05/05(月) 16:55:23
>>536,541
srandの引数にtime使ってるんだから、一概にそうとは言えない。
diceを使うタイミングしだい。
543デフォルトの名無しさん:2008/05/05(月) 17:02:40
>>542
ちょっと誤解があるんじゃね?
たぶん>>536に関してはrand関数のアドレスを使えば常に同じ値になってしまうという意味で、
srandとは無関係のレスだと思う。
544デフォルトの名無しさん:2008/05/05(月) 17:03:07
一回とか回数の問題じゃなくて、diceの中で初期化してるのが問題だろ
545デフォルトの名無しさん:2008/05/05(月) 17:09:17
>>542
diceが連続で呼ばれない保証でもない限り
「一回でなければいけない」だろ。
546デフォルトの名無しさん:2008/05/05(月) 17:13:27
だからdiceを使うタイミングしだいって書いてあるだろ?
547デフォルトの名無しさん:2008/05/05(月) 17:16:16
タイミング次第だからこそ「一回でなければいけない」んだろうが。
ボケっ!
548デフォルトの名無しさん:2008/05/05(月) 17:24:46
//! \remarks この函数を連続で使用する場合は、1秒以上間をあけること。
void dice(int *a, int *b);
549デフォルトの名無しさん:2008/05/05(月) 17:25:40
せっかくなんだから質問者にもわかるようになんで駄目なのか説明してやれよ
回数の問題じゃないだろう
550デフォルトの名無しさん:2008/05/05(月) 17:37:00
randは乱数を作り出す関数、つってもコンピュータに完全な乱数を生み出すのは無理だから
srandで乱数の元となる数字を変えて、乱数っぽくなるようにしてる
551デフォルトの名無しさん:2008/05/05(月) 17:38:55
srandの引数にtime使ってるんだし、これまでの
やり取りで何が問題なのか自分で気が付くと思うが。

もし分からないならまた質問してねってことで。
552デフォルトの名無しさん:2008/05/05(月) 17:44:59
for(i=0;i<100;i++)dice(&a[i],&b[i]);
下手するとこれが、全部同じ目になるってことか
553デフォルトの名無しさん:2008/05/05(月) 17:53:20
dice内にsleep(1000);入れとけばいいんじゃね?
554デフォルトの名無しさん:2008/05/05(月) 17:55:45
乱数のために16分間ブロッキングする関数ってのもまた斬新だな。
555デフォルトの名無しさん:2008/05/05(月) 18:31:08
パラメータが"ミリ秒"の処理系がある、と推理してみる
556デフォルトの名無しさん:2008/05/05(月) 19:14:41
>>555
なんのパラメータ?
仮にclock()がミリ秒単位の値を返すとしても、それをsrand()の入力に使ったのでは
今時のCPUにとっては余りに遅すぎて話にならないわけだが。
557デフォルトの名無しさん:2008/05/05(月) 19:17:30
もうミスなのは自明なんだからそろそろやめろよw
558デフォルトの名無しさん:2008/05/05(月) 19:24:49
clock()ってのはどこからでてきたんだろう
559デフォルトの名無しさん:2008/05/05(月) 19:58:33
>>556
話の流れ読めて無さ杉だろw
560553:2008/05/05(月) 20:06:56
すみません、俺が間違ってた。
sleepは1秒単位なのか。Win32のSleepが_秒だからうっかり。

ということで、sleep(1);を入れれば万事解決ということで。
561デフォルトの名無しさん:2008/05/06(火) 00:03:06
> 仮にclock()がミリ秒単位の値を返すとしても、それをsrand()の入力に使ったのでは
> 今時のCPUにとっては余りに遅すぎて話にならないわけだが。

で、↑こっちはどうしたらいい? 放っておく?
562デフォルトの名無しさん:2008/05/06(火) 01:57:37
放置でいいよ。それ以降でてこないし
563デフォルトの名無しさん:2008/05/06(火) 11:56:43
テンプレート部分特殊化で型が配列かどうか判定することってできますか?
564デフォルトの名無しさん:2008/05/06(火) 12:05:44
boost::is_array<T>::value
565デフォルトの名無しさん:2008/05/06(火) 12:32:49
>>564
ありがとうございます
type_traitsに色々判定用のがあるんですね
566デフォルトの名無しさん:2008/05/06(火) 12:37:28
ついでに、こんな感じでも書けますね
template<class AryT, size_t N>
void arrayargfunc(AryT (&ary)[N])
567デフォルトの名無しさん:2008/05/06(火) 14:43:15
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC++ 9.0
 [3.3] 言語: C/C++

C/C++ で大きな数値を扱うにはどうすればよいでしょうか?
たとえば、円周率を小数点以下10万桁求めるとか、20000!を求めるとか。
long double を使った階乗を求める自作関数では、170! までが精一杯でした。
どうすれば巨大なデータを取り扱うことができるのか、想像も出来ません。
どなたか、ヒントだけでも教えてください。よろしくお願いします。
568デフォルトの名無しさん:2008/05/06(火) 14:48:15
多倍長演算とかでググれば。
569デフォルトの名無しさん:2008/05/06(火) 14:50:11
ヒント:自作クラス
570デフォルトの名無しさん:2008/05/06(火) 14:51:09
>>568
ありがとうございます。早速調べてみます。
571デフォルトの名無しさん:2008/05/06(火) 17:17:45
今、「猫でもわかるC言語プログラミング」を読破したとこなんだけど、次買うならどんな参考書がいいかな?
一応CマスターしたらWindowsプログラミングしたいと思ってる
572デフォルトの名無しさん:2008/05/06(火) 17:34:35
ttp://www.amazon.co.jp/exec/obidos/ASIN/477411328X/
二冊目として評価が高いようです。
573デフォルトの名無しさん:2008/05/06(火) 17:44:43
こんなのが良さそうだ。
ttp://www.amazon.co.jp/dp/4797331631/
574デフォルトの名無しさん:2008/05/06(火) 17:54:15
このプログラムを面白おかしく改造してくれる人募集
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


main()
{
int computer;
printf("ジャンケンゲーム\n");


srand(time(NULL));
computer = rand()%3 + 1;
printf("コンピューターは %d", computer);

return 0;
}
575デフォルトの名無しさん:2008/05/06(火) 17:59:29
>>572
Amazonの評価低めなんだけどどうなんだろ

>>573
dクス。検討してみる
576デフォルトの名無しさん:2008/05/06(火) 18:03:15
std::mapをまるっとコピーする方法教えてください。
577デフォルトの名無しさん:2008/05/06(火) 18:07:43
>>576
コピーコンストラクタでも、コピー代入演算子でも可能。
578デフォルトの名無しさん:2008/05/06(火) 18:12:07
ファイル出力の関数で、プログラム中の”printf”出力を
そのまま出力してくれるのがあったと思うのですが、
どなたかご存知ですか?
579デフォルトの名無しさん:2008/05/06(火) 18:15:27
fprintfのことだろうか
580デフォルトの名無しさん:2008/05/06(火) 18:18:31
prinft("printf("hello world");");
581デフォルトの名無しさん:2008/05/06(火) 18:21:42
>>579
いえ、プログラム中で逐一fprintf()を使わないで、
コンソール(DOS)での表示をそのままファイルへ出力してくれる関数があったと思うのですが。
もちろんプログラムの始めと終わりにファイルオープン・クローズの操作は必要だったと思いますが。。。
たとえばコンソールプログラムのその表示をそのままファイルへ保存して、
実行終了後にprintfデバッグのように眺める、デバッグ用変数を使わずに済むなどメリットがあったと思います。
582デフォルトの名無しさん:2008/05/06(火) 18:26:35
>>581
これか?
freopen("stdout.txt", "w", stdout);
583デフォルトの名無しさん:2008/05/06(火) 18:28:10
C++では型変換の際に、
reinterpret_cast などの新しいキャストの使用が推奨されてるので、
キャストの目的をハッキリさせるため積極的に使用しております。
しかし、ウィンドウプロシージャ周りなどのキャストが多く発生する場面では
ソースが長ったらしくなって、何となく気持ち悪いです。。。
ちょっと不安になってきたのですが、
型変換は全て新しいキャストを使用する姿勢のままで良いのでしょうか。
584デフォルトの名無しさん:2008/05/06(火) 18:30:33
template<typename From, typename To>
To r_cast(const From& f) { return reinterpret_cast<To>(f); }
585デフォルトの名無しさん:2008/05/06(火) 18:30:52
>>581
関数じゃなくてコマンドプロンプトのリダイレクトのことじゃね?

C:\>app_name.exe > file_name.txt
586デフォルトの名無しさん:2008/05/06(火) 18:34:29
>新しいキャストを使用する姿勢のままで良いのでしょうか。
良い。
587デフォルトの名無しさん:2008/05/06(火) 18:34:55
>>586
レスありがとうございます。
588デフォルトの名無しさん:2008/05/06(火) 18:38:45
>>582
なるほど。そういうのもあるんですね。
前に便利だと思ったきり使わないでいたので忘れてしまいましたが、

...
fopen...

hoge_printf利用宣言

...Program Body
printf("hoge statement 1\n");

...
printf("hoge statement 2\n");
...
fclose...

というような使い方で、出力ファイルのテキスト内容が、
hoge statement 1
hoge statement 2
となるようなものだったのですが。
589デフォルトの名無しさん:2008/05/06(火) 18:41:40
>>585
リダイレクトってたとえば、VC++のデバッグ時にブレークしながらまた変数代入操作しながら使えましたっけ?
これができないと先の関数が生きてこないと思われて。
590デフォルトの名無しさん:2008/05/06(火) 18:49:06
>>589です
とりあえず、freopenを使ってみます。教えてくれてありがとう。
591デフォルトの名無しさん:2008/05/06(火) 19:00:51
>>589です

使ってみました。
stdioをそのまま流してしまうので、コンソールに表示されないので、
ファイルを幾一オープンしなおす必要がありますね。
VC++では、ブレークポイントがそのまま使えるので(当然ですが)、
それで何とか操作しながら出力させるようにしないといけないみたいです。
592デフォルトの名無しさん:2008/05/07(水) 18:05:42
    T *p1 = new T[cnt1];

があって、新しい領域に移動したいとき、素直に書くと(多分)こうなると思いますが、

    T *p2 = new T[cnt2];
    for (size_t i = 0; i < min(cnt1, cnt2); ++i) {
      p2[i] = p1[i];
    }
    delete [] p1;

これだと、全てデフォルトコンストラクタで生成された後、各々にoperator=を呼んでるので効率悪いと思います。


    T *p2 = new T[cnt2]; // ここでコンストラクタは呼ばず、メモリの確保だけして
    for (size_t i = 0; i < min(cnt1, cnt2); ++i) {
      p2[i] = p1[i]; // ここでp2[i]に対して、コピーコンストラクタ T::T(p1[i]) を呼びたい
    }

っていうことはできますか?(車輪の再発明中なのでstd::vector使えとかはなしで・・・
593デフォルトの名無しさん:2008/05/07(水) 19:22:48
placement new
594デフォルトの名無しさん:2008/05/07(水) 19:36:35
593に加えてstd::uninitialized_copy
595デフォルトの名無しさん:2008/05/07(水) 20:31:52
C言語にも慣れてきたので
visualstdio2005から2008に乗り換えたのですが
2005にあった機能のデバックなしで実行という機能がなくなっています・・・。
2008でデバックなしで実行 の機能はないのですか?
596デフォルトの名無しさん:2008/05/07(水) 20:34:39
もしかしてCtrl + F5のこと?
俺の2008には[デバッグなしで開始(H) Ctrl + F5]がちゃんとあるんだが・・・
2005は入れてないんでわからん。
597デフォルトの名無しさん:2008/05/07(水) 20:36:56
ありがとうございます
598デフォルトの名無しさん:2008/05/07(水) 20:41:16
またvisualstdioかよ
599デフォルトの名無しさん:2008/05/07(水) 20:50:08
ネットで出されているCM/クイズなんで知っている人も多いと思うけど、

class A {};
A DoNothing ( A object)
{
   return object;
}

main()
{
   A object;
   DoNothing(object);
}
を実行するとコンストラクタは何回呼ばれますか?

ってやつなんだけど、正解は1回なのはなんで?
DoNothing(object);でも(コピー)コンストラクタ呼ばれるんじゃないの?
600デフォルトの名無しさん:2008/05/07(水) 20:51:39
コンストラクタとコピーコンストラクタは別物だから。
601デフォルトの名無しさん:2008/05/07(水) 20:53:37
無茶苦茶言うなw
602デフォルトの名無しさん:2008/05/07(水) 20:57:18
まさか、最適化とか・・・いやーないか!!なんでもないです!
603デフォルトの名無しさん:2008/05/07(水) 20:58:23
最適化で DoNothing の呼び出し自体が消されるってことか?
604デフォルトの名無しさん:2008/05/07(水) 21:02:50
class A {
public:
A() {printf("A\n");}
A(const A &) {printf("Ac\n");}

};

A DoNothing ( A object)
{
return object;
}

int main()
{
A object;
DoNothing(object);
}
っててしたら
A
Ac
Ac
ってなったんですが、やっぱコピーコントラクタが理由じゃないんですか?
605デフォルトの名無しさん:2008/05/07(水) 21:08:36
一時オブジェクトの生成を最適化で消してもOKなのは規格に明記されてる。
606デフォルトの名無しさん:2008/05/07(水) 21:09:54
>>604 乙っス。
やっぱり世間ではコピーコンストラクタはコンストラクタに含めないんですかね?

>>602-603
確かにコンパイラによっては消してしまいそう。
607デフォルトの名無しさん:2008/05/07(水) 21:12:43
まず A object; だが、
A は POD 型なのでデフォルトコンストラクタは呼ばれない。
これは確か。

あとは空クラス(構造体)を関数に渡した際には
オーバーロードの解決にしか使われないとかいう仕様があれば
戻り値でのコピコンしか呼ばれないってことになりそうな予感がするよ。
608デフォルトの名無しさん:2008/05/07(水) 21:22:48
VC++いいかな?
2個のフォームを用意してボタンクリックイベントで、
他方を開く、自分を閉じる(隠す)をしたいんですけれども

//Form1.h//

#include "Form2.h"

Form2^ form2 = gcnew Form2();
form2->Show();
this->Hide();



//Form2.h//

#include "Form1.h"

Form1^ form1 = gcnew Form1();
form1->Show();
this->Hide

ってやると定義が存在しないって出てしまうんです。
相互includeが良くないのはわかるんですが、
どこに#includeを書けばいいのかがわかりません。
お願いします
609デフォルトの名無しさん:2008/05/07(水) 21:28:13
//Form1_2.h//
Form2^ form2 = gcnew Form2();
Form1^ form1 = gcnew Form1();

//Form1.h//

#include "Form1_2.h"

form2->Show();
this->Hide();



//Form2.h//

#include "Form1_2.h"

form1->Show();
this->Hide


VC++なんてやったことないからこんな書き方ができるのかどうか知らん
610デフォルトの名無しさん:2008/05/07(水) 21:30:29
//Form1.h//
・・・
class Form2;
class Form1 {
 ・・・
};
#include "Form2.h"
・・・
Form2^ form2 = gcnew Form2();
form2->Show();
this->Hide();
・・・

//Form2.h//
・・・
class Form1;
class Form2 {
 ・・・
};
#include "Form1.h"
・・・
Form1^ form1 = gcnew Form1();
form1->Show();
this->Hide();
・・・
611デフォルトの名無しさん:2008/05/07(水) 23:06:11
型変換をせずに、ビット単位で正しくコピーするにはどうしたらよいですか?

具体的な例ですと、
int(32bit)の上位16bitをそのままshort(16bit)にコピーしたいのですが…
(1/256されてshortになる)


256で割って代入しろと言いたいところでしょうけど、事情がありまして。
612デフォルトの名無しさん:2008/05/07(水) 23:07:48
>>611
共用体
613デフォルトの名無しさん:2008/05/07(水) 23:08:59
>>611
右シフトでもだめ?
614デフォルトの名無しさん:2008/05/07(水) 23:12:23
int = 32bit short = 16bit は仮定していいのか?
615デフォルトの名無しさん:2008/05/07(水) 23:29:11
ポインタで8bitずつ持ってくるのは無し?
616デフォルトの名無しさん:2008/05/07(水) 23:34:00
_asm {
mov eax, int変数
mov short変数, ax
}

これで解決
617デフォルトの名無しさん:2008/05/07(水) 23:35:35
あぁHIWORDをコピーしたいのか。
シフト使わないとダメだね
618デフォルトの名無しさん:2008/05/07(水) 23:37:37
そうだ!
バイナリ形式でsizeof(int)でファイルに書き込んで
読みだすときにsizeof(short)で読み出せばいいんだ
うん!型変換はしてないな!
619デフォルトの名無しさん:2008/05/07(水) 23:38:49
ところで、誰も 256 じゃなくて 65536 だろって突っ込まないのな。
620デフォルトの名無しさん:2008/05/07(水) 23:45:06
>>612
共用体は甲斐ビット(上位アドレス?)にしかアクセスしないと思ったのですが…

>>613
ちょっと他にもアクセスしたい理由がありまして…

>>614
どちらかというと、intとかshortよりも、ビット数の方を重視願います

>>616
試してみます。
…てか、アセンブリ使えたの知りませんでした…


>>619
そうでしたww
きっとみんな心の目で256の後ろに書いてある文字を読んでくれたんだw
621デフォルトの名無しさん:2008/05/07(水) 23:50:09
union int_short {
int i;
short s[2];
}

int_short is;
is.s[0]; // LOWORD
is.s[1]; // HIWORD

こうすれ
622デフォルトの名無しさん:2008/05/07(水) 23:51:05
>>620
#include<stdio.h>

union hoge
{
int foo;
struct{
unsigned bar:16, boo:16;
};
};

int main(void)
{
union hoge huga;

huga.foo=0x12345678;
printf("%08x %04x %04x\n", huga.foo, huga.bar, huga.boo);

return 0;
}
623デフォルトの名無しさん:2008/05/07(水) 23:51:58
#include <iostream>

int hi() {
 union {
  int n;
  char c;
 };
 n = 1;
 return c;
}

int main() {
 union {
  int n;
  unsigned short s[2];
 };

 n = 0x12345678;
 std::cout << hex << s[hi()] << std::endl;
}
624デフォルトの名無しさん:2008/05/07(水) 23:52:04
ってか供用体でいいんじゃねぇの?
下位から詰められるならdummyでも置いとけば済むはなしでは?
625デフォルトの名無しさん:2008/05/07(水) 23:52:59
>>621-622
なるほど。

ありがとうございました!!
626611,620,625:2008/05/07(水) 23:55:42
>>624
ダミー詰める事思いつきませんでした…orz
627デフォルトの名無しさん:2008/05/08(木) 00:00:09
int main(void)
{
struct ST
{
short b;
short c;
};
union UN
{
int a;
struct ST st;
};

union UN obj;
obj.a = 0x0001ffff;
printf("%d\n",obj.st.b);
printf("%d",obj.st.c);
}

既出か?
628デフォルトの名無しさん:2008/05/08(木) 00:13:20
構造体より配列にすべき
629デフォルトの名無しさん:2008/05/08(木) 00:56:59
>>608-610
それはC++/CLIという、C++の上位互換の別言語。
スレとしては↓なんだけど、過疎気味。
http://pc11.2ch.net/test/read.cgi/tech/1206447234/

こっちのスレでも答える人が居ればいいけど・・・。
630デフォルトの名無しさん:2008/05/08(木) 01:08:54
std::istreamからの読み込みコードを書く時、
std::istream &operator>>(std::istream &is, classname &obj) {
is >> obj.member >> std::endl;
}
のように、最後にendlをつけたら駄目ですよね?付けても付けなくてもOKとかじゃなくて、
付けたらだめですよね?
631デフォルトの名無しさん:2008/05/08(木) 02:14:01
それをつけて、どういう挙動を期待するんだ?
632デフォルトの名無しさん:2008/05/08(木) 02:31:11
次の二つのプログラムをシステムコールで実現せよ。
(a)
#include<stdio.h>

main()
{
printf("Hello World\n");
}
(b)
(b)#include<stdio.h>
main()
{
char s[50];
fgets(s,50,stdin);
fputs(s,stdout);
}

システムコールで検索したのですが、どのようなものかよくわからなったので…
633デフォルトの名無しさん:2008/05/08(木) 02:47:58
バッファ付きファイル入出力クラスやライブラリはありますか?
複数のファイルを一括して管理してなるべくHDDへのアクセスを減らすやつです。
634デフォルトの名無しさん:2008/05/08(木) 03:49:39
CreateFileの入力バッファはどのくらい効果がありますか?
NOバッファにして自分で管理しても、速度は上回りませんか?
635デフォルトの名無しさん:2008/05/08(木) 04:03:43
テンプレートと、参照を使った場合、元のデータのサイズを知ることは出来ますか?

たとえば、テンプレート無しだと、つぎの様に判明しますが、
f( int &x) { //xのサイズは4バイト}
f( double &x) { //xのサイズは8バイト}
ここで参照とテンプレート使ってもサイズは判明しますか?
636デフォルトの名無しさん:2008/05/08(木) 09:07:02
>>634
ケースバイケース。実測すれ。
637デフォルトの名無しさん:2008/05/08(木) 10:39:36
上のほうで書いたのですが

Form1.hとForm2.hを用意して
Form1のクリックイベントでForm2を表示、Form1を非表示
Form2のクリックイベントでForm1を表示、Form2を非表示
と行ったところ、ビルドが通りません

//Form1.h//
#include"Form2.h"

Form2^ f2 = gcnew Form2();
f2->Show();
this->Hide();

//Form2.h//
#include"Form1.h"

Form1^ f1 = gcnew Form1();
f1->Show();
this->Hide();

クリックイベントが.hファイルに含まれるため
相互に.hファイルのインクルードをした際に
おかしくなっているのだと思います

レスしてもらったやり方で試したのですがエラーが増えただけでした
どなたかお願いします
638デフォルトの名無しさん:2008/05/08(木) 10:41:34
>>637
>>629
いやわかってて書いてるならいいけど
639デフォルトの名無しさん:2008/05/08(木) 11:19:44
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6475.c

↑のプログラムを実行したらうまく動作しなかったのですが、どこをどう直せばいいか教えて下さい。
お願いします。
640デフォルトの名無しさん:2008/05/08(木) 11:29:06
>>639
うまく動作しなかったってのはコンパイルは通ったの?
641639:2008/05/08(木) 11:35:08
>>640
コンパイルは通ったんですけど、maxとminの値がありえない数字になるんです
642デフォルトの名無しさん:2008/05/08(木) 11:40:51
>>641
どこかで
x.max = 0;
x.min = 100;

あと、Cではブロックの途中での変数宣言は認められないよ
643デフォルトの名無しさん:2008/05/08(木) 11:41:34
>>641
maxを初期化しろ
644デフォルトの名無しさん:2008/05/08(木) 11:41:58
例えばminの初期値が0だったらどういう結果になると思う?
あと他に一箇所間違いがあるけど。
645デフォルトの名無しさん:2008/05/08(木) 11:42:10
これは決まり文句だがc99ならおk
646デフォルトの名無しさん:2008/05/08(木) 11:46:22
>>645
そうなのか
647641:2008/05/08(木) 13:24:52
>>642-644
ありがとうございます

x.max=0;
x.min=100;
で初期化してみたのですが、その値がそのまま結果表示されてしまいました。
648デフォルトの名無しさん:2008/05/08(木) 13:33:04
>>647
お前どこで初期化したの?
forループより前でやれよ
649647:2008/05/08(木) 13:39:06
>>648

forループの前で初期化しました
650デフォルトの名無しさん:2008/05/08(木) 13:45:02
ひょっとしてこれか
for(i=0;i<4,i++;)
651647:2008/05/08(木) 14:08:05
>>650

ありがとうございます
訂正したらうまくいきました!
652デフォルトの名無しさん:2008/05/08(木) 14:36:21
ASCII文字とマルチバイト文字がごちゃまぜで格納されているStringオブジェクトのポインタを先頭から1つずつずらしていき、
特定のマルチバイト文字の文字列が出てきたらそれ用の処理、
特定のASCII文字の文字列が出てきたらそれ用の処理、
みたいなことをしたいのですが、どういった書き方をすればよいでしょうか??

アドバイス頂けると幸いです。
653デフォルトの名無しさん:2008/05/08(木) 14:38:19
StringってC++/CLIの話か?
654652:2008/05/08(木) 14:41:13
CLIは違うと思いますが、C++です。
655デフォルトの名無しさん:2008/05/08(木) 14:56:54
std::stringでもCStringでもなくてString?
656デフォルトの名無しさん:2008/05/08(木) 15:00:36
STLのstringでいいです。
657652:2008/05/08(木) 15:02:16
656は俺じゃないっすw
std::string です。
658デフォルトの名無しさん:2008/05/08(木) 15:03:37
ごちゃ混ぜで格納なんてできたっけ?
659デフォルトの名無しさん:2008/05/08(木) 15:16:46
>>652
混在させたらマルチバイト文字セット内の1バイト文字の一部とASCII文字で
コードポイントがかぶっちゃうから、混在は難しいんじゃないかな。
ASCII の バックスラッシュと、Shift_JIS の1バイト¥マークとか。

それはともかくとして、std::string はただのコンテナと割り切ってポインタ使って
普通に書いた方がいいと思うが。
660デフォルトの名無しさん:2008/05/08(木) 15:21:08
降順にソートするプログラムを作っています。
ソースはこちらです→
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6476.txt

*整数を5件入力させる→降順にソートする→ソートしたものを表示する
ここまで(プログラムの本題)は出来たのですが、
オマケである
*入力された文字を判断し、半角数字以外が入力された場合はエラーを表示し、再入力させる
この関数を作成し、main関数と繋げる事が上手く出来ません。
半角数字の場合は問題なく作動していますが、それ以外の場合が指定通りに作動してくれません。

なるべく自力で作らなければ意味がないので、答えよりもヒントや考え方を望んでいます。
Google先生を頼りにここまで出来ましたが、C言語を始めてまだ1ヶ月と少々で分からない事ばかりです。
judge()の部分は今後も使うので、もしおかしな部分があればそちらもご教示願います。
宜しくお願いします。
661デフォルトの名無しさん:2008/05/08(木) 15:29:31
judge(s)
int *s;
{

return 0;
}

なにこれ?
662652:2008/05/08(木) 15:33:24
>>659 さん

レスどもです。
文字コードが同じものがある場合については、仕方がないので双方とも同じものとして扱う、というやり方を考えていました。

>> ともかくとして、std::string はただのコンテナと割り切ってポインタ使って
>> 書いた方がいいと思うが。

ただのコンテナとして割り切るというのは、どういうことでしょうか?このような場合はstringは使わない方がいいということでしょうか。
また、普通ポインタ使って書く、というのは、具体的にどういうことなんでしょうか。
ご教示いただけると幸いです。

(ちなみに、話に出しているのはとあるライブラリのメソッドから返ってくる値を走査するものなのですが、そのメソッドがstring型しか返してくれないんです。)
663660:2008/05/08(木) 15:33:41
>>661
すみません、消し忘れです。
return 0;
の部分は必要ないものです。
664デフォルトの名無しさん:2008/05/08(木) 15:38:00
stringをwcharにする。
665デフォルトの名無しさん:2008/05/08(木) 15:39:13
いやいや、

judge(int *s){
うんたらかんたら;
}

じゃね?ってことが言いたかったんだが
666デフォルトの名無しさん:2008/05/08(木) 15:39:20
>>661
古い書き方

>>660
mainでscanfで%dで読み取れた時点で、それが数値であることは確定しているので、そのjudgeの処理はまったくの無駄
scanfは、読み取れたデータの個数を返すので、scanfの戻り値が1じゃなかった場合は数値を読み取れなかった=数値じゃないものが入力されたと判断できる
再入力させる場合は、さっき読み取れなかったデータは読み捨てる必要があるので、改行まで来るまでgetcを回すとか、scanfで%sして捨てるとかするといいかも
667660:2008/05/08(木) 16:20:00
レスありがとうございます。
古い書き方ですか…orz

>>666
judgeでの処理は丸々無視されているという事でしょうか。
理解不足で申し訳ないのですが、
>再入力させる場合は、さっき読み取れなかったデータは読み捨てる必要があるので、改行まで来るまでgetcを回すとか、
>scanfで%sして捨てるとかするといいかも
こちらの部分を詳しく教えていただけると幸いです。
そもそも入力方法に問題あり?

まだまだ勉強不足か…。
668デフォルトの名無しさん:2008/05/08(木) 16:36:11
>>667
そもそもjudgeは引数でintを受け取るのだから、どんなintの値を渡したところで、半角数字以外と判定されることはありえない (※マイナスはある)

再入力の方は、scanfの動作をもうちょっとよく知る必要がある
int s, n;
n = scanf("%d", &s);
このようにしたとき、%dは数値入力の指示なので、数値が入力された場合はそれが読み取られ、sにその値が入って、nに1が返される
数値以外が入力された場合は、何も読み取られず、nに0が返される
ここで、何も読み取られないというのは、その文字列はまだ入力バッファに残っていて、次回scanf等を呼んだときに再び現れるという意味
そこでまた%dしても、その文字列は数値ではないので、何も読み取られず、また入力バッファに残ったままになる
この文字を何か他の方法 (getcとか%sとか何でもいい) で読み取って捨てない限り、%dは永久に成功しない
669ブロンズ:2008/05/08(木) 16:49:56
WindowsのAPI使ってゲームつくろうと思ってるんですけど、ウィンドウを出すだけのプログラムがコンパイルできません。

Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

って出たり

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)

のhPrevInst lpsCmdLine nCmdShow が未使用ってでたり。
ソースは間違ってるはず無いんですよ。付録のCDのサンプルをコンパイルしただけなのに。
何が原因なんでしょうか?
670デフォルトの名無しさん:2008/05/08(木) 16:54:05
コマンドライン引数で -Wってつけろ
未使用のやつは警告だから気にしなくておk
671ブロンズ:2008/05/08(木) 17:04:16
>>670
ありがとうございます。秒殺でした。^^
672デフォルトの名無しさん:2008/05/08(木) 17:14:43
C++のstring型変数で

x文字目からy文字目までで"sample"という文字列がでてくるかどうか、探索

みたいなことがしたいのですが、一回substrを使わないと無理でしょうか??
673デフォルトの名無しさん:2008/05/08(木) 17:19:18
const char* s = str.c_ptr();
int len = str.size();
for (int i = x; i <= y && i < len-6; i++)
{
 if (strcmp(s+i, "sample")==0) { hoge; }
}
674デフォルトの名無しさん:2008/05/08(木) 17:36:15
size_type find(const char* s, size_type pos, size_type n) const
なるメンバ関数があったはずだが
675660:2008/05/08(木) 17:39:05
>>668
丁寧な説明をありがとうございます。
sprintfでint型からchar型に代入を〜・・・と考えていましたが、
そもそもscanfでint型を指定して取り込んだ時点で文字は0扱いでした。失念していました。
char型で取り込み→judgeに渡す→判定→クリアした場合int型に変換→int型でmainに返す
の方法を取れば良いのでしょうか?
うpした物のと少し違ってしまうのですが、
mainから受け取った物がjudgeでは!isdigitが真と判断された場合-1を返して、
main側ではjudgeから-1が返された時にはエラー表示・再入力、
偽だった場合はそのまま進むようにしたいと思います。
25行目あたりのjudge(&s)の下に、if(s<0)を置いてみましたがうまくいきませんでした。
後半部分は大体理解出来ましたが具体的な方法は現在まだ調べ中です。
何度もすみません。
676672:2008/05/08(木) 17:45:07
レスくださった方々、ありがとうございます。

size_type find(const char* s, size_type pos, size_type n) const
このメンバ変数、ありました。ありがとうございましたm(_ _)m
677デフォルトの名無しさん:2008/05/08(木) 17:53:20
>>675
>mainから受け取った物がjudgeでは!isdigitが真と判断された場合-1を返して、
>25行目あたりのjudge(&s)の下に、if(s<0)を置いてみましたがうまくいきませんでした。 

sは戻り値とは違うので。
n = judge(&s);
if(n<0)
こうじゃない?
678660:2008/05/08(木) 18:44:46
>>677
!!!
そうでした。

現状はhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6483.txtです
これだとまずコンパイラ出来ませんが・・・orz
エラー文→declaration for parameter 'a' but no such parameter

作業出来る環境から離れるので、以降実行が出来ません。
もう少し自分なりに調べてみますが、それでも解決出来ない場合はまたお尋ねするかもしれません。
スレをたくさん使って申し訳ないです。
679デフォルトの名無しさん:2008/05/08(木) 20:06:37
>>642
> Cではブロックの途中での変数宣言は認められないよ

C99では使えるよ。
680デフォルトの名無しさん:2008/05/08(木) 20:08:28
681ブロンズ:2008/05/09(金) 00:39:32
WindowsのAPIに奮闘してるんですが、
コンパイルしたら
LRESULT が複数あるとか、再宣言の型が一致しないとかでるんですよ。
そんなとこひな型つくってからいじくってないのに。
どうすればいいですか?
682デフォルトの名無しさん:2008/05/09(金) 00:42:22
エラーメッセージとソースのうpを要求する
683ブロンズ:2008/05/09(金) 01:07:30
エラー E2238 C:\PK\PK\sample01.cpp 9: 'LRESULT' の宣言が複数見つかった
エラー E2344 c:\Borland\Bcc55\include\windef.h 173: 一つ前の 'LRESULT' の定義位置
エラー E2356 C:\PK\PK\sample01.cpp 9: 'LRESULT' の再宣言で型が一致していない
エラー E2344 c:\Borland\Bcc55\include\windef.h 173: 一つ前の 'LRESULT' の定義位置
エラー E2141 C:\PK\PK\sample01.cpp 9: 宣言の構文エラー
エラー E2451 C:\PK\PK\sample01.cpp 42: 未定義のシンボル WndProc(関数 InitApp(HINSTANCE__ *) )
エラー E2034 C:\PK\PK\sample01.cpp 115: 'void *' 型は 'int' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2451 C:\PK\PK\sample01.cpp 147: 未定義のシンボル TREU(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2034 C:\PK\PK\sample01.cpp 147: 'int' 型は 'void *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2342 C:\PK\PK\sample01.cpp 147: パラメータ 'hHandle' は void * 型として定義されているので int は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2034 C:\PK\PK\sample01.cpp 148: 'int' 型は 'void *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2342 C:\PK\PK\sample01.cpp 148: パラメータ 'hObject' は void * 型として定義されているので int は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
*** 12 errors in Compile ***

** error 1 ** deleting Debug\sample01.obj


ソースあげたいんですけど、>>660さんみたいなやりかた知らないんですorz
684デフォルトの名無しさん:2008/05/09(金) 01:11:03
>>1にあるじゃまいか
685デフォルトの名無しさん:2008/05/09(金) 01:13:33
>>669
付録のCDのサンプルが間違ってるはずない?なぜだろうか
まさかとは思うが猫でもわかるなんたらかんたらじゃなかろうか
686ブロンズ:2008/05/09(金) 01:18:01
687デフォルトの名無しさん:2008/05/09(金) 01:26:15
一番下のclassのセミコロン
688デフォルトの名無しさん:2008/05/09(金) 01:30:11
すいません
vector<char> dt;

と定義したdtを、関数の返り値にできるのでしょうか?
689ブロンズ:2008/05/09(金) 01:33:48
>>687
ありがとうございます。
だいぶエラーがへりました。凡ミスでおはずかしい。
あとは細かいパラメータなんですが、イマイチわからないです。
もっと研究してみます。
690デフォルトの名無しさん:2008/05/09(金) 01:44:53
>>688
試せば分かることじゃないか

どういう使い方をするか知らないけど、
普通に引数で渡した方がいいと思うけど
691デフォルトの名無しさん:2008/05/09(金) 02:57:41
_ で始まる識別子はコンパイラが使うから、使うとどうなるかわからない、使うべきでないと聞いた覚えがあるんですが、
他人のコードを見ると、普通に使われてるような気がします。
本当はダメなんだけど、使っても問題ないことがおおいってことですかね。(それとも↑がウソで、まったく問題ないのか)

あと、 typedef struct _hoge { ... } hoge; って感じで(両方hogeじゃなくて)違う名前にするのは、何か利点があるんですか?
692デフォルトの名無しさん:2008/05/09(金) 03:06:56
>>691
まともなコンパイラなら警告やエラーを吐く
そうじゃ無い時代、コンパイラの話なんじゃ、と思うけどね…
そんなの自分や会社のルール、規則で好きにスタイルを決めれば良いと思うが

typedefの使い方は
struct _hoge -> hoge とする
つまり、struct付いてようが同じ名前にしたくないって感じじゃねーの
それかコンパイラ依存だけど、同名だとコンパイル出来ない環境があるとか
693デフォルトの名無しさん:2008/05/09(金) 03:27:30
>まともなコンパイラなら警告やエラーを吐く
具体例をどうぞ。

>それかコンパイラ依存だけど、同名だとコンパイル出来ない環境があるとか
C++だとエラーですね。

知識がないなら無理に回答しなくても宜しいかと。
694デフォルトの名無しさん:2008/05/09(金) 03:59:52
>>691
エラーをはく場合があるのはたしか
しかしCではないがその習わしのようなものを受け継いだウェブプログラミング言語では
エラーはおこらないと言っていい(例:PHPなど)
全く参考にならなくて申し訳ないが
695デフォルトの名無しさん:2008/05/09(金) 04:08:18
>エラーをはく場合があるのはたしか
具体例をどうぞ

>しかしCではないがその習わしのようなものを受け継いだウェブプログラミング言語では
>エラーはおこらないと言っていい(例:PHPなど)
>全く参考にならなくて申し訳ないが
あまりにも話題と関係なさすぎてワロタ
696デフォルトの名無しさん:2008/05/09(金) 04:13:06
>>695
顔真っ赤にしてそんなレスしてどうしたんだい?
おれでよければ相談に乗るよ?
697デフォルトの名無しさん:2008/05/09(金) 04:18:47
エラーを吐くコンパイラが見つからないからってムキにならなくても…
698デフォルトの名無しさん:2008/05/09(金) 04:18:48
>>691
普通に使ってます
でもあんまりおすすめしません…その訳は…
699デフォルトの名無しさん:2008/05/09(金) 04:20:17
>>697
たしかになw
特に>>693>>695はこんなスレでムキになりすぎだろ
700デフォルトの名無しさん:2008/05/09(金) 04:31:22
現在>>692が自身の妄想どおりに動く
コンパイラを作成中ですので
気長にお待ちください。
701デフォルトの名無しさん:2008/05/09(金) 04:36:42
ここまでおれの自作自演
702デフォルトの名無しさん:2008/05/09(金) 08:03:52
>>699
ちょっとそのレスはどうかと・・・
703デフォルトの名無しさん:2008/05/09(金) 10:39:18
_と__から始まる名前は処理系で予約されているのは確か。
名前が衝突して面倒な事になりたくなければ避けろ。
704デフォルトの名無しさん:2008/05/09(金) 11:09:46
でも有名ライブラリとか至る所で使われてるんだよな…。
705デフォルトの名無しさん:2008/05/09(金) 11:22:11
有名ライブラリって例えばどんなの?
706デフォルトの名無しさん:2008/05/09(金) 12:03:20
具体例をどうぞ
707デフォルトの名無しさん:2008/05/09(金) 12:24:54
>>702
「どうかと」ではなく、何か言いたければ具体的に。
悪いけど、>>693>>695は確かにめちゃくちゃムキになってるようにしか見えない。
708デフォルトの名無しさん:2008/05/09(金) 12:41:56
初心者スレで初心者の質問に嘘の返事を書く奴が悪い。
709デフォルトの名無しさん:2008/05/09(金) 12:45:17
流れがよくわからないけど

>>691
自分は struct を付けるべきかどうか覚えておくのが面倒なので全部 typedef してます。タイプ量も減るし。
タグ名については先頭にアンダースコアを付けるのでなく末尾に _tag とでも付ければ問題ないのでは。
710デフォルトの名無しさん:2008/05/09(金) 12:47:58
>>709
typedef 必須だと前方参照が利かないから、タグ名に
変な修飾(アンダースコアとか _tag とか)つけないで欲しい。
711デフォルトの名無しさん:2008/05/09(金) 12:59:13
うーん、必要なら struct Hoge_tag と書けばいい気もしますがわかりにくいですかね。
でもXLibとかMinGWのWindows関連ヘッダとかも似たような感じでタグ名付けてた気がしますが…

同名だと混同しやすいかなーと思ってたんですが、よくわからなくなってきた^^;
712デフォルトの名無しさん:2008/05/09(金) 13:27:28
[迷信] 構造体のタグ名は下線で始める
http://www.kijineko.co.jp/tech/superstitions/tags-begin-in-underscore.html
713デフォルトの名無しさん:2008/05/09(金) 13:31:13
typedefを使わない場合
struct hoge{
int a;
};
void main(){
struct hoge k;
k.a = 5;
}
typedefを使う場合
typedef struct _hoge_{
int a;
}hoge;
void main(){
hoge k; /* struct hogeって書かなくていいから楽 */
k.a = 5;
}
714デフォルトの名無しさん:2008/05/09(金) 13:31:40
前方参照もしたい場合
typedef struct _hoge_ hoge; /* プロトタイプ宣言みたいなもの? */
typedef struct _hage_ hage;
struct _hoge_{
int a;
hage c;
};
struct _hoge_{
double b;
hage c;
};
void main(){
hoge k;
k.a = 5;
k.c.b = 1.1;
}
とかやってる。最近は書き方統一したいから全部最後の方法で書いてます^^
715デフォルトの名無しさん:2008/05/09(金) 13:36:09
>712
おおお、これは知らなかった。ソースコード直してきます^^
716デフォルトの名無しさん:2008/05/09(金) 13:36:38
だから、変な修飾、しかもアンダースコアで始めるのやめてくれってばよ。
typedef struct hoge hoge; でいいじゃないか。
717デフォルトの名無しさん:2008/05/09(金) 13:50:46
>>716
713=714=715です。
その通りですね、間違いを含んだ回答をしてしまって申し訳ない^^;

便序して質問なのですが_で始まる変数は予約されている可能性がある。
って事は
ヘッダーの宣言でよく以下のような書き方をしていたんだけど

#ifndef _STRUCT_HEADER_
#define _STRUCT_HEADER_
/* 構造体の宣言とかプロトタイプ宣言とか */
#endif

これも危ないって事かな?
718デフォルトの名無しさん:2008/05/09(金) 14:19:06
正確には

先頭の_に大文字が続く識別子
__を含む識別子
グローバルかつ先頭の_に任意の文字が続く識別子

だった記憶がある

面倒だから先頭の_はやめとけと覚えた方が安全かと
719688:2008/05/09(金) 14:32:50
>>690
レスどもです。
vector<char> 型のオブジェクトを関数の返り値にするのはできたのですが、
vector<char>型のオブジェクトを

vector<char> dt;
....
fout << dt;

みたいに、ファイル出力しようとすると
no match for 'operator<<' in 'fout << dt'
みたいなエラーが出ました。

vectorオブジェクトはそのままファイル出力はできないのでしょうか??
720デフォルトの名無しさん:2008/05/09(金) 14:43:36
>>719
メンバ関数に<<がないから

std::copy(dt.begin(), dt.end(), std::ostream_iterator<char>(std::cout, ""));

とかにするしかない
721デフォルトの名無しさん:2008/05/09(金) 16:29:39
>>719
適当にコンテナをラップするtemplate classを定義してやって、
それと、ostreamを引数にとるようなoperator<<を定義すればできるけど
面倒だから適当に誰かが作ってるそういうものを利用すればいい

// pstade::ovenライブラリを使った例
#include <vector>
#include <iostream>
#include <boost/assign/std/vector.hpp>
#include <pstade/oven/io.hpp>
#include <pstade/oven/identities.hpp>

int main() {
  using boost::assign::operator+=;
  using pstade::oven::identities;

  std::vector<int> v;
  v += 1,2,3,4;
  std::cout << (v|identities);
}

722デフォルトの名無しさん:2008/05/09(金) 17:07:47
ちょっとお聞きしたいのですが
0x3cのような16進数を直接バイナリとしてostringstreamオブジェクトの中に書き込みたいのですが、どうすればよいのでしょうか??

ostringstream aaa:
aaa << 0x3c

などどすると、ASCII文字の文字列"60"として認識されてしまいます。
723デフォルトの名無しさん:2008/05/09(金) 17:13:50
aaa << (char)0x3c
724デフォルトの名無しさん:2008/05/09(金) 17:16:13
write使えば?
725TOM:2008/05/09(金) 17:32:52
// interface
class Interface { public: virtual int getValue() const = 0;};
// print
class Print { public: void out(const Interface& interface) { cout << "## " << interface.getValue() << endl; }};
// class A
class A : public Interface { public: virtual int getValue() const { return 0; }};
// class B
class B : public A {
private: Print p;
public:
virtual int getValue() const { return 1; }
void out() {
// オブジェクトがコピーされて、class Aの値が表示される
p.out((A)*this);
// class AのgetValueが呼び出される
p.out((A&)*this);
}
};
オブジェクトをコピーすることなく、クラスAの値を表示できませんか?
726デフォルトの名無しさん:2008/05/09(金) 17:36:52
A::getValue()
727デフォルトの名無しさん:2008/05/09(金) 17:38:33
できません
だってクラスAじゃないもの
728デフォルトの名無しさん:2008/05/09(金) 17:41:55
>>723
>>724
できました!ありがとうございます!
729デフォルトの名無しさん:2008/05/09(金) 17:45:59
class B : public A {
private: Print p;
public:
virtual int getValue() const { return 1; }
void out() {
cout << "##" << A::getValue() << endl;
}
};

int main()
{
B b;
b.out();
}
730TOM:2008/05/09(金) 17:53:00
vptrとかで、なんとかならないの?
731デフォルトの名無しさん:2008/05/09(金) 17:57:33
そもそもクラス設計ミスってるでしょ
732デフォルトの名無しさん:2008/05/09(金) 17:59:08
そういうときには A 側に basicGetValue を定義しておくのが Smalltalk流
733デフォルトの名無しさん:2008/05/09(金) 18:00:02
>>725
class B : public A {
 class C : public Interface {
 private: B *b;
 public: C(B *b_):b(b_){}
  virtual int getValue() const { return b->A::getValue(); };
 };
private: Print p; 
public:
 virtual int getValue() const { return 1; }
 void out() {
  p.out(C(this));
 }
};
734デフォルトの名無しさん:2008/05/09(金) 19:10:08
>>712
あまりいい説明じゃないと思います。根拠をしめせていません。

結論からいうと、extern な変数・関数はアンダースコアで始まる名前は避けた方がいいと考えています。
構造体/共用体/列挙体 タグや、autoな、あるいは static な変数、static な関数はアンダースコアで始まる識別子をつけても問題ありません。
735デフォルトの名無しさん:2008/05/09(金) 19:13:31
>>717
プリプロセッサの識別子はアンダースコアをつけても大丈夫です。
736デフォルトの名無しさん:2008/05/09(金) 19:24:14
いやいやいやいや
737デフォルトの名無しさん:2008/05/09(金) 19:39:14
いやいやいやいや
738デフォルトの名無しさん:2008/05/09(金) 19:40:06
いやいやいやいや
739デフォルトの名無しさん:2008/05/09(金) 19:42:50
どうぞどうぞ
740702:2008/05/09(金) 19:52:57
>>707
30レスも空いてるからちょっと恐縮だけど、
具体的にとのことなので一応マジレス返答を。

「たしかに」と同調の言葉を言いつつ、「ムキなのはお前(達)の方」という
趣旨のレスをしていたから、
ちょっと痛い煽り返しだなって思って。
それで傍観してたけど思わずツッコミを。

それと、そこで>>699をリピートする必要は無いんじゃないかな。
>>697などがムキなのかどうかは知らないけど、
ムキだとするとあなた(達)の一連のレスも
同じくムキに(少なくとも俺には)見えるわけで。
741702:2008/05/09(金) 19:55:56
訂正。
× >>697など
○ >>693など
742デフォルトの名無しさん:2008/05/09(金) 19:58:27
>>740
それなんてお前?

せっかく落ち着いてたのにぶり返すなよ
743デフォルトの名無しさん:2008/05/09(金) 20:04:23
アンカ指定されたから返答しただけです。
昼は会社でレス出来ないんで、
半日くらいは大目に見て下さい・・・。
744デフォルトの名無しさん:2008/05/09(金) 20:11:34
深夜にまで言い合いしてた連中に
半日は遅すぎなんだろww
745デフォルトの名無しさん:2008/05/09(金) 20:21:27
クラスに関する素朴な疑問です。
クラスのメソッドを宣言する時、クラスの外で宣言する方法と中で宣言する方法がありますが、大半の解説サイトは外で宣言しています。
VB.NETやC#を使っている経験から中で宣言したいのですが、皆そうしないのは何か特別な理由があるのでしょうか。
746デフォルトの名無しさん:2008/05/09(金) 20:24:46
>>745
別にどっちでもいいけど個人的には外に書いたほうが見やすい気がする
簡単なメソッド(etc. フィールドの値を返すだけ)なら中に書くとインライン展開される(正確にはされやすい)から中に書くこともあるけど

ちなみにC++ではフィールドをメンバ変数、メソッドをメンバ関数といいます
747デフォルトの名無しさん:2008/05/09(金) 20:25:37
>>745
中外の意味は class hoge {}; 内外だと理解してるけど、そうすると
スタイルの問題だな。好みかチームならポリシー。

長い場合は中で定義すると紛らわしいから外というのが普通だと思う。
そうなると、常に外というポリシーがシンプルで選択されやすい。
一人なら勝手にどうぞ。
748デフォルトの名無しさん:2008/05/09(金) 20:28:03
>>745
中に書くとヘッダに書くことになって、
変更すると、そのヘッダファイルをincludeしてるソースまで
再コンパイルが必要になるから。

ただinlineやテンプレートの関係で、中に書いた方適切な場合もある。
749デフォルトの名無しさん:2008/05/09(金) 20:29:38
>>745
循環参照があった場合にうまく解決できない
分割コンパイルできない
750デフォルトの名無しさん:2008/05/09(金) 20:30:02
>>745
Cのヘッダで宣言して別のファイルで定義する習慣を引き継いでいる。
751デフォルトの名無しさん:2008/05/09(金) 20:37:32
>>746-747
ありがとうございます。
C++では用語も違ったのですね、勉強になりました。
VB.NETやC#で特に可読性が低いと思った事はないので、暫く両方で書いてみて可読性の高い方にしようと思います。
752デフォルトの名無しさん:2008/05/09(金) 20:41:07
>>748-750
まだC++の学習を初めて1週間なので聞いた事のない用語が出てきていますが、C++にはpartialクラスがないので大規模クラスの時は外に書いた方が分割出来るという事でしょうか。
頭の片隅に留めておきます。
ありがとうございました。
753デフォルトの名無しさん:2008/05/09(金) 21:27:50
typedef struct Foo{
  int x;
}Foo;
class Hoge{
  static Foo foo;
};

こんな時にfooの初期化ってどこで行えばいいんでしょうか?
754デフォルトの名無しさん:2008/05/09(金) 21:29:17
初期化どころか、そのままじゃ実体がないぜ。
そしてその実体を作ろうとすると、自ずと答えが分かるはずだ。
755デフォルトの名無しさん:2008/05/09(金) 21:29:35
>>753
普通に
static Foo foo = 0;とか
756デフォルトの名無しさん:2008/05/09(金) 21:30:14
今思ったんだがconstのつもりなんじゃなかろうか
757753:2008/05/09(金) 21:33:50
すんません!関係ないとこでのミスでした。
自己解決しました。スコープ解決演算子ってややこしいな・・・
758デフォルトの名無しさん:2008/05/09(金) 21:34:13
ちょ
759デフォルトの名無しさん:2008/05/09(金) 21:47:07
// pseudo-code
template<typename T, typename U> void foo() { /* hogehoge */ }

Class c; // any type

foo(c); // ok
foo<int>(c); // ok

なるtemplate関数って作れますか?
TもUも関数内で利用したいんです
Uを指定しないときのデフォルトになる型も指定したいです
760デフォルトの名無しさん:2008/05/09(金) 22:00:12
fooの宣言のところに引数は付けないのかい?
761デフォルトの名無しさん:2008/05/09(金) 22:17:48
すんません
引数は(T& t)でおねがいします
762デフォルトの名無しさん:2008/05/09(金) 22:18:17
関数テンプレートはオーバーロードできるけど、
デフォルトテンプレート引数をつけることはできない。
763デフォルトの名無しさん:2008/05/09(金) 22:36:48
>>759
template<class T> T foo(const T& t){return t;}
template<class T, class U> U foo(const T& t){return U();}

foo(10);
foo<int>(20);
foo<int,int>(30);
764デフォルトの名無しさん:2008/05/09(金) 22:40:03
2つ書かないといけなかったら意味ないじゃん・・・
765デフォルトの名無しさん:2008/05/09(金) 22:56:17
それくらい応用しろよ・・・。

template<class T, class U=T> struct foo_impl{
    static U f(const T& t){return U();}
};
template<class T> T foo(const T& t){return foo_impl<T>::f(t);}
template<class T, class U> U foo(const T& t){return foo_impl<T,U>::f(t);}
766デフォルトの名無しさん:2008/05/09(金) 23:01:44

foo<int,int> みたいに T をかかないといけないのは意味が無いという話だ。
767デフォルトの名無しさん:2008/05/09(金) 23:04:31
そっちか。
foo<int>って書けるだろ?
768デフォルトの名無しさん:2008/05/09(金) 23:09:07
上の奴にしかならんだろ、それ。
769デフォルトの名無しさん:2008/05/09(金) 23:17:52
>>740
ちょっとそのレスはどうかと・・・
770デフォルトの名無しさん:2008/05/09(金) 23:22:25
>>768
よく意味が分からないんだが、↓だと何かまずいのか?
template<class T> int foo(const T& t){return 10;}
template<class T, class U> int foo(const T& t){return 20;}

std::cout << foo(0) << std::endl; // 10
std::cout << foo<int>(0) << std::endl; // 10
std::cout << foo<int,int>(0) << std::endl; // 20

>>769
うぜぇ消えろ
コンパイラの具体例でもあるなら書け
771デフォルトの名無しさん:2008/05/09(金) 23:25:10
>>770
>>759 の言ってるのは

foo(c); // T = cの型, U = デフォルト型
foo<int>(c); // T = cの型, U = int

みないな感じのことがしたい、という話だろ。
772デフォルトの名無しさん:2008/05/09(金) 23:29:42
>>759
つvectorのヘッダファイル
773デフォルトの名無しさん:2008/05/09(金) 23:31:53
クラスじゃなくて関数だぜ?
774デフォルトの名無しさん:2008/05/09(金) 23:31:53
>>771
template<typename T, typename U> に <int> したとき、
U に int を入れるってこと?
775デフォルトの名無しさん:2008/05/09(金) 23:32:45
>>774
あくまで「みたいなこと」であって、
似た事が実現できる手段を知りたいってことだろう。
776デフォルトの名無しさん:2008/05/09(金) 23:35:17
型を指定しなきゃいけないんだろ?
方法が知りたいのかどうなのかは質問者に聞かなければ
777デフォルトの名無しさん:2008/05/09(金) 23:35:27
template<typename T> foo(const T& t) { }
template<typename U, typename T> foo(const T& t) { }

とすると、foo(c); はいけるが、foo<int>(c); はどちらにも当てはまるのでエラー。

型を指定するためのダミー引数をつけようとしても、
デフォルト引数からの型推論ができないためエラー。

まあ簡単に思いつく方法ではまず無理だなあ。
778デフォルトの名無しさん:2008/05/09(金) 23:35:29
>>773
関数だとデフォルト指定できなかった?
それは失敬
779デフォルトの名無しさん:2008/05/09(金) 23:36:39
>>775
それは流石にクラスでも無理じゃね?
セマンティクス的にも意味分からないし

テンプレート関数でデフォルトテンプレート引数みたいなことしたい、
ってことかと思ってたけど、違ったのか・・・
780デフォルトの名無しさん:2008/05/09(金) 23:37:49
あ、デフォルト引数からの型推論じゃなくて、普通のオーバーロードならいいのか。

template<typename T, typename U> foo(const T& t, boost::type<U>) { }
template<typename T> inline foo(const T& t) { foo(t, boost::type<int>()); }
781デフォルトの名無しさん:2008/05/09(金) 23:38:40
これでこうなる。

foo(c); // U = int
foo(c, boost::type<double>()); // U = double
782デフォルトの名無しさん:2008/05/09(金) 23:40:54
なるほど、<>に拘らなければやれるのか
783459:2008/05/09(金) 23:42:20
やっぱり無理っぽいんですか…

やりたいことは>>771の通りです
あと関数じゃなくて関数オブジェクトでもいいんですが
結局operator()が関数テンプレートになるとおもいます
784デフォルトの名無しさん:2008/05/09(金) 23:44:29
テンキーで数字を入力していることがよく分かる typo だな。
785デフォルトの名無しさん:2008/05/09(金) 23:48:40
これじゃだめなのか?
Uのデフォがintの場合

template<typename T, typename U>void func(){}

template<typename T>void func(){ func<T, int>();}

呼び出し
func<double>() →下が呼ばれる
func<double, char>() 上が呼ばれる

確認環境はVC++2008
786デフォルトの名無しさん:2008/05/09(金) 23:51:07
double 書く必要がある時点でダメだろ
787デフォルトの名無しさん:2008/05/09(金) 23:55:20
普通書かないと無理だろ
788デフォルトの名無しさん:2008/05/09(金) 23:56:02
これがゆとり脳か・・・。
何がやりたいかも理解できないのか。
789デフォルトの名無しさん:2008/05/09(金) 23:56:58
テンプレート引数でない、通常の引数でも先の引数を飛ばすとか無理だしな
790デフォルトの名無しさん:2008/05/09(金) 23:57:30
>>780-781 に既に解決策があるのに。
791デフォルトの名無しさん:2008/05/09(金) 23:58:06
>>740
わろたw
792デフォルトの名無しさん:2008/05/09(金) 23:58:41
>>790
boostは使ってもOKだったか?
ならいいや
793デフォルトの名無しさん:2008/05/10(土) 00:00:15
>>788
残念、エスパーじゃないから理解は出来んわ
794デフォルトの名無しさん:2008/05/10(土) 00:01:54
>>792
type くらい自分で簡単に定義できるだろ。

template <typename T> struct type { };
795デフォルトの名無しさん:2008/05/10(土) 00:06:30
>>794
それでboost使わずに書けるの?

>>780-781のを書き直してみて
796デフォルトの名無しさん:2008/05/10(土) 00:07:50
template<typename T, typename U> foo(const T& t, type<U>) { }
template<typename T> inline foo(const T& t) { foo(t, type<int>()); }

foo(c); // U = int
foo(c, type<double>()); // U = double
797デフォルトの名無しさん:2008/05/10(土) 00:07:53
やっとの思いでC#を覚えたのに、
今度はC++を覚えないといけないオレに
C++のメリットをどうか教えておくれ・・・・
798デフォルトの名無しさん:2008/05/10(土) 00:08:36
はやい
799デフォルトの名無しさん:2008/05/10(土) 00:09:47
あれ?
コンパイルエラー出るわ。ちょい待ち。
800デフォルトの名無しさん:2008/05/10(土) 00:10:46
戻り値の型がないだけだったw
すまん。

template<typename T, typename U> void foo(const T& t, type<U>) { }
template<typename T> inline void foo(const T& t) { foo(t, type<int>()); }

foo(c); // U = int
foo(c, type<double>()); // U = double
801759:2008/05/10(土) 00:12:53
なるほど、型情報を含んだインスタンスを渡してやるんですか
wrapper<type-arg>()とか少し冗長な部分もありますが
型を渡してるってのがわかりやすい面もありますね
でも結局func<type-arg>(value-arg)って形式という制約の上で
type-argにデフォルト値を持たせるのはほぼ不可能ってことなんですね
>>763のだと戻り値の記述が制限されますし
802デフォルトの名無しさん:2008/05/10(土) 00:13:04
>>797
速い
803デフォルトの名無しさん:2008/05/10(土) 00:14:01
>>797
早い
804デフォルトの名無しさん:2008/05/10(土) 00:15:33
>>801
template <typename U, typename V, typename T> void foo(const T& t) { }
template <typename T> inline void foo(const T& t) { foo<int, char>(t); }

foo(c);
foo<double, short>(c);

こういうのは可能。
今回の場合はオーバーロード解決に失敗するから無理だっただけだな。
805デフォルトの名無しさん:2008/05/10(土) 00:16:30
>>797
fast
806デフォルトの名無しさん:2008/05/10(土) 00:17:05
>>801
デフォルト値の問題じゃなくて、引数の型を書かずに飛ばすのが不可能
807デフォルトの名無しさん:2008/05/10(土) 00:17:42
>>797
疾い
808デフォルトの名無しさん:2008/05/10(土) 00:17:45
>>806
まだ言ってんのか。
順番変えればいいだろ、そんなの。
809デフォルトの名無しさん:2008/05/10(土) 00:18:06
>>796
thx!
関数の型が抜けてたけど、
勉強になった!

こういうことできるんだな〜。
810デフォルトの名無しさん:2008/05/10(土) 00:19:00
>>808
今までのレス読んでないのかよ
811デフォルトの名無しさん:2008/05/10(土) 00:19:39
812デフォルトの名無しさん:2008/05/10(土) 00:20:00
>>797
メモリ管理が大変
813デフォルトの名無しさん:2008/05/10(土) 00:20:09
>>804で解決じゃん。表向き>>759の要件は満たしてないか?
814デフォルトの名無しさん:2008/05/10(土) 00:21:19
>>797
ハヤイ
815デフォルトの名無しさん:2008/05/10(土) 00:22:10
>>801
コンパイルではじかれる場合は
大概使用方法が曖昧だから。

そして曖昧だと、ソースを見た人間もどれが動くか分からないから、
型は明記のほうがいい。
816デフォルトの名無しさん:2008/05/10(土) 00:22:14
速い以外に C# と比べると C++ の方がいろいろとライブラリあるし、
プラットフォーム選ばないんではないかな。
817デフォルトの名無しさん:2008/05/10(土) 00:22:29
>>811
順番の話とそのレスにどういう関係が?
818デフォルトの名無しさん:2008/05/10(土) 00:23:07
>>813
ところがこうしちゃうと・・・

template <typename U, typename T> void foo(const T& t) { }
template <typename T> inline void foo(const T& t) { foo<int>(t); }

foo<double>(c); が foo<U = double, T = cの型> なのか foo<T = double> なのか
区別がつかないんだな・・・。
819デフォルトの名無しさん:2008/05/10(土) 00:23:55
C++だと、public、protected、privateがまとめて書けるから楽
820デフォルトの名無しさん:2008/05/10(土) 00:24:50
C++だとusing(...){}が不要
821デフォルトの名無しさん:2008/05/10(土) 00:25:45
RAII と変態テンプレートこそ C++ の真骨頂
822デフォルトの名無しさん:2008/05/10(土) 00:26:45
>>818 そうか、無理じゃん
823デフォルトの名無しさん:2008/05/10(土) 00:27:18
>>817
そのテンプレート引数の順番じゃないといけない、
なんて誰も言ってないってこった。
824デフォルトの名無しさん:2008/05/10(土) 00:27:23
速いが多いけどあえていうなら
多重継承かなって思ってる
825デフォルトの名無しさん:2008/05/10(土) 00:27:53
>>820
けどdeleteが必要、それもメリット!
826デフォルトの名無しさん:2008/05/10(土) 00:28:22
>>824
いや〜ねーよ
827デフォルトの名無しさん:2008/05/10(土) 00:28:38
コンパイルも、Pascalのように速ければいいのに
828デフォルトの名無しさん:2008/05/10(土) 00:28:41
今丁度話にあがってる
templateが使える、もだな
829デフォルトの名無しさん:2008/05/10(土) 00:29:34
>>823
>>777とか読んでないだろ
830デフォルトの名無しさん:2008/05/10(土) 00:30:38
>>829
2つなら >>804 と解決できるわけだが?
831デフォルトの名無しさん:2008/05/10(土) 00:31:25
>>825
そこで自動変数とスマートポインタですよ

>それもメリット!
その通り!
832デフォルトの名無しさん:2008/05/10(土) 00:36:24
>>831
new、deleteとか、メモリ管理は嫌われる対象になるけど、
プログラマならメモリ管理ぐらいできろよ、と思うわ。

それの経験になるからC++のメリットだと思う。
833デフォルトの名無しさん:2008/05/10(土) 00:37:45
まあ大抵スマートポインタに突っ込むだけだけどな。
834デフォルトの名無しさん:2008/05/10(土) 00:39:24
>>830
出来てなくね?
>>759の呼び方両方とも>>804の下の関数になるんだが
835デフォルトの名無しさん:2008/05/10(土) 00:41:58
>>833
C畑からC++を勉強した身としてはスマートポインタあんまり使ったことないw
まあ、あれば便利だけどね
836デフォルトの名無しさん:2008/05/10(土) 00:44:15
>>834
#include <iostream>
#include <typeinfo>

template <typename U, typename V, typename T> void foo(const T& t) {
std::cout << typeid(U).name() << "," << typeid(V).name() << std::endl;
}
template <typename T> inline void foo(const T& t) { foo<int, char>(t); }

int main()
{
foo(1);
foo<double, short>(1);
}
837デフォルトの名無しさん:2008/05/10(土) 00:44:51
スマートポインタ使わないと、例外が怖いw
838デフォルトの名無しさん:2008/05/10(土) 00:46:24
>>835
java→C→C++の順で来た俺にはCでfreeの文化を身に付けたものの、慣れてきたとたん
スマポやらSTLやらでjava回帰しとるよ。ぬるま湯はいいぞ
839デフォルトの名無しさん:2008/05/10(土) 00:49:18
>>836
2個ってそのことか、それが出来ても意味無い
>>804自身も言っているように、
今回の>>759の件では順番を入れ替えても無駄

で、>>808が順番変えればいい、と書いたから変えても不可能と言っている
840デフォルトの名無しさん:2008/05/10(土) 00:51:00
飛ばすってのは、typename T, typename U という順番だと
T を指定せずに U を指定するのは文法的に無理、
ってことをいいたいわけじゃなかったのか?
841デフォルトの名無しさん:2008/05/10(土) 00:51:02
やっぱり楽なほうを選ぶよな〜w
それは同意せざるを得ない
842デフォルトの名無しさん:2008/05/10(土) 00:53:54
C++って高脳用言語だよな、それを低脳が使うと悲劇が起こるよな。
でも、日本ではPGって低賃金・底辺職業だから、高脳すくないよな。
とか、言っている俺は低脳なのにC++を使い糞コードを書いて悲劇をよく起している。
最低でもライブラリは高脳が作って欲しいよな。すると、俺の悲劇も少しは減るのにな
843デフォルトの名無しさん:2008/05/10(土) 00:54:36
>>840
そうだけど?
で、それならUを前に→それも別の問題で不可能
だから飛ばす方法は無いってことがそれまでのレスで明らかだっただろ
844デフォルトの名無しさん:2008/05/10(土) 00:55:49
>>842
boostが高脳過ぎて俺の脳が沸騰しそうです
845デフォルトの名無しさん:2008/05/10(土) 00:56:32
>>841
楽な方というか、開発効率が良い方を選ぶよ
C++って低脳には開発効率悪すぎ。
846デフォルトの名無しさん:2008/05/10(土) 00:58:57
>>843
Uを前に持って来た時点で、Tを「飛ばす」ことにはならないわけで。
Tの方が後ろにあるんだから。
847デフォルトの名無しさん:2008/05/10(土) 00:59:21
開発効率なんて「使える」ライブラリがどれだけ充実してるかに結構寄るから
その点で言うと仕事で使うC++なんてSTLすら不可だったりして最悪だと思うよ
848デフォルトの名無しさん:2008/05/10(土) 01:00:23
STLが不可って組み込みか?
そうでないのにSTL不可とするとどんな低能集団だよ・・・。
849デフォルトの名無しさん:2008/05/10(土) 01:04:07
>>846
まだ理解出来ないのか・・・
順番を入れ替えても無駄なのは事実
書き方こそ違えど今の所妥当なのは>>780の方法
もうお前にレスしないから好きに煽ってもらって結構
850デフォルトの名無しさん:2008/05/10(土) 01:06:30
>>848
C・・・CArray!
851デフォルトの名無しさん:2008/05/10(土) 01:09:40
>>849
引数の型を書かずに飛ばすのが不可能なのが問題なんじゃなくて、
その他の解決法が今回の場合使えないというのが問題の本質だろって話だ。
852デフォルトの名無しさん:2008/05/10(土) 01:10:04
STLは開発効率が良い
853デフォルトの名無しさん:2008/05/10(土) 01:10:21
MFC(笑)

まぁでもSTLが標準に入って、浸透するまでの間、
Windows限定ではあるもののライブラリとして頑張ってた方だな。
854デフォルトの名無しさん:2008/05/10(土) 01:11:47
CString は string より便利な所もあるからまあいいんだけどね。
GetBuffer とか string にはできない芸当だ。
855デフォルトの名無しさん:2008/05/10(土) 01:21:17
>>854
けどVC6.0のだとバグがあると言う罠
856デフォルトの名無しさん:2008/05/10(土) 01:22:59
今でも欠陥品といえるSTLがさらに欠陥品だった頃のものを挙げられても…
第一VC6ってC98以前のものじゃない
857デフォルトの名無しさん:2008/05/10(土) 01:23:32
s/C98/C++98/
858デフォルトの名無しさん:2008/05/10(土) 01:24:02
kwsk
859デフォルトの名無しさん:2008/05/10(土) 01:26:18
>>853
MFCがC++のより良い使い方の普及を邪魔したんじゃねなんて、おれは思ったりする。
あれ、C with Class 用ライブラリじゃね。ほとんどAPIの簡易ラッパーだぞ。
低脳がライブラリ作ると....の良い見本と低脳な俺は思っている。
860デフォルトの名無しさん:2008/05/10(土) 01:27:26
>>855
どんなバグ?
861デフォルトの名無しさん:2008/05/10(土) 01:30:48
>>856
いや、最近働いたプロジェクトでもまだ現役だったりするw

>>860
CStringのメモリリーク
862デフォルトの名無しさん:2008/05/10(土) 01:32:13
>>861
どういう時にリークすんの?
863デフォルトの名無しさん:2008/05/10(土) 01:34:34
文字列指定してインスタンス化したとき、だったかな?
詳しい内容は忘れたw
864デフォルトの名無しさん:2008/05/10(土) 01:41:59
調べてみるか・・・。
865デフォルトの名無しさん:2008/05/10(土) 01:52:23
>>863
ひょっとして、こんな感じ?
LPWSTR* ポンタ= ::CommandLineToArgvW(....);
どっかに動的に生成したのは良いが、ポンタ先って誰がどの時点で開放するんだろ?
....
しょうがないな、俺がnew/mallocしたんじゃないが
LocalFree(ポンタ); // これCStringで忘れたんじゃね
866デフォルトの名無しさん:2008/05/10(土) 02:31:04
>>817
嘘レスしかついてないんでいちおうマジレスしとくと、インクルードガードのそれもダメ。

ちょっと古い入門書や入門サイトの記事で使ってるのが多くて広まってる。なんで
入門記事がそういう名前を使ってたのかは、わからない。最近の記事では修正されてたり、
明示的に予約名についての注意が添えられてたりするみたい。
867866:2008/05/10(土) 02:31:48
アンカーミスった。 866 は >>717 ね。
868デフォルトの名無しさん:2008/05/10(土) 04:04:30
>>865
記憶に残ってる感じでは

CString tmpstr("abcde");

とかすると残るらしい
869デフォルトの名無しさん:2008/05/10(土) 05:07:29
>>866
お前いい事言うな。
やれんのか?
なら今すぐやれ。
870デフォルトの名無しさん:2008/05/10(土) 10:42:19
まぁ今 C++ 使ってる人は STL+boost あたりで楽できるところは
楽してるんないかな。俺もそうだけど。結構快適。
871719:2008/05/10(土) 12:56:47
>>720
>>721
なるほど。ありがとうございますm(_ _)m
872デフォルトの名無しさん:2008/05/10(土) 13:37:55
#include <iostream>

int to;
int from;
int tmp;

....

// str_length には文字列strの長さが入っている
for(to=0; to<str_length; to=from) {
tmp = to;
from = tmp + 1;
if(str.find("あ", to, from)){
cout << "a" << '\n';
}
}

これは文字列strの中で"あ"が出てきた回数分だけcout << "a" << '\n'
を実行するプログラム、のつもりで書いたのですが、思ったとおり動作しません。

具体的には、どんな文字でも"あ"にヒットしてしまい、strの長さ分、
cout << "a" << '\n'
が実行されてしまっています。

どなたかアドバイスいただけると幸いです。
873デフォルトの名無しさん:2008/05/10(土) 13:42:00
find の戻り値が何なのかちゃんと調べれ
874872:2008/05/10(土) 13:46:52
ぐはっ
ありがとうございましたorz
875デフォルトの名無しさん:2008/05/10(土) 13:51:23
あと、文字コードは何だ?
Unicode じゃないと変な結果になることがあるぜ。
876872:2008/05/10(土) 13:55:15
ありがとうございます。

sjisです。
文字コードはそのうちutf-8にまとめて変えようと思っているのですが、
if(str.find("あ", to, from)){
の部分を
if(string::npos != str.find("あ", to, from)){
にしたら、とりあえずsjisでも今のとこ意図した通りに動きました。
877デフォルトの名無しさん:2008/05/10(土) 14:01:34
まあ、たまたまだな。
「あ」なら大抵大丈夫だろうけど、
「い」だとヤバいな。
"Bob「ハロー」" から "い" を検索してみれ。
878872:2008/05/10(土) 14:25:42
おお、2つもマッチしてしまいました。

どっかでコードポイントが重複してるってことですよね。
これは、文字コードをUTF-8にしないと解決できないことなんでしょうか??
879デフォルトの名無しさん:2008/05/10(土) 14:26:55
string::find を使う限りはね。
SJIS 用の比較関数を使うなら問題は無いが、
どんな関数があるかは環境依存なので何とも言えない。
880872:2008/05/10(土) 14:39:48
MinGW使ってるのですが、
GCCだとShift Jis 用の比較関数というのはどんなのがあるんでしょうか??
gcc shift jis 比較関数 とかでググってみてもそれらしいのが出てきませんでした。
何度もすいません。
881デフォルトの名無しさん:2008/05/10(土) 14:44:16
実際にやってないので分からんが
MinGW なら VC++ と同様 mbstring.h の _mbsstr が使えないのかな。
882872:2008/05/10(土) 14:54:07
grep '_mbsstr' みたいなことをしてみましたが、何も出てきませんでした。
MinGWにはないのですかねぇ。

でもUTF-8にすれば全く問題なくなるのなら、そうすればいいだけですね。
色々ご親切にありがとうございますm(_ _)m
883デフォルトの名無しさん:2008/05/10(土) 14:55:52
とりあえず使ってみて
コンパイルエラーになったら使えないと判断すればええ。
884デフォルトの名無しさん:2008/05/10(土) 17:04:31
C言語でスタックを実装しようと思い、配列による実装と、構造体をノードとしたリストによる実装の
二つを書きました。(array_stack.cとlist_stack.c)

スタックを操作する関数が同一であれば、二つの実装を簡単に切り替えられるだろうと考えて、
スタックを利用するソースファイルにincludeされるヘッダーファイルstack.hに、push,pop等の
操作関数を宣言しました。関数の定義はそれぞれarray_stack.cやlist_stack.cでされています。

main.cで#include "stack.h"とし、stack.hで宣言されているnew_stack関数やpush関数を使って
  Stack *stack = new_stack();
  push(stack, 1);
といった感じで、スタックを使えるようにしたいと考えています。
Stack型は実装によって実際の型が異なり、typedefで実際の型と関連付けられます。

配列による実装を使いたい場合は、
gcc -o test_array main.c array_stack.c

リストによる実装を使いたい場合は、
gcc -o test_list main.c list_stack.c

のようにして、プリプロセッサを使わずに、実装を切り替えられるようにする事は可能なのでしょうか。
可能ならば実現方法を教えて欲しいです。
main.cではStackへのポインタしか扱っていないので、できそうな感じがして質問しました。
885デフォルトの名無しさん:2008/05/10(土) 17:29:28
それでできるはず。やってみな。

さらに、stack.hでStackをstruct Stack;と不完全にだけ宣言しておけば、
main.cの再コンパイルなく2つを差し替えられるようになるはず。
886デフォルトの名無しさん:2008/05/10(土) 20:09:50
CreateHardLinkについてなのですが
bool f;
f = CreateHardLink("C:\\A","C:\\B",NULL);
を実行すると'CreateHardLink': 識別子が見つかりませんでした
と、エラーが出てしまいます。

必要なファイルを#includeしてないから ってのは調べて分かったのですが、一体何をincludeすれば良いのでしょうか
ヘルプには
Client Requires Windows XP or Windows 2000 Professional.
Server Requires Windows Server 2003 or Windows 2000 Server.
Header Declared in Winbase.h; include Windows.h.
Library Link to Kernel32.lib.
DLL Requires Kernel32.dll.
Unicode Implemented as CreateHardLinkW (Unicode) and CreateHardLinkA (ANSI).
と、ありますので
#include <Windows.h>
#include <Winbase.h>
と、書き加えたのですが"識別子が見つかりませんでした"と変わりませんでした


#include <Kernel32.lib>
#include <Kernel32.dll>
はincludeそのものでエラーが出てしまいます
環境はvista home pro、ビジュアルスタジオ2005のアカデミックです
887デフォルトの名無しさん:2008/05/10(土) 20:18:11
>>886
WINVERとか_WIN32_WINNTでググれ
888884:2008/05/10(土) 21:35:13
>>885
レスありがとうございます。
stack.hでstruct Stack;と宣言を書き、両方の実装でstruct Stackを使うように変更しました。
すると、期待通りにプログラムが生成されました。
また、言われたように再コンパイル無しでも上手くいきました。
ありがとうございました。
889デフォルトの名無しさん:2008/05/11(日) 00:19:43
thisってんじゃねーぞ っていうスレがあるのですが
http://pc11.2ch.net/test/read.cgi/tech/1189089806/

今まで気にせずメンバの参照には必ず this を付けてたのですが
何かデメリットがあるのでしょうか・・・
よろしくお願い致します
890デフォルトの名無しさん:2008/05/11(日) 00:34:34
>>889
そのスレで聞けよw
891デフォルトの名無しさん:2008/05/11(日) 00:38:49
>>890
なんかネタスレっぽいし
そのスレの >>40 以降でそんなような流れなのですが
もやもやした会話になってるので、ココで聞いてみました
892デフォルトの名無しさん:2008/05/11(日) 00:43:45
>>889
this の有無により意味の変わるコードを素で書くことがある。
その場合、他の人がそれを扱おうとした際にバグを埋め込む恐れがある。
893デフォルトの名無しさん:2008/05/11(日) 00:53:34
dequeの最後の番号の配列にアクセスすると落ちるバグ発見しました
どうしたらいいでいいですか? vectorでは平気なのに、dequeにすると最終のところが読めないです。
size()-1まではアクセスできるはずですよね?
894デフォルトの名無しさん:2008/05/11(日) 00:55:40
かならず駄目なのではなく駄目な場合があるんです
895デフォルトの名無しさん:2008/05/11(日) 00:56:34
>>893
とりあえず現象が再現する最小限のコードを貼るんだ
896デフォルトの名無しさん:2008/05/11(日) 00:56:35
再現性のあるコードうp
897デフォルトの名無しさん:2008/05/11(日) 00:56:44
std::deque<Hoge*> hoge;
hoge.push_back(NULL);
hoge[hoge.size() - 1]->Foo();

みたいなことやってんじゃないの?
898デフォルトの名無しさん:2008/05/11(日) 01:14:52
こういうのって大抵「よーし、見てろ、落ちるコード作ってやるから!」
→あっ、バグが判った。ってなるんだよね。バグが判ることはいいことだが。
899デフォルトの名無しさん:2008/05/11(日) 03:57:01
バグの九割は自分のせいだよね。テヘ
900デフォルトの名無しさん:2008/05/11(日) 04:35:32
std::deque<Hoge> d;
&d[0]+d.size()-1
とかやってると予想。
901デフォルトの名無しさん:2008/05/11(日) 04:47:58
unsigned char 型のa,bのそれぞれ上位5bitと3bitを合成した変数を使用したいのですがのような方法があるでしょうか

また、aとbの値が変更されたとき、その合成された変数の値も変更されるようにすることは可能でしょうか?
902デフォルトの名無しさん:2008/05/11(日) 05:02:04
>>901
unsigned char c;
c = (unsigned char)((a & 0xf8) | (b >> 5));
aとbを変更したら、cを再計算すればいい。
903デフォルトの名無しさん:2008/05/11(日) 05:21:50
C言語で変数の宣言をブロックの途中からでもできるようになったのは
C99からだと思うのですが、
ブロック途中で変数宣言したものでも
gccでそのままコンパイル通ってしまいます。

hoge.c

int main(int argc, char**argv)
{
Func();
int i = 0;
return 0;
}

gcc -std=c89 hoge.c

どうしてなのでしょうか?
904デフォルトの名無しさん:2008/05/11(日) 05:31:33
>>901
オヌヌメできない方法しか思いつかない。
参照時に合成じゃだめなの?
905デフォルトの名無しさん:2008/05/11(日) 05:35:46
>>903
-O0付けても一緒?
906デフォルトの名無しさん:2008/05/11(日) 10:53:22
>>903
コンパイルオプションが足りない
gcc -g -W -Wall -std=c89 -pedantic test.c
とりあえずこれでどうだ
907デフォルトの名無しさん:2008/05/11(日) 11:01:29
>>224
途中での宣言がgccの独自拡張でもあるからだな、だからそのオプションだと
c89とgccの独自拡張でやることになる
-pedantic -pedantic-errors で独自拡張は禁止できる
908デフォルトの名無しさん:2008/05/11(日) 11:03:30
追記、両方つけるみたいになってるな
-pedantic か -pedantic-errorsです
警告とエラーの違いです
909デフォルトの名無しさん:2008/05/11(日) 14:30:53
void DataOutputStream::writef(const char*pFormat, ... ){
  unsigned char tmp[2048];
  va_list argptr;

  va_start(argptr, pFormat);
  vsprintf(tmp, (const signed char*)(pFormat), argptr);

  va_end(argptr);
}

このコードでコンパイラに異なる 'char' 型へのポインタが混在しているとの警告を受けるんですが
どう直したらいいんでしょう?BCC5.5です。
910デフォルトの名無しさん:2008/05/11(日) 14:45:17
const char*をconst signed char*にキャストするからだろ。
911ブロンズ:2008/05/11(日) 14:59:56
windowsのAPIでパックマン表示のプログラムつくってるんですが、うまく動きません
どうすればいいでしょうか
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6513.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6515.txt
912デフォルトの名無しさん:2008/05/11(日) 15:28:46
デバッグしてください。
913デフォルトの名無しさん:2008/05/11(日) 15:32:44
どうしてうまく動かないと思ったのかな?
ここにいるおにいさんたちにせつめいしてみよう!

OSなどの環境も書くといいかもね!
914デフォルトの名無しさん:2008/05/11(日) 15:38:37
>>909
signed/unsigned char をただの char にすればいいんじゃない?
915デフォルトの名無しさん:2008/05/11(日) 15:41:41
>>909
てか、キャストいらなくない?tmpの方ならまだわかるけど。
tmpも特に理由がなければunsignedにしなくていいような。
916デフォルトの名無しさん:2008/05/11(日) 15:44:51
>>913
おにいさん、ですか?(苦笑)
917デフォルトの名無しさん:2008/05/11(日) 15:46:27
>>916
40代とみた
918デフォルトの名無しさん:2008/05/11(日) 15:59:33
>>910,914,915
ありがとうございました。該当箇所を以下のように修正したら治まりました。
reinterpret_cast<char*>(tmp), const_cast<char*>(pFormat)
919デフォルトの名無しさん:2008/05/11(日) 16:02:14
> (苦笑)
920デフォルトの名無しさん:2008/05/11(日) 16:05:18
>>918
あまり面白くないな。
921デフォルトの名無しさん:2008/05/11(日) 16:54:10
C++の初心者です。教えてください
ベースクラス(Base)を継承してサブクラスを2つ作ります(Sub1,Sub2)
メインから中間クラス(Chuukan)を呼び出して,そこで色々処理をしたいと思いました。そこで、
//Base.cpp
class Base{
};

//Sub1.cpp
#include "Base.cpp"
class Sub1:public Base{
};

//Sub2.cpp
#include "Base.cpp"
class Sub2:public Base{
};

//Chuukan.cpp
#include "Base.cpp"
#include "Sub1.cpp"
#include "Sub2.cpp"
class Chuukan
{
Base a[2];
Sub1 b;
Sub2 c;
a[0] = b;
a[1] = c;
};
としたところ、コンパイル時に
error C2011: 'Base' : 'class' 型の再定義
が出てしまいました。やりたいことは、Chuukanクラスで、Sub1,Sub2クラスをBaseクラスの配列に入れて処理をしたい、ということです。このような場合はどうしたらいいでしょうか?よろしくお願いします。
922デフォルトの名無しさん:2008/05/11(日) 16:57:53
何でcppをincludeしてるのかお(# ^ω^)?
923デフォルトの名無しさん:2008/05/11(日) 16:58:04
cppってことはオブジェクト作ってるだろ?
Base/Sub1/Sub2を全部hにしてみそ。
924デフォルトの名無しさん:2008/05/11(日) 16:58:14
windowsのAPIでのことなんですが、

CreateWindowでボタンなんかを画面上に作った後、
このボタンを画面上から削除する、または画面全体をクリアするにはどうすればよいでしょうか?

どなたか、教えてください。
925デフォルトの名無しさん:2008/05/11(日) 16:58:45
それとインクルードガードで検索するといいお( ^ω^)
926921:2008/05/11(日) 17:01:49
>>922
ファイルを分けているからです。
とりあえずヘッダファイルを使わずに書いてみようと思いまして
インクルードガードで検索してみます。

>>923
ヘッダ(.h)にしてみましたが、やはり再定義と・・・
927921:2008/05/11(日) 17:26:44
インクルードガードで無事解決しました。
Baseクラスが2度インクルードされていたのが原因だったんですね。
勉強になりました。ありがとうございます。
928デフォルトの名無しさん:2008/05/11(日) 17:39:07
>>924
そのボタンを削除するか非表示にする。
929デフォルトの名無しさん:2008/05/11(日) 18:24:52
文字列を取得するプログラムを作るとします。
配列を使えば、
char str[30];
scanf("%s", str); /* scanfに配列strのアドレスを渡す */
でできますが、ポインタを使った場合、
char *pstr;
scanf("%s", pstr); /* scanfにpstrのアドレスを渡す(?) */
では何故だめなのでしょうか?
pstrに入っているアドレスをscanfに渡しているので、いけると思ったのですが……。
930デフォルトの名無しさん:2008/05/11(日) 18:25:50
pstrはどこを指してるのか?
931デフォルトの名無しさん:2008/05/11(日) 18:29:48
>>930
なるほど。最初の時点ではpstrは「00000001」をさしていました。
それでは、どうにかしてscanfでポインタを使って文字列を取得する方法はないのでしょうか?(getsを使えとかはナシでお願いします)
932デフォルトの名無しさん:2008/05/11(日) 18:31:11
char str[30];
char *pstr = str;
scanf("%s", pstr);
933デフォルトの名無しさん:2008/05/11(日) 18:32:30
>>932
やはりそうするしかないのですね。
ポインタの謎が一つわかりました。ありがとうございました。
934デフォルトの名無しさん:2008/05/11(日) 18:34:23
newかmallocで領域確保で使用し終わったらdeleteかfree
935デフォルトの名無しさん:2008/05/11(日) 18:35:21
>>931
932 のとおり。

どのみちポインタの先はデータ型である必要がある。

const char* str = "honyarara";

みたいなことの scanf 版を考えてるなら、それは不可。
これは構文上、自動的にデータ型を作ってくれてるだけ。
936デフォルトの名無しさん:2008/05/11(日) 18:39:23
newかmallocで領域確保で使用し終わったらdeleteかfree
937デフォルトの名無しさん:2008/05/11(日) 18:42:39
とゆーか、平気でバッファーオーバーランなソース提示するなよな・・・
938デフォルトの名無しさん:2008/05/11(日) 18:43:22
>>937
すみません。
939デフォルトの名無しさん:2008/05/11(日) 18:45:25
>>937
初心者はどこかでやらかすから、割り切りだよw
940デフォルトの名無しさん:2008/05/11(日) 18:45:33
いいたい事はつたわるからいいよ
941デフォルトの名無しさん:2008/05/11(日) 21:32:25
ファイルからデータを読み込む部分ですが、ファイルの実際サイズより、格納サイズが8バイト分多くなります。
どのような原因かわかりますでしょうか?


vector<int> time; vector<float> rate;
HANDLE fp = CreateFile( fname , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
while(1){
unsigned long size; int n; float x;
ReadFile(fp , &n , 4 , &size , NULL);time.push_back(n);
ReadFile(fp , &x , 4 , &size , NULL);rate.push_back(x);
if(size==0)break;}

cout<< GetFileSize(fp,NULL) << " "<< 8*time.size();
942デフォルトの名無しさん:2008/05/11(日) 21:37:58
8*
943941:2008/05/11(日) 21:38:12
GetFileSizeとエクスプローラーでは、53,144バイトと表示されるのですが、
読み込んでみると53,152 になっています。 配列で1個分増えてます。なぜでしょうか?
944デフォルトの名無しさん:2008/05/11(日) 21:39:09
>>942
float + int が8バイトなので、掛けています。
945デフォルトの名無しさん:2008/05/11(日) 21:41:10
ReadFile(fp , &n , 4 , &size , NULL); if(size==0)break;} time.push_back(n);
946デフォルトの名無しさん:2008/05/11(日) 21:41:29
>>941
読めなかったときにもpush_back()しているから。
947デフォルトの名無しさん:2008/05/11(日) 21:42:01
あとデータはきっちり 4 + 4の倍数ずつ入っています 余分やエラーは無いはずです。 
948デフォルトの名無しさん:2008/05/11(日) 21:44:36
トンクス! 一致しました。
949デフォルトの名無しさん:2008/05/12(月) 01:35:15
ちょっと質問なんですけど、C++の場合、sscanf()に取って代わる
機能って何ですか。"hogestr 0x1234 3456"みたいなトークンの
引数文字列を文字列や数値として切り出して読みたいんだけど。
950デフォルトの名無しさん:2008/05/12(月) 01:36:41
sscanf
951デフォルトの名無しさん:2008/05/12(月) 01:40:56
istringstream
952デフォルトの名無しさん:2008/05/12(月) 01:57:16
int main(int argc, char** argv, char** env)

こんなmain関数の定義をみかけたのですが、
envって何ですか?
こういう定義ってありなんでしょうか?
普通にコンパイルは通るみたいなのですが。
953デフォルトの名無しさん:2008/05/12(月) 01:57:52
環境変数。
954952:2008/05/12(月) 02:03:16
>>953さんありがとうござます。
環境依存でありみたいですね。
955デフォルトの名無しさん:2008/05/12(月) 02:04:30
変数宣言にextern "C"つける意味ってあるのでしょうか?
関数名はC++でコンパイルするとマングリングされますが
変数名はマングリングされないですよね?
956949:2008/05/12(月) 02:17:37
>>951
istringstream調べてみました。でもトークンにある要素が有る場合もあれば無い場合もあるし、
書式化での指定も出来ないみたいだし、>>とか演算子オーバーロードして使う系の関数って嫌いなんですよね。
sscanfと比べてメリットなさそうなんでsscanf使います。
957デフォルトの名無しさん:2008/05/12(月) 06:49:07
外部フォーマットのテキストの読み取りならC++でも普通にsscanfでOK、
自分でフォーマットを決めれるなら、言語関係無く簡単に読めるように
妙なフォーマットにしない方が吉。

例えば空白TABカンマなどを区切り(メタ文字)にして、
要素にはメタ文字を出さない(エスケープする)とか。

要素にメタ文字が入っちゃうExcelのcsvとかは駄目な例。
958デフォルトの名無しさん:2008/05/12(月) 07:21:36
>>955
All function types, function names, and variable names have a language linkage.
全ての関数型、関数名、変数名は言語リンケージを持つ。

変数名も当然マングリングされる可能性がある。
名前空間とかあるんだし。
959デフォルトの名無しさん:2008/05/12(月) 07:30:21
>>955
クラス内staticメンバ変数なんかはマングリングされますぜ。
960デフォルトの名無しさん:2008/05/12(月) 08:31:52
ど素人にHelp、このエラー、宣言されてないってことだろうけど、

MString.cpp:382: error: ‘::Left’ has not been declared

token = ::Left(*this, length) ;

MString.Hのなかでは、

String& Left(int n = 1) ;
friend String Left(const String& s, int n = 1) ;

ってある。

どう修正したらいいですか?
961デフォルトの名無しさん:2008/05/12(月) 08:39:07
this はStringなのか?
962デフォルトの名無しさん:2008/05/12(月) 08:47:11
963デフォルトの名無しさん:2008/05/12(月) 08:51:10
>>960
これでしょ。
http://www.gnu.org/software/gcc/gcc-4.1/changes.html
> ARM-style name-injection of friend declarations is no longer the default.

friend 宣言とは別に関数の宣言を置くべし。
964960:2008/05/12(月) 09:15:32
すみませんでした。
後ろの方で宣言されてました。前に持ってきたら、すんなり通りました。
こんなときはコンパイルどうすんのかな・・・
965デフォルトの名無しさん:2008/05/12(月) 15:26:51
ostringstream str_stream;
str_stream << "abcde";

string* str = new str_stream.str();

みたいな感じで、strを動的確保したいのですが、newの部分でエラーが出てしまいます。
ポインタが返ってきていないからだと思うのですが、このような動的確保をしたい時はどうすればよいのでしょうか??
966デフォルトの名無しさん:2008/05/12(月) 15:30:14
string* str = new string( str_stream.str() );
967デフォルトの名無しさん:2008/05/12(月) 15:33:49
>>660です。
あれから修正を重ねてほぼ動くようになったのですが、1つ問題が発生しています。

数字入力→10桁以上か半角数字以外の時はエラー表示→5件分入力し終わったら降順にソートする
→プログラムを終了するか問う→Y(y)なら終了、N(n)なら最初に戻る、それ以外は質問をループ

ここまでは出来たのですが、終了選択でNもしくはnが入力された時、
1件目の整数入力が飛ばされてしまいます。
どうやら数値の"0"として読み込まれているらしく・・・。
おそらく"s"を初期化出来れば良いと思うのですが、
適当な文字を代入(ex. s='e';)させようとすると、incompatible types in assignmentというエラーが出てしまいました。

ソースはhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6528.txtにあります
968965:2008/05/12(月) 15:36:29
>>966

ありがとうございます!
そうやればよかったんですね。知りませんでした。
969デフォルトの名無しさん:2008/05/12(月) 15:59:01
>>967
scanfの"%s"は、その後に続くであろう改行を読み取らない
改行が残ったままなので、次のfgetsでその改行(だけ)が読み込まれる
そのjudgeは、1文字も入力されなかったら0を返すぽいから、0が読み込まれたようになるのでは

まぁ、"%s"を"%s "にしてみるといいかもしんない

ところで%sは最後に'\0'の付いた文字列を読み込むので、
1文字分しか領域のない&selectに読み込んではだめだ
1文字なら%cを使え
970968:2008/05/12(月) 17:15:42
>>969
レス有難うございます。
ただ、どちらの方法も望む動きはしてくれませんでした。
"%s "→質問は繰り返されないが、文字を二回打たないと次に進めない
"%c"→変化なし
原因は改行コードが残っているようなので、これを削除するのが一番なのかと思いましたが、
ググってみてもなかなか見つかりませんでした。何か良い方法はありますか?

ところで970ですが、スレ立ては980か990でよいのでしょうか?
971デフォルトの名無しさん:2008/05/12(月) 17:26:23
fflush(stdin);
972968:2008/05/12(月) 17:30:53
解決しました。
scanf("%[^\n]%*c", &select);
の記述で動くようになりました!色々レスありがとうございました。
>>971
すみません、上記の通りです。レスありがとうございました。
973デフォルトの名無しさん:2008/05/12(月) 19:30:56
>>971
注意書きもなしにそんなものをすすめるなよw
974デフォルトの名無しさん:2008/05/12(月) 19:55:44
>>971
これは処理系依存ではないでしょうか?
975デフォルトの名無しさん:2008/05/13(火) 00:40:10
// Open Directoy

#include <iostream>
#include <windows.h>
#define MAX_LENGTH 1024
using namespace std;

int main(void)
{
LPSTR CurDir;
DWORD LEN;
CurDir = (LPSTR)malloc(MAX_LENGTH);
LEN = GetCurrentDirectory(MAX_LENGTH,CurDir);
if(LEN == 0 || LEN > MAX_LENGTH)
{
cout << "Error occured." << endl;
free(CurDir);
return -1;
}
ShellExecute(NULL,"open","explorer",CurDir,NULL,SW_SHOW);
free(CurDir);

return 0;
}

以前、さらっと書いたプログラムなんですが、APIを用いずに書きたいのですが、どうやればいいんでしょうか?
カレントディレクトリの取得方法が分りません OTL
このままでも問題はないんですけど、出来ればAPIを使わずに書き直したいです。どなたかヒントだけでも教えてください
976デフォルトの名無しさん:2008/05/13(火) 00:41:27
標準C++にディレクトリの概念はない
977デフォルトの名無しさん:2008/05/13(火) 00:44:10
標準でなくてもいいなら getcwd
978デフォルトの名無しさん:2008/05/13(火) 00:53:01
>>977
レスありがとうございます!
getcwd でググったところ、いくつかサンプルコードがヒットしたので動かしてみたら、うまくいきました。
> 標準でなくてもいいなら
しかし、これは一体どういう意味なのでしょうか?
979デフォルトの名無しさん:2008/05/13(火) 01:01:40
文字通り標準関数じゃないということ。
VC++ だと名前微妙に違うんじゃないか?
980デフォルトの名無しさん:2008/05/13(火) 01:09:21
getcwd でカレントディレクトリを取得したあとエクスプローラでそのディレクトリを開くにはどうしたらいいんだろう?
調べてみたら int system(const char *str) というのが見つかったが、これを使うのか?
それとも Exec() みたいなのを使うのか? うーん・・・
修行し直してきます (´・ω・`)
981デフォルトの名無しさん:2008/05/13(火) 01:15:18
その辺はC/C++とは関係ないから、Win32APIスレで訊いたほうがいい。
982デフォルトの名無しさん:2008/05/13(火) 01:21:25
そこまで Windows べったりなら Win32API 使ったのでいいじゃん
983デフォルトの名無しさん:2008/05/13(火) 07:16:53
system("expolorer .");
984デフォルトの名無しさん:2008/05/13(火) 11:40:01
数値型変数から文字型変数に変換するにはstatic_castを使えとググったら出てきたのですが、

int test = 123;
LPWSTR strtest = static_cast<LPWSTR>(test);
MessageBox(0, strtest, L"型変換", MB_OK);

2行目で何故か「C2440: 'static_cast' : 'int' から 'LPWSTR' に変換できません。」と出て変換出来ません。
原因は何でしょうか。
985デフォルトの名無しさん:2008/05/13(火) 11:42:24
>>984
>数値型変数から文字型変数に変換するにはstatic_castを使えとググったら出てきたのですが、

そんなウソを教えるページを晒せ
986デフォルトの名無しさん:2008/05/13(火) 12:21:54
C++でint型の数値をchar型の文字に変換する方法はないでしょうか?
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1012289530
987デフォルトの名無しさん:2008/05/13(火) 12:26:11
文字と文字列は違う
988デフォルトの名無しさん:2008/05/13(火) 12:41:27
まったくウソは教えてないな。
知識を持たずに読んだ人が勘違いしただけで。
989デフォルトの名無しさん:2008/05/13(火) 13:28:36
初心者にありがちな勘違いにツッこんでないで、
本題を教えてやれよ・・・。

>>984
stringstream
990デフォルトの名無しさん:2008/05/13(火) 17:50:24
自分を賢いとかすごいとか思ってる奴が、数多くいて
初心者を馬鹿にすることで自己を保ってる馬鹿がいるんだから仕方がないじゃない
991デフォルトの名無しさん:2008/05/13(火) 20:32:31
答えだけ教えても何にもならん気がするが、説明するのがめんどい
992デフォルトの名無しさん:2008/05/13(火) 22:34:01
キーワード教えてあとはググらせればおk
自分なりに調べようとすらしない奴の面倒まで見ることはないと思うよ。
調べた上で分からないことがあれば勿論聞いて良いけど。
993デフォルトの名無しさん:2008/05/13(火) 23:29:03
答えだけ教えるほうが慢心だと思
994デフォルトの名無しさん:2008/05/13(火) 23:52:12
よーしパパ、reinterpret_castしちゃうぞー。
995984:2008/05/14(水) 00:44:35
叱咤激励ありがとうございます。
色々試してみて数値型から文字型に変える事自体は出来ましたが、そこから更にLPWSTR型に変える事がどうしても出来ません。
以下を実行すると謎の文字列が出てします。
別のキャスト方法も試しましたが全てコンパイルエラーになりました。
STLを使うのは今回が初めてで、ググってもUnicodeコード例に辿り着く事は出来ませんでした。
因みにUnicode専用プログラムにするためtchar.hはインクルードしていません。

int i = 123;
std::stringstream ss;
ss << i;
std::string mes = ss.str();
LPWSTR omes = (LPWSTR)(wchar_t*)mes.c_str();
MessageBoxW(0, omes, L"型変換", MB_OK);
996デフォルトの名無しさん:2008/05/14(水) 00:52:22
wstringstreamとかwstringって標準じゃないんだっけ?
997デフォルトの名無しさん:2008/05/14(水) 00:56:04
>>995
それならLPCWSTRにすればいい。
LPCWSTRは、
1. MessageBoxWの2-3番目の引数の型
2. const wchar_t*のtypedef
const wchar_t*はstd::wstringのc_strが返す型。

>>996
もちろん標準。
それなのにCygwinなんかは持ってなくて殺意を覚える。
998デフォルトの名無しさん:2008/05/14(水) 00:56:40
wchar_tの文字列を確保して、その先頭アドレスを、LPWSTR にいれればいいんじやない?
999997:2008/05/14(水) 01:00:40
補足、wstringのほうはbasic_string<wchar_t>が使える。

wstringstream類は知らない。
そもそもCygwinはwprintfとかwcoutとかが全滅で救いようがない。

そして次
【初心者歓迎】C/C++室 Ver.54【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1210694402/l50
1000デフォルトの名無しさん:2008/05/14(水) 01:02:40
>>999
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。