2016-06-07 1 views
-5

Когда я пытаюсь скомпилировать мой код, я получаю сообщение об ошибкеПочему я не могу передать регулярное значение вызову функции, который принимает указатель?

не может преобразовать «поплавок» в «сопзЬ флоат *».

Я думал, что, может быть, мне нужно было пройти в const, но это не должно иметь значения.

#include <iostream> 
using namespace std; 

static float foo(const float *pArray,int n); 

int main() { 
    foo(3.145f,5); 
    return 0; 
} 

static float foo(const float *pArray,int n) 
{ 
    return 0; 
} 
+12

На Рискуя очевидна, это потому, что поплавок не является указателем на float. –

+0

'3.145f' не является массивом или указателем, это просто' float' – NathanOliver

+0

@NathanOliver. Я не вижу, как * pArray должен быть массивом. Если бы это был массив, мы бы не увидели что-то вроде pArray [5] и т. Д. То, что я пытаюсь сказать, состоит в том, что нет никаких признаков того, что pArray является массивом, хотя имя говорит, что это так, но как бы это было очевидно? – Brogrammer93

ответ

2

вы должны передать указатель

float number=3.145; 
foo(&number,n); 
+2

. Лучше всего использовать 'float number = 3.145f;' as '3.145' - это двойной литерал, а' 3.145f' - это плавающий литерал. – NathanOliver

+0

@NathanOliver, но shouldnt 3.145 стал плавающим, потому что, хотя изначально он был двойным, мы бросаем его как float или я что-то упускаю здесь? – Brogrammer93

+0

@ Darraptor, вы быстро узнаете, что это не то же самое, когда вы пытаетесь использовать какой-либо шаблонный код с литералами. – StoryTeller

0

C++ является статически типизированных и компилируемый язык. Это означает, что типы любых аргументов в вызове функции должны быть известны во время компиляции и соответствовать значениям объявления функции.

Точное совпадение не требуется: конверсии разрешены, но нет преобразования из float в const float*, то есть из числа с плавающей запятой в адрес памяти.

В некотором более раннем коде или некотором C-коде значения передаются указателем. То есть вместо передачи значения (числа с плавающей запятой в этом случае) передается адрес памяти, где хранится этот номер. Чтобы использовать такие функции, с промежуточными результатами или литералов, нужно сначала сохранить значение в некоторой переменной, а затем получить адрес этой переменной передать в качестве аргумента функции:

void foo(const float*); // function declaration 
foo(&(3.1415));   // ERROR: cannot take address of literal 
float tmp = 3.1415;  // store number in variable 
foo(&tmp);    // pass address of variable to function 
Смежные вопросы