LINUX.ORG.RU

Работа со строками


0

0

Только начал изучать CPP. И вот возникли проблемы.

// extensions.cpp

// Расширения OpenGL

#include <stdio.h>

#include <string.h>

#include <gl.h>

int main() {

char *extensions;

extensions=strdup((char *) glGetString(GL_EXTENSIONS));

int len=strlen(extensions);

for (int i=0; i<len; i++)

if (extensions[i]==' ') extensions[i]='\n';

printf("%s\n", extensions);

return 0;

}

Компилирую так:

g++ -I/usr/include/GL -L/usr/X11R6/GL -lGL extensions.cpp

./a.out

Segmentation fault

Что не верно в программе?

Да, кстати,

$ cat /usr/include/GL/gl.h | grep 'glGetString'

GLAPI const GLubyte* GLAPIENTRY glGetString( GLenum name );

$ cat /usr/include/GL/gl.h | grep 'typedef' | grep 'GLubyte'

typedef unsigned char GLubyte; /* 1-byte unsigned */

Видно проблема в самом обращении к строкам...

Помогите пожалуйста!

Ответ на: комментарий от bd

отладчик плох уже тем, что приучает думать задним умом. ошибки надо видеть в коде.

eXOR ★★★★★
()

По всей видимости glGetString() вернул NULL или чёто подобное

cvv ★★★★★
()

1. проверяй на NULL то что обрабатываешь
2. strdup сделал, а free кто будет делать?
3. то что ты пишешь - это не C++, а C и писать нужно соответственно декларации переменных в начале и собирать не g++, а gcc ;).

eXOR ★★★★★
()

>(char *) glGetString(GL_EXTENSIONS)

может быть NULL - лучше проверить

>extensions=strdup((...

аналогично - проверь

вылетает либо на strlen, либо на strdup - что тебе покажет gdb.

и зачем тут тебе плюсы ? давить такое ногами!

alphex_kaanoken ★★★
()
Ответ на: комментарий от mojoholder

>А Вы уверены, что строка от ОпенГЛ не есть read-only?

а где вы увидели, что ее пытаются изменять?

Dead ★★★★
()

Последовал вашему совету и переписал программу (на C :-) ). Оказывается лоханулся сам, т.к. OpenGL не инициализировал. Вот код изменённой программы

/* extensions.c */

/* Расширения OpenGL */

#include <stdio.h> /* STanDard I/O header*/

#include <string.h> /* String-operation header */

#include <GL/gl.h> /* Open GL header*/

#include <SDL.h> /*SDL header*/

int main() {

SDL_Surface *screen; /* поверхность - экран */

int i, len; /* вспомогательные переменные */

char *extensions; /* строка расширений */

SDL_Init(SDL_INIT_VIDEO); /* Инициализируем видеоподсистему SDL */

screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); /* Пытаемся установить режим */

if (!screen) { /* Проверяем на ошибку */

fprintf(stderr, "Couldn't set 640x480 Open GL video mode: %s\n", SDL_GetError());

SDL_Quit(); /* Завершаем SDL */

exit(2); /* Возвращаем код ошибки */

}

extensions = (char *) glGetString(GL_EXTENSIONS); /* Берём строку расширений */

len = strlen(extensions); /* Узнаём длину */

for (i = 0; i < len; i++)

if (extensions[i] == ' ') extensions[i] = '\n'; /* Заменяем все пробелы на переводы переводы строк */

printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); /* Карта */

printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); /* Версия OpenGL */

printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); /* Изготовитель */

printf("GL_EXTENSIONS = \n{\n%s}\n", extensions); /* Расширения */

SDL_Quit(); /* Выходим */

return 0; /* Следуя стандарту ANSI C возвращаем 0 */

}

Результаты работы на моём GeForce2 MX 400

GL_RENDERER = GeForce2 MX/AGP/SSE2

GL_VERSION = 1.5.2 NVIDIA 66.29

GL_VENDOR = NVIDIA Corporation

GL_EXTENSIONS =

{

GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shader_objects GL_ARB_shading_language_100 GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_texture_rectangle GL_ARB_transpose_matrix GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_window_pos GL_S3_s3tc GL_EXT_texture_env_add GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_clip_volume_hint GL_EXT_compiled_vertex_array GL_EXT_Cg_shader GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_multi_draw_arrays GL_EXT_packed_pixels GL_EXT_paletted_texture GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shared_texture_palette GL_EXT_stencil_wrap GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_object GL_EXT_vertex_array GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL_NV_blend_square GL_NV_fence GL_NV_fog_distance GL_NV_light_max_exponent GL_NV_packed_depth_stencil GL_NV_pixel_data_range GL_NV_point_sprite GL_NV_register_combiners GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_NV_texture_rectangle GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_NV_vertex_program1_1 GL_SGIS_generate_mipmap GL_SGIS_multitexture GL_SGIS_texture_lod GL_SUN_slice_accum

}

Огромное спасибо всем за советы.

Rubystar ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.