Programutvikling for Mac OS X, del 1 - Komme i gang.

Sitter du inne med en knallidè til en app, men vet ikke helt hvor du skal begynne? Vel fortvil ikke, her er første del av App-utvikler-guiden. Hvor vi skal lære å starte et prosjekt i XCode, og bittelitt C.

Etter å ha lekt litt med utviklerverktøyene til Mac OS X i en del år, tenkte jeg at det kanskje var greit å lage en guide for de litt ferskere til gamet, en slags "hvordan komme i gang"-guide til utvikling på mac, siden de færreste kanskje har tatt i utvikling fra før, går jeg vekk fra stilen til Switch-guiden, hvor jeg "oversatte" windows-uttrykk til mac-uttrykk, og forsøker å forklare alt helt fra scratch, så de av dere som har tatt i utvikling før, får nesten bære litt over med dette.

Først av alt, må det sies at apputvikling ikke er noe du kan komme HELT rett fra gata, og bare sette i gang med, det er en del grunnleggende ting du bør kunne før du setter i vei mot App Store, i denne utgaven, skal vi gå gjennom de helt grunnleggende tingene som må gjøres, for å kunne starte å utvikle. I første omgang holder vi oss til Mac OS X som mål:

Programmer skrives i programmeringsspråk, selve skrivingen av "koden" kan du gjøre i nesten alt fra TextEdit til Word, men dette er ikke nødvendigvis de riktige verktøyene for jobben (på samme måte som du KAN spikre inn spiker med stein, selv om en hammer er et mer praktisk verktøy), det er nemlig veldig nyttig å ha et verktøy som kan hjelpe deg litt på veien, og vise deg om det du har gjort er riktig. Samtidig vil "koden" du har skrevet på et tidspunkt måtte gjøres om til noe maskinen din kan kjøre, vi trenger altså helst et verktøy til å løse disse oppgavene.

Det er her XCode kommer inn, XCode er en såkalt "IDE" (Integrated Development Environment). Hvilket betyr at XCode både har en teksteditor beregnet på å redigere kode, og en kompilator, som tar seg av å oversette koden til maskinkjørbare filer. XCode er gratis, men krever registrering hos Apple Developer Connection:
XCode

Etter at du har installert XCode, vil du finne XCode i Macintosh HD/Developer/Applications/XCode.

Så, hvordan kommer vi i gang med et helt enkelt program i XCode?
Vel, bilder taler mer enn tusen ord heter det:
761352
Det første du ser når du kjører XCode for første gang er dette vinduet, som gir deg valget mellom å hoppe i det, eller å lese noen av Apples tutorials, her får du også en liste over nylig åpnede prosjekter, i denne omgang, velger vi "Create a New XCode-project". Som fører oss til dette skjermbildet:
761356
Dette kan se litt forskjellig ut hvis du valgte å laste ned XCode uten iOS SDKen, uansett, velg Mac OS X Application på venstre side, og Command Line Tool på høyre side.Trykk "Choose"
761357
Gi prosjektet et navn, og velg evt en plassering, trykk så "Save". Og vi havner her:
761358
Vi trykker på "main.c", og ser at Apple allerede har lagt inn et skjelett-program i prosjektet vårt, det klassiske "Hello World"-eksempelet. Legg også merke til den røde teksten i lista over, den skal vi komme tilbake til.

Men først, la oss kjøre dette skjelettprogrammet, for å se hva det gjør. MEN, før vi gjør dette, må vi åpne et vindu som ikke automatisk er åpent, nemlig konsollen til XCode. Du KAN kjøre programmet uten, men da ser du ikke hva som skjer.
Trykk RUN på menylinja, og velg Console
761359
Ok, da dukker dette vinduet opp:
761360
Trykk "Build and Run", og legg merke til at to ting skjer, teksten som var rød, ble nå svart, og en haug med tekst kom opp i vinduet vårt.
761361
Vi ser bort fra all den ikke-fete teksten her, og oppdager at jaggu, "Hello, World!" står skrevet i vinduet vårt, mon tro hvordan vi kan få programmet til å skrive noe annet?
761362
Som du kanskje gjettet, kommer "Hello, World!" fra linja som starter med printf, \n-en i teksten er en måte å be om "newline" på, altså enter. Vi bytter om på teksten til "Hello, Mac1\n", og kjører:
761363

Gratulerer, vi har nå kjørt "vårt" første program i XCode, det er mye annet morsomt vi kan gjøre med dette programmet, men det får vente til neste del av guiden.

Så, hva har vi klart i denne omgang? Vi har alle verktøyene vi trenger for å lage nesten et hvilket som helst program, og vi har kjørt et enkelt ferdigspikret program skrevet i programmeringsspråket C. Hvorfor har vi kjørt et program i C, når Apple bruker Objective-C spør du kanskje? Vel, Objective-C er en utvidelse av C, all C-kode er gyldig Objective-C-kode, så det er et greit sted å starte, uten å komplisere alt. Neste gang skal vi ta en liten kikk på Interface Builder, og helt enkle GUI-programmer, men jeg anbefaler alle som er interessert i å lære mer, å kikke på noen grunnleggende C-, eller Objective-C innføringsguider rundt om på nettet frem til da.

For de ivrige: lyninnføring i enkel C
Det blir kanskje litt brått å slutte der, så en liten forsmak på C-koding er helt klart på sin plass, jeg kommer til å hoppe over en del detaljer i de neste avsnittene, da vi skal tilbake til C-koding i en senere Del av guiden. Men altså:

Først av alt, hvis du vil forsøke deg på noe, er det bare å renske vekk linja med "printf" fra koden, og skrive din egen kode der, "return"-linja må få bli stående enn så lenge. Skulle noe gå virkelig skeis, så er det bare å renske fila tilbake til slik du ser på bildene over, eller evnt bare å starte et nytt prosjekt.

Så til saken, vi har allerede sett at "printf()" har noe med å skrive ting ut til Konsollen å gjøre, søsterfunksjonen heter "scanf()", begge disse er såkalte "funksjoner", som tar noen "argumenter", og gjør noe med dem. Argumentet, er det som står mellom (), i det første eksempelet var dette "Hello World\n", og da sa jeg at \n var en magisk sak som ga deg ny linje, vel, la oss introdusere en litt mer tricky sak, nemlig "%d".

printf("%d \n",42);

Skriver ut 42, men hvorfor skrev vi ikke bare 42?, vel prøv følgende:

printf("%d \n", 42+1);

Nåh? Fancy. Men for å komme til det virkelig artige, så må vi introdusere noe som heter variabler. Vi har ikke engang lært hva variabler er ennå, ei heller funksjoner, men en lyninnføring er på sin plass. En variabel er en "merkelapp" for en verdi, tenk på den som en bås som kan holde en verdi. Vi hopper over detaljene og holder oss til det enkle:

int x = 42;

Da kan X brukes istedenfor 42 overalt ellers i programmet ditt, men, som en liten tankevekker, kan du også skrive x = x + 1, dette bryter litt med algebratankegangen fra skolen, men det betyr: "X skal nå være det X var + 1", altså 43. Så, hvordan kan vi bruke dette til noe?

Vel, se på følgende kodebit:

int x = 42;
printf("%d",x);

Den skriver også ut 42, hmmm, men hva om vi vil sette x til noe brukeren selv skriver inn da? Vel, her kommer scanf inn i bildet.

int x=0;
printf("Skriv et tall:");
scanf("%d",&x);
printf("Du skrev %d\n",x);

Legg merke til &-tegnet, scanf må ha dem, printf må ikke, men, kule ting man kan gjøre med printf/scanf stopper ikke der, prøv å bytte den siste linja der med:
printf("Du skrev %d, det dobbelte av det, er :%d\n",x,x*2);

Og, for å gi dere en liten ekstra godbit å leke med: if, if fungerer slik at den sjekker et utsagn, hvis det stemmer, så gjøres det som står mellom de påfølgende krøllparentesene, i motsatt fall skjer enten ingenting, eller man kan skrive en else-blokk under.

int x=42;
if(x==42)
{
    printf("42 er kult");
}
else
{
    printf("Ikke 42? Det er ikke artig.");

}
If krever doble likhetstegn for likhet, og kan også sjekke større og mindre, både med og uten lik >,<,<=,>=, samt ulik: !=. Helt på tampen, kan jeg nevne while, som vil repetere det som står mellom krøllparentesene, så lenge uttrykket er sant, men som ellers skrives på samme måte som if (dog har den ingen else) Min utfordring til dere, er da:

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.

Det var all C-innføringen for denne gang, håper det ikke gikk ALT for fort frem, vi kommer sterkere tilbake i en senere Del av guiden, til da kan jeg virkelig anbefale HowStuffWorks-guiden jeg har linket til for å få litt mer taket på C.

Videre lesning:
CProgramming.com Intro to C
HowStuffWorks - C Programming
En rimelig kortfattet Objective-C Tutorial
En litt lengre Objective-C Tutorial
Allikevel anbefaler jeg de som er interessert, å skaffe seg en god C/Objective-C bok.

Og, forøvrig, feedback og tips mottas med glede, er det noe som er uklart i guiden, si ifra, så skal jeg prøve å få det fikset, går jeg for fort frem, eller alt for sakte, er det også greit å få vite.

OPPDATERT
Lyninnføring i C lagt til.

Del 2 er nå ute

nubbizs bilde

nubbiz

Fantastisk initiativ. En litt bedre forklaring på koden gjør hadde kanskje vært et lite tips?
Kan det selv, men for helt ferske nybegynnere så hadde det kanskje hjulpet.

ArmaToGedons bilde

ArmaToGedon

Enig. Utrolig bra initiativ. Kan ikke vente på del 2.

theC

Veldig bra!!

chelloo

@Einarj
Akkurat dette jeg letet etter! Nå har jeg noe å kose meg med i helgen:)

Randy

You made my day.. nesten..

Jeg synes du burde fortsatt med del 1 et lite stykke til. Du bør alltid avslutte slike deler med noe vi kan øve på til neste gang. Når en har skriftet teksten etter "printf" et par ganger er det ikke mye mer å gjøre. Du har linket til relevant lesning, og kudos for det, men personlig ble jeg glad da jeg så denne guiden på norsk, i et fora jeg kjenner godt. Hadde du tatt med en liten innføring i enkle funksjoner f.eks, kunne vi prøvd og feilet med det helt til del 2 kom ut.. :)

Firestones bilde

Firestone

Å fantastisk! Altfor lite stoff av denne typen!

EinarJ

Randy: Ahh, selvfølgelig, skal se om jeg får til et lite addendum i løpet av dagen, Del 1 var egentlig mest tenkt som en "sjekke interessen"-sak, for å avgjøre hvor lista skal legges, og evt, hvor mange Del-er jeg orker å lage. Jeg har ikke laget føljetong i dette formatet før, så det slår meg helt klart at jeg burde ha gitt publikum noe å leke med til neste Del er klar.

ggt667s bilde

ggt667

Hva med å porte open source prosjektet fra hva det nå enn er nå til Cocoa Document based?

svn co https://pencil-planner.svn.sourceforge.net/svnroot/pencil-planner pencil-planner

For kommandolinjeverktøy anbefaler jeg å ta utgangspunkt i kildekoden til ls fra gnu file utils. Den har en fin tilnærming til case/switch for parametere som samtidig er en fin kommandointerpreter.

AreBs bilde

AreB

Bra tiltak!

Hva med om Mac1, laget en egen fane som heter "Tutorial" så kan man der ha et mer blogg-lignende oppsett på den delen av siden.

Eksempel på en slik blogg er: [url=http://www.blog.spoongraphics.co.uk/tutorials/how-to-design-a-print-ready-letterhead-comp-slip">blog.spoongraphics.co.uk

Men igjen, dette liker jeg:)

chorion

Hjertelig takk for dette, ser fram til fortsettelsen. Kommer du til å dekke iOS-programmering også, og hvordan dette skiller seg fra MacOS-programmering?

KriSkjs bilde

KriSkj

Superbra insj !
Nå skal jeg som newbie leke meg!

EinarJ

Der, har jeg lagt til en liten smak på C-kode, sånn siden det kan ta mer enn noen dager før neste avsnitt i serien kommer ut.

@chorion: iOS? Tja, kanskje, jeg tenkte å gå litt inn i Obj-C/Interface Builder fremover, så avstanden mellom de to platformene vil vel ikke gjøre seg gjeldende med det første. Vi får se når den tid kommer, aldri si aldri.

Pacmacs bilde

Pacmac

Veldig bra guide - ser frem til del 2!

Jeg kan anbefale en bok som heter "Learning C on the Mac". Dette er en helt basic bok som går ut ifra at den som leser den ikke har vært borti programmering tidligere.

mordor

Takk!! Skal prøve dette når jeg får tid. Har alltid hatt lyst til å lære litt om programmering på mac.

Kjøtt

"knallidè". På Mac får en "é" ved å trykke alt+e :)

ddybings bilde

ddybing

Kjempebra innlegg! Dette må jeg teste ut

pedern

Da ligger xcode og godgjør seg i nedlastinger

eeerlend

Topp initiativ! Mer av dette:)

nwinger

Fantastisk initiativ!

Det kryr med poster i forumet om emner som dette, og jeg skal ærlig innrømme at jeg er en av forfatterene.
Jeg går ut ifra at jeg snakker for fler enn meg selv når jeg sier at det veldig fint å få dette samlet i en guide, slik at man selv slipper å vurdere hvilke kilder / bøker som er best å begynne med. (Det er fryktelig mye anbefalinger og vurderinger av ulike bøker og kilder i de ulike postene - nesten overveldene for en nybegynner vil jeg tørre å påstå.)

Håper min post kan bidra til å dra dette prosjektet videre! Jeg, for min egen del, setter veldig stor pris på initiativtakere som deg!

NW

tandbergs bilde

tandberg

Toppers insj! og enda bedre vurdering ;)
Takk for fin guide.

Lurte bare på en ting: hva gjør %d ?
Hvorfor kan man ikke bruke en variabel uten å ha med det i printf() ?

whildonen

Er dette begynnelsen på boka jeg har lett etter lenge - Programmering for absolutt, komplette tosker som ikke har noen peiling på koding i det hele tatt? Jeg håper det:) Hvis du samler sammen alt til slutt og bearbeider det og gir det ut som en bok, så har du i alle fall én kjøper! Jeg følger med med spenning...

c-norris

Lurte bare på en ting: hva gjør %d ?

%d er "kode" for at du setter inn en int variabel i utskriften. I C skriver du hvordan du vil utskriften skal se ut med slike koder innsatt der du vil ha variablene (%d for int, %c for char, %s for string osv..), og så ramser du opp de variablene du bruker etterpå.
Eks:

int tall = 10;
char bokstav = 'a';

printf("Tallet er %d og bokstaven er %c.\n", tall, bokstav);

Utskriften blir da:
Tallet er 10 og bokstaven er a.

Randy

Jeg har laget programmet som beskrives i "utfordringen" over, men jeg har et spørsmål. Hvordan kjører jeg hele main() funksjonen på nytt, slik at den som prøver å finne riktig tall får flere forsøk? Her er koden min:

int x=0;
int y=4;
printf("Jeg tenker på et tall mellom 0 og 10, gjett hvilket:\n");
scanf("%d",&x);

if (x==y)
{
printf("Gratulerer, det var helt riktig!\n");
}
else
{
if (x<4)
{
printf("Beklager, det var ikke riktig, du må nok litt opp..\n");
}
else
{
printf("Beklager, det var ikke riktig, du må nok litt ned..\n");
}
}

c-norris

Du kan legge til en while. Dette kan gjøres på flere måter. Du kan lage en som altid er sann og bruker break for å komme seg bort, eller en som slutter når x=y.

int x = 0;
int y = 4;
printf("Tipp tallet...");

//i C er tallet 0 false og alt annet true, dette er derfor en evig løkke:
while (1) {
scanf("%d", &x);
if (x == y) {
printf("Gratulerer, riktig tall!\n");
break;
}
else {
printf("Feil tall, prøv igjen\n");
}
}

På den andre måten jeg nevnte setter du while(x != y) og teksten om at koden er riktig setter du da etter while-løkka.

t.nilsens bilde

t.nilsen

Allerede de siste postene her satte meg ut, men nå har jeg ikke prøvd dette i xcode enda.. Har lekt meg sånn smått med det tidligere, og ser virkelig frem til å få prøvd ut dette med en skikkelig guide! Supert av deg å lage en slik guide, all kudos!
Håper du har orket til å fortsette med disse, det blir tatt varmt imot av oss ulærte som ønsker å lære litt og litt. (helst med t-skje...) ;)

iAndrews bilde

iAndrew

Supert initiativ! Foreløpig er dette kjent stoff for meg, men ser frem til å følge guiden videre.

Apple xxxs bilde

Apple xxx

Endelig en grei og oversiktlig bruksanvisning. Takk skal du ha.
Aplikasjoner jeg har laget: http://dl.dropbox.com/u/5916520/Programpakke.pkg
Apple xxx

ZenicStriker

Er godt kjent med dette, men håper det kommer flere deler :-), dette så veldig lovende ut.

Simon25s bilde

Simon25

Hvoran får jeg det gratis?

EDIT: jeg har funnet det men det står: Download Xcode men ikke noe sted å lante ned... kan noen hjelpe meg?

Lukass bilde

Lukas

Supre saker, gøy å prøve. Minner meg om da jeg satt med håndboka til Commodore 64 og tasta inn Basic-linjer, så skjedde det ting!
10 print meaning of life is 42
20 goto 10
run

EinarJ

@simon25, klikk linken, registrer deg med den blå knappen, og last ned? Du trenger ikke å betale noe som helst, med mindre du vil ha tilgang til å legge ut Apps på iOS/Mac AppStore.

ggt667s bilde

ggt667

Supre saker, gøy å prøve. Minner meg om da jeg satt med håndboka til Commodore 64 og tasta inn Basic-linjer, så skjedde det ting!
10 print meaning of life is 42
20 goto 10
run
Du glemte å trykk RUN/STOP

Amishen

Jippi... perfekt nybegynner guide. Akkurat det jeg lette etter for kunne komme meg over terskelen på en grei måte. Håper denne måten å forklare de ulike tingene (variabler/funksjoner) fortsetter. Det er litt greit, og det gir en kjapp innføring/forståelse.

Lukass bilde

Lukas

Supre saker, gøy å prøve. Minner meg om da jeg satt med håndboka til Commodore 64 og tasta inn Basic-linjer, så skjedde det ting!
10 print meaning of life is 42
20 goto 10
run
Du glemte å trykk RUN/STOP

Var det sånn det var? Lenge siden nå, men jeg kan ikke huske å ha brukt den tasten, syntes bare at den var snodig. Jeg skrev RUN og trykte RETURN. Tror jeg. Vet ikke om jeg gidder å hente den ned fra loftet for å sjekke :-)

Onizuka89

Super artikkel! :D
men tror du at du kunne bruke indents i framtidige deler?
De vanene man får når man begynner å programmere er de man sitter igjen med til slutt, og uten indents så kan kode se rotete ut når det blir litt større.
forresten så er det en " for mye i "printf("%d" \n", 42+1);" delen

gomle69s bilde

gomle69

Dette er bare gull :).

lantos bilde

lanto

Tror jeg fikk til utfordringsoppgaven! Nå har jeg tenkt til å prøve den men hva må gjøre nå???

Jan Fredriks bilde

Jan Fredrik

Her er det noe veldig galt:

Skriv et tall:2139913991239
Det var nok litt for mye. Prøv igjen: 12300231001200312
Det var nok litt for lite. Prøv igjen: 01230230
Det var nok litt for mye. Prøv igjen: 12
Det var nok litt for lite. Prøv igjen: 1994
Helt korrekt!
Debugger stopped.
Program exited with status value:0.

Jan Fredriks bilde

Jan Fredrik

Utrolig keen på å få satt kodesnutten min inn i et UI. Noen som vet om en fin guide for å gjøre det?

Vet at vi skal lære om Interface Builder neste gang, men klarer ikke vente!

magnar

Veldig bra dette :-)

Jeg har nå endelig blitt litt glad i data igjen etter jeg oppdaget Mac og iPhone, så ikke utenkelig at jeg faktisk kan tenke meg å bryte min 20-25 år gamle programmeringssperre for å komme i gang med dette.

Kan du også ta opp litt mixen mellom iPhone og webside...? Denne er spesielt interessant. Dvs hybrid-portaler med både webside, telefonapp og feeding mot diverse andre systemer. Database mot websider og App blir det vel.

Gjerne foreslå gode bøker eller kurs/studier her i Norge også om du vet om noen som driver med dette nå.

Simon25s bilde

Simon25

Når jeg innstallerer x code får jeg feilmelding, hva kan det være?

ddybings bilde

ddybing

må du snart komme med en Del 2 da, Einar :P

c-norris

Gjerne foreslå gode bøker eller kurs/studier her i Norge også om du vet om noen som driver med dette nå.

UiOs innføringsemne i C heter INF1060. Vet ikke om de har andre emner der det undervises i Obj-C. INF1060 baserer seg nok litt på at du kan noe om programmering fra før (typisk litt Java siden "alle" lærer det første semester), men samtidig er utganskpunktet at du ikke kan noe som helst om C. Forelesningsslides ligger her: http://www.ifi.uio.no/~inf1060/Forelesninger10/ Det er ikke så mange av disse som forklarer kode, men de tre første er en kjapp innføring. Ellers kan man sikkert snike seg inn på forelesning når kurset starter neste høst (..men da er nok alle dere som følger denne guiden langt forbi det nivået :) ).

magnar

Gjerne foreslå gode bøker eller kurs/studier her i Norge også om du vet om noen som driver med dette nå.

UiOs innføringsemne i C heter INF1060. Vet ikke om de har andre emner der det undervises i Obj-C. INF1060 baserer seg nok litt på at du kan noe om programmering fra før (typisk litt Java siden "alle" lærer det første semester), men samtidig er utganskpunktet at du ikke kan noe som helst om C. Forelesningsslides ligger her: http://www.ifi.uio.no/~inf1060/Forelesninger10/ Det er ikke så mange av disse som forklarer kode, men de tre første er en kjapp innføring. Ellers kan man sikkert snike seg inn på forelesning når kurset starter neste høst (..men da er nok alle dere som følger denne guiden langt forbi det nivået :) ).

Ok, glitrende....... :-) Takker for tips.

Da har jeg sendt rundt litt mailer til både UIB her i Bergen og NITH i Oslo for undersøke videre om dette...

Er det evt. andre skoler og kursholdere som har opplæring i C/Obj. C og evt. dedikert mot OSX og iPhone...? Burde jo være marked for det...

lantos bilde

lanto

RE: Simen25

Det kan være at du ikke har Snow Leopard på macen din. Hvis du ikke har det kan du kjøpe det fra eplehuset eller humac. Koster kun 269,-

EinarJ

Jan Fredrik: Tallet du dytter inn er for stort. int er 32 bit, og dermed maksimalt litt over 4 milliarder stort. Halvparten forsåvidt, siden det også skal settes av plass til negative tall.

Simon25: Har du Snow Leopard? I motsatt fall må du finne XCode 3.1 hos Apple, 3.2 KREVER Snow Leopard.

Powermac G4: Tja, litt tidlig å lansere den HELT ennå.

Onizuka89: Ja, jeg prøvde egentlig å få det til, men surra til formateringen tydeligvis.

ggt667s bilde

ggt667

Var det sånn det var? Lenge siden nå, men jeg kan ikke huske å ha brukt den tasten, syntes bare at den var snodig. Jeg skrev RUN og trykte RETURN. Tror jeg. Vet ikke om jeg gidder å hente den ned fra loftet for å sjekke :-)Men når det står goto 10, så må man trykke RUN/STOP for å komme ut av den uendelige loopen.

EinarJ

Men, er det noen spesielle ønsker til Del 2, eller evt senere deler? Evt noe som var uklart i del 1, som jeg bør forklare nøyere?

Jeg har en overordnet plan for hele guiden, men har ennå ikke helt spikret rekkefølgen.

Slik det står nå, blir Del 2 en kort innføring i helt grunnleggende IB-bruk, og helt grunnleggende Obj-C syntaks (som nok kommer til å ta brorparten av spalteplassen), før vi tar turen tilbake til C, for å kikke litt nøyere på ting det kan være kjekt å ha med seg inn i Obj-C. Avhengig av spalteplass, ender kanskje noe av dette opp i Del 3.

Del 3, har jeg intill videre tenkt som en ren "lær mer kode"-del, for å få inn de viktigste byggesteinene i bunn, samt at jeg trenger å bruke litt tid på å forklare en del konsepter litt nøye før vi går videre.

Del 4-> er litt opp til folket, hvor interessen ligger, hva folk er interessert i å lage, men jeg tenker vi jobber litt eksempelorientert derifra, og lager noen enkle programmer, introduserer litt sider ved Cocoa, og plukker opp litt Obj-C langs veien.

ggt667s bilde

ggt667

Sammenhengen mellom XCode, debugger og linker, samt casting.

lantos bilde

lanto

kan du ikke lære oss å lage "actions" i løpe av perioden? Kanskje også litt i interface IOS?

EinarJ

Neste del, vil nødvendigvis måtte gå litt mer inn i C-koding før vi hopper over på IB og Obj-C, rett og slett fordi man trenger å forstå noen konsepter som er felles for begge programmeringsspråk, før man kan få noe særlig ut av Obj-C og IB. Siden jeg ennå ikke har fått satt av tid til å filme og ta screenshots til del 2, så poster jeg en "liten" smakebit på de grunnleggende C-tingene vi kommer til å gå gjennom i neste del nå, med forbehold om at disse blir revidert før Del 2 kommer.

Og ja, Del 2 blir ca dobbelt så lang som det jeg har skrevet her, hvor vi da først skal lage et helt enkelt GUI-program i IB, og demonstrere dette, noe som vil gi masse bilder, og forhåpentligvis noe videodemonstrasjon.

Men siden teoribiten er litt tyngre å fordøye, poster jeg utkastet mitt i tråden her, så dere kan få litt tid til å fordøye det til dere trenger det, og jeg da kanskje kan få noe feedback på uklarheter før den offisielle versjonen blir postet. Det KAN også hende at noe materiale herifra blir forskjøvet til Del 3.

prøvesmak på Del 2:

Mer C

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 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.

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 slikt ut (datatype) variabel.
Eksempel:

int x=5;
int y=2;
int testint = x/y;
printf("%d/%d=%d\n",x,y,testint);
float testflyt = x/y;
printf("%d/%d=%f\n",x,y,testflyt);
float testcast = (float)x/(float)y;
printf("%d/%d=%f\n",x,y,testcast);

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 en 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.

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:

void skrivTall(int x)
{
printf("Tallet er %d\n",x);
}

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:

int rektangelAreal(int hoyde, int bredde)
{
return hoyde * bredde;
}

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).

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:

{
int x = 2
if(x==2)
{
// X finnes her.
}
// X finnes fortsatt her.
} // X forsvinner her.

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.

int x=2;
int y=3;
if(x==y)
{
printf("De er like: X:%d Y:%d\n",x,y);
}
printf("X:%d Y:%d\n",x,y);
if(x=y)
{
printf("De er like: X:%d Y:%d\n",x,y);
}
printf("X:%d Y:%d\n",x,y);

Løkker
Jeg fortalte om while i del 1, som er en helt enkel løkke-variant av if, det jeg ikke fortalte om, var do-while, og for.

While, vil alltid sjekke om betingelsen er sann før den gjør noe som helst, med andre ord gjør den "sjekk, så kjør", do-while, er en variant som gjør det motsatte, den vil alltid kjøre en gang, og sjekke etterpå, denne skrives på formen

do
{
// something
}while(betingelse);

Til slutt har vi for-løkker, som er beregnet på å kjøres n-antall ganger, disse har en litt spesiell start:

int i;
for(i=0;i<10;i++)
{
printf("I=%d",i);
}

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:

int i;
for(int i=0;i<25;i++)
{
printf("Tall: %d Rest ved 5-deling: %d\n",i,i%5);
}

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 }

{
{
{
}
}
}

Der, da kan vi det mest grunnleggende i C, og har de fleste byggeklossene vi trenger for å lære oss det vi er ute etter, nemlig Objective-C.

ggt667s bilde

ggt667

For XML dokumenter kan man bruke [code]tidy -xml - i /tmp/dokument.xml > /tmp/dokuementMedTab.xml[/code] for å rydde opp i identer, finnes noe tilsvarende til C?

EinarJ

Jada, selv for de av oss som ikke bruker IDE, cb - C Beautifier, gjør susen, den gjør faktisk ganske mye pyntearbeid hvis du lar den kjøre med defaults.

I XCode er det IIRC bare å merke all koden, ctrl-klikke og velge correct indentation.

Del 2 er forøvrig på trappene nå, den skulle egentlig ut i dag, men jeg surret meg ikke til å gjøre den ferdig, så jeg satser på en lansering i morgen. (Eksamenstid er travel tid).

EinarJ

Del 2 er ute.

Simon25s bilde

Simon25

EinarJ: Takk!

Henrik989

Vet noen hvorfor xcode ikke vil lastes ned fra devcenter?
Har prøvd 100 ganger nå. Den stopper bare..

EinarJ

Tja, det hjelper iallefall ikke mer å poste i begge trådene. Går de andre nedlastingene der greit? Eller er det kanskje bare Apple som har server-problemer?

Henrik989

kun den..

KoC

Noen som vet hvor man finner Xcode for Leopard? Kun for Snow Leopard som kan lastes ned fra iOS Dev Center.

EinarJ

connect.apple.com sist jeg hadde behov for 3.1 iallefall.

KoC

Genialt! Takk :-D

EinarJ

Da er del 3 ute, med svar på oppgaven fra denne delen.

Ovit82

Nå røsker jeg opp en gammel tråd her, men jeg fikk ny mac nettopp og da var det på tide å lære seg å kode noe enkelt noe :)

Men jeg tror jeg brukte minst en time på siste oppgaven! Om jeg forstår hva jeg gjorde så var feilen at jeg hadde med int X=0 i while formelen og det stoppet den fra å kjøre riktig :)

EinarJ

Vanskelig å svare på uten å se koden din.

Ovit82

#include <stdio.h>

int main(int argc, const char * argv[])
{

// insert code here...
int X=0;
printf("number:");
scanf("%d",&X);
while (X!=42) {
if (X<42) {
printf("higher\n");
}
else {
printf("lower\n");
}
printf("number:");
scanf("%d",&X);
}
printf("42is cool");
return 0;
}

Sier seg selv at jeg ble lei av å skrive lange spørsmål og gikk for korte statements til slutt :)

ggt667s bilde

ggt667

Sier seg selv at jeg ble lei av å skrive lange spørsmål og gikk for korte statements til slutt :)[url=ftp://ftp.idsoftware.com/idstuff/doom3/source/CodeStyleConventions.doc">doom3ified:#include <stdio.h>

int main( int argc, const char * argv[] ) {
int x = 0;
printf( "number:" );
scanf( "%d", &x );
while( X != 42 ) {
if( X < 42 ) {
printf( "higher\n" );
} else {
printf( "lower\n" );
}
printf( "number:" );
scanf( "%d", &x );
}
printf( "42is cool" );
return 0;
}

EinarJ

Det siste eksempelet til ggt667 er feil, primært fordi X og x blandes.

Ellers ser jeg ingenting som er feil med den originale koden, med mindre du hadde int x = 0; helt på slutten av while-løkka.

ggt667s bilde

ggt667

Det mangler også "\n" på slutten av den ene printf(), men det er ikke poenget med doomified code.

  • Skriv ut artikkel
  • Abonner med RSS

Alt om iPad, iPhone og iOS

Nettradio i iTunes

Nettradio i iTunes
130 norske radiokanaler.
Få de mest populære norske, svenske og danske radiokanalene inn i en egen spilleliste i iTunes.
Oppdatert 13. mai