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


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

なぜポインタで引っかかる人が多いのか



1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
なぜポインタで引っかかる人が多いのか

引っかかる人は何に困惑しているのか


80 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 10:59:11 ]
配列とポインタの違いとかもアセンブラ知ってると理解が速いわな。

char *ptr;
char buffer[10];

_ptr: dc.l 0
_buffer: ds.b 10

puts(ptr);
puts(buffer);

move.l _ptr, -(sp) #ポインタを引数に渡す場合
jsr _puts
lea _buffer, -(sp) #配列を引数に渡す場合
jsr _puts
addq.w #8, sp

81 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:00:19 ]
むむっ久しぶりなんで間違えた予感。
>lea _buffer, -(sp) #配列を引数に渡す場合
こんなアドレス形式はないな。
pea _buffer
だった。失礼。

82 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:32:05 ]
テレビの中身を知らなくても、テレビを操作することはできる感じでポインタは使うことはできたけど
レジスタとメモリがどのように使われるのかを体感したら、理解が深まったのは覚えてる

83 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:39:38 ]
おまえらレベルの低いところで理解できたつもりになっててワロスw


84 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:43:11 ]
週末だというのに煽るしかやることがないなんて可哀想

85 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:45:29 ]
賞賛からはほとんど得るものはない
人間は失敗から学んで成長する生き物

86 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 12:09:03 ]
>>78
サンクス。
> データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ?

それだとポインタを使わなくても普通にできることでは?

> 画像とかさ
> Aパートでロードした画像をBパートでもう一回使いたいんだけど?的な場面で

言語を限らないとメモリーコピー、参照渡しなどポインタを使わない方法もある。

意地悪く書いたけどポインタを使えていると思う。上から目線ですまぬ。

87 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 12:10:49 ]
> データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ?

そこにアクセスする方法にアクセスする方法だろポインタっつーのは

88 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 12:28:38 ]
どうやって理解するも何もそのままだろうが



89 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 12:55:08 ]
理解出来ない奴が理解出来ない

90 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 13:09:57 ]
番号付き箱にモデル化されたメモリでの説明で理解した。
アセンブリは知らん。

91 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 13:17:40 ]
>>87
ポインタってそんなに複雑なものか?

>>80のコンパイル結果を見ればただの long 定数があるだけだ。
これがポインタの正体。つまりポインタは int や long と同じようにメモリ上にとられる
エリア。それをデータのアドレスを入れるために使う。

このプログラムはぬるぽになる。本来の意味でぬるぽが使えるのに感動!

92 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 13:39:23 ]
>>86
>それだとポインタを使わなくても普通にできることでは?
できねーだろ
ハンドル使ってもポインタは回避できないと思う

93 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 15:30:20 ]

知らないことは誰だってあるけど、いいやんとか言って違いも調べず思考停止するやつは向上心もう少し持とうぜ

94 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 15:32:03 ]
と、アンカーの使い方もわからない雑魚がいっております

95 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 16:12:00 ]
>>92
aというメモリー上のデータにアクセスしてbという変数に入れる。

b = a;

どこにポインタを使う必要がある?

96 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 17:23:29 ]
>>95
元の話題とまったくつながりが見えないんだけど
なんの話してるの?w

97 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 17:48:57 ]
>>95 は固定長データしか扱ったことないんだよ
そっとしておいてやれよ…

98 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 18:34:20 ]
アセンブリ言語を覚えたら
複雑な関数ポインタをスラスラ書けるようになっちゃうの?



99 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 18:35:38 ]
アドレスにまつわる文法はアセンブリの方がわかりやすいかもな

100 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 19:16:58 ]
>>96
>>87でポインタを使わなければデータにアクセスできないと書いているからそりゃ無い
だろと書いている。揚げ足取りに近いのだけど。
Cを使って大量のデータを使いまわしするということならポインタについてはそうだろう。
だから後に言語を限らなければとわざわざ書いている。

>>98
スラスラ書けるようになるかどうかはわからないがCでなぜポインタを取り入れたか、
何を実現したかったは理解できるようになる。

101 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 19:20:03 ]
>Cでなぜポインタを取り入れたか、
>何を実現したかったは理解できるようになる

それはポインタの理解とは無関係

102 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 19:43:06 ]
>>101
俺も同意見。

アセンブリ言語を理解したとして、
結局あの文法が正確に分かるようになるのかというと別だと思う。

たとえば、 const int (* const (*)(void))(void) なんてのがあったとしよう。
これはアセンブリ言語を知っていたとしても
ポインタ自体に精通していなければ文法上の
意味を正確に掴みかねると思われる。
裏でどういう値が動いているかは分かると思うが。

俺自身アセンブリ言語に詳しくないから
そう思うだけなんだけど識者の人はどう考えているの?

103 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 20:05:05 ]
ポインタで引っかかる人はアセンブリ言語を知っていれば簡単にわかる程度の
ところで引っかかっていると思うが。

104 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 20:28:40 ]
アセンブリの感覚だと、とりあえずvoid*にして後でキャストすればいいと思えるし
constはただの自己満足だとわかる。
必要最小限のサブセットと、自己満足のための高度な内容を分けて考えるべき。

105 名前:デフォルトの名無しさん [2010/07/03(土) 20:33:39 ]
int x=100;
int y=50;
int *p=&y;
int z=x/*p;

どうしてCはポインタの記号に*を採用したのか*/

106 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 20:41:22 ]
>>104
あくまで>>102は例だ。

本当に箱を並べたポンチ絵程度のものが分からないことを
アセンブリ言語を知っていれば分かるようになるのか、
それともC言語的な文法も踏まえたことをアセンブリ言語を
知っていれば分かるようになるのか、そういうことを言いたいだけ。

ポインタで引っかかるって言っても、
↑の2種類はいると思うけどね。

107 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 21:24:21 ]
ポインタと文法は別
ポインタはわかるが文法がわからないという話は聞いたことがない
だから文法自体は悪くない
悪いのは、文法以前で引っかかってる人に文法を踏まえさせること

108 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 21:35:36 ]
ポインタの配列とか
ポインタのポインタとか
配列のポインタとか
言ってる人は判ってるなと思うけど

ダブルポインタって言ってる香具師は
馬鹿じゃねーのと思う



109 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 21:45:18 ]
int **x; ←*が2つついてダブルポインタ

ではないの?

110 名前:108 mailto:sage [2010/07/03(土) 21:51:01 ]
そうだよ

111 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 22:03:07 ]
ポインタ自体は難しいと感じないんだけど

ポインタの配列、ポインタのポインタ
使うプログラムって難しく感じる
配列が多次元になったり
連結させたりするとな

112 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 22:09:25 ]
おまいら
int main(int argc, char *argv[]) を使う派?
それとも
int main(int argc, char **argv) を使う派?


113 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 22:12:32 ]
後者。引数のブラケットほど虚しいものはない。

114 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 22:13:55 ]
Javaですねわかります

115 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 23:05:50 ]
なぜJavaで引っかかる人が少ないのか

typedef void *Object;
typedef Object *Vector;
int main(int argc, Vector argv)

116 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 02:26:43 ]
*p=10000;

117 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 06:17:05 ]
めんどくさいときは構造体に入れて関数に渡すわ

118 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 06:20:21 ]
yes we can



119 名前:デフォルトの名無しさん [2010/07/04(日) 09:11:19 ]
int* p;
int *p;
int * p;

アスタリスクの使い方がポインタの理解を阻害する

120 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 09:23:31 ]
>>100
>>>87でポインタを使わなければデータにアクセスできないと書いているからそりゃ無い
>だろと書いている。揚げ足取りに近いのだけど。
は?>>87俺じゃねぇし
まったく話が見えない

121 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 09:50:02 ]
都合悪いから「俺じゃねぇ」ですね

122 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 10:05:01 ]
>>120
すまない。アンカー間違えてた。 >>78だった。
>>100のレスが無くても>>78にたどり着くので流れは分かると思うが分からないのなら
おれには説明できない。

123 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 11:29:50 ]
>>119
俺のポインタ周りの混乱はそうだったなぁ。
俺の混乱履歴。

 char *p;
char型の*pを宣言してるように見えてた。
 char i;
 i=1;
が正しいのだから、
 char *p;
 *p=1;
が正しくない理由が分からなかった。
加えて
 char *p="abcd";
こんな表現もあって混乱した。*pにいきなり値を代入してるように見えるから。
実際にはpに代入していて、char*型のpを宣言してるんだと感じてから、
 char* p;
と書くようにした。
そして
 char* p,r;
でまた混乱。

124 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 11:47:41 ]
意味を考えなくても文法知識をいじり倒すだけで正解を導けるという
思い込みのはげしい人が多いのはなぜか。

125 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:01:59 ]
規格書が全てですが何か

コンパイルできるかできないかはシンタックスが正しいか正しくないかであって実行して悪魔が出るかどうかはセマンティクスに違反しているかしていないか

ポインタなんて単なる数値だよ
*をいくつ使うかで表現できる階層が変わるだけ、C言語でオブジェクト指向っぽく連想配列でも実装すれば理解できるよ
ポインタは複合型であり、構造体や共用体、ポインタ、配列などの複合型の不完全型をシンプルに表現できる抽象データ型なだけであって難しいことなど無い

126 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:15:44 ]
Cを始めるにあたって、規格から調べる人は控えめに言ってマレでしょう。
普通は入門書や、入門webサイトを見る。
初めて見るソース、ソースから受ける第一印象はとても大事。

127 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:22:36 ]
難しいことを難しく表現することは誰にでも出来る。
難しいことをやさしく表現することは、能力が無いと出来ない。
能力が著しく足りないと、簡単なことを難しく表現してしまう。
という言葉を思い出した。

128 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:36:07 ]
>>119
C++ が普及する前の C のときは事実上
FILE *f;
だけだったはずで
FILE * f; とか
FILE* f; とか
書きかたしていると笑われたもんだ

なぜか C++ で本来の
HOGE *h;
は影を潜め
HOGE* h;
という書き方が横行するようになった



129 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:38:33 ]
 char* p,r;
でまた混乱。

なんで*が実質右ってことを忘れてんの?

130 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:39:47 ]
>>128

>>123 みたいなアホのせいだな pgrw

131 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:41:22 ]
>>123
> char *p;
>char型の*pを宣言してるように見えてた。

それで合ってる

何か変な本読んで混乱させられたんだな
かわいそうに

132 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:47:44 ]
ここは"なぜポインタで引っかかる人が多いのか"を考えるスレ。
初心者が起こす勘違いを考えるスレ。

133 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 12:57:03 ]
対象者が何につまずいているのかを想像する能力がなければ、
真の意味で教えることは難しい。
教える側に対象者のつまずきを理解する能力が無い場合、
対象者が理解できるかどうかは対象者の能力に依存する。

134 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:09:12 ]
>>133
そうだな
簡単な話が理解出来ないのは
耳が悪いのかも知れないし
そもそも話を聞いてないのかも知れないし
頭が悪いのかも知れない

135 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:17:00 ]
ポインタは正常に動くのにたまに変になることがある

int a[10];
a[10]=100;
みたいにやると、稀におかしくなる

コンストラクタとかifとかで複雑になってくると
よく見ると
int * p;
*p=100;
みたいなことを平然とやってたりする。
短いプログラムだとこんなことはしないだろうけど
複雑なプログラムだと初心者はわけがわからなくなる。

これが初心者にとって難しいんだろうな。

136 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:23:07 ]
>>135
> a[10]=100;
正常に動くことがあるから、誤解の種になるよね。
必ず異常動作すれば気づくんだが。

char *p="abc";
*p='A';
これが正常に動く環境があって、
しばらく平気でそういう記述してた時期があった。

137 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:30:53 ]
char* pの書き方だけは許さない。
こういう書き方をしている人物こそポインタで引っかかったままだと言える。

138 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:31:57 ]
>>137
Microsoftのソフト開発者は全員そうだな。



139 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:41:21 ]
結構、ポインタって文法の丸暗記で何とかなったりするからなぁ
int (*ptr)[10];
int a[100]; //mallocの代わり
ptr = (int (*)[10])a;
↑これを理解するのに結構時間かかった、特に関数の引数にしたときとか
アドバイスもらって、アセンブラ入門を勉強したら理解できるようになったんだよな
多分、実際のメモリ範囲確保とインデックスによるアドレス指定が理解の助けになったと思う

140 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:44:58 ]
>>137
char *p[10];
char (*p)[10];
*がpに付くのなら上記は同じ意味になるだろう。
*が宣言に付くからこそ(*p)とすることで違う意味になる。
そういう意味からは
char* p;
のほうがしっくり来る。
俺は char *p; と書くけどね、char* p0,p1; のことがあるからね。

141 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:46:46 ]
やたら記述にこだわってて内容理解してそうにない書き込みが多いところが恐怖

142 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:48:30 ]
C#では
int* p,q,r;
ってやったらpもqもrも
CやC++でいう
int *p,*q,*r;
みたいに、全部が*つけたようになるな
アンセーフモードでしか実行できないけどね

Microsoftのポインタに対する意識が明確に現れてるな

143 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:58:02 ]
>>126
第一印象に敏感な人は重症化しやすい、という意味では大事かもしれないが
本来は、印象なんてあやふやなものには鈍感なほうが良い

>>141
上のほうで、文法より意味を考えようぜっていう正論が出たから
逆の書き込みをすれば色々釣れるだろうと思ってるのかもしれん

144 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 13:58:46 ]
char *p;
char (*p);
上記は同じものを指すが、結果として同じものをさすだけであって、
その意味合いは異なる。
前者は"char*型のpの宣言"であり、
後者は"pはポインタであって、そのポインタはcharを格納するアドレスのポインタ"。
それが理解できなければ、
char *p[10];
char (*p)[10];
は理解できない。

145 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:03:27 ]
ホント記述弄り好きだな
こんなの覚えてもしょーがねーだろ

146 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:09:25 ]
>>145
しょうがなく無いぞ
char *p[10];
char (*p)[10];
どっちの意味でも使うことあるから。
宣言の*が型に付くことを知っていれば、
前者のpが配列、後者のpがポインタだと理解しやすい。

147 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:14:23 ]
int a[10][10];

148 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:19:29 ]
それは別にポインタが難しいからじゃなくて、C言語が難しいから。
文法云々というか、プログラマの責任がデカい部分。



149 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:23:31 ]
>>146
*(p[10]) か (*p)[10] かの違いだよ。前者の括弧は冗長だから書かないだけ。
*は前置単項演算子だから、被演算子は常に後ろに付く。型に付くことはない。

150 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:42:16 ]
なにいってるんだ

int * p
の*は演算子ですらないぞ

*p=&x
みたいのでpの←の*は演算子だけど。


151 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:47:48 ]
>149
知ったかは口はさむな

152 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 14:55:06 ]
説明する能力がなければ、真実を伝えることが難しい例。
説明する能力があれば、真実でなくても実質問題の無い考え方を伝えることが出来る例。

153 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 15:26:43 ]
mallocだのなんだの使うより
new int
のほうがわかりやすいよね

154 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 16:57:46 ]
>>144
意味合いも型も全く同じ。
どちらも*演算子を適用するとcharになる。

>>146の意味合いは演算子の
結合が異なるから意味が異なって当然:
・char *p[10] =>char *(p[10]) => pに[]したあと*すればcharになる
・char (*p)[10] => pに*したあと[]すればcharになる

変数の記述と同じように演算子を適用したら、
最終的に一番左に書いたcharやらが取得できるのがポインタの文法。

155 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 23:34:12 ]
ポインタで引っかかる人が多い、というより
Cのポインタで引っかかる人が多い、の方が正確だろうな。
C以外でポインタで引っかかる人の話はほとんど聞かない。

Cのポインタも、言語規格を読めば別に難しくないが、直感では理解しにくい。

156 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 00:47:28 ]
とりあえず複数変数宣言を一行でやるのやめろや・・・
見づらくて仕方ない。


157 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 00:52:23 ]
>>131
あってないだろ
*pが変数名ならポインタ使用するときpって書くなよ
*とpを分解するなよ
*とpがくっついて初めてIDなんだろ?って思った

あくまでpはchar*型の変数だろ
だから*演算子でポインタpの値参照できるんだし


158 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 01:15:16 ]

char *p
*pはchar型であってるよ
*pは変数名じゃないよ
pが変数名だよ。



159 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 01:30:09 ]
char * p
「char型」の「ポインタ(*)」の「変数p」と言った方がいいかな。

160 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 01:41:40 ]
*pの型がcharとかは関係なくて
char *p;で宣言される変数はp
てだけだろ。
*pは宣言されてない。

配列とかでも同じだからなぁ。
特に分かりづらいと思ったことなかった。

161 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 03:57:28 ]
幅WID, 高さHEIのint型の二次元配列arrayを動的に確保したい。
1)arrayの宣言文を書け。
2)arrayのメモリ確保文を警告レベル最大でも警告が出ないように書け。
3)arrayの要素アクセス方法、具体的にはarray中の横からw番目、縦にh番目の要素に0を代入する文を書け。


162 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 06:43:49 ]
>>159
char*型の変数pでいいよ。
変数名取り除いたのが型の名前だし。

>>161
とりあえずC99禁止しようか。

163 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 07:37:57 ]
>161
二次元配列ってなんだ
配列の配列か
一次元的に取られたメモリを工夫して二次元的に扱える形にしろというのか

一次元的に取られたメモリを工夫して三次元的に扱える形にしろ
ただし、外側から縦、横、奥を表すとし、メモリの確保は1回で実行せよ
また、型は適当なものをtypedefし、type_t型として作成せよ
ただし、縦、横、奥は実行時に与えられ、特定のtype_t型に依存するコードは書いてはならない
縦、横、奥はsize_t型を仮定してよいものとする
全ての縦、全ての横、全ての奥のアドレスに対してそのアドレスがそのアドレス以外のものと異なるようにせよ
全ての縦、全ての横、全ての奥の要素に対して任意の値を代入し不正なメモリ書き換えが行われないようにせよ
メモリの確保には標準関数のvoid *malloc(size_t)を使用せよ
ここで、言語仕様はC89またはC90を仮定してよいものとする
ただし、コンパイラの拡張を使用することを禁止する

例 : type_t ***array3; array3 = alloc3(h, w, d); array3[h][w][d] = val;

164 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 08:05:39 ]
前の問題の答も出さずに勝手な問題積み上げてバカじゃないの

165 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 11:18:28 ]
スレタイとは何の関係もない話題になった。

166 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 15:19:30 ]
*********************************************p

167 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 16:37:36 ]
*は2つあれば十分
3つ以上使うコードがあっても、void**とキャストを使うコードに変換できる

168 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 16:46:54 ]
変換できることに意味はないな。適当にtypedefし直せば充分。



169 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 16:57:39 ]
バイナリエディタで機械語書かせれば一発で理解できると思うんだ

170 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 17:15:05 ]
誰も>>161には答えられない、と。

171 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 17:21:17 ]
興味が無ければ答えない。当たり前だと思うが。

172 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 17:24:00 ]
今まさに仕事でその手のコードを書いているからめんどくさいw
CPUとGPUの違いやsimdの演算効率の違いを考慮して、
AofSとSofAを切り替えたりxyzの順序を変えたりの詰め替えばっかりw

173 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 18:09:33 ]
>>170
配列へのポインタでいいのか?

174 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 18:32:08 ]
>>161
1) int *array;
2) array = (int*) malloc(sizeof(int) * WID * HEI);
3) array[h * WID + w] = 0;

Java使いでちゃんとしたCのコードなんか書いたことないんだけど、
これでいいのかな?このスレにいる詳しい人添削頼む。

あと>>163も同じように処理しちゃまずいのかな。

175 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 18:52:55 ]
>>174
2次元配列と書いてるから、array[WID][HEI}の形にしないと駄目だろうね
>>161の条件だと↓でもよさそうだけど、>>163はひと手間かけないといけない
int (*array)[HEI] = (int (*)[HEI])malloc(sizeof(int) * WID * HEI);

176 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 18:56:41 ]
一回でメモリ確保せよとはあるけど必要充分にとは書いてないから、
3次元分のメモリとポインタ分のメモリを確保してポインタの配列をこさえればいいんだけどね。

177 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:16:21 ]
>>163
>ただし、縦、横、奥は実行時に与えられ、特定のtype_t型に依存するコードは書いてはならない
これは↓がだめだという意味?
typedef char (*type_t)[w][d];
type_t array = (type_t)malloc(sizeof(int) * h * w * d);

178 名前:177 mailto:sage [2010/07/05(月) 22:17:04 ]
1行目
typedef int (*type_t)[w][d];
ね。



179 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:27:24 ]
typedefしなくていいのなら、
for文で回しながらmallocして、
for文で回しながらfreeすれば出来そうだけど。
(そこまでするんならいっそ1次元でとって、添え字演算したほうがすっきりしそうだが・・・)
>>163 は出来るのかね。

180 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 02:01:16 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10787.txt

自分で書いていて途中で嫌になってきた
typedefを使わないとほとんど読めないプログラムになってしまうのが
ポインタの問題だな

関数へのポインタの配列へのポインタを返す関数
(関数は配列を返す事ができないので配列へのポインタで返す)

でも無駄な事を一段やってるような気がするな
配列だと分かっているんだから配列を変えそうとせず、ポインタで配列の
先頭アドレスを返せば簡単になるような気もする






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

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

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