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


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

【初心者歓迎】C/C++室 Ver.58【環境依存OK】



1 名前:デフォルトの名無しさん [2008/08/06(水) 20:56:17 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.57【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1216215558/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

151 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:36:40 ]
>>150
前者はelseの後に複文が書けない
後者は複文が書ける

それ以外は同じ

152 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:40:10 ]
>>147
非PODだと「変数が宣言順に配置されるという保証がない」ではなくて、
「offsetofマクロが正常動作する保証がない」だった。
(自分は規格を読んでないから↓の受け売りだけど)

ttp://www.kijineko.co.jp/tech/cppemb/alignment.html

まあ145のコード通りならPODだから問題なさそうだけど、
いつPODでなくなるか分からないから怖いな。


153 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:43:23 ]
>>151d!

154 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 14:01:01 ]
>>147
一般論?
なら順序が保証されるのはアクセス指定子が間に挟まらない場合だけだった気がする。

155 名前:152 mailto:sage [2008/08/11(月) 14:09:51 ]
>>154
あ、そうだ。それを聞いたことがある。

156 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:40:19 ]
昔、sunかどっかのCコンパイラのstructのメンバの順番が
ソースの上下と逆だった覚えがある。

それ以来構造体のメンバの順番に依存したコードは書かなく
なったので、構造体が拡張されたC++ではどうなのか気にした
こともないやw

157 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:43:39 ]
トラウマというやつですね

158 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:29:46 ]
仮に配置が宣言順にならない場合も、初期化子の実行順は保証されますか?

159 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:32:15 ]
>>158
されます
宣言順です
並べた初期化子の順ではありません



160 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:44:05 ]
C言語検定の1級をもってるとゲームプログラマーとして就職するときどのくらい有利ですか?

161 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:45:56 ]
宣言順にならないとき、Cスタイルの初期化はプログラマの意図した通りになる?
struct hoge {
int a;
int b;
};
hoge h = {1,2};//h.a==1,h.b==2

162 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:46:48 ]
>>160
それでやっと最低限。しかも資格持っていないC言語分かってる
連中とまったく対等くらい

163 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:48:41 ]
こころなしか足しになる程度であんまり意味は無いんじゃないかと
あの程度は研修で叩き込まれたらすぐ身に付くレベル
他の要素のほうが重要視されるだろう

164 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:52:45 ]
なるほど、じゃあ線形代数ができる等 のほうが強みになるってことですか。
スレ違いの質問に答えていただきありがとうございました。


165 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 22:01:41 ]
>>164
ゲームプログラマーとして(大手に)就職したいなら、普通に
大卒か院卒で、趣味でゲーム一本でも作っておけ。

チームで作ってメインプログラマ兼取りまとめ役とか
だとポイント高いよ。

166 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:41:38 ]
->
これはどういう意味ですか?
こんな感じで使われているようです。
node->setMaterialFlag(EMF_LIGHTING, true);

また何と呼ばれてますか?
->でgoogleで検索かけてもかからないので困ってます。

167 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:44:37 ]
>>166
アロー演算子

(*node).setMaterialFlag(EMF_LIGHTING, true)
の書き方が違うだけ

168 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:45:51 ]
あるクラスの実体である、node変数のsetMaterialFlag()メンバ関数を呼び出している

class CHoge
{
setMaterialFlag(XXX, bool){}
};



169 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:50:21 ]
>>167-168
わかりました。
即レスしていただきありがとうございました。



170 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:01:33 ]
なんでメンバのアクセスって.と->に分けてるんだろう。
どちらかに統一すると困るケースが思いつかないのですが、
何か理由があるのでしょうか?

171 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:05:54 ]
>>170
*(p + i)で事が足りるのにp[i]と書けるのと同じ理由で、
(* p).mで事が足りるけれどもp->mと書けるようにしてある。

172 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:19:40 ]
タイプを楽にするためですよ

173 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:42:22 ]
そういうのって糖衣構文と言うのだったかな?

174 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:51:12 ]
いや、ポインタでも実体でもどちらも.か->に統一してくれたほうが
ジェネリックプログラムで楽で、メリットがあるのではと思ったんですよ。

そういうメリットを捨てて*や->を使わせてるのは、
ポインタからメンバにアクセスするのに*をつかわないで直接
ptr.mで良いようにしてしまうと、言語仕様として何か不都合が
あるからなのかなと、疑問に思ったわけで。

175 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:10:08 ]
なんか数ヶ月前にも似たような話題があった。

176 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:21:39 ]
ptrptr-->m

177 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:38:00 ]
歴史的経緯は知らんが状態を持つイテレータを使うので . と->の両方が無いと困る。


178 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 08:35:01 ]
Cのころからそうだったのを受け継いでいるのはおいといて、
C++では「.」はオーバーロードできない(させない)という差がある。
->はオーバーロードできる。いろんな都合で現状のルールに落ち
着いてるようだ。

179 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 09:23:53 ]
Dだとどっちも . でいけるって話なかったっけ?



180 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 10:05:56 ]
gccで特定のファイルというか場所というかインクルードしたファイルに対してだけ警告がでないようにはできますか?
使っている環境のgccで警告を厳しくすると、stlに対して大量の警告がでてしまうので、うっとおしいんです
スクロールしないと見たい警告みれないですし
自分でstl側をいじれる環境ではないです

181 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 13:55:55 ]
配列とポインタで
A *a=new A[100];
A b[10][10];
とした時に
&((((*A)[10])a)[i][j]) - a == &(b[i][j]) - b
これって常に成り立ちますか?


182 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 14:08:37 ]
>>181
要するに要素数10の配列へのポインタへ強引にキャストして
成り立つかというわけでしょ。
そりゃ成り立つわ。

183 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:00:44 ]
サン・クスコ

184 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:13:38 ]
どういたしマチュピチュ

185 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:46:23 ]
マンコ=カパックがどうしたの?

186 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 03:51:24 ]
今知ったんだけど、newって失敗したらNULLを返すと思ってたけど違うのね
ずっと
p=new int [1000];
if(p==NULL){〜
みたいな意味ないことしてた…

187 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 05:04:55 ]
nothrow

188 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 06:14:13 ]

 パスの後ろに '\\' が無い場合は追加する関数を作ったんですが,
"像\\" とかだとさらに追加されて "像\\\\" になってしまいます.
 正確にやるには先頭から調べるか, wstring に変換するしかないでしょうか?

std::string& AddBackslashIfNotExist1(std::string* ptrPath)
{
  std::string& strPath = *ptrPath;

  if( strPath.empty() ) return strPath;

  if( strPath[ strPath.size()-1 ] != '\\' ) return strPath += '\\';

  if( strPath.size() > 1 )
  {
    if( _ismbblead( strPath[ strPath.size()-2 ] ) ) return strPath += '\\';
  }

  return strPath;
}


189 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 06:19:58 ]
要するにSJISの2バイト目が\の文字の対策ってことだよね?
先頭から見て行くか別の文字コードにするしか手は無いよ。



190 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 06:49:20 ]
>>188
SJISの1バイト目領域⊂2バイト目領域だから、これはいかんともしがたい。

191 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:54:46 ]
>>188
律儀に先頭から見る必要は必ずしもないけれど、1バイトずつ遡る関数を作ったところで効率はさほどよくならないね。

192 名前:188 mailto:sage [2008/08/14(木) 08:14:20 ]

>>189-191

解答ありがとうございます.
遡るのは面倒なので wstring に変換して調べることにします.

193 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:13:51 ]
C++のコンパイルの仕方がわかりません

194 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:15:11 ]
>>193
エイホが書いたドラゴンブックとか、アマゾンで「コンパイラ」関連の書籍を読んでみては?

195 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:24:59 ]
>>193はそういう質問なんだろうか

・ソースの拡張子をcppにしてみよう
・ccではなくc++コマンドを使おう
・makeのサフィックスルールなんかも気をつけよう

とかいうはなしかと思ってしまった

196 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:44:05 ]
あの、プロンプトからcppファイルをコンパイルしたいんですけど、どういうコマンドを打てばいいのか解らないんです。

197 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:46:04 ]
使ってるコンパイラは何よ?
それがわからなきゃこっちもエスパー回答しかできない

198 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:48:42 ]
Visual Studio 2008だと思います

199 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:49:37 ]
>>196
コマンドプロンプトはあきらめて、普通にビルドしてはいけないのですか?



200 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:56:47 ]
VC9ならcl ソースファイル名 だよ。
でもその前に vcvars32.bat を実行してからにしてね。

201 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:57:07 ]
>>199
コマンドプロンプトの方が手軽に見えたので

202 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:01:23 ]
有難う御座います。解決しました

203 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:14:10 ]
関数の戻り値を配列に場合どう記述すればいいのでしょうか?

204 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:16:58 ]
>>203
まずローカル変数を返さないように注意しろよ。
次に受け取った配列の先頭アドレスを返すようにするか、
もしくは配列そのものを返したければ構造体の中に配列を入れて
返すようにする。

205 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:36:18 ]
すごいコードに展開されててワロタ

#include <stdlib.h>

struct Int {
int N[10000];
};

struct Int func(struct Int a);

int main(void)
{
int i;
struct Int *a = (struct Int *)malloc(sizeof(struct Int));

for (i = 0; i < 100000; i++)
func(*a);

free(a);

return 0;
}

struct Int func(struct Int a)
{
return a;
}

206 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:42:51 ]
構造体にしまった意味が無いだろwwwww

207 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:45:08 ]
だって配列そのものを返すには?って聞かれたんだもんwww

208 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:49:19 ]
>struct Int *a = (struct Int *)malloc(sizeof(struct Int));
これ笑いどころ?

209 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:49:48 ]
そうでした
もうしわけありませんでした



210 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:54:39 ]
>>208
static領域に確保したらつまらないコードを吐くもんで
わざとそうした

211 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:13:40 ]
スレ誘導されてきました
#include <iostream>
using namespace std;
//2直線の交点を求める関数
double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope);
int main()
{
double P1[2] = {4, 10};
double P2[2] = {6, 18};
double S1 = 2/3;
double S2 = 1/3;
double ans[2] = {0, 0};


*ans = lineIntersect(P1, S1, P2, S2);

cout << "交点の座標は" << ans[0] << '/' << ans[1] << "です\n";

return 0;
}
double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
double ans[2] = {0, 0};

ans[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L2Slope - L1Slope);
ans[1] = L1Slope * (ans[0] - L1Point[0]) + L1Point[1];

return ans;
}
30分位調べたり考えたりしたのですが1つだけエラーが解決しません;;
cpp(29) : error C2440: 'return' : 'double [2]' から 'double' に変換できません。


212 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:14:30 ]
>double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
>double [2]lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {

213 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:19:00 ]
ローカル変数のアドレスだと・・・

214 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:23:34 ]
(double *)[2]

どちらにしろ関数を抜けた時点で実体がなくなるわけだが。
構造体にして返すなり工夫をしろ

215 名前:208 mailto:sage [2008/08/14(木) 18:26:09 ]
>>210
なるほど。

>>211
だからぁ、向こうで書かれた注意を全く無視してんじゃねぇよ。

216 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:26:20 ]
構造体の考え方で記述してみます
アドバイスありがとうございました

217 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:26:25 ]
>(double *)[2]

これじゃエラーか

double (*)[2] だな

218 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:22:40 ]
ポインタ引数を使うのが普通かな。

double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope, double* ans1, double* ans2)

219 名前:211 mailto:sage [2008/08/14(木) 19:32:40 ]
構造体を利用して記述しています。
まだ途中ですができそうな気がしてきました。
結果が出たら報告します。



220 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:03:47 ]
#include <iostream>
using namespace std;
struct Point{
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
double ans[2];
Point pt = {10, 20, 20, 44, 10, 3, 3, 20};
double lineIntersect(Point* pt1);
int main()
{
*ans = lineIntersect(&pt);

cout << "答えは(" << ans[0] << ',' << ans[1] << ")です\n";
return 0;
}
double lineIntersect(Point* pt1){

pt1->num[0] = (pt1->L1Slope * pt1->L1Point[0] - pt1->L2Slope * pt1->L2Point[0] + pt1->L2Point[1] - pt1->L1Point[1]) / (pt1->L1Slope - pt1->L2Slope);
pt1->num[1] = pt1->L1Slope * (pt1->num[0] - pt1->L1Point[0]) + pt1->L1Point[1];

return pt1->num;
}
""""""'return' : 'double [2]' から 'double' に変換できません""""""
構造体でやってみたのですが同じエラーが出てできません;;
自分のスキルが足りないのは百も承知ですが誰かアドバイスいただけませんか?
214さんの(double *)[2]をどこかで使えばいいのでしょうか。

221 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:11:45 ]
>>220
×return pt1->num;
○return pt;

222 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:12:56 ]
×double lineIntersect(Point* pt1)
○struct Point *lineIntersect)

それから構造体へのポインタを渡しているので
戻り値は別にvoidでもよい。

223 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:13:53 ]
ところでC言語の仕様ではどうやっても配列そのものを返す事は
できんな。
返せたと思ったら配列へのポインタだったorz

#include <stdio.h>

double (*func(double (*a)[2]))[2];

int main(void)
{
double a[2][2] = {{1.0, 2.0}, {3.0, 4.0}};
double (*b)[2];

b = func(a);

printf("%f %f\n", b[0][0], b[0][1]);
printf("%f %f\n", b[1][0], b[1][1]);

return 0;
}

double (*func(double (*a)[2]))[2]
{
a[1][1] = 10.0;

return a;
}

224 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:37:03 ]
221さんと222さんの方法を試しても同じエラーが出たので
C言語の本をもう一度やり直してきます。

参考にしたいので誰か時間のある人がいたら
実行できるソース書き込んでもらえたら幸いです。

お騒がせしました。

225 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:37:13 ]
完全なソースを一応貼っておく。

#include <iostream>
struct Point {
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
Point* lineIntersect(Point* pt1);
std::ostream& operator<<(std::ostream& os, const Point& pt);
Point pt = {{10, 20}, {20, 44}, 10, 3, {3, 20}};
int main()
{
Point* ans = lineIntersect(&pt);

std::cout << "答えは(" << *ans << ")です\n";
}
Point* lineIntersect(Point* pt1)
{
pt1->num[0] = (pt1->L1Slope * pt1->L1Point[0] - pt1->L2Slope * pt1->L2Point[0] + pt1->L2Point[1] - pt1->L1Point[1]) / (pt1->L1Slope - pt1->L2Slope);
pt1->num[1] = pt1->L1Slope * (pt1->num[0] - pt1->L1Point[0]) + pt1->L1Point[1];
return pt1;
}
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << pt.num[0] << ' ' << pt.num[1];
return os;
}


226 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:40:33 ]
それともう少し言えばC++ならlineIntersectはメンバ関数に
すべき。他の変数は全部privateにしてしまう。

227 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:51:25 ]
連投すまんがC++流に書くなら次のように書いた方が良い
#include <iostream>
class Point {
double L1Point[2];
double L2Point[2];
double L1Slope, L2Slope;
double num[2];
public:
Point() {
L1Point[0] = 10; L1Point[1] = 20;
L2Point[0] = 20; L2Point[1] = 44;
L1Slope = 10; L2Slope = 3;
num[0] = 3; num[1] = 20;
}
void lineIntersect() {
num[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L1Slope - L2Slope);
num[1] = L1Slope * (num[0] - L1Point[0]) + L1Point[1];
}
friend std::ostream& operator<<(std::ostream& os, const Point& pt);
};
std::ostream& operator<<(std::ostream& os, const Point& pt);
int main()
{
Point ans;
ans.lineIntersect();
std::cout << "答えは(" << ans << ")です\n";
}
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << pt.num[0] << ' ' << pt.num[1];
return os;
}

228 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:56:25 ]
>>225>>226>>227
ありがとうございます!
参考にさせてもらいます。

229 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:37:19 ]
C++を単なるBetter Cとして使うだけならそこまでする必要はない罠。
しかし日頃からC++を使い慣れている人には気持ちはわかる。

特にプログラムが大規模になればなるほどC流儀よりもC++流儀の方が
プログラムをコントロールする労力が遙かに少ない事がわかってくる。

namespaceの必要性も最初は理解できないだろうが、プログラムが大きく
なると必然的に必要性がわかってくるし。



230 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:49:25 ]
#include <iostream>
using namespace std;
class Point{
private:
double L1Point[2];
double L2Point[2];
double L1Slope, L2Slope;
double num[2];
public:
Point();
void lineIntersect();
void show();
};
//メンバ関数の定義
Point::Point(){
L1Point[0] = 9; L1Point[1] = 6;
L2Point[0] = 5; L2Point[1] = 6;
L1Slope = 2; L2Slope = 1;
num[0] = 0; num[1] = 0;
}
void Point::lineIntersect(){
num[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L1Slope - L2Slope);
num[1] = L1Slope * (num[0] - L1Point[0]) + L1Point[1];
}
void Point::show(){
cout << "答えは(x=" << num[0] << ",y=" << num[1] << ")です\n";}
int main(){
Point pt;
pt.lineIntersect();
pt.show();
return 0;}
227さんのレスを見て自分なりにコードを書いてみました。無事実行できました。コードで直したほうがいいところがあったら指摘お願いします。

231 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:52:18 ]
>>230
いいんじゃね?特に問題となるような点はないみたいだ。

当初の質問の『関数から配列を返す』という話題からは
かけ離れてしまったけどそれはいいんだね?

232 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:54:00 ]
>>231
それも自分で納得できるように理解したいのですが
今のスキルじゃちょっときついのでC言語の本をもう一度読み返してからチャレンジしようと思います。
色々ありがとうございました。

233 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:57:13 ]
>>232
そうですか。

構造体へのポインタを使えば「データそのものを書き換えてくれ」と
委譲できるし、構造体を返すのは通常オーバーヘッドが大きいので
Cの流儀としてもあまりお勧めできない。

だから構造体へのポインタさえ理解すれば大抵の場合はそれでいいと思う。

234 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:03:45 ]
効率を無視してポインタを使わずに構造体そのものを返すという事になると
だいたい次のようなプログラムになると思う。
これが当初の『配列を関数から返す』に一番近い答えになるだろう。

#include <stdio.h>

struct Point {
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
struct Point lineIntersect(struct Point pt1);
struct Point pt = {{10, 20}, {20, 44}, 10, 3, {3, 20}};
int main(void)
{
struct Point ans = lineIntersect(pt);

printf("答えは(%f %fです\n", ans.num[0], ans.num[1]);

return 0;
}
struct Point lineIntersect(struct Point pt1)
{
pt1.num[0] = (pt1.L1Slope * pt1.L1Point[0] - pt1.L2Slope * pt1.L2Point[0] + pt1.L2Point[1] - pt1.L1Point[1]) / (pt1.L1Slope - pt1.L2Slope);
pt1.num[1] = pt1.L1Slope * (pt1.num[0] - pt1.L1Point[0]) + pt1.L1Point[1];
return pt1;
}

235 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:50:41 ]
catchで受け取る型をテンプレートにしたいのですが無理ですか?

//こんなの
template<class T>
} catch(T Obj) {
〜〜

236 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:58:59 ]
むりだお。 最低限共通の基底クラスから派生させるとかしないとだめ。
もう少し具体的に何がしたいのかを書けば誰か親切な人が考えてくれるかも。

237 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:14:24 ]
クラステンプレートか関数テンプレートの定義内で、テンプレート引数型でcatchすることは出来るんじゃない。
何がしたいのか分からないのでこれが解決になるのかは分からんが。

238 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:42:47 ]
class Base{};
class A:public Base{};
class B:public Base{};
みたいな感じで、
class A内で、Baseの値を変えたとき、
class BのBaseの値も変わっているようにするにはどうすればいいのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:45:58 ]
>>238
そんなことをするくらいなら、class Bがclass Aを継承すればいいんじゃね?



240 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:48:58 ]
Baseが基底となる全クラスのインスタンスで値を共有したいならBaseの値をstaticにすればいい。

241 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:00:19 ]
>>238
宣言と実態をごっちゃにしていそうな気がするので、何をしたいのか詳しく。

242 名前:デフォルトの名無しさん [2008/08/15(金) 16:00:56 ]
>>238
メンバをすべてstaticにしたらかっこいいYO!

243 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:10:33 ]
>>242
シングルトンの方が見通しが良くね?

244 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:23:28 ]
無理しないでグローバルな構造体でいいじゃん^^;

245 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:30:15 ]
>>244
アクセッサは欲しい

246 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:35:18 ]
ソースコードの書かれたテキストを読んで、
使われている変数や関数を解析するパーサみたいなものが作りたいのですが、
こういうのって一行まるごと読んで正規表現で抜き出したりって方法でいいんでしょうか。

効率的といいますか、定石みたいなのがあれば教えてください。

247 名前:デフォルトの名無しさん [2008/08/15(金) 18:39:40 ]
一行づつで問題が発生しないならそれでいいんじゃね

248 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:40:17 ]
ひょっとしてCですか?

249 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:50:45 ]
ドラゴンブックに



250 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:59:10 ]
yaccとかbisonを使う方向の方が幸せになれそうだが

251 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:00:24 ]
>>246
プリプロセッサに通した後のファイルを読むようにすると随分と楽になる






[ 続きを読む ] / [ 携帯版 ]

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

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