传递数组不起作用。 C ++

时间:2013-03-15 13:02:03

标签: c++ arrays function

我试图学习来自java的c ++,传递数组给我带来麻烦。我在主要的

中有这个代码
int *newTry;
    bool won = false;
    while(!won && tries < maxTries){

        newTry = makeTry();

        printw("= %d =",newTry[3]); //seems to give me the 4th value okay...
        refresh();
        won = checkTry(newTry,correctSequence);
        printw("\n");

        tries++;
    }

Theese是困扰我的功能。

bool checkTry(int attempt[],int correct[])
{

    for(int i =0; i < columns; i++)
    {
        printw(" %d against %d\n", attempt[i],correct[i]); // not values from array!
        refresh();
        if (attempt[i] == correct[i])
        {
            refresh();
        }
   }
   return false;

}

尝试[i]调用给了我奇怪的价值,甚至远远不是我期望或想要的。我猜它是某种指针值或什么的,但我如何提取值?我用google搜索指针和东西,但我的想法是没有理解为什么我没有得到一个值。

帮助表示感谢!

完整的代码如下。

<pre>
    #include <iostream>
    #include <cstdlib>
    #include <time.h>
    #include <ncurses.h>


using namespace std;
int numberOfColors, columns, maxTries;


void SetupGame()
{
    //asks some questions about the game setup.
    printw("How many colours do you want? \n[1-7]");
    refresh();
    numberOfColors = getch()-'0';
    printw("and how many columns?\n");
    refresh();
    columns= getch()-'0';;
    refresh();
    printw("and how many tries do you get?\n");
    refresh();
    maxTries= getch()-'0';;
    refresh();
}
int randomBetween(int min, int max)
{
    int random_integer;
    random_integer =  min + (rand() % (int)(max - min + 1));
    return random_integer;

}
int* randomizeSequence(int colours, int colus)
{
    int randomSequence [colus-1];
    for(int i =0; i < colus; i++)
    {
        randomSequence[i] = randomBetween(0,colours);
        printw("%d",randomSequence[i]);
        refresh();
    }
    printw("\n");
    return randomSequence;
}


void repeatWrite(string str, int times)
{
    const char * c = str.c_str();
    for(int i =0; i<times; i++)
    {
        printw(c);
    }
}
void printStart()
{
    printw (" ");
    repeatWrite("--", columns);
    printw ("\n");
    refresh();
    printw ("| ");
    repeatWrite("¤ ",columns);
    printw("|\n");
    refresh();
    printw(" ");
    repeatWrite("--", columns);
    printw("\n");
    refresh();

}
void printIntColour(int integer)
{
    // TODO (kristoffer#1#): define all colours

    init_pair(1,COLOR_BLACK,COLOR_GREEN);
    attron(COLOR_PAIR(1));
    printw("%d",integer);
    attroff(COLOR_PAIR(1));
}

int* makeTry()
{
    int trySequence[columns-1];
    printw("| ");
    repeatWrite("  ",columns);
    printw("|\r| ");
    noecho();

    for(int i =0; i < columns; i++)
    {
        trySequence[i] = getch()-'0';
        while(trySequence[i] > numberOfColors)
        {
            trySequence[i] = getch()-'0';
        }
        printIntColour(trySequence[i]);
        printw(" ");

    }
    printw("|");
    refresh();
    echo();
    return trySequence;
}
bool checkTry(int attempt[],int correct[])
{

        for(int i =0; i < columns; i++)
        {
            printw(" %d against %d\n", attempt[i],correct[i]);
            refresh();
            if (attempt[i] == correct[i])
            {
                refresh();
            }
       }
       return false;
}


int main(void)
{
    initscr();          //initiate screen from ncurses
    start_color();      //color mode on!

    srand((unsigned)time(0)); // sett the clock time as seed for the random function.

    numberOfColors = 7;
    columns =5;
    maxTries =12;

    int yes =1;
    printw ("Use standard settings 1/0? : \n");
    refresh();

    noecho();
    yes = getch()-'0';
    echo();
    refresh();

    if(yes ==0)
    {
        SetupGame();
    }
    printw("You chose %d colours %d columns %d maxtries\n" ,numberOfColors,columns,maxTries);

    refresh();
    int play =1;
    while(play==1 )
    {
        int *correctSequence = randomizeSequence(numberOfColors,columns);
        int tries = 0;
        printStart();
        bool won = false;
        while(!won && tries < maxTries){
            int *newTry;
            newTry = makeTry();

            printw("= %d =",newTry[3]);
            refresh();
            won = checkTry(newTry,correctSequence);
            printw("\n");

            tries++;
        }
        refresh();
        printw("\nplay again? 1/0\n");
        getch();
    }
    endwin();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您不希望在makeTry或randomizeSequence中返回数组。而是使用:

分配给堆
int *trySequence = new int[columns - 1];
int *randomSequence = new int[colus - 1];

然后您可以将其视为普通数组。 通常永远不会返回数组,总是返回指针。数组将从堆栈中释放出来,一般来说,这意味着它们将一直工作,直到数组的旧内存空间再次被使用(最有可能在下一个函数调用中)。 如果您在代码中的任何其他位置返回数组,请确保也修复它。

另外,我不确定你是否需要减去1。 数组的大小将完全是列 - 在第一种情况下为1,但是如果您希望大小与列数相同,则不需要减去1(请注意,数组中的最后一个元素仍然是在这种情况下的第1列)。因此,根据需要调整数组大小和循环访问它们(编译器通常不会检查用于访问数组的值是否在范围内)。

在不相关的修复程序中,将while循环中的最后一行代码更改为:

play = getch() - '0';

除此之外,while循环只是一个无限循环。 最后的注意事项:您可能需要检查所有输入,以确保用户没有放入荒谬的内容。