Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: winboze в Aug 21, 2007, 02:44



Титла: Проблеми с sdl
Публикувано от: winboze в 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:
Някой ако има някаква идея какво става, да казва.


Титла: Проблеми с sdl
Публикувано от: rpetrov в Aug 21, 2007, 11:47
Вероятно някой (метод/функция) пише където не трябва.
Пускал ли си през "memory debugger" ( http://directory.fsf.org/devel/debug/ ) ?


Титла: Проблеми с sdl
Публикувано от: muxozavar в 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:


Титла: Проблеми с sdl
Публикувано от: winboze в Aug 21, 2007, 21:57
Шантава работа, стана със съвета на muxozavar. Незнаех, че има разлика.


Титла: Проблеми с sdl
Публикувано от: the_real_maniac в Aug 21, 2007, 23:44
хахах е ка да няма ралика бе момче :?

:)

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

Гледай сега ... указтелят сочи , нали така :)

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

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

и така:

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

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

ок :) ?

Такааа и сега , казваш на твоята програма/компилатор
от този адрес чети като стринг , какво прави :) ? :)

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

такаа :)

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

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

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

т.е

вместо:

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

ти казваш:

char[] = "wow";

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

char[] = "ohhhh";

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

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

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

char mystr[10] = "something";

myfunc(mystr);

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

двойно памет за нищо ;)

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

това е :)

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

хубаво е :) да има такива теми :)

Айде :-) чао засега.


Титла: Проблеми с sdl
Публикувано от: rpetrov в Aug 22, 2007, 15:16
Цитат (winboze @ Авг. 21 2007,21:57)
Шантава работа, стана със съвета на muxozavar. Незнаех, че има разлика.

:)

По-скоро, вече се инициализира SDL библиотеката и във втория проект, където е ставало бум-бам ;) .