2015-05-18 3 views
2

Как скопировать значения из динамических текстовых полей в неровный массив? Я пробовал с циклом for, но я постоянно получаю это сообщение об ошибке: «Ссылка на объект не установлена ​​в экземпляр объекта». Что может быть проблемой? (В текстовых полях также сделаны с неровными массивами) Вот полный код, вы можете найти проблемные линии в первых строках обработчика button1 событий linkКопирование значений из динамического текстового поля в ошибку jagged array

for (int a = 0; a < nr; a++) 
     { 
      for (int b = 0; b < nr+ 1; b++) 
      { 
       array[a][b] =int.Parse(TB[a][b].Text); 
      } 
     } 

(Вот полный код :)

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 



      int ismeretlen = 2; 
      TextBox[][] TB; 
      string file = "3ismeretlen.dat"; 



     private void Form2_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int[][] egyenletek = new int[ismeretlen][]; 

      for (int a = 0; a < ismeretlen; a++) 
      { 
       for (int b = 0; b < ismeretlen + 1; b++) 
       { 
        egyenletek[a][b] =int.Parse(TB[a][b].Text); 

       } 
      } 

      int változószám = TB[0].Length; 
      for (int i = 0; i < változószám - 1; i++) 
      { 
       for (int j = i; j < változószám - 1; j++) 
       { 
        int[] d = new int[változószám]; 
        for (int x = 0; x < változószám; x++) 
        { 
         if (i == j && egyenletek[j][i] == 0) 
         { 
          bool changed = false; 
          for (int z = egyenletek.Length - 1; z > i; z--) 
          { 
           if (egyenletek[z][i] != 0) 
           { 
            int[] temp = new int[változószám]; 
            temp = egyenletek[z]; 
            egyenletek[z] = egyenletek[j]; 
            egyenletek[j] = temp; 
            changed = true; 
           } 
          } 
          if (!changed) 
          { 
           textBox1.Text += "Az egyenletrendszernek nincs megoldása!\r\n"; 
           return; 
          } 
         } 

         if (egyenletek[j][i] != 0) 
         { 
          d[x] = egyenletek[j][x]/egyenletek[j][i]; 
         } 
         else 
         { 
          d[x] = egyenletek[j][x]; 
         } 
        } 
        egyenletek[j] = d; 
       } 
       for (int y = i + 1; y < egyenletek.Length; y++) 
       { 
        int[] f = new int[változószám]; 
        for (int g = 0; g < változószám; g++) 
        { 
         if (egyenletek[y][i] != 0) 
         { 
          f[g] = egyenletek[y][g] - egyenletek[i][g]; 
         } 
         else 
         { 
          f[g] = egyenletek[y][g]; 
         } 
        } 
        egyenletek[y] = f; 
       } 
      } 
      double val = 0; 
      int k = változószám - 2; 
      double[] eredmény = new double[egyenletek.Length]; 
      for (int i = egyenletek.Length - 1; i >= 0; i--) 
      { 
       val = egyenletek[i][változószám - 1]; 
       for (int x = változószám - 2; x > k; x--) 
       { 
        val -= egyenletek[i][x] * eredmény[x]; 
       } 
       eredmény[i] = val/egyenletek[i][i]; 
       if (eredmény[i].ToString() == "NaN" || eredmény[i].ToString().Contains("Végtelen sok megoldás.")) 
       { 
        textBox1.Text += "Az egyenletrendszernek nincs megoldása!\n"; 
        return; 
       } 
       k--; 

       TextBox[] megoldás = new TextBox[ismeretlen]; 

       for (int b = 0; b < ismeretlen; i++) 
       { 

        megoldás[b] = new TextBox(); 
        megoldás[b].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
        megoldás[b].Left = 536+ b * 36; 
        megoldás[b].Top = 36 * b + 10; 
        megoldás[b].Width = 35; 
        megoldás[b].Font = new Font(megoldás[b].Font.FontFamily, 16); 
        megoldás[b].BackColor = Color.Cyan; 
        megoldás[b].TextAlign = HorizontalAlignment.Center; 
        megoldás[b].Text = eredmény[ismeretlen - 1].ToString(); 
        this.panel1.Controls.Add(megoldás[b]); 

       } 
       FileStream fs = new FileStream(file, FileMode.Create); 
       BinaryWriter bw = new BinaryWriter(fs); 
       for (int r = 0; r < ismeretlen; r++) 
        for (int t = 0; t < ismeretlen + 1; t++) 
         bw.Write(egyenletek[r][t]); 

       bw.Close(); 
       fs.Close(); 


      } 
     } 

     private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
     { 


      numericUpDown1.Maximum = 6; 
      numericUpDown1.Minimum = 2; 



     } 

     private void Generál_Click(object sender, EventArgs e) 
     { 

     this.panel1.Controls.Clear(); 


     ismeretlen = (int)numericUpDown1.Value; 

     TB = new TextBox[ismeretlen][]; 

     for(int i = 0; i < ismeretlen; i++) 
      TB[i] = new TextBox[ismeretlen + 1]; 


     int height = 20; 
     int width = 40; 
     int curX = 10; 
     int curY = 10; 
     for(int i = 0; i < ismeretlen; i++) 
     { 
      for(int j = 0; j < ismeretlen + 1; j++) 
      { 
       TextBox txtbox = new TextBox(); 
       txtbox = new TextBox(); 
       txtbox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
       txtbox.Left = curX; 
       txtbox.Top = curY; 
       txtbox.Width = width; 
       txtbox.Height = height; 
       txtbox.Font = new Font(txtbox.Font.FontFamily, 16); 
       txtbox.BackColor = Color.Azure; 
       txtbox.TextAlign = HorizontalAlignment.Center; 

       TB[i][j] = txtbox; 
       this.panel1.Controls.Add(TB[i][j]); // Add as a child of panel 

       curX += width + 15; 
      } 

      curX = 10; 
      curY = curY + height + 20; 
      } 

     } 

     private void Ment_Click(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+0

Hi! Im, создающий программу решения линейных уравнений в Microsoft Visual C#, для меня это школьный школьный проект. Другая половина кода не так интересна, я использую algorythm, который использует зубчатые массивы (я уже пробовал это, и он работает), и у меня есть кнопка для динамического создания текстовых полей для n-переменной и константы. (Я прокомментирую это Вот). Самая большая проблема заключается в том, что я действительно не понимаю сообщение об ошибке либо потому, что Engilsh не является моим родным языком. – spupul

+0

В сообщении об ошибке говорится: «На эту вещь вы указываете? Она не существует, там ничего нет». –

+0

Спасибо вам! Вот полный код [link] (https://jsfiddle.net/1fLo0f43/2/) – spupul

ответ

0

В этой строке кода, вы только инициализировать первый размер вашего массива:

int[][] egyenletek = new int[ismeretlen][]; 

Но затем использовать его перед инициализацией второй dimensi на несколько строк позже (так это измерение является недействительным (объект не установлен в качестве ссылки)):

egyenletek[a][b] =int.Parse(TB[a][b].Text); 

Перед этой линией, вы должны инициализировать 2-го измерения в некотором роде. Вы сделали это в другой части вашего кода, в строках 172-173 в вашей ссылке jsfiddle.

В общем случае, когда вы видите эту ошибку, вы должны оценить, какие объекты вы читаете и присваиваете, и убедиться, что они были инициализированы (то есть они не являются нулевыми).

+0

О, я вижу. Теперь я попытался инициализировать так же, как и с текстовыми полями (для (int i = 0; i spupul

+0

Если вы в Visual Studio, вы можете попробовать приостановить его и посмотреть, где находится код в данный момент. Если вы продумаете свою логику после этого кода, возможно, вы каким-то образом упростите ее. Если мой ответ правильный, я думаю, что ваш вопрос будет дублировать [этот вопрос] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i- fix-it) –

+0

Я понял, это была основная проблема, о чем вы говорили. Спасибо. – spupul

Смежные вопросы