crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
NordWest
  опции профиля:
сообщение 21.4.2009, 19:05
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Пишем программу в Qt. Начинали под винду, теперь есть непреодолимое желание использовать её ещё и под Линуксом, там более кросплатформ и всё такое... Но программа сопротивляется.

Вылетает она из библиотеки, которая позволяет работать со специальными графическими файлами. При открытии такого файла, т.е. при вызове метода fits_open_file() из этой библиотеки, программа вылетает, и если в релизе она это делает молча, то в дебуг-варианте в консоль выдается следующее:
CODE
Scope for 7037:
Symbol fptr is a variable with multiple locations, length 4.
Symbol imgtype is a variable with multiple locations, length 4.
Symbol status is a variable with multiple locations, length 4.
Symbol tstatus is a variable with multiple locations, length 4.
Symbol lngscale is a variable with multiple locations, length 4.
Symbol bscale is a variable with multiple locations, length 8.
Symbol bzero is a variable with multiple locations, length 8.
Symbol min_val is a variable in register st3, length 8.
Symbol max_val is a variable in register st1, length 8.
(gdb)
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)


Это как же понимать? Области переменных смешались?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2009, 20:35
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(NordWest @ 21.4.2009, 20:05) *
Начинали под винду, теперь есть непреодолимое желание использовать её ещё и под Линуксом,


А под виндой какой компилятор используется?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Пчол_*
сообщение 21.4.2009, 21:23
Сообщение #3





Гости








    


ты лучше код покажи а не результат: тк это обычная ошибка сегментации и причин возникновения куча
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Он_Же_*
сообщение 21.4.2009, 21:25
Сообщение #4





Гости








    


скорее всего неправльная работа с память: виндовый стиль программирования слишком расслабляет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Яже_*
сообщение 21.4.2009, 21:43
Сообщение #5





Гости








    


самая распространненая ошибка при работе с указателями и ссылками, хорошенько проверьте работу динамических элементов, особенно контейнеров и повышенное внимание параметрам функции
MVS + их компилер разрешает такие вещи от которых gcc жутко тянет блевать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 21.4.2009, 22:26
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(SABROG @ 21.4.2009, 21:35) *
Цитата(NordWest @ 21.4.2009, 20:05) *
Начинали под винду, теперь есть непреодолимое желание использовать её ещё и под Линуксом,


А под виндой какой компилятор используется?


mingw32-make

Цитата
ты лучше код покажи а не результат: тк это обычная ошибка сегментации и причин возникновения куча


fitsdata::fitsdata(QString fitsFileName)
{
...
       char *fname = fitsFileName.toAscii().data();
    fitsfile *fptr;//pointer ot FITSfile
    int status = 0;//status
    fits_open_file(&fptr, fname , READONLY,&status);
...
}


Объявление функции такое:
int ffopen(fitsfile **fptr, const char *filename, int iomode, int *status);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.4.2009, 22:34
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Вот твоя ошибка. Так делать категорически нельзя. fname у тебя невалиден.
Цитата(NordWest @ 21.4.2009, 23:26) *
char *fname = fitsFileName.toAscii().data();


подробно здесь

Сообщение отредактировал igor_bogomolov - 21.4.2009, 22:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2009, 22:59
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


По сути тут область видимости временного объекта ограниченна таким образом:
Цитата
char *fname = (fitsFileName.toAscii().data());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 21.4.2009, 23:30
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 21.4.2009, 23:34) *
Вот твоя ошибка. Так делать категорически нельзя. fname у тебя невалиден.
Цитата(NordWest @ 21.4.2009, 23:26) *
char *fname = fitsFileName.toAscii().data();


подробно здесь


Делал так:
QByteArray tmp = fitsFileName.toAscii();
const char *fname = tmp.data();


И так:
const char *fname = fitsFileName.toAscii().constData();


И так:
QByteArray tmp = fitsFileName.toAscii();
fits_open_file(&fptr, tmp.data() , READONLY,&status);


Но никак...
Так как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 21.4.2009, 23:35
Сообщение #10





Гости








    


а может дело в первом параметре функции ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 21.4.2009, 23:36
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ага, только теперь при дебуге выдает ещё и это:
Цитата
Program received signal SIGSEGV, Segmentation fault.
0x080df7bd in ffgiet (fptr=0x987b8e0, imgtype=0xbf827234, status=0xbf827220) at fitscore.c:7038
Program terminated with signal SIGSEGV, Segmentation fault.


А вот код, на который ошибка указывает:
    /* reset position to the correct HDU if necessary */
    if (fptr->HDUposition != (fptr->Fptr)->curhdu)
        ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status);
    else if ((fptr->Fptr)->datastart == DATA_UNDEFINED)
        if ( ffrdef(fptr, status) > 0)               /* rescan header */
            return(*status);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.4.2009, 23:38
Сообщение #12


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Гость_Гость_* @ 22.4.2009, 0:35) *
а может дело в первом параметре функции ?
А чем он тебе не нравится? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 21.4.2009, 23:39
Сообщение #13





Гости








    


fitsfile *fptr;//pointer ot FITSfile
ты уверен что под него не надо память выделять???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 21.4.2009, 23:43
Сообщение #14





Гости








    


fptr=0x987b8e0, imgtype=0xbf827234, status=0xbf827220
выбивается из контектста + ты перемудрил с **в объявлении и & в переданом значении, даже я не понимаю чего ты хочешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 21.4.2009, 23:46
Сообщение #15





Гости








    


я имелл в виду fptr=0x987b8e0 выбивается из контектста адресов выделеной памяти
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.4.2009, 23:50
Сообщение #16


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Гость_Гость_* @ 22.4.2009, 0:43) *
& в переданом значении, даже я не понимаю чего ты хочешь
+1
fits_open_file(fptr, qPrintable(fitsFileName) , READONLY, &status);
//bkb
fits_open_file(fptr, fitsFileName.toAscii().data() , READONLY, &status);


Сообщение отредактировал igor_bogomolov - 21.4.2009, 23:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 21.4.2009, 23:52
Сообщение #17


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


ну гдето так)))
а то даж залагиниться пришлось)))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.4.2009, 23:57
Сообщение #18


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


[oftop]
Так чтож сразу не залогинелся то? С конкретным человеком приятней общаться чем с анонимом :rolleyes:
[/offtop]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 21.4.2009, 23:59
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


да думал поспать лечь, хрен уснеш когда у людей баги при кросплатформизации выявляются
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.4.2009, 0:03
Сообщение #20


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


NordWest, погоди. Чет я не врубился. Это что, имелось в виду одно и то же
Цитата(NordWest @ 21.4.2009, 23:26) *
fits_open_file(&fptr, fname , READONLY,&status);

Цитата(NordWest @ 21.4.2009, 23:26) *
int ffopen(fitsfile **fptr, const char *filename, int iomode, int *status);


В смысле fits_open_file и ffopen???????????????77

Сообщение отредактировал igor_bogomolov - 22.4.2009, 0:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 22.4.2009, 0:09
Сообщение #21


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


:crazy: :yes: :shok: :scratch_one-s_head:

всёёёёё мне такой херней еща завтра заниматься........
:lazy:

Сообщение отредактировал ЙаМайскЫйПчОЛ - 22.4.2009, 0:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 22.4.2009, 0:43
Сообщение #22


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 22.4.2009, 1:03) *
В смысле fits_open_file и ffopen???????????????77


Одно и то же:
#define fits_open_file(A, B, C, D)  ffopentest( CFITSIO_VERSION, A, B, C, D)




Цитата(Гость_Гость_* @ 22.4.2009, 0:39) *
fitsfile *fptr;//pointer ot FITSfile
ты уверен что под него не надо память выделять???


В примерах не нужно было, и в винде думаю это также проявилось бы.

В описалове ещё что-то говориться о "Shared memory files", но пока не разберусь к чему это они.

Цитата(igor_bogomolov @ 22.4.2009, 0:50) *
fits_open_file(fptr, qPrintable(fitsFileName) , READONLY, &status);
//bkb
fits_open_file(fptr, fitsFileName.toAscii().data() , READONLY, &status);


Оба варианта результата не дают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 22.4.2009, 8:09
Сообщение #23


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


НУ ладно давай разбераться по пункта.
Я на 87% уверен что проблемма в первом аргументе либо в его типе либо в объявлении функции
Эта уверенность инстинктивная + основное что мне приходилось править при переводе приложения на линь - это ссылки и указатели.

В Твоем случае я вижу что мы имеем дело с FITS
немного погуглив
int ffpcls( fitsfile *fptr,   /* I - FITS file pointer                       */
            int  colnum,     /* I - number of column to write (1 = 1st col) */
            long  firstrow,  /* I - first row to write (1 = 1st row)        */
            long  firstelem, /* I - first vector element to write (1 = 1st) */
            long  nelem,     /* I - number of strings to write              */
            char  **array,   /* I - array of pointers to strings            */D
            int  *status)    /* IO - error status                           */
/*
  Write an array of string values to a column in the current FITS HDU.
*/
{
    int tcode, maxelem, hdutype, nchar;
    long twidth, incre, rownum, remain, next;
    long ii, jj, ntodo, tnull;
    OFF_T repeat, startpos, elemnum, wrtptr, rowlen;
    double scale, zero;
    char tform[20], *blanks;
    char message[FLEN_ERRMSG];
    char snull[20];   /*  the FITS null value  */
    tcolumn *colptr;

    double cbuff[DBUFFSIZE / sizeof(double)]; /* align cbuff on word boundary */
    char *buffer, *arrayptr;

    if (*status > 0)           /* inherit input status value if > 0 */
        return(*status);

    /* reset position to the correct HDU if necessary */
    if (fptr->HDUposition != (fptr->Fptr)->curhdu)
    {
        ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status);
    }
    else if ((fptr->Fptr)->datastart == DATA_UNDEFINED)
    {
        if ( ffrdef(fptr, status) > 0)               /* rescan header */
            return(*status);
    }

обрати внимание на первую строчку кода и вызов ffmahd ИМХО такое объявление отличается от твоего на одну *
контрол-ц контрол-в из MSDN и готовых сырцов часто приводит к непониманию

сделай ТАК!
int ffopen(fitsfile *fptr, const char *filename, int iomode, int *status);

в объявлении функции и будет тебу счастие

а примеров подобного рода куча http://astro.phys.au.dk/ai43/toar/io/MOMF/...itsio/putcoll.c

Сообщение отредактировал ЙаМайскЫйПчОЛ - 22.4.2009, 8:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 22.4.2009, 13:14
Сообщение #24


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(ЙаМайскЫйПчОЛ @ 22.4.2009, 9:09) *
НУ ладно давай разбераться по пункта.
...
сделай ТАК!
int ffopen(fitsfile *fptr, const char *filename, int iomode, int *status);

в объявлении функции и будет тебу счастие
...


Ну вот, программа заработала. При этом не понятно что случилось и что собственно помогло...

В общем, я попытался воспользоваться советом уважаемого майского насекомого. убрать звездочку из ffopen явно мало. Потому как сама fits_open_file связана define'ом с функцией ffopentest в файле longname.h:
#define fits_open_file(A, B, C, D)  ffopentest( CFITSIO_VERSION, A, B, C, D)


Т.е. этот двойной указатель передается ей, а уже она вызывает ffopen():
Раскрывающийся текст
int ffopentest(double version,   /* I - CFITSIO version number, from the    */
                                 /*     application program (fitsio.h file) */
           fitsfile **fptr,      /* O - FITS file pointer                   */ 
           const char *name,     /* I - full name of file to open           */
           int mode,             /* I - 0 = open readonly; 1 = read/write   */
           int *status)          /* IO - error status                       */
/*
  Open an existing FITS file with either readonly or read/write access.
  First test that the version of fitsio.h used to build the CFITSIO library
  is the same as the version used in building the application program that
  links to the library.
*/
{
    if (version != CFITSIO_VERSION)
    {
        printf("ERROR: Mismatch in the version of the fitsio.h include file used to build\n");
    printf("the CFITSIO library, and the version included by the application program:\n");
    printf("   Version used to build the CFITSIO library   = %f\n",CFITSIO_VERSION);
    printf("   Version included by the application program = %f\n",version);
    
        *status = FILE_NOT_OPENED;
    return(*status);
    }

    /* now call the normal file open routine */
    ffopen(fptr, name, mode, status);////////////////////////<<<<<<<<<<<<<<<<<<<<
    return(*status);
}


Получается чтобы поменять заголовок как в совете, нужно не только изменить сам ffopen, но и ffopentest и ещё все процедуры, которые вызывают данные функции с двойным указателем. Это мне и выдал make, когда я заменил вызов у себя и пересобирал библиотеку. Поэтому я возвернул всё назад. Пересобрал библиотеку и свой проект и о чудо!..

Помимо этих действий, я также скачал новую версию библиотеки, переустановил её в /usr/local а не /usr/local/bin как ранее и забросил в папку, откуда подключаю fitsio.h и longname.h ещё и drvsmem.h и fitsio2.h, которые также создаются при сборке и на которые я раньше внимания вообще не обращал.

Т.е. возможно была какая-то путаница версий, либо я криво установил библиотеку... Либо ещё что. Главное теперь всё работает и более того - по сравнению с виндой приложение теперь летает :)

В любом случае, всем спасибо за помощь и участие! И приношу свои извинения за нецелевое использование консультационных ресурсов форума.

Сообщение отредактировал NordWest - 22.4.2009, 13:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 29.5.2025, 9:32