Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Ошибка в простой С++ программе [РЕШЕНО]  (Прочитано 5692 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Программа очень простая (вычисление расстояния между двумя точками на плоскости):
#include <iostream>
#include <math.h>
using namespace std;

struct Point {
    // Представляет точку в системе координат.
    double x, y;
};

double distance (Point p1, Point p2) {
    // Вычисляет расстояние между двумя точками.
    return sqrt (pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2));
}

int main() {
    // Создаем две точки типа Point.
    Point blank1, blank2;
    blank1 = (Point){1.0, 2.0};
    blank2 = (Point){4.0, 6.0};

    // Ошибка в этой строке.
    cout << distance (blank1, blank2) << endl;
}
Сама функция distance компилируется без ошибок. Ошибка возникает только при попытке ее использовать. Что это может быть?
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 26 Марта 2011, 15:27:25 от Jack Sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Ошибка в простой С++ программе
« Ответ #1 : 26 Марта 2011, 15:01:57 »
Ошибка вылазит аж здесь stl_iterator_base_types.h

Пользователь решил продолжить мысль 26 Марта 2011, 15:07:05:
Я нашел ошибку.

Пользователь решил продолжить мысль 26 Марта 2011, 15:08:46:
Слово distance использовать нельзя!
« Последнее редактирование: 26 Марта 2011, 15:08:46 от ChaosWarrior »
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе
« Ответ #2 : 26 Марта 2011, 15:26:06 »
Ну надо же, получилось!
А почему, собственно, нельзя? Это что, ключевое слово?
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #3 : 26 Марта 2011, 15:28:21 »
Каким-то образом путает с:
template<class InputIterator>
  typename iterator_traits<InputIterator>::difference_type
    distance (InputIterator first, InputIterator last);

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #4 : 26 Марта 2011, 18:57:35 »
Мм.. нямка! Классика жанра!
А вам говорили что плохо писать using namespace std;
Теперь осознали?

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #5 : 26 Марта 2011, 19:47:16 »
Мм.. нямка! Классика жанра!
А вам говорили что плохо писать using namespace std;
Теперь осознали?
Нет, мне не говорили. В моей книжке было так:
#include <iostream.h>

void main() {
    cout << "Hello, world!" << endl;
}
Только это не работало у меня. Здесь на форуме нашел эту формулировку:
#include <iostream>
using namespace std;
Ну и void заменил на int и добавил return 0;
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #6 : 26 Марта 2011, 20:10:48 »
Вообще часто рекомендуют начинать с Липпман - Введение в C++, но я его пропустил.

Вот хорошие книжки, где ткнут носом во все скользкие места и расскажут "что такое хорошо, а что такое плохо"
Джефф Элджер - C++ Библиотека программиста
Скотт Мейерс - Эффективное использование STL
Скотт Мейерс - Эффективное использование C++
Скотт Мейерс - Наиболее эффективное использование C++
Герб Саттер - Решение сложных задач на С++
Андрей Александреску - Современное проектирование на C++
На закуску C++0x Standard draft (.pdf) =)

Не С++, но рекомендую чтобы понимать что к чему в этом мире
У. Стивенс - UNIX. Разработка сетевых приложений
У. Стивенс - UNIX. Взаимодействие процессов

И настоятельно рекомендую
А. Таненбаум - Операционные Системы. Разработка и реализация
« Последнее редактирование: 28 Марта 2011, 12:02:43 от Yurror »

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #7 : 27 Марта 2011, 12:03:17 »
Спасибо за списочек. Поищу на досуге (пока смог достать только Липпмана и Standart draft). Но вот тот же Липпман говорит о
#include <iostream>
using namespace std;

Попробовал написать другую функцию. Была та же ошибка. Теперь, видимо, из-за слова time (исправил на mytime и все заработало).
« Последнее редактирование: 27 Марта 2011, 12:20:06 от Jack Sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #8 : 27 Марта 2011, 12:19:20 »
Вот не надо гнать на Липпмана =)
Цитата: Липпман - Введение в C++ (раздел 1.2. Программа на языке C++) у меня это стр. 17
Непосредственно за директивой препроцессора
#include <iostream>
следует инструкция
using namespace std;
Эта инструкция называется директивой using. Имена, используемые в стандартной
библиотеке С++ (такие, как cout), объявлены в пространстве имен std и невидимы в
нашей программе до тех пор, пока мы явно не сделаем их видимыми, для чего и
применяется данная директива. (Подробнее о пространстве имен говорится в разделах 2.7
и 8.5.)

Цитата: Липпман - Введение в C++ (раздел 2.7, у меня это страница 65)
Как мы уже упоминали, все компоненты стандартной библиотеки С++ объявлены внутри
пространства имен std. Поэтому простого включения заголовочного файла недостаточно,
чтобы напрямую пользоваться стандартными функциями и классами:
#include <string>
// ошибка: string невидим
string current_chapter = "Обзор С++";
Необходимо использовать директиву using:
#include <string>
using namespace std;
// Ok: видим string
string current_chapter = "Обзор С++";
Заметим, однако, что таким образом мы возвращаемся к проблеме “засорения”
глобального пространства имен, ради решения которой и был создан механизм
именованных пространств. Поэтому лучше использовать либо квалифицированное имя:                              <<<<<< ВОТ ЗДЕСЬ!!!
#include <string>
// правильно: квалифицированное имя
std::string current_chapter = "Обзор С++";
либо селективную директиву using:
#include <string>
using namespace std::string;
// Ok: string видим
string current_chapter = "Обзор С++";
Мы рекомендуем пользоваться последним способом.
В большинстве примеров этой книги директивы пространств имен были опущены. Это
сделано ради сокращения размера кода, а также потому, что большинство примеров были
скомпилированы компилятором, не поддерживающим пространства имен – достаточно
недавнего нововведения С++. (Детали применения using-объявлений при работе с
стандартной библиотекой С++ обсуждаются в разделе 8.6.)

Раздел 8.6 прочитай сам.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #9 : 27 Марта 2011, 12:38:46 »
Такая конструкция не рабтает:
#include <string>
using namespace std::string;
// Ok: string видим
string current_chapter = "Обзор С++";
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #10 : 27 Марта 2011, 12:41:47 »
Ну, в С строк вообще нету.
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #11 : 27 Марта 2011, 12:49:42 »
Так у меня же файл называется new.срр
« Последнее редактирование: 27 Марта 2011, 13:14:27 от Jack Sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #12 : 27 Марта 2011, 13:03:57 »
А надо так: std::string current_chapter = "Обзор С++";
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #13 : 27 Марта 2011, 13:22:53 »
Действительно, этот способ работает, хотя Липпман приводит оба.
Но мне сейчас нужно несколько другое. Нужно, чтобы работала команда cout. Но если я делаю
#include <iostream>
using namespace std;
то и случаются конфликты.
(Нажмите, чтобы показать/скрыть)
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Ошибка в простой С++ программе [РЕШЕНО]
« Ответ #14 : 27 Марта 2011, 13:37:45 »
Действительно, этот способ работает, хотя Липпман приводит оба.

Я не первый раз встречаю, что пример из книги не работает. Вообще никак.

А так работает:
#include <iostream>

int main()
{
    std::string current_chapter = "Обзор С++";
    std::cout << current_chapter << std::endl;
    return 0;
}
Открытый код и его подержка — это лучшая реклама Windows.

 

Страница сгенерирована за 0.084 секунд. Запросов: 25.