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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

527閲覧

配列の要素数と「二重for文のループ回数」が同じ場合の要素の対応付け

slimat

総合スコア57

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/11/28 07:07

編集2018/11/28 08:03

以下のコードは大学の授業で配布されたコードの一部に私が書き加えたものです。

こんにちは。

下記コードのような配列(array())の要素数と二重のfor文のループ回数が等しいとき(下記コードでは16)、forのループ数と等しいindexの配列の要素を繋げるプログラムを実装したいと思っています。(「こんなことがしたい」のようなことがしたいです)
下記コードは私なりに書いてみたのですが、「ここでエラー」のところで「; が必要です」とエラーが出ました。
どこが間違っているのでしょうか?
また、もっと簡単に実装できるのでしょうか?

よろしくお願いいたします。

c

1static void a(double m[][4], double x, double y, double z) 2{ 3 int i,j,k = 0; 4 double func(x, y, z) {//ここでエラー 5 double array[] = { 1, 0, 0, x, 0, 1, 0, y, 0, 0, 0, z, 0, 0, 0, 1 }; 6 return array[k]; 7 ++k; 8 } 9 10 for (j = 0; j < 4; ++j) { 11 for (i = 0; i < 4; ++i) { 12 m[j][i] = func(x, y, z);//こんなことがしたい 13 } 14 } 15}

cでは関数の中に関数を入れることはできないとの指摘をいただきましたが、wikipediaの「ネスティングのページ」に載っていた下記の図の内容はcでの関数のネストができることを表しているものではないのでしょうか?(未熟なのでcでは関数のネストができるものだと思いました(gccコンパイラー?を使うと書かれているので、また、文法がcに似ていたので))。リンクは当該ページリンク内容
イメージ説明
思ったのですが、単純にcで書かれていないだけのことだったんですね...

図のように関数外に関数を持ってくると、エラーが出なくなりました。コメントアウトされたものは気にしないでください。
イメージ説明

++kの位置を移動(aaaに変更)
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

Cでは関数の中では関数を定義できません。
その関数を独立させて書きましょう

#そうしても、まだまだエラーは出ますね

投稿2018/11/28 07:13

編集2018/11/28 07:15
y_waiwai

総合スコア87784

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

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

slimat

2018/11/28 07:26

回答ありがとうございます。 ご回答の「cでの関数のネストはできない」の指摘に関する疑問があるので質問欄に追記しましたので、ご確認いただければ幸いです。
slimat

2018/11/28 07:28

すみません。やはりwikiの内容はcで書かれていないということなんですね。今思ったのですが
y_waiwai

2018/11/28 07:28

> 以下の例ではGCCのみコンパイル可能 の記述のとおりです。 GCCのみの拡張機能ということなんでしょう
maisumakun

2018/11/28 07:29

関数のネストはGCCというコンパイラ専用の構文で、あなたが使っているコンパイラが別のものであれば実行できません。
slimat

2018/11/28 07:32

回答ありがとうございます! これは何言語なんでしょうか?
maisumakun

2018/11/28 07:36

「C言語のGCC方言」です。
slimat

2018/11/28 07:36

そういうものがあるのですね! 勉強になりました、ありがとうございます。
slimat

2018/11/28 07:46 編集

追記のように関数のネストをやめたところエラーが出なくなりました。エラーは出ていませんが、追記のコードは上手く働いてくれるのでしょうか?(タイトルのような働きをしてくれるのでしょうか)
y_waiwai

2018/11/28 07:52

return で関数から抜けてしまうので、 ++k; の文は実行されません
slimat

2018/11/28 08:03

追記しました。 これでいけますでしょうか?
y_waiwai

2018/11/28 08:06

それで想定の動作はするでしょう。 実際に動かしてみるとどうなるでしょうか #ましかし、なかなか問題の多そうなコードになってますね
slimat

2018/11/28 08:13

他の部分も実装してからの実行の方が良さそうなファイルなので、お待ちください。
slimat

2018/11/29 01:38

お待たせしました。 実行したのですが、エラーが出ていました。 いろいろやって、結局1行で書ける問題だったことに気付き、1行で済みました。
slimat

2018/11/29 07:49 編集

エラーも何が・どこが悪いのかその時は分からず、他の部分との関係が悪かった可能性も同等か、それ以上にあると思います。 いじっていたら、1行で書けました。
y_waiwai

2018/11/29 05:22

C言語では、配列の場合のメモリ配置ってのはわかりやすく規定されてますんで、そこらへん調べてみたらいいかもしれませんね
slimat

2018/11/29 07:51

分かりました、確認しておきます。 おかげさまで解決することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問