Do you use global variables?

Permabanned
Joined
15 Nov 2006
Posts
164
Location
Visit Athens
What's your opinion guys? :rolleyes:
Especially the professional programmers (I am not one).
Personally I do this cos it helps me to passing parameters to all necessary functions easily.
But it is dangerous sometimes (wrong results).
 
I must inform more all of you.
Basically I worked during the first years at university with FORTRAN so I have some "bad" habbits e.g. goto etc.....
Now working under Windows enviroment (Visual Studio) I assume that textboxes (for example) are external (global) variables also.
And status bar cos you can modify its properties in every function.
Before using an external variable I seek always above especially when I modify its value.
 
Last edited:
Thanks programmers.
Well look this source code:

Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace Chipset_FSB_estimator
{
	public class frmChipset_FSB_estimator : System.Windows.Forms.Form
	{
		#region Messages
		private string message1;
		private string message2;
		private string message3;
		private string message4;
		private string message5;
		private string message6;
		private string message7;
		private string message8;
		private string message9;
		private string message10;
		private string message11;
		private string message12;
		private string message13;
		private string message14;
		#endregion

        #region External variables
        private bool translation=false;
        double[] Vdd=new double[6];
        double[] FSB=new double[6];
        int number;
        #endregion		

		#region Form's routines
		private void frmChipset_FSB_estimator_Load(object sender, System.EventArgs e)
		{
            Translation();
           	double Vdd=1.2;
			while (Vdd <= 2.0)
			{
				comboBox1.Items.Add(Vdd.ToString(System.Globalization.CultureInfo.InvariantCulture));
				comboBox2.Items.Add(Vdd.ToString(System.Globalization.CultureInfo.InvariantCulture));
				comboBox3.Items.Add(Vdd.ToString(System.Globalization.CultureInfo.InvariantCulture));
				comboBox4.Items.Add(Vdd.ToString(System.Globalization.CultureInfo.InvariantCulture));
				comboBox5.Items.Add(Vdd.ToString(System.Globalization.CultureInfo.InvariantCulture));
				Vdd+=0.001;
				Vdd=Math.Round(Vdd,3);
			}     
		}
		private void statusBar1_TextChanged(object sender, System.EventArgs e)
		{
			for (int i=1; i<=5; i++)
			{
				statusBar1.Visible=false;
				System.Threading.Thread.Sleep(1);
				statusBar1.Visible=true;
			}
		}
		#endregion
		
		#region Translation routine
		private void Translation()
		{
			FileInfo theSourceFile=new FileInfo(@"Language.txt");  // Το αρχείο εισόδου
			TextReader reader=theSourceFile.OpenText();
			string text="";
			bool crash=false;

			while (text != "[Chipset FSB estimator]")
			{
				text=reader.ReadLine();
				if (text == null)  // Βρήκε EOF άρα έχει γίνει @@ρια με το αρχείο μετάφρασης
				{
					this.TopMost=false;
					MessageBox.Show("A critical error found in language file\n"+
						"and program must be terminated.\n"+
						"You must check and replace the header.",
						"ERROR in language file!",MessageBoxButtons.OK,MessageBoxIcon.Error); 
					crash=true;
					break;
				}
			}
			if (crash)
                Application.Exit();
            translation=true;
			text=reader.ReadLine();
			statusBar1.Text=text;
			text=reader.ReadLine();
			group_Data.Text=text;
			text=reader.ReadLine();
			group_Button_panel.Text=text;
			text=reader.ReadLine();
			lbl_Measurements.Text=text;
			text=reader.ReadLine();
			group_Estimation_card.Text=text;
			text=reader.ReadLine();
			lbl_Desired_Vdd.Text=text;
			text=reader.ReadLine();
			group_Results.Text=text;
			text=reader.ReadLine();
			lbl_Estimated_area.Text=text;
			message1=reader.ReadLine();    
			message2=reader.ReadLine();
			message3=reader.ReadLine();
			message4=reader.ReadLine();
			message5=reader.ReadLine();
			message6=reader.ReadLine();
			message7=reader.ReadLine();
			message8=reader.ReadLine();
			message9=reader.ReadLine();
			message10=reader.ReadLine();
			message11=reader.ReadLine();
			message12=reader.ReadLine();
			message13=reader.ReadLine();
			message14=reader.ReadLine();
			reader.Close();
		}	
		#endregion					         
		
		#region Βutton Compute
		private void btn_Compute_Click(object sender, System.EventArgs e)
		{
			double maxvoltage=0, value=0.0;
            bool flag=true;  

            for (int i=0; i<=5; i++)
                Vdd[i]=FSB[i]=0.0;
			try
			{
				number=int.Parse(combo_Measurements.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
			}
			catch
			{
				if (!translation)
				{
					MessageBox.Show("You must choose measurements number!\n"+"Retry and be careful!",
						"Empty combobox!",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
					statusBar1.Text="You are not careful!";
				}
				else
				{
					MessageBox.Show(message1 + "\n" + message2,message3,MessageBoxButtons.OK,MessageBoxIcon.Error);
					statusBar1.Text=message4;
				}
				combo_Measurements.Text="??";
				combo_Measurements.Focus();
				flag=false;
			}
			try
			{
				Vdd[1]=double.Parse(comboBox1.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				FSB[1]=double.Parse(textBox1.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				Vdd[2]=double.Parse(comboBox2.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				FSB[2]=double.Parse(textBox2.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				if (number >= 3)
				{
					Vdd[3]=double.Parse(comboBox3.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
					FSB[3]=double.Parse(textBox3.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				}
				if (number >= 4)
				{
					Vdd[4]=double.Parse(comboBox4.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
					FSB[4]=double.Parse(textBox4.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				}
				if (number >= 5)   
				{
					Vdd[5]=double.Parse(comboBox5.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
					FSB[5]=double.Parse(textBox5.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
				}			    	    										  	   					
			}   // <--- END ΟF TRY
			catch
			{
				if (!translation)
				{
					MessageBox.Show("Enter proper values in all boxes!\n"+"Retry and be careful!",
						"Empty boxes or bad arguments!",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
					statusBar1.Text="You are not careful!";
				}
				else
				{
					MessageBox.Show(message5 + "\n" + message3,message6,MessageBoxButtons.OK,MessageBoxIcon.Error);
					statusBar1.Text=message4;
				}
				flag=false;
			}	
			if (flag)
			{
				maxvoltage=Vdd[1];
				for (int i=1; i<=number; i++)
					if (Vdd[number] > maxvoltage)
						maxvoltage=Vdd[number];
				value=1.000;
				if (1.07*maxvoltage > 2.0)
				{
					while (value <= 2.0)
					{
						combo_Desired_Vdd.Items.Add(value.ToString(System.Globalization.CultureInfo.InvariantCulture));
						value+=0.001;
						value=Math.Round(value,3);
					}   
				}
				else
				{
					while (value <= 1.07*maxvoltage)
					{
						combo_Desired_Vdd.Items.Add(value.ToString(System.Globalization.CultureInfo.InvariantCulture));
						value+=0.001;
						value=Math.Round(value,3);
					}
				}
				if (!translation)
					statusBar1.Text="Choose the desired Vdd now:";
				else
					statusBar1.Text=message7;
				group_Estimation_card.Visible=true;
			}
		}
		private void btn_Compute_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Compute.Top--;
			btn_Compute.Left--;
		}
		private void btn_Compute_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Compute.Top++;
			btn_Compute.Left++;
		}
		#endregion

		#region Buttons help and clear
		private void btn_Help_Click(object sender, System.EventArgs e)
		{
			System.Threading.Thread.Sleep(100);
			try
			{
				ProcessStartInfo psi=new ProcessStartInfo("Manuals\\Chipset FSB estimator\\Chipset FSB estimator.htm");
				psi.UseShellExecute=true;
				Process.Start(psi);
			}
			catch
			{
				if (!translation)
					MessageBox.Show("Help file is missing!","No help!",MessageBoxButtons.OK,MessageBoxIcon.Error);
				else
					MessageBox.Show(message8,message9,MessageBoxButtons.OK,MessageBoxIcon.Error);
			}
		}
		private void btn_Help_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Help.Top++;
			btn_Help.Left++;
		}
		private void btn_Help_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Help.Top--;
			btn_Help.Left--;
		}
		private void btn_Clear_Click(object sender, System.EventArgs e)
		{
			System.Threading.Thread.Sleep(100);
			for (int i=1; i<=50; i++)
			{
				this.Top+=10;
				this.Left+=10;
				this.Top-=10;
				this.Left-=10;
			}   
			textBox1.Text=textBox2.Text=textBox3.Text=textBox4.Text=textBox5.Text=""; 
			group_Estimation_card.Visible=group_Results.Visible=false;
            combo_Desired_Vdd.Text=combo_Measurements.Text=comboBox1.Text=comboBox2.Text=comboBox3.Text=comboBox4.Text=comboBox5.Text="";
            combo_Desired_Vdd.Items.Clear();  
            if (!translation)                     
				statusBar1.Text="All boxes cleared! Repeat or close the form!";
			else
				statusBar1.Text=message10;
		}
		private void btn_Clear_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Clear.Top++;
			btn_Clear.Left++;
		}
		private void btn_Clear_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Clear.Top--;
			btn_Clear.Left--;
		}
		#endregion
		
		#region Βutton Estimate
		private void btn_Estimate_Click(object sender, System.EventArgs e)
		{
			double edge1,edge2,voltage,value;
			double a1,b1,a2,b2,a3,b3,cor1,cor2,cor3;
			string text;

            try
            {
                voltage=double.Parse(combo_Desired_Vdd.Text,System.Globalization.NumberFormatInfo.InvariantInfo);
            }
            catch
            {
                if (!translation)
                {
                    MessageBox.Show("Critical error!\n"+"Retry and be careful!","Cannot continue!",
                        MessageBoxButtons.OK,MessageBoxIcon.Error);
                    statusBar1.Text="What's up?";
                    combo_Desired_Vdd.Focus();
                }
                else
                {
                    MessageBox.Show(message11+"\n"+message2,message12,MessageBoxButtons.OK,MessageBoxIcon.Error);
                    statusBar1.Text=message13;
                }
                goto Telos;
            }
            cor1=0.99; cor2=0.98; cor3=1.0;       // The part of complex calculations removed anyway assume that 
            a1=1; a2=2; a3=3; b1=4; b2=5; b3=6;   // after these calculations a1,a2.. have these values
            btn_Clear.Visible=group_Results.Visible=true;
            if (!translation)
                statusBar1.Text="All calculations performed! Repeat/clear or close the form!";
            else
                statusBar1.Text=message14;
            if (100.0*cor1 < 100.0)
            {
                cor1=Math.Round(100*cor1,6);
                text=cor1.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
                text+="%";
                textBox7.Text=text;
            }
            else
                textBox7.Text="100.0%";
            if (100.0*cor2 < 100.0)
            {
                cor2=Math.Round(100*cor2,6);
                text=cor2.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
                text+="%";
                textBox9.Text=text;
            }
            else
                textBox9.Text="100.0%";
            if (100.0*cor3 < 100.0)
            {
                cor3=Math.Round(100*cor3,6);
                text=cor3.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
                text+="%";
                textBox11.Text=text;
            }
            else
                textBox11.Text="100.0%";
            value=a1+b1*voltage;
            text="";
            edge1=Math.Round(value-2.0,0);
            text+=edge1.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" - ";
            edge2=Math.Round(value,0);
            text+=edge2.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" MHz.";
            textBox6.Text=text;
            value=a2+b2*Math.Log(voltage);
            text="";
            edge1=Math.Round(value-2.0,0);
            text+=edge1.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" - ";
            edge2=Math.Round(value,0);
            text+=edge2.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" MHz.";
            textBox8.Text=text;
            value=a3*Math.Pow(b3,voltage);
            text="";
            edge1=Math.Round(value-2.0,0);
            text+=edge1.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" - ";
            edge2=Math.Round(value,0);
            text+=edge2.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
            text+=" MHz.";
            textBox10.Text=text;
            Telos:
            int dummy=69;
            dummy++;
		}
		private void btn_Estimate_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Estimate.Top++;
			btn_Estimate.Left++;
		}
		private void btn_Estimate_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			btn_Estimate.Top--;
			btn_Estimate.Left--;
		}
		#endregion
	}
}

It is a C# code.
Is it possible to stop using external (global) variables????
In this case it is trouble IMHO.
Read it carefully and we can go on. :)
 
I also avoid singletons
I wrote one singleton (actually I copied a sample) :D so I also avoid them.
The variables marked as external in the example are also not visible outside of the class in which they are defined.
Exactly. They are visible (and accessible) inside the class.

TrUz thanks for the sample I was too messed! :)
 
Last edited:
Back
Top Bottom