Jump to content
  • Advertisement
Sign in to follow this  
ryumeijin

q about object oriented programming in c++ book by lafore

This topic is 3586 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

i have a problem compiling & executing a sample from this book in mvc++ 2008 express edition.. i keep getting this error: error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast error C2065: 'j' : undeclared identifier(braces i think will handle this error) could someone point & correct what im doing wrong.. here are the source codes (3 files:circstrc.cpp,msoftcon.cpp & msoftcon.h) thanks! ------------------------------------------------------------------------- // circstrc.cpp // circles as graphics objects #include "msoftcon.h" // for graphics functions //////////////////////////////////////////////////////////////// struct circle //graphics circle { int xCo, yCo; //coordinates of center int radius; color fillcolor; //color fstyle fillstyle; //fill pattern }; //////////////////////////////////////////////////////////////// void circ_draw(circle c) { set_color(c.fillcolor); //set color set_fill_style(c.fillstyle); //set fill pattern draw_circle(c.xCo, c.yCo, c.radius); //draw solid circle } //-------------------------------------------------------------- int main() { init_graphics(); //initialize graphics system //create circles circle c1 = { 15, 7, 5, cBLUE, X_FILL }; circle c2 = { 41, 12, 7, cRED, O_FILL }; circle c3 = { 65, 18, 4, cGREEN, MEDIUM_FILL }; circ_draw(c1); //draw circles circ_draw(c2); circ_draw(c3); set_cursor_pos(1, 25); //cursor to lower left corner return 0; } //msoftcon.cpp //provides routines to access Windows console functions //compiler needs to be able to find this file //in MCV++, /Tools/Options/Directories/Include/type path name #include "msoftcon.h" HANDLE hConsole; //console handle char fill_char; //character used for fill //-------------------------------------------------------------- void init_graphics() { COORD console_size = {80, 25}; //open i/o channel to console screen hConsole = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L); //set to 80x25 screen size SetConsoleScreenBufferSize(hConsole, console_size); //set text to white on black SetConsoleTextAttribute( hConsole, (WORD)((0 << 4) | 15) ); fill_char = '\xDB'; //default fill is solid block clear_screen(); } //-------------------------------------------------------------- void set_color(color foreground, color background) { SetConsoleTextAttribute( hConsole, (WORD)((background << 4) | foreground) ); } //end setcolor() /* 0 Black 8 Dark gray 1 Dark blue 9 Blue 2 Dark green 10 Green 3 Dark cyan 11 Cyan 4 Dark red 12 Red 5 Dark magenta 13 Magenta 6 Brown 14 Yellow 7 Light gray 15 White */ //-------------------------------------------------------------- void set_cursor_pos(int x, int y) { COORD cursor_pos; //origin in upper left corner cursor_pos.X = x - 1; //Windows starts at (0, 0) cursor_pos.Y = y - 1; //we start at (1, 1) SetConsoleCursorPosition(hConsole, cursor_pos); } //-------------------------------------------------------------- void clear_screen() { set_cursor_pos(1, 25); for(int j=0; j<25; j++) putch('\n'); set_cursor_pos(1, 1); } //-------------------------------------------------------------- void wait(int milliseconds) { Sleep(milliseconds); } //-------------------------------------------------------------- void clear_line() //clear to end of line { //80 spaces //.....1234567890123456789012345678901234567890 //.....0........1.........2.........3.........4 cputs(" "); cputs(" "); } //-------------------------------------------------------------- void draw_rectangle(int left, int top, int right, int bottom) { char temp[80]; int width = right - left + 1; for(int j=0; j<width; j++) //string of squares temp[j] = fill_char; temp[j] = 0; //null for(int y=top; y<=bottom; y++) //stack of strings { set_cursor_pos(left, y); cputs(temp); } } //-------------------------------------------------------------- void draw_circle(int xC, int yC, int radius) { double theta, increment, xF, pi=3.14159; int x, xN, yN; increment = 0.8 / static_cast<double>(radius); for(theta=0; theta<=pi/2; theta+=increment) //quarter circle { xF = radius * cos(theta); xN = static_cast<int>(xF * 2 / 1); //pixels not square yN = static_cast<int>(radius * sin(theta) + 0.5); x = xC-xN; while(x <= xC+xN) //fill two horizontal lines { //one for each half circle set_cursor_pos(x, yC-yN); putch(fill_char); //top set_cursor_pos(x++, yC+yN); putch(fill_char); //bottom } } //end for } //-------------------------------------------------------------- void draw_line(int x1, int y1, int x2, int y2) { int w, z, t, w1, w2, z1, z2; double xDelta=x1-x2, yDelta=y1-y2, slope; bool isMoreHoriz; if( fabs(xDelta) > fabs(yDelta) ) //more horizontal { isMoreHoriz = true; slope = yDelta / xDelta; w1=x1; z1=y1; w2=x2, z2=y2; //w=x, z=y } else //more vertical { isMoreHoriz = false; slope = xDelta / yDelta; w1=y1; z1=x1; w2=y2, z2=x2; //w=y, z=x } if(w1 > w2) //if backwards w { t=w1; w1=w2; w2=t; // swap (w1,z1) t=z1; z1=z2; z2=t; // with (w2,z2) } for(w=w1; w<=w2; w++) { z = static_cast<int>(z1 + slope * (w-w1)); if( !(w==80 && z==25) ) //avoid scroll at 80,25 { if(isMoreHoriz) set_cursor_pos(w, z); else set_cursor_pos(z, w); putch(fill_char); } } } //-------------------------------------------------------------- void draw_pyramid(int x1, int y1, int height) { int x, y; for(y=y1; y<y1+height; y++) { int incr = y - y1; for(x=x1-incr; x<=x1+incr; x++) { set_cursor_pos(x, y); putch(fill_char); } } } //-------------------------------------------------------------- void set_fill_style(fstyle fs) { switch(fs) { case SOLID_FILL: fill_char = '\xDB'; break; case DARK_FILL: fill_char = '\xB0'; break; case MEDIUM_FILL: fill_char = '\xB1'; break; case LIGHT_FILL: fill_char = '\xB2'; break; case X_FILL: fill_char = 'X'; break; case O_FILL: fill_char = 'O'; break; } } //-------------------------------------------------------------- //msoftcon.h //declarations for Lafore's console graphics functions //uses Window's console functions #ifndef _INC_WCONSOLE //don't let this file be included #define _INC_WCONSOLE //twice in the same source file #include <windows.h> //for Windows console functions #include <conio.h> //for kbhit(), getche() #include <math.h> //for sin, cos enum fstyle { SOLID_FILL, X_FILL, O_FILL, LIGHT_FILL, MEDIUM_FILL, DARK_FILL }; enum color { cBLACK=0, cDARK_BLUE=1, cDARK_GREEN=2, cDARK_CYAN=3, cDARK_RED=4, cDARK_MAGENTA=5, cBROWN=6, cLIGHT_GRAY=7, cDARK_GRAY=8, cBLUE=9, cGREEN=10, cCYAN=11, cRED=12, cMAGENTA=13, cYELLOW=14, cWHITE=15 }; //-------------------------------------------------------------- void init_graphics(); void set_color(color fg, color bg = cBLACK); void set_cursor_pos(int x, int y); void clear_screen(); void wait(int milliseconds); void clear_line(); void draw_rectangle(int left, int top, int right, int bottom); void draw_circle(int x, int y, int rad); void draw_line(int x1, int y1, int x2, int y2); void draw_pyramid(int x1, int y1, int height); void set_fill_style(fstyle); #endif /* _INC_WCONSOLE */

Share this post


Link to post
Share on other sites
Advertisement
The j problem seems related to this.


for(int j=0; j<width; j++) //string of squares
temp[j] = fill_char;
temp[j] = 0; //null


Which is translated into:

for(int j=0; j<width; j++) //string of squares
{
temp[j] = fill_char;
}
temp[j] = 0; //null

J isn't defined outside that for loop.

I don't know what this code is supposed to do but if width is at least 1, try with:


for(int j=0; j<width; j++) //string of squares
temp[j] = fill_char;

temp[width-1] = 0; //null


As for the other problem you are using a constant char array instead of a pointer to a wide char string. Look for conversion functions

Hope this helps. :)

Share this post


Link to post
Share on other sites
Quote:
Original post by ryumeijin
/error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


Your project is set up to use unicode. Either use wide characters, or set your project to use multi-byte character set (this option is in the project properties in Visual Studio).

Share this post


Link to post
Share on other sites
what i did to the j problem was:

for(int j=0; j<width; j++) //string of squares
{
temp[j] = fill_char;
temp[j] = 0; //null
}

don't really know if that is correct but the program seems to be working now.

also i googled the other problem and found out that i should use 'CreateFileA' instead of 'CreateFile'. using devc++, using CreateFile is alright. maybe because dev c++ is outdated..

btw thanks! :D

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!