Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse

Jada. Bare gni det inn!

endre@endre:~$ cat sine.c
#include <math.h>

int main (void)
{
float a;
a = sinf(1.00);

return(0);
}
endre@endre:~$ gcc sine.c
/tmp/ccQ5S3tl.o: In function `main':
sine.c:(.text+0x1a): undefined reference to `sinf'
collect2: ld returned 1 exit status
endre@endre:~$

Er det rart jeg aldri kommer skikkelig i gang med C?!?! :realmad:

At det skal være så forbanna klønete å få disse kompilatorene å kjøre skikkelig. Tror jeg kjører kompilasjon mot filserveren over SSH snart (Debian 4.0).

 

Edit: data_jepp: Så ikke posten din. Forumet takler ikke *.c, så jeg kjørte cp til *.c.txt: sine.c.txt

Endret av endrebjo
Lenke til kommentar

Så jeg må altså linke inn mattebiblioteket med både #include <math.h> og -lm. Makan til bedritent opplegg. Er det sånn for alle bibliotekene?

 

Edit: Jeg må forøvrig bruke -lm på filserveren også. Debian er visst minst like hjerneskadet som Ubuntu.

Endret av endrebjo
Lenke til kommentar

Jeg skjønner ikke hensikten med dette eksempelet:

#include <math.h>
float cosf(float x); /* C99 */
float sinf(float x); /* C99 */
float tanf(float x); /* C99 */
double cos(double x);
double sin(double x);
double tan(double x);
long double cosl(long double x); /* C99 */
long double sinl(long double x); /* C99 */
long double tanl(long double x); /* C99 */

Hva er det de vil frem til?

Lenke til kommentar

Den blir fryktelig lik, men greit nok. Tenkte mer på samme vanskelighetsgrad.

Går det ikke an å bruke strcmp() med variabler i case-statement? F.eks

#include <stdio.h>
#include <string.h>

int main (void)
{
char string[3] = "foo";

switch (0)
{
	case strcmp(string, "bar"):
		printf("tull\n");
		break;
	case strcmp(string, "foo"):
		printf("ja\n");
		break;
}
return(0);
}

Får beskjed om at: "case label does not reduce to an integer constant".

Endret av endrebjo
Lenke til kommentar

Pøh. du vet bare ikke hvor du skal bruke den.

 

if(strcmp(string, "foo") == 0)
 std::cout << "Foo!";		 // Case 1
else if(strcmp(string, "hai") == 0)
 std::cout << "Hello World!"; // Case 2
else
 std::cout << "Wtf?";		 // Default case

Dette gjør akkurat samme oppgaven som en switch, eneste praktiske forskjellen er at du ikke kan hoppe mellom cases eller passere igjennom.

Endret av GeirGrusom
Lenke til kommentar

Jeg har fått det til for lenge siden med if, men jeg tenkte å bruke switch for å se om den konstruksjonen kunne brukes til noe fornuftig, men det kan den tydeligvis ikke. Jeg har enda ikke funnet én eneste reell situasjon der switch-konstruksjonen er enklere/mer praktisk enn if-konstruksjonen.

 

 

BTW: En vektorgreie var skit-lett å få til etter at jeg gjennomgikk brøk-greien i forgårs. Straight-ahead uten å se på brøk-eksempelet engang.

Klikk for å se/fjerne innholdet nedenfor
#include <stdio.h>
#include <math.h>
#include <string.h>

typedef struct {
int x;
int y;
int z;
} vektor;

vektor add(vektor a, vektor b);
vektor sub(vektor a, vektor b);
int mup(vektor a, vektor b);		// Prikkprodukt
vektor muk(vektor a, vektor b);	// Kryssprodukt
float vinkel(vektor a, vektor b);	// Vinkel mellom to vektorer
float v_abs(vektor a);			// Absoluttverdien av en vektor
float rad_to_deg(float rad);		// Idioter foretrekker vinkelsvar i grader

int main(void)
{
vektor a;
vektor b;
char metode[3];
vektor svar = {0, 0, 0};
float skalar = 0;

printf("Vektor a (pa formen x,y,z): "); 
	scanf("%d,%d,%d", &a.x, &a.y, &a.z);
printf("Vektor b (pa formen x,y,z): ");
	scanf("%d,%d,%d", &b.x, &b.y, &b.z);
printf("add|sub|mup|muk|vin|abs ");
	scanf("%s", metode);


if (strcmp(metode, "add") == 0)
	svar = add(a, b);
else if (strcmp(metode, "sub") == 0)
	svar = sub(a, b);
else if (strcmp(metode, "muk") == 0)
	svar = muk(a, b);

skalar = v_abs(svar);

if (strcmp(metode, "mup") == 0)
	skalar = mup(a, b);
else if (strcmp(metode, "vin") == 0)
	skalar = vinkel(a, b);
else if (strcmp(metode, "abs") == 0)
	skalar = v_abs(a);

printf("Vektor: [%d, %d, %d]\n", svar.x, svar.y, svar.z);
printf("Skalar: %.2f\n", skalar);
return(0);
}

vektor add(vektor a, vektor b)
{
vektor resultat;

resultat.x = a.x + b.x;
resultat.y = a.y + b.y;
resultat.z = a.z + b.z;
return resultat;
}

vektor sub(vektor a, vektor b)
{
vektor resultat;

resultat.x = a.x - b.x;
resultat.y = a.y - b.y;
resultat.z = a.z - b.z;
return resultat;
}

int mup(vektor a, vektor b)
{
int resultat = a.x * b.x + a.y * b.y + a.z * b.z;
return resultat;
}

vektor muk(vektor a, vektor b)
{
vektor resultat;

resultat.x = a.y * b.z - a.z * b.y;
resultat.y = a.z * b.x - a.x * b.z;
resultat.z = a.x * b.y - a.y * b.x;
return resultat;
}

float vinkel(vektor a, vektor b)
{
float resultat = rad_to_deg(acosf(mup(a, b) / (v_abs(a) * v_abs(b))));
return resultat;
}

float v_abs(vektor a)
{
float resultat = sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
return resultat;
}

float rad_to_deg(float rad)
{
float pi = 3.141592653;
float deg = (rad / (2*pi)) * 360;
return deg;
}

Endret av endrebjo
Lenke til kommentar

Bruker du C?

Hvis du bruker C++, skriv en klasse, og prøv deg på operator overloading.

 

anyways: switch

 

struct chunk3ds
{
 short id;
 int size;
};

int read3ds(char* fn)
{
 FILE *fp;
 chunk3ds chunk;

 if(!(fp = fopen(fn, "br")))
return FILE3DS_IO_ERROR;

 chunk.id = readShort(fp);
 chunk.size = readInt(fp);

 switch(chunk.id)
 {
case CHUNK_3DS:
  // blablablabla
  break;
case ETC:
 }
 ... etc...
}

 

det finnes områder der den er nyttig.

dette var bare et veldig overfladisk eksempel, men jeg hr brukt dette til å lese .3ds filer både i C++ og C#, og da er switch ganske kjekt å ha, fordi den er litt mer oversiktelig.

Lenke til kommentar

Jeg vil installere Microsoft Visual C++ 2008 Express edition men den stopper hele tiden på .NET Framework 3.5 og slår seg selv av og gir en sånn ''send rapport'' melding

 

Hvordan fikser jeg dette problemet?

 

Blir evig takknemelig for et svar som kan hjelpe meg :)

Lenke til kommentar
Bruker du C?
Ja. Tenkte jeg måtte begynne en eller annen plass.

Har ikke vært skikkelig borti OOP enda, så jeg tenkte det kunne bli litt for hardt å både venne seg til OOP-tenkemåten og lære et lavnivå-språk. ;)

Endret av endrebjo
Lenke til kommentar

Jeg tror det er slik at hvis man skriver:

int *p, a, c;

,så oppretter man en peker, nemlig *p og to int, nemlig a og c.

 

Med dette:

int* p, a c;

oppretter vi tre integer-pointers, nemlig p, a og c.

 

Det jeg ressonerer meg frem til da, er at man ved å sette * rett etter int, kan deklarere alle variablene som pointere.

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...