2010-02-08 18 views
21

Otrzymuję ten problem w kompilacji C++ w Ubuntu g ++ wersja 4.4.3. nie wiem nagłówki zawierać rozwiązać ten problem .. Dziękierror: strcpy nie został zadeklarowany w tym zakresie

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

co się dzieje z '# include' nadużyć? –

+1

proszę ponownie sformatować swój kod, usuwając wszystkie niepotrzebne pionowe spacje. –

+0

Wygląda jak praca domowa dla mnie – Manuel

Odpowiedz

37

Uwagi:

  • #include <cstring> powinien wprowadzać std :: strcpy().
  • using namespace std; (jak napisano w medico.h) wprowadza wszystkie identyfikatory z std:: do globalnej przestrzeni nazw.

Oprócz using namespace std; jest nieco niezdarny, gdy aplikacja rośnie większe (ponieważ wprowadza jedną cholernie dużo identyfikatorów w globalnej przestrzeni nazw), a które powinny nigdy użycie using w pliku nagłówkowym (patrz niżej !), using namespace nie wpływa na identyfikatory wprowadzone po oświadczeniu.

(using namespace std jest napisane w nagłówku, który jest zawarty w medico.cpp, ale #include <cstring> pochodzi po tym.)

Moja rada: Umieść using namespace std; do medico.cpp, każdy zawiera po i użyj jawnie std:: w medico.h.


strcmpi() nie jest funkcją standardową; podczas definiowania w systemie Windows, musisz rozwiązać problem niewrażliwych na wielkość liter porównując w różny sposób w systemie Linux.

(na zasadach ogólnych, chciałbym wskazać na this answer w odniesieniu do „właściwego” ciąg obsługi w C i C++, które odbywają Unicode pod uwagę, jak każdy wniosek powinien. Podsumowanie: Standardowy nie może obsługiwać te rzeczy poprawnie ; zrobić korzystanie ICU)


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

a "ciąg stały" jest wtedy, gdy piszesz ciąg literalną (np "Hello") w kodzie..Jego typ to const char[], tj. Tablica o stałych stałych znaków (ponieważ nie można zmienić znaków). Tablicę można przypisać do tablicy, ale przypisanie jej do char *, tj. Usunięcie kwalifikatora const, generuje ostrzeżenie, które widzisz.


OT wyjaśnienie: using w pliku nagłówkowym zmienia widoczności identyfikatorów dla każdego, w tym nagłówek, który zwykle nie jest to, co użytkownik chce nagłówka pliku. Na przykład mogę użyć std::string i samodzielnie napisanego ::string po prostu idealnie w moim kodzie, , chyba że dołączę twój medico.h, ponieważ wtedy dwie klasy będą się kolidować.

Nie używaj using w plikach nagłówkowych.

+0

Dziękuję, myślę o rozwiązać problem błędu: "strcmpi" nie został zadeklarowany w tym zakresie Otrzymuję kolejne ostrzeżenie: Ostrzeżenie: przestarzała konwersja ze stałej ciągów na "char *" – Chak

+1

Niestety, nie zobacz pozostałe dwa typy ostrzeżeń. Zwykle naprawiam tylko pierwszy błąd przed ponowną kompilacją, ponieważ często wiele późniejszych błędów/ostrzeżeń jest kontynuacją, które znikają, gdy najwyższy problem zostanie rozwiązany. Rozszerzyłem swoją odpowiedź, aby objąć pozostałe dwa przypadki. – DevSolar

+0

Dziękuję bardzo! bardzo pomocny! – Chak

1

kiedy na przykład:

#include <cstring> 

Kompilator g ++ powinien umieścić deklaracje <string.h>, które sam zawiera, do std:: ORAZ globalnych przestrzeni nazw. Wygląda na to z jakiegoś powodu, jakby tego nie robił. Spróbuj zastąpić jedno wystąpienie strcpy przez std::strcpy i sprawdź, czy to rozwiąże problem.

+0

Nie zgadza się. '' * does * umieszcza deklaracje w 'std ::', ale to, czy umieszcza je w globalnej przestrzeni nazw, zależy od implementacji. Nie jestem pewien, czy standard pozwala nawet na wprowadzenie ich w świat, ale jestem pewien, że to nie * wymaga *. – DevSolar

+0

Pozwala na to, obecnie nie wymaga tego, a zachowanie, o którym mówiłem było g ++. W mojej instalacji (wersja 4.4.1) robi to, co powiedziałem. –

+0

Przepraszam, jestem trochę analna, jeśli chodzi o standardy językowe. ;-) – DevSolar

0

Ten błąd często występuje w takiej sytuacji:

#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 
} 

Jeśli następujące linie kodu nie działają w czasie wykonywania:

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

spotkasz się z powodu błędu w kodzie jak coś w następujący sposób; bo initstate jest umieszczony w stdlib.h pliku i nie jest wliczone:

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 
Powiązane problemy