Как преобразовать следующую функцию Java в C++?

StackOverflow https://stackoverflow.com/questions/2344691

  •  23-09-2019
  •  | 
  •  

Вопрос

Если у меня есть следующий код Java:

int[][] readAPuzzle()
{
    Scanner input = new Scanner(System.in);

    int[][] grid = new int[9][9];
    for (int i=0; i<9; i++)
      for (int j=0; j<9; j++)
        grid[i][j] = input.nextInt();

    return grid;
}

public static void main(String[] args) {
    // Read a Sudoku puzzle
    int[][] grid = readAPuzzle();
}

Как я могу преобразовать это в C++?Я зацикливаюсь на передаче массива.Вот моя попытка:

#include <iostream>

using namespace std;

const int puzzle_width = 9;
const int puzzle_height = 9;

void readAPuzzle(int (&grid)[puzzle_height][puzzle_width])
{
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
            grid[i][j] = cin >> grid[i][j];

    return;
}

int main()
{
    int[9][9] grid;
    readAPuzzle(grid);
}

Что я делаю не так вообще?

Это было полезно?

Решение

Вам нужно прочитать входной текст в массив grid и передать это дальше.

grid[i][j] = cin >> grid[i][j];

Не делает то, что вы думаете, он пытается присвоить объекту тип istream к grid[ i ][ j ]

cin >> grid[i][j]; 

однако хватает.

Также обратите внимание, что в C++ размеры следуют за идентификатором, например:

int grid[9][9];

Другие советы

Пытаться

#include <iostream>
using namespace std;

const int puzzle_width = 9;
const int puzzle_height = 9;

void readAPuzzle(int grid[puzzle_height][puzzle_width])
{
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
            cin >> grid[i][j];
}

int main()
{
    int grid[9][9];
    readAPuzzle(grid);
}

Как правило, массивы автоматически передаются по ссылке, а размеры массивов указываются после имени массива, а не после его типа.

И если вы объявили константы, вам всегда следует использовать Puzzle_width и Puzzle_height (хотя, возможно, сократите их имена), а не магические числа, такие как 9.

Простой ответ — использовать vectors вместо массивов.Правила C++ для передачи массивов в качестве параметров функции являются эзотерическими и заимствованы из C.Вот некоторые из проблем:

  • Вы не можете долго использовать массивы, не понимая и не используя указатели.

Подписка к массиву — это подписка к указателю.Доступ к массивам осуществляется с помощью арифметики указателей.Массивы как параметры функции на самом деле являются замаскированными указателями.

  • Функции не получают информацию о размере массива при приеме аргумента массива.

Рассмотрим декларацию:

void inc_all(int myarray[]); /* increments each member of the array */

К сожалению, этот параметр массива не является параметром массива!На самом деле это параметр указателя:

void inc_all(int *myarray); /* Exactly the same thing! */

А указатель не знает, сколько элементов находится в последовательности, на которую он указывает.В результате эта функция не может иметь информацию, необходимую для определения момента остановки массива.Вам либо нужно передать длину:

void inc_all(int *myarray, size_t len); /* size_t rather than int */

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

  • Вы не можете передать в функцию двумерный массив произвольного размера.

Если вы попытаетесь создать функцию, которая принимает двумерный массив:

void inc_all(int myarray[][]); /* XXX won't compile! */

он не скомпилируется.Проблема в том, что у вас есть массив неопределенной длины из массивов неопределенной длины intс.Внешний массив не знает, насколько велики его элементы (внутренние массивы), и поэтому не знает, как перемещаться по ним в памяти.Вам необходимо указать размер внутренних массивов:

void inc_all(int myarray[][10]);

в этот момент ваш код, вероятно, не будет таким общим, как вы надеялись.

Если вы используете vectorпесок vectors из vectorss, эти проблемы возникают не потому, что vectorОни сами знают, сколько у них членов, и носят эту информацию с собой.

Если вы все еще хотите узнать больше о массивах и указателях, я рекомендую раздел 6 FAQ по comp.lang.c.

Я думаю, вам следует в первую очередь использовать константы.Вы можете передать как указатель значения, так и ссылку на указатель (оба 4 байта), а также это указатель на память (он имеет значение).

#include <iostream>
using namespace std;

const int puzzle_width = 9;
const int puzzle_height = 9;

void readAPuzzle(int grid[puzzle_height][puzzle_width])
{
    for(int i = 0; i < puzzle_height; i++)
        for(int j = 0; j < puzzle_width; j++)
            cin >> grid[i][j];
}

int main()
{
    int grid[puzzle_height][puzzle_width];//I think your need to do this
    readAPuzzle(grid);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top