digitalmars.D - Understanding question about lvalues
- jicman (65/65) Feb 22 2005 Let us admire this partial code,
- Dave (6/71) Feb 22 2005 The array length is considered a property of an array and so is consiste...
- jicman (2/7) Feb 22 2005 thanks Dave.
- Derek Parnell (14/91) Feb 22 2005 The 'length' is a property (thus it is really a function call) so it is
Let us admire this partial code, class User { char [] userID = null; char [] fname = null; char [] lname = null; char [] NameOut = null; FCount forms[] = null; } class FCount { char[] FormApp = "Language"; int FormCnt = 0; } User ProcessUserForms(char[] fxml, User u) { int i = 0; bit found = false; char[][] t; t = std.string.split(fxml,"<Application name=\""); t = std.string.split(t[1],".Applicat"); t = std.string.split(t[0],"applications."); if(u.forms == null) //.length < 1) { FCount fc = new FCount(); u.forms.length = 1; u.forms[0] = fc; u.forms[0].FormApp = t[1]; u.forms[0].FormCnt = 1; found = true; } else { for(i=0; i < u.forms.length; i++) { if(std.string.cmp(u.forms[i].FormApp,t[1]) == 0) { found = true; u.forms[i].FormCnt++; break; } } if(!found) { FCount fc = new FCount(); u.forms.length = u.forms.length + 1; // observe this line u.forms[length - 1] = fc; u.forms[length - 1].FormApp = t[1]; u.forms[length - 1].FormCnt = 1; } } return u; } This code compiles perfecty, but if I change this line u.forms.length = u.forms.length + 1; // observe this line almost at the end, to u.forms.length += 1; // observe this line the compiler fails with 16:03:50.47>dmd DTSP1.d ws2_32.lib DTSP1.d(740): u.forms.length is not an lvalue Also, the same happens to, u.forms.length++; I just want to understand why. thanks. josé
Feb 22 2005
The array length is considered a property of an array and so is consistent with properties as described under 'Class and Struct Properties' in http://digitalmars.com/d/property.html (See Note at section bottom). - Dave In article <cvg7i9$1cmt$1 digitaldaemon.com>, jicman says...Let us admire this partial code, class User { char [] userID = null; char [] fname = null; char [] lname = null; char [] NameOut = null; FCount forms[] = null; } class FCount { char[] FormApp = "Language"; int FormCnt = 0; } User ProcessUserForms(char[] fxml, User u) { int i = 0; bit found = false; char[][] t; t = std.string.split(fxml,"<Application name=\""); t = std.string.split(t[1],".Applicat"); t = std.string.split(t[0],"applications."); if(u.forms == null) //.length < 1) { FCount fc = new FCount(); u.forms.length = 1; u.forms[0] = fc; u.forms[0].FormApp = t[1]; u.forms[0].FormCnt = 1; found = true; } else { for(i=0; i < u.forms.length; i++) { if(std.string.cmp(u.forms[i].FormApp,t[1]) == 0) { found = true; u.forms[i].FormCnt++; break; } } if(!found) { FCount fc = new FCount(); u.forms.length = u.forms.length + 1; // observe this line u.forms[length - 1] = fc; u.forms[length - 1].FormApp = t[1]; u.forms[length - 1].FormCnt = 1; } } return u; } This code compiles perfecty, but if I change this line u.forms.length = u.forms.length + 1; // observe this line almost at the end, to u.forms.length += 1; // observe this line the compiler fails with 16:03:50.47>dmd DTSP1.d ws2_32.lib DTSP1.d(740): u.forms.length is not an lvalue Also, the same happens to, u.forms.length++; I just want to understand why. thanks. josé
Feb 22 2005
Dave says...The array length is considered a property of an array and so is consistent with properties as described under 'Class and Struct Properties' in http://digitalmars.com/d/property.html (See Note at section bottom). - Davethanks Dave.
Feb 22 2005
On Tue, 22 Feb 2005 21:18:01 +0000 (UTC), jicman wrote:Let us admire this partial code, class User { char [] userID = null; char [] fname = null; char [] lname = null; char [] NameOut = null; FCount forms[] = null; } class FCount { char[] FormApp = "Language"; int FormCnt = 0; } User ProcessUserForms(char[] fxml, User u) { int i = 0; bit found = false; char[][] t; t = std.string.split(fxml,"<Application name=\""); t = std.string.split(t[1],".Applicat"); t = std.string.split(t[0],"applications."); if(u.forms == null) //.length < 1) { FCount fc = new FCount(); u.forms.length = 1; u.forms[0] = fc; u.forms[0].FormApp = t[1]; u.forms[0].FormCnt = 1; found = true; } else { for(i=0; i < u.forms.length; i++) { if(std.string.cmp(u.forms[i].FormApp,t[1]) == 0) { found = true; u.forms[i].FormCnt++; break; } } if(!found) { FCount fc = new FCount(); u.forms.length = u.forms.length + 1; // observe this line u.forms[length - 1] = fc; u.forms[length - 1].FormApp = t[1]; u.forms[length - 1].FormCnt = 1; } } return u; } This code compiles perfecty, but if I change this line u.forms.length = u.forms.length + 1; // observe this line almost at the end, to u.forms.length += 1; // observe this line the compiler fails with 16:03:50.47>dmd DTSP1.d ws2_32.lib DTSP1.d(740): u.forms.length is not an lvalue Also, the same happens to, u.forms.length++; I just want to understand why. thanks. joséThe 'length' is a property (thus it is really a function call) so it is like saying ... u.forms.length()++; which is not supported because a function call is not an lvalue. That's why 'u.forms.length += 1' also fails. But the approved method u.forms.length = u.form.length + 1; is like saying ... u.forms.length( u.forms.length() + 1 ); which is okay to use. -- Derek Melbourne, Australia 23/02/2005 9:31:49 AM
Feb 22 2005