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?
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();
}
}
}

- Rejestracja:ponad 10 lat
- Ostatnio:ponad 7 lat
- Postów:83
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(); } }
}
@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. ;/

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

- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Lokalizacja:Polska, Kraków
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
@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?

- Rejestracja:prawie 10 lat
- Ostatnio:4 miesiące
- Lokalizacja:Hong Kong
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?
@katelx ale t nie ma się równać 0 tylko zmienna rozwiązanie, a w całym programie chodzi o to żeby znaleźć t...
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?
- Rejestracja:prawie 12 lat
- Ostatnio:prawie 9 lat
- Postów:47
Tutaj masz swój przykład i rozwiązanie. http://www.c-sharpcorner.com/uploadfile/abhikumarvatsa/static-and-non-static-methods-in-C-Sharp/ ;)

- Rejestracja:ponad 9 lat
- Ostatnio:prawie 8 lat
- Postów:5
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" ?
@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!