Witam, mam taki problem z błędem jak w temacie. Czytałem co to oznacza, ale nie wiem do końca jak to się ma do mojego kodu. Błąd wyskakuje, gdy naciskam guzik by narysować wykres funkcji za pomocą punktów z utworzonej wcześniej tablicy. Próbowałem wpisać tak, żeby tylko 2 wartości były albo 90 albo 10, ale błąd ten sam jest.
Mogę prosić o podpowiedź, którą część mam źle?
VS zaznacza mi błąd przy tym fragmencie kodu:
public static float MaxFx(float[,] TabelaWartościFunkcji)
{
float WartośćMax;
int i;
WartośćMax = TabelaWartościFunkcji[0, 1];
for (i = 1; 1 < TabelaWartościFunkcji.GetLength(0); i++)
if (WartośćMax < TabelaWartościFunkcji[i, 1])
WartośćMax = TabelaWartościFunkcji[i, 1]; //TUTAJ komunikat błędu
return WartośćMax;
}
Pozostałe istotne fragmenty kodu.
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//nowe przestrzenie
using System.Drawing.Drawing2D;
using System.Text.RegularExpressions;
using System.Data.OleDb;
namespace ProjektFunckja
{
public partial class Form1 : Form
{
//--------------------------------------------------------------------------
const int Margines = 20; //odstep od krawędzi Rysownicy
//deklaracje zmiennych dla przechowania pobranych wartości danych wejściowych
float Xd;
float Xg;
float h;
int LiczbaPrzedziałówH;
static int Xe_max, Xe_min, Ye_max, Ye_min;
static float Xmax, Xmin, Ymax, Ymin;
Graphics Rysownica;
public float[,] TabelaWartościFunkcji;
//---------------------------------------------------------------------------
/*deklaracja klasy statycznej udostępniającej metody dla przeliczania
* współrzędnych rzeczywistych na współrzędne powierzchni graficznej*/
public static class PrzeliczanieWspółrzędnych
{
static float WspółczynnikSkaliDlaX, WspółczynnikSkaliDlaY;
static float PrzesunięcieX, PrzesunięcieY;
static PrzeliczanieWspółrzędnych() //konstruktor klasy statycznej
{
WspółczynnikSkaliDlaX = (Xe_max - Xe_min) / (Xmax - Xmin);
WspółczynnikSkaliDlaY = (Ye_max - Ye_min) / (Ymax - Ymin);
PrzesunięcieX = Xe_min - Xmin * WspółczynnikSkaliDlaX;
PrzesunięcieY = Ye_min - Ymin * WspółczynnikSkaliDlaY;
}
public static int WspX(float x)
{
return
(int)(WspółczynnikSkaliDlaX * x + PrzesunięcieX);
}
public static int WspY(float y)
{
return
(int)(WspółczynnikSkaliDlaY * y + PrzesunięcieY);
}
}
public static class MetodyStatyczne
{
//deklaracje metod statycznych
public static float MinFx(float[,] TabelaWartościFunkcji)
{
float WartośćMin;
int i;
WartośćMin = TabelaWartościFunkcji[0, 1];
for (i = 1; i < TabelaWartościFunkcji.GetLength(0); i++)
if (WartośćMin > TabelaWartościFunkcji[i, 1])
WartośćMin = TabelaWartościFunkcji[i, 1];
return WartośćMin;
}
public static float MaxFx(float[,] TabelaWartościFunkcji)
{
float WartośćMax;
int i;
WartośćMax = TabelaWartościFunkcji[0, 1];
for (i = 1; 1 < TabelaWartościFunkcji.GetLength(0); i++)
if (WartośćMax < TabelaWartościFunkcji[i, 1])
WartośćMax = TabelaWartościFunkcji[i, 1];
return WartośćMax;
}
}
bool PobierzDaneWejściowe(out float Xd, out float Xg, out float h)
{
//ustawienie domyślnych wartości dla parametrów wyjściowych
Xd = 0.0F;
Xg = 0.0F;
h = 0.0F;
//pobranie Xd
if (string.IsNullOrEmpty(txtXd.Text))
{
errorProvider1.SetError(txtXd,
"BŁĄD! Proszę podać wartość Xd - dolnej granicy przedziału");
return false;
}
else
errorProvider1.Dispose();
if (!float.TryParse(txtXd.Text, out Xd))
{
errorProvider1.SetError(txtXd,
"BŁĄD! W zapisie wartości Xd wystąpiły niedozwolone znaki");
return false;
}
else errorProvider1.Dispose();
txtXd.Enabled = false;
//pobranie Xg
if (string.IsNullOrEmpty(txtXg.Text))
{
errorProvider1.SetError(txtXg,
"BŁĄD! Proszę podać wartość Xg - górnej granicy przedziału");
return false;
}
else
errorProvider1.Dispose();
if (!float.TryParse(txtXg.Text, out Xg))
{
errorProvider1.SetError(txtXg,
"BŁĄD! W zapisie wartości Xg wystąpiły niedozwolone znaki");
return false;
}
else errorProvider1.Dispose();
txtXg.Enabled = false;
//pobranie kroku h
if (string.IsNullOrEmpty(txt_h.Text))
{
errorProvider1.SetError(txt_h,
"BŁĄD! Proszę podać wartość Xd - dolnej granicy przedziału");
return false;
}
else
errorProvider1.Dispose();
if (!float.TryParse(txtXd.Text, out h))
{
errorProvider1.SetError(txt_h,
"BŁĄD! W zapisie wartości Xd wystąpiły niedozwolone znaki");
return false;
}
else errorProvider1.Dispose();
txt_h.Enabled = false;
//sprawdzenie warunku wejściowego dla granic przedziału Xd i Xg
if (Xd > Xg)
{
errorProvider1.SetError(txtXg,
"BŁĄD! Wartość Xd - dolnej granicy przedziału"
+ "nie może być większa od Xg - górnej granicy przedziału");
return false;
}
else
errorProvider1.Dispose();
//sprawdzenie warunku wejściowego dla wartości kroku przyrostu h
/*if ((h <= 0.0) || (h >= 1.0))
{
errorProvider1.SetError(txt_h,
"BŁĄD! Przyrost h (krok zmian zmiennej X)"
+ "powinien być z przedziału (0,1)");
return false;
}
else
errorProvider1.Dispose();*/
txtXd.ReadOnly = true;
txtXg.ReadOnly = true;
txt_h.ReadOnly = true;
return true;
}
void TablicowanieWartościFunkcji(float[,] TabelaFunkcji, float Xd, float Xg, float h)
{
//deklaracje pomocnicze
float X; //zmienna X
int i; //numer punktu X w przedziale [Xd, Xg]
for (X = Xd, i = 0; i < TabelaFunkcji.GetLength(0); X = Xd + i * h, i++)
{
TabelaFunkcji[i, 0] = X;
TabelaFunkcji[i, 1] = ObliczenieFx(X);
}
}
private void btnWYKRES_Click(object sender, EventArgs e)
{
//sprawdzenie czy tabelka z wartościami funkcji została wcześniej utworzona
if (TabelaWartościFunkcji == null)
{
if (!PobierzDaneWejściowe(out Xd, out Xg, out h))
return;
LiczbaPrzedziałówH = (int)((Xg - Xd) / h + 1);
TabelaWartościFunkcji = new float[LiczbaPrzedziałówH + 1, 2];
TablicowanieWartościFunkcji(TabelaWartościFunkcji, Xd, Xg, h);
}
//rzeczywista płaszczyzna wykresu
Xmin = Xd;
Xmax = Xg;
Ymin = MetodyStatyczne.MinFx(TabelaWartościFunkcji);
Ymax = MetodyStatyczne.MaxFx(TabelaWartościFunkcji);
//wymiarowanie rysownicy
Xe_min = 0;
Xe_max = pbRysownica.Width;
Ye_min = 0;
Ye_max = pbRysownica.Height;
//utworzenie marginesów
Xe_max = Xe_max - (2 * Margines);
Xe_min = Margines;
Ye_min = Margines;
Ye_max = Ye_max - (2 * Margines);
btnWczytajArkusz.Visible = false;
btnOpenTabela.Visible = false;
txtŚcieżka.Visible = false;
txtArkusz.Visible = false;
pbRysownica.Visible = true;
dgvWartościFunkcji.Visible = false;
GrafikaPowitalna.Visible = false;
lblWelcome.Visible = false;
wynikiZTabelkiToolStripMenuItem.Enabled = false;
wykresFunkcjiToolStripMenuItem.Enabled = true;
//zdarzeniu Paint przypisujemy metodę pb_Rysownica_Paint
pbRysownica.Paint += new PaintEventHandler(pbRysownica_Paint);
pbRysownica.Refresh();
this.Refresh();
}
private void pbRysownica_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Color.Black, 2);
List<PointF> pktFunkcji = new List<PointF>();
for(float X = (float)Xmin; X <= Xmax; X ++)
{
pktFunkcji.Add(new PointF(X, (float)ObliczenieFx(X)));
}
pbRysownica.Visible = true;
}
pbRysownica.DrawLines(pen, pktFunkcji.ToArray());
private float ObliczenieFx(float X)
{
float Wynik = 0.0f;
if (Math.Abs(X) < 2.0)
{
Wynik = (float)Math.Pow(X + 2, 4);
}
else if (Math.Abs(X) >= 2)
{
Wynik = (float)(Math.Pow(X, 2) / Math.Log(X));
}
else
Wynik = (float)Math.Pow(Math.E, X);
return Wynik;
}