Blandade C++ frågor, nybörjarnivå
Re: Blandade C++ frågor, nybörjarnivå
> 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...
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...
- 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å
Nej det kan lika gärna vara en automatisk variabel i en funktion.
Re: Blandade C++ frågor, nybörjarnivå
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?
och parametrar "by reference" problemet med att behålla ett "state"
i en funktion från ett anrop till ett annat?
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Blandade C++ frågor, nybörjarnivå
Variabeln kan vara deklarerad i anropande funktion t.ex. main().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...
Jag tycker att det är lika bra att göra all kod trådsäker redan från början.
- 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å
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.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...
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 */
Re: Blandade C++ frågor, nybörjarnivå
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.
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.
- 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å
Webbsidor och objektorientering behärskar jag inte alls så där skulle du kunna lura i mig nästan vad som helst.
- 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å
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)
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)
- 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å
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.
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.
Re: Blandade C++ frågor, nybörjarnivå
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.
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]);
}
- 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å
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.
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.
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.
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.
- 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å
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.
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.
- 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å
O herregud. Jag tror vi låter det vara så här.
Tack för hjälpen, ska ni ha!
Tack för hjälpen, ska ni ha!
Senast redigerad av Magnus_K 27 mars 2016, 20:40:08, redigerad totalt 1 gång.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
- 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å
Pga min EDIT några inlägg längre upp
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:
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