• 締切済み

ポインタのキャスト方法

こんにちは。 C言語でポインタキャストしているところがどうしてもうまくいきません。 以下のような要素数10個の型配列を指すポインタを キャストしたいのですがこれだと警告文がでてしまうので きちんとキャストしたいのですが、 どうしてもうまくいきませんでした。。。 1 short int *ibuf; 2 short int (*ibuf_tmp)[10]; 3 ibuf_tmp=ibuf; ※←ここです 宜しくお願いします。

  • hor
  • お礼率39% (9/23)

みんなの回答

  • richardo
  • ベストアンサー率20% (11/53)
回答No.5

 私も人に教えられる程知っている訳じゃ無いけれど、 次のようにしてコンパイルしたらエラーにならなかったから あなたのやりたい事はこれじゃないかな。 short int *ibuf; short int *ibuf_tmp[10]; ibuf_tmp[0]= ibuf ;

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

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

  • precog
  • ベストアンサー率22% (966/4314)
回答No.3

キャストされてませんけど、、、、 >3 ibuf_tmp=ibuf; ※←ここです どこにキャストがあるんでしょうか? わたしも何がやりたいのかさっぱりわかりません。なんでキャストする必要があるの? そのまま素直に代入すれば良いと思うけど。 ibuf_tmp[0] = ibuf でいいのでは?

hor
質問者

補足

>キャストされてませんけど、、、、 ですね。。。補足追加しました。。。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

hor
質問者

補足

他の回答者さんからもご指摘ありましたようにこのキャストはよくないんですね。長くなりますがやりたいことを以下に記述します。 今、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になっていることが問題あるということになるのでしょうか?

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

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

hor
質問者

補足

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

関連するQ&A

  • 複雑なキャスト

    "(int の要素数3の配列) へのポインタ" を意味するキャストはどのような書き方になりますか? (int*[3]) かと思ったのですが、コンパイルエラーになります。 参考までに、ソースをのせておきます。 pai や ai のようなよくわからない変数名は、 型が複雑なためそこだけハンガリアン記法っぽく書いています。 #include<stdio.h> // func は int の要素数3の配列 {0, 1, 2} の中の n 番目の要素を返す int func(int (*pai)[3], int n){ // pai means 'p'ointer to 'a'rray of 'i'nt. return (*pai)[n]; } int main(){ int ai[] = {0, 1, 2}; // ai means array of int. int i = func(&ai, 1); // 同じことを、先頭要素のポインタを経由してやりたい int *pi = &ai[0]; // pi means pointer to int. int j = func((int*[3])pi, 1); // "(int の要素数3の配列) へのポインタ" を // 意味するキャストがしたい // (int*[3]) ではエラーになる printf("Of course %d = %d.\n", i, j); return 0; }

  • 配列のポインタ配列のポインタから元の配列を参照する方法について

    C初心者です。下記の様に配列のポインタ配列を作って、そのポインタ配列のポインタを返すコードを書いて、main関数で元の配列の値を参照したいのですが、上手く参照できずに困っています。下記のコードの問題点も含めて、配列のポインタ配列のポインタから、元の配列の値を参照する方法を教えてください。お願い致します。 short int *motion_data(void) { short int data1[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int data2[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int *po_data[2]; po_data[0] = data1[0]; po_data[1] = data2[0]; return *po_data; }

  • 警告をださずにポインタにnullを渡す方法は?

    こんにちは。 ポインタ型の引数にNULLを渡してやりたいのですが 以下のような警告がでてしまいます。 test.c: In function 'test_': test.c:14: 警告: passing argument 2 of 'test' makes pointer from integer without a cast 問題の箇所は以下のように書いてます。 【test.c】 ~省略~ /** プロトタイプ **/ 7 void aaa(int,int*,int*); ~省略~ 14 aaa(0,NULL,&tv); NULLを渡したい場合、警告をださないように スマートに記述するにはどうしたらいいでしょうか? よろしくお願いします。

  • ポインタ

    C言語で、 int c[6]と配列を作って、 ポインタでc[100]を指定すると、COREがでますよね? これをやると、コンピュータがフリーズする場合があるのですがなぜですか?

  • ポインタについて

    C言語のポインタについての質問です。 main関数内が int main(void){ int data[10],datum,index,result,*ptr; ptr=data; ~~以下略~~ となっています。 これの「ptr=data;」を配列要素を用いて書き直しなさいという問題があるのですが、問題の意図がよくわかりません。 私としては「ptr=&data[0];」と書き変えろという意味なのかと思ったのですが、問題の意図に適しているでしょうか? 私の考えが間違っていましたら、問題の意図について指摘して下さい。 宜しくお願いします。

  • ポインタ

    文字列"apple", "orange", "strawberry"へのポインタをポインタ配列の各要素に代入した後,その文字列の文字を逆順に表示するようにプログラムを考えているのですが、 while文の中のjはそれぞれについて考える必要がありますか? ポインタを使って文字数を数得られそうですが出来ませんでした。 [実行例] ポインタ配列[0]の文字列の逆はelppaです. ポインタ配列[1]の文字列の逆はegnaroです. ポインタ配列[2]の文字列の逆はyrrebwartsです. #include<stdio.h> #define COUNT 3 int main(void) {   char * words[COUNT] = {"apple", "orange", "strawberry"};   int i, j;   for(i = 0; i < COUNT; i++) {    j =  ?  ;    printf("ポインタ配列[%d]の文字列の逆は", i);    while(   ?   ) {     printf("%c", *(words[i] + j));     j--;    }    printf("です.\n");   }   return 0; }

  • 関数へのポインタ渡しでの配列の初期化について

    はじめまして、C言語の基本的な質問をさせてください。 C言語で、外部関数へポインタで引数を渡す場合に、 関数に渡されるのはアドレスですよね? で、渡された関数側でそのポインタの配列の初期化を するときにはアドレスだけの情報だと、要素数がいくつ あるか分からず、領域の破壊をしてしまいそうな気が するのですが?いかがでしょうか? また、関数かなんかで、配列の要素数が分かる関数が あったような気がするのですが、それもアドレスだけ でわかるのでしょうか?

  • ポインタみたいなもの

    Perlってポインタは利用できないんですよね。配列の要素を1つ1つ処理していってその要素の内容によって更にその配列に要素を指定した順番に追加しながら処理していくような処理を実現するにはどうしたらよいのでしょうか。C言語だったら線形リストでできるのですが。

    • ベストアンサー
    • Perl
  • C#でポインタのポインタを作りたい

    昔VC++で作ったDLLをC#で使おうと思ったのですが、なんと、その引数がint**型です。 やっていることは、intの配列がありまして、その配列の特定の要素のアドレスを納めた配列を使っています。 具体的には(型や関数記述は大まかに書きます) --------------------------------- int **array; int *item; array = calloc(10, sizeof(int)); item = calloc(1000, sizeof(int)); for (i = 0; i < 10; i++) { array[i] = item + i+100; } --------------------------------- とした、arrayを引数にしています。 これをC#から使おうとして、C#ではint**をどうするんだろうと思った次第です。 わからないのは、C#でどうやってアドレスを配列に入れるかです。 array[i] = &item[width*i] とすると、コンパイル段階で怒られてしまいますし... 知恵をお貸しください。

  • C言語の型キャスト

    C言語入門者です、よろしくお願いします C言語の型キャストについて教えてください 参考サイトで以下のようになってました char str[8] = "ABC"; char *ptr; ptr = (char*)str; printf("char型ポインタのアドレス先の値は: %s\n", ptr); この型キャストって意味ありますか? キャストしようがしなかろうがptrに収まるのはstrの先頭アドレスですよね? ただ型キャストを説明するためだけにこのような形にしているのか 意味がある型キャストなのかが解らず迷ってます

専門家に質問してみよう