Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Forstå at dette har ikke noe med C++ å gjøre direkte - det har mer med hvilket IDE (editor/miljø) man bruker.

 

- MinGW Studio har støtte for dette.

- Visual C++ har støtte for dette.

- Emacs også tror jeg.

- KDevelop også tror jeg.

- o.s.v.

Lenke til kommentar
Videoannonse
Annonse
Forstå at dette har ikke noe med C++ å gjøre direkte - det har mer med hvilket IDE (editor/miljø) man bruker.

 

- MinGW Studio har støtte for dette.

- Visual C++ har støtte for dette.

- Emacs også tror jeg.

- KDevelop også tror jeg.

- o.s.v.

Visual C++, det er noe microsoft har laget, og sansynelighvis er ganske lik den jeg bruker til VB? Da prøver jeg den ;)

 

Takk skal du ha!

 

 

Edit: Ser ikke ut som det er gratis.. Må jeg *host* skaffe den på andre måter? :p

Endret av Jonas
Lenke til kommentar

Heisann, jeg trenger litt hjelp med strenger i C.

Jeg skal lese inn tastetrykk for så å skrive de ut baklengs.

oppgave nr 12336

 

Et tips er

char ch;
while( ch = getchar(), ch >= 0 ) /* ch < 0 indicates end-of-data */

men jeg skjønner ikke helt hva jeg skal gjøre etterpå, for uansett hva jeg har "inne" i whileloopen så kommer jeg ikke ut av den. Det er meningen at den skal stoppe etter jeg har trykket noen taster og trykker på enter?

 

Det jeg prøvde på først var å lage en "char streng[10]" og en integer, og så skal jeg legge ch i streng[integer] og inkremere integeren helt til jeg trykker på enter. Så skal jeg gå baklengs og dekremere.

Er dette riktig fremgangsmåte, eller er strenger i C noe hurlumhei jeg ikke har skjønt?

Lenke til kommentar
Exercise 12336

...

Read until you encounter end-of-data (see below).

...

 

..under står det:

 

...

end-of-data (type control-D to indicate end of data at a terminal,

...

Haha, under neste oppgave står det ja. Det burde stå i selve kapittelet også, hvertfall ikke bare under en oppgave. Ble veldig nervøs nå, for det tok en stund før jeg fant det ;)

 

Får se om jeg får det til nå, takk skal du ha

Lenke til kommentar

fil1.txt:

int a;

 

fil2.txt:

int a;

 

Hvis vi kompilerer disse hver for seg går dette helt fint, men hvis vi linker dem sammen går det dritt:

 

g++ fil1.txt fil2.txt -o blah

/tmp/ccxUU2lt.o(.bss+0x0): multiple definition of `a'

/tmp/ccYmESvt.o(.bss+0x0): first defined here

 

Det finnes m.a.o., som kompileren sier, flere definisjoner av a. Så man gjør i stedet slik:

 

fil3.txt:

extern int a;

int main()
{
       a = 123;
       return(0);
}

 

fil4.txt:

int a;

 

g++ fil3.txt fil4.txt -o blah

 

Her finnes det bare én definisjon av a.

 

Legg merke til at:

 

- void a(); // er en deklarasjon

- extern int a; // er en deklarasjon

- void a() {} // både er en deklarasjon og definisjon

- int a; // både er en deklarasjon og definisjon

Endret av søppel
Lenke til kommentar

extern brukes ofte til globale konstanter o.l. Du har en headerfil med deklarasjonen, og en implementasjonsfil med definisjonen. På den måtet kan du inkludere headerfila på flere steder uten å bryte endefinisjonsregelen.

 

Eksempel

gamedefs.hpp:

extern int total_lives;

 

gamedefs.cpp:

int total_lives = 5;

Lenke til kommentar

En deklarasjon sier "Hør her, Kompilator, det finnes noe som heter a, og det er et heltall". Da tenker Kompilatoren "Javel, hvis du sier det, så... Men jeg vil gjerne se en definisjon før jeg er helt ferdig!" Så lar Kompilatoren deg jobbe med den deklarerte variabelen. Men, hvis du bare tuller med Kompilatoren og egentlig ikke har noe heltall ved navn a noe sted, da kommer Kompilatorens venn Linkeren og klager.

Lenke til kommentar
Hvordan kan man gi en verdi til noe som bare er en deklarasjon?

 

Programmet kjøres ikke "der og da" under kompilering; det skjer som Myubi sier etter at begge filene er kompilert og linket sammen, og du starter programmet. Når man har deklarert extern int a;, men glømt å definere et sted, eller glømt å linke med objekt-fila der int a er definert, kan man kan nesten tenke seg i detalj hva linkeren driver med når man hører "unresolved external".

 

Så extern int a; sier på en måte:

int a = &ukjennt_addresse;

 

..under kompilering. Da blir det linkerens oppgave å gi (resolve) en addresse til a;

int a = &addressen til a;

 

(Addressene er relative, statiske addresser i dette tilfellet. Du må nesten lese en bok for å finne ut mer om dette.)

 

g++ -c blah.cpp

Kompilerer blah.cpp til en objekt-fil blah.o (binærkode).

 

g++ -c bah.cpp

Kompilerer bah.cpp til en objekt-fil bah.o (binærkode).

 

g++ blah.cpp bah.cpp -o blah

Kompilerer først blah.cpp til en objekt-fil (binær-kode), så bah.cpp, deretter linkes objektfilene (blah.o bah.o) sammen til filen blah (eller blah.exe under Windows).

 

Ting foregår altid i slike skritt:

Compile -> Link

 

eller egentlig:

Preprocessing (macro-stuff) -> Template-instantiation -> Compile -> Link

 

http://www.cpp.no/lars/ticpp-v1/Chapter02.html#Heading79

http://www.cpp.no/lars/ticpp-v1/Chapter03.html#Heading132

 

Edit:

Når jeg tenker meg om så produseres det også asm-kode i et skritt .. Kanskje det er flere skritt også, men ikke så alt for viktig dette.

Endret av søppel
Lenke til kommentar

Har problemer med en litt ting her.

Jeg har: program.cpp, funk.cpp, funk.h

Og jeg skal jo da legge funksjonen funk() i en headerfil som dere forstår.

Etter som jeg har forstått skal jeg ha deklarasjonen av funk() i funk.h, og definisjonen av funk() i funk.cpp. Deretter skal jeg inkludere funk.h i program.cpp(som jeg skal bruke funk() i). Spørsmålet mitt er da: Hva er feil?

 

funk.h:

#ifndef GUARD_funk
#define GUARD_funk

#include <iostream>
#include "funk.cpp"

double funk(double a, double b);

#endif

 

Her gikk det fint: funk_h.exe - 0 error(s), 0 warning(s)

 

funk.cpp:

#include <iostream>
#include "funk.h"
using namespace std;

double funk(double a, double b)
{
return (a+b);
}

 

Feilmelding:Linking...

C:\MinGWStudio\MinGW\bin\..\lib\gcc-lib\mingw32\3.3.1\..\..\..\libmingw32.a(main.o)(.text+0x97):main.c: undefined reference to `WinMain@16'

 

program.cpp:

#include <iostream>
#include "funk.h"
using namespace std;
int main()
{
double a,b,c;
cout << "Les inn verdier til variablene a og b: ";
cin >> a >> b; cin.ignore();
c = funk(a, b);
cout << endl << c;
cin.get();
}

 

Feilmelding: test.cpp:2:20: funk.cpp: No such file or directory

test.cpp: In function `int main()':

test.cpp:9: error: `funk' undeclared (first use this function)

test.cpp:9: error: (Each undeclared identifier is reported only once for each

function it appears in.)

test.cpp:12:2: warning: no newline at end of file

 

Kan desverre ikke vise hvordan jeg kompilerer og linker fordi jeg ikke er på den PC``en hvor jeg har msys og alt det der. Men jeg bruker MinGW Studio.

 

Edit:Glemte å legge til feilmeldinger.

Edit2: Takk for retting saboi, den hadde jeg skrevet riktig når jeg testa programmet, var bare en feil her.

Endret av zirener
Lenke til kommentar

funk.cpp skal inkludere funk.h

program.cpp skal inkludere funk.h

 

jeg skjønner ikke helt.

kompilerer programmet nå?

hvis det ikke gjør det så fjern #include "funk.cpp" fra funk.h og du burde vel også velge console project istedetfor win32 project

Endret av saboi
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å
×
×
  • Opprett ny...