【初心者歓迎】C/C++室 Ver.64【環境依存OK】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2009/02/10(火) 00:25:51ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1231499251/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0809デフォルトの名無しさん
2009/04/04(土) 11:39:330810デフォルトの名無しさん
2009/04/04(土) 11:39:47どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。
0811デフォルトの名無しさん
2009/04/04(土) 11:39:49なんつー的確な指摘w
0812デフォルトの名無しさん
2009/04/04(土) 11:40:580813デフォルトの名無しさん
2009/04/04(土) 11:46:52材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。
ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。
0814デフォルトの名無しさん
2009/04/04(土) 11:49:53void func2(MainClass* mc) {}
ここなんですが、最初は
void func2(boost::shared_ptr<MainClass>& mc) {}
こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき
コンパイルが通りませんでした。スマポの使い方として、生のポインタは
基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると
thisはどうやって渡せばいいかわからなかったので。。。
0815デフォルトの名無しさん
2009/04/04(土) 11:50:37はいいけど、君それ、手に持ってるのゆで卵だよね?
みたいな。
0816デフォルトの名無しさん
2009/04/04(土) 11:51:37なにか肝心なもの(フライパン)が抜けてるということですか?
0817デフォルトの名無しさん
2009/04/04(土) 11:59:380818デフォルトの名無しさん
2009/04/04(土) 12:08:37こう書くとAssertionに引っかかるし、、、
これって循環参照になってるから?
0819デフォルトの名無しさん
2009/04/04(土) 12:26:50Animationset m_animset;
という構造体があり、m_anim->GetAnimset();
というメソッドで個数が取得できます
m_animsetを最初から配列で100個くらい作っておけば問題ないのですが
可変で作る場合はどうすればいいのですか?
0820デフォルトの名無しさん
2009/04/04(土) 12:28:59vectorつかう
0821デフォルトの名無しさん
2009/04/04(土) 12:29:56ありがとうございますvectorについて調べてみます
0822デフォルトの名無しさん
2009/04/04(土) 12:36:32Animationset **m_animset;
0823デフォルトの名無しさん
2009/04/04(土) 12:57:52for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
m_animset.push_back(i);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}
という風にしたのですが
'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません
とエラーが出ます
メモリを確保するにはどうすればいいのでしょうか・・・・
0824823
2009/04/04(土) 13:05:05AnimationSet anim;
m_animset.push_back(anim);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}
という風にしたらできました
0825デフォルトの名無しさん
2009/04/04(土) 13:39:000826デフォルトの名無しさん
2009/04/04(土) 13:50:42enable_shared_from_this使えばいいんでないの?
0827デフォルトの名無しさん
2009/04/04(土) 13:55:39欲しい分だけメモリ確保です
0828デフォルトの名無しさん
2009/04/04(土) 14:20:580829デフォルトの名無しさん
2009/04/04(土) 17:57:33ダブルポインタって、ただのポインタのポインタとなにが違うんですか?
0830>>829
2009/04/04(土) 18:37:390831デフォルトの名無しさん
2009/04/04(土) 18:39:38その言葉を使う人間ができるプログラマかどうか。
0832デフォルトの名無しさん
2009/04/04(土) 20:14:390833デフォルトの名無しさん
2009/04/04(土) 20:35:11enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると
Boostが例外を投げます。
class MainClass;
class SubClass {
public:
template <class T>
void func2(boost::shared_ptr<T>& mc) {}
};
class MainClass : public boost::enable_shared_from_this<MainClass>
{
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(shared_from_this());
}
private:
boost::scoped_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}
0834デフォルトの名無しさん
2009/04/04(土) 20:42:29ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。
0835デフォルトの名無しさん
2009/04/04(土) 20:54:19ありがとうございます。
>大元のm自体をshared_ptrに格納する
というのは、
boost::scoped_ptr<SubClass> m_SubClass;
を
boost::scoped_ptr<SubClass> m_SubClass;
とするということですよね?
そうしてもBoostから例外を投げられます。聞いてばかりですいません。。
0836デフォルトの名無しさん
2009/04/04(土) 20:59:29違う違う、こっち。
int main() {
boost::shared_ptr<MainClass> pm(new MainClass);
pm->func1();
return 0;
}
0837デフォルトの名無しさん
2009/04/04(土) 21:09:54俺、ポッぽインタって言っている
で、3つはぽっぽっぽインタだな
0838デフォルトの名無しさん
2009/04/04(土) 21:10:23なるほど、動きました!
thisがboost::shared_ptr<MainClass>でなければならなかったということですね。
本当にありがとうございました。
0839デフォルトの名無しさん
2009/04/04(土) 21:17:04何処がおかしいのでしょうか?
VS2005 pro SP1
winXP SP3
#include <iostream>
using namespace std;
class Expr_node {
friend ostream& operator<<(ostream&, const Expr&);
friend class Expr;
int use;
protected:
Expr_node():use(1){}
virtual void print(ostream&) const = 0;
virtual ~Expr_node(){}
};
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
error C2143: 構文エラー : ',' が '&' の前にありません。
0840デフォルトの名無しさん
2009/04/04(土) 21:22:15friend ostream& operator<<(ostream&, const Expr_node&);
Exprなんて型ないからExprを変数名だと推定してる
0841デフォルトの名無しさん
2009/04/04(土) 21:28:37なぜエラー行を抜いた
class Expr;を前方宣言か?
0842デフォルトの名無しさん
2009/04/04(土) 22:05:38> スマポの使い方として、生のポインタは
> 基本的に全部スマポで置き換えるのが正しい
どこからそんなアホな理屈が出てきたんだ?
0843デフォルトの名無しさん
2009/04/04(土) 22:10:59C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし
Googleコーディング標準でもスマポがいいねって書いてあるから
まぁ初心者はそのくらいの気持ちでもいいかも。
ただ、だからといってboostを使うのではなく
一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。
ちんぽちんぽ。
0844デフォルトの名無しさん
2009/04/04(土) 22:16:100845デフォルトの名無しさん
2009/04/04(土) 22:17:31貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ
0846デフォルトの名無しさん
2009/04/04(土) 22:30:40>807 の例は参照に置き換えれば済むだろう。
所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。
0847デフォルトの名無しさん
2009/04/04(土) 22:33:15ああなるほど。
確かに、参照が使えるところには
ポインタよりも参照を使うべきだというのには同意。
0848デフォルトの名無しさん
2009/04/04(土) 22:33:250849デフォルトの名無しさん
2009/04/04(土) 23:01:56>>841
スマンカッタ
大きな勘違いというか、錯誤していた
前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた
もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら
スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが
多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです
なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね
0850デフォルトの名無しさん
2009/04/04(土) 23:13:03コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、
オブジェクトを破棄するという、実に巧妙な仕組みだね
0851デフォルトの名無しさん
2009/04/05(日) 00:35:280852デフォルトの名無しさん
2009/04/05(日) 02:50:300853デフォルトの名無しさん
2009/04/05(日) 02:51:41Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?
0854デフォルトの名無しさん
2009/04/05(日) 02:59:29所有権の移動や共有が必要ないなら、当然。
0855デフォルトの名無しさん
2009/04/05(日) 06:56:41どこがまずいのでしょうか??
struct pointV
{
int x ;
int y ;
};
class Test
{
std::vector<pointV> vecTest ;
public:
Test()
{
vecTest.reserve(8) ;
vecTest[0].x = 0 ; ←ここで発生するみたいです
}
};
よろしくお願いします
0856デフォルトの名無しさん
2009/04/05(日) 07:19:160857デフォルトの名無しさん
2009/04/05(日) 07:50:26有難うございました
0858デフォルトの名無しさん
2009/04/05(日) 13:08:57自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば
いいんじゃないか、と思ったんですが。
0859デフォルトの名無しさん
2009/04/05(日) 13:21:170860デフォルトの名無しさん
2009/04/05(日) 14:25:12内容はVBのテキストボックスに入力した数値をマイコンに送信し
マイコンに転送したCで作った制御プログラムで受け取り外部に転送するものです
いろいろ考えてみましたがさっぱりわかりません。よろしくお願いします
VB側
dim data(1) as Byte
data(0) = CByte(inputData Mod 256)
data(1) = CByte(inputData \ 256)
comSerial.Output = data
comSerial.Output = chr(0)
/*c言語*/
/*データ受信(マイコン側のフラグ処理は省略してます*/
unsigned char receive(void)
unsigned char data;
data = RDR;/*PCから受け取ったデータがあるレジスタRDR
return(data);
int main(void)
{
unsigned char data[2];
int i;
while(1){
i=0;
do{
data[i]=receive();
i++;
}while(data[i-1]!='\0');
};
0861デフォルトの名無しさん
2009/04/05(日) 14:45:50じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ…
あとVBガワのCOMポートはバイナリ?
0862デフォルトの名無しさん
2009/04/05(日) 14:54:23たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか
1024と入れるとほんの少ししか動きません。
VBがフリーズするときもあります。
VB側はバイナリーです。
よろしくお願いします
0863デフォルトの名無しさん
2009/04/05(日) 14:57:070864デフォルトの名無しさん
2009/04/05(日) 15:04:18つまり0が送信された段階で'\0'と同じと判断されるのですね
0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました
データの終了判断は他の数値にした方がよさそうですね
0865デフォルトの名無しさん
2009/04/05(日) 15:05:18実機ないから試せないけど,1000まではちゃんと動作確認できたと.
あとは 1023 とか 1025 だとどうなる?正常?
ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる?
> VBがフリーズするときもあります。
なんとなくパリティかボーレートが怪しい気がする.
プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない.
for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.
0866デフォルトの名無しさん
2009/04/05(日) 15:06:30そっちかー
0867デフォルトの名無しさん
2009/04/05(日) 15:38:561023と1025は正常に動作しました
Cとは関係ない話になりますがPC側のフリーズは
1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか)
→VBの反応なくなる→タスクマネージャーで強制終了→VB再起動
→「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ
→後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない
こんな感じです。
C側はH8に転送してますので確認は出来ませんが
VB側は出来ると思います。
手元にシステムがないので今は無理ですが。
>>864
VBの送信も悪いですが受け取るC側にも問題があるようです
0868デフォルトの名無しさん
2009/04/05(日) 16:28:42VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん.
シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\
データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります
0869デフォルトの名無しさん
2009/04/05(日) 16:50:15すいません。まだやってません
というか\0\0というのは2回送信してCで受け取れってことでしょうか?
0870デフォルトの名無しさん
2009/04/05(日) 17:08:45まず仕様を確認しろよ
\0(=0x00) を終端としてるようだが、それだと 256の倍数で
おかしくなるのは当然に思える。
0871デフォルトの名無しさん
2009/04/05(日) 17:12:01data(0) = CByte(inputData Mod 256)
data(1) = CByte(inputData \ 256)
上は下と同じことだと忘れていない?
data(0) = 0
data(1) = 1
0872デフォルトの名無しさん
2009/04/05(日) 17:13:520873デフォルトの名無しさん
2009/04/05(日) 17:21:54data[0] = receive();
data[1] = receive();
にするのが正しいんじゃないかと思う
0874デフォルトの名無しさん
2009/04/05(日) 17:54:13実習用のテキストだけどこういう感じです(´・ω・`)
>>870-871
アッー!!(;゙゚'ω゚')
そうだった。1バイト文字だからを終端にしたら256の倍数だと0ですよね
>>873
すいません。このプログラムは他の部分を除いて書いてるので
実は受信したデータが'O'だと次の文字見て'F'で正転、'R'で逆転みたいなことしています
でも受信したデータでdo〜whileを分ければいいだけでしょうけど
ちなみに数値データがある場合は
comSerial.Output = chr(80)←数値データあるよ
comSerial.Output = data
comSerial.Output = chr(0)←データ終わり
としています
入力されたデータはこんな感じです
dim inputData as Integer
inputData = Val(txtData.Text)
0875デフォルトの名無しさん
2009/04/06(月) 00:13:00グラフィックを表示するにあたって追加でインストール
しなきゃいけないものってあるんでしょうか?
OSはXP、visual c++ 2005を使用しています。
0876デフォルトの名無しさん
2009/04/06(月) 00:16:03GDI使うだろうし
0877デフォルトの名無しさん
2009/04/06(月) 00:36:12ですが教科書の通りにプログラムしても
なぜか動いてくれないんですよね・・・
これが問題ありそうな5,6,7、8行目なんですけど、
void CVc31view::OnDraw(CDC* pDC)
{
CVc31Doc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
で、エラーがこう出ます。
ex3.1.cpp
.\ex3.1.cpp(5) : error C2653: 'CVc31view' : 識別子がクラス名でも名前空間名でもありません。
.\ex3.1.cpp(5) : error C2065: 'CDC' : 定義されていない識別子です。
.\ex3.1.cpp(5) : error C2065: 'pDC' : 定義されていない識別子です。
.\ex3.1.cpp(6) : error C2448: 'OnDraw' : 関数の定義が間違っています。
0878デフォルトの名無しさん
2009/04/06(月) 00:51:24CVc31view クラスの宣言はどうなってる?
0879デフォルトの名無しさん
2009/04/06(月) 13:14:25たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?
0880デフォルトの名無しさん
2009/04/06(月) 13:54:04pValue[1] = 10;
のように配列をnewすると、
代入時に*が付かないのに変数にpが付くのがシックリ来ません。
vector使えとか、そういう話とは別に
ポインタ変数にpを付けられているかたにお聞きしたいのですが、
こういう場合にもpを付けられていますか?
それとも、int value = new int[10]; と書かれてますか?
0881デフォルトの名無しさん
2009/04/06(月) 14:02:570882デフォルトの名無しさん
2009/04/06(月) 14:05:42コーディング規約に従うだけ。
ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。
0883デフォルトの名無しさん
2009/04/06(月) 14:09:59話には参加できないな。うれしいぜ。
0884デフォルトの名無しさん
2009/04/06(月) 14:12:42その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。
# なんでvaluesじゃないのか、その方が気になる。
0885デフォルトの名無しさん
2009/04/06(月) 15:39:410886デフォルトの名無しさん
2009/04/06(月) 20:30:01クラスの外部でするべきでしょうか?
0887886
2009/04/06(月) 20:37:48-性的なメンバ
+静的なメンバ
あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには
publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか
わからずにいます。
目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で
1個あればいいんですが。
0888デフォルトの名無しさん
2009/04/06(月) 20:44:330889デフォルトの名無しさん
2009/04/06(月) 21:37:180890デフォルトの名無しさん
2009/04/06(月) 22:43:42静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?
0891デフォルトの名無しさん
2009/04/06(月) 23:20:39webページを教えて下さい。お願いします。
0892デフォルトの名無しさん
2009/04/06(月) 23:23:470893デフォルトの名無しさん
2009/04/06(月) 23:50:57概念はある程度わかるんですが実際 どうやって実装しているのか
分からないんです
0894デフォルトの名無しさん
2009/04/06(月) 23:58:06boostのコードでも見たらどうか。
0895デフォルトの名無しさん
2009/04/07(火) 00:14:27もっとも、基本はデストラクタでdeleteするという点は共通だけど。
0896デフォルトの名無しさん
2009/04/07(火) 00:26:070897デフォルトの名無しさん
2009/04/07(火) 00:35:54変数を宣言するときに
char buf[1000];
とするのと
char buf_0[100];
char buf_1[100];
...
...
char buf_9[100];
として確保するのでは、必要なメモリの量は変わってくるのでしょうか?
0898デフォルトの名無しさん
2009/04/07(火) 00:37:02やってみればいいじゃん。
0899デフォルトの名無しさん
2009/04/07(火) 00:59:460900デフォルトの名無しさん
2009/04/07(火) 01:17:09実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない
0901デフォルトの名無しさん
2009/04/07(火) 02:07:25CPUのアラインメントの関係で違ってくるかもしれんな
0902デフォルトの名無しさん
2009/04/07(火) 05:58:06コンパイラは通ったんですが、なんか怪しいような。
そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか?
int (*p)[10] = new int [3][10]();
0903デフォルトの名無しさん
2009/04/07(火) 09:53:36ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと
初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、
vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?
0904デフォルトの名無しさん
2009/04/07(火) 09:57:01コンストラクタを実行していないクラスを生成する…
無理ぽ
0905デフォルトの名無しさん
2009/04/07(火) 10:17:470906デフォルトの名無しさん
2009/04/07(火) 10:37:15わかりやすく解説してるHPとかありますか?
QueryStringのやりとりが分からなくて困ってます
0907デフォルトの名無しさん
2009/04/07(火) 10:45:44http://pc11.2ch.net/test/read.cgi/php/1077753522/
http://pc11.2ch.net/test/read.cgi/php/1048393217/
0908デフォルトの名無しさん
2009/04/07(火) 10:49:58>>907
レス数が900を超えています。1000を超えると表示できなくなるよ。