Когда я компилирую свой проект, Visual Studio говорит, что не может найти файл .exe. Я предполагаю, что это потому, что программа не может скомпилировать. Я исправил большинство ошибок, которые у меня были, но я не могу понять, что осталось.
1>------ Build started: Project: Hmwk.3.Assignment, Configuration: Debug Win32 ------
1> engine.cpp
1>c:\users\tmars_000\desktop\hmwk.3.released\engine.cpp(23): error C2082: redefinition of formal parameter 'elements'
1>c:\users\tmars_000\desktop\hmwk.3.released\engine.cpp(29): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\tmars_000\desktop\hmwk.3.released\engine.cpp(30): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Я не уверен, как отформатировать блок ** таким образом, чтобы исправить ошибку.
//Engine.cpp
include <iostream>
#include <fstream>
#include <string>
#include "engine.h"#include "Player.h"#include "Opponent.h"
using namespace std;
fstream fin;
void loadBackground(std::string gameFile, int & numElements, Block**& elements){
int tempX;
int tempY;
fin.open(gameFile,ios::in);
fin >> numElements;
Block** elements = new Block*[numElements];
for(int i=0; i<numElements; i++){
elements[i] = new Block();
fin >> tempX;
fin >> tempY;
elements[i]->setPosX(tempX);
elements[i]->setPosY(tempY);
}
fin.close();
}void changeGameState(std::string command, Player* player, Opponent* opponent){
player->update(command);
opponent->update(command);
}
Когда я изменяю это просто elements = new Block * [numElements]; он создал эти ошибки.
1>------ Build started: Project: Hmwk.3.Assignment, Configuration: Debug Win32 ------
1> engine.cpp
1>c:\users\tmars_000\desktop\hmwk.3.released\engine.cpp(25): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\tmars_000\desktop\hmwk.3.released\engine.cpp(26): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>Opponent.obj : error LNK2005: "class std::basic_fstream<char,struct std::char_traits<char> > fin" (?fin@@3V?$basic_fstream@DU?$char_traits@D@std@@@std@@A) already defined in engine.obj
1>Player.obj : error LNK2005: "class std::basic_fstream<char,struct std::char_traits<char> > fin" (?fin@@3V?$basic_fstream@DU?$char_traits@D@std@@@std@@A) already defined in engine.obj
1>gui.obj : error LNK2019: unresolved external symbol "public: int __thiscall Opponent::getSpriteID(void)" (?getSpriteID@Opponent@@QAEHXZ) referenced in function "public: void __thiscall GUI::displayGameState(class Player *,class Opponent *,int,class Block * *)" (?displayGameState@GUI@@QAEXPAVPlayer@@PAVOpponent@@HPAPAVBlock@@@Z)
1>C:\Users\tmars_000\Desktop\Hmwk.3.Released\Debug\Hmwk.3.Assignment.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Они связаны с форматом этой строки, или они, вероятно, отдельные проблемы, только появляются после того, как он компилирует эту строку?
Я уверен, что другой ответ будет более глубоким с этим, но короткая версия — именно то, что говорит ошибка:
void loadBackground(std::string gameFile, int & numElements, Block**& elements){ //elements is being defined as a parameter name
int tempX;
int tempY;
fin.open(gameFile,ios::in);
fin >> numElements;
Block** elements = new Block*[numElements]; //ERROR: elements is being redefined
for(int i=0; i<numElements; i++){
elements[i] = new Block();
fin >> tempX;
fin >> tempY;
elements[i]->setPosX(tempX);
elements[i]->setPosY(tempY);
}
fin.close();
}
Таким образом, вы можете переименовать elements
,
Компилятор говорит вам, что вы сказали ему дважды, что elements
есть, поэтому ошибка. Чтобы исправить это просто заменить
Block** elements = new Block*[numElements];
за:
elements = new Block*[numElements];
Если я правильно понял, вы пытаетесь выделить память и использовать указатель, который был передан в качестве аргумента, чтобы указать на него. Это именно то, что это делает.