18

Вопрос по c++ – «не было объявлено в этой области» ошибка

Итак, я писал эту простую программу для вычисления дня любой даты, используя найденный алгоритм ГауссаВот.

#include <iostream>
using namespace std;

//Using the Gaussian algorithm
int dayofweek(int date, int month, int year ){
    int d=date;
    if (month==1||month==2)
        {int y=((year-1)%100);int c=(year-1)/100;}
    else
        {int y=year%100;int c=year/100;}
    int m=(month+9)%12+1;
    int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c);
    return product%7;
}

int main(){
    cout<<dayofweek(19,1,2054);
    return 0;
}

Это очень простая программа, и что еще более удивительно, так это результат.

:In function  dayofweek(int, int, int)’:
:19: warning:  unused variable ‘y’
:19: warning: unused variable ‘c’
:21: warning: unused variable ‘y’
:21: warning: unused variable ‘c’
:23: error: ‘y’ was not declared in this scope
:25: error: ‘c’ was not declared in this scope

Он говорит, что моя переменная не используется, но затем говорит, что она не объявлена? Может кто-нибудь, пожалуйста, скажите мне, что не так.

  • Возможно, вы захотите ввести описание того, почему это решает проблему.

    от
  • Локальные переменные не видны за пределами{} блок, где они объявлены.

    от DCoder
5 ответов
  • -2

    Code:

    #include <iostream>
    using namespace std;
    class matrix
    {
        int a[10][10],b[10][10],c[10][10],x,y,i,j;
        public :
            void degerler();
            void ters();
    };
    void matrix::degerler()
    {
        cout << "Satırları giriniz: "; cin >> x;
        cout << "Sütunları giriniz: "; cin >> y;
        cout << "İlk matris elamanlarını giriniz:\n\n";
        for (i=1; i<=x; i++)
        {
            for (j=1; j<=y; j++)
            {
                cin >> a[i][j];
            }
        }
        cout << "İkinci matris elamanlarını giriniz:\n\n";
        for (i=1; i<=x; i++)
        {
            for (j=1; j<=y; j++)
            {
                cin >> b[i][j];
            }
        }
    }
    
    void matrix::ters()
    {
        cout << "matrisin tersi\n";
        for (i=1; i<=x; i++)
        {
            for (j=1; j<=y; j++)
            {
        if(i==j)
        {
        b[i][j]=1;
        }
        else
        b[i][j]=0;
        }
    }
    float d,k;
        for (i=1; i<=x; i++)
        {
        d=a[i][j];
            for (j=1; j<=y; j++)
            {
        a[i][j]=a[i][j]/d;
                b[i][j]=b[i][j]/d;
        }
            for (int h=0; h<x; h++)
            {
                if(h!=i)
        {
           k=a[h][j];
                   for (j=1; j<=y; j++)
                   {
                        a[h][j]=a[h][j]-(a[i][j]*k);
                        b[h][j]=b[h][j]-(b[i][j]*k);
                   }
        }
        count << a[i][j] << "";
        }
        count << endl;
    }  
    }
    int main()
    {
        int secim;
        char ch;    
        matrix m;
        m.degerler();
        do
         {
        cout << "seçiminizi giriniz\n";
        cout << " 1. matrisin tersi\n";
        cin >> secim;
        switch (secim)
        {
            case 1:
                m.ters();
                break;
        }
        cout << "\nBaşka bir şey yap/n?";
        cin >> ch;
        }
        while (ch!= 'n');
        cout << "\n";
        return 0;
    }
    

  • 12

    Область действия переменной - это всегда блок

    внутри которого она находится. Например, если вы делаете что-то вроде

    if(...)
    {
         int y = 5; //y is created
    } //y leaves scope, since the block ends.
    else
    {
         int y = 8; //y is created
    } //y leaves scope, since the block ends.
    
    cout << y << endl; //Gives error since y is not defined.
    

    Решение состоит в том, чтобы определить y вне блоков if

    int y; //y is created
    
    if(...)
    {
         y = 5;
    } 
    else
    {
         y = 8;
    } 
    
    cout << y << endl; //Ok
    

    В вашей программе вы должны переместить определение y и c из блоков if в более высокую область видимости. Ваша функция тогда будет выглядеть так:

    //Using the Gaussian algorithm
    int dayofweek(int date, int month, int year )
    {
        int y, c;
        int d=date;
    
        if (month==1||month==2)
        {
             y=((year-1)%100);
             c=(year-1)/100;
        }
        else
        {
             y=year%100;
             c=year/100;
        }
    int m=(month+9)%12+1;
    int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c);
    return product%7;
    }
    

  • 2

    Вам нужно объявить y и c вне области действия оператора if / else. Пер

    еменная действительна только в той области, в которой она объявлена (и область помечена {})

    #include <iostream> 
    using namespace std; 
    //Using the Gaussian algorithm 
    int dayofweek(int date, int month, int year ){ 
    int d=date; 
    int y, c;
    if (month==1||month==2) 
            {y=((year-1)%100);c=(year-1)/100;} 
    else 
            {y=year%100;c=year/100;} 
    int m=(month+9)%12+1; 
    int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c); 
    return product%7; 
    } 
    
    int main(){ 
    cout<<dayofweek(19,1,2054); 
    return 0; 
    } 
    

  • 3

    Вот упрощенный пример, основанный на вашей проблеме:

    if (test) 
    {//begin scope 1
        int y = 1; 
    }//end scope 1
    else 
    {//begin scope 2
        int y = 2;//error, y is not in scope
    }//end scope 2
    int x = y;//error, y is not in scope
    

    В приведенной выше версии у вас есть переменная с именемy которая ограничена областью действия 1, и другой другой переменной, называемойy это ограничено областью 2. Затем вы пытаетесь обратиться к переменной с именемy после окончанияifи не такая переменнаяy можно увидеть, потому что в этой области не существует такой переменной.

    Вы решаете проблему, размещаяy во внешней области, которая содержит все ссылки на него:

    int y;
    if (test) 
    {
        y = 1; 
    }
    else 
    {
        y = 2;
    }
    int x = y;
    

    Я написал пример с упрощенным составленным кодом, чтобы вам было понятнее понять проблему. Теперь вы сможете применить этот принцип к своему коду.

  • 1

    Вот {int y=((year-1)%100);int c=(year-1)/100;}

    Вот

    {int y=((year-1)%100);int c=(year-1)/100;}
    

    вы объявляете и инициализируете переменныеy, c, но вы их вообще не использовали, пока они не вышли за рамки. Вот почему вы получаетеunused сообщение.

    Позже в функции,y, c являются незадекларированными, потому что сделанные вами заявления сохраняются только внутри блока, в котором они были сделаны (блок между фигурными скобками{...}).