Ich habbe Count A usw. deklariert und dann erst gesehen, dass deine Variablen anders heißen. Wer benennt denn bitte seine Variablen deutsch?
Ich habbe Count A usw. deklariert und dann erst gesehen, dass deine Variablen anders heißen. Wer benennt denn bitte seine Variablen deutsch?
Mache ich manchmal auch.
natura non facit saltus
So mittlerweile ein bisschen weiter
Ich kann aus obiger Funktion einfach nicht itemptr zurückgeben und versteh nicht warum.Code:PERSON lookup(char* key, PERSON* list) { PERSON* itemptr; itemptr = (PERSON*) bsearch(&key, list, 7, sizeof(list[0]), fcmp); cout<<"hello"<<endl; return itemptr; }
*itemptr geht problemlos, Ich will aber nicht den Inhalt des Pointers übergeben sondern halt die Adresse damit diese in main von nem pointer entgegengenommen werden kann.
Einfach itemptr übergeben und ne normale PERSON Variable das annehmen lassen führt aber natürlich zu Access Violation wenns nen NULL pointer hat...
Arghhh jetzt lag es doch einfach daran das lookup nicht PERSON* ist
Das hatte Ich eigentlich als erstes probiert, oder dachte Ich zumindest
Geändert von gubbel (02.06.2016 um 13:11 Uhr)
C ist nicht grad meine Spezialität, aber müsstest Du nicht als Rückgabewert einen Pointer angeben, also PERSON*?
bsearch sagt in der API es will einen pointer auf key, Du dereferenzierst den aber mit &.
Im ersten Beispiel das ich gefunden habe wird key als lokale variable angelegt: int key = 32; - da wird dann durch das & ein pointer drauf übergeben.
Ich vermute Du hast das Beispiel falsch umgesetzt. Versuch mal key ohne '&' zu übergeben.
Edit: Und sollte list nicht ein array von Werten sein? Bei Dir ist list ja ein PERSON pointer.
Oh what a day! What a lovely day!
Nope ohne & gibts ne Acess Violation, Ich übergeb die Adresse eines strings und bsearch nimmt das in nem pointer an. Das Proble mwar wirklich PERSON statt PERSON*
Momentan habsch ein anderes Problem, ich hau mal das ganze Programm mit Kommentaren rein.
Code:#include <iostream> #include <cstring> #include <stdlib.h> struct PERSON { //Version1 char* name; //Version2 //string name; int phonenr; }; int fcmp(const void* a, const void* b) { PERSON* personA = (PERSON*)a; PERSON* personB = (PERSON*)b; //Version 1 return(strcmp(personA->name, personB->name)); //funktioniert grundsätzlich //Version 2 //int val=personA->name.compare(personB->name); //return(val);*/ //funktioniert beim qsort einwandfrei und stirbt beim bsearch weil er aufeinmal kein a mehr kriegt } PERSON* lookup(char* key, PERSON* list) { PERSON* itemptr; itemptr = (PERSON*) bsearch(&key, list, 7, sizeof(list[0]), fcmp); cout<<"hello"<<endl; return itemptr; } void main() { PERSON* ptr; PERSON list[7]; list[0].name="Dafoe, Daniel"; list[0].phonenr=789; list[1].name="Wurst, Hans"; list[1].phonenr=963; list[2].name="Schweiß, Axel"; list[2].phonenr=456; list[3].name="SonofUthdsjfdsrid, Uthasdasdasrid"; list[3].phonenr=321; list[4].name="Brei, Grieß"; list[4].phonenr=147; list[5].name="LaFleur, Kevin"; list[5].phonenr=987; list[6].name="Lulu, Lala"; list[6].phonenr=258; qsort(list, 7, sizeof(list[0]), fcmp); for(int x=0; x<7; x++) { cout<<list[x].name<<" "<<list[x].phonenr<<endl; } ptr=lookup("Brei, Grieß", list); if(ptr) cout<<ptr->phonenr<<endl; else cout<<"Nicht gefunden!"<<endl; cout<<"blubb"<<endl; }
Ähmmmm ne Frage zu (pseudo)random Funktionalität.
Unser uralt Borland nahm zur initialisierung einfach randomize(); ohne Parameter. Was genau das macht wird auch nicht erläutert:
Visual kennt jetzt nur noch den ANSI Standard mit srand(seed); wofür man als seed time(NULL) nimmt.Initialisiert den Zufallszahlengenerator.
randomize initialisiert den Zufallszahlengenerator mit einem Zufallswert.
Borland C++-Programmierhandbuch
Das man das am besten nur einmal bei Programmstart macht ist mir klar aber bei mehreren Programmstarts in kurzer Zeit sind die Zahlen sehr ähnlich.
Das Borland Teil hat da zumindest den Anschein besserer Zufälligkeit erweckt
Was gäbs denn da an Alternativen?
Google spuckt mir nur den wie gesagt bekannten Hinweis darauf dass gleich zu Anfang zu initialisieren und dämliche Ideen wie +_getpid aus wo Ich ja völlig aus meiner range rauskomme
Der seed muss nur unterschiedlich sein. Wenn er sich nur wenig unterscheidet macht das nichts.
Nur wenn man vom gleichen seed aus startet bekommt man die gleiche Abfolge von Pseudozufallszahlen.
Oh what a day! What a lovely day!
Jo Ich weiß, aber der ist ja unterschiedlich.
Und es scheint eben doch was zu machen wenn er sich nur wenig unterscheidet (weil systemzeit erst ein paar sekunden später).
Ganz gleich sind die gar nicht aber 3-4 mal hintereinander 55xx bei %10000 ist nicht toll
Nee das ist einfach immer ein bisschen höher. Umso mehr Zeit Ich vergehen lasse umso höher.
Ich kann das jetzt nochmal 10 mal hintereinander laufen lassen und krieg 84xx solange bis wir halt bei 85xx sind