Typecasting fails
| Bugzilla Link | 1124 |
| Created on | Jul 10, 2014 17:57 |
| Version | svn |
| OS | Linux |
| Architecture | PC |
| Attachments |
, rgb.sac, program.sac
|
Extended Description
Here is an experiment:
We define a type called rgb in the module called rgb.sac like this:
$ cat -n rgb.sac
1 module rgb;
2
3 export all;
4 typedef int[3] rgb;
5
6 int[.] shape (rgb[.,.] a)
7 {
8 return Array::drop ([Array::- 1], Array::shape ((int[.,.,.])a));
9 }
We also define the shape function.
Now the main progam looks like this:
$ cat -n program.sac
1 use String: {string};
2 use BMP: all;
3 use rgb: all;
4
5 rgb[.,.] my_readBMP( string name)
6 {
7 img = BMP::readBMP( name);
8 StdIO::print (Color8::shape (img));
9 b = (int[.,.,.])img;
10 StdIO::print (Array::shape (b));
11 a = (rgb[.,.])b;
12 StdIO::print (shape (a));
13 return a;
14 }
15
16 int main()
17 {
18 img = my_readBMP("feedsmall.bmp");
19 StdIO::print (shape (img));
20 return 0;
21 }
and the output of the program is this:
$ ./a.out
Dimension: 1
Shape : < 2>
<10 10 >
Dimension: 1
Shape : < 3>
<10 10 3 >
Dimension: 1
Shape : < 0>
<>
Dimension: 1
Shape : < 3>
<10 10 22851456 >
So, as you can see, the shape information after the typecast to rgb[.,.] type is wrong. If we inline the shape in rgb, the problem goes away. If we introduce object references inside the shape, the problem goes away:
int[.] shape (rgb[.,.] a)
{
sh= Array::drop ([Array::- 1], Array::shape ((int[.,.,.])a));
StdIO::print (sh);
return sh;
}
O_o
