Нахождение длины массива двумерного массива с использованием вложенного цикла while - PullRequest
0 голосов
/ 07 июля 2019

Я не могу получить длину массива через вложенный цикл while. Строки и столбцы могут иметь любое значение, но мне нужно убедиться, что они равны длине массива. длина массива = строки * столбцы

Вложенный цикл for мне не поможет, потому что я не знаю, какой длины может быть введенный массив.

void add(char arr[][SIZE], int rows, int cols, int val) {
    int arrayStorage = 0;
    int arrayStorage2 = 0;

    while (arr[arrayStorage][arrayStorage2] != 0 && (isalpha(arr[arrayStorage][arrayStorage2]) || isdigit(arr[arrayStorage][arrayStorage2]) || arr[arrayStorage][arrayStorage2] == ' ') && (isprint(arr[arrayStorage][arrayStorage2]) || !(iscntrl(arr[arrayStorage][arrayStorage2]))))
    {
        arrayStorage2 = 0;
        while (arr[arrayStorage][arrayStorage2] != 0 && (isalpha(arr[arrayStorage][arrayStorage2]) || isdigit(arr[arrayStorage][arrayStorage2]) || arr[arrayStorage][arrayStorage2] == ' ') && (isprint(arr[arrayStorage][arrayStorage2]) || !(iscntrl(arr[arrayStorage][arrayStorage2]))))
        {
            arrayStorage2++;

        }
        arrayStorage2--;
        arrayStorage++;
    }

        int storage3 = (arrayStorage2) * arrayStorage;
        cout << storage3;
        char addVal = (char)val;
      if (( storage3 == (rows * cols)) && rows > 0 && rows <= SIZE && cols > 0 && cols <= SIZE)
          {
         // do stuff
          }

}

int main()
{
    char arr4 [][SIZE] = {{'a','b','c',' ',' '}, {'d','e','f',' ',' '}, {'g','r','o','w','n'}, {'n','o','w',' ',' '}};
    add(arr4,4,5,5);
    return 0;
}

storage3 длина массива равна 5, когда предполагается, что она равна 20

1 Ответ

0 голосов
/ 07 июля 2019

Одним из способов сделать это может быть отсутствие цикла вообще!изменить тип, используемый в качестве массива.Если вместо char arr[][] вы определяете тип, который оборачивается вокруг массива и показывает его размеры.Что-то вроде:

template <int tRows, int tCols>
class Array2d
{
public:
     static constexpr int sRows = tRows;
     static constexpr int sCols = tCols;
     char mArr[tRows][tCols]
};

Тогда вы можете сделать свою функцию добавления функцией шаблона и использовать выставленные размеры в своем чеке

template <class Array_t>
void add(Array_t& arr, int rows, int cols)
{
     int storage3 = Array_t::sRows * Array_t::sCols;
     if (( storage3 == (rows * cols)) && rows > 0 && rows <= SIZE && cols > 0 && cols <= SIZE)
     {
          // do stuff
     }
}
...