probleempje in C

Pagina: 1
Acties:

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
gegroet allen, ik zit met een probleem in een programma in C, ik krijg een string niet afgedrukt op het scherm.
Ik schrijf de code in Dev C++ onder windows 98.
wat ik wil is een "database" maken dat je mensen kan toevoegen en deleten enzo. stelt eigenlijk helemaal nix voor maar ik vind et leuk :-).
dus ik heb gedaan dat je maximaal 1000 mensen kan toevoegen met:
code:
1
2
count = 0;
char *users[1000];

dan heb ik alle arrays geinitaliseerd met:
code:
1
2
3
4
int kj;

for (kj = 0; kj < 1001; kj++)
   users[kj] = '\0';

dan laat ik een user toevoegen:
code:
1
2
3
4
5
char str_name[15];
scanf("%s", str_name);
users[count] = str_name;
count += 1;
printf("\nRecieved:\nName: %s\n\nData has been saved succesfull\n\n", users[count]);

dit werkt goed en ik krijg gewoon de normale naam te zien in de uitvoer.

vervolgens kan de gebruiker al zijn ingevoerde users zien:
code:
1
2
3
4
5
6
7
8
9
10
int i;
printf("\nList all users:\n\n");
for (i = 0; i < 1001; i++) {
   if (users[i] == '\0') {
    printf("\nListing Finished\n\n");
    i = 1001;
   }
   else
    printf("Name: %s\n", users[i]);
}

hier gaat het dus goed fout! ik krijg(als ik er al een heb toegevoegd) bv:
code:
1
2
3
4
5
Listing all users:

ŒüŒœ€

Listing Finished

WAAROM?!!?!?

ohja dit zijn natuurlijk maar kleine stukjes uit de code...

grtz,

Sanchez

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Je hebt een array van pointers naar strings.

Dus de waarde van je array element is het geheugen adres van je pointer. Deze pointer verwijst naar de string.

Je print dus de waarde van je pointers. Denk ik, maar ik weet niet zeker :P
code:
1
printf("Name: %s\n", users[i]);

Dit betekent: print de string beginnend op adres "users[i]". Ja ik weet het nu zeker. Dereference users[i] maar is 1 keer. Wedden dat het werkt.

Verwijderd

users[count] = str_name -> je kent aan users[count] een adres toe door. Alle users verwijzen dus naar het adres van str_name.

Je moet dus zoiets doen:

users[count] = new char [strlen(str_name) + 1];
strcpy(users[count],str_name);

succes!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16-09 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

users[count] = new char [strlen(str_name) + 1];
strcpy(users[count],str_name);
of wat makkelijker:
code:
1
users[count] = strdup (str_name);

(niet vergeten het geheugen weer vrij te geven als je klaar bent)

:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Hoe zit dat eigenlijk, als een programma normaal ten einde loopt. En er is nog data gealloceerd op de free store. Wat gebeurt hier dan mee?

In Win32 wordt de hele adres space van de app vernietigd als tie afgelopen is en wordt ook gealloceerd geheugen in het betreffende adres space vrij gegeven(, immers de hele adres space wordt vernietigd).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16-09 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

over het algemeen wordt dat gewoon vrijgegeven als je programma afsluit... Of je programma dat zelf doet is nogal platform-afhankelijk, maar de meeste OS'en geven toch wel het gebruikte geheugen vrij als het proces wordt afgesloten, dus in principe niets om je zorgen over te maken... maar het staat wel zo netjes dat je je programma afsluit zonder memory leaks :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Misschien moet je eens naar de definitie en het gebruik van Malloc kijken.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je er
code:
1
char users[1000];

Werkt het dan wel?

Verwijderd

Dan heeft ie 'n stuk geheugen van 1000 bytes ipv van een array van 1000 pointers naar char,wat schiet ie daar precies mee op :?

[edit: i'm bored, dan maar verhaaltje voor het slapen gaan typen]
code:
1
2
count = 0;
char *users[1000];

Okay we definieren een array van 1000 pointers naar char. sofar so good ;)
code:
1
2
3
int kj;
for (kj = 0; kj < 1001; kj++)
   users[kj] = '\0';

Hier gaan we de fout al 'n beetje in, de array die je gedefinieerd heb van 1000 elementen begint bij element 0 dus element 999 is dan toch echt de laatste. Tevens ben je pointers aan het initaliseren en geen stings dus
code:
1
2
3
int kj;
for (kj = 0; kj < 1000; kj++)
   users[kj] = NULL;

is al een stuk netter..
code:
1
2
3
4
5
char str_name[15];
scanf("%s", str_name);
users[count] = str_name;
count += 1;
printf("\nRecieved:\nName: %s\n\nData has been saved succesfull\n\n", users[count]);

Wat er gebeurd bij het oproepen van de routine worden er 15 bytes op de stack gealloceerd, jij leest in die 15 bytes je user name, zet een pointertje naar die 15 bytes in je tabelletje, en verlaat de subroutine weer. Als de subroutine wordt verlaten wordt de stack opgeruimt en zit jij dus met 'n pointer die nergens meer heen wijst..

Vervolgens ga je ze afdrukken en die pointers staan nog steeds te wijzen naar geheugen waar allang weer wat anders staat (stack van een andere sub ofzo)
code:
1
2
3
Listing all users:
ŒüŒœ€
Listing Finished

Tjah dat zat er dik in. De oplossing is hierboven reeds gegeven, maak een kopie op de heap van die 15 bytes en sla een pointer naar die kopie op in je tabelletje.

Je wist al hoe je het op moest lossen, maar nu weet je ook waarom het zo was, succ6!

[/edit]

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Blijft een probleem die pointers. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Crysania
  • Registratie: September 2000
  • Laatst online: 08:05
moet je dit niet doen??
code:
1
printf("Name: %s\n", &users[i]);

dan ga je printen wat er op het adres van die users i staat.

dacht ik, heb al een tijd geen C meer geprogt

Verwijderd

Op dinsdag 20 november 2001 10:26 schreef THE_CR0SS het volgende:
dan ga je printen wat er op het adres van die users i staat.
Om farlane te quoten "Blijft een probleem die pointers" vooral als het strings zijn :)

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
woeha, dank jullie allemaal voor de replies :)
ik zit nu op school maar thuis kom ik denk ik wel uit..nooit gedacht dat ik zo snel zo veel replies zou krijgen!

grtz,
Sanchez
Pagina: 1