質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

11631閲覧

#defineの値をループで変えたい

dzpcot3x

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/02/16 16:36

編集2017/02/16 17:08

###前提・実現したいこと
初めての質問です。
C言語でプログラムを書き終えてから、
途中で、#defineで書いていた値を、変数にしてループにしたい、

…例えば、#define N 30
としていたNを1,2,…,30のように順次値を変えて結果を出力したい…

と思って、調べてみたのですが、
プリプロセッサの話となると難しくてイマイチよく理解できず…。

関数マクロが分からなくて困ってます(T_T)
どなたか詳しい方教えてくださいませ。

###ソースコード

#include <stdio.h> #include <stdlib.h> #define K 30 //←これをmain内をそのままにループにしたい #define N 45 int main(void){ int x[K][N] = {0}; int z[K][N] = {0}; int w[K][N] = {0}; for(int p=0; p<K; p++){ for(int q=0; q<N; q++){ for(int r=0; r<N; r++){ ・・・(中略)

###試したこと

defineを消して、ソースコード全体を
安直にforで括ってみたら下のように出ました。

error: variable-sized object may not be initialized

これを解決する方が簡単かもしれませんが、
勉強のために#defineでのループが、もし出来るならそれで解決したいと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

#define K 30
と書いているとコンパイル時に
'K'と書いているところを'30'に置き換えています。
なので実行時には変数'K'は存在しないのです。

投稿2017/02/16 21:26

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

define自体の仕組みは分かっていましたが、
やはりdefineの部分だけをいじる方法は無さそうですね…
調べて出てきたプリプロセッサでのループの話も
イメージしてたものとは違ったみたいでした。
固定値をやめてmainで書き換えようと思います。

投稿2017/02/17 01:01

dzpcot3x

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単にループカウンタを変化させれば良いだけなのか、x、z、wなどの配列要素数もそれに伴って変える必要があるのかにより、実現するコードが変わります。

最も単純なのは、以下の部分を関数化して、Kを関数の引数で渡すようにします。

C

1 for(int p=0; p<K; p++){ 2 3 for(int q=0; q<N; q++){ 4 for(int r=0; r<N; r++){

その関数を、1〜30回ループするのが簡単です。もちろん、配列x、y、zをループの中で利用している場合には、関数の引数で渡したり工夫が必要ですが。

投稿2017/02/17 00:46

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dzpcot3x

2017/02/17 01:08

defineし直し、のようなことがしたいKは 配列要素数にも入っているのでそれらも全て変えたいです。 mainの中で全体をforで括るように書き換えたのですが、 配列の定義〈int x[K][N] = ...〉の部分でエラーが出ます… ご回答頂いたものとは何か関連がありますか?
guest

0

#defineはあくまでも置き換え用の仕組みです。
プリコンパイル時にK30に置き換わります。
なので質問に挙げているようなことは無理です。
代替案としては、#defineで範囲を定義してループで回すことになると思います。

c

1#define K_MIN 1 2#define K_MAX 30 3 4for(int K = K_MIN; K <= K_MAX; K++ ){ 5 for(int p=0; p<K; p++){ 6 for(int q=0; q<N; q++){ 7 for(int r=0; r<N; r++){

投稿2017/02/16 23:48

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

defineは変数ではないので消して普通の変数にして見てはどうでしょう。

投稿2017/02/16 16:53

toutou

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問