C/C++小心者スレッドP ..
910:デフォルトの名無しさん
10/03/18 22:30:11
>>909
正直議論の意味というか、何にこだわってるのか、何を知りたいのか
全く理解できんのだけど……
magick++を使ったことは無いのでわからんが、まあ、そう言ってしまえば
何だってそうだといえるだろうさ
画像処理で言うと、ファイルフォーマット内のバイトオーダーは
ライブラリによって隠蔽されるケースは多いと思う
が、ライブラリにロードしてもらった32bitラスタ画像のピクセルフォーマットが
ARGBかBGRAか、といったことは、ピクセルを弄る場合には結局必要になるわけだ
911:デフォルトの名無しさん
10/03/18 22:54:34
picture[y][x].a = 〜
みたいに使えるんでないの?
ロードの処理が重くなりそうだが。
912:デフォルトの名無しさん
10/03/18 23:01:06
>>911
一瞬意味が分からなかった、その.aはARGBのAか
まあ、そういう実装は可能だろうね
Cだと
PutPixel(point, a, r, g, b)
のような関数ないしマクロを使うんだろう
913:デフォルトの名無しさん
10/03/18 23:13:43
>>910
画像処理と言ってもライブラリを使える場合もあるから
「必ずエンディアンの問題は出てくる」ということも無いということだよ
magick++ とかを使ってできることをわざわざ車輪を再発明する事もない場合も多いし
具体的にピクセルをどう弄りたいわけ?
914:デフォルトの名無しさん
10/03/19 01:45:40
>>913
ああ、要するに「必ず」は言いすぎだろ、という突っ込みか
確かに言い過ぎたね
915:デフォルトの名無しさん
10/03/19 12:22:01
Windowsでカレントディレクトリを取得する方法を教えてください
916:デフォルトの名無しさん
10/03/19 12:36:42
GetCurrentDirectory()
917:デフォルトの名無しさん
10/03/27 23:45:49
失礼します。
C++を勉強中の初心者です。
ポインタを関数の戻り値する場合は関数内の宣言にstaticをつけなければならないという記述をよく目にするのですが、
以下のようにstaticをつけずにHoge hを宣言しても問題なくプログラムが動き、5が出力されます。どういうことなのでしょうか。
typedef struct{
int k;
} Hoge;
Hoge* func(int a)
{
Hoge h;
h.k = a;
return &h;
}
int main()
{
Hoge* h = func(5);
cout << h->k;
}
918:デフォルトの名無しさん
10/03/27 23:59:25
>>917
Hoge h がスタック上に作られている場合、関数から帰ってきた
直後は問題ない可能性が高いが、もう1回func()を呼んだり
別の関数を呼んだりすると、おかしくなる可能性がある。
919:デフォルトの名無しさん
10/03/28 00:02:59
>>917
動くのはたまたまです
試しに、func(5) のあとに別の関数を呼んでみてください
別の結果になると思います
920:デフォルトの名無しさん
10/03/28 00:16:44
なるほど
たしかにおっしゃるとおりの事態が起きました。
ありがとうございます。
あと実はこのことに直接関わるかはわからないのですが、
別のプログラムにおいて、同じように構造体のポインタを戻り値とする関数をつくって内部の宣言をstatic有りと無しどちらも試したところ、
staticをつけた方はmainを抜けるところで停止してしまいます。
関係があるのかどうかよくわかりませんが、もし心当たりがありましたらお教えいただけると幸いです。
921:デフォルトの名無しさん
10/03/28 00:23:11
>>920
ソースをcodepadに貼れ
言ってる事がよくわからない
922:デフォルトの名無しさん
10/03/28 00:25:57
>>920
そんなことで悩むぐらいならポインタでなく実体を返せばいいと思う
Hoge func(int a)
{
Hoge h;
h.k = a;
return h;
}
923:デフォルトの名無しさん
10/03/28 01:30:09
>>922
構造体の配列を返したかったので・・・
すみませんどうやら別のところで引っかかっていたようで、今解決しました。
どうもお騒がせしましてすみません。
924:デフォルトの名無しさん
10/03/28 03:13:39
つーか根本的に関数側で確保した構造体のポインタを返すのがキモイ
呼び出し側で(空でいいから)構造体を用意して、そのポインタを関数に渡して、
関数側はその渡されたポインタで構造体の中身を加工する、っつーのが普通だし、
そういう設計ならポインタを返す必要も無いしstaticも要らないし、static無しで
ポインタ返しても別に問題無い
何でそうなるかが分からんようだと辛い
925:デフォルトの名無しさん
10/03/28 09:22:50
>>924
関数側で確保した構造体のポインタじゃなくて構造体を返すのもダメ?
926:デフォルトの名無しさん
10/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
10/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
10/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:デフォルトの名無しさん
10/03/28 13:40:41
コピーが発生したら嫌じゃん
930:デフォルトの名無しさん
10/03/28 15:38:13
コピーのコストが問題にならない状況でなら、その手も使った。
931:デフォルトの名無しさん
10/03/28 16:47:51
関数内でnewしてshared_ptrで返せばいいよ
932:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/28 20:14:03
何でstatic付けると助かるのかを理解しない限り、いくらでも似たような問題で
引っ掛かると思われ
934:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/28 20:29:52
>>934 URLリンク(ja.lmgtfy.com)
936:デフォルトの名無しさん
10/03/28 20:57:05
typename vector<T>::iteratorか。
937:デフォルトの名無しさん
10/03/29 20:14:09
test
938:デフォルトの名無しさん
10/03/29 20:59:59
個人的にはそろそろ>>928前者のような直接値を返すのも
VC10とかg++ 4.3とかめちゃくちゃ新しいコンパイラならはありだと思うようになってきた。
C++0xのおかげでコピー発生しなくなったから。
939:デフォルトの名無しさん
10/03/29 22:17:32
それはちゃんと右辺値参照をアレするクラスを書いた時限定じゃないのか
全てライブラリのコンテナに限定するなら構わんだろうけど
940:デフォルトの名無しさん
10/04/07 05:36:10
error: pointer to incomplete class type is not allowedってどういうことですか?
941:デフォルトの名無しさん
10/04/07 05:40:42
>>940 そのまんまだろう。
942:デフォルトの名無しさん
10/04/07 13:16:50
>>940
不透明ポインタあたりでぐぐれ
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4853日前に更新/246 KB
担当:undef