2010-02-08 4 views
21

Ich bekomme dieses Problem in einem C++ Problem Kompilieren in Ubuntu g ++ Version 4.4.3. ich nicht die Header kennen schließen dieses Problem .. DankeFehler: Strcpy wurde in diesem Bereich nicht deklariert

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

, was mit dem '# include' Missbrauch ist los? –

+1

formatieren Sie bitte Ihren Code, entfernen Sie alle unnötigen vertikalen Leerzeichen –

+0

Sieht aus wie Hausaufgaben für mich – Manuel

Antwort

37

Beobachtungen:

  • #include <cstring> sollte std :: strcpy() einzuführen.
  • using namespace std; (wie in medico.h geschrieben) führt alle Identifier von std:: in den globalen Namespace ein.

Abgesehen von using namespace std; sind etwas unbeholfen, sobald die Anwendung größer wird (wie es eine Hölle einer Menge von Identifikatoren in die globale Namespace führt), und dass Sie sollten nie Verwendung using in einer Header-Datei (siehe unten !), using namespace hat keinen Einfluss auf die eingegebenen Kennungen nach die Aussage.

(using namespace std im Header geschrieben, die in medico.cpp enthalten ist, aber #include <cstring> kommt nach dass.)

Mein Rat: die using namespace std; in medico.cpp Stoßen, nach jeder enthält, und verwenden Sie explizite std:: in medico.h.


strcmpi() ist überhaupt keine Standardfunktion; Während Sie unter Windows definiert sind, müssen Sie unter Linux verschiedene Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durchführen.

(On allgemein möchte ich this answer in Bezug auf die „richtige“ string in C und C++ Handhabung verweisen, die Unicode berücksichtigt, da jede Anwendung sollte Zusammenfassung:. Der Standard kann diese Dinge nicht korrekt verarbeiten ; tun Verwendung ICU)


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

A "String-konstante" ist, wenn Sie einen Stringliteral (zB "Hello") in Ihrem Code schreiben..Sein Typ ist const char[], d.h. Array von Konstante Zeichen (wie Sie die Zeichen nicht ändern können). Sie können einem Zeiger ein Array zuweisen, aber das Zuweisen an char *, d. H. Das Entfernen des const-Qualifiers, erzeugt die Warnung, die Sie sehen.


OT Klarstellung: using in einer Header-Datei ändert sich die Sichtbarkeit von Identifikatoren für jeden, der Header einschließlich, die in der Regel nicht, was der Benutzer Ihrer Header-Datei will. Zum Beispiel könnte ich std::string und eine selbstgeschriebene ::string nur perfekt in meinem Code verwenden, , es sei denn, ich schließe Ihre medico.h, weil dann die beiden Klassen kollidieren.

Verwenden Sie nicht using in Header-Dateien.

+0

Vielen Dank, ich denke, o das Problem zu lösen: 'strcmpi' wurde in diesem Bereich nicht deklariert Ich bekomme eine weitere Warnung: Warnung: veraltete Konvertierung von String-Konstante zu 'char *' – Chak

+1

Sorry, nicht Siehe die anderen zwei Warnungsarten. In der Regel behebe ich nur den ersten Fehler vor der Neukompilierung, da viele der nachfolgenden Fehler/Warnungen nach dem Lösen des obersten Problems immer wieder verschwinden. Ich habe meine Antwort auf die beiden anderen Fälle ausgedehnt. – DevSolar

+0

Vielen Dank !!! sehr hilfreich! – Chak

1

Wenn Sie zu lösen sagen:

#include <cstring> 

der g ++ Compiler setzen die <string.h> Erklärungen sollten sie sich in die std:: und die globalen Namensraum enthält. Es sieht aus irgendeinem Grund so aus, als würde es das nicht tun. Versuchen Sie, eine Instanz von strcpy durch std::strcpy zu ersetzen und sehen Sie, ob das das Problem behebt.

+0

Nicht korrekt. '' * does * setzt die Deklarationen in 'std ::', aber ob sie auch in den globalen Namespace eingefügt werden, hängt von der Implementierung ab. Ich bin mir nicht sicher, ob der Standard es sogar erlaubt, sie global zu setzen, aber ich bin sicher, dass es das nicht erfordert. – DevSolar

+0

Es erlaubt es, derzeit erfordert es nicht, und das Verhalten, über das ich sprach, war das von g ++. Auf meiner Installation (Version 4.4.1) macht es das, was ich gesagt habe. –

+0

Sorry, ich bin ein bisschen anal-retentiv, wenn es um die Sprachstandards geht. ;-) – DevSolar

0

Dieser Fehler manchmal in einer Situation wie diese auftritt:

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

Wenn die folgenden Codezeilen nicht in der Laufzeit ausgeführt werden:

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

Sie mit einem Fehler im Code konfrontiert sein werden wie etwas wie folgt; weil initstate im stdlib.h Datei platziert und ist es nicht enthalten:

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