Updates from May, 2010 Toggle Comment Threads | Keyboard Shortcuts

  • Ali BaderEddin 10:52 am on May 21, 2010 Permalink | Reply
    Tags: 3d, array, jagged, Multi-dimensional, Multidimensional Array   

    Dynamic Three Dimensional Arrays in C\C++\C#\Java 


    If you come from a Java or C# perspective and want to create a multi-dimensional array in C or C++, you’ll soon figure out that multi-dimensional array allocation in C\C++ is not as simple, plus you’ll have to worry about deallocation since there is no garbage collector to do the work for you. Below I’ll show four different sample codes showing how to work with a three dimensional array in Java, C#, C++ and C, respectively.

    Java 3D Array

    In Java, creating a 3-dimensional array is as simple as saying

    int[][][] array3D = new int[x][y][z];

    You can then access the elements of the 3-dimensional array at array3D[i][j][k].

    Sample Code

    public static void main(String[] args)
    {
        //  Array 3 Dimensions
        int x = 4, y = 5, z = 6;
    
        //  Array Iterators
        int i, j, k;
    
        //  Allocate 3D Array
        int[][][] array3D = new int[x][y][z];
    
        //  Access array elements
        for (i = 0; i < x; i++)
        {
            System.out.println(i);
    
            for (j = 0; j < y; j++)
            {
                System.out.println();
    
                for (k = 0; k < z; k++)
                {
                    array3D[i][j][k] = (i * y * z) + (j * z) + k;
                    System.out.print("\t" + array3D[i][j][k]);
                }
            }
    
            System.out.println('\n');
        }
    }

    C# 3D Array

    In C#, the concept is almost the same as in Java. However, C# makes the distinction between jagged and multi-dimensional arrays. Elements of a multi-dimensional array are stored in a contiguous block in memory while elements of a jagged array are not. Java arrays are actually jagged arrays, while C# supports both and allows you to choose which one you want based on the syntax of your code. Note that multi-dimensional arrays are better (in most cases) than jagged arrays, and that is considered a minus point for Java.

    Using jagged arrays in C# is not as simple as in Java. It’s almost like the way we would implement it in C++.

    int[][] jaggedArray = new int[2][];
    jaggedArray[0] = new int[4];
    jaggedArray[1] = new int[3];

    However, multi-dimensional arrays in C# are very simply to use. You can create a 3 dimensional array as follows

    int[,,] array3D = new int[x, y, z];

    then access its elements at array3D[i][j][k].

    Sample Code

    static void Main(string[] args)
    {
        //  Array 3 Dimensions
        int x = 4, y = 5, z = 6;
    
        //  Array Iterators
        int i, j, k;
    
        //  Allocate 3D Array
        int[,,] array3D = new int[x, y, z];
    
        //  Access array elements
        for (i = 0; i < x; i++)
        {
            Console.WriteLine(i);
    
            for (j = 0; j < y; j++)
            {
                Console.WriteLine();
    
                for (k = 0; k < z; k++)
                {
                    array3D[i, j, k] = (i * y * z) + (j * z) + k;
                    Console.Write("\t{0}", array3D[i, j, k]);
                }
            }
    
            Console.WriteLine('\n');
        }
    }

    C++ 3D Array

    To create a multi-dimensional array in C++, we should change perspective a little bit and think of creating arrays that point to other arrays, which point to other arrays, and so on. For example, to create a 2x3x4 array in C++, we should imagine the implementation as follows:

    For simplicity, we are doing the jagged implementation of the multi-dimensional array (address of array3d[0][1][0] is not directly after array3d[0][0][3] in memory representation above). In the next section, we will implement it in C the contiguous way. To allocate a jagged 2D array in C++, one can write the following (compare to C# jagged above):

    int** jaggedArray = new int*[2];
    jaggedArray[0] = new int[4];
    jaggedArray[1] = new int[3];

    The elements can be accessed as usual: jaggedArray[i][j]. The extra work we have to do in C++ is to explicitly deallocate the array.

    delete[] jaggedArray[0];
    delete[] jaggedArray[1];
    delete[] jaggedArray;

    See the code sample below to understand how we allocate and deallocate a 3 dimensional array in C++.

    Sample Code

    #include <iostream>
    
    using namespace std;
    
    void main()
    {
        //  Array 3 Dimensions
        int x = 4, y = 5, z = 6;
    
        //  Array Iterators
        int i, j, k;
    
        //  Allocate 3D Array
        int ***array3D = new int**[x];
    
        for(i = 0; i < x; i++)
        {
            array3D[i] = new int*[y];
    
            for(j = 0; j < y; j++)
            {
                array3D[i][j] = new int[z];
            }
        }
    
        //  Access array elements
        for(i = 0; i < x; i++)
        {
            cout << i << endl;
    
            for(j = 0; j < y; j++)
            {
                cout << endl;
    
                for(k = 0; k < z; k++)
                {
                    array3D[i][j][k] = (i * y * z) + (j * z) + k;
                    cout << '\t' << array3D[i][j][k];
                }
            }
    
            cout << endl << endl;
        }
    
        //  Deallocate 3D array
        for(i = 0; i < x; i++)
        {
            for(j = 0; j < y; j++)
            {
                delete[] array3D[i][j];
            }
    
            delete[] array3D[i];
        }
        delete[] array3D;
    }

    C 3D Array

    Implementing multi-dimensional arrays in C is very similar to C++, except that we use malloc()\free()  stdlib methods instead of the new\delete keywords. The memory representation below is the same, but we are going to focus in this section on making the elements of the 3 dimensional array contiguous.

    To do so, we start by allocating space for all array elements in one call to malloc.

    int *allElements = malloc(x * y * z * sizeof(int));

    Next, we create the arrays of pointers, and point to the contiguous elements we’ve already allocated.

    int ***array3D = malloc(x * sizeof(int **));
    for(i = 0; i < x; i++)
    {
        array3D[i] = malloc(y * sizeof(int *));
    
        for(j = 0; j < y; j++)
        {
            array3D[i][j] = allElements + (i * y * z) + (j * z);
        }
    }

    Note that if we wanted the same jagged implementation as in the C++ example above, we could ignore the allocation of allElements and change the line of code array3D[i][j] = allElements + (i * y * z) + (j * z); to array3D[i][j] = malloc(z * sizeof(int)). Below is a sample code for allocating, accessing and deallocating a 3 dimensional array in C.

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
        //  Array 3 Dimensions
        int x = 4, y = 5, z = 6;
    
        //  Array Iterators
        int i, j, k;
    
        //  Allocate 3D Array
        int *allElements = malloc(x * y * z * sizeof(int));
        int ***array3D = malloc(x * sizeof(int **));
    
        for(i = 0; i < x; i++)
        {
            array3D[i] = malloc(y * sizeof(int *));
    
            for(j = 0; j < y; j++)
            {
                array3D[i][j] = allElements + (i * y * z) + (j * z);
            }
        }
    
        //  Access array elements
        for(i = 0; i < x; i++)
        {
            printf("%d\n", i);
    
            for(j = 0; j < y; j++)
            {
                printf("\n");
    
                for(k = 0; k < z; k++)
                {
                    array3D[i][j][k] = (i * y * z) + (j * z) + k;
                    printf("\t%d", array3D[i][j][k]);
                }
            }
    
            printf("\n\n");
        }
    
        //  Deallocate 3D array
        free(allElements);
        for(i = 0; i < x; i++)
        {
            free(array3D[i]);
        }
        free (array3D);
    }

    Source Code

    Full source code for the above 4 samples is available here.

     
    • ashish 5:48 am on September 14, 2010 Permalink | Reply

      #include
      #include

      void main()
      {
      // Array 3 Dimensions
      int x = 4, y = 5, z = 6;

      // Array Iterators
      int i, j, k;

      // Allocate 3D Array
      int *allElements = malloc(x * y * z * sizeof(int));
      int ***array3D = malloc(x * sizeof(int **));

      for(i = 0; i < x; i++)
      {
      array3D[i] = malloc(y * sizeof(int *));

      for(j = 0; j < y; j++)
      {
      array3D[i][j] = allElements + (i * y * z) + (j * z);
      }
      }

      // Access array elements
      for(i = 0; i < x; i++)
      {
      printf("%d\n", i);

      for(j = 0; j < y; j++)
      {
      printf("\n");

      for(k = 0; k < z; k++)
      {
      array3D[i][j][k] = (i * y * z) + (j * z) + k;
      printf("\t%d", array3D[i][j][k]);
      }
      }

      printf("\n\n");
      }

      // Deallocate 3D array
      free(allElements);
      for(i = 0; i < x; i++)
      {
      free(array3D[i]);
      }
      free (array3D);
      }

      """""how this aryya program exeute this not working

    • Ali BaderEddin 8:11 am on September 14, 2010 Permalink | Reply

      What exactly is not working?

    • chetna 2:00 am on November 30, 2011 Permalink | Reply

      plz given me program for three dimensional array

    • Addaboi 5:13 pm on March 28, 2012 Permalink | Reply

      Thanks. This worked great.

    • Phil 9:08 am on July 12, 2013 Permalink | Reply

      Doesn’t work… I get a segmentation fault :(

      • Phil 12:47 pm on July 12, 2013 Permalink | Reply

        I rescind that previous comment.. kind of
        It did not work when I placed the allocation code in a separate function (I was passing a pointer int*** to the function but things weren’t working.. this is likely because I have not developed in C for quite awhile and am a little rusty).

        The code did however work when I returned a pointer (int***) from the function back to main.

    • williamholdin 11:43 pm on April 23, 2014 Permalink | Reply

      More about multidimensional array Multi dimensional array

      william

  • Ali BaderEddin 9:18 pm on April 1, 2010 Permalink | Reply  

    Xml Editor Control 


    If you have a Windows Forms application that involves Xml editing or viewing, you can use this control to save yourself the effort of formatting the Xml content. For now, only syntax highlighting is implemented. I expect to add more features in the future like spacing, grouping, intellisense, etc…

    Usage

    Simply add the files (XmlToken.cs, XmlTokenizer.cs, XmlEditor.cs, XmlEditor.designer.cs) to your project then drag and drop the XmlEditor control from the Toolbox into your Windows Form.

    The XmlEditor control currently has three public properties. Use AllowXmlFormatting to enable or disable formatting on the Xml content in the editor. The ReadOnly property tells whether or not to allow the user to change the text. The Text property sets or gets the text of the Xml editor.

    Here is how the control looks like when AllowXmlFormatting = true and ReadOnly = false (default values):

    Implementation

    To color the Xml string, we have to split it into multiple tokens, then color each token based on its type. I have identified the following token types (based on syntax highlighting behavior in Visual Studio 2008):

    • A “Value” is anything between double quotes
    • A “Comment” is anything that starts with <!– and ends with –> (or starts with <!– and is never closed with –>)
    • An “Element” is any letter or digit that falls between < and a space or >
    • An “Attribute” is any letter or digit that falls after a < followed by space and not closed by >
    • An “Escape” is anything that starts with & and ends with ; (For example &quote;)
    • A “SpecialChar” is any character that is not a letter or a digit
    • A “None” is anything else

    The Tokenize() public static method of the XmlTokenizer class does the job of splitting a string into Xml tokens.

    An XmlToken object is a representation of an Xml token with details about the exact text of that token, its location in the string and its type.

    Here is the code in the XmlEditor control that does the syntax highlighting:

    List<XmlToken> tokens = XmlTokenizer.Tokenize(xmlEditor.Text);
    
    foreach (XmlToken token in tokens)
    {
        xmlEditor.Select(token.Index, token.Text.Length);
    
        switch (token.Type)
        {
            case XmlTokenType.Attribute:
                xmlEditor.SelectionColor = Color.Red;
                break;
            case XmlTokenType.Comment:
                xmlEditor.SelectionColor = Color.DarkGreen;
                break;
    
            //  and so on for the other token types
        }
    }

    Download source and exe.

     
    • maria judi 5:37 pm on November 15, 2010 Permalink | Reply

      thak u_______

      ths is very useful for my project

    • Ali BaderEddin 8:55 pm on November 15, 2010 Permalink | Reply

      Glad it is..

    • Marco van Tintelen 5:58 am on January 10, 2011 Permalink | Reply

      Very nice!

    • rishi 10:02 am on February 9, 2011 Permalink | Reply

      intellisense: do you have support for that ? If not can you tell me how can I implement it. thanks in advance.

    • Colby Africa 8:32 am on March 4, 2011 Permalink | Reply

      Nice work! Are you okay if I start with this and extend it or is this “as-is” only?

      Thank you!

      Colby

    • Ali BaderEddin 12:38 am on March 5, 2011 Permalink | Reply

      Sure… Please share the final version that you come up with.

      If you are planning to distribute it, it’s OK as long as you keep reference that it was originally created by me and link to this post in the source code…

    • Joseph Gordon 7:07 am on August 17, 2011 Permalink | Reply

      Great work here. Small performance tip: you have a re-entry issue in your FormatXml method, where changing the selectionColor fires the textbox_changed event, causing another call to FormatXml.

    • W 1:16 pm on February 17, 2012 Permalink | Reply

      Thanks. This is really helpful.

  • Ali BaderEddin 4:50 am on February 11, 2010 Permalink | Reply  

    C# Windows Form is Busy 


    There are two very common ways of telling the user that your application is busy. One is to show a progress bar that gets updated based on the progress getting done, and another is to show the “Waiting” cursor while the application is doing work.

    Waiting Cursor

    To show the user the Waiting cursor while your program is busy, all you have to do is to set the current cursor to the Waiting cursor before your code runs, then set it back to an arrow after your code completes.

    Cursor.Current = Cursors.WaitCursor;
    
    //  Your Code
    
    Cursor.Current = Cursors.Default;

    Progress Bar

    The progress bar is a more user-friendly solution, but in most cases showing the waiting cursor does the job. Here is the simplest way to use a progress bar:

    int totalSteps = 10;
    for (int i = 1; i <= totalSteps; i++)
    {
        //  One chunk of your code
    
        int progress = i * 100 / totalSteps;
        blocksProgressBar.Value = progress;
    }
    blocksProgressBar.Value = 0;

    Yes, it’s that easy to implement a progress bar that gets updated based on the work done by your app. However, while progress is shown, the user can’t interact with the UI or do any other operation (the UI thread is the single thread doing the work here). To get the multi-threaded behavior, the easiest way is to use a background worker process, as shown below:

    So instead of putting your code in the event handler method, you will replace it with a call to start the worker process then move the code to the worker process events.

    private void doButton_Click(object sender, EventArgs e)
    {
        backgroundWorker.RunWorkerAsync();
    }

    The worker process will do its work in the DoWork event. To show progress, the code needs to be split into segments and the background worker ReportProgress method needs to be called whenever a segment of code is executed.

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        int totalSteps = 10;
    
        for (int i = 1; i <= totalSteps; i++)
        {
            //  One chunk of your code
    
            int progress = i * 100 / totalSteps;
            backgroundWorker.ReportProgress(progress);
        }
    }

    Whenever progress changes, we need to update the value of the progress bar.

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        blocksProgressBar.Value = e.ProgressPercentage;
    }

    When the worker process is done (progress = 100%), we reset the progress bar.

    private void backgroundWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
    {
        blocksProgressBar.Value = 0;
    }

    Below is a Windows Form application that lets you try the concepts explained above, and also shows you how the Marquee progress bar works, which is shockingly harder than the more realistic single-threaded progress bar we’ve discussed above.

    Download source and exe from here.

     
    • Paul 9:09 am on May 11, 2011 Permalink | Reply

      Thank You! That is exactly what I was looking for.

    • Mike 10:45 am on October 4, 2011 Permalink | Reply

      How do you tie a progress bar to sql query, returning data into a datagridview? It doesn’t have to be totally accurate, just doing something while the data is loading, then stopping once it has loaded…

    • Rudi Larno 8:49 am on December 8, 2011 Permalink | Reply

      Seems like the Marquee style does its work using the UI thread. So then it is logical that your options using System.Threading.Thread.Sleep(milliSecondsToWait); do not work, as you are blocking the UI Thread, not allowing your UI to get updated.

      Nice write up however.

    • yogesh makwana 8:58 pm on January 18, 2012 Permalink | Reply

      i want to know how to use marque in c#.net windowform…??????

    • Ankit Baria 5:31 am on September 14, 2012 Permalink | Reply

      Really helpful post. Thanks

    • http://tinyurl.com/guileasy48296 3:31 am on January 9, 2013 Permalink | Reply

      “C# Windows Form is Busy The Code Log” was
      in fact a truly awesome post, . Keep publishing and I’ll try to continue to keep reading through! Thanks for your time ,Louie

    • Khursheed Fateh 10:17 pm on May 12, 2014 Permalink | Reply

      See the modifivations I made to ylour program. Now Timer base progressbar is working.


      private Stopwatch s = new Stopwatch(); // Stopwatch
      private void progressButton2_Click(object sender, EventArgs e)
      {
      showProgress = true;
      timer.Enabled = true;
      timer.Start();

      s.Start(); // start stopwatch in this method

      marqueeProgressBar.Style = ProgressBarStyle.Marquee; // set progressbar style in this method
      }

      private void timer_Tick(object sender, EventArgs e)
      {
      if ( s.Elapsed < TimeSpan.FromSeconds((double)secondsToWaitSpinner2.Value))
      {
      // as long as elapsed time is less then the delay time
      // keep going
      toolStripStatusLabel1.Text = s.Elapsed.ToString(); // show elapsed time
      }
      else
      {
      marqueeProgressBar.Style = ProgressBarStyle.Blocks;
      timer.Stop();
      s.Stop(); // stop stop-watch here
      s.Reset(); // reset stop watch so that when you click again
      // it starts from begining and
      // not from where it stoped last time
      timer.Enabled = false;
      toolStripStatusLabel1.Text = "";
      }
      }

    • Khursheed Fateh 10:32 pm on May 12, 2014 Permalink | Reply

      “Before and after” part of your code is not working because it is freezing/stoping UI/Form for specified time. Because for the duration marquee is set Form remain froozen/unresponsive progressbar fails to show. You can see this by commenting last statement of method like this. Now you will see progressbar marquee was started but was unable to update itself because form was not responding during that time.

      private void progressButton_Click(object sender, EventArgs e)
      {
      marqueeProgressBar.Style = ProgressBarStyle.Marquee;

      int milliSecondsToWait = (int)secondsToWaitSpinner.Value * 1000;
      System.Threading.Thread.Sleep(milliSecondsToWait);

      // marqueeProgressBar.Style = ProgressBarStyle.Blocks;
      }

  • Ali BaderEddin 11:41 pm on January 16, 2010 Permalink | Reply  

    Sortable ListView 


    The Windows Forms ListView control doesn’t provide column sorting functionality. So if you click on a column in a ListView Details view, don’t expect the items to be sorted by the clicked column. To get this functionality, we’ll need to sort the items by the clicked column in the ListView ColumnClick event. I searched online for “Sortable ListView” and I found three MSDN articles talking about this: Sort ListView Column in Visual C#, Sorting ListView Items by Column Using Windows Forms, and How to: Sort ListView Items. None of those implementations takes into consideration the type of the column being sorted. That is, they all do string sorting. If you have dates and numbers in your list, then they’ll not be sorted properly. For example, number 2 will be considered greater than 11. Date time 9/9/1400 will be considered greater than 11/11/2020. Below is an implementation that takes into consideration string, DateTime, int and double types. It can be easily extended to handle more types.

    • Add the SortableListView control to your Windows Form
    • When adding columns to the SortableListView, set the Tag attribute to the type of the column.
    sortableListView.Columns.Add("String Field").Tag = typeof(string);
    sortableListView.Columns.Add("DateTime Field").Tag = typeof(DateTime);
    sortableListView.Columns.Add("Int Field").Tag = typeof(int);
    sortableListView.Columns.Add("Double Field").Tag = typeof(double);
    • Now, you can add the items as usual.

    For example, the below list is sorted by the DateTime field.

    Sortable ListView

    Sortable ListView

     Click on the above image to download the SortableListView control.

     
    • Mayank Raichura 9:21 am on October 6, 2011 Permalink | Reply

      Great article and a really nice control. Just one question…. why didn’t you add a new Property of, say, ColumnType? I mean this could let the tag property to be used for other purposes….

      Anyways….thank you very much for the control….its really really awesome…

  • Ali BaderEddin 9:53 pm on January 12, 2010 Permalink | Reply
    Tags: collection, collection editor, CollectionEditor, event, FormClosed, FormClosedEventHandler, propertygrid, propertyvaluechanged, PropertyValueChangedEventHandler   

    PropertGrid Collection Events 


    You are using the PropertyGrid control to allow the user to edit the properties of an object at run-time from the UI. This works great and is in fact very reliable since this is the same control used by Visual Studio to display the properties of controls. Now that you are letting the user update the object directly, you’d like to get a PropertyValueChanged event whenever the user changes a property, so you can respond to the user’s action. You’ll be able to do that by adding a PropertValueChanged event to the PropertyGrid, which will get triggered every time a property is changed, unless the property is a collection. So if you have a collection inside the property grid selected object and you’d like to be notified when a property changes in that collection or when an item is added\removed, there is no way to do so with the OOB Microsoft PropertyGrid control. Clearly, the reason why the PropertyValueChanged event is not triggered when a collection is changed is because the reference to the collection object is still the same.

    In order to be notified when a property changes inside a collection, follow instructions on this blog. You’ll find this very helpful. However, this solution can’t help you if you’d like to be notified when an item is removed from the collection or when it is added without any of its properties changed. A more generic solution I found was to get a notification when the collection form is closed. This way, I wouldn’t have to worry too much about the steps the user is taking in the collection editor. When the collection form is closed, I get notified and act on the collection object based on its current state.

    Solution

    First, add a reference to System.Design dll in your Visual Studio project. Create the following class, which represents a collection editor that triggers a MyFormClosed event when the collection editor form is closed.

    using System;
    using System.ComponentModel.Design;
    using System.Windows.Forms;
    
    public class MyCollectionEditor : CollectionEditor
    {
        public delegate void MyFormClosedEventHandler(object sender,
                                            FormClosedEventArgs e);
    
        public static event MyFormClosedEventHandler MyFormClosed;
    
        public MyCollectionEditor(Type type) : base(type) { }
        protected override CollectionForm CreateCollectionForm()
        {
            CollectionForm collectionForm = base.CreateCollectionForm();
            collectionForm.FormClosed += new FormClosedEventHandler(collection_FormClosed);
            return collectionForm;
        }
    
        void collection_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (MyFormClosed != null)
            {
                MyFormClosed(this, e);
            }
        }
    }

    To use the above collection editor for the property grid, you can simply add the following attribute above the collection Property of the object which you set to propertGrid.SelectedObject.

    [Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]

    The final part is to create our custom FormClosed event handler and bind it to our custom collection editor as follows:

    public MyForm()
    {
        InitializeComponent();
    
        //  Make the property grid listen to collection properties changes
        MyCollectionEditor.MyFormClosed += new MyCollectionEditor.MyFormClosedEventHandler
                                            (propertyGrid_CollectionFormClosed);
    }
    
    private void propertyGrid_CollectionFormClosed(object s, FormClosedEventArgs e)
    {
        //  Code to run when collection form is closed
    }
     
    • Eugen 7:24 am on January 13, 2010 Permalink | Reply

      Thanks for adding a link to my blog article on your post. I am glad you consider it useful.

    • Muzammil Rehman 10:58 am on January 1, 2012 Permalink | Reply

      Thanks, great job, panic resolving article.

    • jhdhfdf 4:11 am on November 8, 2012 Permalink | Reply

      I GOT ERROR LIKE CONSTRUCTOR OF TYPE sYSTEM.String not found if i follw this code.

c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: