Re: Multidimensional array member initialization
"io_x" <a@b.c.invalid> ha scritto nel messaggio
news:4b48f314$0$1110$4fafbaef@reader2.news.tin.it...
What about this?
Is not this better than using "vector"?
-------
#include <iostream>
#include <cstdlib>
#include <stdint.h>
#define u8 uint8_t
#define i8 int8_t
#define u32 uint32_t
#define i32 int32_t
// float 32 bits
#define f32 float
#define f64 double
#define S sizeof
#define R return
#define P printf
#define F for
using namespace std;
template <typename T> class Image{
public:
u32 height;
u32 width;
T* pxs;
Image(i32 h, i32 w)
{i32 i, g;
height=0; width=0; pxs=0;
if(w<=0||h<=0) return;
g =h*S(T);
if(g<=0) return;
g*=w;
if(g<=0) return;
cout << "Size=" << g << "\n";
pxs=(T*) malloc(g);
if(pxs==0) return;
height=h; width=w;
}
~Image(){free(pxs);}
T& v(int h, int w)
{return *(pxs+w+h*width);}
int fill (T& color)
{u32 x, y;
if(pxs==0) R 0;
for(x=0; x<height; ++x)
{for(y=0; y<width; ++y)
(*this).v(x,y)=color;
}
R 1;
}
int fill1(T& color)
{u32 x, end;
T *p;
if(pxs==0) R 0;
p=pxs;
end=height*width;
for(x=0; x<end; ++x, ++p)
*p=color;
R 1;
}
class Indexer{
public:
T* data;
Indexer(T* dat) : data(dat){}
T& operator[](int x){return data[x];}
};
// img[y] is Indexer
// img[y][x] is *&T
Indexer operator[](int y)
{return Indexer(pxs+y*width);}
};
struct Color3d{f32 r, g, b;};
struct Color3d1{f64 r, g, b;};
int main(void)
{Color3d1 h={0.78373, 0.1383, 1-0.78373-0.1383};
Image<Color3d1> g(768, 1024);
cout << "Inizio\n";
if(g.pxs==0)
{cout << "Error\n"; return 0;}
g.fill1(h);
cout << "(r,g,b)==(" << g.v(0,0).r << ", "
<< g.v(0,0).g << ", "
<< g.v(767,1024).b << ")\n";
cout << "g[767][1024].b==" << g[767][1024].b << "\n";
cout << "g[767][1023].b==" << g[767][1023].b << "\n";
cout << "end\n";
R 0;
}
--------
Size=18874368
Inizio
(r,g,b)==(0.78373, 0.1383, 0)
g[767][1024].b==0
g[767][1023].b==0.07797
end