スレを勃てるまでもないC/C++の質問はここで 13
2点A(x1,y1)とB(x2,y2)があります 点ABを結んだ直線をCとします 点Aから直線C上を点B方向に距離xだけ進んだ点(x3,y3)を 求める式をC++プログラムで教えてください
いいえ
5 :
3 :2009/12/15(火) 15:52:44
自己解決
6 :
デフォルトの名無しさん :2009/12/15(火) 17:53:51
g++&Windowsです。 #include <iomanip> でも #include <IOMANIP> でも #include <IoMaNiP> でも問題無くインクルードできるようですが、 これは標準C++の仕様ですか?
>>6 Windows の仕様です。
Linux に移植するときに泣けます。
>>7 なるほど。
つまりファイルシステム自体が大文字小文字を区別しない
仕様になっているから、ということですね。
ありがとうございました。
VC++2005で仕事場ではコンパイルおkなのに 自宅ではエラーが出ます。 エラーは、 fatal error C1083: include ファイルを開けません。'Src/foo.h': No such file or directory と出ます。 同じプロジェクトを使ってるのになぜエラーが出るんでしょうか? ソース部は #include "Src/foo.h" となっています。 フォルダ構成は Project ¥Src です。 Srcフォルダ内にfoo.hが確かに入ってます。 プロジェクトはフォルダごとコピーなので プロジェクト設定に差はありません。
10 :
デフォルトの名無しさん :2009/12/15(火) 21:27:48
fmtflags っていうクラスはなんですか?
11 :
デフォルトの名無しさん :2009/12/16(水) 08:42:57
屑スレが 消しとけ
>>9 インクルードパスがフルパスになってないか?
その為ドライブが違うかディレクトリー構成が違っていないか?
std::bad_allocを利用して例外処理をしているのですがちゃんと動作するか確認をしたいのですがどうすれば良いのでしょうか? 意図的にメモリリークなんて起こせるんですか?
無限ループでリークさせまくるとか
>>14 素早い回答ありがとうございます!早速試してみますね(・∀・)
new char[(size_t)-1]のように明らかに確保できないほど大量のメモリを確保しようとするというのもいける。
17 :
デフォルトの名無しさん :2009/12/17(木) 07:26:01
まて メモリーリーク の用語の認識がおかしくないか?
確かにメモリリークする必要はないよな。
operator newをオーバーロードして、たまにbad_alloc投げるようにするとか
20 :
デフォルトの名無しさん :2009/12/17(木) 20:20:42
for(unsigned int i=1;i<100;++i) { static unsigned long long sull=10; sull*=sull; new char[sull]; } これでどうだ
22 :
デフォルトの名無しさん :2009/12/17(木) 20:24:22
あ
>>23 名前を考えるのもめんどくさかったんだよ!
ハンガリアン無かったらWinアプリ作ときに困る
>>26 ?
その調子だと生きるのもおつらいでしょう。
28 :
デフォルトの名無しさん :2009/12/18(金) 13:27:57
singleton class の destractor で cout 使うのってだめなの? borland developer studio 2006 だと実行時エラーになるんだけど borland c++ builder 5 だと OK #include <iostream> class Sgtn { Sgtn() {} public: static Sgtn& Inst(); ~Sgtn() { std::cout << "Sgtn::~Sgtn" << std::endl; } }; Sgtn& Sgtn::Inst() { static Sgtn inst; return inst; } int main() { Sgtn::Inst(); return 0; }
coutが先にデストラクトされてしまうとか? グローバル変数のデストラクト順ってどうなってたっけ・・・
神の味噌汁
なぜかワロタw
シングルトンよりカウンタ使って例外飛ばす方がクール
クールミントガム
C++にあってCに無い物の代表格として「参照渡し」が挙げられるわけだけど 書籍によるとC++の参照渡しは、特に呼び出し側が値渡ししてるのか参照渡し してるのか見分けにくいことから参照渡しを多用することは慎むよう助言されている。 となるとC++ではいったいどういう風に”ポインタの値渡し”と”参照渡し”を使い分けるべきなんだろう? まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど 果たしてそれで正しいと思う?
const参照渡し以外はポインタの値渡しで
>>35 > const参照渡し
これはなぜ参照渡しする必要があるの?
プロジェクトによる
>>34 >まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど
>果たしてそれで正しいと思う?
その書籍にはどういうときに参照渡しを使うのか書いてないの?
ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。
>>38 > その書籍にはどういうときに参照渡しを使うのか書いてないの?
> ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。
うん、参照渡しの多用は自重すべきとは書いてあるけど
どういうときに参照渡しを使うべきかは詳しくは書かれてはいない(・ω・)
エディタが教えてくれるから別に混乱なんかしないだろ
>>39 > うん、参照渡しの多用は自重すべきとは書いてあるけど
まさかconst参照渡しまで自重しろと書いてあるの?
それなら・・・
よし!
その本をまず窓から投げ捨てるんだ!
>>41 言われてみればconst参照渡しはシレっと紹介されていた気がする。
なんか重要なの?>const参照渡し
>>42 const参照渡しは革命的に便利。
便利というか効率という点でもその他の意味でも必須。
残念ながら語りきれる気がしない。
>const参照渡しはシレっと紹介されていた気がする。
その本は本当にC++の本なのか!?
本気で捨てろと言いたくなった本はそれが初めてだ。
その”const参照渡し”ってのは単に”ポインタ値渡し”に置き換えることはできないの?
>>42 この程度のことはググればすぐに分かるから自分で調べろ。
>>44 考え方が根本的に間違ってるよ。
ポインタ渡しは危険でバグの巣窟として有名。
この危険なコードを書かないように導入されたのが参照渡し。
ちなみにオブジェクトを最も安全に引数に渡せるのが「const付き参照渡し」なのでかなり重要です。
namespace { class kuzu { public: void muooon(void); }; } void kuzu::muooon(void) { } ↑これって定義の方にnamespaceつけなくてもそのファイル限定になる?
48 :
デフォルトの名無しさん :2009/12/23(水) 07:37:49
・・・
なる
>>42 オブジェクトを渡すときはほとんどconst参照渡し。速いし安全。
渡したオブジェクトを変更したいときだけ非const参照渡しだね。
const参照渡しを主にして、非const参照渡しを控えるのならまだわかるけど。const参照渡しの説明が少ないのは理解しがたいな。
>>44 参照はポインターに比べて安全に使用できる。
void func2(const int& d)
{
}
void func()
{
int a;
{
int& b=a; //OK
int& c; //エラー
func2(a); //ok
}
}
参照は以上の例のように、初期化が必須なので参照先があることが文法上保障され、実体と区別なく安全に使える。
さらにスコープによって寿命が実体a>参照b>参照dになることが文法上保障されるから安全に使用できる。これは参照渡しでも同様。
だけど、この文法上の保障もポインタと併用すると安全性をぶち壊す危険な抜け道コードがいくらでも書ける。
これが文法上で危険性を排除できる参照と、自由だけど自己責任なポインタの大きな違いだと思うよ。
int& i = *(int*)NULL; // おk
>>50 それでも俺はint型といったオブジェクトではない変数はC++であっても参照ではなく
ポインタで渡すべきだと思う。ポインタが危険とはいえプログラムの可読性はあきらかに
ポインタ>参照
だ。
一方クラスといったオブジェクトはconst参照渡しを強く推奨する。
オブジェクトを渡すときはconst参照で渡すものという暗黙の了解が広く普及しているだろうし。
ポインタが*iじゃなくてiでアクセスできる文法ならそれでよかった
結局のところ可読性と安全性・最適化のどっちを犠牲にするかだな 関数名とか文脈でだいたいわかるから俺は参照使うけど
>>54 > 関数名とか文脈でだいたいわかるから
それが我流プログラミングの始まりですわな(´・ω・`)
56 :
43 :2009/12/23(水) 23:38:25
>>43 移行まじめに読んでないけど横槍レスしていいすか?
> ポインタが危険とはいえプログラムの可読性はあきらかに
> ポインタ>参照
明らかと言っていいかどうか分からんが、
思う思わないはまあ宗教論争だしなぁ。
・・・あとテンプレートが大好きな俺としては参照じゃないと気持ち悪くて仕方ない。
58 :
デフォルトの名無しさん :2009/12/24(木) 06:16:24
intをアドレス渡し(ポインタ渡し)や参照渡しするやつは何を考えてのことだろうか…? コピー渡し(値渡し)の一択だろ
WindowsAPIが混じっているのですがご了承ください。 以下、strの宣言が悪いといってコンパイルエラーになります。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: HDC hdc; PAINTSTRUCT paint; char *str = "猫でもわかるプログラミング"; hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); EndPaint(hWnd, &paint); break; 以下のように、{を追加するとエラーが出なくなります。どうして{が必要なのでしょうか? LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { ←★追加 HDC hdc; PAINTSTRUCT paint; char *str = "猫でもわかるプログラミング"; hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); EndPaint(hWnd, &paint); break; } ←★追加
cはスコープの頭じゃないと変数を作れないのさ!
>>61 > cはスコープの頭じゃないと変数を作れないのさ!
あ〜、初心者がよくやる間違いだよなw
なんであんなへんてこな仕様にしたんだろう>変数の宣言場所は先頭部分のみ
switch (x) { case A: int z; //... case B: // いつのまにかzがあるぞ } C++でも case B に突入すること考えて文句が出るはず
>>60 コンパイラは何を使ってるの?
言語はC?C++?
エラー内容は?
VC++2008EEで試してみたけどコンパイルエラーは出なかったよ。
ウィンドウプロシージャなんだから省略した部分にcaseがずらずら書いてあると見るべきだろう。
>>60 C2360をググれ
66 :
デフォルトの名無しさん :2009/12/24(木) 16:50:07
C++ってライブラリ豊富なの?特に文字列かんれん
最悪だ
boostまで使えば
ど素人です。 oracleと接続してデータ取りたいのですが、 以下のソースで実行したところ途中までしかデータがとれません。 ※300000件中、16000件ちょいでデータがきれてしまう 何が原因かわかりますでしょうか? 切り貼りしたソースが足りなかったらすみません。 EXEC SQL OPEN CUR1; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH CUR1 INTO :item_data; rows = sqlca.sqlerrd[2]; } rows = sqlca.sqlerrd[2]; for (i=0;i<rows;i++) { printf("%d\n", item_data[i].item_seqno, ); } EXEC SQL CLOSE CUR1;
70 :
69 :2009/12/24(木) 17:53:50
環境書くの忘れてました。 SunOS 5.6 Oracle 8.1.6 CCコンパイラ です。
あー Oracle スレ落ちてんのか。それにしても C/C++ の話じゃねぇな。 >EXEC SQL FETCH CUR1 INTO :item_data; 構造体の配列らしいが、なんで上書きしてんの?
template<typename T> struct Base { typedef T type; }; /* ○VC9/×GCC */ template<typename T> struct Derived : public Base<T> { typedef type type; }; /* ○VC9/○GCC */ template<typename T> struct Derived2 : public Base<T> { typedef typename Base<T>::type type; }; 前者の記法は非標準なのでしょうか?
>>57 > intは値渡しだね。
intを参照渡し、ポインタ渡しする人っている?
そういうときはreturnで返すのが常套じゃね?
複数のint型変数を返すときはint型配列のポインタ渡しか参照渡しするか、
そうでなければ構造体の参照渡しかポイント渡しにするのがセオリーじゃないの?
>>66 豊富とは決して言えない
特に標準ライブラリは発狂物ww
でもboostを筆頭とする各種無償ライブラリとか
商用ライブラリとかまで含めれば豊富と言っていいとは思う。
CやってからC++のstring比べれば天国だろ。
>>66 初めからなんでも用意してある環境が欲しいなら、C/C++はおすすめできない。
C++0xだと任意長テンプレートが組み込まれてるらしいですが、今はまだですよね make_tupleのように任意長のテンプレートはどうやって作ってるんでしょうか?
>>73 つ[配列にするほどでも、構造体にするほどでもないとき]
79 :
74 :2009/12/25(金) 20:23:31
>>75 確かにCやってからのstd::stringには泣いた。
80 :
デフォルトの名無しさん :2009/12/26(土) 18:57:20
ふーん
81 :
74 :2009/12/26(土) 19:16:32
文字列すべてに MFC の CString 使ってるバカの所為で Linux への移植が大変だった、って意味では俺も泣いていいかな。
CString作っちゃえ
>>82 まて、そんなMFCのCStringだなんてクソと一緒にするな。
std::stringで書いてあればその苦労は全く無かったはずだ。全く。
ちょいと相談。 template<class T>class Settings { // }; struct Arecord { // }; class Asettings : Settings<Arecord> { // }; こんなクラス構造があると思いねぇ。勿論、Aの他にもBやCもある。 んでもって、一々Arecordとするのも業腹だから class Asettingsの中でstruct Record としてしまいたいってわけだ。 するってぇと、定義の順番の都合で巧くコンパイルできねぇ。 どうしたもんかね、こりゃ。
>>85 class Asettings
が何か分からないから答えられぬ。
87 :
86 :2009/12/29(火) 11:58:00
>>85 ごめんカンチガイした。
template<class T>class Settings {
//
};
struct Arecord;
class Asettings : Settings<Arecord> {
struct Arecord {
//
};
//
};
これじゃだめなの?
>>87 ResTHX!
それだとダメだった。
Arecordが::Arecordで宣言されて
Asettings::Arecordで定義されるからだと思う。
89 :
87 :2009/12/29(火) 16:10:09
>>88 > Arecordが::Arecordで宣言されて
> Asettings::Arecordで定義されるからだと思う。
なるほど。たしかに。
Asettingsのクラス定義を分割できないって仕様がくせ者邪魔だなぁ。。
90 :
87 :2009/12/29(火) 16:15:29
91 :
87 :2009/12/29(火) 16:17:33
ちなみに VC++ 2008でもbcc5.5.1でも通ったよ。
うーむ。gcc3が通らないのが問題なのか。情報THX!
97 :
デフォルトの名無しさん :2009/12/30(水) 10:46:28
私のコーディングスタイルって変ですか? structが引数になるときは参照渡し、 classの時はポインタ渡し、 としているのですが、変ですか? struct Point; class Object; Point Add(const Point &p1, const Point &p2); shared_ptr<Object> Get(Object* base); って感じなんですが・・・(^^;)
変です
そういう風に区別する必要性がないと思うよ。 ほとんどの場合参照で渡せば問題ないはず。 ポインタで渡すのは、nullの状態を作りたい場合くらいかな。
structもclassも基本的には同じものだからね 区別する方がおかしい structで書いたらダメ出しする老害は死ぬがいいよ
structで書いてダメ出しされたのかw
classはprivateがデフォルト、structはpublicがデフォルトなのが微妙な位置づけの違いだろうね。 個人的には、structはデーター構造作るときにアライン合わせるときとか、ただのメンバ変数の集合体を作るときだけとしている。 boostのソース読むときはclassとstructがごっちゃになってるので読みづらいな。明確な使い分けの無いほぼ同じ機能の構文が複数あるのは勘弁してほしいよ。
そんなんがC++にはいっぱいあるよな(笑) 俺もstructはメンバ変数やメンバ関数含めほぼ全部publicにしているよ。 (つまりPODとまでは行かないが相当小さい簡易的なもの。) 全部publicでも大きなものはclassとしている。 逆に一つでもprivateにしたい場合はかなりの割合でclassとしている。 要は、読み手の受ける印象の違いだろうけどさ。
104 :
97 :2009/12/30(水) 11:53:59
わたしもstructはデータ、classはクラス(?)と扱うものとしてます・・・ なんかそっちのほうが個人的には読みやすいので (^^; あと、クラスに参照だと基底クラスにキャストすることはできるのかな、とか思って。 趣味グラマなんでそこらへんがよくわかんないですm(_ _)m
>>104 できるよ!!だから安心して参照を使ってね♥
107 :
デフォルトの名無しさん :2009/12/30(水) 14:48:51
すごく基本的な質問ですが・・・ char **c = new char*[5]; と char *c[5]; って、どういう違いがあるんでしょうか? deleteはどっちの場合も必要?
108 :
97 :2009/12/30(水) 14:52:20
レスありがとうございます♪ そういえば参照を使う時でもshared_ptrは値渡しでいいんですよね??
>>107 newとdeleteは1対1で対応するべきものです
newが無いのにdeleteしていたり、newしているのにdeleteが無いのは、どこか間違っている可能性が高いです
110 :
105 :2009/12/30(水) 15:05:06
>>108 値渡しじゃなくて、
「値渡しと同じ書き方」ね。
いいよ。
というかそれができるのが参照の利点なのさ。
>>107 まず
> char *c = new char[5];
> と
> char c[5];
で考えてはいかがですか?
112 :
107 :2009/12/30(水) 15:31:31
回答ありがとうございます。 char *c = new char[5]; と char c[5]; の場合は、後者には他の文字列ポインタを代入できないというくらいで 基本的には同じような扱い方でOKなんですよね? で、関数を抜けるときは前者のみdeleteが必要ということですよね? char **c = new char*[5]; と char *c[5]; の場合のnewとdeleteの対応ですが、 後者はポインタの配列になると思うのですが 各要素に個別にnewを使っていた場合は、 また個別にdeleteしていくしかないということになるんですか? 関数を抜けるときに配列自体が開放される(?)ので ついでに要素についても自動的に開放されるということはないのでしょうか?
無いよ
std::string使え
>>112 前者に文字列ポインタを代入していいなんてどこに書いてあった?
ここにそれを晒した上で窓から投げ捨てろ
>>112 配列のdeleteはdelete[]だから。
たとえば
char* c=new char[5];
に対するデリートはdelete[] c;だよ。
個別というのが
char* c[5];
c[0]=new char;
という意味だったら、
delete c[0]は必要だから。
スコープから抜けるときに配列は消えるけど中身は消えないからね。
スマートポインタをぐぐると便利だよ。
117 :
デフォルトの名無しさん :2009/12/30(水) 16:56:59
だれか絵を描いてうpしてやれ
> ついでに要素についても自動的に開放されるということはないのでしょうか? そんな親切な言語じゃないところがC++のいいところであり悪い所でもある。
119 :
107 :2009/12/30(水) 17:21:56
みなさんご回答ありがとうございます。
おかげさまで何となく理解できた気がします。
ポインタ関係はややこしいですね。
>>115 char *a = "abcd";
char b[5];
char *c = new char[5];
b = a; // エラー
c = a; // 一応OK
上記のような意味で書いたのですが、用語の使い方を誤っていたかもしれません。
>c = a; // 一応OK OKじゃねーよ。 newしたバッファはどっかいっちゃうぞ
文法上は正しいが、やってはいけないことだな
ハッ!107はchar*はすべて文字列ポインタと呼んでるのか そんな呼び方は窓から(ry
123 :
111 :2009/12/30(水) 17:39:59
>>107 はちゃんと一応OKって言っているじゃん。
確かに一応OKなんだよ。
リソースを開放する気がないんなら。
そういう嫌がらせプログラムを組みたくなったときに必要な知識だ。
124 :
107 :2009/12/30(水) 17:51:20
何度もすみません。
もう1点いいですか?
char *b[5];
と
char (*c)[5];
は別物になるんですか?
どちらもポインタの配列なのではないかと思ったのですが、
入れ替えるとコンパイルが通らなくなるので・・・。
>>122 「文字列ポインタ」がまずかったですか?
>>124 前者はcharの*(ポインタ)が5個の配列
後者は、char が5個の配列の*(ポインタ)
まぁ、初心者が一度はドツボにはまるところだから仕方ない。 一度もはまらなかったらそれはそれで怖いし。
127 :
107 :2009/12/30(水) 19:04:09
ありがとうございます。 なるほど、配列のポインタになってしまうんですね。 実験してみたところ、 char *(c[5]); だとポインタの配列で char (*c)[5]; だと配列のポインタという感じでした。 なんか直感と逆な感じがしますが・・・。
128 :
111 :2009/12/30(水) 19:26:55
129 :
107 :2009/12/30(水) 20:44:54
とても有用なページを教えていただきありがとうございます。 つまり、char (*c)[5]; と宣言された変数cがあったとしたら、 そのcに対して (*c)[5] という操作をすれば char 型になるという意味なんですね。 ようやく飲み込めた気がします。 ですが、さらに疑問点が出て来ました(何度もすみません)。 1 : char (*a)[5]; // 配列のポインタ 2 : char *(b[5]); // ポインタの配列 3 : char c[5]; // 配列(のポインタ) 4 : char *d = "abcd"; // 配列のポインタ 5 : char **ea = a; // NG 6 : char **eb = b; // OK 7 : char **ec = &c; // NG 8 : char **ed = &d; // OK また気になって上記のような実験をしてみたのですが、 予想に反して結果がぜんぜん一致しません・・・。 5、6行目に関して: char **x; という形だけを見れば 配列のポインタでもポインタの配列でもいけそうな気がしますが、 この場合は特別にポインタの配列と決められているということなのでしょうか? 7、8行目に関して:どっちも同じだと思うのですが、何か違うのでしょうか? 何度も申し訳ありませんが、ご教示よろしくおねがいします。 結局、教えていただいたページをちゃんと理解できていないかもしれませんが・・・
型が違う
>>129 5行目
配列へのポインタなんだから、
ポインタのポインタとは違うでしょ?
a --> [ char型 ] ea --> [ char*型 ] --> [ char型 ]
[ char型 ]
[ char型 ]
[ char型 ]
[ char型 ]
7行目
&c は c 、あるいは &c[0] と同じ意味を持つから
132 :
デフォルトの名無しさん :2009/12/31(木) 08:31:19
void kakuhoMemory(); int main(void){ int row = 0; char **url; url = (char **)calloc(1,sizeof(char *))) == NULL); url[0] = (char *)calloc(1000,sizeof(char))) == NULL); for(row = 2;row < 10;row++){ kakuhoMemory(url,row); printf("%p---%p\n",url,url[row - 1]); }} void kakuhoMemory(char **url,int row){ char **tmp; if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){ exit(1);} url = tmp; if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){ exit(1);} }
133 :
デフォルトの名無しさん :2009/12/31(木) 08:39:07
続き: 1つずつポインタの配列を増やしていき、 新しく追加された変数にcharの配列のアドレスを代入したいのですが コンパイルして実行するとなぜか3回目でアドレスが短くなってしまい、 更にそれ以降はnilと表示されてしまいます。 以下に示します。 0x9da3008---0x9da3408 0x9da3008---0x9da37f8 0x9da3008---0x3f0 0x9da3008---(nil) 0x9da3008---(nil) 0x9da3008---(nil) 0x9da3008---(nil) 0x9da3008---(nil) どこか間違っているのでしょうか。よろしくお願いします。
>>133 ぱっと見変なとこ。
if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){ //呼び出し元ですでに確保してるはずだね。
url = tmp; // 引数のurlを上書きしてる。
if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){ //上書きしたurlに保存しても呼び出し元には返せないね。
classの中で定義するtypedefってなにか呼び方があったような気がするんですが、何か知りませんか? 誘導型?とかそんな感じの
>>132 関数を
void kakuhoMemory(char ***url, int row)
{
char **temp;
if((temp = (char**)realloc(*url, sizeof(char*) * row))==NULL) exit(1);
*url = temp;
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
}
にして、呼び出しを
kakuhoMemory(&url, row);
にする。
137 :
107 :2009/12/31(木) 14:03:57
>>130 >>131 お返事が遅れてしまいましたが、回答ありがとうございました。
なるほど a も &c も配列のポインタのポインタをとっても
結局は配列の一次(?)のポインタとして扱われるということなんですね。
1 : char (*a)[5];
2 : char c[5] = "abcd";
3 : a = c; // NG(以下、この行は無視してコンパイル成功したものとする)
4 : a = &c; // OK
5 : printf("a : %d , *a : %d , c : %d , &c : %d\n", a, *a, c, &c); // 全部一致する
6 : printf("a[1] : %c , (*a)[1] : %c , c[1] : %c\n", a[1], (*a)[1], c[1]); // a[1] はうまくいかない
くどいですが、実験してみたら上記のようになりました。
"[]"を単にアドレスから値を取得する演算子だと理解していたのですが、
かなり甘かったようです・・・。
5:ポインタの書式指定子は%dじゃなくて%pだ 6:a[1]はアクセス違反。他と同じ場所を指すのはa[0][1]
139 :
131 :2009/12/31(木) 15:22:30
モノステート シングルトン 使い分けがわからん ぐぐると >シングルトンパターンは汎用性、可搬性が必要なクラスに使用すべきでしょう。 >モノステイトパターンは元々「状態が不変」であることを表すパターンだと思うので、 「実体が一つであることを保証する」といった使い方には適さないでしょう。 具体的にどういう場面で使い分ければいいんだ?
141 :
107 :2009/12/31(木) 19:15:54
ご回答ありがとうございます。 なるほど・・・今度こそ理解できたような気がします(自信なし)。 char (*a)[5]; char c[5] = "abcd"; a = &c; とした場合、printfとかで内容だけ見ると a == *a == c == &c となるけど、 実際は a と &c は配列へのポインタであり そして *a と c は配列の最初の要素へのポインタということで、型が違うことですかね。 & や * という演算子は値→アドレス、アドレス→値の変換をする演算子だと 思っていましたが、この場合は例外的に型の変換が行われるわけですね。 C/C++ 難しすぎです!
142 :
デフォルトの名無しさん :2009/12/31(木) 19:19:27
>>134 さん
>>136 さん
お二方のおかげでわかりました。
url=tmpじゃ確かに呼び出し元のurlの値は変わらないですよね。
それと
>>136 さんの
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
の行のurl[row-1]の部分は(*url)[row-1]ですよね?
そうだね
>>141 > C/C++ 難しすぎです!
うん、これら2つ、特にC++は難しいことで有名。
どのくらいの趣味グラマになりたい?
正直 将来の職業にする気が全く無く、
楽しみたいだけならPythonとかRubyとかのような
もっと高級言語が良いんじゃないかと思うんだけど。
それは高級なのか?
146 :
144 :2010/01/02(土) 11:05:10
>>145 俺は
C言語は低級言語、PythonとRubyは高級言語といって
恥じない代物だと思っているんだけど、
君はどう思う?
むしろ君の方が恥ずべき代物
Cが高級言語のなかでは、低級よりだってのは、誰しも認めるところだと思ってたけど。
>>147 意味不明な煽りは止めてくれない?
asm と c しか無かった時代とはもう違うのだよ。
そんな時代、いつあったんだろう…
>>150 「しか」は言い過ぎたけど、
まあ察してくれよ
>>144 PythonやRubyを高級言語と分類することには特に異論はないが、
プログラミングを職業とするということへの誤解を生む表現だな。
こいつをご覧くだせー。 #include <stdio.h> #define VIEW() printf("a = %d\n", a) int a = 0; void func(void); int main(int argc, char *argv[]){ int a = 10; VIEW(); { int a = 20; VIEW(); } VIEW(); func(); ::a = 30; /* (1) */ func(); return 0; } void func(void){ VIEW(); return; } まあ、見ていただければわかると思うが、変数名についての実験を行った。 グローバル変数と同じ名前のローカル変数を使うと、そのグローバル変数を参照するには :: を使えばよい。 ところで、この :: (グローバル名前空間) って純粋 C でも使える?
>>153 C言語にはnamespaceすらない
んだったきがするが。
157 :
107 :2010/01/03(日) 00:50:30
>>144 まあ職業はともかく、実際C/C++で書かれているプログラムは多いですし
是非しっかり使えるようになりたいですね。
回答していただいた皆さん、ありがとうございました。
CRITICAL_SECTIONはグローバル変数じゃないといけないの? ネット上のサンプルのほとんどがグローバル。 スレッド生成のときに渡すのは駄目なの?
>>158 Win32APIのCRITICAL_SECTION構造体かな?
グローバルにおく必要は無いよ。普通はメンバー変数に置く。
スレッド間の同期に使うものだからスレッド作成前に作ってかまわない。
CRITICAL_SECTION構造体はコピーできないからポインタ渡しで渡すこと。
ただ、質問のようにスレッド生成時に渡すものではなく、スレッド間で競合するリソースをアクセスするときに、そのリソースが持ってるCRITICAL_SECTIONの構造体を参照してクリティカルセクションに入るようにする。
160 :
デフォルトの名無しさん :2010/01/03(日) 20:41:46
初心者質問ですいません bool false の読み方が良くわからないので正しい読み方を教えて欲しいです
162 :
デフォルトの名無しさん :2010/01/03(日) 22:16:14
流暢な英語すげぇ
bool ブール false フォールス
165 :
デフォルトの名無しさん :2010/01/03(日) 22:36:43
>>164 ありがとうございます
フォルスって読んでました
>>166 まさかcharを こう発音されるとは思ってなかったわw
char論争なんて無い 当然チャーだ
> Phallus > ギリシャ語で「ふくらんだもの」のこと。 > 男性の性器、男根を意味する言葉。特に勃起した状態を指す > なお発生学においては、男性の陰茎だけでなく女性の陰核も指す。
phallusはファルス
うけると思った?
チャじゃねーの
質問です。 std;;string str;の中に例えば test,abcd,efg と格納されていた場合、「 , 」の後だけを個別に取得出来ないでしょうか?
find() して substr()…あ、いや >std;;string str; ↑なんぞ
>>177 ただのミスですw
ありがとうございます、ちょっとやってみます。
>>177 うおおお!ありがとうございました!
簡易スクリプトのコマンドで悩んでいましたが、無事にコマンドと引数を取得出来ました。
凄い勉強になりました!ありがとう!
何か引数のポインターがNULLだったときは例外投げろと言われたのですが、 JAVAのNullPointerExceptionみたいなのないですか。 どこをどう探してもC++にNULLっぽい例外がないのですが
ない。自分で例外投げろ
これで良い? ぬるぽ /** * JavaのNullPointExceptionに相当する例外クラス. */ class null_point_error : public std::logic_error { public: null_point_error (const std::string& what) : logic_error(what) {}; };
∧_∧ ( ・∀・) | | ガッ と ) | | Y /ノ 人 / ) < >__Λ∩ _/し' //. V`Д´)/ (_フ彡
>>180 C++にはOSが検出するNULLポインタ例外またはアクセス違反例外は無い。しかし、VC等のベンダ拡張で構造化例外を使うとそれらの例外はキャッチできる。
C++の参照やイテレータはNULLを排除してるし、C++では特にNULLは使わなくっても設計できなくはない。
185 :
デフォルトの名無しさん :2010/01/04(月) 19:24:19
MFCでダイアログベースの開発を行っています。 今回、クライアント側の要望で、ダイアログ、ウィンドの背景や、ボタンなどいろいろなアイテムを スキンを使用したGUIにする要望がありました。 要は見た目の話ですが・・・・ そこで、市販のスキンライブラリー(スキン作成ソフト)を使用しようといろいろ探してみたのですが、 海外のものしか見つかりませんでした。 過去の業務で同じようなスキンライブラリを使用、または検討した人がいましたら、そのソフト(ライブラリー名)を ご教授お願いできないでしょうか?一長一短もありましたら教えていただければうれしいです。 自分で探したところ、SkinCrafter(デモ版)が少し使いやすかったです。 ボタンなどのイメージを1枚ずつ1ファイルとして登録するのが少し面倒でしたが・・・
ダイアログを変えたいならリソースDLLを使えばいいんじゃね?
>>184 いや引数で Hoge* hoge みたいなのがあって
間違えてNULLを渡したら例外飛ばせコラーって上から言われたのですよ
Hoge& hoge
190 :
デフォルトの名無しさん :2010/01/05(火) 13:03:14
IEのプラグインを作成を考えています。 作成するのは初めてです。 プラグインdllが、外部のファイル操作(DB参照)、レジストリのパラメータ取得することは可能でしょうか?
質問です。 以下のコードを実行するとx,yがそれぞれ 00000000, 00000001になるのですが これはどういうことなんでしょうか? コンパイラはGCCとVS2008Expressで同じ結果でした。 unsigned int i = 32, x, y; x = 1u << 32; y = 1u << i; printf("%08x %08x\n", x, y);
>>191 ECC6.2.1では00000001, 00000001
32bitモードでの32回以上のシフトは80286以上で未定義
>>192 未定義なんですか。
ということは言語や処理系の問題ではないという事でしょうか?
左シフトは0埋めされるので必ず0になると思っていたんですが。
勉強になりました。
>>193 IntelとかAMDからPDFをDLして嫁
epollのEPOLLET相当のことをkeventでやりたいんだけどフラグとかってあります? それともデフォルトでエッジトリガだったりしますか
プロジェクトで使う定数一覧みたいなヘッダーファイルってなんて名前にしてますか どうにも良い名前が考えつかない。
>>196 constants.hpp
これじゃだめ?
200 :
196 :2010/01/05(火) 20:50:47
constants.hpp macros.h イマイチ
common.h global.h
CONSTS.H
typedef、定数、基底クラスのインタフェース このあたりはいつも foundation.hpp としてまとめてる。
204 :
196 :2010/01/05(火) 23:06:38
constants.hpp macros.h common.h global.h CONSTS.H foundation.hpp イマイチ
stdafx.h
「プロジェクトで使う定数」なら $(プロジェクト名)_constants.h 何に使う定数なのか自覚してるなら迷うわけがない ただファイル数を減らしたいために関係ない定数を同じヘッダに書くのはどうかと
>>187 何の例外投げればいいか上に聞け
何も指定されなければ他のコード見て真似しろ
分からなければstd::runtime_errorかstd::invalid_argumentでも投げとけ
>>189 ない。だから、少し間接的な方法をとる。
ウィンドウハンドルに好きな値を関連付ける機能があるので、オブジェクトへのポインタを登録しておくというもの。
こんな関数をグローバルまたはクラスの静的メンバ関数として定義し、
SetWindowLongPtr(hButton, GWLP_WNDPROC, (LONG_PTR)ButtonSubWndProcEntry)のように渡す。
(この問題とは直接関係ないが、SetWindowLongPtr使え)
あと、SetWindowLongPtr呼ぶ前に、SetProp(hButton, TEXT("MyClass object"), オブジェクトへのポインタ);する。
LRESULT CALLBACK ButtonSubWndProcEntry(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
MyClass* p = static_cast<MyClass*>(GetProp(hwnd, TEXT("MyClass object")));
return p->ButtonSubWndProc(hwnd, msg, wp, lp);
}
>>204 ore_project_consts.h
boost::shared_ptrはスレッド対応してるらしいんですが、std::tr1::shared_ptrのほうもスレッド対応してるんでしょうか?
>>211 C++にはスレッドとかそういう概念自体が存在しないんじゃない?
もしそうだとすると
> std::tr1::shared_ptrのほうもスレッド対応してるんでしょうか?
実装次第ということになりそうだが。。。
MT-safeかどうかを訊ねてるに決まってるだろ
だから実装次第つってんだろ・・・
>>198 Fortranだと、Macross.Fだな。
>>211 VCのTRはスレッドセーフみたいだね。
C++0xはスレッドに対応するからスレッドセーフだと期待してるんだけどね。
boost::shared_ptrとstd::shared_ptrの違いとかどっかに書いてないかなあ?
ひどいこと言わないで
まあ、実装依存っていう回答は無いわな・・・
220 :
217 :2010/01/06(水) 23:04:11
>>219 おい
他人のふりしないではっきり言えよ。
じゃあお前は
std::numeric_limits<int>::max()はいくらを返すのですか?
って言われたらなんて答えるんだよ?
221 :
デフォルトの名無しさん :2010/01/09(土) 21:21:43
本家sourceforgeがすごくつながりづらいんだけど俺だけ?
222 :
217 :2010/01/10(日) 23:14:50
>>219 おい、逃げないでちゃんとレスしろよ。
最近はバカが根性も失って、負けるとしっぽを巻いて逃げるから
もうどうしようもないな。
こういうコードを見つけました。 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float[]){0.3f, 0.3f, 0.3f, 1.0f}); {}で数値を囲んで関数に配列わたしてます。 gccだと、似たようなことしてコンパイル通りました。 これって、純粋なCの文法なんですか?
>>223 void func(int*a){}
int main(void){func((int[]){1,2,3});}
を、gccで-pedanticオプションつけたら
foo.c:2: 警告: ISO C90 forbids compound literals
って出たから、C90じゃダメみたいだよ。
C99ではどうやら認められてるみたいだが。
explicitって引数2こ以上とvoidには無意味?
>>226 voidってデフォルトコンストラクタのことを言いたいの?
なら君の言う通り。・
コンストラクタやデストラクタにvoidって書いたらエラーにならなかった?
なんないでしょ
class T {
void T(); //エラー
T(void); //エラーじゃない
};
>>226-228 の流れ、特に
>>226 は明らかに引数の話
というか
>>226 が質問丸投げで出て来ない以上、
適当な返事になってもいたしかたあるまい。
template <class func_t> struct Hoge; template <class ret_t, class arg_t> struct Hoge<ret_t (*) (arg_t)> { ... }; @ template <class ret_t, class arg_t> struct Hoge<ret_t (arg_t)> { ... }; A @とAって明確な違いってありますか?
>>235 なんじゃこりゃ? 難解だなぁ〜。っていうかこういうの出来るのかな?
Hogeの中のfunc_tの型が、「@」はret_t型を返し、arg_t型の引数を取る関数へのポインタで、
「A」はret_t型を返し、arg_t型の引数を取る関数に特定されるということ?
一応違うバリエーションが作られるのではないだろうか?
237 :
デフォルトの名無しさん :2010/01/16(土) 21:09:25
複数のif文とelse if文の上手な書き方を教えてください。
条件から整数を導出する関数かクラスを作ってswtich caseか関数テーブルで分岐する。
画面に表示されているものを全部消すにはどうしたらいいですか? エスケープシーケンスを使った方法(printf("\x1b[2J");)では出来なかったので他の方法があれば教えてください
環境を説明せずに、エスパーでも求めてるのか? どの環境でも出来ることは、画面の行数分改行しろ、流れて消えるからw
ディスプレイの電源を切る。
うまくいきました! ありがとうございました。
どういたしまして
行数分解行なのか? マジ正解だったか、エスパーになったのか俺w
>>239 for (i = 0; i < 1000; i++) printf("\n");
コンソールの行数が1000行以上だと使えないんで、環境依存になるけど。
>>244 初心者用プログラミングスレに長く居るとエスパーになるらしいよ。
もしかして君も?
あるサイトの画像掲示板にアクセスすると 広告と画像が表示されるので 画像のみの直リンのURLを生成してアクセスすると403となるのですが、 これを回避する方法はないでしょうか?
そのサイトが何を見て403にしてるのか調べてそこをうまくやればいいんじゃない?Referrerとか。 プログラムの質問かそれ?
母国語でOK
自分のプロセスだけなら共有データセグメントあたりだろ
>249 ・フック関数は、フックされた側のスレッドで実行される。 ・GUI アプリでは stdout が開かれていないため printf は 使用できない。 ・どうしてもコンソールに表示したいなら、 フックされた側(フック関数)から、プロセス間通信でフックした側ににデータを送信する。
253 :
249 :2010/01/20(水) 04:43:19
>>252 なるほど、だからビープ音は鳴るけど表示はされないのか・・・
やってみます、本当にありがとうございます。
asymptoteという図形記述言語があって見た目はcなのでそのつもりでさわっていたら i++がエラーになった。調べてみると++iはありだがi++はないようだ。 もし、cで++iとi++のどちらかが使えなくなるとしたら あなたはどちらを残したいですか?
>>254 無論++iだろjk
i++しか残ってなかったら変なオーバーヘッドができちゃうかも
しれんだろ
i++と--iしか使ったことねーな
Cならi++ C++なら++i 言語名に矛盾が出るがw
>>254 無論i++だろjk
++iしか残ってなかったら最初のゼロの時の処理がされてないかも
しれんだろ
Windows上のキーフックについて質問です。 OSはXP Pro SP3です あるウィンドウにフォーカスがあり、キーを押した後、そのメッセージをフックし、 そのデータを変更してそのウィンドウにメッセージを戻す方法はありませぬか? 例えば ウィンドウA上で「キー」押す→ フックプロシージャで、もし押されたキーが、AならBに変換、 BならC、CならD・・・、というような処理→ メッセージを元のウィンドウに返す こんな処理をするには、どんなAPIを使えばよろしいでしょうか
>>260 ごめんなさい訂正です。
メッセージを元のウィンドウに返すには
どのAPIを使えば良いでしょうか。
>そのメッセージをフックし 自分でヒントだしておきながらググらないとか
>>262 一応ググりましたよ
LRESULT CALLBACK KeyboradHook(int code,WPARAM wParam,LPARAM lParam){
unsigned long c;
if(code==HC_ACTION){
if(wParam<){
/*入ってきたキーコードに+1する*/
c=wParam+1;
}
return CallNextHookEx(hook_key,code,wParam,lParam);
}
途中で送信してすみません こんな感じのプロシージャです LRESULT CALLBACK KeyboradHook(int Code,WPARAM wParam,LPARAM lParam){ unsigned long c; if(code==HC_ACTION){ if(wParam>='A'&&wParam<='Z'){ /*入ってきたキーコードに+1する*/ c=wParam+1; /*元のウィンドウにこのメッセージを戻すには?*/ } } return CallNextHookEx(hook_key,code,wParam,lParam); } 色々ググって見たんですが、どうすればいいのか見当付かずにここで質問した次第です
CallNextHookExに変更したパラメタ渡せばいい
あーキー変えるならSendInputとかで投げなおす場合もあるかな この場合またフックされるが
268 :
デフォルトの名無しさん :2010/01/29(金) 06:27:27
Linux上のCでシェルスクリプトをexec系の関数で実行して、スクリプト内でエラーが発生したらCでエラー処理を行う、ということを行いたいのですが、スクリプト内のエラーは認識してくれません。よい方法があればご教示お願いします。 カーネル: Linux 2.6.26-2-686 コンパイラ: gcc version 4.3.2 (Debian 4.3.2-1.1) int main(int argc, char** argv) { char *cmd="./test.sh"; /* 実行するシェルスクリプト */ char *option=""; pid_t pid; pid_t v_wait; int status; FILE* stout = fopen("out.txt", "w"); /* 実行結果をout.txtに記録 */ if (( pid = fork () ) == -1 ) { fclose(stout); return 1; } else if (pid > 0) { /* parent process */ fclose(stout); v_wait = waitpid(pid, &status, 0); if (WEXITSTATUS(status) != 0) { /* エラー処理をここで行いたい */ } } else { /* child process */ if ( stout == NULL ) goto error; if ( dup2(fileno(stout), 1) == -1 ) goto error; fclose(stout); dup2(1, 2); /* 標準エラーを標準出力へ */ fflush(stdout); fflush(stderr); execlp(cmd, cmd, option, NULL); } return 1; error: perror("err"); return 1; }
何をしたいのかわからん エラーメッセージを受け取りたいならパイプを使え
まあ popen/pclose 使うのが楽だし定石だよなあ。 それはともかく、test.sh 単体の実行結果はちゃんとエラーを戻してる?
set -eすれば解決するというオチだろう。
272 :
デフォルトの名無しさん :2010/01/29(金) 16:55:14
現在シェルスクリプト内で実行ログの取得とエラーチェックのため「>> 2>&1」と戻り値チェック(エラーがあればフラグを立てる)を全行に入れて、 シェルスクリプト実行が終わった時点でフラグが立ってたら(1つでもエラーがあれば)メールで実行ログを自分当てに送信という、処理をしてます。 が、処理を追加するたびに、これらも一緒に追加するのが面倒なので、シェルスクリプトには本来の処理だけやってもらって、ここの部分だけCで書けないかと思った次第です。 そのため、test.sh単体ではあえて戻り値を返さずに処理してます。 標準出力を吐き出すファイルと標準エラーを吐き出すファイルを別々にして、 標準エラーを吐き出したファイルが空でなければエラー処理…という方法も 考えましたが、実行ログには両方書き込まれた状態で作成したいので どうしたら良いか悩んでます。
273 :
デフォルトの名無しさん :2010/01/29(金) 20:23:26
int hoge( vector<double>& test){ int num; for(iをtestのサイズ分まで増やす){ if(VAL == test[i]){ num=i } } return num; } main { vector<double> test; testの中にデータを入れる。 int num = hoge(test); vector<double>::iterator it; it = test[num] ←testのnum番目のイテレータを取得したい } 省略したコードで申し訳ないのですが、上記の中にあるような 処理がしたいです。何かよい方法はあるのでしょうか? よろしくお願いします。
it = test.begin()+num;
ファイル名にワイド文字が入ってる場合にstd::fstreamで扱うことは可能でしょうか?
advance(vegin(), num);
DWORD dwSize = 1000; char mes[80]; sprintf( mes, "%d", dwSize ); printf( mes ); で DWORD の値がmesに反映されないんだけど DWORD の書式は %dでよかったっけ?
%u
thx
それはC/C++の質問?
文字列から最初の'*'を探して、そこから後を削除するっていうのは↓でできるんですが str.erase(find(str.begin(), str.end(), '*'), str.end()); 文字列から最後の'*'を探して、そこから前を削除するっていうのは1行で書けますか? str.erase(str.begin(), find(str.rbegin(), str.rend(), '*')); としてもコンパイル出来ませんでした
初めての質問です。 よろしくお願いいたします。 とあるWebブラウザゲームを定期巡回しながら 1.データ値取得 2.データ値から状況解析 3.解析結果をWebに入力 というプログラムを作りたいと思っています。 こういったことはC言語で可能でしょうか??
>>282 str.erase(str.begin(), str.begin() + str.rfind('*') + 1);
>>284 ありがとうございます
イテレーターって数字足してもいいものだったんですね
>>283 可能だがこれからC言語を勉強しようというのだったらそのことだけに集中しても1ヶ月はかかると思われる
他に本業があってその合間に片手間で勉強とかいうなら1年はかかると思われる
>>285 足してもいいイテレータと足せないイテレータがある
vectorとかstringは足してもいいランダムアクセスイテレータ
listとかsetのイテレータはランダムアクセスじゃないので足せない
>>285 std::stringのメンバ関数とアルゴリズムはreverse_iteratorを受け付けないので
不便だと思う事がよくあるよな
この場合は逆変換メンバ関数base()を使って
str.erase(str.begin(), find(str.rbegin(), str.rend(), '*').base());
と書くとすっきりして読みやすいと思うがどうだろうか
>>286 ご回答ありがとうございます。
C言語を扱うモチベーションが欲しかっただけなので
片手間ながらもやっていこうと思います。
ブラウザだけスクリプトブラウザというものを使えば
javascript , C , VBA 辺りを使えばできそうなので
なんとかやってみようと思います。
バイナリファイルを一括でメモリに読み込む方法はわかるんですが テキストファイルを一括でメモリに読み込む方法はありますか?
同じでは?
あります
納入したからファイル整理してたら バックアップごと全部消したぜ もう製品も体験版もソースも残ってねぇぜ いええええええええええええええええあああああああああああああああああああああああああああああああああああああああああ
復元しろよ
そんなたいそうな代物 あるわけねぇじゃん いえええええええええええええええええええええええええあああああああああああああああああああああああああああああ
バックアップの削除なんて個人の権限で出来るもんなの?
じゃあバイナリから復元すればいいと思います。
納入先に頼んでコピーしてもらえばいいじゃない
>>294 ちょ!
どうやってバグフィックスすんだ!!
Glary Undelete とか使えばもしかしたら復元できる望みがあるかもしれない
#include <stdio.h> void init(int array[10][10], int width, int height); void make_grider(int array[10][10]); int check_life(int array[10][10], int width, int height,int x, int y); void check_all_life(int array[10][10],int width, int height); void print_lifes(int array[10][10],int width,int height); int main(int argc, char* argv[]) { int lifes[10][10]; int i; init(lifes,10,10); make_grider(lifes); for(i = 0; i <= 2; i++) { print_lifes(lifes,10,10); printf("--------------------------------------------------------------\n"); check_all_life(lifes, 10, 10); } return 0; } void init(int array[10][10], int width, int height) { int x, y; for(x = 0; x < height; x++) { for(y = 0; y < width; y++) { array[x][y] = 0; } } }
int check_life(int array[10][10], int width, int height, int i, int j) { int ans = 0; ans += array[(i + height + 1) % height][(j + width - 1) % width]; ans += array[(i + height + 1) % height][(j + width) % width]; ans += array[(i + height + 1) % height][(j + width + 1) % width]; ans += array[(i + height) % height][(j + width - 1) % width]; ans += array[(i + height) % height][(j + width + 1) % width]; ans += array[(i + height - 1) % height][(j + width - 1) % width]; ans += array[(i + height - 1) % height][(j + width) % width]; ans += array[(i + height - 1) % height][(j + width + 1) % width]; return ans; }
void check_all_life(int array[10][10],int width, int height) { int x,y,live_neighbors; live_neighbors = 0; for (x = 0; x < height; x++) { for (y = 0; y < width; y++) { live_neighbors = check_life(array,width,height,x,y); if(array[x][y] == 1) { if(live_neighbors == 3 || live_neighbors == 2) { array[x][y] = 1; } else { array[x][y] = 0; } } else if(array[x][y] == 0) { if(live_neighbors == 3) { array[x][y] = 1; } else { array[x][y] = 0; } } else { array[x][y] = 0; } } } }
void print_lifes(int array[10][10], int width, int height) { int x, y; for(x = 0; x < height; x++) { for (y = 0; y < width; y++) { if(array[x][y] == 1) { printf("[X]"); } else if(array[x][y] == 0) { printf("[ ]"); } } printf("\n"); } } C言語の習作としてLifeGameを書いてみたのですが実行すると なぜだかきちんと更新されません。ここ数日考えてみたり Web上のソースを読んだりしてみたのですがどうも原因が分かりませんでした 見落としている点がどこにあるのかお教え願います よろしくお願いします。
arrayを参照しながらarrayを更新しているためだ check_lifeで新しい状態を計算するときに現在の状態と新しい状態をごちゃまぜに見てしまうため正しく動かない 新しい状態は別の配列に書き込み、全部のマスの計算を終えた後それをarrayに書き戻せば上手くいく ところで何レスも消費しそうな長いコードはどこかにうpしてURLだけ貼り付けてくれ
なるほど、よくわかりました。 説明をきいてよくよく考えたら確かにその通りでした。 初めての書き込みだったのでどうすればいいか分かりませんでした 今後お世話になることがあればきちんとそのようにしたいと思います。
いや、どっちもダメだ test1はそのダメさがあまりにあからさまなのでそれに気付いたコンパイラが親切にも警告してくれた test2はコンパイラがそのダメさに気付かず見過ごしてしまっただけでダメなことには変わりない
じゃあ例外でメッセージ送りたい場合ってどうするの? const char *もダメで、stringじゃあ二重に例外発生の危険がある 配列を持たせて、そこにコピーすれば良さそうだけど長さが足りなくなるかもしれない
いいんじゃね 足りない分は切り捨てれば なんなら末尾に "省略されました・・・全てを読むにはワッフルワッフル(ry" とでも付けておけば問題ない
staticにすればいいと思うよ
>>313 std::runtime_errorなりなんなりにメッセージを入れといて
投げればいいじゃない。
>310 おもしろいね
リテラルっしょ? コードセグメントに埋め込まれたconst char *を投げてるだけでは?
なるほどありがとうございました
322 :
デフォルトの名無しさん :2010/02/05(金) 21:37:35
コンストラクタが10分の1の確率で例外を投げるようにして
こんなものを作ってみました。
ttp://codepad.org/1Uf0BQ68 1.
この
{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}
の部分で、(例えば)3つ目を生成する時に例外が発生した場合、
p1やp2のデストラクタは呼ばれていないのでしょうか?
私の環境で実行すると
ttp://uploader.rgr.jp/src/up1887.jpg こんなことになりました。
それとも「実はデストラクタは呼ばれているが画面に反映されていない」だけでしょうか?
2.
また
boost::shared_array<MyClass> p(new MyClass[4]);
で失敗(例外を投げた)した場合は、p1〜p4は既に前のスコープを脱出する段階で
正常に破棄されているのでリソース漏れは無いと思うのですが、
pの途中まで生成された分は破棄されますか?
よろしくお願いします。
>>322 try-catchでくくってごらん
int main()
{
try
{
std::srand((unsigned int)std::time(NULL));
{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}
{
boost::shared_array<MyClass> p(new MyClass[4]);
}
}
catch(...)
{
std::cout<<"例外が投げられた\n";
}
return 0;
}
324 :
322 :2010/02/05(金) 23:10:24
>>311 throwってオブジェクトはスコープ飛び越えるんじゃなかったっけ?
326 :
322 :2010/02/05(金) 23:14:12
自動変数はデストラクトされる 配列もデストラクトされる
>>327 だとすると
>>322 でデストラクタが実行されていない様に見えたのは、
「実はデストラクタは呼ばれているが画面に反映されていない」ということなのでしょうか?
abortの意味を考えると、オブジェクトのミイラを作るために デストラクタを呼ばないのは妥当と思う。
331 :
322 :2010/02/06(土) 23:08:25
C++ではnewした場合としなかった場合では、 メンバへのアクセスに使う演算子( . と ->)が違います なぜ、使い分けるのが面倒なのに、わざわざメンバへのアクセス方法を別にしたのですか?
.と->が対等に存在するというより、(*p).Memberのシンタックスシュガーとしてp->Memberが導入された。
>>322 Cでもポインタの場合はアロー演算子を使うじゃん。
>>332 newしたからという区別ではない。変数と参照はドット演算子、ポインタはアロー演算子だよ。
337 :
332 :2010/02/07(日) 17:34:53
導入の経緯を言うなら、C++ではなくCの話な(構造体へのアクセス)
>>338 申し訳ない
C言語を飛ばして、C++を勉強しているので
C言語はポインタばっかりだし、クラスが無いから勉強する気になれないんで
mallocとかの使いかたも知らないしorz
C++ = C + class
>>339 どーせJavaから入ってるんだろうけど
まずポインタってものを理解しろ
あー、違うか。 C/C++では、(Javaのプリミティブ型と同じように)スタックにオブジェクトを確保できること、からかな。
そうか、Javaから入ってきたらスタックでつまずくのか。
classやstructのメンバとして 参照(ポインタ)ではなく実体を持てる、って点も同様だね。
345 :
332 :2010/02/07(日) 19:45:17
>>341 そうです、java出身
>>342 javaだとメモリが抽象化されすぎてる所が、嫌になったわけです
でも、C++だと明示的にdeleteするのが面倒くさいですね
>>343 ヒープは適当な所でdeleteすればいいだけですからね
でも、スタックは自動でdeleteしちゃうじゃないですか
ローカルな自動変数だろうがヒープに確保しようが、関数に引数として渡してしまえば区別はなくなる。 参照型で引数を受け取ればドットでアクセスすることになるし、ポインタ型で受け取れば矢印でアクセスすることになる。
>>345 スマートポインタやRAIIのような機構を使えば
明示的にdeleteするコードなんてほとんど書かなくなるよ
349 :
332 :2010/02/07(日) 20:12:35
>>345 スマートポインタ→auto_ptrとかが代表
C++0xではauto_ptrが推奨されていなくて、shared_ptrがって話がありますよね
メモリ管理を楽にするプログラミングを覚えて、
生産性をあげたいのですがC++の入門サイトだとダメですね
てか、Javaスレと比べるとC++スレは親切な人が多いな〜
>>349 0xにはshared_ptrだけでなく、auto_ptrライクなunique_ptrもあるよ。
unique_ptrはauto_ptrと違って、std::vectorなどのコンテナにも入れられる。
>>349 おめー、なんか大きな勘違いをしてるみたいだから
一つだけ教えてやる。
>C++スレは親切な人が多い
これだけは絶対間違ってる。
C++でCは避けて通れないぞ。 生産性云々言う前に、Cの勉強から出直すべし。 Javaで培ったオブジェクト指向脳が役に立つとすればその後だ。
CとC++はぜんぜん違うぞ。そう、焼きそばとカップ焼きそばぐらいに
両方ともうんこになれば同じ。
C++を勉強すればCも分かるだろ。 CにあってC++では実現出来ないものってあるの? 既にCのスーパーセットではないとは言われてるけど。
>>355 実現できない物議論をするのか?
じゃあバイナリエディタで直接書けばいいじゃない。
何でもできるよ。
>>355 struct {
int a,b,c
} aaa = {.a = 10, .c = 0};
こんなん出来る?
>>357 aとcだけ初期値を与えたいということであれば、コンストラクタを書けばいい。
.aや.cなどメンバを指定したいということであれば、ちょっと面倒。
マクロでやるかメンバ関数をチェインさせるか。
C++よりCの方が綺麗にかけるっていう例はあるの?
>>359 Cとの連携のために
#ifdef __cplusplus
extern "C" {
#endif
みたいなのを書かなくていいこと(当たり前だ)
>>359 Cでできることは大抵C++でできるので、ほとんどない。
あったとしても、newって変数名が使えなくなったとか、キャストせずにやったところをキャストする必要が出てきたとか、
C++に書き直しても綺麗でなくなるとは言えないものが多い。
けど、Cの機能使って書いたら綺麗だろうに、
C++の機能を変に使ったが故に汚くなることはいくらでもある。
浮動小数点の精度指定表示とか
Cのほうがきれいって言うか 型名、変数名はC++のほうが長くなりがちでうざい スコープ解決もあるし
ただ、for (int i = と書きたい。
それってC99ではOKなんじゃなかったっけ
boost::formatを使えばある程度というかかなり綺麗に書ける
+と*と()だけの数式ってLL(1)で解析できる?
operatorのオーバーロードって普段は自分でやりますかね? フレームワークとかライブラリの作者しか、使わないような気がするけど
STLを使ってるならoperator()はよくオーバーロードする 後はコンパイラのデフォルトで困る場合operator=をオーバーロードするぐらい
使いまくる ( ) = 割とつかう 比較各種 -> * |
STLコンテナになるための比較演算子も忘れるな
って、書いてあったか でも=と同程度以上には使うイメージ
忘れてた++もイテレータで使うね
375 :
368 :2010/02/08(月) 22:14:49
ついでに、質問なんですが std::cout << "str";は、C++の標準出力で有名ですが std::coutはどうやって << の値を、受け取っているんですか?
operator <<
数値を入れたら括弧の付け方を生成するプログラムを作ろうとしてるんですが さっぱりわかりません こんな感じになってほしいんですが どういう方針で作ればよいのでしょうか n=2の場合 (1 2) n=3の場合 ((1 2) 3) (1 (2 3)) n=4の場合 (((1 2) 3) 4) ((1 (2 3)) 4) (1 ((2 3) 4)) (1 (2 (3 4))) ((1 2) (3 4))
再帰が必要かな
>make: `first' に対して行うべき事はありません. gcc先生がこんなメッセージを出すわけですが、 何これ?
何を make に食わした?
LANG=C makeしてから聞け。
>>382 作ったコードを単純に動かしてみただけ
ちゃんと動くけど、gccがメッセージを吐いているから気になっただけ
>>383 それ何してるの?
linuxを使っているんだけど、コマンド(emerge)を使って自動でインストールしたから
何がなんだかサッパリなんだけど
そのままだろ LANG=Cする必要も無い
うは、大分すっきりしていますね 参考にさせていただきます
セジウィックの本を見ながら機械的な再帰の除去に挑戦してるんですが
一か所だけどうしてもうまくいきません
show_dfs_raw4の箇所が分かる人いたら教えてもらえませんか
http://codepad.org/TbR5kRu1 木構造をpreorderで表示する関数。これを非再帰に書き換える
void show_dfs_raw(ptree& p){
cout << p->d;
if(p->l)show_dfs_raw(p->l); //LからR
if(p->r)show_dfs_raw(p->r);
}
390 :
デフォルトの名無しさん :2010/02/10(水) 15:05:10
クラスのnew シタデーターを&aじゃなくてaでreturnすると、&aがアドレスを2回コピーするのに対して return するときに一時変数にコピーするのと returnしたデーターを保存するために変数にコピーするから2回コピーされるんですか? 保存しないで一時変数のまま使えば1回ですか?
日本語でおk
訂正 誤 シタデーター 正 したデータ
Object& aaaa(){}; Object& bbbb(){}; Object cccc{ }
394 :
デフォルトの名無しさん :2010/02/10(水) 15:35:08
Object& aaaa(){};
Object bbbb(){};
Object cccc{
return aaaa()*aaaaa();
}
Object dddd{
return bbbb()*bbbb();
}
これについて教えてください。
aaaaaというのは
>>390 の奴です。
効率は違うんですか?
ccccとddddは()わすれました
bbbbの関数の中で return b; ってやるじゃないですか するとbは書き換えられないように一時変数にbのコピーコンストラクターで コピーされますよね。 そのあとObject c=bbbb();ってやると2回コピーされますよね
右辺値って今のC++で真似できんの?
>>396 されない
それはコピーコンストラクタの特別な書き方
もしそういう書き方を避けたいならexplicitをコンストラクタに付けておく
そうすると Object c(bbbb()) って書き方しか出来なくなる
bは値渡しだから一時変数にコピーするじゃないですか。 そのあと、一時変数を参照をcにコピーしたら一時変数は消えるから cは何も指さなくなるからまた値渡しになって2回コピーされるじゃないですか? aaaa()の場合は2回渡しても参照だからアドレス渡すだけで早いんじゃないですか? この文で間違っているところありますか?
回答者に対して失礼と言っていいレベル。
なんか根本的なところでおかしい。 newするならポインタを取っておいてdeleteしなきゃダメ。
アスペルガーっぽいなと見てたらその通りだったでござる
NRVO
>>401 確かにそうだな
ちょっと考えるとbbbb()の戻り値を入れる場所とcの場所はまず違う
そうなると一時オブジェクトの生成とcの初期化に2回コピーされそうだな
C++0xの右辺値参照こういう場合アドレス渡し出来る所はガンガン
アドレス渡しだけしてコピーを省略する仕組みになる予定
関数の失敗をboolで返す場合って true成功 false失敗 が一般的ですよね?
>>408 というか関数の名前しだいじゃないかな?
bool xxx_is_failed(〜)
だったら
true失敗
false成功
になると思うんだけど?
bool型が必要になったいきさつはExceptional C++ P220 項目45に書いてある この本は相当キチガイじみているがそれでも必携の本だと思う
#include <iostream> using namespace std; class Obj{ char a; public: Obj(){ cerr << "Obj()" << endl; } Obj(const Obj&){ cerr << "Obj(const Obj&)" << endl; } }; Obj val_val(Obj obj){ return obj; } // Return local variable // Obj &val_ref(Obj obj){ return obj; } Obj ref_val(Obj &obj){ return obj; } Obj &ref_ref(Obj &obj){ return obj; } int main(){ Obj obj, t; cerr << "val->val" << endl; val_val(obj); cerr << "ref->val" << endl; ref_val(obj); cerr << "ref->ref" << endl; ref_ref(obj); cerr << "assign val->val" << endl; t = val_val(obj); cerr << "assign ref->val" << endl; t = ref_val(obj); cerr << "assign ref->ref" << endl; t = ref_ref(obj); }
実行結果 Obj() Obj() val->val Obj(const Obj&) Obj(const Obj&) ref->val Obj(const Obj&) ref->ref assign val->val Obj(const Obj&) Obj(const Obj&) assign ref->val Obj(const Obj&) assign ref->ref ここまで書いて気づいたけど、代入じゃコピーコンストラクタ呼ばれないじゃん。
Objの定義に Obj &operator =(const Obj &obj){ cerr << "operator =" << endl;return *this; } を追加して同様に実行してみたら、代入なしの方は結果同じで、 代入ありの方の結果: assign val->val Obj(const Obj&) Obj(const Obj&) operator = assign ref->val Obj(const Obj&) operator = assign ref->ref operator = 結論 呼び出し時に、値渡しなら1回コピーされる。参照渡しならされない 変数返したときに、値返しなら1回コピーされる。参照返しならされない 代入演算子の呼び出しも、恐らく同様。 参照渡しの参照返しなら(コピーコンストラクタでの)コピーは発生しないが、通常は代入演算子でコピーのような処理をすると思われる (デフォルトでは、変数の中身全部コピーじゃねーの?多分
>>408 何をもって成功/失敗とするのか曖昧なこともあるからね。
415 :
デフォルトの名無しさん :2010/02/11(木) 08:27:20
char* の配列を確保したいのですが、サイズは定数ではなく変数にしたいです。 char **v = (char**) alloca(size); ↑のように書きましたが、これだと char *v[100]; とするのは別でしょうか?
うん、別
417 :
デフォルトの名無しさん :2010/02/11(木) 14:44:01
C++は途中で変数宣言できるらしいけど while(1) int n; とかやったら無限にメモリ領域を確保することになるの?
No
>>417 単に{]ブロックの最初で宣言したのと同じような意味合いになるだけ。
while (1) new int();
421 :
415 :2010/02/12(金) 00:46:37
>>416 ありがとうございます。
char *v[100] 相当のことを alloc 系の関数でやるにはどうすればいいか教えてください。
>>421 質問の仕方が下手だなぁ。それじゃ>416も「別」としか答えられないじゃないの。
エスパーするとこういう事?
num=100;
char **v = (char**)alloca(num*sizeof(char **));
>>421 ちなみに、確保したのはあくまでchar*へのポインタの配列だから、それだけじゃ
v[i][j]="hogehoge";
みたいなのはできないよ。
分かってるかもしれないけど、念のため。
424 :
422 :2010/02/12(金) 01:32:24
あ、ミスったw sizeof(char *)だ
SSE4.2を使ったstrcmpとかstrlenってどれぐらい速いのですか? jmpを使ったものに比べて何倍にもなるんでしょうか?
426 :
デフォルトの名無しさん :2010/02/12(金) 09:31:20
すみません Class Aを持つクラス Bがあって インスタンス名はcです。 Aにはconst a& aaaa();という関数があります。 aはAの中で保持しているデータです。 Bにはconst a& (){ return c.aaaa(); } ってやると一時変数をリターンしたみたいな警告がでるようなきがします。 実験して無いのでわかりませんが、似たような状態で警告が出ました。 どうしたらいいですか?
実際の状態では、クラスBはテンプレートでした。
コンパイラーはMINGWです。
警告が出る最小限のソースを晒して下さい
それがさっきの奴です。 コンパイルしてないので分かりません。 データーの型もテンプレートです。
バカなの? コンパイル出来て、警告が出るソースを出せって言われてるの。
テンプレートもちゃんと書いたコードをcodepadにでも貼り付けて下さい 検証してみますから
警告は参照を一時変数でリターンしているというような理由です。
コードを晒せと言っているんですが見えませんか?
本をまねしただけなので同じとはいえないのですが C++ Templates: The Complete Guide の Expression Templatesの章の ArrayクラスのT operator[] constの戻り値を &Tに変えたクラスと同じ状態だと思います。 有名な本だと思うので分かると思います。
訂正 &TじゃなくてT&
>>436 持ってないので知りません
「あなたが」晒してください
じゃあ、持ってる人”だけ”に質問します。
永遠に待っててくださいね^^ 多分誰も答えません
じゃ、持ってる人が現れるまで、黙って待っていなさい。
今はコンパイラーと統合開発環境がない環境なので 残念ながらコンパイル可能なプログラムを提示することができません。 次回もってくるのでそのときから”持ってない人”は答えてください。
>>442 だったら今質問すんなカス
エスパースレでも逝けや
こういう質問者の癖に高飛車な奴には本当に腹が立つ 「教えて頂く」側の態度とは到底思えない
教えて貰う側が教える側になると急に態度が急変するのもどうかと思う。
>>442 codepadにコピペしたらコンパイルできる
>>445 ガタガタ屁理屈抜かすな
答えが欲しかったら下手に出ろや
社会の常識も知らんのか
答える方は答えなくてもなんにも困らない。質問する方は答が無いと困る。 どういう態度で質問すべきか分らないバカはのたれ死んでしまえ。
日本人らしい短絡的な発想だね。
もうみんなスルーしようぜ 本持ってても答えない方が、スレの今後のために良いと思う。
俺も 本持ってるけど答えてやんない
お前のコンパイルエラーが取れなくても全然困らない。 クズが困る事は、むしろメシウマ。
>>449 2chを質問を入力するとポンと答えが出てくる便利な機械と勘違いしていないか?
画面の向こうにいるのは生身の人間である事をお忘れ無く
>>426 自己解決しました。
>>454 ありがとうございました。
aaaaの戻り値がTのやつがあったらしいです。
でも確かではないので、よく調べてまた出直してきます。
457 :
デフォルトの名無しさん :2010/02/12(金) 12:17:02
自分でプログラムをつくって実行した時に free(): invalid next size (fast): 0x083c69b8 *** が出るんだけどこれはメモリ領域を開放する部分を疑うべきなのだろうか? 同じプログラムをMac OS XのGCC 4.2でコンパイルして実行するとエラーが出ずに実行できるんだけど FedoraのGCC 4.4でコンパイルして実行すると上のようなものがでてCore dumpしてしまうようなのですが
デバッガのバックトレース使えよ…
さっきから見ているがお前らどうして症状が再現する最小のソースを貼らないんだ? 会社の仕事のコードならわかるが、趣味のコードで見せたがらないってのがわからん トランプを裏返しにして何のカードか当てろと言ってるのと同じだぞ
最小のソースを作ることが問題の解決になってる場合が多いから、 作れない場合の方がおおい。
なるほどね じゃあ元のコードがバグだらけって事じゃん 質問が全く的を射ていないわけだ
複雑に絡み合っているコードを単純にする作業はデバッグと一緒。
aオブジェクトがオーバーライドされたoperator[]をもっているとき aのインスタンスを作る関数の戻り値は値渡しにしたほうがいいですか? そうしないと使うとき(*a)[x]という変な形になってしまうので、
(*a)[x]に慣れる
a->operator [](x)
A &ra = *a;ra[x]
素直にデータをクラスに保持しておいて 参照で返すのはオススメできませんか?
なぜかというとクラスはデータのカプセル化が目的だから、 書き換えられたらだめとおもいました。
a[1]=10;みたいな使い方をするんだったら 書き換えられるんだから参照にすればいい そうじゃなければやめればいい
参照にします。 ありがとうございました。
http://codepad.org/spYnVcUT アルゴリズムC++の187,190ページにのっている
リストを実装に用いたマージソートなんですがmergeできません
main関数と表示などのスタブ的な箇所以外は
基本的にそのまま写してるんですが・・
そもそもこのコードだとmergeできないように思ったので
打ちこんでみたんですが
これって私の勘違いでしょうか?
>>457 malloc/callocで確保してないメモリを解放してるか、既に解放したメモリを再び解放してるか、
どっかで配列のオーバーフロー/アンダーフローが起こってて、メモリの管理領域を壊してるかじゃないかなぁ。
確保したメモリかを確認し直して、多重解放してないか確認して(解放したらNULL入れておくといいよ)
ヒープ領域(大雑把に言うとmalloc/callocで確保したメモリのこと)の配列を中心に、変なことしてないか確認。
特に間違いがみつからなかったら、この手のバグは面倒なのが多いから、デバッガの利用を検討した方がいいかも。
>>472 z->key = 99999999; を入れれば動く
mergeでa->next、b->nextを順に辿っていくといずれzに到達してz->keyも参照することになるが、
z->keyが不定値だとうまく動かないな
>>474 http://codepad.org/jgeFBNmJ ありがとうございます。動かせました!
z->keyと同じ値を持つデータがあると正常にソートされないこともわかりました
これってz->nextがzであることを利用しているけど
schemeなんかだと(cdr ('))はエラーだし
引数は破壊的変更しまくりなので
関数型言語でコード化するのは難しそうですね
std::mapのキーって自動的にソートされてましたっけ?
hai
unordered_mapはソートされてない
まぁそういう名前だしな
並び方は構築時に与えられる比較関数オブジェクト次第だよ
482 :
デフォルトの名無しさん :2010/02/13(土) 17:36:53
>>482 直す前のコードにバグがあって、OSXの方ではたまたま動いてただけ。
>>482 連続だろうが不連続だろうが、配列の範囲を越えたところに書き込まなければ起こり得ないバグ。
C++のIDEはヘッダファイルを作った後に、自動で*.cppに定義をコピーしてくれないの? つまり、hogehoge.hに↓のように宣言したら void Hoge(Test* t); 自動でhogehoge.cppに関数をコピーしてくれる機能はないのか?ということ void Hoge(Test* t)←自動で挿入 { }
>>483 というよりも、修正したと思っている方も実はまぐれで動いている。
9割がた間違いない。
487 :
デフォルトの名無しさん :2010/02/14(日) 16:25:49
エラーを内包しててもコンパイラによっては表面化しないで動くことなんかよくあるぞw
気まぐれというかオーバーランしてる領域の中身によりけり
printfを挟んだらなぜか動きましたというのはよくあること
落ちる所とは全然違う所に問題があるとか オーバーランによるスタック破壊は本当に怖い
ネタ元がメモリ解放を疑ってるのに スタック話とかおよびじゃねぇよ
ネタ元に信憑性が無い事はすでに判明している。 この場合は全てを疑うのが原則。
>>493 だから、解放時に落ちるのは管理情報壊してるからなんだって。
で、管理情報を壊してるってことはアンダーランとかオーバーランで他のも壊してる可能性が非常に高いし、
落ちなくなったときも、偶然管理情報が無事なだけって可能性が大いにありうる。
>>487 メモリバグを起こす奴が何言っても説得力ないな
>>487 バグは誰でも作ってしまうものだから、バグを作ったことで貶められる
ということはないよ。でもバグをろくに調べもせずに他人のせいにする
のは非難されるべき。
処理に時間がかかりすぎる場合だけスキップさせたいのですが どのように書けば良いでしょうか? 処理は分割できないので、間間に時間計測処理を挟むこともできません try catchでできるのかなと思ったんですが、調べても出てこない 助けてください・・・
OSに指定時間経過したら蹴り入れてくれるように依頼する。
>>499 処理を別スレッドで動かしておいて
指定時間が経過したらスレッドを殺す
502 :
デフォルトの名無しさん :2010/02/15(月) 12:52:50
int* I = new int[69](); と後ろにカッコをつけてもintが0に初期化されませんなりません。 MINGWです。 おねがいします。
>>502 それコンパイル通った?
普通はエラーになると思うんだけど
配列に対してのnewは初期化子が使えません
後からmemset()かstd::fill()でもするしかないです
ついでに言うならば、クラスの配列に対して各々コンストラクタを 呼び出すには普通placement newを使う デストラクタは自動的に呼び出されないので自分で I[n]->~a(); みたいにfor文で回す必要がある
コンパイル通ったし0になったな、VC++だけど
g++はmingwと思いますが。
>>508 分かってます
自分もMinGWは入れてあります
で、MinGWで0になりましたか?
だから拡張の独自仕様だろうが そんな事をここで論じても仕方が無い
独自仕様ではないと思いますが、 正式なC++の本に書いてありましたから。
規格に明記されて無いものは全て独自仕様
ボーランドだとエラー Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland a.cpp: エラー E2243 a.cpp 5: new で確保した配列には初期化子が使えない(関数 main() )
>>514 ありがとうございました。
バグっぽいですね。
独自仕様じゃないことが分かってよかったです。
>>516 初期化子が配列では使えないという事には変わりないけどな
バグが直れば使うからいいよ。
いやバグとかそういう問題じゃなくてg++とVCでしか使えないわけだろ? そういうのを使うのか
g++はgccだから使えない。
gcc4.3.2なら使えた
4.3.2のインストールの仕方が分からないから 使いたくても使えない。
入門したいのですが入門書のオススメありますか?
525 :
デフォルトの名無しさん :2010/02/15(月) 23:55:41
* C言語 変数の有効範囲(スコープについて) */ #include <stdio.h> char *_String( void ); char *_String2( void ); void main(){ char *pChar = _String(); char *pChar2 = _String2(); printf("Output Char:%s\n", pChar); printf("Output Char2:%s\n", pChar2); } char *_String( void ){ char test[10] = "AAAAAABB"; return test; /* 値が確保されているのはここまで */ } char *_String2( void ){ return "AAAAAABB"; /* 何でこれだけ維持されているのか? */ } 上の場合にchar *_String2( void )の戻り値が確保されている理由を教えてください。
変数じゃない
>>525 "AAAAAABB"はスタック上に確保されているわけではなく、BSS領域という
一般的にはグローバル変数と同じ領域に置かれている文字列リテラル
だから関数から抜けてもスタックが破壊されて無くなってしまうという事はない
その"AAAAAABB" はどこに格納されてるのかな?
はじめてのC++ 誤解されることこの上ないタイトルが凄く好き
C#で慣れ親しんできた者です。 C#では関数の引数に配列を渡す際は何も考えずに配列を渡せば良かったです。 関数内では受け取った配列のインデクサを調べれば配列の個数が分かったからです。 C++では配列を渡してもインデクサ等が無いので配列の個数を関数内で調べる方法が無いわけですが こういうときはみなさんどうされているんでしょうか?配列の他に配列の個数をint型で渡したりして対処 されているんですか?
>>525 みたいなの、ダメだと思ってた……
文字列リテラルってグローバル変数と同じ時間存在してるのか。
>>530 Cではそうするしかなかったし、C++でも普通の配列使うならそうするしかないが、
C++のSTLコンテナ使ってもいいなら、メンバ関数size()で個数が分かる。
>>530 コンパイル時にサイズが分かる普通の配列ならテンプレートで調べる小技があるよ
動的確保だとどこかにサイズを保存しないとダメだね
そしてそれを親切にやってくれるのが標準ライブラリ
>>532-533 C++では動的サイズの配列の受け渡しにはSTLを使えということですね。
ところでSTLを使った動的配列にはintといった型だけでなく
構造体やクラスの配列を格納することも可能ですか?
リテラル文字列の寿命がグローバル変数のように長いって規格で保証されてるの?
>>535 構造体やクラスなら、できた。
必要に応じてコピーコンストラクタを実装すること。
タイプミスじゃなく意図して「構造体やクラスの配列」って言ってるなら、
普通の配列はコピーコンストラクタがないのでコンテナに入れられない。コンテナをコンテナに入れることは可能。
>>537 失礼しました
「構造体やクラスの配列」ではなく「構造体やクラス」でした
539 :
デフォルトの名無しさん :2010/02/16(火) 06:46:02
>>526-527 ありがとうございます。
文字列リテラルと言う扱いになる為
グローバルな領域で確保されるから問題ないと言う事ですね。
この辺を重点的に調べればちゃんと人に説明出来そうですね。
>>528 さん
そのどこの領域に格納されるのかが良く分からないので
人に説明する時にどう説明すればいいのか悩んでたんです。
アセンブラ吐かせて読んでみれば
>>525 質問と関係無いツッコミ失礼。
スコープってのは名前の有効範囲。ソースコード上での静的なもの。
動作時の変数の有無は寿命とか言う。
C++はヘッダとソースが分離しているから見にくいな〜 やっぱり、メンバ変数にはm_、staticにはs_と付けないとダメなのかな でも、ちょっとm_とs_はうざい
>>542 そもそもメンバ変数を見なければいけない実装がおかしい
と言いたい。
もしかして、100万回
>>525 の_String2を呼び出すと、
全部"AAAAAABB"を確保するのか。
えーとね、 文字列リテラルは staticな無名の配列、くらいに考えて良いよ。 constかどうかはコンパイラ(オプション)依存。
>>544 一箇所に確保してあるのもを100万回呼び出すだけ。
それって規格で保証されてるの?
文字列リテラルの記憶クラスはstatic
よくクックブックなる本があるけど あれの元ネタってThe art of computer programming?
名前空間ってあんまり使われてないの? ソフトの一部にだけしか、使われていない気がするんだけど
お前の読んでるソースが偏ってんじゃねーの?
クラスの名前が被らなったら、積極的に名前空間を使う必要は無いと思うだけど 読みにくいし、使いづらくなるだけの気がするんだけど
俺は積極的には使わない派かなぁ プロジェクト共通の名前空間で包むだけで あとは衝突してから名前変えるか名前空間ネストするか考える
短い名前空間なら大して負担にならないし、 俺は使っているよ。
自分で名前が被らないよう制御できる範囲では、名前空間は必要ないからね あれは主にライブラリのため
557 :
デフォルトの名無しさん :2010/02/19(金) 11:30:55
集合Aを入力として、状態xを持つAの元個数を出力する関数の名前は 何にしたらいいですか?
set.count_if(pred);
ありがとうございます。 countって動詞ですか? predってなんですか? 普通の関数にしたいんですけど countX(SET A)でもいいですか?
count【他動】数える、合計する predicate【名】述語 好きにすれば? 自分で決めれ
おねがいします。そこを何とか教えてください。
じゃあそれでいいよ
>>559 560のいいたかったのはこういうことだろう
struct S{
vector<int> v;
S(){for(int i=0;i<10;++i){v.push_back(i);}}
int count_if(bool (*pred)(int)){
int n=0;
for(int i=0;i<v.size();++i){if(pred(v[i])){++n;}}
return n;
}
};
//これがpred
bool after7(int n){return n>=7;}
bool iseven(int n){return (n%2==0);}
bool times3(int n){return (n%3==0);}
S s;//0-9を入れる
cout << s.count_if(after7) << endl; //7以降の数
cout << s.count_if(iseven) << endl; //偶数の数
cout << s.count_if(times3) << endl; //3の倍数の数
一瞬 iseven が seven に見えたw
i7にしか見えない
aaa, bbb, ccc,・・・・・・・・ ddd, eee, fff,・・・・・・・・ って書かれたcsvから aaa,bbb ddd,eee ってcsvを作りたいんだけど 検索かけても長いソースコードのばっかり。 20行ぐらいでシンプルに作れないのかな
>>566 > aaa, bbb, ccc,・・・・・・・・
> ddd, eee, fff,・・・・・・・・
> って書かれたcsvから
> aaa,bbb
> ddd,eee
> ってcsvを作りたいんだけど
それで法則性が分かると思うてか?
Excelに貼り付けて3列目以降を削除しろ。
わかってんじゃん。w
C++の継承はポリモーフィズムをするためではなく、 実装を継承するためにやっている事が多い気がします これって気のせい?
継承はテンプレートで遊ぶために有ります
>>570 C++では、継承以外にもポリモーフィズムを実現する手段が発達しているから、
相対的に、継承の中では実装の継承が多いように見えるのかもしれない。
あるいは、お前が出会ったコードor人間に
ポリモーフィズムが意識されるようになる前の古臭いやつの割合が多かったか。
VC環境のプロファイラといえば何がオススメですか?
継承とポリモーフィズムって違うの?目的と手段の関係?
ポリモーフィズムを実現する手段のうちの一つが継承だよ
でも、どっかなんか違う。
テンポラリを関数に参照渡ししようとしたらコンパイラに文句をいわれるんですが 参照の寿命がその関数内のみだったら別に問題は起こらないですよね?
>>577 無名一時オブジェクトはconst参照で渡せられるよ。
pimplの読みは「ピンプル」でなんでしょうか?
「ぱんぷるぴんぷるぱむぽっぷん」でいいよもう
581 :
デフォルトの名無しさん :2010/02/20(土) 23:24:19
Javascriptやべぇ "3" + 1 // '31' "3" - 1 // 2 "222" - -"111" // "333" (???)
でっていう
>>574 ストリーム出力で数値も文字列も<<で出力できる(多重定義)とか
vectorがコピー可の型ならなんでも要素に取れる(テンプレート)とか、
複数の型のオブジェクトに同じ操作が適用できることはなんでも多態、ポリモーフィズムと言う。
>>577 それ認めると、
void f(double& x) {x = 42;}
で、
int i = 0;
f(i); // double型の一時オブジェクトを作ってそれを渡す
ここで、fから戻っても元のiは変わらず0のままという混乱必須の事態になるから
エラーにする決まりになった。
const参照ならその心配は要らないので
>>578 の言うとおりOK。
NARHOUDOU!
一時オブジェクトにしなければいい。そのほうが読みやすい。 int main(void) { std::ifstream a("Test.cpp"); cat(a); return 0; }
>>586 この例では、cat(std::ifstream("Test.cpp").ignore(0))としたら一応できる。
ようするに*thisを参照型で返し、余計な作用がなさそうなメンバ関数を呼べばいい。
ostreamならflush()など。
根本的な解決としては、次の規格改定で今までの参照に加えて、こういう破壊操作前提のときに使える
一時オブジェクト含むrvalueを受け取れるrvalue参照というものが導入される。
現状では
>>587 の言うとおり変数を作ってしまうのが一番楽。
てst
7-zip32による圧縮ファイルの解凍を行うプログラムを作成しています。 SevenZip()によるコマンドでの解凍ではなく、 SevenZipOpenArchive()でアーカイブのハンドルを開いて、 解凍進捗をコールバックで取得しながら解凍する方法を探しているのですが、 サンプルソースが見つからず苦戦しています。 今のところ以下のように書いています。 unrar.dllでの解凍を以前したことがあるので、同じようにコールバックで自分でデータを書き込むか、 書き込みはAPI内で行っても、進捗情報はコールバックできるかと思っているのですが、 根本的に間違っているのでしょうか? CString strPath = _T("C:\\XXXX"); //オープン char* pPath = W2A(strPath); HARC hFile = SevenZipOpenArchive(NULL,pPath,0); if( !hFile ) { _tprintf(_T("Error !! : Open \n")); } INDIVIDUALINFO stInfo; if( SevenZipFindFirst(hFile,"*",&stInfo) == 0 ) { do { //何を記述するの? }while( SevenZipFindNext(hFile,&stInfo) == 0 ); } //クローズ SevenZipCloseArchive( hFile );
クラスをインスタンス化するとき、コンストラクタ内部や外部から、 コンストラクタ以外のイニシャライズメソッドを呼んで初期化させている例を見たことがあります すべてをコンストラクタ内で書かないメリットには何があるのでしょうか?
オブジェクトの生成時には初期化に必要な情報がそろっていないケースとか。 コンポジションしてるような状況ではよくある 他にはシングルトンみたいにインスタンスの数に制限をしたい場合とか
常に使われるとは限らない場合があるからとか
>>591 例外の話じゃね?
init()というメンバ関数を用意してだな…(ry
>>591 そのクラスにresetメソッドがあるなら、コンストラクタとresetで処理内容がかぶる箇所を、privateな初期化メソッド作るかも。
・コンストラクタで例外発生しちゃう可能性がある場合の回避方法として ・初期化処理に失敗する可能性がある場合、戻り値で判断したいから
コンストラクタで例外出ても別にいいだろ
デストラクタが呼び出されない (ので、メンバが中途半端に 割り当てられたまま残る可能性がある) ことが判ってれば 別にいいですが。
>>597 世の中には「C++で例外を使わない」というコーディング規約もある。
resetはいいけどinitはなんかいやだ
>>598 メンバのデストラクタは適切に呼ばれるよ。
呼ばれないのはデストラクタの{}内。
>>599 なおさらinitはいらないね。
>>601 >
>>599 > なおさらinitはいらないね。
頭おかしいお前はレスする資格がない。
initの失敗を返り値で判断したいってどういうケースだ? ifの代わりにtry-catchでも別によくねーか?
>>603 世の中には「C++で例外を使わない」
って
>>599 が言ってるけど、
コンストラクタで例外を無げない
というコーディング規約なら知って居るぞ。
その話をみんなしたいんじゃないのかい?
C/C++にboolの排他的論理和ってありましたっけ?
いえ、boolです。ビットなら^ですよね
boolなら!=が排他的論理和になる
>>608 !!!
今日一番感動しました
今まで全く気付かなかった、ありがとうございます!
何か差し上げたいぐらい
んーむ最近感動したのはx mod yをx-y*(x/y)で定義できること(x/yの箇所はfloor(x/y)です)
これだと負の剰余もちゃんと定義できます
C/C++だと負のmodは実装依存なのがたまにきずですが
>>609 水を差すようで申し訳ないのだが、
それは高校数学で習ったろ。
多項式の商と剰余を定義する場面で、
数Vで出て来たはず。
>>610 >>609 じゃないけど、高校のときはこんなのなんの役に立つんだばかばかばーかふんだっ!って思ってましたごめんなさい
いや、小学生でもできる。
キリッ
>>601 >メンバのデストラクタ
の話などしていません。勝手に補完しないように。
>>609 mod の定義は数学の教科書でもまちまち、というかどっちでも決めたいほうに決めろという態度のような。
整数mをnで割った時、その商がq、剰余がrであることを m ÷ n = q … r と表記して、 m = qn + r かつ 0 ≦ r < n とするのが普通の定義だろ ていうか、これ以外の定義している数学の本なんて見たことない
そんな定義ばかりじゃないということが大学で代数の勉強をすればわかるよ
おま、数学科で院まで言った俺に何を言ってるんだ
整数と言ってる時点で、加法・乗法・乗法逆元は定まってるし、
>>617 はおかしい。
除法は乗法逆元を掛けることで定義されるから。
おそらく、
>>617 はp 進数体とかの上での除法のこと言ってるんだろうけど。
整数の除法と言えば、
>>616 の定義しかない。
ただ、
>>609 で問題なのは負数に対するmoduloの定義。例えば、
-12 mod 5
が-2なのか3なのかは少し問題になるかもしれない。
普通は3なんだけど、順序の入ってない体での除法を考えた場合、
>>616 の 0 ≦ r < nの部分の定義が使えないから、
a mod b ⇔ a - b * xのうち最も0と"近い"もの
という定義も考えられる。距離または絶対値が入ってることが前提になるが。
この定義だと、-12 mod 5 = -2となる。
一応言っておくと、整数体があるって言ってるんじゃなく、整数を含む体が実数体しかないってこと。
>>620 で言ったのとは別に、処理の都合で負数の剰余を許すこともあるみたいだね。
で?
625 :
デフォルトの名無しさん :2010/02/27(土) 08:31:27
小学生の子供にプログラミングを教えるなら、何の言語がいいですかね? 当方、コマンドプロンプト上で動かすものしか作れないのですが、それだけでは子供は楽しめないと思います 自作マリオを作りたいそうです
C/C++スレでそれを聞いてどうするよ? 言語はどうあれ結果が視覚的に確認しやすいほうが飽き無いだろうな。
マリオ作りたいなら、ファミリーベーシックでいいんじゃないの?
子供の年齢を知るのが先だろん
子供は26歳です(^ρ^)
ひょっとしてピーターパンですか?サインください
>>616 ,624
別物じゃないですよ。
>>619 にあるページの性質はすべて成り立ちます
しかもこの式はx,yは実数でも成り立つので
感動したというわけです
詳しくはtaocpを見てね
>>631 勘違いするな。合同式と合同関数は別物だ。
a mod bと、a ≡ b (mod n)。書き方からして違う。
あと、その定義式はごく一般的なものだろ。
これ以外の定義があるのか?
最近は猫も杓子もオブジェクト指向オブジェクト指向だけど PS3や箱○といったゲーム開発用の場で使われている言語も オブジェクト指向言語だったりするの? それとも古き良きC言語のままだったりする?
新年 C以外の最初のコンパイラはアセンブラで記述されたけど、 CコンパイラだけはCで書かれた。
>>633 Cが古いは良いとして良かったかはともかく、PS3の説明会でC++も使えますよといってたぞ。
360はXNA(C#)とかも使えるみたいだぞ。
>>634 最初にCでかかれたソースは何で書かれたCコンパイラでコンパイルしたの?
>>635 > PS3の説明会でC++も使えますよといってたぞ。
> 360はXNA(C#)とかも使えるみたいだぞ。
C#でスピードなんて出せるの?
ゲームの派手さにプロセッサの処理速度は関係ないんじゃないの。
え( ´・ω・)?
本読んでて、サンプルプログラムで分からないところがあるんだが誰か教えていただけないだろうか? ------------------------------------ template <class T> class MyTemplateArray { public: T array[10]; T &GetValue(int item); }; template <class T> T &MyTemplateArray<T>::GetValue(int item) { if (item > 9 || item < 0) { return array[0]; } return array[item]; } -------------------------------- このGetValueの前の&はどういう意味なんでしょう?アドレスを返すって意味? &をとっても問題なくコンパイルできて動作もするのですが。何のための&なんでしょうか? よろしくお願い致します。
目次から「参照」を探せ
>>640 これで&がなかったら、テンポラリのオブジェクトが生成されるのかな?
>>640 インデックスが範囲外だったら0として扱うって、なんかひどい仕様。
>>640 そんな今すぐ本は投げ捨てろ。
しかし、範囲外だったらvectorみたいに例外を投げるとかassertするとかすれば良いのに。
645 :
640 :2010/02/28(日) 19:44:11
>>641 ありがとうございます。なんとなく理解できました。
>>642 参照で返す利点って何なんでしょうか?
private継承、protected継承って自分はめったに使わないんだけど、プロは普通にたくさん使ってるの?
private継承はたまーに。 protected継承はスコットメイヤーズ様すら 使い道がないらしいから必要ない。
>>645 参照で返す場合は
myArray.GetValue(0) = 100;
など参照先の書き換えが可能。
あるいはTが極端に大きなクラスの場合、
参照で返せばテンポラリ生成のコストがかからない。
>>645 ただし返す変数の寿命に注意。auto な変数の参照を返してはいけない。
650 :
640 :2010/02/28(日) 22:18:17
そもそも、メンバ変数の参照返すって、やらないほうがいいんじゃないの?
>>651 この例の場合はそもそもpublicなデータメンバだから参照で返しても問題ないのかもしれないけど、
そもそもpublicなところが、いかがなものかという気はする。
メンバ参照返しってやっぱ悪手なん? コンテナの要素アクセスとかは仕方ないとして 普段からProxyつかうように心がけた方がいいのかな
そりゃ悪手じゃろ
使用に際し中身を考慮する必要があるならstructでいいじゃねえかって話だ
>>653 折角アクセス制限を設けてカプセル化しているのに、
敢えてそれを崩すという意味で悪手なのかもしれないけど、
それを踏まえた上でどうしてもそうしなければならないなら、
仕方が無いのかもしれないですね。
やるとしてもconstな参照返してほしい。
でも std::vectorの[]は参照を返してるな。 配列っぽくしたいときはしょうがないのか。
みんな、Effective C++ 第3版に書いてあるじゃないか。
> 配列っぽくしたいときはしょうがないのか。
うん、そういうときはしょうがないからいいよって書いてあった。
>>653 元のオブジェクトが無効になってたとき、参照返しだとやばいことになる。
例えば
コピーコストを下げるために
const MyClass& temp = obj.m_func();
としていて、いざtempを使おうとした時に
実はobjが無効でしたとかなりうる。
浮動小数点(IEEE-754)についての質問です。 内容が特殊なので、スレ違いの場合は適切なスレを教えて頂けるとたすかります。 ※以下の数式の「^」はべき乗を表します。 IEEE-754によると浮動小数点の正の最小値は 符号部(s)=0、指数部(e)=00000000[8桁]、仮数部(m)=00000000000000000000001[23桁] になります。 ※ビット列:00000000 00000000 00000000 00000001 指数部が0の時は、仮数は[1.m]ではなく[0.m]なので 仮数は2^(-23)になります。 また、指数は[-127]ではなく仮数を1.mから0.mで表すことに したため[-126]になります。 なので、この時の値は (-1)^(0) * (2^(-23)) * 2^(-126) =2^(-149) ---【A】 になると思います。 しかし、IEEE-754の仕様を見ると、これとは違い ( ( 1 + (2^(-52)) ) * (2^(-150)) ) * (2^(-149)) ---【B】 と書かれています。 どうして【A】ではなく【B】になるのでしょうか? 「( 1 + (2^(-52)) ) * (2^(-150))」がどこから出てきたのか サッパリわかりません。 (参考)IEEE-754仕様 tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html [32-bit Single Precision]の[Positive Denormalized]です。
ここで聞いて良いのかわかりませんが、お願いします。 VC2008 でプロジェクト、Win32コンソールアプリ→DLL+空の状態にチェック でビルドしてDLLを作ろうとしています。RealeseでビルドしてもフォルダにDLLは作成されましたが、 libファイルが作成されません。設定か記述が間違っているのでしょうか。 a.cpp extern "C" int add(int a){ int b; b=a+10; return b; } a.def EXPORTS _add
libファイルはdefファイルじゃなくて__declspec(dllexport)つければ作ってくれるはず
defファイルがリンカに渡されてないんじゃないの
>>661 情報ありがとう。
一応、指数部が0と255の時はデノーマル数。
1〜254の時はノーマル数というのは、何とか理解できます。
tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
の最下部「 They are represented by 〜」から最後までの文章で
それらしいことを書いているような気がするんだけど、訳せない・・・
符号 | 指数部 | 仮数部
0 00000000 00000000000000000000001
ビット列が↑のときの
(-1)^(0) * 2 ^ (-126) * 2 ^ (-23) = 2 ^ (-149)
より半分の値を表せるようなことが書いてあるみたいなんだけど・・・
>>663 これを使うとcppだけでdllとlibファイルが作れるんですね、ありがとうございます。
>>664 プロジェクトのプロバディ リンカ→入力→モジュール定義ファイルにab.defを指定してビルドしました
1>ab.def : error LNK2001: 外部シンボル "_add" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\ab\Release\ab.lib : fatal error LNK1120: 外部参照 1 が未解決です。
addが未解決らしく、ab.libを作ってくれません。
>>662 の記述以外にもプロバディをいじる必要があるのでしょうか?
>>666 a.def
EXPORTS
add
アンダーバーが必要なら
a.def
EXPORTS
_add=add
一般的な使用例を知りたいのですが、プリフィックスでg_を付けるのって、 ヘッダでextern宣言するグローバル変数に付けるべきものですか? それとも、ソース内で関数の外に書くstatic変数に付けるべきものですか?
>>667 できました!ありがとうございます。
しかし、この調子だと先が思いやられる…
属性値(int),戻り値型のペアが定義されている。 属性値をテンプレート引数として渡して戻り値型の値を返すテンプレート 関数(又はクラス)を記述したい。 例 enum { a1, a2, a3}のそれぞれに対して a1 => int a2 => double a3 => int * と定義されているとします。 これを関数テンプレートで定義し、 int v1 = get<a1>(arg); double v2 = get<a2>(arg); int *a3 = get<a3>(arg); のように、テンプレート引数に属性値だけ渡す形式で呼び出したいのですが、 どのように書けば良いでしょうか?
いちいち特殊化すればいいんでない?
672 :
670 :2010/03/03(水) 13:17:06
template<> struct<a1> typemap{ typedef int ValueType; }; template<> struct<a2> typemap{ typedef double ValueType; }; template<> struct<a3> typemap{ typedef int * ValueType; }; と特殊化定義して typemap<a1>::ValueType で参照する事にしました。
a.cpp #include"a.h" extern "C" int add(int a); a.h extern "C" __declspec(dllexport) int add(int a){ int b; b=a+10; return b; } Vc++ 2008 のRealeaseでビルド、DllとLibファイル作成 ----------------------------------------- Tyty.cpp #include<stdio.h> int __stdcall add(int a); int main(){ int c; c=add(7); printf("%d\n",c); } 上のDllとLibファイルをtyty.cppと同フォルダにコピー プロジェクトのプロバディ リンカ→全般→追加のリンクライブラリ ディレクトリ→Libファイルを指定 Realeaseでビルド 1>tyty.obj : error LNK2001: 外部シンボル ""int __cdecl add(int)" (?add@@YAHH@Z)" は未解決です。 1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。 --------------------------------------------------- exturn "C" してもリンクエラーが出ます。関数の宣言が間違えてるんでしょうか
cppの方のプロトタイプ宣言のとこもextern "C"
""int __cdecl add(int)" (?add@@YAHH@Z)"これは、どこで宣言したadd()と考えているのか
すみません、extern "C"宣言 tyty.cpp #include<stdio.h> extern "C" int add(int a); int main(){ int c; c=add(7); printf("%d\n",c); } ビルドすると 1>tyty.obj : error LNK2001: 外部シンボル "_add" は未解決です。 1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。 3行目を int _addに変更するとエラーが 「〜”_ _ add”は未解決です」になりました。
えーとさ、a.hとa.cppとtyty.cppでの関数宣言を合わせようぜ
>>676 間違えましたtyty.cppの3行目を _addにすると「〜”add”は未解決です」になりました
って
>>673 よくみてなかったよ。
追加のライブラリディレクトリには、libファイルの場所を入れる
で、入力の追加の依存ファイルのとこにlibのファイル名を入れる
数値Nが与えられたときに2^nがNを超える最小のnを求めたい時に ビット処理で簡単にこれを実現する方法ってありますか N=7ならn=3 N=25ならn=5 N=60000ならn=16です
>>679 ありがとうございます、できました。
ディレクトリってフォルダまででしたっけ…設定を終えたつもりでしたが間違ってました orz
>>676 dllを利用する方は__declspec(dllimport)にしないとあかんよ
---dll.hpp---
// __stdcallは__cdeclなどに変えてもいいけど、同じ関数ではきちんと統一しないといけない
// なにも書かないとVC++なら__cdeclになる
extern "C" __declspec(dllexport) int __stdcall func(int x);
---dll.cpp---
#include "dll.hpp"
// 実装
int __stdcall func(int x) { /* ... */ }
***以上をDLLとしてビルド***
---use_dll.hpp---
// さっきビルドした時に作られたlibファイルをインポート
// これを書かない場合はプロパティでリンカの設定が必要
#pragma comment(lib, "dll.lib")
extern "C" __declspec(dllimport) int __stdcall func(int x);
---main.cpp---
#include "use_dll.hpp"
int main(void) { func(100); return 0; }
>>680 for(n=0; N; n++, N>>=1);
class A{ public: struct B{ int dummy; }; }; この場合の A::B を前方定義する方法はありますか?
>>683-684 ありがとうございます
x86にはbsr命令ってそのまんまなのがあるんですね
キーワード検索したらHackersDelightのページにたどり着き
2章が公開されてて感動しました
>>668 変数名のことだと思うのですが、命名法にきまりはとくにありません。
が、global という意味でなら関数外static変数よりは、複数のモジュール間でスコープが有効な変数に g なりなんなりをつけるような
考えかたはあると思います。
わたしはモジュール総体でスコープが有効な変数はほとんどつかいませんが、モジュール内でスコープが有効な変数
(関数外static な変数)のサフィックスにSをつけています。
>>688 アプリケーションハンガリアン表記という。
x=f(g(h( int(1) ))); のintの一時変数は ; まで存在しますか?
します
関数自体は例外を全く投げないのですが引数をコピーするときに例外を投げる関数があるとします 例えば struct hoge { hoge &operator = (hoge other) { swap(other); return *this; } // 最適化をしやすくするために引数からあえて参照を外す void swap(hoge &other) throw() { /*略*/ } //以下略 }; この場合operator = はthrow()を指定してもいいでしょうか?
typedefを使えばvectorとlistの両方に使えるコードが 書けるそうですが、どういう事なのでしょうか? typedef vector<string> s; typedef list<string> s; という書き方では後者のsが再定義されるのでエラーになりますし
最小正剰余の求め方で一番処理速度の速いやり方教えてください。 yは自然数でxは整数です。 戻り値は -1<x<yです。 int mod(int x,int y){ if(x<0){ return ((x%y)+x)%y }else{ return x%y; } }
個別のyごとに最適化すれば? たとえばx%2^nだったらx&2^n-1
>>693 片方好きなほうをコメントアウトする。
どっちを使ったとしてもうまくいくよと言いたいのだと思う。
だがコンテナを汎用化する意味は無い
1年複利で0.15%の利息が付く銀行に、100万円預けたときの 各年ごとの預金額を表示するCプログラムです。 以下の2つのプログラムの実行結果が異なるのですが、理由がわかりません。 教えてください。
■プログラム1 #include <stdio.h> int main() { int year = 0; int balance = 1000000; while(year <= 10) { printf("%2dyear: %d\n", year, balance); balance = balance * (1 + 0.0015); year++; } } ■プログラム2 #include <stdio.h> int main() { int year = 0; double balance = 1000000; int balance_int; while(year <= 10) { balance_int = (int)balance; printf("%2dyear: %d\n", year, balance_int); balance = balance * (1 + 0.0015); year++; } }
ナローイング変換
小数点以下
printfをそれぞれ printf("%2dyear: %f\n", year, (double)balance); printf("%2dyear: %f\n", year, balance); にしてみれば一目瞭然では
>>700 ,701
レスありがとうございます。
でも、この2つのプログラム、同じことやってるように思えるのですが…。
[プログラム1]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
int <- int * double
int <- double * double <暗黙の型変換>
int <-(小数点以下切り捨て)- double <キャスト>
[プログラム2]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
double <- double * double
◆balance_int = (int)balance;
int <-(小数点以下切り捨て)- double <キャスト>
礼を言ってるだけで理解しようとはしてないんだね。
>>700-702 理解しました。
プログラム1のほうは預金高をint型で保持してる。
一方、プログラム2のほうはdouble型で保持していて、出力の際に
int型の一時変数に小数点以下を切り捨てたものを格納して、それを表示してるだけ
だから、小数点以下の数字が徐々に大きくなってきて、繰り上がった時に両プログラムの
値が一致しなくなるわけですね。
すんごい間抜けな質問してごめんなさい…。
答えてくれてありがとうございました。
>>696 遅れましたが、ありがとうございます
vectorとlistの扱い方を学ぶ章だったので
何か上手いやり方があるのかと思い込んでました
また不明な点があれば、ご教授願います
>>697 先のvector<string>のような短いものであれば
typedefによる汎用化はかえって混乱を招く、ということでしょうか?
コンテナによって可能な操作が異なるからじゃないかな 単純にtypedefを書き換えればすむわけじゃないケースが多い
sprintf(FILENAME,"/users/maroyuki/C.csv"); ofs.open(FILENAME); for(i=0;i<N;i++) ofs << 何か変数 << endl; ofs.close(); としてファイル書き込みしたいのですが、空のcsvファイルができるだけで データが出力されません 何か変数のところに文字列リテラルを入れると出力されるのですが、 整数を直接打ち込んだ場合は駄目です 何故でしょうか?
>>708 "何か変数" が 空
それ以外に思い浮かばないので
無意味な省略せずに、ソース全張り&環境を明記するといいかもな
char FILENAME[100];
sprintf(FILENAME,"/users/maroyuki/C.csv");
std::ofstream ofs;
ofs.open( FILENAME );
ofs<<var<<std::endl;
std::cout<<var<<std::endl;
ofs.close();
ではディスプレイ出力に成功しているので変数が空というのは無いはずです。
ソース全張りは申し訳ないですができません。
環境はMacOSX10.6+Xcode3.2.1+GCC4.2です。
コーディングミスでないようなので少しMac周辺で調べてみると、
http://forums.macrumors.com/showthread.php?t=796818 こんなのが見つかりましたので調べてみます。
ありがとうございました。
>>707 ありがとうございます
今はコンテナ共通の操作(eraseとか)しか分かりませんが
これから先そういったケースに遭遇すると思いますので留意します
インターフェースの問題もあるけど ある処理に対して最適なコンテナはどれかなんて大抵の場合は最初からわかってるから コンテナを汎用化しても使うのは結局ひとつに絞られるから意味ない
万能コンテナが存在するならvector、list、map、、、などと色々用意されてないし。
>>712-713 ありがとうございます
仰る通りです
学生の成績を管理するプログラムで
不合格の学生のデータをfailコンテナに振り分け、
もとのコンテナから削除していく場合、
データの数が多ければ多いほどvectorよりlistの方が処理が速いようですし
まぁそれを補う意味でもイテレータがあるわけで これもイテレータのカテゴリによって可能な操作が異なるけど
716 :
sage :2010/03/06(土) 13:52:32
Perlの変数やJavaのantのような、文字列に埋め込まれた 「$変数」を解釈するようなC++のライブラリってない?
まずはboostを調べる。なかったら諦める
>>714 学生にはユニークな学生番号があるだろうからmapのほうが良くないか?
おそらく彼が読んでる本はAccelerated C++
(ある程度の)万能コンテナは、ないこともないよ。 Boost.MultiIndexとか。
コンテナの一般化はコンセプトによって行われる
>>718 そこはあえて処理速度を求めて vector<int>.at(学籍番号)でw
初歩的な質問なんですが ユーザー定義の型でabsを定義すると、 stdのabsが使えなくなくなります。 int等はstdのやつでそれ以外は自分で定義したのをつかいたいときは どうしますか?
自己解決しました。すみません。
>>716 ない。
多くの場合、実行時には変数名などといった情報は残っていないので、現状では実現できない。
こんなのがあったとき struct T{int time;bool f(){--time;return time<=0;}}; vector<T> v; vのデータについてf()を1回呼び出して真のものはvから削除、としたいんですが イテレータが無効化?されてしまうのでうまくいきません こういう場合どう書けばよいんでしょうか
remove_ifとeraseをつかう
>>729 ワロタ
名前空間を使う
namespace oresama_sugee_lib
{
ore_vector abs(const ore_vector& a);
}
レスありがとうございます
>>715 iteratorはインデックスの代わりになる、という程度の知識しかありません
>イテレータのカテゴリによって可能な操作が異なる
今はどういう事なのか分かりませんが、頭に入れておきます
>>718 ,720
すみません
まだそれらの知識はありません
mapはもう少しで出てくるみたいです
Boost.MultiIndexというのは、
この本では出て来ないようですので調べます
>>719 そうです
>>721 すみません、どういう事なのかよく分かりません
長文、失礼しました
732 :
デフォルトの名無しさん :2010/03/07(日) 12:38:20
>>730 名前空間をつかっても
intのときとore_vectorを引数によって自動で選んでくれません。
教えてください。
int b=static_cast<int>(static_cast<ore_vector>(abs(static_cast<ore_vector>(a)));
すみませんが教えてください。 アラインメントについて実験する以下のようなコードを見つけたですが、 文字列に使われている \x で始まる文字の意味が分かりません。これはどんな文字なのでしょうか? main ( void ) { char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef"; unsigned *u = (unsigned *)(str + 1); printf ( "%08x\n", *u ); }
制御文字などソース上表示不可能な文字を16進数で指定
0で始まれば8進数、xで始まれば16進数、それ以外の数字なら10進数
>>732 パラメタの型による多相ならテンプレートとその特殊化使えばいいだけじゃね?
#include <cstdio>
namespace ore {
template<typename T>
T abs(T x) { std::puts("!=<int>"); return x; }
template<>
int abs<int>(int x) { std::puts("<int>"); return x; }
}
int main() {
ore::abs("moge");
ore::abs(1);
ore::abs<int>('a');
}
>>738 すみませんが、何がやりたいのか分かりませんでした。
関数を呼ぶのに<int>をつけなくちゃいけないのなら
別の名前にしてもおなじですよね。
>>739 1こ目はintじゃない型を渡すから !=<int>って表示される方が呼ばれる
2こ目は整数(int)を渡すから<int>って表示される方が呼ばれる
3つ目はおまけでcharを渡してるけど明示的に<int>って指定することで<int>って表示される方も呼べるよってこと
そゆことじゃないの?
intのときはstd::absが呼びたいんですけど。
intで特殊化して自分でよべ
それってただのラッパーじゃないですか? そうゆうことじゃないんですよ。
ラッパーじゃねーよカス
結局スルーした奴の勝ちかよ
型がswapを特殊化してない場合は std::swapにオーバーロード解決して欲しいとかいう類のアレか
747 :
726 ◆RpGtirBRdE :2010/03/07(日) 14:11:26
えーと、だいぶ 放置してたんだが、まだやってるのか。
>>723 > ユーザー定義の型でabsを定義すると、
> stdのabsが使えなくなくなります。
使えなくなるってなんだ?どういうこと?
エスパーすると、
ユーザー定義の型をMyClassとしよう。
//@ typedef MyClass T;
//A typedef int T;
のどっちかがコメントアウト解除されている時、
T x(適当な初期化値);
std::cout << abs(x);
みたいなコードで、@が有効なときにはユーザー定義のabsが、
Aが有効なときにはstd::absが呼ばれるようにしたいと、そういうことなの?
template<T> T function(T a){ return abs(a); } Tがint等のときはstd::absが呼ばれて Tがint以外のときはユーザー定義のabsが呼ばれるように やりたいだけです。
>>748 そのコードを最初から書いてくれればこんなにみんな悩まなかったのに。
template<T> T function(T a){
using std::abs;
return abs(a);
}
が正解。
もう 749 で放って置こう
using stdはちゃんとやってますよ? あと<typename T>でした。
>using std ?
>>751 > using stdはちゃんとやってますよ?
どこでやってるの?
俺の画面に表示されている限りではやっているように見えないんだけど?
いい加減、死ねばいいじゃないかな?
よくかんがえたらusing std::absはやってませんでした。 やってみます。有難うございました。
EffectiveC++3版読めよカス
仮に749が正しいとして その関数以外の場所のabsは using std::abs;無しで std::absの方が呼ばれないと困るんですけど。 駄目ですよね?
全員でもうこいつは無視しよう。 C++使うな。勝手に困れ。
C++では無理です お引き取りください
> そうゆうことじゃないんですよ。 > ちゃんとやってますよ? > 仮に749が正しいとして だんだん横柄になってきたな。
原理を知らずにやり方だけ覚えてもダメといういい見本
最近寒いから良い燃料なんじゃないかな
using std::abs; 無しでないと困る理由を書けば続くかも
ライブラリーを使う人が absを使うときusing std::absがいる 規定を知っていけないといけなくなるから。
namespace mylib { template<typename T> T swap(T const& v) { using std::abs; return abs(v); } } template<typename T> T function(T const& v){ return mylib::abs(v); } あとは全部mylib::absを使えばいい。 嫌なら知らん。
767 :
766 :2010/03/07(日) 15:47:34
×swap ○abs 失礼。
それってただのラッパーですよね。
>>732 説明不足だったかな。
これでいいかな。
namespace ore
{
class Hoge
{
int a;
public:
explicit Hoge(int a0):a(a0){}
int get()const{return a;}
};
inline Hoge abs(const Hoge& a)
{
return Hoge(std::abs(a.get()));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int c=3;
int d=abs(c);//ADLで std::absが選択される
ore::Hoge e(3);
ore::Hoge f=abs(e); //ADLで ore::absが選択される。
return 0;
}
>>769 ヘッダが抜けてた
#include <cmath>
を追加してね
Cを知らずにC++をマスターすることは可能でしょうか? C++の入門サイトなのにprintfが出てきたりCに書き直せだとか出てきて発狂しそうです
可能だけど、大体の入門書はC前提、あるいはC部分は駆け足だから、Cの入門書ぐらいは読んでもいいだろう
標準出力へ出力する選択肢として(f)printfは未だアリだと思うし、ほぼ上位互換なんだから覚えとけ。
>>772 > Cを知らずにC++をマスターすることは可能でしょうか?
可能です。
でもC++しかしらなくてC言語を全く知らないとなると
今後 ちょっと不便だと思うよ。
職業としてもし使いたいなら結局は両方必要になる。
多かれ少なかれC++の土台はC言語なんだから、C++をマスターした人が C言語を知らないってのはありえないし、順番的にもC言語は知っておくべき
多かれ少なかれってか多いぜ。 > C++をマスターした人が > C言語を知らないってのはありえない 同意。 C言語を知らないで通ろうという方が面倒だと思うぜ。
template <class T> mycls; template <???> void std::swap< mycls<?> >(mycls<?> &lhs, mycls<?> &rhs) { ・・・ }; テンプレートクラスのstd::swap特殊化って不可能?
C言語は脆弱性の元 理想的には知らない方がいい
ぜ、ぜいじゃくせい
むしろCを知らない人って、 脆弱性云々の発生原因はどこにあるとか理解できるの?
コア吐かせてデバッガでスタックトレース、メモリダンプ
ある程度被る部分は別としても、C的な泥臭い部分を知らずに学んだ方がむしろ良いとも思う (C++をやるのにmallocが必要か?) ただそんな前提の入門書やサイトの存在を知らないのだが…
Accelerated C++
泥臭い部分を知らずにプログラムしたいならC++じゃなくて他の言語でいいじゃん
最先端の3Dゲームみたいに速度が命といったソフトの開発にはまだCが現役なんじゃないの?
C+のC++が使われてるんじゃね?
むしろローテクな組み込み とはいえ、もうCもさすがに減ってきたけどね
速度に関するところはDirectXとか使うから Cなんて使わないんじゃないの?
え?
標準の例外って使い分けしてる? std::exception継承した自作例外しか使ってないんだがダメかな?
intの入力値をdoubleで受けても 数値が切り捨てられることってないですよね?
intが32bitなら大丈夫
C++よりCの方が5%ほど速いらしい ゲームでは大きいかもな>5%
>>794 Cに幻想を抱いていませんか?
ソースを出そうぜ
effective c++のどっかにそれっぽいことはあったと思う。 794じゃないし、本も手元にないからこれ以上言えんけど。
>>798 あ、そうそう、effective C++に書いてあったわ
postscriptのスレってありますか
>>794 > C++よりCの方が5%ほど速いらしい
最近、久々に
Effective C++ 第3版を通読したんだけど
どこにも記述が見つからないですよ。
ん?第2版だけど、後の方じゃないか?
C++はCの機能を全部含んでるから、C++の方が遅いなんてことはありえない、なんて意見は誰も望んでいないよなー。 だとすると、C++の独自機能のうち、オーバーヘッドが大きいのはどの機能で、Cと互角orC++の方が早いくらいな機能はどの機能か? って話が知りたいわけだ。 そして、オーバーヘッドが大きい機能を極力使わないようにしたところ、どれくらいC++らしさを保てるか、奇妙な難解言語になっていないか、 ということが重要になってくるわけだ。 一般にオーバーヘッドが大きいって言われているのに、virtualメソッド、iostreamでの読み書きがある。 関数オブジェクトはコールバックとそう変わらないらしいね。 std::vectorは、固定長配列よりは遅いが、自力で(mallocやらreallocやらで)可変長配列書くよりは (優秀なプログラマなら互角に勝負できるらしいが、大多数のプログラマにとっては)早いようだ。 sizeをあらかじめ決めておき、配列形式でアクセスすると変わらんが、それだとvector使う意味が薄れる。
>>740 > 3つ目はおまけでcharを渡してる
遅レスでごめん
>ore::abs<int>('a');
'a'ってintじゃないの?
static_cast reinterpret_cast const_cast 実行時コストはまったくのゼロでいいの?
何で質問している奴がタメグチなの?
>>807 そんな質問の仕方で本当に答えがもらえると思ってるの?
はぁ?2ちゃんねるでなにいってんだ 答えられないならだまってろよカス
素敵なインターネッツ プライスレス
>>807 いずれも値のコピーをするので、最適化されなければコピーにかかる分のコストがある。
それ以外では多相ポインタに対するstatic_castはクラス階層の移動がある場合
アドレスを調整するため整数の加減算が発生する事がある。
いずれも無視できる程度だな。
空気嫁
>>813 読まなけらばならない空気などあるのでしょうか?
意地悪したかったのに助け船だしちゃったヤツが居るから とかそういうくだらない会話が繰り広げられているわけですね。
オーバーロードしたオペレータの優先順位ってどうなるんでしょうか 元の演算子の種類と同じものを受け継ぐ?
うん
#define って言語の機能として必要なの? IDEでサポートするようなものじゃないの?
>>819 > #define って言語の機能として必要なの?
> IDEでサポートするようなものじゃないの?
言語仕様にIDEを定義するつもりですか?
>>819 #define はプリプロセッサ、言語の機能というよりは単なる置き換え。
IDE に取り込むのはむずかしいでしょう。なにせ無節操。
Class instance; instance.do_something(); と Class *instance = new Class(); instance->do_something(); delete instance; の使い分けを教えてください
寿命
速度
>>822 前者は関数内でのみ有効。後者はinstance を delete するまで有効。寿命。
>>822 前者はスタック上にメモリがとられ、
後者はヒープのメモリを使う。
自信なし。
一度に確保できるメモリの大きさをコンパイルタイムorランタイムに調べる方法はありますか?
>>827 コンパイル時は無理。実行時にsize_tの最大値でmalloc()&free()してみれ
ばいい。失敗したらサイズを減らす。
DLLをregsvr32で登録したいんですが、「dll は読み込まれましたが、DllRegisterServer エントリポイントが見つかりません」と言われました。 以下を記述すれば登録できるDLLが作れますか? DllMain : DllGetClassObject : クラス ファクトリのインスタンスを作成する。前のトピックにて解説済み。 DllCanUnloadNow : DLL が安全にアンロード可能かどうかを問い合わせる。 DllRegisterServer : DLL のレジストリ エントリを作成する。 DllUnregisterServer : DLL のレジストリ エントリを削除する。 ネットで調べたんですがよく解りませんでした、DLLについて書いてある本とかHPはありませんか?
831 :
829 :2010/03/12(金) 13:59:09
スレ違いでしたのでスルーしてください、すみません
shared_ptr<int> p(new int); これのコンストラクタ内部で例外が発生したらnew intで確保したオブジェクトは回収不能ですか?
RAIIで確実にdeleteや削除子が呼ばれる。
shared_ptrの中は俺らが心配するなんぞ0x10年早い
shared_ptrのデストラクタ呼ばれないのにちゃんと指定した削除子で削除してくれるの?
つうかshared_ptr関係なく例外でリークする例じゃん
中でcatchしてdeleteしてthrowすんだよ 心配イラネ
>>832 >template<class Y> explicit shared_ptr(Y * p);
>...
>Exception safety: If an exception is thrown, delete p is called.
聞く前にドキュメントを読むべき
というか、何のためにshared_ptrを使うのかと
コンストラクタで例外投げるとリークするって信じてる人がいるね。
例外投げたらいかんのはデストラクタだけだ
ヒープに取ってるときはちょっとだけ注意が必要
引数を受け取るnewを使うときも注意が必要
引数を受け取るニュウ?
Win32コンソールアプケーションでどんなときに×ボタンを押して終了してもメモリリークしないのはなぜですか
よく計算されてるから
>>845 newの代わりにmake_sharedを使うとリークしないし速い。
make_sharedって速くなんの?中でnewしてるだけじゃなかったのか
newだとshared_ptr内でもう一回newしなくちゃならないので合計2回必要だけど、make_sharedだと1回ですむから。
>>850 shared_ptr<hoge>(new hoge);だと内部で参照カウントの領域を別にメモリ確保するが、
make_sharedだと1度のメモリ確保で両方収まる領域を用意する。
そのため、速くなると言うのは嘘とは言えない。
なるほどねぇ boostの中の人はほんとに優秀だな
目次をぱっと見た感じ、1部40章ぐらいまででいい気がする
C++は20章ぐらいまで。後半はSTLライブラリの話とかだからそこはなくてもプログラミング出来る ファイル入出力とかはSDKのほうにOSが提供してるやつがあるので 急ぐならC/C++のファイル入出力は飛ばしてもよいかも
>>856-857 ありがとうございます。急ぎはしないのでゆっくりやってきたいとおもいます。
テンプレート引数のオブジェクトがswapメンバを持ってればswap、なければstd::swapを使うように自動化することは出来ますか?
釣りじゃないのなら C++相談室スレか何かに載ってるので見てください
>>855 ここ、C言語編とか良いながらWindowsも混ざってるぞ。
gtkとかC言語で書かれているじゃん、でもC++でやるとgtkにクラスに継承関係が発生する どうやって、C言語で書かれているコードに継承関係を作ってるの?
構造体と共用体でどうじゃあこうじゃあしてポインタの縮小キャストをどうじゃあこうじゃあで構造体の先頭のメンバが決まっているからどうじゃあこうじゃあなんだよ
vtblでググれ
メモリの動的確保を何回かやったあとの メモリの開放はfree1回でいいの?
867 :
865 :2010/03/14(日) 17:24:58
>>867 じゃあ、確保した回数だけ開放しなければならないのか
int* p = new int; p = new int; p = new int; delete p; delete p; delete p; とかするなよ。 int* p0 = new int; int* p1 = new int; int* p2 = new int; delete p2; delete p1; delete p0; みたいにするんだぞ。
>>869 ありがとう
c++じゃないけどcも似たような感じでやればいいのね
yes
何もかも放り出してshared_ptr使えばいいよ
>>869 > int* p = new int;
> p = new int;
> p = new int;
> delete p;
> delete p;
> delete p;
>
> とかするなよ。
int* p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;
こうやれよ、という話かとおもた
>>847 Windowsはウィンドウ(プロセス)ごとに仮想メモリ領域を割り当てて
そのメモリ領域内で内でプログラム(アプリケーション)を実行する。
×ボタンなどで閉じる時に、ウィンドウ生成時に割り当てた
仮想メモリ領域を解放するので、アプリがメモリリークしてても
OSとしてリークしない(しにくい)仕組みになっている。
だからと言ってdeleteしなくてもいいじゃん!というわけではないよ
class A{ int x; }; class B{ int x; }; class C : public A, public B{ C(A a, B b) : A(a), B(b){} void func() { cout<<A::x; cout<<B::x; } }; この方法でクラスCのコンストラクタに クラスAのオブジェクトデータを2つ以上使うにはどうすればいいですか?
メンバ関数の戻り値にポインタを使っている場合、 deleteはどのタイミングですればいいのですか?
>>876 そのポインタが何を指しているのか分からんし、
まーーったく答えようがない。
一見するとクソ設計に読めるが、
わざとポインタを返す方法もあるし。。。
それがメンバ関数内でnewしたものならその関数を呼び出した元に責任があるだろうけど、 メンバ変数のポインタを返すようにしてるなら削除されたら困るだろうし(この設計はどうかと思うが)、 一概には言えないが、一つ言えるのは不必要になったら削除すれば良い。
879 :
876 :2010/03/14(日) 23:56:43
基本的に戻り値にポインタを使っちゃいけないんですね
わかりました
>>877-878 thx
>>879 いやむしろ積極的にポインタを返すワザもあってだな・・・
まあいっか。
>>879 Effective C++ぐらい読もうぜ。
あれを読まずしてC++を使ってもクソ設計しか書けないぞ。
それを言ってしまえば、だいたいの質問は「Effective C++読め」で済んじゃうような、、、
新規に確保されたメモリなら生ポかスマポを返す クラス内と共有してるメモリやstatic変数へのポインタならスマポかアドレスをとられないようにラップしたポインタもどきを返す
effective C++むずい(´・ω・`)
プログラミングの本って、超簡単なのと難しいのしか無いよね 中級者へのステップアップが難しい
>>882 済んじゃって悪くないだろ。
名著の誉れ高い本なんだし。
別に俺はこのスレで答え教えることを否定したい訳じゃ無いが。
せっかくwebで議論の場があるのに、本を紹介して終わりってのもさびしいやね 実装方法を質問したつもりなんだけど、boostでおk、の一言がかえってきた時の脱力感はまったく嫌なものだよ
>>875 それは継承では無理
包含(コンポジション)を使え
private変数の出力にはメンバ関数を用意する
C#ではメソッドで return new string[] {"ahya", "hoge", "haya-n"}; みたいに配列をreturnすることができるわけだけど C++は全く同じことってできたっけ?
全く同じは無理だ。 std::vector と boost::fusion::make_vector() あたりで代用してくれ。
関数を表示させるプログラムを作ってるのですが 次のようにしてもとびとびの値しか表示できません こういうときはどうすればよいのでしょうか? 最終的には直線を複素変換で円にして表示するところまで作るのが目標ですが それ以前のところで躓いてしまいました int f(int x){return 5*x;} int g(int y){return y/5;} //逆関数も試してみた //x,yは画面の幅と高さの分だけループ。描画はwinapiを使ってます void draw(int x,int y,HDC& hdc){ SetPixel(hdc,x,f(x),RGB(0,0,0)); // SetPixel(hdc,f(y),y,RGB(0,0,0)); }
すいません、↑については自己解決しました 逆関数のほうは単にg(y)とすべきところをf(y)としてしまっていただけでした
DirectXを使ってゲーム作っているのですが、カメラをマウスの移動方向で回転させたいと思っています。 DirectXInputを使わずにやろうと思い、次のようなソースを書いたのですが、カーソルの右と上への移動が過度にされ、 左と下への移動があまりうまく判定されません。どのように改善したらよいでしょうか。 POINT pos;//現在のマウス位置 POINT poso;//マウス左ボタンを押した位置 case WM_LBUTTONDOWN: if(!isMouseDown){ poso.x=LOWORD(lParam);//マウス左ボタンを押した位置セット poso.y=HIWORD(lParam); } isMouseDown=TRUE; break; case WM_LBUTTONUP: isMouseDown=FALSE; break; case WM_MOUSEMOVE: if(!isMouseDown)return 0; pos.x-=poso.x;//差でマウスの移動方向を判定 pos.y-=poso.y; if(pos.x<0)(回転角変更処理) else if(pos.x>0)(回転角変更処理) if(pos.y<0)(回転角変更処理) else if(pos.y>0)(回転角変更処理) poso.x=pos.x;//動かすたびに移動方向を判定できるようリセット poso.y=pos.y; break; while( msg.message!=WM_QUIT )// メッセージループ { if(isMouseDown)GetCursorPos( &pos ); }
>>890 おお!fusion渡しか。それいいね。ヒープも使わずスタックに積んで高速ときたか。最適化も効きそうだな。
それはいいテクニックだな。使わせてもらうよ。
>>893 pos -= poso をしたらposは「現在の位置」ではなく「移動量」になる。
移動量のローカル変数を作るのがいいのでは。
posoをMOUSEMOVEで更新するとposoは「左ボタンを押した位置」ではなくなる。
現在の位置で更新すると「前回の位置」になるが、
a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが、
そうでないならposoはBUTTONDOWN時にセットするだけでおk。
int d[10][10]={/* */}; これの最初のデータを参照で受ける方法がわからないんですが 文法的にどう書けばよいんでしょうか? 思いつくのを適当に試したんですがコンパイルできません int *&a=d[0]; int &a[10]=d[0]; int &[10]a=d[0]; int &a[]=d[0];
typedef int impo; impo d[20][10]; impo (&a)[10] = d[0]; typedef int impo_10[10]; impo_10 &b = d[0];
2次元配列なんだから右辺がおかしい
int *a = d[0]; int (*a)[10] = d;
うまくいきました。ありがとうございます
1aだとかbeafだとかcafeといった16進数を scanfかcinで整数値として読み込む方法はありますか
すいません、自己解決しました cin >> setbase(16) >> a;
strrchr(str, c);のp-strの数字をint aに代入したいのですが a=*(p-hikaku);では駄目でした。初歩だと思いますがどう記述すれば良いのでしょう?
904 :
893 :2010/03/16(火) 23:43:25
八百九十三です。(や○ざじゃないヨ) ifのところを引き算して判定から単純に>と<による大きさの判定をしたところ、 意図したとおりの結果が得られました。 >a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが その後おっしゃっている通り「移動する時に経路によって回転具合が変わる」ようにしたかったので、 このようにいたしました。 どうもお世話になりました。ありがとうございました。
a = p - str;
>903が何を言いたいのかよく判るな。 strchr(str, c);のp-strってなんだよpgr
この程度推測できないでよくここに書き込めるなw
>>903 のコードは大体こんなのだと思うんだけど、 hikaku がわかんね。
char str[] = "abcdef";
char c = 'e';
char* p = strrchr(str, c);
int a = -1;
if(p){ a = p - str; }
>>903 a=*(p-hikaku);では無くa=*(p - str);でした。
ネットとコードからコピペしたせいで間違えてしまいました、すみません。
a = p - str; できました、ありがとうございます。
>>906 お前 C のプログラム書いたことないのか????
どこで質問すればよいのか分からなかったのでここで、質問させていただきます。 "Windows Update"の"更新履歴の表示"で表示される更新プログラム(KB******と表示される箇所)のリストを取得する 方法をご存知でしたら教えていただけないでしょうか? 社内で指定されたセキュリティ更新のパッチが当てられているかをチェックするツールを作成するのが目的です。 開発環境はVisualStudio2008 C++(MFC) Windows XPとVistaで上記のリストを取得する必要があります。
913 :
911 :2010/03/17(水) 17:09:20
>>912 ありがとうございます。
"更新プログラム"の行を解析して実現できそうです。
本当に助かりましたm(_ _)m
よく関数の宣言に int geometryOutputVertexCount () const みたいにお尻に"const"をつけてるケースをまま見るんですがこれなんなんですか(´・ω・`)?
このメンバ関数はconstだぜ (オジェクトの内部状態を変えないぜ)
std::mapを利用してデータテーブルを作成したいのですが mapを要素にもつ配列を利用して二次元配列的にするか mapのkeyを行数*最大列数+列番号として直線的に二次元配列を表現するのではどちらが効率的でしょうか?
インデックスが整数、整数なら普通の配列でいいじゃん
たとえばint型の二次元配列を実装するとき 空白のfieldと0を明確に区別したいのでmapを利用しようと考えました
>>915 それは変数をstaticで宣言するのと何が違うんですか?
↑失礼。間違えました × それは変数をstaticで宣言するのと何が違うんですか? ○ それは変数をconstで宣言するのと何が違うんですか?
>>920 constオブジェクトはconstなメソッドしか呼べない。
constでないオブジェクトはconstでないメソッドを呼べる。
constなメンバ変数を持つconstオブジェクトはconstなメソッドしか呼べない。
constなメンバ変数を持つconstでないオブジェクトはconstでないメソッドも呼べる。
>>920 変数がconstだとその変数の値は変えられません。
メンバ関数がconstだとそのメンバ関数ではインスタンスの状態を変えられません。
constは変わらないではなく変えられないというのが微妙なポイントだね。
>>918 map< pair<int, int> >でいいよ
>>918 こうすると値と空白を区別できる配列が作れる。
#include <boost/optional.hpp>
#include <iostream>
void func(const boost::optional<int>& Val)
{
if(Val)
std::cout<<"Value="<<*Val<<std::endl;
else
std::cout<<"space"<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::optional<int> a[100][100];
a[10][10]=333;
func(a[10][10]); // 333が出力される。
func(a[11][12]); // 値が設定されていないのでspaceが出力される。
return 0;
}
>>925 補足
もちろん0でも
a[10][10]=0;
とすればもちろんvalue=0と表示されて空白と区別できるよ。
テキストファイルを処理するプログラムを書いていたのですが わからないことがあったので教えてください。 一つのクラスの中で、ifstreamでファイルを読み込み、処理してから コンソールに結果を表示するまでを行っているのですが、 クラスの宣言の時に、ifstreamの宣言をpublicにすると クラスが終わらなくなりました。 ifstreamはpublicにしてたのは単なるミスで、全然privateでいいのですが なぜ終わらなくなったのかが理解できません。教えてください。 クラスが終わらなくなったっていうのは int myclass(){ //ここでクラスを呼ぶ return 0; } int main(){ myclass(); cout << "main end"; return 0; } とすると、処理は終わって結果が表示された後、 main endが表示されずにプログラムが終わらない状態です。 処理中のメンバ関数はすべて動いていました。 ifstreamはちゃんとデストラクタでcloseしてます。
アクセス指定を変えただけで挙動まで変わるなんて、普通はありえん。 publicは関係なくて、メンバ変数の宣言順が変わったせいじゃないのか? ていうか「ifstreamの宣言をpublicにする」てどういう意味だ?
「クラスが終わらない」って、結構斬新な表現
クラスが終わらなくなりましたってなんじゃい!
>>927 おい、ここはC/C++のスレだぞ?
どこの言語の話をなさっているのですか?
問題児がいて終わりの会が長引くんですね。分かります。
日本語をしっかり
>>927 のコードは問題なさそうだ。ただの勘違いだろう。
クラスの定義もクラスを呼ぶ(?)処理も省略されているが、
>>927 が絶対の自信を以って省略しているのだから問題ないはずだ。
たしかに。
たかしに。
たにしか。
隆史に。
仕方にーやつらだ
フックう?
945 :
デフォルトの名無しさん :2010/03/19(金) 01:09:06
CでSTL相当の機能を使えるようにするフリーのライブラリはありませんか?
CSTL
947 :
デフォルトの名無しさん :2010/03/19(金) 01:22:30
thx
.c ----------- char *p; char *r1; p=tion(URL); r1=p; MessageBox(hWnd,r1,p,MB_OK); .h ----------- char *tion(char U[]){ char a[20]="D:\\Temp"; return a; } 表示がp1、r1共に 0・になります。charの戻り値をMessageboxに表示させる方法を教えてください。 代用でグローバルアドレスにCharを入れて、戻り値はint等にする方法もあるらしいのですが、 戻り値Charの方が一般的ですよね?
>>948 char a[20]="aaaa";はポインタのコピーではなく、スタック上の配列の初期化になる。この配列は関数から返るときに無くなる。
const char* a="aaa";とすると、グローバル上のリテラルのポインタが得られる。
950 :
948 :2010/03/19(金) 20:57:38
>>949 関数を終了したときに変数はスタックから消えてしまうのですね
static char a[20]="aaaa";
char* a="aaa";
できました、ありがとうございます。
>>948 char* a = "abc" はコードのどっかに存在する "abc" リテラルへのアドレスを示すから戻り値は有効
ただし、戻り値に書き込みを行なうと例外を生じるから
const char* tion( char* U )
{
char* a = "abc";
return a;
}
とすべき、tion() 内に静的領域を配置して変更可能なトリッキーなコードを書きたいなら
char* tion( char* U )
{
static char a[20] = "abc";
return a;
}
この場合、a はヒープ上の領域だから 20Byte までなら書き込んでも良い、まぁこんな用途は普通無いけど
952 :
948 :2010/03/19(金) 21:23:25
>>951 950の10秒後に理解不足を補足した内容まで教えて頂けるとは感激しました。
ありがとうございます!
953 :
951 :2010/03/20(土) 00:05:10
>>952 10秒後にレスできると思うか?タイミングは偶然だ
>>954 お前はエスパーなのか?羨ましいぞ
競馬で稼げるんだろうな...
956 :
954 :2010/03/20(土) 00:29:11
>>955 そしたらC/C++言語なんて、いやコーダなんてやめちまってもいいんだろうな。。。
func(int x1, int y1, 〜); って感じで同じ型の引数がもりもり続くんだけど、型を省略する文法とかないの?
958 :
デフォルトの名無しさん :2010/03/20(土) 00:37:32
func(int x1, ...);
そんなとこで省略したくなるとかwww
>>957 関数のプロトタイプ宣言なら、Cならint func();でOK。
構造体にまとめろよ
962 :
デフォルトの名無しさん :2010/03/20(土) 00:42:23
同じ型で固定長なら配列でいいだろ。 func(int x[500]);
>>957 関数を先書いてそれをコピペして ; 付けろよ
俺はいつもそうしてる
そういえば、K&R時代は省略できたな foo(x, y, z, s, t, u, p, q, r, たくさん) int x, y, z, s, t, u, p, q, r, たくさん; { /* something */ return expression; } みたいに
>>964 その例なら、
foo(x, y, z, s, t, u, p, q, r, たくさん)
{
/* something */
return expression;
}
でOKだ。
STLで質問なんですが 今までずっと map<int,int> v; if(v.count(3)==0){v.insert(make_pair(3,3));} みたいにやってたんですが if(!v[3]){v[3]=3;} cout << v[3] << endl; こんなのでも動きます これって問題ないんですかね? なんかすごい冗長な書き方をしてきたのかもしれない
普通findじゃねぇの countなんてmultimapしか使わないと思ってた
v[3]に要素が無かった状態で if (!v[3]) が実行されると v[3] = int(); と同様の処理が起こり、vの要素数が増えるわけだが それで良いなら。
>>967 なるほど
自分はsetでもcountを多用しますが
findのほうが王道なんですかね
>>968 わかりやすい解説ありがとうございます
すぐに代入するつもりなのでそこは問題ないです。
ただ、若干速度は落ちるかもしれないってことですね
速度というよりチェックするつもりの処理で要素増えちゃうけどいいの?
map<int,int> v; cout << v.size() << endl; if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;} cout << v.size() << endl; if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;} cout << v.size() << endl; 試してみたけど、やっぱりだめかもしれない これはなんたる副作用 気をつけます
mapなのにv
末尾への追加 > シーケンシャルアクセス > 探索 > コンテナ内の要素の交換 > 削除 > 挿入 この順番の頻度で操作が行われる場合に最も適したSTLのコンテナはvectorでしょうか? mapで要素の追加順にアクセス出来ればそっちの方がいいような気もしますが、出来ますか?
>>973 探索と順序が両方欲しい欲張りなあなたには、boost::multi_indexを紹介しよう。
STLのコンテナ
>>973 とりあえずvectorで作れ。
setなりmapなりに切り替えるのは、実際にボトルネックが発生してからでいい。
あとmapは追加順を覚えないから、必要ならmapとvectorを併用するとかで対応。
それかboost入れて
>>974
977 :
デフォルトの名無しさん :2010/03/21(日) 17:45:28
Linuxで使えるおすすめのC++のIDEありますか?
qt creator
Qt Creator いいね、何気に。
あれはQtアプリを作るためだろ
>>977 が聞いてるのは「C++の」IDEだ
eclipseでいいんじゃね
>>981 eclipseってintelC++とかデバッガとか使える?あ、windowsで。
そもそもVtuneがEclipseベースの気がする。
985 :
デフォルトの名無しさん :2010/03/21(日) 21:55:00
>>977 Visual C++ Express Edition 2008
986 :
デフォルトの名無しさん :2010/03/22(月) 04:39:01
WindowsでCPU名を取得する方法を教えてくれろ
Cのfizzbuzzって、結局何バイトが最短だったの?
4dmに73バイトのがのってる
73バイトか・・・自分のより10バイト以上短いのか・・・
990 :
973 :2010/03/22(月) 15:18:31
悩みに悩んで今更EffectiveSTLを買ってみた。 もっと早くに買っておけば良かったと後悔しきり、、、
他の人が作ったdllで圧縮や解凍をさせていただいているんですが そのソフト配布する場合気をつけなければいけないことはありますか? このdllは〇〇に著作権があります と書くだけで配布できるんでしょうか? 一応フリーウェアとは書いてあるんですけど
ライセンス嫁
英語なんでわかりません
>>993 一般論でどうこう言える問題じゃないんで、自分で読んで
判断できなかったら使わない方が無難。
996 :
デフォルトの名無しさん :2010/03/22(月) 21:42:52
boostのshared_ptrが入ったクラスを作るとします。 class TestClass{ private: boost::shared_ptr<int> hoge; }; これで void main(){ TestClass a; TestClass b = a; とした場合、デフォルトのコピーコンストラクタが呼ばれると思われますが、shared_ptrはどのようにコピーされるのでしょうか? 初心者の質問ですみません。
997 :
991 :2010/03/22(月) 21:48:51
そうかー一概に言えることじゃないのね ライセンスとかよくわかりませんが unrar.dllです。利用するためのサンプルソースもついてて わかりやすいからこれにしようと思ったんだけど
>>996 hogeが掴んでいるインスタンスがa.hogeとb.hogeで共有される。hogeの指す実体コピーはされない。
>>997 > ライセンスとかよくわかりませんが
おいおい・・・。
おどかすようだが、(まあおどかしておくと)
下手打つと訴訟物だぞ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。