トップページ⇒tech
1001コメント229KB

C言語なら、俺に聞け! <24>

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C言語質問スレッド Part 24

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/l50

コンパイラなどのリンクは>>2-3
0153デフォルトの名無しさんNGNG
mallocが返すのはふつうのポインタ。
xは2重ポインタ。
0154デフォルトの名無しさんNGNG
ケツの穴多いな
0155デフォルトの名無しさんNGNG
>>152
double *の正体がないから。
double ** -> double * -> double って具合に2段にわたって参照するので、
途中通過する double * も必要。
015691NGNG
なんかみんなポインタの間違って理解してる気がする
上のレス見たらよけいわからんなった

ちなみに自分は連立方程式の数値解を求める関数を書きたかったのです
fortran90ならこんなのちょろいのになー C言語むづすぎ
0157デフォルトの名無しさんNGNG
>>152
これこそ、>>110の言ってたポインタのポインタの話じゃないか?
0158デフォルトの名無しさんNGNG
>>156
2chはいきなり初心者モード無視して答えを書いてくるヤシが多い
ので、かえって混乱するかも。でもいつか理解できる。
015991NGNG
誰かC言語のコンパイラ作った人いないの?
そういうのを専門でやってる人いませんかねえ
いたらポインタと配列についてコンパイラ実装者の立場から説明して欲しい
016091NGNG
mallocで動的にメモリを確保せずにポインタを使わずに
関数に二次元配列を渡せないのでしょうかね?
0161デフォルトの名無しさんNGNG
ネタにしては偉そうだ。
0162デフォルトの名無しさんNGNG
>>160
int a[4][5]ならint (*b)[5]
0163デフォルトの名無しさんNGNG
>>159
アセンブラを覚えれば分かるよ。
0164デフォルトの名無しさんNGNG
必要より大き目なサイズ固定の二次元配列をつかう。
016591NGNG
引数で大きさ指定してどんな大きさの二次元配列でも扱えるような
関数を書けないですかね?
ポインタつかわんでmalloc使わんで
0166デフォルトの名無しさんNGNG
>>165
Perlでも使えよ・・・
0167デフォルトの名無しさんNGNG
>>165
C++使え
0168デフォルトの名無しさんNGNG
>>160
ポインタを使わないって時点で無理。
0169デフォルトの名無しさんNGNG
無理ぽいに一票
0170デフォルトの名無しさんNGNG
つーか規格書買って読めつうの。アフォか
0171デフォルトの名無しさんNGNG
>>168
こーぞーたいのメンバーにすれば渡せないこともない。
0172デフォルトの名無しさんNGNG
>>165
支離滅裂
017391NGNG
アセンブラの立場から説明してみてや、自分はアセンブラわかりませんが > 163
それは無駄にメモリ使う上に柔軟性がないでしょ > 164
0174デフォルトの名無しさんNGNG
91はここの住人を試しているようにしか見えないな・・
0175デフォルトの名無しさんNGNG
>>173
UNIX板からの刺客?
0176デフォルトの名無しさんNGNG
91を一休さんのキャラに例えると誰ですか?
0177デフォルトの名無しさんNGNG
>>91
だから最初の要素以外の大きさはコンパイル時に
決定していなければならないわけで、>>152はよくて
#define N 100
double (*hoge(int n))[N]
{
double (*x)[N] ;
x = (double(*)[N])malloc(sizeof(double)*n*N) ;
return x ;
}
のようにしかできない
017891NGNG
上のやりかた以外に方法ないんですかねえ
0179デフォルトの名無しさんNGNG
>>178
なんでCにこだわるの?
0180デフォルトの名無しさんNGNG
あそこの板嫌いだな
こういうのばっかりだから
0181デフォルトの名無しさんNGNG
一回ポインタとmallocを使わないでプログラムを実行中に
好きな大きさのメモリを確保してほしい。
0182デフォルトの名無しさんNGNG
つまらん。
0183デフォルトの名無しさんNGNG
ポインタを使うのがCの醍醐味ではないけ?
0184177NGNG
間違えた。すべて決まってなければならない
最初がいらないのは受け渡しのときだけだ
0185デフォルトの名無しさんNGNG
別にCだけではないだろ。
018691NGNG
やっぱfortranかなあ
Cむづかしすぎ
みんなもよくわかってないっぽいし
0187デフォルトの名無しさんNGNG
>>186
わかってないのはおまえと110だけだと思われ
0188デフォルトの名無しさんNGNG
>>186
分かっているから無理だと言っているんだろ(ワラ
018991NGNG
a[n][n]でaはポインタのポインタではないんですよね?
でわaはなんですか?
0190デフォルトの名無しさんNGNG
Lisp Schemeでも使え。
考えがスマートに書ける。
0191デフォルトの名無しさんNGNG
あなたにはそれが一番似合ってます、おめでとう。
0192デフォルトの名無しさんNGNG
fortranは処理系が中でポインタとmallocを使ってるだけだろ
0193デフォルトの名無しさんNGNG
>>189
配列名だよ!
019491NGNG
煽り多くなってきたな
むづかしすぎたかな
0195デフォルトの名無しさんNGNG
(´-`).。oO(どういう勉強のしかたすると>>91みたいのが出来あがるんだろう…)
0196デフォルトの名無しさんNGNG
>>159
> ポインタと配列についてコンパイラ実装者の立場から説明して欲しい
以前に書いたヤツだと、こんな感じやねぇ。

  | l_value '[' expr_ ']' {
    struct comp_node *offnp;
    struct cast_info *cast;
    if (!cast_is_array($1->cn_cast))
      yynotice(COMP_ERRMSG_ELEM_NOARRAY);
    else if (!cast_equal(node_get_cast($3), CAST_INT))
      yynotice(COMP_ERRMSG_INDEX_NOTINT);

    cast = cast_element($1->cn_cast);
    /* offset <- expr_ '*' size */
    offnp = node_create_op2(CAST_INT, $3,
      node_create_valint(cast_size(cast)), OPR_MUL);
    $$ = node_create_lv_off(cast, $1, offnp);
  }

  | '*' l_value %prec PREC_DEREF {
    if (!cast_is_pointer($2->cn_cast))
      yynotice(COMP_ERRMSG_DEREF_NONPTR);
    $$ = node_create_rlv(cast_deref($2->cn_cast), $2);
  }
0197デフォルトの名無しさんNGNG
だから答えは出てるっつーの
0198デフォルトの名無しさんNGNG
>>189
int a[n]はint型をn個持つ配列。
int a[n][m]はint型をm個持つ配列をn個持つ配列。
0199デフォルトの名無しさんNGNG
91が一番煽ってる
0200デフォルトの名無しさんNGNG
>>189
識別子です。
そろそろやめたら(ボソ
020191NGNG
ポインタむづかしすぎ!C言語挫折しそうですわ
0202デフォルトの名無しさんNGNG
91は暇なやつだな。
そして日本語すらよく分かっていないな。

>むづかしすぎたかな
0203198NGNG
メモリー上では一直線にならんでいるがな。
0204デフォルトの名無しさんNGNG
yacc?
0205デフォルトの名無しさんNGNG
典型的な逆切れパターンか・・・
91にはCは無理だ、あきらめな
0206デフォルトの名無しさんNGNG
>>203
それだ!それを91は理解しないと
0207デフォルトの名無しさんNGNG
ラーメンうまかったなぁ。
0208デフォルトの名無しさんNGNG
>>186
二次元配列諦めて、ポインタのポインタにしたら?

double **d;

d = (double **)malloc(sizeof(double *) * 100);
for (i = 0; i < 100; i++)
d[i] = (double *)malloc(sizeof(double) * 100);

で、見かけ上d[100][100]まで使えるから。ただし、これを受け取る関数も
double **で受け取ること。それに、xとyの次元も指定しなければならない
から、

struct dd {
int x, y;
double **d;
};

のように構造体にした方が柔軟性が増す。
0209デフォルトの名無しさんNGNG
パイの実(いちご)うまかったなぁ。
0210デフォルトの名無しさんNGNG
>>208
それを91は嫌がっているんだよ(笑)
0211デフォルトの名無しさんNGNG
>>201
>ポインタむづかしすぎ!C言語挫折しそうですわ
     .,/ ̄ ̄\.
    .,/  ____ \.
   / /川〃ノ\. ヽ.
   ( (ミ/⌒ヽ三) )  / ̄ ̄ ̄ ̄ ̄
    ヽ. ヽ| ´∀` |ノ .ノ < オマエダケー
      ̄|   .::| ̄    \_____
      |____|
0212デフォルトの名無しさんNGNG
>>210
ふーん。何でこんなにもめているのか理解できたっすよ。(藁
0213110NGNG
俺のせいか(藁
021491NGNG
>208
上に貼ったソース まさにそのやりかたです。
いちいちそんなめんどくさいことしないとできないのかあ
ポインタのこと考えないで配列の受渡ししたい
0215デフォルトの名無しさんNGNG
C++などを使おう。
0216デフォルトの名無しさんNGNG
>>215
もうほっときなって。
0217デフォルトの名無しさんNGNG
>>214
Perlを薦めるよ。
0218デフォルトの名無しさんNGNG
>>214
頭固すぎ
他言語使えって
0219デフォルトの名無しさんNGNG
どうでもいいが91は渡す配列をどうやって持ってくる気だ?
022091NGNG
Javaだと配列のサイズ決めないで関数に渡せますね
0221デフォルトの名無しさんNGNG
>>220
Java使えるならJava使えよ!!(;_;)
0222デフォルトの名無しさんNGNG
>>220
あれはポインタのポインタと同じ
0223デフォルトの名無しさんNGNG
>>91
それをしたかったら、もっと高級な言語を使え。
メモリアドレスが1次元である以上、どこかで行と列の計算をする必要があるだろ。
そんなことまでCは面倒見てくれない。
0224デフォルトの名無しさんNGNG
わかってるヤツは、とっくに飽きてる話題だからな。
022591NGNG
これ以上話広がらないかなあ
0226デフォルトの名無しさんNGNG
>>225
そりゃおまえがネタだと見抜かれてるからね
0227デフォルトの名無しさんNGNG
無能が煽っても大して大きくならないのは定説。
0228デフォルトの名無しさんNGNG
>>220
Cは配列の扱いについて、極端に単純化して、一次元配列しか
基本的には使えなくなっていると思われ。
022991NGNG
void f(double[][] a)
↑Javaだとこんな感じで配列の大きさ指定しないで関数に渡せて便利ですな
0230デフォルトの名無しさんNGNG
>>229
配列もオブジェクトの一種ですからな。
0231デフォルトの名無しさんNGNG
やっぱり煽りは日下部タンじゃないと・・・・
0232デフォルトの名無しさんNGNG
C言語まったく知らないんだけど、
ポインタ変数の宣言ってどうやるの?
0233デフォルトの名無しさんNGNG
余計なことを何もしないのが、Cのいいところじゃん。
0234デフォルトの名無しさんNGNG
>>232
*
023591NGNG
>232
double *p;
0236デフォルトの名無しさんNGNG
>>234
親切度が半端
0237デフォルトの名無しさんNGNG
>>234
今日はしたい気分なんだ、いいだろ。
023891NGNG
C糞かも
0239デフォルトの名無しさんNGNG
>>238
はげどー
91みたいなどうしようもないやつを生んでしまうもんな。
0240デフォルトの名無しさんNGNG
>>239
禿同
024191にとってはNGNG
Cは糞です。
0242デフォルトの名無しさんNGNG
>>238
うん、糞だ。
しかし、その糞さえもろくに(略
0243デフォルトの名無しさんNGNG
>>229
それを「便利」と思うか「余計なお世話」と思うかは、微妙なところだ。少なくとも
処理系を実装する立場から言えば C は、適度に小さく強力で、良い言語だろう。

ところで 91 は >>196 へのコメントはないの?
0244デフォルトの名無しさんNGNG
>>238
ちょっと同感ついでに>>91も糞
0245デフォルトの名無しさんNGNG
Cは落ちこぼれ発生率がかなり高いし、糞だな
0246デフォルトの名無しさんNGNG
91はCがアセンブラに近いことがだんだんと分かってきて、嫌気が
さしてきた様子。迷わずFORTRANやjavaに逝ってよし。
0247デフォルトの名無しさんNGNG
>>243
理解できるわけないじゃん
0248デフォルトの名無しさんNGNG
おまえら進行早すぎ。
もっと落ち着け
0249デフォルトの名無しさんNGNG
もう>>91の時点でネタだってわかってるのに、
付き合ってあげるこのム板住人のやさしさ。
0250デフォルトの名無しさんNGNG
いい暇つぶしができたよー
0251デフォルトの名無しさんNGNG
>>249
ROMっている人のため。
0252デフォルトの名無しさんNGNG
>>249
語りつくしてくださいというから語っているのさ(w
■ このスレッドは過去ログ倉庫に格納されています