【问题标题】:Trying to define a matrix by a vector尝试通过向量定义矩阵
【发布时间】:2020-05-09 14:04:49
【问题描述】:

我正在尝试使用以下语法定义带有向量的矩阵:

typedef int vect[dim];
typedef int vect mat[dim];

最后,我想要一个使用两个向量的矩阵,虽然我得到以下错误:

在文件范围内可变地修改'vect' typedef int vect[dim];

在 'mat' typedef 之前应为 '='、','、';'、'asm' 或 '__attribute__' int vect mat[dim];

【问题讨论】:

  • 请附上代码,而不是代码图片。

标签: c scope typedef variable-length-array


【解决方案1】:

这个 typedef 定义

typedef int vect mat[dim];

无效,因为类型说明符int由于此类型定义而出现了两次

typedef int vect[dim];

你应该写

typedef vect mat[dim];

其次(C 标准,6.7.8 类型定义)

2 如果一个 typedef 名称指定了一个可变修改的类型,那么它应该 有块作用域。

但是,您似乎在文件范围内的 typedef 中定义了可变修改的类型。所以编译器应该会报错。

如果您需要具有可变修改类型的 typedef,则在块范围内定义它,例如在需要使用它的函数的开头。

这是一个演示程序。

#include <stdio.h>

void f( size_t dim )
{
    for ( ; dim != 0; --dim )
    {
        typedef int vect[dim];
        typedef vect mat[dim];

        mat m;

        printf( "sizeof( m ) = %zu\n", sizeof( m ) );
    }
}

int main(void) 
{
    f( 5 );

    return 0;
}

它的输出是

sizeof( m ) = 100
sizeof( m ) = 64
sizeof( m ) = 36
sizeof( m ) = 16
sizeof( m ) = 4

或者另一个例子。

#include <stdio.h>

void fill( size_t dim, int m[][dim] )
{
    for ( size_t i = 0; i < dim; i++ )
    {
        for ( size_t j = 0; j < dim; j++ )
        {
            m[i][j] = i * dim + j;
        }
    }
}

void output( size_t dim, int m[][dim] )
{
    for ( size_t i = 0; i < dim; i++ )
    {
        for ( size_t j = 0; j < dim; j++ )
        {
            printf( "%2d ", m[i][j] );
        }
        putchar( '\n' );
    }
}


int main(void) 
{
    printf( "Enter the dimension of a square matrix: " );
    size_t dim;

    scanf( "%zu", &dim );

    typedef int vect[dim];
    typedef vect mat[dim];

    mat m;

    fill( dim, m );
    output( dim, m );

    return 0;
}

程序输出可能看起来像

Enter the dimension of a square matrix: 4
 0  1  2  3 
 4  5  6  7 
 8  9 10 11 
12 13 14 15 

【讨论】:

  • 如何存储由暗色矢量集合组成的矩阵的元素。例如,如果我有 3 个向量并希望它是一个矩阵? (vect 是一个向量)
  • @Madtec 您可以创建一个指向向量的指针数组,例如 vec * a[] = { bector1, vector2, vector3 };然后在循环中将这个数组中的元素复制到 mat 类型的数组中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2018-01-13
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多