не объявлено в области действия c ++

0

Я получаю сообщение об ошибке, что породы не объявлены в области видимости, даже если она находится прямо под fucntion. Что не так?

Точная ошибка: 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 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 ответа

2

декларировать

void breed(string r[]);

в верхней части файла перед первым использованием или включать соответствующий заголовочный файл, содержащий это объявление.

  • 0
    спасибо, я знал, что это должно быть что-то глупое
  • 0
    Да, в Си лучше объявить прототипы функций, прежде чем объявить их. поскольку это последовательное чтение файла, компилятор будет знать о его существовании и избежит некоторых из этих ошибок. Для меня это лучшая практика;)
0

Когда компилятор обрабатывает ваш код, он начинается сверху и заканчивается. В любой момент этого процесса он только "знает" о вещах, которые он уже видел. Поэтому, когда вы пытаетесь вызвать breed функцию от best функции, она не знает, что вы говорите, потому что не видел ничего назвать breed еще.

Чтобы исправить это, вы должны сообщить компилятору, что такое функция breed прежде чем пытаться ее использовать. Есть несколько способов сделать это. Самым простым было бы перемещение всей функции breed над best функцией в исходном файле. Альтернативой было бы объявить функцию breed выше в файле, прежде чем определять ее позже. Чтобы объявить это, просто включите строку void breed (string r[]); где-то (не забывайте, в конце). Таким образом, компилятор знает, что "порода" относится к функции, которая принимает массив строк и ничего не возвращает, что достаточно для компиляции вызовов функции.

0

c++ проверяет имена функций в момент, когда они читают их в коде (символически). если он еще не прочитал его, он не знает, что он существует. почему вам, по крайней мере, нужно объявить прототип функции, прежде чем использовать его в своем коде.

эрго, здесь вам нужно хотя бы поставить

void breed(string r[]);

перед использованием функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню