Ny på GCC, diverse fågor...

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

En pekare till en pekare till en char kan du deklarera så här enkelt:

Kod: Markera allt

char **ppc;
Så här använder du den:

Kod: Markera allt

char c;
char *pc = &c;
char **ppc = &pc;
Senast redigerad av lillahuset 1 maj 2016, 15:35:48, redigerad totalt 1 gång.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6921
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av Marta »

Fortfarande helt yr...

Behövs det införas en extra typ och en extra namngiven "mellanpekare" för att lösa det?

Om en pekare pekar på en annan som i sin tur pekar på en struct, hur skriv det för att komma åt något i denna struct?

Är det så att Pascal helt enkelt har en helt överlägsen lösning här som inte kan ersättas med några enkla tecken, utan det krävs en massa kladd?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

Nej, du behöver inte ha en "mellanpekare" det var bara ett exempel.

Vad, exakt, menar du med detta?
Om en pekare pekar på en annan som i sin tur pekar på en struct, hur skriv det för att komma åt något i denna struct?
Menar du att du har två pekare av samma typ som pekar på samma struct eller vad är det du vill göra?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av sodjan »

> Vad, exakt, menar du med detta?

Hur man kommer direkt från ppc => c i ditt exempel, t.ex.
Utan att gå via pc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

Det gör man inte. :) Jag har rättat mitt exempel och lagt till en asterisk i definitionen av ppc. :oops:

Jag vet inte om jag är korkad men jag läste det som att TS ville peka på en pekare till något.

Marta, kan du skriva i Pascal vad du vill åstadkomma? Så kanske jag fattar.

Edit: Jag läste om men kan fortfarande inte förstå det på något annat sätt.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6921
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av Marta »

Proceduren tar en pekare till ett element i en dubbellänkad lista och skapar ett nytt element med given storlek samt länkar in detta. Sedan skall adressen till det nya elementet följa med tillbaka så att pekaren i anropet blir ändrad.
Just denna går ju att lösa med en funktion som returnerar den nya pekaren eller det går att "ta ett kliv" i listan, men det finns andra som har med sig två pekare in och där båda eller en (okänt i förväg vilken) som kommer att ändras och ändringen skall följa med tillbaka i de variabler som använts vid anropet.

Kod: Markera allt

procedure AddLink(var Link:TlP; Size:word);
var P:TlP;
begin //AddLink
    P:=Link;              
    Link:=NewLink(Size);                        
    P^.FORW^.BACK:=Link;                                  
    Link.FORW:=P^.FORW;
    P^.FORW:=Link;
    Link^.BACK:=P;
    Link.LENGTH:=Size;                                     
end; //AddLink
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

Här har du ett extremt simplistiskt exempel. Om du kör det kommer du att se att pekaren ändras i funktionen och skrivs ut.

Kod: Markera allt

#include <stdio.h>

typedef char data_t;

//UpdateData( var DataPtr; Data, Length);
void updateData(data_t **dataPtr, data_t *data, int length);

data_t buf[10];

int main(int argc, char **argv)
{

  data_t *dp;

  dp = buf;

  printf("dp: %p\n", dp);

  updateData(&dp, buf, 1);
  printf("dp: %p\n", dp);

  updateData(&dp, buf, 2);
  printf("dp: %p\n", dp);

  updateData(&dp, buf, 3);
  printf("dp: %p\n", dp);

  return 0;
} /* main */


void updateData(data_t **dataPtr, data_t *data, int length)
{

  (void) data;

  *dataPtr = *dataPtr + length;

} /* updateData */
MiaM
Inlägg: 9961
Blev medlem: 6 maj 2009, 22:19:19

Re: Ny på GCC, diverse fågor...

Inlägg av MiaM »

Marta skrev:Proceduren tar en pekare till ett element i en dubbellänkad lista och skapar ett nytt element med given storlek samt länkar in detta. Sedan skall adressen till det nya elementet följa med tillbaka så att pekaren i anropet blir ändrad.
Istället för att skicka pekaren som parameter så skickar du en pekare till pekaren. Det behöver inte deklareras någon ny typ för detta. D.v.s. sätta på en extra stjärna i funktionsdeklarationen och anropen och ett extra ochtecken på varje ställe pekaren används inne i funktionen.
kodar-holger
EF Sponsor
Inlägg: 920
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Ny på GCC, diverse fågor...

Inlägg av kodar-holger »

Tyvärr är det nog så att Pascal är överlägset C, ja. Ada är ännu bättre.

Har du tungt vägande skäl att använda C istället för C++?

C++ tar visserligen inte bort några av dom idiotier som C har men tillför en del bra saker. Som till exempel riktiga referensparametrar med &-syntaxen. Funkar som var i pascal. Ungefär.

Dessutom finns ju stl, standard template library som ger en hel del standardiserade biblioteksrutiner så man slipper hålla på med den (n+1)e implementationen av länkad lista.

Fast jag är iofs så lyckligt lottad att jag slipper att yrkesmässigt utveckla för dom ynkligaste processorerna men jag skulle hellre välja nån Cortex M0 för några kronor mer än en PIC och slippa C om jag alls gjorde embeeded for a living.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

"En miljard flugor kan inte ha fel, ät skit". Eller "eftersom C är det absolut största språket inom embedded kan det ju inte vara helt fel". Och det gäller oavsett arkitektur.

Jag misstänker att alla de populäraste operativsystemen är skrivna i C. Windows, Android, iOS och vad det andra från Apple heter och slutligen Linux.

Cortex M0 brukar vara billigare än allt annat vid motsvarande prestanda. Själv slutade jag använda PIC för 15~20 år sedan eftersom jag redan då insåg att livet är för kort.

kodar-holger: Vilken Ada-kompilator rekommenderar du?
Användarvisningsbild
ffredrik
Inlägg: 341
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Ny på GCC, diverse fågor...

Inlägg av ffredrik »

C är industristandard för embedded, inte utan anledning.

Jag ser ingen anledning att använda PIC när det finns AVR. Tack vare Arduino (som jag undviker) finns det massor med billig hårdvara.
kodar-holger
EF Sponsor
Inlägg: 920
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Ny på GCC, diverse fågor...

Inlägg av kodar-holger »

Nu är vi rejält off topic här...

Jag är osäker på vad du menar lillahuset. Om du håller med eller ej. Stora delar av VMS var skrivet i BLISS om jag minns rätt. Inget som hindrade att många applikationsprogram gjordes i Basic, Fortran, ... Att OS är skrivet i C är inget som helst argument för att koda i C. Programming by Google kan vara ett argument. D.v.s. hur gör jag detta, googla fram nån som redan löst problemet och kopiera koden.

Använder GNAT. Tyvärr är alternativen inte så många. Och som sagt, inte embedded. Wintelplattform. Många kärnor och mycket minne. Men gnat finns till Arm om jag minns rätt. Behöver du fråga om priset har du inte råd. Finns opensource-initiativ. https://adaformicrocontrollers.com/.

Japp, C är industristandard och industrin har alltid rätt. Det är därför vi fortfarande arbetar 6 dagar i veckan och minst 12 timmar varje dag, och cancerogena skäroljor används.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Ny på GCC, diverse fågor...

Inlägg av lillahuset »

Visst, OT.

Nja, jag bara är av den uppfattningen att det mesta som har skrivits av systemprogramvara efter K&R är i C. För applikationer tycker jag Python verkar vara ett bra val. Det är bara det att jag inte, tyvärr, har förmått mig att lära mig Python.

Och nej, vi (de flesta men kanske inte du och jag), jobbar inte sex dagar i veckan tolv timmar om dagen.
Däremot tycker jag 40-40-40-regeln verkar tillämplig. Vi jobbar 40 timmar i veckan i 40 år för att få ut 40% av vad vi behöver för att överleva efter pensionen för att någon annan ska bli rik.

Jag kommer nog aldrig överge C. Grinig gammal gubbe. :D
Användarvisningsbild
adent
Inlägg: 4100
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av adent »

Hehe!

Ja just var-parametrarna är faktiskt en tillgång i Pascal, men ändå nog så svår att förklara. Jag gillade dock Pascal som
språk att lära ut programmering med. Det var väldigt rakt på sak och gjorde man fel fick man veta det. Tack vare just
var-parametrarna kom man väldigt långt utan pekare. Körde nybörjarkurser i programmering i Pascal på Högskolan i Gävle mellan
ca 1999 och 2005 eller så (och andra kurser förstås).

Som någon sa tidigare finns motsvarigheten till var-parameter i form av & i C++. Eftersom C ingår som ett subset av C++ kan
man koda C och använda sig av & på ett bekvämt sätt.

Ett ställe där det är skillnad på Pascal och C är när man ska hantera strängar. Pascal är mer åt array-hållet (strängens längd finns lagrad i strängen själv) och C som anser strängar som enbart en pekare till första tecknet, sen hoppas vi att det finns ett terminerade '\0' längre fram.

Som säkert många har skrivit och du kommit fram till kan man om man vill vara purist och köra C skicka med en pekare till variabeln man vill ändra och sedan dereferera den i funktionen. Det blir ganska likt var-parameter förutom att man måste vara medveten om att man har en pekare.

MVH: Mikael
Skriv svar