Wywołanie funkcji i zmienne globalne

0

Witam piszę program, który wykonuje pewne obliczenie. Funkcje, która liczy napisałem bez najmniejszych problemów, jednak gdy próbuję ją wywołać w mainie, wyskakuje błąd:
"Field 'Program.t' is never assigned to, and will allways have its default value 0" oraz "An object reference is required for the non - static field, method, or property 'Program.licz()'"
O co chodzi? Dlaczego nie mogę wywoływać funkcji w metodzie statycznej? I dlaczego wywala mi błąd, gdy próbuję odnieść się do zmiennej globalnej w mainie?

0

Hej. A może kod dasz? ;)

0
Panna Olga napisał(a):

Witam piszę program, który wykonuje pewne obliczenie. Funkcje, która liczy napisałem bez najmniejszych problemów, jednak gdy próbuję ją wywołać w mainie, wyskakuje błąd:
"Field 'Program.t' is never assigned to, and will allways have its default value 0" oraz "An object reference is required for the non - static field, method, or property 'Program.licz()'"
O co chodzi? Dlaczego nie mogę wywoływać funkcji w metodzie statycznej? I dlaczego wywala mi błąd, gdy próbuję odnieść się do zmiennej globalnej w mainie?

Edit: zapomniałem wrzucić kodu, proszę:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wylicz_t
{
class Program
{
static public List<double> zmienne = new List<double>();
double t; double h; double fi;

    double licz()
    {
        Console.WriteLine("Podaj fi: "); Console.WriteLine("Podaj h: "); h = Console.Read(); fi = Console.Read();

        zmienne.Add(t); zmienne.Add(fi); zmienne.Add(h);
        Console.WriteLine("Podaj h: "); Console.WriteLine("Podaj fi: ");
        var kp = Math.Atan(45 + (fi / 2)) * Math.Atan(54 + (fi / 2) );
        double rozwiazanie = Math.Pow(t, 3) * (Math.Pow(kp, 2) - 1) - 3 * Math.Pow(t, 2) * h - 3 * t * Math.Pow(h, 2) - Math.Pow(h, 3);

        if (rozwiazanie != 0)
          {
                while (rozwiazanie > 0)
                {
                      rozwiazanie--;
                }

            if (rozwiazanie < 0)
            {
                while (rozwiazanie < 0)
                {
                    rozwiazanie++;
                }
            }
          }
     else
        {
            Console.WriteLine("t = ");
            Console.Write(t);
        }

        return t;
    }

    static void Main(string[] args)
    {
        licz();
    }
}

}

0
Panna Olga napisał(a):
Panna Olga napisał(a):

Witam piszę program, który wykonuje pewne obliczenie. Funkcje, która liczy napisałem bez najmniejszych problemów, jednak gdy próbuję ją wywołać w mainie, wyskakuje błąd:
"Field 'Program.t' is never assigned to, and will allways have its default value 0" oraz "An object reference is required for the non - static field, method, or property 'Program.licz()'"
O co chodzi? Dlaczego nie mogę wywoływać funkcji w metodzie statycznej? I dlaczego wywala mi błąd, gdy próbuję odnieść się do zmiennej globalnej w mainie?

Edit: zapomniałem wrzucić kodu, proszę:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wylicz_t
{
class Program
{
static public List<double> zmienne = new List<double>(); //PO CO?
double t; double h; double fi;

    double licz()
    {
        Console.WriteLine("Podaj fi: "); Console.WriteLine("Podaj h: "); h = Console.Read(); fi = Console.Read(); //ZŁA KOLEJNOŚĆ

        zmienne.Add(t); zmienne.Add(fi); zmienne.Add(h); //PO CO?
        Console.WriteLine("Podaj h: "); Console.WriteLine("Podaj fi: "); // ?
        var kp = Math.Atan(45 + (fi / 2)) * Math.Atan(54 + (fi / 2) );
        double rozwiazanie = Math.Pow(t, 3) * (Math.Pow(kp, 2) - 1) - 3 * Math.Pow(t, 2) * h - 3 * t * Math.Pow(h, 2) - Math.Pow(h, 3);

        if (rozwiazanie != 0)
          {
                while (rozwiazanie > 0)
                {
                      rozwiazanie--;
                }

            if (rozwiazanie < 0)
            {
                while (rozwiazanie < 0)
                {
                    rozwiazanie++;
                }
            }
          }
     else
        {
            Console.WriteLine("t = ");
            Console.Write(t);
        }

        return t;
    }

    static void Main(string[] args)
    {
        licz();
    }
}

}

0

@Min0s Lista przyda mi się przy rozbudowie programu, więc od razu ją zrobiłem żeby do tego nie wracać. Oprócz tego są jakieś błędy? Bo przy kompilacji nadal to samo. ;/

0

@Min0s A jak się definiuje zmienną i się ją wywoła to domyślnie nie ma w niej 0?

0

Próbujesz użyć metody licz() jak by była static a nie jest. To wygląda tak jak byś dodawała te static na czuja.
Tak pola klasy zawsze są inicjalizowane domyślnymi wartościami: https://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

0

@DibbyDum To jak poprawnie wywołać tą metodę? I dlaczego w mainie kiedy próbuję odwołać się do atrybutu, a nie zmiennej zdefiniowanej w funkcji wyskakuje błąd?

0

a gdyby zamiast

            if (rozwiazanie != 0)
              {
                    while (rozwiazanie > 0)
                    {
                          rozwiazanie--;
                    }

                if (rozwiazanie < 0)
                {
                    while (rozwiazanie < 0)
                    {
                        rozwiazanie++;
                    }
                }
              }
         else
            {
                Console.WriteLine("t = ");
                Console.Write(t);
            }

zrobic

if(rozwiazanie == 0)
{
    Console.WriteLine("t = 0");
}

to efekt bylby identyczny...
ogolnie to tak srednio sie to kompiluje ;) moze jakiegos kursu do c# poszukaj?

user image

0

@katelx ale t nie ma się równać 0 tylko zmienna rozwiązanie, a w całym programie chodzi o to żeby znaleźć t...

0

@katelx

a gdyby zamiast
if (rozwiazanie != 0)
{
while (rozwiazanie > 0)
{
t--;
}

            if (rozwiazanie < 0)
            {
                while (rozwiazanie < 0)
                {
                    t++;
                }
            }
          }
     else
        {
            Console.WriteLine("t = ");
            Console.Write(t);
        }

O to chodziło... Ale dlaczego nie można wywołać tej funkcji?

0

W swoim kodzie próbujesz wywołać metodę licz() klasy Program w tej klasie - czyli ta klasa, póki co,nie ma żadnej instancji - tak nie można.
Rozwiązanie: tworzysz drugą klasę i w tej klasie wstawiasz metodę licz() ( public ), następnie w klasie Program tworzysz obiekt tej klasy i wtedy możesz wywoływać metodę licz().

    class TempClass
    {
       public double licz()
        {

           /*
                miejsce na kod
           */

            Console.WriteLine("działa");
            Console.ReadKey();
            return -1;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            TempClass MyObject = new TempClass();
            MyObject.licz();
            
        }
    }

inne rozwiązanie to metoda statyczna, którą możesz wywołać bez instancji klasy

    class Program
    {
        static double licz()
        {

           /*
                miejsce na kod
           */

            Console.WriteLine("działa");
            Console.ReadKey();
            return -1;
        }

        static void Main(string[] args)
        {
            licz();
        }
    }

następna sprawa to sposób pobierania danych z klawiatury, moim zdaniem tak chyba byłoby lepiej:

    class Program
    {
        static double fi, h, t;
        static double licz()
        {

            Console.WriteLine("Podaj fi: ");
            fi = Convert.ToDouble(Console.ReadLine());
                
            Console.WriteLine("Podaj h: ");
            h = Convert.ToDouble(Console.ReadLine());

            return -1;
        }

        static void Main(string[] args)
        {
            licz();
        }
    }

I dochodzi kwestia tego co i jak chcesz obliczyć. W swoim kodzie liczysz :

var kp = Math.Atan(45 + (fi / 2)) * Math.Atan(54 + (fi / 2) );
double rozwiazanie = Math.Pow(t, 3) * (Math.Pow(kp, 2) - 1) - 3 * Math.Pow(t, 2) * h - 3 * t * Math.Pow(h, 2) - Math.Pow(h, 3);

"fi" i "h" pobierasz z klawiatury, a skąd masz wartość "t" ?

0

@hasfarantabolis program ma znaleźć wartość t, ponieważ po prawej stronie równania gdy wszystko będzie prawidłowo zapisane będzie 0.

Dziękuję wszystkim za pomoc! Już rozwiązałem swój problem!

1 użytkowników online, w tym zalogowanych: 0, gości: 1