Автор Тема: Проблеми с sdl  (Прочетена 1634 пъти)

winboze

  • Напреднали
  • *****
  • Публикации: 242
    • Профил
    • WWW
Проблеми с sdl
« -: Aug 21, 2007, 02:44 »
Ето я ситуацията:
Две абсолютни идентични функции, в два проекта на KDevelop с абсолютно еднакви параметри на компилатора, и двете се компилират успешно. Обаче във втория проект при пускане дава Segmentation fault. Debugвах и излезе, че се дъни на SDL_DisplayFormat(). Проверих с ldd, и двете програми са линкнати за една и съща библиотека на SDL. Ето я и въпросната функция:
Примерен код
SDL_Surface *tcLoadImage(char f[])
 {
  SDL_Surface *loaded=NULL;
  SDL_Surface *optimized=NULL;
  loaded=IMG_Load(f);
  if(loaded!=NULL)
   {
    optimized=SDL_DisplayFormat(loaded);
    if(optimized!=NULL)
     {
      Uint32 colorkey=SDL_MapRGB(optimized->format, 0xFF, 0xFF, 0xFF);
      SDL_SetColorKey(optimized, SDL_SRCCOLORKEY, colorkey);
     }
    SDL_FreeSurface(loaded);
   }
  return optimized;

Тая фунцкия вече ще ме побърка  ':crazy:'
Някой ако има някаква идея какво става, да казва.
Активен

.: МРАЗЯ ПАКЕТНИ ЗАВИСИМОСТИ :.

rpetrov

  • Напреднали
  • *****
  • Публикации: 571
    • Профил
    • WWW
Проблеми с sdl
« Отговор #1 -: Aug 21, 2007, 11:47 »
Вероятно някой (метод/функция) пише където не трябва.
Пускал ли си през "memory debugger" ( http://directory.fsf.org/devel/debug/ ) ?
Активен

muxozavar

  • Напреднали
  • *****
  • Публикации: 497
  • Distribution: Debian Lenny / Fedora 11 x86_64 / Ubuntu 9.10 / Mac OS X 10.6.n
  • Window Manager: Gnome
    • Профил
Проблеми с sdl
« Отговор #2 -: Aug 21, 2007, 20:37 »
Примерен код

//
// Load image and optimized it
SDL_Surface *Screen::load_Image(string fileName)
{
   // The image that's loaded
   SDL_Surface *loadedImage = NULL;
   // The optimized surface that will be used
   SDL_Surface *optimizedImage = NULL;
   
   // Load the image file
   loadedImage = IMG_Load(fileName.c_str());
   if(loadedImage != NULL)
   {
      // Create an optimized surface
      optimizedImage = SDL_DisplayFormat(loadedImage);
      
      // Free the old surface
      SDL_FreeSurface(loadedImage);
      /*
      // If the image was optimzed
      if(optimizedImage != NULL)
      {
         // Set the color surface
         SDL_SetColorKey(optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY,
                  SDL_MapRGB(optimizedImage->format, 0xFF, 0xFF, 0xFF));
      }
      */
   }
   
   return optimizedImage;
}


Имам някакви съмнения, че char f[] трябва да бъде char *f
 ':ok:'
Активен

winboze

  • Напреднали
  • *****
  • Публикации: 242
    • Профил
    • WWW
Проблеми с sdl
« Отговор #3 -: Aug 21, 2007, 21:57 »
Шантава работа, стана със съвета на muxozavar. Незнаех, че има разлика.
Активен

.: МРАЗЯ ПАКЕТНИ ЗАВИСИМОСТИ :.

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблеми с sdl
« Отговор #4 -: Aug 21, 2007, 23:44 »
хахах е ка да няма ралика бе момче :?

'<img'>

Ок , сериозно, спокойно, горното хаха беше напълно дружелюбно

Гледай сега ... указтелят сочи , нали така '<img'>

ОК да кажем сочи адрес памет (не е NULL) , на този адрес да кажем имаме

първа клетка текущ адрес ,после нататък са друите все едно ++ ;-)

и така:

0x65 | 0x64 | 0x68 | 0x65 | 0x00

т.е '<img'> ако клетка 1-ва е номер 0x2ff384 от твоята физ. памет на PC-то , то последнат е 0x2ff388 ;-) '<img'>

ок '<img'> ?

Такааа и сега , казваш на твоята програма/компилатор
от този адрес чети като стринг , какво прави '<img'> ? '<img'>

Ми почва 0x65 май беше 'a' латинско '<img'>
и т.н, докато не срещне какво 0x00 -> \0 или нулиране на низа '<img'>

такаа '<img'>

За това на теб ти трябва точно указател !
Указател който да каже на този адрес ПОЧВА един СТРИНГ ! или нещо, което (се опитай) да покажеш като стринг '<img'>

А в твоят вариант какво казваш

искам един статичен масив, на КОЙТО ОБАЧЕ ти да определиш сам колко памет/място ти трябва за char-чета , защото аз искам така да ми е по-гъвкаво
аз да си сменям съобщението без проблем

т.е

вместо:

char[4]="wow"; // 3ch + \0 ;-)
char[3]="ohhhh"; // problem '<img'>

ти казваш:

char[] = "wow";

а като решиш да го променяш искаш да  е

char[] = "ohhhh";

Обаче в твоят случей Е ДРУГО !!!!! онова е за статични декларации + дефиниции в 99% от случеите '<img'>

даже си личи малко , че не знаеш на 100% как стоят нещата за предаване на аргумент и по-точно на масив или масив от данни, да кажем че имаш списък (линеен или нещо си , база данни) ?

какво ще правиш :? :-)

char mystr[10] = "something";

myfunc(mystr);

и прототип на функ : )
void myfunc(char newstr[10]);

двойно памет за нищо '<img'>

- е да , може да искаш да запазиш променливата от промени, но 60/40% от случеите искаш обработка '<img'> така че УКАЗТЕЛ '<img'>

това е '<img'>

успех и се радвам ,че напоследък виждам не просто въпроси за програмиране, ами че хората борят по открито (в БГ)
SDL, GTK, kernel-source/hack/modules ':p' '<img'> и т.н '<img'>

хубаво е '<img'> да има такива теми '<img'>

Айде :-) чао засега.
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

rpetrov

  • Напреднали
  • *****
  • Публикации: 571
    • Профил
    • WWW
Проблеми с sdl
« Отговор #5 -: Aug 22, 2007, 15:16 »
Цитат (winboze @ Авг. 21 2007,21:57)
Шантава работа, стана със съвета на muxozavar. Незнаех, че има разлика.

'<img'>

По-скоро, вече се инициализира SDL библиотеката и във втория проект, където е ставало бум-бам '<img'> .
Активен