QT creator Linux ошибка компиляции

374
25 мая 2017, 11:12

Пишу код в Qtcreator на Linux подключены библиотеки "safelib С" для работы bounds-checking при компиляции пишет ошибку

**ошибка: invalid conversion from ‘const char*’ to ‘rsize_t {aka long unsigned int}’ [-fpermissive] strcpy_s(m_Model, Model); ^

И ошибка

ошибка: too few arguments to function ‘errno_t strcpy_s(char*, rsize_t, const char*)’

#include "Header.h"
#include <iostream>
#include <cstring>
#include <safe_lib.h>
#include <safe_lib_errno.h>
#include <safe_mem_lib.h>
#include <safe_types.h>
#include <safe_str_lib.h>
using namespace std;
Weapon::Weapon() :
    m_pName(new char[1]),
    m_Power(0),
    m_Calibre(0)
{
    *m_pName = '\0'; m_Model[0] = '\0';
}
Weapon::Weapon(const char* Name, int Power, const char* Model, int Calibre) :
    m_pName(new char[strlen(Name) + 1]),
    m_Power(Power),
    m_Calibre(Calibre)
{
    strcpy_s(m_pName, strlen(Name) + 1, Name);
    strcpy_s(m_Model, Model); ------- тут ошибка
}
Weapon :: Weapon (const Weapon& Wep) :
    m_pName (new char [strlen (Wep.m_pName) + 1]),
    m_Power (Wep.m_Power),
    m_Calibre (Wep.m_Calibre) {
    strcpy_s (m_pName, strlen (Wep.m_pName) + 1, Wep.m_pName);
    strcpy_s (m_Model, Wep.m_Model, ) ;
}
Weapon:: ~Weapon()
{
    delete m_pName;
}
void Weapon :: setName (const char* pName) {
    delete [ ] m_pName ;
    m_pName = new char [strlen (pName) + 1] ;
    strcpy_s (m_pName, strlen (pName) + 1, pName) ;}

void Weapon::setModel(const char* Model) 
{
    strcpy_s(m_Model, Model, );
}
void Weapon::setPower(int Power) 
{
    m_Power = Power;
}
void Weapon::setCalibre(int Calibre)
{
    m_Calibre = Calibre;
}
char* Weapon :: getName ( ) const {
    return m_pName;}
char* Weapon :: getModel ( ) const 
{
    return const_cast <char*> (m_Model) ;
}
int Weapon::getPower() const 
{
    return m_Power;
}
int Weapon::getCalibre() const 
{
    return m_Calibre;
}

bool Weapon :: checkName (const char* p) const
{
    return ! strcmp (m_pName, p) ;
}
Answer 1

В ошибке прямым текстом написано, что strcpy_s принимает 3 аргумента, а не 2. https://msdn.microsoft.com/ru-ru/library/td1esda9.aspx

Answer 2
errno_t strcpy_s(  
   char *strDestination,  // <- Куда копировать
   size_t numberOfElements,  // <- Размер строкового буфера назначения в единицах char для узкой и многобайтовых функций и в единицах wchar_t для расширенных функций (https://msdn.microsoft.com/ru-ru/library/td1esda9.aspx)
   const char *strSource // <- откуда
);  

Далее перегруженная шаблонная функция с двумя параметрами. Работает аналагично, если я правильно понял, но только там, где поддерживается c++. И второй параметр уходит в шаблон - это максимальный размер строкового буффера, использующийся при копировании.

template <size_t size>  
errno_t strcpy_s(  
   char (&strDestination)[size],  
   const char *strSource   
); // C++ only  

Итого, если у вас поддерживается C++ (Что вероятно) надо делать так:

size_t len = strlen (Model)
strcpy_s<len>(m_Model, Model);

Или так, что одно и тоже.

size_t len = strlen (Model)
strcpy_s(m_Model, len, Model);

Приблизительно так.

READ ALSO
Xcode CИ printf не работает без переноса строки

Xcode CИ printf не работает без переноса строки

Наблюдается только в среде xcode , в языках C и С++, вывод происходит только если дописывать \n или endl в конце каждого выводаНапример в таком коде...

360
Как сделать подмену двух номеров на сайте

Как сделать подмену двух номеров на сайте

Как сделать подмену двух номеров на сайте используя динамический коллтрекинг Mango Office?

403
работа js в файле, вставленном через &ldquo;.load&rdquo;

работа js в файле, вставленном через “.load”

Столкнулся с проблемой, если вставляю файл на страницу через такую конструкцию:

269
Показ картинки при вводе слова

Показ картинки при вводе слова

Доброго времени суток

385