Re: I'm a newbie. Is this code ugly?
"Richard Herring" <junk@[127.0.0.1]> ha scritto nel messaggio
news:FLTpfxBUtFWLFwWP@baesystems.com...
In message <4b57ff58$0$1135$4fafbaef@reader1.news.tin.it>, io_x
<a@b.c.invalid> writes
"Richard Herring" <junk@[127.0.0.1]> ha scritto nel messaggio
news:eVoPozi2GzVLFwND@baesystems.com...
In message <4b57269b$0$1132$4fafbaef@reader1.news.tin.it>, io_x
<a@b.c.invalid> trolled
"Richard Herring" <junk@[127.0.0.1]> ha scritto nel messaggio
news:4iB21VKQpuVLFw7l@baesystems.com...
In message <4b56d0c2$0$828$4fafbaef@reader5.news.tin.it>, io_x
<a@b.c.invalid>
writes
"gert" <27hiro@googlemail.com> ha scritto nel messaggio
news:e4951ec7-f09b-4b74-9cf8-a7a9e19e400c@22g2000yqr.googlegroups.com...
I'm using a class which can sinksort an array of it's own objects and
an example T class, which can have names and stuff...
I was in doubt about what to do about nearly any line, so I would love
any of your recommendations...
what about this?
Horrible.
This code works, after a fashion, because those strings are all literals.
What
would happen if you were reading values from a file?
no problem, i make local copy
Still horrible.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define R return
Using macros to represent language keywords is inexcusable obfuscation. Are
you J*ff R*lf?
using namespace std;
char* faiMemCopia(char* v)
Why are you (badly) reinventing strcpy() ?
{int i, n;
char *p;
if(v==0) R 0;
n=strlen(v);
if(n<=0) R 0;
Why? There's nothing intrinsically wrong with a zero-length string.
yes here i would say "if(n<0) R 0;"
And under what circumstances would strlen() ever return a negative value?
it seems strlen() here returned one unsigned type: size_t
here size_t is "unsigned int" of 32 bit but this means
strlen can return 0xF0000000 that is a negative number
seen it like int; and for me that negative number is not ok
[...]
int alloca(char *num, char *key, char *surname)
This sets up the class invariant. Put it in a constructor.
here i have one array of T* ;
the problem is always the same:
i have a class Y
Y *p;
p is class pointer
than i want build for p the Y class
than i don't know how use constructor-destructor for Y for that object
what i can do is
p=(Y*) malloc(sizeof(Y));
p->inizialize();
and
for deallocate it
p->deinizialize();
free(p);
The C++ way to do that is:
p = new Y;
/* ... */
delete p;
and the constructor and destructor of Y will be called without any work on
your part.
thank you, i did not think about that, thanks
why the default operator delete
has one argument of type size_t?
void operator delete(void*, size_t);
there is something hidden in the call delete?
for example here
T a(1,1,1);
T *p=new T(a)
....
delete p;
-----------------------------
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define R return
using namespace std;
char* faiMemCopia(char* v)
{int i, n;
char *p;
if(v==0) R 0;
n=strlen(v);
if(n<0) R 0;
p=(char*) malloc(n+1);
if(p==0) R 0;
for(i=0; i<n; ++i)
p[i]=v[i];
p[i]=0;
R p;
}
class Person{
public:
char *num_, *surname_;
char *key_;
Person(){num_=0; surname_=0; key_=0;}
void InitializePointer(char *num, char *key, char *surname)
{num_=0; surname_=0; key_=0;
num_=faiMemCopia(num);
if(num_==0) {la:
cerr << "Need more memory\n";
exit(0);
}
surname_=faiMemCopia(surname);
if(surname==0)
{la0:
free(num_); num_=0;
goto la;
}
key_=faiMemCopia(key);
if(key_==0){free(surname_); surname_=0;
goto la0;
}
}
void InitializePointer(Person& a)
{InitializePointer(a.num_, a.key_, a.surname_);}
Person(char *num, char *key, char *surname)
{this->InitializePointer(num, key, surname);}
Person(Person& a){this->InitializePointer(a);}
void FreePointer(void)
{free(num_); free(key_); free(surname_);
num_=0; surname_=0; key_=0;
}
~Person(){this->FreePointer();}
Person& operator=(Person& r)
{if(&r!=this)
{free(num_); free(key_); free(surname_);
this->InitializePointer(r);
}
R *this;
}
int cmp1(Person& a, Person& b){R strcmp(a.key_,b.key_);}
};
template <class T> class RosList{
public:
T** v;
int n;
int sz;
// these function are not called
void* operator new(size_t sz){R malloc(sz);}
void operator delete(void* p){free(p);}
RosList(){v=0; n=0; sz=0;}
int add(T& a)
{if(sz<=n){T **p;
p=(T**)realloc(v, (n+128)*sizeof(T*));
if(p==0) R 0;
sz=n+128;
v =p;
}
v[n] = new T(a);
if(v[n]==0) R 0;
++n;
R 1;
}
void sort(int (*cmp)(T& a, T& b))
{int i, hit=1, len=n;
T *temp;
while(len>1&&hit)
{len--;
hit=0;
for(i=0; i<len; ++i)
if(cmp( *(v[i]), *(v[i+1]) )>0)
{temp=v[i]; v[i]=v[i+1]; v[i+1]=temp; hit=1;}
}
}
int sort(int i1, int i2, int (*cmp)(T& a, T& b))
{int i, hit=1, len;
T *temp;
if(i1==i2&&i2<n&&i2>=0) R 1;
if(i1>=i2) R 0;
if(i2> n) R 0;
len=i2-i1;
while(len>1&&hit)
{len--;
hit=0;
for(i=i1; i<len; ++i)
if(cmp( *(v[i]), *(v[i+1]) )>0)
{temp=v[i]; v[i]=v[i+1]; v[i+1]=temp; hit=1;}
}
R 1;
}
~RosList(){int i=n;
for(--i; i>=0; --i)
delete v[i];
free(v);
}
T& operator[](int i)
{static T no;
if(i<0||i>=n)
{cout << "\n\aIndice fuori dei limiti\n"; R no;}
R *(v[i]);
}
};
int cmp(Person& a, Person& b){R strcmp(a.key_,b.key_);}
int cmp2(Person& a, Person& b){R strcmp(a.num_,b.num_);}
int main(void)
{int i;
RosList<Person> a;
i=1;
i*=a.add(Person("a","Mann","Thomas"));
i*=a.add(Person("b","Satie","Erik"));
i*=a.add(Person("c","Goldfarb","Sarah"));
i*=a.add(Person("d","Ravel","Maurice"));
i*=a.add(Person("e","Hideyuki","Tanaka"));
i*=a.add(Person("f","Twain","Mark"));
if(i==0) {cout << "Memory error\n"; R 0;}
a.sort(cmp);
for(i=0; i<a.n; ++i)
cout <<a.v[i]->surname_<<"\t"<<a.v[i]->key_<<"\n";
cout << "------------------------\n";
a.sort(0, a.n, cmp2);
for(i=0; i<a.n; ++i)
cout <<a[i].surname_<<"\t"<<a[i].key_<<"\n";
R 0;
}
-------------
Sarah Goldfarb
Tanaka Hideyuki
Thomas Mann
Maurice Ravel
Erik Satie
Mark Twain
------------------------
Thomas Mann
Erik Satie
Sarah Goldfarb
Maurice Ravel
Tanaka Hideyuki
Mark Twain