Visual Studio 2013: Skapa ett enkelt C-program

Vi ska skapa ett enkelt C-program som körs i ett textfönster och som inte använder sig av Windows grafiska gränssnitt. Allt detta är provkört i Windows 7. Inga garantier lämnas för Windows 8.

Om man ska skriva ett portabelt C-program, alltså ett som också kan kan kompileras och sen köras på en dator med till exempel Mac OS X eller Linux, måste man hålla sig till in- och utmatning av text. De grafiska gränssnitten, och hur man arbetar med fönster och knappar och liknande, är helt olika på de olika systemen. Grundspråket C, alltså det som specificeras av C-standarden, innehåller inga grafiska funktioner.

C-dialekten i Visual Studio 2013 är äntligen uppdaterad så att man kan använda en del av finesserna från C99-standarden! Bland annat kan man numera blanda deklarationer och körbara satser, och man kan deklarera en loopvariabel direkt i for-loopen. Det tog bara 14 år!

Bild 1: Starta Visual Studio

I Windows 7 startar man Visual Studio från startmenyn som vanligt. I Windows 8 finns det säkert någon fyrkantig ruta som man kan klicka på. Visual Studio 2013 fungerar naturligtvis även i Windows 8, men allt det här är provkört i Windows 7.

Visual Studio i Start-menyn

Bild 2: Visual Studio-fönstret

När Visual Studio 2013 startat ser det ut så här:

Visual Studio-fönstret

Bild 3: Skapa ett nytt projekt

Det som en del andra kanske skulle kalla för ett "program" eller en "mjukvara", kallar Visual Studio för "projekt". Vi skapar ett nytt projekt genom att klicka File -> New -> Project:

Menyval i Visual Studio-fönstret

Bild 4: Nytt projekt-fönstret

Nu får vi välja vilken sorts projekt vi ska skapa. Vi ska skapa ett projekt med språket Visual C++ (ja, välj C++ där, trots att det är C vi ska använda), och det ska vara av typen Win32 Console Application. Man måste ge projektet ett namn också.

Nytt projekt-fönstret

Varje projekt får en egen katalog på disken. När man skapar ett projekt kan man ange var projektets katalog ska placeras.

Om man arbetar hemma kan man lägga den var man vill, men i universitetets datorsalar har vi inte samma frihet. Där är din hemkatalog monterad som enheten M:, och det är där du ska lägga ditt projekt. Inte på den lokala disken på datorn (C:). Information som sparas på C: finns kanske inte kvar nästa dag, och man kommer inte åt den från andra datorer.

(Är hemkatalogen fortfarande monterad som M:? Det var så förra året i alla fall!)

Skapa en katalog för alla program, till exempel kallad M:\PCSA\Program, och placera alla projekt där.

Ett tips:
Erfarenheten lär oss att även om det ska fungera med mellanslag och ÅÄÖ i olika namn på datorer, så är det tyvärr inte alltid det verkligen gör det. Plötsligt får man något konstigt fel som efter flera timmars letande visar sig bero på att man hade ett svenskt tecken eller ett mellanslag i ett filnamn. Så det kan vara en god idé att undvika svenska tecken och mellanslag, åtminstone i namn som slutanvändarna inte ser. (Och allra helst borde det kanske vara på engelska?) Därför är just Hej världen! kanske inte ett så bra namn på projektet.

Bild 5: Guiden med inställningar för programmet

Nu kommer det upp ett fönster där man kan styra projektets inställningar lite mer i detalj. Vänsterklicka på Application Settings till vänster.

Guiden med inställningar för programmet

Bild 6: Ändra till ett alldeles tomt projekt

Om man inte säger något annat, kommer Visual Studio att lägga in lite C-kod med Windows-specifika saker, men vi vill börja med ett helt tomt projekt, utan några källkodsfiler. Sätt kryss i rutan Empty project.

Alternativt kan man skapa ett tomt projekt redan från början.

Fönstret med inställningar för programmet

Bild 7: Projektet i Visual Studio-fönstret

Nu kan vi börja jobba med vårt nya projekt:

Visual Studio-fönstret

Bild 8: Lägg till en ny källkodsfil

Vi behöver en fil att skriva C-programmet i, så vi högerklickar på Source Files i Solution Explorer och väljer sen Add -> New Item:

Menyval i Visual Studio-fönstret

Alternativt kan man gå via Project -> Add New Item.

Bild 9: Det ska vara en C-fil, inte en C++-fil

Nu får vi välja vilken sorts sak vi ska lägga till i projekt, och eftersom vi vill ha en fil med källkod skriven i C väljer vi Code längst till vänster, och sen C++ File (.cpp).

Nu valde vi alltså C++, trots att det egentligen är C vi ska använda, men det ordnar sig i och med att vi ger filen ett namn som slutar på .c och inte på .cpp.

Kom ihåg: filen ska heta nånting.c, inte nånting.cpp!

Sakskapardialogen

Bild 10: Skriv in ett enkelt program

Nu dyker det upp en redigeringsruta i Visual Studio-fönstret, och vi skriver in ett kort C-program där:

Redigeringsrutan i Visual Studio-fönstret

Bild 11: Bygg ihop programmet så det går att köra

C-programmet vi skrivit in finns än så länge bara i form av källkod, och den kan inte köras av datorn. Därför måste programmet kompileras och länkas, eller "byggas". Det gör vi genom att klicka Build -> Build Solution, alternativt genom att trycka genvägen Ctrl+Shift+B på tangentbordet. Genvägarna kan bli olika i olika installationer, till exempel F7 för att bygga projektet.

Menyval i Visual Studio-fönstret

Bild 12: Starta programmet

Sen startar vi programmet genom att klicka Debug -> Start Debugging, alternativt genom att trycka på F5.

Menyval i Visual Studio-fönstret

Man kan som synes också köra utan debuggern (Start Without Debugging), men medan vi skriver programmet är det ofta praktiskt att jobba i debuggern.

Bild 13: Eller bara starta programmet

Om man startar programmet utan att ha byggt det först, får man en fråga om man vill bygga det.

Projektet är inaktuellt

Bild 14: Va? Inget hände?

Vi startar programmet, men det ser inte ut som att något händer. Kanske hinner vi se ett fönster dyka upp på skärmen, och sen försvinna direkt.

Det beror på att utmatningen från programmet, dvs texten Hej, världen!, skrivs ut i ett textfönster, men sen är ju programmet slut, och eftersom programmet avslutats så stängs fönstret.

Om man startar programmet med Start Without Debugging i stället för Start Debugging kommer Visual Studio automatiskt att skriva Press any key to continue . . . och vänta på att man trycker en tangent innan fönstret stängs.

Alternativt kan vi modifiera programmet så det inte avslutas direkt efter utskriften. Man kan göra på flera sätt, och ett vanligt sätt är att man anropar den Windows-specifika funktionen _getch, men här är ett som följer C-standarden, vilket betyder att programmet går att kompilera och köra även på till exempel Linux:

Visual Studio-fönstret

Bild 15: Programmet körs

Nu fungerar det bättre. Det är inte förrän vi trycker på ENTER-tangenten som programmet avslutas och fönstret försvinner. Men de svenska tecknen blev visst konstiga?

Textfönstret med programkörningen

"Bild" 16: Rätta de svenska tecknen

Att de svenska tecknen blev konstiga beror på att Windows använder olika teckenkoder i det grafiska gränssnittet och i textfönster. Det har att göra med bakåtkompatibilitet med gamla system, och är kanske inte så viktigt, men vi kan åtgärda det genom att skriva in de särskilda teckenkoderna i C-programmet.

#include <stdio.h>

int main(void) {
    printf("Hej, ");
    printf("v\204rlden!\n");
    printf("Tryck RETUR f\224r att avsluta programmet.\n");
    while (getchar() != '\n')
        ;
    return 0;
}

Koderna: Å = \217 Ä = \216 Ö = \231 å = \206 ä = \204 ö = \224

(Teckenkoderna skrivs med det oktala talsystemet, dvs med basen 8. I det vanliga decimala talsystemet, dvs med basen 10, skrivs exempelvis teckenkoden för Å som 143.)

Notera att det här är något man råkar ut för just med konsolprogram i Visual Studio. Gör man fönsterprogram i Windows, eller jobbar på en Mac eller i Linux, slipper vi problemet.

Bry dig inte om att lära dig koderna utantill inför tentan! På tentan räcker det att bara skriva ÅÄÖ.

Bild 17: Riktiga svenska tecken

Äntligen är allt perfekt!

Textfönstret med programkörningen

Perfekt? Nåja.

Det \204r ju lite besv\204rligt att kr\206ngla med teckenkoder s\206 h\204r.

Jag tycker att man oftast kan strunta i det, och bara skriva åäö som vanligt. Det är ett problem som uppstår just när man utvecklar textbaserade program i Visual Studio. För enkelhets skull är det den kombinationen vi använder i programmeringskursen, men annars är det ganska sällan man jobbar så. I andra sammanhang, som när man utvecklar fönsterprogram i Visual Studio, eller när man programmerar i Linux eller Mac OS X, fungerar tecknen som de ska, utan att man behöver skriva konstiga teckenkoder. Om man står ut med att det blir lite fult i våra övningar, tycker jag att det kan vara bättre att koncentrera sig på andra saker än på att sitta och skriva \206\204\224.

"Bild" 18: Ändra code page

Om man vill att ÅÄÖ ska bli rätt, utan krånglet med \217\216\231, kan ett bättre sätt vara att använda funktionerna SetConsoleOutputCP och SetConsoleCP för att byta teckenuppsättning ("code page", som det kallas i Windows):

#include <stdio.h>
#include <windows.h>

int main(void) {
    SetConsoleOutputCP(1252);
    SetConsoleCP(1252);
    printf("ÅÄÖ! Och åäö! Räksmörgås!\n");
    printf("En gång till! ÅÄÖ! Och åäö! Räksmörgås!\n");
    printf("På krångliska: å = \206, ä = \204, ö = \224\n");
    getchar();
    return 0;
}

Bild 19: Byt typsnitt

Det räcker inte att byta till code page 1252. Man måste också ändra typsnitt i teckenfönstret till ett typsnitt som innehåller rätt glyfer. Högerklicka på namnlisten i teckenfönstret och välj Properties (som jag tror heter Egenskaper i svenska versioner av Windows):

Textfönstret med programkörningen

Bild 20: Byt typsnitt

Välj Lucida Console:

Textfönstret med programkörningen

Bild 21: Riktiga svenska tecken

Äntligen är allt perfekt!

Textfönstret med programkörningen

Perfekt? Nåja.

Med det ändrade typsnittet och anropen till SetConsoleOutputCP och SetConsoleCP fungerar svenska tecken i det här projektet i Visual Studio. När man skapar ett nytt projekt måste man ändra typsnittet i textfönstret på nytt.

Om man vill ändra textfönstrets typsnitt permanent (för aktuell användare) i hela systemet måste man ändra i systemregistret. Starta registereditorn (regedit). Under HKEY_CURRENT_USER\Console lägger man till ett nytt "string value" med namnet FaceName och värdet Lucida Console.

(Tack till Nikola Tomic, som rett ut det här.)


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 27 oktober 2014