そうだったんですか、ただいま、もし画面外に出たら弾を消すという作業をやっているのですが、
deletebullet(bullet_t *head)//外に出た弾を消すという関数を使ったとたんにアクセス違反となるのですが
どうすればいいでしょうか?おそらくアドレス関係だと思いますがどうすればいいでしょうか?
#include "DxLib.h"
#include <string.h> /* memsetを使うため */
#include <math.h>
//円周率
#define PI 3.14159265358979323846
int Key[256];
int image[16];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}
struct bullet_t{
struct bullet_t *next; /* 次の構造体変数のアドレス */
struct bullet_t *back; /* 前の構造体変数のアドレス(代入はしているけど未使用) */
double x,y; //座標
double spd;//スピード
double angle;//角度
int flag;
};
bullet_t bullet;
void Bullet_draw(bullet_t *head){
bullet_t *p;
if(head->next!=NULL){//allDeletebullet関数直後に描かないようにする
for(p=head->next;p!=head;p=p->next)
{
if(p->flag==1){//アクセス違反が発生
p->x+=cos(p->angle)*(p->spd);
p->y+=sin(p->angle)*(p->spd);
DrawRotaGraphF( (float)p->x , (float)p->y , 1.0 , p->angle, image[8] , TRUE );
}
}
}
}
void allDeletebullet(bullet_t *head)
{
bullet_t *p, *tmp;
if(head->next!=NULL){
for (p=head->next;p!=head;)
{
tmp = p;
p=p->next;
free(tmp);
}
p->next=NULL;//pがheadと一緒のアドレスになったときにその先のアドレスを
//NULLにする。
}
}
void deletebullet(bullet_t *head)//外に出た弾を消す
{
bullet_t *p, *tmp;
//pはhead->nextからpと同じアドレスになるまでループ
if(head->next!=NULL){
for(p=head->next;p!=head;){
if(p->flag==1){
if(p->x<0 || p->x<=640 || p->y<=0 || p->y>=640){
tmp = p;//tmpをpのアドレスに
p=p->next;//pのアドレスをp->nextにする。
free(tmp);//tmp(昔のp)を解放
}
}
}
}
}
int bullet_data_set(bullet_t *p,double x,double y ,double angle,double spd){
bullet_t *tmp;
tmp = (bullet_t*)malloc(sizeof(bullet_t));
//要素が存在した場合
if(p->next!=NULL)
{
tmp->next=p->next;
/*:*/tmp->back=p;
p->next=tmp;
/*:*/p->back=tmp->next;
tmp->flag=1;
tmp->x=x;
tmp->y=y;
tmp->spd=spd;
tmp->angle=angle;
}
else//要素がない場合
{
tmp->next=p;//pのアドレスをtmp->nextへ
/*:*/tmp->back=p;
p->next=tmp;//tmpのアドレスをp->nextへ
/*:*/p->back=tmp;
tmp->flag=1;
tmp->x=x;
tmp->y=y;
tmp->spd=spd;
tmp->angle=angle;
}
return 0;
}
void ini(){
memset(&bullet,0,sizeof(bullet_t));
bullet.next=NULL;
bullet.back=NULL;
bullet_data_set(&bullet,80,90,PI,0);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
ini();
bullet_data_set(bullet.next,240,77,PI/2,3);
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
if(Key[KEY_INPUT_Z]==1)
deletebullet(&bullet);
if(Key[KEY_INPUT_X]==1)
allDeletebullet(&bullet);
Bullet_draw(&bullet);
ScreenFlip();
}
DxLib_End();
return 0;
}