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

Про передачу массива в функцию как константу?

24.11.2018, 16:13. Показов 1820. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет Не ругайте сильно начал изучать с++ по книге Р Лаффоре. Понятно, что уже многое могло устареть. Собственно вопрос.

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<cstring>
using namespace std;
class Part
{
private:
    char partname[20];
    int partnumber;
    double cost;
public:
    //Part() :partname("0"), partnumber(0), cost(0)
    //{}
    void setPart(char pname[],int ptn, double cst)
    {
        strcpy_s(partname, pname);
        partnumber = ptn;
        cost = cst;
    }
    void display()
    {
        cout << "\nname part  " << partname;
        cout << "   number  " << partnumber << "   cost " << cost;
    }
};
int main()
{
;
    Part par1;
    par1.setPart([B][COLOR="Red"]"model"[/COLOR][/B], 20, 350);
    par1.display();
    return 0;
}

пример из книги. Почему не работает?
Ошибка следующая: Severity Code Description Project File Line Suppression State
Error C2664 'void Part::setPart(char [],int,double)': cannot convert argument 1 from 'const char [6]' to 'char []' Project12 f:\c++\source\glava6\project12\project12 \source.cpp 29
Но если написать так то все ок:
C++
1
2
3
4
5
Part par1;
         char mas[]="model";
    par1.setPart([B][COLOR="Red"]"mas"[/COLOR][/B], 20, 350);
    par1.display();
    return 0;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2018, 16:13
Ответы с готовыми решениями:

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

Разработать функцию поэлементного умножения массива на константу
Ребята, помогите написать программу на языке C++ ! Нужно разработать функцию поэлементного умножения массива на константу. Ну и результат...

Как реализовать передачу функции ключа или не передачу
Есть функция: bool LoadExclusion() { std::string filename = &quot;Exclusion&quot;; std::ifstream inFile (filename); //создать поток ...

6
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
24.11.2018, 16:33
Поелику, Вы хотите передавать константную строку, то будьте любезны писать:
C++
1
    void setPart(const char* pname, int ptn, double cst)
p.s. Это не я Вам говорю, это компилятор такой крутой!
1
98 / 64 / 36
Регистрация: 14.10.2018
Сообщений: 152
24.11.2018, 16:33
У меня все компилируется. Попробуйте так:
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<cstring>
using namespace std;
 
class Part {
private:
    char partname[20];
    int partnumber;
    double cost;
public:
    //Part() artname("0"), partnumber(0), cost(0)
    //{}
 
    void setPart(const char pname[], int ptn, double cst) { //Добавил const 
        strcpy(partname, pname);
        partnumber = ptn;
        cost = cst;
    }
 
    void display() {
        cout << "\nname part " << partname;
        cout << " number " << partnumber << " cost " << cost;
    }
};
 
int main() {
    ;
    Part par1;
    par1.setPart("model", 20, 350);
    par1.display();
    return 0;
}
1
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 14
24.11.2018, 17:51  [ТС]
Спасибо! За ответ. Мне просто интересно это ошибка в книге? или просто изменения правил языка? До главы с указателями еще не добрался, но вот читаю по порядку.
Сообщения компилятора в общем то было понятно.
Part par1;
char mas[]="model";
par1.setPart(mas, 20, 350);
par1.display();
return 0;
Просто интересно, что такая схема работает и он не ругается.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.11.2018, 18:38
Лучший ответ Сообщение было отмечено SergeySerd как решение

Решение

Цитата Сообщение от SergeySerd Посмотреть сообщение
Мне просто интересно это ошибка в книге?
Это не ошибка в книге. Но некоторая вольность авторов. Вообще правила языка не разрешают неявно снимать константность, и так было в С++ всегда. Но для конкретно char-литералов некоторые компиляторы реализовывали небольшое отступление, чтобы иметь совместимость с очень старым кодом на С. В общем-то Лафоре не прав, что его использует. Т.е. этот код в книге под какой-то конкретный компилятор, который использовал автор.

Добавлено через 3 минуты
Цитата Сообщение от SergeySerd Посмотреть сообщение
Просто интересно, что такая схема работает и он не ругается.
Такая схема - это принципиально другое.
Здесь у нас создается массив на стеке (и он не константен), который инициализируется значением строкового литерала (который в свою очередь находится в статической памяти). А в первом варианте мы сразу получаем указатель на эту статическую память, и эта память для строковых литералов как правило защищена от записи. Поэтому передача этого указателя как указателя на неконстанту чревато серьезными проблемами, т.к. компилятор уже не сможет проконтролировать отсутствие записи по этому указателю. Ваш компилятор совершенно верно поступает, что запрещает такой код.

Добавлено через 4 минуты
SergeySerd, Да, и не ждите от Лафоре точности. Книга ширпотреб и на слуху только из-за понятного новичкам изложения (уж не знаю почему так). Но что касается качества информации в ней, то зачастую оно довольно низкое, неполное и вводящее в заблуждение. Примеры неудачные и противоречивые. Имейте это ввиду. По-хорошему, если С++ будет вашим языком для заработка, то лучше потом найти книгу получше.
1
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 14
24.11.2018, 18:54  [ТС]
Посоветуйте пожалуйста тогда что-то по-лучше. Если можно не шибко древнее.
С универа еще осталась книга старая Джесса Либерти с++ за 21 день
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.11.2018, 19:59
SergeySerd, Липпман (предпочтительнее) - "Язык программирования C++. Базовый курс", или Прата - "Язык программирования C++. Лекции и упражнения". Обе книги затрагивают современный C++.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2018, 19:59
Помогаю со студенческими работами здесь

Передачу аргументов в функцию по константному указателю
Собственно, тривиальный пример с тривиальным вопросом, который вскрыл мое незнание. Почему выводит 5, а не 42? #include...

Как вычесть из значений массива константу?
Как вычесть из значений массива константу?

Как реализовать передачу массива из одного фрагмента в другой
Здравствуйте, как реализовать передачу массива из одного фрагмента в другой?

Как из всех элементов динамического массива вычесть константу?
Всем привет, хотел спросить о том, как из всех элементов массива вычесть константу и вывести это в консоле или окне? массив динамический, и...

И вновь про передачу данных из одной формы в другую
Вопрос тривиальный и много раз уже поднимался на форуме но 2 день не могу его решить. Есть 2 формы - родительская MaR и дочерняя...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru