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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите реализовать передачу параметров ключами.  (Прочитано 2894 раз)

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

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
...
2) использование конструкций вида for (int i = 0; ...
...

А чем порочна данная конструкция?
Тем что стандарт C89 её запрещает. Так разрешено делать в C++ и С99.
Всякие недопреподы этого и не знают вот и вешают лапшу на уши а потом народ глупые вопросы задаёт.
Учись, студент.

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
...
2) использование конструкций вида for (int i = 0; ...
...

А чем порочна данная конструкция?
Тем что стандарт C89 её запрещает. Так разрешено делать в C++ и С99.
Всякие недопреподы этого и не знают вот и вешают лапшу на уши а потом народ глупые вопросы задаёт.
Учись, студент.

Такъ если мы говорим о С++, значит можно.  Если о C, то другой разговор.
« Последнее редактирование: 18 Февраля 2009, 09:29:07 от digiwhite »
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Ну я так и насписал что из всех возможностей собственно С++ у него используется только эта, ну и потоки ввода вывода. Не надо вырывать цитаты из контекста.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Yurror, на счет недопреподов - в самую точку.
Тогда где, как не здесь, меня наставят на путь истинный?
И объясни, пожалуйста, почему не надо делать for (int i = 0; ? Если в С89 это запрещено стандартом, значит есть какие-то объективные причины.
« Последнее редактирование: 18 Февраля 2009, 15:53:18 от Oldwise »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
ммм...
объективная причина одна: уровень развития науки и техники. больше ничего =)
потом же все было "исправлено" =)

P.S. расслабься уже, пользуйся на здоровье. это было в 89м. Тебя тогда еще на свете не было :) Просто надо учитывать что gcc пошлет лесом такую конструкцию и всего-то. для g++ все вполне естественно.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Yurror, в некоторых аспектах науки и техники наблюдается переход от науки к потреблядству. Так что прогресс не всегда исправляет недостатки.
Цитировать
расслабься уже, пользуйся на здоровье. это было в 89м. Тебя тогда еще на свете не было Smiley
Нет. Надо чтить традиции, заложенные отцами-основателями.  :)

В мане по getopt'у интересен пункт про переменную среды POSIXLY-CORRECT. Если стоит YES, то если встречается значение, которое не является ключом и не является аргументом ключа, то оно парсится, как аргумент самой программы и все последующие значения так же парсятся, как аргументы программы, т.е. все ключи, которые были указаны после этого значения, игнорируются. Чтобы как-то проиллюстрировать сказанный мной бред, пример. Получается, что команда
g++ hello.cpp -Wall -o helloPOSIX-неверна, потому что hello.cpp является аргументом программы, -Wall, -o - ключи, hello - аргумент ключа -o.
Если бы это парсилось getopt'ом и была переменная среды POSIXLY_CORRECT=YES, то после того, как hello.cpp пропарсилось, как аргумент g++, -Wall -o hello также пропарсились, как аргументы g++, а не как ключи.
Чем грозит POSIX-неверность?
Что такое переменная среды? (Environment variable)  :)
Или я все не так понял?
P.S. Обычно пишу g++ -Wall -o hello hello.cpp  :)
« Последнее редактирование: 20 Февраля 2009, 12:11:55 от Oldwise »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Нет. Надо чтить традиции, заложенные отцами-основателями.  :)
Мазахист =)

Чем грозит POSIX-неверность?
Тем что на другой POSIX системе не запустится.

Что такое переменная среды? (Environment variable)  :)
Это набор ключ/значение.
man getenv
набери в командной строке set | less чтобы посмтреть все переменные твоей среды.
набери export VARNAME=VALUE чтобы установить новую перемпенную
вставь последнюю строчку в ~/.bashrc чтобы переменная определялась для всего твоего аккаунта при каждом входе.

P.S. Обычно пишу g++ -Wall -o hello hello.cpp  :)
Вот и продолжай так писать!

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Спасибо за подробный рассказ про переменные среды.
Самое смешное - ни одной переменной, содержащей POSIX, я не нашел.  :)
Цитировать
Вот и продолжай так писать!
Ну не злись.  ;) Я спрашиваю в контексте getopt'а.
Провел такой эксперимент:
yaromir@debian-yaromir:~$ cd ~/C++/lab
yaromir@debian-yaromir:~/C++/lab$ export POSIXLY_CORRECT=YES
После этого ожидаемый результат команды
yaromir@debian-yaromir:~/C++/lab$ g++ lab5.cpp -Wall -o lab5P_Cтакой, что g++ не примет ключи -Wall -o и аргумент -o lab5P_C. Т.е. теоретически имя выходного бинарника должно быть, как по умолчанию: a.out .
Но в результате
yaromir@debian-yaromir:~/C++/lab$ ls
lab1       lab2.cpp   lab3.cpp~   lab4v1.cpp~  lab4v3       lab5.cpp
lab1.cpp   lab2.cpp~  lab4.cpp~   lab4v2       lab4v3.cpp   lab5.cpp~
lab1.cpp~  lab3       lab4v1      lab4v2.cpp   lab4v3.cpp~  lab5P_C
lab2       lab3.cpp   lab4v1.cpp  lab4v2.cpp~  lab5
Варианта 2:
0) Я криво установил переменную среды.
1) g++ парсит свой ввод не getopt'ом.

А теперь пофлудим.  ;)
Цитировать
Мазахист =)
По-твоему я - мазохист, если форматирую код согласно заветам Кернигана. ;) Или мне надо, как один из одногруппников, пейсать все в одну строку.
« Последнее редактирование: 23 Февраля 2009, 21:50:45 от Oldwise »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Не злюсь. это одобрение.

мазахизм это писать
int i;
...
for(i=0; ...
а совсем не про оформление. ладно, проехали.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Дальнейшее развитие ситуации. Одна из лабораторных в этом семестре - "Использование dll." Нужно посчитать функцию с помощью этого же ряда, но ряд запихнуть в отдельную функцию, а эту функцию - в dll. Первоочередная задача - сделать счет ряда в отдельной функции. Решил делать это в любимом родном Линуксе в любимом родном Эклипсе. (Терпеть не могу VS. >_<) Представляю это так: сделать функцию double Row_Member (double x, int n) {}. Код скажет намного лучше меня.
(Нажмите, чтобы показать/скрыть)
Добавил еще пару проверок вводимых переменных, но речь не об этом. Программа считает криво. Считаю, что у меня опять проблемы с неявным приведением типов и полиморфизмом. (бяк, ненавижу >_<) Специально сделал все переменные дабл, но Эклипс, при тыканьи на abs в этих местах
for (x=x1; x<=x2; x+=dx) { //Диапазон иксов.
while ( abs ( Row_Member(x, n+1) - Row_Member(x, n) ) > eps ) { //Пока разность n+1-ого и n-ого членов меньше заданного значения точности.
printf("\n%f\n", Row);
Row+= Row_Member(x, n); //Прибавлять к ряду n-ный член.
n+=1; //Увеличивать номер члена.
}
for (eps=eps1; eps>=eps2; eps *= 0.1) { //Диапазон точности.
while ( abs ( Row_Member(x, n+1) - Row_Member(x, n) ) > eps ) { //Пока разность n+1-ого и n-ого членов меньше заданного значения точности.
Row+= Row_Member(x, n); //Прибавлять к ряду n-ный член.
n+=1; //Увеличивать номер члена.
}
Выдает такое описание:
/* Return the absolute value of X.  */
extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
т.е. abs определена, как int abs(int), из-за чего происходит такая вещь: если подмодульное выражение от нуля до единицы, то при приведении его к целому получится ноль, что меньше любой бесконечно малой точности, и у меня циклы останавливаются раньше времени, не досчитывая кучу членов ряда.
Вот такие дела. Буду благодарен за любую помощь.
В чем может быть ошибка?
Существует ли какой-нибудь оператор, который в данной программе мог бы однозначно определить полиморфную функцию?
Попробую переписать на C, где нет долбанного полиморфизма, но, емнип, в VS, где потом буду распихивать все это на exe и dll, нет средств разработки на С.
Вот.  :)
« Последнее редактирование: 07 Марта 2009, 13:02:15 от Oldwise »

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Нужно вставить после инклюдов такую строку:
using namespace std;
« Последнее редактирование: 07 Марта 2009, 14:02:05 от Sova777 »
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Вообще вы, мне кажется, не совсем понимаете что такое C и C++. Вы, я так понял, против совместимости C и C++? Если так, то я решительно против!!  ;D
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Цитировать
Нужно вставить после инклюдов такую строку:
using namespace std;
Спасибо, попробую. Если еще объясните, как пространство имен влияет на определение функций, буду просто счастлив.
Цитировать
Вообще вы, мне кажется, не совсем понимаете что такое C и C++.
Я - студент, которому нифига ничего не объяснили, а заставляют писать программы. Читаю Страустрапа в свободное время, а времени немного.
Цитировать
Вы, я так понял, против совместимости C и C++?
С и С++ - это ведь разные языки? Мешать их, ИМХО, не Ъ.
« Последнее редактирование: 07 Марта 2009, 19:15:48 от Oldwise »

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
#include <cmath> и использование правильного пространства имён std::abs должно помочь, там должны быть определены перегруженные функции для float, double и long double

В C для этих же целей используется заголовочный файл math.h и ф-ция doble fabs(double)
Совет: рекомендую учиться читать, что написано в документации, которой навалом.

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Спасибо, попробую. Если еще объясните, как пространство имен влияет на определение функций, буду просто счастлив.
В коде у вас есть такая строка "#include <cmath>", с ее помощью вы объявили неколько функций abs() приблизительно так:

extern "C"  int abs(int val);
namespace std
{

  extern double  abs(double __x);
  extern float  abs(float __x);
  extern long double  abs(long double __x);
}

abs(int) имеет глобальную область видимости, остальные спрятаны в std. Без "using namespace std" компилятор думает что существует только 1 функция abs. Поэтому, вне зависимости от аргументов, у вас будет вызываться abs(int). Команда "using namespace std" познакомит компилятор с другими функциями abs() и у него появится выбор.
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

 

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