スレを勃てるまでもないC/C++の質問はここで 20
1 :
デフォルトの名無しさん :
2011/09/15(木) 00:17:43.25
2 :
デフォルトの名無しさん :2011/09/15(木) 16:27:52.49
乙
3 :
デフォルトの名無しさん :2011/09/15(木) 17:05:51.53
Cはヨーグルトの味がしますか?
Cは醍醐味
白かよ、青かよ、ウォッシュかよ?
ちょっと和んだw
9 :
つづき :2011/09/21(水) 08:06:20.37
class Message { SOCKET _dst_socket; COMMAND _command; public: // コンストラクタ、デストラクタ、セッタ、ゲッタ ... virtual int sizeOf() cosnt { return sizeof( *this ); } }; class TextMessage : public Message { char _text[ 16 ]; public: // コンストラクタ、デストラクタ、セッタ、ゲッタ ... virtual int sizeOf() const { return sizeof( *this ) } }; class Server{ ... }; bool Server::send( SOCKET dst_socket, const Message& msg ) { if( ::send( dst_socket, (char*) &msg, msg.sizeOf(), 0 ) != SOCKET_ERROR ) // このへんで sizeOf() を呼ぶとエラー。sizeof( TextMessage ) とかだとOK } class Tester { public: static void test( const Message& msg ) { cout << msg.sizeOf() << endl; } }; int main() { TextMessage tmsg; Tester::test( tmsg ); // これはOK ... }
sizeOf()を呼ぶとエラーじゃなくて、sizeOf()を呼んだ後の次のsizeOf()で死ぬんだろ。 それなら原因は想定できた。
こいつはくせえーッ!Java厨のにおいがプンプンするぜッーーーッ!
12 :
8 :2011/09/21(水) 09:06:04.18
>>10 ヒントだけでもお願いします。
ついでにJava厨臭くない方法があったら教えて下さい。
>>9 それが>10の言いたいことかどうかは知らんが、(char *) & msgはsend()に渡すべき場所を指しているかデバッガでよく見てみたら?
つーか、Cスタイルキャストは使うなや。
広域の::send()関数の引数に、Messageクラスのポインタを(char*)にキャストして 渡してまともに動作するものなのか? TextMessageの場合は、たまたまクラスの銭湯に_test[16]があれば動作するかも知れないが…
15 :
8 :2011/09/21(水) 14:27:30.20
自己解決しました。 クライアントから送られてきたデータをそのまま流用しようとしたため sizeOf のアドレスが異なっていたようです。 char data[ SIZE ]; recv( src_socket, data, _countof( data ), 0 ); TextMessage tmp, msg; memcpy_s( &tmp, sizeof( TextMessage ), data, sizeof( TextMessage ) ); msg = tmp; server.send( dst_socket, msg ); としたらうまくいきました。 情報不足の質問をしてすみませんでした。アドバイスくださった方、ありがとうございました。
16 :
8 :2011/09/21(水) 14:35:44.97
あ、sizeOf のアドレスじゃないや。まあいいや
アドバイスを受けて事故解決かよ。おめでてーな。
以下のような宣言に対して… template< class T1 > class CHoge { void f1(); template< class T2 > void f2(); }; f1(),f2()の定義を宣言と分けて書きたい場合,f1()は, template< class T1 > void CHoge< T1 >::f1(){ ... } と書きますが, f2()の実装はどのように書けばよいのでしょうか?
template <class T1> template <class T2> void CHoge<T1>::f1<T2>() { ... }
エラーが出ます template <class T1> class CHoge { T1 t; void f1(); template <class T2> void f2(); public: CHoge(T1 x) : t(x) {} }; template <class T1> void CHoge<T1>::f1() { std::cout << t << std::endl; } template <class T1> template <class T2> void CHoge<T1>::f2<T2>() { std::cout << static_cast<T2>(t) << std::endl; } error: function template partial specialization 'f2<T2>' is not allowed
template <class T1> template <class T2> void CHoge<T1>::template f2<T2>() { ... }
template <class T1> template <class T2> void CHoge<T1>::template f2() { ... }
>>23 ありがとうございます
template <class T1>
class CHoge {
T1 t;
public:
void f1();
template <class T2> void f2();
CHoge(T1 x) : t(x) {}
};
template <class T1>
void CHoge<T1>::f1() {
std::cout << t << std::endl;
}
template <class T1>
template <class T2>
void CHoge<T1>::f2() {
std::cout << static_cast<T2>(t) + 0.5 << std::endl;
}
int main()
{
CHoge<int> c(1);
c.f1();
c.f2<double>();
}
25 :
18 :2011/09/22(木) 15:49:42.60
計算式の入った文字列("1+2*3"など)を用意しておいて、その計算結果(先程の例では7)を変数に代入するみたいなことって出来ますか?
>>26 Lua使えば1分でそういうコードが書けるよ
boostでなかったっけ
30 :
デフォルトの名無しさん :2011/09/26(月) 13:40:15.69
L"abc"のLって何ですか? 一文字なのでぐぐれなくて困っています。
「C言語 文字列 L」でぐぐったら一発だったが
X a(),b(),c(),d(); 〜 if(is_true) return; 〜 Y e(); } → if(!is_true)e.~e();→ d.~d();→ c.~c();→ b.~b();→ a.~a(); RAIIは開放の順番は規定されてるの? それとも順不同?
>>33 X a()は返却値X型で引数をとらない関数aの宣言で解放もなにもないし
変数の構築と破棄の順序関係はRAIIなんかとは直接関係ない変数に関する普通の話だしでつっこみどころしかない。
最低限の知識が正しく身についてない人にはそれより先は教えようがないぞ。
デストラクタコール記述のつもりだろうが変数名でデストラクタ書いてるwwから 生兵法君が鼻息荒げて訳判らん(キリッしちゃったんだろうな
37 :
デフォルトの名無しさん :2011/09/27(火) 21:03:18.94
もう何度も質問されていると思いますので簡潔にでいいのでお答えいただけないでしょうか? PHPやJavaScriptは習得しているのですが、ちょっとC系が必要になりそうなのです その際、C -> C++と学習したほうがやはりいいのでしょうか? CはC++に吸収済みとか言う人もいるようですが オブジェクト指向に関しましてはまぁ少々は慣れていると思います やはりC++をいきなりというのはつまずく点が多いのでしょうか? また、CとC++はオブジェクト指向以外にも違いはあるのでしょうか? Webで調べたのですがいまいち分かりませんでした
>>37 必要な言語を学習したんでいい。C++が必要なら最初からそっちでおk
Cにオブジェクト指向とテンプレート(ジェネリックプログラミング)、例外を加えたのがC++だな
ご回答ありがとうございます >必要な言語を学習したんでいい とはPHP等のオブジェクト指向を学習しているので、そのままC++にいってもいいという意味でしょうか? Cで出来ることはC++で出来ると聞いていますので、C++に行こうかと思いました
>>39 仕事でも趣味でも受験でも、目的があるならそれに沿った言語を選択して学習すればいい。
学習そのものが目的なら自分で調べて悩んで下さい。学習になります。
>>37 CとC++の肝はメモリー管理。
どちらからやっても同程度に壁になる
日頃C++をバリバリ使ってると、Cの仕事は苦痛。 日頃Cをバリバリ使ってると、C++の仕事は苦痛。 その程度には違うので、C系なんてごまかしてないで、 プロジェクトに必要な方をやるべし。両方必要なら迷わずC++。
設計がしっかりしてればどっちでやっても大差ない
アルゴリズムの話なのですが、 手続き型言語でコールバックは悪ってのは何故なんでしょうか。
悪じゃないです
純粋な手続き型ではA-B-C-D-Eという流れなら毎回A-B-C-D-Eの順で処理が進んでいくけど コールバックが入るとA(ハンドラ登録)-コールバック-B-C-D-Eだったり A(ハンドラ登録)-B-C-D-E-コールバックだったりと処理の順序関係が安定しなくなる、 あるいは順序を安定させようとするとマルチプロセス化や待機状態を作るなどの 純粋な手続き型と比べると余計なコストがかかるなどで相性が悪いから。
47 :
44 :2011/09/28(水) 18:57:01.56
assertってやめたほうが良くないですか? デバッグ時に発生しなかったバグケースがリリース時に出たら困りますよね
>>49 リリース時に例外を投げるassertもどきなら使ってます
ボトルネックでは仕方ないからassertですが…
リリースビルドの意味わからなかったり直接呼んだりしてるなら ディスパッチャーの中で発生させるアラートや事後アラートがバレると IQの低さを悟られてしまうから止めといたほうがイイとおもうよ
煽りはレスしなくて結構です
すでにある構造体(コンストラクタなしの型)のテンポラリオブジェクトを無駄なく構築するにはどうすればいい? func(hoge(1, 2)); というふうな書き方ができないから { hoge h(1, 2); func(h); } と書いてるんだけど、ダサすぎて困る
>>53 C++ならコンストラクタを書く
CならC99のコンパウンドリテラルを使う
C89はどうしようもない
printf("%s %d", "hoge", x); な所が printf("hoge", "hoge", x); こうなるケースがあっても問題ない?
初心者には意味不明な質問だな
多いのは問題あるが少ないのは問題ない
ファイルから文字列を読み込んで,その文字列を名前にもつ関数を呼び出す事ってC,もしくはC++で可能なんでしょうか 例えば func,100 とだけ書かれたファイルを読み込んで,func(100)という風に呼び出したいのです
if(strcmp(str, "func") == 0) { func(num); }
void hoge(void) { std::cout << "hoge" << std::endl; } void fuga(void) { std::cout << "fuga" << std::endl; } map<string, void (*)(void)> m; m["hoge"] = hoge; m["fuga"] = fuga; string s; cin >> s; map<string, void (*)(void)>::iterator i(m.find(s)); if(i != m.end()) { (*i)(); }
あらかじめ用意した関数しか呼び出せねえのかこの糞ゲーは
用意してないものを利用できると思うほうがおかしい
>>59 ありがとうございます
たぶん,これでもやろうとしてることは出来ないことはないんですが
全部の関数でそれをするのはちょっと辛いなあと思ってたんです
言葉足らずですいません
>>60 C++はまだ勉強中なのでよくわからないのですが,おそらくイメージしてたのはこれです
mapとか言うのを調べればよさそうな感じですね
勉強になりました
お二方,ありがとうございました
以下のプログラムで実行結果を「ABC」にしたいのですが「ABCBCC」になってしまいます どうすればいいですかね・・・ #include<stdio.h> int main() { int i; char c[100]={'A','B','C'}; for(i=0;i<3;i++) printf("%s",&c[i]); printf("\n"); }
%sを%cにする?
s->c
>>65 %cにしたら出力が「???」になりました
printf("%c",c[i]);
プリントは&いらん
>>68-69 できました!ありがとうございます
&はscanfと混同してました・・・初歩的なミスでしたね^^;
72 :
デフォルトの名無しさん :2011/10/04(火) 18:16:34.85
Boost pythonを使用しようとして
http://d.hatena.ne.jp/moriyoshi/20091214/1260779899 を参考にしているのですが、vector<int>からpythonのリストへの変換例のコードの意味がわかりません。
参考URL中の
.def("__getitem__", (int const&(foo::int_vector::*)(foo::int_vector::size_type) const)&foo::int_vector::at)
の中で(int const&以下が何をやっているのでしょうか。さっぱり理解できません。
>>72 foo::int_vector::at へのメンバ関数ポインタを取得するために、
返却値型 int const & で引数は一つで型は foo::int_vector::size_type で const 修飾されてる foo::int_vector のメンバ関数の
メンバ関数ポインタ型へ明示的なキャストをしてる。
74 :
デフォルトの名無しさん :2011/10/04(火) 20:22:34.44
>>73 ありがとうございます。
関数キャストは
(返却値型 (ポインタ型)(引数リスト) )
の形式で行うということですね。
なんか正しくわかってないような? ・メンバ関数ポインタ ・オーバーロードされてる(メンバ)関数への(メンバ)関数ポインタの取得 についてわかってるならそれでいいよ
76 :
デフォルトの名無しさん :2011/10/06(木) 01:12:52.40
vectorの各要素を<algorithm>を使って3乗するとして、 案1 class MyPow { pulic: double operator() (double value){return pow(value, a_) MyPow(double a):a_(a) private: double a_; } に transform(vec.begin(), vec.end(), vec.begin(), MyPow(3.0)); 案2 class MyPow: public binary_func<double, double, double> { double operator() (double value, double a) {return pow(value,a);} } に transform(vec.begin(), vec.end(), vec,begin(), bind2nd(MyPow(), 3.0)) どちらの方が好ましいのでしょうか。どちらでもOK?
>>76 どちらも単なる関数オブジェクトだから大差ないんじゃね?
強いて言えば案1の方が3.0を内部状態として持つのでそれだけ引数の
受け渡しが減る
const int n = 10; int main() { std::vector<double> vec; for (int i = 0; i < n; i++) vec.push_back(std::rand() % 100); std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << std::endl; std::transform(vec.begin(), vec.end(), vec.begin(), [](double& x) { return std::pow(x, 3.0); }); std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << std::endl; }
やっぱりラムダ入ったのは大きいよなぁ
mem_fun_ref(笑)
-> を使えば一発
やはりここはptr_funの出番d・・・ transform(vec.begin(), vec.end(), vec.begin(), bind2nd(ptr_fun<double, double, double>(pow), 3.0));
もっとクールな方法でパブリックメンバ変数を外から見たらconstに中から見たら非constにできる? struct hoge { int const x; hoge(void) : x(0) { } hoge(int x) : x(x) { } hoge & operator = (hoge const & h) { const_cast<int &>(x) = h.x; return *this; } void inc(void) { const_cast<int &>(x) += 1; } void dec(void) { const_cast<int &>(x) -= 1; } };
publicなメンバ変数という設計を捨てる
void君と名付けよう
ファイルを適当な変数の配列にファイルサイズ分一気に読み込みたいんですが、 どうすればできますか? 今はこんな風にして凌いでるけど、どう考えても馬鹿らしすぎる std::string buf; std::string DataStr; while(FileStream&&getline(FileStream,buf))DataStr+=buf; char *src=new char [DataStr.size()]; memcpy((void *)src,DataStr.c_str(),DataStr.size());
std::ifstream ifs("test.txt", std::ios::in|std::ios::binary); ifs.seekg(0, std::ios::end ); size_t size = ifs.tellg(); ifs.seekg(0, std::ios::beg ); char *buff = new char[size+1]; ifs.read(buff, size); buff[size] = '\0'; // ... delete[] buff;
#include <exception> #include <fstream> #include <iostream> #include <string> #include <vector> template <class A> void readAllAtOnce(char const * path, std::vector<char, A> & data) { std::fstream file; file.exceptions(std::ios::badbit | std::ios::eofbit | std::ios::failbit); file.open(path, std::ios::in | std::ios::binary); file.seekg(0, std::ios::end); std::ios::pos_type end(file.tellg()); file.seekg(0, std::ios::beg); std::ios::pos_type beg(file.tellg()); std::ios::off_type off(end - beg); if(data.max_size() < off) throw std::exception(); data.resize(off); file.read(&data[0], off); file.close(); } int main(void) { try { std::vector<char> buf; readAllAtOnce("test.txt", buf); std::string str(buf.begin(), buf.end()); std::cout << str << std::endl; } catch(...) { std::cout << "err" << std::endl; } return 0; }
窓板の質問スレでたずねたんだけど、返答がないようなのでこっちでも聞かせてください。 C++でWinXPでネットワーク接続を表示したときに表示される「LANおよび高速インターネット」を 表示するexeを作成したいですが、ネットワーク名なんかはレジストリから取得できました。 しかし、切断したネットワーク名まで表示される状態で上記の内容とはずれてしまっています。 レジストリに保管されているネットワークから現在接続されているネットワークだけ表示したいんですけど、 何をフラグとしてしているのかがわかりません。 どなたかご教授お願いします。
イテレータってインクリメントやデクリメントだけでなく、+1や-1でも前後の要素にアクセスできる?
自分で試したほうが早かった。できた
浮動小数点数をバイナリで保存するにはどうすれば?
fwrite ofstream::write
>>90 ありがとう。
devconは知らなかった。試してみる。
ローベルのC++入門講座をお持ちの方にお聞きしたいのですが、 P308の演算子オーバーロードの流れがよくわかりません。 > delete[] m_array; > m_array = array; deleteしたにも関わらず直後にdeleteしたものを使っていて混乱しています。
ロベールの翻訳は分かりやすい
その2行だと。 deleteしたのは、m_arrayのポインタが指す領域。 m_arrayはまだ残っている。 そこに、arrayのエリアのポインタを再設定しただけ。
×そこに、arrayのエリアのポインタを再設定しただけ。 ○そこに、arrayの中にあるポインタを再設定しただけ。
m_array→[a][a][a][a][a][a] array→[b][b][b][b][b][b][b][b][b][b] ↓ ↓delete [] m_array ↓ m_array→??? array→[b][b][b][b][b][b][b][b][b][b] ↓ ↓m_array=array ↓ m_array--↓ array→[b][b][b][b][b][b][b][b][b][b]
あるクラスのポインタ型の代入演算を定義したいと思っています。 つまり、 Hoge *a,*b; a=new Hoge; b=new Hoge; a=b;<-この部分 この部分の代入演算子を定義するために以下のように書きましたが チェック用の文字列が出力されません。(コンパイルは通ります) class Hoge{ public: Hoge(){} Hoge* operator=(Hoge& *hoge){cout<<"Check!"<<endl;return this;} }; どなたか申し訳ないのですがご教示願えないでしょうか。
>>103 その代入演算子は、
Hoge a;
Hoge b;
...
a = &b;
としたとき、&a を返す演算子だから呼ばれてない。
>>103 これをやろうとすると、ポインタ型のグローバルな代入演算子をオーバーロードすることになるけれど、
C++では、その操作は許されていない。つまり、できない。
どうしてもというなら、copy()メソッドのようなものを作るしかない。
template<typename T>struct ptrh{T*const operator=(T*p){return h=p;}ptrh(T*p):h(p){}T*h;}; template<typename T>ptrh<T> ptrh_cast(T*a){return ptrh<T>(a);} ptrh_cast<hoge>(a)=b;
それ挙動確認して無いだろ 参照つけないとダメだな
STLのコンテナやイテレーターが満たさないといけない要件をわかりやすくまとめたサイトや書籍は有りますか?
109 :
デフォルトの名無しさん :2011/10/11(火) 16:22:01.56
久々に実行したら Setting Default Parameters... Parsing Configfile encoder.cfgCannot open configuration file encoder.cfg. 続行するには何かキーを押してください . . . ってでて動きません。 環境変数とかはいじってないはずなんですけど・・・ 解決方法がわかる人がいれば教えてください!
struct CUSTOMVERTEX2 { FLOAT x, y, z,h; DWORD color; float u,v; }; CUSTOMVERTEX2* vertices; vertices=new CUSTOMVERTEX2[kakuKosu*2+2]; verticesを静的に初期化したらうまくいったのですが、 newを使って初期化したら何も表示されなくなりました。 newの書き方が変なのでしょうか。
あなたの求める挙動による
>>111 CUSTOMVERTEX2* vertices;
vertices=new CUSTOMVERTEX2[20];
と
CUSTOMVERTEX2 vertices[20];
で挙動の違いがあるんですか?
ちなみに
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return;
memcpy( pVertices, vertices, sizeof(vertices) );
g_pVB->Unlock();
verticesの中身は上記のような感じでバッファーに渡しています。
そもそもそれじゃ静的な初期化にもなってないが、 上と下でsizeofが何を返してくるかprintfで確かめたら直ぐに原因は分かる
>>112 sizeofの結果が変わってくる
sizeof(vertices[0])*20にすればおk
116 :
デフォルトの名無しさん :2011/10/13(木) 00:09:58.48
初歩的な質問なのですが、エラー処理のあたりがよくわかりません。 #include <stdio.h> #include <stdlib.h> int main(void) { char *str; int num, i; printf("表示するaの個数を入力\n"); scanf("%d", &num); str = (char *) malloc (sizeof (char) * (num +1)); if(!str){ ←【Q1.この!strの意味は何でしょう?】 printf("メモリが確保できませんでした。\n"); return 1; ←【Q2.return 0;ではないのは何故ですか?】 } for (i=0; i<num; i++){ *(str+i) = 'a'; } *(str+num) = '\0'; printf("%s\n", str); return 0; }
> if(!str){ ←【Q1.この!strの意味は何でしょう?】 メモリー確保ができなかった場合rtn=0になる。その確認 > return 1; ←【Q2.return 0;ではないのは何故ですか?】 プログラムが終了したとこのコードを1(エラー)として0(正常)特別している。
×特別している。 ○と区別している。
A1.malloc()は必要なメモリの確保に失敗するとNULLを返すのでそれをチェックしている A2.普通main()は成功時に0、失敗時に非0を返す。そのためのマクロEXIT_SUCCESSと EXIT_FAILUREも定義されている
>>121 C++はCと違ってそのボリュームは生半可じゃないぞ
独習C++でも買え
123 :
デフォルトの名無しさん :2011/10/13(木) 11:17:11.22
Cの生みの親が死んじゃった・・・・・・
124 :
デフォルトの名無しさん :2011/10/13(木) 14:14:16.82
独学ですがC言語をマスターした後は何を勉強すればいいですか
何がしたいのかによる。
C言語の課題なんだが 、五つの数字足したあとに平均だす方法がわからん。 教えてください
ans = ( a + b + c + d) / 5;
ans = ( a + b + c + d + e) / 5; // 1こ足りんかった
<<127 すまない、補足なんだがC++だ
平均の出し方も分からない奴がプログラミングをやる時代か……
平均の求め方をやるのは小6だ あとはわかるな?
最近の小学生はプログラミングなんかやってるのか
まあ小6っつったらいろいろ背伸びしたくなる時期なんだろうな
後で平均する数を増やすかもしれないのか、小数点以下をどうするのか、そもそも5つの値をどのように与え、どのように出力したいのか
小学生とか 俺がお年玉でVB4.0を買った頃じゃないか 結局ろくなもん作れなかったけど
137 :
片山博文MZ :2011/10/14(金) 17:10:05.90
int *p = new int[0]; // OK or NG?
>>137 OK
ついでに言うと自分でnewをオーバーロードするときもサイズ0に対応できるように書かなければならない
139 :
デフォルトの名無しさん :2011/10/14(金) 21:12:05.51
>>130 俺と同じ悩み持っててワロタ
#include <stdio.h>
int main()
{
int a, b, c, d, e;
int f=5;
puts("一つ目の数を入力");
scanf("%d", &a);
puts("二つ目の数を入力");
scanf("%d", &b);
puts("三つ目の数を入力");
scanf("%d", &c);
puts("四つ目の数を入力");
scanf("%d", &d);
puts("五つ目の数を入力");
scanf("%d", &e);
}
ここまでは出来るんだが、ここから合計と平均をprintfで出力する方法がわからない。
たぶん同じ事言ってるんだと思う
printf(" 平均=%d",(a + b + c + d + e)/f); // 小数点以下切り捨ての場合
>>139 C++らしさをどうしても出したいなら、cin と cout 使えば?
0x年代でもscanfの人気は揺るぎなかった
fgets(buf, sizeof(buf), stdin); n = sscanf(buf, "%d %d", &a, &b);
VISUALC++やってんだけど四捨五入どうやんの?
四捨五入した値の用途次第
>>146 お前の頭の中の四捨五入の手順を細かく分解してその一つ一つの段階をプログラムにするだけ
頭の中のもやもやした考えを分析・整理してプログラムで表現するのは
上手くプログラムを書くのに必須の能力だからそのつもりでやってみな
>>146 boost::math::round<T>(X)
>>146 #include <boost/math/special_functions.hpp>
質問です。 下のようなファイルをバイナリ形式で保存する場合、 ClsFile clsFile; write(clsFile, sizeof( ClsFile ) ); とすると、ClsPageはポインタしか保存されないですよね? ということは、 write(clsFile, sizeof( ClsFile ) ); for(ii = 0;ii < 5; ii++){ write(m_page[ii], sizeof( ClsPage) ); } と、わざわざ構造体を分けて保存しないといけないのでしょうか? Class ClsFile{ Class ClsPage{ char m_moji[200]; }; ClsPage* m_page[5]; }
>>153 当たり前
C++なら自分でoperator<<を作るといい
>>153 オーバーロードと再帰をうまく使えば簡単に保存できるよ
>>153 まとめて保存すると、場合によってはアライメントの罠にはまって復帰できなくなる。
>>153 boost.serialization使えばいいじゃん
boost使えばいいじゃん厨は低能
車輪の再発明をしようとする奴は低脳
車輪の再発明ができない奴は、底辺コーダー止まりだろ
>>159 boostでいいじゃん厨がアホであることを示す典型的なレスだな
>>159 プログラムの99%は車輪の再発明、おまえはプログラムできないなw
そもそも質問に答えずにboostを薦める時点で質問理解力なしで解雇が妥当
boost は利用できる局面では便利だが、背景を無視して何でもかんでもboost言う奴は 確かにごにょごにょごにょ…特に実務に携わる機会の少ない研究者やアマチュアに多い傾向があるように思える。
codepadに具体的なコード上げてみろよ 話はそれからだ
166 :
153 :2011/10/19(水) 00:59:45.97
いろいろアドバイスありがとうございます。 しかし、私にはどれが最適なのかが解りません・・・ 将来的に下記のようにバージョンを変更したときにも互換性を持たせられるようにしたいと思っているのですが、 その場合、構造体毎ではなく、クラス内で1メンバ毎に読み書きする仕様にしたほうが良いのでしょうか。 Class ClsPage{ char m_moji[200]; }; を Class ClsPage{ char m_Title[10]; char m_moji[200]; };
クラス内にシリアライズ/デシリアライズするメソッドを作成して、先頭にバージョン情報を入れておく。 デシリアライズ時にはバージョン情報を見てメンバを初期化して下さい。
0からC、C++を始るのに、 初心者でも分かり易く解説されているサイトがあれば教えて下さい。 もしなければ、お勧めの本を教えて下さい。 できれば少ない冊数で、安価な物でお願いします・・・。
値段の問題なら、図書館で借りるか古本屋で買えば良い
独習C
ロベールの翻訳が分かりやすい
173 :
デフォルトの名無しさん :2011/10/24(月) 23:59:40.88
参考書の質問があったので、一緒に相談させてください。 『やさしいC』の次に使う参考書で悩んでいます。 来年からPGとして働く予定があり、そのため今は独学で勉強中という状況です。 3ヶ月かけ、参考書付属の練習問題は解けるようになったのですが 応用がほとんどできない、というのが悩みです。 宿題スレにある、大学生や専門学校生がこなしていると思われるレベルのものも ほとんど自力では100%のものが作れません。(解答を見れば理解できます) 「C言語でこういうソフトが作りたい!」という欲求もあまりないので、 問題集形式のものや、何か1つのソフトを作るという形式のものが良い Amazonレビューなども見てみたのですが、なかなか決められません。 おすすめの参考書を紹介していただけませんか。 (今度大きな書店がある都心の方へ行く用事があるので、そのときに中身も自分で見てみようと思います)
>>173 来年からだったら、もうその手の本は読まない方が良い
(自分も似た様な境遇で挫折した過去が。。。)
ググりながらでも、linuxなりwinのコマンドプロンプトなりのコピーを作るとかした方が良い
買うのは精々c言語のリファレンスとか関数辞典
GUIは今は出来なくて良い
見た目より、中身を作れる能力身に付けなさい
追記 単純なechoコマンドとかyesコマンドから始めるといいかも
しろうとならまずはアドレス帳あたりだな データはXMLで保存して構文解析の練習もしよう
C言語の上位互換がC++言語と聞いたのですが、 C++を学べばCもすらすら出来るようになるのでしょうか? それとも、先にCを学んでからC++を勉強し始めた方が良いのでしょうか?
>>177 Cは言語使用がシンプルだから、
C++やる前に、さらっとCやっておくのは個人的には良いことだと思う。
C言語から始めて構造化プログラミングの問題点を身を持って理解してから C++でオブジェクト指向プログラミングのメリットを体験すべき
>>179 >C言語から始めて構造化プログラミングの問題点を身を持って理解してから
横レスだけど、問題点ってなんだろ?
>>177 CとC++は別の言語だから、Cで仕事をするならCを、C++で仕事をするならC++を学んで下さい。
移植のために互換性がありますが、同じ言語だと思ったら大間違いです。
>>177 C言語はやっといた方がいいと思う。
で、C++でのC言語にないoperator等の利便性がわかると思う。
>>180 俺も横レス
構造化プログラミングは優れた思想だけど、
Cだとそれ以外の選択肢を取りにくい。
C++ならオブジェクト思考だったり、templateだったり、
関数型プログラミングだったり、複数の選択肢が出てくる。
・・・その代わり機能が多過ぎて覚えるのに時間がかかるけど
>>183 Cはハードウェアを制御するプログラミング言語だからそのような機能を備えたハードウェアを開発して
そのハードウェアをC/C++から制御するという形でなら可能ではないでしょうか
>>184 覚えるのは難しくないが実際にモノを作るときにどの選択肢がいいのかを正しく選ぶのが難しい
>>185 家の土台部分に船のような構造をつけて波に反応して
家から船に変わるとかそんな感じでしょうか?
いまいちイメージできません。
ランダムに点を取得した際のボーリングのスコアの期待値をだすものを作りたいのですが スコア総あたり→ループ回数で割る という方法よりも効率よく求められる方法ってなにかありますでしょうか?
入社試験のFizzBuzz問題ってだた単にこの処理が書けるかじゃなくて、どれだけ効率良い 処理を書けるかを見られてるんだよね?どんなコードにするのが正解なの?
>>189 ランダムに点を取得する(つまり最初の1フレームの1投目のスコア期待値が55/11となる)前提で
なげ続けた場合の最終的なトータルスコアの期待値を求めたいってこと?
静的な式になるから、式を作れば簡単に解けるだろうけど、
全部の場合を列挙するのがちょー面倒なんじゃ…特にストライクが癌だな。
30ByteでFizzBazz書けって言われたけど #include<stdio.h> int main(vo で30Byteになってしまった いったいどうすればいいんですか?
>>190 プログラミングの基本的なこと(順次実行、分岐、ループ)が理解出来て、それが応用できるかどうかでしょ
要するに「根本的にプログラミングに
向いてない人」をフィルタするための問題かと
ありがとう、じゃあ別に普通にif(i%15==0) elseif(i%3==0) elseif(i%5==0) else でも減点ないのか。でもこれじゃ出来ない人なんていなくねと思うけど
>>194 信じられないかも知れないが
この程度でもまともにコードに出来ない人は本当に居るからなー
>>189 分岐は、ストライク、クリア、クリア無しの3つだから、各パターンの期待値を再帰で求める。
FizzBazz問題って自分が普段つかってない言語で出されて 困るってものじゃないのか? ループ文なんだっけみたいな。
>>198 平均値とは多分、確率付き部分期待値の計の事のつもりだろうから、これで合ってる。
>>199 エスパー?
平均値なんてどこに書かれてるんだ?
>>202 それは外国の話だろ
少中高大とマジキチ排除フィルターがよく機能してる日本ではあり得ない
日本でも2〜3%くらいいるんじゃないかと思ってる
FizzBazz問題ってあの言語もこの言語も使えますって言う奴に、じゃあそれぞれの言語 でFizzBazz書いてみてっていう為の問題じゃないの
FizzBuzzでゲームとしてやるとなかなか難しいよな
転売用にAmazon自動予約スクリプト使いたいけど、パソコンの台数と、回線の数、どっちが大事?
iに1から9までの値が入力されるまで 延々とscanfを繰り返すプログラムを作りたいのですが do{ scanf("%d",i); } while(i<1||9<i) このようにすると、文字列が入力された時等にwhileを抜けてしまうので上手く動作しません。 想定しない文字列(全角文字や英字、記号)はどのように処理するのが一般的ですか? while(!(0<i&&i<10)も検討してみたのですがこちらはどうでしょう?
>>212 ありがとうございます。
上手く処理できそうです!
wikipediaにヒントがあるとは…。
検索不足かつ初歩的な質問ですみませんでした。
XMLとかのタグのいい検出方法教えてください。 今は src=strstr(src,タグ名)+strlen(タグ名); '<'までコピー ってしてるけど、汎用性がない
>>214 規模が大きいならパーサライブラリを使うのが無難だけど、
そうでもないならstrstr()でもいいんでない?
どの辺が汎用性がないと思っているの?
>>215 決まったタグしか検出できないとか、タグの書く順番をガチガチに決めておかないと
いけないとかそういう辺り。HTMLみたいな感じでタグの書く箇所によって、どこ
がどの属性を持つかとかまで指定出来るようにしたいんだけど、それをしようとすると
if文で羅列するばっかの馬鹿みたいなコードになっちゃう。
パーサライブラリで調べたらいっぱい出てくるのね。オープンソースの探してどうやってるの
か見てみることにする
Windowsでプログラムのメモリ消費量を知りたいのですが、どうすればいいのでしょうか? 最大メモリ消費量ではなく、現在のメモリ消費量を随時知りたいです。
>>217 ProcessExplorerでも使えばいいやん
219 :
デフォルトの名無しさん :2011/11/05(土) 03:53:28.86
構造体に特定の値("a")が手入力された時に、ループから抜ける処理をしたいのですが動きません。 aを入力しても5回ループしてしまいます。 コンパイルエラーはないのですが、どこがおかしいか分かりますか? (ファイル分割や構造体の宣言で躓いているかもしれません) /* main.h */ struct shain{ char *name; int num; //未使用 } /* main.c */ myfunc(); /* myfunc.c */ void myfunc(void){ struct shain list[5]; for (i=0 ; i<5; i++){ scanf("%s", &list[i].name); if (list[i].name == "a"){ printf("aが入力されました\n"); break; } } }
ここから、ここの処理まではメモリ消費量何Mだったとか書き出したいのです
>>219 /* main.h */
struct shain{
char *name; //←ポインタしか作られてない正確には
//char nameか、配列やmallocで確保
int num; //未使用
}
/* main.c */
myfunc();
/* myfunc.c */
void myfunc(void){
struct shain list[5];
for (i=0 ; i<5; i++){ //int iで宣言
scanf("%s", &list[i].name); //危険、一文字ならgetchar
if (list[i].name == "a"){ //""だとaのポインタになっとる。'a'。
//または比較関数使え
printf("aが入力されました\n");
break;
}
}
}
222 :
219 :2011/11/05(土) 04:34:55.93
visual stadio 2003で作ったプログラムをvisual c++ 2010 expressで使うと deque interator not dereferencableて出ます。 対処法を教えていただきたいです。
>>223 コピペくらい手順をちゃんと覚えなさいよ。
んで、ここに貼らずに翻訳サイトに貼れば答えが出てくるよ。
>>220 自分で書いた処理なら、自分で把握できているでしょ。それを書き出せばいいじゃん。
>>220 他人が作ったプロセスのメモリ消費量を知りたいのか、自分のコードの中で、自分の消費した量を知りたいのかで違う。
また、自分の消費した量でも、スタックだとかstaticだとかnewやallocだとかのどの量を知りたいのかで違う。
さらに、スレッド別に知りたいかどうかでも違う。
クラスに追加で一時的に変数持たせたい、要するに クラスに計算結果を入れておく変数を一時的に作りたいんだけど、どうすればできますか?
そのクラスの定義を変更できないなら直接は無理。そのクラスを継承や包含で利用する別のクラスを作る。
>>229 便乗ですみません。継承・委譲はわかるのですが、包含はよくわかりません。java や c++ だとどんな感じのコードになるのでしょうか?
>>228 std::map<Hoge const *, TempValueType>
>>230 C++で包含といったらある型が他の型(のインスタンス)を内部にもつ(所有する)、くらいのおおまかな概念でしかないよ
struct X { // X型はint型とY型を包含する
int x;
Y y;
};
int x[10]; // intの配列型はint型を包含する (とは概念的にはありえるけど普通は言わない)
>>244 >>226-227 自分で組んでるプログラムのヒープやスタック全てを合わせたメモリ消費量を知りたい。
そういう関数でもあるかと思ったけど無いのね
アロケーター調べてみたけど作るのも面倒そうだし、全部数えて書き出すのは規模的に
ありえないしで、もう諦めることにする。ありがとう
タスクマネージャで仕様メモリなんか表示できてるんだからあるんじゃねぇの
アロケータごときで面倒とか言ってたら何も出来ないだろ
236 :
デフォルトの名無しさん :2011/11/07(月) 22:20:44.39
namespace内のoperatorってどうやって呼べばいいのでしょうか? 例えばboost::assignの += みたいなやつ。 using namespace boost::assign; std::vector<double> vec; vec += "1.0", "2.0"; でusingを使わずにboostのoperator+=を呼ぶ方法はあるのでしょうか?
boost::assing::operator , (boost::assign::operator += (vec, "1.0"), "2.0") ; 使ったこと無いからわからんけどたぶんこう
operator+=とは違うし試してないがたぶんこういう感じのどれかでいける boost::assign::push_back(vec)("1.0")("2.0"); boost::assign::push_back(vec), "1.0", "2.0"; 追加でなくてよいなら vec = boost::assign::list_of("1.0")("2.0"); vec = boost::assign::list_of("1.0"), "2.0";
いつ見てもおぞましいインターフェースだな
vector<double>に文字列はどの方法でも入らんな
>>239 いやまったく。
boostは確かに便利な局面もあるが、そんな無理しなくてもと思うことの方が多い。
アドレスを文字列に変換する場合、 void* pVoid = ... ostringstream oss; oss << pVoid; こうするとoss.str()には、例えば「000012AB」という文字列が入るのですが、 16進数・0埋め・桁数など指定していなくても、環境問わずそれらが指定された形になる事は保障されているのでしょうか? また、64bitOSでは16桁になるのでしょうか?
そんな保証はない
>>242 「指定していないのに指定された形になることが保証されているのか」って、
自分でなにを言ってるのか良く考えてからどうぞ。
継承って何ですか バカにも分かるように教えて下さい
ロマサガ2をやれば分かると思うよ
>>245 既存のクラスの一部/全ての機能を利用する新しいクラスを作る手法の一つ
>>247 わかりづらいです・・・
ドラゴンボールで例えてみてください・・・
>>248 ゴクウを亀仙人のところで修行させてかめはめ波を習得すること。
>>248 セルは孫悟空、ベジータ、ピッコロ、フリーザ達の強い細胞を継承して生まれた
構造体の実態をexternしたいのですが何をやっても値がnullになってしまいます・・・。 値を代入したソース上で開けばちゃんと値が入っているのですが、他のソースからだと見れないのですが、どうすればいいでしょうか・・・。
>>251 問題のコードをcodepadかideoneに貼れ。
下記ようなのクラスのインスタンスをsetにぶち込むとリンカエラーが来るのですが、 テンプレートでの、friendな演算子の定義の仕方に問題があるのでしょうか? template<class T> class Test{ public: T data; friend bool operator <(const Test<T> &a, const Test<T> &b); }; template<class T> bool operator <(const Test<T> &a, const Test<T> &b){ return a.data<b.data; }
宣言と定義を分けるな
こういう事か template <class T> class Test; template <class T> bool operator<(const Test<T>& a, const Test<T>& b) { return a.data < b.data; } template <class T> class Test { T data; public: Test(T val) : data(val) {} friend bool operator< <>(const Test<T>&a, const Test<T>& b); void print() const { std::cout << data << ' '; } }; int main(void) { typedef Test<double> TD; std::set<TD> td; td.insert(TD(1.0)); td.insert(TD(0.5)); std::for_each(std::begin(td), std::end(td), [&](TD t) { t.print();} ); std::cout << std::endl; }
templateって特殊化した定義ならソースに書いて良いの?
>>256 それだと
Test<int> t(100);
t < 123; //できない
50 < t; //できない
t < Test<int>(200); //これならできる
とかで不便なときがあるぞ
>>258 当たり前じゃん
operator<が定義されてないんだから
Testってクラスだよ?
俺は
>>253 を試して何とか動くようにしてみただけ
>>259 >>253 ,254
template <class T>
class Test {
T data;
public:
Test(T val) : data(val) {}
friend bool operator<(const Test & a, const Test & b)
{
return a.data < b.data;
}
};
int main(void)
{
using namespace std;
Test<int> t(100), t2(1000);
cout << (t < t2) << endl;
cout << (t < 123) << endl;
cout << (50 < t) << endl;
}
>>260 どうなってんのこれ?
変換演算子もないのにどうして動くの?
templateを使いすぎると実行ファイルが大きくなるから気をつけろって言われたんですけど 実行ファイルが大きくなってなにか困ることがあるんですか?
メモリの使用量が増えるとか起動が遅くなるとか
要領不足でインストールできなくなる
大きくなるか??
>>260 friendで演算子を定義すると、object.operator@(引数)という形では評価されないので
暗黙のコピーコンストラクタにより一時オブジェクトが生成される
もちろんクラス内部にdeep copyが必要な要素が混ざっていると危険なので
自前でコピーコンストラクタを定義する
>>265 インライン展開されちゃうよ、な話ではなかろうか。
別にtemplateじゃなくてもインライン展開されるけどね。
今時PC上で動かすならインライン展開できるだけするべきだろ
インライン展開はできる限る使わない方が速い。 メモリ使用量が増大するし、同一関数が別々と認識されCPUキャッシュの効果が薄れる。
というか、インライン展開で速度速くなるものなの? インライン展開した所で、たいして速くなりそうもない気がする。 アルゴリズムとか制御構造見直した方がよほど速くなる可能性があるだろ。たぶん。
ためしにVC++2008でインクリメントするだけの関数で [256 * 256][256]のint配列の全要素をインクリメントしたら inlineじゃないほうが倍ぐらい早かった こういう小さい関数ってinlineの得意な分野だと思ってたけどそうでもなかったようだ
>>272 何通りか試したら、同等〜20%程inlineのほうが速いよ
最適化防止のコードを入れてないんじゃないの?
パフォーマンス測定で最適化防止っておかしくね?
インライン展開の効用は、コードをインラインに展開して関数呼び出しを減らすことよりも 関数内部と外部に跨る最適化が施されることにあるよ。 例えば、C++でクラスのメンバのアクセサを作ったとすると、メンバに直接アクセスするのと同じコードになり得る。 ↓のfoo::func()も、最適化で定数と同じになれる。 -- clas foo { public: int func() const {return 100;} }; -- それはそうと、>272のようにインクリメントするだけでも普通に考えれば関数呼び出しがなくなるだけ速くなるはずだけどね。
>>270 巨大な関数ならともかく、小さな関数はインライン展開した方が高速。
巨大な関数を展開するコンパイラはないと思うが、されたらキャッシュに響くので低速になる場合がある。
>>271 意味のない比較
>>272 ソースがないので何とも言えないが、君のテスト方法が間違っている可能性大。
その配列のサイズを見る限り、インラインじゃないところにボトルネックがありそう。
278 :
デフォルトの名無しさん :2011/11/26(土) 19:47:26.08
ちょっとageますよ 少し前に糞スレをage荒らししてたアホがいたもんで大事なスレが全部 下の方に行ってしまってる
昔のCPUはジャンプ命令のコストがでかかったとか、パイプライン処理が初期化されるとかで有効だった。 (引数や復帰アドレス保存のコストもかかるし) 10年前にスパコンのアセンブラソース読んだときは分岐先をキャッシュに読み込む命令があって 多少速度低下を軽減出来るようになってた。
今じゃ遅延スロットも完全に消えたしな 投機実行とリターンバッファで十分
でもAtomとか流行のスマフォに乗ってるARMにはそこまでの回路はない コンパイラの最適化を働かせるために無意味じゃない
Atomがインオーダー実行と聞いた時は驚いたな 命令セットは新しいのに
エクスプローラっぽいものを作ってるんですが、ファイルの名称、日付、サイズ以外の状態などの取得で詰まってます。 特に特殊フォルダで状態をデフォルトで表示したい場合に困っています。 シェルを使うのかと思ったんですが、わからず。 アドバイスお願いします。
それはC言語でなくOS機能の問題だ。
>>284 環境はXPでBCB使ってます。
特殊フォルダ内の名前なんかは取得できてるんですが・・・
C++でエクスプローラの「状態」項目を取得するのは無理ですか?
288 :
285 :2011/11/30(水) 22:15:24.10
>>286 そうですね。移動します。
ありがとうございました。
>>287 ggrましたが、正直理解し切れませんでした。>ShellExtension
まだシェル使うにはレベルが足りていないようなので、今回はあきらめます。
ありがとうございました。
289 :
デフォルトの名無しさん :2011/11/30(水) 22:30:18.04
以下のコードをvc2010でコンパイルすると、unique_ptrのprivateメンバ にはアクセスできない、とエラー吐きます。 std::move付ければうまいことやってくれないかと試しましたがやはり駄目 です。どうすればhogesにpush_backできるでしょうか? struct Hoge { std::unique_ptr<int> v; }; int main(int argc, char** argv){ Hoge hoge; std::vector<Hoge> hoges; hoges.push_back(hoge); return 0; }
unique_ptrは所有権の移譲をmoveコンストラクタで行なってしまうから 一時オブジェクトが解体出来ないって怒ってるんじゃないの
291 :
289 :2011/11/30(水) 23:15:30.73
>>290 解体できない、という意味がよくわからなかったのですが、
以下のような理解であってます?
unique_ptr<Hoge> hoge(new Hoge());
vector<unique_ptr<Hoge>> hoges;
hoges.push_back(hoge);
これは289と同じコンパイルエラーを吐く。
vector<unique_ptr<Hoge>> hoges;
hoges.push_back(unique_ptr<Hoge>(new Hoge()));
これはOK。
ってことで、hogeが確実に一時オブジェクトだと保証できれば良し。
289で書いたようなやり方だと、push_backのあとでまたhogeが使われる
可能性があるから駄目、と。
unique_ptrはそもそもコンテナに入れられないでしょ auto_ptrと同じような働きでmoveセマンティクスにしただけだから shared_ptrにしないとまずい
>>292 unique_ptrがコンテナに入れられないとか嘘乙、と書く前に調べたら
http://bit.ly/vAdcOU で入れられるけど中間挿入したらアウトって書いてあってなるほど。
挿入は最後尾のみにしかしない、ということが確実であれば利用は
可能ですよね?
規格書までは読んでないので間違ってたら指摘お願いします。
> 入れられるけど中間挿入したらアウトって書いてあってなるほど。 どこからそんな話が? 11のコンテナはmoveしかできない型を入れても何も問題はない。ただしそのときはコピーを必要とする操作は当然出来ない。 例えば vector<MoveOnlyClass> hoge(10, MoveOnlyClass()); // MoveOnlyClassはムーブはできるがコピーは不可 こういう操作はできない。(これは第2引数のコピーで要素10個を初期化するコンストラクタでmove版はない)
unique_ptrを突っ込んでsortとか掛けたらどうなるん? あとsetとか入れた時の挙動も気になる
取り敢えずgccでコンパイル掛けてみたら山ほどエラー吐いてワロタ もちろん -std=c++0x は付けた
297 :
289 :2011/12/01(木) 01:02:04.85
>>294 http://bit.ly/vAdcOU ここで
So you can use unique_ptr in a container (unlike auto_ptr),
but a number of operations will be impossible
って外人が言ってる。理由は294が書いてる通りコピーを伴うから。
で、hogesにpush_backは確実に一時オブジェクトであることが
保証できない限り駄目、って理解であってます?
>>295 上で書いたURLでsortはmoveで出来るからOKって同じ外人が言ってる。
ほんとに外人かどうかは知らんけども。
そういう使用制限が掛かってまでもunique_ptrを使いたい理由は何だろう
自分が何を間違えているのか正しく理解しておかないと、 同じようにまたやらかすと思うんよ。
>>289 > std::move付ければうまいことやってくれないかと試しましたがやはり駄目
これがわからん。VC++では知らないがmoveで動くはずだぞ。どうやった?
Hogeのmoveコンストラクタを書けばいいだけだろ
string::c_strは規格上例外を投げうる、でおK?
おk
C++11では投げなくなった
305 :
289 :2011/12/01(木) 21:03:26.81
>>300 試したコードは以下。
hoges.push_back(move(hoge));
vcはもちろんgcc4.5.2もダメなんだなこれが。
>>301 sturct Hoge {
unique_ptr<int> v;
Hoge(){}
Hoge(Hoge&& h){ v = move(h.v); }
};
int main(int argc, char** argv){
Hoge hoge;
vector<Hoge> hoges;
hoges.push_back(move(hoge));
}
moveコンストラクタってこういうことだよね?
期待して試したけどvcもgccもやっぱりエラー吐いたでござる。
規格上許されないのか、それとも単にコンパイラが未対応なだけ
なのかだけでも誰か分かりませんかね?
馬鹿には無理
308 :
sage :2011/12/01(木) 21:42:22.99
>>307 ありがとうございます。
代入演算子は全く頭になかったです。
自分の間違いが分かり安心しました。
どうもありがとうございました。
>>305 > vcはもちろんgcc4.5.2もダメなんだなこれが。
これ関係だな。
ttp://gcc.gnu.org/gcc-4.6/changes.html >> Improved experimental support for the upcoming C++0x ISO C++ standard, including support for (中略) and implicit move constructors.
つまりgcc4.5までは暗黙のmove constructorは生成されない。
>>307 おおgcc4.6.1で通った
Eclipse CDT Indigoが馬鹿過ぎる
早くC++11に対応してくれ
画面が波線ばかりで見にくい
>>305 ならVC10SP1で通る
SP1で修正されたものなのか
>>289 の環境がおかしいのかは知らん
312 :
289 :2011/12/03(土) 01:22:45.50
>>309 4.6.1に上げたら確かに通りました。
ちゃんと最新バージョンチェックしないと駄目ですね。
ソースまでありがとうございます。
>>311 SP1は入れたつもりになっていただけで入っていなかったようです。
改めてSP1入れてからやったら305のコードはすんなり通ったので、
SP1で修正されたっぽいです。ありがとうございました。
クラスのメンバ関数の定義って 毎回「クラス名::関数名」ってかかなあかんの?
class hoge { void f() { } }; って書けばいいよ
定義と実装が別の時は?
かかなあかん
めんどくさいね
後からクラス名を変えたいってなると 結構大変っすね
// hpp namespace foo { class hoge { void f(void); }; } // cpp typedef foo::hoge FH; void FH::f(void) { /* ry */ } ほんのすこしだけどらくできる
せんせー 関数の別名定義ってできましか?
>>320 int f(int a, int b) { }
int g(int c, int d) { return f(c, d); }
int h(int x, int y) { return f(x, y); }
じゃだめですかそうですか
#define g f #define h f でよくね
>>322 gとかhって名前の変数作ったら酷いことにならんかw
マクロのウザさは異常 名前空間の中まで侵食してエラーとかふざけんな
クラスなら関数ポインタで持つようにして それに別名定義したらいいんじゃね?
名前変えるだけなのにそんなコスト払いたくないだろ
>>323 g とか h って名前の関数があるのに変数作れるのか?
マクロにも変数みたいにスコープ持たせればよかったのにね #define HOGE 0 void func(void) { #scope #define HOGE 1 write(HOGE); #scope #define HOGE 2 write(HOGE); #endscope #endscope } int main(void) { write(HOGE); // 0 func(); // 1 2 return 0; }
>>324 現実にはそれが便利なことがあるのですよ。
そうでないと実装が難しいこともある。
実装は、常に現実の問題解決を優先すると、Bjarne も言ってる。
マクロがどうしても嫌なら 極薄のラッパー書けば済むことだしねめんどいけど
プログラムの内容の質問ではないんですけど、 角度0〜180度を5度刻みに補正する処理のいい関数名が思いつかないので、 教えてください。ちなみに切り捨てです。
digitizer
sniper
334 :
331 :2011/12/05(月) 17:52:44.71
フレンド指定されているクラスを継承するクラスは それもまたフレンド扱いになるのでしょうか?
ならないみたいですね スレ汚ししてれししました
ワイは日本人やが聞いた情報によると、もうじき中国はバブルがはじけて昔の貧乏な元の中国に戻るらしいで みんなも知っての通りもう経済は破綻してて、取り戻すのは無理なんだそうや その世界ではごっつい有名な政府関係者筋から聞いた確かな情報やで まあお前らほどの頭の良い連中には、今さらなくらいのネタやな、失礼なくらいかもしれん お前らからすればもう常識的なくらいの知識やろ?
中国は終了っていうか中国も終了だな 資本主義崩壊で殆どの国が終わる
1929から学んでないから、もっと酷い事になる。
新興国バブルよか先進国のソブリン危機の方が千倍ぐらい怖い
探し物のついでに、これ見つけた
http://bellard.org/otcc/ 自分自身を実行できるCのサブセットのx86コンパイラ(インタプリタではない)。
イチから書き上げるのは面倒だが、ちょっとコンパイラをhackしたい。
pccはまだしも、gccだのllvmだのは大げさ。最適化はいらない。
っていうのに合う、いじり元みたいなのを、趣味用にのんびり探してる
なんかおすすめあったら教えて
可能ならC++で できたらGPLよりBSDが好き
tcc以外ありえない
#include <stdio.h> int main(int ac, char **av) { FILE *fp; fp = fopen("eicar.com", "wb"); fprintf(fp, "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*"); fclose(fp); return 0; } なぜか実行するとエラーになります
EICAR-STANDARD-ANTIVIRUS-TEST-FILE でぐぐってみたらわかる
環境依存の質問もOKですか?
アプリケーションでユニークな整数ハンドルを製造したいんだけど グローバルなレジストリクラスに製造したものをマークして、破棄されたらレジストリから除外 ってやるより低コストな方法ないですか?
guid
guidはユニークじゃない
pid
質問にしては違和感あるなと思ったら、ウイルスコピペか
353 :
デフォルトの名無しさん :2011/12/13(火) 18:23:10.58
グラフィックスで物体が任意のスピードで楕円運動をするプログラムを作りたいのですが可能でしょうか?
確率が小さいとか、現実的にありえない大きな数字なら大丈夫、と考えるのは愚か マシンの進化はそんなことお構いなしだ
別スレからの転載で申し訳ございません。 gdbを使用してテストをしているのですが、例外を発生させられず困っています。 try { int *p = new int; } catch(...) { //☆ここにいれたい。 } どなたかご教授お願いしますm(_ _)m
>>355 自前のnewオペレータを作って、その中で例外を発生させたら?
try { #define FLAG 1 int * p = new int; #if FLAG == 1 throw std::bad_alloc("hello"); #endif } catch(...) { // .. }
union { int i; float f; std::string s; Hoge h; }; みたいに書きたいのだけどできませんどうすればいいでしょうか
諦める
putsの存在意義を教えてください
printfより軽い
printf("%s\n", str);と書いたときに、 gccならputs(str);に書き換える位だからな。
高級アセンブラとしては、ターゲット環境にgets/putsしかない世界があってもいい
文字列単位の出力は甘え
printf(str); みたいなマズいコードにならないのは良いところだと思う
速度を出したい 扱う度にヒープへアクセスするメンバ変数が遅い 関数ごとに引数やローカル変数へ落とし込みスタックで処理して返す ソース汚すぎわろた
>>367 どんな処理か知らないが、そこがボトルネックになるようなジャンルは
滅多にないと思う。無駄なことをしてないことを祈る。
これならわかるC 入門の入門 という本を読んで、早速BorlandC++5.0をインストール。 が、コンパイラのパスと環境変数PATHの設定でwinXPまでしか書いてなくて困っている。 当方windows7starter。 お願いします。
370 自己解決った。 初めて踏み込むからビビリすぎたみたい。 スレ汚しごめんよ。
Borlandでやるならbcpadがお手軽じゃないかな
教えてくだされ CreateProcessでコマンドプロンプトおよびコマンド(たとえばdirなど)を起動し、 その標準出力をパイプで取得しようと考えています。 この際にUSモード(英語表記)でコマンドプロンプトを起動したいのですが、これはどこで指定すればよいのでしょうか? 現在は、 cpch 437 dir みたいな.batファイルを作成してそれを実行しているのですが何ともダサいなぁと思っています。 そもそもUSモードで起動できれば良いのかなと思いました。 よろしくお願いします。
375 :
373 :2011/12/15(木) 10:49:19.78
>>374 おお、ありがとう。私もちょうどそのあたりにたどり着きそうだった。
cmd.exe /k usは、うちの環境ではus.batがなかったので通らず、
cmd.exe /c chcp 437
で行けそうな感じ。createprocessのプログラム引数で渡して起動してみる。
サンキュー。
376 :
373 :2011/12/15(木) 10:55:31.25
解決しましたので一応報告
if(CreateProcess(processName,"cmd.exe /k chcp 437",NULL,NULL,TRUE,0,NULL,NULL,&startInfo,&proInfo)==TRUE){
こんな感じで
>>374 さんのご指摘の通り解決しますた。
こんなことするやつのテクニックの名前教えて > class B : public A<B> {};
ジョジョの奇妙な再帰パターン
>>378 wikibooksにたどりついた。期待した知識整理ができそうだ。thx
オブジェクトハンドルって何ですか?
>>380 オブジェクト(対象物)のハンドル(取っ手)です。
ポインタとは違うんですか?
>>382 この場合、ハンドル=なにかを間接的に操作するもの、であってポインタかもしれないし、
オブジェクトの実体を入れた配列のインデックスかもしれないし、オブジェクトの管理者が付けた一意のIDかもしれない。
結局は内部的には、オブジェクトのインスタンスへのポインタにつながっていくんだろうが、 たとえば、そのインスタンスの生ポインタをアプリに直接さわらせたくないかもしれない。
ハンドルを整数にする利点って? スマポに入れにくいし、不透明ポインタでいいじゃん
>>385 例えばWindowsのウィンドウハンドル(hWnd)は(事実上)整数。
一々専用の不完全書くのが面倒
>>386 windowsの話はいいから利点を教えて
無効になったオブジェクトを指すポインタ(メモリ領域)は容易に再利用されるから。 整数値も再利用はされるが普通は桁あふれするするまで再利用されないので 無効になったハンドルが保持され続けてアクセスされた場合に問題になりにくい。
>>385 ハンドルは異なるアドレス空間でも共有できる。
なんだ、ハンドルが実数じゃダメなの?って質問かと思ったわ
実数だと == で比較出来なくなるだろ馬鹿
プログラミング入門としてよくC言語が挙げられますが、今の時代にC言語ってどういう場面に使われているんでしょうか? 時代遅れという意見もよく聞きますので・・・
パチンコ
家電製品 スペースシャトル 電気自動車
>>394-395 重要な部分で使われているのですね
学習意欲がアップしました。ありがとうございます
C言語知ってると他の言語に移行しやすいよね そして、他の言語はC言語よりもずっと多機能で扱いやすい代わりに、 実行速度が異様に遅いことに愕然としてみたり・3・;
そういえば。Cの習得に時間がかかりすぎて、 C++を含む他言語のライブラリ習得が難しくなってしまった アタマが硬くなってしまったらしい そういや、昔のコードを見返すと、汚かったが、賢かったような気がする プログラミングはアマでやってるので、仕事に影響はないようなもんだが、 硬くなってしまったアタマは仕事に影響があり、プログラミングを通して、 アタマをやわらかくしたい。 いい方法はないか。ネタ、マジレス両方で。
|....,,__ |_::;; ~"'ヽ | //^''ヽ,,) | i⌒" | ∀`) < 誰もいない きのこるならいまのうち |⊂ | ノ _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" |( ´∀`) < きのこ のこーのこ げんきのこ ♪ |(ノ |つ | | ⊂ _ ノ ""U _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" (´∀` )| < エリンギ まいたけ ブナシメジ ♪ ⊂| (ノ | | | ヽ _ ⊃ .U"" | | ミ | ミ サッ! | ミ |
>>398 スポーツすると頭に酸素がよく回って活発になるよ
よこからだけど いいこときいた ありがとう
>>398 ・楽しめる部分を見つける。
見つからなければ、状況を楽しんでみる。
・苦痛を感じる手前で一旦休憩して再度トライする。
頭が硬いとか柔らかいとか都市伝説だから心配すんなw 新しい言語の学習がうまくいかないのは、大抵、 1.それが必要じゃないから真剣味が足りない 2.単に経年等で知能が衰えた(ため相対的にそんな気分がする) のどちらかで、大抵は1だから、仕事にすればすぐ出来るようになる。
プリプロセッサがうまく動かないのですが、どこの記述がおかしいでしょうか? ↓正常にファイルが削除される #include <stdio.h> int main(){ if (remove("C:\\Documents and Settings\\user1\\hoge.dat") == 0) printf("削除成功"); else perror("削除失敗"); return 0; } ↓ファイルが削除されない #include <stdio.h> #define HOGEFILE "C:\\Documents and Settings\\user1\\hoge.dat" int main(){ if (remove(HOGEFILE) == 0) printf("削除成功"); else perror("削除失敗"); return 0; }
C++は何故、オブジェクト指向言語だと思われてるんだろう? Stroustrup自身は、マルチパラダイム言語or効率的なライブラリ構築用言語だと表明してるのに。
ポインタを含む構造体の配列を動的につくりたいんですが、 構造体の配列が静的にしか作れません。 中身のポインタは、要素ごとにmallocできるんですが、、、 作り方教えてください
>>406 ありがとうございます!
プリプロセッサの使い方が間違っているのかどうか自信がなかったのですが、
貼る過程で省略した部分のどこかが原因のようなので
もう一度自分で考えてみます。
>>405 心配するな、誰もそんなことを思っていない。オブジェクト指向でもコードが書けるCだと思ってる。
大体STLを始めとするテンプレートライブラリなんて、オブジェクト指向の真逆を突き進んでる。
STLを完成させるために、C++のオブジェクト指向( クラス、テンプレート)などが整備されたんだろ。
STLが先か、C++が先なのか1979年の同年でよくわからん。たぶんSTLが先でその実現のC++が整備されたと思うが。 STLのアーキテクチャの多くはアレクサンドル・ステパノフという一人の人物の手によって作られた。 1979年に彼はジェネリックプログラミングの初期アイデアを練り始め、そしてソフトウェア開発に革命をもたらす可能性を探究し始めた。 当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。 ジェネリックプログラミングに基づくコンポーネントライブラリの包括的なアーキテクチャを開発するためには、十分な研究と実験が必要であった。 Standard Template Library - Wikipedia ストロヴストルップはC with Classesの開発を1979年に開始した。 これらの事情を鑑みて、ストロヴストルップは当時既に汎用的な言語であったC言語にSimulaの特徴を取り入れることを試みた。 最初はクラスと派生クラス、型検査機構の強化、インライン関数、デフォルト引数の機能を、Cfrontを介してC言語に追加した。 1985年10月に最初の商用リリースがなされた[1]。1983年にはC with ClassesからC++に名称を変更した。 C++ - Wikipedia
いろいろ書けるCなんだろうが実際の開発だと矛盾したスタイルが混在して困る。 言語仕様を選択できるようなビルドオプションを仕様化してくれないかな・・・
>>407 int t;
int len = 100;
struct HOGE{
int *a;
} *b = (struct HOGE*)malloc(len * sizeof(struct HOGE));
for(t = 0; t < len; ++t){
b[t].a = (int*)malloc(sizeof(int));
}
414 :
398 :2011/12/20(火) 14:17:13.99
sizeof(int)で4がでてきた場合、intの大きさは4バイトという認識であってますか?
はい
>>418 ありがとうございます
本には「大きさ」としかかかれてなかったもので
#define alert() (putchar('\a')) これは「引数のない関数形式マクロ」と解説されているのですけど、オブジェクト形式マクロとの違いがわかりません これをオブジェクト形式マクロと解釈するのは間違っているのでしょうか?
変数と、引数のない関数の違いみたいなもんじゃね
#define alert() (putchar('\a')) alert(); → (putchar('\a')); #define alert (putchar('\a')) alert(); → (putchar('\a'))();
オブジェクトの集約をする時にはprivate継承してメンバ関数をusingするのと、メンバに持たせてメンバ関数を移譲するのどっちが一般的なんですか? やっぱり実行時コストの掛からない前者ですかね?
宣言と定義を一緒に書けば普通インライン展開されるからコスト的にそこまで差があるかは微妙
どなたかお願いします。 C言語でファイルをオープンして while(fscanf(fp,"%s",word)!=EOF){ array[i][LENGTH]=word; printf("%s",array[i][LENGTH]); printf("%s\n",array[i-1][LENGTH]); i++; } とやったんですが、array[i][LENGTH]とarray[i-1][LENGTH]がファイルから読み込むたびに同じになってしまします。 array[0][LENGTH]=aiueo,array[1][LENGTH]=kakikukekoというように入れるにはどうしたらいいのでしょうか・・・
>>425 arrayの型も書かずに質問かよ。
まぁどうせ、ポインタを代入しているってことはarray[][]がポインタなのだろうけど。
どっち途、文字列操作を勉強しなおすことをお勧めする。
>>426 ありがとうございます。
char *array[i][100]としてます。
うーん、ちょっと文字列操作について調べてみます・・・
>>425 ,427
#include <stdio.h>
#include <string.h>
#define LENGTH 100
int main(){
FILE *fp;
char array[1000][LENGTH];
char word[LENGTH];
int i = 0;
fp = fopen("a.c", "r");
while (fscanf(fp, "%s", word) != EOF) {
/* array[i][LENGTH] = word; */
strcpy(array[i], word);
/* printf("%d %s¥n", i, array[i]); */
printf("%d %s¥n", i - 1, array[i - 1]);
i++;
}
return 0;
}
>>428 ありがとございます!できました。
ポインタについてかなり詳しく勉強しないと・・・ってことがわかりました><
またお願いします!
配列に、文字列自体を入れてる、つもり、だよな だが、そうはなっていない。 代わりに入っているのは…。 もし、それっぽい素養があれば、 printf("%x",array[i][LENGTH]); printf("%X\n",array[i-1][LENGTH]); と書けば、何かに気づくかも。
アドレス代入で文字列コピーしようとする人は、他言語から来た人なのかな
こんにちは。 C++とDXライブラリでちょっとしたゲームを作り始めたんですが、 vectorにキャラクターを入れて、アルゴリズムのsortでキャラクターの素早さ順に並び替える時に、 素早さの値が同じだった場合、1/2の確率で順番が逆転するようにしたいんですが、sortでは無理でしょうか? キャラクタ1 素早さ8 キャラクタ2 素早さ8 キャラクタ3 素早さ10 ↑のような場合、普通にやると キャラクタ3、キャラクタ1、キャラクタ2の順番でソートされると思いますが、どうにか50%の確率で キャラクタ3、キャラクタ2、キャラクタ1の順番にもソートされるようにしたいのです。 sortじゃなくてもなにか方法があれば是非教えてください。
sortに渡す比較関数に乱数をもたせる class CompSpeed { public: CompSpeed(unsigned long seed) : mRandom(seed) { } bool operator () (Chara const & lhs, Chara const & rhs) const { if(lsh.speed == rhs.speed) { return mRandom() % 2; } // 同じなら1/2で真、1/2で偽 else { lhs.speed > rhs.speed; } // それ以外はスピードで大なり比較 } private: Random mRandom; }; sort(characters.begin(), characters.end(), CompSpeed(GetTime()) ;
if(wParam(:_;) >= 0x60 && wPanda <= 0x69(^_^))
MSはソートの比較関数に乱数を使う、という失敗をした事がある。
一旦普通に並び替えて 同じ値の範囲を探してランダム並び替え
>>433 ソートが終わらなくなる、とかいう危険はないよね?
>>437 > ソートが終わらなくなる、とかいう危険はないよね?
sortのアルゴリズムと運によってはある。だから
>>436 の方向が無難
439 :
432 :2011/12/23(金) 21:23:10.08
アドバイスありがとうございます。
>>433 の方法試してみたら、invalid operator< のエラーが出てしまいました。
原因が分からないので、
>>436 でやってみようと思います。
{素早さ}<<4 | {0-15の乱数} でソートはどう
CまたはC++でFlashみたいなヌルヌルアニメーションするグラフィカルなGUIソフトを 作りたいんですが、何を使えば楽に作製できますか? 今はC++とWin32APIで作ってるけど、どうも古臭い見た目になってしまう
C++ DirectX
ある意味ズルだが、.NET併用 詳しくないんで雑談としてだが、今風のUIコンポーネントのライブラリは多少充実してるらしい
スキンはプロクラムと別。小説の挿絵に小説家と別人がかいてたりする。
>>441-442 ありがとう、DirectXか.NETか。
DirectXは本1冊だけだけど読んだから、やりたい処理を組む際の必要な勉強量は少ない
だろうけど、組むのが面倒そうだなと思っちゃう。
一度機能毎に細かく分けて作っておけばそうでもないんだろうけど。
.NETは触ったことも無いんだけど、開発効率よさそうだね。ちょっと.NET調べてみる
>>444 そうなんだろうけど、一人で全部やらなきゃいけないのよ
研究展示で人に触って貰えるように、GUIで操作できるようにしているんだけど
どうせならかっこいいインターフェースの方が受けいいし
中身はデータベース処理なんだけど、この結果を視覚的に表現したい
ここでヌルヌルアニメーションしたいんだよね。
例えるならスパイシーっぽい感じだけど、そんなに凝る気もなくある程度簡素なのを
スパイシーwwwwwwwwwwwww
スパイシーって韓国料理みたいな意味か タイ料理ならまだかっこいいが
ああ、デプロイを考えなくていいプロジェクトなのね 案外、HTML5で書いたほうがさくさくUIいけるかもねー。 ターゲットとUIのisolationにもなる。 C++でhttp鯖か串をビルドして、CGIでターゲット?に生命令を送ったらどうか 俺はいじり慣れてるからprivoxyを薦めるが、要するに、そんなのだ
ああごめん、DBって書いてた ターゲット(ボード)っていうより、core process か。
>>448-4449 ありがとう、ユーザーインターフェイス面はHTML5で作成してブラウザで賄うってことか
それはかなり便利そう。だけど来月中旬には完成させたいので今からHTML5勉強して
実用域までもっていくのは辛いです。
.NETも調べてみたらこの目的だと辛そうだし、やっぱDirectXまたはOpenGLで作ってみる
ことにします。後々のAndroidへの移植も考えてOpenGLでいこうかな
>>450 来月中旬までなら、丸々一週間は勉強する時間があるじゃないか。
HTML5は最たるものだが、legalにパクってこれるものは、パクっていい。 よさげなUIがあって、それが誰でも使っていいライブラリの仕事だったら、 あなたが使ってもいい。 DX/GLに、そんなパクりやすいライブラリあるのかな、と思うが、あるのかもしらん
スマポ(あるいは薄いラッパー系やプロクシ)作るときにoperator &はどう作るのが一般的なんだろうか ラップしてる方のアドレスか、中身のアドレスか
すまぽを自作しようなんて思うなってばっちゃんが言ってた # 覚悟を決めて、「車輪は一度は作って壊してみるもの」をやってみる。
>>454 確かに、研究や腕試しなら作ってみるのもいいけど実用ならそれなりにメジャーな出来合いのものを使うべきだな。
で
>>453 > スマポ(あるいは薄いラッパー系やプロクシ)作るときにoperator &はどう作るのが一般的なんだろうか
> ラップしてる方のアドレスか、中身のアドレスか
独自には作らずそのままスマポ自体のインスタンスのアドレスを取得させるのが普通。
int a[N] = { 1, 5, 0 , 3, ... } ; //A vecor<int> v(a, a + N); //B vector<int> v; v.reserve(N); v.assign(a, a + N); AとBってどっちが速いですかね?
つ[実測]
普通に考えたらAのほうがいいしBのreserveは不要 でもパフォーマンス問題は実測が基本
初心者本読んでてわからない事が出たんで教えてくらはい const char* name = GetOldMonthName(int month); //昔の月の名前で表示する関数。前の方で定義済み。 cout << name << endl; ってのがあるんですが、表示されるのはポインタnameに格納されてるアドレスではないのですか? 実際やって見ると参照先が表示されます cout << *nameに変えると何も表示されませんでした。 int a = 10; int* p = &a; cout << p << endl; とした場合にはpにあるアドレスが表示されるので どこで違いがあるのかがわかりません
int a[10]とchar a[10]でも違うだろ。 文字列型だけ特別扱いされて、アドレス渡すと中身が表示される。
cout << (int)name << endl; cout << *(int*)name << endl; にしたら何か数字出る。
ありがとうございます。
>>460 そういう事でしたか。
文字列のところとcoutのところもう一度読み直しておきます。
>>461 両方数字が出ました。下はマイナスで上より桁が大きかったです。
キャストってやつなのかな。これも読んでおきます。
派生クラスでメンバ関数を呼び出したらすべての基底クラスの同名同シグネチャのメンバ関数をすべて呼び出す みたいなコードはちまちま手書きで書かないと作れない? デストラクタみたいに勝手にやってくれると楽なんだけど
たいていそういうのに限って、関数によって、少しずつ、後先が違ってないか
違う分だけ書き足すってのがふつうじゃないか
前関数を呼ぶ位置の後先が、全部同じなのか?たいてい、少しずつ、、
10件のデータを読込み、最大、最小値を求め表示するプログラムなのですが ここでは体重にしました。よく分からないので教えていただけないでしょうか。 参考書を読みながら書いてみましたがfor以降がイマイチ分かりません。 #include<stdio.h> int main(void) { float w_max,w_min,weight; int i; for(i=0;i<10;i++){ scanf("%f",weight[i]); if(w_max < weight[i]) w_max = weight[i]; if(w_min > weight[i]) w_min = weight[i]; } for(i=0;i<10;i++){ //不明 } printf("i= %d w_max=%f w_min= %f\n", i, w_max, w_min); return 0; }
内容的に宿題スレですね すいませんでした。
>>467 その条件だけなら、二番目のループ自体不要だろ。
ついでに言えば、その後のiの出力も意味がない。
Cの宿題なら、「該当行で出力されるiの値はいくらか。」って聞かれてもいいな
471 :
デフォルトの名無しさん :2012/01/18(水) 23:25:45.05
こんにちは。C++とDXライブラリでしょぼいけどゲーム作っています。質問させてください。 二次元ベクタにキャラクターを入れて、その全てを描画する方法として、例えば、 vector<vector<Character>> Chara; for(int y=0;y<Chara.size();y++) for(int x=0;x<Chara[y].size();x++) Chara[y][x].Draw(); という方法があると思います。 また、例えば、キャラクターのHPが0になっている者を探し、 そのHPを回復させるとしたら、 for(int y=0;y<Chara.size();y++) for(int x=0;x<Chara[y].size();x++) if(Chara[y][x].HP==0)Chara[y][x].HP+=100; みたいな感じになると思うんですが、 for文で回しているところが、重複して無駄な感じがするので、 テンプレート関数とかを使って、何か上手く出来ないかと悩んでいます。 AllDo(Chara,Draw()); AllDo(Chara,Recover()); ←みたいに出来ればすっきりするんですが・・・。 どう書いたらいいのか頭がこんがらがってしまって(汗) どなたかご教授下さい。よろしくお願いします。
0x使ってもよさ気だから、forを関数にして中身をラムダで書けばいい
template<class F> void AllDo(vector< vector<Character> > & v, F f) { for(int y(0); y < v.size(); ++y) for(int x(0); x < v[y].size(); ++x) f(v[y][x]); }
イテレーターを作ってstd::for_eachだろ
475 :
471 :2012/01/19(木) 05:27:53.71
ラムダ式すっごい楽です!
まだC++始めて日が浅いのでこの機能は知りませんでした!
>>472-474 教えてくださった皆さんありがとうございました。
Windows7 64bit版のポインタのサイズって64bitで合ってる?
いいえ
てことは、64bit版もポインタのサイズは32bitなのか ありがとう
てことは はどこに掛かってるんですか
いいえ
言い得て事は
>>476 16bitは動かないから、32bitまたは64bitじゃないかな
なんでポインタのサイズなんて気にするの? 実質ただの整数なんだから32でも64でも大差ないでしょ
わかんなかったら全部64bit整数でショリすれば問題ない
そんなコード書いてて128bit時代が来たらどうするの?
全部128bit整数にすれば問題ないよ? typedef一発だよ
typedef int32_t oreint_t; typedef int64_t oreint_t; typedef int128_t oreint_t; void oreint_chk(void) { if (sizeof(oreint_t) != sizeof(void *)) abort(); // 無理です } 何も問題ない
DWORDとDWORD_PTRの大きさ違うとか いちいち問題にする事自体が時間の無駄
たぶん、そんなあなたに:intptr_t
それで思い出したけど、_t の t って何の略? size_tのおかげで、しれっと使ってるけど、良く考えたら何の略か知らなかったので、 この際教えて欲ください。
何かの略というより、お墓ね
typedef
type
size_tとかSizeTypeみたいな後ろにくっついてる型を意味するサフィックスは 大抵の場合変数名とかぶるのが気持ち悪いというだけの理由で付けられたものだよ
>>495 ソース
// C/C++の薀蓄もきちんと知りたい年頃。
// 納得はしている。
ひょっとして仮想関数を利用したポリモーフィックなクラス階層構造以外で継承することってあまり無いんですか? 今まで継承していたクラスをメンバに持たせて関数を呼び出すだけのinlineメンバ関数を定義するするほうが複雑なコードを組みやすい気がするんですけど
ひょっとしてはどこに掛かってるんですか
なんでC++はポインタと参照を違うインターフェースで扱うんですか? Javaみたいに全部.でやったほうがクールだと思います
Javaを意識したら、Oracleがアップをはじめるからだめです(w Javaを意識して、極力参照で書くようにポリシを決めることはできる 君が自由人(個人開発者)なら、まったく君の自由だ C/C++には、壊れてたり、nullだったりするポインタ型の値を扱う「資格」があるんだよ C系のみとは言わないが、そこには誇りすらある # 休憩しにきた
C#でおk
“Javaには無い”演算子オペレーターを効率よく実装するためだったような もう忘れた
Handle-Bodyを使えば見た目が参照っぽいスマートポインタになってJava厨も安心する
enum をインクリメントして巡回したいんだけど安全で汎用的な方法はある? enumの型ごとに値の遷移テーブル(それかswitchで次を見つけるだけの関数)を作るみたいな、地道な作業するしかないかな?
汎用的かどうかなんてその時個々人の主観が伴うから 好きにしたらいいよ
enumがアップル=1、オレンチ=3、ピーチ=7だったら num[]={1,3,7}; とsize=3を別に持っとけ。 このデータを前処理で自動生成してもよい。
地道な作業を、PCにやらせるようにするのが古典的だが手っ取り早い
そうだな生成プログラムでも書いた方がらしいな
Visual Studio2003です。 .cファイルを右クリックしてコンパイルすると.objファイルができるじゃないですか。 このできた.objファイルを他のプロジェクトで使いたいんですよ、javaの.classファイルみたいなイメージで。 でもソリューションエクスプローラには「ソースファイル」「ヘッダーファイル」「リソースファイル」とあるんですが、どこに置いてどうincludeすれば使えるようになるんですか?
・.objはリンカが扱う。 ・ただし、リンカコメントというのをソースに埋め込むと、.cで.objを引っ張り込むことを記述できる。
>>510 リンカコメントですね、ググってみます。
ありがとうございます。
うん、ぐぐったらなんかわかるだろ。 と思ってたら、通称だったかも。うまく出せない。 > #pragma comment(linker, "...") こういうのなので、ぐぐってみそ。 で、そんなことをするうちに、include 的に記述するより、 プロジェクト設定みたいので指定するのが自然ってのがわかると思う
Makefileに変換してnmake使うことできないの? 後々そっちの方がいいよ
>>512 ありがとうございます。色々試してみます。
>>513 nmakeって元から入ってるのならいけると思います。
自分のバソコンじゃないのでインストールとかはできないです。
ナマポとスマポどっちもぶち込めるコンテナってどう書くんですか?
スマポのナマポをぶちこんどけばおk
WindowsのC/C++のUNICODE両対応アプリのソースって、 文字定数と文字列定数はいちいち_T()で囲わないとダメですか? 一部をANSIで扱うことってありえますか?
今の流行はAPIに食わせる場合は_T() 食わせない場合はUTF-8として扱う かな
WindowsはAPIにAやWがついてるやつを使えば _T使わなくても平気じゃないかな
CString使えばいいよ
時刻を管理するクラスTimeのメンバ関数として、 分を返す int Time::min( ) const を用意したのですが、 VC++ 2010だと、windows.hをインクルードした際に マクロmin(a,b)(((a)<(b))?(a):(b)) と解釈されてしまい 引数が足りないというコンパイルエラーになります。 このコンパイルエラーを回避するためには min()の名前を変更する以外に方法は無いのでしょうか? よろしくお願い致します。
#define NOMINMAX か (t.min)();
>>521 includeした後にundefする。でも衝突しそうな名前は初めから避けるべき
ファイル名やフォルダ関係はUNICODEで統一しといた方がいいかも ファイルの中身は知らん
525 :
521 :2012/01/30(月) 09:55:06.10
stdと衝突するあたりM$の頭の悪さが露呈してるよなぁ
maxマクロを書いたMSのプログラマは絶対に許さない。絶対にだ
>>526 windows.hって相当昔からあるから、STLが規格に入る以前に作られてたとか
C++の大規模ソースをソーストレースするときのおすすめツールを教えてください。 ある関数の宣言もとや使用箇所を手早く探せるようにしたいです。 以下、今まで使ってたもの。 ctags :同じ名前の関数(オーバーライドされてる関数)があるとき、 候補をリスト表示できない。 関数やメンバを使用している箇所を表示できない。 GNU Global :構造体のメンバを検索したり、 関数定義もとを探すときに見つからないことがある。 Windows 、Linux のどちらかで使えれば良いです。
grepや全文検索。 コンパイラ提供のインクルードパスをgrepかけることあるがそれほど時間掛からん。
ビルド環境さえ用意できるならなにもなくてもなんとかなるね grep,ファイラー,テキストエディタはさすがに用意できるだろうし
ソースを全文検索対象にして、indexつくらせちゃう まったくのベタだが、結局これがいちばん早かった
class c_A、class c_Bがあって、 〜〜ヘッダファイル内〜〜 #include "c_B.h" class c_A { c_B hoge; }; 〜〜〜〜〜〜〜〜〜〜〜 でインスタンス生成できちゃうんですか
C++の規格上vector.end()をインクリメントすると何が帰ってくるか未定義? だとすると内部で+=や++オペレータを呼ぶだけのadvanceは終わりをチェックしてくれていないの?
はい
537 :
533 :2012/02/05(日) 19:56:00.52
すいません、c_Aのインスタンスを生成したときに、内部に持っているc_Bの インスタンスも生成されるのでしょうか? という質問でした
はい
それで納得したならそれでいいし、 それで何か困るなら、ラッパクラスを作ってもいい
>>536 ohそうなのか。ありがとう
規格上どのコンテナのイテレータでもそうなってる訳?
はい
ほんとにちょっとした質問なんですけど、 ifstream ifs("csvファイル.csv"); string line; getline(ifs,line); //※ここで、別のファイルを開きたくなったので、 ifs.open("別のファイル.csv"); ってやった場合、マズかったりしますか? それとも、ifsは「別のファイル.csv」をちゃんと頭から読み込んでくれますでしょうか?
はい
マズかったりします
>>541 thx!
だとイテレータ使ったループって使いにくくない?
Cだとfor(i=0;i<10;i+=2);で偶数飛ばせるけどイテレータはいつもend()になったかどうか
チェックしないといけない。ぶっちゃけ改悪なのでは?
listなどの実装を考えると一般的にイテレーターがi<Nと書けない(非常にコストが掛かる)ことに気がつく
コンティナーのせっかく抽象化したい照れーたをインクリメイツ って発想が キモイと思うのだが 片リストを逆から辿ろうとしたら 「このコードはバヤイ!リバースコピーをいテレータ用に確保なう!」 「もっといい方法があるのにp」 と忠告してくれるコンパイラーがあるといい
>>546 大概の実装はlistのsizeは定数時間になっていると思うが
while(true){ int a = 1; cout << a << endl; a = 2; } whileブロック内で変数を定義したらどんなもんかとこれを試してみたら 無限に1が出力されました。初期化って一度だけかな?と思ったけど この結果ということは、これは一回のループごとに毎回変数が定義されてる ということですか?auto変数の確保→破棄を延々と繰り返すみたいな。 だとするとwhileブロックの外で定義した場合に比べて効率が悪いのですか?
>>550 気にするほどの差はないだろ。最適化される。
使うときに明示的に定義した方が速いこともある。
長期間使用され続ける物は、CPUキャッシュに入りにくくなる可能性がある。
レスどうもです。 たいした差はないということですが、プログラミング作法としても whileブロック内での変数定義ってあたりまえのように使われるの でしょうか(初期化のあるなしに関わらず)。
あたりまえのように使われる
そうですか、ありがとうございました。
while(true) { std::vector<int> tmp(1000); } とかなら考え直したほうがいいな
while(true) { static std::vector<int> tmp(1000); } つまりこういうことですね?
変数の生存が長く使われないほど CPUキャッシュ ⇒ メモリ ⇒ HDD と配置が格下げされる。 HDDまでいったら値を読み込むのに時間食う。 新規に生成したほうが得。 メモリにあったとしてもそれを読み込むよりL1キャッシュに新規に生成した方が速いだろう。
>>557 キャッシュミスより生成コストのが普通に高いと思うけど、
そんな事ありえるの?
プリフェッチも考慮するとキャッシュミス自体それほど起こるかどうか
そもそも、ローカル変数なら同じコードに落ちる可能性が高い。 つまり、関数突入時にスタックポインタを移動するだけ。
そういうくだらない最適化は最後の最後にしろ
クラスメンバ関数の宣言と定義を分けるときにinline化したい場合は 宣言か定義のどちらかにinlineが入っていればOKですか? それとも両方書かないとだめですか?
int a[4]; があったとして、 もしa[0],a[1],a[2],a[3]全てが0だったら、という条件式は if(a[0]=0 && a[1]=0 &&a[2]=0 &&a[3]=0) 以外に表せますか? なんかもっとスマートに書けたりできますか?
if(a[0]|a[1]|a[2]|a[3]) スマートかどうかは知らん
そもそもそれ代入やん
ひっかけ乙だったのかw > 565
if(a[0]=a[1]=a[2]=a[3]==0) とかだめだったっけ
中身ぶっこわしてもいいのならアリ・・・か?
>>563 int i;
for(i=0; i<4; i++) if(a[i] != 0) break;
if(i == 4) {
//全て0のときの処理
}
intが32bitで128bitレジスタがあったら if (*(int128*)a != 0)
if( a[0]*a[0] + a[1]*a[1] + a[2]*a[2] + a[3]*a[3] == 0 )
if(a[0] || a[1] || a[2] || a[3]) { ; /* なにもしない */ } else { }
>>562 宣言にinlineは、書いても書かなくてもinlineじゃないか?
定義はinlineにしたいならヘッダに書くべきだし、
ヘッダに書くとして複数includeする場合は、
inlineを書かないといけない。
1ファイルでしか使わない場合はシラネ
テンプレート関数xxxにfuncを渡すときには自動的にTとUが設定されるのに テンプレートクラスyyyにfuncを渡すときには、自分でTとUを指定しなければなりません。 この違いはなんなのでしょうか? 環境は gcc version 4.6.1 です。 template<class T, class U> void xxx( T (*func)(U) ) { } template<class T, class U> class yyy { private: T (*f_)(U); public: yyy( T (*f)(U) ): f_(f){ } }; double func( int v ){ return (double)v*0.1; } int main( ) { xxx( func ); //yyy obj( &func ); //templateの型を指定しないとコンパイルエラー yyy<double,int> obj; return 0; }
>>574 関数は型推論してくれるが、クラスはしてくれない決まりだから
576 :
574 :2012/02/13(月) 22:46:09.01
>>575 ありがとうございます。
std::mem_fun_refとその内部で呼んでいるstd::mem_fun_ref_t
との関係がイマイチわからなかったので色々試していたところでした。
テンプレート関数のstd::mem_fun_refで型推論して、
テンプレートクラスのstd::mem_fun_ref_tに伝えているのですね。
こういう命名ってC++では合法ですか? namespace _hoge { struct _fuga { void _func(void); }; }
>>577 ×namespace _hoge {
○struct _fuga {
○void _func(void);
先頭にアンダースコアはオススメしない
これってどういう意味でだめなんだっけ? > ×namespace _hoge { ネームスペース名って先頭アンダースコアだめなんだっけ?
どうもです。 じゃあ入れ子になってれば可能なんですな。
文字列の配列を10個用意して最初の文字列にstrcpyでデータをコピーしたいのですがエラーになってしまいます char* p[10]; p[0] = "Spring"; strcpy(p[0],"Summer"); 一体どこをどう直せばよいのでしょうか?
std::string p[10]; p[0] = "Spring"; p[0] = "Summer";
584 :
582 :2012/02/21(火) 13:45:23.18
ありがとうございます、string型でやってみます。 ちなみにstrcpyを使うのは間違いなのでしょうか? 何が間違いなのかよく分からないのです
メモリについてもう少し勉強しなさい
586 :
582 :2012/02/21(火) 13:55:37.67
分かりました、もう少し勉強します
浮動小数の比較で a=1.0; b=1.0; if ( a <= b ) みたいにするのは、やめたほうがいいですか? a=1.0 とすると実際は a=1.00000000001 みたいになってて <= の評価が うまくいかない可能性を危惧しています。とりあえず今のところ問題なさそうなんですが。 Fortranやってたときは、よくこんなふうにやってました。 eps=1e-30; a=1.0-eps; b=1.0; if ( a <= b )
場合による
問題出るまでそのまま使っとけ。 問題あったら任意精度や整数計算へおきかえればいい。 精度が64、128ビットと固定されていればどれだけビット数上げても誤差が出る。 その初めに引いとくのは駄目だろ。もしaが負の方向へ小さかったら間違える。
一致じゃなくて大小関係なんだろ? 単に if( b > a) でいいのでは… 一致が必要なときは、確かに、EPSILON系の定数を使うけど。
厳密には大小でもダメだよ 計算機上の値では0 < xが真になる場合でも真値では0 < xが成立しない事は普通にある
vector<bool>に限らず特殊化されたテンプレートクラスを 特殊化しないで使いたい場合はどうすればいいんですか?
そんなことはできない
具体的に何がしたいんだろう、ちょっと読めない
hoge<bool> という特殊化されたオリジナルのテンプレートがあって、 それを、hoge<int>でも使いたいとか、そういうことかな? 他はまったく思いつかない。
何でそうしたいか理由が全く分からん。やるならメンバにboolだけ持たせた構造体を定義してそれを渡すとか?
最適化などのために特殊化されてるけど 他のコードと互換性がなくて仕方なく非特殊化バージョンを使いたいなーということはあるでしょ bool参照しか受け取らない関数にvector<bool>の要素渡せないとか
質問させていただきます。PGを書く問題ではないのですが、 「ソートプログラムとデータ構造について 具体的なソートプログラムの名前をあげ、 とのようなデータ構造(配列、単方向リスト、双方向リスト、循環リストなど)が なぜ適しているか述べろ。 が分かりません!教えてください
丸投げは宿題スレ行け
これは簡単なようでいて、こういうのに強くないと解けない 宿題スレが適当
宿題スレでも扱いが酷いな。テンプレ無視だからしょうがないけど まずソートの種類を調べるくらいは自分で出来るんじゃない? それからそのソートに適したデータ構造と理由を聞けば… ところで循環リストが適してるソートなんてあったっけ?
循環ソート
c++ってchar使うの? 文字列はstringを必ず使うべきなの?
stringはcharがもとになっている。資源の無駄を減らすならchar
純粋に高級言語として使うなら「1文字の文字」を扱うときぐらいだが C++には高級アセンブラたるC言語の後継としての役割もあるから無いと困る 組み込み系はもちろんだし、そうでなくてもAPIとかはchar[]ベースだったりする
charを要求するライブラリを呼ぶ限り、charは不滅 もちろん、charを極力廃すような書き方をすることは可能だろう
C++のステートパターンの骨組みというか サンプルプログラムを教えてください。
struct A{ int a; struct B{ static int& a; }; int f(){ a = 10; B::a = a; } }; int main(void){ A a; a.f(); } で, undefined reference to `A::B::a' とエラーが出ます. どうやって回避すればいいのでしょうか.
>>609 そもそも、なんで構造体の中から外を知ることができると思い込んだの?
>>610 確かに言われて見れば・・・
とりあえず構造体のネストを消すように作り直してみます.
>>609 参照は定義時に初期化しなければならない。まあやりたかったこととは違うだろうが。
struct A {
int a;
struct B {
static int& a;
};
int f(){
a = 10;
B::a = a;
return 0;
}
};
A x;
int & A::B::a = x.a;
int main(void){
A a;
a.f();
}
C++のステートパターンの骨組みというか サンプルプログラムを教えてください。
>>615 本質的なところじゃないけど、deleteしようぜ
構造体内部に関数って入れられるんだっけ?
C++だからstructで定義するものもクラス
C++だとunionもクラスなの?
ポリモルフィズムの概念がない
ポインターについて質問です。 *p++ >この文では最初にp をインクリメントし、次に新しいメモリアドレスにある >値を得ます。 と、いう説明がありますが、"次に新しいメモリアドレスにある値" の意味が わかりません。 仮にp に格納されているアドレスが100番地 だったとすると、 それが+1(char の場合) されて101 となるだけではないのでしょうか。
>"次に新しいメモリアドレスにある値" その例では、101にある値。
>>622 ではどういう動作をするのでしょうか。詳しくお願いします。
>>623 なんとなくわかりましたが、101番地にある値が"得られる" というのが
いまいちしっくり来ません。 ひょっとしてこれは、ポインターが+1 されて、
それ以降、そのポインターを使ったときは、101 番地のデータが読める、
という意味で"得られる" と書かれたものだと解釈してよいでしょうか。
>>625 演算子の優先順位が
後置インクリメント(++) >> 前置インクリメント(++) >> 間接参照(*) >> 乗算(*)
この場合は
*p++ = *(p++)
メモリ内容が以下だとすると
ADDRESS VALUE
0x00401000 0x0123
0x00401004 0x0456
0x00401008 0x0789
0x0040100C 0x0ABC
DWORD* p
p = 0x00401004 *p は 0x0456
p++
p = 0x00401008 *p は 0x0789
あ、最後のp = 0x00401008 の "=" は代入じゃなくて p が指す物を示す
>>626 具体的な例を挙げてくださり、ありがとうございます。
演算子の優先順位を忘れていました。カッコをつけるとわかりやすいですね。
ただ、残念ながらおっしゃっている事がまだ理解できません。
*p++ ・・・この文が、何かの変数や関数への代入文に使われているのなら、
「ポインターを+1 されたアドレスのデータを何かに代入しているんだな」 と
思えるのですが、参照している教科書には *p++ とだけしか書かれておらず、
何かに代入しているわけではないのです。
だったら * は不要で、 p++ だけでいいのでは? と思います。
ど素人の低レベルな質問で意味不明かもしれませんが、なにかヒントを下さい。
>>629 独習C から、該当部分を引用します。
>ポインタそのものに対してだけでなく、ポインタが指しているオブジェクトに
>対してもインクリメント演算子やデクリメント演算子を使用する事ができます。
>しかし、ポインタが指しているオブジェクトをインクリメントしようとするときには
>注意してください。 例えば、値1 の整数を指しているp があるとします。
>次の文を実行するとどうなるでしょうか。
>
> *p++
>
>予想は当たったでしょうか。この文では最初にp をインクリメントし、次に
>新しいメモリアドレスにある値を得ます。ポインタが指しているものを
>インクリメントするためには、次のような式を使わなければなりません。
>
> (*p)++
>
>かっこをこのように使うことによってp が指している値をインクリメントすることが
>できます。
>また、関係演算子を用いれば、2つのポインタの値を比較する事ができます。
>もちろん、ポインタの比較は、それが相互に関連している、つまり、同じ型の
>オブジェクトを指しているような場合に、初めて意味を持ちます。
以上該当部分です。何か重要な情報がありますでしょうか。
>>630 書いてるまんまだろ
参照先をインクリメントしたいときは (*p)++ と書け
*p++ と書いたらポインタ自体をインクリメントすることになる
って言ってるだけ
*p++ のコード自体に筆者の言いたい意味があるわけじゃない
>>631 >*p++ のコード自体に筆者の言いたい意味があるわけじゃない
なるほど。ここまで読み進めてきて、はしょった表現がなかったものですから、
勘違いしていたようです。 どうもありがとうございました。
*p++ って、もはや定型的な書き方なのさ。
>>630 >> *p++
>>
>>予想は当たったでしょうか。この文では最初にp をインクリメントし、次に
>>新しいメモリアドレスにある値を得ます。
「インクリメント前のメモリアドレスにある値を得た後、pをインクリメントする。」だろ?
なんだか勘違いしそうな説明が続いてるなw 例えば、 int a[4] = { 0,1,2,3 }; int* p = a; int n = *p++; int m = *(p++); ってすると、n = 0, m = 1 になるんだぜ。 上の説明だけでは納得できないだろ?w
>>635 いや、大体わかったつもりです。
int n = *p++
// 配列a の先頭番地のデータ(0) をn に代入し、その後インクリメントされる。
int m = *(p++)
// p は+2 されているので、データ(1) がm に代入され、その後インクリメント。
これらの文が処理された後、p はデータ(2) の番地を指している。
・・こういう解釈であっていますよね。
>>636 nもmも式評価のときは*pで++は*よりも優先順位が高いから
結合するのはどちらもpだけってことだろ?
>637 すいません、本当に素人で、釣りをしているわけではありません。 直球ど真ん中のマジレスでお願いします。 そこであえて質問ですが、"結合" とは、この場合どういう意味でしょうか。
疑問に思ったところは6章のポインタで
>>636 のいいたいインクリメントについては2章制御文その1でやってるから大丈夫だろ
ってかインデックス見ようと翔泳社見たら独習C絶版なのな
独習C++ってC読んでること前提で書かれてなかったっけ?
>>638 その演算子がある項に作用すること
後置インクリメント++の場合、単項演算子で結合性は右から左
また優先順位は参照演算子*よりも高いので
この場合(*p++)は++の左にある単項、pに作用する
後置インクリメントは評価後にインクリメントされるので
この式(*p++)自体の結果は*p
これでいい?
641 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/01(日) 20:49:01.75
>>640 160km/h のストライク。よくわかりました。今後ともよろしくお願いします。
昨日からC言語始めたプログラム初心者です 四捨五入のプログラムで 例えば1.666を第3位で四捨五入すると1.670000って表示されるんだけど これを1.67と表示させるにはどうやったらできますか?
printf("%.2f",1.67);
CLRのコンソールのメイン関数って、Microsoft独自のモノですか? それとも、C++の新規格のメイン関数なのですか? #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; }
>>648 そもそもnamespace Systemなんて標準のC++にはないよ。
CLIで探せばよかったのですね。Thanx!
c++簡易ブラウザーを作りたい boost::asioでソケット周りできた。クッキーも仕様書みながらある程度できた。 javascriptはECMAScriptと戦わないとだめなのか?
モジラやググールのを使え
V8が面白そうだ。先は長いな…
DOMをやるのかやらないのかでだいぶ違う ブラウザの進化の過程をたどるか、あるいは新発想のアーキテクチャでいくか。 ある程度の完成物を狙うなら、いったん、V8なり、JSCなりを呼ぶ実装がいい そもそも、JavaScriptエンジンのインタフェース自体から、学ぶ点がある
int a=ランダム値; bool flag; if(a==1 || a==42 || a==145)flag=true; ↑こんな感じのことをやりたいんですが、 (a==1 || a==42 || a==145) ←ここのとこを簡単に書く方法ってないですかね? 例えば (a==(1 || 42 || 145)) みたいな。(これじゃ当然無理ですけど) 何か方法があれば教えて下さい。よろしくお願いします。
bool check(int const a) { static const int checkers[] = {1, 42, 145}; for (int ic = 0; ic < sizeof(checkers) ? sizeof(* checkers); ++ic) { if (a == checkers[ic]) return true; } return false; } bool flag = check(a);
最終的に吐き出されるバイナリが、結局、 (a==1 || a==42 || a==145) みたいなことになるんだろうから、 (a==1 || a==42 || a==145) で十分に簡潔と言えるんじゃなかろうか。 もちろん、そんなクジみたいな抽選をやたらとあちこちで実行してるなら、 全体的に読みやすいように、書き様はあると思うが。マクロとかで。
こうなら書けるな 発想の転換の一助になれば。 flag=false; select(i){ case 1: case 42: case 145: flag=true; }
<< とか使う
bool operator,(〜)とか使う
bool f(int a){ struct ck{ck(int a):v(a),t(false){}ck&operator,(int a){t=t||a==v;return*this;}operator bool(){return t;}int v;bool t;}; return ck(a),1,25,142; }
可変長引数でチェック関数作るとか
flag = (a==1 || a==42 || a==145); が、一番シンプルに見えるわけだがw
Perl6のJunctions風の何かを作るといいのかな
D言語のlazy 相当の機能が有ればなあ
668 :
543 :2012/04/18(水) 22:11:53.62
0〜999の番号を10000の要素にランダムに割り当てるときに 各番号が10回ずつ(各番号が同じ回数という意味で)出てくるように割り振りたいのですが なにかいい方法ありませんか?
vectorに突っ込んでrandom_shuffle
>>669 そのような関数があったんですね。勉強になります!
ありがとうございました。
質問です C言語でマイクから入力した音声を送信する方法 もしくはマイクから入力された音声がどこに保存されているかを教えてください
環境も書かずになんて間抜けな質問を……
失礼しました 環境はbcpadです
WindowsならmmsystemだからWin32APIスレで聞いた方がいいだろ
コマンド・ライン引数でargc と argv というのが伝統的に使われている そうですが、それぞれの語源(何の略) か、教えてください。
argument count value
VC++をつかってC言語でLifeGameを書こうとしてみたのですが、
セルがモニタから飛び出して勝手に増殖し出してしまって、
|....,,__ |_::;; ~"'ヽ | //^''ヽ,,) | i⌒" | ∀`) < 誰もいない きのこるならいまのうち |⊂ | ノ _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" |( ´∀`) < きのこ のこーのこ げんきのこ ♪ |(ノ |つ | | ⊂ _ ノ ""U _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" (´∀` )| < エリンギ まいたけ ブナシメジ ♪ ⊂| (ノ | | | ヽ _ ⊃ .U"" | | ミ | ミ サッ! | ミ |
罠を張って待っていることも知らずに、 ↑なーんてなことを書き出してしまって、
【そりゃないよドコモさん】ドコモが日本通信に提訴された経緯
http://weekly.ascii.jp/elem/000/000/084/84599/ ドコモは「必要な費用」と説明したとのことですが、その費用はそもそも算定式に含まれているはず、
というのが日本通信側の主張です。
このため日本通信が差額の支払いを一時停止したところ、ドコモ側は「接続を切断する」と回答。
結果、ユーザーへの影響を考慮して、日本通信側はドコモ側の要求どおりの支払いを続けている、
というのが今の状況です。
宿題で出されたこの問題が分からないのですが、誰か教えてくれませんか。 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 たとえば、 1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 というような計算をする。ただし、この例では式の値が91となるので答えではない。
このスレに何の関係が
ごめんなさい、宿題スレに書き直してくるので無視してください
eval() を実装しろという問題だな webサービスを呼ぶ、でもいい
688 :
デフォルトの名無しさん :2012/04/25(水) 00:26:53.55
csvのデータを読み込み、このデータセットの平均値Ave を求めて 標準出力するCプログラムを書きたいのですがどうすればいいですか?
まず深呼吸します
宿題レベルの質問に見えるが、csvに何が詰まってるかによるな(22,2Cの扱い)。 出題者が、データはこれな。って言ってきてないか。
図書館でプログラミング作法を借りてくる
C言語で、できるだけ簡単な文法だけを用いて、「ある数列から重複している値があれば取り出す」という関数を作りたいのですが、どうすればいいのですか?
>>692 数列は長いか?(数万件)
数値範囲が予測できるか?
範囲が狭いか?(1~10など)
小数点以下も必要か?
で方法が違う。
回答ありがとうございます。 数列は、int型で自由に入力したものになるので、長くなる可能性があります。 値の範囲は予測できません。 小数点は利用しません。
要はエスパー待ちて事だな。
>>692 「重複している値があれば取り出す」とあるが、例えば「1,1,1,1,1」という数列があったとき、
1は1回だけ取り出されるのか、それとも4回取り出されるのか。
どっちでもいいじゃん for (i=0; i<N; ++i) { IntSet_insert(tmp, data[i], &success); if (!success) { IntSet_insert(s, data[i], NULL); //1回だけの場合 IntList_push_back(l, data[i]); //複数回の場合 } }
取り出すってどういうことを言ってるんだろうか
>>699 日本語の問題だな。
取り出す→Action
抽出、除外→Process
配列から取り出して元の配列の要素数を減らすのか、取り出したものを別の配列に入れて再利用するのか
set<int>にinsertしていって、戻り値でカウントするのが一番簡単だろ。 で、値をキーとしたmap<int value,int count> あたりに保存しておけば、 後はどんな要求にでも応えられるだろ。
> 数列は、int型で自由に入力したものになるので、長くなる可能性があります これはバッファオーバーランしてくださいって言ってるようなもので、 出てきた数値を逐一記憶するタイプの解法ではどんな巨大なメモリとディスク搭載したマシンでも仕様を満たせない。 唯一の可能性は重複する数値だけで構成される数列を生成する数式を見つけること。
計算したデータをテキストファイルに出力するプログラムを作っています。 出力する行数が多い場合のやり方として、常套手段があれば、教えてください。 一行文字列を作ったら、ファイル書き込みか、 全行文字列を作ったら、一気にファイル書き込み。 メモリーが気になるので、前者で行いたいのですが、 計算途中でも出力する文字列があるので、迷っています。
速度だったら256、512Kくらいずつ書き出すのが速い。バッファ。 多くしすぎてもかわらない。
およそこんな風だ。これだとバッファの残りが出力されないから、クラス化してデストラクタ使うと良い。 lineout( string str) { string buf; if( buf.size()+str.size() > 256*1024) { buf、str出力; buf.resize(0); return; } buf+=str; }
こうだな。これをクラス化。 lineout( string str) { static string buf; if( buf.size()+str.size() > 256*1024) { buf、str出力; buf.resize(0); return; } buf += str + (string)"\n"; }
>>704 昔のVBとかだったら1文字ずつ書き出すとそのたびにディスクアクセスしてたりするが、
OSやライブラリによっては自分でバッファ持って適当にまとめて書き込んだりするし、
今どきの1GBや2GBがデフォのPCではテキストがどれだけ膨れ上がろうが気にならない。
一番プログラム書きやすい形でやるのが常套手段ともいえる。
WindowsXPだとまとめて書き出す方が速い。OSのバッファを使ったとしても。 OSが優れていればこのようなツールはいらない。 FastCopy H.Shirouzu(白水啓章) 特徴: Windows系最速のファイルコピー&削除ツールです。 Read/Write も、OS のキャッシュを全く使わないため、他のプロセス(アプリケーション)が重くなりにくくなっています。 可能な限り大きな単位で Read/Write するため、デバイスの限界に近いパフォーマンスが出ます。 MFC 等のフレームワークを使わず、Win32API だけで作っていますので、軽量&コンパクト&軽快に動作します。 全ソースコードは BSD ライセンスで公開していますので、VC++ 等をお持ちであれば、ご自由にカスタマイズしてのご利用も可能です。
宣伝かよ作者うぜえな
>速度だったら256、512Kくらいずつ書き出すのが速い。バッファ。 なるほどです。これだと、ファイルを意識しなくてもスムーズに 出力できます。ありがとうございました。
>>710 自分は安定性がいいので使っているが、調べると速度も良いらしい。
ファイルのコピー&削除が抜群に速い---「FastCopy」:PC Online
http://pc.nikkeibp.co.jp/article/special/20081114/1009723/ 手間というほどのことはないのに、どうしてわざわざツールを開発する必要があったのか。
そんな疑問を抱きながら、家族旅行のときに撮影した映像(動画)ファイルをコピーしてみた。
ファイルの容量は、440メガバイト。
普通にエクスプローラでCからDドライブへコピーしたところ、40秒かかった。
ところが「FastCopy」を使ってみると、なんとたったの16秒で終わってしまった。2倍以上の速さでコピーできたわけだ。
715 :
デフォルトの名無しさん :2012/04/30(月) 03:37:10.46
実際どんなのが作れるの?
WindowsもLinuxもつくれます。なんでもつくれます
ハードは作れまい。と言いたい所だが、 SystemCだのいって、ハードもCもどきで書いちゃうし、 シミュレータもたぶんC(こいつは根拠なし)。 いたるところ、地味にCでできてます
afxinetを使って通信部分のプログラムを書いているのですが、 クッキー関連がどうもうまくいきません。 m_pFile->AddRequestHeaders(_T("Connection: Keep-Alive"), HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD ); m_pFile->AddRequestHeaders(_T("User-Agent: TestAgent"), HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD ); m_pFile->AddRequestHeaders(_T("Cookie: visited=100"), HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD ); と設定後にSendRequestして、HTTP_QUERY_FLAG_REQUEST_HEADERSでQueryInfoしたところ、 上2つはきちんとヘッダに記述されているのですが、Cookieは書かれていませんでした。 クッキーは何か特別なんでしょうか? OSはWindows7で、IEのVerはIE9ですが、もしかしてIEの保護云々の問題? なにか知っている点があれば教えていただきたいです。
curlつかっとけ。マルチプラットホームだしPHPの通信機能でも使われ信頼性もある。
クッキーは自前でハンドルする的なオプションが必要
721 :
デフォルトの名無しさん :2012/04/30(月) 11:41:55.93
void (*ptr)(); これって何をしてるんですか? void型のポインタ変数を宣言してるんだと思うんですけど なんで*ptrが()にはいってるのか、その後に()ついてるのかがわかりません。 *ptrの括弧をとると以下のエラーがでて 030.c:10:9: error: lvalue required as left operand of assignment 後ろの括弧をとると以下のエラーがでました。 030.c:11:6: warning: dereferencing ‘void *’ pointer [enabled by default] 030.c:11:11: error: called object ‘*ptr’ is not a function
関数ポインタってやつです ぐぐれば詳しい説明がどっかにあるだろう
>void型のポインタ変数を宣言してるんだと思うんですけど 違う
voidを返す(=値を返さない)、引き数を明示しない、関数へのポインタ、ptrの宣言。
関数ポインタみてきました。ありがとう。
よく訊かれる質問、 特に、主として C 言語を利用しているプログラマの方からの質問なのですが、 「C# は初入門の言語として適切か」と言うものを受けることがあります。 多いのは、 「C 言語 → C++ というように段階を経て学んでいくべきなのではないか」という意見です。 「Java や C# だと、class や static など、最初に説明しないといけない“おまじない”が多いし・・・」とか、 「Java や C# などのオブジェクト指向言語を学ぶにしても、 その基本は構造化プログラミング言語だし」というのが、 これらの意見の理由です。 この質問に対する(僕個人の私的な)答えですが、 結論から言うと、初めから C# を学ぶ方がいいと思います。 例えば、C 言語なら最初から理解するのが難しい“おまじない”の部分がないかと言うとそんなはずもなく、 #include などはやはり“おまじない”ですし、 Java や C# などの新参の言語は、 構造化プログラミング言語としても見た場合でもかなり優秀な言語です。 むしろ、C 言語など、長い歴史を持つ言語は、 昔からの悪習を引きずっていて、 下手に学ぶと悪い癖が付いたまま抜けなくなる危険性の方が高いです。
そうですね
>>726 C の悪臭もとい悪習ってなんでしょうね。ちょっと興味深い。
ありがとうございました!
>>719 ちょっとググってみたらcurlってCでも使えるんですね。
昔Linuxで見たことがあったので勘違いしてました。
詳細調べてみます。
>>720 なるほど、どこかでそのオプションを設定する場所があって
それを行わないと上書きされないってことですね。
そちらもちょっと調べてみます。
>>726 CもC#もやればいい ただ、「付いてくる」ライブラリが全然違うわけで、
たぶん、両方やってると、「…ああー。それでC#かー」って悟りが開けるんだろうか
どとねと系は食わず嫌い。やっぱ、自称C厨の俺がやるんなら、C++/CLIかなあ。
つ IronPython
Javascriptが世界を支配する日 - DQNEO起業日記
http://dqn.sakusakutto.jp/2012/04/javascript_14.html もう氏ねよこいつら。最近のウェブ屋ども頭おかしいわマジで。
JavaScriptのVMは何の言語で書かれてるの?
てめえの使ってるブラウザは何の言語で書かれてるの?
てめえの使ってるOSは、デバイスドライバは、何の言語で書かれてるの?
JavaScriptで書かれてる業務系や基幹システムどれだけあんだよ?小数点切り捨てたら0%じゃねえの?
科学技術計算は?ゲームプログラムは?コンピュータグラフィックスは?
それをいうなら、これだけJScript(VM)が洗練されてるのに、 なにかというとスクリプト部分はVBSで書いてくるMSに何か言ってやってくれw Write once, run anywhere の理想に近づいてるのは、いまやJSと。 そしてもちろん、その屋台骨を支えてるのはC/C++と。 両方制覇しちゃえばいいのだ。
学校でcプログラミングを習い始めたのですが、家でもやりたいなぁと思いました なにか初心者におすすめのソフトウェア(テキストエディタ?コンパイラ?みたいなやつ)ありますか?
gcc
winならVC++がメジャーかと
eclipse+cdt
mac
VC2010EE
LSI C-86 w
結局これだけいろいろあるので、習ってるときに使ってるのと同じにすればいい C でありがちな、「そのコンパイルエラーどっから来てる?」の癖も掴みづらいし
変な癖つけると、その環境で一生過ごすことになる
mingwのccを気軽に差し替えられる野良Clangがあればいいんだけどねー
なぜビットフィールドは構造体でしか使えないのでしょうか? 普通の変数と同じように宣言(例えば"unsigned bool :1;"など)と することは出来ないのでしょうか?
>>745 ビットフィールドを構造体で使っているのではなく、
構造体の書式構造をビットフィールドの表記に流用しているだけです。
つまり、structと書いてあっても厳密な意味での構造体とは違います。
厳密な構造体の厳密な意味を教えてくれ
748 :
745 :2012/05/04(金) 11:35:55.39
>>746 ありがとうございます!少し分かってきた様な気がするのですが、まだいまいち分かりません・・・。
例えば以下のコードはビットフィールドと厳密な意味での構造体どちらになるのでしょうか?
struct {
unsgined char byte0;
unsigned char byte1;
unsigned bit: 0;
} test;
また「厳密な意味での構造体」の定義などについて詳しく教えて頂けると嬉しいです _ _
「構造体のメンバーに対してビットフィールドを使用できる」と理解してた
ビットフィールドは環境依存する。不便でもビット操作にしとけ。 何バイト確保されるかで大きく差が出る。
751 :
735 :2012/05/04(金) 12:57:27.14
家のはwindowsで、学校ではLinuxを使ってます いろいろありますね・・・ 最初なんで、学校で使ってるEmacsか メジャーらしいVC++か、ですかね
LSI-Cとかいう8か16ビットのヘボじゃないければなんでもいい。
寧ろpnoriさんに謝るべきかも。
スレ違いだったらごめん。 C++とDirectXを使ってアプリ作るのが最終目標なんですけど、以前誰かにC++やるならC覚えてからにしろって言われて ずっとCの勉強をチマチマしてるんですけど 実際C++を勉強する上でCの知識って重要ですか? どこまでCの勉強して、いつからC++に入ればいいのやら・・・
>>756 C言語の関数とポインタと構造体が完全に理解できる
ようになったら、C++に進んでいい。
我流なら、とにかくC++を【要求する】APIを使っていくことじゃないかな そしてときどき、Cの教科書を読み返すと、知識が整理されていく リアの後輩なら、そこで悩む前に、x86の汗の主な命令を覚える気でいろと言いたい 逆汗を読解できる水準で十分だし、必要ならそこからいくらでも伸びていく
>>756 実はC++の表っ面だけならCを知らなくてもいいんだが
C++である程度踏み込むと結局Cの知識も要るし
何よりC++向けの資料はほとんどがCも習得してることを要求する
760 :
756 :2012/05/06(日) 11:16:06.68
ありがとうございます。 ポインタ…C++になっても必要なんですね。関数と構造体は普段Javaでやってる分理解は早いかも 自分のイメージではJavaのオブジェクトと構造体って変わらないイメージがあります。
構造体の機能は、すべてクラスで実現できるから、構造体に詳しくなる必要なし。 ほぼ同じだし、クラスがわかれば構造体もわかる。
c++の機能はどなくてもプログラムかけるから基本いらない 他人と開発するときに必要になったものを理解していけばいい
C++不要説だったら、C言語不要説も成り立つわけだが。 そしたらアセンブラも不要説も成り立って、ビット列でプログラム書くのが一番という説になるな。
まぁ、AltairとかTK-80があるくらいだからな。C/C++とか あんなの飾りです。偉い人にはそれがわからんのですよ。
ポインタをうまく扱うことに、C++を使ってもいいんだ C++は究極的にはC/汗に落とし込めるわけだから、 C++などなくても、プログラミングができるというのは正しい C++を使う理由は、C++を使うとスマートに書ける場面のあること、 あと、C++を要求するAPIの存在。 まあいいんだよ、まずは我流でいいから覚えちまえ
/*/ hogehoge /*/ としたコメントアウトを目にしましたが、これはどういう意味があるのでしょうか?
>>766 書いた奴に聞け。
何かツールで必要とする書式か、さもなきゃ検索用のおまじないだろ。
コメント内に/*があるのはよくない
かっこいいと思って書いてるような気がする ツールで必要とするとしてもこんな間抜けな書式はあり得ないと思う
文法上問題無いだろ。 /* と */の間は何でもコメント。/が入ってもコメント。
ヒント: コメントをネスとしてしまうコンパイラも在る。
s/ネスと/ネスト/
>>770 コメントのネストを許すか許さないかで状況が変わってしまうような
書式を使用する時点で間抜けな書式なんだよ
#if endifをコメントに使うと便利。/* */は複数回使うと意図しない動作になる。
// /* 処理 // */ も最初の//をつけ外しすれば便利。 JSで多用してる。
素直に // 処理 の付け外しでいいよ
if(0){ }
いや、省略したが処理が20行くらいあるんだわ
20行くらいエディタのマクロであっという間
つーか、そういうときこそ #if 0 #endif で囲めよ。ちなみに、C#なら#if falseな。
>>766 その文をコメントアウトしている現状ではその前後の文を実行するが
その文を実行したいときにはその前後の文を実行したくないのでは?
まあ、もしそうならプリプロセサ使ったほうが良いとは思うけど…
#オープンソースのコードを見て勉強しています。 // こちら自分のコード。ターゲットウインドウにキーメッセージを送る。ターゲットに届いてることはデバッガで確認済み。 void KeyEventDown(BYTE key,double wait){ ::SendMessage(targetWnd,WM_KEYDOWN,key,NULL); Sleep(wait); }; void KeyEventUp(BYTE key,double wait) { ::SendMessage(targetWnd,WM_KEYUP,key,NULL); Sleep(wait); }
//こちら、他人様の書いたコード(ターゲット側) // ウインドウプロシージャ内の抜粋 case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: { ProcessKeyEvent((int) wParam, (DWORD) lParam); } // ここまでプロシージャ抜粋 // プロシージャで呼ばれている関数(ここがよく分からない) inline void ProcessKeyEvent(int virtKey, DWORD keyData) { bool down = ((keyData & 0x80000000l) == 0); : } というような形になっています。
僕は、SendMessage()でWM_KEYDOWN/WM_KEYUPのときはlParamはNULLで送ればいいと思っているのですが 間違っていれば教えてください。 ターゲット側がlParamにビット演算?を使ってwParamのキーが押されたのか、離されたのかを判断しているようです。 このせいで、WM_KEYDOWNもWM_KEYUPも、ターゲット側で「押された」として判断されているような?? どのように送ってあげれば正しくターゲット側が解釈してくれますでしょうか? (ターゲットはできれば弄らずに・・・) よろしくお願いいたします。
SendInput
787 :
783 :2012/05/10(木) 22:39:47.01
SendInputを調べてみましたが、ターゲット側をフォアグラウンドにしないといけないのでしょうか? 事情によりそれは困ります。 ターゲット側を書き換えて、WM_KEYDOWN/UPによってdownの値を変えてみようかと思いますが、 けっこうコード量が多く複雑なので、関連する部分で不具合が出ないか心配です。。。 (ビット演算でやっている意味や、SendMessage()のlParamにXXを指定すれば通る、みたいな回答が欲しかったり・・・)
keyDataに何が入ってるか調べた?
790 :
783 :2012/05/11(金) 12:29:58.06
>>789 貴重な情報ソースありがとうございます。
「受け取り側は基本的に無視していい」とあるので、ネットのSendMessageの
サンプルのほとんどがlParamにNULLを渡していたのだと思います。(それで僕は、lParamは常にNULLで構わないと誤解した)
今回は受け取り側が"正しい"処理をしているので、きちんとlParamを作らないといけないのですね。
791 :
783 :2012/05/11(金) 12:37:30.18
追加の質問です。 第一ビットを立てるには、lParam|=0x02 でOKでしょうか? 自分にとってはビット演算は可読性が悪く、まとめてやりたいので、 「boolは1ビット」ということを利用して、 struct BITS{ bool bit1; bool bit2; : } を用意して、それぞれbitXにtrueを代入して、lPalam=(LPARAM)bits などとしても問題ないでしょうか? アラインというのを聞いたことあるので、BITSはバイト単位にそろえてBITS8、BITS16などにすれば安全でしょうか? よろしくお願いいたします><
>boolは1ビット どこでこんなアホな考えを教え込まれたんだ >それぞれbitXにtrueを代入して、lPalam=(LPARAM)bits などとしても問題ないでしょうか? 問題大ありだ sizeof BITSしてみろ
793 :
783 :2012/05/11(金) 13:07:16.09
>>792 調べてみたら、環境によってsizeof(bool)==sizeof(int)となるようですね。(bool使うほうがメモリの節約になると盲信していたので自分としては衝撃)
ちなみにVC2010ではsizeof(bool)は1でしたが、
考えを改めて、素直にビット演算を勉強します><
>Visual C++ ver4.2 では int 型と等しい、つまり sizeof(bool)==4 として扱われていました。しかし、最新の Visual C++ ver6 では、sizeof(bool)==1 として扱われ
ttp://seclan.dll.jp/dtdiary/1999/dt19990929.htm
sizeofはビット数じゃなくてバイト数だってことを理解してるかどうかもあやしい
795 :
783 :2012/05/11(金) 18:25:24.04
何度もすいません>< WM_KEYDOWNのlParamをNULLでなくちゃんと作ることにしました。 仮想キーからスキャンコードの取得はAPIがありましたが、 拡張キーかどうかの判断は自前でしょうか? コンテキストコード、変換状態フラグは「WM_KEYDOWNのときは常に0」とありましたが、 WM_KEYUPのときはどうすればよいのでしょう?
拡張キーのときはWM_KEYDOWNじゃなくて他のメッセージじゃなかったか
797 :
783 :2012/05/11(金) 19:32:53.90
Spy++で確認したところ、 PostMessage()のWM_KEYDOWNメッセージで届いており、 十字キーの右を押したときは、lParamの拡張キーフラグが立っていました。 'a'や'b'では拡張キーフラグなしです。
798 :
783 :2012/05/11(金) 19:43:01.19
初めてのビット演算(のテスト、右キー固定で拡張キーフラグ固定)やってみました。 WM_KEYDOWNはうまくいったと思いますが、WM_KEYUPのlParamがおかしいので教えてください #自分で作ったlParamの値をデバッガからコピペしてWindowsの電卓で16進に直して、 #Spy++のログにあるlParamと同じか比較しています。 「0xC14D0001」が欲しいのに、「0xFFFFFFFFC14D0001」と出てきます。 おかしい部分を教えてください>< LPARAM lParam = 0; bool repeatCount = true; UINT scanCode = 0x4d; // 右キー固定 bool extend = true; // 拡張キー固定 bool contextCode = false; bool repeat = 1; bool stat = true; lParam = repeatCount; lParam |= (scanCode<<16); lParam |= (extend<<24); //lParam |= (contextCode<<29); lParam |= (repeat<<30); lParam |= (stat<<31);
lParam |= (LPARAM)stat<<31;
lParam=(DWORD)lParam;
801 :
783 :2012/05/11(金) 20:30:22.56
すいません、どちらも変わりませんでした>< ちなみに、OSは64bit(Win7)でVCではWin32アプリを作る設定(のつもり)にしてるのですが関係ありますでしょうか? 電卓がおかしいだけで、SendMessage()で送っちゃっていいのでしょうか?
関係ないね
UINTのサイズは?
804 :
783 :2012/05/11(金) 22:02:25.35
>>803 sizeof(UINT)==4でした。
「lParam |= (stat<<31); 」の代わりに、
「lParam |= 0x80000000;」ならいけるかと思って試しましたが、
結果は同じでした・・・。
#ちなみにWM_KEYDOWNのとき用のlParamは、32ビット目が0固定なので、
#処理しなくていいと思って「lParam |= (stat<<31)」をコメントアウトしています。
805 :
783 :2012/05/11(金) 22:23:09.50
すいません、オオボケかましてました。 最初の「LPARAM lParam = 0;」が間違えですね。 「DWORD wLow = 0;」で作っておいて、ビット演算してから 最後に「LPARAM lParam = MAKE_LPARAM(0,wLow);」かな・・・。
下記のようなコードがたくさんあるので、マクロで楽をしたいです。 static ImageStruct *hogeButtonImage = NULL; if(!hogeButtonImage){ hogeButtonImage = LoadImage("hogeButtonImage.png"); } ↓これではうまくいきませんでした。 #define DEF_IMG(name) static ImageStruct *name = NULL; if(!name){ name = LoadImage("name.png"); }; DEF_IMAGE(hogeButtonImage) hogeButtonImage->hoge();
そんなことにマクロ使うな
#define文のスペース大杉 DEF_IMGなのにDEF_IMAGEとか。。
ImageStructをラップするクラスを作ればいい static ImageStruct hogeButtonImage("hogeButtonImage.png");
クラスのメンバ変数にRECT構造体もたせて、コンストラクタの初期化子リストを使って 0で初期化したいのですが、pointer(NULL)はできてもrect{0}はできないようですね。 素直にコンストラクタ内で、rect.top=0;・・・などと書かないといけないのでしょうか?
11ならできる
812 :
810 :2012/05/12(土) 13:34:00.22
11じゃなくても動くコードにしたいですね・・・。 RECTを拡張して struct RECT_EX:public RECT{ RECT_EX(){ top = 0: ....}; }; のようなコンストラクタ付きにした場合、 キャストしてWindowsAPIのGetWindowRect()に渡すのは危険でしょうか? RECTの配列を渡すなら絶対危険だと思うのですが、1つだけならよい??
やってることは0クリアとほぼ同じなんだから構造体コピすればいい struct X{ X():a(a0){} RECT a; static RECT a0; }; static RECT X::a0={0};
>>810 メンバ初期化子リストにrect()で0初期化できる
struct RECT
{
int x, y, w, h;
};
struct hoge
{
RECT rect;
hoge() : rect() {}
};
815 :
デフォルトの名無しさん :2012/05/12(土) 21:53:49.35
try catchされない例外がthrowされた際に、 terminate()呼ぶ前に情報出力したいのですが、できますか?
SetUnhandledExceptionHandler() かな 自分では使ったことない、全部デバッガに押し付けてる
typedef void (*terminate_handler)(); のterminate_handlerと同じシグネチャの関数を作って terminate_handler set_terminate(terminate_handler f) throw(); // 98 terminate_handler set_terminate(terminate_handler f) noexcept; // 11 で差し替えだな set_terminateの返却値(前のハンドラ)を保存しといて新しいハンドラの最後で前のハンドラを呼び出すのが定番かな
818 :
815 :2012/05/13(日) 02:00:53.36
レスありがとうございます。
>>816 構造化例外(win専用?)と標準例外があるんですね。
>>817 visual c++ で以下の関数で渡したコールバックが呼ばれないっす。
std::set_unexpected()
std::set_terminate()
SEHなら、DIV0なりSFなりもつかまる C++例外だとわかれば、最外側に(ry
821 :
◆qr00w3BQO6 :2012/05/14(月) 12:36:17.99
char test[20]="0123456789ABCDEF"; int data1,data2,data3; このような変数から data1==012 data2==3456789 data3==ABC というように一部抽出して変数に格納したいのですがどうしたらいいでしょうか? testの値は固定長ですが中身はrandomです.
822 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/05/14(月) 12:44:59.26
/*
>>821 */
#define DATA_SIZE 20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char data1[ DATA_SIZE + 1 ], data2[ DATA_SIZE + 1 ], data3[ DATA_SIZE + 1 ];
char test[] = "0123456789ABCDEF";
int split1 = 3;
int split2 = 10;
int body_size;
strncpy(data1, &test[0], split1);
data1[split1] = '\0';
body_size = split2 - split1;
strncpy(data2, &test[split1], body_size);
data2[body_size] = '\0';
strcpy(data3, &test[split2]);
printf("%s\n%s\n%s\n", data1, data2, data3);
return 0;
}
16進数なのか?
826 :
◆qr00w3BQO6 :2012/05/14(月) 18:18:58.55
16進数です
char test[20]="0123456789ABCDEF"; int data1,data2,data3; scanf(test, "%3x%7x%3x", & data1, & data2, & data3);
sssssssscanf
829 :
◆qr00w3BQO6 :2012/05/14(月) 21:45:27.50
>>827 コピペして実行しましたが,ビルドは出来てsscanf()で止まってしまいます.
理由わかりますか? 構文的にはあってるみたいなんですが,,,
=は全角から半角に修正しました.
830 :
◆qr00w3BQO6 :2012/05/14(月) 21:49:04.98
あ,sssssssssssscanfの意味が分かりましたw
てかsprintfでおk
忘れてくれ
メソッド内で次のようなコードを呼んだ場合、 loadMyString()はhogeの初期化のときだけ呼ばれるのでしょうか? それともこの行を含んだメソッドが呼ばれるたびに呼び出す(=メモリリークする)のでしょうか? static MyString* hoge = ReadFileBuffer("hoge.txt");
そのloadMyString()とやらは一体全体どこにあるのかね。
ReadFileBufferは一度だけ呼ばれる
別解: 論より証拠、みてみればいいじゃないか。っていう発想とゆとりをもとう。 マシンに近い言語だからこそ、挙動は実際にいくらでも確認できる ReadFileBuffer() にデバッガをかけるもよし、 hoge がころころかわらないのを確認するもよし。 そうやって、体がCを覚えていく。
開発環境:Microsoft Visual C++ 2010 Express (SP1)
実行環境:Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類:Win32 コンソール アプリケーション
・質問
C言語で
wchar_t awcStr[] = L"ABCあいう\u2665\n";
というUnicode文字列をコンソール出力し、ファイルにもリダイレクトできるように
するにはどうすればいいでしょうか?
ttp://www32.atwiki.jp/sampleisbest/pages/44.html 自分なりに試しましたが煮詰まってしまいました
宜しくお願いします
標準出力とファイルの両方に出力するだけだろ
839 :
デフォルトの名無しさん :2012/05/15(火) 15:53:54.07
char型配列に格納された16進数文字列をそのまま数値に直し配列に格納するにはどうしたら良いですか? 文字列 488→int 0x488
1文字ずつ処理すれば?
strtol
>>837 #include <io.h>
#include <fcntl.h>
略
_setmode(_fileno(stdout), _O_WTEXT);
wprintf(awcStr);
>>842 圧倒的感謝・・・!
以下のソースにてコンソール出力、ファイルへのリダイレクトが正常に行われることを確認致しました
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
void main()
{
wchar_t awcStr[] = L"ABCあいう\u2665\n";
_setmode(_fileno(stdout), _O_WTEXT);
wprintf(L"%s", awcStr);
}
・補足 リダイレクトしたファイルを調べてみたらBOMなしのUTF-16LEでしたので一応注意
UTF-16LEはwindowsの内部コード
UTF-8の場合 _setmode(_fileno(stdout), _O_U8TEXT);
847 :
デフォルトの名無しさん :2012/05/15(火) 19:10:03.40
>>842 //char buffに16進数のデータが格納されている
FILE *file
file open("buffer_export.dat","wb");
fwrite(&buffer,256,1,file);
fclose(file);
char &endp
n=strtol(buffer,&endp,16)
printf("n: %x\n",n);
printf("&endp: %d\n",endp);
//実行結果
n: 0
endp: 31f998
string.exeというバイナリエディタでbuffer_export.datを参照すると
FF EE AE 55 56 00 C3 00 00 FF 53 00 D7 00 00 FF
4D 00 D7 00 00 FF 57 00 D7 00 00 FF 50 00 C3 00....
一致しないのはなんででしょう?
string.exeはこちらが意図しているデータなので(データのヘッダーがかけているが)
そちらが間違っているということはないはずなんですが,ASCIIが悪さしているんですか?
>>847 ソースを全部まるごと晴れ
問題はあんたが隠してるところにある
>>839 >>847 質問の意図が分かりまえん
「char型配列に格納された16進数文字列をそのまま数値に直す」
は分かるけど、その後の「配列に格納する」は元のchar型配列なんだろうか?
なんで >printf("&endp: %d\n",endp); で出力が >endp: 31f998 になるのか誰か教えてくれ
851 :
デフォルトの名無しさん :2012/05/15(火) 19:42:29.77
めんどくさいやつだなぁ。ideoneかcodepadに貼れよ。
853 :
デフォルトの名無しさん :2012/05/15(火) 19:47:52.71
>>849 char型配列に格納された16進数文字列から一部抜き出し,その値を計算することが目的です.
そのためにint等の配列に格納したいです.
>>850 すいません%dです 打ち間違えていました.
854 :
デフォルトの名無しさん :2012/05/15(火) 19:51:56.99
Z80のアセンブラをちょっと勉強した程度のレベルなのですが、 自分で書いたC++コードのアセンブル結果を読んで自分で最適化できるようになりたいです。 (具体的には、キャストで何をしてるか、継承した時の関数テーブルがどうなってるか、 関数・メソッド呼び出しのコールスタックがどうなってるかなど) 分かりやすいサイトや、便利なツールなどあれば教えてください。
#include <stdio.h> #include <stdlib.h> int main(void) { char *p; char c[] = "488h"; int i; i = (int)strtol(c, &p, 16); printf("%x\n%s\n", i, p); return 0; }
エッ?(°∀°;) C++コンパイラが吐いたx86とかx64のアセンブリを手で最適化? アラインメントとかずれると速度が落ちるし(他のCPUではバスエラーを吐くのが多いからまだましだけど) 大きなソースで特にC++の演算子のオーバーロードを使って抽象化されてしまった機械語や 継承時のメモリ配置を手でいじるのか? Inside the C++ Object Modelのような本はあるけど、読んでみればわかるけど8bitのZ80と 32/64bitのCPUじゃ桁が違うぞ 早晩発狂するかもな
やめとけ C++のコードを最適化すれ
>>851 酷いソースだな
ソケット通信使ってるって最初に言えよ
UDP使うなよ 訳も分からずに使ってるんだろうけど
クライアントのソースどこよ
クライアントがおかしなデータ送ってるから分割できないんだろ
通信はTCPを使ったものに書き直せ
C++の最適コードは、アセンブラの最適コードと大差なし。 念入りにC++コードを最適する。 C++ - Wikipedia C++は、汎用プログラミング言語の一つである。 高度な機能を使用してもプログラムの実行性能が低下しすぎないように、言語仕様・ライブラリに様々な工夫が施されている。
http://www.isus.jp/article/introduction-to-x64-assembly/ Microsoft Visual Studio C/C++ は、x64 バージョンではインライン ・アセンブリーがサポートされません。
個別のアセンブリー・ファイルと外部アセンブラーを使用するか、または組込み関数を使用しなければなりません。
組込み関数を使用する理由:
x64 でインライン ・アセンブリーがサポートされていない
使いやすさ: 手動でレジスターの割り当てを行う代わりに、変数名を使用できる
アセンブリーよりもクロスプラットフォーム: コンパイラーの開発元は各種アーキテクチャーに組込み関数を移植することができる
組込み関数のほうがオプティマイザーが効率良く動作する
米国務省「韓国に戦術核必要なし」 下院可決受け
アメリカの下院軍事委員会が先週、北朝鮮の脅威に備えるため、韓国などを
念頭に戦術核兵器を配備すべきとした法案を可決しましたが、国務省は「必要ない」と明確に否定しました。
ヌーランド報道官:「我々は核のない朝鮮半島を支持していて、その方針を変えない。
戦術核兵器を韓国に置く必要はないし、配備する計画も意図もない」
ヌーランド報道官は、オバマ政権が一貫して目指す核のない朝鮮半島の方針に変わりはないと強調しました。
TV朝日 (05/15 12:35)
http://www.tv-asahi.co.jp/ann/news/web/html/220515020.html 日米同盟強化へ 米は9条改憲歓迎 「反対まったくない」
憲法第9条に基づき、日本は集団的自衛権を行使できないとの解釈が
日米同盟強化への大きな障害になるとする認識はいま米側で広範に強まり、
米国では、現在党派を問わず反対はなく、むしろ暗に歓迎するという姿勢が大勢となった。
92年にはヘリテージ財団が「米国は非公式に日本に改憲を促すべきだ」とする政策提言を発表した。
先代ブッシュ大統領も公式会見で、日本が改憲を求めるならば問題はないと言明した。
民主党リベラル派のトム・ラントス下院外交委員長は「日本が安全保障でも大国にふさわしい役割を
果たすために憲法を改正しようとすることを強く支持する」と述べた。
東京都の石原慎太郎知事が16日にワシントンでの討論会で憲法破棄を提唱したとき、
米側の討論者のリチャード・ローレス元国防副次官は「日本の憲法は確かに米軍占領時代の遺物であり、
日本はそれを変える権利も自由も有している」と述べ、日本の憲法改正にいまの米側には抵抗がないことを明示した。
sankei.jp.msn.com/politics/news/120425/plc12042507090004-n1.htm
米国から提唱する「日本の核武装」
日本が唯一の核兵器被爆国として過去、自国の核武装に強く抵抗する理由は明白だったが、常軌を逸した隣国が
核兵器保有を公式宣言するに至った今、再考が必要になった
sankei.jp.msn.com/politics/news/111009/plc11100920310007-n3.htm
>>863 蔵から送信されたデータが既におかしいから
>>855 C++のコードを最適化する為にアセンブリ出力を読むのはお勧め。
但し、他でも言われているけどz80の知識だけではなんともならないと思う。
取り敢えず、アセンブリ出力を眺めてみたら?
866 :
デフォルトの名無しさん :2012/05/15(火) 21:25:45.73
>>859 >>864 説明不足ですいません.
リアルタイム性を重視する計測機器の情報なのでUDPが使われています.これは仕様なのでTCPに変えられません.
クライアント側は計測結果をリトルエンディアンで特定のバイトに入れて送信しているので,
そのデータを抜き出してchar型から計算可能な(三角関数などを使います)int型に変換したいのです.
Z80と全然違うから勉強し直しと言っていい
C言語について質問です。 リストってポインタが使えないと作れないデータ構造ですか?
869 :
855 :2012/05/15(火) 22:32:06.47
誤解させてしまったようですいません。 アセンブラを自分で修正するのではなくて、 「C++コードを書く→アセンブラを見てみる→ C++コードを修正してみる→アセンブラがどう変わったか見てみる」 というようなことをやりたいのです。 (頭では仮想関数テーブルやswitch文の最適化などイメージできてるつもりだけど、 実際には見ていないのに分かったつもりになってる。) Z80ではSSEも出ないですから現状はぜんぜん別世界ですよね・・・。 今回のやりたいことにマッチする、参考になるサイトがあれば教えてください!
>>868 一応「値」と「次要素の添字」の組を一要素とした配列を使えば
擬似的なモノは出来なくもないが…それは擬似リストとでも呼ぶべきかもな
>>869 逆汗使う(有償・無償のものがある)
デバッガ使う(有償・無償のものがあるが、ntsdで十分)
コンパイラにアセンブラのリスト出力をさせられるので、それを使う
3番目は一番近いようで難しい
ディレクティブがごちゃごちゃ入るので、ちょっと覗くにはしんどい
ptr/offset, mov/lea にきおつけろ
>>872 データ構造としては普通にリスト構造といっていいんじゃないか
875 :
デフォルトの名無しさん :2012/05/15(火) 23:30:22.89
オプティマイザに任せとけ
double atn = atan2(-(double)(Y1-Y2),(double)(X1-X2)); double hoge = fabs((double)Angle - atn); if( hoge >= PI/2) hoge = PI*2 - hoge;
double hoge = fabs((double)Angle - atan2(-(double)(Y1-Y2),(double)(X1-X2))); if(hoge >= PI/2){ hoge = PI*2 - hoge; }
879 :
デフォルトの名無しさん :2012/05/16(水) 00:26:05.59
主婦の7割「韓流が嫌い」 韓流ブームは日韓メディアが作り上げた虚像だったのか - ガジェット通信
http://getnews.jp/archives/212560 共立総合研究所が3月6日に発表した「韓流消費に関するアンケート」結果がインターネット上で関心を集めている。
調査によれば、日本の主婦の7割が「韓流好きではない」と回答しており、日韓両国のネット上では
「韓流ブームはメディアのステマ」などメディアを批判する声が上がった。
■日韓ネットユーザーは自国メディアを批判
日本のインターネット上ではアンケート結果を受けて、韓流ブームをあおったメディアを批判するコメントが殺到した。
「ステマ大失敗。またテレビのウソが明らかにw」
「世界中で大人気だったんじゃないのか?www」
「大金つぎ込んでステマ仕掛けたけども失敗した典型例」などと批判し、中には
「むしろ悪印象を根付かせる最悪の結果になったかなと」とメディアの韓流ごり押しが返って韓国の印象を悪くしたとの意見もあった。
また、調査結果は韓国メディア「マネートゥデイ」も報道。日本の韓流ブームが韓国で報じられているほど浸透していないことが分かると、
韓国のネットユーザーたちは自国メディアを批判するコメントを書き込んだ。
「正直、韓国の報道機関はみんな仮想ばかりだからね」
「歌を歌えばすぐにチャート1位。こんなのバブルでしょ。反省してほしい」
「韓流?そんなのは韓国メディアが作り上げたもの。日本のメディアは
取り上げないけど、今韓国では日流ブームが到来しているんだよ。街を見てくださいよ」
「私はヨーロッパ在住だけどこっちは日流。韓流より多い」
「正直言って韓流はメディアのやらせ」
「私も韓流なんて興味ない。みんな顔を作り直しているし」
「K-POPは一回性の音楽です」
「韓流の世界の認知度は、ポケットモンスターの足下にも及ばない」
「バブルってのは事実だと思う。韓国がIT以外に自慢できるものって何がある?」
「韓流ブームが過ぎ去る前に独島をなんとかしたい」
メディアのごり押しで嫌気がさしている人も多い。韓流ブームというバブルが弾けた後に、
日本国民全体に反韓感情だけが残るという事態にならなければいいが…。
韓流ブームの真骨頂は…ってム板じゃねえかよ、なんでここにまで
882 :
デフォルトの名無しさん :2012/05/16(水) 23:25:04.69
// optimize.hpp #pragma once template<class Solution> class OptBench{ public: double (*costFunction)(Solution sol); Solution bestSol; virtual void update() = 0; }; template<class Solution> class OptDescent : public OptBench<Solution>{ public: void update(); }; // optimize.cpp #include "optimize.hpp" template<class Solution> void OptDescent<Solution>::update(){ int a = 0; cout << a; } という感じでファイル分けて書いてるんですが、リンカでupdate()が未解決と怒られます メンバ関数がテンプレート関数の時は仮想関数作れないのは調べてわかったのですが、 テンプレートクラスの普通のメンバ関数を仮想関数にしてはいけないのでしょうか。
export template に対応してるコンパイラがほとんどないから同じヘッダに全部 書いた方がいいんじゃないのか 他のファイルからupdate()を参照しようとするとリンカエラーになるんだろ?
>>883 テンプレートって基本ファイル分割できないんですね…
参照しなくてもダメでした
cppファイルをincludeして無理やり解決しました
ありがとうございます
885 :
uy :2012/05/17(木) 14:49:47.79
なぜ初心者はCとかC++から入って そこで何年も止まるのだろう
高級アセンブラだからさ
>>885 仕事に使ってないから
趣味程度ではなかなか上達しないよ
でもあるレベルを超えると急に理解度が増すという事はある
>>887 いってること本質的におんなじだとおもうけど、
「C/C++でもやるか」ではじめる奴って、実際に何か実装する動機が弱いんだと思う
趣味ででも何か作ろうってなると、伸びる
フリーウェア位作れば仕事をしているのと大して変わらないからな
libjpegを使ったソフトを作ろうと思うんですけど、 ライセンスの表記ってどこで出せばいいんでしょうか? ソースの中? ヘルプの中?
書ける場所に全部書いておけ
>>890 そのソフトウェアの配布ページにでも書いておけばいいよ
とりあえず: 弁護士集団を擁している、あのMSの製品を真似ておけば。 > 表記
本格的に勉強するときって参考書買ったほうがいいかな? ちなみにQTやろうと思ってるんだけど
895 :
894 :2012/05/26(土) 22:24:37.49
if ((lockdes = open(_PATH_LOCKFILE, O_WRONLY | O_CREAT, 0600)) < 0) という処理なのですが、 これって、ロックファイル(_PATH_LOCKFILE)がすでに有った場合は、 openに失敗しますか?
しません
します
どっちやねん!
しますん
試せば分かるだろ馬鹿 クイズでもやってるのかよ
試してみました。 そすると、lockファイルがあっても無くても、open出来てしまいました。 あれ?「ロックファイルの意味ないじゃん」と思っていたら、 fcntl(lockdes, F_SETLKW, &lock); と言う処理が書いてありました。 ロックファイルは有っても無くてもopen出来るけれど、 実際の排他処理はfcntlでやってたんですね。 勉強になりました。
openとfcntlの間に他の処理が割り込むから排他になってない
すいません。 ちゃんとシグナル処理は書いてありました...
webkitのビルドがなかなか終わらないんですがどうしたらいいですか?
辞める
だいぶ前にビルドしたときは、まずIDLファイルが大量で案外時間かかって、 本体はプリコンパイルヘッダ使わない(強制してみたが、使えなかった)から、すごく遅い そして最後に、リリースビルドはリンクが/GLだから、延々時間かかる いいビルドマシン買え、って声が、そのとき俺の中で聞こえた気がした ま、今もそんなにかわらんだろ。よく知らんけど。
すごく初歩的な質問かもしれませんが、 #include<stdio.h> int g_i=1; int g_j=1; void test(int,int,int,int); int main(){ int x = 3; int y = 3; test (g_i,g_j,x,y); printf("%d %d",g_i,g_j); }; void test(int g_i,int g_j,int x,int y){ g_i = x; g_j = y; }; これがなぜ「3,3」と表示されず、「1,1」と表示されるのかがわかりません。 test関数でx,yの値(3)を受け取ってグローバル変数のg_i,g_jに代入してるから値が変わるんじゃないかと 思ってしまうんですが、そうならないのは何故ですか?
test(変数){} がローカル変数だから。
testの(int g_i,int 〜)の所でg_i,g_jがローカル変数として宣言されてしまって その関数の中ではグローバル変数として扱えなくなっているということですか?
>>910 グローバル変数として扱えなくなっているというより
そもそもグローバル変数でない別のものにアクセスしちゃう形
変数名を書かれたとき、コンパイラはスコープの近いものから順に探すので
近いところにg_iやg_j(これらはグローバルのg_iやg_jとは別の変数)を見付けた時点で「ああこれね」となり
グローバル変数があるかどうかなんて別に気にも留めないままコンパイルすることになる
そんなワケでローカルのg_iやg_jに値を代入し、それは使われないまま捨てられる
…てな感じで考えたほうがいいかな
>>911 ほう。
わかりやすく説明してくださってありがとうございました
たすかりました!
同名のローカル変数を作るとグローバル関数を隠蔽してしまう
>>908 こうすれば、実行結果は3,3になる。
#include<stdio.h>
int g_i=1;
int g_j=1;
void test(int*,int*,int,int);
int main()
{
int x = 3;
int y = 3;
test (&g_i,&g_j,x,y);
printf("%d %d",g_i,g_j);
};
void test(int* g_i,int* g_j,int x,int y)
{
*g_i = x;
*g_j = y;
};
class Charactor{ public: void update(); private: Posx,Posy; }; Charactor* my = new Charactor(); Charactor* enemy = new Charactor(); とするとmyのupdate()の中でenemyのPosx,Posyの情報を取得する方法はありますか?
>>915 void update(Charactor * other)にしてmy->update(enemy)とかすればother->Posxで取得できる
>>916 返答ありがとうございます!
ということはさらにCharactor* bossをnewしたりすると
引数はもっと増えていってしまうのですね
>>917 > ということはさらにCharactor* bossをnewしたりすると
> 引数はもっと増えていってしまうのですね
一つずつ渡していくならそうなる
void update(vector<Charactor*> const & v)とかにしてまとめて渡すようにすれば直接の引数は一つだけのままにできる
>>918 まとめる方法もあったんですね
vectorも最近学んでいたのでこの機会に使いこなせるようがんばってみます
返答ありがとうございました!
コンストラクタの初期化子リストをコンストラクタの引数で初期化するとき、 初期化対象と引数が同じ名前のときはどう書くのが良いのですか 例: class Foo { const int bar; public: Foo(int bar) : bar(bar) { } // <--これは規格上合法? }; 現状このような時だけメンバの方にm_をつけてm_barとするとか、 あるいは引数の方をbar_とかして区別できるようにしていますがいい加減嫌気がさしてきたOTL
引数なんて「a b c」にしとけ ちなみにメンバは「x y z」な
>>920 規格ではエラーにはならないから合法
…ってそういうことを聞きたいんじゃないよなw
コンストラクタの中で宣言した引数やローカル変数の名前は
その外のスコープの名前(クラスのメンバ変数の名前も含む)を隠蔽する
ttp://codepad.org/92RJuiOS 引数の名前で隠蔽した場合は注意が必要 ↑の例だとh.yの値はh.xの3倍ではないぞ
C99から配列のサイズを実行時に指定できるようになりましたが、この配列に対してsizeofが可能なのはどういった仕組みなのでしょうか。 size_t foo(int size) { int array[size]; return sizeof(array); } 単にコンパイル時にsize*sizeof(int)相当のコードに置きかえているのでしょうか。
>>923 C99の規格書に当たったわけではないからその点割り引いて聞いて欲しいが、
C99の可変長配列は関数の引数としても渡せるから、
配列自体にサイズ情報が保持されている必要があり、
コンパイル時にsize*sizeof(int)相当のコードに置きかえるという>923方式一辺倒では破綻する
(※ >923のような他の関数に渡さない特定の場合に最適化によってそのようなコードが生成されることは考えられる)
可変長配列をスタック上にしか取れない(自動変数としてのみ可能)という制限から察するに、
alloca()と同じような内部メカニズムなのではないか
>>924 あーそうらしいね
規格票を "variable length array" で検索してみると分かるけど、多次元配列を
動的に確保出来るのと、sizeof演算子が適用出来るという点は素晴らしいと思う
多次元配列ならalloca()の構文糖と解釈する事も出来るが、sizeofが使えると
なると俄然意味合いが違ってくる
ただし他の型とsizeof演算子の内部メカニズムが異なるらしく、他の固定型はコンパイル
時にサイズが決定しているが、variable length arrayは実行時にサイズを評価している
コンパウンドリテラルの中にvariable length arrayがあるような場合も同じ
自分で渡したサイズを配列から求めなおす必要があるのってどんな場合?
>>926 呼び出す度に異なるサイズの可変長配列を確保するような場合じゃね
Microsoft Visual C++ 2008 です #pragma once #include <exception> class MyException : public std::exception { public: EMemberMaxException(const char *msg) { std::exception(msg); // <- この行で「error C2082: 仮パラメータ 'msg' が再定義されました。」というエラーが出ます } }; 何故再定義とみなされてしまうのでしょうか? 私のstd::exceptionの継承の仕方がマズいのでしょうか?
>>928 そのソースどおりならEMemberMaxExceptionの返却値型がなくメンバ関数の定義になってないから
>>929 ごめんなさいよく見たらコンストラクタ名直すの忘れてました…
ええと、本来ならクラス名と同じ名前なんです…
>>928 ,930
exceptionにはconst char *をとるコンストラクタはない
そのため
exception(msg);
は一時変数の生成でなく
exception msg;
という変数宣言と解釈されるから
参考
ttp://codepad.org/aDURxBwF 変数の宣言時に変数名は括弧で囲える
もしかして: EMemberMaxException(const char *msg) :std::exception(msg){ }
934 :
933 :2012/06/11(月) 23:37:34.32
それとやりたかったことが
>>932 でも
> exceptionにはconst char *をとるコンストラクタはない
は正しいのでコンパイルエラーになるのは変わらない
>>931-934 ありがとうございます
C++の場合、コンストラクタの継承ってこう書くんですね…
変数宣言が括弧で括れることも知らなかったです、併せて覚えておきます
内部クラスの前方宣言って無理なん? class A; class A::B; <- コンパイルエラー
無理
extern "C" { void foo( ); } のとき、C++風にfoo( void )なのと、C風にfoo( ... )なののどっちに解釈されるの?
>>937 無理かあ
んじゃ名前空間でも作ってそこに両方置いてみる、ありがと
template<class _A> class B: _A{}; class A{}; template class B<A>; extern "C"は構文をC++からCにするという意味ではない。
キャメルケースによる命名は特にJava系言語で隆盛だと思うのですが 大文字のみの略語が含まれる場合どうするべきなのですか 例: EUCEncoding v.s. EucEncoding また、どっちにせよ大文字のみの略語が来ると アッパーキャメルケース (UCC)(またはパスカルキャメルケース)をクラス名に使い、 ローワーキャメルケース (LCC)をメンバやインスタンスの名前に使うという使い分けをしたい場合 区別がつかなくなると思うのですがソフトウェア工学的にはどうするのが正しいのですか
942 :
941 :2012/06/17(日) 10:38:20.37
どう書いてもソフトウェア工学的な正しさなんかない プロジェクト内での命名ルールが統一されてればどうでもいい
そういう時は悪しきハンガリアン記法を借りてくればいいじゃないか。
クラス名にはCEUCEncoding、そのオブジェクトはcEUCEncoding、データメンバならm_EUCEncodeType。
関数は動詞から始まるから問題の埒外。
っていうか
>>943 で正解。
質問です。ガチ初心者で変なこと聞いてるかもしれませんが C++であるシステムを作ろうとした時、 メインのソースファイル(main.cpp)があって、ヘッダーファイル(main.h)に インクルードや定数の定義、宣言などをすると思うんですが 例えば、このヘッダーファイル(main.h)がインクルードするヘッダーファイル郡に 全ての処理が記述されていて(そのヘッダーファイル郡がさらに新たなインクルードをするなどで)、 メインのソースファイル(main.c)では、極端に言えば「関数を1つ呼び出すだけでOK」 という状態が、オブジェクト指向というものの理想なのでしょうか? まだまだ初心者でいろいろと練習していきたいのですが そういったところを意識して丁寧にやっていくか、ただがむしゃらに数をこなしていこうかどうかという方針が定まらないです
めくるめくC++の世界へのエントリポイントとしてのmain() なら、 main() 自体は数行ってことはあるよ OOPのひとつの書き方として、実装のあらかたがクラス定義におさまる書き方はある。
>>945 知らんが、オブジェクト指向は関数型言語的性格(オブジェクトを生成するだけで変えない)と、
命令言語型的性格(生成したオブジェクトの状態を変える(破壊的代入))のミックスしたもので
数学的モデルが定まっていない
ゆえに、系の原始オブジェクトが何であるべきか、について統一した見解など今のところ無い
【派閥1】一般的に言って、モデルとビューとコントロールは分けたほうがあとあと使い勝手が良いし、
問題の適度な一般化をも意味するから分けて考えることでかえって設計しやすい
ということはこれら3オブジェクトの生成ぐらいはmain()にあっても良いんジャマイカ、
(これらの生成を1つのクラス内で行うか、main()の中で行うかは本質的な違いとは言えない
【派閥2】普通UIはプログラム1本につき1つだから、プログラムを特徴付けるオブジェクトとして
main()ではビューに相当するオブジェクトを1個生成し、ビューのコンストラクタかLoad()イベントで
モデルとコントロールを生成さす
【派閥3】まずコントロールを(以下略
MFCなんかmyAppっていうグローバルなクラスオブジェクトの中にありとあらゆるものがぶっこまれてるからなぁ。 main関数なんてほとんどからっぷでもいいレベル。
>>946-948 ありがとうございます。
これだけ自由度の高い分野だと「コレ」と決めてしまうことによる弊害の方が多いのでしょうね
コーディング規約などにおいてもガッチリ決まってるモノもないようなので
今はとにかくクラスの概念に慣れることに専念しようと思います
俺もMFCを例示しようと思ってた クラスの設計はいろいろで、性格というか考え方が現れる ソースを見せるのが恥ずかしい原因の一つでもある
前任者のボヤキがw
ワザワザアプリケーション固有の動作を書いたクラス作って mainをほぼ空にするのは個人的にナンセンスだと思うな。 アプリケーション固有の動作なんて、main関数内にできるだけ 納めておいたほうがいいし、クラスを作るより先に、オブジェクトを 組み合わせて新しい動作を定義するよう心がけたほうがいいと思う。 トップレベルのウィンドウなんかは他で共有しないんだから main(WinMain)の中で構築したって困らないし。
954 :
uy :2012/06/20(水) 06:54:43.40
俺はゴミカスだがエリートゴミカスだ お前らのような下級ゴミカスとは格が違う
>>953 CUIとしても動作させる可能性があったり、他のプログラムからの起動もあったりするから、
main()の中が見通しがいい方が融通は利くよ。
まぁ、そういうプログラミングをしないのならナンセンスに思えるのは判るけどね。
>>953 沢山の関数に分離したり、クラスにしたりとやり方は様々だけど
main()に限らず一関数に長々突っ込むのだけは流石にマズいと思うよ
CとC++両方できる人に聞きたいんだけど、 プログラムの開発でC++でなく純粋なCで書くメリットってある?
純粋なCってのがあいまいすぎる
あいまい・・か? ではC++固有の機能を使わない、C言語の規格に則ったプログラム開発と訂正しておく。 最近C++始めたんだが、その高機能な言語仕様の前にCの存在価値がほぼ無いように感じる。 組み込み系とかは別だが。
書く人によるけどCの方が高速なものが作れたりバイナリが小さくなったりというメリットはある
DLL作るときもインターフェース部分はCにしておくことが多い
C++の方ができる実行ファイルが大きい環境がある 例えばmainがほぼ空でも Cだと24KB C++だと500KB
restrictとかC側にしかない機能も一応挙げてやれよ
c99の機能を積極的に使いたいときもCだな。 まぁ、大抵C++で書いているね。
Cで書きゃ移植性は抜群。Javaより動作環境は多い。 なので、新しいプラットフォームによく移る場合は、 Cで資産蓄えることになるわな。 携帯電話のドライバーまわりやら、HPC、ネットワーク機器関連とかは Cが多いだろ。突っ込まれる前に書くがHPCに関しては、C++に比べればという話で FORTRANの方が圧倒的に需要がある。
for(i=0;i<2;i++){ for(j=0;j<4;j++){ if((i==j) || (i==3-j) ){ v=a[i][j]; a[i][j]=a[3-i][3-j]; a[3-i][3-j]=v; } } } 4次魔方陣 label1に表示するにはどうしたら良い?
label1.SetWindowText() に文字列化して突っ込め、とかか? そうだとすると、\tが効果を発揮するように組めよ てかもっとlabel1のほうのヒントよこせ
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { char i; char j; String^ w=""; for(i=0;i<4;i++){ for(j=0;j<4;j++){ a[i][j]=4*i+j+1; if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" "; if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" "; } w=w+L"\n"; } label1->Text=w; } こんな感じに表示したい
すればいい
FortranのプログラムをCに組み込む方法教えてください DLLを作るんですか?
作ればいい
>>967 なぜCでもないのにlabel.SetText();
じゃないのかイラッとするな
>>970 gcc Cのソース.c Fortranのソース.f
この時、Fortran側に外部関数の呼び出し書いとけば行ける
label.SetText(); はjava? Visual C++なんだけど
label1という名前にセンスがない
visual studio 2010 のデフォルトそのままなんだがw
じゃlabel2にしとけ
>>973 VIsual C++じゃなくて、MFCの問題だろ
ATLやら他のライブラリ使ってみろよ
>>968 だと
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
と表示される
>>966 で↓の値が出てるから空いたマスに上の値を入れて表示したいんだが。
16 13
11 10
07 06
04 01
16 02 03 13
05 11 10 08
09 07 06 12
04 14 15 01
C++はじめて1週間くらいだから他のライブラリとか分からん
C++/CLIじゃねーか
>>978 なんで>968じゃいかんの?
C++はじめて一週間かどうかよりも、日本語をもう少し何とかしてくれないと。
少なくとも、他人に判るように説明する訓練くらいはしておいてくれ。
説明不足 コメントくらい書けゴミカス
>>982 いやだから、魔方陣の表示は>968でいいんじゃねぇかと。
応用できないの? 馬鹿なの?
表示したい ↓ こんな風に表示したい ↓ そのやり方でいいじゃん ↓ それは4次魔方陣じゃねーよ ライブラリが…ってレベルじゃないよね
4次魔方陣なら入れ替える必要がない ゴミカスはさっさと消えろ
C++の推薦図書でよく見る「詳説C++ 第2版」。 凄い面倒な言い回しだったり、 重要な部分をさらっと書いて終わってたり・・・。 内容は濃いのかもしれんが著者の文が突っ走りだったり図が大変理解しがたく、 100ページを完全理解するのに数日もかかっていて苦労しています・・・。 そこで本を変えようと思っての質問です。 内容が濃く、文章や図が理解し易いC++入門書でおすすめがあったら教えてください。 望洋?ロベール?あたりですかね? 今までCで書いて公開してたソフトをC++でフルスクラッチするのが目的です。 古い1998しか知らないので「2003」をまず勉強したい。 2003の理由は使ってる環境がVS2005だからです。
あきれるバカだな 本当に4次魔方陣知らんのだな どうせ答えられんのだから黙っとけやカス まだパン君の方が日本語理解出来るな死ねカスごみ
お前みたいなのがいるから過疎スレになるんだよ ヲタニートクソwwwwwwwwww
( ( ,,.r'' ゛~~` ''ッ,, ) ) 、 ゛ ,,,,,,,,,,,,,,,,,,,,, ヾ. ,.、 / / ミ ミ゛,へ.__, ,_ノヽ i. .| |l l ,´ ミ ミ, ( ・) {・フ 〉 ミ. _-、i::| |ニニii ' 、,,,,ツi: ミ,`~´ ヽ~〈 .ミ /,‐ヽヽ`、|| 、シ`` i: ,ゞ 'n.inヽ. .ミ ( .〉〉/ シ // ミ` l.l ヽ"、 / ノ ミ/ シ 彡 ,=こ二=.{ ミ,, ,r'´ ,,、'゛ ミi. / / ' ! w、`~^' vwv '、 ミ 〃 .ミ .ミ / i: / `^^ \ ." 〃 ミ .ミ.:/ / / i: v ! ,, \ 、 〃 ミ 知ったかも疲れるんだぜwww :i; .i: w !! ミ!: ミ \\( ⌒ヽ :i; / i: !! .ミ キ , ⌒`、_ ) ) :il .i: ! w! ミ .:i. (_ ( _,ノ ) , :il ! i: ! ,〃゛ キ ゞ、 __, ノ , .:il ! /~~````` " '''' = ‐- 、ミ _,,,,_ミ, il ` ー ´ :il ´ ―  ̄ - ,,. -‐‐-、、 ヽ. ヾ、 ゞ、 ` 〃 ゝ、wx.mn.!!++ナ'~ ヾ~ヽ、 ヽ、 ,, ~^^}´ 彡 〃 〃 }} /〉.〉〉〉i''" 〃 彡、 {{ 〃,__!////l | 〃 X,, 》. ≪.__`‐'.' '´,Uwwvw'、...,,,___ ^^^^ !wニこ)こ)二)`) (_,,,..- 、...二⊃_).).
C++98とC++03ってほとんど変わらなくね
992 :
デフォルトの名無しさん :2012/07/10(火) 17:40:52.97
過疎らないように上げておこう
993 :
デフォルトの名無しさん :2012/07/10(火) 17:54:12.57
更に上げとこう
∧_∧ / ̄ ̄ ̄ ̄ ∧( ´∀`)< あげ ( ⊂ ⊃ \____ ( つ ノ ノ |(__)_) (__)_)
995 :
デフォルトの名無しさん :2012/07/10(火) 18:08:25.20
漏れら極悪非道のageブラザーズ! 今日もネタもないのにageてやるからな!  ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ ∧_∧ age (・∀・∩)(∩・∀・) age (つ 丿 ( ⊂) age ( ヽノ ヽ/ ) age し(_) (_)J
僕たち純真無垢なsageブラザーズ! 人目につかないようにsageてあげるよ!  ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ ∧_∧ sage (・∀・ ) ( ・∀・) sage / \ / \ sage ⊂( ヽノ つ ⊂ヽ/ ) つ sage し(_) (_)J
>>986 魔方陣分かってねーな
グルグルじゃねーぞ(笑)
うめようず
↓↓↓こいつ童貞↓↓↓
1000なら一生童貞
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。