マクロで定義された自作関数を使って お手軽にmain関数内で定義された構造体の配列に格納されている数値を変更してみます。
ソーラー
「構造体の場合もあっさり完了
いい感じだね~~🌞(^_-)-☆
今度は
main関数内で定義された構造体の配列
に格納されている数値を
マクロで定義された自作関数を使って変更してみよう
これは どうなるのかな」
アレサ「これも とっても簡単な予感がします。
次のプログラムのように
立方体cube1のデータ
立方体cube1につけられたナンバー1
縦の長さ 4.0
横の長さ 5.0
高さ 6.0
と
立方体cube2のデータ
立方体cube1につけられたナンバー2
縦の長さ 6.0
横の長さ 7.0
高さ 8.0
が
構造体Cube型の配列を使って次のようにメモリに格納されているとします
#include <stdio.h>
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
int main(void){
Cube str[2];
str[0].no=1;
str[0].tate=4.0;
str[0].yoko=5.0;
str[0].takasa=6.0;
str[1].no=2;
str[1].tate=6.0;
str[1].yoko=7.0;
str[1].takasa=8.0;
/* strの構造体Cube型の配列宣言、初期化が行われています*/
printf ("%d\n",str[0].no);
printf ("%f\n",str[0].tate);
printf ("%f\n",str[0].yoko);
printf ("%f\n",str[0].takasa);
printf ("%d\n",str[1].no);
printf ("%f\n",str[1].tate);
printf ("%f\n",str[1].yoko);
printf ("%f\n",str[1].takasa);
return 0;
}
コンパイル結果
1
4.000000
5.000000
6.000000
2
6.000000
7.000000
8.000000
ソーラー「このとき これまた
マクロを #define f(a) a+1
と定義して
main関数内で作成された
構造体の配列strの中に生成された
配列変数
str[0].no=1;
str[0].tate=4.0;
str[0].yoko=5.0;
str[0].takasa=6.0;
str[1].no=2;
str[1].tate=6.0;
str[1].yoko=7.0;
str[1].takasa=8.0;
に
str[0].no=1;
str[0].tate=4.0;
str[0].yoko=5.0;
str[0].takasa=6.0;
str[1].no=2;
str[1].tate=6.0;
str[1].yoko=7.0;
str[1].takasa=8.0;
と数値が格納されている状態から
マクロの定義
#define f(a) a+1
を使い
str[0].no=2;
str[0].tate=5.0;
str[0].yoko=6.0;
str[0].takasa=7.0;
str[1].no=3;
str[1].tate=7.0;
str[1].yoko=8.0;
str[1].takasa=9.0;
と
数値が格納されている状態に変更してみるよ
それは次のプログラムのようになるんじゃないかな?
#include <stdio.h>
#define f(a) a=a+1
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
int main(void){
Cube str[2];
str[0].no=1;
str[0].tate=4.0;
str[0].yoko=5.0;
str[0].takasa=6.0;
str[1].no=2;
str[1].tate=6.0;
str[1].yoko=7.0;
str[1].takasa=8.0;
f(str[0].no);
f(str[0].tate);
f(str[0].yoko);
f(str[0].takasa);
f(str[1].no);
f(str[1].yoko);
f(str[1].tate);
f(str[1].takasa);
printf ("%d\n",str[0].no);
printf ("%f\n",str[0].tate);
printf ("%f\n",str[0].yoko);
printf ("%f\n",str[0].takasa);
printf ("%d\n",str[1].no);
printf ("%f\n",str[1].tate);
printf ("%f\n",str[1].yoko);
printf ("%f\n",str[1].takasa);
return 0;
}
コンパイル結果
2
5.000000
6.000000
7.000000
3
7.000000
8.000000
9.000000
アレサ「これまた 簡単に
main関数内で作成された
構造体1の配列に格納されている数値を
変更することができました
本当 マクロってとても便利です」
ソーラー「奥様も安心ってわけだね」
ソーラー「
マクロの定義が
#define f(a) a=a+1
となっているので
f(str[0].no);
f(str[0].tate);
f(str[0].yoko);
f(str[0].takasa);
f(str[1].no);
f(str[1].yoko);
f(str[1].tate);
f(str[1].takasa);
は
str[0].no=str[0].no+1;
str[0].tate=str[0].tate+1;
str[0].yoko=str[0].yoko+1;
str[0].takasa=str[0].takasa+1;
str[1].no=str[1].no+1;
str[1].yoko=str[1].yoko+1;
str[1].tate=str[1].tate+1;
str[1].takasa=str[1].takasa+1;
とみなされるので
printf ("%d\n",str[0].no);
printf ("%f\n",str[0].tate);
printf ("%f\n",str[0].yoko);
printf ("%f\n",str[0].takasa);
printf ("%d\n",str[1].no);
printf ("%f\n",str[1].tate);
printf ("%f\n",str[1].yoko);
printf ("%f\n",str[1].takasa);
は
printf ("%d\n",str[0].no+1);
printf ("%f\n",str[0].tate+1);
printf ("%f\n",str[0].yoko+1);
printf ("%f\n",str[0].takasa+1);
printf ("%d\n",str[1].no+1);
printf ("%f\n",str[1].tate+1);
printf ("%f\n",str[1].yoko+1);
printf ("%f\n",str[1].takasa+1);
に等しくなります。
このとき
str[0].no
str[0].tate
str[0].yoko
str[0].takasa
str[1].no
str[1].tate
str[1].yoko
str[1].takasa
には
1
4.000000
5.000000
6.000000
2
6.000000
7.000000
8.000000
が
格納されているので
printf ("%d\n",str[0].no+1);
printf ("%f\n",str[0].tate+1);
printf ("%f\n",str[0].yoko+1);
printf ("%f\n",str[0].takasa+1);
printf ("%d\n",str[1].no+1);
printf ("%f\n",str[1].tate+1);
printf ("%f\n",str[1].yoko+1);
printf ("%f\n",str[1].takasa+1);
の
コンパイル結果は
2
5.000000
6.000000
7.000000
3
7.000000
8.000000
9.000000
と
なるんだね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます