#c #linux #fits
Вопрос:
Я пытаюсь открыть файл FITS с помощью healpix, используя код C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "chealpix.h"
#include "fitsio.h"
#include <string.h>
#include "fitsio2.h"
int main(int argc, char **argv){
char *coordsys="G";
char *order="RING";
long nside;
long *p_nside=amp;nside;
nside=512.;
float *map;
map=read_healpix_map("file.fits",p_nside,coordsys,order);
return(0);
}
Этот код возвращает a segmentation fault (core dumped)
при использовании gdb
, я получаю
Program received signal SIGSEGV, Segmentation fault.
ffgkys (status=0x7fffffffdaf4, comm=<optimized out>, value=0x55555555a004 "G", keyname=<optimized out>,
fptr=<optimized out>) at getkey.c:808
808 value[0] = '';
Это первый раз, когда я использую healpix, и я понятия не имею, в чем причина проблемы. Кто — нибудь знает, что может быть не так?
Ответ №1:
В соответствии с документацией read_healpix_map()
:
ordering
и coordsys
являются выходными аргументами — они являются указателями на пространство, в которое функция будет записывать результаты. Вы передали указатели на строковые константы в памяти, которые обычно помечаются как доступные только для чтения и в любом случае могут быть недостаточно большими для получения результата.
nside
также является выходным аргументом, инициализация его до 512 не имеет смысла. Вам это не нужно p_nside
; вы можете просто пройти amp;nside
Это не самый понятный из интерфейсов; в частности, неясно, является ли coordsys
он строкой или одиночным char
. В документации используются одинарные кавычки, так что вы можете предположить char
, но тогда это ordering
тоже так, и это явно строка. Безопаснее всего предположить coordsys
, что это струна — она не причинит вреда.
char coordsys[] = "G"; // This will be overwritten
char order[] = "NESTED" ; // This will be overwritten,
initialise to largest expected string
to ensure sufficient space is allocated
long nside = 0 ;
float* map = read_healpix_map( "file.fits", amp;nside, coordsys, order ) ;
printf( "nside:%ld, coordsys:%s, order:%s", nside, coordsys, order ) ;
Сценарий публикации: Просматривая исходный код , оба coordsys
и ordering
передаются fits_read_key()
, поэтому coordsys
обрабатываются как строка.
Комментарии:
1. Я попробовал ваш код, но получил предупреждение «ВНИМАНИЕ: Не удалось найти ключевое слово COORDSYS в файле file.fits». Как это работает для вас?
2. @pulsar_hh Я понятия не имею, TBH Я даже не знаю, что такое файл HEALPix или файл FITS — я просто читал и интерпретировал документацию с точки зрения кода C. Похоже, это связано с содержимым файла. подходит скорее, чем код.
3. @pulsar_hh Я предполагаю, что это будет по умолчанию — что
coordsys
содержится после вызова? Если это «G», измените инициализацию, чтобы указать"-"
, используется ли она по умолчанию или просто оставляет ее нетронутой.4. @pulsar_hh Тест с одним из образцов из fits.gsfc.nasa.gov/fits_samples.html может быть? Часть заголовка-ASCII — я посмотрел на пару, которые не содержали ни
COORDSYS
того, ни другого . Где/как было отображено предупреждение? Был ли это побочный эффект, вызванный вызовом, или он был опасно написанcoordsys
? Если последнее, вам нужно будет сделать этот буфер намного больше, а документация отстой.5. Разрушение стека может быть чем-то другим, или функция записывает в буфер больше, чем предполагает документация — это ужасно небезопасный интерфейс для кода на языке Си. Используйте отладчик, чтобы определить, что происходит. О том, чтобы сделать буферы произвольно большими; например
char order[1024] = "" ;