On Wed, 15 Apr 2009 01:01:28 +0400, Andrew Spott <andrew.sp...@gmail.com> wrote:

So, the attached is supposed to be a class that creates a vector of any type (I would like it to only take numerical values (int, float, real, double, etc), however, I am ok with it taking others (not that I see why someone would use it that way).

I tried to compile it with the following, but it won't compile. I don't really understand the errors I'm getting either.

Can someone tell me what I'm doing wrong? If you need more information, let me know.

-Andrew

void testvector() {
        auto v = new Vector!(float)(3, 12.0);
        writefln(v.toString());
        int n = 0;
        
        while (n < n.size()) {
                v[n] = n;
        }
        
        writefln(v.toString());

}

You've got quite a few errors in your code:

module vector;
private import std.string;

class Vector(T) {
private:
        T[] v;
//      int nn; // there is no need to store a size of array separately. It is 
available as v.length
        
public:
        this() {
        }

        this(int n) {
//              nn = n; // not needed
                v = T[n]; // wrong, should be: v = new T[n];
        }

        this(int n, T a) {
//              nn = n;
                v = T[n]; // same here (see above)
                while (n > 0) { // v[] = a; is faster and does the same as the 
loop below
                        n--;
                        v[n] = a;
                }
        }

        T opIndex(int n, int m) { // this won't work, because float is not an 
array
                return v[n][m];   // try this: T opIndex(int n) { return v[n]; }
        }

        opIndexAssign(T)(T a, int n, int m) { // no need for a template, also 
you forgot to write function return type
                v[n][m] = a;             // should be: void opIndexAssign(int 
n, T a) { v[n] = a; }
        }

        int size() {
                return nn; // should be: return v.length;
        }

        string toString() {
                string s = "[";
                int n = 0;
                while ( n < nn) {
                        s ~= v[n] ~ ", ";
                }
                return s ~ "]";
        }

        ~this() { // no need for this one
        }
}


void testvector() {
        auto v = new Vector!(float)(3, 12.0);
        writefln(v.toString());
        int n = 0;
        
        while (n < n.size()) { // infinite loop
                v[n] = n;
        }
        
        writefln(v.toString());

}

Also, try using foreach instead of while and for loops.

For example,

string toString() {
   if (v.length == 0) return "[]";
   string s = "[";
   foreach (k; v[0..$-1]) {
       s = std.string.format("%s, %s", s, k);
   }
   s = std.string.format("%s, %s]", s, v[$-1]);
}

void testvector() {
   // ...
   foreach (index, ref value; v) {
       value = index;
   }
   // ...
}

Hope that helps.

Reply via email to