Related
I am trying to compile the source code for the original doom as a way to learn C. I downloaded it from github and fixed an obvious mistake in i_video.c line 49 (errnos.h -> errno.h).
I now get this:
m_misc.c:257:5: warning: initialization from incompatible pointer type [enabled by default]
m_misc.c:257:5: warning: (near initialization for ‘defaults[14].location’) [enabled by default]
m_misc.c:257:5: error: initializer element is not computable at load time
m_misc.c:257:5: error: (near initialization for ‘defaults[14].defaultvalue’)
m_misc.c:264:35: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:264:5: error: initializer element is not constant
m_misc.c:264:5: error: (near initialization for ‘defaults[16].defaultvalue’)
m_misc.c:265:37: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:265:5: error: initializer element is not constant
m_misc.c:265:5: error: (near initialization for ‘defaults[17].defaultvalue’)
m_misc.c:288:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:288:5: error: initializer element is not constant
m_misc.c:288:5: error: (near initialization for ‘defaults[31].defaultvalue’)
m_misc.c:289:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:289:5: error: initializer element is not constant
m_misc.c:289:5: error: (near initialization for ‘defaults[32].defaultvalue’)
m_misc.c:290:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:290:5: error: initializer element is not constant
m_misc.c:290:5: error: (near initialization for ‘defaults[33].defaultvalue’)
m_misc.c:291:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:291:5: error: initializer element is not constant
m_misc.c:291:5: error: (near initialization for ‘defaults[34].defaultvalue’)
m_misc.c:292:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:292:5: error: initializer element is not constant
m_misc.c:292:5: error: (near initialization for ‘defaults[35].defaultvalue’)
m_misc.c:293:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:293:5: error: initializer element is not constant
m_misc.c:293:5: error: (near initialization for ‘defaults[36].defaultvalue’)
m_misc.c:294:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:294:5: error: initializer element is not constant
m_misc.c:294:5: error: (near initialization for ‘defaults[37].defaultvalue’)
m_misc.c:295:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:295:5: error: initializer element is not constant
m_misc.c:295:5: error: (near initialization for ‘defaults[38].defaultvalue’)
m_misc.c:296:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:296:5: error: initializer element is not constant
m_misc.c:296:5: error: (near initialization for ‘defaults[39].defaultvalue’)
m_misc.c:297:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:297:5: error: initializer element is not constant
m_misc.c:297:5: error: (near initialization for ‘defaults[40].defaultvalue’)
m_misc.c: In function ‘M_LoadDefaults’:
m_misc.c:395:5: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
make: *** [linux/m_misc.o] Error 1
in the m_misc.c file during this declaration on the lines that contain casts:
default_t defaults[] =
{
{"mouse_sensitivity",&mouseSensitivity, 5},
{"sfx_volume",&snd_SfxVolume, 8},
{"music_volume",&snd_MusicVolume, 8},
{"show_messages",&showMessages, 1},
#ifdef NORMALUNIX
{"key_right",&key_right, KEY_RIGHTARROW},
{"key_left",&key_left, KEY_LEFTARROW},
{"key_up",&key_up, KEY_UPARROW},
{"key_down",&key_down, KEY_DOWNARROW},
{"key_strafeleft",&key_strafeleft, ','},
{"key_straferight",&key_straferight, '.'},
{"key_fire",&key_fire, KEY_RCTRL},
{"key_use",&key_use, ' '},
{"key_strafe",&key_strafe, KEY_RALT},
{"key_speed",&key_speed, KEY_RSHIFT},
// UNIX hack, to be removed.
#ifdef SNDSERV
{"sndserver", (int *) &sndserver_filename, (int) "sndserver"},
{"mb_used", &mb_used, 2},
#endif
#endif
#ifdef LINUX
{"mousedev", (int*)&mousedev, (int)"/dev/ttyS0"},
{"mousetype", (int*)&mousetype, (int)"microsoft"},
#endif
{"use_mouse",&usemouse, 1},
{"mouseb_fire",&mousebfire,0},
{"mouseb_strafe",&mousebstrafe,1},
{"mouseb_forward",&mousebforward,2},
{"use_joystick",&usejoystick, 0},
{"joyb_fire",&joybfire,0},
{"joyb_strafe",&joybstrafe,1},
{"joyb_use",&joybuse,3},
{"joyb_speed",&joybspeed,2},
{"screenblocks",&screenblocks, 9},
{"detaillevel",&detailLevel, 0},
{"snd_channels",&numChannels, 3},
{"usegamma",&usegamma, 0},
{"chatmacro0", (int *) &chat_macros[0], (int) HUSTR_CHATMACRO0 },
{"chatmacro1", (int *) &chat_macros[1], (int) HUSTR_CHATMACRO1 },
{"chatmacro2", (int *) &chat_macros[2], (int) HUSTR_CHATMACRO2 },
{"chatmacro3", (int *) &chat_macros[3], (int) HUSTR_CHATMACRO3 },
{"chatmacro4", (int *) &chat_macros[4], (int) HUSTR_CHATMACRO4 },
{"chatmacro5", (int *) &chat_macros[5], (int) HUSTR_CHATMACRO5 },
{"chatmacro6", (int *) &chat_macros[6], (int) HUSTR_CHATMACRO6 },
{"chatmacro7", (int *) &chat_macros[7], (int) HUSTR_CHATMACRO7 },
{"chatmacro8", (int *) &chat_macros[8], (int) HUSTR_CHATMACRO8 },
{"chatmacro9", (int *) &chat_macros[9], (int) HUSTR_CHATMACRO9 }
};
Is this an incompatibility with modern compilers? Has anyone managed to get passed it?
If you are using 64-bit compiler, try to use the -m32 flag and link with -L/usr/lib/i386-linux-gnu/ for 32-bit libraries.
By the way, if you will compile this source, you will still have an issue with running as this build needs 320x200 screen resolution. Otherwise it will not run.
I am working on the SDL port of the DOOM, so you can try my source from the GitHub.
You will need to install SDL library to run it. Also, there is no sound there.
As for the initializer list error, it's right there - the elements in the initializer lists are not constant expressions. Take a look at this:
{"mousedev", (int*)&mousedev, (int)"/dev/ttyS0"},
I guess mousedev is another variable. There you have it.
I can't remember now, but I think non-constants in initializer lists were introduced in one of the later C standards. Try making the compiler stick to a different one - I'd take a shot with C99.
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
The one about integer vs pointer size was correctly answered by Alex.
I am trying to compile the source code for the original doom as a way to learn C. I downloaded it from github and fixed an obvious mistake in i_video.c line 49 (errnos.h -> errno.h).
I now get this:
m_misc.c:257:5: warning: initialization from incompatible pointer type [enabled by default]
m_misc.c:257:5: warning: (near initialization for ‘defaults[14].location’) [enabled by default]
m_misc.c:257:5: error: initializer element is not computable at load time
m_misc.c:257:5: error: (near initialization for ‘defaults[14].defaultvalue’)
m_misc.c:264:35: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:264:5: error: initializer element is not constant
m_misc.c:264:5: error: (near initialization for ‘defaults[16].defaultvalue’)
m_misc.c:265:37: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:265:5: error: initializer element is not constant
m_misc.c:265:5: error: (near initialization for ‘defaults[17].defaultvalue’)
m_misc.c:288:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:288:5: error: initializer element is not constant
m_misc.c:288:5: error: (near initialization for ‘defaults[31].defaultvalue’)
m_misc.c:289:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:289:5: error: initializer element is not constant
m_misc.c:289:5: error: (near initialization for ‘defaults[32].defaultvalue’)
m_misc.c:290:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:290:5: error: initializer element is not constant
m_misc.c:290:5: error: (near initialization for ‘defaults[33].defaultvalue’)
m_misc.c:291:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:291:5: error: initializer element is not constant
m_misc.c:291:5: error: (near initialization for ‘defaults[34].defaultvalue’)
m_misc.c:292:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:292:5: error: initializer element is not constant
m_misc.c:292:5: error: (near initialization for ‘defaults[35].defaultvalue’)
m_misc.c:293:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:293:5: error: initializer element is not constant
m_misc.c:293:5: error: (near initialization for ‘defaults[36].defaultvalue’)
m_misc.c:294:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:294:5: error: initializer element is not constant
m_misc.c:294:5: error: (near initialization for ‘defaults[37].defaultvalue’)
m_misc.c:295:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:295:5: error: initializer element is not constant
m_misc.c:295:5: error: (near initialization for ‘defaults[38].defaultvalue’)
m_misc.c:296:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:296:5: error: initializer element is not constant
m_misc.c:296:5: error: (near initialization for ‘defaults[39].defaultvalue’)
m_misc.c:297:45: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
m_misc.c:297:5: error: initializer element is not constant
m_misc.c:297:5: error: (near initialization for ‘defaults[40].defaultvalue’)
m_misc.c: In function ‘M_LoadDefaults’:
m_misc.c:395:5: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
make: *** [linux/m_misc.o] Error 1
in the m_misc.c file during this declaration on the lines that contain casts:
default_t defaults[] =
{
{"mouse_sensitivity",&mouseSensitivity, 5},
{"sfx_volume",&snd_SfxVolume, 8},
{"music_volume",&snd_MusicVolume, 8},
{"show_messages",&showMessages, 1},
#ifdef NORMALUNIX
{"key_right",&key_right, KEY_RIGHTARROW},
{"key_left",&key_left, KEY_LEFTARROW},
{"key_up",&key_up, KEY_UPARROW},
{"key_down",&key_down, KEY_DOWNARROW},
{"key_strafeleft",&key_strafeleft, ','},
{"key_straferight",&key_straferight, '.'},
{"key_fire",&key_fire, KEY_RCTRL},
{"key_use",&key_use, ' '},
{"key_strafe",&key_strafe, KEY_RALT},
{"key_speed",&key_speed, KEY_RSHIFT},
// UNIX hack, to be removed.
#ifdef SNDSERV
{"sndserver", (int *) &sndserver_filename, (int) "sndserver"},
{"mb_used", &mb_used, 2},
#endif
#endif
#ifdef LINUX
{"mousedev", (int*)&mousedev, (int)"/dev/ttyS0"},
{"mousetype", (int*)&mousetype, (int)"microsoft"},
#endif
{"use_mouse",&usemouse, 1},
{"mouseb_fire",&mousebfire,0},
{"mouseb_strafe",&mousebstrafe,1},
{"mouseb_forward",&mousebforward,2},
{"use_joystick",&usejoystick, 0},
{"joyb_fire",&joybfire,0},
{"joyb_strafe",&joybstrafe,1},
{"joyb_use",&joybuse,3},
{"joyb_speed",&joybspeed,2},
{"screenblocks",&screenblocks, 9},
{"detaillevel",&detailLevel, 0},
{"snd_channels",&numChannels, 3},
{"usegamma",&usegamma, 0},
{"chatmacro0", (int *) &chat_macros[0], (int) HUSTR_CHATMACRO0 },
{"chatmacro1", (int *) &chat_macros[1], (int) HUSTR_CHATMACRO1 },
{"chatmacro2", (int *) &chat_macros[2], (int) HUSTR_CHATMACRO2 },
{"chatmacro3", (int *) &chat_macros[3], (int) HUSTR_CHATMACRO3 },
{"chatmacro4", (int *) &chat_macros[4], (int) HUSTR_CHATMACRO4 },
{"chatmacro5", (int *) &chat_macros[5], (int) HUSTR_CHATMACRO5 },
{"chatmacro6", (int *) &chat_macros[6], (int) HUSTR_CHATMACRO6 },
{"chatmacro7", (int *) &chat_macros[7], (int) HUSTR_CHATMACRO7 },
{"chatmacro8", (int *) &chat_macros[8], (int) HUSTR_CHATMACRO8 },
{"chatmacro9", (int *) &chat_macros[9], (int) HUSTR_CHATMACRO9 }
};
Is this an incompatibility with modern compilers? Has anyone managed to get passed it?
If you are using 64-bit compiler, try to use the -m32 flag and link with -L/usr/lib/i386-linux-gnu/ for 32-bit libraries.
By the way, if you will compile this source, you will still have an issue with running as this build needs 320x200 screen resolution. Otherwise it will not run.
I am working on the SDL port of the DOOM, so you can try my source from the GitHub.
You will need to install SDL library to run it. Also, there is no sound there.
As for the initializer list error, it's right there - the elements in the initializer lists are not constant expressions. Take a look at this:
{"mousedev", (int*)&mousedev, (int)"/dev/ttyS0"},
I guess mousedev is another variable. There you have it.
I can't remember now, but I think non-constants in initializer lists were introduced in one of the later C standards. Try making the compiler stick to a different one - I'd take a shot with C99.
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
The one about integer vs pointer size was correctly answered by Alex.
I'm trying to initialize an array of structures containing pointer on function :
typedef struct struct_actioncommand {
char *action;
void (*command)(my_type);
} type_actioncommand;
To initialize each pointer with its function name I'm using this method :
static const type_actioncommand g_cmd_tab[] = {
{"Action1", function1},
{"Action2", function2},
{"Action3", function3},
{NULL, NULL}
};
But it doesn't work.
When I try to compile with "gcc", I have the following message:
myfile.c:16:3: error: initialization from incompatible pointer type [-Werror]
{"Action1", function1},
^
myfile.c:16:3: error: (near initialization for g_cmd_tab[0].command) [-Werror]
myfile.c:17:3: error: initialization from incompatible pointer type [-Werror]
{"Action2", function2},
^
myfile.c:17:3: error: (near initialization for g_cmd_tab[1].command) [-Werror]
myfile.c:18:3: error: initialization from incompatible pointer type [-Werror]
{"Action3", function3},
^
myfile.c:18:3: error: (near initialization for g_cmd_tab[2].command) [-Werror]
cc1: all warnings being treated as errors
each function is defined according to this prototype :
void function1(my_type *var1);
I'm a little bit confuse now since I dont see how to fix my problem.
Any ideas?
In your struct, the command member:
void (*command)(my_type);
Has type "pointer to function which take a parameter of type my_type and returns void.
Your function:
void function1(my_type *var1);
Has type "function which takes a parameter of type my_type * and returns void.
The parameters of the function pointer don't match the parameters of the functions you assign to them. That makes the pointers incompatible.
To fix this, change the type of the function pointer to match the functions that are assigned to it:
void (*command)(my_type *);
I am trying to initialize an array of structs that contain an array. Looking at
this and
this,
I think a pretty reasonable attempt is this:
struct Score_t{
int * dice;
int numDice;
int value;
};
struct Score_t Scores[NUMSCORES] = {
[0]={{0,0,0},3,1000},
[1]={{1,1,1},3,200},
[2]={{2,2,2},3,300},
[3]={{3,3,3},3,400},
[4]={{4,4,4},3,500},
[5]={{5,5,5},3,600},
[6]={{0},3,100},
[7]={{4},3,50}
};
However I can't get this to compile. Do you have any ways to get this done?
Edit: Forgot the error message: (snipped)
[5]={{5,5,5},3,600},
^
greed.c:79:2: warning: (near initialization for ‘Scores[5].dice’) [enabled by default]
greed.c:79:2: warning: initialization makes pointer from integer without a cast [enabled by default]
greed.c:79:2: warning: (near initialization for ‘Scores[5].dice’) [enabled by default]
greed.c:79:2: warning: excess elements in scalar initializer [enabled by default]
greed.c:79:2: warning: (near initialization for ‘Scores[5].dice’) [enabled by default]
greed.c:79:2: warning: excess elements in scalar initializer [enabled by default]
greed.c:79:2: warning: (near initialization for ‘Scores[5].dice’) [enabled by default]
greed.c:80:2: warning: braces around scalar initializer [enabled by default]
int * can't be initialized with { } (not match)
So change to like this.
struct Score_t Scores[NUMSCORES] = {
[0]={(int[]){0,0,0},3,1000},
[1]={(int[]){1,1,1},3,200},
[2]={(int[]){2,2,2},3,300},
[3]={(int[]){3,3,3},3,400},
[4]={(int[]){4,4,4},3,500},
[5]={(int[]){5,5,5},3,600},
[6]={(int[]){0},3,100}, //It doesn't know the number of elements
[7]={(int[]){4},3,50} //change to [7]={(int[3]){4},3,50} or [7]={(int[]){4},1,50}
};
Parser.h
enum { PLUS, MINUS, DIVIDE, MULTIPLY, NUMBER, END } type;
int token;
/* parsing functions */
void parse_token (void);
Parser.c
void get_token (void)
{
token++;
parse_token(); /* LINE 11 */
}
void parse_token (void) /* LINE 14 */
{
if ( strchr ("1234567890.", token) )
type = NUMBER;
else if ( strchr ("+", token) )
type = PLUS;
else if ( strchr ("-", token) )
type = MINUS;
else if ( strchr ("/", token) )
type = DIVIDE;
else if ( strchr ("*",token) )
type = MULTIPLY;
else if ( token == '\0' )
type = END;
else
show_error(strcat("Couldn't parse token : ", token));
}
The Errors
parser.c:14:6: warning: conflicting types for ‘parse_token’ [enabled by default]
parser.c:11:2: note: previous implicit declaration of ‘parse_token’ was here
parser.c: In function ‘parse_token’:
parser.c:16:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:17:3: error: ‘type’ undeclared (first use in this function)
parser.c:17:3: note: each undeclared identifier is reported only once for each function it appears in
parser.c:17:10: error: ‘NUMBER’ undeclared (first use in this function)
parser.c:19:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:20:10: error: ‘PLUS’ undeclared (first use in this function)
parser.c:22:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:23:10: error: ‘MINUS’ undeclared (first use in this function)
parser.c:25:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:26:10: error: ‘DIVIDE’ undeclared (first use in this function)
parser.c:28:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:29:10: error: ‘MULTIPLY’ undeclared (first use in this function)
parser.c:32:10: error: ‘END’ undeclared (first use in this function)
parser.c: In function ‘show_error’:
parser.c:40:2: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
I'm utterly bamboozled. :(.
Any help?
One you get it to compile (by including the header, as Luchian Grigore said), you'll find that you can't do strcat() on a constant string.
The constant string is allocated in read-only memory, and can't be modified. And even if you could modify it, you would be overwriting other things in memory.
You're not including your header, so there's no way for the translation unit to know about the declarations of type and token.
You need:
#include "Parser.h"
at the beginning of the implementation file.