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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

4回答

3875閲覧

指定しているのにコンパイルできない!どうして?

matsu333

総合スコア1

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/10/07 08:34

編集2021/10/07 09:08

前提・実現したいこと

N×3と3×Mの行列の積を求めるプログラムを作っています
コンパイルが出来ない為、コンパイルできるようにしたいです。

発生している問題・エラーメッセージ

error: redeclaration of 'a' with no linkage previous declaration of 'a' was here error: redeclaration of 'b' with no linkage previous declaration of 'b' was here #include <stdio.h> #include <math.h> int main(void){ int n,m,i,j,k,l,x,y,z; double a[i][j],b[k][l]; printf("Aの列数\n"); scanf("%d", &n); printf("Bの行数\n"); scanf("%d", &m); for(i=1; i<n; i++){ for(j=1; j<4; j++){ printf("A[%d][%d]を入力",i,j); scanf("%d", a[i][j] ); } } for(k=1; k<4; k++){ for(l=1; l<m; l++){ printf("B[%d][%d]を入力",k,l); scanf("%d", b[k][l] ); } } double C[x][y], a[x][z], b[z][y]; for(x=1; x<n; x++){ for(y=1; y<m; y++){ for(z=1; z<4; z++){ C[x][y] = a[x][z]*b[z][y]; printf("結果=%d",C[x][y]); } } } return 0; }

試したこと

double型とうで指定したがうまくいかない

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

前提・実現したいこと

C言語でN×3と3×Mのプログラムを作成しています。
コンパイルがどうしても出来ない状態です。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

BeatStar

2021/10/07 08:38

カテ違い。本当にPHPなの? ガチでPHPなの?
y_waiwai

2021/10/07 08:39

PHPのタグ付いてるけど、どー見てもPHPじゃないですね。 修正しよう
matsu333

2021/10/07 08:45

失礼しました。間違えました。コンパイルエラーに関する質問です。 よろしくお願いします。
y_waiwai

2021/10/07 08:46

その言語は何でしょうかw #笑ってしまったw
y_waiwai

2021/10/07 08:49

なら、C言語のタグがありますんで、それつけてくださいw
matsu333

2021/10/07 08:53

始めて使用するので。。。失礼しました。
BeatStar

2021/10/07 08:55

あと、 > ここに質問の内容を詳しく書いてください。 (例)PHP(CakePHP)で●●なシステムを作っています。 のような関係のない部分は削除しましょう。余計なノイズです。
matsu333

2021/10/07 09:09

失礼しました。更新いたしましたのでよろしければご教授お願いいたします。
dodox86

2021/10/07 09:13

なぜこう、基礎をすっ飛ばして目的第一で突っ走る方が後を絶たないのだろうか。とても不思議です。何か、研究などの道具としての扱いなのですかね。
K_3578

2021/10/08 01:20

Cだと結構色んな所から触れる可能性があるので何かを便利にしようとしてコピペで動かそうとしたら 動かないって人が多いのではという推測をしてます
guest

回答4

0

コンパイルは、当たり外れのくじを引くわけではないのです。失敗すれば、必ず対応するエラーメッセージを返してくれるはずです。

エラーメッセージを読むのが第一歩です。それもせずに改善しようとしているのでは、当て物と何も変わりません。

投稿2021/10/07 09:21

maisumakun

総合スコア145262

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

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

0

ベストアンサー

とりあえず、基礎からやり直しましょう
基礎ができていればありえない問題です。

ーーーー

一つ目。エラーメッセージぐらいは読みましょう
エラーメッセージは暴言や罵倒ではありません。
コンパイラからのメッセージです。
ヒントが隠されています。

error: redeclaration of 'a' with no linkage previous declaration of 'a' was here [訳] エラーだぜ〜: “a”ってのが重複して宣言されってっぞ? この行より先に、すでに”a”ってのが宣言されてっぞ?

つまり、重複宣言が問題なっているわけです。

いや、わかるやん。ってなりそうですが、
コンパイラは機械です。

コンパイラの気持ちになってみましょう。

最後の、『結果』があるようなfor文内で、
配列aが使われていますが、これの定義はなんでしょうか。
でもコードを見ると、なぜか二箇所でaが宣言されています。
そうなると、コンパイラは○○なので「え? どっちのaなん?」と混乱します。
まあ、人間でも混乱しますが。

そうなると、解釈できずに、『おいおい、重複してんぞ!?』と言うわけです。

これが今回のコンパイルエラー。

ほら、基礎と理由がわかればあとは簡単ですね。
どちらかを別名にするか、一方(おそらく意味的に二番目の方)を削除すればいいだけです。

このようにヒントが隠されています。

二つ目。コードを読みましょう

プログラミングは『こう書けばいい』というものではありません。

なのでコードを読みましょう。
コードを読むコツは『一行レベルで、その行が何をしているかを考えながら読む』です。

C

1#include <stdio.h> 2#include <math.h> 3int main(void){ 4// 変数 n等を宣言 5int n,m,i,j,k,l,x,y,z; 6// 配列a, bを宣言 7double a[i][j],b[k][l]; 8 // ユーザ入力を受け付ける 9 printf("Aの列数\n"); 10 scanf("%d", &n); 11 printf("Bの行数\n"); 12 scanf("%d", &m); 13 14 // 変数i の初期値: 1, iがn未満の間, +1しながらループ 15 for(i=1; i<n; i++){ 16 /// 変数j の初期値: 1, jが4未満の間, +1しながらループ 17 for(j=1; j<4; j++){ 18 // ユーザ入力を受け付ける 19 printf("A[%d][%d]を入力",i,j); 20 scanf("%d", a[i][j] ); 21 } 22 } 23 24 // 〜中略〜 25 26// 新たに配列C, a, b を宣言 27double C[x][y], a[x][z], b[z][y]; 28 29 // 変数 x の初期値: 1, xがn未満の間, +1しながらループ 30 for(x=1; x<n; x++){ 31 for(y=1; y<m; y++){ 32 for(z=1; z<4; z++){ 33 C[x][y] = a[x][z]*b[z][y]; 34 printf("結果=%d",C[x][y]); 35 } 36 } 37 } 38return 0; 39}

のようにやります。
実際には細かくやるべきですが、今回の問題はそこじゃないので割愛します。

そして、このコメントを疑似コードとして切り出します。

1. 変数n,m 等を宣言する 2. 配列a, bを宣言する 3. ユーザ入力を受け付けて取得 4. 変数iの初期値: 1, iがn未満の間, ループ 4.1. 変数jの初期値: 1, jが4未満の間, ループ 4.1.1. ユーザ入力を受け付けて取得 〜中略〜 7. 配列C,a,b を宣言する 8. 変数xの初期値: 1, xがn未満の間, ループ 8..1. 変数…, ループ 8.1.1. ループ 8.1.1.1. 計算! 8.1.1.2. 出力

みたいな感じですね。(途中から手ぬきな感じですが)

これを現実世界で手作業でやってみてください。
つまり、算数か数学かなんかの手順としてあると考えるのです。

そして、実際のデータを入れて考えみるとか。

現実世界だと、『変数宣言』とかは、ホワイトボードかなんかに、

m: 1 n: 2

みたいに書いていく感じです。

でも、(7)で、『新たに』書く状態です。

n: 1 n: 2 … a: { 1, 2, 4 … } b: { 3, 3, 4, … } C: { … } a: { 0, 0, 0, … } <= これ b: { 0, 0, 0, … } <= これ

みたいな状態です。で、いざ読もうとすると、『あれ?a ってどっちのだっけ?』となります。

そのため、エラーが出ているのです。

プログラミングは簡単に言えば、現実世界のシミュレーションです。

[質問者さんが学ぶべきこと] ■ 変数 ■ 配列 ■ (変数等の)スコープ ■ プログラミングとは ■ エラーメッセージを読んで対処すること ■ コードを読むこと

投稿2021/10/07 09:26

編集2021/10/07 09:43
BeatStar

総合スコア4958

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

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

matsu333

2021/10/07 09:34

本当に失礼しました。他のユーザー様からも同様のご指摘をいただきました。基礎固めが出来ていない状態でこのプログラムの作成をしようとしたことが誤りであったと痛感しています。長文で丁寧に回答してくださりありがとうございます。より力を付けてから中身のある質問をしていくよう心がけます。
guest

0

int n,m,i,j,k,l,x,y,z;

double a[i][j],b[k][l];

配列の宣言は、宣言時にそのサイズが決まってなければいけません。
i,j,k,lには値が入ってません

投稿2021/10/07 08:52

y_waiwai

総合スコア87804

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

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

matsu333

2021/10/07 08:58

回答ありがとうございます。i,j,k,lに最初に値を入れるにはどのようにすればいいでしょうか? #defineで書き込むのですか?
y_waiwai

2021/10/07 09:06

そもそもの話になりますが、まずはC言語の基本的な文法を学ぶところから始めましょう。 あなたのそのコードの意味を理解しない限りは、どんなアドバイスしたところでそのコードは動きませんよ
matsu333

2021/10/07 09:10

分かりました。ありがとうございます。
guest

0

エラーメッセージのとおりです。
同じ関数スコープ内にabが2回宣言・定義されています。

投稿2021/10/07 08:49

itagagaki

総合スコア8402

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

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

matsu333

2021/10/07 09:00

回答ありがとうございます。2回宣言定義されているということはa[i][j]とa[x][z]の二つにaが含まれた状態で宣言されてしまっているということでしょうか?この場合はどちらかを別の文字に置き換えないとなりませんか??
itagagaki

2021/10/07 09:02

同じスコープに同じ名前の変数を複数宣言することができないのは理解できますか?
matsu333

2021/10/07 09:05

すいません。C言語初心者なモノで、、、理解していませんでした。複数宣言できない"a"はどのようにすればよいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問