Вызовите переменную из другой функции со структурой - PullRequest
2 голосов
/ 22 сентября 2019

Я новичок в C, и я только что узнал о struct.Я должен сделать программу, которая считывает данные из файла и печатает их.

Одна из моих подзадач - вычислить расстояние между двумя точками.Я использую формулу haversine, как видно из функции расстояния.

Однако моя проблема в том, что я пытаюсь получить fst->Lat и fst->Long из функции stage_1_read, и она не работает. Я выделиллинии, в которых они находятся, чтобы прояснить.

Как мне получить эти значения?Это 2-е и 3-е значения, считанные в файле, но с моим текущим кодом, похоже, что вместо этого читаются 1-е и 2-е значенияЯ пытался какое-то время, но просто не могу получить нужные мне значения.

struct file_data{
    char User[5];
    char Long[12];
    char Lat[12];
    char Date[11];
    char Time[3];
};

double stage_1_read(void);
double distance(struct file_data fst);
double toRadian(double x);

int main(){
    printf("%f", stage_1_read());
    return 0;
}

double stage_1_read(void){
    /* This function takes the data from the input file,reading and printing 
    the User ID, Location (longitude and latitude), Date, Time, and Distance*/
    double d;
    char line[256];
    struct file_data fst;

    if (fgets(line, 256, stdin) != NULL) {
        sscanf(line, "%s %s %s %s %s", fst.User, fst.Long, fst.Lat,
        fst.Date, fst.Time);
    }
    else{
        printf("Failed to read file. Check file and try again.");
        exit(EXIT_FAILURE);
    }
    d = distance(fst);
    printf("Stage 1\n==========\n");
    printf("User: #%s\n", fst.User);
    printf("Location: <%s %s>\n", fst.Long, fst.Lat);
    printf("Date: %s\n", fst.Date);
    printf("Time: %s\n", fst.Time);
    printf("Distance to reference: %.2f", d);
    return 0;
}

double distance(struct file_data fst) {
    /* This function is designed to calculate the distance between the check-in 
    POI and the reference point provided*/
    double angle_distance, chord_length, dist;
    double lat_2, long_2;

    lat_2 = *fst.Lat;
    long_2 = *fst.Long;

    double var_lat = toRadian(lat_2 - LAT_1);
    double var_long = toRadian(long_2 - LONG_1);

    chord_length = pow(sin(var_lat/2),2) + cos(toRadian(LAT_1)) * 
    cos(toRadian(lat_2)) * pow(sin(var_long/2),2);

    angle_distance = 2 * atan2(sqrt(chord_length), sqrt(1 - chord_length));

    dist = 6371 * angle_distance;

    return dist;
}

double toRadian(double x) {
    x = PI/DEGREES;
    return x;
}  

ОБНОВЛЕНИЕ:

Изменен некоторый код в соответствии с запросом.

1 Ответ

1 голос
/ 22 сентября 2019

Вы пытаетесь сослаться на переменную, которая объявлена ​​в другой функции (хотя я не уверен, как объявление указателя на структуру struct file_data *fst без выделения памяти работает для вас), однако вы можете объявить ее каклокальная переменная без *, и тогда вы можете ссылаться на нее как fst.Lat.Если вы настаиваете на использовании его в качестве указателя, для этого следует выделить память, вы можете использовать malloc или любой другой способ выделения памяти, который вам подходит.

Но для нашего бизнеса, когда вы ссылаетесь fst переменная из функции distance, вы ссылаетесь на только что объявленную переменную fst, которую вы только что объявили в этой функции.

, если вы хотите сослаться на одну и ту же переменную из обеих функций (или любой функции),один из вариантов - сделать эту переменную глобальной (объявить ее вне области действия функции), или вы можете distance принять указатель на эту структуру в качестве аргумента

double distance(double d, struct file_data *fst)

, тогда вы сможете получить доступ ктот, который вы создали в stage_1 function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...