|
| Array af struct i en struct Fra : Morten |
Dato : 30-01-04 19:56 |
|
Hej
Jeg har problemer med at tilgå data fra en struct der ligger i en anden
struct.
Jeg har lige skrevet lidt kode der viser problemet.
Jeg kan sagtens tilgå det første element via d1.medlem[0].forbogstav,
men så snart jeg kommer til d1.medlem[1].forbogstav får jeg forkert data ud:
# ./t
Test: forbogstav= R alder= 21
Test: forbogstav= ¼ alder= 134513670
Der er sikkert noget med pointers, som jeg ikke er helt stiv i.
Håber nogen kan hjælpe.
/ morten
Kode:
#include <stdio.h>
struct person {
char forbogstav;
int alder;
};
struct db {
int nr;
struct person *medlem;
} ;
int main()
{
// to personer
struct person P1, P2;
// en liste
struct person *list1[2] = {&P1, &P2};
struct db d1;
P1.forbogstav = 'R';
P1.alder = 21;
P2.forbogstav = 'B';
P2.alder = 24;
d1.nr = 1;
d1.medlem = *list1;
printf("Test: forbogstav= %c alder= %d \n", d1.medlem[0].forbogstav,
d1.medlem[0].alder);
printf("Test: forbogstav= %c alder= %d \n", d1.medlem[1].forbogstav,
d1.medlem[1].alder);
}
| |
Lasse Westh-Nielsen (30-01-2004)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 30-01-04 21:40 |
|
"Morten" <mail@is.invalid> wrote:
> Jeg har problemer med at tilgå data fra en struct der ligger i en anden
> struct. Jeg har lige skrevet lidt kode der viser problemet.
> Der er sikkert noget med pointers
Det er det som regel i C...
Jeg tror du kan skrive noget i retning af:
--
struct person list1[2];
list1[0].forbogstav = 'A';
list1[0].alder = 42;
list1[1].forbogstav = 'B';
list1[1].alder = 87;
d1.medlem = &list1;
--
Jeg håber det hjælper!
- Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Igor V. Rafienko (30-01-2004)
| Kommentar Fra : Igor V. Rafienko |
Dato : 30-01-04 23:23 |
|
[ mail@is.invalid ]
[ ... ]
> Der er sikkert noget med pointers, som jeg ikke er helt stiv i.
Ta en titt i boken til Peter van der Linden. Det står mye spennende om
pekere der.
[ ... ]
> struct person {
> char forbogstav;
> int alder;
> };
>
>
> struct db {
> int nr;
> struct person *medlem;
> } ;
Du vil at db skal inneholde en peker til en sammenhengende blokk
hukommelse der struct person objekter ligger?
> int main()
> {
> // to personer
> struct person P1, P2;
>
> // en liste
> struct person *list1[2] = {&P1, &P2};
Slik ser det ut i hukommelsen (bruk fastbreddeskrifttype):
list1
+---+---+
| * | * |
+-|-+-|-+
| |
v v
+--+ +--+
|P1| |P2|
+--+ +--+
> struct db d1;
>
> P1.forbogstav = 'R';
> P1.alder = 21;
>
> P2.forbogstav = 'B';
> P2.alder = 24;
>
> d1.nr = 1;
> d1.medlem = *list1;
Eh? Dette blir litt vanskelig. Dersom du vil ha d1.medlem til å peke
på (første element av) en array med struct person objekter, så burde
list1 inneholde slike objekter, heller enn pekere til de.
Dersom du vil ha d1.medlem til å peke på det som list1[0] peker på, så
vil du få problemer med å snakke om d1.list1[1], da det ikke er
garantert at objektene P1 og P2 (som pekes på av hhv. list1[0] og
list1[1]) ligger etter hverandre i hukommelsen.
Jeg gjetter på at du egentlig vil ha dette:
struct person list1[2];
list1[0].letter = 'R';
list1[0].age = 21;
list1[1].letter = 'B';
list1[1].age = 24;
struct db d1;
d1.medlem = list1;
d1.nr = 2;
Da vil datastrukturen se slik ut i minne (fastbreddefont er nødvendig):
+---+---+
|+-+|+-+|
||X|||Y|| list1
|+-+|+-+|
+---+---+
^
|
+----+
|
+-+-|--+
d1 |2| * |
+-+----+
nr medlem
Minneadresser vokser fra venstre mot høyre. X og Y betegner (de
anonyme) objektene list[0] og list[1] hhv.
ivr
--
<html><form><input type crash></form></html>
| |
Mads Sejersen (31-01-2004)
| Kommentar Fra : Mads Sejersen |
Dato : 31-01-04 01:22 |
|
In article <bve97e$gl8$1@sunsite.dk>, Morten wrote:
> ...
> Der er sikkert noget med pointers, som jeg ikke er helt stiv i.
Præcis
> struct db {
> int nr;
> struct person **medlem;
^^
> };
En pointer til en pointer
[snip]
> printf("Test: forbogstav= %c alder= %d \n", d1.medlem[0]->forbogstav,
> d1.medlem[0]->alder);
>
> printf("Test: forbogstav= %c alder= %d \n", d1.medlem[1]->forbogstav,
> d1.medlem[1]->alder);
>
> }
--
Mads Sejersen
| |
Morten (31-01-2004)
| Kommentar Fra : Morten |
Dato : 31-01-04 19:01 |
|
Mads Sejersen wrote:
> In article <bve97e$gl8$1@sunsite.dk>, Morten wrote:
>
>>...
>>Der er sikkert noget med pointers, som jeg ikke er helt stiv i.
>
>
> Præcis
>
Tak for hjælpen.
/ morten
| |
|
|