在 C++/Arduino 中将二维矩阵分配给另一个变量

Assigning a 2d-matrix to another variable in C++/Arduino

提问人:Kerpol 提问时间:2/3/2021 最后编辑:Jonathan LefflerKerpol 更新时间:2/3/2021 访问量:429

问:

我有一个数组或矩阵,就像另一个变量一样。如何将二维矩阵分配给变量,我什至可以做到吗?我还有一些二维矩阵,如图所示,我希望由其中一个分配。first[][4] = {{7, 255, 0, 0}, {6, 0, 255, 0}}firstvar

数组 C arduino 赋值运算符 arduino-c++

评论

0赞 Antti Haapala -- Слава Україні 2/3/2021
@vlad这不是 C,也不是适当的C++,它是 Arduino C++,因此没有C++标准库(也没有 C 标准库),但可以肯定的是可以从头开始使用模板。

答:

2赞 Vlad from Moscow 2/3/2021 #1

最初,您的问题带有 C 标签。因此,我将开始牢记 C。

数组没有赋值运算符。如果要将一个数组的元素复制到另一个数组中,则应使用标头中声明的标准函数或使用“手动”写入循环。memcpy<string.h>

这是一个示范程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { M = 2, N = 4 };
    
    int first[M][N] = 
    {
        { 7, 255, 0, 0 }, 
        { 6, 0, 255, 0 }
    };
    int second[M][N];
    
    memcpy( second, first, M * N * sizeof( int ) );
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%3d ", second[i][j] );
        }
        putchar( '\n' );
    }
    
    return 0;
}

程序输出为

  7 255   0   0 
  6   0 255   0 

另一方面,您可以将数组分配给指针。例如

int first[][4] = {{7, 255, 0, 0}, {6, 0, 255, 0}};
int ( *p )[4] = first;

int first[][4] = {{7, 255, 0, 0}, {6, 0, 255, 0}};
int ( *p )[sizeof( first ) / sizeof( *first )][4] = &first;

并使用指针访问数组中的元素。

另一种方法是将数组包装在结构中。在这种情况下,您将能够使用结构的赋值运算符将一个数组分配给另一个数组。

这是一个演示程序。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { M = 2, N = 4 };
    struct Array
    {
        int a[M][N];
    };
    
    struct Array first =
    {
        {
            { 7, 255, 0, 0 }, 
            { 6, 0, 255, 0 }
        }           
    };
    struct Array second;
    
    second = first;
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%3d ", second.a[i][j] );
        }
        putchar( '\n' );
    }
    
    return 0;
}

它的输出与上面所示相同,即

  7 255   0   0 
  6   0 255   0 

如果你使用的是C++,那么你可以使用标准容器,或者甚至是它们的组合来制作多维数组。std::arraystd::vector

这是一个使用 .std::array

#include <iostream>
#include <iomanip>
#include <array>

int main() 
{
    std::array<std::array<int, 4>, 2>  first =
    {
        {
            { { 7, 255, 0, 0 } }, 
            { { 6, 0, 255, 0 } }
        }           
    };

    std::array<std::array<int, 4>, 2>  second;
    
    second = first;
    
    for ( const auto &row : second )
    {
        for ( const auto &item : row )
        {
            std::cout << std::setw( 3 ) << item << ' ';
        }
        std::cout << '\n';
    }
    
    return 0;
}

像往常一样,程序输出是

  7 255   0   0 
  6   0 255   0