web-dev-qa-db-fra.com

erreur: strcpy n'a pas été déclaré dans cette étendue

J'obtiens ce problème dans un problème c ++ qui se compile dans Ubuntu g ++ version 4.4.3. Je ne connais pas les en-têtes à inclure pour résoudre ce problème .. Merci

centro_medico.cpp: In constructor ‘Centro_medico::Centro_medico(char*, char*, int, int, float)’:
centro_medico.cpp:5: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘Centro_medico& Centro_medico::operator=(const Centro_medico&)’:
centro_medico.cpp:26: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘bool Centro_medico::quitar_medico(int)’:
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_especialidades(std::ostream&) const’:
centro_medico.cpp:123: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_horarios_consulta(char*) const’:
centro_medico.cpp:162: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::crea_medicos()’:
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’

medico.cpp

#include "medico.h"
#include <cstdlib>
#include <iostream>
#include <stdlib>  
#include<cstring>
#include<string>

long Medico::total_consultas=0; 
Medico::Medico(char *nom,char * espe,int colegiado,int trabajo)
{
int i;
strcpy(nombre,nom);
strcpy(especialidad,espe);
num_colegiado=colegiado;
num_horas_diarias=trabajo;
citas_medico= new Cita*[5]; // 5 Días de las semana, de Lunes a Viernes.
for (i=0;i<5;i++)
citas_medico[i]=new Cita[num_horas_diarias];
}



Medico::Medico(const Medico &m){
  int i;
  citas_medico=new Cita*[5];
  for (i=0;i<5;i++)
   citas_medico[i]=NULL;
 (*this) = m;
}

Medico &Medico::operator=(const Medico &m){
 int i,j;
 if (this != &m) { // Para evitar la asignación de un objeto a sí mismo
     strcpy(nombre,m.nombre);
     strcpy(especialidad,m.especialidad);     
     num_colegiado=m.num_colegiado;
     num_horas_diarias=m.num_horas_diarias;
     for (i=0;i<5;i++){
      delete citas_medico[i]; 
      citas_medico[i]=new Cita[num_horas_diarias];
      for(j=0;j<num_horas_diarias;j++){
       citas_medico[i][j] = m.citas_medico[i][j] ;
       }
     }     
  }
 return *this;
}

medico.h

#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
#include "cita.h"

class Medico
{
 private:
                char nombre[50];
                char especialidad[50];
                int num_colegiado;
                int num_horas_diarias;
                Cita **citas_medico;
                static long total_consultas;                
 public:
                void mostrar_calendario_citas(ostream &o=cout) const;
                bool asignar_cita(int d, int hor,Paciente *p=NULL);
                void anular_cita(int d, int hor);
                bool consultar_cita(char dni[10], int modificar=0);
                void modificar_cita(int d, int hor);                
                void vaciar_calendario_citas();
                void borrar_calendario_citas();                
                char* get_especialidad(char espec[50]) const;
                char* get_nombre(char n[50]) const;
                int get_num_colegiado() const;
                int get_num_horas() const;
                void set_num_horas(int horas);
                void mostrar_info(ostream &o=cout) const;
                static long get_total_consultas();
                Cita* operator[](int dia);
                void eliminar_calendario_citas();
                void crear_calendario_citas();    
                Medico(char *nom,char * espe,int colegiado,int trabajo);
                Medico(const Medico &m);
                Medico &operator=(const Medico &c);
                void operator delete(void*);
                ~Medico();
 };
 ostream& operator<<(ostream &o, Medico &c);
 ofstream& operator<<(ofstream &fichero, Medico &m);
 ifstream& operator>>(ifstream &fichero, Medico &m);
25
Chak

Observations:

  • #include <cstring> Devrait introduire std :: strcpy ().
  • using namespace std; (Comme écrit dans medico.h) introduit tous les identifiants de std:: Dans l'espace de noms global.

Mis à part le fait que using namespace std; Est quelque peu maladroit une fois que l'application grandit (car elle introduit un tas de nombreux identifiants dans l'espace de noms global), et que vous ne devriez jamais utilisez using dans un fichier d'en-tête (voir ci-dessous!), using namespace n'affecte pas les identifiants introduits après l'instruction.

(using namespace std Est écrit dans l'en-tête, qui est inclus dans medico.cpp, mais #include <cstring> Vient après ça.)

Mon conseil: Mettez le using namespace std; Dans medico.cpp, après toutes les inclusions, et utilisez explicit std:: Dans medico.h.


strcmpi() n'est pas du tout une fonction standard; tout en étant défini sous Windows, vous devez résoudre les comparaisons insensibles à la casse différemment sous Linux.

(En termes généraux, je voudrais signaler cette réponse en ce qui concerne la gestion "correcte" des chaînes en C et C++ qui prend en compte Unicode, comme le devrait toute application. Résumé: La norme peut pas gérer ces choses correctement; faites utilisez ICU .)


warning: deprecated conversion from string constant to ‘char*’

Une "constante de chaîne" correspond à l'écriture d'un littéral de chaîne (par exemple "Hello") Dans votre code. Son type est const char[], C'est-à-dire un tableau de constant caractères (car vous ne pouvez pas changer les caractères). Vous pouvez affecter un tableau à un pointeur, mais l'affectation à char *, C'est-à-dire la suppression du qualificatif const, génère l'avertissement que vous voyez.


Clarification OT: using dans un fichier d'en-tête modifie la visibilité des identifiants pour quiconque y compris cet en-tête, ce qui n'est généralement pas ce que l'utilisateur de votre fichier d'en-tête veut. Par exemple, je pourrais utiliser std::string Et un ::string Autoécrit parfaitement dans mon code, à moins que j'inclue votre medico.h, car alors les deux les classes s'affronteront.

N'utilisez pas using dans les fichiers d'en-tête.

44
DevSolar

Quand tu dis:

 #include <cstring>

le compilateur g ++ devrait mettre le <string.h> déclarations qu'il inclut lui-même dans le std:: ET les espaces de noms globaux. Il semble que ce ne soit pas le cas. Essayez de remplacer une instance de strcpy par std::strcpy et voyez si cela résout le problème.

1
anon

Cette erreur se produit parfois dans une situation comme celle-ci:

#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif

static void init_random(uint32_t initseed=0)
{
    if (initseed==0)
    {
        struct timeval tv;
        gettimeofday(&tv, NULL);
        seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec);
    }
    else
        seed=initseed;
#if !defined(CYGWIN) && !defined(__INTERIX)
    //seed=42
    //SG_SPRINT("initializing random number generator with %d (seed size %d)\n", seed, RNG_SEED_SIZE)
    initstate(seed, CMath::Rand_state, RNG_SEED_SIZE);
#endif
}

Si les lignes de code suivantes ne s'exécutent pas au moment de l'exécution:

#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif

vous ferez face à une erreur dans votre code comme quelque chose comme suit; parce que initstate est placé dans le stdlib.h fichier et il n'est pas inclus :

In file included from ../../shogun/features/SubsetStack.h:14:0, 
                 from ../../shogun/features/Features.h:21, 
                 from ../../shogun/ui/SGInterface.h:7, 
                 from MatlabInterface.h:15, 
                 from matlabInterface.cpp:7: 
../../shogun/mathematics/Math.h: In static member function 'static void shogun::CMath::init_random(uint32_t)': 
../../shogun/mathematics/Math.h:459:52: error: 'initstate' was not declared in this scope
0
MRS1367