Blandade C++ frågor, nybörjarnivå

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av sodjan »

> Man kan istället skicka variabeln som parameter "by reference".

Men då är vi väl tillbaka vid globala variabler? Alltså just det som "static"
försöker undvika. Sen, att skriva "reentrant" och/eller "thread-safe"
funktioner är ett lite annat problem...
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

Nej det kan lika gärna vara en automatisk variabel i en funktion.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av sodjan »

Utveckla gärna lite, jag förstår inte. Hur löser en "automatisk variabel"
och parametrar "by reference" problemet med att behålla ett "state"
i en funktion från ett anrop till ett annat?
Användarvisningsbild
Jan Almqvist
Inlägg: 1581
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Jan Almqvist »

sodjan skrev:> Man kan istället skicka variabeln som parameter "by reference".

Men då är vi väl tillbaka vid globala variabler? Alltså just det som "static"
försöker undvika. Sen, att skriva "reentrant" och/eller "thread-safe"
funktioner är ett lite annat problem...
Variabeln kan vara deklarerad i anropande funktion t.ex. main().

Jag tycker att det är lika bra att göra all kod trådsäker redan från början.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

I objektorienterade miljöer (t.ex Javascript) är det däremot ganska
vanligt att man vill att funktioner ska agera på objekt som finns
i kontexten hos den som anropande. Även Python har en sådan
struktur. Men då talar vi mer om klasser, metoder o.s.v. än det
som vi normalt kallar för "funktioner" i icke-OO språk...
Jag tolkade det här som att du menar att du vill modifiera en variabel deklarerad i funktion A i funktion B som anropats av funktion A.

Kod: Markera allt

void funcA(void);
void funcB(int *p);


int main(void) 
{

  funcA();

  return 0;
} /* main */

void funcA(void)
{
  int a;

  funcB(&a);

} /* funcA */


void funcB(int *p)
{

  *p += 1;

} /* funcB */
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av sodjan »

Ja, det är ju lite av en annan sak. Det var ett exempel
på ett annat "problem" än det som det direkt frågades om.
Och där finns det ju metoder att skicka referenser men det
handlar mer om t.ex. olika objekt på en websida eller liknande.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

Webbsidor och objektorientering behärskar jag inte alls så där skulle du kunna lura i mig nästan vad som helst. :)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

Vad kan jag "ersätta" typen char med?
Frågan är väl egentligen om jag borde göra det eller helt enkelt låta det vara som det är.

I ett Arduino-program så är det en array som ser ut så här: char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
Senare i programmet så så skrivs denna ut med: Serial.print(packetBuffer);
I detta läge så blir det inga kompileringsfel och printen skriver ut hela bufferten.

Då jag är lite osäker på storlek och om denna "char" tillhör vanligheten att använda, så tänkte jag bara byta ut den mot uint8_t eller uint16_t men icke, det blir kompileringsfel vid printen som heter call of overloaded 'print(uint8_t [16])' is ambiguous.

Så, vad är egentligen "char" för något och är det bara korkat att byta ut denna?
(Har sökt en del på char och kommit fram till att det är en int, men vad för någon har jag inte förstått än)
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

En char brukar, men måste inte, vara en uint8_t eller en int8_t. Det varierar mellan arkitekturer och kompilatorer.

Om du gör en "cast" Serial.print((char *) packetBuffer) så funkar det med stor sannolikhet om du definierat uint8_t packetBuffer[16].

Det anses i vissa kretsar inte riktigt seriöst att använda "cast". Med viss rätt. Men jag tycker det är ännu oseriösare att använda char. Iallafall när man pysslar med embedded. :vissla:
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Zkronk »

Normalt sett är väl en char ett signed 8-bitars tal som går mellan -128 upp till 127?
Och uint8_t är ett unsigned 8-bitars tal som går från 0 till 255.
Angående utskriften med Serial.print så tycker jag det ser lite konstigt ut, det fungerar antagligen att ersätta char med uint8_t om du gör utskriften med hjälp av t.ex. en for-loop som stegar igenom arrayen.

Kod: Markera allt

#define UDP_TX_PACKET_MAX_SIZE 100

uint8_t packetBuffer[UDP_TX_PACKET_MAX_SIZE];
uint8_t i;

// Gör något som fyller arrayen med data här

for (i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) {
   Serial.print(packetBuffer[i]);
}
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

Ja det var som fasen.
Jag skrev ut arrayen precis som du skriver Zhronk men av en slump så testade jag "mitt" sätt.
När det visade sig fungera så lämnade jag det så och nu när jag kom till att ändra char så började misären.

Ändrade tillbaka till att skriva ut arrayen som du föreslog och nu går det deklarera packetBuffer som uint8_t. :tumupp:

Det här gör ju att jag förstår char ännu mindre. Eller så fick jag bara för mig att den skrev ut arrayen riktigt innan.
Oavsett så lär det väl inte vara bra alls att använda char om den kan vara signed eller unsigned beroende på kompilator etc? Det kan ju bli riktigt knas...

EDIT: Ursäkta virrigheten. Sitter i min programmeringsbubbla igen. Svetten rinner, tårarna dryper, fingrarna ömmar och jag längtar hem.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

En bra kompilator varnar. Sedan om det är signed eller unsigned det vet man inte om man inte testat.

TMS320C32 med TIs kompilator hade 32 bits char. Minns inte om det var signed eller unsigned.

Pascal för DEC20 och TOPS20 hade 36 bits char. Om man inte gjorde en "packed array", då var den 7 bit. Jag gissar (vet inte säkert) att PDP8 hade 6 bits char. Eller 12 bits.

Vad en char är kan man aldrig veta så noga. Det är ungefär lika välspecat som en "bil".

Om du vet att din array ska innehålla ASCII (7 bit) så kan du använda char utan problem i de system jag känner till.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

O herregud. Jag tror vi låter det vara så här.
Tack för hjälpen, ska ni ha!
Senast redigerad av Magnus_K 27 mars 2016, 20:40:08, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av lillahuset »

Vadådå? :D
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

Pga min EDIT några inlägg längre upp :wink:

Ny fråga:

Jag har en 16-bitars variabel och undrar om man på något fiffigt sätt kan "räkna antal ettor" i den variabeln för att sedan överföra detta värde i en 8-bitars variabel. Exempel:

Kod: Markera allt

uint16_t largeVar = 0b0000000011110000;
uint8_t smallVar = largeVar?  // här ska alltså resultatet 4 skrivas in i smallVar
Skriv svar