Попытка определить матрицу по вектору - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь определить матрицу с векторами со следующим синтаксисом:

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

В конце я хочу получить матрицу, использующую два вектора, хотя я получаю следующие ошибки:

переменное изменение 'vect' в области видимости файла typedef int vect [dim];

ожидаемое '=', ',', ';', 'asm' или '__attribute__' перед 'mat 'typedef int vect mat [dim];

1 Ответ

1 голос
/ 23 января 2020

Это определение typedef

typedef int vect mat[dim];

недопустимо, поскольку спецификатор типа int встречается два раза из-за этого typedef

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...