2013-08-14 20 views
16

mam miech Klasa:error C2220: ostrzeżenie traktowane jako błąd - nie 'przedmiot' plik generowany

class Cdata12Mnt 
{ 
public: 
    char IOBname[ID1_IOB_PIOTSUP-ID1_IOB_TOP][BOADNAM_MAX + 4]; 
    char ExIOBname[ID1_MAX_INF-ID1_EXIOB_U1TOP][BOADNAM_MAX + 4]; 
    char cflpath[256]; 
    char basetext[256]; 
    UINT database[ID1_MAX_INF]; 
    int State; 

public: 
    char SelectPath[256]; 

public: 
    int GetIOBName(int slt,char *Name); 
    Cdata12Mnt(char *SelectPath); 
    virtual ~Cdata12Mnt(); 
    int  GetValue(int id); 
    int  GetState() { return State; } 
}; 

I mam funkcję jak poniżej:

Cdata12Mnt::Cdata12Mnt(char *SelectPath) 
{ 
    SCTReg reg; 
    char buf[256], *cpnt, *npnt, *bpnt1, *bpnt2; 
    char *startcode[] = {"CNTL_CODE ","SEGMENT "}; 
    char *stopcode = {"END_CNTL_CODE "}; 
    FILE *fp; 
    int  ii, infl; 

    State = 0; 

    for (ii = 0; ii < (ID1_IOB_PIOTSUP - ID1_IOB_TOP); ii++) { 
     strcpy(IOBname[ii], ""); 
    } 

    for (ii = 0; ii < (ID1_MAX_INF-ID1_EXIOB_U1TOP); ii++) { 
     **strcpy(ExIOBname[ii], "");** 
    } 

    sprintf(cflpath, "%s\\%s", SelectPath, CDATAFL); 

    if ((fp = fopen(cflpath,"r"))!=NULL) { 
     for (ii = 0, infl = 0; fgets(buf, 256, fp) != NULL;) { 
      if (infl == 0 && strncmp(buf, startcode[0], strlen(startcode[0])) == 0) { 
       if ((cpnt = strchr(&buf[strlen(startcode[0])],*startcode[1])) != NULL) { 
        if (strncmp(cpnt,startcode[1], strlen(startcode[1])) == 0) { 
         infl = 1; 
         continue; 
        } 
       } 
      } 

      if (infl == 0) { 
       continue; 
      } 

      if (strncmp(buf,stopcode,strlen(stopcode))==0) { 
       if (ii == ID1_EXIOB_U1TOP) { 
        for (int nDataNumber = ii; nDataNumber < ID1_MAX_INF; nDataNumber++) { 
         database[nDataNumber] = 0; 
        } 
       } 

       infl = 0; 
       continue; 
      } 

      if (strncmp(&buf[14], " DD ", 4) == 0) { 
       if ((cpnt=strchr(buf, ';')) != NULL) { 
        *cpnt = '\0'; 
       } 

       if (ii >= ID1_IOB_TOP && ii < ID1_IOB_PIOTSUP) { 
        if ((bpnt1 = strchr(cpnt + 1,'(')) != NULL && (bpnt2=strchr(cpnt + 1,')'))!=NULL && bpnt1 < bpnt2) { 
         *bpnt2 = '\0'; 
         *(bpnt1 + BOADNAM_MAX + 1) = '\0'; 
         strcpy(IOBname[ii-ID1_IOB_TOP], bpnt1 + 1); 
        } 
       } 

       if (ii >= ID1_EXIOB_U1TOP && ii < ID1_MAX_INF) { 
        if ((bpnt1 = strchr(cpnt + 1, '(')) != NULL && (bpnt2=strchr(cpnt+1,')'))!=NULL && bpnt1 < bpnt2) { 
          *bpnt2='\0'; 
          *(bpnt1+BOADNAM_MAX+1)='\0'; 
          strcpy(ExIOBname[ii-ID1_EXIOB_U1TOP], bpnt1 + 1); 
        } 
       } 

       for (cpnt = &buf[18]; cpnt != NULL;) { 
        if ((npnt=strchr(cpnt, ',')) != NULL) 
         *npnt='\0'; 
       } 

       if (strchr(cpnt,'H')!=NULL) { 
        sscanf(cpnt,"%XH",&database[ii]); 
       } else { 
        database[ii]=atoi(cpnt); 
       } 

       ii++; 
       cpnt = npnt; 

       if (cpnt != NULL) { 
        cpnt++; 
       } 
      } 
     } 
    } 

    fclose(fp); 
} else { 
    State=-1; 
} 

Kiedy skompilować tę funkcję wizualna studio 2008, daje mi błąd pod numerem strcpy(IOBname[ii],""); jako poniżej.

error C2220: ostrzeżenie traktowane jako błąd - nie 'przedmiot' plik generowany

jak naprawić ten błąd?

+3

Ustawienia projektu zawierają flagę informującą kompilator o traktowaniu ostrzeżeń jako błędów. Wyłącz tę flagę i będziesz mieć tylko oryginalne ostrzeżenie (cokolwiek to jest). –

+1

A przy okazji, dlaczego masz stary łańcuch w stylu C w projekcie C++? Użyj ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string), na dłuższą metę będzie działać znacznie lepiej. Ponadto, zamiast starych tablic w stylu C, użyj ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) (lub [' std :: vector'] (http : //en.cppreference.com/w/cpp/container/vector)). –

+2

Napraw swoje ostrzeżenia i będzie budować – paulm

Odpowiedz

9

Przejdź do project properties -> configurations properties -> C/C++ -> treats warning as error -> No (/WX-).

+17

Twoje rozwiązanie: "ślepo ignoruj ​​wszystkie ostrzeżenia"? – ereOn

+7

@mojtaba setoodeh, ignorowanie ostrzeżeń nie jest poprawką, ale obejściem. – TheFrancisOne

+2

Nieprawidłowe rozwiązanie! – vishal

2

Na marginesie można włączać i wyłączać poszczególne ostrzeżenia za pomocą #pragma. Można przyjrzeć się dokumentacji here

Z dokumentacji:

// pragma_warning.cpp 
// compile with: /W1 
#pragma warning(disable:4700) 
void Test() { 
    int x; 
    int y = x; // no C4700 here 
    #pragma warning(default:4700) // C4700 enabled after Test ends 
} 

int main() { 
    int x; 
    int y = x; // C4700 
} 
15

Błąd mówi, że ostrzeżenie było traktowane jako błąd. Dlatego Twój problem jest ostrzeżeniem! Sprawdź je i napraw.

W przypadku, gdy nie wiem, jak je znaleźć: Otwórz Error List (View>Error List) i kliknij Warning.

4

Ten komunikat o błędzie jest bardzo mylący. Po prostu stała innych „ostrzeżenia” w moim projekcie i naprawdę miał tylko jedną (proste jeden):

ostrzeżenie C4101: „I”: bez numeru referencyjnego zmiennej lokalnej

Po skomentował tę niewykorzystaną i i skompilował go, drugi błąd zniknął.

+4

Potwierdzam, że miałem podobny problem dzisiaj. Miał gdzieś ostrzeżenie "Nieosiągalny kod" plus ten mylący "nie" plik obiektowy "". Naprawienie nieosiągalnego ostrzeżenia również wyeliminowało drugi. Coś dziwnego. – Wurmloch