Permalänk

Lära sig C språket?

1. Hur ska man börja lära sig? Vilken del av språket? Är det t.ex. Bättre att lära sig C# före C? Är det mycket som skiljer? Ska jag gå direkt till C++?

2. Vad kan man programmera med C språket? Bara för att nämna något.

OBS! Jag vet inte vad jag vill programmera men så var det när jag bestämde mig för HTML också, jag gjorde en alldeles egen startsida och det var inget jag planerade att göra utan det kom senare som en spontan idé bara. Så jag antar att jag göra likadant nu men HTML var inget för mig. Och jag saknar inte motivation till 100% då jag blir sugen av att lära mig något språk när jag ser jailbreak tweaks osv (behöver inte vara objective-C specifikt)

Permalänk

Jag tycker du ska prova både C# och C++, de är ganska lika och i C# kommer du snabbt att kunna göra ett program med grafiskt gränssnitt, medan du i C++ lär dig "riktig" programmering, minneshantering osv.

EDIT: C behöver du kunna om du vill kunna läsa gammal kod. Det är en äldre version av C++ som saknar klasser.

Permalänk
Medlem

Om du vill lära dig C så är det bättre att börja med det, före C# och C++, då de sistnämnda språken baseras på C. Även om C++ och C# baseras på C så används de till helt skilda saker och är väldigt olika att programmera i.

Linux-kärnan är till störst del skriven i C. Likaså är den ursprungliga implementationen av Python (CPython) skriven i C. Mikroprocessorer programmeras ofta i C.

Edit: The C Programming Language 2nd Edition är en bra bok, men många skulle nog säga att det är bra att ha en viss förkunskap inom programmering innan man ger sig på den boken.

Permalänk
Medlem

Håller med ovanstående talare. Jag lärde mig C i skolan, då vi programmerade mycket mot Linux kärnan, gjorde moduler osv. Man lärde sig lågnivåprogrammering på ett riktigt bra sätt, sedan har jag lärt mig C++ på egen hand och det är nu mitt huvudspråk. Om jag inte hållt på med C på lågnivå hade jag nog inte varit en lika bra C++ programmerare nu. C++ är ett enoooormt språk, det kan vara väldigt förvirrande och det är lätt att lära sig fel (trotts att du kan skriva fungerande program) om man inte har erfarenhet med C innan.
Mitt tips är att installera Linux på en burk och börja skriva lite småsaker för att lära känna språket lite gran. Efter det kan du skriva en chatclient som går över sockets, det är en mycket bra övning på att hantera minne och buffrar på ett simpelt sätt. Vill du ta det ännu längre innan du börjar med C++ kan du testa kompilera en kärna (det låter otroligt komplicerat, men det är det är jätte enkelt) och skriva en egen modul till kärnan som t.ex kollar interupts från valfri enhet (t.ex ethernet). Visst, det kanske inte är det du vill göra, men du får en riktigt bra grund att stå på, då dessa saker kräver "bra" kod för att fungera.

Visa signatur
Permalänk
Medlem

@Darkboot: C# är väldigt Microsoft bundet vilket C++ inte är. Dock är nog C# lättare att lära sig. Men imho kör C++.

Permalänk
Skrivet av MathNinja:

Jag tycker du ska prova både C# och C++, de är ganska lika och i C# kommer du snabbt att kunna göra ett program med grafiskt gränssnitt, medan du i C++ lär dig "riktig" programmering, minneshantering osv.

EDIT: C behöver du kunna om du vill kunna läsa gammal kod. Det är en äldre version av C++ som saknar klasser.

Är det värt att lära sig C?

Permalänk
Skrivet av Darkboot:

Är det värt att lära sig C?

Alltid värt att lära sig C om du planerar att göra något vettigt med din programmeringskunskap annat än att kunna säga på fester att man kan knacka kod. Men då finns det nog mer imponerande saker att lära sig för att impa på fester.

Folk får gärna säga att min logik suger men jag ser det lite som att C är som Latin och alla andra vettiga språk (d.v.s. Inte brainfuck eller whitespace...) är våra nuvarande använda språk så som Engelska eller Svenska. Det räcker att kunna Engelska för att kunna kommunicera och kunna få fram det budskap man vill. Precis samma i programmering, det räcker att kunna t.ex. Python, C#, Java eller C++ för att kunna skapa vad du vill och få det att fungera som planerat.

Men för att förstå vissa saker som "bara händer" i något av de språken jag just rabblade upp krävs en djupare kunskap, som man endast får genom att ta bort det automatiserade och göra allt själv.

Visa signatur

Citera så hittar jag tillbaka :)

Permalänk

Om du inte programmerat tidigare och den frågan du egentligen ställer är "skall jag börja med C som första språk" skulle jag svara nej. Under mina år på KTH programmerade jag i mer än ett dussin olika programspråk och som jag ser det är det själva metodiken, tänkandet och problemlösandet som är det viktiga att lära sig. Resten är bara syntax, dvs hur skriver jag ett villkor eller en loop i just det här språket. När du väl har lärt dig programmerandets konst är det lätt lära sig ett nytt språk. Lite som att steget till norska inte är så stort om du redan kan svenska.

Skrivet av Darkboot:

Är det värt att lära sig C?

Ibland är C rätt språk (som när du vill skriva kernel-moduler till Linux eller programmera inbyggda system), men oftast finns det språk som är mer lämpade för att lösa just ditt problem. Om du just vill lära dig att språket C skall du givetvis välja C men om du bara vill lära dig programmera finns det språk som ställer till mindre problem för dig. Som förstaspråk skulle jag föreslå Python. Det används i massor av onlinekurser som inte direkt handlar om programmering men där man måste programmera lite för att lösa övningsuppgifterna i kursen. Python är lätt att lära sig, man slipper en massa problem, exempelvis C:s minneshantering som är en STOOOOR felkälla för nybörjaren och det finns massor av python-kurser på nätet.

Lycka till med programmerandet.

Permalänk

@Ingetledigtnamn: så du föreslår att skippa C och istället gå för python -> C# -> C++?

Permalänk
Medlem

C är stort inom inbyggda system, finns nog en hel del jobb med det också.
Nu hajpas ju detta som "IoT", Internet of Things.

Permalänk
Inaktiv

Fråga dig själv, vad vill jag skapa? och välj sedan ett programmeringsspråk för det.

Tänk inte vad kan jag skapa med just C.

Börja programmera med det programmeringsspråk som lämpar sig för det du vill skapa.

Jag kan C++ väl, men jag började med något som hette BlitzBasic 3D, för att jag var intresserad av spelprogrammering och jag visste inte att C++ fanns. I efterhand tror jag att det var bra för mig att inte gå direkt på C++. Det är dock ett språk som förknippas med spelprogrammering, men det kunde ha dödat mitt programmeringsintresse eftersom det är ett så enormt programmeringsspråk.

Permalänk
Medlem

Började min programmering med C# -> Java -> C++ -> C, det var inte först jag "lärde" mig C som jag nu i efterhand kan reflektera över att jag faktiskt förstår programspråk ordentligt, samt efter C så blev det mycket lättare att plocka upp andra språk på kort tid. Hade nog personligen föredragit att börja med C om jag hade stått inför det val du står inför nu med den kunskap jag har idag.

Permalänk
Medlem

Håller inte med tidigare talare ang. att du måste lära dig C före C#. Förr hette det att man skulle lära sig ASM innan man lärde sig C, men det var ju förstås inte heller nödvändigt.

Jag skulle tvärtom vilja påstå att ifall du lärt dig C# så är det avsevärt mycket lättare att lära sig C efteråt. Då har du ju trots allt en uppfattning om hur grunderna i ett programmeringsspråk fungerar, du har fått in tänket, och då behöver det inte alls kännas så övermäktigt när du kommer till pekare och minneshantering t.ex, vilket det lätt kan göra annars när du ska lära dig allt annat samtidigt.

I slutändan spelar det ingen roll vilket språk du väljer, så länge du lär dig att programmera. När du kan ett språk kommer det bli enklare att lära dig fler.

Permalänk
Medlem

Börja med C och lär dig grunderna. Sedan kan du enkelt byta till C++, C#, Pascal, Java. Boken The C programming language (K&R) är en tredjedel så tjock som The C++ programming language (Stroustrup). K&R's bok innehåller en mängd övningar och exempel. Seriös programmering som drivare till Linux, Windows görs i C eftersom C skapar väldigt effektiv kod. Jag har även kört det i embededsystem.
Go for C.

Permalänk
Datavetare

Håller inte med de som försöker påskina att C är "som latin" eller på annat sätt antyder att C inte längre är ett relevant språk. Det är inte speciellt viktigt att kunna C om målet är t.ex. att programmera webfrontends, men datorvärlden i stort är bygd på C och C++.

C används i OS-kärnor, i inbyggdasystem (där det sett över världen finns enormt med programmerare, just Sverige är relativt sett rätt små inom detta område) och väldigt många bibliotek på systemnivå använder C. C++ används i de flesta applikationer som webbläsare, office-program, kompilatorer (var tidigare i C men trenden här är mot C++) etc.

Enligt Tiobe index är C och Java överlägset populärast (de har växlat flera gånger mellan vem som ligger först). IoT nämndes och inom detta område är C väldigt stort, Java och JavaScript är också riktigt stort inom detta område.

Jobb som C-programmerare tenderar också att vara rätt välbetalda, är nog en kombination av att C-programmerare är äldre än genomsnittet men också att system/OS-programmering är bland det mest komplicerade man kan företa sig som programmerare (spelprogrammering, som typiskt är C++, ligger också i denna grupp).

Finns alltså massor med anledningar att lära sig C.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Darkboot:

1. Hur ska man börja lära sig? Vilken del av språket? Är det t.ex. Bättre att lära sig C# före C? Är det mycket som skiljer? Ska jag gå direkt till C++?

2. Vad kan man programmera med C språket? Bara för att nämna något.

OBS! Jag vet inte vad jag vill programmera men så var det när jag bestämde mig för HTML också, jag gjorde en alldeles egen startsida och det var inget jag planerade att göra utan det kom senare som en spontan idé bara. Så jag antar att jag göra likadant nu men HTML var inget för mig. Och jag saknar inte motivation till 100% då jag blir sugen av att lära mig något språk när jag ser jailbreak tweaks osv (behöver inte vara objective-C specifikt)

Jag skulle vilja råda att välja något du tycker verkar spännande och inte ultrasvårt att göra, och satsa sedan på det språk där detta verkar enklast att göra. Intresset och motivationen kan uppväga för mycket. Bortsett från det så tycker jag att Python är ett toppenspråk att börja med. Det är inte ens säkert att du kommer känna för att lära dig minneshantering etc i c/c++. Visst är det bra kunskap men det är inte alltid man vill greja med allt man "borde". Flera populära språk idag har automatisk minnesstädning (garbage collector) och det kan ju hända att du satsar på något sådant (python, java, c#, go(lang)).

Visa signatur

/M

Permalänk
Skrivet av Darkboot:

@Ingetledigtnamn: så du föreslår att skippa C och istället gå för python -> C# -> C++?

Jag tycker inte du skall vara så fokuserad på vilket språk du skall börja med och vilket du skall ta i nästa steg. Du vill lära dig programmera, du vill inte lära dig ett programspråk. Det är en viss skillnad.

Om det är dina första steg inom programmering föreslår jag att du börjar med ett annat språk än C eller C++. C har sina förtjänster, som andra påtalat i tråden. Men det har även sina brister, kanske främst minneshanteringen och pekararitmetiken som ger dig stora möjligheter att skjuta dig i foten. Jag tror att du kan slippa en del problem genom att ta ett annat programmeringsspråk som ditt första språk. Har läst en liknelse om att kockar jobbar bättre med vassa knivar men de lär sig snabbt att hålla undan fingrarna. C är en vass kniv och innan man lärt sig hur man skall hantera C sker det en del olyckor. I C++ har du alla C:s möjligheter att göra bort dig och en massa nya som är unika för C++.

När du väl lärt dig att programmera är det lätt att ta till sig ett nytt språk. Trots att jag aldrig lärt mig språken, har jag fuskat lite i Java, Javascript, php, Ruby och diverse annat. De är i grunden imperativa språk med lite olika vinklingar och specialiteer. När jag väl vet hur jag vill lösa problemet handlar det bara om att skriva det enligt de regler som gäller för det språk jag råkar använda.

Som förstaspråk röstar jag för Python. Men om alla dina kompisar programmerar C# eller Swift kan du välja det istället. Det är inte programspråket i sig du skall lära dig. Det gör du på köpet när du lär dig programmera.

Permalänk
Datavetare

"Vilket språk ska jag välja" trådar blir alltid en parad i tyckande, vilket inte är så konstigt då det inte finns något riktigt rätt eller fel.

Mitt personligt tyckande kring detta är:

  • s.k. statiskt typade språk (kräver normalt kompilator, t.ex. C, C++, Java, C#) är bättre för nybörjare än s.k. dynamiskt typade språk (typiskt skriptspråk som Python, JavaScript, Ruby). Anledningen är att kompilatorstegen och kravet på statiska typer upplyser nybörjaren om uppenbara fel tidigt

  • enklare språk, d.v.s relativt få språkkonstruktioner, är att fördra. C++ och C# är båda gigantiska språk ur den synvinkeln, Java har blivit rätt mycket mer komplicerat i senare versionen men ännu inte på C++/C# nivå. Ur den synvinkeln är faktiskt C ett rätt bra språk att börja med, ISO C11 är inte större än att man kan lära ut hela språket under en normal högskolekurs

Det är sant att C har manuellt minneshantering, men det är inte alls det problem som ges sken av i denna tråd. Till att börja med har även språk med GC minnesläckor, t.ex. i form av lapsed listener problem. Sedan är bara minne en resurs bland många, andra resurser måste oftast hanteras manuellt även i språk med GC (filer, mutex, olika former av enhetshandtag, etc)

Faktum är att C är det enda språk (i vissa fall är även en delmängd av C++ ok) som brukar vara godkänt för s.k. "safety critical systems". Anledningen är att mer "moderna" språk är i stort sett hopplösa att om man måste ha formella bevis för att programmets huvuduppgift faktiskt fungerar, för att kunna göra sådana bevis är icke-deterministiska händelser som GC och liknande i stort sett ohanterbart.

Det sagt: GC är ett krav för att effektivt kunna använda t.ex. persistent data structures, något om rejält förenklar problem som kör på flera CPU-kärnor, så GC är extremt användbart. Java är fortfarande ett relativt enkelt språk (med ett gigantiskt standardbibliotek), så det är också ett bra nybörjarspråk.

Slutligen: håller med de som säger att du inte ska fokusera på språket. Trots allt jag skrev ovan så är ändå de absolut viktigaste med programmering att man förstår hur man bryter upp problem i algoritmer, hur man lämpligen represterar data och relationer mellan data. Det kan du lära i vilket språk som helst.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

@Yoshman, bra inlägg.

Jag har aldrig förstått varför det är ett problem att C/++ har manuell minneshantering? Är man intresserad av C/++ från första början är man nog intresserad av dator över lag. Vet man hur en dator fungerar är manuell minneshantering inget problem, oftast en fördel.
Dessutom håller jag inte med dom som säger att C++ är lättare att lära sig innan man går och lär sig C. C++ är vad du gör det till, alldeles för mycket dålig kod skrivs i C++ och det hade nog inte varit så om alla lärt sig C först. Varför börja snickra i en tysk ûberverkstad innan du kan använda hammare och spik?
Angående C# så är det en helt anna historia. Det är ett helt annat språk än C/++.

Visa signatur
Permalänk
Skrivet av Yoshman:

Det är sant att C har manuellt minneshantering, men det är inte alls det problem som ges sken av i denna tråd. Till att börja med har även språk med GC minnesläckor, t.ex. i form av lapsed listener problem. Sedan är bara minne en resurs bland många, andra resurser måste oftast hanteras manuellt även i språk med GC (filer, mutex, olika former av enhetshandtag, etc)

Skrivet av Thornblom:

Jag har aldrig förstått varför det är ett problem att C/++ har manuell minneshantering? Är man intresserad av C/++ från första början är man nog intresserad av dator över lag. Vet man hur en dator fungerar är manuell minneshantering inget problem, oftast en fördel.

Att jag råder folk att starta med ett annat språk än C handlar inte om att de kan råka ut för minnesläckor utan just det faktum att man måste hantera minnet explicit. Ett språk som har inbyggt stöd för listor, tupler, lätthanterade strängar och har smidiga iterationer över dessa gör att man kan fokusera på problemet man vill lösa istället för att slåss med minneshanteringen i C.

Skall man döma av de inlägg vi brukar se på detta forum är just C och C++ ofta en del av problemet för nybörjaren. De resurshanteringsproblem Yoshman nämner är saker som nybörjaren inte kommer utsättas för under de första stapplande stegen. Under den tiden behöver man ett språk som hjälper, inte ett som stjälper. I Python skapar man en lista av strängar genom att skriva ['apelsin', 'banan', 'citron']. Hur jobbigt är det i C?

Misstolka mig inte här. Visst har C sin plats här i datorvärlden och det används flitigt, men jag tror att det finns andra språk som är bättre att börja med för den som vill lära sig programmera.

Skrivet av Thornblom:

Dessutom håller jag inte med dom som säger att C++ är lättare att lära sig innan man går och lär sig C.

Håller med. C++ är absolut inte ett språk för nybörjare.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Att jag råder folk att starta med ett annat språk än C handlar inte om att de kan råka ut för minnesläckor utan just det faktum att man måste hantera minnet explicit. Ett språk som har inbyggt stöd för listor, tupler, lätthanterade strängar och har smidiga iterationer över dessa gör att man kan fokusera på problemet man vill lösa istället för att slåss med minneshanteringen i C.

Skall man döma av de inlägg vi brukar se på detta forum är just C och C++ ofta en del av problemet för nybörjaren. De resurshanteringsproblem Yoshman nämner är saker som nybörjaren inte kommer utsättas för under de första stapplande stegen. Under den tiden behöver man ett språk som hjälper, inte ett som stjälper. I Python skapar man en lista av strängar genom att skriva ['apelsin', 'banan', 'citron']. Hur jobbigt är det i C?

Misstolka mig inte här. Visst har C sin plats här i datorvärlden och det används flitigt, men jag tror att det finns andra språk som är bättre att börja med för den som vill lära sig programmera.

Jag håller med dig. Men vill man av någon anledning lära sig C (oftast lär man sig programmeringsspråk baserat på vad man vill hålla på med), ska man inte vara rädd för språket, utan välkomna de funktionalliteter språket har. Men, som sagt, C är inte ett språk för totala nybörjare, då det faktiskt kräver en viss kunskap om datorer.

Visa signatur
Permalänk
Medlem

En anledning till att lära sig litegranna c/c++ som nybörjare kan vara att man vill leka lite med en Arduino. För den som inte vet så använder man Arduino till lite automatisering, övervakning av saker med sensorer, bygga robotar o dyl. Den använder en uppsättning kommandon etc som är plockade från c och c++.

Som en nybörjarkodare som på jobbet endast gör små utils eller (python)script och är över 40 så känner jag att en grundlig lärdom i c++ känns för tidsödande. Att lära sig grunderna i java ger stora möjligheter iom att så mycket följer med i form av bibliotek och sedan är syntaxen ungefär likadan för de olika specifika bas-bibliotekens klasser och metoder.

Visa signatur

/M

Permalänk
Datavetare
Skrivet av Ingetledigtnamn:

Att jag råder folk att starta med ett annat språk än C handlar inte om att de kan råka ut för minnesläckor utan just det faktum att man måste hantera minnet explicit. Ett språk som har inbyggt stöd för listor, tupler, lätthanterade strängar och har smidiga iterationer över dessa gör att man kan fokusera på problemet man vill lösa istället för att slåss med minneshanteringen i C.

Skall man döma av de inlägg vi brukar se på detta forum är just C och C++ ofta en del av problemet för nybörjaren. De resurshanteringsproblem Yoshman nämner är saker som nybörjaren inte kommer utsättas för under de första stapplande stegen. Under den tiden behöver man ett språk som hjälper, inte ett som stjälper. I Python skapar man en lista av strängar genom att skriva ['apelsin', 'banan', 'citron']. Hur jobbigt är det i C?

Misstolka mig inte här. Visst har C sin plats här i datorvärlden och det används flitigt, men jag tror att det finns andra språk som är bättre att börja med för den som vill lära sig programmera.

Håller med. C++ är absolut inte ett språk för nybörjare.

Detta är ingen protest, men kan vara lite djävulens advokat kring Python.

Modern C++ (d.v.s. C++11 eller senare) är inte alls samma språk som tidigare C++. T.ex. så innehåller idiomatisk C++11 aldrig "delete", man har inte GC men minnesallokering är ändå automatiskt och till skillnad från t.ex. Java/C# så kan C++11 hantera alla typer av resurser på ett sätt så man inte direkt behöver tänka på att fria dem. Så om resurshantering är problemet med C så är i så fall C++11 enklare än i princip alla existerande språk. Standard C++11 har också saker som listor, tupler, lätthanterande strängar och smidig traversering av dessa.

För att svara på din fråga om hur krångligt exemplet du ger kan man först peka på ett uppenbart problem i Python: hur är

['apelsin', 'banan', 'citron']

överhuvudtaget implementerat? Är det en lista (vilket typiskt betyder att det är mest effektivt att addera/ta bort element i fronten och index-operator är ineffektiv) eller är det något annat?

Behöver man ens veta sådant? Om målet är något enkelt "throw away" program, så nej. Men om det överhuvudtaget finns en chans att det program man skriver någon gång kommer hantera väldigt stora sekvenser av data är det absolut kritiskt att förstå exakt hur data är representerat i minne. Ett enkelt litmus-test är att skapa en lista med säg 10M element och jämföra tiden det tar att hämta första, mittersta och sista elementet. Gör man det inser man att Python listor faktiskt inte är listor, de är arrayer. Något man också märker om man försöker addera ett element i början av en lista med 10M element, det är dyrt.

Så hur ser exemplet ovan ut i C, den direkta motsvarigheten är

{"apelsin", "banan", "citron"}

inte så annorlunda. Dynamisk array kan skapas via va_args och en hjälpfunktion

str_array_t *arr = make_str_array("apelsin", "banan", "citron", NULL);

Och för att fortsätta djävulsadvokatspåret: om målet är att lära sig programmera, är det då inte en fördel att man måste lära sig skriva egna sorteringsalgoritmer, egna binärträd, egna länkade listor etc? Är inte det precis vad man lär ut i grundkurserna i programmering på högskola/universitet?

Om målet bara är att lösa ett problem man för tillfället står inför, visst att göra det i ett skriptspråk som Python är säkert det snabbaste sättet. Men om målet är att lära sig programmera bör man då inte förstå byggstenar som datorprogram normal sett står på?

Notera att jag som sagt är lite kärringen mot strömmen bara för att belysa att det finns anledningar varför språk som Python kanske är helt optimalt för nybörjare. I praktiken fungerar det utmärk att använda t.ex. Python eller Ruby, går ju att låta bli att använda de inbyggda algoritmerna. Min personliga övertygelse är ändå att statiskt typade språk är bättre för nybörjare, ska man ovillkorligen köra dynamiskt typat skulle jag förslå LISP över Python (t.ex. Clojure).

Anledningen är åter hur enkelt själva språket är. "På min tid" gillade KTH LISP som första språk (man använde en variant som kallas Scheme), anledningen är att språkdefinitionen för hela Scheme kan man lära ut på en/två föreläsningar (är typ två A4 sidor text, definitionerna enbart för språket är hundratals sidor för C++/C#). Resten av kursen kan sedan dediceras till att lära sig programmera!

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare

Och bara för fullständighets skull, här är ett exempel på hur make_str_array() skulle kunna se ut, sorry om det inte är riktigt perfekt. Programmerar och kollar samtidigt på CNN (grek-valet)

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> typedef struct { size_t len; const char *elems[0]; } str_array_t; str_array_t *make_str_array(const char * first, ...) { va_list ap; const char *e; char *m; str_array_t *arr; size_t len = 0; size_t sz = sizeof *arr; /* Count the number of elements and determine the storage size */ va_start(ap, first); for (e = first; e != NULL; e = va_arg(ap, const char *)) { if (e == NULL) break; len++; sz += sizeof(const char *); sz += strlen(e) + 1; } va_end(ap); arr = malloc(sz); if (arr != NULL) { arr->len = len; m = (char*) ((char **) (arr + 1) + len); /* Fill the array */ va_start(ap, first); for (len = 0, e = first; e != NULL; len++, e = va_arg(ap, const char *)) { arr->elems[len] = m; m = strcpy(m, e) + strlen(e) + 1; } va_end(ap); } return arr; } int main(int argc, char * argv[]) { str_array_t *a; int i; a = make_str_array("apelsin", "banan", "citron", NULL); if (a != NULL) for (i = 0; i < a->len; i++) printf("%s\n", a->elems[i]); }

Dold text
Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Anledningen är åter hur enkelt själva språket är. "På min tid" gillade KTH LISP som första språk (man använde en variant som kallas Scheme), anledningen är att språkdefinitionen för hela Scheme kan man lära ut på en/två föreläsningar (är typ två A4 sidor text, definitionerna enbart för språket är hundratals sidor för C++/C#). Resten av kursen kan sedan dediceras till att lära sig programmera!

Du har gått på KTH alltså? "På min tid" låter som 80-talet eller något

Visa signatur
Permalänk
Datavetare
Skrivet av Thornblom:

Du har gått på KTH alltså? "På min tid" låter som 80-talet eller något

WTF

Nog för att jag är gammal, men inte gammal. Det var mitten av 90-talet!

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

WTF

Nog för att jag är gammal, men inte gammal. Det var mitten av 90-talet!

Haha jasså! Tänkte eftersom de började med Java som huvudspråk på sent 90-tal, typ 99. Som de förövrigt fortfarande kör med.

Visa signatur
Permalänk
Skrivet av Yoshman:

Och bara för fullständighets skull, här är ett exempel på hur make_str_array() skulle kunna se ut, sorry om det inte är riktigt perfekt. Programmerar och kollar samtidigt på CNN (grek-valet)

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> typedef struct { size_t len; const char *elems[0]; } str_array_t; str_array_t *make_str_array(const char * first, ...) { va_list ap; const char *e; char *m; str_array_t *arr; size_t len = 0; size_t sz = sizeof *arr; /* Count the number of elements and determine the storage size */ va_start(ap, first); for (e = first; e != NULL; e = va_arg(ap, const char *)) { if (e == NULL) break; len++; sz += sizeof(const char *); sz += strlen(e) + 1; } va_end(ap); arr = malloc(sz); if (arr != NULL) { arr->len = len; m = (char*) ((char **) (arr + 1) + len); /* Fill the array */ va_start(ap, first); for (len = 0, e = first; e != NULL; len++, e = va_arg(ap, const char *)) { arr->elems[len] = m; m = strcpy(m, e) + strlen(e) + 1; } va_end(ap); } return arr; } int main(int argc, char * argv[]) { str_array_t *a; int i; a = make_str_array("apelsin", "banan", "citron", NULL); if (a != NULL) for (i = 0; i < a->len; i++) printf("%s\n", a->elems[i]); }

Ursäkta, men jag måste bara kolla så inte jag missar din poäng här. Menar du att man skall välja C som förstaspråk?

I rest my case

Permalänk
Datavetare
Skrivet av Ingetledigtnamn:

Ursäkta, men jag måste bara kolla så inte jag missar din poäng här. Menar du att man skall välja C som förstaspråk?

I rest my case

Om målet är att "lära sig programmera" och inte "lösa något omedelbart problem, gärna som innefattar mycket texthantering", så ja. Ser inte hur C skulle vara så illa, som språk är det betydligt mycket mindre än t.ex. Python.

På vilket sätt är det fundamentalt enklare att implementera t.ex. en in-place merge sort av en länkad lista (en riktig sådan där random access är en dålig idé) eller implementera en prioritetskö i form av en binär-heap i Python jämfört med C (skulle säga att alla fall den första är lättare i C).

Implementationen av make_str_array() innehåller faktiskt alla de absolut mest komplexa konstruktioner som finns i C, pekararitmetik, variabla argument (har använt det färre än en handfull gånger trots att jag genom åren skrivit miljontals rader C), cast mellan orelaterade typer för att lagra all data så inte en enda byte går till spillo och stränghantering (den form som finns i standard C suger).

Ändå tror jag något med relativt grundläggande kunskaper i C inte har något problem att följa programmet. Jämför det med Python-kod där någon kombinerat list-comprehension, keyword variable argument, överlagring av någon av __foo__ medlemmarna på en klass. Någon som kan grunderna i Python kommer inte ha en aning om vad det programmet gör.

Sedan är det knappast så att processen att implementera en dynamisk sträng array i C ska jämföras med att använda färdiga funktioner i Python, är ju i speciellt svårt att använda funktionerna i C när de väl finns. Ställer frågor om att lära sig språket C, det är definitivt lättare att lära sig hela C än lära sig hela Python då det senare är betydligt mycket större och komplexare när det kommer till språkkonstruktioner.

Ska man bara hålla sig till en liten delmängd av språket är ju inte C++11 (ser C++11 som ett annat språk än "klassiska" C++, idiomatisk C++11 kan vara rätt olik klassis C++), Java eller C# (som alla har automatiskt minneshantering och betydligt bättre stränghantering än C) på något sätt sämre val än Python för nybörjare, i min mening är de bättre för nybörjare då de är statiskt typade.

Det som gör hela diskussionen här väldigt yvig och oprecis är det som TS skriver på slutet: "Jag vet inte vad jag vill programmera". Lära sig programmera kan som sagt göras i vilken språk som helst, men inom vissa domäner kommer vissa språk/plattformar vara väldigt bra val medan de kan vara helt fel för andra.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

jag lärde mig c++ i skolan som första språk, måste säga att jag tyckte det var supertråkigt som första språk.
jag hade lärt mig ett grafiskt språk först, så man faktiskt ser resultat förrutom i en kommandotolk. det gör mycket, så jag hade kört c# och sen gått vidare till c++ om intresset kräver en vidare.
jag gick vägen c++ -> visual basic -> java -> ruby -> php

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!