Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zufallsfunktion..

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 ] [ 2 ] > 3 < [ 4 ] [ 5 ] [ 6 ]
020
21.03.2004, 20:09 Uhr
Pablo
Supertux
(Operator)


Und cSymbl_1[1] sollte meine Meinung sein, immer '\0' sein.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 21.03.2004 um 20:09 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
21.03.2004, 20:39 Uhr
Fraenky



@Windalf
das sieht ganz schön kompliziert aus, vor allem ist da so viel neues für mich drin das ich ehrlich gesagt nicht durchsehe..*sorry*

irgendwie kommt mir c++ immer komplizierter vor und man irgendwie total wenig Möglichkeiten hat..naja nur ein subjektiver Eindruck..

@Gast&Pablo
ich dachte das in cSymbol_1[1] nur ein Zeichen rein passt oder nicht??

Und wenn ich es wo anders anpacke und zwar an der Zufallsfunktion selbst? Ich wollte ja, dass ein Symbol aus mehreren zufällig ausgewählt wird und dann in einer Variablen gespeichert wird und der funktion (setzen) als Parameter (string) übergeben wird...
ich hab das nun alks char Arry gelöst; bare kan man das auch irgendwie in string machen??


Danke dass ihr so viel Geduld mit mir habt ich glaub ich geh euch ganz schön auf die Nerven...

THX!
--
Welcome to the real World.

www.fraenkysweb.de

Dieser Post wurde am 21.03.2004 um 20:39 Uhr von Fraenky editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
21.03.2004, 20:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

das sieht ganz schön kompliziert aus, vor allem ist da so viel neues für mich drin das ich ehrlich gesagt nicht durchsehe..*sorry*



was verstehst du denn nciht? du wolltest es doch mit ner klasse machen
frag einfach welche zeilen dir nicth klar sind...


Zitat:

ich dachte das in cSymbol_1[1] nur ein Zeichen rein passt oder nicht??


ja stimmt und deswegen macht es auch nicht viel sinn daraus ein array zu machen kannst dann gleich einfach nur ein char nehmen...

in c laufen arrays immer von 0 bis N-1 wenn du also z.b. ein array in der art definiert char myarray[100] dann musst du die elemente von 0 bis 99 ansprechen sonst bekommst du ein segmentation fault...

alles klar?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.03.2004 um 20:46 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
21.03.2004, 20:58 Uhr
Pablo
Supertux
(Operator)


Ja, cSymbol_1[1] nimmt tatsächich nur ein Zeichen auf, weil es das 2. Element des char Arrays. Aber da du cSymbol_1 als C String befasst, dann war das im prinzip falsch.

C Strings sind Arrays von char. Das heißt, es handelt sich um eine Folge von Zeichen. Da unter C keine Möglichkiet gibt, die Länge eines festustellen (es gibt keine Funktion, die dazu in der Lage ist), muss man sich anders überlegem und ein Trick einbauen, so dass die Standard C Funktionen das Ende einer Zeichenkette erkennen können. Die Länge der Zeichenkette muss nicht unbedingt gleich der Länge des Arrays. Am Ende jeder Zeichkette haben C Strings das \0-Terminierendezeichen. Mit Hilfe dieses zeichen wissen die C Funktionen, dass die Zeichenkette am Ende ist.


C++:
char x[10];



Wenn du das machst, dann hast du ein Array von char mit 10 Elementen, das heißt, dort kannst du C Strings speichern, deren Länge kleiner oder gleich 9 ist. Denn es gibt immer das \0 und das muss mitgezählt werden. Man kann zwar auf das \0 verzichten, ist aber sehr gefählrich, weil die Standard C Funktionen ohne \0 undefiniert arbeiten, d.h. man kann nicht wissen, was passieren kann. Deshalb gibt es immer das \0 Zeichen.

C++:
strcpy(x, "Hallo");



Nun haben wir Hallo in x gespeichert, Hallo hat die Länge 5, benutzt aber 6 Zeichen. Da 6<9 passt "hallo" in x. Das Heißt, x[0]=='H', x[1]=='a', x[2]='l', x[3]='l';x[4]='o', x[5]='\0', x[6...9]=nicht definiert, es ist egal, was dort steht, da \0 schon an der 6. Stelle sich befindet.

Du hast erstens c_Symbol so definieret:

C++:
char cSymbol_1[1];


Das ist unnützlich. Wenn du ein Array mit nur einem Element willst, wozu dann das Array? Dann reicht nur

C++:
char cSymbol_1;



Vielleicht willst du aber da als Zeichenkette haben, aber eine Zeichenkette der Länge 1. Also brauchst du mindestens 2 Elemente. Richtig wäre dann

C++:
char cSymbol_1[2];
cSymbol_1[1]='\0';


Da in diesem Fall cSymbol ein C String ist, muss mit \0 terminiert werden. Da wir nur 2 Elemente zur Verfügung haben, müssen wir \0 an der 2. Stelle zuweisen, also an cSymbol_1[1].

Ich hoffe, dir ist ein bisschen klarer was ein C String ist. Sonst lies mal hier, Die Sache mit den Rückgabewerten (In der FAQ)

Das ganze gilt auch für C++, da C++ auch mit C Strings arbeiten kann. Aber unter C++ gibt es die Klasse string, die eine einfache Handhabung hat als C Strings. Und wenn du mit C++ arbeitest, solltest du lieber mit string arbeiten und nicht mit char*.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
22.03.2004, 16:13 Uhr
Fraenky



ok das mit den char hab ich jetzt verstanden..

Ich habe jetzt einfach die Zufallsfunktion mit string gemacht:


C++:
string sSymbol[9];
string sSymbol_1;

sSymbol[1]='\x01';
sSymbol[2]='\x02';
sSymbol[3]='\x03';
sSymbol[4]='\x04';
sSymbol[5]='\x05';
sSymbol[6]='\x06';
sSymbol[7]='\x0B';
sSymbol[8]='\x0C';
sSymbol[9]='\x0E';

srand(time(NULL)-3);
zzahl=min+rand()%(max-min+1);
sSymbol_1=sSymbol[zzahl];
sSymbol_eing=sSymbol_1;
//cout << sSymbol_eing;

Karte1.setzeSymbol(sSymbol_eing);



und nu klappts einwandfrei! ich hab ja nicht gewußt, dass man mit strings auch so arbeiten kann (array)..

@Windalf
was bedeuted denn std:? Kommt ja ziemlich häufig vor..
was bedeutet this und dann der Pfeiloperator -> (this->variable)??


Oki THX!!
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
22.03.2004, 16:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

was bedeuted denn std:: Kommt ja ziemlich häufig vor..


naja das ist ein namespace

du wirst vermutlich sowas verwendet haben

C++:
#include <iostream>
#include <string>
using namespace std; //ums banal zu sagen wenn du dies hier nicht schreibst musst du std:: vorschreiben wenn du z.b. cout usw. verwenden willst...





Zitat:

was bedeutet this und dann der Pfeiloperator -> (this->variable)??


this ist ein zeiger auf das objekt selbst...
du hattes ja schon das problem bei deinem setter..

wenn du eine klasse hast die als member ein int x hat...
hast du bei void set_x(int ein_anderes_x); geschrieben

weil du ja x=ein_anderes_x setzen willst

wenn man sich nicht krampfhaft einen neuen namen überlegen will kann man den trick mit this machen...
also this->x=x; heisst quasi das x des objektes soll gleich dem der funktion übergebenen x sein...

der ->operator ist das gleiche wie der .-operator nur das er vorher den pointer dereferenziert... ist also das gleiche wie (*this).x
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 22.03.2004 um 16:25 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
22.03.2004, 16:50 Uhr
Fraenky



ähm..nee ich habe nicht


C++:
using namespace std;


verwendet..meine includes sehen folgendermaßen aus:


C++:
#include <iostream.h>
#include <conio.h>
#include <cstring.h>
#include <stdlib.h>

//Klasse..
#include "Ckarte.cpp"



ist das schlimm?? in anderen Programmen hab ich das aber schon mal verwendet ohne genau zu wissen was es bedeuted..wurde in einem anderen Forum empfohlen..
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
22.03.2004, 16:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja schlimm ists natürlich. mann sollte die veralteten header nicht mehr benutzen aber spielt bei dir erstmal keine rolle....

wo mir aber ein wenig schlecht bei wird ist das du *cpp dateien includierst...

also wenn du das nicht in eine datei packen willst und die klasse auslagerst pack die deklaration der klasse am besten in den header und die definition in einer zum header zugehörigen cpp datei...
int dem file in dem du dann die klasse verwenden möchtest includierst du dann deinen header der die klasse enthält...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
23.03.2004, 16:10 Uhr
Fraenky



Alte header?? ich weiß das nur so aus meinem Buch (das ist bestimmt auch schon bissl veraltet..)

also mein Buch meint ich soll die CKlasse.h Datei in die CKlasse.cpp includen
so noch kein Prog..dann soll ich wieder die CKlasse.h in die Datei programm.cpp (also das Programm selbts) includen

Aber hier kommt ne Fehlermeldung vom Compiler...deswegen dacht ich dass ich die Falsche Datei include und die *.cpp Datei nehmen muss da in der Header datei nur die Prototypen der Funktionen der Klasse drinstehen...

Jedenfalls bringt sonst mein Compiler Fehlermeldungen..so klappst aber.
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
23.03.2004, 18:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


was genau du da gemacht hast weiss ich nicht und ich kenn auch deine fehlermeldungen nicth aber um mal ein beispiel zu machen.
das programm was ich gepostet hatte würd ich auf die schnelle so aufteilen

CKarte.h

C++:
#ifndef CKARTE_H  //dieser "guard" schützt dich vor mehrfachincludierungen
#define CKARTE_H

#include <iostream>
#include <string>
#include <ctime>

class CKarte{

    private:
    std::string symbol;

    public:
    CKarte(); //mitzufallswerten eine CKarte erzeugen
    CKarte(std::string);
    void setSymbol(std::string);
    void Karte_ausgeben();

};

#endif



CKarte.cpp

C++:
#include "CKarte.h"

void CKarte::setSymbol(std::string symbol){this->symbol=symbol;}

CKarte::CKarte(){

    int min=65;
    int max=65+32;
    char cSymbol[10];
    srand(time(NULL));

    for(int i=0;i<9;++i)
        cSymbol[ i ]=min+rand()%(max-min+1);

    cSymbol[9]=0;

    this->symbol=cSymbol;
    //schlauer wäre es einfach die concatenation von std::string zu verwenden aber du wolltest es ja mit char* machen...
}

CKarte::CKarte(std::string symbol){setSymbol(symbol);}

void CKarte::Karte_ausgeben(){std::cout<<symbol<<std::endl;}



test.cpp


C++:
#include "CKarte.h"

int main(){

    CKarte Karte1;
    CKarte Karte2("hallo");
    Karte1.Karte_ausgeben();
    Karte2.Karte_ausgeben();
    Karte1.setSymbol("jetzt steht das hier in karte 1");
    Karte1.Karte_ausgeben();
    
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ] [ 6 ]     [ 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: