Błąd LNK2019 w funkcji main() [c++]

Odpowiedz Nowy wątek
2011-07-16 14:59
zazaw
0

Witam,
mam następujący problem mój program składa się z jednego pliku nagłówkowego (jest w nim przestrzeń nazw + prototypy funkcji), pliku, gdzie są definicje funkcji oraz pliku zawierającego funkcję main(), które ma w sobie wywołania funkcji itp.

No i wyskakuje następujący błąd:
"1>name_s.obj : error LNK2019: unresolved external symbol "void cdecl SALES::showSales(struct SALES::Sales const &)" ([email protected]@@[email protected]@@Z) referenced in function _main
1>name_s.obj : error LNK2019: unresolved external symbol "void
cdecl SALES::setSales(struct SALES::Sales &,double const * const,int)" ([email protected]@@[email protected]@[email protected]) referenced in function _main
1>name_s.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &)" ([email protected]@@[email protected]@@Z) referenced in function _main"

Problem dotyczy funkcji main() - tyle co wiem i każdy wie. IDE to Visual Studio C++ Express 2010, wszystkie pliki są połączone w jeden projekt, nie ma nigdzie błędnych nazw funkcji, wszystkie funkcje są zdefiniowane. Program to ConsoleApplication, wszystkie funkcje napisane są przeze mnie. Szukałem po internecie sposobu na rozwiązanie - niektórzy pisali, by w ustawieniach projektu w linkerze zmienić wartość system na console ale ona taka była, żadne inne kombinowanie nie działało.

Jakby co to mogę podać również kod.

Pozdrawiam

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-07-16 17:29
0

Albo te funkcje nie są nigdzie zdefiniowane (kompilator C++ potrafi takie coś przepuścić, wywalając się dopiero na linkerze), albo plik .cpp w którym one są nie jest wlinkowywany. W takiej sytuacji usuń go z projektu (uważaj by fizycznie pliku nie skasować) i dodaj na nowo.

Pozostało 580 znaków

2011-07-16 21:55
zazaw
0

nic niestety nie pomaga :(

Pozostało 580 znaków

2011-07-17 09:26
0

może funkcje w pliku .h i .cpp się nie zgadzają, np. różnią jakąś pierdołą. pokaż te funkcje.

Pozostało 580 znaków

2011-07-18 12:28
zazaw
0

Oto cały kod:

//plik nagłówkowy - sales.h
#ifndef SALES_H_
#define SALES_H_
 
namespace SALES
{
    const int QUARTES = 4;
    struct Sales
    {
        double sales[QUARTES];
        double average;
        double max;
        double min;
    };
 
void setSales(Sales & s);
void setSales(Sales & s, const double ar[], int n);
void showSales(const Sales & s);
 
}
 
#endif  
//functions.cpp 
#include "stdafx.h"
#include <iostream>
#include "sales.h"
 
using namespace SALES;
 
void setSales(Sales & s) 
{
    double max, ave, min;
    for(int i = 0; i < QUARTES; i++) 
    {
        std::cout << "Podaj sprzedaz za " << i+1 << " kwartal:\n";
        while(!(std::cin >> s.sales[i]))
        {
            std::cin.clear();
            std::cout << "Podaj wartosc numercyzna!\n";
            std::cin >> s.sales[i];
            while(std::cin.get() !='\n')
                continue;
        } 
 
    }
    ave = 0;
    for(int i = 0; i < QUARTES;i++)
        ave += s.sales[i]; 
    ave /= QUARTES; 
    min = max = s.sales[0]; 
    for(int i = 0; i < QUARTES;i++)
    {
        if(max < s.sales[i]) 
            max = s.sales[i]; 
        else if(min > s.sales[i])
            min = s.sales[i];
    }
    s.max = max; 
    s.min = min;
    s.average = ave;
}
 
void setSales(Sales & s, const double ar[], int n) 
{
    s.max = s.min = ar[0]; 
    for(int i = 0; i < n && i < QUARTES ;i++) 
    {
        s.sales[i] = ar[i]; 
    }
    if(n < QUARTES) 
    {
        int temp = QUARTES - n; 
        for(int i = temp; temp < QUARTES; i++) 
            s.sales[i] = 0;
    }
    for(int i = 0; i < n;i++)
    {
        if(s.max < ar[i]) 
            s.max = ar[i]; 
        else if(s.min > ar[i]) 
            s.min = ar[i]; 
    }
    for(int i = 0; i < n;i++)
        s.average += ar[i];
    s.average /= n; 
}
 
void showSales(const Sales & s) 
{
    std::cout << "Informacje o sprzedazy:\n";
    std::cout << "Dane o sprzedazy z calego roku (dzielone na kwartaly):\n";
    for(int i = 0; i < 4; i++)
    {
        std::cout << "Sprzedaz za " << i+1 << " kwartal:\n";
        std::cout << s.sales[i] << std::endl;
    }
    std::cout << "Srednia wartosc wszytskich sprzedazy kwartalnych:\n";
    std::cout << s.average << std::endl;
    std::cout << "Maksymalna wartosc wszytskich sprzedazy kwartalnych:\n";
    std::cout << s.max << std::endl;
    std::cout << "Minimalna wartosc wszytskich sprzedazy kwartalnych:\n";
    std::cout << s.min << std::endl;
}
// names_s.cpp - plik z funkcją main()
#include "stdafx.h"
#include <iostream>
#include "sales.h"
using namespace SALES;
 
int main()
{
    int n = 2;
    double * tab = new double[n];
    tab[0] = 2000.55;
    tab[1] = 2100.99;
 
    Sales interactive, stative;
    setSales(interactive);
    setSales(stative, tab, n);
    std::cout << "Interaktywna funckja:\n";
    showSales(interactive);
    std::cout << "\nNieinteraktywna funckja:\n";
    showSales(stative);
    std::cout << "\nKoniec programu!\n";
    system("pause");
    return 0;
}

Pozostało 580 znaków

2011-07-18 12:35
0

A jak w pliku z definicjami dodasz przed nazwą funkcji namespace, tzn np.

void SALES::setSales(Sales & s) 

?

Pozostało 580 znaków

2011-07-18 13:50
zazaw
0

dzięki! działa ;) ale czy w takim razie zawsze podczas występowania takiego problemu muszę dodać SALES:: przed nazwą funkcji, czy można to jakoś zmienić ?

Pozostało 580 znaków

2011-07-18 14:31
0

zapis using namespace SALES; oznacza „użyj przestrzeni SALES podczas wyszukiwania nazw”, a nie „zatop wszystkie funkcje w przestrzeni SALES”. ten drugi efekt uzyskasz robiąc tak jak w nagłówku, czyli za pomocą namespace SALES { }

Pozostało 580 znaków

2011-07-18 15:35
zazaw
0

wielkie dzięki za info ;) oraz za całe rozwiązanie problemu :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0