Российские распределенные вычисления на платформе BOINC
Форум участников распределённых вычислений.

Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Disel  
#1 Оставлено : 27 мая 2018 г. 18:42:51(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
Начал понемногу смотреть С++:

1. Написал простейшую программу, компилятор жалуется на строку 21

sub.cpp:25:1: error: expected unqualified-id before ‘{’ token

Что не нравится?


2. Просьба объяснить назначение каждого из символов строки 8, скопировал с одного из интернет-примеров, то что в круглых скобках мне не понятно. Строка 5 понятна только отдаленно, по ней если можно то же.

3. Назначение get () строки 17 cin.get (); -?

Код:

#include <fstream> 		//Для работы с файлами
#include <iostream>		//Ввод вывод
#include <cmath> 	 	//Математика

using namespace std;
int sub (float, float, float); //Прототип функции

int main (int argc, const char * argv []) {
float m, n, k;

	cout << "Введите число N: " ; cin >> n;  cout << endl; 
	m = sub (n, m, k);
	cout << "Синус числа n =  " << m << endl;
	cout << "Косинус числа n =  " << k << endl;
	
	//завершение программы
	cin.get ();
	return 0;
}

{
float sub (float x, float y, float z)
	{ 
	y=sin (x);
	z=cos (x);
	}

return y, z; 
}
Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline hoarfrost  
#2 Оставлено : 27 мая 2018 г. 23:15:50(UTC)
hoarfrost


Статус: Старожил

Медали: Переводчику: За помощь в создании сайтаРазработчику: За разработку приложения CluBORunДонор: За финансовую помощь сайту

Группы: Editors, Member, Administration, Moderator Crystal Dream, Moderators, Crystal Dream Group
Зарегистрирован: 05.10.2007(UTC)
Сообщений: 8,385
Мужчина
Откуда: Crystal Dream

Сказал «Спасибо»: 1236 раз
Поблагодарили: 1692 раз в 1074 постах
Disel, "так держать"!

Автор: Disel Перейти к цитате
sub.cpp:25:1: error: expected unqualified-id before ‘{’ token

Лишняя "{" - перед названием функции, а должна быть - после, фигурными скобками обрамляют блоки кода - функции, циклы и даже просто блоки кода.
Должно быть так, например:
Код:
float sub (float x, float y, float z)
{
	y=sin (x);
	z=cos (x);

	return y, z; 
}


Если поставить { c } ещё и вокруг y = ... и z = ..., то ругаться тоже не должен.


Цитата:
Просьба объяснить назначение каждого из символов строки 8, скопировал с одного из интернет-примеров, то что в круглых скобках мне не понятно. Строка 5 понятна только отдаленно, по ней если можно то же.

Если речь о
Код:
using namespace std;
... 
int main (int argc, const char * argv []) {

то всё просто - using namespace std - это директива использования пространства имён стандартной библиотеки. Речь именно об именах, а не о физическом подключении библиотеки. Если using нет, то надо писать std::<имя из библиотеки> если же using есть, то, формально, это не требуется.

В строке с int main - начало точки входа в программу - функции main. Она может быть void main(), но уже довольно давно рекомендуют именно int main с возвратом 0, если всё хорошо, и кода ошибки - если нет. int argc - входной параметрв - число аргументов, переданных программе при запуске, а char* argv[] - это указатель на массив строк, каждая из которых - char[] - перечень этих аргументов. Перым аргументом, как правило, является полный путь к программе или её название или что-то аналогичное. Может зависеть от OS.

Цитата:
Назначение get () строки 17 cin.get (); -?

cin.get - читает символ с клавиатуры. cin, cout, cerr, clog - это, что интересно, не классы, а объекты - т.е. экземпляры классов потоков I/O, которые, в связи с тем, что они связаны со стандартным вводом и выводом - создаются "прямо в библиотеке", а не вами.
UserPostedImage
thanks 1 пользователь поблагодарил hoarfrost за этот пост.
Disel оставлено 28.05.2018(UTC)
Offline Disel  
#3 Оставлено : 28 мая 2018 г. 3:00:37(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
Заработало вот так
Код:

float sub (float x, float y, float z) 
	{ 
	y=sin (x);
	z=cos (x);

return y, z; 
}


но была еще ошибка в строке 6, заменил самое первое слово int на float. Как понял, нужно указать здесь тип функции? Но это странно, ведь возвращаемые значения могут быть разных типов.

И второе - синус считается правильно, косинус нет

Цитата:

Введите число N: 3

Синус числа n = -0.989992
Косинус числа n = 4.59135e-41


Функция может возвращать не одно, а больше значений? Если нет, то есть ли другой тип функций, способный на это?
Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline SerVal  
#4 Оставлено : 28 мая 2018 г. 8:19:32(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,117
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 311 раз
Поблагодарили: 539 раз в 374 постах
Цитата:
Функция может возвращать не одно, а больше значений?

В С++ функция может возвращать только одно значение.

Цитата:
Функция может возвращать не одно, а больше значений? Если нет, то есть ли другой тип функций, способный на это?

Функция всегда возвращает одно значение. Но может менять значения переданных ей переменных.

Например:
Код:

// Функция изменяет значения переменных y и z, переданных по ссылке
bool mySinCos(float x, float *y, float *z)
{
	*y = sin(x);
	*z = cos(x);
	return true;
}

int main(int argc, char *argv[])
{
	setlocale(LC_CTYPE, "russian"); // для русских букв в консоли. 

	float x = 0;
	float y;
	float z;

	bool bResult = mySinCos(x, &y, &z); // передаём в функцию x и адреса переменных y и z
	std::cout << "Синус   = " << y << std::endl;
	std::cout << "Косинус = " << z  << std::endl;
	
	return 0;
}
thanks 1 пользователь поблагодарил SerVal за этот пост.
Disel оставлено 28.05.2018(UTC)
Offline hoarfrost  
#5 Оставлено : 28 мая 2018 г. 11:04:07(UTC)
hoarfrost


Статус: Старожил

Медали: Переводчику: За помощь в создании сайтаРазработчику: За разработку приложения CluBORunДонор: За финансовую помощь сайту

Группы: Editors, Member, Administration, Moderator Crystal Dream, Moderators, Crystal Dream Group
Зарегистрирован: 05.10.2007(UTC)
Сообщений: 8,385
Мужчина
Откуда: Crystal Dream

Сказал «Спасибо»: 1236 раз
Поблагодарили: 1692 раз в 1074 постах
Автор: Disel Перейти к цитате
И второе - синус считается правильно, косинус нет

В данном случае он считался но не возвращался. Возвращалось только одно значение как и сказал SerVal. Первоначально не заострил на этом внимание.
UserPostedImage
Offline zlodeck  
#6 Оставлено : 28 мая 2018 г. 12:17:13(UTC)
zlodeck


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 03.06.2012(UTC)
Сообщений: 189
Откуда: Замкадье

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 82 раз в 48 постах
Можно еще разместить данные в структуре и передавать функции всесте с арументом x указатель на структуру.
Код:
// определяем новый тип datasincos - это структура с 2 полями типа float
typedef struct MyStruct
{
  float fsin;
  float fcos;
} datasincos;

// функция типа void - она ничего не возвращает, все данные передаются через ее параметры
void MySinCos(float x, datasincos *d)
{
  d->fsin = sin(x); // можно писать и (*d).fsin = sin(x), но когда работают с указателем на структуру, обычно разыменовывают его оператором "->"
  d->fcos = cos(x);
  return;
}

int main(int argc, char *argv[])
{
  setlocale(LC_CTYPE, "russian"); // для русских букв в консоли. 

  datasincos data; // определяем переменную структурного типа
  float x = 0;

  MySinCos(x, &data); // передаем в функцию аргумент и адрес нашей структуры

  // ниже data - это переменная структурного типа, а не указатель, доступ к ее элементам - через точку "."
  std::cout << "Синус   = " << data.fsin << std::endl;
  std::cout << "Косинус = " << data.fcos  << std::endl;

  return 0;
}


А еще можно и саму функцию заставить возвращать структуру.
thanks 1 пользователь поблагодарил zlodeck за этот пост.
Disel оставлено 28.05.2018(UTC)
Offline hoarfrost  
#7 Оставлено : 28 мая 2018 г. 15:17:53(UTC)
hoarfrost


Статус: Старожил

Медали: Переводчику: За помощь в создании сайтаРазработчику: За разработку приложения CluBORunДонор: За финансовую помощь сайту

Группы: Editors, Member, Administration, Moderator Crystal Dream, Moderators, Crystal Dream Group
Зарегистрирован: 05.10.2007(UTC)
Сообщений: 8,385
Мужчина
Откуда: Crystal Dream

Сказал «Спасибо»: 1236 раз
Поблагодарили: 1692 раз в 1074 постах
Структуру, если что, можно объявить и чуток проще:

Код:

struct sincos
{
	float fsin;
	float fcos;
};


А вообще - как только их в друг-дружку не вкладывают и не объявляют. smile
UserPostedImage
Offline Disel  
#8 Оставлено : 28 мая 2018 г. 17:28:13(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
Спасибо. Оба примера понятны, хотя не до последних тонкостей в отношении синтаксиса. Я сделал свой пример с передачей по ссылке, он работает.
Код:

#include <fstream> 		//Для работы с файлами
#include <iostream>		//Ввод вывод
#include <cmath> 	 	//Математика

using namespace std;
float sub (float&, float&, float&); //Прототип функции


int main (int argc, const char * argv []) {
float m, n, k;

	cout << "Введите число N: " ; cin >> n;  cout << endl; 
	m = sub (n, m, k);
	cout << "Синус числа n =  " << m << endl;
	cout << "Косинус числа n =  " << k << endl;
	
	//завершение программы
	cin.get ();
	return 0;
}

float sub (float& x, float& y, float& z) 
	{ 
	y=sin (x);
	z=cos (x);
return y; 
}

Хотя кое что не нравится, retarn пишется в данном случае применительно к "y". И не совсем ясно, чем отличается применение & в моем примере от * в примере Serval-а, а так же применение логической bool (тут как я понял - лишь бы была объявлена какая-либо функция, а что она будет делать без разницы, написать можно разное). Второй пример то же относительно понятен, но сложноват. Применение таких конструкций видимо требует постоянной работы с языком. Нужно двигаться от простого к сложному постепенно.

hoarfrost написал:
Структуру, если что, можно объявить и чуток проще:


Попробовал, не вышло. ( Не к тому, что не верно, нужно остальное править.
Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline zlodeck  
#9 Оставлено : 28 мая 2018 г. 17:31:17(UTC)
zlodeck


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 03.06.2012(UTC)
Сообщений: 189
Откуда: Замкадье

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 82 раз в 48 постах
Автор: hoarfrost Перейти к цитате
Структуру, если что, можно объявить и чуток проще:

Код:

struct sincos
{
	float fsin;
	float fcos;
};


А вообще - как только их в друг-дружку не вкладывают и не объявляют. smile


Да, можно и так.
Только тогда вроде в объявлениях везде вместо datasincos нужно писать struct sincos.

А так да, структуры очень часто используются.
Да и удобнее с ними: если, например, полей будет не 2 а 20, то передавать их в функцию как указатели - это трэш, обязательно где-нибудь ошибешься. Вот в фортране раньше структур не было, так вызов функций из какой-нибудь библиотеки выглядит как паровоз с 10-15 параметрами разных типов.
Offline hoarfrost  
#10 Оставлено : 28 мая 2018 г. 18:22:25(UTC)
hoarfrost


Статус: Старожил

Медали: Переводчику: За помощь в создании сайтаРазработчику: За разработку приложения CluBORunДонор: За финансовую помощь сайту

Группы: Editors, Member, Administration, Moderator Crystal Dream, Moderators, Crystal Dream Group
Зарегистрирован: 05.10.2007(UTC)
Сообщений: 8,385
Мужчина
Откуда: Crystal Dream

Сказал «Спасибо»: 1236 раз
Поблагодарили: 1692 раз в 1074 постах
Автор: zlodeck Перейти к цитате
Только тогда вроде в объявлениях везде вместо datasincos нужно писать struct sincos.


В C++ уже не обязательно. smile Вариантов синтаксиса столько развелось, "что ужас". laugh1

Код:
[oracle@bisrvtst2 ~]$ cat MathPoint.cpp

Код:
# include <iostream>

using namespace std;

struct MathPoint
{
    double x;
    double y;
    double z;
};

int main()
{
    MathPoint me = {10, 20, 30};

    cout << "My coordinates: (" << me.x << ";" << me.y << ";" << me.z << ")" << endl;

    return 0;
}

Код:
[oracle@bisrvtst2 ~]$ g++ -o MathPoint MathPoint.cpp
[oracle@bisrvtst2 ~]$ ./MathPoint
My coordinates: (10;20;30)
[oracle@bisrvtst2 ~]$
UserPostedImage
Offline Disel  
#11 Оставлено : 28 мая 2018 г. 19:20:48(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
В фортране практически так же, вместо точки %
Код:

program main

    type :: MathPoint
        real :: x, y, z
    end type

    type (MathPoint ) :: me
    me = MathPoint (10, 20, 30)
    
    print*, "My coordinates:", me % x, ";", me % y, ";", me % z
    
end program main


Цитата:
My coordinates: 10.0000000 ; 20.0000000 ; 30.0000000


smile
Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline Disel  
#12 Оставлено : 11 июня 2018 г. 5:19:56(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
Какой командой в С++ засекается время вычислений, можно ли привести пример?
Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline evatutin  
#13 Оставлено : 11 июня 2018 г. 10:25:19(UTC)
evatutin


Статус: Старожил

Медали: Первооткрывателю: Результат в проекте SAT@homeРазработчику: За организацию проекта Gerasim@home

Группы: Editors, Member
Зарегистрирован: 08.06.2010(UTC)
Сообщений: 3,622
Откуда: Russia, Kursk

Сказал(а) «Спасибо»: 1016 раз
Поблагодарили: 1788 раз в 874 постах
Автор: Disel Перейти к цитате
Какой командой в С++ засекается время вычислений, можно ли привести пример?


http://evatutin.narod.ru...n_pp_lr2_timemeasure.pdf

kvt.kurskstu team founder
Gerasim@home scientist
My numbers are 5056994653507584 and 1835082219864832081920. Why not? smile
thanks 1 пользователь поблагодарил evatutin за этот пост.
Disel оставлено 11.06.2018(UTC)
Offline Sid  
#14 Оставлено : 11 июня 2018 г. 11:03:54(UTC)
Sid


Статус: Давно уж тут

Группы: Member
Зарегистрирован: 26.09.2013(UTC)
Сообщений: 496

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 90 раз в 59 постах
Автор: evatutin Перейти к цитате
Автор: Disel Перейти к цитате
Какой командой в С++ засекается время вычислений, можно ли привести пример?


http://evatutin.narod.ru...n_pp_lr2_timemeasure.pdf


Для точного измерения в Яве есть System.nanoTime()
Returns the current value of the most precise available system timer, in nanoseconds.
Наверняка есть что-то подобное в C++.
Ява для всх системных вызов использует сишные библиотеки через native.

thanks 1 пользователь поблагодарил Sid за этот пост.
Disel оставлено 11.06.2018(UTC)
Offline whitefox  
#15 Оставлено : 13 июня 2018 г. 12:14:53(UTC)
whitefox


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 08.10.2016(UTC)
Сообщений: 211

Сказал(а) «Спасибо»: 69 раз
Поблагодарили: 174 раз в 108 постах
Если говорить о стандартном С++, то в стандартах ранее С++2011 в заголовке <ctime> (<time.h> ) предусмотрена функция clock() унаследованная от С (а возможно и от B). Эта функция измеряет время работы процесса в тиках. Для перевода тиков в секунды нужно их разделить на стандартный макрос CLOCKS_PER_SEC. На современных ОС это позволяет измерять время теоретически с точностью до миллисекунды на интервалах больше секунды, на миллисекундных интервалах точность порядка 10 - 20 миллисекунд. Функция clock() сохранилась и в C++2011, но для более точного измерения времени в стандарт были добавлены новые возможности (заголовок <chrono> ).

Код:
int main(){
    clock_t t0 = clock();
    //
    // . . .
    //
    cout << "Time: " << double(clock() - t0) / CLOCKS_PER_SEC << " sec\n";
}

Отредактировано пользователем 13 июня 2018 г. 12:36:41(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил whitefox за этот пост.
Disel оставлено 17.06.2018(UTC)
Offline Disel  
#16 Оставлено : 17 июня 2018 г. 8:22:52(UTC)
Disel


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch! Донор: За финансовую помощь сайту

Группы: Member, Russia Team Group
Зарегистрирован: 08.07.2013(UTC)
Сообщений: 3,595
Мужчина
Российская Федерация

Сказал «Спасибо»: 518 раз
Поблагодарили: 426 раз в 326 постах
Способ whitefox заработал сразу. Со способами из статьи evatutin сложнее. Описывается 3 способа. Первый и третий с использованием winapi пробовать не стал, а вот второй способ пробую, но идет ругательство компилятора

Код



Вывод компиялтора



Ubuntu Linux 18.04 LTS - 64 bit / Boinc 7.9.3(х64) / Core 2 DUO E6300 1.8 Ггц / GeForce GT-630
Offline hoarfrost  
#17 Оставлено : 17 июня 2018 г. 12:39:18(UTC)
hoarfrost


Статус: Старожил

Медали: Переводчику: За помощь в создании сайтаРазработчику: За разработку приложения CluBORunДонор: За финансовую помощь сайту

Группы: Editors, Member, Administration, Moderator Crystal Dream, Moderators, Crystal Dream Group
Зарегистрирован: 05.10.2007(UTC)
Сообщений: 8,385
Мужчина
Откуда: Crystal Dream

Сказал «Спасибо»: 1236 раз
Поблагодарили: 1692 раз в 1074 постах
Примеры Эдуарда должны компилироваться в Visual Studio, но вот gcc/g++, подозреваю, что могут вещи типа "__int64" - не воспринимать.
UserPostedImage
Offline whitefox  
#18 Оставлено : 20 июня 2018 г. 16:29:10(UTC)
whitefox


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 08.10.2016(UTC)
Сообщений: 211

Сказал(а) «Спасибо»: 69 раз
Поблагодарили: 174 раз в 108 постах
Автор: Disel Перейти к цитате

time.cpp:10:1: error: ‘__int64’ was not declared in this scope

Замените Микрософтовский тип __int64 на стандартный long long

Автор: Disel Перейти к цитате

time.cpp:14:3: error: expected ‘(’ before ‘{’ token
. . .
time.cpp:26:3: error: expected ‘(’ before ‘{’ token


__asm{. . .} Это чисто Микрософтовский синтаксис инлайн-ассемблера, замените стандартным asm(". . ." ). И учтите, что инлайн-ассемблер вашего компилятора может отличаться от Микрософтовского MASM.
Offline zlodeck  
#19 Оставлено : 21 июня 2018 г. 12:16:51(UTC)
zlodeck


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 03.06.2012(UTC)
Сообщений: 189
Откуда: Замкадье

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 82 раз в 48 постах
Автор: whitefox Перейти к цитате

__asm{. . .} Это чисто Микрософтовский синтаксис инлайн-ассемблера, замените стандартным asm(". . ." ). И учтите, что инлайн-ассемблер вашего компилятора может отличаться от Микрософтовского MASM.

Для gcc будет отличаться, там используется AT&T синтаксис ассемблера вместо Интела. Можно вот тут посмотреть (в начале есть пример кода в 2 вариантах синтаксиса).
Желающим углубляться - мануал на великом и могучем.

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

Boinc.ru theme. Boinc.ru
Форум YAF 2.1.1 | YAF © 2003-2018, Yet Another Forum.NET
Страница сгенерирована за 0.214 секунды.