Vinnaren i pepparkakshustävlingen!
2018-02-05, 10:48
  #2977
Medlem
Snabb fråga (hoppas jag )

När och varför använder man pekare istället för tex int, string etc. som funktionstyp, när man deklarer en funktion? Tex:

Kod:
unique_ptr<Car> getNextCar() { bla bla bla }
Citera
2018-02-05, 16:41
  #2978
Medlem
Citat:
Ursprungligen postat av Tiger-Lily
Snabb fråga (hoppas jag )

När och varför använder man pekare istället för tex int, string etc. som funktionstyp, när man deklarer en funktion? Tex:

Kod:
unique_ptr<Car> getNextCar() { bla bla bla }

Vanligtvis så använder man pekare istället för att returnera själva objektet för att om funktionen returnerar ett helt objekt så behöver processorn kopiera det objektet efter att funktionen är körd... för små typer såsom int, char osv är det inget problem men det blir lite segt om den behöver kopiera ett klassobjekt med en massa variabler i. Alltså kommer du nog att se pekare användas som returtyper lite oftare när det är ett större objekt som returneras.

Med pekare kopieras bara pekaren, 4 eller 8 byter beroende på om man kör x86 eller x64. (antagligen lite större om den är unique_ptr eller nåt liknande)

En annan anledning är att det är lite bättre om man skriver ett bibliotek... till exempel så kan man ha ett bibliotek där det är ett par funktioner som använder sig av samma "handle." Och användaren behöver inte veta hur det funkar bakom kulisserna så att säga, alltså skriver man funktioner som returnerar en pekare och därmed behöver man inte avslöja klassen och dess medlemmar. Dessutom behöver användaren inte ens veta att det är en pekare... kan returnera en int eller nånting av egen typ och sen inom egna funktioner casta tillbaka till pekare. Så funkar windows-api... HANDLE som man får av GetModuleHandle till exempel, det är faktiskt en pekare till där DLL:en ligger i minnet.
Citera
2018-02-05, 17:36
  #2979
Moderator
RostigHinks avatar
Citat:
Ursprungligen postat av kanes272
Vanligtvis så använder man pekare istället för att returnera själva objektet för att om funktionen returnerar ett helt objekt så behöver processorn kopiera det objektet efter att funktionen är körd... för små typer såsom int, char osv är det inget problem men det blir lite segt om den behöver kopiera ett klassobjekt med en massa variabler i. Alltså kommer du nog att se pekare användas som returtyper lite oftare när det är ett större objekt som returneras.

Med pekare kopieras bara pekaren, 4 eller 8 byter beroende på om man kör x86 eller x64. (antagligen lite större om den är unique_ptr eller nåt liknande)

En annan anledning är att det är lite bättre om man skriver ett bibliotek... till exempel så kan man ha ett bibliotek där det är ett par funktioner som använder sig av samma "handle." Och användaren behöver inte veta hur det funkar bakom kulisserna så att säga, alltså skriver man funktioner som returnerar en pekare och därmed behöver man inte avslöja klassen och dess medlemmar. Dessutom behöver användaren inte ens veta att det är en pekare... kan returnera en int eller nånting av egen typ och sen inom egna funktioner casta tillbaka till pekare. Så funkar windows-api... HANDLE som man får av GetModuleHandle till exempel, det är faktiskt en pekare till där DLL:en ligger i minnet.
RVO.

Om inte kompilatorn är usel så klarar den av return value optimization, dvs om en funktion skapar ett lokalt objekt och returnerar det sker i allmänhet ingen kopiering. Även om objektets copykonstruktor har sidoeffekter. Detta gäller även unique_ptr som är ett returnerat objekt i sig.
Citera
2018-03-15, 15:48
  #2980
Medlem
Fancyfruits avatar
Jag vill skriva ett mycket enkelt C-program.
Hur skriver jag ett program, som när jag startar, "skriver" ett kommando, precis som om jag hade skrivit ett kommando i terminalen själv.

Exempel.
Jag skriver i terminalen $ ls, och en lista kommer upp med alla filer och mappar i mappen jag står i, som svar.

När jag startar mitt C-program skall det listan komma upp med filer och mappar på samma sätt. Programmet skall alltså skriva in kommandot "ls" på egen hand.

Hoppas ni förstår vad jag menar.
Citera
2018-03-15, 17:20
  #2981
Medlem
Fancyfruits avatar
Citat:
Ursprungligen postat av Fancyfruit
Jag vill skriva ett mycket enkelt C-program.
Hur skriver jag ett program, som när jag startar, "skriver" ett kommando, precis som om jag hade skrivit ett kommando i terminalen själv.

Exempel.
Jag skriver i terminalen $ ls, och en lista kommer upp med alla filer och mappar i mappen jag står i, som svar.

När jag startar mitt C-program skall det listan komma upp med filer och mappar på samma sätt. Programmet skall alltså skriva in kommandot "ls" på egen hand.

Hoppas ni förstår vad jag menar.

Edit:
Hittade lösningen.
Kod:
system("<command>");
Citera
2018-04-02, 23:56
  #2982
Medlem
Hej!

Dum som jag är, så skjuter jag på detta till sista sekund, då jag varit lite upptagen i påskhelgen.

Jag har precis börjar en programmeringskurs i c++, detta är första veckan. Men jag har kört fast och suttit och funderat ut hur jag ska göra, då jag fortfarande är otroligt okunnig och förvirrad gällande allt.

Min uppgift för veckan (Missat deadline redan...) är att jag ska skapa ett program som ska räkna ut hur lång tid det tar att spara ihop ett visst belopp.

Bild på hur det ska se ut - https://gyazo.com/b97af3199812e762efad9aa6e524d28e

Så jag ska ange sparad summa per år + ränta på pengar och få fram hur lång tid det tar att spara ihop det.

Problemet är att jag suttit hela dagen, klurat och googlat. Men eftersom jag inte vet vad jag gör, så är det svårt att hitta och leta svar på rätt sätt.

Någon nattuggla som har lust att förklara det lite bättre för mig, hur jag ska bära mig åt och tänka när jag skapar programmet?

Uppskattar all hjälp!

Hälsningar
Niveo
Citera
2018-04-03, 01:47
  #2983
Avstängd
Citat:
Ursprungligen postat av Niveo
Bild på hur det ska se ut - https://gyazo.com/b97af3199812e762efad9aa6e524d28e

Loopa tills saldot är större än eller lika med målet, och räkna åren.

Kod:
double multiplier = 1.0 + (interest / 100.0);
int years = 0;
while (balance < goal) {
    balance *= multiplier;
    ++years;
}

Om jag inte minns fel fanns det en tråd, hittade den, lite underligt namn: (FB) Loop där det nya värdet efter loopen används i nästa varv
__________________
Senast redigerad av Eliwood 2018-04-03 kl. 01:54.
Citera
2018-04-03, 19:56
  #2984
Medlem
Citat:
Ursprungligen postat av Eliwood
Loopa tills saldot är större än eller lika med målet, och räkna åren.

Kod:
double multiplier = 1.0 + (interest / 100.0);
int years = 0;
while (balance < goal) {
    balance *= multiplier;
    ++years;
}

Om jag inte minns fel fanns det en tråd, hittade den, lite underligt namn: (FB) Loop där det nya värdet efter loopen används i nästa varv

Ursäkta sent svar! Det var exakt samma uppgift jag hade. Tack!

Hälsningar
Niveo
Citera
2018-04-04, 16:16
  #2985
Medlem
Ranndalls avatar
Kan någon förklara kortfattat dessa begreppen inom C?

a) Primärminne
b) Algoritm
c) Selektion
d) Aktuell parameter
e) Variabel

Skulle uppskatas är lite osäker på denna uppgift
Citera
2018-04-05, 16:03
  #2986
Medlem
Ranndalls avatar
Citat:
Ursprungligen postat av Eliwood
a) Binär data, dvs allt utom rena textfiler, består av ettor och nollor. Ettorna lagras i primärminnet, nollorna i sekundärminnet. Eller tvärtom på äldre datorer.
b) Microsofts kraftigt försämrade variant av C. Bill Gates skrev den efter att han halkat på toaletten och slagit i huvudet, när han skulle sätta upp en tavla.
c) Apples variant, som kostar pengar.
d) Aktuella och inaktuella parametrar finns bara i C++. Det här är en kuggfråga.
e) Säkert inget viktigt, jag har aldrig behövt använda en.
Okej vet inte om du var seriös med några av de där svaren. Jag kom fram till lite annorlunda svar.


Det är väl d) jag är lite osäker på. Hittade bara info om parameter, drog slutsatsen att det kanske skulle kunna vara så. Kanske är en kuggfråga som du säger.

Edit: Tydligen är "/* definition */ int kvadrat(int x)" exempel på en formel parameter och "/* anrop */ kvadrat(15)" exempel på en aktuell parameter. Så antar det var det jag kom fram till på egen hand.
__________________
Senast redigerad av Ranndall 2018-04-05 kl. 16:58.
Citera
2018-04-05, 17:04
  #2987
Avstängd
Citat:
Ursprungligen postat av Ranndall
Okej vet inte om du var seriös med några av de där svaren. Jag kom fram till lite annorlunda svar.

Nej jag hatar att uttrycka mig i "egna ord" och varje gång vi skulle skriva uppsats ville jag mörda läraren.

Citat:
Ursprungligen postat av Ranndall

Det där var ju suveränt. Kanske du kan lägga till något liknande det här: RAM är det vanligaste exemplet på primärminne. Det är snabbt, men dyrt (per byte) och försvinner när batteriet och strömmen dör, eller om man startar om. Hårddisken är det vanligaste exemplet på sekundärminne. Det är långsamt, men billigt per byte och finns kvar.

Basically, när man sparar i ett program eller spel, lagras den flyktiga datan i primärminnet permanent i sekundärminnet, på datorn ofta i formen av en fil. Jag vet inte ens om hårddisken är det vanligaste sekundärminnet längre, med alla mobiltelefoner och de där små svarta minneskorten, vad de heter. Det är mer allmän datorkunskap än C.
__________________
Senast redigerad av Eliwood 2018-04-05 kl. 17:11.
Citera
2018-04-05, 19:44
  #2988
Medlem
Ranndalls avatar
Citat:
Ursprungligen postat av Eliwood
text
Okej intressant tack för ditt tilläg.

Nästa fråga:
Vad är skillnaden mellan värdeanrop (call-by-value) och referensrop (call-by-reference)?

__________________
Senast redigerad av Ranndall 2018-04-05 kl. 20:21.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback