ошибка сегментации при чтении файла FITS с помощью healpix

#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] = "" ;