كيف يمكنني تحويل وظيفة 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 من الأسئلة الشائعة عن comp.lang.c.

أعتقد أنك يجب أن تستخدم ثوابتك أولاً وقبل كل شيء. يمكنك تمرير مؤشر القيمة وكذلك المرجع على المؤشر (كلاهما 4Bytes) ، كما أنه مؤشر على الذاكرة (إنه قيمة).

#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