未在范围c ++中声明

时间:2014-11-20 07:22:10

标签: c++

我收到的错误是品种未在范围内宣布,即使它正好在福音下面。有什么问题?

确切的错误是:prog.cpp:在函数'void best(std :: string *)'中: prog.cpp:131:15:错误:在此范围内未声明'品种'  品种(bestRats)

#include <iostream>
#include <sstream>
#include <vector>
#include <math.h>
#include <map>
#include <string.h>
#include <queue>
#include <regex>
#include <bitset>
#include <stdlib.h>
#include <climits>
// #include "dungeonrats.cpp"

using namespace std;

/*
Finds the maximum integer in an array of integers.
Size is the size of the given array.
*/
int getMax(int* numbers, int size) {
   int maximum = INT_MIN;
   for (int i = 0; i < size; i++) {
      if (numbers[i] > maximum) maximum = numbers[i];
   }
   return maximum;
}

int getMaxi(int* numbers, int size) {
   int maximum = INT_MIN;
   int maxi;
   for (int i = 0; i < size; i++) {
      if (numbers[i] > maximum) {
         maximum = numbers[i];
         maxi = i;
      }
   }
   return maxi;
}


/*
"randomly" generates a new maze (but is it REALLY random?)
aim is 65% empty tiles
10% food tiles
10% obstacles
15% pits
*/
string getNewMaze(string mapseed) {
   string maze = mapseed.substr(6); // get everything except the 25:25:
   for (int i = 0; i < 626; i++) {
      int percentile = rand() % 100; // from 0 to 99
      if (percentile < 65) {
         maze[i] = '.';
      }
      else if (percentile >= 65 && percentile < 75) {
         maze[i] = '$';
      }
      else if (percentile >= 75 && percentile < 85) {
         maze[i] = '*';
      }
      else maze[i] = 'X';

   }



   return maze;
}

/*
A function used to print how many of each kind of tile
exist in the maze.
*/
void testFrequency(string mapseed) {
   int numEmpty = 0;
   int numFood = 0;
   int numObs = 0;
   int numPit = 0;
   for (int i = 0; i < 626; i++) {
      if (mapseed[i] == '.') {
         numEmpty++;
      }
      if (mapseed[i] == '$') {
         numFood++;
      }
      if (mapseed[i] == '*') {
         numObs++;
      }
      if (mapseed[i] == 'X') {
         numPit++;
      }
   }
   cout << "Number of empty tiles is " << numEmpty << endl;
   cout << "Number of food tiles is " << numFood << endl;
   cout << "Number of obstacles is " << numObs << endl;
   cout << "Number of pits is " << numPit << endl;


}

/*
Returns an array of size 2 containing the best two rats.
*/
void best(string r[]) {
   // r is the array of five rat genomes
   //int moves = simulator(mapseed, genome, start_row, start_col);
   int* ratMoves = new int[5]; // array that stores how long each rat lasted
   int maxIndex = 0;
   int max = INT_MIN;
   string originalMapseed = "25:25:..$.$.X.............X....$X.X*..X$..X...*X$..$...X$.$......X.$.X...XX.$.X*.*.*..X..X.**.......X..$$$...........XX.....................$...X...*.$..X..$X..........$.*..X.....$.X..$*.$X......$...X.*X$......$.**.X.X..XX$X..*....*..X.X....$...X...X........$.X....$...*...X$*........X..$*$$......$$...$*..X.$.$......$.$.$...$..X.*.....X..$......$.XX*..X.$.X......X$*.**.....X*...$..XX..X.....$....X....X...X....X.$X$..X..........$...*.X$..X...$*...........*....XXX$$.$.$..*$XX..XX..*.....$......X.XX$..$$..X$.XX.$$..X.*..*......X......$..$.$$..*...X.........$X....$X.$$.*.$.$.$..**.....X.$.$X.*.$.........$**..X.X.X$X.$.*X.X*..$*.";

   for (int i = 0; i < 5; i++) {
      string mapseed = getNewMaze(originalMapseed);
      int sumTurns = 0;
      for (int k = 0; k < 10; k++) {
         string mapseed = getNewMaze(originalMapseed);
         // sumTurns += simulator(mapseed,r[i],12,12); // uncomment this line once in correct file
      }
      ratMoves[i] = sumTurns / 10; // average of rat's performance
                                   // over 10 random maps
      if (ratMoves[i] > max) { // find the best
         max = ratMoves[i];
         maxIndex = i;
      }

   }
   string bestRats[2];
   bestRats[0] = r[maxIndex]; // store the best
   ratMoves[maxIndex] = INT_MIN; // remove the best from array of rat moves
   bestRats[1] = r[getMaxi(ratMoves, 5)]; // get the second best & store it
   breed(bestRats);

}

void breed(string r[]) {
   int cap = 10;
   string c[5];
   for (int j = 0; j<5; j++)
      for (int i = 0; i<190; i++) {
         int check = rand() % cap + 1;
         if (check % 2 == 0) {
            if (check == 0)
               c[j] += rand() % 81 + 42;
            else
               c[j] += r[1][i];
         }
         else
            c[j] += r[0][i];
      }
   best(c);
}
int main() {
   string c[5];
   for (int j = 0; j<5; j++)
      for (int i = 0; i<190; i++)
         c[j] += rand() % 81 + 42;
   best(c);
}

3 个答案:

答案 0 :(得分:2)

声明

void breed(string r[]);
首次使用前在文件顶部

或包含包含此声明的相应头文件。

答案 1 :(得分:0)

c ++在代码中读取它们时(象征性地)检查函数名称。如果还没有读过它,它就不知道它存在。这就是为什么你至少需要在代码中使用它之前声明一个函数的原型。

ergo,在这里你需要至少放

void breed(string r[]);

使用该功能之前。

答案 2 :(得分:0)

当编译器处理您的代码时,它从顶部开始并一直到最后。在这个过程的任何特定点上,它只“知道”它已经看到过的东西。因此,当您尝试从breed函数调用best函数时,它不知道您在说什么,因为它还没有看到任何名为breed的函数。

要解决此问题,您需要让编译器在尝试使用它之前知道breed函数是什么。有几种方法可以做到这一点。最简单的方法是将整个breed函数移到源文件中的best函数之上。另一种方法是在稍后定义之前在文件中将breed函数声明为更高。要声明它,只需在某处包含行void breed (string r[]);(不要忘记;最后)。这样编译器就知道“品种”是指一个函数,它接受一个字符串数组并且什么都不返回,这足以让它编译对该函数的调用。