【初心者歓迎】C/C++室 Ver.59【環境依存OK】
1 :
デフォルトの名無しさん :
2008/03/30(日) 01:50:26
____ ,. -‐''"7__,,..-─ァ |::::::`/ /-‐─-='、> ,、 `ヽ/ `>/ ) ヽ.>|_ヽ/| _,,..-‐'"´ヽ. |/ < ´) Y--‐`''"´:::::::::::::::::/i__,,.. - 、 /| `> 、_) | ̄V::::::::: , 、::::::::::::\| ヽ、,.ノ /::::| < l ) ./___∧::::::くH\:::::::/|-‐'" l__,∧ \ ,イ:;:-‐‐-、__,,.ヽ-、, >:::\|´"'' ー、'"`ヽ /:::::ヽ、 __,>ー-‐<__フ r'´ i:::::::/| | ノ  ̄ ̄ヽ、 ー‐-‐< !、 ゝ__,,..-<::::::\/___,,..-‐''" `ヽr-、..,,_____,,.>フ` ̄|´ヽ. ヽ:/ く/ /| | \/ \/ _____ ___ ____ ___ ___ / ____/ /´ ̄| / ̄l /´ ̄/ /___/ /____/ l ̄l / ̄/ /___/ /__ \ / / .  ̄ ̄  ̄  ̄ ̄ ___  ̄  ̄ ___ / / \ \_l ̄/ /´ ̄ ̄ | /´ ̄ ∨ ̄ ̄/ / __/ / ̄/ / ̄/ | ̄∨ ̄/ / __/ / ̄ ̄ / \_ / / / ̄| | / /l /| / / /___ / /_/ / | / / /___ / /\ \ / / /__/ |_|/,_,/ |,_,/ |,_/ /___/ /____/ | __/ /___/ /_/ \ \ . / / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ \ \  ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄
し、死んでる・・・
(・ω・`)乙 ←ポニーテール
5 :
デフォルトの名無しさん :2008/03/30(日) 03:00:43
正直、番号なんてどうでもいいよな。
Ver+=9になっとるがな。
>>1 乙
GUIアプリ作りたいけど……中々そこまで勉強が進まない。
delphiとかrubyの方がいいんでしょうかな。
>>1 乙だけど次は54くらいに戻そうぜ もしくは60-6あたりで。
>>7 楽にやるならGUIでrubyは無い気がするが…
delphiは少し古くなってきているのでC#あたりがおすすめ
10 :
1 :2008/03/30(日) 09:29:03
ごめん、こんなに大変なことになるとは… 軽い気持ちで59にしてしまったばかりに、、、、 俺がこのスレの最後にまた出てきて責任をもって次はVer 53を立てろと言うよ。
大丈夫。バージョンなんてただの飾りです。
大変なことにはなってないから、気にすんなw
もしくは59にたどり着くまで保守してくれればおkwww
>>8 thx。そうか、delphiは古いか。
やっぱスタジオゲットしたほうがいいな。
C++で、演算子の多重定義というところの問題で詰まってます 「operatorを使って、++x、x++をクラス型のオブジェクトに適用できるようにしました では、前置演算子関数から後置演算子関数を呼び出すか、またはその逆にして、スマートにしたものを作れ」 という問題です メインのプログラムで呼び出すときに ++x は x..operator++() x++ は x..operator++(0) と解釈されるとあります しかし、前置関数、後置関数の区別の方法がどうにも理解できません 前置に後置を入れると、そもそも引数を受け取らない関数から、どうやって受け取る関数を実行させるのか またはその逆がどうやったらできるのか 実際に思いついたのはこんなものです Counter& operator++() { Counter x = *this; if(cnt < UINT_MAX) cnt++; if(t != 0) { Counter y; y = x; *this = y; } return *this; } 関数を呼び出してないし、実際にコンパイルしてみると、左辺値が必要というエラーで失敗します 解法をおしえていただけないでしょうか
tってなんだよ
いきなり答えを出していいのか。 前置インクリメントは普通に定義した上で、 こういう風に前置インクリメントを使う後置インクリメント演算子関数をクラスのメンバとして作る。 無理にメンバにする必要もないけど。 Counter operator ++(int) { Counter x = *this; ++*this; return x; }
>>16 いや引数をどうにかしようとおもって、後置で0が入れられるなら、前置は何も入らない!とおもってやった名残です
つまり消し忘れなのです
>>17 *thisの++がoperator++()ということですかなるほど
実行できました
ありがとうございました
19 :
デフォルトの名無しさん :2008/03/30(日) 17:08:48
C++ で2次元配列へのポインタ返したいときにどういう風に記述すればいいのでしょうか。 例えば、以下の関数で???の部分はどのような記述になりますか。 ??? getArray(){ const int ary[ ][5] = { {1, 1, 1, 1, 1 }, {1, 1, 1, 1, 1 }, {1, 1, 1, 1, 1 }, {1, 1, 1, 1, 1 }, {1, 1, 1, 1, 1 } }; return ary; } また受けて側では どのように取得すればいいのでしょうか。
>>19 ・配列を返すことはできない。
・ローカル変数のアドレスを返すことはできない。
従って、こんなもんかな。
const int (* getArray())[5]
{
static const int ary[ ][5] = {
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 }
};
return ary;
}
int main()
{
const int (* a)[5] = getArray();
return 0;
}
尤も、これが正解かどうかは別の問題。
21 :
19 :2008/03/30(日) 17:26:25
>>20 ありがとうございます。
実は実際のソースでは、2次元配列はクラスのprivate static const なメンバ変数なのですが
クラスの外からアクセサを使ってアクセスしたいのです。
その場合の記述も上記のようなものになるのでしょうか。
だったら参照でいいんでない?
23 :
19 :2008/03/30(日) 17:48:38
>>22 すいません。2次元配列への参照を戻す関数の宣言は
どのように書けばいいでしょうか?
24 :
デフォルトの名無しさん :2008/03/30(日) 17:49:30
こんばんは。今月、C++を始めたばかりの初心者です。 お勧めの入門書・参考書があれば教えてください。
>>23 const int (& getArray())[5][5] const {...; return ary;}
const int (& a)[5][5] = ....getArray();
27 :
19 :2008/03/30(日) 18:32:02
>>25 ありがとうございます。
ややこしいですね・・・
>>24 Cが理解出来ればC++は根性で分かる
クラス、派生、オーバーライド、演算子のオーバーライドとかね。
あんなもん構造体のラッパー
STL、テンプレートは知らんでも何とかなる
C++勉強中に.NetのC++をmanagedでやると
永遠に理解出来なくなると思われ。
>>30 ・・・まじ???
自称「C++得意です」なんですけど…
テンプレート自分で書くかはともかく、STL使わないC++ってもはや全く想像できないなぁ。
まあ、俺もCから移った直後は
>>29 みたいなノリだったんだけどね。
「STL? なにそれおいしいの?」「テンプレート? つかわねーよhahaha!!」って。
STLとtemplateがないC++なんぞ使いたくない
34 :
19 :2008/03/30(日) 19:19:15
わけわかめなエラーが出て困ってます。助けてください。 たとえば"error C2143: 構文エラー : ';' が '<cv-qualifer>' の前にありません"などです。 開発はVS2008で行っています。 class Map{ public: virtual const int (& getMap())[1000][1000] const = 0; }; class FirstBasement : public Map{ private: static const int floor[30][30]; public: // 地図の状態を返す virtual const int (& getMap())[30][30] const; }; const int (& FirstBasement::getMap())[30][30] const{ return FirstBasement::floor; }
>>34 constの位置が違う。
virtual const int (& getMap() const)[1000][1000] = 0;
typedef使ったりboost::multiarray使ったほうが可読性が高まると思うが
37 :
19 :2008/03/30(日) 19:29:05
>> 35 うまくいきました。ありがとうございます。 ただ配列の大きさも同じでないとオーバーライドできないのですね。
38 :
19 :2008/03/30(日) 19:31:08
>>36 boostはまだ知らないのですが、typedefはそうですね。
こういう時にこそ、使うべきですよね。勉強になります。
自分は趣味でやってるだけだけどCで書こうとするとSTLないから倍の時間がかかるよ。 C使いこなせる人尊敬するわ
CとC++の中で最も優先して勉強するのはSTLと思う
>>37 配列型は要素数が違えば別の型。
型が違えばオーバーライドにならない。
戻り型と違う型はreturnできない。
なんだか難儀しそうだね。
34なんて全然分からんw強引にキャストする所だったw
配列はついついポインタにキャストするからなぁ
>>39 Cだとクラス間の上下関係無いから、いつでもどこでも呼び出せて楽じゃない?
メンバにstaticつけた瞬間に敗北した気がする。
classやらの基本構文書いて15分、とかイライラする。
Cならいきなり呼び出せるのに、て思うとね〜
というか、Cから入ってC++使う機会が少なかったから
脳内でクラス構造が上手に作れないらしいw
STLよりANSIライブラリの方が手軽で使い易いし覚え易いし・・・
>>42 ウン百万行ってソースを担当すりゃわかるようになる。
>いつでもどこでも呼び出せて楽
楽だからスパゲッティーが生まれやすくなる。
そうだな。設計とは制限することだと言うし。
厳密にアクセスの流れを制限することが売りというか オブジェクト指向のキモというか 従来どおりにやろうとするなら単なるオーバーヘッドの増加でしかないようなw
まぁ趣味でやる程度の規模ならCでも全然問題ない気がする
29=42は超初心者
string("hagehage"); って、Cスタイルキャストですか?コンストラクタ呼んだことになってますか?
>>42 いつでもどこでも呼び出せるようにして、良いんじゃない?
俺は良いと思うよ。STLは使うことを進めるけど。
オブジェクト指向もC++で扱えるパラダイムの一つに過ぎないからね。
ラムダ万歳。
>>50 ありがとうございます。
いままで
static_cast<string>("hagehage");
って書いてたんですが、今度から
>>48 ですませることにします。
>>51 状況によるだろうけど、それ書く機会少なくない?
明示しなくても変換(コンストラクタが選択)されるよ。
void f(const std::string& s);
f("aaa"); //OK
std::string s = "aaa"; //OK
53 :
25 :2008/03/30(日) 21:03:40
>>19 ゴメン、constの付け所を間違えた。
やはりあれだな、>20が真実を語っていたな。
54 :
デフォルトの名無しさん :2008/03/30(日) 21:07:04
下の"移動アルゴリズム", "移動可能かチェック"で以下のようなエラーが出るんですが 何が悪いのでしょうか。 エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 17 RPG エラー 2 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 17 RPG エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 21 RPG エラー 4 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 21 RPG #include "Map.h" #include "EDirection.h" #include "DxLib.h" namespace hogehoge{ class MoveStrategy{ public: // 仮想デストラクタ virtual ~MoveStrategy(); // 移動アルゴリズム virtual EDirection Move(const Map& map) const = 0; protected: // 移動可能かチェック virtual bool IsMovable(const Map& map, const int& direction) const; }; }
>>52 えっと、メンバのreplace使う時とかで、リテラルの長さがほしくてstringに入れる場合、つまり
str.replace(str.find("あ"),(string("あ")).length(),string("い"));
こういう場面とか、文字列を+でつないでいく、たとえば
str = "my name is " + name + "\n"; // エラー
str = string("my name is") + name + string("\n");
こういう場面みたいな時です。
>>55 見逃してた。stringへの+も明示する必要ないから
string("\n") は "\n" だけで良いよ。
str = string() + "my name is" + name + "\n";
でもおk。
>>56 ありがとうございます。解決しました。
確かにMapがおかしかったです。
原因はMapで純粋仮想関数ではなく、ただの仮想関数を宣言していただけなのに
その定義を持っていなかったことでした。
>>57 >str = string() + "my name is" + name + "\n";
わーお(`・ω・´)いろいろありがとうございます。
>>43 ン百万行・・・
いいとこ10万行ぐらいだな、触ってたのは
ン百万のソースを触るなんてオープン系の人?(´・ω・`)??
PCアプリでン百万行たって、
モジュール化進んでるからン百万だろうが怖くないしな
名前空間なんかイラネの世界で生きて来たからな〜w
Cだとヘッダ単位でモジュール化したりするモンだが。。
規模が違うんだろうな〜〜。。。。
モジュール化?なにそれ?なスパゲッティコードを君にプレゼントしよう
規模が大きくなってくると、人員の質にバラ付きがでてくるのさ
63 :
54 :2008/03/30(日) 21:50:15
ちょっと教えてください。 以下のようなクラス宣言があります。 #include "Player.h" #include "Enemy.h" #include "Map.h" #include <vector> namespace hogehoge{ /********************************** * 概要: 地図の振る舞いを管理する * **********************************/ class Map{ public: static const int CHIP_SIZE = 15; protected: Player* player; //std::vector<Enemy> *enemy; public: // コンストラクタ Map(); //仮想デストラクタ virtual ~Map(); // 地図を表示する virtual void Display() const = 0; // 地下1階への状態を返す virtual const int (& getMap() const)[30][30] = 0; }; }
64 :
54 :2008/03/30(日) 21:51:09
この場合以下のエラーが大量に出てしまいます。 エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 17 RPG エラー 2 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 17 RPG ここから#include "Enemy.h"を取ると、エラーなくコンパイルできます。 Enemy.hは以下のようになっています。 #include "Map.h" #include "EDirection.h" #include "DxLib.h" namespace hogehoge{ class MoveStrategy{ public: // 仮想デストラクタ virtual ~MoveStrategy(); // 移動アルゴリズム virtual EDirection Move(const Map& map) const = 0; protected: // 移動可能かチェック virtual bool IsMovable(const Map& map, const int& direction) const; }; } 上のエラーはどういう意味なのでしょうか。
>>60 同じ同じ。
言語のサポートが優位な点だけど、
大枠でのプログラム層なアーキテクチャはC,C++で左右されないと思うよ。
>>54 >型指定子がありません - int と仮定しました
コンパイラ:「const Map」がよく分からないので、「const int Map」だと考えますね
>',' が '&' の前にありません
コンパイラ:「const int Map&」、なんか変数名のあとに「&」が出て来たんですけど
67 :
66 :2008/03/30(日) 22:04:46
一応補足。 2つ目のエラーは、1つ目の仮定のせいで発生してるってことね。
>>66 Map ってクラスが入れ子になってるからじゃないの?
ヘッダの相互参照になってる
enemy.h の頭に
class Map;
ての入れてコンパイル通らない?
もしくは cpp 内のみにヘッダ参照宣言入れて、ヘッダ内からの include
やめるとか
MS VC ならエラー行間違えない筈なんだけどな
すげー適当に答えてるけどw
>>61 >>62 共同作業でのプログラミング経験ほとんど無いんで〜
他人の綺麗なコードをスパゲティにした事なら何度もあります。未だバレてませんヨ、HAHAHA
69 :
54 :2008/03/30(日) 22:18:50
>> 66, 68 ありがとうございます。 class Map; class MoveStrategy{ }; class Map; class Enemy{ }; とすると、エラーはごっそり減ったのですが、まだ以下のようなエラーが残ります。 エラー 1 error C2061: 構文エラー : 識別子 'MoveStrategy' d:\root\gamecreation\rpg\enemy.h 16 RPG ヘッダの相互参照というのは #ifndef をしていたら、必ず防げるものではないのですか?
class A{ B b; }; class B{ A a; }; 要はこれと同じ状態。前方宣言でも回避できない。これも class A{ A a; }; という問題に帰着できるから分かるだろ
>>69 無理かと
#include "map.h"
#include "Enemy.h"
の2行は次の形に展開される
class Map {
... void ( Enemy *pEnemy ); <= ★注意★class Map 宣言より上に class Enemy 宣言が無い
} この時点でコンパイラは class Enemy の情報を持たないのでエラー
class Enemy {
... void ( Map *pMap );
}
となり、エラー
だから #include が展開された時に
Enemy.cpp :
class Map;
class Enemy {
... void ( Map *pMap );
}
Map.cpp :
class Enemy;
class Map {
... void ( Enemy pEnemy );
}
にするのが手っ取り早い
VC 使ってるなら #pragma once 使った方がコードスッキリするよ
ゲームのように扱うデータが多かったりすると 必然的にコード量は増えるし、オブジェクト指向も取り入れるんだろう。 制御屋だとシステムの大きさに比例してでかくなるけど 担当も細分化されて、一人で担当するところはそれほどでもないね。 安全に関わるから。
>>72 エミュレータ使ってもバグ取れないなんてザラだからねぇ・・・
ブレークポイント張りずらいし
組込み系だとC++コンパイラが無いこと多い
ミドルウェアでC以外のもの見た事ないし。
linuxのほとんどのコアソースがCでなのも傍証してる(ソースが古いのも一因)
gccだけはブレークかけても、どこがバグなのかさっぱり分からん(´・ω・`;;;)
モジュール化の概念はドコ行っても同じかも
最近は組み込みもC++にシフトしてるよ 例外とかメモリ確保とか制限は多いけど
75 :
54 :2008/03/30(日) 22:43:31
>>70 , 71
一応上のエラーは,これも class MoveStrategy; を追加することで消えました。
有益な情報ありがとうございます。
この問題に関して不案内なところがあるので、もう少し勉強してみます。
>C++コンパイラが無いこと そこでcfrontですよ
日立のやつはC++使えるよね PCみたいにはいかないけど。
組込みでmallocに頼るのがどうも・・・ 1週間後にフリーズ>再起動したら直りました、で 原因がmallocじゃどうにもならないしな〜。 RAMの必要量が予想出来ないしなぁ。。。 C++の展開命令見ると何書いてあるか分からないしなぁ Cならまだしも。
Templateの諸機能が動的に実装してある
すみません。質問させて下さい。XP+VC++ 9.0です 【やりたいこと】 データファイルを読み込んで、ダイクストラ法を使って最短ルートを求める 【条件】 ノードは可変数個、コストは全て正の値、スタートノード及びゴールノードは dijkstra.exe -start_node -goal_node のようにプログラム開始時に与える。 【何が分からないのか】 可変数個のノードや、エッジがどのノードに向かって延びているか、 かかるコストはいくらか等のデータをどのようにデータファイルに格納するか、データファイルの構造決定。 データファイルの構造が決定したとして、どのように可変数個のデータを読み込むか、 どうやってデータの終わりを探すか。ファイルからデータを読み込んだとして、データの整合性を どのように検証するか。 分からないことばかりですが、誰かヒントだけでも教えて下さい。宜しくお願いします。
>>19 亀レスだけど、typedefするのも1つの手。
typedef int IA_5[5];
IA_5 array[3] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; // == array[3][5]
IA_5* func(){ return array; }
int main()
{
IA_5* p = func();
for(int i = 0; i < 3; ++i){
for(int j = 0; j < 5; ++j) cout << p[i][j] << " ";
cout << endl;
}
return 0;
}
>>80 可変個のデータ読み込みは、非常に基礎的で、ダイクストラ法と関係ないですよ
それをまず出来るようになって下さい
>>80 C++でも良いんですか? もし良ければSTLを使ってノードを管理すると簡単と思います
>>82-83 レスありがとうございます。私の修行が足りないようで、お恥ずかしい限りです。
勉強して理解を深めてからもう一度出直してきます。スレ汚してすみませんでした。
すこし作ったよ #include <vector> #include <iostream> #include <set> using namespace std; class node { public: unsigned int dis,ver; node(){ ver=dis=-1;} node(unsigned int i, unsigned int d){ dis=d; ver=i; } bool operator < (const node &x) const { return (dis<x.dis); } }; typedef set<node> vertex; main(){ vector< vertex > g; //グラフの定義 g.push_back(vertex()); //頂点追加 g[0].insert(node(1,3)); //辺と距離の追加 g[0].insert(node(2,5)); g[0].insert(node(3,2)); vertex::iterator p=g[0].begin(); cout<<(p->ver); // 最も短い距離の頂点を出力 }
86 :
デフォルトの名無しさん :2008/03/31(月) 11:15:09
VC++2008EEで勉強中なのですが、 いろんなサイトの見よう見まねで下記ソースを試してみたところ ビルドして一瞬ウィンドウが出て終わってしまいます。 これはreturn 0のせいかと思って、return 0を消しても やはり一瞬で終わってしまいます。 どうすれば終了しないでコマンドプロンプトのような画面で 文字が確認できるようになるのでしょうか。 #include <iostream> int main(void){ using std::cout; using std::endl; int a; int &alias = a; alias = 100; cout << "a = " << a <<endl; cout << "alias = " << alias <<endl; return 0; }
getchar(); return 0;
>>87 ありがとうございます!ようやく確認できるようになりました。
キーボード入力待機状態にして止めるんですね。
勉強になりました。
Ctrl + F5
>>89 デバッグなしでビルドというのでも止まるんですね。
ありがとうございます。
C言語はいろいろ解らないことばかりで非常に助かります。
>>90 それらはCの知識ではない。Windowsの使い方の知識とVisualStudioの使い方の知識だ。
95 :
デフォルトの名無しさん :2008/03/31(月) 14:13:24
もうアパートを探すのはつかれたよ。 はやくプログラミングしたいよ。
int *n; *n = 5; /* ポインタ変数nに値5を代入 */ 初期化もポイントする先も決めてないポインタをそのまま使うのって非常に不味いよねぇ 自分ははじめにポインタの初期化を必ずするよう教わったがなぁ
>>96 >>97 あー、前スレで話題になった奴か。
エピステーメーにまで指摘されていたのに未だに記事の修正が入らないのね。
編集がコメントなにやらゴミを書いているけどそんなものは記事の修正とは認められないし。
この程度のコメントじゃZDNETとしても著者としても痛くも痒くもないのでしょ。
どうなるか、サンプルソースをコンパイルして実行してみたら思った通り以上終了w フォールト ->00401007 c70005000000 mov dword ptr [eax],0x5 ds:0023:00000001=???????? だってさ。 *n = 5: の部分かな。エラーがソース乗せちゃまずいでしょw
× エラーがソース乗せちゃまずいでしょw ○ エラーがでるソース乗せちゃまずいでしょw
>>101 コンパイラにもよるんじゃね?
いや、試してないけど
見てないけどエラーを修正しなさいって問題なんだろ
あんまり往生際悪いんで吹いたww
「動くけど危険」とかいう話じゃなくて「動かない」コードだろ、これは
>>101 必ずしも 異常 終了するとは限らない
ポインタの指す先による
>>106 場合によっては動くコード
最適化をオフにして次のコードを実行すると… 勘弁してほしいタイプのバグ #include<stdio.h> void hoge(void){ static int a=5; int *n=&a; printf("a=%d\n", a); } void huga(void){ int *n; *n=100; } int main(void){ hoge(); huga(); hoge(); return 0; }
109 :
99 :2008/03/31(月) 15:13:55
>>101 落ち着け。「以上終了」になっているぞw
>>100 勘弁してくれ。一緒にされたらそれはそれで迷惑だ。
もし私がエピたんなら、自分のブログでネタにしているよ。
いや、それだと本人が書いていたら拙いな。
……と思って検索したら、やっぱり書いていたかw
で、ついでにうろついたらまぁ、他にも釣れた罠。
επιστημηってプログラム系の掲示板でよく見かけるけどなんの人なの?
掲示板でよく見かけるヤツは偽者 自称C++のちょっと偉い人
C++の黎明期からC++に関わってきた人。 かといって、C++の隅から隅まで知っているわけではなくて、 Boostのコミッタというわけでもなくて、 意外に中途半端な立ち位置な気がするお人。 でも、俺より知識も経験もあるのは確実。
魚拓とっておこうと思ったら既に3つも取られてたw
エイプリルフールは明日だ
なんか冒頭に追記が > 現在、本稿には技術的観点から異議が多数寄せられているため、詳細をレビュー中です。 > 初めてご覧になる方は、コメント欄もあわせてお読み下さい。 > また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。 そんな大層なレベルの話なのか…?
>現在、本稿には技術的な誤りが存在するため、詳細をレビュー中です。 >初めてご覧になる方は、コメント欄もあわせてお読み下さい。 >また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。 厳しくなったw
初心者にとってポインタの概念ってそんなに躓きやすい物なのか? ポインタの基本的な部分で苦労したことがないのでそこら辺が不思議だ
>>94 おい。間違えて「記事推薦者になる」ってとこクリックしちまったぞ。
どうやって取り消すんだ。おい。教えろ。
>>117 昔教える立場にあったことがあるが、何でかしらんが分かる奴と分からん奴がいて、
分からん奴はいくら教えてもなかなか理解してくれん。
メモリってのがリニアな空間で位置や距離の概念があることを理解できないらしい。
番地とか分かりやすいものに例えればいいんじゃね?
>>117 俺もそうだけど、アセンブラから入ると、「ポインタが分からない」と言う人がどう分からないのか分からない
新人に教えるときなんかにとても苦労する
変数:戸棚 値:ケーキ ポインタ:「戸棚にケーキがあります」という母ちゃんの置き手紙
>>123 戸棚の場所が書いてあるメモ、なんじゃね?
変数: 箱や器のようなもの 値: 箱にいれる何か ポインタ: 箱が置いてある場所を書いてあるメモ みたいな解釈でいいんだろうか? ポインタを正しく理解できてるか自分でもよくわからん。
ケーキを食った後置き手紙を始末しないと後の人が迷惑するという話か
128 :
99 :2008/03/31(月) 16:31:08
いや、置き手紙はそのままで戸棚に「中身は俺の腹の中」って書いておくんだろ。
JAVAの本を書いている人みたいだけど、 これほどポインタの概念がわかってなくても 使えるのか、JAVAって。 ある意味うらやましいかも。
>>128 そして後から置き手紙を読んだワカメが大激怒
>>129 でも、ポインタも理解できないような人が書いたJavaのコードって、やっぱりどこか危なげなんじゃないかね
>>130 Access Violationのメッセージボックスのアイコンに、ワカメの顔が表示されるとこ想像した。
>>129 それらの本も、もしかすると同じようにでたらめな知識に基づいて書いてるんじゃないかと疑わざるを得ない気がする。
>>131 参照がBoostのスマートポインタと同じようなもので
理解できない人は怪しいコードいっぱい書くことに
(Javaの)参照がBoostのスマートポインタと同じようなものってこと? なんで*Boostの*って制限を設けるか理解しかねるけど、 Javaの参照はポインタそのものと同じようなもので、 それに加えて参照されなくなってからは回収される可能性があるだけ。 C++でのスマートポインタはローカルに限れば基本的にスコープを抜けた時点で回収されるから、 JavaのGCとは少し違う。
自分の知らないところでチョコチョコされる行動まで把握しないといけないのは面倒だが かといって自分で何もかも把握して処理するのも面倒 なかなかバランスが難しいのねぇ
個人的にはRAIIは気に入ってるというか、いい方法だと思うんだけどなぁ。 もっとC++成分を取り入れたJavaライクな言語とかあればうれしいんだけど。
それならDを試してみてはどうだろう。
139 :
デフォルトの名無しさん :2008/03/31(月) 19:35:48
Dは頭の悪そうな言語名だから使いたくない。
頭の悪い人程そういうことを気にするもんだな。
141 :
デフォルトの名無しさん :2008/03/31(月) 19:39:18
予想通りのレスだな。
D は使って欲しかったらまず言語仕様を安定させて欲しい。
python + cpp + java = D (という予定)
C++にもっさり毛が生えたのがD
D1.0は仕様確定したよ。
2.0 へ移行することになったときに 仕様が違いすぎて大変なので面倒くさい。
>>126 違うよ。
値は数値とか文字列とかの事で、変数は値につける名札で、ポインタは値がアドレスの変数の事だよ。
>>148 エロ本が変数で、収録されてる写真が値
ポインタはエロ本という変数で(便宜上*がついてる、というかポインタであることの証)、そのポインタの値はページ数
ってな理解でいいの?
エロ本は型で、デラベッピンが変数じゃね
デラベッピンはエロ本の派生クラスだ。
エロ本が概念でデラベッピンが型だろう
確かに
お前らw
よりによってでらべっぴんを用いるところに何らかの意図を感じる
エロ本としてではなく美術書として扱う場合、これは派生なの?
それは扱う側が決めることだろ どう使われようがしったこっちゃない
>>156 インターフェースとして定義したクラスを継承
>>149 >エロ本が変数で、収録されてる写真が値
この解釈だとエロ本はunionの配列で、ページ数は配列のindex。
本人? コメント欄の通り
それは4/1のために用意された記事だからあまり真に受けないほうがいい。
>>160 >このサイトのドコがおかしいのでしょうか?
殆ど全て。
サイトってw 普通に「記事」とか言えよ 安っぽい釣り針だな
碌に査読もせずにほいほい載せちゃうようなサイトだからな。何かおかしいだろ。
嘘を嘘と
編集がコメントで悪足掻きしたり、著者の有り得ないコメントを代理掲載しているくらいだからね。
記事のサブタイトルが「変数の場所(アドレス)」に変わったw
推薦増えすぎw
一ページ目は修正掛かったようだけど、日本語が破綻している。 >ポインタ変数を定義するには、通常の型の場合とは異なり、型名の後ろに * がつけられる。 よくあるダメドキュメントのパターンである、主語と述語の関係が狂ってしまっている。 この文章は誰の手によるものだろうか。筆者? 編集? レビュアー? いっそ企画から遣り直しては如何だろうか。
俺が筆者ならしばらくは人には会いたくないだろうなw はずかしすぐるwww
「builder編集部 冨田」って人も大変だな。 しかし、事前の校正をしなかった報いだ。 この冨田って人が担当だったかどうかは知らんが。 builderの信頼性も、これで地に落ちたな(あったかどうかは不明だが)。
しかし、たったこれだけのコードの校正も出来ないってどれだけ不注意なんだ
プロのテクニカルライターだから信用してたんでしょ
かわうそうだからもうそっとしといてあげようよ
この連載、続くのか、打ち切りになるのか・・・
>>175 バンブーブレードのアニメを思い出したw
前橋さんに書いて欲しい
え、連載なの?
>>164 スミマセン『記事』でしたね。でもCあまり判らないので。。。
何の話かと思ったら、scanf()か
>>182 scanfで入力制限が出来ることを知らなかったorz
>>184 普通は、scanf()では使いにくいから、入力制限はsscanf()で使うんだけどね。
所謂入門書でその辺りにきちんと触れているものは、知る限りないね。
long float という型が無い事を言いたかったんじゃね? 日本語でおkな記事だな こんなん初心者に読ませても害にしかならないな
おれ、今までlong doubleって10バイトって思ってたよ。
long double が 12 バイトの環境は見た事無いなあ。 10 か 16 ならあるが。
sizeof(long double) 12bytes gcc (MinGW) 10bytes Borland C++ Compiler
普通の gcc だと 16 だな。
仕方ない、取り敢えず特集の全ての記事にダメ出ししてくるか。 これだけ頓珍漢な記事だらけならパーフェクトも狙えるだろw
>>196 #include <stdio.h>
int main() {
char a[10], b[10];
switch(sscanf("abc def,ghi", "%s,%s", a, b)) {
case 2:
puts("a, bともに読み込めた。");
puts(a);puts(b);
break;
case 1:
puts("aだけ読み込めた。");
puts(a);
break;
case 0:
puts("aもbも読み込めなかった。");
break;
case EOF:
puts("エラー");
}
return 0;
}
どうなるとおもう?
上と下ではどっちが速いですか? bool rb = m_map.insert(std::make_pair(key, value)).second; if(rb) { ほげほげ; } if(m_map.insert(std::make_pair(key, value)).second) { ほげほげ; }
いっしょだろ。
変数にコピーする分上が遅い。
>>197 aだけ成功
スペースの後が終端文字列になってた
下はスタックポインタの変動が一回多くなるので、極々僅かに遅くなる気も?
. 人 ( ) , '´ ̄ `ヽ / ( ( 人人) ) 最適化すれば消えるのではないかと |人| V_V|ノ ふじおかが言っている。 ノノ| |o○_⌒_○ ( エ ) . o( )o uu
>>193 でもMinGWだとこれが?→ unsigned int 0以上の整数 (0から65535)
if(!banana)と、書くのが気持ち悪いのですが、 if(true != banana)と、書くとスピードが落ちますか?
if(banana == flase)じゃないのが気持ち悪いな
うお 間違えたw
>>205 どういう意味でしょう?
MinGW でも unsigned int は 0〜4294967295 の範囲です
>>206 とりあえず
>>207 に直したとして、まず変わらん。
むしろ変わる環境があったらちょっと興味がわく。
で、速度は実測が基本。一応ね。
trueと比較するのは(速度は兎も角)確実に1ステップ無駄な処理が入る。
うそーん
>if(!banana) と、 >if(true != banana) コードの意味合いが異なる
class hoge { hoge(){←エラー rcdefault.top = 0; rcdefault.left = 0; rcdefault.buttom = 480; rcdefault.right = 640; } static const RECT rcdefault; } 性的で固定な構造体の中身はどうやって指定するの?
ピコエロス
class HOge{ static const A a; }; const RECT HOge::a = {1,2,3,4};
ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20363049,00.htm --
本来の名称は1文字のCなのだが、それだけだと分かりにくいからか、一般的にはC言語という。
--
# C言語と表記することが多いと認めるのは吝かではないが、果たして開発現場でC言語と呼ぶ輩はどれほどいるのだろうか。
--
子孫にあたるプログラム言語には、同じくオブジェクト指向が取り入れられているJavaなどがある。
--
# いつからJavaはCの子孫になったんだ?
ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20363414-2,00.htm --
しかし、前述の通り携帯電話などの機器の動作はC/C++で開発されたプログラムによって行われている。
--
# そうなんですか? 本当に?
ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20366709-2,00.htm --
floatよりもdoubleのほうが扱える数値の範囲が広くなる。そのため、floatよりもdoubleのほうが精密な値を表すことが可能になる。
--
# 「そのため」ではありません。無茶を言わんでください。
ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20366845-2,00.htm --
printf( "|%5.3f %-9.4f|", 12.34, 56.789 ); /* |12.340 56.7890 | */
--
# わざわざ初心者を混乱させなくてもいいでしょう。素直に%6.3fとしては如何?
さすがに重隅ウザイ
できました。
規格内に C 言語って記述がいくらでもあるのに・・・。
The Programming Language C
今マルチスレッドで裏で画像読み込みとかやってるんですが、 あるスレッドが専用の関数に必要な引数を渡して、要求だけ vectorにキューイングしてで出て行く、そして読み込み用のスレッドがこのvectorから メッセージを取り出して画像読み込み操作を行うという形なんですが なんかどこかで衝突?みたいなことが起こってるみたいで成功したり失敗したりです。。。 メッセージは追加時push_backで取り出し時begin()使ってます。 Javaのsynchronizedみたいに排他にするにはどうすればいいんでしょうか?
>>225 STLはひどい事にマルチスレッドに対応してない実装をコンパイラ製作側が提供しても良い仕様になってるので、
別途マルチスレッドに対応したフラグを外側から用意するなど措置をとる必要がある。
>>225 winならCriticalSectionやMutexとか。
それ以外でもならboost::threadとか。
STLportを使う
文字列を配列で宣言するのとポインタで宣言するのって何か違いがあるんでしょうか? やってること同じだと思うんですけど。
char a[]="test";とchar *b="test";のことを言ってるなら違いはある。とりあえず配列を使っておけば問題ない。
231 :
デフォルトの名無しさん :2008/04/02(水) 10:10:50
>>229 > 文字列を配列で宣言するのとポインタで宣言するのって何か違いがあるんでしょうか?
> やってること同じだと思うんですけど。
その通りやってることは同じなので、好きな方でどうぞ。
232 :
デフォルトの名無しさん :2008/04/02(水) 10:27:44
はじめまして。 VBを今週から始めた初心者です。 上司に教わりながらやっていますが、全くわかりません。 とりあえず、言われた仕事が モジュール2で Public Sub 関数名() '表を追加します End Sub を作成して、モジュール1でcollで呼び出すらしいんですが 表を追加の関数がわかりません。 誰か教えて下さい。
その上司に聞けよ。 というかスレ違いだ。
落ち着け ここはC/C++スレだ
>>230 その違いについて知りたいんですが、、、メモリの問題とかですかね
236 :
デフォルトの名無しさん :2008/04/02(水) 10:33:55
232です。 申し訳ないです。 どこに書けばいいのかわからなくて。。。
それすら調べられないならマに向いてないから辞めた方が良い
>>226 ,227ありがとうございます。
面白そうなので自分で作ってみることにします。
239 :
デフォルトの名無しさん :2008/04/02(水) 10:49:38
そうですね。 辞めてしまいたいです。
>>239 仕事じゃなくて課題なのでは? 未経験でも出来る課題を出されたんじゃないですか?
プログラム経験はあるんですか?
文字列で受け取って自分で調べる
すいません文字列で受け取るとはどういうことでしょうか?
244 :
238 :2008/04/02(水) 12:03:36
Mutexで神速でできてしまったんだけど、ミューテックスだとどんな制限があるんでしょうか?
245 :
デフォルトの名無しさん :2008/04/02(水) 12:18:56
多重起動防止
>>244 排他処理を追加した分遅くなる。MutexよりもCriticalSectionセクションのほうが速いので用途に応じて使い分けるとよい。
ミューテックスを使うと投機実行の処理が多くなったり、より速いアクセス速度のあるキャッシュへのデータ格納最適化ができなかったりする。
>>236 EXCELにVBAのリファレンスついてないのか?
まあ該当スレは検索すればすぐ見つかるだろうけど,質問しても
やってトライ.シリーズでいいからEXCEL/VBAの参考書一冊買え
みたいな話になるだけですぞ
252 :
238 :2008/04/02(水) 15:33:58
c++ VisualStadio.net TestProgプロジェクトにあるCTestClassクラスをライブラリにしてMainProjプロジェクトで使おうとしています。 CTestClassクラスが宣言されているTestClass.h、TestClass.cpp、そしてほとんどカラのstdafx.hとstdafx.cppをビルドしてTestProg.libを作成しました。 そしてMainProjプロジェクト内のファイルにて #pragma comment(lib, "TestProg.lib") このようにライブラリの使用を宣言するまでは問題なかった(ビルド成功)のですが、CTestClassを使おうとすると宣言がされていないとエラーが出ます。 ライブラリ内のクラスを使うにはこれらに加えて何かしないといけないのでしょうか? ちなみにMainProjにTestClass.hとTestClass.cppを追加し、上記の#pragmaの代わりに #include "TestClass.h" を入れるとエラーは出ませんでした。
254 :
デフォルトの名無しさん :2008/04/02(水) 20:43:05
TestClass.hへのパスは通ってますか?
/ / / / / / / / / / / / / ,.、 ,.、 / / / / ∠二二、ヽ / / / / / ((´・ω・`)) ちょっと船の様子を見に行ってくる… / ~~:~~~〈 / / / / ノ : _,,..ゝ / / / (,,..,)二i_,∠ / /
>>253 // MainProjプロジェクトにTestProg.libとTestClass.hコピーして
#pragma comment(lib, "TestProg.lib")
#include "TestClass.h"
257 :
238 :2008/04/02(水) 21:32:33
∧_∧ ..( *) ..( )〇 なんだか胸騒ぎがする・・・。
258 :
デフォルトの名無しさん :2008/04/02(水) 21:57:43
Xcodeで開発しているのですが、 "クラス::関数()", referenced from: とエラーが出ます。 調べてもどういう意味のエラーかも分からずです。 どういう意味のエラーなんでしょうか?
>>258 エラーメッセージはそれだけじゃないでしょ。前か後にも何か書いてあるはず。
>>256 ありがとうございます。使えるようになしました。
>>254 それは何度も疑っていたので大丈夫でした。
パスが通っていないとエラーが出ますしlib自体が正常に更新されているかどうかも確認していました。
複数のサブプロジェクトでクラスを作り、メインプロジェクトでこれらをライブラリとして読み込むために試行錯誤していました。
.hと.cppをコピーしてメインプロジェクトに追加するとメインプロジェクトだけで変更が可能なのと
ファイル数が膨大になり管理がしにくくなるので改善したいと言うのが主な理由です。
今回の場合ですとMainProjプロジェクトでCTestClassクラスのメンバ変数や関数を自由に追加することが出来てしまったり
TestProgプロジェクトでCTestClassクラスを更新するとMainProjプロジェクトのTestProg.libだけでなくTestClass.hの更新も必要になってしまいます。
MainProjプロジェクトのCTestClassクラス自体に変更が加えられないような仕組みや
更新がlibだけで済むような方法は無いものなのでしょうか。
ヘッダをいじらなくて済むようにするイディオムとしてpimplが有名。 少なくともprivateメンバの変更では共有するヘッダに影響を与えないで済む。
ある型がクラス/構造体かどうか調べる方法はありますか? あと、クラスのメンバ関数を列挙する方法はありますか template<typename T> void enum_functions() { if (T::is_class()) { for (int i = 0; i < T::func_count(); ++i) { std::cout << T::func_name(i) << '\n'; } } } みたいな感じで。
>>231 嘘はいかんよ。
>>235 >char a[]="test";とchar *b="test";
*a='T'; /* OK */
a[0]='w'; /* OK */
// *b='T'; /* NG */
b=a; /* OK */
*b='T'; /* OK */
b[0]='w'; /* OK */
// a=NULL; /* どうだったっけ?*/
264 :
238 :2008/04/02(水) 23:28:59
>>262 どんな実装だよ。
せめてclass Tにしようぜ
// *b='T'; /* NG */ *b='T'; /* OK */ どっちだよ
>>261 初めて知った単語なので非常に有難いです。
結局クラスをライブラリにするのはcppファイルの中身が見えなくなるだけで(ビルドが早くなったりもしますが)
いかにヘッダ部分をcppに移せるかで使用先(メインプロジェクト)での可変性が変わると言うことでしょうか。
>>262 思い描いている形とは違うかもしれないけど、
BoostまたはTR1にType Traitsに、is_classというものがある。
かなりコンパイラを選ぶだろうけど。
さすがにメンバの列挙はない。
268 :
デフォルトの名無しさん :2008/04/02(水) 23:35:43
>>259 すいません。
"クラスA::関数()",referenced from:
クラスB::関数() in クラスB.o
symbol(s) not found
collect2:ld returned 1 exit status
とあります。
>>265 // *b='T'; /* NG */
b=a; *b='T'; /* OK */
分かりにくくてスマソ
>>268 クラスB.o の中に入っている クラスB::関数() から参照されている "ク
ラスA::関数()" というシンボルが見付かりません、
とリンカー様(ld)が怒ってらっしゃる。
つまり、クラスA::関数() をコンパイルした .o ファイルやそれが入っ
ているライブラリをコマンドラインに指定する必要がある。
271 :
デフォルトの名無しさん :2008/04/03(木) 04:53:36
文字コードの問題です。 wchar_t buff[3]; とあって SHIFT-JISで書かれたテキストから、fgetwsで読み込む事で 例えば、 「もじ」 ならば buff[0]<=も buff[1]<=じ と、入る事を望みます。 このような処理をする場合、どのようにすればいいのでしょうか? ちなみに、fgetwsで読むと、buff[0]とbuffr[1]で"も"が入ってしまいます。 fgetwsはsjisで書かれたテキストを自動で変換して読み込んでくれると聞いたのですが・・・。
あ、一応自己解決しました。 テキストを、UTF16のBOMなしにして setlocale(LC_CTYPE, "");を設定し、バイナリモードで読めばよかったんですね。 出来れば、SJISから変換されるとありがたいんですが・・・。
273 :
デフォルトの名無しさん :2008/04/03(木) 08:16:33
std::vector<int> vec; という変数があるとして、 for (int i = 0; i < vec.size(); i++) {.....} とか書くとintとunsigned intを比較してるという警告がでて嫌なのでstatic_cast<int>(vec.size()) とかやってるのですが、これもいやです。どうすればいいですか?
1.iをstd::vector<int>::size_typeにする。 2.iteratorを使う。 3.STLのアルゴリズムを使う。
276 :
デフォルトの名無しさん :2008/04/03(木) 08:51:22
ありがとうございます。 STLのアルゴリズムを使うというのは、for文の中でやりたかったことがSTLのアルゴリズムで 表現できる必要がありますよね?常にできるということではないですよね?
>>276 {...}の内容によってはちょっと面倒かも知れんので、その場合は2.かな。
279 :
デフォルトの名無しさん :2008/04/03(木) 12:04:46
class complex { public: double re; double im; }; こういうクラスがあるときに、operator>>(istream &, complex &a) を定義するとすると、 どういう風にやるのがよいでしょうか?
そんなクラスは作らずに、標準ライブラリのcomplexを使う。
281 :
デフォルトの名無しさん :2008/04/03(木) 14:05:47
windows2k MinGW を入れたいのです MinGWインストーラがネット無いので使えません ソースフォージからどれを落とせば良いでしょうか またそれは全て同じフォルダに上書きで良いでしょうか binフォルダなどかぶっているものがおおいんです 使いたいのはC、C++、SDL、OpenGLです パスは適当に通そうと思っています
282 :
デフォルトの名無しさん :2008/04/03(木) 15:08:36
専用スレで聞いた方がいいんじゃない。自分はDev C++の日本語版で入れたけど
284 :
281 :2008/04/03(木) 15:20:11
>>283 ではMinGWスレに移動したいと思います
レスdでした
C/C++ってつおいですか
BCBの__propertyはVCでも使えますか。VCで書いてみたら、色が変わったので。
288 :
デフォルトの名無しさん :2008/04/03(木) 15:54:42
MFCを使ってCMainFrameから継承されたウィンドウとCDialogから継承されたダイアログを MTI(Multiple Top Level Window)風に同時に取扱たいです。 何か参考となるキーワードやソースやwebpageを教えて頂けないでしょうか。
>>287 VC入ってるのならF1押してヘルプを見るのだ
>>288 キーワード:
モードレスダイアログ
タイマー
VCのどっとねっとでないやつでVBやC#みたいなプロパティを作るものはありますか?
292 :
288 :2008/04/03(木) 17:16:36
>>290 モードレスダイアログだとダイアログが子になってしまって、ちょっと欲しいものじゃないんです。
親子関係はなし、もしくはCMainFrameを子にしたいんです。
ATL
>>279 comlex& operator>>(istream & a)
>>292 ウィンドウ無か非表示の親からメインフレームとダイアログ作れば兄弟になる
_declspec(dllexport) こういうのって、Cの仕様なんでしょうか? それともコンパイラの方の仕様なんでしょうか? まとまった文章や文献をご存知の方がいらしゃいましたらよろしくお願いいたしますm(_ _)m
DLLはWindows用語
文献はMSDNにある
先頭にアンダースコアが2つ付いたのは 一部の組み込みマクロを除いて、他は全て処理系の拡張仕様。
302 :
300 :2008/04/03(木) 19:09:12
俺は無視か・・・。まあいいけどさ。
>>302 質問者がレス読んでから投稿ボタン押すまでに書き込むとスルーされる
アフリカではよくあること
>>302 すみません、気づきませんでした^^; ありがとうございます。
同じWindows環境でも、処理系に依存する部分は結構ありそうなので、頑張って調べてみます><
template<class T> class A{ public: void put( T t ) { std::cout << t << std::endl; } }; このようなテンプレートを用意したとして、 A<int> a; のようにintとして定義した場合に、put()にint以外の引数を 入れるとコンパイルエラーになるようにしたいんですが a.put( 1.0f ); // 例えばこの場合コンパイルエラーが出るようにしたい
A<float>().put(1.0f);
template<class T> class A{ public: template<class T2> void put( T2 t ) { BOOST_STATIC_ASSERT(boost::is_same<T, T2>::value); std::cout << t << std::endl; } };
C言語から自作したAPIを呼び出すにはどうすれば良いのでしょうか? Windows APIは、#include <windows.h>で呼び出すことができるようなのですが、 ソフトウェア屋が作ったAPIをCのソースから呼び出す方法がさっぱり。 ググっては見たのですが具体的な書き方が見つかりませんでした。 参考になるサイト、もしくはソースがあれば教えてください。
extern "C"
>>309 DLLを動的に呼び出すか、ソースなら#include ""だろ
312 :
デフォルトの名無しさん :2008/04/03(木) 22:06:51
operator<<()の定義の中で、宣言なしにwsという変数を使ってwhite spaceを読み込んでいるものをみたのですが、 これが一体なになのかわかりません。コンパイルは出来ているのでつかえるみたいなのですが、、 ググってもいいのがひっかかりません。どうか教えてください。
>>310-311 ソフトウェア屋が用意したAPI(恐らくDLL)を手元のCソースから利用したいんですが…
いまいちわからないです。C言語をやるのは初めてで。
恐らくとか言われても・・・。 .lib をリンクして提供されてるヘッダファイルインクルードすればいいだけじゃね?
LoadLibrary
>>312 空白を読み飛ばすマニピュレータのstd::ws
>>297 OS/2やTOWNS-OSでもDLLだったけど生き残ったのはWindowsだけか
OS/2はNTの元ネタみたいなもんだし
>>314 なるほど…APIを触ったことがないのでどういうものかわかりませんでした。
ライブラリと同じような扱いでインクルードできるんですね。
ありがとうございました。
OS/2 って何?そんな子はいませんでしたよ!
std::mapのinsert()で戻ってくるiteratorとboolのpairな型はどこかに定義されていないの?
323 :
デフォルトの名無しさん :2008/04/03(木) 23:43:33
c++のcomplexのoperator>>の実装を見たのですが、4+5i という複素数があったとすると、 (4,5) という文字列で入力するようになっていました。実装は()とかの括弧やコンマをみて ちゃんと処理やってたのですが、普通に考えたら、4+5iとかの文字列の入力の方が自然なような 気がするのですが、(4,5)の方がよいという理由がありますか? よろしくお願いします。
C言語が(,)の入力に対応している点 a+biはC言語が対応していない
他人の書いた CやC++ソースが大量にあったとして、 コード解析するときってどうやってる? Linux 環境で grep や vim + ctags で解析 → gdb で動作確認なんて やり方してる俺は激しく時代遅れな希ガス
326 :
デフォルトの名無しさん :2008/04/04(金) 00:51:17
>>325 動作させられるなら、動作させてみて、どの関数が一番頻繁に呼び出されてるかをみてみる。
全体の20%のコードが80%の時間を使ってるというしな。
327 :
デフォルトの名無しさん :2008/04/04(金) 01:06:04
>>324 c言語が対応してないというのは、どういう意味ですか?
scanf()で一文字づつ読み込んで解析すればできませんか?
>>327 文字列を解析すればできるよ
しかし、直接プログラム内で kansuu(x,y)とかけるのとは違う
>>327 何がいいたいのかよくわからんが・・・
>complex x = 3 + 2i;
って使い方がしたいんじゃないのか?そいつぁ無理だ。(少なくともおれの知識じゃ)
なぜそこでscanfが出てくるのがさっぱりわからんが
>complex x = "3 + 2i";
なら、実装は可能だ。
ただ、種々の書式に対応するとめんどくさそうなことこの上ない実装になりそう。
プログラム内では、(x,y)の形にするか複素数型に変換するしか無い
scanf("%d+%di", &x, &y); みたいな?w
いや、入力は文字列で扱ってるんだが、 "1+2i"じゃなくて、"(1,2)"みたいに、実装してあるのは何で? って質問だと思われw
C++標準のcomplexって使ったことないんだけどそういう仕様なの? 仕様なら仕方ないが信じがたいんだがw
C++はこうだろ? std::complex<double>(1, 3)
complexをiostreamで出力するときに、 "1+2i"じゃなくて"(1,2)"となっているのは何で? ってことだろ。
336 :
335 :2008/04/04(金) 02:12:00
× complexをiostreamで出力するときに、 ○ complexをiostreamで入出力するときに、
コピペして使えるようにじゃね?
338 :
デフォルトの名無しさん :2008/04/04(金) 02:41:24
335の人が言っているのが、こっちの意図です。でも最初の人がC言語ではサポートしていない、 というのがどういう意味だったのかはわかりました。 文字列で扱うんなら、4+5iとかでも問題ないと思ったのですが、(,)で実装してしまったし、、、 4+5iとかはちょっと面倒くさそう。
iだったりjだったりするからじゃねw
テンプレートクラス作って、 そのポインタをlistにつっこんで イテレータで走査しようとしたら怒られる //Error list<Hoge<T>*>::iterator it; expected `;' before "it" テンプレートクラスを テンプレートのままぶち込むのがいけないのか、 それとも別のところがいけないのかでいいんで教えてください
- list<Hoge<T>*>::iterator it; + typename list<Hoge<T>*>::iterator it;
ああ、そういうことだったのね(´・ω・`) ありがとー
>>340 そりゃ型決まってないと無理でないか?
list<Hoge<int>*>::iterator it;
とかならいけると思うけど。
gccだとちゃんとエラーはいてくれるがVCだと通るから困る
を、2ページ目にも修正入ったみたいだな。
教えて!! 言語を勉強したいのだが何がお勧め?? C++??Java??
目的は? 趣味なら何でもいいと思うよ。
>>347 >>348 仕事でUNIXのオペレータをしています。
言語を覚えてスキルアップしたい。と思っています。
でも色んな言語がありすぎて何を始めればいいのか
分かりません。今の時代にあっていてこれからも使っていけそうな
言語を教えて下さい。お願いします。
UNIXならまずはシェルスクリプトからはじめてみては? で、awk&sed、perl、python or rubyと進むとか。
C/C++のスレで訊かれたなら、やっぱりC/C++と答えるべきか
C#といってみる
C++では簡単に出来てJavaでやりにくい事 その逆などを教えて下さい。
その手の質問はぐぐったほうが丁寧な解説出てくるよ ここで聞いてもすれ違いのうえ端的だったり極端すぎる答えしか返ってこないよ
それ1週間前のネタ
C++にポインタ排卵だろ
まあ大部分は排除できるな。
constメソッドからでもポインタ型メンバの参照先なら操作し放題とか駄目活用している
363 :
238 :2008/04/04(金) 22:32:21
protectedでstaticな独自クラスの配列の参照の初期化で他のクラスのメンバ変数を与えたいんですが 無理ですよね・・・? もし他のクラスのstatic変数なら大丈夫でしょうか?
RTTIは実際にどういう場面で使われるんですか? template<typename T> void hoge(const T &a) { if (typeid(a) == typeid(int)) { ... } } とかやるんですかね
クラスのインスタンス自身への参照ならいくらでも可能だと思うが、 その中のメンバ変数と言われると難しいというか、 そもそもそんな怪しい事しようとしている事にまず疑問を持たざるを得ない。
>>364 dynamic_cast も RTTI を利用してる。
typeid はあまり使う事は無いな。
dynamic_castなら、よくこういう状況で使いたくなる。
1. ライブラリの用意した基底クラスBから派生した自作クラスDを作る。
2. Dのインスタンスをライブラリに渡す。
3. ライブラリからのコールバックで2で渡したものがB型への参照・ポインタで与えられる。
この例だと結局boost::polymorphic_downcastにするんだけどね。
>>364 その例だったら特殊化で十分。
配列の参照のスタティックなクラス変数のクラス定義外での宣言って Hoge Piyo::(&foo)[][100]; じゃないの・・・?
とりあえずコンパイルの通るコードを頼む
スマートポインタでいい。
でいいというか、ポインタ使えないなら、ポインタもどきを使うしかない。 クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、 嫌でもポインタ使わなきゃならないと思うんだけど。
大体ポインタを理解できないならスマートポインタも理解できないかと 360は何を言いたかったのだろう
スマートポインタはアドレス演算とかやらないから scoped_ptr くらいなら何とかなるんじゃね?
ダメな奴は、やり方が言語仕様に引っ張られる。
いやイテレータ使うならアドレス演算と大して変わらないんじゃないか ポインタわからないようではC++できないというのは真実だと思うけど
排卵日
メンバ変数の文字列の一部を新しい文字列として返したいんですが どういう方法がありますか? こういうのです class Test { private: char data[256]; public: char * getStr() { char *ret = new char[3]; ret[0] = data[0]; ret[1] = data[1]; ret[2] = data[2]; return ret; } }; これを std::string str = getStr(); このように使った場合retのデリートができないので メモリリークしますよね?何かいい方法ありませんか?
const std::string getData() const { return std::string( data ); }
終端に '\0' を追加するのも忘れずに
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、
void getStr(std::string& str) const {
str.assign(data, 3);
}
std::string getStr() const {
return std::string(data, 3);
}
後者は代入する時にコピーが発生するので場合によっては効率悪いが
(初期化の場合は大抵のコンパイラなら戻り値最適化してくれるので大抵コピーは発生しない)、
かといって前者は必ず変数用意しないといけない。
どっちにするか、あるいは両方用意するかはお好きなように。
まあ、string にどんなメンバがあるかくらい見とけ。
http://www.wakhok.ac.jp/~sumi/stl/header/string.html
>>381 参照のようなconstなメンバー変数を持つとコピーコンストラクタが書けない
一方ほとんどのコンテナはメモリ確保を自動でするからコピーが発生する
常識だと思ってたんだけどどこかおかしいのか
デフォルトコンストラクタが書けないと言った方が正しいか
コピコンは書けるだろ? 書けないのは代入演算子。
終了文字の\0って入れなきゃいけないんでしょうか。 サンプルで\0を使っているコードを\0消しても正常に動作するんですが。
BCCで「異なる 〜型へのポインタが混在している」って出るんですが、 これってどうすれば解決できるんでしょう? 箇所は vsprintf(unsigned char*,const char*,va_list); って使ってるところなんですが、unsignedのポインタからsignedのポインタにはキャストできないって言われたし・・・
>>386 コードによる。サンプル晒せ。
実はどこかで\0が付いているだけかもしれない。
389 :
386 :2008/04/05(土) 12:28:09
>>388 これです。
int CreateSave() {
HANDLE hFile;
SYSTEMTIME st;
TCHAR szTime[128];
TCHAR *lpszBuf;
DWORD dwAccBytes;
DWORD dwSize = 0L;
HGLOBAL hMem;
DWORD dwLen;
GetLocalTime(&st);
wsprintf(szTime,_T("\r\nファイル作成時: %d年%02d月%02d日%02d時%02d分%02d秒"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
dwLen = (DWORD)lstrlen(szTime);
390 :
386 :2008/04/05(土) 12:28:48
続き hFile = CreateFile(_T("ファイルログ.txt"),GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); dwSize = GetFileSize(hFile, NULL) + dwLen; hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1); lpszBuf = (TCHAR*)GlobalLock(hMem); ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL); CloseHandle(hFile); lstrcat(lpszBuf, szTime); lpszBuf[dwSize] = '\0'; hFile = CreateFile(_T("ファイルログ.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf), &dwAccBytes, NULL); CloseHandle(hFile); GlobalUnlock(hMem); GlobalFree(hMem); return -1; }
>>387 (const signed char *)にキャスト
>>390 よく読んでないけどstrcat(lpszBuf, szTime);この時点で¥0がついてると思われ
>>391 constってことは第2引数にですよね?やったら同じエラーが2個に増えたんですけど・・・
constを破るキャストがあるんですが、あれがあったらconstの意味なくないですか?
constは破るためにある だから const const charがあるだろ
>>390 lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';
このあたりか。
何か無茶苦茶危険なコードに見えるんだけど。
hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1); ← dwSize 文字分のメモリを確保してるつもりのようだが、+1 の位置がおかしい(TCHAR が2バイトの時に領域が足りない)
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL); ← dwSize 読み込む
CloseHandle(hFile);
lstrcat(lpszBuf, szTime); ← '\0' を付けないまま lstrcat は危険というか、szTime の文字数分領域がさらに必要なんだけどその領域を確保すらしていない
lpszBuf[dwSize] = '\0'; ← lstrcat の前に行う
しかも、lpszBuf[dwSize] = '\0'; じゃなくて lpszBuf[dwAccBytes] = '\0'; だな。
Unicodeビルドかどうかで、ファイルの文字コードまで 影響を受けるというのは良くない場合のほうが多いと思うけど、 それはいいのか?
何もひねらずに考えるとこうですが if( n % 2 ) printf( "奇数です\n" ); else printf( "偶数です\n" ); 奇数か偶数か調べるもっともスマートなコードってどんなんですかね?
int isOdd(int n){ return n % 2; } if( isOdd(n) ) printf( "奇数です\n" ); else printf( "偶数です\n" );
スマートってのが読みやすいって意味ならそれでいいんじゃね? スマートが短いって意味なら、いろいろあるだろうけど。
inline bool isOdd(int n) { return n % 2 != 0; }
下位1bitでも調べればいいんじゃね スマートといえるかわからんけど
最下位ビット調べて0なら偶数
かぶった><
この程度なら最適化されないのかな?
まともなコンパイラならするよ。
std::string のfind()とfind_first_of()の違いって何ですか? どちらも最初の位置を返すと思うんですが
findはコンテナから特定の要素を見つける。 find_first_ofはコンテナから特定のコンテナの要素を見つける。
std::string str("hogefugapiyo"); std::string::size_type find = str.find_first_of("abc"); "abc"のうち一番最初に見つかった要素の位置を返す コンパイルが通るかは試してないのでわからん
質問です。 以下のような二つのコードの時間を計ってみたら、 コードBの方が早く、コードAはすさまじく重くなりました。 なぜでしょうか? あと、コードAの方で、変数aをデバッグで値を見ると、 1.731e-040#DEN のように表示されます。 #DENとは何なんでしょうか? よろしくお願いします。 環境はVisual c++ 2005です。 //コードA for(int i =0; i< 5000; i++){ float a = 1.731e-040f; float b = 1.731e-040f; float the_test = a*b; } //コードB for(int i =0; i< 5000; i++){ float a = 0.1f; float b = 0.1f; float the_test = a*b; }
>>411 DENormal number (非正規化数)
FPUによっては非正規化数の演算をサポートしてなくて、
これをソフトウェア側でエミュレートしてる場合がある。
すると、パフォーマンスが落ちる原因になる。
413 :
じじ :2008/04/05(土) 18:57:43
MFCをつかったマルチスレッドプログラミングを仕事で要求されているの ですが、APPクラスの子レッドとしておくのがいいのでしょうか?
enum は ビットマスクしてもいいですか?
どうやったらうまくコーディングできるんだろう? すぱげってぃーなコードになってしまう。やっぱり慣れるしかない? 以下サンプル void binary_search(double x,double y,double *z) { int i; double c,j; j = 0.0000001; for(i=0;y*y - 2 > j;i++) { if(x*x - 2 < 0 && y*y - 2 > 0) { c = (x+y)/2; if(c*c - 2 > 0) y = c; else x = c; } binary_search(x,y,z); } *z = x; } 再帰しまくりでサーセン。でもどうやったら再帰せずに実現できるだろう? 考えるのが面倒&考えても良く分からないので再帰に走る今日この頃。
無理に再帰を使わない方がスパゲティ化する。
再帰はスタックで実現している。
>>415 何がしたいんだよ?
binary_search(x,y,z);
↓
//binary_search(x,y,z);
バイナリサーチをバイナリデータのサーチと勘違いしてたりして 変数一文字でコメントもなくて通じると思ってるんだろうか
binary search じゃなくて bisection method の間違いだったわ 恥ずかしい。。。。鬱だしのう orz
>>421 すまん、記事のコメントと同じ事をいいたいのか
それとも、2ページ目の解説についていいたいのか
さっぱり分からないから、ちゃんと説明してくれないか?
x 日本 o IBM
424 :
デフォルトの名無しさん :2008/04/05(土) 23:37:02
内部に二次元配列をもつクラスから、instance[0][0]みたいな書き方で値を取得したいと思ってます。 double operator[][](int x, int y) のような書き方は出来ないみたいなので、(コンパイル失敗しました)、 この場合どうすればいいでしょうか?
425 :
デフォルトの名無しさん :2008/04/05(土) 23:47:13
要素数が100万くらいあるvectorを半分にして50万要素のvector2つにしたいのですが、 50万番目のiteratorを取得するのにiterator++ を50万回呼ぶ以外の方法はないのでしょうか。 vector<int>::iterator it=vec.begin()+vec.size()/2 とかいう感じだと演算子+は定義されていない、とかでダメなもんで。 この辺がポインタとの違いかなとは思うのですが。
επιστημη ってこんなところにも出没するんだな
>>425 std::advance
というか、+ は定義されているはずなのだが、
どんなコンパイラ使ってるの?
>>425 コンパイラ何使ってるの?
vector のイテレータはランダムアクセスイテレータのはずだから、
コンパイラの実装がおかしいだろ、それは。
>>425 vector<int>::iterator it= &vec[vec.size()/2];
みたいな感じでできないか?
>>429 それはダメ。ポインタとごっちゃになってる。
432 :
425 :2008/04/06(日) 00:10:23
すみません。できました。どこかで間違った思い込みしてたみたいです。
>>430 ランダムアクセスイテレータはポインタ互換だと勘違いしてた
そういう実装が多いだけか
>>433 使用可能な演算子はポインタと同じだが、
ポインタとの間で相互変換することはできない。
ただし、ポインタもランダムアクセスイテレータの一種だけどね。
>>424 プロキシクラスを返す。
class A
{
public:
class Proxy
{
public:
double operator[](int y);
};
Proxy operator[](int x);
};
ポインタ返せるならそれでいいと思う。 範囲チェックしたければ何かクラス返すことになると思うけど。
>>431 スレ違いだということ、サルでも分かるかな?
439 :
411 :2008/04/06(日) 12:00:53
>412 回答ありがとうございます。 遅くなる原因がわかり、勉強になりました。 ありがとうございました。
440 :
デフォルトの名無しさん :2008/04/06(日) 12:57:53
>>436-437 ありがとうございます。
以下のような実装でいいですか? (あまりスッキリしてないような、、)
class test {
public:
test(int arg_size);
struct Proxy {
Proxy(int arg_size) : size(arg_size) {
vec.assign(size, 0.0);
}
double &operator[](int y) {
return vec[y];
}
std::vector<double> vec;
int size;
};
Proxy &operator[](int x) {
return proc_vec[x];
}
std::vector<Proxy> proc_vec;
int size;
};
ていうかよっぽどの理由が無いなら()演算子のでいいじゃん
クラスの中身の先頭にusing namespace 〜;は書けないの?
443 :
デフォルトの名無しさん :2008/04/06(日) 14:11:20
>>441 なるほど、たしかに全然すっきり書けますね。
メンテもしやすそうだし、こっちにします。
ありがとうございます。
class Matrix {
public:
Matrix(int arg_size) : size(arg_size) {
vec.assign(size, std::vector<double>(size));
}
std::vector< std::vector<double> > vec;
int size;
double &operator()(int x, int y) {
return vec[x][y];
}
};
>>443 440でもそうだったけど、size変数って不要じゃね?
>>443 更にで何だけど、要素数のパターンが少なくて、定数でしか使わないなら要素数テンプレートにしちゃうと
ベクターも使わずに済むが・・・
用途分からんからしらね
エラー 1 error LNK2001: 外部シンボル ""private: static int Forms::Application::nCmdShow" (?nCmdShow@Application@Forms@@0HA)" は未解決です。 main.obj ってどういう意味のエラーですか?
>>446 宣言だけされてて関数が定義されていない。
448 :
デフォルトの名無しさん :2008/04/06(日) 15:34:25
>>445 どうやるんですか?
要素は、二次元ベクトルなんですが、1000×1000要素くらいです。
>>446 プロジェクトのリンクするライブラリの設定で
必要な関数入ったLIBファイルを設定しわすれてるんじゃない
450 :
デフォルトの名無しさん :2008/04/06(日) 15:37:08
>>444 その通りですね。
size変数は消します。
>>448 横レスだが、こういうことだと思う。
template<int size_x, int size_y> class Matrix {
public:
double& operator()(int x, int y) { return v_[x][y]; }
private:
double v_[size_x][size_y];
};
1000×1000は大きいので、スタックには置けないけど。
よくみるLPクラス名って、そのクラスのポインタ型って事?
>>453 そういう名前付けの規則が昔はやってたんだよ。
ある天気予報サイトの三重県の天気情報の文字列だけを抽出して自分のホームページに乗せるプログラムを書きたいのですが、どういったことを勉強すれば良いのかご教示願えないでしょうか。宜しくお願いします。
>>455 ・サイトにアクセスしてページを入手する
・ページを加工する
・自サイトに貼り付ける
WebProg板へどうぞ。
エラー 1 error C2143: 構文エラー : ';' が 'Forms::Application::frm' の前にありません。 application.cpp 7
エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 4 error C2371: 'frm' : 再定義されています。異なる基本型です。 application.cpp 7
>>449 >>447 解決しました。
が、今度はこんなエラーが。
定義はしたんですが、今度は定義した場所でエラー吐くようになりました。
ありがとうございました。 名前空間をちゃんと指定してなかったのが原因でした。
460 :
デフォルトの名無しさん :2008/04/07(月) 02:21:47
ヘッダに定義とか書けちゃうんだけど、 分けた方がええの? 分ける理由ってなんですか?
>>460 定義のほうをあらかじめコンパイルしてオブジェクトにしとける
小さいなら定義も一緒でいいだろ
boostとかにもそういうのあるよ
>>460 プログラムサイズが増えたり重複オブジェクトができたりコンパイルが通らなかったりする
ヘッダに関数書くならstaticつけるかファンクタにするかテンプレートにしとけよ。
こういう質問をする人のレベルだと、一番掴みやすいのはコンパイル時間の問題かなぁ。
>>460 たとえば、計10万行くらいあるソースファイル群のすべてが
直接or間接的にhoge.hppというヘッダファイルをincludeしているとして、
hoge.hppが実装まで全部書いてあるモノだったとすると、
その実装部分をほんの1行変更しただけで、10万行のソースファイル群が
すべて再コンパイルされることになる。
定義を別ファイルにしておけば、変更したときに再コンパイルするのはそのファイルだけで済む。
LinuxにおいてHDDの容量を取得したいのですがどの様にすればよいのでしょうか?
ただのグローバル変数とstaticをつけたグローバル変数って同違うんですか?
>>465 Linux板へどうぞ。ulimitでできるでしょ。
>>466 前者は文字通りGlobal。後者はファイルスコープなので違う翻訳単位からは見えない。
どちらにしても、可能な限り使わないに越したことはない。
469 :
デフォルトの名無しさん :2008/04/07(月) 07:45:15
>>463 ヘッダに関数書くときに、static付けたり、ファンクタにしたり、テンプレートにしたりすると、
どういう点でいいですか?全然考えてませんでした。
関数が複数実体化されることを抑制できる。
四則演算ってさ、 char でも int でも double でもしてくれるが、 それってコンパイル時に適切にマシン語に変換してくれてるんですか? CPUが持ってる算術演算の機能を使えるように 置き換えてるのであってCPUが int なのか char なのか判断して 処理してるわけではないですよね?
ただし格上げされて計算されるので種別はそんなに多くないです。
格上げ、というか汎整数拡張あたりじゃないのかな
477 :
476 :2008/04/07(月) 22:28:20
#define buffersize 10ですね;
>>476 何がしたいんだ?宿題をといて自分なりに課題を拡張して勉強しようとしたのか?
そのテキストファイルを見せられても、課題を丸投げされているようにしか見えないが。
とりあえずバッファオーバーフローしてたり、いろいろまずいぞ。
479 :
デフォルトの名無しさん :2008/04/08(火) 10:55:17
動画にコード出てるじゃないか……
画像の輪郭抽出→予めこのパターンにはこの文字を使うというデータを登録しておく→ 画像の上から順にパターン解析と文字割り当てを行う。 って感じしか思い浮かばん
482 :
デフォルトの名無しさん :2008/04/08(火) 11:08:35
>>480 初心者なもので・・・
画像を読み込んで、テキストに変換してさらにそれの色を判別してつけるのは
どの辺のコードを見たら良いのでしょうか?
今動画見てきたぜ。想像してたのと違ったぜ。とりあえずBMPを配列にするとこからはじめたら?
BMPのフォーマット↓凄く簡単だからすぐできるはず。
ttp://www.kk.iij4u.or.jp/~kondo/bmp/ 後は色に合わせて<font color="色">■</font>をひたすら出力すればできるだろ。
中級入門くらいじゃね?動かしたいならJavaScriptの解説かじればおk
>>476 とりあえず、どのあたりで困ってるのかな。?
mainに全部書くのではなく関数を作ってみよう。
引数をまとめれば、何をするべきかわかるんじゃないかな。
昔、先輩が「コンストラクタではnew使うな」と言っていたのを思い出したのだけど、 これってどういう意図なのでしょう。 一般的なルールなのか、特定の状況で有効な話だったのか……。
>>485 コンストラクタ内で例外が発生すると、デストラクタは呼ばれない (仕様)
→ new でコケたらリーク!
じゃね?
コンストラクタ内の例外は漏れなくコンストラクタ内で処置すれば無問題。
>>479 お絵かきとかでもあるネタだけど、むしろどうやって動画にしてる
のかの方が気になる。コーディング中ずっと録画してあとで編集
してるんだろうが…根性あるなw
コーディング中のキータイプを記録、編集 ↓ 動画を取りながら記録したキータイプをマクロで動かす ↓ (`゚'Д`゚')
>>479 画像を読み込んで表示するところから始めたらいい
結構親切っぽいから彼のサイトの掲示板で聞いてみれば
講座の方はかなり酷いスパゲティコードだからお勧めしないw
491 :
デフォルトの名無しさん :2008/04/08(火) 18:21:58
cinからdoubleを1つまたは複数入力させます。入力されたのが1個なのか、複数なのか判定したいのですが、 以下のコードでよいですか?Macだとうごくのですが、windowsでもこれでいいのかわかりません。 double a; std::cin >> a; if (std::cin.peek() == '\n') { // 数字は一個だった } else { // 一個じゃなかった。 }
493 :
デフォルトの名無しさん :2008/04/08(火) 19:06:50
>>492 ありがとうございます。今手元にwindowsがないのです。
また、自分のところのwindowsでやってみて動いても、ほかの人のwindowsでは
どうなるかわからないし…
その、規格的に入力の文字列末判定はこれでいいのかどうか、知り痛いです。
>>485 VC8で大量にメモリの確保しているとコンストラクタの中のnewで「メモリが不足しています。」とエラーがでる。
理由が分からずallocにしたら問題なかった。
というか今も原因が掴みきれない件。
使う型がある程度限定できるテンプレートだったら MyTemplate<型名>をtypedefしてしまえば良いような気がするけど これってありなんですかね?
まさにstringとwstring
ありあり。
ありありありあり。
ありが十匹で
さよならだ
アリーヴェデルチ
504 :
476 :2008/04/08(火) 22:28:39
>>478 様
ですよね、失礼しました;
>>484 様
エラー仕様を作ろうとしたのですが、
【整数の場合最大8桁までを有効とし、9桁以降を無視する。
負数の場合は、最大9桁までを有効とし、10桁目以降は無視する。】とあり、
【『−』のみ、または改行のみ入力されたらエラーメッセージを表示し、終了】
というのもあるので、
エラーとしては if(a[0]=='\n') if(a[1]=='-' && a[0]=='\n')
みたいなのを使えばいいのかなぁ、程度で考えてるのですが、
どこに入れればいいのかなどイマイチ判らないのです;
ひょっとしてその数え方だと、「-1」は2桁なのか?
506 :
476 :2008/04/08(火) 22:53:28
>>486 なるほどー例外ですか。それは思い浮かばなかった。
newしたときの初期化の処理が無駄だったりするのかとか当時考えたのを思い出した。
>>504 whileを抜けて
>if(a[0]=='\n') if(a[1]=='-' && a[0]=='\n')
の場合にreturnで終わればOK
returnの前にprintfで適当にエラー出せば目的のものになるだろ。
>どこに入れればいいのかなどイマイチ判らないのです;
どこに入れてダメだったんだ?
classのなかにnamespaceは作れますか?
muri
質問なのですが、(VC++ 2008 EE を使用しています。) 以下のコード。 COORD coord; HANDLE hConsoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsoleStdOut, coord); は、<windows.h>をインクルードして使える、というのは判断できますが、 これはwindowsプログラミングなのでしょうか? WinMain()関数も無いし、DOSで表示されるのですが、 こういったコードの総称は何と呼ばれているのですか? 説明下手で申し訳ないです。
WindowsのAPIに依存してるならどう考えてもWindowsプログラミングだと思うが…。
WindowSystem(≒GUI)プログラミングではないが、 (MS-)Windowsプログラミングだな。 ついでに言えば、コンソールウィンドウはDOSではない。
>>512 >>513 ありがとうございます。
この「COORD coord;」や「HANDLE」の意味が解らず、
じゃあ総称が判ればネットで検索できる、と思い至ったのですが、
ネットを見ても、C言語による(MS-)Windowsプログラミングが掲載されていないんですよね。
はぁ。。。
515 :
デフォルトの名無しさん :2008/04/09(水) 05:19:59
>>514 日本語訳は無いけどMSDNに載ってるよ。
516 :
Alexander The Great WAS ALBANIAN, the PROOF by Flamuri :2008/04/09(水) 06:53:32
>>507 ちゃんと delete すれば問題ない。
例外を一旦コンストラクタ内でキャッチして delete するのもいいが、
スマートポインタに入れておけばあとはデストラクタが勝手に何とかしてくれる。
コンストラクタ内で例外が発生した場合に呼ばれないデストラクタは
構築中のオブジェクトのデストラクタだけだからね。
既に構築されたオブジェクトのデストラクタは全て呼ばれる。
例えば基底クラスのデストラクタとか
構築されたメンバ変数のデストラクタとかは全て呼ばれる。
new に関して気をつける必要があるのは事実だけど、
使っていけないってことはあり得ない。
まあ、初心者は使わない方が無難ってこと程度の話じゃないのかな。
いいえ、newを生で使っている人はちゃんとスキンをつけるようにしてください。
newに限らず例外を投げる可能性のある関数をコンストラクタ内で 呼び出すときはstack unwindを考えて対応する。
コンストラクタ内でnewが例外吐いたのをキャッチしたとして、 そのあと何をすれば良いのですか?
>>520 ケースバイケース
スワップが頻発してるなどメモリ不足でシステムがヤバイ状態なら
終了してシステム全体のシステムの再考。
そのエラーを無視してでも少しでも長く生き続ける必要が条件なら
ログにでも吐いて続行。
522 :
デフォルトの名無しさん :2008/04/09(水) 11:47:43
VC++2008EE ListBoxの1行削除ができたので、今度は削除前に メッセージボックスを出して見ようとしたのですが、 エラーがものすごい数出てしまいました。 System::Windows::Forms::DialogResult result; result = MessageBox::Show("削除しますか?","DELETE CHECK",MessageBoxButtons::YesNo); Debug::WriteLine(result); if(result != System::Windows::Forms::DialogResult::Yes)){ return; } if文全体を削除すると問題なく動作し、 また、出力ではYes,No確認できるので、 if文のSystem::Windows::Forms::DialogResult::Yesが、 問題なのかと思い、"Yes"とかにしてみたのですがやはりエラーが出てしまいます。 これはなぜエラーが出てしまうのでしょうか
>>522 それ.netじゃん
AfxMessageBoxかAPIのMessageBox使うべし
>>520 コンストラクタ内で catch なんて書かないでいいように RAII を徹底したほうがいい。
526 :
デフォルトの名無しさん :2008/04/09(水) 12:14:47
>>524 ひと目でわかる Microsoft Visual C++ 2008 アプリケーション開発入門
という本を読みながらやっていて、
本書はC++/CLIで書いてある。とあるので、たぶん.netというやつだとおもいます。
この本の通りにやるとエラーが出てしまい、
エラーの内容見てもよく分からなくて、
いろいろ試してたのですが、結局原因が分からず聞いてみました。
この本で使っているMessageBoxにはなにか問題があったりするんでしょうか
527 :
デフォルトの名無しさん :2008/04/09(水) 12:21:41
>>526 C++/CLIてのはC++でなんとか.net使いましょうよ・・・っていう仕様
.netだけならC#の方がいいし、速度的にC++ならC++/CLIしないでMFCかAPI使った方がいい
528 :
522 :2008/04/09(水) 12:30:18
申し訳ありません。もの凄く下らないミスでした。
if(result != System::Windows::Forms::DialogResult::Yes)){
かっこが一つ多かったです・・・スレ汚しすみませんでした。
>>527 うう、本まで買って気合い入れてしまったため再スタートは辛いです。
とりあえずこの道進んで、あとから徐々に方向転換してみます。
ありがとうございました。
>>528 甘いな。俺は最初どの本買ったらいいかわかんなくて結局3冊目まで買ったぞ
MFCってまだ使われてるのか?
>>531 きみのPCのMFC関連のDLL等を全て削除して使用してみればきみの環境での依存度が分かる
マジレス
MFC関連のDLL、スタティックリンクするから無くても動いちゃうよ (俺のアプリは)
CString m_combo = "notepad.exe"; WinExec((LPCSTR)(LPCTSTR)m_combo,SW_SHOW); これアプリが起動しないんですけどなんでですか
LPCTSTRをLPCSTRに変換しているのが限り無く怪しい。 LPCTSTRを引数に取るShellExecuteか何かを使え。
WinExecが好きなんですけど変換は不可能ですか?
なら(LPCSTR)(CStringA)m_comboでどうだ。 あと、引数の少なさなら<tchar.h>の_tsystemがいいぞ。
っていうかWinExecはdeprecatedな扱いのAPIのような気がする。
struct hoge_a{ int a; int b; }; struct hoge_b : public a{ int c; int d; }; としたとき、hoge_aのメンバのメモリ上の並び順はabとなるのは保証(規定)されていると どこかで見た記憶があるのですが、hoge_bの場合、abcdとなることは保証されるのでしょうか?
>>539 動いたwお前すごいわ
どこにも乗ってなかったぞこんなの
543 :
デフォルトの名無しさん :2008/04/09(水) 18:27:43
srandのseedが同じ場合、マシンやOSが変わっても同じ乱数を発生させることができるのでしょうか?
545 :
デフォルトの名無しさん :2008/04/09(水) 18:42:27
そうすると何に依存するのでしょうか? コンパイラですか?それともOSですか? AMDとintelのようにCPUが変わっただけでもダメですか?
libcの実装次第? 時間と空間を使えばかなりランダムになりそうだけどなぁ。
>>543 移植性を考えるなら同じ種で同じ乱数列の出力を保証するにはライブラリに頼らず乱数発生器も実装してしまう
C++について質問なのですが、 オブジェクトを作らずにメンバ関数を呼び出すことは可能でしょうか。
静的メンバ関数なら。
>>548 できる。
struct a{ void f(){} };
reinterpret_cast<a*>(NULL)->f();
なるほど。勉強になりました。 レスありがとうございました。 #include <stdio.h> class A { public: static A* make_obj(void); void my_puts(void){ puts("Hello\n"); } }; A* A::make_obj(void){ A* a = new A; return a; } int main() { A* a = A::make_obj(); a->my_puts(); return 0; }
>>551 わかってると思うけど生ポではなくスマポに入れて返しとけよ
using namespace 〜; は取り消せますか?
永遠に取り消す事が出来ない呪いです。 using は計画的に。
namespaceをusingすると、そのnamespace内のusingまで見えてしまうのには泣く。意味ねーじゃん
だからヘッダにusing書いちゃ駄目ってママ言ったでしょ
>>550 staticメンバ関数が無い時代の苦肉の策ですなあ。
ただ非静的メンバーは参照できない。
turboPascalのusing見たいな使い方したかったのに。
VC++ 2008 EE でWindowsアプリケーションを作成したいのですが、 そのまま<windows.h>をインクルードしてもエラー表示なので、 どのような設定が必要なんですか?
561 :
デフォルトの名無しさん :2008/04/10(木) 00:24:06
>>561 いや、他人の書いたコードを解読してるんだ。。
>>560 [ファイル]-[追加]-[新しいプロジェクト]
[Visual C++]-[Win32]-[Win32プロジェクト]-[プロジェクト名]-[OK]
[次へ]-[Windowsアプリケーション]-[■空のプロジェクト]-[完了]
[ソースファイル]-[追加]-[新しい項目]
[Visual C++]-[コード]-[C++ファイル]-[ファイル名]-[追加]
>>563 ありがとうございます。3行目まではうまく設定できたのですが、
4行目の「ソースファイル」?が何を指しているのかわからず、
そのまま5行目の作成を行いました。
結果はやはりビルドエラーです。
コードは以下です。
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
//処理
return ;
}
/* ウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//処理
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
エラーの内容は?
566 :
デフォルトの名無しさん :2008/04/10(木) 01:54:31
ファーストへの悪送球。
1>------ ビルド開始: プロジェクト: C800, 構成: Debug Win32 ------ 1>コンパイルしています... 1>MJ_1.cpp 1>.\MJ_1.cpp(26) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>.\MJ_1.cpp(41) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>C800.cpp 1>.\C800.cpp(28) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>.\C800.cpp(43) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>コードを生成中... 1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\C800\Debug\BuildLog.htm" に保存されました。 1>C800 - エラー 4、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== です。
>>568 ありがとうございます。
文字変換だったのですね。
しかしググっても出てこないので最後に嘆きます。
1>------ ビルド開始: プロジェクト: GAME, 構成: Debug Win32 ------
1>マニフェストを埋め込んでいます...
1>.\Debug\GAME.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\GAME\Debug\BuildLog.htm" に保存されました。
1>GAME - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
なるエラーが出るのですが、まったく意味不明です。
570 :
569 :2008/04/10(木) 18:46:06
申し訳ないです。 自己解決しました。 ありがとうございます。
571 :
デフォルトの名無しさん :2008/04/10(木) 21:45:49
VC++2005で、ADOでSQLSERVER2005に接続して、binary型のフィールドに 1000byte程のバイナリデータを保存したいのですが、 long型の配列にデータをmemcpyし、それをrs->Updateしようとすると、 コンパイルで「bool値に変換します」というような警告がでて、データを転送できません。 バイナリデータを転送するにはどのようにすればいいのでしょうか? (配列には正常にデータがコピーされていることはファイル出力で確認できております)
573 :
デフォルトの名無しさん :2008/04/11(金) 06:15:26
vector〈基底クラス*〉に数種類の派生クラスをプッシュバックしてオーバーライドした関数を実行するようなことはできますか?
>>573 virtualなメンバ関数を実行ということなら、可能です。
575 :
デフォルトの名無しさん :2008/04/11(金) 06:33:22
もちろん仮想関数にしてあります &の付け忘れでした 解決できましたありがとうございます
576 :
デフォルトの名無しさん :2008/04/11(金) 06:38:48
577 :
デフォルトの名無しさん :2008/04/11(金) 06:50:20
573=574=575=576
>>575 メモリリークに気をつけような。
boost::ptr_vector の使用も検討してみるといい。
579 :
デフォルトの名無しさん :2008/04/11(金) 12:34:50
動的に二次元配列を確保するにはどうすればよいですか? int x=10; int y=10; double a[x][y]; という風に書くのは、xyが小さい間は出来たのですが、newで確保しようとすると yを変数にできません。vectorを使わずに上記のようなことができるでしょうか? よろしくお願いします。
double **a; *a = new double[x] for( int i = 0; i < x; ++i ) a[x] = new double[y] こんなん
boost::multi_arrayオススメ。
582 :
デフォルトの名無しさん :2008/04/11(金) 12:52:43
>>580 ありがとうございます。
確保した二次元配列をほかの関数に渡すにはどうすればよいですか?
あと、boost::multi_arrayは速いですか?
今書いているのは、std::vectorもあまり知らない人に見せるためなので、
boostなんてとてもだめです。
アセンブリ言語のコンパイラのCソースプログラムを持っているのですが、 アセンブリ言語をコンパイルするには、このソースをコンパイルしてから どうすればいいのでしょうか?
void func( int **a ); これでわたせるんじゃね、多分
>>582 そういう初心者には、素直に一次元配列を仮想化して使う方がいい。
こんな関数でも用意すればアクセスするのも割と簡単だ。
static unsigned offset(unsigned x, unsigned y, unsigned w)
{
return x + y * w;
}
勿論、メモリ確保はこうなる。
double * a = new double[w * h];
あー、ついでに言えば>580はバグだらけだから要注意で。
つーか、>584もかすだわ。
>>583 Cソースをコンパイルしてできた実行ファイルを実行してアセンブルすれ
ばいいのでは。
>アセンブリ言語のコンパイラ 有り得ない間違いだな。
588 :
デフォルトの名無しさん :2008/04/11(金) 13:29:33
mbscmp wcscmp などの違いがわからない・・・・ あと、lstrcmp とか strcmp みたいなのもあったような気がするけど気のせい? 誰か、これらの関数の違いについて分かり易く教えてください。
文字として wchar_t を使うとき -> wcscmp 文字として char で mbcs を使うとき mbscmp 文字として char で sbcs を使うとき strcmp 文字として TCHAR を使うとき lstrcmp ドキュメント読まずにまず2chで聞くという態度では、わからなくて当たり前。
>>590 すみません。それがいまいちよくわからないんです。
charを使うときとか、tcharを使うときと言われても抽象的すぎて???
具体的に、どういう処理をするときにmbscmp や strcmp などを使い分けるのでしょうか?
同じ文字列比較でも、mbscmp を使っていたり、 strcmp を使っていたりと、訳が分りません。
>>587 確かに…ご指摘ありがとうございます
アセンブリ言語を実行するものの意味で使いました
>>591 それは抽象的だからわからないんじゃなくて、勉強しないからわからないのです。
mbcs と sbcs の違いなんか、Google で 「mbcs と sbcs の違い」を(カッコははずして)
検索すればいくつもそれらしい説明のページが出てくるのです。
もし手抜きじゃなくてホントのホントに何もしないで知識が身に付くと思ってるのなら、
そもそもバカなので勉強しても無駄なので止めるべきです。
>>592 それは普通、アセンブラと呼ばれる。
いや、厳密に言えば「アセンブリ言語を翻訳するもの」だが。
595 :
デフォルトの名無しさん :2008/04/11(金) 14:05:02
なんとなく分ったような分らないような・・・・ 同じ英数字からなる文字列比較でもプログラムによって使っている関数が違うのは 書き手(プログラマー)の意識の違いによる? さらにワイド文字とマルチバイト文字の違いがよく分らん。。。。 出直してきます。スレ汚してすみません。
すまん *a = new double[x] じゃなくて a = new double*[x] だ
598 :
デフォルトの名無しさん :2008/04/11(金) 14:20:42
>>595 593じゃないけど、あえて言うなら「投げっぱなしの馬鹿を見てしまったこと」が
「嫌なこと」なんだろう。
600 :
デフォルトの名無しさん :2008/04/11(金) 20:21:49
deleteで落ちちゃうんだけど、原因わかりません>< このコードで落ちます・・・。 int i; char *lpary[4]; for (i = 0; i < 4; i++){ lpary[i] = new char[256]; } for (i = 0; i < 4; i++){ delete [] lpary[i]; } 誰か教えてください。
落ちる要素は特に見当たらないが・・・。 多分、他で色々やってる部分でマズいことやってんじゃないかと。
for (i = 0; i < 4; i++){ delete lpary[i] } delete[] lpary;
よく見てなかった すまん忘れてくれ
605 :
600 :2008/04/11(金) 20:29:44
すいません。原因わかりました。 newとdeleteの間でやってる処理で確保したポインタに別のポインタ 渡してしまってた・・・。 まじごめん;;
悪い事いわないから、vector 使え。
>>596 >さらにワイド文字とマルチバイト文字の違いがよく分らん
それを調べるのが先だということに気づかないの?
出直してくるって言ってるんだからほっとけよ
変数をStringだとかChar型で指定することってできますか?
????????
611 :
デフォルトの名無しさん :2008/04/12(土) 00:56:30
静的なメモリを確保をしたクラス内に動的に確保したクラスがあるとします この場合exit(0)が実行された時に正しく破棄が行われますでしょうか?
>>611 だいたいOSがうまく解放してくれる・・・かもね。
そんな保障はどこにもない。ちゃんと解放するかJava等に移行しましょう。
ぬるぽ
>>611 ライブラリの仕様によるけど、
・静的なオブジェクトのデストラクタ⇒呼ばれる
・main()から辿ってその時点までのスタック上にあるオブジェクトのデストラクタ⇒呼ばれない
つまりスタックの巻き戻しは行われないが通常のクリーンアップルーチンは呼ばれる、
が一般的なのでは。何か重要な後処理が必要なら atexit でも書いとくべきだな。
atexitを使うことにします ありがとうございます
constポインタpDataのメンバstd::deque<Log> LogDataを参照するpastLog const std::deque<Log>& pastLog = pData->LogData を上のように作ってそのiteratorを使用したいのですが const std::deque<M3Log>::iterator itr = pastLog.begin(); とすると 左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 と怒られます 何処をどうしていいのかわかりません、アドバイスをいただけないでしょうか
617 :
616 :2008/04/12(土) 02:12:31
訂正 const std::deque<M3Log>::iterator itr = pastLog.begin(); ↓ const std::deque<Log>::iterator itr = pastLog.begin();
c++ は良く知らないけど、 std::deque<Log>::const_iterator itr = pastLog.begin(); じゃないの?
>>618 ありがとうございます
無事コードがコンパイルを通るようになりました
const_iteratorなんてあったのか・・・
>>619 >const_iteratorなんてあったのか・・・
超ワロタじゃないかよ
静的確保と動的確保でプライベートメンバ関数の実行に違いが出るようなことは有るでしょうか?
外から借りない限り終了すれば仮想プロセス空間ごと消滅するかと。
さあて。delete thisするんでない限りは、まー無いんでないかね。
#define sucide delete this
suicide
oh misu superu
ifの条件部で変数を宣言したい時に、boolとして評価できない型だとコンパイルエラーになりますよね std::set::const_iterator it = hoge.find(....); if (it != hoge.end()) { // ここで it を使う } のようなことをするときにifのブロック内にitのスコープを限定して if ((std::set::const_iterator it = hoge.find(...)) != hoge.end()) { のようなことをしたいんですけど無理ですか?
無理
for ( std...it = hoge.find(...); it != hoge.end(); ) { break; } おすすめはしない
{ std::set::const_iterator it; if(...){...} }
あるいは空スコープを使うとか。 { std...it = ...: if(){ } }
無理やり template<typename T, template<class> class Comp> class eval_lapper { public: eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {} operator bool() const { return Comp<T>()(obj_, target_); } T& obj() { return obj_; } const T& obj() const { return obj_; } private: T obj_; T target_; }; int main() { std::set<int> s; //s.insert(123); if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) ) std::cout << *(it.obj()) << std::endl; return 0; }
ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?
してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。
if 文だけでそう解釈されて欲しい場合は、 普通には使われないようなポインタへのキャスト演算子を オーバーロードするのが一般的。 メンバポインタとか。
>>632 面白いなやり方だな
でも、lapper => wrapper じゃね
//test.h struct test{ int a; test(int a_) : a(a_){} }; //instance.cpp #include "test.h" test obj(1024); //program.cpp #include <iostream> #include "test.h" extern test obj; int main(){ std::cout << obj.a << std::endl; return 0; } 別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの? VC8ではコンパイル通った。
そりゃ通るだろ 同じヘッダインクルードしてるんだし
メンバ変数が一部が#ifdefあたりで囲んであると 場合によっては非常に愉快な話になるけどね
愉快なというかバグな話だろ
中々原因が掴めず笑うしかないとかそういうアレだろう 鼻から悪魔が出たらもっと愉快だな
String name; と String^ name; の違いはなんですか?ハンドルの意味がわかりません
>>642 とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。
それで分からなかったら、もう一度おいで。
# CLIってちょい過疎気味の本スレしか無いのな
645 :
デフォルトの名無しさん :2008/04/14(月) 01:32:44
コピーコンスタクタ辺りで質問です。 template <bool M> struct P { int* _p; P(int* v=NULL) : _p(v) {} P(P& v) : _p(v.release()) {} // (1) ~P() { if(M && _p) delete _p; } void reset(int* v=NULL) { if(M && _p && _p != v) delete _p; _p = v; } int* release() { int* temp = _p; _p = NULL; return temp; } }; P<true> pf(int n) { return P<true>(new int(n)); } int main() { P<true> a = pf(3); } 上記だと error: no matching function for call to ‘P<true>::P(P<true>)’ とコンパイルエラーがでます。 しかし (1) を template <bool _M> P(P<_M>& v) : _p(v.release()) {} にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。
>>645 コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。
>>645 よく分からんけど、VC8だとどちらもコンパイル通ったぞ
>>647 エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで
P<false> oldObj;
P<true> newObj(oldObj);
とでもしているんだろう。
649 :
645 :2008/04/14(月) 01:52:20
>>646 テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと
いけない理由が分かりません。
途中で P<false> に変換されているのも確認できませんでした。
>>647 gcc だけで起きる問題なんでしょうか…
>>647 いやしてないのです。上記のソースのみです。
650 :
デフォルトの名無しさん :2008/04/14(月) 02:17:53
質問です。4桁の乱数を取得する関数なのですが if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが 原因を教えていただけませんか? void random::gt(){ srand((unsigned) time(NULL)); num[0] = rand() % 10; if(num[0] <= 0){ do{ num[0] = rand() % 10; }while(num[0] <= 1); } //その他乱数取得 for(i=0;i<4;i++){ if(i <= 4){ for(j=1;j<4;j++){ num[j] = rand() % 10; if(num[i] == num[j]){ do{ num[j] = rand() % 10; system("PAUSE"); }while(num[i] != num[j]); } }; } }; }
>>649 Pは接頭語みたいなもので一部の例外を除いて単独では使えない
この場合だとP<true>とP<false>が型
たとえばP<true>を定義したとき、もしP(P&)の記述が許されると
コピーコンストラクタP(P<true>)か
引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる
日本語でおk dowhileは必ず1回はループ内の処理を実行するが? あと、その貼ったソースはそのままか?変更して貼ってない?
653 :
645 :2008/04/14(月) 03:33:40
>>651 あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。
P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが
P<true> -> P<true> OK
P<true> -> P<false> OK
P<false> -> P<false> OK
P<false> -> P<true> NG
の時に
template <bool M>
struct P {
template <bool _M> P(P<_M>& v);
...
};
template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {}
//template <> template <> P<true>::P(P<false>& v); // NG
template <> template <> P<false>::P(P<false>& v) : _p(v._p) {}
template <> template <> P<false>::P(P<true>& v) : _p(v._p) {}
みたいにもできるってことですね!ありがとうございました。
あああ、すいません if(num[i] == num[j]){のところで 変数num[i]とnum[j]が違っていても処理をしてしまう原因 を知りたかったのです ソースは特に変えてないと思うのですが どこかおかしいでしょうか
655 :
645 :2008/04/14(月) 03:36:18
違った。P<false> -> P<true> が嫌だった。です。
656 :
650 :2008/04/14(月) 03:39:19
またもすいません
>>654 は>.650です・・・
658 :
650 :2008/04/14(月) 11:06:42
>>657 まさにそんな感じです
ありがとうございます
659 :
657 :2008/04/14(月) 11:24:42
set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに remove_ifなんかのアルゴリズムでスマートに書けますか?
operator^
>>660 #include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
int main() {
namespace bll=boost::lambda;
std::set<int> a,b;
a.insert(1);
a.insert(2);
a.insert(3);
b.insert(2);
b.insert(3);
std::remove_copy_if(a.begin(), a.end(),
std::ostream_iterator<int>(std::cout),
bll::bind(std::find<std::set<int>::iterator, int>,
b.begin(),
b.end(),
bll::_1 ) == b.end());
return EXIT_SUCCESS;
}
uu-n...
huninnkidearuboost::egg::lazywotukattemitayo #include <iostream> #include <algorithm> #include <set> #include <boost/lambda/lambda.hpp> #include <boost/egg/lazy.hpp> #include <boost/lambda/bind.hpp> #include <boost/assign/std/set.hpp> struct base { template< class Myself, class Arg0, class Arg1, class Arg2 > struct apply { typedef Arg0 type; }; template< class Result, class Arg0, class Arg1, class Arg2 > Result call(Arg0 begin, Arg1 end, Arg2 value) const { return std::find(begin, end, value); } }; typedef boost::egg::function<base> op; boost::egg::result_of_lazy<op>::type const find_lazy = BOOST_EGG_LAZY({}); int main() { namespace bll=boost::lambda; using boost::assign::operator+=; std::set<int> a,b; a+=1,2,3; b+=2,3; std::remove_copy_if(a.begin(), a.end(), std::ostream_iterator<int>(std::cout), find_lazy(b.begin(), b.end(), bll::_1) == b.end()); } uuu-nnn...
p_stade乙
>>660 a = bはだめなの?
だめだから聞いているんだろうけど。
>>665 横からだけど
a : 10,20,30,40
b : 20,50
この場合多分望む結果は
a : 20
だろうけど、
>>665 だと間違った結果を返す。
vectorやらlistで vector<int>の要素が 1 2 (空白) 3 4 (空白) の様に途中に空白をいれることはできるのでしょうか?
668 :
デフォルトの名無しさん :2008/04/14(月) 18:46:45
VC++でPC情報を取得するPGを作成します。 プロジェクト作成は(Win32とか)どれを選ぶのが 適当でしょうか?
669 :
デフォルトの名無しさん :2008/04/14(月) 19:40:07
.exe が出来るならどれでもいいと思う。
とあるクラスに関数を一個追加しようとしたところ .hファイルに関数の本体を書き出すと正常にコンパイルが通るのに .cppファイルに書き出すと C2039 'foo' : 'hoge' のメンバではありません。 となってしまいます これはどういう事でしょうか・・・
ソースを見せれ
f´'´ ノ ヽ l 、 \! l / / // ,.ィ´ !', ト、 ヽ. ヽ . レ′, / //_,..イ// ,| l |lλぃ い. ', } / { ‐7Ζ_∠!イ 〃 /リ,}/┤!」l 小 ! ノ i| 八//'゛ -`l 〃 /ノ'´ j ! |l/| iイ/ ヽ|l//イ ャ''Tェ歹''`y゙/ 'ヾ歹¨リ`イ!ノ// まさか、ロリコンじゃないわね・・・ ) 〃A ``''''"´ '^ r; `'''"´/クK/ Y/ !トヘ. //// //// /.ィi| ;| |i( l|`Ti\,___ '⌒) ,∠lj_|iリ {い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」! ``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、
>>671 >.cppファイルに
しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。
>>672 仕事でのデータが含まれてるのでちょっとソースは公開できないですorz
>>674 インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います
問題が再現するコードを作ってそれを貼ればいいじゃん。
テンプレート関数だったらお前の殴る
hppで解決♪
リビルドし直したら通った・・・ これはどういう事??
VCではよくあること
そしてインテリセンスが延々と更新されないことも
インテリセンスが嘘つくのも。
>>667 vector<int>に整数以外のものは入れられません。
仮に、負値を例外として扱ってよいなら空白の代わりに-1を入れておくと言う手もなくはありませんが、
boost::optionalを使ってみてはどうでしょう。
メモリが断片化している場合、ポインタに+1した場合はきちんと断片先に飛んでくれるんですか? それとも型サイズ分だけ強引にアドレスが+1されるんですか?
断片化? どういう状況を言ってるんだ?
vectorではなくdequeの実装を言っているのかもw
deque のことなら、イテレータに +1 したら断片化先に飛ぶけどポインタは当然無理だな。
>>685 1つのデータがメモリに書き込まれる時は必ず連番のアドレスに配置されるんですか?
>>688 少なくとも仮想アドレスは連番だが。
物理アドレスは知らんがな。
STLとかboostみたいので RECTとかSIZEを包んだクラスはありますか?
CRectならMFCにあるけどな…
WTLにも
>>689 つまり&で表示されるアドレスは仮想でWindowsが物理メモリの番地とリンクを取って隙間に埋め込んでるから考えなくていいってことですね
ありがとうございました。
>>693 それでいいのか?
本当にそれでいいのか?w
C++でプロパティー的なものを表現する場合 getとsetはつけたほうがいいの?それともOR?
漢は黙ってpublic:
それだとブレークポイントはれないじゃん・・・。
__declspec(property(get=getHoge, put=setHoge)) int Hoge;
winsockのsock関数の第一引数にAF_BTHを指定すると、AF_BTHが定義されていないとエラーがでます。 winsock2.hはインクルードしてるんですが、ほかになにかインクルードしなければいけないんでしょうか?
grepかけたらws2bth.hででてきたけど。
std::list<int> iListの参照を作りたいのですがこの場合 std::list<int>& refList = iList; で良いのでしょうか?
アドレスを比べてみたらいいと思うよ
>>702 簡単に試してみたけど
大丈夫そうな気がしました
C言語での構造体の初期化について質問です。 typedef struct Foo_tag{ int a; int b; int c; } Foo; というような構造体があったときに、 Foo foo = {0}; という初期化を行っているコードをたまに見かけますが、これは何を行っているのでしょうか? 一応MinGW環境で同様のコードを書いてテストしてみましたが、{0} で初期化した構造体はゼロクリアされており、 初期化しなかった構造体にはゴミが入っていました。 ということは、上記のコードは構造体をゼロクリアするという認識でいいのでしょうか? それと、標準Cの規格でこういう初期化は許されていますか? 構造体のゼロクリア処理は memset() などを利用して行っているコードが多いことを考えると、標準規格ではなさそうな 気がするんですが…。
メンバを途中まで初期化すると 残りは0で初期化されるってヤツだったと思う。 標準Cでどうなのかは知らん。
Foo foo = {1};でa=1,b=0,c=0になるのが保証されてる
>>705-706 ありがとうございます。途中まで初期化ということができるんですね。
それなら構造体をゼロクリアするときはこれを使うと楽かもしれないですね。
(先頭にネストした構造体があったりするとどうなるのかよくわからないので、汎用ではないのかもしれないですが)
708 :
デフォルトの名無しさん :2008/04/15(火) 01:13:32
memsetだとパディングも初期化できるのが利点だったかな 普通の使い方で初期化する必要があるのかどうかは知らないが
>>709 ものすごく行儀の悪いコーディングだけど構造体同士を memcmp で比較できる
>>710 あくまで「普通の使い方」の話な
キャストしたりすればいろいろ問題も出てくるだろうよ
>>704 昔のコンパイラだと 0 で初期化されません
>>660 template<typename Class>
void assign_intersection(std::set<Class>& a, std::set<Class> const& b)
{
std::set<Class> result;
std::set_intersection(a.begin(), a.end(), b.begin(), b.end()
, std::inserter(result, result.end()));
a.swap(result);
}
715 :
デフォルトの名無しさん :2008/04/15(火) 08:00:05
* ** *** **** ... みたいな感じの出力を得たいのですが、***を出力する部分は、なにか特別な書き方とかないですか? 関数を作るしかないですか?
>>715 MFCならスタティックテキストの表示を*に変えるという機能(設定)があったり。
自前でもキー入力(KeyDownとか)→別の変数に格納→その文字数だけ*を表示で簡単に出来る。
// * を n 個出力する関数 void f(int n){ for(int i = 0; i < n; i++) std::cout << '*'; std::cout << std::endl; } void g(int n){ for(int i = 0; i < n; i++) f(i); }
std::string s(length, '*'); std::cout << s << '\n';
#include <iostream> #include <iomanip> int main() { for (int i = 0; i < 10; ++i) std::cout << std::setw(i) << std::setfill('*') << "" << std::endl; } ところでC++でいいんだよね?
C言語ならこんなもんか void f1() { int n, i; for(n = 1; n <= 10; n ++) { for(i = 0; i < n; i ++) putchar('*'); putchar('\n'); } } void f2() { int n; for(n = 1; n <= 10; n ++) puts("**********" + 10 - n); } void f3() { int n; for(n = 1; n <= 10; n ++) printf("%.*s\n", n, "**********"); }
printfの書式でもっと簡単にできなかったっけ?
イメージ
>>720 のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・
>puts("**********" + 10 - n); このやり方はじめて見た。目から鱗やわ
課題でc++のbasic_stringの様なstringクラスを作っています。 その中でstr >> coutはクラス内でoperator>>を用意することで 動くようになったのですが、cout << strは「二項演算子<<はクラス strをサポートしていません」と言われてしまいます。 これはどのようにしたらcout << strが出来るようになるのでしょうか? またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は 作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか? どうかよろしくお願いします。
なんか物凄く基本的なことのような気がしますが C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?
>>724 上:strをサポートする二項演算子を書く。
basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st);
下:無理。
>>726 ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。
一部バイナリが混ざってるファイルを読む必要があったので助かりました。
>>728 K&R2 A6.1 (promotion) を参照してください。
char/unsigned char は先に int に変換される点、特に要注意です。
731 :
729 :2008/04/16(水) 04:57:02
>>730 char c = 0x81;
if (c == 0x81)
printf("=\n");
else
printf("!=\n");
の結果って、あれ〜?!ってなりませんか?
>>731 char が符号付きで最大値が 127 の場合の話なら、
char c = 0x81 の時点で未定義動作。
問題は promotion じゃなくてオーバーフロー。
0x81がunsigned charじゃないじゃん
734 :
732 :2008/04/16(水) 12:20:21
> char c = 0x81 の時点で未定義動作。 ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、 処理系定義のシグナルが発生する、らしい。
735 :
729 :2008/04/16(水) 20:42:23
>>732 >>734 了解いたしました。
char buffer[N];
...
while (fgets(buffer, N, fp) != NULL) {
if (buffer[i] == ...)
...
}
などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。
unsigned char buffer[N];
とすれば、問題ないのではありますが。
ご指摘ありがとうございました。 またひとつ賢くなりました。
>>735 漢字コードをいろいろ扱うなら
>>735 だと unicode の時に困るんじゃなかろうか?
(文字列に \0 が含まれる可能性が高いから)
C++では以下のように大丈夫そうですけど。 signed char と unsigned char は同表現と書いている 読み間違い? A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.9); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers.
>>737 読みには自信ないのですが、
単に、
1) char/unsigned char/signed char のいずれも同じ量のメモリを占有する。
2) char/unsigned char/signed char のアラインメント(配置位置、偶数バイトを先頭にする、アドレスが4 の倍数のバイトを先頭にする、など)が同一である。
という意味でのみ same としているだけではないでしょうか。
char / unsigned char / signed char の表現がまったく同一であるというのは不可能と思われますのですが。
後続の文では、
char のすべてのビットが数をあらわしているわけではない(単に関係するといっているだけ、符号の場合もありますよ、ということでしょうか。)
unsigned char はすべてのビットが数を構成する要素となる。
と読めます。
739 :
デフォルトの名無しさん :2008/04/17(木) 07:16:24
template <class T> template <typename T> この2つはちがいがありますか?
違いは無い
class じゃないのも使うよなーとか思っていつも typename にする俺
俺もある時期から、typenameが手癖になってしまった。 別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら 二つ返事でclassにするけど。
なんとなく表明の意味で使い分けるかも。 その後しっかり中でstatic_assertするけどね。
744 :
デフォルトの名無しさん :2008/04/17(木) 10:03:28
クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?
残念ながらできない。
746 :
デフォルトの名無しさん :2008/04/17(木) 11:04:06
strcatを使わずに char src[ ] = "seikima" char dest[4] = "tsu" という文字列を結合し、表示させることが出来ますか?
>>746 char result[11];
sprintf(result, "%s%s", src, dest);
printf("%s\n", result);
748 :
746 :2008/04/17(木) 11:14:54
746です。言葉足らずでした。 sprintfも使わずにforを使って何とか表示させたいのですが いかがでしょうか?
>>747 じゃないがやっつけ仕事なんで間違ってたらごめん
char ret[11];
for(int i =0 ; i < strlen(src) ; i++)
{
ret[i]= src[i];
}
for(int i=0 ; i <strlen(dest) ; i++)
{
ret[i+strlen(src)}=dest[i];
}
printf("%s\n",ret);
750 :
746 :2008/04/17(木) 11:27:20
>>749 >>746 に書いたんですが、今回string.hに関するものは使っちゃいけないので
strlenも使用出来ない感じです。
>>746 にそんなこと書いてNEEEEEEEwwwww
strlen()をsizeof()-1に変えれば同じ動作だ
>>746 条件後だししすぎ
char result[20], *p, *q;
for(p=result,q=src;*p++=*q++;);
for(p--,q=dest;*p++=*q++;);
753 :
746 :2008/04/17(木) 11:46:22
重ね重ね、申し訳ないです。 ポインタも使ってはいけないようです。
宿題かよ。消えろ。
ついでに、その出題者はぶん殴っていい。
宿題なら学習内容に沿ってるはずだから テキストでも目を通した方が早いんじゃないの? 何の項目についての課題か分からないんじゃ答えようがないわ
入念な釣りだなあ。 次は「 [] 演算子も使えません 」とか?
758 :
746 :2008/04/17(木) 11:59:26
一旦、整理してみます。 課題:配列について 内容:char src[ ] = "seikima"; char dest[4] = "tsu"; と配列を用意し、destの中身をsrcに結合させる。 ただし、for文を使うこと・ポインタ、string.hは使ってはならない。
760 :
746 :2008/04/17(木) 12:03:56
>>759 誘導ありがとうございます。ご迷惑をおかけしました。
連結するための容量は確保しなくていいのか、とか dest を書き換えずに src に書き込むのか、とか、 宿題にしてもクソすぎるだろ。学校名晒してくんない?
746の時点で明らかに宿題じゃないか。なにを今更
763 :
デフォルトの名無しさん :2008/04/17(木) 12:21:40
printfの様な、引数の数が一定しない関数を作るにはどう定義し 中でどう読めば良いのでしょか。
Cで標準ライブラリが用意されてない環境なら、自動的に
>>758 の条件に
近くなると思うけど、ポインタも駄目てのは解らん。
>>763 関数のオーバーロードとかでできんじゃね
可変長引数でぐぐる
>>763 可変長引数とかva_argsなんかでググるといいと思うよ。
重婚もいいところだな
771 :
763 :2008/04/17(木) 12:37:07
有り難うございます。 stdarg.hなんてヘッダ、目にした事すらありませんでした。
ところで可変長引数って設計的にどうなのかな? 個人的には設計に失敗してやむなく・・・ってイメージがあるのだが
ハックやチートの部類に入りそうなやり方してるよね。
774 :
763 :2008/04/17(木) 12:46:42
>>772 **でも事足りるんですが、その場でわざわざポインタの配列を用意しないと
いけない場合が出てくるだろうし、その場で列挙出来たら楽かなぁとか。
>>772 型安全性に問題があるから、特に C++ ではやむなくって意識でいいと思う。
C++ 的には iostream や boost::format みたいに演算子で繋ぐのが正解かな。
CかC++の組み込みの勉強したいんですがお勧めの本ありませんか? 組み込みの本って探してもどこにも無いし、ネットで買おうにも中身がどんな感じかも分からないんでどれを買えばいいのか分からないです あとできれば必要で組み込み初めてに適した機材とかも教えて欲しいです
ソフィアシステムズで評価ボードを買ってBSPをいじって動作確認すればいいお^^
以下の2つは戻り値以外に何か違いがありますか? fwrite(buf, 1, 1024, fp); fwrite(buf, 1024, 1, fp);
779 :
デフォルトの名無しさん :2008/04/18(金) 00:45:24
沢山の実数(doubleとか)が生成されるときに、その分散を計算したいんですが、これってやはり一度生成される全部の実数を どこか配列とかに格納しないとだめでしょうか?
>>779 分散=(X^2 の平均) - (Xの平均)^2
を使用すれば、1pass で計算できますよ。
781 :
デフォルトの名無しさん :2008/04/18(金) 01:04:09
値が生成されるたびに、X^2とXの平均を計算しておくのですね。
逐一平均を計算するんじゃなくて、合計値と要素数を記憶だな。 最後にまとめりゃOK
>>778 もしかしたら処理速度が変わるかも・・・ね?
784 :
デフォルトの名無しさん :2008/04/18(金) 02:02:27
色々ありがとうございました。クラスをつくってみました。 class stat { public: stat() : sum(0), sum_square(0), num(0) {} void push(double a) { sum += a; sum_square += a*a; ++num; } double mean() { return sum / num; } double variance() { return sum_square/num - (sum/num)*(sum/num); } private: double sum; double sum_square; int num; };
785 :
デフォルトの名無しさん :2008/04/18(金) 07:50:12
意図した通りに受け取れないのですが、なぜでしょうか。 「GCCではgetche」の行のprintf()をコメントアウトするとちゃんと取れるのですが #include <stdio.h> int main(void) { int for1inc = 0; char userinput = 0; for(for1inc=0; for1inc < 10; for1inc++) { printf("文字を入力 : \n (GCCではgetche()が使えず改行コードと共に入力されるので5回までしか入力不可) \n\n"); userinput = getchar(); printf("Your input is %c. ""%c"" ASCII code is %d. \n", userinput, userinput, userinput); for( ; userinput; userinput--) { printf("%c", '.'); } printf("\n"); } return 0; }
>>778 >783の戯言はさておき、途中でエラーが発生したときの扱いが違う。
前者は書き込みに成功したバイト数が得られるが、
後者は1024バイト全てが書き込めたかどうかしか判らない。
788 :
141 :2008/04/18(金) 10:29:25
すみません。以下のコード、BCCでは一応正常にファイルから 読み込んで画面に表示してくれますが、VC++では表示してくれ ません。プログラムで何か処理が抜けているんでしょうか? #include "stdafx.h" // VC++の場合 #include <iostream> #include <fstream> using namespace std; int main() { int i; double x,y; ifstream fin; fin.open("aaa.dat"); while(fin >> i>> x >> y) cout << i << ' ' << x <<' ' << y << endl; fin.close(); // cin>>i; // VC++の場合 return 0; } aaa.datの中身(テキスト) 1 10.0 12.3 2 20.0 20.5 3 30.0 30.8 4 40.0 50.6
789 :
デフォルトの名無しさん :2008/04/18(金) 10:39:04
↑名前の141、以前のもので意味はありません。
VC9で普通に動いてるけど。
791 :
デフォルトの名無しさん :2008/04/18(金) 11:14:42
メイン文で使っている*argv[]をユーザ関数内で使いたいので ユーザ関数では仮引数をchar **a[]にしているのですが、実引数は何にすればいいのか分からないので教えて下さい
>>791 argv そのまま渡せるように引数も同じ型にしとけよ。
793 :
デフォルトの名無しさん :2008/04/18(金) 11:27:51
>>792 argvをそのまま渡すようにするには、ユーザ関数の仮引数と呼び出す際の実引数は何にすればいいのでしょう?
>>793 仮引数は main にある argv と「同じ型」、実引数は argv 。これでいいか?
795 :
デフォルトの名無しさん :2008/04/18(金) 11:48:44
>>794 分かりました、ありがとうございました。
796 :
デフォルトの名無しさん :2008/04/18(金) 13:36:50
>>788 エラーとかじゃなくて単に何も表示されない?
ファイルの置き場所ミスってるだけじゃねーの?
798 :
788 :2008/04/18(金) 15:50:11
VC++2008 Express Editionでdebugモードでコンパイルし、 データファイルaaa.datをdebugフォルダに入れて実行ファイル を実行すると正常に実行されます。ですが、統合環境では何も 表示されないです。 Projects\test\test (testは私がつけたプロジェクト 名のフォルダ) というフォルダにデータファイルを置 くと統合環境ではうまくいくようです。しかし、こん なこと最初はわかんないよ。
>>798 フルパスでファイルを扱うのでなければ、カレント
ディレクトリをちゃんと意識するようにしないと。
is_openでちゃんと開けたか確認したほうがいいよ
open使わずに std::ifstream fin("..."); てやったほうがいいよ close後何も処理しないのならcloseも不要だよ
C++やろうと思うんですけど、オススメの教本教えてください Cとjavaは一応できます
boostのソースコード(無料)(偏差値70)
メモリは並列にアクセスできますか? 例えばHDDだと2台あればパフォーマンス落ちずに同時アクセスできますが
>>804 NUMAとかそーいうキーワードで調べてみるといいと思う。
>>777 ありがとう。評価ボード調べてみたらくそ高けぇw
ごめんなさい勉強用程度なら1万程度もあれば揃うだろうとなめてました
>>807 d これは面白そう
もうちょっとググって組み込みのこと勉強してきます
>>798 [プロジェクト]-[プロパティ]-[構成プロパティ]-[デバッグ]-[作業ディレクトリ]
#include <stdint.h> はどの環境でも使えますか? とブーストとかSTL portとか入れればどれでも使えますか? 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです 使い物になるので使いたいのですが互換性はなかなかあるんですか
文書が色々とおかしいです エスパーでおねがいします
VC2008で対応していなかった為、stdint.h使うのをやめることにしました
わかりました がんばってください
>>812 > #include <stdint.h> はどの環境でも使えますか?
いいえ。
> とブーストとかSTL portとか入れればどれでも使えますか?
いいえ。
> 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです
いいえ。
> 使い物になるので使いたいのですが互換性はなかなかあるんですか
いいえ。
日本語学びたての外国人か コンピューターにものすごい興味がある赤ん坊のどちらかだな。
818 :
デフォルトの名無しさん :2008/04/18(金) 23:22:53
外国人の人だと思うので、添削してみました。頑張ってね。 初心者なのですが、いくつか質問させてください。 #include <stdint.h>はどの環境でも使えますか? boostとかSTL portとかは、インストールすれば使えますか? 32bit環境で、64bit整数のビット演算、掛け算がかなり速くできて、 使い物になりそうなので使いたいのですが、互換性についてはどうでしょうか?
std::vector<std::string> vtSource; を UTF16 に変換して std::vector<std::wstring> vtDest; に保存したいと思っています. // string >> wstring 変換関数(中身はダミー) std::wstring A2WString(const std::string& strSource)) { return std::wstring(L"out"); } この変換関数での変換は以下のコードでできました. std::vector<std::string> vtSource; std::vector<std::wstring> vtDest; vtSource.push_back( "AbC" ); std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), A2WString ); しかし,変換関数にデフォルト引数があるとコンパイルエラーになりました. std::wstring A2WString2(const std::string& strSource, int i=0)//デフォルト引数がある { return std::wstring(L"out"); } transform 第4引数で bind2nd や ptr_fun を使用すればいいような気がするんですが,どのように書けばいいんでしょうか? std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), std::bind2nd( std::ptr_fun(A2WString2), 0) );//コンパイルエラー Window2000 Visual C++ 2005 express edition
>>812 C++なら、Boostを入れると<boost/cstdint.hpp>が使える。
名前空間boostに入っていること以外はだいたいC99の<stdint.h>と同じ。
>>819 いったん別の関数を挟めばいいはず。
inline std::wstring A2WStringHelper(const std::string& strSource)
{
return A2WString(strSource);
}
こういうものを作って、std::transformにはこれを渡す。
スタティックテキストのプロパティCaptionを変更するにはどうすればいいんですか? IDC_STATIC.Caption("aaa"); で動かないんですけど
IDC_STATIC.Caption = "aaa"; GetDlgItem(IDC_STATIC)->Caption = "aaa"; これでも動きません
>>822 IDC_STATICは言わばワイルドカードなので、
キャプションを変えたいスタティックテキストに個別のIDを割り当てる必要があります。
つーか、そもそも書き方も判ってなくてコンパイルも通らないならエラーメッセージを張れと。
ありがとうございます。名前を付けました GetDlgItem(IDC_STATICTIME)->Caption = "aaa" error C2039: 'Caption' : 'CWnd' のメンバではありません。 となります
IDC_STATICTIME->Caption = "aaa" これだと error C2227: '->Caption' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 こういうエラーになります。
Captionなんて無いよ・・・とエラーが教えてくれてるじゃん なんでそんなにCaption大好きなの? GetDlgItem(IDC_STATICIME)->SetWindowText("aaa");
ありがとうございます 別に好きなわけじゃないんです VBの時はこうやっていたので プロパティの項目で設定できないのならVC++で項目の意味はあるんですか? 全部のプロパティの設定方法を調べなきゃいけないんでしょうか?
プロパティ?ダイアログの? あんなのは飾りだ。
意味があるとしたら、設計時に入れれば、コーディングしなくて良い事ぐらいかな? VCは他もみんなこんな感じだから、VBからだと慣れるしかないな。 プロパティのVisible項目→コーディング時はShowWindow();
OK覚悟はできたwwww
C#を一通りやった者ですが、CよりC++の方が始め易いでしょうか?
C# からなら C は不便に感じると思う。 C++ のがいいかと。
835 :
819 :2008/04/19(土) 01:46:47
>>821 ありがとう.とりあえずそうやればできました.
ただ,何でこれは通らないんでしょうか?
std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ),
std::bind2nd( std::ptr_fun(A2WString2), 0) );
A2WString2() の第一引数の参照型をやめたらこれでもコンパイルできましたが,
もしよろしければどなたかご教示願います….
//引数の参照型をやめる
std::wstring A2WString2(const std::string strSource, int i=0)
{
return std::wsting(L"out")
}
836 :
デフォルトの名無しさん :2008/04/19(土) 05:07:02
JavaとかC#から始めた人はCやC++の世界には入ってこないでください。
837 :
デフォルトの名無しさん :2008/04/19(土) 07:57:16
ガベージコレクタは便利かもしれないが、その便利さゆえに何か重要なことを失くしているような気がする。
「JAVAスクールの危険」ってはなし?
Java はアレだが、C# はまだマシだと思うけどな。まあ。
>>835 それは有名な参照の参照問題
詳細はSTL バインダで検索して一番上あたりがそのものズバリだと思う
解決策だけ抜きだすとboostのfunctional.hppのboost::bind2ndを使う
さらにptr_funを使わずにboost::bind2nd(A2WString2)と書けるところも利点だ
>>837 温室育ちが軍隊に入ったら周りが迷惑するだろ
軍隊という表現は語弊があるな せめてど田舎とか電気が通ってないとかそういう表現にしないと
その表現もかなりニュアンス違うな。 まぁ、無理して比喩を使う必要はない場面だと思う。
2chにゆとりが入って来たでおk
オートマ車しか乗ったことが無い人が、 マニュアル車に乗る感じとか。 でもC/C++をちゃんと理解して使い始めるなら、良いと思う。 理解するフェーズで挫折する人は、諦めてもらって、 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
1速のままで法定速度維持してエンジン壊すってか。
「郷に入っては郷に従え」でいいんじゃないかと
> 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。 多言語から移ってきた人の3割くらいはこれかな・・・?
映画と小説の共存が可能なように美麗な3Dグラフィックゲームと想像力をかきたてる2Dのドット絵ゲームというのは共存が可能だと思うのだがいかがなものか
ドット絵すらないroguelikeもよろしく
文字は高尚なドット絵だよ!
ぷァ
*nixのフレームバッファコンソール上でハードウェアアクセラレーションを使って描画とかしたい
すみません 圧縮・解凍DLLを利用して、どの形式のファイルを渡されても 同一の方法で展開することのできるライブラリってありませんか? ファイルをチェックして適切なDLLへ渡すやつです。
>ファイルをチェックして ファイル名で?ファイルの中身で?
ファイルの中身です EXEでも解凍できるやつもあります そういうのも展開したいです
とりあえずは 拡張子判別DLL(ググって) と 統合アーカイバ の組み合わせかな。 exeは知らない。アーカイブ本体をexe末端に付けてるか、 リソースとして持ってるか、とかの方式で変わってくるだろうし。
対応形式が多いのはXacRett.dllかな
それらを自動でやってくれるのはないかと…
サンクス
863 :
ミミ :2008/04/20(日) 13:10:19
Visual C++ でデバッグバージョンのバイナリを作るときって、 みなさんは名前を変えますか?どんな方法にしてますか? [方法1] Debug も Release も同じファイル名にして、ビルドすると上書きされるようにする。 [方法2] Debug バージョンには _d のようなサフィックスを付ける。 some_d.exe hoge_d.lib など。 [方法3] Debug と Release で出力フォルダを分ける。 bin/Debug/some.exe bin/Release/some.exe など。
デフォルトは方法3だよな。 単独で動かす時はそれで十分やね。 他のアプリから利用する必要がある場合は方法2じゃないと都合が悪い。 方法1は論外っすね。
>>858 そういうものがあるとしたら、そういうフリーのソフトが公開されている筈だよな。
そういう公開ソフトはないのだから、当然そういうDLLはない。
まぁ、>859にある「統合アーカイバ・プロジェクト」辺りを見てこいと。
XacRettで解決したんですけど…
最近ゲームのプログラムいじってたらprint系で浮動小数が出力できなくなってしまったんだが、 同じようになったことある人いる?いたら解決策とか教えて欲しいです。 症状としては、%fを含むprint系の関数(wsprintfとかvfprintf)を実行すると 「問題が発生したため〜」っていうおなじみのダイアログが出てきて落ちちゃうんです。
言語再インストール
ウィンドウを作成して、そこにビットマップを表示させたりするDLLを作ってるんだが、 外部からもらったバイナリBMPデータをどういじればいいのか分からん。。。 //--- PAINTSTRUCT psPaint; HDC hWndDC; HDC hMemDC; HBITMAP hBitmap; HGDIOBJ hGdiObj; hWndDC = BeginPaint(g_hWnd, &psPaint); hMemDC = CreateCompatibleDC(GetDC(g_hWnd)); hBitmap = CreateComptibleBitmap(hMemDC, 100, 100); hGdiObj = SelectObject(hMemDC, hBitmap); /* ここでバイナリをhBitmapに設定したい */ BitBlt(hWndDC, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); //--- ビットマップバイナリをどうにかしてhBitmapに突っ込んでやれば良いのかと思ってるんだけど、 方法がわからん… そもそも考え方が間違ってる?
CreateDIBitmap
>>867 再現ソースとエラーを張れと何度いったことか
>>872 再現コードの作成はちょっと全体の量も多いし見当もつかないので難しいです・・・。
関係あるとしたらどんなことが考えられるでしょうか?ロケールとか?
>>873 スタックを壊したとか関数テーブルを壊したとか
多分バッファオーバーフローか未初期化ポインタを使って
アクセスしてはいけないメモリを壊した可能性が高い
だからエラーメッセージ張れつ〜うの。テンプレに書いてあるでしょ 呼び出し規約とかランタイムとかリンクされるライブラリとか なんかプロジェクトの設定いじったでしょ。それを直せばいい
>>863 デバッグ版はインストール先のフォルダ。
リリース版はインストーラ作成のフォルダ。
>>874-875 レスありがとうございます。以前できていたところがいじってないのに
急になったので875さんの臭いかも知れないけど、気づいたらなってしまってました・・・
BCCでやっててエラーメッセージを取得できる部分が見当たりません・・・。
こういう時ってどうやってメッセージを受け取るんでしょう?すいませんアホで・・
浮動小数とか言ってる時点でキミがアホなのはみんな分かってるよ
これでまったく関係ない場所でゼロ除算で落ちてたとかだとウケるな
あっwsprintfかw printf系じゃないから%fとか無理 sprintfつかえ
snprintfとかswprintfでもいいよ
>>870 >>871 さんくす。
CreateDIBitmap使ってやってみたらいけた。
表示用のビットマップはCreateCompatibleBitmapで作って、
外部からもらったバイナリを描画するビットマップをCreateDIBitmapで作成
BitBltで転送して実装できたよ
ありがとう
>>879 確実にvsprintfで落ちてました。
>>880-881 ダメでした。あきらめます。
親切にレスしてくださった皆様、ありがとうございました
null = new int[10] で確保した領域はどこに存在するの? delete[]しなければ、この確保した領域はプログラムが終了してもずっとそこに存在したままになるの?
>>884 ヒープ領域のどこか
終了したらちゃんと解放される
一部されないOSもなくはない
コンパイル時にtype_infoみたいな感じで静的にクラス名の文字列を取得できる方法ってありますか? テンプレートクラスで例外を投げる時に使いたいんですが・・・
boostって本当にすごいね・・・そんなのも判定できるとは でも型名の取得は厳しいのかな・・・
STLをはじめ、テンプレートをよく使いなさい。 型の完全名がカオスになって諦めがつくから。
void CtimerDlg::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 msgdlg aaae = new msgdlg(); aaae.Create(IDD_DIALOG1, this); aaae.ShowWindow(SW_SHOW); } このボタンを押すとダイアログウィンドウが一瞬表示されたようにみえるのですが、表示されません。 SW_SHOWがいけないんでしょうか?
それコンパイル通るの?
コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。
コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します
あ、aaaeをポインタにしたら出来ました。
単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。
vsprintfについてなんですけど、下記のva_end(..)っているのですか? xx func(const char* format, ...) { char buf[256]; va_list args; va_start(args,format); vsprintf(buf, format, args); va_end(args); // <=== これ必要なんですか? ... }
規格で、同じネストレベルでva_start,va_endの組で使うことになっている。
実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか
すいませんちょっとお聞きしたいのですが、GCCで if(ret = 1){ int dt = 1; } みたいにしたら、 「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」 と言われたので、 if((ret = 1)){ int dt = 1; } みたいにしたら、許してもらえました。 なぜ ((ret = 1)) の方がよいのでしょうか??
>>900 ret==1って書いたらその警告消えてくれるよ。
902 :
897 :2008/04/22(火) 21:54:54
>>900 ==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え
別に前の書き方でも問題ない
(())の方がよいというわけじゃない
904 :
900 :2008/04/22(火) 22:05:44
>>902 VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。
しかし、他の処理系で動くとは限らない。
>>902 書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。
運悪く駄目なサンプルに当たったね。
>>896 なるほど!
msgdlg aaae = new msgdlg();
をグローバル領域に持って行っても起動しました。
ポインタの理解が深まりました。ありがとう!
ちょっとぉぉぉぉぉ
これが 「何か適当にいじったら動いた」 という奴か
> グローバル領域 深まってない悪寒
さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな (だから、その変てこなのは後から馬鹿が弄ったんだってば ><)
>msgdlg aaae = new msgdlg(); このコード、何度見ても謎が残りすぎ。
>891の段階で既に釣りだったんじゃね?
>>907 C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。
煽りとかじゃなくて本当に。基礎は大事だから。
とりあえず、理解する必要のあるキーワードとしては、
ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ
あたりかな。
釣りなら、それはそれでおk。
916 :
デフォルトの名無しさん :2008/04/23(水) 00:24:05
switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを 作らないとだめですか?
だめです
>>916 例えばこういうことならできる。
switch (value) {
int someVar;
case 0:
someVar = 0;
break;
case 1:
someVar = -1;
default:
someVar = value;
break;
}
>>914 レベルアップした気分ですごく満足なのですが
もう一度新C++言語入門シニア編上下を読み直してみます・・・
が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。
920 :
デフォルトの名無しさん :2008/04/23(水) 00:35:09
>>919 頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。
でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。
だから
>>914 も困った挙げ句
> ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり
という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。
>>919 msgdlg aaae; //○msgdlg型の変数
msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入
msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入
一言でいうと,どこがイコールよ?
>>919 void CtimerDlg::OnBnClickedButton2()
{
// new msgdlg() → msgdlgのインスタンスをヒープに確保。
//
// msgdlg aaae = ... → msgdlgのインスタンスをスタックに確保して、
// msgdlg(msgdlg* ptr)に適合するコンストラクタで初期化。(※1)
msgdlg aaae = new msgdlg();
...
// 自動変数のaaaeがスコープから外れるのでデストラクタが呼ばれ、
// aaaaが保持していたウィンドウなどが削除される。
//
// (※1)のポインタptrをdeleteしていなければメモリリーク。
}
が理解出来ていないように見える。
作りたいのがモーダルダイアログなら、
{
msgdlg aaae;
aaae.Create(IDD_DIALOG1, this);
aaaa.DoModal();
}
関数を抜けてもmsgdlgを保持するなら、
グローバルでなくCtimerDlgのメンバにする。
よく見たらeだった。 × aaaa ○ aaae
ビットフィールドは、 unsigned char x : 50; のように元の型を超えていても定義できますか?
unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか? あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか
このようにしたら、確保する領域は、40bit + 8bitになりますよね? 33 + 7 ではないですよね? class A{ public: bitset<33> a; char b : 7; };
自己解決しました これで長い列に変換出来ました bitset<40> *p; unsigned char s[5]={1,255,1,255,128}; p=(bitset<40>*)&s; cout<< *p;
そ れ は 偶 然 だ
>>922 >>923 ありがとうございます。すごくよくわかりました。
void CtimerDlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
int a =0;
while(a < 100){
msgdlg *aaae = new msgdlg[100];
aaae[a]->Create(IDD_DIALOG1, this); // エラー
aaae[a]->ShowWindow(SW_SHOW);
aaae[a]->OnBnClickedOk();
delete aaae[a];
a++;
}
}
error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。
これは何がいけないんでしょうか?
下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、 メモリリークが起きてしまっているようで解決方法が見つからず困っています。 STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか? ( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした) それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか? 環境はVC++2005です、よろしくお願いします。 class base { public: ~base(){ destory(); } virtual void destory(){}; }; class test : base { public: std::vector< int > aaa; void destory(){ aaa.clear(); } }; void main(){ void *p; { test *ptest; ptest = new test; ptest->aaa.resize(100); p = (void*)ptest; } //ここではポインタ p の基本クラスが base ということ以外はわからない delete (base*)p; }
デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
古い形式のキャスト使ってるとか馬鹿じゃねーの? スマートポインタ使ってないとか馬鹿じゃねーの? いやいや、馬鹿じゃないって。 デストラクタの中から仮想関数呼び出すのはさすがにないけど。
… ~base() が呼び出されるときは 既に test::destory の実体はなくなっているからでしょうか? 馬鹿ですみません… こういう場合、クラスtestで確保したメモリは どう解放したら良いのでしょうか?
しかも書いてありました。 スマートポインタで調べてみます。
baseのデストラクタにvirtualをつけて上で testに自分のdestoryを呼ぶデストラクタを書けば baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
>>937 ありがとうございます、無事に解放されるようになりました。
いろいろと勉強不足でした。
仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん
メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
>メンバ変数のデストラクタも呼び出されない 詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が 渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか だったと思う(逆に言えば仮想関数でないと把握できない)。 ちなみに勘違いしてそうなので書いておくけど、デストラクタとは ~クラス名();←引数無し のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。 この場合正しくは virtual ~base();とかだ。
あ、そういえば~base()はちゃんと書いてあるのかw
なるほど…仮想関数テーブルですか、 virtual指定はなんだか漠然としていて理解しにくかったですが なんとなくはどう動作するかが理解できました。 ありがとうございます。
>>930 下のソースはコンパイル可能
行数減らしたから少し見辛いかも
>>914 の言うようにポインタと参照について学んだ方がいい
struct CTest{ void test(){} };
void f(){
CTest a;
CTest* b = new CTest();
CTest* c = new CTest[1];
CTest d[1];
a.test(); (*&a).test(); (&a)->test(); (&a)[0].test();
(*b).test(); b->test(); b[0].test();
(*c).test(); c->test(); c[0].test();
(*d).test(); d->test(); d[0].test();
delete b;
delete[] c;
}
>>942 感動しました。こんなにわかりやすいの初めてみました。がんばります!
944 :
デフォルトの名無しさん :2008/04/23(水) 15:37:22
物凄い初歩的な質問なんですが 上手い方法を教えてもらいたくて質問します。 ある文字列があって 1文字ずつ処理していくんですが、 何か文字に変化があった時だけ処理を行いたいのです。 char str[]="ああいうええお";//何か文字列 int len=strlen(str); char current_c; current_c=str[0];//内容を覚える for(int i=0; i<len; i++){ if(current_c!=str[i]){//連続している文字が変われば //処理 } } こんなのを思いついたんですが これだと、1つ目の文字が当然処理されません。 current_c=str[0];//内容を覚える これを current_c=str[0]+1;//内容を覚える として、必ず1回目は処理が行われるようにするのも考えたんですが もっとちゃんとしたスマートな方法があると思うんですが・・・ こういう場合、どうやるのが一般的なのでしょうか?
str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946 :
デフォルトの名無しさん :2008/04/23(水) 15:48:09
>>944 charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。
分かっているならごめん。
>>945 0に相当する文字が来た時に駄目でしょ。
>>944 typedef char val_t;
val_t str[]="aabbbcccddee";
typedef val_t* iter_t;
for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){
if(it==begin || *back!=*it){
//処理
back=it;
}
}
(・∀・)
>>947 それはひょっとしてギャグでいってるのか・・・・
>>944 最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね?
ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。
でもそういうときの current_c は普通 prev_c だな。
一つ目の文字が変わるっていう意味が分からんw
953 :
948 :2008/04/23(水) 16:41:36
struct CTest{ bool operator!=(const CTest& o){ // ... return true; } }; template<typename iter_t> void unique_each(iter_t begin, iter_t end){ for(iter_t back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } } void f(){ CTest v[10]; // v[0] ... unique_each(v,v+sizeof(v)/sizeof(*v)); } (∩゜д゜)アーアーきこえなーい
>>951 今回は文字だから 0 にしときゃ良いけど、
一般に先頭要素または直前のと異なる要素を
判定していくには良い方法だよ。
>>945 の前提条件
nul終端文字列
>>947 の前提条件
文字列
>>950 の前提条件
コピーコンストラクタ
operator+
operator!=
を持っている型
>>953 の前提条件
operator!=
を持っている型
PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか?? そういうデバッグの仕方はC++では難しいのでしょうか。
>>944 #include <algorithm>
#include <string>
#include <iostream>
#include <functional>
int main() {
std::wstring src = L"ああいうええお";
src.push_back(0);
::setlocale(LC_ALL, "ja_JP.UTF-8");
for (std::wstring::iterator i = src.begin(); *i != 0; ++i) {
i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
std::wcout << i-src.begin() << *i << std::endl;;
}
}
終端一つ加えて条件が逆のadjacent_find
>>957 エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ
gdbとVC付属のやつとか
>>944 は、charの取りうる最大値を指していた場合
+1すると、オーバーする。
>>945 は、処理内容次第では、\0がいきなり来た場合にヤバい。
が、あのプログラムの場合strlenの値がループの実行回数だからOK
>953は、恐らく
>>944 が本当に必要だったものではない可能性が高いw
>>959 さん
なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。
ありがとうございましたm(_ _)m
>
>>944 は、charの取りうる最大値を指していた場合
>+1すると、オーバーする。
するってーと current_c=~str[0]; が適切?
オーバーフローしても大丈夫だろ。
あ、一文字目が処理されない
966 :
959 :2008/04/23(水) 18:12:21
リベンジ #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; ::setlocale(LC_ALL, "ja_JP.UTF-8"); std::wstring::iterator i = src.begin(); if (!src.empty()) { do { std::wcout << *i << std::distance(src.begin(), i) << std::endl; i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); } while(i++ != src.end()); } }
そして通告されるeucJP
vectorの配列を作ろうと思い vector<vector<string> > vecStrDim; vector<string> vecStr; string strTest = "test"; vecStr.push_back(strTest); vecStrDim[0].push_back(vecStr); とやってみました。コンパイルは通るのですが This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. とでて実行してもデバッグエラーになります vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません どうすればデバッグエラーを対処できるのでしょうか?
>>968 ×vecStrDim[0].push_back(vecStr);
○vecStrDim.push_back(vecStr);
>>969 あわわ……とんでもなく馬鹿なことしてすみません
解決しました
そのコードがコンパイルが通ることが不思議だ…
シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
まあ配列にしなくても1つしか実体が存在しないようになるけどな
975 :
デフォルトの名無しさん :2008/04/24(木) 00:49:34
#include <stdio.h> void main(void) { int a; pirntf("何か入力してください\n\n"); scanf("%d",&a); while(1){ printf("ぐははははははは!!\n\a"); } } この程度しか俺は中なので書けません。プログラマーさん お願いします。
976 :
デフォルトの名無しさん :2008/04/24(木) 00:50:21
↑MISSりました #include<stdio.h> void main(void) { int a,b,c; printf("数字を入力してください\n"); scanf("%d",&a); printf("数字をまた入力してください\n"); rewind(stdin); scanf("%d",&b); printf("数字をまたまた入力してください\n"); scanf("%d",&c); if(a == b == c) printf("等しいです,\n"); else printf("等しくないです,\n"); } これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは なんででしょうか?
>>976 a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。
その場合、恐らくa == b && b == c でいいだろう。
980あたり、次スレたのむぜ
>>977 おおwなるほど!
ありがとうございました^^
>>976 移動前のスレのコメントにもありましたが、
「君が参考にしてるものは信用しないほうがいい」
です。void main(...) はまずい。
void main は g++ でエラーになるしな。 gcc だと警告ですむけど。
983 :
981 :2008/04/24(木) 01:34:22
rewind() も、あるのかわからない.....。stdin に対して rewind() ?
数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
どこにあるのかわからないなら、ひとつひとつしらべるのが最善
問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか? #include<stdio.h> #define N 100 int main(void){ int min , max , mid; int count1, count2; int data, i; FILE *fp ここまでの指定はあるのですが、今自力でやってみてるんですが どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです
物凄い無駄な処理だなw 再帰呼び出しを使うのが良いよ
989 :
988 :2008/04/24(木) 04:46:09
ああ、ごめん。数字は順番に並んでるわけじゃないのか
諦めて全部足して5050から引け
#include <vector> //trueならmidより上、falseなら下 bool hilow(int min, int mid, int max, std::vector<int> src, std::vector<int> dst) { dst.clear(); std::vector<int> hi, low; //中間数超と以下でhi, lowに分ける for(size_t c=min; c <= max; c++) { if(src[c] <= mid) low.push_back(src[c]); else hi.push_back(src[c]); } //個数が規定値か調べて多い方を返す if(hi.size() == max - mid ) { dst.swap(hi); return ture; } dst.swap(low); return false; } 続く
続き void main() { std::vector<int> num; //ファイルからnumに一度全部読み込む //ここは自分で書けるでしょ? int min, mid, max; min = 1; max = 100; do { (max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2; if( hilow(min, mid, max, num, num) ) min = mid + 1; else max = mid; } while(max - min > 2); //完了 }
あー色々間違ってたw bool hilow(int min, int mid, int max, std::vector<int>& src, std::vector<int>& dst) dst.clear(); は無し f(hi.size() == max - mid ) { dst.swap(low); return false; } dst.swap(hi); return true; }
試してないけどこんな感じで良いと思うよ。 中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。
exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい
996 :
デフォルトの名無しさん :2008/04/24(木) 06:00:08
ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか? 「1Lとは」などで検索したのですが見つかりません。 環境はC++、BCCです。どなたか回答頂ければ幸いです。
997 :
デフォルトの名無しさん :2008/04/24(木) 06:09:58
>>996 整数のあとにつくLはlong intであることを表す。
10はintの10。10Lはlong intの10。
998 :
デフォルトの名無しさん :2008/04/24(木) 06:31:33
>>997 ありがとうございます!
long intをキーワードに検索したら大体わかってきました。
long intを代入するときはLをつけるという解釈であってますか?
違うよ。整数リテラルそのものにも型があるの。 1 は int型 '1' は char型 1.0 は double型 1L は long型
1000 :
デフォルトの名無しさん :2008/04/24(木) 06:49:16
重ねてありがとうございます! 詳しい説明でよくわかりました(多分)。 単なる1でも勝手にintにされてるんですね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。