Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30

Ошибка компиляции, класс, файлы.

03.07.2011, 20:21. Показов 1422. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте участники форума, недавно занялся программированием по книге Дирка Хенкеманса "Программирование игр на С++"

Компиляция при распределении классов по файлам, возвращает ошибки. Долгие поиски вынудили обратиться к мастерам за помощью

Файл: 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
#include <iostream>
#include <cstring>
#include "bow.h"
 
using namespace std;
 
class ArcheryCompetition
{
      private:
              int rounds;
              float redScore;
              Bow red;
              float blueScore;
              Bow blue;
              
      public:
             
             ArcheryCompetition(int lrounds);
             ~ArcheryCompetition();
             
             int complete(void);
             
};
      ArcheryCompetition::ArcheryCompetition(int lrounds):
            rounds(lrounds),red(Bow("красный")),blue(Bow("синий")),redScore(0),blueScore(0)
      {
      }
      ArcheryCompetition::~ArcheryCompetition()
      {
      }
      int ArcheryCompetition::complete()
      {
          for(int i = 0; i < rounds; i++)
      {
          cout<<"Тур номер: " <<i+1<< "." << endl;
          red.draw();
          blue.draw();
          
          redScore = (red.fire() + redScore * i)/(i + 1);
          blueScore = (blue.fire() + blueScore * i)/(i + 1);
      }
      
if(redScore == blueScore)
cout<< "Ничья! \n";
else if (redScore < blueScore)
cout<<" Синий лук получает руку принцессы! \n";
else
cout<<" Красный лук получает руку принцессы! \n";
return 1;
}
 
void main(void) // как я понимаю, лучше заменить на int main(void)
{
 ArcheryCompetition plymouthSquare(2);
 plymouthSquare.complete();
 int get = 0;
 cin>>get;
// соответственно return 0;
 }
Файл: bow.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Bow
{
      string color;
      bool drawn;
      int numOfArrows;
public:
       Bow(string aColor);
       ~Bow();
       
       void draw();
       int fire();
};
Файл: bow.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
Bow::Bow(string aColor)
{
                numOfArrows = 10;
                drawn = false;
                color = aColor;
                srand((unsigned)time(0));
}
 
Bow::~Bow()
{
}
 
void Bow::draw()
{
     drawn = true;
     cout <<color<< " лук: тетива натянута. " << endl;
}
 
int Bow::fire()
{
               if(!drawn)
               {
                         cout<< color << " лук: тетива не натянута, "
                         << "невозможно произвести выстрел." << endl;
                         return 0;
                         
                         }
                         int score;
                         score = rand() % (10 - 0 + 1) + 0;
                         if(score == 0)
                         cout << color << " лук: промах!" << endl;
                         else
                         cout << color << " лук: выбил " << score 
                         << "очков!" << endl;
                         return score;
                         }
Использую Portable Dev-C++ 4.9.9.2 (мне критичен IDE без инсталляции)
Загружаю все три файла, адрес к файлам - латинский.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2011, 20:21
Ответы с готовыми решениями:

Перегрузил операцию преобразования типов данных (класс -> класс) но выскакивает ошибка компиляции
Здравствуйте, учил перегрузку операции преобразования типов данных, пробую объект SecondClass преобразовать в объект BasicClass. ...

Типизированные файлы. Ошибка компиляции
Здравствуйте! Столкнулся с ошибкой компиляции (скриншот). Как решить эту ошибку? Вот задание: Написать программу, содержащую сведения о...

Ошибка компиляции - "класс" : базовый класс не определен
Помогите пожалуйста, у меня в проекте есть несколько классов, которые имеют отдельные header и implementations, когда я их всех...

7
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
03.07.2011, 20:27
И на что ругается ??
0
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
03.07.2011, 20:37  [ТС]
Сначала компилятор обрабатывает файл main.cpp (при этом если допустить ошибку в других файлах, он также это заметит, т.е. они обрабатываются одновременно?)
Далее, он начинает обрабатывать остальные файлы (судя по всему повторно, но может быть так и необходимо?) и выдает что все переменные/классы undeclared т.е. не обьявлены.

Возможно я что-то напутал с процессом компиляции, но сколько не пытался лазать по настройкам, ничего что можно покрутить не нашел.

Еще слева заметил три окошка, Project, Classes, Debug. Все файлы у меня располагались в первом окне, но что-то подсказывает мне что место файлом с классами во втором. Никаким образом перекинуть туда у меня не вышло.
0
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
03.07.2011, 21:10
А что в файлах Файл: bow.h и Файл: bow.cpp нету никаких #include ?
Если bow.h ссылается на string, то ему надо #include <string> прописать. A для bow.cpp #include "bow.h", он ссылается на класс Bow и ему нужно знать объявление класса.
А .cpp файлы должны подключаться, как файлы "исходного кода".

Цитата Сообщение от Grigarosh Посмотреть сообщение
при этом если допустить ошибку в других файлах, он также это заметит, т.е. они обрабатываются одновременно?
Компилятор будет обрабатывать все файлы, которые задействованы в проекте, чтобы сообщить обо всех ошибках.

PS. Dev-C++ не знаю =)
1
Заблокирован
03.07.2011, 21:26
ну во-первых, выводите сообщение об ошибке, которое вам привёл КОМПИЛЯТОР.

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

А во-вторых в файле bow.cpp самоей первой строчкой напишите: #include "bow.h"

в хедере bow.h должно быть все необходимое для работы класса

Добавлено через 15 минут
Хотя для новичка книга Дирка Хенкеманса,Марка Ли - потрясающая вещь. Скилл прокачивает бесподобно.

Но в своей книге принципы создания много-файлового проекта Дирк практически опустил.
Та скудная инфа, что дана на 132 странице - весьма скунда и КОМПИЛЯТОРО-ЗАВИСИМАЯ.
В частности, он пишет, что нет нужды цеплять к проекту хедер и одноименный спп, а достаточно только один хедер. А спп подключится автоматически. Ну так вот, может это и справедливо для CodeWarrior, в котором писал Дирк, но вот в той же 2008 студии так делать нельзя.

Поэтому, мой вам совет: как распределять код по файлам лучше узнайте из других источников.

И второй совет: почти в самом конце книги Дирк знакомит читателя с directX на примере работы с DirectDraw.

Я настоятельно рекомендую на этом закончить изучение этой книги. Потому что:

1. Дирк очень-очень поверхностно знакомит читателя с работой директдрав7.
Если так интересно как делать видео-игры на примере директдрав - читайте Ламота.
Пострясающее полезная для любого новичка книга. И тоже на примере DirectDraw7

2. DirectDraw7 уже давно не поддерживается. Этот диназавр считается .... устаревшей
технологией. Конечно вреда не будит, если вы потратите время на Ламота. Пользы будит
много, но.... если вы ориентированы на геймдеф, то есть резон посмотреть в сторону более
новых ГАПИ, тот же directX9 и старше, или OpenGL
1
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
04.07.2011, 00:19  [ТС]
Цитата Сообщение от An1ka Посмотреть сообщение
А что в файлах Файл: bow.h и Файл: bow.cpp нету никаких #include ?
Если bow.h ссылается на string, то ему надо #include <string> прописать. A для bow.cpp #include "bow.h", он ссылается на класс Bow и ему нужно знать объявление класса.
А .cpp файлы должны подключаться, как файлы "исходного кода".
Сделал все точь-в-точь как вы написали и вуаля, все заработало. Благодарю

Поэтому, мой вам совет: как распределять код по файлам лучше узнайте из других источников. И второй совет: почти в самом конце книги Дирк знакомит читателя с directX на примере работы с DirectDraw. Я настоятельно рекомендую на этом закончить изучение этой книги.
Гигантское вам спасибо за ценные советы. Ламот в двух томах уже давно закуплен и лежит на полке, ожидая окончания изучения Хенкеманса и Ли. Я думаю поступлю в точности как вы мне рекомендуете, т.е. окончу Дирка на предпоследней главе. Если вас не затруднит, не посоветуете литературы по DirectX9, основываясь на познанного в дальнейшем А. Ламота?
0
Заблокирован
04.07.2011, 11:53
На мой взгляд ценность книги Ламота "программирование игр для Windows. Советы профессионала" не столько в том, что он рассказывает, как пользоваться DirectDraw, сколько в том, что он преподносит и очень тщательно расжовывает для новичка многие базовые принципы архитектуры видео-игры, попутно цепляя необходимые, но казалось бы перпендикулярные темы: взаимодействие с ОСью, ресурсы, как кодируется формат цвета, простейшие примеры оптимизации алгоритмов, и тп.

Поэтому, после его книги перепрыгнуть на какой нибудь DirectX9 или OpenGL - проблемы не будит. А вот знания, в плане создания костяка программы для видео-игры могут здорова пригодится.

Насчёт книг по OpenGL ничего сказать не могу, сам я пытался читать множество книг, но все они какие то непедагогичные оказались. В результате стартовал по урокам Nehe. И уже только потом, немножко под разобравшись и освоившись, начал понимать разные книги. Опять таки, я слишком мало знаю об этой области, что-бы что-то утверждать.

Насчёт DirectX хвалят многих авторов. Лично мне очень понравилась книга Горнакова С.Г. "DirectX 9. Уроки программирования на C++"

Понравилась именно из-за того, что он очень педагогично и доходчиво объясняет новичку материал. Не вываливает на голову сразу кучу, а излагает материал последовательно. И больше всего мне у него понравилось - у него любая теоретическая выкладка тут же подкрепляется практическим примером. То есть сразу понятно, как это работает.

/ps как самоучка, я заметил, что лучше всего в первый момент времени усваиваются книги по типу Хенкеманса - материал довольно поверхностный, но зато просто усваивается.
И только потом, уже подковавшись чуток, нужно переходить на книги других авторов, которые пишут тоже самое, но капают намного глубже. Так получается углубленное обучение.

/pss Даже самый простенький графический движок на с++ потребует от вас многих знаний о языковых конструкциях с++, о которых Хенкеманс ничего не сообщал (дабы не сбивать новичка с толку). Поэтому, параллельно Ламоту, рекомендую вам найти какой нибудь материал по более углубленному изучению самого языка с++.
2
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
09.07.2011, 20:30  [ТС]
Снова возникли проблемы, теперь уже в следующей задаче, той же книги (Дирк Хенкеманс, Марк Ли "Программирование игр на C++"

Неоднократно перепроверенный код:

DragonLord.cpp \\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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
#include "BlueDragon.cpp"
#include "RedDragon.cpp"
#include "BlackDragon.cpp"
 
using namespace std;
 
int menuChoice();
 
int main (void)
{
    srand(time(0));
    Dragon* dragons[3];
    int hp = 15;
    int armour = 2;
    int tempArmour;
    int tempAttack;
    dragons[0] = new RedDragon(rand()%4+1);
    dragons[1] = new BlackDragon(rand()%4+1);
    dragons[2] = new BlueDragon(rand()%4+1);
    Dragon* d = dragons[rand()%3];
    cout << "Добро пожаловать, благородный рыцарь.\n"
    << "Ты должен спасти принцессу."
    << "Ее похитил "
    << d->getName() << ".\n"
    << "Ты должен победить дракона.\n";
    cout << "Твоя сила: " << hp << endl;
    while (d->isAlive() && hp>0)
    {
          int choice = menuChoice();
          if (choice == 3) goto RUN;
          else if (choice == 1)
          {
               tempAttack = rand()%16+5;
               tempArmour = armour;
          }
          else 
          {
                  tempAttack = rand()%11;
                  tempArmour = armour + 4;
                  }
                  hp -= d->attack(armour);
                  d->defend(rand()%16-5);
                  cout << "\nТы наносишь мощный удар и ущерб "
                  << tempAttack << " damage.\n";
                  cout << "Твоя сила: " << hp;
                  }
                  if (d->isAlive())
                  cout << "\nТы побежден "
                  << " могущественным драконом.\n";
                  else
                  cout <<"\n\nТы убил дракона!"
                  << " Поздравляем.\n"
                  << "Принцесса спасена.\n";
                return 0;
                RUN:
                    cout <<"\nТы струсил и убежал.\n";
                    return 0;
                }
                
                int menuChoice()
                {
                    int choice;
                    do {
                        cout << endl
                        << "[1]Атаковать\n"
                        << "[1]Оборонятся\n"
                        << "[3]Бежать\n";
                    cin >> choice;
                    } while(choice < 1 && choice >3);
                    return choice;
                    }
Dragon.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
#include <cstdlib>
#include <string>
#include <ctime>
 
#define MAX(a,b) a>b? a:b
 
using namespace std;
 
class Dragon
{
private:
        int speed;
        string name;
        int hitPoints;
        int armour;
        int treasure;
        int clawDamage;
        int size;
protected:
          Dragon(int theSize);
          int getArmour() {return armour;}
          int& getHitPoints() {return hitPoints;}
          int getClawDamage() {return clawDamage;}
          int getSize() {return size;}
          virtual int attack(int targetArmour, int specialDamage);
public:
          virtual int attack(int targetArmour) = 0;
          virtual void defend(int damage) = 0;
          int getTreasure() {return treasure;}
          virtual string getName() {return name;}
          int getSpeed() {return speed;}
          bool isAlive() {return hitPoints >0;}
};
Dragon::Dragon(int theSize):size(theSize)
{
if (size < 1 || size > 4)
size = 3;
clawDamage = 2 * size;
speed = 3 * size;
hitPoints = 4 * size;
armour - size;
treasure = 1000 * size;
srand(time(0));
}
 
int Dragon::attack(int targetArmour, int specialDamage)
{
    int useSpecial = rand() % 2;
    int damage;
    if (useSpecial)
       damage = specialDamage;
       else damage - getClawDamage();
       return MAX(damage - targetArmour,0);
}
RedDragon.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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class RedDragon : public Dragon
{
private:
int fireDamage;
public:
       RedDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Красный дракон";}
};
 
RedDragon::RedDragon(int theSize)  : Dragon(theSize)
{
fireDamage = 4*getSize();
}
 
int RedDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, fireDamage);
}
 
void RedDragon::defend(int damage)
{
     getHitPoints() -= (damage - getArmour())/3;
}
BlueDragon.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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class BlueDragon : public Dragon
{
private:
int iceDamage;
public:
       BlueDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Синий дракон";}
};
 
BlueDragon::BlueDragon(int theSize):
                         Dragon(theSize)
{
iceDamage = 3*getSize();
}
 
int BlueDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, iceDamage);
}
 
void BlueDragon::defend(int damage)
{
     getHitPoints() -= (damage - getArmour())/2;
}
BlackDragon.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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class BlackDragon : public Dragon
{
private:
int poisonDamage;
public:
       BlackDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Черный дракон";}
};
 
BlackDragon::BlackDragon(int theSize):
                         Dragon(theSize)
{
poisonDamage = getSize();
}
 
int BlackDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, poisonDamage);
}
 
void BlackDragon::defend(int damage)
{
     getHitPoints() -= damage - getArmour();
}

Вывод компилятора:
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
Compiler: Default compiler
Building Makefile: "D:\Dragon\Makefile.win"
Executing  make...
make.exe -f "D:\Dragon\Makefile.win" all
g++.exe -c Dragon.cpp -o Dragon.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   
 
g++.exe -c DragonLord.cpp -o DragonLord.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   
 
In file included from BlueDragon.cpp:5,
                 from DragonLord.cpp:6:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
 
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
 
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
 
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
In file included from RedDragon.cpp:5,
                 from DragonLord.cpp:7:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
In file included from BlackDragon.cpp:5,
                 from DragonLord.cpp:8:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
 
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
 
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
 
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
make.exe: *** [DragonLord.o] Error 1
 
Execution terminated

Безмерно интересно узнать, какую деталь я упустил. Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2011, 20:30
Помогаю со студенческими работами здесь

Класс для подсчета площади геометрических фигур ошибка при компиляции
Здравствуйте. При компиляции выводит ошибку: &quot;CL.exe&quot; завершилась с кодом 2. Конкретно номер строки в коде не показывает, где ошибка. ...

Ошибка при компиляции. Как правильно создавать класс с объектами от другого класса?
Есть класс Car. У него есть двигатель(class Engine) и переменная скорость(speed), которая зависит от мощности(power). power- переменная...

Ошибка при компиляции: Отсутствуют файлы в папке Debug
Я недавно начал изучать С++ и для этого скачал Mc visual studio 2017. На скриншотах показана ошибка, из-за которой я не могу скомпилировать...

Фасадный класс. Все файлы подключены, но возникает ошибка
Все заголовочный файлы подключены, т.е. фасадный видит базовый и производные классы, но вот такая ошибка...что это?

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru