2015-11-24 17 views
1

Я столкнулся с проблемой при попытке заполнить многомерный массив m [4] [4] [3] [3]. Это на самом деле 16 матриц 3х3, которые я уже знаю, которые я пытаюсь заполнить. Каков правильный способ сделать это? Я получаю сообщение об ошибке: «16: ожидаемое первичное выражение перед» {«токен»Как заполнить часть многомерного массива в C++?

Пожалуйста, помогите.

#include<iostream> 
using namespace std; 

int main() 
{ 

    int m[4][4][3][3];//0,1,2,3 HLUT 

    m[0][0]={1,0,1, 
      1,1,1, 
      1,0,1}; 
    m[0][1]={1,1,1, 
      0,1,0, 
      1,1,1}; 
    m[0][2]={1,0,1, 
      1,1,1, 
      1,0,1}; 
    m[0][3]={1,1,1, 
      0,1,0, 
      1,1,1}; 


    m[1][0]={1,0,0, 
      1,0,0, 
      1,1,1}; 
    m[1][1]={0,0,1, 
      0,0,1, 
      1,1,1}; 
    m[1][2]={1,1,1, 
      0,0,1, 
      0,0,1}; 
    m[1][3]={1,1,1, 
      1,0,0, 
      1,0,0}; 


    m[2][0]={1,0,1, 
      1,0,1, 
      1,1,1}; 
    m[2][1]={1,1,1, 
      0,0,1, 
      1,1,1}; 
    m[2][2]={1,1,1, 
      1,0,1, 
      1,0,1}; 
    m[2][3]={1,1,1, 
      1,0,0, 
      1,1,1}; 


    m[3][0]={1,1,1, 
      0,1,0, 
      0,1,0}; 
    m[3][1]={1,0,0, 
      1,1,1, 
      1,0,0}; 
    m[3][2]={0,1,0, 
      0,1,0, 
      1,1,1}; 
    m[3][3]={0,0,1, 
      1,1,1, 
      0,0,1}; 

}     
+0

Visual Studio дает лучшее сообщение об ошибке: 'ошибка C3863: массив типа" ИНТ [3] [3] не assignable' –

+0

Почему это не переуступка? Есть ли другой способ сделать это? –

+0

Я никогда не пытался это делать раньше, но я не думаю, что это возможно. Хотя я не могу сказать точно. –

ответ

1

Вы не можете инициализировать такой многомерный массив. Если вы хотите сделать это сделать это следующим образом:

#include<iostream> 
using namespace std; 

int main() 
{ 

    int m[4][4][3][3] = {1,0,1, //1 
      1,1,1, 
      1,0,1, 

      1,1,1,  //2 
      0,1,0, 
      1,1,1, 

      1,0,1,  //3 
      1,1,1, 
      1,0,1, 

      // ... 
      // ... 

      1,0,1,  //16 
      1,1,1, 
      1,0,1}; 


    for(int i=0;i<4;++i) 
     for(int j=0;j<4;++j) { 
      for(int p=0;p<3;++p) { 
       for(int q=0;q<3;++q) 
        std::cout<<m[i][j][p][q]; 
       std::cout<<std::endl; 
      } 
      std::cout<<std::endl; 
     } 
} 

Или использовать 4 for петли, чтобы присвоить массив. Вы всегда должны помнить, что многомерный массив - это не что иное, как одномерный массив в памяти, поэтому инициализируйте его как одномерное.

+0

OK это сработало спасибо :) –

0
m[0][0]={1,0,1, 
     1,1,1, 
     1,0,1}; 

эффективно пытается назначить одну одномерный массив 9 int с к 2-мерной матрицы 3 int с.

Измените первоначальное заявление на

int m[4][4][9] 
+0

Проблема по-прежнему сохраняется. Сообщение об ошибке по-прежнему: 16: ожидаемое первичное выражение перед '{' токеном –

+0

Это неверно. Вы не можете назначить список инициализации элементу массива, даже если этот элемент является массивом. –

1

Что такое правильный способ сделать это?

Вы можете использовать один из следующих вариантов:

  1. Вы можете инициализировать все элементы матрицы во время инициализации.
  2. Инициализировать элементы до 0. Затем задайте значения элементов один за другим.
  3. Используйте std::vector вместо простых старых массивов.
  4. Используйте std::array вместо простых старых массивов.

Метод 1: Инициализировать все элементы

int main() 
{ 

    int m[4][4][3][3] = 
    { 
     1,0,1, 
     1,1,1, 
     1,0,1, 

     1,1,1, 
     0,1,0, 
     1,1,1, 

     1,0,1, 
     1,1,1, 
     1,0,1, 

     1,1,1, 
     0,1,0, 
     1,1,1, 

     1,0,0, 
     1,0,0, 
     1,1,1, 

     0,0,1, 
     0,0,1, 
     1,1,1, 

     1,1,1, 
     0,0,1, 
     0,0,1, 

     1,1,1, 
     1,0,0, 
     1,0,0, 

     1,0,1, 
     1,0,1, 
     1,1,1, 

     1,1,1, 
     0,0,1, 
     1,1,1, 

     1,1,1, 
     1,0,1, 
     1,0,1, 

     1,1,1, 
     1,0,0, 
     1,1,1, 

     1,1,1, 
     0,1,0, 
     0,1,0, 

     1,0,0, 
     1,1,1, 
     1,0,0, 

     0,1,0, 
     0,1,0, 
     1,1,1, 

     0,0,1, 
     1,1,1, 
     0,0,1 
    }; 

} 

Способ 2: Назначение отдельных элементов

int main() 
{ 

    int m[4][4][3][3] = {}; 

    m[0][0][0][0] = 1; 
    m[0][0][0][1] = 0; 
    m[0][0][0][2] = 1; 

    ... 

    m[3][3][2][0] = 0; 
    m[3][3][2][1] = 0; 
    m[3][3][2][2] = 1; 

} 

Способ 3: Использование std::vector

#include <vector> 

int main() 
{ 
    std::vector<int> m1(3); 
    std::vector<decltype(m1)> m2(3, m1); 
    std::vector<decltype(m2)> m3(4, m2); 
    std::vector<decltype(m3)> m(4, m3); 

    m[0][0][0] = {1, 0, 1}; 
    m[0][0][1] = {1, 1, 1}; 
    m[0][0][2] = {1, 0, 1}; 

    ... 

    m[3][3][0] = {0, 0, 1}; 
    m[3][3][1] = {1, 1, 1}; 
    m[3][3][2] = {0, 0, 1}; 

    return 0; 
} 

Метод 4: Использование std::array

#include <array> 

int main() 
{ 
    std::array<int, 3> m1; 
    std::array<decltype(m1), 3> m2; 
    std::array<decltype(m2), 4> m3; 
    std::array<decltype(m3), 4> m; 

    m[0][0][0] = {1, 0, 1}; 
    m[0][0][1] = {1, 1, 1}; 
    m[0][0][2] = {1, 0, 1}; 

    ... 

    m[3][3][0] = {0, 0, 1}; 
    m[3][3][1] = {1, 1, 1}; 
    m[3][3][2] = {0, 0, 1}; 

    return 0; 
} 
Смежные вопросы