[c] nog iets waar ik ff niet opkom

Pagina: 1
Acties:

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
De volgende structure is gegeven:
code:
1
2
3
4
5
6
struct adres
{
    char straat[20];
    int huisnr;
    char *plaats;
} a;

Nu moet deze gevuld worden met een functie:
code:
1
2
3
4
5
6
7
8
Vul(struct adres adr)
{
   adr.huisnr = 10; //werkt
   adr.plaats = "Amsterdam";  //werkt ook
   adr.straat = "straat"; //error --> left operand must be l-value
}

Vul(a);

Ik weet dat dit geen nut heeft want de structure a wordt by value doorgegeven maar het gaat eventjes om het idee. Ik weet ook dat als ik hem by reference doorgegeven had ik met de indirectie operator -> had moeten werken. Maar ff to-the-point:
Ik krijg dus de error dat de linker waarde van de = een l-value of te wel een verwijzing naar een adres moet zijn.
Ik kan hier ff niets voor bedenken.

Het enige waar ik nu op kom =
code:
1
2
3
4
adr.straat[0] = 's'; 
adr.straat[1] = 't';
adr.straat[2] = 'r';
etc.

Wie wel??

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

straat is een array van chars, geen pointer naar een char, dus je kunt m ook niet zomaar even naar een straatnaam laten wijzen.

Je zult de straatnaam dus moeten kopieren naar de array zelf

Gebruik daarvoor strncpy, dan kun je het maximum aantal bytes opgeven (20 dus in jouw geval, hoewel ik 19 zou nemen en straat[19] altijd op 0 zou houden)

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.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Simpel wat je hier wilt bereiken kan niet.
char straat[20] = "Dorpsstraat";
werkt omdat die bij compile-time direct als string opgeslagen wordt.
Wat jij wilt moet je bereiken met de functie strcpy.
code:
1
adr.plaats = "Amsterdam";

Werkt inderdaad, maar is erg gevaarlijk! Deze functie verandert niets, maar stel je voor dat je de plaats pointer later meegeeft aan een functie die dat wel doet .. dit gaat geheid problemen geven. Je moet dus eerst een alloc() doen en zo geheugen vrijmaken en daar de string "Amsterdam" in proppen en daar de pointer naar laten wijzen.

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

edit:
'k was weer eens veels te laat

After all, we are nothing more or less than what we choose to reveal.


  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Duidelijk, bedankt!
Volgende keer toch iets eerder beginnen met leren denk ik... Is dan ook vervelend als je tijdens afstuderen en daarbij continue programmeren in C# opeens weer C moet gaan leren.

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Orphix, bedankt voor die tip over het dynamisch alloceren van geheugen!

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Is dit trouwens de goede manier hiervoor:
code:
1
2
3
4
5
char *p_adr;

p_adr = malloc(sizeof("Amsterdam"));
p_adr = "Amsterdam";
adr.plaats = p_adr;

Werkt nl. wel

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Nee, je moet adr.plaats naar het nieuwe geheugenblok laten wijzen. Daarna kopieer je de string via strncpy in dat nieuwe geheugenblok.

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Dus:

char *pl;
pl =(char *)malloc(sizeof(char[20]));
adr.plaats = pl;
strncpy(pl,"Eindhoven",19);

???

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 14 januari 2002 00:29 schreef a3konijn het volgende:
Dus:

char *pl;
pl =(char *)malloc(sizeof(char[20]));
adr.plaats = pl;
strncpy(pl,"Eindhoven",19);

???
Nou meer
code:
1
2
3
int length = strlen("Eindhoven");
adr.plaats = (char*)malloc(length);
strncpy(adr.plaats,"Eindhoven",length);

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

of gewoon
code:
1
adr.plaats = strdup ("Amsterdam");

:D

vergeet niet het geheugen weer vrij te geven als je de struct niet meer gebruikt:
code:
1
free (adr.plaats);

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.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 14 januari 2002 00:58 schreef OiSyN een codestukje
never heard of it :D
Maarja ik sta hier natuurlijk ook boven als C++ programmeur *D :P ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 14 januari 2002 01:00 schreef Orphix het volgende:

[..]

never heard of it :D
Maarja ik sta hier natuurlijk ook boven als C++ programmeur *D :P ;)
ik code ook C++, maar maak gebruik van de C lib :)

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.


  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Nou dat tentamen is zeker binnen! :7


Iedereen nogmaals bedankt voor z'n hulp.
Pagina: 1