/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste