- Reference should be initialized and pointer need not be.
- Reference can’t point to NULL and pointer can.
- Reference can’t be changed to some other objects it is once initialized but pointer can be.
- Pointer can be incremented or decremented and subjected to any pointer arithmetic operations, but reference can’t.
Sunday, March 2, 2008
Difference between Reference and Pointer
Difference between Reference and Pointer in C++
Sunday, February 10, 2008
Quotes
Half the world is composed of people who have something to say and can't; the other half have nothing to say and keep saying it.
If anything can go wrong, it will.
Chance favors the prepared mind.
If anything can go wrong, it will.
Chance favors the prepared mind.
Wednesday, January 30, 2008
Add() method in .NET (passing parameter)
Collection objects have Add() method in .NET. It is very important to understand how it works.
Code Block 1:
TableRow row = new TableRow();
for (int i = 0; i < resultFields.Count; i++)
{
foreach(string str in resultFields[i])
{
TableCell cell = new TableCell();
cell.Text = str;
this.Response.Write(str);
row.Cells.Add(cell);
}
tbl_rsltFields.Rows.Add(row);
}
In this example, if resultFields.Count is 2, how many rows do you think are in the tbl_rsltFields?
The answer is 1. It is worth noticing this case.
Code Block 2:
for (int i = 0; i < resultFields.Count; i++)
{
TableRow row = new TableRow();
foreach(string str in resultFields[i])
{
TableCell cell = new TableCell();
cell.Text = str;
this.Response.Write(str);
row.Cells.Add(cell);
}
tbl_rsltFields.Rows.Add(row);
}
In this case, the answer is 2.
Actually, if we try to add "row.Cells.Clear();" right after "tbl_rsltFields.Rows.Add(row)" in code block 1, there will be nothing contained in tbl_rsltFields at last. Based on this fact, we know that by calling Add() method, it only gets a copy of the reference, instead of making a copy of the whole row. So it acts like it is passing reference by value.
Code Block 1:
TableRow row = new TableRow();
for (int i = 0; i < resultFields.Count; i++)
{
foreach(string str in resultFields[i])
{
TableCell cell = new TableCell();
cell.Text = str;
this.Response.Write(str);
row.Cells.Add(cell);
}
tbl_rsltFields.Rows.Add(row);
}
In this example, if resultFields.Count is 2, how many rows do you think are in the tbl_rsltFields?
The answer is 1. It is worth noticing this case.
Code Block 2:
for (int i = 0; i < resultFields.Count; i++)
{
TableRow row = new TableRow();
foreach(string str in resultFields[i])
{
TableCell cell = new TableCell();
cell.Text = str;
this.Response.Write(str);
row.Cells.Add(cell);
}
tbl_rsltFields.Rows.Add(row);
}
In this case, the answer is 2.
Actually, if we try to add "row.Cells.Clear();" right after "tbl_rsltFields.Rows.Add(row)" in code block 1, there will be nothing contained in tbl_rsltFields at last. Based on this fact, we know that by calling Add() method, it only gets a copy of the reference, instead of making a copy of the whole row. So it acts like it is passing reference by value.
Wednesday, January 23, 2008
Application["UserCount"] += 1 doesn't work
Why does Application["UserCount"] += 1; incur compiler error? It's the same reason why Application["UserCount"] = Application["UserCount"] + 1; doesn't work either.
And once you know the correct way should be: Application["UserCount"] = (int)Application["UserCount"] + 1; you'll also know (int)Application["UserCount"] += 1; is wrong too.
And once you know the correct way should be: Application["UserCount"] = (int)Application["UserCount"] + 1; you'll also know (int)Application["UserCount"] += 1; is wrong too.
Tuesday, December 11, 2007
What's wrong with Monitor::Enter()
Suppose we have the following variable we'd like to set as a state and we'd like to make it thread safe (at most one thread is allowed to access the variable):
bool workQueued;
Now if we write something like this, it's not gonna work:
Monitor::Enter(__box(workQueued));
try
{
workQueued = true;
}
__finally
{
Monitor::Exit(__box(workQueued));
}
Why it will not work? The problem is, after workQueued is boxed, the value is not store anywhere. So the second thread reaches here will execute Enter statement with another object value.
To make it work as desired, we need to create a object whose only purpose is to act like a lock:
Object* lock;
Then, we feed this object to Enter and Exit method:
Monitor::Enter(lock);
try
{
workQueued = true;
}
__finally
{
Monitor::Exit(lock);
}
bool workQueued;
Now if we write something like this, it's not gonna work:
Monitor::Enter(__box(workQueued));
try
{
workQueued = true;
}
__finally
{
Monitor::Exit(__box(workQueued));
}
Why it will not work? The problem is, after workQueued is boxed, the value is not store anywhere. So the second thread reaches here will execute Enter statement with another object value.
To make it work as desired, we need to create a object whose only purpose is to act like a lock:
Object* lock;
Then, we feed this object to Enter and Exit method:
Monitor::Enter(lock);
try
{
workQueued = true;
}
__finally
{
Monitor::Exit(lock);
}
Wednesday, December 5, 2007
LINK : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
What the heck?! If you've spent more than ten minutes just trying to find where to set EDITANDCONTINUE property in VC++ project property page, you are not alone. It can be set through: (Under Project Property Pages) Configuration Properties -> C/C++ -> General -> Debug Information Format.
OK. Now I've set it NOT to be /ZI and disabled incremental link, why the darn VS still complain the same warning. Remember that no matter how bizarre a problem seems to be, computer always works as expected. Why don't you check the project properties of other projects that this project depends on?
OK. Now I've set it NOT to be /ZI and disabled incremental link, why the darn VS still complain the same warning. Remember that no matter how bizarre a problem seems to be, computer always works as expected. Why don't you check the project properties of other projects that this project depends on?
Monday, December 3, 2007
Visual Studio got stuck when opening sln file
Sometimes VS may get stuck when we double-click a .sln file. We can see the file name on which it got stuck. But even if we try to rename that file or replace with another one with the same name, it may still not work. In this case, try to delete the corresponding .suo file.
Subscribe to:
Posts (Atom)