表达式必须含有常量值?这样的问题怎么处理呀?

img

img


表达式必须含有常量值 ,这一个怎么处理呢?困扰好久了,求解答。

c++其实允许动态定义数组长度的,但是二维数组的行和列不能都是变量
你可以看看这个
https://blog.csdn.net/lpjiejie/article/details/112724633
或者你改成这种形式
char board[row,col]也可以
因为[][]是不定长度的二维数组,允许每行的列数不同,所以初始化的时候也必须循环new出每行的列数,如果是常量则无需循环

这种根据输入动态确定数组大小的用法,只能使用指针实现。动态分配指针的空间代码示例:int *p ; *p = (int *)malloc(sizeof(p));

仅供参考:

#include <stdio.h>
#include <stdlib.h>
int **newarr2d(int rows,int cols) {
    int **p,i;

    p=new int *[rows];
    if (NULL==p) exit(1);
    for (i=0;i<rows;i++) {
        p[i]=new int[cols];
        if (NULL==p[i]) exit(1);
    }
    return p;
}
void deletearr2d(int **p,int rows) {
    int i;

    for (i=0;i<rows;i++) {
        delete[] p[i];
    }
    delete[] p;
}
int main() {
    int **arr2d,i,j,r,c;

    r=4;
    c=5;
    //在堆中开辟一个4×5的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    r=6;
    c=3;
    //在堆中开辟一个6×3的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    return 0;
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//  0  1  2
//  3  4  5
//  6  7  8
//  9 10 11
// 12 13 14
// 15 16 17
//


你可以思考一下,数组是啥,是定义特定的类型,然后编译器去直接分配特定大小的内存然后供数组去使用的, 编译时决定的
你在声明数组的时候,如果下标是变量,下标的初始化本身就需要运行时初始化,这不就有问题了
所以 声明数组时 下标应该是常量 可以自行理解这个点

你函数里面,那叫形参,也可以理解为它是独属于函数的变量,请问,你这个函数有定义row col 吗?
解决方法三种:

  1. 定义全局的const 变量 row、col
  2. 函数的形参改为Board[][100],强制写最大值;
  3. 函数的形参改为 Board**