ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

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

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

宜しくお願いします。

このQ&Aに関連する最新のQ&A

配列 FORTRAN」に関するQ&A: fortran 配列実行結果

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で質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qポインタのキャスト

配列の先頭アドレスをunsigned long型で取得するにはどうしたら良いでしょうか?

下記だとダメですよね?

char a{4} = [0, 1, 2, 3];
unsigned long adr;

adr = (usigned long)&a[0];

よろしくお願いします。

Aベストアンサー

unsigned longがpointerを表す型であるというシステムなら、
adr = (unsigned long)a;
とすれば行けるはずです。もちろん、一般的には下記です。
char* adr;
adr = a;
&a[0]はおかしいです。aで配列の先頭アドレスを表します。
a[0]がchar型のデータ0を表しますから、このアドレスを取
り出すということはあり得ません。

Q ポインタを使って関数の値のやり取り

c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。
作った実行文は、
#include<stdio.h>
int seki(int *pa,int *pb,int *pc);
main(){
int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0};
int i,*pa,*pb,*pc;

pa=&a;
pb=&b;
pc=&c;

seki(pa,pb,pc);
for(i=0;i<11;i++)
printf("%d,",*(pc+i));

}
int seki(int *pa,int *pb,int *pc){
int j;
for(j=0;j<11;j++)
*(pc+j)=*(pa+j) * *(pb+j);
}
こんな表示が出てきます。
toi2.c: In function `main':
toi2.c:7: warning: assignment from incompatible pointer type
toi2.c:8: warning: assignment from incompatible pointer type
toi2.c:9: warning: assignment from incompatible pointer type
たぶんmain関数内で書いたseki関数の引数の型に問題があると思うのですが。

c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。
作った実行文は、
#include<stdio.h>
int seki(int *pa,int *pb,int *pc);
main(){
int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0};
int i,*pa,*pb,*pc;

pa=&a;
pb=&b;
pc=&c;

seki(pa,pb,pc);
for(i=0;i<11;i++)
printf("%d,",*(pc+i));

}
int seki(int *pa,int *pb,i...続きを読む

Aベストアンサー

質問の下に書かれているコンパイルエラーと思われる表示から
そのエラーの原因が読み取ることが出来ます。
ここでの原因は、プログラム中次の3行がエラーであると指摘されています。
7行目:pa=&a;
8行目:pb=&b;
9行目:pc=&c;
それぞれ、どういう状況かというと、
エラーをそのまま訳せば
『ポインタとしての割り当て方がおかしいですよ』
という風に捉えられます。
まず、整数型配列として宣言してあるaという変数があります。
これは、これ自身がポインタであるので
&aという表記では、『ポインタ変数aのポインタ』ということになり、
純粋なポインタ変数paには代入する事ができません。
よって、上のエラーを解消するには、
pa = a;
とすればよいでしょう。
(8,9行目も同様)

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q構造体の中の構造体

typedef struct number{
int x;
struct number *next;
}Num;
初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか?
typedef struct number{
int x; int y; }Num;
の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

Aベストアンサー

★構造体の中の構造体とは。
・構造体Aに構造体Bや構造体Cが入っていても普通の変数と同じに解釈すれば良いです。
 例えば
 // 構造体A
 typedef struct tagA_t {
  int a;
 } tagA;
 // 構造体B
 typedef struct tagB_t {
  int b;
 } tagB;
 // 構造体C(AとBを含む)
 typedef struct tagC_t {
  tagA A;
  tagB B;
  int c;
 } tagC;
・この場合は構造体Cに構造体Aと構造体Bが入れ子として入っています。
 『tagC CC;』と宣言すると
 『int CC.A.a』とか
 『int CC.B.b』というアクセスが出来ます。

本題:
・今回は構造体の中に自分自身の『構造体ポインタ』が入っています。
 これは『自己参照構造体』と呼ばれ『単方向リスト』、『双方向リスト』、『二文木』とかで
 データを管理できる構造を持っています。
・質問では『next』ポインタが1つですので『単方向リスト』を構成する構造体でしょう。
 他の回答者さんと同じですが『鎖』のように次々に『next』ポインタで繋げるのです。
 アクセス方法は
 Num a; // Num 構造体の実体
 Num *pa; // Num 構造体のポインタ
 
 pa = &a; // pa に a ポインタをセット
 pa->x = 123;
 pa->next;
 ↑
 ここまでは分かりますよね。
・もし next に2つ3つの構造体 Num がポインタで繋がれている状態ならば
 pa->next->x = 456;
 とか
 pa->next->next->x = 789;
 としてもアクセス(代入,参照)できます。
 ※詳しくは下の『参考URL』をどうぞ。
・以上。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html,http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds02.html

★構造体の中の構造体とは。
・構造体Aに構造体Bや構造体Cが入っていても普通の変数と同じに解釈すれば良いです。
 例えば
 // 構造体A
 typedef struct tagA_t {
  int a;
 } tagA;
 // 構造体B
 typedef struct tagB_t {
  int b;
 } tagB;
 // 構造体C(AとBを含む)
 typedef struct tagC_t {
  tagA A;
  tagB B;
  int c;
 } tagC;
・この場合は構造体Cに構造体Aと構造体Bが入れ子として入っています。
 『tagC CC;』と宣言すると
 『int CC.A.a』とか
 『int CC.B...続きを読む

QC言語の enum の使い方

インターネットのサイトなどを利用してC言語を勉強しています。 いま一通り基本的な勉強が済んだところですが、enum というユーザー定義変数をどんな風に使えばよいのか、今ひとつわかりません。サンプルコードなどを見ても、 enum でなくても配列を使えば出来そうなものが多いのですが、この型の変数はどう使えば効果的なのでしょうか。
詳しい方、どうかよろしく教えてください。

Aベストアンサー

>enum というユーザー定義変数を

変数ではないでしょう。
むしろ定数かと。

>enum でなくても配列を使えば出来そうなものが多いのですが

具体的になにがあります?
ちなみに配列ではありませんので誤解なきよう。

http://homepage2.nifty.com/well/enum.html
とか、いい感じに説明されていますかね。
defineだとただの置き換えなので何でも設定できてしまう。とか型チェックができない。とかの問題があります。

私自身、最近使ったやり方では…テーブルのインデックス用に使いましたね。


人気Q&Aランキング