Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Вальдемар
-5 / 0 / 0
Регистрация: 29.07.2012
Сообщений: 61
#1

Много файлов, а толку - "0" - C++

05.02.2013, 18:34. Просмотров 970. Ответов 27
Метки нет (Все метки)

Вот разбил код на файлы и теперь непойму где сныкался - error.

sfunc.h
C++
1
2
3
4
5
6
7
8
#ifndef FUNCTION_SNAKE_H
#define FUNCTION_SNAKE_H
 
void initMap(); // ГЁГ*èöèГ*ëèçГ*öèÿ ГЄГ*ðòû
void showMap(); // ГґГіГ*êöèÿ ðèñóåò ГЄГ*ðòó
void control(const char key, snake &s); // ГіГЇГ°Г*âëåГ*ГЁГҐ çìåéêîé
 
#endif // FUNCTION_SNAKE_H
snake.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef SNAKE_H
#define SNAKE_H
 
const int L = 30; // äëèГ*Г*Г*
const int W = 20; // øèðèГ*Г*
char map[W][L];
 
class snake{
    private:
        int x, y;
        int length;
    public:
        snake(): x(0), y(0), length(0){}
        snake(int xN, int yN, int lN): x(xN), y(yN), length(lN){}
        
        void operator ++(); // îïåðГ*òîð ïðå-ГЁГ*êðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ââåðõ
        void operator ++(int); // îïåðГ*òîð ïîñ-ГЁГ*êðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ГўГЇГ°Г*ГўГ®
        void operator --(); // îïåðГ*òîð ïðå-äåêðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ГўГ*ГЁГ§
        void operator --(int); // îïåðГ*òîð ïîñ-äåêðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó âëåâî
};
 
#endif // SNAKE_H
snake.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "snake.h"
 
void snake::operator ++(){
    // îïåðГ*òîð ïðå-ГЁГ*êðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ââåðõ
    map[y][x] = ' ';
    // ïðîâåðêГ* âûõîäГ* Г§Г* ГЈГ°Г*Г*èöû Г¬Г*Г±Г±ГЁГўГ*
    (y == 0)? y = (W - 1): --y;
    map[y][x] = '^';
}
 
void snake::operator ++(int){
    // îïåðГ*òîð ïîñ-ГЁГ*êðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ГўГЇГ°Г*ГўГ®
    map[y][x] = ' ';
    // ïðîâåðêГ* âûõîäГ* Г§Г* ГЈГ°Г*Г*èöû Г¬Г*Г±Г±ГЁГўГ*
    (x == (L - 1))? x = 0: ++x;
    map[y][x] = '>';
}
 
void snake::operator --(){
    // îïåðГ*òîð ïðå-äåêðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó ГўГ*ГЁГ§
    map[y][x] = ' ';
    // ïðîâåðêГ* âûõîäГ* Г§Г* ГЈГ°Г*Г*èöû Г¬Г*Г±Г±ГЁГўГ*
    (y == (W - 1))? y = 0: ++y;
    map[y][x] = 'v';
}
 
void snake::operator --(int){
    // îïåðГ*òîð ïîñ-äåêðåìåГ*ГІГ* ïîñûëГ*ГҐГІ çìåéêó âëåâî
    map[y][x] = ' ';
    // ïðîâåðêГ* âûõîäГ* Г§Г* ГЈГ°Г*Г*èöû Г¬Г*Г±Г±ГЁГўГ*
    (x == 0)? x = (L - 1): --x;
    map[y][x] = '<';
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <conio.h>
#include <ctime>
#include <windows.h>
#include <cstdlib>
 
#include "snake.h"
#include "sfunc.h"
 
int main(int argc, char *argv[]){
    
    initMap();
    
    const int i = 200;
    char move = 'd';
    
    snake s;
    while(1){
        showMap();
        Sleep(i);
        
        if(kbhit()){
            move = getch();
        }
        control(move, s);
        
        system("cls");
    }
    
    getch();
    return EXIT_SUCCESS;
}
 
void initMap(){
    // ГЁГ*èöèГ*ëèçГ*öèÿ ГЄГ*ðòû
    for(int i=0; i<W; i++){
        for(int j=0; j<L; j++){
            map[i][j] = '.';
        }
    }
}
 
void showMap(){
    // ГґГіГ*êöèÿ ðèñóåò ГЄГ*ðòó
    for(int i=0; i<W; i++){
        for(int j=0; j<L; j++){
            std::cout << map[i][j];
        }
        std::cout << std::endl;
    }
}
 
void control(const char key, snake &s){
    // ГіГЇГ°Г*âëåГ*ГЁГҐ çìåéêîé
    switch(key){
        case 'w': ++s; break; // ïðå-ГЁГ*êðåìåГ*ГІ ïîñûëГ*ГҐГІ çìåéêó ââåðõ
        case 'a': s--; break; // ïîñ-äåêðåìåГ*ГІ ïîñûëГ*ГҐГІ çìåéêó âëåâî
        case 's': --s; break; // ïðå-äåêðåìåГ*ГІ ïîñûëГ*ГҐГІ çìåéêó ГўГ*ГЁГ§
        case 'd': s++; break; // ïîñ-ГЁГ*êðåìåГ*ГІ ïîñûëГ*ГҐГІ çìåéêó ГўГЇГ°Г*ГўГ®
        default: break;
    }
}
Есть предположение что дело в объевлении и опредилении массива...
Но могу ошибаться!

Добавлено через 3 часа 22 минуты
Уважаемые, помогите, листинги не собираются!
Одним файлом *.срр все работает нештяк, а так неполучается.
Так в чем же проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2013, 18:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Много файлов, а толку - "0" (C++):

"Слишком много включаемых файлов" - C++
Как исправить ошибку??? слишком много включаемых файлов: глубина = 1024

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Вывести решения уравнения, если их число конечно, "NO", если решений нет, и "INF", если их бесконечно много - C++
Задача с условным оператором. Решить в целых числах уравнение ax + b = 0. Входные данные Вводятся 2 целых числа: a и b. ...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

27
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
05.02.2013, 21:11 #16
Цитата Сообщение от Van111 Посмотреть сообщение
#ifndef unit1_h
//.....
#endif
и что тебе даст эта конструкция??
макрос то не определяется
и твой сторожевик не сработает
вот так делают
C++
1
2
3
4
#ifndef unit1_h
#define unit1_h
//.....
#endif
если макрос не определен заходим внутрь что то делаем и определяем макрос
если еще одно включение то макрос уже определен обходим
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
05.02.2013, 21:23 #17
Мне интересно, я один заметил кривые include стражи у автора???
Короче, даю подсказку. Содержимое файла "sfunc.h" даже не подключается в main.cpp и соответственно все функций из sfunc не имеют прототипов.
Почему? потому что не срабатывает условие #ifndef в нём.
А теперь угадай почему.
Вот и интересно, кто-нибудь за 2 страницы обсуждения это заметил? Ну-же, не хочу портить загадку прямым ответом.
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
05.02.2013, 21:43 #18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я один заметил кривые include стражи у автора???
а в чем кривизна?

Цитата Сообщение от Вальдемар Посмотреть сообщение
C++
1
2
3
4
5
6
#ifndef FUNCTION_SNAKE_H
#define FUNCTION_SNAKE_H
void initMap(); // инициализация карты
void showMap(); // функция рисует карту
void control(const char key, snake &s); // управление змейкой
#endif // FUNCTION_SNAKE_H
#ifndef FUNCTION_SNAKE_H проверяем определен ли макрос если да то выходим(обходим блок)
если нет идем сюда
#define FUNCTION_SNAKE_H определяем макрос
чтото делаем
#endif конец блока
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
05.02.2013, 21:57 #19
Цитата Сообщение от ValeryS Посмотреть сообщение
а в чем кривизна?
Ох, либо показалось, либо автор уже исправил.
Я думал, что имена макросов в обоих хедерах одинаковые.(#define SNAKE_H)
Это привело бы к ошибке.
Мда. а я ещё удивился, что заметил это, хотя обычно невнимателен к таким вещам. И вот те на.

Добавлено через 6 минут
ну тогда я вижу всё равно ошибку.
Никогда не объявляйте глобальные переменные в хедерах.
Также как и с функциями, переменные должны находиться в cpp файлах, причём одна переменная должна объявляться только в одном из файлов
А в h файлах они должны быть помечены как extern, т.к. один h файл может подключаться в несколько срр до их компиляции, а затем при линковке программы обнаружится, что переменная объявлена несколько раз!

ах да, всю тему не читал, оказывается уже заметили
0
Вальдемар
-5 / 0 / 0
Регистрация: 29.07.2012
Сообщений: 61
06.02.2013, 01:08  [ТС] #20
Я заметил еще одну странность:

global.h
C++
1
2
3
4
5
6
7
#ifndef GLOBAL_H
#define GLOBAL_H
 
extern const int x;
extern int arr[x];
 
#endif
func.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef FUNC_H
#define FUNC_H
 
#include <cstdlib>
#include <iostream>
 
#include "global.h"
 
void display();
 
#endif
func.cpp
C++
1
2
3
4
5
6
7
8
#include "func.h"
 
void display(){
    for(int i=0; i<x; i++) arr[i] = i;
    
    for(int i=0; i<x; i++) std::cout << arr[i] << " ";
    std::cout << std::endl;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "func.h"
 
const int x = 5;
int arr[x];
 
int main(int argc, char *argv[]){
    
    display();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Эти хейдры и сипипишки тоже не собираются.
Ядумаю проблема в глобальном объевлении массива, так как с обычными глобальными переменнымми все работает на ура!

И КАК-ЖЕ БЫТЬ?
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 756
06.02.2013, 04:24 #21
там достаточно (в global.h)
C++
1
2
extern const int x;
extern int arr[];
ему там не надо писать лишнего x, т.к. выделения памяти нет, а размер созданного массива хранится в x
по сути указателя arr и числа x вам хватит с лихвой
1
Вальдемар
-5 / 0 / 0
Регистрация: 29.07.2012
Сообщений: 61
06.02.2013, 13:01  [ТС] #22
abit, а двумерный массив будет выгледеть так:

extern int *arr[];

Или я неправ?
Тогда как выгледит объевление без определения двумерного масива, а?
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
06.02.2013, 13:23 #23
ой-ой
0
Вальдемар
-5 / 0 / 0
Регистрация: 29.07.2012
Сообщений: 61
06.02.2013, 13:48  [ТС] #24
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ой-ой
И что это значит?
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 756
06.02.2013, 15:21 #25
Цитата Сообщение от Вальдемар Посмотреть сообщение
abit, а двумерный массив будет выгледеть так:

extern int *arr[];

Или я неправ?
Тогда как выгледит объевление без определения двумерного масива, а?
вообще

C++
1
extern int arr[][];
но с другой стороны без разницы... вам достаточно лишь указать что это указатель
int arr[] полностью аналогично int * arr
операции [] над указателями - синтаксический сахар и я вчера это подробнее отписывал вот в этой теме - Как из указателя на массив достать конкретное значение массива
0
Вальдемар
-5 / 0 / 0
Регистрация: 29.07.2012
Сообщений: 61
06.02.2013, 16:53  [ТС] #26
Да я пробавал такое объевление но, оно непрокатывает.
extern int arr[] - так все нештяк, а так extern int arr[][] - нет.

Добавлено через 5 минут
вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//main.cpp
#include "func.h"
 
const int x = 5;
const int y = 10;
int arr[x][y];
 
int main(int argc, char *argv[]){
    
    display();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
//func.h
#ifndef FUNC_H
#define FUNC_H
 
#include <cstdlib>
#include <iostream>
 
#include "global.h"
 
void display();
 
#endif
 
//func.cpp
#include "func.h"
 
void display(){
    for(int i=0; i<x; i++){
        for(int j=0; j<y; j++){
            arr[i][j] = j;
        }
    }
    
    for(int i=0; i<x; i++){
        for(int j=0; j<y; j++){
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }
}
 
//global.h
#ifndef GLOBAL_H
#define GLOBAL_H
 
extern const int x;
extern const int y;
extern int arr[][];
 
#endif
Выдает ошибку

Добавлено через 11 минут
Кстати можете сами попробывать скомпилировать код и убедится - программа несобирается!
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
06.02.2013, 17:21 #27
Вальдемар, вы можете сделать так? естественно всё надо по местам расскидать
C++
1
extern int **arr;
C++
1
int **arr;
C++
1
2
3
4
5
    arr = new int *[x];
    for (unsigned int i = 0; i < x ; i ++)
    {
        arr[i] = new int[y];
    }
Добавлено через 3 минуты
обращение обычное, как к двухмерному масиву
1
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.02.2013, 18:06 #28
Цитата Сообщение от Вальдемар Посмотреть сообщение
extern int arr[] - так все нештяк, а так extern int arr[][] - нет.
для объявления двумерного массива придется указать размер, хотя бы второй, например, так:
C++
1
2
3
extern int arr[20][30];
//или так:
extern int arr[][30];
будет работать.

Но тут получаются магические числа. Можно сделать так, в хедере:

C++
1
2
3
const int L = 30; // длина
const int W = 20; // ширина
extern char map[W][L];
А в cpp:
C++
1
char map[W][L];
В итоге правда получится две копии констант в main.cpp и snake.cpp, но конфликтовать они не будут.
1
06.02.2013, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2013, 18:06
Привет! Вот еще темы с ответами:

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание &quot;му&quot; на &quot;а&quot; , а букву &quot;ы&quot; на &quot;ца&quot;. очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...

Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" - C++
Само по себе понятие &quot;зарплата&quot; не особенно конкретное: оно включает и почасовую, и ставочную зарплату, и комиссионные, и процент с продаж....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru