Gå til innhold

Anbefalte innlegg

Fordi han ønsket å lære seg C og C++. C er et flott språk å lære seg først fordi det er såpass enkelt og er tradisjonelt et førstespråk

 

Om C er et flott førstespråk kan diskuteres. Jeg syns ikke det. Fordelen med C er at det er relativt lite og minimalistisk, men ulempen for en nybegynner er at det er veldig lavnivå. Bør en nybegynner f.eks. egentlig henge seg opp i detaljer om hvordan fundamentale datastrukturer som lenkede lister implementeres (slik man i C)? Er det ikke viktigere at man først lærer å bruke lister til å faktisk løse problemer, og så heller senere se på hvordan de kan implementeres? Jeg mener hvertfall at det er viktigere for en nybegynner å ha fundamentale verktøy som lister og hash tables tilgjengelig. Det gir enklere og mer elegant kode, og lavnivådetaljer kommer ikke i veien for å lære viktige programmeringskonsepter.

Lenke til kommentar
Videoannonse
Annonse

C++ er et svært komplisert språk som har en bratt læringskurve. Derfor anbefalte jeg heller at han startet med f.eks. Java for å lære seg basis objektorientering, og så senere kan begynne med C++. De tre er alle såkalte C-like-språk uansett, så selve syntaksen er nesten identisk.

Altså, det her skjønner jeg bare ikke. Hva mener du gir C++ en brattere læringskurve enn eksempelvis Java eller C? Klart, C++ inneholder litt tyngre ting som templates, men det ingenting i veien for å styre unna hvordan lager de selv. Så kan du såklart si at minnehåndteringen gjør det verre, men der er jo ikke C noe bedre valg. Hva er det du mener gjør C++ spesielt vanskelig å lære?
Lenke til kommentar

....og er tradisjonelt et førstespråk,

 

Når ble det tradisjonelt?

Flere universiteter brukte funksjonelle språk som Scheme før dem hoppet over på Java. Nå er flere på vei til Python.

Jeg kjenner få universiteter som bruker C++ som et intro språk, og skulle de være et eller to, er det igjen ikke "tradisjonelt".

Lenke til kommentar

Hva er det du mener gjør C++ spesielt vanskelig å lære?

 

Når man skal lære programmering, er det viktigste hvordan man tenker, og hvordan man løser problemet, ikke syntax. Se på C++ eller Java for den saksskyld. Har det simpel syntax (tenk deg at du er en nybegynner (public static void main anyone?))? Er det mulig for deg å ikke fokusere på syntax og mye heller hvordan man skal tenke? Det er det viktigste da du er ny. Muligheten til å ikke fokusere på syntax, men mye heller selve problemet og hvordan man skal løse det.

 

EDIT: Skulle kanskje ha redigert posten. Sorry for det.

Endret av JuletreDuden
Lenke til kommentar

Preprocessoren i C og C++ er jo litt uintuitiv i starten. Det er ikke like trivielt å danne sykliske referanser i C og C++ som det er i Java. Man kan også få følgefeil i en #include som trigger i et cpp dokument. Lenkefeil er feil som er temmelig typiske i starten, men helt kryptiske for nybegynnere å forstå.

Virtuelle metoder og interface kan fortsatt fungere i C++ selv om man har skrevet noe feil, de bare kaller feil funksjoner eller fører til stack imbalance. Det går an å ikke fullt implementere et pure interface som fører til run-time feil i C++, men compile-time feil i Java.

Generelt følgefeil er langt mer vanlig. Kompilatorer er blitt veldig flinke til å løse dem opp og fortelle hva som faktisk er feil. På nittitallet var dette et mareritt.

I C kan man fritt implisitt caste hva som helst til og fra void* av en eller annen grunn.

Lenke til kommentar

Virtuelle metoder og interface kan fortsatt fungere i C++ selv om man har skrevet noe feil, de bare kaller feil funksjoner eller fører til stack imbalance.

 

Hva er stack imbalance?

 

I C kan man fritt implisitt caste hva som helst til og fra void* av en eller annen grunn.

 

Nei, dette er ikke tilfellet. Attpåtil finnes det (peker)typer man ikke kan konvertere til void* selv med eksplisitt typecast.

Endret av zotbar1234
Lenke til kommentar

Ah, korrumpert stack. Hvordan kan det være konsekvensen av å kalle virtuelle metoder?

Feil funksjon i vtable på grunn av feil header fil som fører til feil lenking.

 

Samtlige funksjonspekere, f.eks.

Det kan stemme. Har ikke testet.

 

Tenkte primært på dette egentlig:

#include <malloc.h>
int main()
{
 int* ptr = malloc(100);
 ptr[0] = 0;
 voir* foo = ptr;
 char* ch = foo;
 ch[0] = 'a';
 return 0;
}

Lenke til kommentar

Testing er uvesentlig. void* kan holde kun pointer to object eller incomplete type (6.3.2.3).

 

Man kan ikke implisitt caste void* til funksjonspeker (bare eksplisitt), men man kan implisitt caste funksjonspeker til void*.

 

[size=4]#include <malloc.h>[/size]
void Foo()
{
}
typedef void (*FooType) ();
int main()
{
FooType f = (FooType)malloc(100);
void* ptr = Foo;

return 0;
}

Lenke til kommentar

Jeg anbefaler på det sterkeste å lære C++ først.

 

C++ er objektorientert i motsetning til C, og gir mere forståelse for programmering i motsetning til f.eks Java. C++ er fint og enkelt både for prosedyreorientert og objektorientert programmering. Begge disse konseptene må man jo lære seg, og C er som sagt ikke objektorientert. C kommer på en måte automatisk når man kan C++, og man lærer seg raskt forskjellen. Dette gjelder ikke den andre veien, siden man ikke kan ha objekter i C. Det er derfor vanskeligere å lære seg C++ etter at man har lært C, enn å lære C etter man har lært C++. Dessuten, det er mye mere god litteratur ifm C++ vil jeg påstå. Også, man MÅ ikke programmere objektorientert i C++. Det er typisk når man lærer seg programmering at man koder noen prosedyrer i funksjoner etc i starten, så det er alikevel helt greit å bruke C++ da.

 

Når det gjelder Java : C++ er litt vanskeligere enn Java, men ikke så veldig mye faktisk. Det vil ikke bli så mye mere arbeid å lære seg C++ enn Java, og igjen, når man kan C++ så lærer du deg Java på svært kort tid, hvis du skulle være interessert i det. Du får mye mere igjen for å lære C++ fremfor Java. De fleste programmeringsspråk kommer faktisk lett etter man har lært C++.

 

En god måte å lære seg C++ på er å gjøre øvinger. Du kan f.eks gå igjennom øvingsopplegget som brukes i et fag der man lærer seg programmering (C++) på NTNU :

 

Øvinger :

http://folk.ntnu.no/...ogrammering/Ov/

 

Løsningsforslag :

http://www.larmel.ne...hod=entry&id=40

 

Jeg har ikke sjekket, men tror det skal være noe av de samme løsningene som oppgavetekstene.

 

Det finnes også mange gode lærebøker, f.eks Savitch et al. Sjekk også ut stackoverflow.com for et ekstremt solid forum når det kommer til programmering.

Endret av Daisuke
Lenke til kommentar

Koden jeg skrev kompilerer under både gcc og Visual C++.

 

Noe som er *fullstendig* uinteressant. Du spurte hvilke pekere ikke kunne konverteres. En funksjonspeker (f.eks.) ikke kan konverteres til en void*. At det tilfeldigvis virker på en, to, eller 15 kompilatorer i dag betyr ikke at en funksjonspeker kan konverteres til en void*. Klarere nå?

Endret av zotbar1234
  • Liker 1
Lenke til kommentar

Noe som er *fullstendig* uinteressant. Du spurte hvilke pekere ikke kunne konverteres. En funksjonspeker (f.eks.) ikke kan konverteres til en void*. At det tilfeldigvis virker på en, to, eller 15 kompilatorer i dag betyr ikke at en funksjonspeker kan konverteres til en void*. Klarere nå?

http://c0x.coding-gu...om/6.3.2.3.html

 

"A pointer to void may be converted to or from a pointer to any incomplete or object type."

 

Det eneste det står om dette er "undefined behaviour" ikke at det er ulovlig.

 

ref. http://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type

Endret av GeirGrusom
Lenke til kommentar

"A pointer to void may be converted to or from a pointer to any incomplete or object type."

 

... hvilket en funksjonspeker ikke er.

 

Det eneste det står om dette er "undefined behaviour" ikke at det er ulovlig.

 

Ahahahaha... Det må være ukens. KTHX, BYE.

Endret av zotbar1234
  • Liker 2
Lenke til kommentar

http://c0x.coding-gu...om/6.3.2.3.html

 

"A pointer to void may be converted to or from a pointer to any incomplete or object type."

 

Det eneste det står om dette er "undefined behaviour" ikke at det er ulovlig.

 

ref. http://stackoverflow...to-another-type

 

Noe som er *fullstendig* uinteressant. Du spurte hvilke pekere ikke kunne konverteres. En funksjonspeker (f.eks.) ikke kan konverteres til en void*. At det tilfeldigvis virker på en, to, eller 15 kompilatorer i dag betyr ikke at en funksjonspeker kan konverteres til en void*. Klarere nå?

 

I følge standarden (C99) så er dette definert som en "common extension", dvs. noe en god del systemer implementerer:

 

J.5.7 side 513:

A pointer to an object or to void may be cast to a pointer to a function, allowing data to

be invoked as a function (6.5.4).

2 A pointer to a function may be cast to a pointer to an object or to void, allowing a

function to be inspected or modified (for example, by a debugger) (6.5.4).

 

Siden det ikke er et spesifikt krav av standarden så er det undefined behavior. Dette er ikke det samme som å si at det er ulovlig: å dele på 0 i er f.eks undefined i C, men helt lov og det er opp til implementasjonen om den vil kompilere det eller ikke.

Endret av progn
  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...