[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 02/13 21:50 / Filesize : 246 KB / Number-of Response : 943
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C/C++小心者スレッドPart1



1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:18:18 ]
プログラミング言語C/C++についての、小心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2以降。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す 
 ・FAQを読む 例えば www.bohyoh.com/CandCPP/FAQ/index.html
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、コンパイラ名)
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ 
相手は小心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって小心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


宗教的な話題は禁止します。


920 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:16:44 ]
なるほど
たしかにおっしゃるとおりの事態が起きました。
ありがとうございます。

あと実はこのことに直接関わるかはわからないのですが、
別のプログラムにおいて、同じように構造体のポインタを戻り値とする関数をつくって内部の宣言をstatic有りと無しどちらも試したところ、
staticをつけた方はmainを抜けるところで停止してしまいます。
関係があるのかどうかよくわかりませんが、もし心当たりがありましたらお教えいただけると幸いです。

921 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:23:11 ]
>>920
ソースをcodepadに貼れ
言ってる事がよくわからない

922 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:25:57 ]
>>920
そんなことで悩むぐらいならポインタでなく実体を返せばいいと思う

Hoge func(int a)
{
Hoge h;
h.k = a;
return h;
}


923 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 01:30:09 ]
>>922
構造体の配列を返したかったので・・・

すみませんどうやら別のところで引っかかっていたようで、今解決しました。
どうもお騒がせしましてすみません。

924 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 03:13:39 ]
つーか根本的に関数側で確保した構造体のポインタを返すのがキモイ
呼び出し側で(空でいいから)構造体を用意して、そのポインタを関数に渡して、
関数側はその渡されたポインタで構造体の中身を加工する、っつーのが普通だし、
そういう設計ならポインタを返す必要も無いしstaticも要らないし、static無しで
ポインタ返しても別に問題無い
何でそうなるかが分からんようだと辛い

925 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 09:22:50 ]
>>924
関数側で確保した構造体のポインタじゃなくて構造体を返すのもダメ?

926 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 10:41:34 ]
>>924-925
(コピーのオーバーヘッドはおいといて)1個の構造体や、固定長の構造体配列ならそれでもいいんじゃないの?
任意個数の配列をポインタではなく値で返す方法ってのを俺は知らないのだけど、どんなのがある?

>>920
staticつけないのは論外として、つけてもポインタの指し示す先が共有されていることは理解してる?
int *func(int n){
static int a;
a=n;
return &a;
}
int main(void){
int a,b;
a=func(1);
b=func(2);
printf("a = %d, b = %d\n", a, b); /* a = 2, b = 2 */
return 0;
}

927 名前:926 mailto:sage [2010/03/28(日) 10:42:50 ]
ごめ、すっとぼけてた。
int main(void){
int *a,*b;
a=func(1);
b=func(2);
printf("*a = %d, *b = %d\n", *a, *b); /* *a = 2, *b = 2 */
return 0;
}

928 名前:925 mailto:sage [2010/03/28(日) 13:39:27 ]
デザインの問題だけどたとえば何かデータをファイルから読むとか
与えたデータから新しいデータを作るというときに

const vector<double> parseData(double x,vector<double> v,...){
vector<double> v1;
…vector 領域確保して,データを料理してv1に入れる…
return v1;
}
int main(){
...
vector<double> vData(paseData(x,v,...));
}

みたいなのはなぜいかんのかなと思って

void parseData(vector<double>&v1,double x,vector<double> v,...){
…vector 領域確保して,データを料理してv1に入れる…
}
int main(){

vector<double> vData;
paseData(vData,x,v,...);
}

みたいに必ず書かなきゃいかんのかな?(確かに昔Fortranとかはいつもこういう
スタイルだったなぁ)

個人的には前者の方が直感的だけど
簡単のため vector の例にしたけどもちろん自分で定義したデータ class でも同じこと






929 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 13:40:41 ]
コピーが発生したら嫌じゃん

930 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 15:38:13 ]
コピーのコストが問題にならない状況でなら、その手も使った。

931 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:47:51 ]
関数内でnewしてshared_ptrで返せばいいよ

932 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:06:34 ]
#include <vector>
#include <memory>
#include <iostream>

using namespace std;
using namespace std::tr1;

shared_ptr<vector<double> > parseData(double x){
    shared_ptr<vector<double> > v1(new vector<double>);
    v1->push_back(x);
    return v1;
}
int main(){
    shared_ptr<vector<double> > vData(parseData(1.5));
    cout << vData->at(0) << endl;
}

933 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:14:03 ]
何でstatic付けると助かるのかを理解しない限り、いくらでも似たような問題で
引っ掛かると思われ

934 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:24:01 ]
#include <iostream>
#include <vector>
using namespace std;

int sum(vector<int> vec){
int ammount = 0;
for(vector<int>::iterator it = vec.begin();it != vec.end(); ++it){ ammount += *it; }
return ammount; } // 2ch行数制限回避
int main()
{
vector<int> v;
v.push_back(1);v.push_back(2);v.push_back(3);
cout << sum << endl; // 表示結果: 6
}
はいいんだけど、sumを
template <class T, T zero> T sum(vector<T> vec)
{
T ammount = zero;
for(vector<T>::iterator it = vec.begin();it != vec.end(); ++it){
ammount += *it;
}
return ammount;
}
にして、main中のcoutの行をcout << sum<int, 0>(v) << endl;にすると
a.cpp:8: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
a.cpp:8: note: say ‘typename std::vector::iterator’ if a type is meant
のようになっちゃう。vector<T>::iterator itをT vector::iterator itに変えても
a.cpp:9: error: ‘template<class _Tp, class _Alloc> class std::vector’ used without template parameters
a.cpp:9: error: expected initializer before ‘it’
になっちゃう。
どう対処すればいいんでしょう?

935 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:29:52 ]
>>934 ja.lmgtfy.com/?q=error%3A+dependent-name

936 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:57:05 ]
typename vector<T>::iteratorか。

937 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:14:09 ]
test

938 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:59:59 ]
個人的にはそろそろ>>928前者のような直接値を返すのも
VC10とかg++ 4.3とかめちゃくちゃ新しいコンパイラならはありだと思うようになってきた。
C++0xのおかげでコピー発生しなくなったから。



939 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:17:32 ]
それはちゃんと右辺値参照をアレするクラスを書いた時限定じゃないのか
全てライブラリのコンテナに限定するなら構わんだろうけど

940 名前:デフォルトの名無しさん [2010/04/07(水) 05:36:10 ]
error: pointer to incomplete class type is not allowedってどういうことですか?

941 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 05:40:42 ]
>>940 そのまんまだろう。

942 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 13:16:50 ]
>>940
不透明ポインタあたりでぐぐれ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<246KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef