Dionysos211 Geschrieben 4. Juni 2011 Teilen Geschrieben 4. Juni 2011 "C - Programmieren" Moin, ich seh den Wald vor lauter Bäumen äh chars nicht mehr... kann mir wer auf die Sprünge helfen, warum mir das hier in regelmäßigen abständen ein leeres Array erzeugt... Ich wollte es so dynamisch wie möglich halten... Die Generatorfunktion char *rand_str(char *dst, int size) { static const char text[] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i, len = rand() % (size - 1); for ( i = 0; i < len; ++i ) { dst[i] = text[rand() % (sizeof text - 1)]; } dst[i] = '\0'; return dst; } und hier n Teil aus der main wo ich die funktion nutze... int main (void) { char genChar[10]; srand(time(0)); ... .... strcpy(pTempPatientenkrankheit->pNext->cName, rand_str(genChar, sizeof genChar)); strcpy(pTempPatientenkrankheit->pNext->cDiagnose, rand_str(genChar, sizeof genChar)); ... ... return 0; } dies sorgt für die Ausgabe des Struct in einer Datei für schöne ;;; in gewisser Regelmäßigkeit... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2011 Teilen Geschrieben 4. Juni 2011 Kann ich nicht reproduzieren. Da fehlt einiges an Informationen. Was ist cName, was ist cDiagnose, wie gibst du in die Datei aus? Was heißt "gewisse Regelmäßigkeit"? Am Besten zeigst du ein vollständiges Minimalbeispiel, das den Fehler reproduziert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 4. Juni 2011 Teilen Geschrieben 4. Juni 2011 (bearbeitet) #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> char *GenerateRandomString(int length); int GenerateRandomNumber(int maximum); void *AllocateNecessaryMemory(size_t size); void InitRandomNumberGenerator(); int main(void){ const int maximalStringLength=10; char *randomString; randomString=GenerateRandomString(maximalStringLength); printf("%s", randomString); getch(); } char *GenerateRandomString(int length){ const char *alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIKJLMNOPQRSTUVWXYZ"; const int alphabetLength=52; int randomIndex; int index; char *randomString=NULL; InitRandomNumberGenerator(); randomString=AllocateNecessaryMemory(length); for(index=0; index<length; index++) { randomIndex=GenerateRandomNumber(alphabetLength); randomString[index]=alphabet[randomIndex]; } randomString[length]='\0'; return randomString; } void InitRandomNumberGenerator() { srand ( time(NULL) ); } int GenerateRandomNumber(int maximum) { return (rand() % maximum)+1; } void *AllocateNecessaryMemory(size_t size) { return malloc(size+1); } [/php] Bearbeitet 4. Juni 2011 von lilith2k3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uenetz Geschrieben 5. Juni 2011 Teilen Geschrieben 5. Juni 2011 Wenn Du getch mit getchar ersetzt, und das Inkludieren der conio raus nimmst, funktioniert das o.g. Tool (unter Linux). Aber was hat der erste Source mit dem 2. zu tun? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 5. Juni 2011 Teilen Geschrieben 5. Juni 2011 Er ist wesentlich lesbarer? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dionysos211 Geschrieben 5. Juni 2011 Autor Teilen Geschrieben 5. Juni 2011 Moin, erstmal vielen vielen dank für eure Mühen!! Ich hab für mich mittlerweile heraus gefunden warum er mal n leeren string erzeugt... hier: int i, len = rand() % (size - 1); for ( i = 0; i < len; ++i ) lasse ich ihm ja eine zufällige länge des strings generieren... die länge kann auch 0 sein *Schlag an die Stirn" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dionysos211 Geschrieben 5. Juni 2011 Autor Teilen Geschrieben 5. Juni 2011 Aber der andere von lilith ist echt schöner... bin auch gerade dabei meinen neu zu schreiben, den poste ich dann auch nochmal... trotzdem nochmal ein dickes Dankeschön ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 5. Juni 2011 Teilen Geschrieben 5. Juni 2011 Aber der andere von lilith ist echt schöner.. Danke :] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. Juni 2011 Teilen Geschrieben 6. Juni 2011 Er ist wesentlich lesbarer? Er hat aber auch ein Speicherleck. Außerdem sollte GenerateRandomString nicht InitRandomNumberGenerator aufrufen, sonst bekommt man mehrfach denselben String, wenn man GenerateRandomString mehrmals in einer Sekunde (z.B. in einer Schleife) aufruft. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 6. Juni 2011 Teilen Geschrieben 6. Juni 2011 (bearbeitet) Er hat aber auch ein Speicherleck. Potentiell (hier im Demo) ja. Wobei mich da noch folgender Punkt interessieren würde (ist vielleicht ab vom Thema): Wenn ich in einer Anwendung, wie hier geschehen, Speicher alloziere und nicht explizit freigebe: Was geschieht mit dem Speicher nachdem meine Anwendung geschlossen worden ist. Ist der weiterhin belegt, oder räumt das Betriebssystem hinter unordentlichen Anwendungen auf? Letzeres war meine Vermutung, weshalb ich an der Stelle auf ein free verzichtet habe (was anscheinend nicht so klug gewesen ist). Außerdem sollte GenerateRandomString nicht InitRandomNumberGenerator aufrufen, sonst bekommt man mehrfach denselben String, wenn man GenerateRandomString mehrmals in einer Sekunde (z.B. in einer Schleife) aufruft. Danke für den Hinweis :] Das sollte entsprechend bei der Übernahme des Beispiels beachtet werden. Bearbeitet 6. Juni 2011 von lilith2k3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. Juni 2011 Teilen Geschrieben 6. Juni 2011 Wobei mich da noch folgender Punkt interessieren würde (ist vielleicht ab vom Thema): Wenn ich in einer Anwendung, wie hier geschehen, Speicher alloziere und nicht explizit freigebe: Was geschieht mit dem Speicher nachdem meine Anwendung geschlossen worden ist. Ist der weiterhin belegt, oder räumt das Betriebssystem hinter unordentlichen Anwendungen auf?Das kommt auf das Betriebssystem an. Die heute gängigen Desktopbetriebssysteme räumen nach Prozessende auf. Letzeres war meine Vermutung, weshalb ich an der Stelle auf ein free verzichtet habe (was anscheinend nicht so klug gewesen ist).Selbst wenn das Betriebssystem hinterher aufräumt, ist das nicht sauber. Je länger das Programm läuft, desto schlimmer wird das. Bei Dämonen/Diensten, die durchgehend laufen sollen, ist so etwas ein kritischer Bug. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 6. Juni 2011 Teilen Geschrieben 6. Juni 2011 Danke. Wieder was gelernt :] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.