我试图学习来自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;
}
答案 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循环只是一个无限循环。 最后的注意事项:您可能需要检查所有输入,以确保用户没有放入荒谬的内容。