【初心者歓迎】C/C++室 Ver.53【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/04/24(木) 07:23:05ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.59【環境依存OK】(実質Ver.52)
http://pc11.2ch.net/test/read.cgi/tech/1206809426/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/04/24(木) 07:24:43【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124499/
【初心者歓迎】C/C++室 Ver.51【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1205496128/
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/
【初心者歓迎】C/C++室 Ver.59【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1206809426/
0003デフォルトの名無しさん
2008/04/24(木) 07:46:050004デフォルトの名無しさん
2008/04/24(木) 07:53:38オーバーロードの関係でそうしたのかな。
0005デフォルトの名無しさん
2008/04/24(木) 10:43:420006デフォルトの名無しさん
2008/04/24(木) 12:51:25簡単に言えばそういうことだ。
「std::cout << '\n';」で「10」とか印字されても困るだろ。
0007デフォルトの名無しさん
2008/04/24(木) 17:10:31メソッドの中で入れ子になっていても問題ないですか?
void CHoge::Method()
{
try{
// 処理1
try{
// 処理2
}
catch(...){
// 処理2の例外処理
}
// 処理3
}
catch(...){
// 処理1、3の例外処理
}
}
みたいな感じです
0008デフォルトの名無しさん
2008/04/24(木) 17:12:470009デフォルトの名無しさん
2008/04/24(木) 17:13:54あと、
void func() try {
} catch (...) {
}
なんて書き方もOK
0011デフォルトの名無しさん
2008/04/24(木) 18:17:01またこのような感じの関数はどういった呼び出し方をすればよいのでしょうか。
どなたか教えていただけると幸いです。
0012デフォルトの名無しさん
2008/04/24(木) 18:21:01(メンバ)変数を書き換えないという指定
0013デフォルトの名無しさん
2008/04/24(木) 18:26:24このようなテンプレートテンプレートパラメータが
なぜこんな書き方ができるのか今一理解できません。
どこか詳しく解説してるとこはないものでしょうか?
0014デフォルトの名無しさん
2008/04/24(木) 19:35:22--- ヘッダ ----
typedef struct _STRUCT1{
long code;
CArray<long, long> data;
}STRUCT1;
CArray<STRUCT1, STRUCT1&> code_data;
--- ソース ----
STRUCT1 st;
st.code = 1;
st.data.Add(100);
code_data.Add(st);
みたいな感じでやると、最後の行でコンパイルエラーになるんですが
CArrayの中にCArrayを含む構造ってダメなんでしょうか?
途中までいい気でコーディングして、最後にエラー出てしまって
途方にくれています。
今更ほかの方法で似たような事やるのは大変で・・・。
よい方法ないでしょうか。
0015デフォルトの名無しさん
2008/04/24(木) 19:38:36a[0] = 0; a[1] = 0; a[2] = 0;
a[0] = 1; a[1] = 0; a[2] = 0;
a[0] = 0; a[1] = 1; a[2] = 0;
a[0] = 0; a[1] = 0; a[2] = 1;
a[0] = 1; a[1] = 1; a[2] = 0;
a[0] = 1; a[1] = 0; a[2] = 1;
a[0] = 0; a[1] = 1; a[2] = 1;
a[0] = 1; a[1] = 1; a[2] = 1;
行と行の間には何かしらの処理が入る。
これをfor文でまとめて書くにはにはどうすればいい?
0016デフォルトの名無しさん
2008/04/24(木) 19:50:470017デフォルトの名無しさん
2008/04/24(木) 19:56:28くやしいわ
0018デフォルトの名無しさん
2008/04/24(木) 19:57:02STRUCT1 st;
STRUCT1 st2 = st;
st2 = st;
の3行を書いて、コンパイル通る?
あとコンパイルエラーのメッセージは?
0019デフォルトの名無しさん
2008/04/24(木) 20:08:11for( int i = 0; i < 7; i++ ) {
a[0]=(0xb2>>i)&1;a[1]=(0xd4>>i)&1:a[2]=(0xe8>>i)&1;
0020デフォルトの名無しさん
2008/04/24(木) 20:09:310021デフォルトの名無しさん
2008/04/24(木) 20:10:06for (int i=0; i < 8; ++i)
std::cout << bits[i * 4] << ", " << bits[i * 4 + 1] << ", " << bits[i * 4 + 2] << "\n";
0022デフォルトの名無しさん
2008/04/24(木) 20:10:520023デフォルトの名無しさん
2008/04/24(木) 20:15:16{
const m = 076534210 ;
bool a[] = { ((m>>(i+0))& )!=0 ,((m>>(i+1))&1)!=0 ,((m>>(i+2))&1)!= 0} ;
なにかしらの処理
}
うーん、いまいち
0024デフォルトの名無しさん
2008/04/24(木) 20:17:41綺麗なのできねぇかなぁ
0025デフォルトの名無しさん
2008/04/24(木) 20:19:310026デフォルトの名無しさん
2008/04/24(木) 20:23:23#define NELEMS(array) (sizeof (array) / sizeof (array)[0])
#define GET_BIT(n, b) ((n) & (1u << (b)))
static const unsigned int flags[] = { 0, 1, 2, 4, 3, 5, 6, 7 };
for (int i = 0; i < NELEMS(flags); i++) {
GET_BIT(flags[i], 0) と
GET_BIT(flags[i], 1) と
GET_BIT(flags[i], 2) を使う
}
0027デフォルトの名無しさん
2008/04/24(木) 20:27:54結構頭の体操としては面白い
0028デフォルトの名無しさん
2008/04/24(木) 20:28:050029デフォルトの名無しさん
2008/04/24(木) 20:30:11たとえばファイルオープンするときなどです。
0030デフォルトの名無しさん
2008/04/24(木) 20:31:52003115
2008/04/24(木) 20:32:32今回はなんとかできました。
ヒントをいただいたので配列の長さがNの時も考えようと思います
0032デフォルトの名無しさん
2008/04/24(木) 20:40:150033デフォルトの名無しさん
2008/04/24(木) 20:40:340034デフォルトの名無しさん
2008/04/24(木) 20:42:57パスの前に "\\\\\?\\" を付けるといいらしいが、
実際にやってみると出来ないと聞いたこともある。
0035デフォルトの名無しさん
2008/04/24(木) 20:45:500036デフォルトの名無しさん
2008/04/24(木) 20:48:520037デフォルトの名無しさん
2008/04/24(木) 20:49:520038デフォルトの名無しさん
2008/04/24(木) 20:55:01ttp://www.cppll.jp/cppreference/
0039デフォルトの名無しさん
2008/04/24(木) 21:03:17しかし最近のはwebも新形式ヘルプも重い罠
0040デフォルトの名無しさん
2008/04/24(木) 21:08:29古めの C/C++ のドラフトとか。英語だけど。
0041デフォルトの名無しさん
2008/04/24(木) 21:28:34すみません 100文字は出来ますが300文字だと無理になります
どうすればいいですか?
#include <windows.h>
int main(){
int r; wchar_t e[1000]=L"\\\\\?\\c:\\";
//100文字のディレクトリを生成してみる
fore(r,100)e[r+7]=L'a'; e[7+r]=L'\\'; e[8+r]=0;
CreateDirectoryW(e,NULL);
//300文字のディレクトリを生成してみる
fore(r,300)e[r+7]=L'b'; e[7+r]=L'\\'; e[8+r]=0;
CreateDirectoryW(e,NULL);
}
0042デフォルトの名無しさん
2008/04/24(木) 21:32:490043デフォルトの名無しさん
2008/04/24(木) 21:34:42でフルパスの時32767まで。
0044デフォルトの名無しさん
2008/04/24(木) 21:37:09トン 実験してみます
0045デフォルトの名無しさん
2008/04/24(木) 21:55:42トン できました!
int main(){
int r;
wchar_t g[1000]=L"\\\\\?\\c:\\",h[]=L"aaaaaaaaaa\\";
for(r=0;r<30;r++){wcscat(g,h); CreateDirectoryW(g,NULL);}
wcscat(g,L"bbbbb\\"); CreateDirectoryW(g,NULL);
}
0046デフォルトの名無しさん
2008/04/24(木) 22:48:31004746
2008/04/24(木) 22:52:57ちなみにVC使う予定です
0048デフォルトの名無しさん
2008/04/24(木) 22:59:34どういう使い方をしたいのかで変わってくると思う。
0049デフォルトの名無しさん
2008/04/24(木) 23:01:530050デフォルトの名無しさん
2008/04/24(木) 23:19:42学校の勉強か、趣味か、仕事か、作りたいものでも有るのか、他。
それと基礎知識。
多言語の経験有るとか、プログラミング初心者とか。
0051デフォルトの名無しさん
2008/04/24(木) 23:37:03[やさしいC]あたりでいいんじゃないでしょうか?
個人的意見ですけど最初はIDE(VC等の統合開発環境)使わずに
コンパイラだけ用意して勉強したほうがいいかと。
0052デフォルトの名無しさん
2008/04/24(木) 23:53:04アプリ系らしいけども
プログラミング自体初心者なので何から始めたらいいやらで
0053デフォルトの名無しさん
2008/04/24(木) 23:56:430054デフォルトの名無しさん
2008/04/25(金) 00:03:35使いもんにならんwindows 育ちなど
0055デフォルトの名無しさん
2008/04/25(金) 00:04:38それでも Windows で慣れてないと困るけどな。
ただ、Web 系するだけなら別に Windows である必要は無いな。
0056デフォルトの名無しさん
2008/04/25(金) 00:05:41仕事(実務がてらの教育な気もするけど)なら、最短経路ってことで、
プラットホーム(LinuxとかWindowsとか)と、
本当にCなのか、それともC++でもいいのか聞いた方がいい。
0057デフォルトの名無しさん
2008/04/25(金) 00:07:49概ね同意だけど、一つのプラットホームしか知らない奴も結構使えない。
0058デフォルトの名無しさん
2008/04/25(金) 00:32:33コメントの部分でエラーになってしまいます……。
class ca {
public:
int (*pa)();
int nasi(void);
ca(void);
}ca1;
int ca::nasi(void){return 0;}
ca::ca(void) {pa = nasi;} //コンパイルエラー
0059デフォルトの名無しさん
2008/04/25(金) 00:36:20http://www.google.com/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&btnG=%E6%A4%9C%E7%B4%A2
0061デフォルトの名無しさん
2008/04/25(金) 00:42:52006258
2008/04/25(金) 00:51:53ありがとうございます。おかげでできました。
これからはもう少し自分でも調べるようにします。
class ca {
public:
int (ca::*pa)();
int nasi(void);
ca(void);
}ca1;
int ca::nasi(void){return 0;}
ca::ca(void) {pa = &ca::nasi;}
0063デフォルトの名無しさん
2008/04/25(金) 02:53:11亀レスですまんけど、何故そういう書き方ができるか、というより
そういう書き方をする意味ならある。
確かそのようにニ重にテンプレート指定すると、
template <template <class> class T> class hoge{};
とした場合に、hogeのインスタンスを宣言するときに
hoge< fuga<monyu> > Hoge;
ではなく
hoge<fuga> Hoge;
で済むというメリットがあったと思う。
fugaもテンプレートクラスであるにも関わらず、fugaのテンプレート引数は
指定しなくていい(ただしデメリットもあったと思うけど)。
あまり覚えてないので大して助言できなくてスマン。
0064デフォルトの名無しさん
2008/04/25(金) 04:14:34hogeクラスがmonyuの型を要求するような実体化を伴う場合、
(hogeクラスからfugaクラスのメンバ関数を呼ぶ場合でも。中でmonyuの型が必要なら)
実体化に失敗するんだったと思う。
その代わり、hogeクラスはfugaクラスのテンプレート引数に自由に型を
指定して利用することが出来る(もちろん文法が通る場合に限るが)。
0065デフォルトの名無しさん
2008/04/25(金) 05:06:36詳しい説明感謝です。
他スレでも聞いてしまってましたが、
そっちとはまた違った説明で、おかげで
かなり納得できました。
0066デフォルトの名無しさん
2008/04/25(金) 05:15:30すまん、そっちの説明どんなだったか教えて欲しいかもw
あんま使ったことない用法だから自信ないので・・
0067デフォルトの名無しさん
2008/04/25(金) 05:22:13ダイアログ1のヘッダーに paintDlg2 m_dlgPaint; を記述しても
';' が、識別子 'm_dlgPaint' の前に必要です。
というコンパイルエラーがでます。
インクルードの順序は確認したのですがうまくいきません。
2008で自動で変数追加しようとしても変数の種類が選べなくてよくわからないんです。
0068デフォルトの名無しさん
2008/04/25(金) 06:17:50これですわ
http://pc11.2ch.net/test/read.cgi/tech/1205059063/667
0069デフォルトの名無しさん
2008/04/25(金) 06:25:20template <template <class> class T>
これ、関数ポインタと同じ様な書式で
template <class T<class> >
と書くほうが自然な感じがするのは自分だけ?
0070デフォルトの名無しさん
2008/04/25(金) 06:49:43thx。
しかし色んな書き方できるんだなぁ・・・
0071デフォルトの名無しさん
2008/04/25(金) 08:27:11template<class T>
class A {
}
template<class T2>
class B {
}
A< B<型> > a;
ってなテンプレート型にテンプレート型を渡したときに、Aのスコープ内で
Bのテンプレート引数(T2の実体型)を知る方法って無いよね?
0072デフォルトの名無しさん
2008/04/25(金) 08:53:58class B {
typedef T2 hogeT2;
}
A< B<型> > a;
a::hogeT2 hoge;
で行けない?
0073デフォルトの名無しさん
2008/04/25(金) 09:02:14そんならT::T2でいけるかもしれないし、だめなら↑のtypedefで行けるはず
0074デフォルトの名無しさん
2008/04/25(金) 20:21:30T::T2 は無理。
typedef すればいけましたが、
A<B<x>> が A<C<x>> や A<D<x>> になった時に
対応が大変なので、
template<template<class> class TemplateT, class ParamT>
class Typenamedef {
typedef TemplateT T_TYPE;
typedef ParamT P_TYPE;
};
template<class T>
class A {
T::P_TYPE x ;
};
A< Typenamedef<B, 型> >
こういう形に落ち着きました。
0075デフォルトの名無しさん
2008/04/25(金) 20:43:200076デフォルトの名無しさん
2008/04/25(金) 21:07:18template<template<class> class TemplateT, class ParamT>
class A {
ParamT x;
}
でいいじゃんと思うのだが
0077デフォルトの名無しさん
2008/04/25(金) 21:37:51ありますし、今後増えるかもってことで。
>>76
Bにあたるクラスのテンプレート引数の数が変わった場合でも、
Aを書き換えずに対応できるようにする為に74の用に1クッション
入れたほうが良いかなと思ったのですよね。<Aも何種類かあるので
007877
2008/04/25(金) 21:50:44Aはboost ptr_containerの代替品で、ポインタを格納するコンテナ型を受け取ります。
BはSTLコンテナ、または自作コンテナ。
例えばvectorだとテンプレ引数にアロケータがあるので、
template<template<class, class> class T>と引数が2つになるが、
自作コンテナはアロケータまで取ってないので引数が1つだったりするし、
A内でアロケータまで知る必要もないので >74 で済むってな寸法です。
0079デフォルトの名無しさん
2008/04/25(金) 21:52:10いい方法無いですか?
0080デフォルトの名無しさん
2008/04/25(金) 21:57:46aout_ptr 又は shared_ptr で検索
0081デフォルトの名無しさん
2008/04/25(金) 21:58:290082デフォルトの名無しさん
2008/04/25(金) 22:01:510083デフォルトの名無しさん
2008/04/25(金) 22:02:13wstringで返すという手もある
0084デフォルトの名無しさん
2008/04/25(金) 22:21:350085デフォルトの名無しさん
2008/04/25(金) 22:50:10四則演算を駆使して16桁の2〜36進数までを10進数に直すプログラムって可能でしょうか?
0086デフォルトの名無しさん
2008/04/25(金) 22:55:58読み直してみろ
それで質問の答えが返ってくると思うか?
何がやりたいのかをきちんとまとめてから文章にしろ
あて主語がなにかはっきりしろ
0087デフォルトの名無しさん
2008/04/25(金) 22:58:43四則演算だけを用いて16桁のn進数を10進数に変換しろっていうだけだろ?
日頃やらないから、凄く面倒くさい手段しか思いつかん
0088デフォルトの名無しさん
2008/04/25(金) 23:07:450089デフォルトの名無しさん
2008/04/25(金) 23:16:20private static int toDecimal(string hex)
{
int n = 0x0;
switch (hex[0])
{
case '0':
n = 0x00;
break;
case '1':
n = 0x10;
break;
(省略されました・・全てを読むにはここを押してください)
⁻⁻⁻⁻⁻⁻
0090デフォルトの名無しさん
2008/04/25(金) 23:24:03配列のCharで取得して0番目なら15回基数をかけた奴と入力された値をかけt(ry
0091デフォルトの名無しさん
2008/04/25(金) 23:27:38うーん、やっぱり自作コンテナ内で
typedef T value_type;
したほうがいいと思うのは俺だけ?
0092デフォルトの名無しさん
2008/04/25(金) 23:36:38コンパイラがvoidを返すようなメッセージだします。受け取れません
009392
2008/04/25(金) 23:38:110094デフォルトの名無しさん
2008/04/25(金) 23:50:02class cls{ public: string a; int n; };
cls x=(cls)("aaa",5);
0095デフォルトの名無しさん
2008/04/26(土) 00:00:08strtolとかstrtoulとか。
宿題なんで使用禁止なら宿題スレ行け。
>>92
なるべく厳しい例外安全を達成するため、
stackの先頭を読み取るのはtopメンバ関数として、popから分離されている。
>>94
そういう構文が存在しないから。
cls x = {"aaa", 5};
0096デフォルトの名無しさん
2008/04/26(土) 01:36:33それ以前に、B<T>とTをそれぞれ引数として渡した方が
遥かに楽だったことにさっき気が付いたorz
0097デフォルトの名無しさん
2008/04/26(土) 01:54:11それってstd::vectorなど標準コンテナののテンプレート引数では、
Tと(デフォルト引数で)std::allocator<T>を渡すのと同じ感じだよね。
0098デフォルトの名無しさん
2008/04/26(土) 10:19:59配列と想像される可能性が高いのに
そんなもんを薦めるなよ
0099デフォルトの名無しさん
2008/04/26(土) 12:02:16宣言の前に"{"がないって怒られて通らないんですがどうしてでしょう・・orz
0100デフォルトの名無しさん
2008/04/26(土) 12:16:45見た事、やったことないです。
class Meibo{
public:
int GakuseiNo;
string Name;
Meibo() : GakuseiNo( -1 ), Name( "" ) {}
Meibo(int n, string name) : GakuseiNo( n ), Name( name ){}
bool operator<(const Meibo& a)const{ return GakuseiNo < a.GakuseiNo; }
};
0101デフォルトの名無しさん
2008/04/26(土) 12:22:310102デフォルトの名無しさん
2008/04/26(土) 12:23:10初期化リストのことか?
0103デフォルトの名無しさん
2008/04/26(土) 12:25:580104デフォルトの名無しさん
2008/04/26(土) 12:39:27そう思ったんですが、enumの宣言行をコメントつけるとエラーでなくなるんです
0105デフォルトの名無しさん
2008/04/26(土) 12:40:360106デフォルトの名無しさん
2008/04/26(土) 12:43:020107デフォルトの名無しさん
2008/04/26(土) 12:44:35ソレも確認しましたが、ついてます。
どうして通らないのかちんぷんかんぷんで・・・orz
0108デフォルトの名無しさん
2008/04/26(土) 12:47:180109デフォルトの名無しさん
2008/04/26(土) 12:56:120110デフォルトの名無しさん
2008/04/26(土) 12:58:42using 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;
}
たった、これだけの最低限にしても}が定数の前にないっておこられます
0111デフォルトの名無しさん
2008/04/26(土) 13:02:33enum baba_t { A = 0, B, C, D, E };
baba_t zizi;
こういう風に使うんじゃないのか
0112デフォルトの名無しさん
2008/04/26(土) 13:03:140113デフォルトの名無しさん
2008/04/26(土) 13:04:470114デフォルトの名無しさん
2008/04/26(土) 13:05:30整数リテラル0の前に}がないって怒られてるんだよ。
そんなものenumの要素になりえないから。
0115デフォルトの名無しさん
2008/04/26(土) 13:06:240116デフォルトの名無しさん
2008/04/26(土) 13:08:34あほでごめんなさい・・・orz
0117デフォルトの名無しさん
2008/04/26(土) 13:08:46ってか、ちょっとでも解説書やサイトを見ていれば
こんな記述は考えもつかないと思うんだけど…。
0118デフォルトの名無しさん
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;
}
すごく初歩なんだろうけどお願いします
0119118
2008/04/26(土) 14:02:59最大公倍数なんて求まるわけないwww
最大公約数の間違い
0120デフォルトの名無しさん
2008/04/26(土) 14:47:09r=x; x=y; y=x;
↓
r=x; x=y; y=r;
0121デフォルトの名無しさん
2008/04/26(土) 15:01:570122デフォルトの名無しさん
2008/04/26(土) 15:02:39↓
x ^= y; y ^= x; x ^= y;
0123デフォルトの名無しさん
2008/04/26(土) 15:36:110124デフォルトの名無しさん
2008/04/26(土) 16:33:160125デフォルトの名無しさん
2008/04/26(土) 17:15:320126デフォルトの名無しさん
2008/04/26(土) 17:24:420127デフォルトの名無しさん
2008/04/26(土) 17:59:460128デフォルトの名無しさん
2008/04/26(土) 18:04:430129デフォルトの名無しさん
2008/04/26(土) 19:34:400130デフォルトの名無しさん
2008/04/26(土) 20:20:450131デフォルトの名無しさん
2008/04/26(土) 20:51:07他の人はどうか知らないけど、俺は頻繁にホームポジションを崩す。
[]←たとえばこれは、半角/全角キーを左手の中指で押して日本語入力切って、
そのあと右手の中指と親指でタタンと上から下に流すように[と]を打って、
すぐまた半角/全角キー押して日本語入力モードにしてホームポジションに戻った。
これくらいの動きなら、手元をみなくてもまず間違えないし。
0132デフォルトの名無しさん
2008/04/26(土) 20:53:410133デフォルトの名無しさん
2008/04/26(土) 20:56:090134デフォルトの名無しさん
2008/04/26(土) 21:08:43でそれを@に割りあてる
@なんか連打しないでしょ?@@@@@@@@@@@@
0135デフォルトの名無しさん
2008/04/26(土) 21:54:35Perlで言う$$testみたいなものです
具体的に言うと、
id1 id2 id3と末尾だけ変わっていく変数の処理が同じなのでforループしたいんです。
現状だと
if( id1 != 0 ){ ... }
if( id2 != 0 ){ ... }
となってしまうので。
0136デフォルトの名無しさん
2008/04/26(土) 22:01:12最初から配列にしとけばいいんじゃね
0137デフォルトの名無しさん
2008/04/26(土) 22:01:23cherの中に整数値として16進数を入れた時、これをint型の整数に変換する事は可能なのでしょうか?
0138デフォルトの名無しさん
2008/04/26(土) 22:02:58cherってなんですか?
0139デフォルトの名無しさん
2008/04/26(土) 22:04:11ごめんなさい
0140デフォルトの名無しさん
2008/04/26(土) 22:06:05char 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);
0141デフォルトの名無しさん
2008/04/26(土) 22:12:32文字コードを16進数で突っ込んで表示させてるだけですよね?
入力された文字コードからソレゾレ差分を引けばいいのかもしれないと考えて見ましたが
どうしたらいいのかと、どんどん泥沼にはまりました・・・
0142デフォルトの名無しさん
2008/04/26(土) 22:20:02やっぱり無理ですよねorz
配列にしとけって指摘は完全同意なのですが、
あほな先輩が作った部分でそこいじっちゃいけない空気なので・・・
0143デフォルトの名無しさん
2008/04/26(土) 22:20:47どういうコードを書きたいの?
0144デフォルトの名無しさん
2008/04/26(土) 22:21:30int b = a;
って話じゃなく?
0145デフォルトの名無しさん
2008/04/26(土) 22:22:200146デフォルトの名無しさん
2008/04/26(土) 22:23:46int id0, id1, id2, id3;
int *id[4] = { &id0, &id1, &id2, &id3 };
for(size_t i = 0; i < 4; ++i) *id[i] = 0;
どうしてもって言うならこういう弄り方しかないな。
0147デフォルトの名無しさん
2008/04/26(土) 22:28:18一度採用しちゃうとなかなか切れないからね。組合強いとこは。
0148デフォルトの名無しさん
2008/04/26(土) 22:45:050149148
2008/04/26(土) 22:51:52x.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();}
0150デフォルトの名無しさん
2008/04/26(土) 22:53:230151148
2008/04/26(土) 22:56:37class str{
public: string s;
str() { s.resize(1000000); }
~str() { s.swap(string()); }};
main(){
vector< str > x(100);
getchar();
x.resize(1);
getchar();}
0152148
2008/04/26(土) 22:59:55resizeでは消滅しないですよね なんでですか?
0153デフォルトの名無しさん
2008/04/26(土) 23:01:29<>内で巨大な確保していると困りますよね?
0154デフォルトの名無しさん
2008/04/26(土) 23:06:51swapなら消えたと思ったが
0155デフォルトの名無しさん
2008/04/26(土) 23:08:540156デフォルトの名無しさん
2008/04/26(土) 23:15:40メモリリークしてるわけではない。
単に、delete されたメモリがすぐ OS に返されるわけではないというだけの話。
0157デフォルトの名無しさん
2008/04/26(土) 23:22:31VC++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();
0158デフォルトの名無しさん
2008/04/26(土) 23:46:450159デフォルトの名無しさん
2008/04/26(土) 23:49:44swapは必要最小限のメンバ交換だから、
それ以上の処理をすることは無いんじゃないかな。
>>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];
}
0160159
2008/04/26(土) 23:52:39○ x = *xv.back();
ごめん、コンパイル通してなかったから。
0161デフォルトの名無しさん
2008/04/27(日) 00:26:38数学や物理ができないとかなり無謀ですか?
一応高校は卒業していて、やる気は◎です。
数学と物理の評定はだいたい3〜4でした
0162デフォルトの名無しさん
2008/04/27(日) 00:26:590163デフォルトの名無しさん
2008/04/27(日) 00:29:59かなり無謀だけど、そこはやる気でカバー。
0164デフォルトの名無しさん
2008/04/27(日) 00:30:52いいから本屋に行って立ち読みしてこい
発言内容からするとプログラミング初心者か?
いきなりそんな本買ってもムダだ
0165デフォルトの名無しさん
2008/04/27(日) 00:35:06質問はageで良いよ
無謀かどうかは作るものによると思う
エンジン自作とかは無茶だろうし
本買うのは良いけど、言語(C++?)とかプラットホーム(Win+DirectX?)の知識は大丈夫?
本が前提としてる知識が無いと読んでも躓くだろうから
0166デフォルトの名無しさん
2008/04/27(日) 00:37:11ホットスーププロセッサーでサンプル動かして様子を見る。
0167デフォルトの名無しさん
2008/04/27(日) 00:39:14↓
点とかでいいから図形描く
↓
一点透視の簡単な3Dを出す
とか?DirectXとか使うなら余計な部分でやる気削がれないようにすればできる
0168デフォルトの名無しさん
2008/04/27(日) 01:01:40ホットスーププロセッサ
【じゃ】HSP初質P52【自己解決ゥ!】 http://pc11.2ch.net/test/read.cgi/tech/1192531041/
VC++2008 + DarkGDK
DarkGDK http://pc11.2ch.net/test/read.cgi/tech/1208941132/
0169デフォルトの名無しさん
2008/04/27(日) 01:12:520170デフォルトの名無しさん
2008/04/27(日) 01:37:29class 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);
}
0171170
2008/04/27(日) 01:38:330172170
2008/04/27(日) 01:39:560173デフォルトの名無しさん
2008/04/27(日) 01:43:30平衡木のノードの内容は勝手に変えられると
順番変わる恐れがあるから、
set のイテレータは内容を変えられないようになってる。
0174デフォルトの名無しさん
2008/04/27(日) 01:48:450175デフォルトの名無しさん
2008/04/27(日) 02:04:23【質問】
色々なページを見て回ってサンプルコードをコンパイルしようと思ったのですが、うまくコンパイル出来ません。
以下ソースコード
#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 で参照されました。
と出て失敗します。どうすればコンパイルできるのでしょうか?
0176デフォルトの名無しさん
2008/04/27(日) 02:19:310177デフォルトの名無しさん
2008/04/27(日) 02:23:45素早い回答、どうもありがとうございます。本当に助かりました。
0178デフォルトの名無しさん
2008/04/27(日) 03:16:47std::string().swap(str);
こう書くとswap先のインスタンスが即デストラクトされるて元の中身が解放される。
自分はこんな風に使ってる
template<class T>
void SwapDelete(T &rCn) {T().swap(rCn);};
0179デフォルトの名無しさん
2008/04/27(日) 03:23:52string が 100 個確保される。
for(int n=0;n<100;n++)x[n].resize(1000000);
それぞれの string のサイズが 1000000 になる。
x.resize(1);
x[0] を除いた全ての string が破棄される。
string が破棄されるということは、string 内のメモリは解放される。
ただし、vector 内のメモリの最確保は行われない。
また、メモリが解放されても即座に OS にメモリが返されるわけではない。
これだけの話。
0180デフォルトの名無しさん
2008/04/27(日) 06:55:38STLコンテナ汎用な関数をテンプレートで実装する
クラスの継承で詰まった・・・
0181デフォルトの名無しさん
2008/04/27(日) 09:13:490182デフォルトの名無しさん
2008/04/27(日) 09:16:43クラステンプレートの virtual メンバ関数は可能なので
それを間に入れて何とかするしか
0183161
2008/04/27(日) 10:36:41英雄○説�Yみたいなゲームを作りたいのですが
今C言語とWindowsAPIというやつを勉強しています。
↑のようなゲームを作るためにはどんな言語を覚えれば
ベストですか?
ゲームの専門学校の入ったのですが先輩が2年間学んでも
テトリスくらしか作れないと言っていたので自分で勉強しようと思いました。
0184デフォルトの名無しさん
2008/04/27(日) 10:39:45RPGツクールでもやってろ
0185デフォルトの名無しさん
2008/04/27(日) 10:41:23ゲーム会社にアルバイトに行く 技術を現場で学ばないと無理 独学では一生でも無理かもしれない
0186デフォルトの名無しさん
2008/04/27(日) 10:43:13入れば生産方法がわかる
0187デフォルトの名無しさん
2008/04/27(日) 10:47:48やる気は大事だね。持ってる事はいいこと。
coding はしなければできるようにはならない。
どうせ C 勉強してるなら C++ を勉強するのが良いと
思うけど。今更 C から学ぶ必要は無い。
Java とか ruby とか python とかでもいろいろゲームを
作れるし、そちらの方が手軽かもしれん。けど、プログラミング
初心者ならいろいろ手を出すより一つ言語をある程度使いこなせる
ようにするのが良いと思う。
ゲームが専門で2年間でテトリスは寂しすぎる…
0188デフォルトの名無しさん
2008/04/27(日) 10:48:22日本ファルコム株式会社 採用情報:応募方法
http://www.falcom.com/kaisya/recruit/howto.html
0189デフォルトの名無しさん
2008/04/27(日) 10:50:53堀井雄二はプログラム出来ないけど大ヒットゲームを何本も作った。
0190デフォルトの名無しさん
2008/04/27(日) 10:53:54やる気出てきました、がんばります!
0191デフォルトの名無しさん
2008/04/27(日) 10:57:32あれ便利だったのにorz
まあ運良く404になる前にパソコンに入れてたからいいけど。
0192デフォルトの名無しさん
2008/04/27(日) 11:05:470193デフォルトの名無しさん
2008/04/27(日) 11:07:40中身は5.5.1ではなくて最新版のやつに変更してる GUIは使わない
0194デフォルトの名無しさん
2008/04/27(日) 11:21:41なるほど、
学校の先生はc++は一行のプログラムで色々処理できるから便利と言っていたけど
普通のCからやらないと絶対ダメ!と言っていましたw
0195デフォルトの名無しさん
2008/04/27(日) 11:25:48示のゲームだから昔の人は偉かったなすべて、何もか
も最初から造る。本の通り出来る訳ない。みんな嘘構
造文に嘘説明。神田の明倫館とか書泉もう時代遅れ。
高岡が儲かり指南の教本がインターネットだから楽な
んだろうな。
0196デフォルトの名無しさん
2008/04/27(日) 11:33:35とにかく書かなきゃ書けるようにはならんから便利な方から
やりゃいいのよ。目的達成できればいいし、オブジェクト
やテンプレートがある思考法に初めから慣れた方が良い。
C++ に自信が無い人は大抵 C からやらなきゃダメ、と言って
C だけ教えるんだよね。好意的に解釈すると、プロになるならば
C も読めなきゃいけないし、C 的文法も知る必要がある、という
事は言えるかも。ただ、それを初めにしなきゃいかん理由は無い。
0197デフォルトの名無しさん
2008/04/27(日) 11:44:56ポインタが面倒なので参照いれたり、
型が厳密な為に複雑になるのをオーバーロードやテンプレートで単純化したり
誰もがよく使う処理をSTLとしてまとめたりしてある。
STLを実現する為に必要な文法を勉強するとなると大変だが、使う分には易しい。
0198デフォルトの名無しさん
2008/04/27(日) 12:25:08wchar_tとwstringの中身も同じになりますか?
0199デフォルトの名無しさん
2008/04/27(日) 12:28:590200デフォルトの名無しさん
2008/04/27(日) 12:35:17main(){
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;
}
0201デフォルトの名無しさん
2008/04/27(日) 12:42:27int書かない派?
0202198
2008/04/27(日) 12:45:30main(){
wchar_t a[]=L"あいうえおアイウエオ";
wstring b,c=a;
b.resize(10); memcpy(&b[0],a,20);
if(b==c)cout<<"itti\n"; }
0203デフォルトの名無しさん
2008/04/27(日) 12:51:55memcpyはダメだ。
0204デフォルトの名無しさん
2008/04/27(日) 12:53:11これは基本単位が16bitで一語が32bitになることもありますよね?
char を wchar_tに変換しようとするとき、確保を2倍にしたら不都合でますか?
0205デフォルトの名無しさん
2008/04/27(日) 12:55:00> wchar_tはUTF16なんですよね?
そんな決まりはありません。
> char を wchar_tに変換しようとするとき、確保を2倍にしたら不都合でますか?
もちろん。
0206デフォルトの名無しさん
2008/04/27(日) 13:12:10一般的にはどうなるか不明。
0207デフォルトの名無しさん
2008/04/27(日) 13:53:57gccのwchar_tはUCS4。
0208デフォルトの名無しさん
2008/04/27(日) 15:40:44TUTAYAに売っている入門書でも大丈夫でしょうか?
0209デフォルトの名無しさん
2008/04/27(日) 15:46:06どの入門書がオヌヌメなのか聞きたいの?
0210デフォルトの名無しさん
2008/04/27(日) 15:49:360211デフォルトの名無しさん
2008/04/27(日) 15:52:11ttp://vipprog.net/wiki/book_review.html#jc9e7713
VIPのところのだけど、参考にするといいと思うよ。
VIPはふざけてる奴はふざけてるけど、こういうデータ収集とかは物凄い勢いでやるから。
0212デフォルトの名無しさん
2008/04/27(日) 15:55:070213デフォルトの名無しさん
2008/04/27(日) 15:59:22入門書のレビューがほとんど無いじゃん。
0214デフォルトの名無しさん
2008/04/27(日) 16:02:34というか過去ログ読め。
推薦図書/必読書のためのスレッド 39
http://pc11.2ch.net/test/read.cgi/tech/1202273631/
0215デフォルトの名無しさん
2008/04/27(日) 16:05:570216デフォルトの名無しさん
2008/04/27(日) 16:07:360217デフォルトの名無しさん
2008/04/27(日) 17:27:280218デフォルトの名無しさん
2008/04/27(日) 17:33:49Cのソースの拡張子をcppに変えてもちゃんと動くのは偶然じゃないだろ?
0219デフォルトの名無しさん
2008/04/27(日) 17:36:430220デフォルトの名無しさん
2008/04/27(日) 17:38:43そりゃそうだけどさ・・・
最初っから「C++はCをベースに作られた言語だよ」って書けばよかったのか
0221デフォルトの名無しさん
2008/04/27(日) 17:41:00両方がその機能を十分に発揮している場合、
全く異なる感じになるだろう。
もしそうなっていないようなら、C++ をちゃんと使いこなせてないってこった。
0222デフォルトの名無しさん
2008/04/27(日) 17:41:48少なくともC++未経験者にとって仕様書を読んだだけでは分からないだろ。
オブジェクト指向やジェネリックプログラミングなどの概念を身に付けないと。
0223デフォルトの名無しさん
2008/04/27(日) 17:54:11整数読むときみたいに、ios::binaryを設定した後、ifstreamのreadで読もうとしても
ifstream.read( char*, int)
なので1byte単位での読み込みになり、1bit仮数部だけの読み込みはできないですし、
atofはアスキーデータからしか変換できません。
どんな方法で浮動小数点読み込むのがベターですか?
やっぱり<cstdio>のfread使うのでしょうか。
0224デフォルトの名無しさん
2008/04/27(日) 17:55:35日本語で方言扱うのと同じ様にC++分かるつってるだけなんだけどなぁ・・・
0225223
2008/04/27(日) 17:56:330226デフォルトの名無しさん
2008/04/27(日) 18:01:590227デフォルトの名無しさん
2008/04/27(日) 18:05:19かなり無理があると思うな。他の人も言っているが、class や
template の考え方や override みたいな使いかたは経験無ければ
仕様書読んだだけでは普通無理。Java バリバリ使っていて C も
知っています、というのならまだわかるが。
もちろん C も基本的に C++ として有効なので、仕様書読んだだけでも
使える、と言って C++ のメリットを生かしていない場合は結構あるだろうな。
0228デフォルトの名無しさん
2008/04/27(日) 18:08:57reinterpret_castしてそのistream.readの引数に渡せばいい。
0229デフォルトの名無しさん
2008/04/27(日) 18:09:13普通に
double d;
read((char*)&d, sizeof d);
みたいに読むけど。
0230デフォルトの名無しさん
2008/04/27(日) 18:09:35double d;
is.read(reinterpret_cast<char*>(&d), sizeof d);
0231デフォルトの名無しさん
2008/04/27(日) 18:17:38まぁ、初めてC触ったのが幼稚園で小学校でアセンブラとかやってた
変態チックな俺が世間とずれてるのはよくあることですよね
0232デフォルトの名無しさん
2008/04/27(日) 18:20:580234デフォルトの名無しさん
2008/04/27(日) 18:42:37アセンブラを教えてくれる幼稚園や小学校があるならぜひ紹介してくれ
0235デフォルトの名無しさん
2008/04/27(日) 18:45:52関係ないが、ロシアにはハッキング教室がある。
企業情報を盗んで生計を立ててる卒業生もいるらしい。
0236デフォルトの名無しさん
2008/04/27(日) 18:53:07本の英小文字とキーボードの大文字がリンクとれなくて大文字のフリガナを親に書いてもらってたのを思い出した
0237デフォルトの名無しさん
2008/04/27(日) 18:55:590238デフォルトの名無しさん
2008/04/27(日) 19:53:59いったんメモリに命令群が展開されてそこから(?)実行されると思うのですが、
プログラムがメモリのどの位置に配置されたか分る方法ってないのでしょうか?
メモリに配置されたプログラムをダンプするプログラムを作りたいです (´・ω・`)
ヒントだけでもいいので教えてください。よろしくお願いします。
0239デフォルトの名無しさん
2008/04/27(日) 20:26:07ヒントどぞ〜
ttp://codezine.jp/a/article.aspx?aid=403
ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html
0240デフォルトの名無しさん
2008/04/27(日) 20:35:26ヒントどうもありがとうございます。色々調べてるんですが、なにぶん初心者なもので理解に苦しみます ^^;
OpenProcess に ReadProcessMemory , CloseHandle 色々あって難しいですね。。。
0241デフォルトの名無しさん
2008/04/27(日) 20:45:43それでもWindowsはヌルい方なんだけどな。
0242デフォルトの名無しさん
2008/04/27(日) 21:22:540243デフォルトの名無しさん
2008/04/27(日) 21:50:590244デフォルトの名無しさん
2008/04/27(日) 21:54:35必ずテスト気を付けてしてるよ。
0245デフォルトの名無しさん
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();}
};
みたいにしたときです。
0246デフォルトの名無しさん
2008/04/27(日) 23:00:06T によって呼ばれる関数がフリー関数になったり、メンバ関数になったりするのが
わかりにくくて嫌な挙動だからだと思う
0247デフォルトの名無しさん
2008/04/27(日) 23:15:46int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
MessageBox(NULL,"Kitty on your lap","メッセージです", MB_OK);
return 0;
}
これってどこか間違ってますか?
0248デフォルトの名無しさん
2008/04/27(日) 23:16:30gcc -c func1.c func2.c
ar rcs libtest.a func1.o func2.o
だとオブジェクトファイルを生成したコンパイラでしかリンクできない
0249デフォルトの名無しさん
2008/04/27(日) 23:33:32bccならそれでコンパイル通るけど、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;
}
こうやってうにこーどにしなきゃ駄目
0250デフォルトの名無しさん
2008/04/27(日) 23:34:04つ[extern "C"]
0251249
2008/04/27(日) 23:35:050252デフォルトの名無しさん
2008/04/28(月) 00:15:18返答ありがとうございます。
でも、先の例だとTに何が来ても、func()はbaseクラスに必ず存在すると思うんですが、、、
違いますか?
フリー関数というのは、baseクラスやderiクラスの外部にある関数ということですよね?
0253デフォルトの名無しさん
2008/04/28(月) 00:15:39おお、できた
サンクス!
0254デフォルトの名無しさん
2008/04/28(月) 00:18:45T内でtypedef 〜 func
とかやってる可能性もあるから。
0255デフォルトの名無しさん
2008/04/28(月) 00:21:55テンプレートクラス内で、別のテンプレートクラスを使用する時にエラーが出ます。
例:
template< class TYPE > class List
{
// Listに使うメソッドなど
};
template< class TYPE > class AAA
{
public :
List< TYPE > m_List; // ←エラー
};
凄く初歩的な質問かもしれませんが、何が悪いんでしょうか?
0256デフォルトの名無しさん
2008/04/28(月) 00:26:440257デフォルトの名無しさん
2008/04/28(月) 00:27:13ごめんよく読んでなかった。間違い
0259223
2008/04/28(月) 00:29:30でどうよ?
0260デフォルトの名無しさん
2008/04/28(月) 00:35:43すいませんちょっと違いました。
例:
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
やってみましたが、やっぱりエラーが出ます。。。
0261デフォルトの名無しさん
2008/04/28(月) 00:39:160262デフォルトの名無しさん
2008/04/28(月) 00:41:49function() { m_List.Add( new TYPE ); } の間違いです。
>>258
エラーは、「m_Listが宣言されてません」と出ます。
また、この例ではメソッドをクラス内で書いてありますが、
実際にはクラス定義のすぐ下で、
{
〜〜〜クラス定義
};
templeate< class TYPE > typename
class AAA::function()
{
m_List.Add( new TYPE );
}
のような感じでヘッダーファイルに記述してあります。
0263デフォルトの名無しさん
2008/04/28(月) 00:43:00C2065 m_Listは定義されていない識別子です。
とでます。
0264デフォルトの名無しさん
2008/04/28(月) 00:47:33g++ ならそのまま普通に通る。VCの場合は知らんけど
g++ -ansi -pedantic
でも通るからC++標準からみて問題はなさそう。
問題が再現するソース作ってコピペし、VC++使いに見てもらうのが良し。
0265デフォルトの名無しさん
2008/04/28(月) 00:53:110266デフォルトの名無しさん
2008/04/28(月) 00:54:05本当にすいません;
お騒がせしました。
0267デフォルトの名無しさん
2008/04/28(月) 00:55:00もう少し勉強してからまた来ます;
0268デフォルトの名無しさん
2008/04/28(月) 00:57:340269デフォルトの名無しさん
2008/04/28(月) 00:57:53>>258
ありがとうです。
テンプレートの特殊化があるために、baseクラスの定義が信用できないということですね?
0270デフォルトの名無しさん
2008/04/28(月) 02:46:37プロセスIDの指定→メモリ上の位置の取得→指定されたサイズだけデータを読み込む→ファイルに保存
といった感じかな??メモリ上の位置の取得とデータの読み込みの方法が分らない。。。。
誰かサンプルコードを書いてくれ。いや、サンプルコードを提供して頂けないでしょうか?
よろしくお願いします。
0271デフォルトの名無しさん
2008/04/28(月) 02:51:200272デフォルトの名無しさん
2008/04/28(月) 03:01:29ツール自体は持ってるんですけど、どんな風に動作してるのか、動作原理に興味があって質問しました。
邪魔になるようだったら以降控えます。すみませんでした。
0273デフォルトの名無しさん
2008/04/28(月) 03:13:10OSは?
0274デフォルトの名無しさん
2008/04/28(月) 03:15:250275デフォルトの名無しさん
2008/04/28(月) 03:21:52それはともかくReadProcessMemory。
あとOpenProcessも必要になるかな。
0276デフォルトの名無しさん
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;
}
};
0277デフォルトの名無しさん
2008/04/28(月) 07:13:54Borland C++Compilerとbcpadがあればcとc++の開発はだいたいできますか?
0278デフォルトの名無しさん
2008/04/28(月) 07:51:400279デフォルトの名無しさん
2008/04/28(月) 07:57:21その代わりpragmaが一切ないとか、実用性0でもいいです。
0280デフォルトの名無しさん
2008/04/28(月) 10:55:20operator()(引数)と書かなくてはならないですか?
class aaa {
public:
functor* fp;
};
class functor {
public:
int operator()(int);
};
aaa A;
A.fp->operator()(10); // これはコンパイルできる
A.fp(10); // これはできない。
これはしょうがないですか?
0281デフォルトの名無しさん
2008/04/28(月) 11:23:21class 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);
}
0282デフォルトの名無しさん
2008/04/28(月) 11:37:39rf(10);
0283デフォルトの名無しさん
2008/04/28(月) 11:38:590284デフォルトの名無しさん
2008/04/28(月) 14:49:290285デフォルトの名無しさん
2008/04/28(月) 15:20:08メタプロにおけるテンプレート特殊化というのは、通常プログラミングの
文脈で言う条件分岐(switch)にあたる。
実利的には、特殊化が無いとboostライブラリの大半が実現できなかったり
能力が落ちたりする。
boost/utility/enable_if.hppなんかは何やってるか解りやすいと思う。
0286デフォルトの名無しさん
2008/04/28(月) 18:32:09export が使える、準拠率の最も高いコンパイラとして知られているのは Comeau C++ だな。
0287デフォルトの名無しさん
2008/04/28(月) 20:14:24main()
{
printf("hello!");
return 0;
}
をコンパイルしてできたexeファイルをダブルクリックしてもコマンド
プロントっぽいのが一瞬でて消えてしまいます
コマンドプロントからhello.exeで使用するとちゃんとhello!と表示されます
前者のほうはOSが壊れていたりするからですか?
不安なのでアドバイスください;;
0288デフォルトの名無しさん
2008/04/28(月) 20:16:41プログラムが終了するとコマンドプロンプトも一緒に終了する。
そういうもん。
0289デフォルトの名無しさん
2008/04/28(月) 20:20:18ありがとうございます
自己解決しました
0290デフォルトの名無しさん
2008/04/28(月) 20:23:240291デフォルトの名無しさん
2008/04/28(月) 20:28:200292デフォルトの名無しさん
2008/04/28(月) 20:29:26みてみましたが、使い方とかがよくわかりません。ソースも中身がカラで無意味そうに見える(けど本当は意味があるんだろう)テンプレートばっかりで
ピンと来ませんでした。とりあえず
boost.org/libs/utility/
でも見てみます。あと、メタプログラミングを知れば利点がわかるということですか?
ありがとうございました。
0293デフォルトの名無しさん
2008/04/28(月) 22:07:280294デフォルトの名無しさん
2008/04/28(月) 22:25:51ごめんなさい、コンパイルしないで書き込んじゃいました
コンパイルしたらまた書き込みます
0295デフォルトの名無しさん
2008/04/29(火) 01:47:26error C4430ってのが出て、もう意味不明です。どういう事なんでしょう?
0296デフォルトの名無しさん
2008/04/29(火) 01:48:540297デフォルトの名無しさん
2008/04/29(火) 01:50:01オマイが今まで書いてきたプログラムはC++のような何かだったってこと
0298デフォルトの名無しさん
2008/04/29(火) 01:56:00#include<studio.h>
main()
{
}
これすらコンパイル出来ません…
0299デフォルトの名無しさん
2008/04/29(火) 01:57:18<stdio.h>
0300デフォルトの名無しさん
2008/04/29(火) 01:59:34{
}
0301デフォルトの名無しさん
2008/04/29(火) 02:01:23「C++はintを既定値としてサポートしていません」とか書かれてないか?
0302デフォルトの名無しさん
2008/04/29(火) 02:01:36int main(void)
{ return 0; }
0303デフォルトの名無しさん
2008/04/29(火) 02:02:320304デフォルトの名無しさん
2008/04/29(火) 02:04:36>>301
書いてあります。
0305デフォルトの名無しさん
2008/04/29(火) 02:06:18次からはそういう大事な情報を隠さないでくださいね
0306デフォルトの名無しさん
2008/04/29(火) 02:07:55はい、すみません。
0307デフォルトの名無しさん
2008/04/29(火) 03:49:16template<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;
};
0308デフォルトの名無しさん
2008/04/29(火) 06:10:13ありがとうございます。でもmain関数が書けません(泣)
簡単でいいですから、main関数も書いてもらえませんか?
0309デフォルトの名無しさん
2008/04/29(火) 07:17:220310デフォルトの名無しさん
2008/04/29(火) 07:39:34それくらいなら書けます。
0311デフォルトの名無しさん
2008/04/29(火) 14:06:38class 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と表示されてしまいます
自分ではもう訳がわからなくなってしまいました。解決方法をご教示願います。
0312デフォルトの名無しさん
2008/04/29(火) 14:10:310313デフォルトの名無しさん
2008/04/29(火) 14:11:46SetMyShipDefault関数を初回に動かして、
x = -55.0f;
y = 100.0f;
という値を入れています。
0314デフォルトの名無しさん
2008/04/29(火) 14:27:10色々とダメすぎ。C++を真面目に勉強することをお勧めする。
それはさておき、「描画関数」と「値を渡す」ところと、「値がぶっ飛んでしまう」ところのソースを晒せ。
0315デフォルトの名無しさん
2008/04/29(火) 14:30:20VOID 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;
}
0316デフォルトの名無しさん
2008/04/29(火) 14:36:05DxLibって奴か?
0317デフォルトの名無しさん
2008/04/29(火) 14:39:040318デフォルトの名無しさん
2008/04/29(火) 14:39:53vcのデバッグビルド時の未初期化変数の値と一致する
0319デフォルトの名無しさん
2008/04/29(火) 14:40:520320デフォルトの名無しさん
2008/04/29(火) 14:43:20MyShip Player; どう見ても原因はここだろ
0321デフォルトの名無しさん
2008/04/29(火) 14:45:080322デフォルトの名無しさん
2008/04/29(火) 14:46:000323デフォルトの名無しさん
2008/04/29(火) 14:50:34その通りでしたorz
すみません、自分でもすっかり見落としてました。
回答してくださった皆様、お手数おかけしました。
0324デフォルトの名無しさん
2008/04/29(火) 14:53:48久々に寝ることにします・・・。
0325デフォルトの名無しさん
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() )
0326デフォルトの名無しさん
2008/04/29(火) 22:29:460327デフォルトの名無しさん
2008/04/29(火) 22:31:28どんまいw
0328325
2008/04/29(火) 22:37:25すいません;; ありがとうございました
0329デフォルトの名無しさん
2008/04/30(水) 02:41:59VisualStudio2005でライブラリを作りたくて色々試行錯誤してみたのですが・・・。
いまいちよくわからない状態でして。
用途についてですが、自分は学生でゲームを作っています。
言語では
DirectX
OpenGL
を使っています。
それに自分で使いやすいようにライブラリを作るつもりで調べてみました。
どうかやさしくおねがいします・・・・。
0330デフォルトの名無しさん
2008/04/30(水) 02:43:21さっさと質問すれば?
0331デフォルトの名無しさん
2008/04/30(水) 02:45:47これが簡単
DarkGDK
http://pc11.2ch.net/test/read.cgi/tech/1208941132/
0332デフォルトの名無しさん
2008/04/30(水) 02:46:21>DirectX
>OpenGL
>を使っています。
やさしく突っ込むと意味不明。
まずは自分の使ってる言語がCかC++のどちらなのか、
DirectXとOpenGLのどちらのライブラリを使うつもりなのか
基本的な部分を書くべきだと思う
0333デフォルトの名無しさん
2008/04/30(水) 02:46:38初心者を強く意識した設計になっているので、あとは日本語の入門書でもあれば、小学生がひとりで、
3Dゲームを作ってしまう、なんてこともできそうです。もともと DarkBasic というホビーユーザー向けのゲーム開発ツールがあって、 その開発スタイルを C++ に持ってきたのが DarkGDK ということらしいですが、悪くありません。
0334デフォルトの名無しさん
2008/04/30(水) 02:47:01今のDirectXはC++だよ
0335デフォルトの名無しさん
2008/04/30(水) 02:52:29↓
Win32プロジェクト
↓
スタティック ライブラリ
↓
int.cppに
int test ( int a ){
return ( a );
}
↓
ビルド
↓
フォルダにlibが生成
0336デフォルトの名無しさん
2008/04/30(水) 02:52:50libをVisualStudioのlibフォルダに入れる
↓
新しいプロジェクトを作る
↓
リンクさせる
↓
int main ( void )
{
int a = 10;
a = my_print ( a );
printf ( "%d", a );
return ( 0 );
}
でerrorがでました・・・。
そもそもmy_printが使えてないので、libがだめなのか、リンクがだめなのか。。。
その次元でわからないのです。。。
0337デフォルトの名無しさん
2008/04/30(水) 02:54:27ありがとうです
>>332
すいません、説明が不十分でした。
DirectXかOpenGLでゲームをつくり、ライブラリはC++をつかっています。
0338デフォルトの名無しさん
2008/04/30(水) 02:55:27です。
あほだ俺・・・
0339デフォルトの名無しさん
2008/04/30(水) 02:56:23それだと my_print が存在しないんじゃね?
0340デフォルトの名無しさん
2008/04/30(水) 02:57:05まだ決まって無いってことか?まずそこから選べよ
0341デフォルトの名無しさん
2008/04/30(水) 02:57:34うぉっと、すいませんmy_printじゃなくってtestです・・・
ごめんなさい
0342デフォルトの名無しさん
2008/04/30(水) 02:59:010343デフォルトの名無しさん
2008/04/30(水) 02:59:51#pragma comment(lib, "ほにゃらら.lib")
とかやってみては?
0344デフォルトの名無しさん
2008/04/30(水) 03:00:22DirectXでやると思うんですが、OpenGLでもつくるつもりです。
0345デフォルトの名無しさん
2008/04/30(水) 03:01:53失敗した後色々弄ったので廃棄してしまったんで・・・
もう一回やり直してエラー貼り付けます
>>343
やってみたんですが駄目でした
0346デフォルトの名無しさん
2008/04/30(水) 03:03:090347デフォルトの名無しさん
2008/04/30(水) 03:04:40最近のコンパイラは日本語で懇切丁寧に解説してくれるだろ
0348デフォルトの名無しさん
2008/04/30(水) 03:06:240349デフォルトの名無しさん
2008/04/30(水) 03:08:27#pragma comment(lib, "test.lib")
int main ( void )
{
int a = 10;
a = test ( a );
printf ( "%d", a );
return ( 0 );
}
エラー
test 識別子が見つかりませんでした
0350デフォルトの名無しさん
2008/04/30(水) 03:09:50ヘッダってどのヘッダでしょうか?
>>347
>>348
以後注意します
0351デフォルトの名無しさん
2008/04/30(水) 03:11:04関数プロトタイプを含んだヘッダはどこ?
C++としてコンパイルしているなら必須
0352デフォルトの名無しさん
2008/04/30(水) 03:13:35prototypeのヘッダ・・・
もしかしてtestのprototypeをヘッダで宣言している必要があるということでしょうか。
全くやってないです
0353デフォルトの名無しさん
2008/04/30(水) 03:14:54これでどう?
#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 );
}
0354デフォルトの名無しさん
2008/04/30(水) 03:18:00やってみました
test.libを開けませんでした
とエラーが吐かれました
0355デフォルトの名無しさん
2008/04/30(水) 03:18:38>>353です、すいません
0356デフォルトの名無しさん
2008/04/30(水) 03:23:020357デフォルトの名無しさん
2008/04/30(水) 03:27:32ソリューションエクスプローラのプロジェクトを右クリック → プロパティ
リンカ → 追加のライブラリ → libを入れたフォルダを指定
じゃだめなんでしょうか
0358デフォルトの名無しさん
2008/04/30(水) 03:28:54すいません、本当にすいません。
作成したlibが
test2.lib
でした・・・・
吊ってきます
0359デフォルトの名無しさん
2008/04/30(水) 04:44:23お願いします。
0360デフォルトの名無しさん
2008/04/30(水) 08:11:100361デフォルトの名無しさん
2008/04/30(水) 19:30:23基数計算のプログラムを書いて来いという宿題が出たのですが何度コンパイルしてもエラーが出てしまいます・・。
直しかた教えてください;;
エラー 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
0362デフォルトの名無しさん
2008/04/30(水) 19:30:59連投すいません
0363デフォルトの名無しさん
2008/04/30(水) 19:32:14樹海行ってきます・・・
ごめんなさい
0364デフォルトの名無しさん
2008/04/30(水) 20:07:42int main(int argc, CHAR* argv[])
か
int wmain(int argc, WCHAR* argv[])
に置き換えても通らない?
0365デフォルトの名無しさん
2008/04/30(水) 20:22:380366デフォルトの名無しさん
2008/04/30(水) 20:29:10いっそのこと「Win32コンソールアプリケーション」
で新しくプロジェクトを作っちゃって、
最初から書いてある
int _tmain(int argc, _TCHAR* argv[])
の中にmain()の中身をコピペしてしまったほうが早いかもしれん。
0367デフォルトの名無しさん
2008/04/30(水) 21:06:06ttp://akm.cx/2d2/src/1209557106123.jpg
スキャンして載せてみました。
どうしても成功できない・・・。
0368デフォルトの名無しさん
2008/04/30(水) 21:50:22それともどこか書き間違えてるとか?
どうでもいいが、ユーザー名・・・・ igumasatosi さんw
0369デフォルトの名無しさん
2008/04/30(水) 21:58:150370デフォルトの名無しさん
2008/04/30(水) 22:04:49なるほど、ありがとうございます
もうちょいがんばってやってみます。
ユーザ名^^; うっかり^p^
0371デフォルトの名無しさん
2008/04/30(水) 22:11:41BCCでやったらできました
連投失礼しました
0372デフォルトの名無しさん
2008/05/01(木) 01:41:16template<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;
};
↓つづく
0373デフォルトの名無しさん
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;
}
0374デフォルトの名無しさん
2008/05/01(木) 03:57:25すげえ、まだみたばかりで内容はよくわからんけど、勉強させてもらいます。
ありがとうス。
0375デフォルトの名無しさん
2008/05/01(木) 08:49:16コンソールじゃなかったんだろうね
0376デフォルトの名無しさん
2008/05/01(木) 09:17:270377デフォルトの名無しさん
2008/05/01(木) 09:18:250378デフォルトの名無しさん
2008/05/01(木) 09:50:57Visual StudioをVisualstdioなんて書く人はじめてみたよw
0379デフォルトの名無しさん
2008/05/01(木) 11:12:23ごめん、なんか胸が痛い…… もう何年も前なのに……。
0380厨房
2008/05/01(木) 14:38:312)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;
}
// 次に続く
0381厨房
2008/05/01(木) 14:39:15int 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;
}
0382厨房
2008/05/01(木) 14:41:503)SetWindowTextを使わないと、プログラムは最後まで通ります。
0383デフォルトの名無しさん
2008/05/01(木) 14:54:11何か変な事が起こってるんじゃなかろうか。
0384デフォルトの名無しさん
2008/05/01(木) 14:56:52PostMessageを使うのが良い
0385デフォルトの名無しさん
2008/05/01(木) 14:57:100386デフォルトの名無しさん
2008/05/01(木) 15:22:59> 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
この辺読むといいよ。
0387厨房
2008/05/01(木) 16:47:21ご回答ありがとうございます。
やっと理由を理解できたような気がします。
このようなスレッドの終了法を未だ自分で思いつくことができないのですが、
とりあえずあるサイトに提示されていた下記の方法を参考にさせていただきます。
ご提示いただいたサイトやヘルプを元に改めて勉強しなおします。
------------------------------------------------------------
// メインスレッド側
MSG msg;
// 正常にWaitForが終了するまで最大50msecづつ待つ
while(WAIT_TIMEOUT == WaitForSingleObject(hTh, 50))
{
// おそらくタイムアウトになるので、
// 立ち上げたスレッド内でSendMessageされていた?メッセージを適当に処理する
GetMessage(&msg, NULL, 0, 0);
if(!IsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
0388デフォルトの名無しさん
2008/05/01(木) 17:08:33const 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されてたメッセージを処理できる。
0389デフォルトの名無しさん
2008/05/01(木) 22:16:34Aクラスを継承してBクラスを作った場合、
B* b = new B();
A* a = b;
delete a;
で、Aクラスのデストラクタが呼ばれる代わりに
Bクラスのデストラクタが呼ばれるのだよな?
でも、ちゃんとインスタンスが消滅するには、
Bクラスのデストラクタが呼ばれた後、Aクラスのデストラクタが
呼ばれないといけないのじゃない?
結局、デストラクタをバーチャルにしても、
よく本に書いてあるような、その目的を達成することが出来ない
気がするのだが、違うのか?
0390デフォルトの名無しさん
2008/05/01(木) 22:21:300391デフォルトの名無しさん
2008/05/01(木) 22:22:25> 呼ばれないといけないのじゃない?
ちゃんとそうなってる
0392デフォルトの名無しさん
2008/05/01(木) 23:46:27B のデストラクタが呼ばれた後に A のデストラクタが呼ばれる。
0394デフォルトの名無しさん
2008/05/02(金) 05:22:11派生クラスを突っ込んだときの後始末で、基底クラスの
デストラクタしか呼ばれないから。
派生クラスがこういう使い方をされないのなら、virtualに
しなくても問題ない。
0395デフォルトの名無しさん
2008/05/02(金) 12:05:28デストラクタの呼び出しは特別だ、て話だと思ってたけど。
基底ポインタからの呼び出しに関して、
ふつーの仮想メンバ関数は、「派生のみ」しか呼ばれないけど、
仮想デストラクタは「派生」のあとに「基底」も呼ばれる、みたいな。
0396デフォルトの名無しさん
2008/05/02(金) 12:52:23{ B b; } でも困ることになるよなー、と。
0397デフォルトの名無しさん
2008/05/02(金) 17:15:26自動挿入されてるみたいな感じだから、呼び出すこと自体は普通のvirtual関数と
同じ扱いですよね
0398デフォルトの名無しさん
2008/05/02(金) 19:23:55buffer[y][x] = new wchar_t[3];
質問です。上記のようにnewでメモリを確保しようとすると、
6つぐらい余分に確保してしまうのですが、何が原因でしょうか?
環境はVC++です
0399デフォルトの名無しさん
2008/05/02(金) 19:34:18vector<string>やvector<wstring>
つかう
0400デフォルトの名無しさん
2008/05/02(金) 20:05:04for(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];
}
}
0401デフォルトの名無しさん
2008/05/02(金) 20:22:52それは398も既にやっているんじゃないの?
やっていないとしたら、アクセス違反で落っこちるって質問になるはず。
0402デフォルトの名無しさん
2008/05/02(金) 20:29:06適当なことを書くと
4byte が new で確保したサイズ
6byte が自由にアクセスできる領域
2byte がアラインメント
ただし、根拠は無いので信用するなよw
どうやって監視してるのかどうかしらんけど
デバッグ用に先頭と末尾にマジックナンバー埋め込んでる可能性もある
0403デフォルトの名無しさん
2008/05/02(金) 20:49:210404398
2008/05/02(金) 21:05:26newした直後にブレークポイントを設置してみた結果、
buffer[y][x] = "???######gg"
と見られますし、またwcslen(buffer[y][x])で長さを調べても
上記の余分な配列幅が観測できました。
※
?は想定している数の分、#は四角の絵文字で6つぐらい。
0405398
2008/05/02(金) 21:07:12コンパイルはReleaseではなくDebag、
VC++は2008Expressです。
0406デフォルトの名無しさん
2008/05/02(金) 21:08:35最初からちゃんとやったことを話すことだね。
0407デフォルトの名無しさん
2008/05/02(金) 21:11:03wcslen でどうやって確保したメモリの長さを調べられるんだ?
まあそれはいいが、デバッグ版の場合はバッファオーバーランを検知するために
前後に余分にメモリを確保し、そこを特定のデータで埋めるようになっている。
0408デフォルトの名無しさん
2008/05/02(金) 21:12:270409デフォルトの名無しさん
2008/05/02(金) 21:14:00確か前後を埋める値はそれとは別だったと記憶している。
0410デフォルトの名無しさん
2008/05/02(金) 21:14:23あるあるw
0411デフォルトの名無しさん
2008/05/02(金) 21:17:220412398
2008/05/02(金) 21:36:40void 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);
}
}
0413398
2008/05/02(金) 21:38:43m_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];
0414398
2008/05/02(金) 21:42:55>>407 が答えかも。
作ろうとしていたのはCSVの文字列を格納する関数です…。
0415デフォルトの名無しさん
2008/05/02(金) 21:44:40delete し忘れて泣きたくないだろ?
0416デフォルトの名無しさん
2008/05/02(金) 22:10:26実装やOSの都合上、指定したサイズ以上確保される事があるが
そんなことは気にする必要ないし、それを期待して書いてもいけない。
0417デフォルトの名無しさん
2008/05/02(金) 23:40:12まぁ、基礎知識として知っといた方が良いだろう。
使うのはvectorで良いけど。
0418デフォルトの名無しさん
2008/05/03(土) 00:11:11fgets( buf, 256, stdin );
で入力を取りたいのですが、コンパイラがgccだと
何故かこの処理が華麗にスルーされてしまいます
gccだと使えないんでしょうか?
gccはcygwinに入っていたのを使ってます
0419デフォルトの名無しさん
2008/05/03(土) 00:22:45ちなみに gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) だよ
0420デフォルトの名無しさん
2008/05/03(土) 00:25:27その問題を再現する簡単なコードとgccのバージョンを
0421デフォルトの名無しさん
2008/05/03(土) 00:50:18gccのバージョンですが >>419 さんのと全く同じです
問題のソースですが、少し長いのでその部分だけを抜粋しますので
改めてレスさせて頂きます
0422デフォルトの名無しさん
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がスルーされてしまいます
0423デフォルトの名無しさん
2008/05/03(土) 01:16:02fscanf の %d の後にスペースを1つ入れると良いでしょう
理由は調べてください
0424デフォルトの名無しさん
2008/05/03(土) 01:31:310425デフォルトの名無しさん
2008/05/03(土) 03:24:12まず、これ↓
rewind(stdin);
は無いだろw
それから、scanf()を止めて、fgets()+sscanf()にしてみてはどうだろう?
※想像だがscanf()への入力に[Enter]していると思うんだが、そいつが次のfgets()にひろわれていると思われ
0426デフォルトの名無しさん
2008/05/03(土) 05:08:510427デフォルトの名無しさん
2008/05/03(土) 07:29:14有難うございます。まだ試してはいませんが、調べてみます
>>425
getchar( );
を実行すると改行コードが残るので
rewind(stdin);として、stdinを先頭に持っていくと
次回からgetchra( )でとれたもので・・・
このコードはgcc以外では動作しましたので安心していましたorz
0428デフォルトの名無しさん
2008/05/03(土) 08:18:33ちょっと調べてみたら コンパイラに依存するみたい
VC, BCはクリアするみたいだけど、gccは何もしない
そのため、rewind(stdin)->単純にポインタが先頭に移動するだけなのでfgetsで拾われていると思われる
0429デフォルトの名無しさん
2008/05/03(土) 08:26:48生半可なことを書くとまた変な人が沸くから要注意。
標準入力をrewindしても、(対象がブロックデバイスでないから)巻き戻しは発生しませんよ。
0430デフォルトの名無しさん
2008/05/03(土) 08:34:52指摘サンクス
stdinをrewindしても、stdin自体が移動するわけではないんだな
VCとかではrewind(stdin)でバッファをクリアされるけど、gccでは何もしないから
クリアされずに次にfgetsで拾われているに訂正します
0431デフォルトの名無しさん
2008/05/03(土) 08:38:490432デフォルトの名無しさん
2008/05/03(土) 17:17:29規格準拠コードって書けるの?
0433デフォルトの名無しさん
2008/05/03(土) 17:27:26AnsiCではファイルシステムに依存する関数は極力排除する方針なので書けない。
POSIXなら、isatty()で判る。
0434デフォルトの名無しさん
2008/05/03(土) 17:30:54サンクス。
0435デフォルトの名無しさん
2008/05/03(土) 20:13:21演算子オーバーロードと言いますよね。オーバーロードは多重定義という意味
なのに、どうして多重に演算子の定義をしない時でもオーバーロードと言うのでしょうか。
単に演算子の定義で良いような気がするのですが。
0436デフォルトの名無しさん
2008/05/03(土) 20:17:02それをユーザー定義型に適用するためにオーバーロード(多重定義)するんじゃん?
0437デフォルトの名無しさん
2008/05/03(土) 20:22:36double operator+(double, double)
:
:
と沢山オーバーロードされている演算子の定義に
さらに定義を追加するから演算子のオーバーロード。
まあ、単に演算子の定義でいいような気もするけど。
0438デフォルトの名無しさん
2008/05/03(土) 20:40:11まぁ、日本人にゃoverloadとoverwriteとoverrideの微妙な違いなんて判らないよね。
0439435
2008/05/03(土) 20:47:25レス有り難うございます。
なるほど、と思いましたが、グローバルに定義する他にクラスのメンバとして
定義する場合もありますよね。
0440デフォルトの名無しさん
2008/05/03(土) 20:49:190441435
2008/05/03(土) 21:00:39ああ、なるほど。
「演算子」と「普通のメンバ関数」の違いを意識すると、確かに多重定義ということになりますね。
すっきりしました。レスして下さった方、ありがとうございました。
0442デフォルトの名無しさん
2008/05/03(土) 22:50:12ループ処理でChar型の2元配列を初期化するとき、どのような記述を行えばいいのでしょうか?
VC++のスレに、間違えて書いてしまった・・・OTL
0443デフォルトの名無しさん
2008/05/03(土) 22:55:430444デフォルトの名無しさん
2008/05/03(土) 22:57:29char型ってことはこういうことか?
0445デフォルトの名無しさん
2008/05/03(土) 23:04:16入力された年・月のカレンダーを出すプログラムを書いてみようと思ったんで
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 ];
と、宣言しています。
0446デフォルトの名無しさん
2008/05/03(土) 23:07:30というかカレンダーを作るのに5*7で足りるんだろうか
0447デフォルトの名無しさん
2008/05/03(土) 23:10:04初期化した状態でとりあえず(0, 0)を呼び出すとメモリーエラーで落ちます。
一月最大五週じゃないですか・・・ね?一週間七日なのは、固定ですし。
0448デフォルトの名無しさん
2008/05/03(土) 23:12:12間違いすぎのような気がする
あなたの質問力では正解にたどり着くのに手間が掛かりすぎるだろう
落ち着いて本をよく読んだほうが早い
0449デフォルトの名無しさん
2008/05/03(土) 23:16:480450デフォルトの名無しさん
2008/05/03(土) 23:22:40どこが間違ってるんですか?
0451デフォルトの名無しさん
2008/05/03(土) 23:23:35いくつ進んだのか?だから実際、6*8確保してて8列目は\0書きさせて
7以下の時だと、実質的8列目は初期化されませんね。
0452デフォルトの名無しさん
2008/05/03(土) 23:40:350453デフォルトの名無しさん
2008/05/03(土) 23:45:00最大6週必要という意味が分かりません。
31日なら最大五週ではないでしょうか?
何もない一週間がない限り6週にならないと思うんですが。
0454デフォルトの名無しさん
2008/05/03(土) 23:48:380455デフォルトの名無しさん
2008/05/03(土) 23:58:190456デフォルトの名無しさん
2008/05/04(日) 00:13:08つきのコードを私の環境で実行してみましたが、特に問題はありませんでした。
実行環境: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;
}
実際に問題のあるコードを見せていただければ、なにか問題がわかるかもしれません。
0457デフォルトの名無しさん
2008/05/04(日) 00:22:19char cal[5][7] = { 0 };
あるいは
char cal[5][7];
memset(cal, 0, sizeof cal);
0458デフォルトの名無しさん
2008/05/04(日) 00:27:410クリアの方法を複数知ったところで意味がない
まずはカレンダーがどんなものだったかを思い出すのが先だと思うが
0459デフォルトの名無しさん
2008/05/04(日) 00:37:43'0'と0は違う気がするが
0460デフォルトの名無しさん
2008/05/04(日) 00:50:51違う気はするが、とりあえず今は関係ないからいいんじゃね?
0461デフォルトの名無しさん
2008/05/04(日) 00:50:540462デフォルトの名無しさん
2008/05/04(日) 00:51:58大体の場合違うだろ?
0463デフォルトの名無しさん
2008/05/04(日) 00:54:420464デフォルトの名無しさん
2008/05/04(日) 00:56:310465デフォルトの名無しさん
2008/05/04(日) 00:56:440466デフォルトの名無しさん
2008/05/04(日) 00:57:340467デフォルトの名無しさん
2008/05/04(日) 00:58:35同じだよ。規格でそうなってる。
0468デフォルトの名無しさん
2008/05/04(日) 01:00:200469デフォルトの名無しさん
2008/05/04(日) 01:03:230470デフォルトの名無しさん
2008/05/04(日) 01:04:390471デフォルトの名無しさん
2008/05/04(日) 01:06:390472デフォルトの名無しさん
2008/05/04(日) 01:28:08たとえばクラスの系列ごとにとか機能郡ごとにとか
0473デフォルトの名無しさん
2008/05/04(日) 01:33:50Cにはクラスは無いが、考え方は同じで。
0474デフォルトの名無しさん
2008/05/04(日) 01:35:23ソースファイルの管理も面倒になってきたのでどうしたものかと・・・
0475デフォルトの名無しさん
2008/05/04(日) 01:45:550476デフォルトの名無しさん
2008/05/04(日) 01:46:380477デフォルトの名無しさん
2008/05/04(日) 01:47:110478デフォルトの名無しさん
2008/05/04(日) 02:02:58正直すまんかった。
0479デフォルトの名無しさん
2008/05/04(日) 02:30:35無限ループしてるスレッド関数を終了させるにはどうするのが良いでしょうか?
やはりクラス化してメンバ変数に終了フラグを用意してあげるのが無難ですかね
0480デフォルトの名無しさん
2008/05/04(日) 02:46:430481デフォルトの名無しさん
2008/05/04(日) 02:54:13最適化抑制ですか
最適化抑止といえばイマイチ何処を最適化抑止していいのかわからんのです
0482デフォルトの名無しさん
2008/05/04(日) 02:56:380483デフォルトの名無しさん
2008/05/04(日) 08:00:07中身全部の抑止してくれるんだっけ?
あとポインタに付けた場合はポイント先も
抑止するんでしたっけ?
0484デフォルトの名無しさん
2008/05/04(日) 10:29:12ただ、volatile クラスや構造体には面倒くさい話があって、
volatile オブジェクト用のコピーコンストラクタや代入演算子が自動的に生成されないので
自分で作らなければならないのと、
volatile メンバ関数か const volatile メンバ関数しか呼ぶ事ができないという制約がある。
0485デフォルトの名無しさん
2008/05/04(日) 16:06:180486デフォルトの名無しさん
2008/05/04(日) 16:22:270487デフォルトの名無しさん
2008/05/04(日) 17:36:50どういうシーンで抑止しておけば良いの?
0488デフォルトの名無しさん
2008/05/04(日) 17:50:31あと、オーバーフローが発生しないことがほぼ確実に保証されてるとき、
if( a と b が等しいとき) return 1; を if( オーバーフローが発生していないとき) return 1;
に書き換えても問題ないような気がします。実際にこのような書き換えをおこなったとき
発生しうる問題はどのようなものが考えられるでしょうか?
お暇な方いましたら、ご回答のほどお願いします。
0489デフォルトの名無しさん
2008/05/04(日) 18:00:27最適化 抑制 volatile あたりで検索すると、例が幾つか出てくると思う。
0490デフォルトの名無しさん
2008/05/04(日) 18:17:15class 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);
}
0491デフォルトの名無しさん
2008/05/04(日) 18:23:37C/C++ の範囲ではオーバーフローを検知する手段はない
浮動小数点なら処理系が関数を用意しているかも知れない
前の if と後の if では意味が違うんでは?
0492デフォルトの名無しさん
2008/05/04(日) 18:38:16> C/C++ の範囲ではオーバーフローを検知する手段はない
なるほど、そうですか。分りました。
> 前の if と後の if では意味が違うんでは?
そうですね。
if( a と bが等しいとき)
{
return 1; // 入力されたパスワードが正しいものとする
}else{ exit(-1); // 入力されたパスワードが間違っているので終了 }
を
if( オーバーフローが発生していないとき)
{
return 1:
}else{ exit(-1); }
としたとき何か問題はあるかな?条件を書き換えて常にフラグが立つ(立たない)ようにしてやれば
パスワードチェックが意味をなさなくなるかな?かな?というのが疑問。
0493デフォルトの名無しさん
2008/05/04(日) 19:21:43そのデストラクタはいつ呼ばれるのかね。
deleteしたときではないのかね。
0494デフォルトの名無しさん
2008/05/04(日) 19:22:27入門サイトなどで「スコープ」「自動変数」「delete」「デストラクタ」について勉強。
>>492
オーバーフローが何か分かってる?
意味が分からないよ。
0495デフォルトの名無しさん
2008/05/04(日) 20:31:45if(デストラクタが呼ばれる == 今まさに開放される途中){
デストラクタ内でdeleteする = 開放途中のオブジェクトを開放;
}
0496デフォルトの名無しさん
2008/05/04(日) 21:12:48ありがとう、これでは解放されないんだね。
0497デフォルトの名無しさん
2008/05/04(日) 21:20:22int 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); //こうした場合コンストラクタが呼ばれスコープを抜けると自動的にデストラクタが呼ばれる
}
0498デフォルトの名無しさん
2008/05/04(日) 21:46:55matherr(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
0499498
2008/05/04(日) 21:48:14cygwin/WindowsXP, gcc 3.4.4
Vine Linux 4.2/gcc4
です。
0500デフォルトの名無しさん
2008/05/04(日) 21:54:27引数に対して const修飾子 を付加すべきという説明を見かけて、
それ以来、上記に該当するメソッドは全て引数に const を付加しています
また、クラスのメンバに変更を加えないメソッドは、
全てメソッド宣言の後に const を付加しています。
しかし、他所のソースを見ていると、
const をいちいち付けてるソースをあまり見かけません。
const を付けるソースって無駄な労力を費やしてるのでしょうか。
勉強不足で申し訳ありません、よろしくお願い致します。
0501デフォルトの名無しさん
2008/05/04(日) 21:56:06普通に compile できるけど。出力は 2.302585:nan:nan で予想どおり。
matherr 定義して全然使ってないんじゃない? compile には問題ないはずだけど。
0502デフォルトの名無しさん
2008/05/04(日) 21:58:33>何が間違っているのでしょうか?
「うまくコンパイルできない」のにエラーメッセージも書かない捻くれた根性。
0503デフォルトの名無しさん
2008/05/04(日) 21:59:07基本的にプログラマは怠け者ってことと、通常教えたりする時には
const はかえって説明する事を増やすからそれを説明する時じゃ
なければ使わない事が多い。しかし const を使うのは決して無駄な労力じゃない。
実際 coding していれば compile error が出る事が事があるはずで
それから教えられる事はあるはず。安全のために付けましょう。
付けて悪いことはない。
0504デフォルトの名無しさん
2008/05/04(日) 22:00:41エラー発生時にユーザーが定義した matherr() を呼び出さないのでしょうか?
私が挙げた例では、ソースに記述している matherr() にある、
printf("%s domain error %lf\n", x->name, x->arg1);
を実行したいのです。
0505デフォルトの名無しさん
2008/05/04(日) 22:01:00引き数にconstをつけると、その関数内で変更することを防止できる。
逆に言えば、判ってて変更するなら別に制限する必要もないから書かない人が多い。
ポインタ参照先やメンバ関数に関しては、呼び出し側に対する制限なのでつける方がいい。
0506デフォルトの名無しさん
2008/05/04(日) 22:01:50ってぐぐったら出てきたけどホンマかな
0507デフォルトの名無しさん
2008/05/04(日) 22:03:11私の語句が稚拙でした。
コンパイル自体は通り、エラーも warning もないです。
0508デフォルトの名無しさん
2008/05/04(日) 22:03:56>>505
レスありがとうございました、勉強になります。
0509デフォルトの名無しさん
2008/05/04(日) 22:04:470510デフォルトの名無しさん
2008/05/04(日) 22:04:53なつかしいなw
0511デフォルトの名無しさん
2008/05/04(日) 22:08:47たしかに/usr/include/math.h を覗いてみると、「 SVID のもとで定義されている」みたいですね。
コンパイルしてもエラーにならないのに、使えないのは不思議なのですが。
0512デフォルトの名無しさん
2008/05/04(日) 23:12:07仮想関数のアドレスを取ろうとしました。
と怒られてしまうのでやっぱり無理なのでしょうか?
0513デフォルトの名無しさん
2008/05/04(日) 23:18:400514デフォルトの名無しさん
2008/05/04(日) 23:19:360515デフォルトの名無しさん
2008/05/04(日) 23:27:460516デフォルトの名無しさん
2008/05/04(日) 23:31:060517デフォルトの名無しさん
2008/05/04(日) 23:31:16staticならOKですか・・・
純粋仮想関数を引数にとっていて
継承によって渡す関数を変えたかったのですが
staticならOKとなると結構変更が大きいなぁ
0518デフォルトの名無しさん
2008/05/04(日) 23:34:220519デフォルトの名無しさん
2008/05/04(日) 23:37:13struct 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 を書けば良いだけ
0520デフォルトの名無しさん
2008/05/04(日) 23:38:23void*型のデータを別に渡せるから、そこにthisを注入すべし
0521デフォルトの名無しさん
2008/05/05(月) 00:01:13第3引数にthisを渡すんですよね
そうすると、今まで使ってた第3引数は別のメンバ関数でクラス内部に持たさないといけないか・・・
0522デフォルトの名無しさん
2008/05/05(月) 00:06:51必要なら構造体を渡す手もあるぞ
struct ThreadData {
...
};
_beginthread(.., new ThreadData(...));
とやって、スレッド関数の中でデータをdeleteする。
0523デフォルトの名無しさん
2008/05/05(月) 00:23:05え、そのためのboost::threadって?
0524デフォルトの名無しさん
2008/05/05(月) 00:29:18boost:function渡せばいいんだから、余裕でできるでしょ。
0525デフォルトの名無しさん
2008/05/05(月) 02:26:45class 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 () なメンバ関数しか渡せない・・・こういうことやってくれるライブラリってありそうだけど、どうやってんだろ
0526デフォルトの名無しさん
2008/05/05(月) 02:40:240527デフォルトの名無しさん
2008/05/05(月) 12:00:43呼び出す時、派生クラスのメンバ初期化を先に書くべきですか?それともスーパークラスの初期化を先に書く
べきですか?
super::super(int a); というコンストラクタがある時
hasei::hasei() : super(10), hasei_member1(10),... と書くべきか、
hasei::hasei() : hasei_member1(10), super(10),... と書くべきでしょうか?
よろしくお願いします。
0528デフォルトの名無しさん
2008/05/05(月) 12:15:240529デフォルトの名無しさん
2008/05/05(月) 13:12:27それぞれ宣言順に実行される。
例えば
class E : public A, public B { C c; D d; };
なら、A, B, c, d, E の順にコンストラクタが呼ばれる。
だから、初期化子もこの順に書いた方が紛らわしくないし、
そう書かなかった場合に警告出すコンパイラもあるから、
この順に書いた方がいい。
0530デフォルトの名無しさん
2008/05/05(月) 15:02:59int 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;
}
このスクリプトなのですが、コンパイル時に「ポインタの不正な使用」と出てきてコンパイルできません。
ググってみたのですがよくわかりませんでした。何がおかしいのでしょうか?
0531デフォルトの名無しさん
2008/05/05(月) 15:08:47エラーメッセージを貼れと何度言ったら…
randってなんだよ?ってことだ。
0532デフォルトの名無しさん
2008/05/05(月) 15:10:090533デフォルトの名無しさん
2008/05/05(月) 15:11:11すみません。下のようなエラーが出ます。
エラー E2087 testx.c 17: ポインタの不正な使用(関数 dice )
エラー E2087 testx.c 18: ポインタの不正な使用(関数 dice )
警告 W8057 testx.c 20: パラメータ 'a' は一度も使用されない(関数 dice )
警告 W8057 testx.c 20: パラメータ 'b' は一度も使用されない(関数 dice )
stdlib.hは一応インクルードしているのですが……。
0534デフォルトの名無しさん
2008/05/05(月) 15:18:070535531
2008/05/05(月) 15:20:41だからrandが何か考えればわかるだろってこと。
randは関数なのにそのアドレスを6で割ろうとすれば型があわねぇからポインタの不正な使用ということになる。
0536デフォルトの名無しさん
2008/05/05(月) 15:21:12てゆーかこの使い方だと同じ値しかでないなw
0537デフォルトの名無しさん
2008/05/05(月) 15:21:54そういう意味でしたか、てっきりポインタの利用に間違いがあるのかと思っていました。
ありがとうございました!
0538デフォルトの名無しさん
2008/05/05(月) 15:22:11randの使い方を調べてみれ
0539デフォルトの名無しさん
2008/05/05(月) 16:21:410540デフォルトの名無しさん
2008/05/05(月) 16:40:590541デフォルトの名無しさん
2008/05/05(月) 16:46:37いいえ。「一回でいい」のではなく、「一回でなければいけない」のです。
0542デフォルトの名無しさん
2008/05/05(月) 16:55:23srandの引数にtime使ってるんだから、一概にそうとは言えない。
diceを使うタイミングしだい。
0543デフォルトの名無しさん
2008/05/05(月) 17:02:40ちょっと誤解があるんじゃね?
たぶん>>536に関してはrand関数のアドレスを使えば常に同じ値になってしまうという意味で、
srandとは無関係のレスだと思う。
0544デフォルトの名無しさん
2008/05/05(月) 17:03:070545デフォルトの名無しさん
2008/05/05(月) 17:09:17diceが連続で呼ばれない保証でもない限り
「一回でなければいけない」だろ。
0546デフォルトの名無しさん
2008/05/05(月) 17:13:270547デフォルトの名無しさん
2008/05/05(月) 17:16:16ボケっ!
0548デフォルトの名無しさん
2008/05/05(月) 17:24:46void dice(int *a, int *b);
0549デフォルトの名無しさん
2008/05/05(月) 17:25:40回数の問題じゃないだろう
0550デフォルトの名無しさん
2008/05/05(月) 17:37:00srandで乱数の元となる数字を変えて、乱数っぽくなるようにしてる
0551デフォルトの名無しさん
2008/05/05(月) 17:38:55やり取りで何が問題なのか自分で気が付くと思うが。
もし分からないならまた質問してねってことで。
0552デフォルトの名無しさん
2008/05/05(月) 17:44:59下手するとこれが、全部同じ目になるってことか
0553デフォルトの名無しさん
2008/05/05(月) 17:53:200554デフォルトの名無しさん
2008/05/05(月) 17:55:450555デフォルトの名無しさん
2008/05/05(月) 18:31:080556デフォルトの名無しさん
2008/05/05(月) 19:14:41なんのパラメータ?
仮にclock()がミリ秒単位の値を返すとしても、それをsrand()の入力に使ったのでは
今時のCPUにとっては余りに遅すぎて話にならないわけだが。
0557デフォルトの名無しさん
2008/05/05(月) 19:17:300558デフォルトの名無しさん
2008/05/05(月) 19:24:490559デフォルトの名無しさん
2008/05/05(月) 19:58:33話の流れ読めて無さ杉だろw
0560553
2008/05/05(月) 20:06:56sleepは1秒単位なのか。Win32のSleepが�_秒だからうっかり。
ということで、sleep(1);を入れれば万事解決ということで。
0561デフォルトの名無しさん
2008/05/06(火) 00:03:06> 今時のCPUにとっては余りに遅すぎて話にならないわけだが。
で、↑こっちはどうしたらいい? 放っておく?
0562デフォルトの名無しさん
2008/05/06(火) 01:57:370563デフォルトの名無しさん
2008/05/06(火) 11:56:430564デフォルトの名無しさん
2008/05/06(火) 12:05:440565デフォルトの名無しさん
2008/05/06(火) 12:32:49ありがとうございます
type_traitsに色々判定用のがあるんですね
0566デフォルトの名無しさん
2008/05/06(火) 12:37:28template<class AryT, size_t N>
void arrayargfunc(AryT (&ary)[N])
0567デフォルトの名無しさん
2008/05/06(火) 14:43:15[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC++ 9.0
[3.3] 言語: C/C++
C/C++ で大きな数値を扱うにはどうすればよいでしょうか?
たとえば、円周率を小数点以下10万桁求めるとか、20000!を求めるとか。
long double を使った階乗を求める自作関数では、170! までが精一杯でした。
どうすれば巨大なデータを取り扱うことができるのか、想像も出来ません。
どなたか、ヒントだけでも教えてください。よろしくお願いします。
0568デフォルトの名無しさん
2008/05/06(火) 14:48:150569デフォルトの名無しさん
2008/05/06(火) 14:50:110570デフォルトの名無しさん
2008/05/06(火) 14:51:09ありがとうございます。早速調べてみます。
0571デフォルトの名無しさん
2008/05/06(火) 17:17:45一応CマスターしたらWindowsプログラミングしたいと思ってる
0572デフォルトの名無しさん
2008/05/06(火) 17:34:35二冊目として評価が高いようです。
0573デフォルトの名無しさん
2008/05/06(火) 17:44:43ttp://www.amazon.co.jp/dp/4797331631/
0574デフォルトの名無しさん
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;
}
0575デフォルトの名無しさん
2008/05/06(火) 17:59:29Amazonの評価低めなんだけどどうなんだろ
>>573
�dクス。検討してみる
0576デフォルトの名無しさん
2008/05/06(火) 18:03:150577デフォルトの名無しさん
2008/05/06(火) 18:07:43コピーコンストラクタでも、コピー代入演算子でも可能。
0578デフォルトの名無しさん
2008/05/06(火) 18:12:07そのまま出力してくれるのがあったと思うのですが、
どなたかご存知ですか?
0579デフォルトの名無しさん
2008/05/06(火) 18:15:270580デフォルトの名無しさん
2008/05/06(火) 18:18:310581デフォルトの名無しさん
2008/05/06(火) 18:21:42いえ、プログラム中で逐一fprintf()を使わないで、
コンソール(DOS)での表示をそのままファイルへ出力してくれる関数があったと思うのですが。
もちろんプログラムの始めと終わりにファイルオープン・クローズの操作は必要だったと思いますが。。。
たとえばコンソールプログラムのその表示をそのままファイルへ保存して、
実行終了後にprintfデバッグのように眺める、デバッグ用変数を使わずに済むなどメリットがあったと思います。
0582デフォルトの名無しさん
2008/05/06(火) 18:26:35これか?
freopen("stdout.txt", "w", stdout);
0583デフォルトの名無しさん
2008/05/06(火) 18:28:10reinterpret_cast などの新しいキャストの使用が推奨されてるので、
キャストの目的をハッキリさせるため積極的に使用しております。
しかし、ウィンドウプロシージャ周りなどのキャストが多く発生する場面では
ソースが長ったらしくなって、何となく気持ち悪いです。。。
ちょっと不安になってきたのですが、
型変換は全て新しいキャストを使用する姿勢のままで良いのでしょうか。
0584デフォルトの名無しさん
2008/05/06(火) 18:30:33To r_cast(const From& f) { return reinterpret_cast<To>(f); }
0585デフォルトの名無しさん
2008/05/06(火) 18:30:52関数じゃなくてコマンドプロンプトのリダイレクトのことじゃね?
C:\>app_name.exe > file_name.txt
0586デフォルトの名無しさん
2008/05/06(火) 18:34:29良い。
0587デフォルトの名無しさん
2008/05/06(火) 18:34:55レスありがとうございます。
0588デフォルトの名無しさん
2008/05/06(火) 18:38:45なるほど。そういうのもあるんですね。
前に便利だと思ったきり使わないでいたので忘れてしまいましたが、
...
fopen...
hoge_printf利用宣言
...Program Body
printf("hoge statement 1\n");
...
printf("hoge statement 2\n");
...
fclose...
というような使い方で、出力ファイルのテキスト内容が、
hoge statement 1
hoge statement 2
となるようなものだったのですが。
0589デフォルトの名無しさん
2008/05/06(火) 18:41:40リダイレクトってたとえば、VC++のデバッグ時にブレークしながらまた変数代入操作しながら使えましたっけ?
これができないと先の関数が生きてこないと思われて。
0590デフォルトの名無しさん
2008/05/06(火) 18:49:06とりあえず、freopenを使ってみます。教えてくれてありがとう。
0591デフォルトの名無しさん
2008/05/06(火) 19:00:51使ってみました。
stdioをそのまま流してしまうので、コンソールに表示されないので、
ファイルを幾一オープンしなおす必要がありますね。
VC++では、ブレークポイントがそのまま使えるので(当然ですが)、
それで何とか操作しながら出力させるようにしないといけないみたいです。
0592デフォルトの名無しさん
2008/05/07(水) 18:05:42があって、新しい領域に移動したいとき、素直に書くと(多分)こうなると思いますが、
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使えとかはなしで・・・
0593デフォルトの名無しさん
2008/05/07(水) 19:22:480594デフォルトの名無しさん
2008/05/07(水) 19:36:350595デフォルトの名無しさん
2008/05/07(水) 20:31:52visualstdio2005から2008に乗り換えたのですが
2005にあった機能のデバックなしで実行という機能がなくなっています・・・。
2008でデバックなしで実行 の機能はないのですか?
0596デフォルトの名無しさん
2008/05/07(水) 20:34:39俺の2008には[デバッグなしで開始(H) Ctrl + F5]がちゃんとあるんだが・・・
2005は入れてないんでわからん。
0597デフォルトの名無しさん
2008/05/07(水) 20:36:560598デフォルトの名無しさん
2008/05/07(水) 20:41:160599デフォルトの名無しさん
2008/05/07(水) 20:50:08class A {};
A DoNothing ( A object)
{
return object;
}
main()
{
A object;
DoNothing(object);
}
を実行するとコンストラクタは何回呼ばれますか?
ってやつなんだけど、正解は1回なのはなんで?
DoNothing(object);でも(コピー)コンストラクタ呼ばれるんじゃないの?
0600デフォルトの名無しさん
2008/05/07(水) 20:51:390601デフォルトの名無しさん
2008/05/07(水) 20:53:370602デフォルトの名無しさん
2008/05/07(水) 20:57:180603デフォルトの名無しさん
2008/05/07(水) 20:58:230604デフォルトの名無しさん
2008/05/07(水) 21:02:50public:
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
ってなったんですが、やっぱコピーコントラクタが理由じゃないんですか?
0605デフォルトの名無しさん
2008/05/07(水) 21:08:360606デフォルトの名無しさん
2008/05/07(水) 21:09:54やっぱり世間ではコピーコンストラクタはコンストラクタに含めないんですかね?
>>602-603
確かにコンパイラによっては消してしまいそう。
0607デフォルトの名無しさん
2008/05/07(水) 21:12:43A は POD 型なのでデフォルトコンストラクタは呼ばれない。
これは確か。
あとは空クラス(構造体)を関数に渡した際には
オーバーロードの解決にしか使われないとかいう仕様があれば
戻り値でのコピコンしか呼ばれないってことになりそうな予感がするよ。
0608デフォルトの名無しさん
2008/05/07(水) 21:22:482個のフォームを用意してボタンクリックイベントで、
他方を開く、自分を閉じる(隠す)をしたいんですけれども
//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を書けばいいのかがわかりません。
お願いします
0609デフォルトの名無しさん
2008/05/07(水) 21:28:13Form2^ 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++なんてやったことないからこんな書き方ができるのかどうか知らん
0610デフォルトの名無しさん
2008/05/07(水) 21:30:29・・・
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();
・・・
0611デフォルトの名無しさん
2008/05/07(水) 23:06:11具体的な例ですと、
int(32bit)の上位16bitをそのままshort(16bit)にコピーしたいのですが…
(1/256されてshortになる)
256で割って代入しろと言いたいところでしょうけど、事情がありまして。
0612デフォルトの名無しさん
2008/05/07(水) 23:07:48共用体
0613デフォルトの名無しさん
2008/05/07(水) 23:08:59右シフトでもだめ?
0614デフォルトの名無しさん
2008/05/07(水) 23:12:230615デフォルトの名無しさん
2008/05/07(水) 23:29:110616デフォルトの名無しさん
2008/05/07(水) 23:34:00mov eax, int変数
mov short変数, ax
}
これで解決
0617デフォルトの名無しさん
2008/05/07(水) 23:35:35シフト使わないとダメだね
0618デフォルトの名無しさん
2008/05/07(水) 23:37:37バイナリ形式でsizeof(int)でファイルに書き込んで
読みだすときにsizeof(short)で読み出せばいいんだ
うん!型変換はしてないな!
0619デフォルトの名無しさん
2008/05/07(水) 23:38:490620デフォルトの名無しさん
2008/05/07(水) 23:45:06共用体は甲斐ビット(上位アドレス?)にしかアクセスしないと思ったのですが…
>>613
ちょっと他にもアクセスしたい理由がありまして…
>>614
どちらかというと、intとかshortよりも、ビット数の方を重視願います
>>616
試してみます。
…てか、アセンブリ使えたの知りませんでした…
>>619
そうでしたww
きっとみんな心の目で256の後ろに書いてある文字を読んでくれたんだw
0621デフォルトの名無しさん
2008/05/07(水) 23:50:09int i;
short s[2];
}
int_short is;
is.s[0]; // LOWORD
is.s[1]; // HIWORD
こうすれ
0622デフォルトの名無しさん
2008/05/07(水) 23:51:05#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;
}
0623デフォルトの名無しさん
2008/05/07(水) 23:51:58int 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;
}
0624デフォルトの名無しさん
2008/05/07(水) 23:52:04下位から詰められるならdummyでも置いとけば済むはなしでは?
0625デフォルトの名無しさん
2008/05/07(水) 23:52:59なるほど。
ありがとうございました!!
0626611,620,625
2008/05/07(水) 23:55:42ダミー詰める事思いつきませんでした…orz
0627デフォルトの名無しさん
2008/05/08(木) 00:00:09{
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);
}
既出か?
0628デフォルトの名無しさん
2008/05/08(木) 00:13:200629デフォルトの名無しさん
2008/05/08(木) 00:56:59それはC++/CLIという、C++の上位互換の別言語。
スレとしては↓なんだけど、過疎気味。
http://pc11.2ch.net/test/read.cgi/tech/1206447234/
こっちのスレでも答える人が居ればいいけど・・・。
0630デフォルトの名無しさん
2008/05/08(木) 01:08:54std::istream &operator>>(std::istream &is, classname &obj) {
is >> obj.member >> std::endl;
}
のように、最後にendlをつけたら駄目ですよね?付けても付けなくてもOKとかじゃなくて、
付けたらだめですよね?
0631デフォルトの名無しさん
2008/05/08(木) 02:14:010632デフォルトの名無しさん
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);
}
システムコールで検索したのですが、どのようなものかよくわからなったので…
0633デフォルトの名無しさん
2008/05/08(木) 02:47:58複数のファイルを一括して管理してなるべくHDDへのアクセスを減らすやつです。
0634デフォルトの名無しさん
2008/05/08(木) 03:49:39NOバッファにして自分で管理しても、速度は上回りませんか?
0635デフォルトの名無しさん
2008/05/08(木) 04:03:43たとえば、テンプレート無しだと、つぎの様に判明しますが、
f( int &x) { //xのサイズは4バイト}
f( double &x) { //xのサイズは8バイト}
ここで参照とテンプレート使ってもサイズは判明しますか?
0636デフォルトの名無しさん
2008/05/08(木) 09:07:02ケースバイケース。実測すれ。
0637デフォルトの名無しさん
2008/05/08(木) 10:39:36Form1.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ファイルのインクルードをした際に
おかしくなっているのだと思います
レスしてもらったやり方で試したのですがエラーが増えただけでした
どなたかお願いします
0639デフォルトの名無しさん
2008/05/08(木) 11:19:44↑のプログラムを実行したらうまく動作しなかったのですが、どこをどう直せばいいか教えて下さい。
お願いします。
0640デフォルトの名無しさん
2008/05/08(木) 11:29:06うまく動作しなかったってのはコンパイルは通ったの?
0641639
2008/05/08(木) 11:35:08コンパイルは通ったんですけど、maxとminの値がありえない数字になるんです
0642デフォルトの名無しさん
2008/05/08(木) 11:40:51どこかで
x.max = 0;
x.min = 100;
あと、Cではブロックの途中での変数宣言は認められないよ
0643デフォルトの名無しさん
2008/05/08(木) 11:41:34maxを初期化しろ
0644デフォルトの名無しさん
2008/05/08(木) 11:41:58あと他に一箇所間違いがあるけど。
0645デフォルトの名無しさん
2008/05/08(木) 11:42:100646デフォルトの名無しさん
2008/05/08(木) 11:46:22そうなのか
0647641
2008/05/08(木) 13:24:52ありがとうございます
x.max=0;
x.min=100;
で初期化してみたのですが、その値がそのまま結果表示されてしまいました。
0648デフォルトの名無しさん
2008/05/08(木) 13:33:04お前どこで初期化したの?
forループより前でやれよ
0649647
2008/05/08(木) 13:39:06forループの前で初期化しました
0650デフォルトの名無しさん
2008/05/08(木) 13:45:02for(i=0;i<4,i++;)
0651647
2008/05/08(木) 14:08:05ありがとうございます
訂正したらうまくいきました!
0652デフォルトの名無しさん
2008/05/08(木) 14:36:21特定のマルチバイト文字の文字列が出てきたらそれ用の処理、
特定のASCII文字の文字列が出てきたらそれ用の処理、
みたいなことをしたいのですが、どういった書き方をすればよいでしょうか??
アドバイス頂けると幸いです。
0653デフォルトの名無しさん
2008/05/08(木) 14:38:190654652
2008/05/08(木) 14:41:130655デフォルトの名無しさん
2008/05/08(木) 14:56:540656デフォルトの名無しさん
2008/05/08(木) 15:00:360657652
2008/05/08(木) 15:02:16std::string です。
0658デフォルトの名無しさん
2008/05/08(木) 15:03:370659デフォルトの名無しさん
2008/05/08(木) 15:16:46混在させたらマルチバイト文字セット内の1バイト文字の一部とASCII文字で
コードポイントがかぶっちゃうから、混在は難しいんじゃないかな。
ASCII の バックスラッシュと、Shift_JIS の1バイト¥マークとか。
それはともかくとして、std::string はただのコンテナと割り切ってポインタ使って
普通に書いた方がいいと思うが。
0660デフォルトの名無しさん
2008/05/08(木) 15:21:08ソースはこちらです→
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6476.txt
*整数を5件入力させる→降順にソートする→ソートしたものを表示する
ここまで(プログラムの本題)は出来たのですが、
オマケである
*入力された文字を判断し、半角数字以外が入力された場合はエラーを表示し、再入力させる
この関数を作成し、main関数と繋げる事が上手く出来ません。
半角数字の場合は問題なく作動していますが、それ以外の場合が指定通りに作動してくれません。
なるべく自力で作らなければ意味がないので、答えよりもヒントや考え方を望んでいます。
Google先生を頼りにここまで出来ましたが、C言語を始めてまだ1ヶ月と少々で分からない事ばかりです。
judge()の部分は今後も使うので、もしおかしな部分があればそちらもご教示願います。
宜しくお願いします。
0661デフォルトの名無しさん
2008/05/08(木) 15:29:31int *s;
{
…
return 0;
}
なにこれ?
0662652
2008/05/08(木) 15:33:24レスどもです。
文字コードが同じものがある場合については、仕方がないので双方とも同じものとして扱う、というやり方を考えていました。
>> ともかくとして、std::string はただのコンテナと割り切ってポインタ使って
>> 書いた方がいいと思うが。
ただのコンテナとして割り切るというのは、どういうことでしょうか?このような場合はstringは使わない方がいいということでしょうか。
また、普通ポインタ使って書く、というのは、具体的にどういうことなんでしょうか。
ご教示いただけると幸いです。
(ちなみに、話に出しているのはとあるライブラリのメソッドから返ってくる値を走査するものなのですが、そのメソッドがstring型しか返してくれないんです。)
0664デフォルトの名無しさん
2008/05/08(木) 15:38:000665デフォルトの名無しさん
2008/05/08(木) 15:39:13judge(int *s){
うんたらかんたら;
}
じゃね?ってことが言いたかったんだが
0666デフォルトの名無しさん
2008/05/08(木) 15:39:20古い書き方
>>660
mainでscanfで%dで読み取れた時点で、それが数値であることは確定しているので、そのjudgeの処理はまったくの無駄
scanfは、読み取れたデータの個数を返すので、scanfの戻り値が1じゃなかった場合は数値を読み取れなかった=数値じゃないものが入力されたと判断できる
再入力させる場合は、さっき読み取れなかったデータは読み捨てる必要があるので、改行まで来るまでgetcを回すとか、scanfで%sして捨てるとかするといいかも
0667660
2008/05/08(木) 16:20:00古い書き方ですか…orz
>>666
judgeでの処理は丸々無視されているという事でしょうか。
理解不足で申し訳ないのですが、
>再入力させる場合は、さっき読み取れなかったデータは読み捨てる必要があるので、改行まで来るまでgetcを回すとか、
>scanfで%sして捨てるとかするといいかも
こちらの部分を詳しく教えていただけると幸いです。
そもそも入力方法に問題あり?
まだまだ勉強不足か…。
0668デフォルトの名無しさん
2008/05/08(木) 16:36:11そもそもjudgeは引数でintを受け取るのだから、どんなintの値を渡したところで、半角数字以外と判定されることはありえない (※マイナスはある)
再入力の方は、scanfの動作をもうちょっとよく知る必要がある
int s, n;
n = scanf("%d", &s);
このようにしたとき、%dは数値入力の指示なので、数値が入力された場合はそれが読み取られ、sにその値が入って、nに1が返される
数値以外が入力された場合は、何も読み取られず、nに0が返される
ここで、何も読み取られないというのは、その文字列はまだ入力バッファに残っていて、次回scanf等を呼んだときに再び現れるという意味
そこでまた%dしても、その文字列は数値ではないので、何も読み取られず、また入力バッファに残ったままになる
この文字を何か他の方法 (getcとか%sとか何でもいい) で読み取って捨てない限り、%dは永久に成功しない
0669ブロンズ
2008/05/08(木) 16:49:56Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
って出たり
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
のhPrevInst lpsCmdLine nCmdShow が未使用ってでたり。
ソースは間違ってるはず無いんですよ。付録のCDのサンプルをコンパイルしただけなのに。
何が原因なんでしょうか?
0670デフォルトの名無しさん
2008/05/08(木) 16:54:05未使用のやつは警告だから気にしなくておk
0671ブロンズ
2008/05/08(木) 17:04:16ありがとうございます。秒殺でした。^^
0672デフォルトの名無しさん
2008/05/08(木) 17:14:43x文字目からy文字目までで"sample"という文字列がでてくるかどうか、探索
みたいなことがしたいのですが、一回substrを使わないと無理でしょうか??
0673デフォルトの名無しさん
2008/05/08(木) 17:19:18int len = str.size();
for (int i = x; i <= y && i < len-6; i++)
{
if (strcmp(s+i, "sample")==0) { hoge; }
}
0674デフォルトの名無しさん
2008/05/08(木) 17:36:15なるメンバ関数があったはずだが
0675660
2008/05/08(木) 17:39:05丁寧な説明をありがとうございます。
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)を置いてみましたがうまくいきませんでした。
後半部分は大体理解出来ましたが具体的な方法は現在まだ調べ中です。
何度もすみません。
0676672
2008/05/08(木) 17:45:07size_type find(const char* s, size_type pos, size_type n) const
このメンバ変数、ありました。ありがとうございましたm(_ _)m
0677デフォルトの名無しさん
2008/05/08(木) 17:53:20>mainから受け取った物がjudgeでは!isdigitが真と判断された場合-1を返して、
>25行目あたりのjudge(&s)の下に、if(s<0)を置いてみましたがうまくいきませんでした。
sは戻り値とは違うので。
n = judge(&s);
if(n<0)
こうじゃない?
0678660
2008/05/08(木) 18:44:46!!!
そうでした。
現状はhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6483.txtです。
これだとまずコンパイラ出来ませんが・・・orz
エラー文→declaration for parameter 'a' but no such parameter
作業出来る環境から離れるので、以降実行が出来ません。
もう少し自分なりに調べてみますが、それでも解決出来ない場合はまたお尋ねするかもしれません。
スレをたくさん使って申し訳ないです。
0679デフォルトの名無しさん
2008/05/08(木) 20:06:37> Cではブロックの途中での変数宣言は認められないよ
C99では使えるよ。
0680デフォルトの名無しさん
2008/05/08(木) 20:08:280681ブロンズ
2008/05/09(金) 00:39:32コンパイルしたら
LRESULT が複数あるとか、再宣言の型が一致しないとかでるんですよ。
そんなとこひな型つくってからいじくってないのに。
どうすればいいですか?
0682デフォルトの名無しさん
2008/05/09(金) 00:42:220683ブロンズ
2008/05/09(金) 01:07:30エラー 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
0684デフォルトの名無しさん
2008/05/09(金) 01:11:030685デフォルトの名無しさん
2008/05/09(金) 01:13:33付録のCDのサンプルが間違ってるはずない?なぜだろうか
まさかとは思うが猫でもわかるなんたらかんたらじゃなかろうか
0686ブロンズ
2008/05/09(金) 01:18:01http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6492.txt
めっちゃはずいっす
お願いします
0687デフォルトの名無しさん
2008/05/09(金) 01:26:150688デフォルトの名無しさん
2008/05/09(金) 01:30:11vector<char> dt;
と定義したdtを、関数の返り値にできるのでしょうか?
0689ブロンズ
2008/05/09(金) 01:33:48ありがとうございます。
だいぶエラーがへりました。凡ミスでおはずかしい。
あとは細かいパラメータなんですが、イマイチわからないです。
もっと研究してみます。
0690デフォルトの名無しさん
2008/05/09(金) 01:44:53試せば分かることじゃないか
どういう使い方をするか知らないけど、
普通に引数で渡した方がいいと思うけど
0691デフォルトの名無しさん
2008/05/09(金) 02:57:41他人のコードを見ると、普通に使われてるような気がします。
本当はダメなんだけど、使っても問題ないことがおおいってことですかね。(それとも↑がウソで、まったく問題ないのか)
あと、 typedef struct _hoge { ... } hoge; って感じで(両方hogeじゃなくて)違う名前にするのは、何か利点があるんですか?
0692デフォルトの名無しさん
2008/05/09(金) 03:06:56まともなコンパイラなら警告やエラーを吐く
そうじゃ無い時代、コンパイラの話なんじゃ、と思うけどね…
そんなの自分や会社のルール、規則で好きにスタイルを決めれば良いと思うが
typedefの使い方は
struct _hoge -> hoge とする
つまり、struct付いてようが同じ名前にしたくないって感じじゃねーの
それかコンパイラ依存だけど、同名だとコンパイル出来ない環境があるとか
0693デフォルトの名無しさん
2008/05/09(金) 03:27:30具体例をどうぞ。
>それかコンパイラ依存だけど、同名だとコンパイル出来ない環境があるとか
C++だとエラーですね。
知識がないなら無理に回答しなくても宜しいかと。
0694デフォルトの名無しさん
2008/05/09(金) 03:59:52エラーをはく場合があるのはたしか
しかしCではないがその習わしのようなものを受け継いだウェブプログラミング言語では
エラーはおこらないと言っていい(例:PHPなど)
全く参考にならなくて申し訳ないが
0695デフォルトの名無しさん
2008/05/09(金) 04:08:18具体例をどうぞ
>しかしCではないがその習わしのようなものを受け継いだウェブプログラミング言語では
>エラーはおこらないと言っていい(例:PHPなど)
>全く参考にならなくて申し訳ないが
あまりにも話題と関係なさすぎてワロタ
0696デフォルトの名無しさん
2008/05/09(金) 04:13:06顔真っ赤にしてそんなレスしてどうしたんだい?
おれでよければ相談に乗るよ?
0697デフォルトの名無しさん
2008/05/09(金) 04:18:470698デフォルトの名無しさん
2008/05/09(金) 04:18:48普通に使ってます
でもあんまりおすすめしません…その訳は…
0699デフォルトの名無しさん
2008/05/09(金) 04:20:17たしかになw
特に>>693と>>695はこんなスレでムキになりすぎだろ
0700デフォルトの名無しさん
2008/05/09(金) 04:31:22コンパイラを作成中ですので
気長にお待ちください。
0701デフォルトの名無しさん
2008/05/09(金) 04:36:420702デフォルトの名無しさん
2008/05/09(金) 08:03:52ちょっとそのレスはどうかと・・・
0703デフォルトの名無しさん
2008/05/09(金) 10:39:18名前が衝突して面倒な事になりたくなければ避けろ。
0704デフォルトの名無しさん
2008/05/09(金) 11:09:460705デフォルトの名無しさん
2008/05/09(金) 11:22:110706デフォルトの名無しさん
2008/05/09(金) 12:03:200707デフォルトの名無しさん
2008/05/09(金) 12:24:54「どうかと」ではなく、何か言いたければ具体的に。
悪いけど、>>693と>>695は確かにめちゃくちゃムキになってるようにしか見えない。
0708デフォルトの名無しさん
2008/05/09(金) 12:41:560709デフォルトの名無しさん
2008/05/09(金) 12:45:17>>691
自分は struct を付けるべきかどうか覚えておくのが面倒なので全部 typedef してます。タイプ量も減るし。
タグ名については先頭にアンダースコアを付けるのでなく末尾に _tag とでも付ければ問題ないのでは。
0710デフォルトの名無しさん
2008/05/09(金) 12:47:58typedef 必須だと前方参照が利かないから、タグ名に
変な修飾(アンダースコアとか _tag とか)つけないで欲しい。
0711デフォルトの名無しさん
2008/05/09(金) 12:59:13でもXLibとかMinGWのWindows関連ヘッダとかも似たような感じでタグ名付けてた気がしますが…
同名だと混同しやすいかなーと思ってたんですが、よくわからなくなってきた^^;
0712デフォルトの名無しさん
2008/05/09(金) 13:27:28http://www.kijineko.co.jp/tech/superstitions/tags-begin-in-underscore.html
0713デフォルトの名無しさん
2008/05/09(金) 13:31:13struct 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;
}
0714デフォルトの名無しさん
2008/05/09(金) 13:31:40typedef 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;
}
とかやってる。最近は書き方統一したいから全部最後の方法で書いてます^^
0715デフォルトの名無しさん
2008/05/09(金) 13:36:09おおお、これは知らなかった。ソースコード直してきます^^
0716デフォルトの名無しさん
2008/05/09(金) 13:36:38typedef struct hoge hoge; でいいじゃないか。
0717デフォルトの名無しさん
2008/05/09(金) 13:50:46713=714=715です。
その通りですね、間違いを含んだ回答をしてしまって申し訳ない^^;
便序して質問なのですが_で始まる変数は予約されている可能性がある。
って事は
ヘッダーの宣言でよく以下のような書き方をしていたんだけど
#ifndef _STRUCT_HEADER_
#define _STRUCT_HEADER_
/* 構造体の宣言とかプロトタイプ宣言とか */
#endif
これも危ないって事かな?
0718デフォルトの名無しさん
2008/05/09(金) 14:19:06先頭の_に大文字が続く識別子
__を含む識別子
グローバルかつ先頭の_に任意の文字が続く識別子
だった記憶がある
面倒だから先頭の_はやめとけと覚えた方が安全かと
0719688
2008/05/09(金) 14:32:50レスどもです。
vector<char> 型のオブジェクトを関数の返り値にするのはできたのですが、
vector<char>型のオブジェクトを
vector<char> dt;
....
fout << dt;
みたいに、ファイル出力しようとすると
no match for 'operator<<' in 'fout << dt'
みたいなエラーが出ました。
vectorオブジェクトはそのままファイル出力はできないのでしょうか??
0720デフォルトの名無しさん
2008/05/09(金) 14:43:36メンバ関数に<<がないから
std::copy(dt.begin(), dt.end(), std::ostream_iterator<char>(std::cout, ""));
とかにするしかない
0721デフォルトの名無しさん
2008/05/09(金) 16:29:39適当にコンテナをラップする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);
}
0722デフォルトの名無しさん
2008/05/09(金) 17:07:470x3cのような16進数を直接バイナリとしてostringstreamオブジェクトの中に書き込みたいのですが、どうすればよいのでしょうか??
ostringstream aaa:
aaa << 0x3c
などどすると、ASCII文字の文字列"60"として認識されてしまいます。
0723デフォルトの名無しさん
2008/05/09(金) 17:13:500724デフォルトの名無しさん
2008/05/09(金) 17:16:130725TOM
2008/05/09(金) 17:32:52class Interface { public: virtual int getValue() const = 0;};
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の値を表示できませんか?
0726デフォルトの名無しさん
2008/05/09(金) 17:36:520727デフォルトの名無しさん
2008/05/09(金) 17:38:33だってクラスAじゃないもの
0728デフォルトの名無しさん
2008/05/09(金) 17:41:55>>724
できました!ありがとうございます!
0729デフォルトの名無しさん
2008/05/09(金) 17:45:59private: Print p;
public:
virtual int getValue() const { return 1; }
void out() {
cout << "##" << A::getValue() << endl;
}
};
int main()
{
B b;
b.out();
}
0730TOM
2008/05/09(金) 17:53:000731デフォルトの名無しさん
2008/05/09(金) 17:57:330732デフォルトの名無しさん
2008/05/09(金) 17:59:080733デフォルトの名無しさん
2008/05/09(金) 18:00:02class 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));
}
};
0734デフォルトの名無しさん
2008/05/09(金) 19:10:08あまりいい説明じゃないと思います。根拠をしめせていません。
結論からいうと、extern な変数・関数はアンダースコアで始まる名前は避けた方がいいと考えています。
構造体/共用体/列挙体 タグや、autoな、あるいは static な変数、static な関数はアンダースコアで始まる識別子をつけても問題ありません。
0735デフォルトの名無しさん
2008/05/09(金) 19:13:31プリプロセッサの識別子はアンダースコアをつけても大丈夫です。
0736デフォルトの名無しさん
2008/05/09(金) 19:24:140737デフォルトの名無しさん
2008/05/09(金) 19:39:140738デフォルトの名無しさん
2008/05/09(金) 19:40:060739デフォルトの名無しさん
2008/05/09(金) 19:42:500740702
2008/05/09(金) 19:52:5730レスも空いてるからちょっと恐縮だけど、
具体的にとのことなので一応マジレス返答を。
「たしかに」と同調の言葉を言いつつ、「ムキなのはお前(達)の方」という
趣旨のレスをしていたから、
ちょっと痛い煽り返しだなって思って。
それで傍観してたけど思わずツッコミを。
それと、そこで>>699をリピートする必要は無いんじゃないかな。
>>697などがムキなのかどうかは知らないけど、
ムキだとするとあなた(達)の一連のレスも
同じくムキに(少なくとも俺には)見えるわけで。
0742デフォルトの名無しさん
2008/05/09(金) 19:58:27それなんてお前?
せっかく落ち着いてたのにぶり返すなよ
0743デフォルトの名無しさん
2008/05/09(金) 20:04:23昼は会社でレス出来ないんで、
半日くらいは大目に見て下さい・・・。
0744デフォルトの名無しさん
2008/05/09(金) 20:11:34半日は遅すぎなんだろww
0745デフォルトの名無しさん
2008/05/09(金) 20:21:27クラスのメソッドを宣言する時、クラスの外で宣言する方法と中で宣言する方法がありますが、大半の解説サイトは外で宣言しています。
VB.NETやC#を使っている経験から中で宣言したいのですが、皆そうしないのは何か特別な理由があるのでしょうか。
0746デフォルトの名無しさん
2008/05/09(金) 20:24:46別にどっちでもいいけど個人的には外に書いたほうが見やすい気がする
簡単なメソッド(etc. フィールドの値を返すだけ)なら中に書くとインライン展開される(正確にはされやすい)から中に書くこともあるけど
ちなみにC++ではフィールドをメンバ変数、メソッドをメンバ関数といいます
0747デフォルトの名無しさん
2008/05/09(金) 20:25:37中外の意味は class hoge {}; 内外だと理解してるけど、そうすると
スタイルの問題だな。好みかチームならポリシー。
長い場合は中で定義すると紛らわしいから外というのが普通だと思う。
そうなると、常に外というポリシーがシンプルで選択されやすい。
一人なら勝手にどうぞ。
0748デフォルトの名無しさん
2008/05/09(金) 20:28:03中に書くとヘッダに書くことになって、
変更すると、そのヘッダファイルをincludeしてるソースまで
再コンパイルが必要になるから。
ただinlineやテンプレートの関係で、中に書いた方適切な場合もある。
0749デフォルトの名無しさん
2008/05/09(金) 20:29:38循環参照があった場合にうまく解決できない
分割コンパイルできない
0750デフォルトの名無しさん
2008/05/09(金) 20:30:02Cのヘッダで宣言して別のファイルで定義する習慣を引き継いでいる。
0751デフォルトの名無しさん
2008/05/09(金) 20:37:32ありがとうございます。
C++では用語も違ったのですね、勉強になりました。
VB.NETやC#で特に可読性が低いと思った事はないので、暫く両方で書いてみて可読性の高い方にしようと思います。
0752デフォルトの名無しさん
2008/05/09(金) 20:41:07まだC++の学習を初めて1週間なので聞いた事のない用語が出てきていますが、C++にはpartialクラスがないので大規模クラスの時は外に書いた方が分割出来るという事でしょうか。
頭の片隅に留めておきます。
ありがとうございました。
0753デフォルトの名無しさん
2008/05/09(金) 21:27:50int x;
}Foo;
class Hoge{
static Foo foo;
};
こんな時にfooの初期化ってどこで行えばいいんでしょうか?
0754デフォルトの名無しさん
2008/05/09(金) 21:29:17そしてその実体を作ろうとすると、自ずと答えが分かるはずだ。
0755デフォルトの名無しさん
2008/05/09(金) 21:29:35普通に
static Foo foo = 0;とか
0756デフォルトの名無しさん
2008/05/09(金) 21:30:140757753
2008/05/09(金) 21:33:50自己解決しました。スコープ解決演算子ってややこしいな・・・
0758デフォルトの名無しさん
2008/05/09(金) 21:34:130759デフォルトの名無しさん
2008/05/09(金) 21:47:07template<typename T, typename U> void foo() { /* hogehoge */ }
Class c; // any type
foo(c); // ok
foo<int>(c); // ok
なるtemplate関数って作れますか?
TもUも関数内で利用したいんです
Uを指定しないときのデフォルトになる型も指定したいです
0760デフォルトの名無しさん
2008/05/09(金) 22:00:120761デフォルトの名無しさん
2008/05/09(金) 22:17:48引数は(T& t)でおねがいします
0762デフォルトの名無しさん
2008/05/09(金) 22:18:17デフォルトテンプレート引数をつけることはできない。
0763デフォルトの名無しさん
2008/05/09(金) 22:36:48template<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);
0764デフォルトの名無しさん
2008/05/09(金) 22:40:030765デフォルトの名無しさん
2008/05/09(金) 22:56:17template<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);}
0766デフォルトの名無しさん
2008/05/09(金) 23:01:44foo<int,int> みたいに T をかかないといけないのは意味が無いという話だ。
0767デフォルトの名無しさん
2008/05/09(金) 23:04:31foo<int>って書けるだろ?
0768デフォルトの名無しさん
2008/05/09(金) 23:09:070769デフォルトの名無しさん
2008/05/09(金) 23:17:52ちょっとそのレスはどうかと・・・
0770デフォルトの名無しさん
2008/05/09(金) 23:22:25よく意味が分からないんだが、↓だと何かまずいのか?
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
うぜぇ消えろ
コンパイラの具体例でもあるなら書け
0771デフォルトの名無しさん
2008/05/09(金) 23:25:10>>759 の言ってるのは
foo(c); // T = cの型, U = デフォルト型
foo<int>(c); // T = cの型, U = int
みないな感じのことがしたい、という話だろ。
0772デフォルトの名無しさん
2008/05/09(金) 23:29:42つvectorのヘッダファイル
0773デフォルトの名無しさん
2008/05/09(金) 23:31:530774デフォルトの名無しさん
2008/05/09(金) 23:31:53template<typename T, typename U> に <int> したとき、
U に int を入れるってこと?
0775デフォルトの名無しさん
2008/05/09(金) 23:32:45あくまで「みたいなこと」であって、
似た事が実現できる手段を知りたいってことだろう。
0776デフォルトの名無しさん
2008/05/09(金) 23:35:17方法が知りたいのかどうなのかは質問者に聞かなければ
0777デフォルトの名無しさん
2008/05/09(金) 23:35:27template<typename U, typename T> foo(const T& t) { }
とすると、foo(c); はいけるが、foo<int>(c); はどちらにも当てはまるのでエラー。
型を指定するためのダミー引数をつけようとしても、
デフォルト引数からの型推論ができないためエラー。
まあ簡単に思いつく方法ではまず無理だなあ。
0778デフォルトの名無しさん
2008/05/09(金) 23:35:29関数だとデフォルト指定できなかった?
それは失敬
0779デフォルトの名無しさん
2008/05/09(金) 23:36:39それは流石にクラスでも無理じゃね?
セマンティクス的にも意味分からないし
テンプレート関数でデフォルトテンプレート引数みたいなことしたい、
ってことかと思ってたけど、違ったのか・・・
0780デフォルトの名無しさん
2008/05/09(金) 23:37:49template<typename T, typename U> foo(const T& t, boost::type<U>) { }
template<typename T> inline foo(const T& t) { foo(t, boost::type<int>()); }
0781デフォルトの名無しさん
2008/05/09(金) 23:38:40foo(c); // U = int
foo(c, boost::type<double>()); // U = double
0782デフォルトの名無しさん
2008/05/09(金) 23:40:540783459
2008/05/09(金) 23:42:20やりたいことは>>771の通りです
あと関数じゃなくて関数オブジェクトでもいいんですが
結局operator()が関数テンプレートになるとおもいます
0784デフォルトの名無しさん
2008/05/09(金) 23:44:290785デフォルトの名無しさん
2008/05/09(金) 23:48:40Uのデフォがintの場合
template<typename T, typename U>void func(){}
template<typename T>void func(){ func<T, int>();}
呼び出し
func<double>() →下が呼ばれる
func<double, char>() 上が呼ばれる
確認環境はVC++2008
0786デフォルトの名無しさん
2008/05/09(金) 23:51:070787デフォルトの名無しさん
2008/05/09(金) 23:55:200788デフォルトの名無しさん
2008/05/09(金) 23:56:02何がやりたいかも理解できないのか。
0789デフォルトの名無しさん
2008/05/09(金) 23:56:580790デフォルトの名無しさん
2008/05/09(金) 23:57:300791デフォルトの名無しさん
2008/05/09(金) 23:58:06わろたw
0792デフォルトの名無しさん
2008/05/09(金) 23:58:41boostは使ってもOKだったか?
ならいいや
0793デフォルトの名無しさん
2008/05/10(土) 00:00:15残念、エスパーじゃないから理解は出来んわ
0794デフォルトの名無しさん
2008/05/10(土) 00:01:54type くらい自分で簡単に定義できるだろ。
template <typename T> struct type { };
0795デフォルトの名無しさん
2008/05/10(土) 00:06:30それでboost使わずに書けるの?
>>780-781のを書き直してみて
0796デフォルトの名無しさん
2008/05/10(土) 00:07:50template<typename T> inline foo(const T& t) { foo(t, type<int>()); }
foo(c); // U = int
foo(c, type<double>()); // U = double
0797デフォルトの名無しさん
2008/05/10(土) 00:07:53今度はC++を覚えないといけないオレに
C++のメリットをどうか教えておくれ・・・・
0798デフォルトの名無しさん
2008/05/10(土) 00:08:360799デフォルトの名無しさん
2008/05/10(土) 00:09:47コンパイルエラー出るわ。ちょい待ち。
0800デフォルトの名無しさん
2008/05/10(土) 00:10:46すまん。
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
0801759
2008/05/10(土) 00:12:53wrapper<type-arg>()とか少し冗長な部分もありますが
型を渡してるってのがわかりやすい面もありますね
でも結局func<type-arg>(value-arg)って形式という制約の上で
type-argにデフォルト値を持たせるのはほぼ不可能ってことなんですね
>>763のだと戻り値の記述が制限されますし
0802デフォルトの名無しさん
2008/05/10(土) 00:13:04速い
0803デフォルトの名無しさん
2008/05/10(土) 00:14:01早い
0804デフォルトの名無しさん
2008/05/10(土) 00:15:33template <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);
こういうのは可能。
今回の場合はオーバーロード解決に失敗するから無理だっただけだな。
0805デフォルトの名無しさん
2008/05/10(土) 00:16:30fast
0806デフォルトの名無しさん
2008/05/10(土) 00:17:05デフォルト値の問題じゃなくて、引数の型を書かずに飛ばすのが不可能
0807デフォルトの名無しさん
2008/05/10(土) 00:17:42疾い
0808デフォルトの名無しさん
2008/05/10(土) 00:17:45まだ言ってんのか。
順番変えればいいだろ、そんなの。
0809デフォルトの名無しさん
2008/05/10(土) 00:18:06thx!
関数の型が抜けてたけど、
勉強になった!
こういうことできるんだな〜。
0810デフォルトの名無しさん
2008/05/10(土) 00:19:00今までのレス読んでないのかよ
0811デフォルトの名無しさん
2008/05/10(土) 00:19:39>>775
0812デフォルトの名無しさん
2008/05/10(土) 00:20:00メモリ管理が大変
0813デフォルトの名無しさん
2008/05/10(土) 00:20:090814デフォルトの名無しさん
2008/05/10(土) 00:21:19ハヤイ
0815デフォルトの名無しさん
2008/05/10(土) 00:22:10コンパイルではじかれる場合は
大概使用方法が曖昧だから。
そして曖昧だと、ソースを見た人間もどれが動くか分からないから、
型は明記のほうがいい。
0816デフォルトの名無しさん
2008/05/10(土) 00:22:14プラットフォーム選ばないんではないかな。
0817デフォルトの名無しさん
2008/05/10(土) 00:22:29順番の話とそのレスにどういう関係が?
0818デフォルトの名無しさん
2008/05/10(土) 00:23:07ところがこうしちゃうと・・・
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> なのか
区別がつかないんだな・・・。
0819デフォルトの名無しさん
2008/05/10(土) 00:23:550820デフォルトの名無しさん
2008/05/10(土) 00:24:500821デフォルトの名無しさん
2008/05/10(土) 00:25:450822デフォルトの名無しさん
2008/05/10(土) 00:26:450823デフォルトの名無しさん
2008/05/10(土) 00:27:18そのテンプレート引数の順番じゃないといけない、
なんて誰も言ってないってこった。
0824デフォルトの名無しさん
2008/05/10(土) 00:27:23多重継承かなって思ってる
0825デフォルトの名無しさん
2008/05/10(土) 00:27:53けどdeleteが必要、それもメリット!
0826デフォルトの名無しさん
2008/05/10(土) 00:28:22いや〜ねーよ
0827デフォルトの名無しさん
2008/05/10(土) 00:28:380828デフォルトの名無しさん
2008/05/10(土) 00:28:41templateが使える、もだな
0829デフォルトの名無しさん
2008/05/10(土) 00:29:34>>777とか読んでないだろ
0830デフォルトの名無しさん
2008/05/10(土) 00:30:382つなら >>804 と解決できるわけだが?
0831デフォルトの名無しさん
2008/05/10(土) 00:31:25そこで自動変数とスマートポインタですよ
>それもメリット!
その通り!
0832デフォルトの名無しさん
2008/05/10(土) 00:36:24new、deleteとか、メモリ管理は嫌われる対象になるけど、
プログラマならメモリ管理ぐらいできろよ、と思うわ。
それの経験になるからC++のメリットだと思う。
0833デフォルトの名無しさん
2008/05/10(土) 00:37:450834デフォルトの名無しさん
2008/05/10(土) 00:39:24出来てなくね?
>>759の呼び方両方とも>>804の下の関数になるんだが
0835デフォルトの名無しさん
2008/05/10(土) 00:41:58C畑からC++を勉強した身としてはスマートポインタあんまり使ったことないw
まあ、あれば便利だけどね
0836デフォルトの名無しさん
2008/05/10(土) 00:44:15#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);
}
0837デフォルトの名無しさん
2008/05/10(土) 00:44:510838デフォルトの名無しさん
2008/05/10(土) 00:46:24java→C→C++の順で来た俺にはCでfreeの文化を身に付けたものの、慣れてきたとたん
スマポやらSTLやらでjava回帰しとるよ。ぬるま湯はいいぞ
0839デフォルトの名無しさん
2008/05/10(土) 00:49:182個ってそのことか、それが出来ても意味無い
>>804自身も言っているように、
今回の>>759の件では順番を入れ替えても無駄
で、>>808が順番変えればいい、と書いたから変えても不可能と言っている
0840デフォルトの名無しさん
2008/05/10(土) 00:51:00T を指定せずに U を指定するのは文法的に無理、
ってことをいいたいわけじゃなかったのか?
0841デフォルトの名無しさん
2008/05/10(土) 00:51:02それは同意せざるを得ない
0842デフォルトの名無しさん
2008/05/10(土) 00:53:54でも、日本ではPGって低賃金・底辺職業だから、高脳すくないよな。
とか、言っている俺は低脳なのにC++を使い糞コードを書いて悲劇をよく起している。
最低でもライブラリは高脳が作って欲しいよな。すると、俺の悲劇も少しは減るのにな
0843デフォルトの名無しさん
2008/05/10(土) 00:54:36そうだけど?
で、それならUを前に→それも別の問題で不可能
だから飛ばす方法は無いってことがそれまでのレスで明らかだっただろ
0844デフォルトの名無しさん
2008/05/10(土) 00:55:49boostが高脳過ぎて俺の脳が沸騰しそうです
0845デフォルトの名無しさん
2008/05/10(土) 00:56:32楽な方というか、開発効率が良い方を選ぶよ
C++って低脳には開発効率悪すぎ。
0846デフォルトの名無しさん
2008/05/10(土) 00:58:57Uを前に持って来た時点で、Tを「飛ばす」ことにはならないわけで。
Tの方が後ろにあるんだから。
0847デフォルトの名無しさん
2008/05/10(土) 00:59:21その点で言うと仕事で使うC++なんてSTLすら不可だったりして最悪だと思うよ
0848デフォルトの名無しさん
2008/05/10(土) 01:00:23そうでないのにSTL不可とするとどんな低能集団だよ・・・。
0849デフォルトの名無しさん
2008/05/10(土) 01:04:07まだ理解出来ないのか・・・
順番を入れ替えても無駄なのは事実
書き方こそ違えど今の所妥当なのは>>780の方法
もうお前にレスしないから好きに煽ってもらって結構
0850デフォルトの名無しさん
2008/05/10(土) 01:06:30C・・・CArray!
0851デフォルトの名無しさん
2008/05/10(土) 01:09:40引数の型を書かずに飛ばすのが不可能なのが問題なんじゃなくて、
その他の解決法が今回の場合使えないというのが問題の本質だろって話だ。
0852デフォルトの名無しさん
2008/05/10(土) 01:10:040853デフォルトの名無しさん
2008/05/10(土) 01:10:21まぁでもSTLが標準に入って、浸透するまでの間、
Windows限定ではあるもののライブラリとして頑張ってた方だな。
0854デフォルトの名無しさん
2008/05/10(土) 01:11:47GetBuffer とか string にはできない芸当だ。
0855デフォルトの名無しさん
2008/05/10(土) 01:21:17けどVC6.0のだとバグがあると言う罠
0856デフォルトの名無しさん
2008/05/10(土) 01:22:59第一VC6ってC98以前のものじゃない
0857デフォルトの名無しさん
2008/05/10(土) 01:23:320858デフォルトの名無しさん
2008/05/10(土) 01:24:020859デフォルトの名無しさん
2008/05/10(土) 01:26:18MFCがC++のより良い使い方の普及を邪魔したんじゃねなんて、おれは思ったりする。
あれ、C with Class 用ライブラリじゃね。ほとんどAPIの簡易ラッパーだぞ。
低脳がライブラリ作ると....の良い見本と低脳な俺は思っている。
0860デフォルトの名無しさん
2008/05/10(土) 01:27:26どんなバグ?
0861デフォルトの名無しさん
2008/05/10(土) 01:30:48いや、最近働いたプロジェクトでもまだ現役だったりするw
>>860
CStringのメモリリーク
0862デフォルトの名無しさん
2008/05/10(土) 01:32:13どういう時にリークすんの?
0863デフォルトの名無しさん
2008/05/10(土) 01:34:34詳しい内容は忘れたw
0864デフォルトの名無しさん
2008/05/10(土) 01:41:590865デフォルトの名無しさん
2008/05/10(土) 01:52:23ひょっとして、こんな感じ?
LPWSTR* ポンタ= ::CommandLineToArgvW(....);
どっかに動的に生成したのは良いが、ポンタ先って誰がどの時点で開放するんだろ?
....
しょうがないな、俺がnew/mallocしたんじゃないが
LocalFree(ポンタ); // これCStringで忘れたんじゃね
0866デフォルトの名無しさん
2008/05/10(土) 02:31:04嘘レスしかついてないんでいちおうマジレスしとくと、インクルードガードのそれもダメ。
ちょっと古い入門書や入門サイトの記事で使ってるのが多くて広まってる。なんで
入門記事がそういう名前を使ってたのかは、わからない。最近の記事では修正されてたり、
明示的に予約名についての注意が添えられてたりするみたい。
0868デフォルトの名無しさん
2008/05/10(土) 04:04:30記憶に残ってる感じでは
CString tmpstr("abcde");
とかすると残るらしい
0869デフォルトの名無しさん
2008/05/10(土) 05:07:29お前いい事言うな。
やれんのか?
なら今すぐやれ。
0870デフォルトの名無しさん
2008/05/10(土) 10:42:19楽してるんないかな。俺もそうだけど。結構快適。
0872デフォルトの名無しさん
2008/05/10(土) 13:37:55int 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'
が実行されてしまっています。
どなたかアドバイスいただけると幸いです。
0873デフォルトの名無しさん
2008/05/10(土) 13:42:000874872
2008/05/10(土) 13:46:52ありがとうございましたorz
0875デフォルトの名無しさん
2008/05/10(土) 13:51:23Unicode じゃないと変な結果になることがあるぜ。
0876872
2008/05/10(土) 13:55:15sjisです。
文字コードはそのうちutf-8にまとめて変えようと思っているのですが、
if(str.find("あ", to, from)){
の部分を
if(string::npos != str.find("あ", to, from)){
にしたら、とりあえずsjisでも今のとこ意図した通りに動きました。
0877デフォルトの名無しさん
2008/05/10(土) 14:01:34「あ」なら大抵大丈夫だろうけど、
「い」だとヤバいな。
"Bob「ハロー」" から "い" を検索してみれ。
0878872
2008/05/10(土) 14:25:42どっかでコードポイントが重複してるってことですよね。
これは、文字コードをUTF-8にしないと解決できないことなんでしょうか??
0879デフォルトの名無しさん
2008/05/10(土) 14:26:55SJIS 用の比較関数を使うなら問題は無いが、
どんな関数があるかは環境依存なので何とも言えない。
0880872
2008/05/10(土) 14:39:48GCCだとShift Jis 用の比較関数というのはどんなのがあるんでしょうか??
gcc shift jis 比較関数 とかでググってみてもそれらしいのが出てきませんでした。
何度もすいません。
0881デフォルトの名無しさん
2008/05/10(土) 14:44:16MinGW なら VC++ と同様 mbstring.h の _mbsstr が使えないのかな。
0882872
2008/05/10(土) 14:54:07MinGWにはないのですかねぇ。
でもUTF-8にすれば全く問題なくなるのなら、そうすればいいだけですね。
色々ご親切にありがとうございますm(_ _)m
0883デフォルトの名無しさん
2008/05/10(土) 14:55:52コンパイルエラーになったら使えないと判断すればええ。
0884デフォルトの名無しさん
2008/05/10(土) 17:04:31二つを書きました。(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へのポインタしか扱っていないので、できそうな感じがして質問しました。
0885デフォルトの名無しさん
2008/05/10(土) 17:29:28さらに、stack.hでStackをstruct Stack;と不完全にだけ宣言しておけば、
main.cの再コンパイルなく2つを差し替えられるようになるはず。
0886デフォルトの名無しさん
2008/05/10(土) 20:09:50bool 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のアカデミックです
0887デフォルトの名無しさん
2008/05/10(土) 20:18:11WINVERとか_WIN32_WINNTでググれ
0888884
2008/05/10(土) 21:35:13レスありがとうございます。
stack.hでstruct Stack;と宣言を書き、両方の実装でstruct Stackを使うように変更しました。
すると、期待通りにプログラムが生成されました。
また、言われたように再コンパイル無しでも上手くいきました。
ありがとうございました。
0889デフォルトの名無しさん
2008/05/11(日) 00:19:43http://pc11.2ch.net/test/read.cgi/tech/1189089806/
今まで気にせずメンバの参照には必ず this を付けてたのですが
何かデメリットがあるのでしょうか・・・
よろしくお願い致します
0890デフォルトの名無しさん
2008/05/11(日) 00:34:34そのスレで聞けよw
0891デフォルトの名無しさん
2008/05/11(日) 00:38:49なんかネタスレっぽいし
そのスレの >>40 以降でそんなような流れなのですが
もやもやした会話になってるので、ココで聞いてみました
0892デフォルトの名無しさん
2008/05/11(日) 00:43:45this の有無により意味の変わるコードを素で書くことがある。
その場合、他の人がそれを扱おうとした際にバグを埋め込む恐れがある。
0893デフォルトの名無しさん
2008/05/11(日) 00:53:34どうしたらいいでいいですか? vectorでは平気なのに、dequeにすると最終のところが読めないです。
size()-1まではアクセスできるはずですよね?
0894デフォルトの名無しさん
2008/05/11(日) 00:55:400895デフォルトの名無しさん
2008/05/11(日) 00:56:34とりあえず現象が再現する最小限のコードを貼るんだ
0896デフォルトの名無しさん
2008/05/11(日) 00:56:350897デフォルトの名無しさん
2008/05/11(日) 00:56:44hoge.push_back(NULL);
hoge[hoge.size() - 1]->Foo();
みたいなことやってんじゃないの?
0898デフォルトの名無しさん
2008/05/11(日) 01:14:52→あっ、バグが判った。ってなるんだよね。バグが判ることはいいことだが。
0899デフォルトの名無しさん
2008/05/11(日) 03:57:010900デフォルトの名無しさん
2008/05/11(日) 04:35:32&d[0]+d.size()-1
とかやってると予想。
0901デフォルトの名無しさん
2008/05/11(日) 04:47:58また、aとbの値が変更されたとき、その合成された変数の値も変更されるようにすることは可能でしょうか?
0902デフォルトの名無しさん
2008/05/11(日) 05:02:04unsigned char c;
c = (unsigned char)((a & 0xf8) | (b >> 5));
aとbを変更したら、cを再計算すればいい。
0903デフォルトの名無しさん
2008/05/11(日) 05:21:50C99からだと思うのですが、
ブロック途中で変数宣言したものでも
gccでそのままコンパイル通ってしまいます。
hoge.c
int main(int argc, char**argv)
{
Func();
int i = 0;
return 0;
}
gcc -std=c89 hoge.c
どうしてなのでしょうか?
0904デフォルトの名無しさん
2008/05/11(日) 05:31:33オヌヌメできない方法しか思いつかない。
参照時に合成じゃだめなの?
0905デフォルトの名無しさん
2008/05/11(日) 05:35:46-O0付けても一緒?
0906デフォルトの名無しさん
2008/05/11(日) 10:53:22コンパイルオプションが足りない
gcc -g -W -Wall -std=c89 -pedantic test.c
とりあえずこれでどうだ
0907デフォルトの名無しさん
2008/05/11(日) 11:01:29途中での宣言がgccの独自拡張でもあるからだな、だからそのオプションだと
c89とgccの独自拡張でやることになる
-pedantic -pedantic-errors で独自拡張は禁止できる
0908デフォルトの名無しさん
2008/05/11(日) 11:03:30-pedantic か -pedantic-errorsです
警告とエラーの違いです
0909デフォルトの名無しさん
2008/05/11(日) 14:30:53unsigned char tmp[2048];
va_list argptr;
va_start(argptr, pFormat);
vsprintf(tmp, (const signed char*)(pFormat), argptr);
va_end(argptr);
}
このコードでコンパイラに異なる 'char' 型へのポインタが混在しているとの警告を受けるんですが
どう直したらいいんでしょう?BCC5.5です。
0910デフォルトの名無しさん
2008/05/11(日) 14:45:170911ブロンズ
2008/05/11(日) 14:59:56どうすればいいでしょうか
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6513.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6515.txt
0912デフォルトの名無しさん
2008/05/11(日) 15:28:460913デフォルトの名無しさん
2008/05/11(日) 15:32:44ここにいるおにいさんたちにせつめいしてみよう!
OSなどの環境も書くといいかもね!
0914デフォルトの名無しさん
2008/05/11(日) 15:38:37signed/unsigned char をただの char にすればいいんじゃない?
0915デフォルトの名無しさん
2008/05/11(日) 15:41:41てか、キャストいらなくない?tmpの方ならまだわかるけど。
tmpも特に理由がなければunsignedにしなくていいような。
0916デフォルトの名無しさん
2008/05/11(日) 15:44:51おにいさん、ですか?(苦笑)
0917デフォルトの名無しさん
2008/05/11(日) 15:46:2740代とみた
0918デフォルトの名無しさん
2008/05/11(日) 15:59:33ありがとうございました。該当箇所を以下のように修正したら治まりました。
reinterpret_cast<char*>(tmp), const_cast<char*>(pFormat)
0919デフォルトの名無しさん
2008/05/11(日) 16:02:140920デフォルトの名無しさん
2008/05/11(日) 16:05:18あまり面白くないな。
0921デフォルトの名無しさん
2008/05/11(日) 16:54:10ベースクラス(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クラスの配列に入れて処理をしたい、ということです。このような場合はどうしたらいいでしょうか?よろしくお願いします。
0922デフォルトの名無しさん
2008/05/11(日) 16:57:530923デフォルトの名無しさん
2008/05/11(日) 16:58:04Base/Sub1/Sub2を全部hにしてみそ。
0924デフォルトの名無しさん
2008/05/11(日) 16:58:14CreateWindowでボタンなんかを画面上に作った後、
このボタンを画面上から削除する、または画面全体をクリアするにはどうすればよいでしょうか?
どなたか、教えてください。
0925デフォルトの名無しさん
2008/05/11(日) 16:58:450926921
2008/05/11(日) 17:01:49ファイルを分けているからです。
とりあえずヘッダファイルを使わずに書いてみようと思いまして
インクルードガードで検索してみます。
>>923
ヘッダ(.h)にしてみましたが、やはり再定義と・・・
0927921
2008/05/11(日) 17:26:44Baseクラスが2度インクルードされていたのが原因だったんですね。
勉強になりました。ありがとうございます。
0928デフォルトの名無しさん
2008/05/11(日) 17:39:07そのボタンを削除するか非表示にする。
0929デフォルトの名無しさん
2008/05/11(日) 18:24:52配列を使えば、
char str[30];
scanf("%s", str); /* scanfに配列strのアドレスを渡す */
でできますが、ポインタを使った場合、
char *pstr;
scanf("%s", pstr); /* scanfにpstrのアドレスを渡す(?) */
では何故だめなのでしょうか?
pstrに入っているアドレスをscanfに渡しているので、いけると思ったのですが……。
0930デフォルトの名無しさん
2008/05/11(日) 18:25:500931デフォルトの名無しさん
2008/05/11(日) 18:29:48なるほど。最初の時点ではpstrは「00000001」をさしていました。
それでは、どうにかしてscanfでポインタを使って文字列を取得する方法はないのでしょうか?(getsを使えとかはナシでお願いします)
0932デフォルトの名無しさん
2008/05/11(日) 18:31:11char *pstr = str;
scanf("%s", pstr);
0933デフォルトの名無しさん
2008/05/11(日) 18:32:30やはりそうするしかないのですね。
ポインタの謎が一つわかりました。ありがとうございました。
0934デフォルトの名無しさん
2008/05/11(日) 18:34:230935デフォルトの名無しさん
2008/05/11(日) 18:35:21932 のとおり。
どのみちポインタの先はデータ型である必要がある。
const char* str = "honyarara";
みたいなことの scanf 版を考えてるなら、それは不可。
これは構文上、自動的にデータ型を作ってくれてるだけ。
0936デフォルトの名無しさん
2008/05/11(日) 18:39:230937デフォルトの名無しさん
2008/05/11(日) 18:42:390938デフォルトの名無しさん
2008/05/11(日) 18:43:22すみません。
0939デフォルトの名無しさん
2008/05/11(日) 18:45:25初心者はどこかでやらかすから、割り切りだよw
0940デフォルトの名無しさん
2008/05/11(日) 18:45:330941デフォルトの名無しさん
2008/05/11(日) 21:32:25どのような原因かわかりますでしょうか?
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();
0942デフォルトの名無しさん
2008/05/11(日) 21:37:580943941
2008/05/11(日) 21:38:12読み込んでみると53,152 になっています。 配列で1個分増えてます。なぜでしょうか?
0944デフォルトの名無しさん
2008/05/11(日) 21:39:09float + int が8バイトなので、掛けています。
0945デフォルトの名無しさん
2008/05/11(日) 21:41:100946デフォルトの名無しさん
2008/05/11(日) 21:41:29読めなかったときにもpush_back()しているから。
0947デフォルトの名無しさん
2008/05/11(日) 21:42:010948デフォルトの名無しさん
2008/05/11(日) 21:44:360949デフォルトの名無しさん
2008/05/12(月) 01:35:15機能って何ですか。"hogestr 0x1234 3456"みたいなトークンの
引数文字列を文字列や数値として切り出して読みたいんだけど。
0950デフォルトの名無しさん
2008/05/12(月) 01:36:410951デフォルトの名無しさん
2008/05/12(月) 01:40:560952デフォルトの名無しさん
2008/05/12(月) 01:57:16こんなmain関数の定義をみかけたのですが、
envって何ですか?
こういう定義ってありなんでしょうか?
普通にコンパイルは通るみたいなのですが。
0953デフォルトの名無しさん
2008/05/12(月) 01:57:520955デフォルトの名無しさん
2008/05/12(月) 02:04:30関数名はC++でコンパイルするとマングリングされますが
変数名はマングリングされないですよね?
0956949
2008/05/12(月) 02:17:37istringstream調べてみました。でもトークンにある要素が有る場合もあれば無い場合もあるし、
書式化での指定も出来ないみたいだし、>>とか演算子オーバーロードして使う系の関数って嫌いなんですよね。
sscanfと比べてメリットなさそうなんでsscanf使います。
0957デフォルトの名無しさん
2008/05/12(月) 06:49:07自分でフォーマットを決めれるなら、言語関係無く簡単に読めるように
妙なフォーマットにしない方が吉。
例えば空白TABカンマなどを区切り(メタ文字)にして、
要素にはメタ文字を出さない(エスケープする)とか。
要素にメタ文字が入っちゃうExcelのcsvとかは駄目な例。
0958デフォルトの名無しさん
2008/05/12(月) 07:21:36All function types, function names, and variable names have a language linkage.
全ての関数型、関数名、変数名は言語リンケージを持つ。
変数名も当然マングリングされる可能性がある。
名前空間とかあるんだし。
0959デフォルトの名無しさん
2008/05/12(月) 07:30:21クラス内staticメンバ変数なんかはマングリングされますぜ。
0960デフォルトの名無しさん
2008/05/12(月) 08:31:52MString.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) ;
ってある。
どう修正したらいいですか?
0961デフォルトの名無しさん
2008/05/12(月) 08:39:070962デフォルトの名無しさん
2008/05/12(月) 08:47:11審議中
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#563
0963デフォルトの名無しさん
2008/05/12(月) 08:51:10これでしょ。
http://www.gnu.org/software/gcc/gcc-4.1/changes.html
> ARM-style name-injection of friend declarations is no longer the default.
friend 宣言とは別に関数の宣言を置くべし。
0964960
2008/05/12(月) 09:15:32後ろの方で宣言されてました。前に持ってきたら、すんなり通りました。
こんなときはコンパイルどうすんのかな・・・
0965デフォルトの名無しさん
2008/05/12(月) 15:26:51str_stream << "abcde";
string* str = new str_stream.str();
みたいな感じで、strを動的確保したいのですが、newの部分でエラーが出てしまいます。
ポインタが返ってきていないからだと思うのですが、このような動的確保をしたい時はどうすればよいのでしょうか??
0966デフォルトの名無しさん
2008/05/12(月) 15:30:140967デフォルトの名無しさん
2008/05/12(月) 15:33:49あれから修正を重ねてほぼ動くようになったのですが、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にあります。
0969デフォルトの名無しさん
2008/05/12(月) 15:59:01scanfの"%s"は、その後に続くであろう改行を読み取らない
改行が残ったままなので、次のfgetsでその改行(だけ)が読み込まれる
そのjudgeは、1文字も入力されなかったら0を返すぽいから、0が読み込まれたようになるのでは
まぁ、"%s"を"%s "にしてみるといいかもしんない
ところで%sは最後に'\0'の付いた文字列を読み込むので、
1文字分しか領域のない&selectに読み込んではだめだ
1文字なら%cを使え
0970968
2008/05/12(月) 17:15:42レス有難うございます。
ただ、どちらの方法も望む動きはしてくれませんでした。
"%s "→質問は繰り返されないが、文字を二回打たないと次に進めない
"%c"→変化なし
原因は改行コードが残っているようなので、これを削除するのが一番なのかと思いましたが、
ググってみてもなかなか見つかりませんでした。何か良い方法はありますか?
ところで970ですが、スレ立ては980か990でよいのでしょうか?
0971デフォルトの名無しさん
2008/05/12(月) 17:26:230972968
2008/05/12(月) 17:30:53scanf("%[^\n]%*c", &select);
の記述で動くようになりました!色々レスありがとうございました。
>>971
すみません、上記の通りです。レスありがとうございました。
0973デフォルトの名無しさん
2008/05/12(月) 19:30:56注意書きもなしにそんなものをすすめるなよw
0974デフォルトの名無しさん
2008/05/12(月) 19:55:44これは処理系依存ではないでしょうか?
0975デフォルトの名無しさん
2008/05/13(火) 00:40:10#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を使わずに書き直したいです。どなたかヒントだけでも教えてください
0976デフォルトの名無しさん
2008/05/13(火) 00:41:270977デフォルトの名無しさん
2008/05/13(火) 00:44:100978デフォルトの名無しさん
2008/05/13(火) 00:53:01レスありがとうございます!
getcwd でググったところ、いくつかサンプルコードがヒットしたので動かしてみたら、うまくいきました。
> 標準でなくてもいいなら
しかし、これは一体どういう意味なのでしょうか?
0979デフォルトの名無しさん
2008/05/13(火) 01:01:40VC++ だと名前微妙に違うんじゃないか?
0980デフォルトの名無しさん
2008/05/13(火) 01:09:21調べてみたら int system(const char *str) というのが見つかったが、これを使うのか?
それとも Exec() みたいなのを使うのか? うーん・・・
修行し直してきます (´・ω・`)
0981デフォルトの名無しさん
2008/05/13(火) 01:15:180982デフォルトの名無しさん
2008/05/13(火) 01:21:250983デフォルトの名無しさん
2008/05/13(火) 07:16:530984デフォルトの名無しさん
2008/05/13(火) 11:40:01int test = 123;
LPWSTR strtest = static_cast<LPWSTR>(test);
MessageBox(0, strtest, L"型変換", MB_OK);
2行目で何故か「C2440: 'static_cast' : 'int' から 'LPWSTR' に変換できません。」と出て変換出来ません。
原因は何でしょうか。
0985デフォルトの名無しさん
2008/05/13(火) 11:42:24>数値型変数から文字型変数に変換するにはstatic_castを使えとググったら出てきたのですが、
そんなウソを教えるページを晒せ
0986デフォルトの名無しさん
2008/05/13(火) 12:21:54ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1012289530
0987デフォルトの名無しさん
2008/05/13(火) 12:26:110988デフォルトの名無しさん
2008/05/13(火) 12:41:27知識を持たずに読んだ人が勘違いしただけで。
0989デフォルトの名無しさん
2008/05/13(火) 13:28:36本題を教えてやれよ・・・。
>>984
stringstream
0990デフォルトの名無しさん
2008/05/13(火) 17:50:24初心者を馬鹿にすることで自己を保ってる馬鹿がいるんだから仕方がないじゃない
0991デフォルトの名無しさん
2008/05/13(火) 20:32:310992デフォルトの名無しさん
2008/05/13(火) 22:34:01自分なりに調べようとすらしない奴の面倒まで見ることはないと思うよ。
調べた上で分からないことがあれば勿論聞いて良いけど。
0993デフォルトの名無しさん
2008/05/13(火) 23:29:030994デフォルトの名無しさん
2008/05/13(火) 23:52:120995984
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);
0996デフォルトの名無しさん
2008/05/14(水) 00:52:220997デフォルトの名無しさん
2008/05/14(水) 00:56:04それならLPCWSTRにすればいい。
LPCWSTRは、
1. MessageBoxWの2-3番目の引数の型
2. const wchar_t*のtypedef
const wchar_t*はstd::wstringのc_strが返す型。
>>996
もちろん標準。
それなのにCygwinなんかは持ってなくて殺意を覚える。
0998デフォルトの名無しさん
2008/05/14(水) 00:56:400999997
2008/05/14(水) 01:00:40wstringstream類は知らない。
そもそも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乙
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。