Gå til innhold

har du en kode som ikke virker? post den her!


Anbefalte innlegg

Videoannonse
Annonse

#include <windows.h>

void clearScreen()
{

HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_SCREEN_BUFFER_INFO csbi; 
if(GetConsoleScreenBufferInfo(consoleHandle, &csbi))
return;

DWORD dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

DWORD cCharsWritten;
COORD coordScreen = { 0, 0 };
if(!FillConsoleOutputCharacter(consoleHandle, (TCHAR) ' ', dwConSize,
coordScreen, &cCharsWritten))
return;

if(!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
return;

if(!FillConsoleOutputAttribute(consoleHandle, csbi.wAttributes, dwConSize,
coordScreen, &cCharsWritten))
return;

SetConsoleCursorPosition(consoleHandle, coordScreen);
}

 

Hva er galt med denne??

Lenke til kommentar

Tja det første som slår meg er at du har skrevet:

 

if(GetConsoleScreenBufferInfo(consoleHandle, &csbi))

 

men dette skal vel strengt tatt i ditt eksempel være:

 

if(!GetConsoleScreenBufferInfo(consoleHandle, &csbi))

 

Ellers returnerer funksjonen din når GetConsoleScreenBufferInfo

returnerer TRUE...

Lenke til kommentar

main() {
       FILE *f;
       char tab[40];
       int num;

       f=fopen("fil.txt","r");

       fscanf(f,"%s:%*:%*:%d:%*",&tab,&num);
       printf("%s  %d \n",tab,num);
}

 

samme som jeg har forklart tidligere. Fil.txt inneholder felter som er skilt med :

skal ha det første feltet som en string og det nest siste som et nummer. Nummeret fungerer, men stringen blir hele linjen og ikke bare det feltet jeg vil ha.

Lenke til kommentar

Jeg har laget en terreng klasse, som er ganske komplisert nå, og så har det dukket opp et problem, på pterrain::displace(word *map, int width, int height)

 

Denne funksjonene bruker den én-dimensjonale arrayen map til å lage høydeforskjeller på en fire-dimensjonal array av vertex3<float> og jeg mistenker at det er i funksjonen som gjør om 4-dimensjoner til 1

 

dword pterrain::ToIndex(dword super_x, dword super_y, dword x, dword y)
{
unsigned int cells = this->m_rows * this->m_cols; 
return (super_y * this->m_super_cols * cells) + (super_x * cells) + (y * this->m_cols + x);
}

 

Kan noen se om det er noen feil her?

Endret av GeirGrusom
Lenke til kommentar
Jeg har laget en terreng klasse, som er ganske komplisert nå, og så har det dukket opp et problem, på pterrain::displace(word *map, int width, int height)

 

Denne funksjonene bruker den én-dimensjonale arrayen map til å lage høydeforskjeller på en fire-dimensjonal array av vertex3<float> og jeg mistenker at det er i funksjonen som gjør om 4-dimensjoner til 1

 

dword pterrain::ToIndex(dword super_x, dword super_y, dword x, dword y)
{
unsigned int cells = this->m_rows * this->m_cols; 
return (super_y * this->m_super_cols * cells) + (super_x * cells) + (y * this->m_cols + x);
}

 

Kan noen se om det er noen feil her?

hva er det som evt ikke funker med den koden?

og hva er det den koden skal gjøre?

toindex... er det meningen at den tar et punkt i den 4d arrayen og skal returnere en index til 1d arrayen? eller returnerer den lengden på en 4d array eller hva? hva er forresten super_y og super_x? når jeg tenker 4d så tenker jeg x, y, z, w jeg da.. men det er kanskje ikke sånn 4d det er snakk om?

Lenke til kommentar

Som jeg sa, den gjør om 4d til 1d, jeg bruker den som en referanse i en 1d array av words (16b) for å lage høydeforskjeller (displace)

 

4d er hvordan arrayet teoretisk ser ut

vertex3<float> *m_vertex_buffer; er teoretisk bygd slik:

vertex3<float> m_vertex_buffer[super_cols, super_rows][columns, rows]

 

Dette er for å rendre deler av terrenget, men ikke hele.

Funksjonen pterrain::displace går igjennom hver vertex i terrenget, og henter en verdi ut av *map, ved å bruke pterrain::ToIndex()

 

Jeg har plundret litt med dette, fordi hvert polygon ikke kan dele vertexer, så den er litt kranglete... kanskje noen har en bedre måte å lage det på?

 

bool pterrain::CreateBuffer(dword super_rows, dword super_cols, dword rows, dword cols, float cellwidth, float cellheight)
{
unsigned int sx, sy, x, y;
word z;
float mx, my;
float mcx, mcy;
this->CreateBuffer(rows * super_rows * cols * super_cols * 4, rows * cols * 4);
mesh_lpvertex mv = this->m_vertex_buffer;
terrain_lptriangle mt = this->m_triangle_buffer;

this->m_cell_height = cellheight;
this->m_cell_width = cellwidth;
this->m_cols = cols;
this->m_rows = rows;
this->m_super_cols = super_cols;
this->m_super_rows = super_rows;
unsigned int cluster_size = 0;
my = 0; mcy = 0; z = 0;
mcx = 0;
for(sy=0;sy<super_rows;sy++)
{
 for(sx=0;sx<super_cols;sx++)
 {
 	my = mcy;
 	for(y=0;y<rows;y++)
 	{
   mx = mcx;
   for(x=0;x<cols;x++, mv++)
   {
   	mv->vert = vertex(mx, 0, my);
   	mv->texc = texcoord(0, 0);
   	mv++;
   	mv->vert = vertex(mx + cellwidth, 0, my);
   	mv->texc = texcoord(1.0f, 0);
   	mv++;
   	mv->vert = vertex(mx + cellwidth, 0, my + cellheight);
   	mv->texc = texcoord(1.0f, 1.0f);
   	mv++;
   	mv->vert = vertex(mx, 0, my + cellheight);
   	mv->texc = texcoord(0, 1.0f);
   	mx += cellwidth;
   	cluster_size += (sizeof(mesh_vertex) * 4);
   }
   my += cellheight;
 	}
 	mcx += cellwidth * cols;
 }
 mcy += cellheight * rows;
 mcx = 0;
}

for(y=0;y<rows;y++)
{
 for(x=0;x<cols;x++)
 {
 	mt->a = z;
 	mt->b = z + 3;
 	mt->c = z + 2;
 	mt++;
 	mt->a = z;
 	mt->b = z + 2;
 	mt->c = z + 1;
 	mt++;
 	z+=4;
 }
}
return true;
}
void pterrain::Displace(word *map, float magnitude)
{
mesh_lpvertex mv = this->m_vertex_buffer;
float new_val;
unsigned int sx, sy, x, y;
for(sy=0;sy<this->m_super_rows;sy++)
{
 for(sx=0;sx<this->m_super_cols;sx++)
 {
 	for(y=0;y<this->m_rows;y++)
 	{
   for(x=0;x<this->m_cols;x++)
   {
   
   	new_val = ((float)map[this->ToIndex(sx, sy, x, y)] / 65536.f) * magnitude;
   	mv->vert.y = new_val;

   	mv++;
   	new_val = ((float)map[this->ToIndex(sx, sy, x + 1, y)] / 65536.f) * magnitude;
   	mv->vert.y = new_val;

   	mv++;
   	new_val = ((float)map[this->ToIndex(sx, sy, x + 1, y + 1)] / 65536.f) * magnitude;
   	mv->vert.y = new_val;

   	mv++;
   	new_val = ((float)map[this->ToIndex(sx, sy, x, y + 1)] / 65536.f) * magnitude;
   	mv->vert.y = new_val;

   	mv++;
   }
 	}
 }
}
}

Endret av GeirGrusom
Lenke til kommentar

du sier fortsatt ikke hva som er feil med koden da.

 

btw, de siste 4 nestede loopene ser litt rart ut. er du sikker på at du ikke bare kan ha en loop og bare bruke map? blir ikke det samme resultat? da slipper du hele toindex-saken

Endret av iobas
Lenke til kommentar

Har en liten kode her som jeg ikke helt får til å funke.

Har søkt litt her og der og rundt på forumet men...

Her kommer ihvertfall koden:

//Minimal File System
/***********************************************
* Program: Minimal File System                *
* Purpose:                                    *
* Date: 05.12.04(My name day)                 *
* Last time modifided                         *
* *********************************************
*/
#include <iostream>
#include <vector>
#include <map>
using namespace std;
bool execute(string);

enum command { open, save, create, xit, del };

int main()
{
cout << "Minimal File System - MFSys" << endl;
string input;
while(1) {
 while(getline(cin, input) && execute(input))
;
 cerr << "No such command!";
}
}

bool execute(string s)
{
switch(/*Help!*/)
{
 case del: cout << "Del!";
     break;
 case open: cout << "Open!";
      break;
 case save: cout << "Save!";
      break;
 case xit: cout << "Exit!";
      break;
 case create: cout << "Create!";
     break;
}
return 1;
}

Problemet er egentlig at jeg ikke helt vet hvordan jeg skal få "gjort" om en enum så jeg kan sammenlikne med en string. Har sett noen eksempler med map som hverken funker eller som jeg skjønner.

Noen som kan hjelpe?

(har stressa med dette i... :thumbdown: )

Endret av zirener
Lenke til kommentar

#include <iostream>

#include <map>

 

using namespace std;

 

 

int main()

{

enum { velkommen, hade };

 

map<string, unsigned int> assoc;

assoc["velkommen"] = velkommen;

assoc["hade"] = hade;

 

string input = "hade";

 

switch(assoc[input]) {

case velkommen:

cout << "velkommen" << endl;

break;

case hade:

cout << "hade" << endl;

break;

}

 

return(0);

}//main

 

husk at operator[] er et funksjonskall .. så om hastighet er viktig for deg ..... (men ikke tenk på sånnt tidlig i et prosjekt .. bare abstraher/gjemm det vekk i en funksjon/klasse/modul og legg til en TODO)

Endret av søppel
Lenke til kommentar

Et veldig elementært problem... Føgende virker ikke:

 

test.c:

#include <stdio.h>
#include "testlib.h"

int main()
{
       int a = 2;
       int b = 3;
       int svar = summer (a, b);
       printf("Svaret er %d ", svar);
       return 0;
}

 

testlib.h

#ifndef testlib_h
#define testlib_h

int summer (int a, int b);

#endif

 

testlib.c

int summer (int a, int b)
{
       int svar = a + b;
       return svar;
}

int main()
{
       return 1;
}

 

Og når jeg skal kompilere:

# gcc test.c -o test
/tmp/ccaeK8Ly.o(.text+0x1d): In function `main':
: undefined reference to `summer'
collect2: ld returned 1 exit status

 

Er det noe jeg ikke har forstått med header-filer? Takknemlig for hjelp i starten, det er mye med C som forvirrer meg...

 

Skjønner heller ikke hvorfor dette skjer når jeg tar vekk main-metoden fra testlib.c:

# gcc testlib.c -o testlib
/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.3/../../../../lib/crt1.o(.text+0x21): In function `_start':
: undefined reference to `main'
collect2: ld returned 1 exit status

Endret av anderlin
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...