Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2010, 20:26   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию классы

добрый вечер! пишу программу по классам, написал 2 реализации причём одна работает некорректно, вторая вообще не пашет.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace laba1
{
    class matrix
    {
        public int dl1, dl2;
        public int[,] mas;
        public  matrix()//конструктор по умолчанию
        {

        }

        public void vvod()//ввод
        {
            Console.WriteLine("Введите размер массива");
            dl1 = Convert.ToInt16(Console.ReadLine());
            dl2 = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine("Введите массив");
            int[,] mas = new int[dl1, dl2 ];
            for (int i = 0; i < dl1; i++)
            {
                for (int j = 0; j < dl2; j++)
                {

                    mas[i,j] = Convert.ToInt16(Console.ReadLine());
                }

            }
            //вывод
//эта часть кода написана в методе vivod, но здесь она работает нормально, а в отдельном методе - нет
            Console.WriteLine("Вывод");
            for (int i = 0; i < dl1; i++)
            {
                for (int j = 0; j < dl2; j++)
                {

                    Console.WriteLine(mas[i, j]);
                }

            }
        }
      public  void vivod()//вывод
    {
        for (int i = 0; i < dl1; i++)
        {
            for (int j = 0; j < dl2; j++)
            {

                Console.WriteLine(mas[i, j]);
            }

        }
    }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.BackgroundColor = ConsoleColor.White;
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Black;
            Console.WriteLine("Hi!");
            matrix matr1 = new matrix();
            matr1.vvod();
            matr1.vivod();
        }
    }
}
возникает такая ошибка в процессе выполнения: Object reference not set to an instance of an object. не понимаю я что делать. пробовал написать и так
public void vivod()//вывод
{
for (int i = 0; i < dl1; i++)
{
for (int j = 0; j < dl2; j++)
{

Console.WriteLine(this.mas[i, j]);
}

}
}
ну просто судя по ошибке подумал что this нужен, но странно, зачем он нужен. не захотела компилиться. потом я подумал, что всё дело в том, что функция ввода имеет тип vioid. Ну и я подумал сделать малость иначе

public int vvod()//ввод
{
Console.WriteLine("Введите размер массива");
dl1 = Convert.ToInt16(Console.ReadLine()) ;
dl2 = Convert.ToInt16(Console.ReadLine()) ;
Console.WriteLine("Введите массив");
int[,] mas = new int[dl1, dl2 ];
for (int i = 0; i < dl1; i++)
{
for (int j = 0; j < dl2; j++)
{

mas[i,j] = Convert.ToInt16(Console.ReadLine()) ;
//добавил
return mas[i, j];
}

}
//вывод
//эта часть кода написана в методе vivod, но здесь она работает нормально, а в отдельном методе - нет
Console.WriteLine("Вывод");
for (int i = 0; i < dl1; i++)
{
for (int j = 0; j < dl2; j++)
{

Console.WriteLine(mas[i, j]);
return mas[i, j];
}

}
} и тут какая-то ошибка. короче бился я бился, так и не сделал по-нормальному(((
Dimarik вне форума Ответить с цитированием
Старый 19.02.2010, 21:27   #2
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Потому, что глобальная переменная "mas" не инициализирована.
Ты инициализируешь в методе "vvod()" не глобальную (внутри класса "matrix") переменную "mas", а переменную внутри метода "vvod()".
Решение - убери объявление переменной как массив из целых чисел из тела метода, т.е. замени строку :

Код:
int[,] mas = new int[dl1, dl2];
на

Код:
mas = new int[dl1, dl2];
BOZKURT вне форума Ответить с цитированием
Старый 20.02.2010, 16:17   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

эээээээ... чёт я не догнал разницу для компилятора((((
Dimarik вне форума Ответить с цитированием
Старый 20.02.2010, 17:00   #4
Cpluser
Форумчанин
 
Аватар для Cpluser
 
Регистрация: 16.02.2009
Сообщений: 555
По умолчанию

что не работает?Попробуй так
Код:
public static int[] mas=new int[n];
Cpluser вне форума Ответить с цитированием
Старый 20.02.2010, 18:04   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Раз уж пишете классы, то пишите их нормально.
Вот рабочий пример программы с матрицей
Класс CMatrix
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MatrixApplication
{
    class CMatrix
    {
        private int line_number;
        private int column_number;
        public int[,] mas;
        public CMatrix(int lines, int columns) //конструктор принимает размерности матрицы
        {
            if(lines == 0 && columns == 0)
            {
                lines = 10;
                columns = 10;
            }
            line_number = lines;
            column_number = columns;
            mas = new int[line_number, column_number]; //создаем матрицу
        }
        public void Enter() //вводим матрицу
        {
            for (int i = 0; i < line_number; i++)
            {
                for (int j = 0; j < column_number; j++)
                {
                    mas[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }
        }
        public void Print()  //выводим матрицу
        {
            for (int i = 0; i < line_number; i++)
            {
                for (int j = 0; j < column_number; j++)
                {
                    Console.Write(mas[i, j]);
                    Console.Write(" ");
                }
                Console.Write("\n");
            }
        }
    }
}
Главный класс
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MatrixApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int l = 0, c = 0;
            Console.WriteLine("Enter number of lines in the matrix: ");
            l = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Enter number of columns in the matrix: ");
            c = Convert.ToInt32(Console.ReadLine());
            CMatrix matrix = new CMatrix(l, c);
            Console.WriteLine("Enter elements of the matrix: ");
            matrix.Enter();
            Console.WriteLine("Elements of the matrix: ");
            matrix.Print();
        }
    }
}
Надеюсь, вы сможете понять в чем разница. Удачи.
MaTBeu вне форума Ответить с цитированием
Старый 20.02.2010, 18:52   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а! кажется я понял почему всё работало через одно место. всё дело в конструкторе! я его коряво прописал. точнее я его пустым сделал. правильно?
Dimarik вне форума Ответить с цитированием
Старый 20.02.2010, 21:24   #7
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

я бы в конструктор передал размерность массива. в процедуре ввода, ввел бы, в процедуре вывода вывел бы. тогда не было бы такой проблемы
Life if about choices
Make the right choice

Последний раз редактировалось TaTT DoGG; 20.02.2010 в 21:32.
TaTT DoGG вне форума Ответить с цитированием
Старый 20.02.2010, 22:10   #8
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Dimarik - у меня просто нет слов.
Я тебе явно указал на ошибку.
Если ты не понял разницы между локальным и глобальным переменными, беги из программирования.......

Последний раз редактировалось BOZKURT; 21.02.2010 в 15:28.
BOZKURT вне форума Ответить с цитированием
Старый 21.02.2010, 20:07   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

почему не понял? я недавно перешёл с с++ на шарп. вот и думаю: так как есть public int[,] mas; то по идее она должна быть видна внутри класса и даже вне его. Хотя авторы многих книг не рекомендуют пользоваться Public так как это небезопасное программирование
Dimarik вне форума Ответить с цитированием
Старый 21.02.2010, 20:13   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

всё) понял в чём тут фигня! дело в том что я как в с++ просто объявлял переменные и не инициализировал их, а в C# такого делать низя)))
Dimarik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в С++ Alik-Soldier Общие вопросы C/C++ 58 18.01.2011 16:32
Классы honest Помощь студентам 5 21.09.2009 21:23
Классы в С++ S2S Общие вопросы C/C++ 0 15.03.2009 13:25