Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Datatyper er et overfladisk begrep, det fins ingen data typer i datamaskinen. Det finnes binære formater som er spesifike til instruksjoner i prosessoren, men det fins ingen datatyper. Den ene og alene årsaken til at du har datatyper i språket ditt, er fordi kompilatoren er nødt til å vite det for å vite hvilke instruksjonssett den skal bruke for å behandle det som er i variabelen din.

 

Du kan bedre forstå det jeg sier om du tenker på ram brikkene dine i maskinen, om du tenker på alle bitene som kan lagres inni der, så kan det umulig finnes et konsept som "Double" eller "Integer" inni ram brikkene dine. Det er et overfladisk kompilatorspesifikt konstruert konsept for å gi kompilatoren informasjon som igjen gjør det mulig for kompilatoren å velge riktige instruksjoner for det binære formatet du har valgt. Men det er alt overfladisk.

 

Omtrent alle konsepter i et programmeringsspråk er overfladisk og har ingen teknisk relevans i det hele tatt, dvs det gjelder frem til du klikker "Compile", og etter det er ferdig, så avslutter relevansen og har ingen betydning. Det har betydning kun når du skriver noe i din IDE editor, men etter det er kompilert forsvinner alt det overfladiske.

 

Tenk på datatyper som en gul merkelapp, disse gule merkelappene er notater til din kompilator, som instruerer den om at det binære formatet og den binære lengden er variabel innenfor et visst spekter og da gir du kompilatoren spesifik instruks om hvilke instruksjoner den har lov til å bruke for å behandle variabelen din.

 

Jeg skal gi deg det beste tipset du kan få, om du programmerer i et høynivåspråk. Aldri forsøk å se relevansen mellom hvordan ditt språk fungerer og hvordan maskinen fungerer, der fins ingen relevans mellom de, du kan tenke i evigheter på en ting i ditt språk, og du finner aldri noe svar på det. Det er fordi alt er overfladisk.

 

Kan forøvrig legge til at, om du har programmert i noen år og brukt datatyper i lang tid, så føles det som om det er et ekte konsept med datamaskiner, men det er lett å bli lurt. Det er ingen forskjell på en int og en real, ingen forskjell mellom en byte og en bool, ingen forskjell mellom en int64 og en double.

 

Men kompilatoren "driter" i hva du vet om datamaskinen, den aksepterer bare protokollen den opererer i, for den kan ikke fungere uten en protokoll. Å definere variablene er del av denne protokollen. Det er sunt å tenke på datatyper som en protokoll, og ikke som en datatype.

 

Når du definerer en variabel som integer, så gir du en direkte instruks til kompilatoren din om at den ikke skal bruke (majoriteten) av simd instruksjoner for å behandle den variabelen og (majoriteten) av x87 instruksjonene. Du definerer ikke en type data, du definerer hvilke instruksjoner skal behandle det som er i variabelen din. Men alle variabler er like (teknisk).

 

Jeg skal gi et lite eksempel. La oss anta du har en variabel X, du definerer X som en integer. Så i koden din setter du verdien X := 10;

 

Nå inneholder X verdien 10, og kompilatoren vet at X er en integer, derfor velger kompilatoren instruksjonen "mov [x],10"

 

Men om du går tilbake og fjerner integer og setter double der, og kompilerer den på nytt så kan kompilatoren ha erstattet "mov [x],10" med "fstp qword [x]"

 

Fordi nå vet kompilatoren at den skal bruke binære format for flyttall. Det er ikke verre enn som så, den skifter bare ut instruksjoner når du endrer datatype, det er hele magien.

Endret av LonelyMan
  • Liker 1
Lenke til kommentar
Videoannonse
Annonse
Gjest Gjest slettet-ld9eg7s96q

Okai, da har jeg funnet ut hva jeg vil programmere :) Før jeg går videre i læringen, når og hvorfor bruker man int, VoID, Bool, Double osv ?

 

Før du går videre i læringen? Ut ifra hva du sier her virker det som du ikke har påbegynt den enda. Enhver pensum i programmering dekker dette i startfasen da det er elementært og viktig at du skjønner begrepet og prinsippet om datatyper før du lærer noe annet. Som andre har poengtert er det viktig at du setter deg ned og lærer det fundamentale først og sørger for at du har forstått dette før du går videre. En god bok vil hjelpe deg langt på vei, eller du kan starte her:

 

http://www.cplusplus.com/doc/tutorial/variables/

Lenke til kommentar

 

 

Før du går videre i læringen? Ut ifra hva du sier her virker det som du ikke har påbegynt den enda. Enhver pensum i programmering dekker dette i startfasen da det er elementært og viktig at du skjønner begrepet og prinsippet om datatyper før du lærer noe annet. Som andre har poengtert er det viktig at du setter deg ned og lærer det fundamentale først og sørger for at du har forstått dette før du går videre. En god bok vil hjelpe deg langt på vei, eller du kan starte her:

 

http://www.cplusplus.com/doc/tutorial/variables/

 

Nja. Når jeg mente "gå videre" så var det å programmere noe annet en kalkulator. Det var ikke så spennende i lengden. Jeg har fulgt thenewboston på YouTube, men føler ikke han forklarer det så godt og det han lærer settes ikke i sammenheng. Var på biblioteket for under 2 uker siden og spurte om de hadde noen bøker om data-programmering men de hadde ikke noe.

 

Googlet det opp litt etter jeg skrev det.

Skal sjekke hukommelsen så si ifra om det er feil.

VoID brukes når man ikke skal returnere noe

Double brukes nå man skal ha flere desimaler (opptil 15?)

Bool kan kun ha variablene "true" og "false"

Int brukes vel til det meste som ikke skal ha noe "spesialisering"

Lenke til kommentar
  • 5 måneder senere...

Hei. Jeg holder på med visuell C-programmering, SDL, og ønsker å lagre en økende variabel for x, y-koordinatene. En metode er å definere en matrise slik: matrix[][], men problemet er at jeg har et vindu med 800 pixler i x og y retning. Det blir en unødvendig stor matrise og jeg skulle også gjerne ha lagret informasjon for objekter som er mindre og større enn det definerte bildet.

Lenke til kommentar

Takk! Har rotet litt med det og har funnet en løsning som funker i programmet:

 

int xaxis=300, yaxis=900;

 

struct density{

int xy};

 

struct density x[0][0];

x[xaxis][yaxis].xy = x[xaxis][yaxis].xy + 1;

 

Dette funker helt fint, men etter en runde i programmet ønsker jeg å resette alle verdiene i strukturen. Har googla og prøvd ting som memres, conts og masse andre ting jeg fant på nettet og ingenting funker.

Lenke til kommentar

 

int xaxis=300, yaxis=900;

struct density{
int xy};

struct density x[0][0];
x[xaxis][yaxis].xy = x[xaxis][yaxis].xy + 1;
Dette funker helt fint,

 

Nei, det gjør det ikke.

 

1) Du kan ikke definere en array med størrelse 0 (ISO 9899:1999, § 6.7.5.2 p 5, f.eks).

2) struct-deklarasjonen er ikke syntaktisk korrekt (Lycantrophe kom med en veldig sannsynlig forklaring på hva det var du egentlig ønsket) (ISO 9899:1999, følger direkte av § 6.7.2.1 p 1, f.eks).

3) Du indekserer arrayen utenfor dens grenser (f.eks. er ikke x[300] veldefinert, selv om man kunne ha definert en array med størrelse 0).

 

 

men etter en runde i programmet ønsker jeg å resette alle verdiene i strukturen. Har googla og prøvd ting som memres, conts og masse andre ting jeg fant på nettet og ingenting funker.

1) Hva er det du ønsker å oppnå, eksakt? (hva betyr "å resette alle verdiene i strukturen" og hvilken struktur er det snakk om?)

2) Hva er det du har fått til?

3) Hvordan er #1 forskjellig fra #2?

Lenke til kommentar

Selve programmet modelerer gravitasjon fra ett objekt til et annet. Tanken er å simulere en spiralgalakse, men jeg må få inn density wave theory for at formen skal holde seg.

 

For å gjøre dette på en klønete måte, tenkte jeg å øke tettheten i koordinatene (x,y) med 1 for vært objekt som er der.

Derav koden x[xaxis][yaxis].xy = x[xaxis][yaxis].xy +1; som "funker".

 

Programmet skal deretter bremse ned hastigheten for objektene dersom det er høy tetthet i deres koordinater. Alle Objektene får nye (x,y)-verdier og tettheten må deretter beregnes fra nytt av.

 

Det er en klønete måte å gjøre det på, men det er den beste og raskeste metoden jeg har funnet med mitt C-nivå.

 

Håper dette ga et bedre innsikt i hva jeg tenkte på :)

Endret av CoffinKriz
Lenke til kommentar
  • 4 måneder senere...
  • 2 uker senere...

Jeg har veldig veldig lyst å programmere i C++, men jeg er usikker på veien dit. Eller om det er vits å benytte seg av dette språket, hvis man ikke skal utvikle spill. Holder på å lære meg Java. Er det slik at man burde lære seg Java eller et annet før man går på C++?

Endret av webliz
Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q

Lær deg grunnleggende syntaks i C++ først, det er ikke vanskelig å forstå og du mestrer det temmelig kjapt. Spesielt hvis du er vandt med programmeringslogikk fra et annet språk fra før. Dermed beveger du deg rett på et GUI rammeverk med god dokumentasjon. Du får da en mer praktisk innfallsvinkel i læringen og føler også lettere å mestre språket. Personlig anbefaler jeg QT til dette.

Selv har jeg gått fra MFC - WxWindows - QT

QT er også veldig anvendelig til mange andre ting enn GUI, jeg har lagd webapplikasjoner (CGI) med QT.

C++ kan brukes til alt

Endret av Gjest slettet-ld9eg7s96q
Lenke til kommentar
  • 3 uker senere...

Jeg lager et program for innloggin. Det er sikkert en del feil men det gjør litt slik jeg vil ha det pr nå.

 

Tingen er at jeg vil ha slik at første gangen man bruker programmet så velger man selv brukernavn og passord og resten av gangene må man bare skrive inn rett kombinasjon. Hvordan får jeg programmet til å huske kombinasjonen og hoppe over løkken hvor man velger brukernavn og passord?

 

Det er sikkert litt over mitt kompetansenivå men går litt mer grundig igjennom en forrige gang, da noen ville slå seg i hodet med en hammer :p

 

En ting til, finnes det en type som både kan lagre bokstaver og tall? Type da mener jeg som int, double, string osv. Vet ikke hva det heter på fagspråket.

 

Hittil tester jeg det i cmd så kan hende ikke alle ønskelige funksjoner er mulig men satser på å skrive koden inn i QT i morgen.

 

Koden:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string username;
	string pw1;
	string pw2;
	bool setlogin = false;
	string passw;
	
	do{
		cout <<"Velg et brukernavn: ";
		cin >> username;
		cout <<"Velg et passord (kun bokstaver): ";
		cin >> pw1;
		cout <<"Bekreft passord (kun bokstaver): ";
		cin >> pw2;
		
		if(pw1 == pw2){
			cout << "Kombinasjon av brukernavn og passord er godkjent. \n\n";
			passw = pw1;
			setlogin = true;
		}
		else{
			cout <<"Kombinasjon av brukernavn og passord er ikke godkjent, prøv på nytt.\n\n";
		}
	}while(!setlogin);
	
	
	string brukernavn;
	string passord;
	int MaxTries = 1;
	bool loginn = false;
	
	
	do{
		cout << "Skriv inn brukernavn: \n";
		cin >> brukernavn;
		cout << "Skriv inn passord: \n";
		cin >> passord;
		
		if(brukernavn == username && passord == passw){
			cout << "Velkommen til et mekka av glede \n" << endl;
			loginn = true;
		}
		else if(MaxTries == 3){
			cout << "Dette var forsøk " << MaxTries << " av tre mulige \n";
			cout << "Du har tastet inn feil kombinasjon for mange ganger. \n";
			loginn = true;
		}
		else{
			cout << "Feil kombinasjon, prøv på nytt! \n";
			cout << "Dette var forsøk " << MaxTries << " av tre mulige \n";
			MaxTries++;
			
		}
	}while(!loginn && MaxTries <= 3);
}

Håper jeg ikke er helt ute å kjører og noen vil slå seg i hodet på nytt.. :)

 

Edit: Ser at når jeg kjører programmet utenfor DEV C++ så slutter programmet med en gang når jeg er ferdig med riktig brukernavn og passord.

Har prøvd uten hell:

cin.get();
return 0;

Edit2: Etter litt googling fant jeg en løsning på problemet:

cin.ignore();
cin.get();
return 0;
Endret av Svigermors drøm
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...