Sida 1 av 2
C, pekare i struct och programmeringsstilar
Postat: 13 september 2016, 07:20:20
av persika
Jag har en struct jag har samlat inställningar i, nu vill jag också ha en pekare där i, som pekar på en array, en översättningstabell.
Jag vill inte att själva arrayen ingår i structen, utan bara pekaren.
Vilket är rätt av följande: Inst1typ eller Inst2typ ? En av dem, eller kanske båda ?
Det som gör mig konfunderad är att jag läst att pekare och array (namnet utan [] ) är samma sak ?
(a och b är andra inställningar som inte är intressanta i denna fråga.)
Kod: Markera allt
typedef uInt8 OevTabellTyp[8][2];
typedef OevTabellTyp* OevTabellPekTyp;
typedef struct
{
int a;
int b;
OevTabellPekTyp OevTabell;
} Inst1Typ;
typedef struct
{
int a;
int b;
OevTabellTyp OevTabell;
} Inst2Typ;
20160915, Har rättat så som Findecanor påpekat, typen ska stå före variabelnamnet.
Re: C, pekare i struct
Postat: 13 september 2016, 07:32:50
av Icecap
Om data inte ska ingå i själva strukturen är det ju tvunget att vara den första version som gäller.
Re: C, pekare i struct
Postat: 13 september 2016, 08:30:12
av SvenW
Är det detta du vill göra?
Kod: Markera allt
uint8_t oev_tabell[8][2];
typedef struct
{
int a;
int b;
uint8_t *pekare;
} Inst1Typ;
Inst1Typ inst1_typ_instans;
inst1_typ_instans.pekare = &oev_tabell[0][0];
Re: C, pekare i struct
Postat: 13 september 2016, 08:36:54
av Jan Almqvist
Jag hade nog gjort så här:
Kod: Markera allt
typedef uInt8 OEVTABELL[8][2];
typedef struct
{
int a;
int b;
OEVTABELL *pOevTabell;
} Inst3Typ;
Re: C, pekare i struct
Postat: 13 september 2016, 15:20:52
av Findecanor
Instämmer. Första versionen, men byt plats på OevTabell och OevTabellPekTyp. Typen ska stå först, variabelnamnet efterråt.
Re: C, pekare i struct
Postat: 13 september 2016, 16:20:21
av SvenW
Allting går i c, men det hela ser i mina ögon lite främmande ut!
En tilldelning till ett element blir alltså så här:
Ovanligt, men det går väl.
Re: C, pekare i struct
Postat: 13 september 2016, 16:37:55
av Jan Almqvist
Så här tänkte jag men har inte provat att kompilera:
alternativt
Re: C, pekare i struct
Postat: 13 september 2016, 17:42:56
av johano
> x.pOevTabell->[1][2] = 42;
Eh, hur skulle det kunna funka?
Dereferens direkt till ett arrayelement??
Det måste bli som SvenW skrev: (*x.pOevTabell)[1][2] om x är allokerat på stacken, annars (*x->pOevTabell)[1][2];
Re: C, pekare i struct
Postat: 13 september 2016, 18:05:40
av johano
Man kan introducera en liten union så blir den lite trevligare att jobba med:
Kod: Markera allt
typedef char OevTabellTyp[8][2];
typedef union {
OevTabellTyp data;
} *OevTabellPekTyp;
typedef struct
{
int a;
int b;
OevTabellPekTyp OevTabell;
} Inst1Typ;
#include <malloc.h>
int main()
{
Inst1Typ x;
x.OevTabell = malloc(sizeof(OevTabellTyp));
x.OevTabell->data[0][1] = 42;
free(x.OevTabell);
return 0;
}
Edit: stavfel
/johan
Re: C, pekare i struct
Postat: 13 september 2016, 18:39:25
av persika
Tack för alla svar!
Nu vet jag hur jag ska göra i mitt fall:
Kod: Markera allt
typedef struct
{
int a;
int b;
OevTabell OevTabellPekTyp;
} Inst1Typ;
Så allt är egentligen ok.
Det som ställt till det för mig är inkonsekvensen i C.
Ibland gäller array-namnet hela array'en, och ibland gäller array-namnet som en pekare till första elementet.
Titta i denna pdf:
https://www.kth.se/social/upload/504ccc ... 2/FL_6.pdf
HI1024 – Programmering, grundkurs, 8.0 hp, KTH –STH, hösten 2012
Föreläsning 6 – pekare och pekare tillsammans med arrayer
Kolla ganska långt ner i pdf'en. Där har man en funktion "find_largest", vid anropet där använder man array-namnet som en pekare.
När jag ska göra en struct då kan jag inte ha bara array-namnet, för då får jag hela arrayen, utan måste ha en särskild pekare.
Lite förvirrande...
Re: C, pekare i struct
Postat: 13 september 2016, 18:47:17
av lillahuset
Inte alls, en pekare i C är bara en referens till en minnesadress. Beroende på hur pekaren är definierad pekar den på olika datatyper. Väldigt användbart men en stor källa till frustration om man inte vet EXAKT vad man gör. Pekar pekaren åt helvete går det åt helvete.

Re: C, pekare i struct
Postat: 13 september 2016, 18:54:23
av Icecap
persika: pekare är inte svårt!
Men som med all annan programmering behöver man tänka igenom vad som ska göras och om en lösning blir krånglig för att pekarna ska "specialtillverkas" - då har man vald fel lösning.
Att en pekare ska definieras som en given pekartyp är för att om man t.ex. pekar på ett element i en tabell och man vill peka på nästa element måste programmet veta hur långt den ska stega adressen för att komma till nästa steg.
Re: C, pekare i struct
Postat: 13 september 2016, 19:25:32
av SvenW
Jo, jag tror att persika har rätt i att pekare och arryer är lite knepigt i c, liksom
strängar. Maskinnära och effektivt, men en smula ologiskt. Man måste vänja sig.
En helt annan sak vill jag påpeka i all välmening, och jag ber att det uppfattas just så:
Har man en bra programmeringsstil framgår det _direkt_ det vad som är pekare, typ, makro och data.
Det blir lättare att läsa och förstå programmet.
Stilen i exemplet är jag inte van vid. Det finns många stilar och vad som är rätt är omtvistat.
Men skall man skriva stora program är det absolut nödvändigt med en vettig och konsekvent stil.
Re: C, pekare i struct
Postat: 13 september 2016, 20:07:44
av lillahuset
Det är ingen tillfällighet att de flesta företag och större projekt har direktiv om programmeringsstil.
För många år sedan hade jag en kund som "rättade" all kod jag skrev eftersom jag inte skrev som han ville. Då tyckte jag han var fånig, idag förstår jag honom fullt ut.

Re: C, pekare i struct
Postat: 13 september 2016, 20:15:12
av mankan
Jepp, kod är i första hand för kommunikation mellan programmerare för att kunna underhålla och utveckla den. I andra hand ska den gå igenom kompilatorn/interpretatorn och göra det den är designad för.