Index: cpp/frams/_demos/loader_test_param.cpp
===================================================================
--- cpp/frams/_demos/loader_test_param.cpp	(revision 326)
+++ cpp/frams/_demos/loader_test_param.cpp	(revision 329)
@@ -13,6 +13,10 @@
  After loading, objects are printed ("saved") to standard output.
  Additional information and messages are printed to standard error.
- You can redirect both streams if needed.
-
+ You can redirect one or both streams if needed.
+ 
+ A sample input file for this program is "loader_test_param.in",
+ so you can run this program from the "cpp" directory as
+ ./loader_test_param  frams/_demos/loader_test_param.in
+ 
  \include loader_test_param.cpp
  */
@@ -22,8 +26,8 @@
 public:
 	SString text, longtext, deftext;
-	int i1, i2, i3;
-	float f1, f2, f3;
-	ExtValue x;
-	int notchanged,notloaded,notsaved;
+	paInt i1, i2, i3, i4;
+	double f1, f2, f3, f4;
+	ExtValue x1, x2;
+	int notchanged, notloaded, notsaved;
 };
 
@@ -31,5 +35,5 @@
 ParamEntry data_paramtab[] =
 {
-	{ "Data", 1, 12, "data", },
+	{ "Data", 1, 16, "data", },
 	{ "text", 0, 0, "Text", "s 0 10", FIELD(text), }, // 10 = length limit
 	{ "longtext", 0, 0, "Long text", "s 1", FIELD(longtext), }, // 1 = multiline, 0 = unlimited
@@ -38,7 +42,11 @@
 	{ "i2", 0, 0, "Integer 2", "d -5 5 1", FIELD(i2), }, // [-5..5] integer, default=1
 	{ "i3", 0, 0, "Integer 3", "d -1 3 0 ~Minus~Zero~One~Two~Three", FIELD(i3), }, // [0..3] + text labels (Param::getText())
+	{ "i4", 0, 0, "Integer 4", "d 0 10 15", FIELD(i4), }, // invalid default
 	{ "f1", 0, 0, "Float 1", "d", FIELD(f1), },          // unrestricted float
 	{ "f2", 0, 0, "Float 2", "f -100 100 -100", FIELD(f2), }, // [-100..100] float, default=-100
-	{ "x", 0, 0, "Untyped", "x", FIELD(x), }, // any type (class ExtValue)
+	{ "f3", 0, 0, "Float 3", "f -10 10", FIELD(f3), }, // [-10..10] float
+	{ "f4", 0, 0, "Float 4", "f 1 -1 404", FIELD(f4), }, // unrestricted float (invalid min>max), default=44
+	{ "x1", 0, 0, "Untyped 1", "x", FIELD(x1), }, // any type (class ExtValue)
+	{ "x2", 0, 0, "Untyped 2", "x", FIELD(x2), }, // any type (class ExtValue)
 	{ "notchanged", 0, PARAM_READONLY, "Read only field", "d", FIELD(notchanged), }, // neither load() nor setDefault() can change this
 	{ "notloaded", 0, PARAM_DONTLOAD, "Unloadable field", "d", FIELD(notloaded), }, // load() does not change this
@@ -65,6 +73,6 @@
 	Param param(data_paramtab, &data);
 
-	data.notchanged=100;
-	data.notloaded=200;
+	data.notchanged = 100;
+	data.notloaded = 200;
 
 	loader.addObject(&param);
@@ -91,5 +99,6 @@
 			for (int i = 0; i < param.getPropCount(); i++)
 				fprintf(stderr, "%s=%s\n", param.id(i), (const char*)param.getText(i));
-			fprintf(stderr, "type of 'x' is: %s\n", (const char*)data.x.typeDescription());
+			fprintf(stderr, "type of 'x1' is: %s\n", (const char*)data.x1.typeDescription());
+			fprintf(stderr, "type of 'x2' is: %s\n", (const char*)data.x2.typeDescription());
 			fprintf(stderr, "-----\n\n");
 			param.save(&virt_stdout);
Index: cpp/frams/_demos/loader_test_param.in
===================================================================
--- cpp/frams/_demos/loader_test_param.in	(revision 326)
+++ cpp/frams/_demos/loader_test_param.in	(revision 329)
@@ -6,21 +6,26 @@
 Long multiline text
 1\\~
-22\~
+22\~\n
 333\ \\
 4444~
 deftext:other
 i1:-12345
-i2:10
+i2:-0X10
 i3:2
+f4:22222
+f3:2222
+f2:222
 f1:22
-f2:222
-x:3.14
+f4:2
+x1:3.14
+x2:314
 notloaded:44
-unchanged:444
+notchanged:444
 notsaved:4444
+nosuchfield:value
 
-#all fields except x will have default values
+#all fields except x1 will have default values
 data:
-x:just x (string extvalue)
+x1:just x (string extvalue)
 
 someotherdata:
@@ -30,12 +35,21 @@
 data:
 text:abcdefghijklmnopqrstuvwxyz
-i1:uu
+i1:notanumber
 i2:-99999
-i3:99999
-x:@Serialized:[1,2,3,1.00000,2e0,3.0,"x","]","\""]
+i3:+99999
+i4:notanumber_with_default
+f1:-0x100
+f2:-1e
+f3:+1e1
+f4:1ee
+x1:@Serialized:[1,2,3,1.00000,2e0,3.0,"x","]","\""]
+x2:@Serialized:{"a":[1,2,3],"b":"abc","c":1.23}
 
 data:
-i1:0x100
+i1:+0X10
 i2:1e2
 i3:-10
-x:@Serialized:{"a":[1,2,3],"b":"abc","c":1.23}
+x1:next line will overwrite this
+x1:@Serialized:{"a":[1,2,3],"b":^1,"c":^1}
+x2:@Serialized:[[100,^1],["abc"],[300,^2]]
+i3:5
