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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

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

Q&A

解決済

2回答

5483閲覧

C言語 二次元配列で行ごとに値を代入する方法

Ann99

総合スコア3

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

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

0グッド

0クリップ

投稿2020/08/30 06:39

実現したいこと

int型,要素数4×4の二次元配列matrixに値を代入したい.
要素数4の一次元配列rowを用意し,それをmatrixの一行目の各列の値として代入したい.

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

matrix[0] = row; としたところでエラーが発生.

array type 'int [4]' is not assignable

該当のソースコード

C

1#include<stdio.h> 2 3const int SIZE = 4; 4int matrix[SIZE][SIZE]; 5 6int main(void){ 7 int row[4] = {1,2,3,4}; 8 matrix[0] = row;//ここでエラー 9 return 0; 10}

###補足
C言語初心者です.
Java(Processing)で書いたコードをC言語に移行しているところです.
Processingにてうまく動いたコードを以下に記述します.
これと同じ動きをC言語で実現するにはどのようにすればいいか教えてください.

Processing

1final int SIZE = 4; 2int[][] matrix = new int[SIZE][SIZE]; 3 4void setup(){ 5 int[] row = {1,2,3,4}; 6 matrix[0] = row; 7 exit(); 8}

説明が不十分なところがあるかとは思いますが,回答よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

ベストアンサー

CとProcessing(Java)では多次元配列の考え方が大きく違います。
Cでは、低次の配列を配列にした(ベタに並べた)ものが高次の配列になりますが、
Javaでは低次の配列をオブジェクトして持つ配列が高次の配列になります。と、「初心者」を称する方に言っても掴めるかどうかわかりませんが...まずは「互換ではない」とだけ覚えておいてください。

CでJava式の多次元配列と同じデータ構造を取るなら(これはCの文法上は「多次元配列」という名前のものではありませんが、多次元のデータを表す構造であることは確かです)

C

1#include <stdio.h> 2 3#define SIZE 4 4//現行のCの規格では、配列宣言時の要素数に変数を使うことはオプションなので、通らないコンパイラがあります。一応defineに変えます 5int *matrix[SIZE]; 6 7int main(void) { 8 int row[SIZE] = {1, 2, 3, 4}; 9 matrix[0] = row; //これなら代入できる 10 11 printf("%d %d\n", matrix[0][0], matrix[0][3]);//表記は多次元配列と同様になる 12 13 row[0][0]=100;// rowを変更すると、matrixでアクセスするデータも変更される(Processing/Javaも同様) 14 printf("%d %d\n", matrix[0][0], matrix[0][3]);//表記は多次元配列と同様になる 15 16 return 0; 17}

となります。

投稿2020/08/30 07:34

thkana

総合スコア7629

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

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

0

C言語では、配列に対して一気に代入することはできません。
地道にループで一つ一つ代入するか、memcpy関数等を使って、
直接、該当メモリエリアにデータを書き込んでやる等の方法をとる必要があります。

memcpy
オブジェクトを指定文字数分コピーします.

#include <string.h> void *memcpy( void * restrict s1, const void * restrict s2, size_t n );

memcpy 関数は s2 が指すオブジェクトから,s1 が指すオブジェクトに n 文字分文字をコピーします. 領域の重なり合うオブジェクト間でコピーが行われるときの動作は未定義です.

こんな感じです。

C

1 int row[4] = {1,2,3,4}; 2 memcpy(matrix[0],row,sizeof(row)); 3 printf("%d,%d",matrix[0][1],matrix[0][3]); //確認

(もしくは構造体だと一括代入できるので、キャストして構造体経由とか…)

投稿2020/08/30 06:49

編集2020/08/30 07:05
amiya

総合スコア1218

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問