 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Weber Guest
|
Posted: Wed Jun 01, 2005 8:06 pm Post subject: Problem mit Array |
|
|
Hallo NG,
ich möchte gern ein Array zurückgeben, leider macht der das nicht
vielleicht,
hast jemand eine Idee, wie ich das machen kann?
Anbei mein Code, etwas weiter unten, weil ich nicht genau weiß ob ich mir
vielleicht vorher schon was verbaut hab. Bin noch nicht sehr erfahren mit
Cpp, bitte seht mir daher die sicherlich enthaltenen Schwächen nach.
es geht um die Funktion getArray;
<
void getArray(string array[5][14])
{
//return array;
};
halt statt void, vom typ eines Arrays
Viele Grüße
Michael
______________________________________________________________
//Stand:01.06.2005
#include <math.h>
#include <string.h>
class KONTAKT
{
private:
string name;
string vorname;
string strasse;
string ort;
string telefonnummer;
string email;
string hausnummer;
string plz;
string termin;
string array[5][14];
friend class TERMIN;
public:
void Feld_Init(int);
void getArray(string array[5][14])
{
//return array;
};
};
/* void KONTAKT::Feld_Init()
{
cout<
cin>> name;
array[i][0]=name;
cout<
cin>> vorname;
cout<
cin>> strasse;
cout<
cin>> hausnummer;
cout<
cin>> plz;
cout<
cin>> ort;
cout<
cin>> telefonnummer;
cout<
cin>>email;
//cout<
//getchar();
};*/
void KONTAKT::Feld_Init(int i)
{
cout<
cin>> name;
array[i][0]=name;
cout<
cin>> vorname;
array[i][1]=vorname;
cout<
cin>> strasse;
array[i][2]=strasse;
cout<
cin>> hausnummer;
array[i][3]=hausnummer;
cout<
cin>> plz;
array[i][4]=plz;
cout<
cin>> ort;
array[i][5]=ort;
cout<
cin>> telefonnummer;
array[i][6]=telefonnummer;
cout<
cin>>email;
array[i][7]=email;
};
class Dienstkontakt: public KONTAKT
{
private:
string name_Unternehmen;
string art_Unternehmen;
public:
void Feld_Init_dienst();
};
/*void Dienstkontakt::Feld_Init_dienst()
{
KONTAKT::Feld_Init();
cout<
cin>> name_Unternehmen;
cout<
cin>> art_Unternehmen;
//cout<
//getchar();
};*/
void Dienstkontakt::Feld_Init_dienst()
{
int i;
KONTAKT *kontakt1;
(*kontakt1).Feld_Init(i);
};
class Privatkontakt: public KONTAKT
{
private:
string geburtsdatum;
string geschlecht;
string hobbie_1;
string hobbie_2;
string hobbie_3;
string hobbie_4;
string hobbie_5;
public:
void Feld_Init_privat();
void Einlesen_hobbies();
};
void Privatkontakt::Feld_Init_privat()
{
int i;
int hobby;
char e_hobby[5];
KONTAKT::Feld_Init(i);
cout<
cin>> geburtsdatum;
cout<
cin>> geschlecht;
do
{
cout << "Moechten Sie ein Hobby oder Interessen eingeben [1=ja,2=nein]?";
cin>> e_hobby;
hobby=atoi(e_hobby);
if(hobby != 2 && hobby !=1)
{
hobby=0;
};
}while(hobby==0);
cout<
int falsch=0;
do
{
switch (hobby)
{
case 1:
Einlesen_hobbies();
falsch=1;
break;
case 2:
falsch=1;
break;
default:
cout << "Ich konnte Ihre Eingabe leider nicht verarbeiten.";
break;
};
}while (falsch !=1);
//getchar();
};
void Privatkontakt::Einlesen_hobbies()
{
int hobbie;
do
{
char e_hobbie[5];
cout<<"Bitte geben Sie das Hobbie oder Interesse ein:";
cin >> hobbie_1;
cout <<"Wollen Sie ein weiteres Hobbie eingeben [1=ja, 2=nein]?";
cin>> e_hobbie;
hobbie=atoi(e_hobbie);//61
if(hobbie != 2 && hobbie !=1)
{
hobbie=0;
};
}while(hobbie == 0);
if (hobbie==1)
{
do
{
char e_hobbie[5];
cout<<"Bitte geben Sie das Hobbie oder Interesse ein:";
cin >> hobbie_2;
cout <<"Wollen Sie ein weiteres Hobbie eingeben [1=ja, 2=nein]?";
cin>> e_hobbie;
hobbie=atoi(e_hobbie);
if(hobbie != 2 && hobbie !=1)
{
hobbie=0;
};
}while(hobbie == 0);
if (hobbie ==1)
{
do
{
char e_hobbie[5];
cout<<"Bitte geben Sie das Hobbie oder Interesse ein:";
cin >> hobbie_3;
cout <<"Wollen Sie ein weiteres Hobbie eingeben [1=ja, 2=nein]?";
cin>> e_hobbie;
hobbie=atoi(e_hobbie);
if(hobbie != 2 && hobbie !=1)
{
hobbie=0;
};
}while(hobbie == 0);
if (hobbie ==1)
{
do
{
char e_hobbie[5];
cout<<"Bitte geben Sie das Hobbie oder Interesse ein:";
cin >> hobbie_4;
cout <<"Wollen Sie ein weiteres Hobbie eingeben [1=ja, 2=nein]?";
cin>> e_hobbie;
hobbie=atoi(e_hobbie);
if(hobbie != 2 && hobbie !=1)
{
hobbie=0;
};
}while(hobbie == 0);
if (hobbie ==1)
{
cout<<"Bitte geben Sie das Hobbie oder Interesse ein:";
cin>> hobbie_5;
};
};
};
};
};
______________________________________________________________
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thorsten Nitz Guest
|
Posted: Thu Jun 02, 2005 11:54 am Post subject: Re: Problem mit Array |
|
|
Michael Weber schrieb:
| Quote: | ich möchte gern ein Array zurückgeben,
|
Geht nicht.
| Quote: | leider macht der das nicht
vielleicht,
hast jemand eine Idee, wie ich das machen kann?
|
In der Reihenfolge zunehmender Hässlichkeit:
1. std::vector benutzen
2. Array in struct verpacken
3. Mit Zeiger arbeiten.
Letzteres ist ein Minenfeld, also erst versuchen, wenn Du Zeiger und
Arrays wirklich verstanden hast.
| Quote: | es geht um die Funktion getArray;
kontakt.h
void getArray(string array[5][14])
{
//return array;
};
|
Warum Du hier das Feld an das Programm zurückgeben willst, das
ebendieses Feld selbst übergeben hat, ist nicht unmittelbar
einleuchtend. Bei einer Get-Methode erwarte ich etwa
std::vector<std::string> MyClass::getArray() const
{
return array;
}
D.h. ohne Parameter und const.
| Quote: | #include <string.h
|
Dieser Header enthält Funktionen im C-Stil, die nullzeichenterminierte
char-Arrays manipulieren. Er enthält _keine_ Klasse namens "string".
Daneben gibt es den Header
std::string enthält.
| Quote: | class KONTAKT
Bezeichner komplett in Großbuchstaben sollte man für Präprozessormakros |
reservieren, dann erlebt man weniger Überraschungen, wenn man mal einen
Bezeichner aus Versehen doppelt verwendet.
| Quote: | {
private:
string name;
Hier sollte der Compiler schon meckern, da die Klasse "string" nicht |
definiert ist.
| Quote: | string vorname;
string strasse;
string ort;
string telefonnummer;
string email;
string hausnummer;
string plz;
string termin;
|
Diese Variablen benutzt Du im Folgenden als temporäre, lokale Variablen.
Sie gehören deshalb nicht in die Klasse, sondern in die jeweilige Methode.
| Quote: | string array[5][14];
Du möchtest 14 Datensätze mit jeweils 5 Feldern abspeichern (wobei Du 9 |
Merkmale einliest?), entnehme ich dem nachfolgenden Code. Da macht man
für die Datensätze einen Typ, z.B.
struct Kontakt {
std::string name;
std::string vorname;
std::string strasse;
std::string ort;
std::string telefonnummer;
std::string email;
std::string hausnummer;
std::string plz;
std::string termin;
}
und legt in der Klasse, die alle Datensätze verwaltet, einen Container an:
class Kontakverzeichnis {
std::vector<Kontakt*> array; // Wir brauchen Zeiger, um später
// Unterklassen von Kontakt verwalten
// zu können
public:
void InitField() {
// alle Felder eingeben
Kontakt* neuerKontakt = new Kontakt;
std::cout << "Name: n";
std::cin >> neuerKontakt->name;
// usw.
// Datensatz abspeichern
array.push_back(neuerKontakt);
}
// Kontakt zu Nummer
Kontakt getKontakt(int index) const {
return array[index]; // Achtung, keine Feldgrenzenprüfung
}
// Und weil wir mit Zeigern arbeiten, brauchen wir einen Destruktor
~Kontaktverzeichnis() {
for (std::vector<Kontakt*>::iterator i = array.begin();
i != array.end();
++i)
delete (*i); // Kontakt zerstören
}
};
Soweit ein paar Gedanken, die mir beim Überfliegen Deine Codes gekommen
sind.
Tschö, wa!
Thorsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jörg Barfurth Guest
|
Posted: Sun Jun 05, 2005 10:19 pm Post subject: Re: Problem mit Array |
|
|
Hi,
Michael Weber wrote:
| Quote: | ich möchte gern ein Array zurückgeben, leider macht der das nicht
|
Wer ist der? Ich nehme mal an hier feht 'Compiler' (oder etwas ähnliches)?!
| Quote: | vielleicht,
hast jemand eine Idee, wie ich das machen kann?
|
Es kommt darauf an wozu du das willst.
| Quote: | Anbei mein Code, etwas weiter unten, weil ich nicht genau weiß ob ich mir
vielleicht vorher schon was verbaut hab. Bin noch nicht sehr erfahren mit
Cpp, bitte seht mir daher die sicherlich enthaltenen Schwächen nach.
|
Vermutlich ist schon die Verwendung eines solchen Arrays ein Fehler.
Zumal du für die Feldgrößen unbenannte 'magische' Konstanten verwendest
und der Membervariablen den nichtssagenden Namen 'array' gegeben hast.
| Quote: | es geht um die Funktion getArray;
kontakt.h
void getArray(string array[5][14])
{
//return array;
};
halt statt void, vom typ eines Arrays
|
Deiner Anfrage am nächsten kommst du, wenn du eine Referenz auf das
Array zurückgibst:
Da es die Kapselung verletzt eine veränderbare Referenz zurückzugeben,
willst du evtl sowas:
const string (& KONTAKT::getArray() const)[5][14]
{
return array;
}
Aber Achtung: Die Referenz bleibt nur solange gültig, wie das
KONTAKT-Objekt existiert.
Vernünftiger Code enthält aber solche wilden Konstrukte nicht. Wenn es
um Zugriff auf die Feldelemente geht, solltest du eher sowas verwenden:
string KONTAKT::getArrayElement(std::size_t i, std::size_t j) const
{
// hier noch die Gültigkeit von i und j prüfen
return array[i][j];
}
Aber wie zuvor gesagt: Eigentlich denke ich das schon die Verwendung
eines Arrays das Problem (der Fehler) ist.
| Quote: | ______________________________________________________________
//Stand:01.06.2005
#include
#include
class KONTAKT
{
private:
string name;
string vorname;
string strasse;
string ort;
string telefonnummer;
string email;
string hausnummer;
string plz;
string termin;
string array[5][14];
friend class TERMIN;
public:
void Feld_Init(int);
void getArray(string array[5][14])
{
//return array;
};
};
|
[SNIP, jede Menge ungelesenen Code]
Bitte reduziere Codebeispiele vor dem Posten auf den für die Frage
relevanten Anteil. Das spart allen hier Zeit und Ärger.
Gruß Jörg
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|