QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1504|回复: 27

一个奇怪的问题,请高手帮忙解决一下

[复制链接]
发表于 2004-7-22 16:05:35 | 显示全部楼层 |阅读模式
我写了一个程序,其中调用了sdl库,编译通过了,可是运行可执行文件的时候屏幕一闪就消失了,接着在终端显示下面信息
Fatal signal: Segmentation Fault (SDL Parachute Deployed)
怎么回事呢?应该如何解决
谢谢
发表于 2004-7-22 19:45:49 | 显示全部楼层
有段错误撒,原因很多。具体看你的代码啰。
回复

使用道具 举报

 楼主| 发表于 2004-7-23 08:56:16 | 显示全部楼层
#include <stdlib.h>
#include <SDL.h>
void draw();
void putpixel(SDL_Surface *surface,int x,int y,Uint32 color);

int x;
int y;
Uint32 color;

main()
{ draw();}
void draw(SDL_Surface *surface)
{int i;
     if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
        fprintf(stderr, "无法初始化SDL: %s\n", SDL_GetError());
        exit(1);}
for(i=0;i<10;i++){putpixel(surface, x,y,color);
x+=2;
y+=2;}}

void putpixel(SDL_Surface *surface,int x,int y,Uint32 color)
{
  Uint16 *bufp;
  if(SDL_MUSTLOCK(surface)){
    if(SDL_LockSurface(surface)<0)return;
  }
  bufp=(Uint16 *)surface->pixels+y*surface->pitch/2+x;
  *bufp=color;
  SDL_UpdateRect(surface,x,y,1,1);
  if(SDL_MUSTLOCK(surface)){
    SDL_UnlockSurface(surface);
  }
}
就是这段,很简单的画点的程序,请帮忙诊断一下
回复

使用道具 举报

发表于 2004-7-23 22:22:08 | 显示全部楼层
用SDL_Init()初始化以后还要用SDL_SetVideoMode()来设置显示模式,然后才能绘图。即使是这样,也会很快执行完一闪后又退出,一般是要延迟一段时间或等待按键再退出。
回复

使用道具 举报

 楼主| 发表于 2004-7-24 09:32:19 | 显示全部楼层
我按照你说的在初始化的后面加上
screen=SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);
但是运行后还是出现下面这句话
Fatal signal: Segmentation Fault (SDL Parachute Deployed)
郁闷ing
回复

使用道具 举报

发表于 2004-7-24 14:09:30 | 显示全部楼层
哪儿有screen?
请把改过的程序贴上来,顺便看看你的[code:1]bufp=(Uint16 *)surface->pixels+y*surface->pitch/2+x;
*bufp=color;[/code:1]有没有问题。
回复

使用道具 举报

发表于 2004-7-24 23:18:50 | 显示全部楼层
在main()中调用draw()要给出绘图表面的参数呀,另需给颜色color设值:
color=SDL_MapRGB(background->format,200,200,200);
然后再试试。

别忘了screen在使用前要定义。
回复

使用道具 举报

 楼主| 发表于 2004-7-25 10:19:19 | 显示全部楼层
绘图表面的参数就是x,y那些吧,我都给了,而且也加了color=SDL_MapRGB(background->format,200,200,200);
定义都加了,不然编译不能通过的.
可是运行可执行文件后还是出现那句话啊,要不你在你的机上试试?我怀疑是机的问题.
谢谢
回复

使用道具 举报

 楼主| 发表于 2004-7-25 10:20:30 | 显示全部楼层
这是我改过的程序
#include <stdlib.h>
#include <SDL.h>

void putpixel(SDL_Surface *surface,int x,int y,Uint32 color);
SDL_Surface *screen;
int x;
int y;
Uint32 color;
SDL_Surface *surface;
SDL_Surface *background;
main()
{    int i;
     if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
        fprintf(stderr, "无法初始化SDL: %s\n", SDL_GetError());
        exit(1);}

  screen=SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);
  /*if(screen==NULL){
    fprintf(stderr,"Can't set mode 640x480:%s\n",SDL_GetError());
    exit(1);*/
  color=SDL_MapRGB(background->format,200,200,200);
for(i=0;i<10;i++){putpixel(surface, x,y,color);
x+=2;
y+=2;}}

void putpixel(SDL_Surface *surface,int x,int y,Uint32 color)
{
  Uint16 *bufp;
  if(SDL_MUSTLOCK(surface)){
    if(SDL_LockSurface(surface)<0)return;
  }
  bufp=(Uint16 *)surface->pixels+y*surface->pitch/2+x;
  *bufp=color;
  SDL_UpdateRect(surface,x,y,1,1);
  if(SDL_MUSTLOCK(surface))
    {SDL_UnlockSurface(surface);}}
回复

使用道具 举报

发表于 2004-7-25 13:13:50 | 显示全部楼层
在main()中调用putpixel()时给出绘图面呀,在你的代码中那就是screen:
putpixel(screen,x,y,color);

比如你帖出的第一个程序,draw(SDL_Surface *surface)明明需要一个参数,可是你在main()中却不带参数就调用它。

多看看C基础知识。
回复

使用道具 举报

 楼主| 发表于 2004-7-26 09:12:47 | 显示全部楼层
明白了,可是我第二个程序里面没有这样的问题啦,参数都加上去了,编译也通过了,可是就是不行
能不能麻烦你把我的程序在你的机上跑一次,谢谢
回复

使用道具 举报

发表于 2004-7-26 13:50:41 | 显示全部楼层
看你的[code:1] color=SDL_MapRGB(background->format,200,200,200); [/code:1]这句。background
回复

使用道具 举报

 楼主| 发表于 2004-7-26 17:20:41 | 显示全部楼层
这句有什么问题吗?
我前面已经定义啦   SDL_Surface *background;
如果不对应该怎么改呢?
如果改了这句就可以在你的机上可以运行了吗?
急用,先谢了
回复

使用道具 举报

发表于 2004-7-26 17:31:20 | 显示全部楼层
抱歉啊楼主,我一点也不懂sdl。但我运行调试的结果就说这句有问题(段错误)。你的background是不是要分配内存,初始化之类的?
回复

使用道具 举报

发表于 2004-7-27 00:15:18 | 显示全部楼层
再改,"color=SDL_MapRGB(background->format,200,200,200); "要写成
"color=SDL_MapRGB(screen->format,200,200,200); "。

你要看基础教程呀,光照抄不理解那是不成的,往往会造成参数误用。

SDL中文教程: http://www.libsdl.org/intro.cn/toc.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 17:58 , Processed in 0.099593 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表