编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   

 Wiki.Wiki.   博客博客   搜索搜索   图灵图灵   聊天室  成员成员 
 检查控制台鼠标/键盘输入后,程序崩溃
指数 -> 编程,C ++ -> C ++帮助
查看上一个主题 可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
HRI.




邮政发布: 2011年4月27日星期三:下午9:38  帖子主题:检查控制台鼠标/键盘输入后的程序崩溃

我使用GNU G ++编译器(C :: B的默认值)。

首先,这是一个小型连接4游戏。我正在尝试实现的是让用户按一个键(延续键命中为1-7时,忽略所有其他人)或在他们想要的列的列中单击电路板内。如果我单击有效位置或按有效键,则它只崩溃:/

只需使用以下代码的键盘输入完全良好:

C ++:

char列= 空值; //用于用户输入的字符
COUT. << “输入列(1 to 7): "; //输出提示

尽管 (列= getch.()) //获取按键
{
        如果 ((柱子) >= 49 && (柱子) <= 55) //如果字符为1到7
        {
            系统 (“cls”); //清除屏幕
            返回 (柱子) - 49; //返回0到6,列输入的列减1
            休息; //循环退出
        } // 万一
} //结束时


现在请注意,以下是有点杂乱。我刚刚添加,而不是清洁,直到它有效。此外,我很确定其中一些是c,但是检查鼠标的位置以及在我做的测试程序中单击左按钮时的左按钮的位置。

C ++:

// InputColumn.()
{
   手柄= getstdhandle (std_input_handle.); //用于窗口句柄
    INPUT_RECORD buffer [128]; //缓冲区存储记录
    DWORD numRead; //读取的记录数量
   手柄CURSOR = GETSTDHANDLE (std_output_handle.); //掌握到光标(the flashing one)
    COORD point; // 一个点
    point.X = 0; //左列
    point.Y = 15; //经过其他图形

    POINT pos; // 一个点
    RECT rec; // 4名成员:顶部,左,底部,右(用于窗口位置)
   HWND HWND = GetConsoleWindow(); //获取控制台窗口的句柄(我不确定手是不是)

    GetCursorPos (&pos); //获得鼠标位置(这是为了实验,在那里的角度来看)
    GetWindowRect (HWND,&rec); //获得窗口位置

    string title= ::㈡egertostring. (p。x - rec.剩下 - 6); //窗口标题以光标的x坐标为启动
    title += “|”; //添加分隔符
    title += ::㈡egertostring. (p。y - rec.最佳 - 32); //添加y coord
    SetConsoleTitle (标题。C_STR.()); //设置标题

    SetConsoleMode (手,enable_mouse_input.); //允许鼠标输入
   setConsolecursporation. (光标,点); //将光标位置设置为以下所有文本

    char列= 空值; //用于用户输入的字符
    COUT. << “输入列(1 to 7): "; //输出提示

    尽管 (1) // 无限循环
    {
        ReadConsoleInput (手,缓冲, 128, &numRead); //读取输入缓冲区

        为了 ( 我= 0;一世< numRead; ++i) //通过读取记录
        {
            转变 (缓冲[i].事件类型) //基于事件类型做出决定
            {
                案件 MOUSE_EVENT: //如果鼠标事件
                    MouseProc (缓冲 [i].事件.鼠标文档, 柱子); //调用鼠标过程
                    休息; //退出交换机

                案件 KEY_EVENT: //如果键盘事件
                    KeyProc (缓冲 [i].事件.关键词, 柱子); //呼叫键盘程序
                    休息; //退出交换机
            } //结束开关
        } //结束

        如果 ((柱子) >= 49 && (柱子) <= 55) //如果字符为1到7
        {
            系统 (“cls”); //清除屏幕
            返回 (柱子) - 49; //返回0到6,列输入的列减1
            休息; //循环退出
        } // 万一
    } //结束时
} //结束功能


C ++:

// mouseproc.(使用mouse_event_record和char& (the column))

    POINT pos; // 一个点
    RECT rec; //直到交换机是从之前的一个点左转
   HWND HWND = GetConsoleWindow();

    GetCursorPos (&pos);
    GetWindowRect (HWND,&rec);

    string title= ::㈡egertostring. (p。x - rec.剩下 - 6);
    title += “|”;
    title += ::㈡egertostring. (p。y - rec.最佳 - 32);
    SetConsoleTitle (标题。C_STR.());

    转变 (鼠。dwbuttonstate.) //检查鼠标的状态
    {
        案件 from_left_1st_button_pression.: //如果按下按钮
        {
            XCOORD.= pos.x - rec.剩下 - 6; // xccord是鼠标相对于桌面减去窗口的左边边框负6窗口边缘
            ycoord.= pos.y - rec.最佳 - 32; // Ycoord是顶部边缘的鼠标的y位置减去顶部32

            如果 (XCOORD.> 23 && xCoord < 52 && yCoord < 153) //如果鼠标在第一列中
            {
                column = '1'; //将列的值设置为参数到'1'(记住用户正在按'1',不是'0')
                返回; //退出程序
            } // 万一

            如果 (XCOORD.> 52 && xCoord < 83 && yCoord < 153) //重复其余的其他列 (是的,我会在后来清理它)
            {
                column = '2';
                返回;
            }

            如果 (XCOORD.> 83 && xCoord < 116 && yCoord < 153)
            {
                column = '3';
                返回;
            }

            如果 (XCOORD.> 116 && xCoord < 148 && yCoord < 153)
            {
                column = '4';
                返回;
            }

            如果 (XCOORD.> 148 && xCoord < 179 && yCoord < 153)
            {
                column = '5';
                返回;
            }

            如果 (XCOORD.> 179 && xCoord < 209 && yCoord < 153)
            {
                column = '6';
                返回;
            }

            如果 (XCOORD.> 209 && xCoord < 240 && yCoord < 153)
            {
                column = '7';
                返回;
            }
            休息;
        }
    }

    column = 1; //如果以上都不是,则将列的int值设置为1
}


C ++:

// keyproc.(拍摄key_event_record和char&)

{
    如果 (钥匙。bkeydown.) //如果按下键
    {
        如果 (钥匙。wvirtualkeycode. ==. 0x31) //如果密钥代码是'1'的代码
        {
            column = '1'; //将列设置为“1”
            返回; //退出功能
        } // 万一

        如果 (钥匙。wvirtualkeycode. ==. 0x32) //重复其他列(我显然计划在清洁这个之后>.>)
        {
            column = '2';
            返回;
        }

        如果 (钥匙。wvirtualkeycode. ==. 0x33)
        {
            column = '3';
            返回;
        }

        如果 (钥匙。wvirtualkeycode. ==. 0x34)
        {
            column = '4';
            返回;
        }

        如果 (钥匙。wvirtualkeycode. ==. 0x35)
        {
            column = '5';
            返回;
        }

        如果 (钥匙。wvirtualkeycode. ==. 0x36)
        {
            column = '6';
            返回;
        }

        如果 (钥匙。wvirtualkeycode. ==. 0x37)
        {
            column = '7';
            返回;
        }
    }

    别的
    {
        column = 1; //将列设置为char(1)如果以上都不是
    }
}


询问您有任何问题。基本上是另一个工作的另一个,在控制台窗口中间绘制了一个ASCII框,然后像这样检查鼠标并在单击“他们单击”框中“或未单击”框中“时会拍摄消息框。那个人完全良好。

通过崩溃,我的意思是它出现了应用程序错误窗口,其中包含将报告发送到Microsoft并返回0xC0000005。

提前感谢任何帮助!



连接4.png.
 Description:
选择列时游戏的图片。
 Filesize:  8.54 KB
 Viewed:  6391 Time(s)

连接4.png.


赞助
赞助
赞助
赞助
魔鬼




邮政发布: 2011年4月28日星期六10:48  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

我不是C ++专家,但不应该是:

代码:
*列='1';


如果您尝试分配指针指向的值?
Crossley7.




邮政发布: 2011年4月30日星期六晚上7:00  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

我还没有用C ++做太多的游戏,因为我上学期推出自己,并且大多是Dwite风格的问题和数学相关的程序(即要分解),但我确实写了一个国际象棋计划,它可能会帮助和清理您的代码很多,如果你检查了SDL。它需要下载,但使事情更轻松地专门鼠标​​事件,并且有简单的教程如何使用它。它处理1个变量中的所有事件。我没有使用STD GUI,所以我不能真正帮助你,除了说尝试制作一个在控制台中运行的游戏的代码并不是很讨人喜欢,并限制你可以用外观做的事情。

如果你想让游戏看起来不错,你可以全力以赴。对不起,如果这篇文章没有使用
HRI.




邮政发布: 2011年5月01日星期日7:42 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

对不起,我没有能够检查这一点。

@demonwasp:当我指定char&parameter时,我正在做什么,而不是使编译器副本发送到参数中的函数,发送实际对象本身。在这种情况下,它将发送相同的Char变量“列”,它在另一个功能中使用,而无论对其进行任何更改。这是整个连接4程序设置的方式,沿着功能从函数传递到功能,因为我无法在命名空间中声明我需要的对象来工作。我会尝试指向指向指针,但事实上,你是正确的。 * *取消引用它,使其与地址中包含的值与地址本身相反。我认为这是伴随着&运算符的混淆也可用于引用变量的地址,但在这种情况下,它就会通过引用来传递,而不是按值传递。

@Crossley7:我还没有进入SDL,虽然我非常计划在不久的将来!这背后的推理是主要重点是在使其看起来不错的情况下获得实际的发动机和AI工作。这应该是一种非常简单的方法,为游戏添加一个简洁的选项,因为我们没有在课堂上进行任何图形或任何类型,并且我在业余时间探索了Windows API。我们没有出现明显,但我们将尝试在AI完成后看起来很好。我们最初正在考虑将其与Java应用程序联系起来,而在此过程中运行,请执行处理。这是一个整洁的想法,但学习一个C ++图形库可以走很长的路。我同意你的逻辑,因为我经常发现自己添加每一件小事,以使它看起来完美,就像我可以牢牢一样完美。
魔鬼




邮政发布: 孙5月01日2011年9:28 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

我的意思是:

代码:
列='1';


是错误的,因为它将列指针分配为“1”(值49,或0x00000031)。当您在接下来尝试解除列指针之后,您指向无效位置,因为您已覆盖指针的部分。这解释了崩溃,因为您正在进行无效的内存访问(分段故障/违规)。

正如我在第一个响应中的建议一样,正确的代码分配列要点的Char地址的值。您也可以使用(巧妙地不同):

代码:
列=&'1';


虽然我不建议您常常修改列在此类分配之后的值,但您将击中不同类型的崩溃(修改只读存储器)。
HRI.




邮政发布: 2011年5月02日星期一7:32 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

关于那个奇怪的事情是我拥有大多数其他功能,采用Char的争论&, Board &, Game &,无论我通过什么样的东西,但也许我永远不会改变任何一个o_o的情况。

我真的可以宣誓就会宣誓就宣传,当我们了解通过价值和通过引用以下代码工作(快速草案):
C ++:

空白adjone. ( &);

main()
{
  X = 0;
  COUT. << x;
  addOne (x);
  COUT. << x;
}

空白adjone. ( &num)
{
  ++num;
}

C ++:

输出:
0
1


并使用指针逻辑,这不是等同于:
C ++:

空白adjone. ( *);

main()
{
  X = 0;
  COUT. << x;
  addOne (&x); //这是我相信微软的方式
  COUT. << x;
}

空白adjone. ( *num)
{
  ++*num;
}


我所说的是,当我传入列时,它应该传递实际变量的值,这可以像我一样改变,就像函数根本不是一个功能一样,但粘贴到调用它的其他功能中。如果addone示例工作(我确定当我尝试某种东西时它确信它),那么这应该同样地工作。无论如何,我现在有一点时间,我会用它尝试几件事,让你知道会发生什么。
HRI.




邮政发布: 2011年5月02日7:58 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

好的,我将参数更改为char *列,每次列分配了一个值我在前面放置一个值。此外,我为这两个程序放了一个&前面的参数列。它仍然做同样的事情。

它没有简单地在前面施加*,因为我相信没有地址开始。

以这种方式想到(忘记某些语法问题):
C ++:

//通过价值
空白adjone. (mynum)
==.
空白adjone. (myint * num = 新的 MyInt) //创建类型Myint的新对象以在功能中使用
......
删除 num;
---------- - --------------

空白adjone. (my&num)
==.
空白adjone. (数字) //我不是绝对牢固的编译器跟踪所有变量,但它将通过实际的变量地址或无论如何,而不是分配不同的内存块并以后将其解除分配


下一个测试,虽然我讨厌说,不是使用新程序的活动...... DUH DUH
HRI.




邮政发布: 2011年5月02日星期一8:10 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

是的,Windows不喜欢你取出他们的程序。我刚刚成功地制作鼠标输入不起作用,并且键输入做同样的事情lol
赞助
赞助
赞助
赞助
魔鬼




邮政发布: 2011年5月02日10:46 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

我没有花时间破译你上面所说的一切。你应该做的是:

代码:

空白附加物( int *num ) {
    ++(*num);
}


您致电的:
代码:

㈡ foo = 1;
adjone.( &foo );
// foo现在等于2

// 或者
㈡ * bar;
*酒吧= 3;
adjone.( bar );
// *栏现在等于4
HRI.




邮政发布: 星期四,2011年05日6:34 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

我尝试将所有内容更改为您的第一个解决方案并提供地址参数,但同样的事情发生了。
HRI.




邮政发布: 星期四05,201:下午6:57  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

Welllll .......我刚刚采取了这个代码,并在一个单独的程序中画出一个通用的空板并输出返回值。猜猜是什么,一切都在罚款:s

因此,此问题不是函数采用参数或更改列的方式,但如何在游戏中实现。

如果我注意到其他任何东西,我会回来。



指针和地址函数.cpp
 Description:
在单独的源代码中的工作版本。

下载
 Filename:  指针和地址函数.cpp
 Filesize:  7.42 KB
 Downloaded:  249 Time(s)

HRI.




邮政发布: 星期四,2011年05日8:03 PM  帖子主题:RE:检查控制台鼠标/键盘输入后的程序崩溃

爆炸新闻:
我不太确定它如何到达那里,但是
C ++:

尽管 (列= getch.())

(这是我用于键盘输入的风格)应该是
C ++:

尽管 (1)

That explains why the mouse wasn't working at all and why the keyboard just ended up making it confused >.>

现在出于某种原因,它没有添加任何令牌......我希望这很容易解决!

编辑:
它仍然表现得好像令牌被丢弃在那里,它只是没有向他们展示。我想我很近!如果我打算在其他地方添加鼠标能力,这是一件好事。它可以为程序添加这么多的香料,并且真的没有足够的时间来学习图形库。仍然需要做AI ...

编辑:
Heh Heh ......当我将该字符传送到测试程序时,它必须意外地改变了它的地方......
Stupid me >.>
从上一个显示帖子:   
   指数 -> 编程,C ++ -> C ++帮助
查看上一个主题 告诉一个朋友可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 12 Posts ]
跳到:   


Style:  
搜索: