C中数组下标错误的无效类型'int [int]'?

时间:2015-11-05 12:31:53

标签: c matrix compiler-errors

我正在尝试将我的矩阵2by2平方矩阵分段。但我得到了编译错误,不知道为什么。我的代码:

    int main()
    {
        int rowsize,n,i,j,l,k, var=0,var2=0,count = 0,square2by2[2][2];
        printf("Size of square matrix: " );
        scanf("%d",&n);
        rowsize=n;
        int *matrix = (int *)malloc(rowsize * rowsize * sizeof(int));
        for (i = 0; i <  rowsize; i++)
          for (j = 0; j < rowsize; j++)
             *(matrix + i*rowsize + j) = ++count;

        for (i = 0; i <  rowsize; i++)
         {
            for (j = 0; j < rowsize; j++)
            {
                printf("%d ", *(matrix + i*rowsize + j));
            }
            printf("\n");
         }
         for( i=0, l=var2 ;i<2 , l<var2+rowsize ;i++,l++)
        {
            for( j=0 , k=var ; j<2, k<var+2 ;j++,k++)
            {
                square2by2[i][j]=matrix[l][k]; // error line
            }

            if(i==1)
            {
                var++;
                if(var==rowsize-1) 
                {
                    printf("\n");
                    for(int x=0;x<2;x++)
                    {
                        printf("\n");
                        for(int y=0;y<2;y++)
                        {
                            printf("%d\t",square2by2[x][y]);
                        }
                    }
                    var = 0;
                    i-=2;
                    l-=1;
                    if(l==rowsize+1) 
                    {
                        break;
                    }
                }
                else
                {
                    i-=2;
                    l-=2;
                    printf("\n");
                    for(int x=0;x<2;x++)
                    {
                        printf("\n");
                        for(int y=0;y<2;y++)
                        {
                            printf("%d\t",square2by2[x][y]);
                        }
                    }
                }

            }
return 0;
        }

,错误是

  

37 36 [错误]数组下标的类型'int [int]'无效   为什么我会收到此错误?

2 个答案:

答案 0 :(得分:1)

问题是您对#include <libopencm3/stm32/rcc.h> #include <libopencm3/stm32/gpio.h> #include <libopencm3/stm32/usart.h> #include <libopencm3/cm3/nvic.h> #include <libopencm3/stm32/dma.h> void clock_setup(void) { rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); rcc_periph_clock_enable(RCC_GPIOA); rcc_periph_clock_enable(RCC_USART2); rcc_periph_clock_enable(RCC_DMA1); } void gpio_setup(void) { gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO2 | GPIO3); gpio_set_af(GPIOA, GPIO_AF7, GPIO2 | GPIO3); } void usart_setup(int baud) { usart_set_baudrate(USART2, baud); usart_set_databits(USART2, 8); usart_set_stopbits(USART2, USART_STOPBITS_1); usart_set_mode(USART2, USART_MODE_TX_RX); usart_set_parity(USART2, USART_PARITY_NONE); usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE); usart_enable(USART2); } void dma_request_setup(void) { dma_stream_reset(DMA1, DMA_STREAM5); nvic_enable_irq(NVIC_DMA1_STREAM5_IRQ); dma_set_peripheral_address(DMA1, DMA_STREAM5, (uint32_t) &USART2_DR); dma_set_transfer_mode(DMA1, DMA_STREAM5, DMA_SxCR_DIR_PERIPHERAL_TO_MEM); dma_set_peripheral_size(DMA1, DMA_STREAM5, DMA_SxCR_PSIZE_8BIT); dma_set_memory_size(DMA1, DMA_STREAM5, DMA_SxCR_MSIZE_8BIT); dma_set_priority(DMA1, DMA_STREAM5, DMA_SxCR_PL_VERY_HIGH); dma_disable_peripheral_increment_mode(DMA1, DMA_SxCR_CHSEL_4); dma_enable_memory_increment_mode(DMA1, DMA_STREAM5); dma_disable_transfer_error_interrupt(DMA1, DMA_STREAM5); dma_disable_half_transfer_interrupt(DMA1, DMA_STREAM5); dma_disable_direct_mode_error_interrupt(DMA1, DMA_STREAM5); dma_disable_fifo_error_interrupt(DMA1, DMA_STREAM5); dma_enable_transfer_complete_interrupt(DMA1, DMA_STREAM5); } void dma_transmit_setup(void) { dma_stream_reset(DMA1, DMA_STREAM6); nvic_enable_irq(NVIC_DMA1_STREAM6_IRQ); dma_set_peripheral_address(DMA1, DMA_STREAM6, (uint32_t) &USART2_DR); dma_set_transfer_mode(DMA1, DMA_STREAM6, DMA_SxCR_DIR_MEM_TO_PERIPHERAL); dma_set_peripheral_size(DMA1, DMA_STREAM6, DMA_SxCR_PSIZE_8BIT); dma_set_memory_size(DMA1, DMA_STREAM6, DMA_SxCR_MSIZE_8BIT); dma_set_priority(DMA1, DMA_STREAM6, DMA_SxCR_PL_VERY_HIGH); dma_disable_peripheral_increment_mode(DMA1, DMA_SxCR_CHSEL_4); dma_enable_memory_increment_mode(DMA1, DMA_STREAM6); dma_disable_transfer_error_interrupt(DMA1, DMA_STREAM6); dma_disable_half_transfer_interrupt(DMA1, DMA_STREAM6); dma_disable_direct_mode_error_interrupt(DMA1, DMA_STREAM6); dma_disable_fifo_error_interrupt(DMA1, DMA_STREAM6); dma_enable_transfer_complete_interrupt(DMA1, DMA_STREAM6); } void dma_request(void* buffer, const int datasize) { dma_set_memory_address(DMA1, DMA_STREAM5, (uint32_t) buffer); dma_set_number_of_data(DMA1, DMA_STREAM5, datasize); dma_channel_select(DMA1, DMA_STREAM5, DMA_SxCR_CHSEL_4); dma_enable_stream(DMA1, DMA_STREAM5); signal_host(); usart_enable_rx_dma(USART2); } void dma_transmit(const void* buffer, const int datasize) { dma_set_memory_address(DMA1, DMA_STREAM6, (uint32_t) buffer); dma_set_number_of_data(DMA1, DMA_STREAM6, datasize); dma_channel_select(DMA1, DMA_STREAM6, DMA_SxCR_CHSEL_4); dma_enable_stream(DMA1, DMA_STREAM6); usart_enable_tx_dma(USART2); } int dma_done(void) { return !((DMA1_S5CR | DMA1_S6CR) & 1); } void dma1_stream5_isr(void) { usart_disable_rx_dma(USART2); dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF); dma_disable_stream(DMA1, DMA_STREAM5); } void dma1_stream6_isr(void) { usart_disable_tx_dma(USART2); dma_clear_interrupt_flags(DMA1, DMA_STREAM6, DMA_TCIF); dma_disable_stream(DMA1, DMA_STREAM6); } void signal_host(void) { usart_send_blocking(USART2, '\n'); } int main(void) { clock_setup(); gpio_setup(); usart_setup(921600); dma_transmit_setup(); dma_request_setup(); unsigned char buf[16]; dma_request(buf, 16); while (!dma_done()); buf[10] = 'd'; buf[11] = 'a'; buf[12] = 'w'; buf[13] = 'n'; dma_transmit(buf, 16); while (!dma_done()); while(1); return 0; } 的声明:

matrix

这声明int *matrix = ... 是指向matrix的指针,或者等效地指向一维int数组的指针。因此,int表达式matrix[l]是有价值的。您无法将第二个int索引应用于[k]

要做你正在尝试做的事情,你需要一个指向二维数组的指针。以下是如何做到这一点:

int

此处int a[dim1][dim2]; int (*p)[dim2] = a; // The parentheses are necessary! 是指向p的指针,因此您可以像引用a一样引用p,例如a

答案 1 :(得分:0)

矩阵已声明为int *,但正用作int [] []

要修复,请使用

square2by2[i][j]=matrix[l * rowsize + k];