‘is niet gedeclareerd in dit bereik’ fout

Dus ik schreef dit eenvoudige programma om de dag van elke datum te berekenen met behulp van het Gauss-algoritme dat hier te vinden is .

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

Het is een heel eenvoudig programma en wat nog raadselachtiger is, is de uitvoer.

: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

Er staat dat mijn variabele ongebruikt is, maar zegt dan dat deze niet is gedeclareerd? Kan iemand me alsjeblieft vertellen wat er mis is.


Antwoord 1, autoriteit 100%

Het bereik van een variabele is altijd het blok waarin het zich bevindt. Als je bijvoorbeeld iets doet als

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.

De oplossing is om y buiten de if-blokken te definiëren

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

In je programma moet je de definitie van y en c uit de if-blokken naar het hogere bereik verplaatsen. Uw functie ziet er dan als volgt uit:

//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;
}

Antwoord 2, autoriteit 15%

Hier is een vereenvoudigd voorbeeld op basis van uw probleem:

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

In de bovenstaande versie heb je een variabele genaamd ydie beperkt is tot scope 1, en een andere andere variabele genaamd ydie beperkt is tot scope 2. Je probeert dan om te verwijzen naar een variabele met de naam yna het einde van de if, en niet zo’n variabele ykan worden gezien omdat een dergelijke variabele daarin niet bestaat bereik.

Je lost het probleem op door yin het buitenste bereik te plaatsen dat alle verwijzingen ernaar bevat:

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

Ik heb het voorbeeld geschreven met vereenvoudigde verzonnen code om het voor u duidelijker te maken om het probleem te begrijpen. U zou nu het principe op uw code moeten kunnen toepassen.


Antwoord 3, autoriteit 10%

U moet y en c declareren buiten het bereik van de if/else-instructie. Een variabele is alleen geldig binnen het bereik waarin het is gedeclareerd (en een bereik is gemarkeerd met { })

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

Antwoord 4, autoriteit 5%

Hier

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

je declareert en initialiseert de variabelen y, c, maar je gebruikt ze helemaal niet voordat ze buiten bereik zijn. Daarom krijg je het bericht unused.

Later in de functie zijn y, cniet gedeclareerd, omdat de declaraties die je hebt gemaakt alleen geldig zijn binnen het blok waarin ze zijn gemaakt (het blok tussen de accolades {...}).


Antwoord 5

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

Other episodes