Sign in to follow this  

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

This topic is 3307 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
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