Programutvikling for Mac OS X, del 3 - Litt mer C.

Programutvikling for Mac OS X, del 3 - Litt mer C.

Innleggav EinarJ » man 24.01.2011 5:25

Sitter du med en programmerer i magen, men vet ikke helt hvor du skal begynne for å lære deg faget? Vel, da trenger du ikke fortvile, Del 3 av Utviklerguiden gir en grunnleggende innføring i språket C.

(Har du ikke lest Del 1 ennå, anbefales det på det sterkeste før du leser resten av guiden)

Så langt har vi kikket litt grunnleggende på hvilke verktøy vi har å jobbe med, nemlig XCode og Interface Builder, men en hammer er ikke nyttig uten spiker, og XCode er ikke nyttig uten å kunne et programmeringsspråk, derfor handler denne delen av guiden om programmeringsspråket C, C er et relativt gammelt, og populært programmeringsspråk, og er stamfaren til både C++ og Objective-C, et godt argument for å lære seg C, er at all C kode er gyldig Objective-C-kode, så mye av det man plukker opp fra C kan være nyttig når man kommer til Objective-C senere. OG, det er et relativt lite språk, og passer derfor godt til å forklare de mer grunnleggende tingene i, før vi setter i gang med objektteorien som vi blir nødt til å lære oss i Objective-C.

Fra før har jeg vist dere litt småtteri, i Del 1 så vi noen enkle betingelser og løkker, og vi var borti konseptet variabel, nå skal jeg prøve å forklare litt mer av det som ble gjort der. Først tar vi en litt grundigere kikk på oppgaven som ble delt ut i Del 1.

Oppgaven fra Del 1:
I første del av denne guiden, delte jeg ut oppgaven "Lag et program som lar "brukeren" gjette tall, svaret er selvfølgelig noe du har valgt på forhånd. For ekstra creds, gi brukeren tilbakemelding om tallet er større eller mindre enn det han har gjettet.", et enkelt svar på denne oppgaven er f.eks. følgende:



La oss ta en grundig kikk på hva som foregår her:
1: Først introduserer vi to variabler, "answer" og "guess", disse kunne vi valgt å kalle nesten hva som helst (det finnes visse begrensninger, som f.eks. at de ikke kan starte med tall), men det er greit å gi dem fornuftige navn, som forklarer hva de er tiltenkt. Disse variablene får også hver sin verdi med en gang, slik at vi er sikre på at vi vet hva de er. (NB! I motsatt fall har de vilkårlige verdier)

2: Det neste som skjer, er at vi skriver ut litt tekst; "Gjett: ", slik at vi har en ledetekst slik at "spilleren" kan få litt informasjon om hva som er forventet av ham.

3: Denne linjen leser inn et heltall fra brukeren, og lagrer dette i variabelen "guess", la oss stoppe opp litt, og forklare hvordan vi kan se dette klart fra koden over:

* Vi registrerer at linjen består av et "funksjonskall", ved å se at den er på formatet "tekst(noe,noe)", altså noe tekst etterfulgt av parentes, kanskje noe imellom parentesene, men linjen avsluttes med parentes-semikolon, ergo har vi et funksjonskall. (sammenlign med de andre linjene i programmet, f.eks. den neste, eller den første, som ikke er funksjonskall).

* Vi ser at funksjonen er scanf, som vi har lært at tar argumenter (det mellom parentesene) på formen: "%d",&variabelnavn.

* %d betyr "les heltall", &guess betyr "bruk variabelen guess".

Ergo kan vi dra følgende slutning om linjen: "Les inn et heltall fra tastaturet (scanf), og lagre dette i 'guess' ".
Akkurat hva en funksjon er, skal jeg komme tilbake til, årvåkne lesere har kanskje registrert at printf også er en funksjon, og vil ha rett i det, men, vi går videre i koden:

4: Denne linjen sjekker om verdien i guess er lik den i answer, legg her merke til de doble likhetstegnene, og bit deg merke i at vi brukte enkle likhetstegn i tilordningen i starten av programmet, dette fordi det er slik C har valgt å skille mellom "gjør X lik Y" og "er X lik Y", å ta feil av disse to er fort gjort, siden det bare er ett tastetrykk i forskjell, så bit deg godt merke i forskjellen først som sist.

Den linjen vi står og ser på nå, minner mistenkelig om disse funksjonskallene vi har snakket om tidligere, selv om den ikke er et funksjonskall, det er to grunner til dette, for det første så slutter ikke linjen på sluttparentes-semikolon, for det andre, starter den på "if", som er navnet på en kontrollmekanisme i C. "if" sjekker sannhetsverdien til uttrykket mellom parentesene sine, og hvis dette uttrykket er sant, så kjører programmet det som står mellom krøllparentesene rett etter if-en, i motsatt fall hopper programmet over krøllparentesene og alt i mellom dem.

If-en vår sjekker altså om gjetningen er lik svaret, hvis dette stemmer, så gratuleres brukeren, i motsatt fall gjøres ingenting.

5: Denne krøllparentesen forteller at noe starter her (gitt av linjen over, dvs 4)
6: Helt grei gratulation for riktig gjetning.
7: Denne krøllparentesen forteller at noe som ble startet, slutter her, dvs at det som står mellom 5 og 7 er det som gjøres hvis 4 er sann, vi kan med andre ord putte masse rart inni her hvis vi vil, inklusive nye betingelser eller løkker, slutt-krøllparentesen avslutter alltid KUN den innerste krøllparentesen.

Pseudokode:

En vanlig måte å presentere programlogikk som den vi nettopp har sett på, er å bruke såkalt "pseudokode", dvs at man beskriver logikken bak programmet, uten å måtte ta hensyn til språklige detaljer, eller kortere fortalt, man beskriver koden på strukturert norsk. Eksempelvis:

La SVAR være 42
La GJETNING være 0
Skriv ut "Gjett: " til skjerm.
Ta inn et heltall fra tastaturet, lagre dette i GJETNING
Hvis SVAR er lik GJETNING, gjør følgende:
Skriv ut "Riktig"
Slutt på hvis.

Man trenger ikke nødvendigvis gå i ekstrem detalj når man skriver pseudokode, men det kan være nyttig for å forstå hva som foregår, enda nyttigere blir den når man kombinerer den med "kommentarer" i koden.

Kommentarer, er tekst som ignoreres av C, og som bare er med for å forklare koden for den som leser den, i C, kan du markere at teksten som følger er en kommentar med "/*", og avslutte kommentaren med "*/", eller du kan markere at resten av en linje er en kommentar med // (slik jeg har gjort i eksempelet over). La oss sette pseudokoden inn i koden vår som kommentarer:



Der ble det plutselig en del enklere å se hva som foregår i koden, selv om vi nok ikke trenger å kommentere SÅ nøye i faktiske programmer, da f.eks. de første linjene sier seg selv.

Nå har vi sett hvordan man lager et program som lar deg gjette én gang, hvordan skal vi så gå frem for å lage et program som fortsetter å spørre brukeren? Nøkkelen til dette ligger i noen små endringer i pseudokoden vår:
La SVAR være 42
La GJETNING være 0
Så lenge SVAR er ulik GJETNING, repeter følgende:
    Skriv ut "Gjett: " til skjerm.
    Ta inn et heltall fra tastaturet, lagre dette i GJETNING
    Hvis SVAR er lik GJETNING, gjør følgende:
        Skriv ut "Riktig"
    Slutt på hvis.
Slutt på det som skal repeteres.

Det er litt viktig å ordlegge seg riktig når man skal skrive pseudokode, jeg KUNNE skrevet "slutt på så-lenge" på nederste linje, men da ville man kunne trodd at repetisjonen skal avbrytes uansett der, man kan også bevege seg lengre unna språket, og skrive: "Så lenge vi ikke har riktig svar, spør". Konverterer vi dette tilbake til C, får vi:



og, vi har plutselig kode som lar deg fortsette å spørre til brukeren gjetter riktig. En liten nøtt til leseren: Hvordan kan du gi begrenset antall forsøk?

Mer C teori
Da har vi gått gjennom en del av teorien litt praktisk, så nå er det på tide å gå gjennom uttrykkene bak det vi har gjort, og få på plass litt mer teori.

Variabler

Vi har allerede lært hva variabler er; merkelapper eller bokser, som kan holde en verdi, som vi senere kan bruke, og endre. Vi kjenner kanskje disse fra matematikkens algebra, men algebraens variabler skiller seg litt fra våre, der gir nemlig ikke X = X + Y mening med mindre Y er 0, mens her betyr uttrykket at X sin neste verdi skal være det X var + Y. Det er greit å vite at en variabel kan ha et vilkårlig navn, så lenge dette ikke starter med et tall, eller har mellomrom i seg, variabler bør ikke starte med _ .

Datatyper

Det vi ikke gikk gjennom, var "int" biten foran variablen, denne står for "integer" og betyr at variablen kan inneholde positive og negative helltallsverdier. Det jeg ikke forklarte, er at vi har andre datatyper vi kan velge å bruke, de to mest interessante av disse, er float og bool.

float står for floating point, og kan inneholde desimalverdier, som 3,14, her er det viktig å merke seg at presisjonen på desimalene ikke nødvendigvis er perfekt ned til minste desimal, så å sjekke likhet mellom to floats, kan fort by på problemer, sjekk heller hvor stort avviket mellom dem er (x-y≈0 istedenfor x==y).

bool står for boolean, og kan inneholde to verdier, sann, og usann, eller true og false, denne kan dermed brukes som "bryter" for å slå av og på funksjonalitet, tenk f.eks. "bool playMusic=false", hvor man da kan sjekke playMusic hver gang man skal justere musikken i et program, og dermed oppfatte at man ikke trenger å gjøre noe som helst, da programmet ikke vil ha lyd.

I tillegg har vi varianter av disse, som er større enn int og float, nemlig long og double, som vanligvis kan romme dobbelt så store verdier. Long er den større utgaven av int, og double er den større utgaven av float. Disse trenger du stort sett ikke bruke, med mindre du skal jobbe med veldig store verdier, eller trenger høy presisjon på desimaltallene dine.

Funksjoner
Hva om du har laget deg en nyttig løsning på noe, som du kunne tenke deg å bruke om igjen, uten å måtte kopiere den inn overalt? Vel, det er her funksjoner kommer inn, en nyttig analogi er matematiske funksjoner som sin(x), log(x) osv. Som du kanskje har gjettet, er printf() en slik funksjon, denne følger med C, og er således ikke noe vi trenger å lage, men hva om vi vil lage oss en snarvei for å skrive "Tallet er %d", vel, det er rimelig enkelt, følgende kode må da skrives foran linja som begynner med int main i fila di:



Nå kan du skrive skrivTall(x) (eller for den del y, x-en i skrivTall er en annen x enn den du evt har i main, dette kommer av noe som kalles scope, som vi kommer tilbake til om litt.)

Men, hva om du vil forenkle uttrykk med funksjoner? Det går selvfølgelig ann, funksjoner kan "returnere" et resultat, f.eks. slik:



da kan du bruke linjer som følgende i main:


int z = rektangelAreal(x,y);


eller


printf("Arealet av et rektangel %d",rektangelAreal(2,2));

Funksjoner kan også bruke andre funksjoner inni seg, (eller for den del, seg selv, noe som kalles rekursjon, men det kommer vi ikke til å se noe på ennå), da må funksjonen man bruker være skrevet over den funksjonen man skal bruke den i. (Derfor skriver vi alle funksjonene våre over main i grunnlaget).

Casting

Er et tricky konsept, så først må vi forklare "hvorfor", før vi forklarer "hva", i C er det slik at datatyper ikke bør blandes, (selv om de til en viss grad kan det), de forskjellige datatypene håndterer nemlig enkelte ting litt forskjellig.

Kanskje det beste eksempelet er deling med integers, siden integers er heltall, vil resultatet også måtte bli et heltall, og datamaskinen har ikke fått beskjed om å bry seg med detaljer som avrunding, så 5/2 = 2, og ikke 3. Bruker man derimot flyttall, så vil man ende opp med 2,5.

Gitt at vi da har en rekke heltall, som vi vil dele, og vi er interessert i å få resultatet med desimaldel, hvordan kan vi få C til å behandle heltallene våre som desimaltall? Jo, det er her casting kommer inn i bildet.

Casting, er enkelt å greit det å be C behandle en variabel som om den hadde en annen datatype enn det den har, castingen gjelder bare i det uttrykket man bruker den, og variabelen vil altså ikke skifte type permanent.

casting ser slik ut:
(datatype) variabel;

Eksempel:


Når du kjører dette programmet, vil du se at de to første resultatene er 2 og 2,0, mens det siste er 2,5, dette fordi vi der ikke lenger bruker heltallsdivisjon, men flyttalsdivisjon, som håndterer desimalresten. Som en liten ekstrainformasjon, kan jeg nevne at du strengt tatt ikke trenger å caste begge sidene av deletegnet, siden C automatisk bruker flyttalsdivisjon hvis ett av leddene i uttrykket er flyttall (men vær obs på sammensatte uttrykk som (x+y/z*(w/k)), hvor det kan være litt uklart om et "ledd" i utregningen har minst ett flyttalsuttrykk.

Vi har forøvrig også en operator dere kanskje ikke har sett så mye til tidligere, i tillegg til +,-,*,/, nemlig %, modulo-operatoren. Denne er nært beslektet med deling, og gir deg heltallsresten av delingen, altså, for 5/2, vil vi ha at heltallsdelingen gir 2, vi ganger tilbake, og ser at 2*2 = 4, og at vi dermed har en rest på 1, 5%2 er derfor 1. Dette trenger du ikke å tenke så nøye på akkurat nå, vi kommer til å komme tilbake til dette, da det kan være en veldig nyttig operator i enkelte sammenhenger.

Scope

Scope er en tricky liten sak, som sier noe om "levetiden" til variablene våre, kort fortalt betyr det at en variabel du har laget, bare eksisterer fra forrige {-krøllparentes, til den matchende }-krøllparentesen, finnes det flere nivåer med parenteser, vil den også eksistere inni disse:



Det er derfor skrivTall over, har en annen X-variabel, enn den vi sender inn når vi bruker X i main, dette er kanskje litt forvirrende, men det som skjer når vi bruker "skrivTall(2)", er f.eks. at x i skrivTall settes til å være 2, skriver vi "skrivTall(x)", vil x i skrivTall være hva nå enn x-en i main var da vi kalte den. (Men, når funksjonen er ferdig, vil ikke x-en DER eksistere lenger).

Betingelser

Vi har lært om if, såvidt i Del 1, jeg forklarte derimot ikke hvorfor det heter X==Y og ikke X=Y. Grunnen til dette er ganske enkelt at det første er en sammenligning, mens det andre er en tilordning, siden resultatet av X=Y, er at X blir lik Y, vil dette alltid medføre likhet mellom X og Y, og dermed gi oss en verdiløs betingelses-test (som dessverre fungerer uten å gi feil, så vær OBS på dette).

Prøv følgende, og se hva som skjer.



Løkker
Løkker kan være et litt tricky konsept å forstå, kort fortalt ber man datamaskinen om å gjenta et sett operasjoner, så lenge en betingelse fortsatt er gyldig, f.eks. "øk en variabel med 1, så lenge variabelen er mindre enn 10", dette vil føre til at maskinen teller fra hva nå enn variabelen var, til 9 (eller 10, avhengig av om du sjekker betingelsen før eller etter du kjører, men det kan vi komme tilbake til). I C har vi 3 typer løkker:
* While - Sjekk, så kjør. (Disse så vi i del 1)
* Do-While - Kjør, så sjekk:
Der While alltid sjekker om betingelsen er sann før den gjør noe som helst, med andre ord "sjekk, så kjør", er do-while en variant som gjør det motsatte, den vil alltid kjøre en gang, og sjekke etterpå, denne skrives på formen:



* For - Som er beregnet på å gjøre ting x-antall ganger, og kombinerer sjekking og inkrementering av en variabel, disse har en litt spesiell start:



Dette ser helt sikkert ut som svart magi, men det er egentlig ganske enkelt:

for( sett initialverdi ; betingelse ; endring)

Vi setter utgangspunktet til å være at i er 0, betingelsen til at vi kjører så lenge i er mindre enn 10, og endringen til å være "øk i med 1".

Det er på sin plass å nevne ++, i++ er kortform for "i = i + 1", for ordens skyld finnes det også en ++i, men denne er sjeldnere, og fungerer på en litt annen måte, som vi ikke ennå trenger å forklare helt.

Her kan vi forøvrig demonstrere modulo-operatoren(%) i full vigør:



Legg merke til at vi dermed teller til 5, 5 ganger, dvs nesten, vi teller fra 0 til 4, 5 ganger, dette kan være nyttig hvis vi f.eks. skal behandle tabeller med n-rader, og m kolonner. Men intill videre tar jeg det bare med så dere har sett at den finnes.

Småting


Som du kanskje har lagt merke til, slutter ALLE linjer med semikolon i C, dette er viktig, og skulle du glemme disse, kan du få mange mystiske feil, siden linjeslutt markeres med semikolon, har du også muligheten til å bryte opp linjene dine som du vil, da C bryr seg relativt lite om enter-tasten, f.eks:

printf(

"%d",

2

);

er lov, selv om det er ganske stygt, dette er i all hovedsak en detalj som blir viktigere når vi kommer til Objective-C.

Ellers har du kanskje lagt merke til at jeg har brukt // noen steder, dette er linjekommentarer, som forteller C at det som står bak disse skal ignoreres, dermed kan du skrive forklarende tekst der. En annen variant, er løpende kommentarer, som starter med /* , og ber C ignorere alt frem til du skriver */.

Så, til slutt, indentering, for å kunne gjøre koden din leselig, er det viktig at du bruker saklig indentering, indentering betyr innrykk, og gjøres fortrinnsvis med tab-tasten. En generell grunnregel er at innrykket skal øke med 1 hver gang du skriver {, og synke med èn hver gang du skriver }



Da har vi et lite arsenal med C å jobbe med, det ble nok kanskje litt mye teori denne gangen, men jeg håper dere klarte å henge med i svingene. Vi utsetter objektteorien til neste gang, men dere skal få noe å jobbe med frem til da, siden den eneste måten å LÆRE programmering på, er å programmere:

Oppgave 1: Skriv en funksjon som sjekker om to tall er delelige med hverandre. (Hint: modulo)

Oppgave 2: Skriv en funksjon som sjekker om et tall er primtall. (Ekstra credit: Lag en funksjon som printer alle primtall opp til X gitt som argument til funksjonen)*

Oppgave 3: Skriv et program som skriver ut gangetabellen, i 10x10-format.

Oppgave 4: Lag et quiz-program for å pugge gangetabellen, siden de fleste her har passert barneskolealder, bør det gjøres opp til 20x20.

Oppgave 5: Denne er litt mer for å lære dere å lære, kikk på denne, og finn ut hvordan dere kan gjøre tallet som skal gjettes tilfeldig mellom 1 og 42. srand og rand er nøklene her, lek litt med dem, og husk å gjøre #include-linjene øverst i programmet ditt lik de i eksempelet.

Oppgave 6: Kikk på denne og finn ut hvordan man printer float-verdier, lag et program som spør brukeren om floats til du får inn en 0, og regn ut snittet av disse.

Oppgave 7: Lag en funksjon som tar inn radius og returnerer areal.

Oppgave 8: Lag en meny, som lar brukeren velge mellom alle programmene du har laget (tips: Gjør oppgavene over som funksjoner, husk at rekkefølge på funksjonene i fila da er viktig).

* Dette kan potensielt ta VELDIG lang tid.

Prøv i vei, og ikke vær redd for å spørre eller komme med feedback hvis noe var uklart.

Moderator
Brukerens avatar
medlem i 235 måneder
 

Supert:) Håper du får mer

Innleggav Chriistoffer » man 24.01.2011 5:57

Supert:)

Håper du får mer enn 50 kickback for dette her. For dette er gull verdt for oss brukere men også for siden:)
medlem i 168 måneder
 

Good shit, men personlig

Innleggav fmortens » man 24.01.2011 11:03

Good shit, men personlig håper jeg folk slutter å bruke K&R. Ingen tar heller skade av noen mellomrom her og der :P
medlem i 242 måneder
 

Veldig bra artikkel! :)

Innleggav DanTheMan » man 24.01.2011 15:06

Veldig bra artikkel! :)
medlem i 171 måneder
 

Strålende tiltak! Blir

Innleggav Kirk » man 24.01.2011 15:25

Strålende tiltak! Blir spennede å se hvor dette ender opp til slutt.

Leser forresten en bok der de bruker %i sammen med printf for å markere en integer-verdi. Er det noen forskjell på %d og %i?

Brukerens avatar
medlem i 231 måneder
 

Flott at du lager en liten

Innleggav Børhaug » man 24.01.2011 15:43

Flott at du lager en liten intro til c. c er et alle tiders språk å kunne. Vil dåg legge til at man kan gå rundt problemmet med rekkefølge på funksjonene, som du har kommentert kort i oppgave 8. Det er veldig klønete, og gir særdeles dårlig lesbarhet dersom du i utgangspunktet må tenke på rekkefølgen av funksjonen. Da forsvinner årsaken til at man ønsker funksjoner i utgangspunktet.

Uansett - løsningen er at man deklarerer funksjonen, og for de som ikke har vært borti dette gjøres det på følgende måte:

Øverst i dokumentet, over main(), men etter include statementene, skriver man en deklarasjon av funksjonene. Det er litt på samme måte som med variabler. Man skriver da returverdien til funksjonen, navn, og argumenttyper til funksjonen, men avslutter med semikolon. Under main (eller i en annen fil om man ønsker det) skriver man hele funksjonen en gang til, men denne gangen i sin helhet - slik:

#include .....

int minFunksjon1(int);
int minFunksjon2();

int main(void){
minFunksjon1(1)
return 0;
}

int minFunksjon1(int x){
minFunksjon2();
return x;
}

int minFunksjon2(){
printf("Jeg er en funksjon som kalles av funksjon 1 \n");
return 0;
}

Det man her oppnår er at kompilatoren kjenner til at det er en funksjon som heter minFunskjon2, før den kjenner til at funksjon1 er avhengig av funksjon 2. Videre gjør det at man ikke trenger å lese hele koden din for å forstå hva funksjonene gjør. Har du deklarert en funksjon int sum(int x, int y) så er det åpenbart at man har en funksjon som plusser sammen to heltall.

EDIT: @Kirk: Ikke stor forskjeld. De er begge per.def. signed integer desimals. Forskjelden ligger ikke i når du benytter de som output, som her i printf. Men dersom du benytter de i scanf elller en annen input har du en forskjeld. Da kan %d kun benytte signed integers, mens %i også takler hexa-desimale tall.
Sist endret av Børhaug den man 24.01.2011 15:53, endret 2 ganger.

Brukerens avatar
medlem i 217 måneder
 

Børhaug: Selvsagt, men det

Innleggav EinarJ » tir 25.01.2011 0:11

Børhaug: Selvsagt, men det er en bevisst utelatelse fra min side, da artikkelen allerede var lang nok, og godt og vel kompleks nok fra før, å dra inn prototyper ville bare være å åpne døra for å måtte forklare enda mer. (Som for eksempel hva en kompilator er, nok en liten tidbit som jeg har utelatt enn så lenge).

På et eller annet tidspunkt (dvs senest når jeg skal forklare Objective-C-klasser), må jeg uansett forklare headerfiler, og includes, og da er det et naturlig tidspunkt å forklare prototyper også.

(Og, det surret en eller annen tanke baki hodet mitt om å introdusere deklarasjon-før-bruk ved å hoppe over prototyper i første omgang).

Når alt det er sagt, er jeg selvsagt enig i at man bør bruke prototyper. (Når jeg ser over igjen akkurat den biten, så burde jeg uansett forklare det å skrive egne funksjoner noe grundigere).

fmortens: K&R? Jeg bruker ganske eksplisitt C99 igjennom hele denne guiden, helt ned til bool-datatypen (jeg hopper dog over deklarasjon av variabel inne i for-løkka på den måten C++ gjør).

Moderator
Brukerens avatar
medlem i 235 måneder
 

smaken er som baken

Innleggav fmortens » tir 25.01.2011 13:12

Hei,

jeg refererte egentlig kun til indenteringen - ser ut som C99 ikke har gjort så mye endringer der.

Kun egne preferanser må jeg innrømme - så lenge folk bevarer case i filreferanser er jeg egentlig fornøyd :P

Anyway...

Jeg ser ikke fordelen med å ofre en hel linje bare for {}

if (statement) {
---
}
else {
---
}

synes jeg blir betraktelig mer ryddig og lesbart i forhold til

if(statement)
{
----
}else{
----
}


Jeg synes litt mellomrom her og der for å øke lesbarhet (avhenger av font etc) er en god ting.

I tillegg synes jeg at man må markere forskjellen mellom en vanlig funksjon og f.eks. if og else etc...

funksjonsnavn(blah, blah) {
---
}

og

if (blah) {
---
}
else if (blah) {
---
}
medlem i 242 måneder
 

Re: Programutvikling for Mac OS X, del 3 - Litt mer C.

Innleggav EinarJ » tir 25.01.2011 15:01

Ah, da er vi rimelig uenige, men ikke om K&R, siden indenteringsstilen jeg bruker er Allmann, eller ANSI C. og har et par fordeler:

* Lesbarheten til blokker øker, siden matchende braces er på samme nivå

* Utkommentering av enkeltlinjer brekker mindre, siden krøllparentes-balansen ikke forskyves ved utkommentering av if e.l.

Ja, også er det standarden Microsoft bruker.

Men alt i alt er det en smakssak, jeg avskyr den formen du nevner (1TBS), men har ikke lyst til å dra igang en lengre diskusjon om stilvalg :p

Moderator
Brukerens avatar
medlem i 235 måneder
 

Re: Programutvikling for Mac OS X, del 3 - Litt mer C.

Innleggav fmortens » tir 25.01.2011 15:03

:P
medlem i 242 måneder
 

Når oppgavene 1-8 er

Innleggav ggt667 » tor 27.01.2011 15:44

Når oppgavene 1-8 er utført, så blir vel det neste å kompilere disse funksjonene som noe man kan påkalle via #include "mineFunksjoner.h"?
Sist endret av ggt667 den tor 27.01.2011 20:02, endret 2 ganger.

Brukerens avatar
medlem i 241 måneder
 

Re: Programutvikling for Mac OS X, del 3 - Litt mer C.

Innleggav EinarJ » tor 27.01.2011 16:20

Tja, strengt tatt blir det isåfall #include "minefunksjoner.h"
uten semikolon, og med doble fnutter.

Men headere, prototyper etc, må jeg nesten gå gjennom neste gang. (Nok en gang siden denne delen ble mer enn lang nok)

Moderator
Brukerens avatar
medlem i 235 måneder
 

Re: Programutvikling for Mac OS X, del 3 - Litt mer C.

Innleggav ggt667 » tor 27.01.2011 17:26

Da kommer vi inn på det jeg har ventet på, var en gang sikker på at det het casting, men ser nå at det heter prototypes. Men casting kan kanskje brukes i prototype?
Sist endret av ggt667 den tor 27.01.2011 20:01, endret 1 gang

Brukerens avatar
medlem i 241 måneder
 

Kommer del 4 snart? Jeg vil

Innleggav ggt667 » tor 28.04.2011 13:44

Kommer del 4 snart? Jeg vil gjerne lage en plug-in til Aperture snart.

Brukerens avatar
medlem i 241 måneder
 

Noen her som har prøvd seg

Innleggav ggt667 » tir 07.06.2011 18:33

Noen her som har prøvd seg på iOS utvikling?

Jeg sitter her og fikler med et brettspill, vurderer å lage monopol, hvordan ville du ha laget brettet? Jeg ser for meg å gjøre det zoom-bart, som et bilde, men hvilken type objekt skulle jeg da brukt som canvas på prosjektet?

Brukerens avatar
medlem i 241 måneder
 

Neste

Returner til Artikler (Mac1)



Hvem er i Forumene

Registrerte brukere: Google [Bot]