プロが教えるわが家の防犯対策術!

こんにちは。
C言語でポインタキャストしているところがどうしてもうまくいきません。
以下のような要素数10個の型配列を指すポインタを
キャストしたいのですがこれだと警告文がでてしまうので
きちんとキャストしたいのですが、
どうしてもうまくいきませんでした。。。

1 short int *ibuf;
2 short int (*ibuf_tmp)[10];
3 ibuf_tmp=ibuf; ※←ここです

宜しくお願いします。

A 回答 (5件)

 私も人に教えられる程知っている訳じゃ無いけれど、


次のようにしてコンパイルしたらエラーにならなかったから
あなたのやりたい事はこれじゃないかな。

short int *ibuf;
short int *ibuf_tmp[10];
ibuf_tmp[0]= ibuf;
    • good
    • 0

C の中で閉じた話ならともかく, 「FORTRAN とやり取りしよう」というのであれば「FORTRAN でどのように引数を渡すのか」が分からないとお話にならないですね.


C の関数を呼び出すときに (配列に限らず) 引数がどうなるのか, お使いの FORTRAN 処理系の資料を漁って頑張って調べてください. その結果が出てくれば考えようはあります.
ちなみに ibuf_tmp[0] = ibuf は動かないような気がします>#3.
    • good
    • 0

キャストされてませんけど、、、、



>3 ibuf_tmp=ibuf; ※←ここです

どこにキャストがあるんでしょうか?

わたしも何がやりたいのかさっぱりわかりません。なんでキャストする必要があるの? そのまま素直に代入すれば良いと思うけど。

ibuf_tmp[0] = ibuf でいいのでは?

この回答への補足

>キャストされてませんけど、、、、

ですね。。。補足追加しました。。。

補足日時:2009/05/20 13:47
    • good
    • 0

「どうしてもうまくいきませんでした」ということなので, 「どのようにしてみたのか」を全部挙げてください.


そもそも「なんでこんなことをしたいのか」に興味がありますが.

この回答への補足

他の回答者さんからもご指摘ありましたようにこのキャストはよくないんですね。長くなりますがやりたいことを以下に記述します。
今、f2cを使ってできたソースをベースに修正を加えているところです。元々のソースは以下です。

/* Subroutine */ int cal_freq__(shortint *ibuf, shortint *nnn, shortint *
nzero_cross__)
{
/* System generated locals */
integer i__1;

/* Local variables */
static integer j;
static shortint ib, ic;
static integer isgna, isgnb;

/* Parameter adjustments */
--ibuf;

/* Function Body */
*nzero_cross__ = 0;
ic = 15;
isgna = 1;
if (ibuf[1] < 0) {
isgna = -1;
}
 ~~~~~以下略~~~~~

上記のibufをセグメントエラーで落ちないようにしたいというのが本来やりたかったことです。short int (*ibuf_tmp)[10];
というポインタにいれてしまえば警告でても動きました。

呼び出し側はフォートランです。
---呼び出し部分は↓です------------------------
integer*2 ibuf4(1000)
call cal_freq(ibuf4,nc_freq,ntcon)
-----------------------------------------------

shortint *ibuf は呼び出し側では配列です。

再度質問させてください。
そもそもの引数に
int cal_freq__(shortint *ibuf, shortint *nnn, shortint *
nzero_cross__)
と、shortint *ibufになっていることが問題あるということになるのでしょうか?

補足日時:2009/05/20 13:23
    • good
    • 0

ibufの型はshort *でibuf_tmpの型は(short *)[10]です。


そのまま入れたら入る訳が無いとは思いませんか?
キャストで無理矢理入れるのもやめましょう。異常動作の原因になります。

この回答への補足

どうもやり方にムリがあるようですね。
ご指摘ありがとうございます。

補足日時:2009/05/20 13:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!