- 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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
- 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
プリプロセッサに通した後のファイルを読むようにすると随分と楽になる
- 252 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:05:00 ]
- >>246
Cのソースコードを正規表現でパースすることは原理的に不可能であることがわかってる。 厳密でなくていいならどうとでも出来るけど、 そんなことを考えるより既存のライブラリやツールで処理した方がてっとりばやい。 ctags とかではいかんのか?
- 253 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:52:50 ]
- 配列のポインタから中身サイズを取得する方法ありますか?
sizeof()だとポインタそのもののサイズが取得される
- 254 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:53:34 ]
- >>253
ないです。
- 255 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:02 ]
- sizeofnakami()
- 256 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:18 ]
- 間違ってるかもしれないけど、
呼び出した関数の中とか、現在のスコープにおいてその配列の要素数が わからない場所でsizeofを使ってもそのポインタのサイズしか得られない。 要素数はなんらかの方法で渡さなきゃならない
- 257 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:19:00 ]
- >>253
環境依存でよければあるよ
- 258 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:05:41 ]
- わたし環境依存それわからなーず
- 259 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:39:58 ]
- 環境依存・・・
それは標準の方法では決してできないことを平然とやってのける魔法の道具 しかし環境が変わると途端に動かなくなる諸刃の剣
- 260 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:40:35 ]
- if( ! a=Test() )
代入かつ否定 はこれでおk?
- 261 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:01 ]
- 不安ならなんでも括弧つけとけ、損はしない
- 262 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:44 ]
- >>260
ダメ。 代入をカッコで囲んでそれを否定する。
- 263 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:54:21 ]
- 把握
- 264 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:16:54 ]
- 関数へのポインタの配列を動的に確保するにはどうすればいい?
int size=10; void(**ppfunc)(void); ppfunc=new void(*)(void)[size]; とかだとコンパイルが通らない。typedefするしかないのかね
- 265 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:55:53 ]
- >>264
C的に考えても、(void **) の意味がよくわからないのですが。(void *) でだめですか?
- 266 名前:265 mailto:sage [2008/08/16(土) 19:57:42 ]
- ごめんなさい。勘違いしていました。
- 267 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:10:52 ]
- これでコンパイル通ったよ
#include <iostream> void func1(); int main() { void (**func)(); func = new (void (*[10])()); func[0] = func1; (func[0])(); } void func1() { std::cout << "func1()" << std::endl; }
- 268 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:57:19 ]
- >>267
new void(*[10])();が通らなかったので見逃してた。 なるほど、括弧で囲めばいいのか。ありがとう。
- 269 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 10:52:00 ]
- 読み辛いし、普通にtypedef使おうぜ・・・
- 270 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:45:50 ]
- 知っておくのも損は無いだろう。typedefで省略して良いのは基本を理解していてなぜtypedefが必要なのかを知っている者のみ。
- 271 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:09:51 ]
- >>270
基本は new T[N] で、この書式に合わせるためには typedef が必要だとわかっている。 typedef を使わない書き方を知る必要は無いよ。
- 272 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:05:16 ]
- typedefを使わないと理解出来ない馬鹿は去れ。
- 273 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:18:44 ]
- そりゃtypedefを使わない奴は馬鹿だが関数宣言における他演算子と比べた時の優先順位を理解できない奴も馬鹿だろ
- 274 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:28:27 ]
- 人の事はどうでもいいから自分の恥を知れ。
- 275 名前:デフォルトの名無しさん [2008/08/17(日) 17:37:46 ]
- 初心者歓迎ってスレタイに書いてあるのに馬鹿は去れとか
|

|