Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

"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...

Geschrieben

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.

Geschrieben (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 von lilith2k3
Geschrieben

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?

Geschrieben

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:

i

nt 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"

Geschrieben
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.

Geschrieben (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 von lilith2k3
Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...