Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Datentyp

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.09.2003, 19:17 Uhr
Anfänger00



Ich hab eine Klasse geschrieben mit der ich 32-stellige zahlen addieren kann.
Das ist nur das Problem,das ich das nicht in einer schleife machen kann:

C++:
for(....)
{
a+c; // a ist mein datentyp c ist char*
}
// da wird das nur 5 mla oder so gemacht und dann wird die Zahl einfach zu groß


oder a+c+c,das Programm stürzt ab.oder a+c;a+e;a+f,darf immer nur eine variable verwendet werden,sonst stürzt es auch ab.

Das ganze schut so aus:

C++:
header :
class longdez
{
protected:
char            Ziffer[32];
unsigned short  RealZahl[32];
unsigned short  BufferZahl[32];
char            vAusgabe[32];

public:
longdez (); // Konstruktor
void Wert(char*,unsigned short[32]); // Macht aus char eine Zahl
void Zeichen(); // Macht aus einer Zahl einen Buchstaben
const char* Ausgabe();
void plus(short,short); //kann die 32 bit Zahl erhöhen
void minus(short,short);
longdez operator=(char*);
longdez operator+(char*);
longdez operator+(longdez);
};
________________________________________________________________

defininitions.cpp:

#include <iostream>
#include "Objekt.h"
#define typnull "00000000000000000000000000000000"
using namespace std;


longdez::longdez()
{
Wert(typnull,this->RealZahl);
Zeichen();
};

void longdez::Wert(char* Text,unsigned short x[32])
{
for(int i=0;i<32;i++)
{
switch(Text[i])
{
case '0': {x[i]=0;break;}
case '1': {x[i]=1;break;}
case '2': {x[i]=2;break;}
case '3': {x[i]=3;break;}
case '4': {x[i]=4;break;}
case '5': {x[i]=5;break;}
case '6': {x[i]=6;break;}
case '7': {x[i]=7;break;}
case '8': {x[i]=8;break;}
case '9': {x[i]=9;break;}
default : {x[i]=0;break;}
}}};

void longdez::Zeichen()
{
for(int i=0;i<32;i++)
{
switch(this->RealZahl[i])
{
case 0: {this->Ziffer[i]= '0';break;}
case 1: {this->Ziffer[i]= '1';break;}
case 2: {this->Ziffer[i]= '2';break;}
case 3: {this->Ziffer[i]= '3';break;}
case 4: {this->Ziffer[i]= '4';break;}
case 5: {this->Ziffer[i]= '5';break;}
case 6: {this->Ziffer[i]= '6';break;}
case 7: {this->Ziffer[i]= '7';break;}
case 8: {this->Ziffer[i]= '8';break;}
case 9: {this->Ziffer[i]= '9';break;}
default:{this->Ziffer[i]= '0';break;}
}
}
this->Ziffer[32]= '\0';
strcpy(this->vAusgabe,this->Ziffer);
};

const char* longdez::Ausgabe()
{
const char* show;
show=this->vAusgabe;
return show;
}

void longdez::plus(short variable,short x)
{
for(int i=variable;i>=0;i--)
{
if(this->RealZahl[i]>9-x)
{
this->RealZahl[i]=this->RealZahl[i]+x-10;
x=1;
}
else {this->RealZahl[i] += x;break;}
}};

int mystrlen(const char* buffer)
{
    int x=0;
    while(buffer[x] != '\0')x++; //Strings in C sind Nullterminiert
    return x-1;
};
longdez longdez::operator=(char* Ztext)
{
int x = 32;
for(int i=mystrlen(Ztext); i>=0; i--)
{this->Ziffer[x--] = Ztext[i];
switch(Ztext[i])
{
case '0': {this->RealZahl[x]=0;break;}
case '1': {this->RealZahl[x]=1;break;}
case '2': {this->RealZahl[x]=2;break;}
case '3': {this->RealZahl[x]=3;break;}
case '4': {this->RealZahl[x]=4;break;}
case '5': {this->RealZahl[x]=5;break;}
case '6': {this->RealZahl[x]=6;break;}
case '7': {this->RealZahl[x]=7;break;}
case '8': {this->RealZahl[x]=8;break;}
case '9': {this->RealZahl[x]=9;break;}
default : {this->RealZahl[x]=0;break;}
}}
Zeichen();
longdez give;
strcpy(give.vAusgabe,this->Ziffer);
for(int i=0;i<32;i++)
{
give.RealZahl[i]=this->RealZahl[i];
}
return give;
};

longdez longdez::operator+(char* Ptext)
{
int x = 32;
for(int b;b<32;b++)
{
this->Ziffer[ b ]='0';
}

for(int i=mystrlen(Ptext); i>=0; i--)
{this->Ziffer[--x] = Ptext[i];}
Wert(Ziffer,this->BufferZahl);
for(int i=31;i>=0;i--)
{
plus(i,this->BufferZahl[i]);
}
Zeichen();
/*
longdez give;
strcpy(give.vAusgabe,this->Ziffer);
for(int i=0;i<32;i++)
{
give.RealZahl[i]=this->RealZahl[i];
}
return give;
*/

};



Ihr habt zwei Möglickeiten mir zu helfen:
a)ihr findet den Fehler
b)ihr kritisiert den Quatsch und habt ne bessere Idee

Ich hoffe,das das nicht zu viel quellcode ist.

THX

Dieser Post wurde am 27.09.2003 um 19:48 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.09.2003, 19:38 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich das richtig sehe, macht dein +-operator das, was eigentlich ein +=-Operator machen sollte. Ich denke, was du eigentlich willst, ist

C++:
longdez operator+(const longdez &ld1, const longdez &ld2)
{
  longdez ret;
  //... ret den neuen Wert zuweisen
  return ret;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.09.2003, 21:08 Uhr
~(un)wissender
Gast


Es muss const longdez zurückgegeben werden, weil sonst ld1 + ld2 = ld3; möglich wäre, was syntaktisch nicht zulässig ist und auch noch Blödsinn ist.


C++:
const longdez operator+(const longdez &ld1, const longdez &ld2)
{
  longdez ret;
  //... ret den neuen Wert zuweisen
  return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.09.2003, 14:20 Uhr
0xdeadbeef
Gott
(Operator)


Das ist allerdings nur möglich, wenn du nen operator= für die Klasse definierst. Übrigens geht in C++ auch sowas hier:

C++:
int main() {
  int a=0,b=1,c=2;
  (a?b:c)=1;
}


auch, wenn das natürlich nur wenig Sinn macht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 28.09.2003 um 14:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.09.2003, 21:31 Uhr
Anfänger00



thx,jetzt weiß ich was schiefläuft!
Dieser Post wurde am 30.09.2003 um 21:32 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.09.2003, 22:55 Uhr
~(un)wissender
Gast


operator= ist doch für jede Klasse definiert, oder nicht?
Wenn du es nicht selbst machst, dann gibt default=, mein ich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.10.2003, 14:20 Uhr
Anfänger00




Zitat:
~(un)wissender postete
operator= ist doch für jede Klasse definiert, oder nicht?
Wenn du es nicht selbst machst, dann gibt default=, mein ich.



Das mag sein,aber ich möchte auch char* übergeben können.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.10.2003, 14:35 Uhr
0xdeadbeef
Gott
(Operator)


Es gibt nen Default-Copykonstruktor, aber keinen operator=, denke ich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.10.2003, 14:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Klar gibt es auch einen default op=. Denn andernfalls wäre C++ inkompatibel zu C (in C kann man ja auch Struktur-Instanzen einanderzuweisen) und zum andern wäre das eine recht willkürliche Einschränkung.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: