Пишем программу в Qt. Начинали под винду, теперь есть непреодолимое желание использовать её ещё и под Линуксом, там более кросплатформ и всё такое... Но программа сопротивляется.
Вылетает она из библиотеки, которая позволяет работать со специальными графическими файлами. При открытии такого файла, т.е. при вызове метода fits_open_file() из этой библиотеки, программа вылетает, и если в релизе она это делает молча, то в дебуг-варианте в консоль выдается следующее:
ты лучше код покажи а не результат: тк это обычная ошибка сегментации и причин возникновения куча
скорее всего неправльная работа с память: виндовый стиль программирования слишком расслабляет
самая распространненая ошибка при работе с указателями и ссылками, хорошенько проверьте работу динамических элементов, особенно контейнеров и повышенное внимание параметрам функции
MVS + их компилер разрешает такие вещи от которых gcc жутко тянет блевать
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);
Вот твоя ошибка. Так делать категорически нельзя. fname у тебя невалиден.
По сути тут область видимости временного объекта ограниченна таким образом:
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);
а может дело в первом параметре функции ?
Ага, только теперь при дебуге выдает ещё и это:
/* 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);
fitsfile *fptr;//pointer ot FITSfile
ты уверен что под него не надо память выделять???
fptr=0x987b8e0, imgtype=0xbf827234, status=0xbf827220
выбивается из контектста + ты перемудрил с **в объявлении и & в переданом значении, даже я не понимаю чего ты хочешь
я имелл в виду fptr=0x987b8e0 выбивается из контектста адресов выделеной памяти
fits_open_file(fptr, qPrintable(fitsFileName) , READONLY, &status);
//bkb
fits_open_file(fptr, fitsFileName.toAscii().data() , READONLY, &status);
ну гдето так)))
а то даж залагиниться пришлось)))))
[oftop]
Так чтож сразу не залогинелся то? С конкретным человеком приятней общаться чем с анонимом
[/offtop]
да думал поспать лечь, хрен уснеш когда у людей баги при кросплатформизации выявляются
NordWest, погоди. Чет я не врубился. Это что, имелось в виду одно и то же
всёёёёё мне такой херней еща завтра заниматься........
#define fits_open_file(A, B, C, D) ffopentest( CFITSIO_VERSION, A, B, C, D)
НУ ладно давай разбераться по пункта.
Я на 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);
}
int ffopen(fitsfile *fptr, const char *filename, int iomode, int *status);
int ffopen(fitsfile *fptr, const char *filename, int iomode, int *status);
#define fits_open_file(A, B, C, D) ffopentest( CFITSIO_VERSION, A, B, C, D)
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);
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)