Мне нужна помощь по многофайловым программам
MaxStrikerMax - 2014-11-08 18:57:32
Все делал по уроку( http://old.shatalov.su/ru/articles/cpp_primer/multifiled.php ),
но при компиляции выдает это:
1> pseudo_game.cpp
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(29): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(31): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(34): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(35): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(36): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(37): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(44): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(45): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(53): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(63): error C2065: cout: необъявленный идентификатор
1>c:\users\user\documents\visual studio 2010\projects\fahrenheit to celsius\pseudo_game2\pseudo_game.cpp(64): error C2065: cout: необъявленный идентификатор
1> Создание кода...
1> Компиляция...
1> Functions.cpp
1> Создание кода...
========== Построение: успешно: 1, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Answers:
2014-11-11 10:10:01
Tooril
Возможно не подключил iostream. Если подключил, то попробуй std::cout<<"";. Если прокатит, можешь после инкладов прописать using namespace std; и писать просто cout<<"";
2014-11-11 10:13:01
Tooril
лучше покажи код, так понятнее будет где косяк
2014-11-12 21:41:57
MaxStrikerMax
попробовал, теперь:
1>------ Построение начато: проект: pseudo_game, Конфигурация: Debug Win32 ------
1>pseudo_game.obj : error LNK2005: "int ex" (?ex@@3HA) уже определен в Functions.obj
1>pseudo_game.obj : error LNK2005: "char (* map)[25]" (?map@@3PAY0BJ@DA) уже определен в Functions.obj
1>pseudo_game.obj : error LNK2005: "int e" (?e@@3HA) уже определен в Functions.obj
1>pseudo_game.obj : error LNK2005: "int moved" (?moved@@3HA) уже определен в Functions.obj
1>C:\Users\user\Documents\Visual Studio 2010\Projects\Fahrenheit to Celsius\Debug\pseudo_game.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
2014-11-12 21:42:19
MaxStrikerMax
Первый файл(cpp)
#include "Game.h"
void main()
{
setlocale(LC_CTYPE,"Russian");
tank t34 = {1,1,100,'T'};
tank pz4 = {13,23,100,'T'};
sklad cd = {500,'C'};
massive(t34, pz4);
int m=0;
int ms=0;
maping(m, ms, cd.symbol);
m=m+14;
ms=ms+24;
maping(m, ms, cd.symbol);
while(1)
{
system("cls");
for(int i=0; i<s; i++)
{
for(int j=0; j<c; j++)
{
std::cout << map[i][j];
}
std::cout << "\n";
}
std::cout << "\n";
std::cout << "Количество вашего топлива: "<< t34.fuel << "\n";
std::cout << "Количество топлива противника: "<< pz4.fuel << "\n";
std::cout << "Количество топлива на складе: "<<cd.fuel<<"\n";
input(t34, cd);
if (e==1)
{
system("cls");
std::cout << "Вы проиграли!\n";
std::cout << "Конец игры\n";
_getch();
break;
}
if (e==2)
{
system("cls");
std::cout << "Конец игры\n";
_getch();
break;
}
ai(pz4,cd);
if (pz4.fuel==0)
{
system("cls");
std::cout << "Вы выиграли!\n";
std::cout << "Конец игры\n";
_getch();
break;
}
}
exit (0);
}
Второй файл(cpp):
#include "Game.h"
int map_exit(tank& t)
{
if (t.x==14||t.y==24)
return -1;
else if(t.x==0||t.y==0)
return 1;
else
{
t.fuel--;
return 0;
}
}
char massive(tank& t, tank& p)
{
for (int i = 0; i< s; i++)
{
for (int j = 0; j< c; j++)
{
map[i][j] = ' ';
}
}
map [t.x][t.y]=t.symbol;
map [p.x][p.y]=p.symbol;
return map[s][c];
}
int maping(int& m, int& ms, char& c1)
{
int i=m;
for (int j=1;j<c-1;j++)
{
map[i][j]='-';
}
int j=ms;
for (i=1;i<s-1;i++)
{
map[i][j]='|';
}
map[0][0]='#';
map[14][0]='#';
map[0][24]='#';
map[14][24]='#';
map[10][15]=c1;
return m, ms;
}
int move(tank& t, cardinal_dirs& ch, sklad& c1)
{
int fuel;
switch(ch)
{
case west:
map[t.x][t.y] = ' ';
t.y--;
if(map[t.x][t.y]=='T')
{
t.y++;
t.fuel++;
}
ex=map_exit(t);
t.y=t.y+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case east:
map[t.x][t.y] = ' ';
t.y++;
if(map[t.x][t.y]=='T')
{
t.y--;
t.fuel++;
}
ex=map_exit(t);
t.y=t.y+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case south:
map[t.x][t.y] = ' ';
t.x++;
if(map[t.x][t.y]=='T')
{
t.x--;
t.fuel++;
}
ex=map_exit(t);
t.x=t.x+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case north:
map[t.x][t.y] = ' ';
t.x--;
if(map[t.x][t.y]=='T')
{
t.x++;
t.fuel++;
}
ex=map_exit(t);
t.x=t.x+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
}
if (map[t.x][t.y]==map[10][15])
{
if(c1.fuel!=0)
{
fuel=100-t.fuel;
if(c1.fuel<fuel)
fuel-=c1.fuel;
c1.fuel-=fuel;
t.fuel+=fuel;
}
map[10][15]=c1.symbol;
}
return e;
}
void input(tank& t, sklad& cd)
{
char act;
cardinal_dirs ch;
act=_getch();
ch=static_cast<cardinal_dirs>(act);
if (ch==west||ch==east||ch==south||ch==north)
move(t, ch, cd);
else if (ch==-32)
input(t, cd);
if(t.fuel==0)
e=1;
else if(ch==27)
e=2;
}
void ai(tank& pz4, sklad& s1)
{
cardinal_dirs dir;
int rnd;
rnd=rand()%4;
switch(rnd)
{
case 0:
dir = north;
break;
case 1:
dir = east;
break;
case 2:
dir = south;
break;
case 3:
dir = west;
break;
}
if(pz4.fuel!=0)
move(pz4,dir,s1);
}
2014-11-12 21:42:32
MaxStrikerMax
Заголовочный файл(h):
#include <iostream>
#include <clocale>
#include <conio.h>
#include <stdlib.h>
const int s=15;
const int c=25;
int ex;
int e=0;
char map[s][c];
int moved=0;
struct tank
{
int x, y;
int fuel;
char symbol;
};
struct sklad
{
int fuel;
char symbol;
};
enum cardinal_dirs { north = 72, west = 75, east = 77, south = 80 };
int map_exit(tank&);
char massive(tank&, tank&);
int maping(int&, int&, char&);
int move(tank&, cardinal_dirs&, sklad&);
void input(tank&, sklad&);
void ai(tank&, sklad&);
2014-11-14 14:43:34
Tooril
весь текст заголовочного файла нужно заключить в директивы
#ifndef GAME_H
#define GAME_H
// СЮДА ТЕКСТ
#endif
2014-11-14 14:47:22
Tooril
вместо _getch(); можешь использовать system("pause");
2014-11-14 15:28:10
Tooril
пропустил саму ошибку )))
в заголовочном файле у тебя идет объявление и определение переменных и констант.
В хедере можно оставить константы, а от остальных лучше избавиться или дописать описатель клаcса памяти static:
static int ex;
static int e=0;
static char map[s][c];
static int moved=0;
2014-11-14 19:15:29
MaxStrikerMax
Tooril, спасибо, добрый человек, внес твои поправки, теперь компилируется нормально. Но появилась новая проблема: теперь программа выводит на экран только массив(только пробелами), Количество вашего топлива, Количество топлива, Количество топлива на складе,
и не работает реакция на esc. Может кто-то знает в чем проблема?
2014-11-18 17:00:38
Tooril
MaxStrikerMax, как успехи?
2014-11-18 20:31:49
MaxStrikerMax
Tooril, никак не могу найти свою ошибку, поможешь? Если нужно могу прислать код с твоими поправками.
2014-11-18 23:09:00
Tooril
Давай, помогу чем смогу
2014-11-21 16:04:21
MaxStrikerMax
Первый файл(cpp)
#include "Game.h"
void main()
{
setlocale(LC_CTYPE,"Russian");
tank t34 = {1,1,100,'T'};
tank pz4 = {13,23,100,'T'};
sklad cd = {500,'C'};
massive(t34, pz4);
int m=0;
int ms=0;
maping(m, ms, cd.symbol);
m=m+14;
ms=ms+24;
maping(m, ms, cd.symbol);
while(1)
{
system("cls");
for(int i=0; i<s; i++)
{
for(int j=0; j<c; j++)
{
cout << map[i][j];
}
cout << "\n";
}
cout << "\n";
cout << "Количество вашего топлива: "<< t34.fuel << "\n";
cout << "Количество топлива противника: "<< pz4.fuel << "\n";
cout << "Количество топлива на складе: "<<cd.fuel<<"\n";
input(t34, cd);
if (e==1)
{
system("cls");
cout << "Вы проиграли!\n";
cout << "Конец игры\n";
_getch();
break;
}
if (e==2)
{
system("cls");
cout << "Конец игры\n";
_getch();
break;
}
ai(pz4,cd);
if (pz4.fuel==0)
{
system("cls");
cout << "Вы выиграли!\n";
cout << "Конец игры\n";
_getch();
break;
}
}
exit (0);
}
2014-11-21 16:05:04
MaxStrikerMax
Второй файл(cpp)
#include "Game.h"
int map_exit(tank& t)
{
if (t.x==14||t.y==24)
return -1;
else if(t.x==0||t.y==0)
return 1;
else
{
t.fuel--;
return 0;
}
}
char massive(tank& t, tank& p)
{
for (int i = 0; i< s; i++)
{
for (int j = 0; j< c; j++)
{
map[i][j] = ' ';
}
}
map [t.x][t.y]=t.symbol;
map [p.x][p.y]=p.symbol;
return map[s][c];
}
int maping(int& m, int& ms, char& c1)
{
int i=m;
for (int j=1;j<c-1;j++)
{
map[i][j]='-';
}
int j=ms;
for (i=1;i<s-1;i++)
{
map[i][j]='|';
}
map[0][0]='#';
map[14][0]='#';
map[0][24]='#';
map[14][24]='#';
map[10][15]=c1;
return m, ms;
}
int move(tank& t, cardinal_dirs& ch, sklad& c1)
{
int fuel;
switch(ch)
{
case west:
map[t.x][t.y] = ' ';
t.y--;
if(map[t.x][t.y]=='T')
{
t.y++;
t.fuel++;
}
ex=map_exit(t);
t.y=t.y+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case east:
map[t.x][t.y] = ' ';
t.y++;
if(map[t.x][t.y]=='T')
{
t.y--;
t.fuel++;
}
ex=map_exit(t);
t.y=t.y+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case south:
map[t.x][t.y] = ' ';
t.x++;
if(map[t.x][t.y]=='T')
{
t.x--;
t.fuel++;
}
ex=map_exit(t);
t.x=t.x+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
case north:
map[t.x][t.y] = ' ';
t.x--;
if(map[t.x][t.y]=='T')
{
t.x++;
t.fuel++;
}
ex=map_exit(t);
t.x=t.x+ex;
map[t.x][t.y] = t.symbol;
map[10][15]=c1.symbol;
break;
}
if (map[t.x][t.y]==map[10][15])
{
if(c1.fuel!=0)
{
fuel=100-t.fuel;
if(c1.fuel<fuel)
fuel-=c1.fuel;
c1.fuel-=fuel;
t.fuel+=fuel;
}
map[10][15]=c1.symbol;
}
return e;
}
int input(tank& t, sklad& cd)
{
char act;
cardinal_dirs ch;
act=_getch();
ch=static_cast<cardinal_dirs>(act);
if (ch==west||ch==east||ch==south||ch==north)
move(t, ch, cd);
else if (ch==-32)
input(t, cd);
if(t.fuel==0)
e=1;
else if(ch==27)
e=2;
return e;
}
void ai(tank& pz4, sklad& s1)
{
cardinal_dirs dir;
int rnd;
rnd=rand()%4;
switch(rnd)
{
case 0:
dir = north;
break;
case 1:
dir = east;
break;
case 2:
dir = south;
break;
case 3:
dir = west;
break;
}
if(pz4.fuel!=0)
move(pz4,dir,s1);
}
2014-11-21 16:05:44
MaxStrikerMax
Заголовочный файл(h)
#ifndef GAME_H
#define GAME_H
#include <iostream>
#include <clocale>
#include <conio.h>
#include <stdlib.h>
using namespace std;
const int s=15;
const int c=25;
static int ex;
static int e=0;
static char map[s][c];
struct tank
{
int x, y;
int fuel;
char symbol;
};
struct sklad
{
int fuel;
char symbol;
};
enum cardinal_dirs { north = 72, west = 75, east = 77, south = 80 };
int map_exit(tank&);
char massive(tank&, tank&);
int maping(int&, int&, char&);
int move(tank&, cardinal_dirs&, sklad&);
int input(tank&, sklad&);
void ai(tank&, sklad&);
#endif
2014-11-30 12:28:41
Tooril
Мой косяк (, каюсь.
в каждом файле получается по своей статической "карте" ).
2014-11-30 12:29:37
Tooril
Заголовочный файл(h)
#ifndef GAME_H
#define GAME_H
#include <iostream>
#include <clocale>
#include <conio.h>
#include <stdlib.h>
using namespace std;
const int s = 15;
const int c = 25;
static int ex;
static int e = 0;
extern char map[s][c];
struct tank
{
int x, y;
int fuel;
char symbol;
};
struct sklad
{
int fuel;
char symbol;
};
enum cardinal_dirs { north = 72, west = 75, east = 77, south = 80 };
int map_exit(tank&);
char massive(tank&, tank&);
int maping(int&, int&, char&);
int move(tank&, cardinal_dirs&, sklad&);
int input(tank&, sklad&);
void ai(tank&, sklad&);
#endif
2014-11-30 12:30:45
Tooril
Второй файл(cpp)
#include "Game.h"
extern char map[s][c];
int map_exit(tank& t)
{
if (t.x == 14 || t.y == 24)
return -1;
else if (t.x == 0 || t.y == 0)
return 1;
else
{
t.fuel--;
return 0;
}
}
char massive(tank& t, tank& p)
{
for (int i = 0; i< s; i++)
{
for (int j = 0; j< c; j++)
{
map[i][j] = ' ';
}
}
map[t.x][t.y] = t.symbol;
map[p.x][p.y] = p.symbol;
return map[s][c];
}
int maping(int& m, int& ms, char& c1)
{
int i = m;
for (int j = 1; j<c - 1; j++)
{
map[i][j] = '-';
}
int j = ms;
for (i = 1; i<s - 1; i++)
{
map[i][j] = '|';
}
map[0][0] = '#';
map[14][0] = '#';
map[0][24] = '#';
map[14][24] = '#';
map[10][15] = c1;
return m, ms;
}
int move(tank& t, cardinal_dirs& ch, sklad& c1)
{
int fuel;
switch (ch)
{
case west:
map[t.x][t.y] = ' ';
t.y--;
if (map[t.x][t.y] == 'T')
{
t.y++;
t.fuel++;
}
ex = map_exit(t);
t.y = t.y + ex;
map[t.x][t.y] = t.symbol;
map[10][15] = c1.symbol;
break;
case east:
map[t.x][t.y] = ' ';
t.y++;
if (map[t.x][t.y] == 'T')
{
t.y--;
t.fuel++;
}
ex = map_exit(t);
t.y = t.y + ex;
map[t.x][t.y] = t.symbol;
map[10][15] = c1.symbol;
break;
case south:
map[t.x][t.y] = ' ';
t.x++;
if (map[t.x][t.y] == 'T')
{
t.x--;
t.fuel++;
}
ex = map_exit(t);
t.x = t.x + ex;
map[t.x][t.y] = t.symbol;
map[10][15] = c1.symbol;
break;
case north:
map[t.x][t.y] = ' ';
t.x--;
if (map[t.x][t.y] == 'T')
{
t.x++;
t.fuel++;
}
ex = map_exit(t);
t.x = t.x + ex;
map[t.x][t.y] = t.symbol;
map[10][15] = c1.symbol;
break;
}
if (map[t.x][t.y] == map[10][15])
{
if (c1.fuel != 0)
{
fuel = 100 - t.fuel;
if (c1.fuel<fuel)
fuel -= c1.fuel;
c1.fuel -= fuel;
t.fuel += fuel;
}
map[10][15] = c1.symbol;
}
return e;
}
int input(tank& t, sklad& cd)
{
char act;
cardinal_dirs ch;
act = _getch();
ch = static_cast<cardinal_dirs>(act);
if (ch == west || ch == east || ch == south || ch == north)
move(t, ch, cd);
else if (ch == -32)
input(t, cd);
if (t.fuel == 0)
e = 1;
else if (ch == 27)
e = 2;
return e;
}
void ai(tank& pz4, sklad& s1)
{
cardinal_dirs dir;
int rnd;
rnd = rand() % 4;
switch (rnd)
{
case 0:
dir = north;
break;
case 1:
dir = east;
break;
case 2:
dir = south;
break;
case 3:
dir = west;
break;
}
if (pz4.fuel != 0)
move(pz4, dir, s1);
}
2014-11-30 12:31:32
Tooril
Первый файл(cpp)
#include "Game.h"
char map[s][c];
void main()
{
setlocale(LC_CTYPE, "Russian");
tank t34 = { 1, 1, 100, 'T' };
tank pz4 = { 13, 23, 100, 'T' };
sklad cd = { 500, 'C' };
massive(t34, pz4);
int m = 0;
int ms = 0;
maping(m, ms, cd.symbol);
m = m + 14;
ms = ms + 24;
maping(m, ms, cd.symbol);
while (1)
{
system("cls");
for (int i = 0; i<s; i++)
{
for (int j = 0; j<c; j++)
{
cout << map[i][j];
}
cout << "\n";
}
cout << "\n";
cout << "Количество вашего топлива: " << t34.fuel << "\n";
cout << "Количество топлива противника: " << pz4.fuel << "\n";
cout << "Количество топлива на складе: " << cd.fuel << "\n";
input(t34, cd);
if (e == 1)
{
system("cls");
cout << "Вы проиграли!\n";
cout << "Конец игры\n";
_getch();
break;
}
if (e == 2)
{
system("cls");
cout << "Конец игры\n";
_getch();
break;
}
ai(pz4, cd);
if (pz4.fuel == 0)
{
system("cls");
cout << "Вы выиграли!\n";
cout << "Конец игры\n";
_getch();
break;
}
}
exit(0);
}
2014-11-30 12:39:03
Tooril
MaxStrikerMax, есть к тебе пару вопросов:
1. что возвращается здесь return map[s][c]; ????
2. и здесь return m, ms; ????
второе еще "законно", а вот первое, пару лет условно светит. Хорошо, что просто значение возвращаешь.
2014-11-30 14:40:10
Tooril
еще интересно откуда взялась эта конструкция:
void main()
{
//......
exit(0);
}
Я согласен, что она рабочая, но зачем мучить компилятор? есть стандарт:
int main(int argc, _TCHAR* argv[])
{
//...
return 0;
}
Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом считается имя программы.А параметр argv является указателем на массив указателей на строки. Это нужно для запуска программы с параметрами(ключами).
Минимальная конструкция для С выглядит так:
main()
{
//...
}
т.к. компилятор С сам подставит int перед main и return 0;. А вот в С++ никто неявно int подставлять не будет, но return 0; подставит.
Минимальная конструкция для С++ выглядит так:
int main()
{
//...
}
2014-11-30 16:15:49
MaxStrikerMax
Tooril, на счет return map[s][c], я опечатался, по плану должно быть просто return 0; заметил это недавно.
На счет return m, ms, лично я ничего в этом плохого не вижуо. Оъяснишь, что ты здесь видишь?
На счет exit(0), мне так привычней, я начинал с программирования самодельных роботов на базе Arduino, и exit(0) я использовал как его выключение.
2014-11-30 16:41:55
Tooril
на счет return m, ms: здесь оператор запятая. сначала вычисляется левое выражение, его результат отбрасывается, затем правое, оно здесь возвращается.
Для Windows необходимо вернуть int из приложения по окончанию работы, либо ты делаешь это сам, либо компилятор допишет это за тебя. exit(0) как раз делает завершение приложения и возвращает ОС ноль. Для микроконтроллеров в этом нет необходимости, т.к. там возвращать некуда, вот и пишут void main(void), если конечно там не используется ОС реального времени.
По поводу многофайловых программ, рассматривай их как отдельные файлы, которые потом соединят вместе. И если есть одинаковые объявления, это все равно, что два раза объявить одно и то же.
2014-12-05 14:00:35
MaxStrikerMax
Спасибо, добрый человек.