2010-02-08 11 views
21

Je reçois ce problème dans un problème de compilation C++ dans Ubuntu g ++ version 4.4.3. Je ne sais pas les en-têtes d'inclure pour résoudre ce problème .. Mercierreur: strcpy n'a pas été déclaré dans cette portée

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); 
+2

ce qui est avec l'abus 'n de include'? –

+1

s'il vous plaît reformater votre code, en supprimant tous les espaces verticaux inutiles –

+0

ressemble à des devoirs pour moi – Manuel

Répondre

37

Observations:

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

En dehors de using namespace std; étant quelque peu maladroite, une fois l'application grossit (car il introduit un enfer d'un grand nombre d'identifiants dans l'espace de noms global), et que vous devriez jamais utiliser 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 que.)

Mon conseil: Mettre le using namespace std; dans medico.cpp, après tout comprend, et utiliser explicite std:: dans medico.h.


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

(Sur le plan général, je voudrais souligner this answer en ce qui concerne la chaîne « appropriée » manipulation en C et C++ qui prend Unicode en compte, comme chaque application devrait Résumé:. Le standard ne peuvent pas gérer ces choses correctement ; faire usage ICU)


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

une "chaîne constante" est quand vous écrivez une chaîne littérale (par exemple "Hello") dans votre code..Son type est const char[], c'est-à-dire un tableau de constantes caractères (car vous ne pouvez pas changer les caractères). Vous pouvez affecter un tableau à un pointeur, mais en affectant à char *, c'est-à-dire en supprimant le qualificatif const, génère l'avertissement que vous voyez.


clarification OT: using dans un fichier d'en-tête change la visibilité des identifiants pour tous ceux dont cet en-tête, ce qui 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 simplement écrit dans mon code, à moins que j'inclue votre medico.h, car alors les deux classes vont s'affronter. N'utilisez pas using dans les fichiers d'en-tête.

+0

Merci, je pense résoudre le problème de l'erreur: 'strcmpi' n'a pas été déclaré dans cette portée Je reçois un autre avertissement: avertissement: conversion obsolète de la chaîne constante à 'char *' – Chak

+1

Désolé, n'a pas voir les deux autres types d'avertissement. Habituellement, je ne corrige que la première erreur avant de recompiler, car souvent, beaucoup des erreurs/avertissements subséquents sont des suivis qui disparaissent une fois le problème le plus élevé résolu. J'ai étendu ma réponse pour couvrir les deux autres cas. – DevSolar

+0

Vous avez tant de plaisir !!! très utile! – Chak

1

Lorsque vous dire:

#include <cstring> 

le compilateur g ++ doit mettre les <string.h> déclarations qu'elle se comprend dans le std:: et les espaces de noms mondiaux. Il semble que ce soit pour une raison quelconque. Essayez de remplacer une instance de strcpy par std::strcpy et de voir si cela résout le problème.

+0

Non correct. '' * met * les déclarations dans 'std ::', mais si elles les placent ou non dans l'espace de noms global, cela dépend de l'implémentation. Je ne suis pas sûr que la norme permette même de les mettre globalement, mais je suis sûr que cela ne l'exige pas. – DevSolar

+0

Il l'autorise, actuellement ne l'exige pas, et le comportement dont je parlais était celui de g ++. Sur mon installation (version 4.4.1) ça fait ce que j'ai dit. –

+0

Désolé, je suis un peu anale-retentive quand il s'agit des normes de langue. ;-) – DevSolar

0

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 ci-dessous fonctionnent pas dans 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 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 
Questions connexes