2014-10-07 3 views
1

C++ я получаю следующие ошибки и не могу показаться, чтобы решить их:Нерешенные внешняя ссылка в функции

ошибка LNK2019: неразрешенный внешний символ «двойной __cdecl orderIn (двойной, двойной, двойной)» (? orderIn @@ YANNNN @ Z) ссылка в функции _main

фатальных LNK1120 ошибки: 1 неразрешенных внешнеположенности

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

Что мне здесь не хватает?

Спасибо!

#include <iostream> 
#include <iomanip> 

using namespace std; 


double orderIn(double, double, double); 
void shippingOut(double, double, double); 

double spoolsOrdered, 
    spoolsInStock, 
    shipping, 
    total, 
    backordered, 
    charges, 
    spoolsShipping; 

int main() 
{ 

orderIn(spoolsOrdered, spoolsInStock, shipping); 

shippingOut(spoolsShipping, backordered, total); 


return 0; 
}//end int main 


double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping) 
{ 

char extracharge; 

//spools ordered 
cout << "How many spools would you like to order? "; 
cin >> spoolsOrdered; 
while (spoolsOrdered < 1) 
    { 
    cout << "That is not a valid entry "; 
    cin >> spoolsOrdered; 
    } 

//spools in stock 
cout << "How many spools are currently in stock? "; 
cin >> spoolsInStock; 

//extra charges 
cout << "Are there any special charges on this order? "; 
cin >> extracharge; 

//special charges 
if (extracharge == 'Y' || extracharge == 'y') 
    { 
    cout << "What is the additional charge per spool? "; 
    cin >> charges; 
    shipping = (10 + charges); 
    } 
else 
    shipping = 10; 

return (&spoolsOrdered, &spoolsInStock, shipping); 
} 

void shippingOut(double spoolsOrdered, double spoolnStock, double shipping) 
{ 

double backordered; 
double subTotal; 
double totalShipping; 
double total; 
double spoolsShipping; 



if (spoolsOrdered > spoolsInStock) 
    { 
    backordered=(spoolsOrdered - spoolsInStock);  
    cout << "There are " << spoolsInStock << " spools ready to be shipped./n"; 
    cout << "The remaining " << backordered <<" are on backorder."; 
    spoolsShipping=spoolsInStock; 
    } 
else 
    { 
    cout << "All " <<spoolsOrdered << " spools ordered are ready to ship.\n"; 
    spoolsShipping=spoolsOrdered; 
    } 


    //Product Charges 
    subTotal = spoolsShipping * 100; 
    cout << "Subtotal: $" << subTotal << endl; 

    //Shipping Charges 
    totalShipping = spoolsOrdered * shipping; 
    cout << "S/H Total: $" << totalShipping << endl; 

    //Total 
    total = subTotal + totalShipping; 
    cout << "The total of the order ready to ship is: $" << total << endl; 

} 

ответ

3

Вы заявляете:

double orderIn(double, double, double); 

, а затем использовать его. Вы позже определите:

double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping) 

Это другая функция; типы аргументов являются ссылками на double, а не просто double.

Fix либо заявления или определение - это выглядит, как вам действительно нужно исправить декларацию, так как вы хотите установить переменные в вызывающей функции:

double orderIn(double &, double &, double &); 

Вы должны также рассмотреть, почему вы так много глобальные переменные и почему глобальные имена переменных затенены параметрами. Избегайте глобальных переменных, когда это возможно.


а) когда я попытался запустить его в прошлом, я мог получить только его работать путем определения переменных перед основным. Где должны быть объявлены все эти переменные?

Как правило, вы будете объявлять переменные в функции (в данном случае, main()), а затем передавать переменные в функции, которые должны их использовать. Иногда глобалы подходят. Таким образом, я ожидал:

int main() 
{ 
    double spoolsOrdered = 0.0; 
    double spoolsInStock = 0.0; 
    double shipping = 0.0; 
    double total = 0.0; 
    double backordered = 0.0; 
    double spoolsShipping = 0.0; 

    orderIn(spoolsOrdered, spoolsInStock, shipping); 

    shippingOut(spoolsShipping, backordered, total); 

    // Use these values? 

    return 0; 
} 

Если вы не имеете использование для значений в main(), почему вы пропуская их вокруг в первую очередь.

Затем я заметил, что оба orderIn() и shippingOut() возвращают double, но вы не используете это значение. Что возвращает orderIn()? Есть сюрприз:

return (&spoolsOrdered, &spoolsInStock, shipping); 

Это не делает то, что вы думаете. Запятыми являются запятые. Адрес spoolsOrdered оценивается и отбрасывается; адрес spoolsInStock оценивается и отбрасывается; то возвращается значение в shipping.Вы можете изменить функцию для возврата void и полностью удалить оператор return, аналогичный shippingOut().

Глобальная переменная charges должна быть локальной переменной в orderIn().

b) Какова связь между переменными и параметрами?

Внутри функции orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping) параметры скрывают глобальную переменную с тем же именем. Так как это C++, вы можете получить доступ к глобальной переменной с помощью оператора области действия :: так:

::spoolsOrdered // The global variable 
spoolsOrdered // The local reference variable -- a reference to the global 

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

Если вы используете GCC (g++), опция -Wshadow сообщает о проблемах с затенением.

+0

Я нахожусь в своем первом классе на C++ и чувствую, что пропустил некоторые основы курса. a) Когда я пытался запустить его в прошлом, я мог только заставить его работать, задав переменные перед main. Где должны объявляться все эти переменные? b) Какова связь между переменными и параметрами? – omadison

+0

Большое вам спасибо за советы. Я пересмотрел код следующим образом, и теперь моя единственная ошибка заключается в том, что ни в каком контексте я не могу конвертировать из double * в double. Идеи? Я почти уверен, что мой двойник и теперь последователен. (должен ли я обновить вышеприведенную запись? С текущим кодом?) – omadison

+0

Прочтите ревизию (дополнение) Я только что сделал свой ответ. Если вам нужно разместить больше кода, добавьте его, а не замените оригинал. Но добавьте как можно меньше. Узнайте, как создать MCVE ([Минимальный, полный, проверенный пример] (http://stackoverflow.com/help/mcve)) или SSCCE ([Short, Self-Contained, Correct Example] (http: // sscce. org /)) - два имени и ссылки для одной и той же базовой идеи. –

2

Ваш прототип функции:

double orderIn(double, double, double); 

Однако ваше фактическое определение функции является:

double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping) 
{ 

} 

double и double& различные типы, таким образом, вам необходимо либо настроить прототип или определение.

+0

Я перешел на прототип до double orderIn (double &, double &, double &); , но он еще дал мне значения «$ 0» для вывода второй функции. Я думаю, что я не получаю базовый синтаксис вывода переменной, которая будет использоваться следующей функцией. – omadison

Смежные вопросы