Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Область видимости


Автор: tereres 21.4.2006, 10:20
Проблема такая - обьявлен массив static int[,] c = new int[5,5]; в MainForm-е. Когда я заполняю его из TextBox-а в функции Button1Click то там он принимает значения которые я ему присваиваю - но когда он покидает функцию Button1Click - он опять обнуляется... почему? ведь он объявлен как static? 

Автор: Ignat 21.4.2006, 10:31
Ой что-то мне сдается, что работаешь ты с локальным массивом, а не статическим. Как передаешь его в функцию? 

Автор: Illuminaty 21.4.2006, 10:45
Ignat, зачем передавать static в качестве параметра?
Хотя, проблема, скорее всего, из-за этого.
Чтобы понять точнее, нужен код. tereres, выкладывай 

Автор: a.S.d 21.4.2006, 10:59
tereres, 
Ты обьявляешь массив в функции Button1Click или в классе MainForm? 

Автор: ivashkanet 21.4.2006, 10:59
Цитата(tereres @  21.4.2006,  10:20 Найти цитируемый пост)
static int[,] c = new int[5,5]

А где ты его объявляешь?

Если в функции, то при выходе из нее этот экземпляр исчезает, а так как прррр

Стоп стоп стоп.

Нельзя объявить static переменную, только класс или структуру smile 
Как ты умудрился????
Мой компилятор ругается  smile (можно посмотреть ниже)
 

Автор: Ignat 21.4.2006, 11:01
Цитата(Illuminaty @  21.4.2006,  11:45 Найти цитируемый пост)
зачем передавать static в качестве параметра?

static != global (!!!)

Статические объекты - объекты, которые имеют постоянный адрес в статической памяти. Но на области видимости это никак не отражается (практически).

Добавлено @ 11:03 
ivashkanet, static члены класса никто не отменял. 

Автор: ivashkanet 21.4.2006, 11:07
Добавка
Извините, если объявлять static свойство в классе, то оно нормально объявляется   smile 
Static нельзя объявлять локальную переменную в функции, что и понятно.

tereres, а зачем тебе именно статик-поле?
Используй обычное!
Ведь тебе, я надеюсь, не нужно создавать кучу одинаковых объектов с возможностью связи между собой?

Добавлено @ 11:08 
Цитата(Ignat @  21.4.2006,  11:01 Найти цитируемый пост)
ivashkanet, static члены класса никто не отменял. 

Тормазнул, в чем искренне раскаиваюсь  smile

Добавлено @ 11:12 
Цитата(Illuminaty @  21.4.2006,  10:45 Найти цитируемый пост)
нужен код. tereres, выкладывай 

Выкладывай код 
Цитата(tereres @  21.4.2006,  10:20 Найти цитируемый пост)
Button1Click
Ждем. 

Автор: Illuminaty 21.4.2006, 11:20
Ignat, к static можно обратиться ИмяКласса.СтатическоеПоле, а не передавать его в качестве параметра. Я про это написал. 

Автор: tereres 21.4.2006, 12:22
static int[,] c = new int[5,5];  объявляю в Main. Вот код всей проги:
Код

using System;
using System.Drawing;
using System.Windows.Forms;
        
class min{
    public int minimum(ref int[,] k, int t)
    {   int mi=1;
        k[0,0]=k[1,0]=k[2,0]=k[3,0]=k[4,0]=0;
        int m=0;
        for(int ff=0; ff<4; ff++){
            if(k[t,ff]!=0){m=k[t,ff]; mi=m; }
        
        };

        
        for(int j=0; j<5; j++)
            if(m>k[t,j]&&(k[t,j]!=0)){
            m=k[t,j];
            mi=j;
        }
        k[0,mi]=k[1,mi]=k[2,mi]=k[3,mi]=k[4,mi]=0;
        return mi;
    }

};
        
namespace opit2
{
    
    public class MainForm : System.Windows.Forms.Form
    {   string town = "Tbilisi1";
        string town2 = "Erevan2";
        string town3 = "Baku3";
        string town4 = "Moscow4";
        string town5 = "Kiev5";
        
        int x,y,z,w;
        static int[,] c = new int[5,5];
        
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        public MainForm()
        {
        
        
        InitializeComponent();
        Text = "Towns";
        BackColor = SystemColors.Window;
        ForeColor = SystemColors.WindowText;
        ResizeRedraw = true;
        
        }

        

        [STAThread]
        public static void Main()
        {
            Application.Run(new MainForm());
        }
        protected override void OnPaint(PaintEventArgs pea)
    {
            
        Graphics grfx = pea.Graphics;
        Pen pen = new Pen(ForeColor);
        
        Graphics str = pea.Graphics;
        
        
        int mx = ClientSize.Width / 2;
        int my = ClientSize.Height / 6;
        
        int x1=ClientSize.Width/6; int y1=ClientSize.Height/2;
        int x2=ClientSize.Width-ClientSize.Width/6; int y2=ClientSize.Height/2;
        int x3=ClientSize.Width/3; int y3=ClientSize.Height-ClientSize.Height/6;
        int x4=ClientSize.Width-ClientSize.Width/3; int y4=ClientSize.Height-ClientSize.Height/6;
        
        
        

        
        str.DrawString(town,Font,Brushes.Black, mx,my-10);
        str.DrawString(town2,Font,Brushes.Black, x1-10,y1);
        str.DrawString(town3,Font,Brushes.Black, x2+10,y2);
        str.DrawString(town4,Font,Brushes.Black, x3,y3+10);
        str.DrawString(town5,Font,Brushes.Black, x4,y4+10);

        min t = new min();

        int[] old = new int[5];

        old[0]=0;
        town +=c[0,0];
        town2+=c[1,0];
        town3+=c[2,0];
        town5+=c[4,0];
        town4+=c[3,0];
        
        for(int n=0; n<4; n++)
            old[n+1]=t.minimum(ref c, old[n]);
        
        
        for(int i=0; i<4; i++)
        {
        if(old[i]==0) {x=mx; y=my;};
        if(old[i]==1) {x=x1; y=y1;};
        if(old[i]==2) {x=x2; y=y2;};
        if(old[i]==3) {x=x3; y=y3;};
        if(old[i]==4) {x=x4; y=y4;};
        
        if(old[i+1]==0) {w=mx; z=my;};
        if(old[i+1]==1) {w=x1; z=y1;};
        if(old[i+1]==2) {w=x2; z=y2;};
        if(old[i+1]==3) {w=x3; z=y3;};
        if(old[i+1]==4) {w=x4; z=y4;};
        
        grfx.DrawLine(pen, x,y,w,z);
        }
        town +=c[0,0];
        town2+=c[1,0];
        town3+=c[2,0];
        town4+=c[3,0];
        town5+=c[4,0];

        
            //grfx.DrawLine(pen, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
        

    }
        #region Windows Forms Designer generated code
        /// <summary>
        /// This method is required for Windows Forms designer support.
        /// Do not change the method contents inside the source code editor. The Forms designer might
        /// not be able to load this method if it was changed manually.
        /// </summary>
    private void InitializeComponent() {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(0, 0);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(296, 20);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "Enter the numerals";
            // 
            // button1
            // 
            this.button1.BackColor = System.Drawing.SystemColors.Desktop;
            this.button1.Location = new System.Drawing.Point(0, 24);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "Click Here";
            this.button1.Click += new System.EventHandler(this.Button1Click);
            // 
            // MainForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(492, 453);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "MainForm";
            this.Text = "MainForm";
            this.ResumeLayout(false);
        }
        #endregion
         void Button1Click(object who, System.EventArgs e)
        {
            string a = textBox1.Text;
            
            
            
            int len = textBox1.Text.Length;
            int[] mass = new int[len];
            for (int i = 0; i < len; i++)
            {
             if(a[i]==','){
                 mass[i]=-1;}
             else mass[i] = Convert.ToInt32(a.Substring(i, 1)); 
            }
            int[] m = new int[25];
            
            int yyy=1;
         
            int hh=0;
            for(int ee=0; ee<25;){
             
             if(mass[hh]==-1) {yyy=1; ee++; hh++;}
             else
             {m[ee]=m[ee]*yyy+mass[hh]; yyy*=10; hh++;}
                       }
            
            for(int j=0; j<5; j++)
             for(int k=0; k<5; k++)
             c[j,k]=m[j+k];
            
    MainForm.ActiveForm.Refresh();
    
            
         }
        
        }

        
    }


 

Автор: ivashkanet 21.4.2006, 12:52
tereres, ты б еще пол MSDN сюда накопипастил smile

Добавлено @ 13:03 
Да и вообще она у тебя какой-то ерундой занимается (см. прикрепленный файл). Открывает и консоль и форму  smile 

Давай по-существу:
1) как описываешь
2) как изменяешь
3) в каком месте, по-твоему, ошибка

  

Автор: ivashkanet 21.4.2006, 13:09
Ее даже оттестить нормально не получаеться!

tereres, в каком формате нужно вводить текстовую строку?
Через запятую, сколько штук?

Давай приводи ее в нормальный вид, который можно другим показать smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)