次のことを実現するC言語のコーディング方法を教えてください。
メイン関数の処理(1)と同等に処理を下位関数subb()で行いたいです。
--- コーディング例 ---
#include <stdio.h>
#include <windows.h>
typedef struct
{
int a;
int b;
} INTT1;
typedef struct
{
INTT1 *inttaP;
INTT1 *inttbP;
} INTTP;
int subb(INTTP inttp[])
{
printf("inttp[0].inttaP->a=%d\n",inttp[0].inttaP->a);
/* ここにメイン関数の処理(1)と同等の処理をしたい ★★★★ */
printf("inttp[0].inttaP->b=%d\n",inttp[0].inttaP->b);
printf("inttp[0].inttbP->a=%d\n",inttp[0].inttbP->a);
printf("inttp[0].inttbP->b=%d\n",inttp[0].inttbP->b);
printf("inttp[1].inttaP->a=%d\n",inttp[1].inttaP->a);
printf("inttp[1].inttaP->b=%d\n",inttp[1].inttaP->b);
printf("inttp[1].inttbP->a=%d\n",inttp[1].inttbP->a);
printf("(*inttp[1].inttbP).b=%d\n",(*inttp[1].inttbP).b);
return 0;
}
int main(int argc, char* argv[])
{
int wk;
int rc;
INTT1 intt1[10];
INTT1 intt2[10];
INTT1 intt3[10];
INTT1 intt4[10];
INTTP inttp[2];
memset(intt1,0x00,sizeof(intt1));
for (wk=0;wk<9;wk++)
{
intt1[wk].a=wk+1;
intt1[wk].b=intt1[wk].a+10;
intt2[wk].a=wk+100;
intt2[wk].b=intt2[wk].a+10;
intt3[wk].a=wk+1000;
intt3[wk].b=intt3[wk].a+10;
intt4[wk].a=wk+10000;
intt4[wk].b=intt4[wk].a+10;
}
inttp[0].inttaP=&intt1[0];
inttp[0].inttbP=&intt2[0];
inttp[1].inttaP=&intt3[0];
inttp[1].inttbP=&intt4[0];
printf("intt1[0].a=%d\n",intt1[0].a);
printf("intt1[1].a=%d\n",intt1[1].a); /* 処理(1) */
rc=subb(&inttp[0]);
return(0);
}
No.5
- 回答日時:
C の場合ポインタと配列は「違うもの」だけど「関係はある」ので, その
ポインタと配列との関係性
を軸として考えるとわかりやすいんじゃないかなぁ... というか, 配列を式の中で直接扱うケースって実は珍しく (そしてその多くは間違っている), ほとんどの場合で「ポインタを経由」してる.
逆にいえば「配列が使えればポインタはそんなに注力しなくてもいいはず」なんだ, 書き方が「ダサくなる」可能性を除けば.
あと p は &inttp[0] 「ではない」. 「p = &intt1[0];」の右辺にある「&intt1[0]」って, 質問文のどこにある?
No.4
- 回答日時:
「p をインクリメント」しないで, アクセスしてほしい. なんかするたびにいちいち値を変えるのは面倒だし, 間違いも起こりやすくなる.
あと, そこに出てくる p が質問文の何に対応しているのかはわかってるかな?
ポインタ関係は,難しいです。
char *p1;とint *p2;でそれぞれ+1すると,
p1とp2の増加量が異なるのが,受け入れがたいというのがあります。
本題のpを加算しないでやる方法は,わからないです。
pが対応するのは,rc=subb(&inttp[0]);の「&inttp(0)」対応していると
考えますが,間違っていますか?
No.2
- 回答日時:
main における intt1[1] がどのような形でアクセスできるのかを考えてみよう. 必要なものは関数の方でわかるはずだよ.
ところで intt1~intt4 の設定で wk が 0 から 8 までになっているんだけど, それでいいの?
回答,ありがとうございます。
「subb(&inttp[0]);」の呼び出しのパラメタで,subb()でa[1],a[2]・・・が参照できる方法がないか,教えてもらいたかったのです。現状ではアドレスが解決しないので,無理ということですよね。
これは,今回の質問用のサンプルとして作ったものなので,9回しかループしなくても大丈夫です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- ジャズ 渡辺貞夫さんで1番好きな曲を教えて下さい。 https://youtu.be/wk-H0A9mVS8 3 2022/07/16 02:19
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printf で二進表示を行いたい。
-
10個出力で改行したいのですが...
-
コマンドラインに出力した文字...
-
ブラックジャック
-
C言語で、「自然数nを入力し、n...
-
error C2143: 構文エラー : ';'...
-
scanfに文字が入力されたときに...
-
4の倍数を論理演算で表す。。
-
縦の棒グラフ
-
パスカルの三角形についてのCプ...
-
(C言語)めちゃくちゃな値にな...
-
ピラミッド表示プログラム。
-
C言語 ツェラーの公式を使った...
-
CTRL+Dでループを抜けるには
-
勝率をプログラムに
-
Visual Sutdio 2017 でのC言語...
-
%P と %X の違い
-
printf( " %2d", p * q );
-
C言語 プログラミング ごめんな...
-
printf()文の書式
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報