Здравствуйте!
Вводная:
Новичок, использую учебник «С++ за 21 день», изучил(видимо, плохо, см. ниже) 9 глав. Пишу код в CodeBlocks. Компилятор GNU GCC.
Задача:
Из учебника «С++ за 21 день» делаю упражнение:
«4. Напишите класс Circle, который вычисляет площадь и периметр по радиусу, который передается классу как параметр во время создания экземпляра. Число Пи должно содержаться в константном закрытом члене, к которому нельзя обратиться извне класса.»
Что делал:
1. написал код:
C++ | ||
|
2. Хочу сделать программу где члены класса и сам класс резервируется в динамической памяти.
Строка 52 — передаю, введенные значения как ссылки в конструктор класса.
Строка 18 — конструктор принимает значения в виде указателей(или я неправильно описал что написал в коде? ).
Строка 20 — делаю запрос на резервирование памяти для переменной типа «float».
Компилятор сообщил об ошибке, она описана ниже.
3. Конструктор копий пока не делал т.к. нужно разобраться с ошибкой что ниже опишу.
Что не понятно:
1. Компилятор для строки 20 пишет следующее: «error: expression in new-declarator must have integral or enumeration type».
Эм… не пойму что он от меня хочет… Дословно звучит так: «выражение в новом объявителе должно иметь тип целого или перечисления», я ему написал тип float, на тип int так же ругается.
Что сделано не так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Я не понимаю, почему я получаю эту ошибку. Раньше я использовал тот же код, и это не дало мне никаких проблем, но теперь по какой-то причине я получаю сообщение об ошибке.
outputf3 << "The sorted list is as follows: nn";
sorting = new float [function.sort()]; // Here is where the error is.
for (i=0; i < length ; i ++)
{
outputf2 << "n" << sorting[i] ;
}
По какой-то причине он говорит
error: expression in new-declarator must have integral or enumeration type
Но я использовал то же самое здесь в предыдущей части программы.
inputs = new float[length];
inputf.clear();
inputf.seekg(0, std::ios_base::beg);
Понятия не имею, зачем он вообще это делает. Я читаю случайные числа из файла, затем сортирую их в другой части функции и записываю в выходной файл.
2 ответы
Почему вы думаете:
inputs = new float[length];
такой же как
sorting = new float [function.sort()];
?
Если не function
является экземпляром класса и sort
возвращает целочисленный тип, он точно не сработает.
Заявление:
Type* t = new Type[x];
динамически распределяет x
объекты типа Type
. Довольно очевидно, почему x
должно быть цельного типа.
РЕДАКТИРОВАТЬ: Согласно вашему комментарию:
Размер, который будет выделен должен быть цельного типа, но вы возвращаете float
. Но даже тогда в этом не было бы смысла. Вам нужно вернуть размер inputs
.
ответ дан 23 мар ’12, в 18:03
Я собираюсь рискнуть и сказать, что function.sort () возвращает void. имея в виду эту строку:
sorting = new float [function.sort()];
это то же самое, что писать …
sorting = new float [void];
что не имеет никакого смысла. вам, вероятно, нужна длина того, над чем работает function.sort ()?
ответ дан 23 мар ’12, в 18:03
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
c++
sorting
types
new-operator
file-io
or задайте свой вопрос.
В С++ 14 дан следующий код:
void foo() {
double d = 5.0;
auto p1 = new int[d];
}
clang компилирует это без диагностики, в то время как gcc, с другой стороны, выдает следующую диагностику (см. это в Godbolt):
error: expression in new-declarator must have integral or enumeration type
7 | auto p1 = new int[d];
| ^
Я специально обозначил этот С++ 14, потому что в режиме С++ 11 clang рассматривает это как плохо сформированное и производит следующую диагностику (см. Это в прямом эфире):
error: array size expression must have integral or unscoped enumeration type, not 'double'
auto p1 = new int[d];
^ ~
Является ли лязг правильно? Если так, что изменилось в С++ 14, чтобы это разрешить?
12 дек. 2018, в 15:53
Поделиться
Источник
2 ответа
Clang верен, ключевая формулировка в [expr.new] p6 отличается от следующей в черновике C++ 11:
Каждое константное выражение в деклараторе noptr-new должно быть целочисленным константным выражением ([expr.const]) и иметь строго положительное значение. Выражение в noptr-new-объявителе должно иметь целочисленный тип, тип перечисления с незаданной областью или тип класса, для которого существует единственная неявная функция преобразования в тип перечисления с целой или незаданной областью ([class.conv]). Если выражение имеет тип класса, выражение конвертируется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного выражения….
на это в проекте C++ 14:
Каждое константное выражение в объявителе noptr-new должно быть преобразованным константным выражением ([expr.const]) типа
std::size_t
и должно принимать строго положительное значение. Выражение в деклараторе noptr-new неявно преобразуется вstd::size_t
…
В C++ 14 требование для выражения в noptr-new-деклараторе было ослаблено, чтобы не требовать целочисленного перечисления с незаданной областью или класса с единственной неявной функцией преобразования для одного из этих типов, а просто разрешать неявные преобразования в size_t,
Изменения в формулировке произошли от предложения A Tweak Certain C++ Contextual Conversions, v3.
Shafik Yaghmour
12 дек. 2018, в 14:43
Поделиться
От c++14 до c++17 (для тех, кто интересуется, как я), фраза остается практически такой же (в отличие от С++ 11 до С++ 14, как ответил @ShafikYaghmour), как указано в этом С++ 17 черновик:
Каждое константное выражение в деклараторе noptr-new должно быть преобразованным константным выражением типа
std::size_t
и должно принимать строго положительное значение. Выражение в деклараторе noptr-new неявно преобразуется вstd::size_t
. [..]
только эта часть ([expr.const])
отсутствует в проекте С++ 17.
gsamaras
14 дек. 2018, в 15:10
Поделиться
Ещё вопросы
- 0Установка xdebug в Ubuntu 14.04 без создания файла xdebug.ini
- 0Загрузить контроллер angularJs
- 0Как сделать так, чтобы значок приложения отображался в мобильных приложениях клиента при загрузке
- 1Android, я должен сделать MediaPlayer сервисом?
- 1Как сделать снимок в qcow2 программным способом?
- 0Как уменьшить высоту области содержимого для <p> с помощью CSS?
- 0JQuery действует странно в IE, когда я НЕ в режиме совместимости
- 1Как реализовать синглтон со стратегиями?
- 0Форма PHP не отправляется на следующую страницу
- 1Генерация 1000 случайных чисел от 13 до 100
- 0динамический флажок андроид
- 1получить текущую позицию из DataInputStream в Java
- 0php искать исходный код URL для конкретного слова, а затем перенаправить на URL
- 1Создание Discord Bot в Python: Как сделать разговор о переключателе для ChatBot
- 0jQuery Mobile переходит на предыдущую страницу
- 1Express + MongoDB — запрос объекта
- 1Создание кнопок вкладки Android Market
- 0Какой самый эффективный способ PHP прочитать первую и последнюю строку файла?
- 0MySQL вставка не вставляя предполагаемое значение
- 1Получить идентификатор входящего звонка Sip
- 0Безопасное встраивание строки в C-код (Безопасная строка, Безопасный символ *)
- 0Как определить внутреннюю ширину браузера для мобильных устройств
- 0Как исправить изображение в правом нижнем углу с изменением размера окна?
- 0Показывать различный контент в соответствии с переключателем
- 0Дно границы отсутствует
- 1Текст ошибки не отображается для результата функции
- 0Сделать пользовательский интерфейс недоступным для редактирования, когда мы переходим с одной страницы на другую
- 0условно в зависимости от стиля
- 1Недопустимое имя переменной Statsmodels (Patsy) / объект ‘Series’ не вызывается Ошибка
- 1Возможно ли иметь десятичную ось X для линейного графика?
- 0Содержимое по умолчанию до разрешения маршрута
- 0Angularjs вход [радио] с уникальной нг-моделью не отключается
- 1проверить два значения столбца двух CSV-файлов и, если совпадение найдено, записать в другой CSV-файл
- 0SQL — вернуть строки, которые не имеют определенного значения
- 0Как выполнить несколько запросов в sqlapi ++ с оракулом
- 1Как редактировать значение с помощью Entity Framework?
- 0C ++ — доступ к значениям в динамических массивах
- 1Как удалить файлы в AppData / Temp после загрузки файла с помощью .NET WebAPI 2? Ошибка файла в использовании
- 0Простой поиск в массиве C ++
- 1Использование запросов на обновление с objectdb
- 0LocalSettings.php не читается (MediaWiki, Xampp)
- 0Проверьте, находится ли дата в определенном диапазоне дат PHP [дубликаты]
- 0Измените UL стиля выбора JQuery для работы без BootstrapJS
- 1C # Windows Forms для смешивания VS2013
- 0ng-click не работает на объектах с непрозрачностью: 1;
- 0Как написать запрос выбора вместе с условием IF вместо имени столбца в запросе MySQL
- 1<form> отключил мой код JavaScript
- 0Как показать или скрыть вкладку на основе URL страницы
- 0JQuery добавить — для ввода, но только добавить дважды
- 0Собираюсь изучать C, должен ли я просто использовать свой компилятор C ++ и IDE?
В C ++ 14 дан следующий код:
void foo() {
double d = 5.0;
auto p1 = new int[d];
}
clang компилирует это без диагностики, в то время как gcc, с другой стороны, производит следующую диагностику (увидеть это жить в Godbolt):
error: expression in new-declarator must have integral or enumeration type
7 | auto p1 = new int[d];
| ^
Я специально обозначил этот C ++ 14, потому что в режиме C ++ 11 clang рассматривает это как плохо сформированное и производит следующую диагностику (увидеть это жить в Godbolt):
error: array size expression must have integral or unscoped enumeration type, not 'double'
auto p1 = new int[d];
^ ~
Правильный ли лязг? Если так, что изменилось в C ++ 14, чтобы это разрешить?
41
Решение
Лязг правильно, ключевая формулировка в [Expr.new] р6 отличается от следующего в проекте C ++ 11:
каждый константа-выражение в noptr новый-описатель должно быть целочисленным константным выражением ([expr.const]) и иметь строго положительное значение. Выражение в noptr новый-описатель должен иметь целочисленный тип, тип перечисления с незаданной областью или тип класса, для которого существует единственная неявная функция преобразования в тип перечисления с целой или незаданной областью ([Class.conv]). Если выражение относится к типу класса, выражение конвертируется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного выражения. …
в это в проекте C ++ 14:
каждый константа-выражение в noptr новый-описатель должно быть преобразованным константным выражением ([expr.const]) типа
std::size_t
и оценим до строго положительного значения. Выражение в noptr новый-описатель неявно преобразуется вstd::size_t
. …
В C ++ 14 требование для выражения в noptr новый-описатель был ослаблен, чтобы не потребовать целочисленного перечисления с незаданной областью или класса с
единственная неявная функция преобразования в один из этих типов, но просто позволяющая неявное преобразование в size_t.
Изменение в формулировке произошло от предложения Предложение по настройке некоторых контекстных преобразований C ++, версия 3.
43
Другие решения
С С ++ 14 до C ++ 17 (для тех, кто интересуется, как я), формулировка остается практически такой же (в отличие от C ++ 11 до C ++ 14, как ответил @ShafikYaghmour), как указано в этом C ++ 17 черновик:
каждый константа-выражение в noptr новый-описатель должно быть преобразованным константным выражением типа
std::size_t
и оценим до строго положительного значения. Выражение в noptr новый-описатель неявно преобразуется вstd::size_t
. [..]
только с этой частью ([expr.const])
отсутствует в проекте C ++ 17.
1
Clang верен, ключевые формулировки в [expr.new] p6 отличаются от следующих в черновике C++ 11:
Every constant-expression in a noptr-new-declarator shall be an integral constant expression ([expr.const]) and evaluate to a strictly positive value. The expression in a noptr-new-declarator shall be of integral type, unscoped enumeration type, or a class type for which a single non-explicit conversion function to integral or unscoped enumeration type exists ([class.conv]). If the expression is of class type, the expression is converted by calling that conversion function, and the result of the conversion is used in place of the original expression. …
Кому: это в проекте C++ 14:
Every constant-expression in a noptr-new-declarator shall be a converted constant expression ([expr.const]) of type std::size_t and shall evaluate to a strictly positive value. The expression in a noptr-new-declarator is implicitly converted to std::size_t. …
В C++ 14 требование для выражения в noptr-new-declarator было ослаблено, чтобы не требовать целочисленного перечисления без области видимости или класса с
единственная неявная функция преобразования в один из этих типов, но позволяет просто неявное преобразование в size_t.
Изменение формулировки связано с предложением Предложение по настройке некоторых контекстных преобразований C++, v3.
You should upgrade or use an alternative browser.
-
Forums
-
Other Sciences
-
Programming and Computer Science
Gauss-legendre c++
- C/C++
-
Thread starter
ggeo1 -
Start date
Mar 10, 2011
- Mar 10, 2011
- #1
My code until now is : ( i have created the function f with limits (-1,1) )
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>
using namespace std;
const double pi=3.14;
double f(double x){
double y;
y=(pi/4.0)*(log((pi*(x+1.0))/4.0 +1.0));
return y;
}
double legendre (int n){
double *L,*w,*t;
double x,sum1,sum2,result;
L=new double [n];
w=new double [n];
t=new double [x];
while(n<10){
L[0]=1;
L[1]=x;
for (int i=1;i<=10;i++){
L[i+1]=((2.0*i+1.0)*x*L[i] - i*L[i-1])/(i+1.0);
}
w=0;
for (int i=1;i<=10;i++){
w[i]+=(2.0*(1.0-x*x))/(i*i*(L[i-1]*L[i-1]));
}
for (int i=1;i<=10;i++){
sum1=0.0;
for (int k=1;k<=2*n-1;k+=2){
sum1+=w[i]*(pow(t[i],k));
}
sum1=0;
sum2=0.0;
for(int k=0;k<=2*n-2;k+=2){
sum2+=w[i]*(pow(t[i],k));
}
sum2=2.0/n;
}
}
result=w*f(t);
return result;
}
int main()
{
double eps=1e-8;//accuracy
double exact=0.8565899396;//exact solution for the integral
double error=1.0;
double result;
int n=1;//initial point
while (fabs(error-exact)>eps) {
result=legendre(n);
cout <<"nFor n = "<<n<<",error = "<<fabs(error-exact)<<",value = "<<result;
n++;
}
return 0;
}
I have the following problems:
(first of all i am not sure if am doing it right..)
1) I am not sure how to connect the whole thing.I am computing L[i+1],w and then sum1 and sum2 but i can’t figure how to connect them.
2) In the point i am writing result=w*f(t) ,the compiler gives me an error.I can’t insert a pointer (t here) in a function as argument?
Any help is appreciated…
Attachments
Answers and Replies
- Mar 10, 2011
- #2
For #1: I don’t know what you mean by «connecting the whole thing», because I’m not familiar with the function you are computing.
- Mar 11, 2011
- #3
You set n = 1…
You call legendre(n)…
Then inside legendre(int) you say w=new double [n];
In other words n = 1 and w has a length of 1.
But then you iterate i from 1 to 10 and say :
sum1+=w*(pow(t,k));
This will crash or at least badly misbehave unless w has a length of at least 11.
Maybe it would help if you posted the specific algorithm you are trying to implement.
- Mar 12, 2011
- #4
i have the algorithm attached.
the compiler gives me the following errors:
where i have «t=new double [x];» it gives -> error: expression in new-declarator must have integral or enumeration type|
and where » result=w*f(*t); » ->error: invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’|
(note :i changed result=w*f(t) to result = w*f(*t)
And as i said , i don’t know if i implemented the algorithm right.
Thanks for helping.
- Mar 12, 2011
- #5
Hello ,
i have the algorithm attached.the compiler gives me the following errors:
where i have «t=new double [x];» it gives -> error: expression in new-declarator must have integral or enumeration type|
You can’t do this, which is what the compiler error message is saying. There are several things wrong here.
1. x is a local variable of type double. When you declare an array, the number must be an integral type (int, long, char, short, etc.) or a value of an enum.
2. Even if you could declare an array with a double or float number of elements, x is an uninitialized local variable.
and where » result=w*f(*t); » ->error: invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’|(note :i changed result=w*f(t) to result = w*f(*t)
And as i said , i don’t know if i implemented the algorithm right.
Thanks for helping.
Suggested for: Gauss-legendre c++
- Last Post
- Jul 3, 2022
- Last Post
- Jun 22, 2022
- Last Post
- Aug 7, 2022
- Last Post
- Aug 9, 2022
- Last Post
- Oct 3, 2022
- Last Post
- Aug 11, 2022
- Last Post
- Jun 7, 2021
- Last Post
- Nov 22, 2022
- Last Post
- Jun 10, 2021
- Last Post
- Dec 14, 2020
-
Forums
-
Other Sciences
-
Programming and Computer Science