如何在 C 中使用 extern SDL_Surface 数组?
How to extern SDL_Surface array in C?
我想将一个 SDL_Surface
数组从一个函数 (load_level
) 扩展到另一个函数 (initialize_balls
)。我不得不说 SDL_Surface
(brickim
) 是一个动态指针结构,它通过 malloc
函数在 load_level
函数内部定义并声明为 SDL_Surface **brickim
以及。当我尝试访问 initialize_balls
函数中的 brickim[0]->w
而不是 load_level
函数时,我遇到了分段错误。这是一段代码,希望你能帮我修复。
file1.c
#include <stdio.h>
#include <SDL.h>
SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );
void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
for (n=0;n < input.N;n++){
**brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
printf("%d\n",brickim[n]->w); /***access succesfully (returns 100 N times)***/
}
...
}}
SDL_Surface* load_map(char *map_name , int tran ){
SDL_Surface *temp,*map;
Uint32 colorkey;
printf("Loading bit map %s %d...\n",map_name,tran);
temp = SDL_LoadBMP(map_name);
if (temp == NULL){
printf("Unable to load bitmap: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
exit(0);
}else{
map = SDL_DisplayFormat(temp);
colorkey = SDL_MapRGB( map -> format, 132, 0, 12);
if ( tran==1 ) SDL_SetColorKey( map, SDL_SRCCOLORKEY, colorkey );
SDL_FreeSurface(temp);
}
return map;
}
file2.c
#include <SDL.h>
#include <stdlib.h>
#include <stdio.h>
extern SDL_Surface **brickim;/*brings brickim to this function*/
void initialize_balls()
{
printf("Into initialization :)\n ");
printf("%d \n",brickim[0]->w); /***returns segmentation fault***/
}
$./kuranes
Loading bit map brick1.bmp 1...
level image:) 100 (x10 times)
Into initialization :)
Violación de segmento (`core' generado)
当我使用一个用 gcc 编译的 SDL_Surface
时,一切都 运行 正常,但我需要动态地进行。我认为缺少一些非常基本的东西。
你的问题好像出在这里。您声明一个全局 brickim,这将是 extern 声明找到的内容。然后,您在 load_level 中声明一个 local brickim 变量。你可以在不同的作用域中声明一个同名的变量,但是全局的brickim不会在load_level中使用,局部的会。因此,当您对 local brickim 执行 malloc 时,您永远不会分配到全局 brickim - 因此如果您通过 extern 访问它,它将为 NULL 并且您将出现段错误.
SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );
void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
for (n=0;n < input.N;n++){
**brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
printf("%d\n",brickim[n]->w); /***access succesfully (returns 100 N times)***/
}
...
}}
编辑: 您可能想要检查整个分配的总体情况。我不熟悉 SDL_Surface 结构,但我认为它是 而不是 指针类型(它是一个通用结构)。您的分配实际上是在分配 N 个结构,但您在转换时就好像在将 N 指针 分配给 SDL_Surface 结构一样。不要施放 malloc。
如果你想要N个SDL_Surface个结构,你只需要有:
SDL_Surface * brickim = malloc(sizeof(SDL_Surface) * N)
如果你想要 N 个指向 SDL_Surface 结构的指针,你需要:
SDL_Surface ** brickim = malloc(sizeof(SDL_Surface *) * N)
for( i = 0; i < N; i++){
// you've only allocated an array of pointers so far, you now need
// allocate N structures
brickim[0] = malloc(sizeof(SDL_Surface));
}
我想将一个 SDL_Surface
数组从一个函数 (load_level
) 扩展到另一个函数 (initialize_balls
)。我不得不说 SDL_Surface
(brickim
) 是一个动态指针结构,它通过 malloc
函数在 load_level
函数内部定义并声明为 SDL_Surface **brickim
以及。当我尝试访问 initialize_balls
函数中的 brickim[0]->w
而不是 load_level
函数时,我遇到了分段错误。这是一段代码,希望你能帮我修复。
file1.c
#include <stdio.h>
#include <SDL.h>
SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );
void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
for (n=0;n < input.N;n++){
**brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
printf("%d\n",brickim[n]->w); /***access succesfully (returns 100 N times)***/
}
...
}}
SDL_Surface* load_map(char *map_name , int tran ){
SDL_Surface *temp,*map;
Uint32 colorkey;
printf("Loading bit map %s %d...\n",map_name,tran);
temp = SDL_LoadBMP(map_name);
if (temp == NULL){
printf("Unable to load bitmap: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
exit(0);
}else{
map = SDL_DisplayFormat(temp);
colorkey = SDL_MapRGB( map -> format, 132, 0, 12);
if ( tran==1 ) SDL_SetColorKey( map, SDL_SRCCOLORKEY, colorkey );
SDL_FreeSurface(temp);
}
return map;
}
file2.c
#include <SDL.h>
#include <stdlib.h>
#include <stdio.h>
extern SDL_Surface **brickim;/*brings brickim to this function*/
void initialize_balls()
{
printf("Into initialization :)\n ");
printf("%d \n",brickim[0]->w); /***returns segmentation fault***/
}
$./kuranes Loading bit map brick1.bmp 1... level image:) 100 (x10 times) Into initialization :) Violación de segmento (`core' generado)
当我使用一个用 gcc 编译的 SDL_Surface
时,一切都 运行 正常,但我需要动态地进行。我认为缺少一些非常基本的东西。
你的问题好像出在这里。您声明一个全局 brickim,这将是 extern 声明找到的内容。然后,您在 load_level 中声明一个 local brickim 变量。你可以在不同的作用域中声明一个同名的变量,但是全局的brickim不会在load_level中使用,局部的会。因此,当您对 local brickim 执行 malloc 时,您永远不会分配到全局 brickim - 因此如果您通过 extern 访问它,它将为 NULL 并且您将出现段错误.
SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );
void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
for (n=0;n < input.N;n++){
**brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
printf("%d\n",brickim[n]->w); /***access succesfully (returns 100 N times)***/
}
...
}}
编辑: 您可能想要检查整个分配的总体情况。我不熟悉 SDL_Surface 结构,但我认为它是 而不是 指针类型(它是一个通用结构)。您的分配实际上是在分配 N 个结构,但您在转换时就好像在将 N 指针 分配给 SDL_Surface 结构一样。不要施放 malloc。
如果你想要N个SDL_Surface个结构,你只需要有:
SDL_Surface * brickim = malloc(sizeof(SDL_Surface) * N)
如果你想要 N 个指向 SDL_Surface 结构的指针,你需要:
SDL_Surface ** brickim = malloc(sizeof(SDL_Surface *) * N)
for( i = 0; i < N; i++){
// you've only allocated an array of pointers so far, you now need
// allocate N structures
brickim[0] = malloc(sizeof(SDL_Surface));
}