2010-02-08 40 views
21

मुझे यह समस्या Ubuntu g ++ संस्करण 4.4.3 में संकलित एक C++ समस्या में मिलता है। मैं हेडर नहीं जानता इस समस्या को हल करने के लिए शामिल करने के लिए .. धन्यवादत्रुटि: इस स्कोप में strcpy घोषित नहीं किया गया था

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

क्या '# include' दुरुपयोग के साथ हो रहा है? –

+1

कृपया अपने कोड को दोबारा सुधारें, सभी अनावश्यक वर्टिकल व्हाइटस्पेस को हटाएं –

+0

मुझे होमवर्क की तरह लगता है – Manuel

उत्तर

37

टिप्पणियों:

  • #include <cstring> std :: strcpy परिचय चाहिए()।
  • using namespace std; (जैसा कि medico.h में लिखा गया है) वैश्विक नामस्थान में std:: से किसी भी पहचानकर्ता का परिचय देता है।
एक तरफ using namespace std; से

कुछ हद तक अनाड़ी जा रहा है एक बार आवेदन बड़ा बढ़ता है (क्योंकि यह ग्लोबल नेम स्पेस में पहचानकर्ता का एक बहुत से एक नरक का परिचय), और आप एक हेडर फाइल में कभी नहीं उपयोग using (नीचे देखें चाहिए कि !), using namespace कथन के बाद पहचानकर्ताओं को प्रभावित नहीं करता है।

(using namespace std हैडर, जो medico.cpp में शामिल है में लिखा है, लेकिन #include <cstring> उसके बाद आता है।)

मेरी सलाह: किसी भी शामिल है के बाद medico.cpp में using namespace std;, रखो, और medico.h में स्पष्ट std:: का उपयोग करें।


strcmpi() बिल्कुल मानक कार्य नहीं है; विंडोज़ पर परिभाषित होने पर, आपको लिनक्स पर अलग-अलग केस-असंवेदनशील तुलनाओं को हल करना होगा।

(सामान्य शब्दों पर, मैं, C और C++ कि खाते में यूनिकोड लेता में से निपटने के "उचित" स्ट्रिंग के संबंध में this answer को इंगित करना चाहते हैं हर आवेदन के रूप में होना चाहिए सारांश:। मानक नहीं इन बातों को सही ढंग से संभाल कर सकते हैं ; उपयोग ICU करना)


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

ए 'स्ट्रिंग निरंतर "है जब आप अपने कोड में एक स्ट्रिंग शाब्दिक (जैसे "Hello") लिखें।।इसका प्रकार const char[] है, i.e. निरंतर वर्णों (जैसे आप वर्णों को नहीं बदल सकते हैं) का सरणी है। आप एक सूचक को एक सरणी असाइन कर सकते हैं, लेकिन char * को असाइन कर सकते हैं, यानी const क्वालीफायर को हटाकर, जो चेतावनी आप देख रहे हैं उसे उत्पन्न करती है।


OT स्पष्टीकरण: using एक हेडर फाइल में है कि शीर्ष लेख, जो आमतौर पर क्या आपके हेडर फाइल के उपयोगकर्ता चाहता है नहीं है सहित किसी के लिए पहचानकर्ता की दृश्यता बदल जाता है। उदाहरण के लिए, मैं std::string और एक स्व-लिखित ::string का उपयोग अपने कोड, में पूरी तरह से कर सकता हूं जब तक कि मैं आपका medico.h शामिल नहीं करता, क्योंकि तब दो वर्ग संघर्ष करेंगे।

शीर्षलेख फ़ाइलों में using का उपयोग न करें।

+0

धन्यवाद, मुझे लगता है कि त्रुटि की समस्या को हल करें: 'strcmpi' को इस दायरे में घोषित नहीं किया गया था मुझे एक और चेतावनी मिलती है: चेतावनी: स्ट्रिंग स्थिर से 'char *' – Chak

+1

क्षमा नहीं किया गया, क्षमा नहीं किया गया था अन्य दो चेतावनी प्रकार देखें। मैं आमतौर पर पुनः संकलन से पहले केवल पहली त्रुटि को ठीक करता हूं, क्योंकि बाद में कई त्रुटियों/चेतावनियां फॉलो-अप होती हैं जो शीर्ष समस्या को हल करने के बाद गायब हो जाती हैं। मैंने दूसरे जवाब को कवर करने के लिए अपना जवाब बढ़ाया। – DevSolar

+0

आपको बहुत मज़ाकिया !!! काफी सहायक! – Chak

1

जब आप कहें:

#include <cstring> 

जी ++ कंपाइलर को <string.h> घोषणाओं को std:: और वैश्विक नामस्थानों में शामिल करना चाहिए। यह किसी कारण की तलाश में है जैसे कि यह ऐसा नहीं कर रहा है। के std::strcpy के साथ एक उदाहरण को बदलने का प्रयास करें और देखें कि क्या समस्या हल हो रही है या नहीं।

+0

सही नहीं है। '' * * घोषणाओं को 'std ::' में डालता है, लेकिन चाहे वह उन्हें वैश्विक नामस्थान में रखता है या नहीं, कार्यान्वयन पर निर्भर करता है। मुझे यकीन नहीं है कि मानक उन्हें वैश्विक में भी रखने की इजाजत देता है, लेकिन मैं सकारात्मक हूं कि इसे * की आवश्यकता नहीं है। – DevSolar

+0

यह इसकी अनुमति देता है, वर्तमान में इसकी आवश्यकता नहीं है, और जिस व्यवहार के बारे में मैं बात कर रहा था वह g ++ का था। मेरी स्थापना पर (संस्करण 4.4.1) यह मैंने जो कहा है करता है। –

+0

क्षमा करें, जब भाषा मानकों की बात आती है तो मैं थोड़ा गुस्से में हूं। ;-) – DevSolar

0

यह त्रुटि कभी कभी इस तरह एक स्थिति में होता है:

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

आप अपने कोड में एक त्रुटि के साथ सामना करेंगे:

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

निम्नलिखित कोड लाइनों रन-टाइम में नहीं चलाते हैं निम्नानुसार कुछ की तरह; क्योंकि initstatestdlib.h फ़ाइल में रखा है और यह शामिल नहीं है:

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 
संबंधित मुद्दे