Не могу найти файл .exe

Когда я компилирую свой проект, 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 ==========

Связаны ли они с форматом этой строки или, скорее всего, это отдельные проблемы, возникающие только после компиляции этой строки?


person Tanner Marshall    schedule 26.10.2014    source источник
comment
Ошибка компиляции возникает из-за того, что у вас есть 2 переменные с одинаковым именем (элементы): последний параметр функции и другая переменная, которую вы объявляете позже. Вероятно, вы просто имели в виду elements = new Block*[numElements];, но без контекста сложно сказать.   -  person kyflare    schedule 27.10.2014
comment
Когда я изменяю его на это, он создает несколько новых ошибок, которые я не понимаю.   -  person Tanner Marshall    schedule 27.10.2014


Ответы (2)


Я уверен, что другой ответ будет более подробным, но короткая версия - это именно то, что говорит ошибка:

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.

person Selali Adobor    schedule 26.10.2014
comment
Вероятно, он хотел присвоить выделенный массив параметру elements (в качестве вывода функции). - person kyflare; 27.10.2014
comment
Хм... Но мне нужно создать динамический массив объектов Block, на который указывают элементы в main. Я объявляю его в main и передаю конструктору. Как мне поддерживать этот указатель при создании массива блоков, чтобы я мог использовать его в другом месте? - person Tanner Marshall; 27.10.2014

Компилятор говорит вам, что вы дважды сказали ему, что такое elements, поэтому ошибка. Чтобы исправить это, просто замените

Block** elements = new Block*[numElements];

для:

elements = new Block*[numElements];

Если я правильно понял, вы пытаетесь выделить память и использовать указатель, который был передан в качестве аргумента, чтобы указать на нее. Это именно то, что это делает.

person SlySherZ    schedule 27.10.2014