формат "% lf" ожидает аргумент типа "double", но аргумент 2 имеет тип "double *" - PullRequest
0 голосов
/ 09 марта 2019

Я пытался найти этот код ошибки, но я новичок в C, и ответы на самом деле не совсем понятны для меня.Я был бы признателен, если бы кто-то мог указать, где я ошибаюсь, например, когда я распечатываю любое значение внутри цикла do while, оно дает значение 0. Спасибо!

initial_x_pos = 300;
initial_y_pos = 800;
x_pos = initial_x_pos;
y_pos = initial_y_pos;

gravity = 1.62;

position = sqrt(pow(x_pos, 2) + pow(x_pos, 2));
influence = 3.14 * 50 * 50;

GFX_SetColour(WHITE);

GFX_MoveTo(initial_x_pos, initial_y_pos);

do {
    time += 1;
    y_pos = initial_y_pos - (vel_y * time) / 2;
    x_pos = initial_x_pos + (vel_x * time) / 2;
    GFX_DrawLineTo(x_pos, y_pos, 3);
    GFX_UpdateDisplay();
    distance = sqrt(pow(y_pos - (y + 312), 2) + (pow(x_pos - (x+440), 2)));
    printf("%lf\n", &distance);
    printf("%lf\n", &vel_x);
} while (vel_x != 10000000000);

1 Ответ

2 голосов
/ 09 марта 2019

Модификатор l игнорируется для спецификатора преобразования %f в printf, который ожидает значение double. float аргументы автоматически преобразуются в double при передаче в printf или в любые другие неординарные функции.

Вы не опубликовали полный код функции, тип переменной distance неизвестен, но передача ее адреса через &distance всегда неверна. Возможно, вы скопировали код для чтения через scanf(), где %lf требуется для типа double и должен быть передан адрес получателя.

Вот исправленная версия:

int time = 0;
double distance;
double initial_x_pos = 300;
double initial_y_pos = 800;
double x_pos = initial_x_pos;
double y_pos = initial_y_pos;

double gravity = 1.62;

double position = sqrt(pow(x_pos, 2) + pow(y_pos, 2));
double influence = 3.14 * 50 * 50;

GFX_SetColour(WHITE);

GFX_MoveTo(initial_x_pos, initial_y_pos);

do {
    time += 1;
    y_pos = initial_y_pos - (vel_y * time) / 2;
    x_pos = initial_x_pos + (vel_x * time) / 2;
    GFX_DrawLineTo(x_pos, y_pos, 3);
    GFX_UpdateDisplay();
    distance = sqrt(pow(y_pos - (y + 312), 2) + (pow(x_pos - (x + 440), 2)));
    printf("%f\n", distance);
    printf("%f\n", vel_x);
} while (vel_x != 10000000000);

Обратите внимание, что vel_x не изменяется в цикле, и сравнение значения double с == не рекомендуется, поскольку вычисления с плавающей запятой имеют ограниченную точность.

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