C, pekare i struct och programmeringsstilar

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

C, pekare i struct och programmeringsstilar

Inlägg 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.
Senast redigerad av persika 16 september 2016, 13:51:10, redigerad totalt 2 gånger.
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C, pekare i struct

Inlägg av Icecap »

Om data inte ska ingå i själva strukturen är det ju tvunget att vara den första version som gäller.
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: C, pekare i struct

Inlägg 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];
Användarvisningsbild
Jan Almqvist
Inlägg: 1581
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: C, pekare i struct

Inlägg 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;
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: C, pekare i struct

Inlägg av Findecanor »

Instämmer. Första versionen, men byt plats på OevTabell och OevTabellPekTyp. Typen ska stå först, variabelnamnet efterråt.
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: C, pekare i struct

Inlägg 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:

Kod: Markera allt

(*x.pOevTabell) [1] [2] = 42;
Ovanligt, men det går väl.
Användarvisningsbild
Jan Almqvist
Inlägg: 1581
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: C, pekare i struct

Inlägg av Jan Almqvist »

Så här tänkte jag men har inte provat att kompilera:

Kod: Markera allt

x.pOevTabell->[1][2] = 42;
alternativt

Kod: Markera allt

p->pOevTabell->[1][2] = 42;
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C, pekare i struct

Inlägg 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];
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C, pekare i struct

Inlägg 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
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: C, pekare i struct

Inlägg 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...
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, pekare i struct

Inlägg 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. :D
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C, pekare i struct

Inlägg 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.
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: C, pekare i struct

Inlägg 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.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, pekare i struct

Inlägg 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. :oops:
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: C, pekare i struct

Inlägg 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.
Skriv svar