2015-12-20 5 views
0

У меня есть funkcie.hнеопределенная ссылка на функцию после решения проблемы

#ifndef FUNKCIE_H_INCLUDED 
#define FUNKCIE_H_INCLUDED 

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <vector> 
#include <string> 

using namespace std; 

typedef struct 
{ 
    int ID; 
    int mesiac; 
    char typ[20]; 
    float doba; 
    float spalene_kj; 
} Aktivity; 

void tlac(Aktivity *poleAktivit,int velkost); 
Aktivity *nacitanieAktivitDoStruct(Aktivity *poleAktivit,int &velkost,string &filter); 
int exportDoCsv(Aktivity *poleAktivit,int velkost); 
int exportDoHtml(Aktivity *poleAktivit,int velkost,string filter); 
//Aktivity *filtraciaPodlaMesiaca(Aktivity *poleAktivit,int velkost,string filter); 
//Aktivity *filtraciaPodlaTypuAktivity(Aktivity *poleAktivit,int velkost,string filter); 
//Aktivity *filtracia(Aktivity *poleAktivit,int velkost,string filter); 


#endif // FUNKCIE_H_INCLUDED 

Тогда я funckcie.cpp

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <stdio.h> 
#include <string> 
#include <string.h> 
#include <stdlib.h> 
#include "funkcie.h" 

using namespace std; 

void tlac(Aktivity *poleAktivit,int velkost) 
{ 
    system("cls"); 
    if(poleAktivit==NULL) 
    { 
     cout<<"Zoznam je prazdny."<<endl; 
    } 
    else 
    { 
     cout<<" "<<setw(11)<<left<<"ID"<<setw(10)<<"Mesiac"<<setw(23)<<"Typ aktivity"<<setw(10)<<"Doba v min."<<setw(12)<<"Spálené kj"<<endl<<endl; 
     for(int i=0;i<velkost;i++) 
     cout<<setw(3)<<i+1<<setw(10)<<left<<poleAktivit[i].id<<setw(10)<<poleAktivit[i].mesiac<<setw(23)<<poleAktivit[i].typ<<setw(13)<<poleAktivit[i].doba<<setw(13)<<poleAktivit[i].spalene_kj<<endl; 
    } 
} 

Aktivity *nacitanieAktivitDoStruct(Aktivity *poleAktivit,int &velkost,string &filter) 
{ 
    string kopieRretezec; 
    string nazevSouboru; 
    string cesta="../vstupnidata/"; 
    string pripona=".csv"; 
    int cisloZaznamu=0; 

    system("cls"); 
    cout<<"Zadej nazev souboru bez pripony, ktery chces nacist: "; 
    cin>>nazevSouboru; 
    nazevSouboru=cesta+nazevSouboru+pripona; 
    ifstream vstup; 
    vstup.open((const char *) nazevSouboru.c_str()); 

    if(!vstup.is_open()) 
    { 
     cout<<"Chyba pri otevreni souboru."<<endl; 
     poleAktivit=NULL; 
     return poleAktivit; 
    } 

    if(poleAktivit!=NULL) 
    { 
     free(poleAktivit); 
     poleAktivit=NULL; 
     velkost=0; 
     filtr=""; 
    } 

    while(!vstup.eof()) 
    { 
     getline(vstup,kopieRretezec,';'); 
     if(kopieRretezec.length()==0) 
      break; 

     if(velkost==0) 
     { 
      poleAktivit=(Aktivity*)malloc(sizeof(Aktivity)*(++velkost)); 
     } 
     else 
     { 
      poleAktivit=(Aktivity*)realloc(poleAktivit,sizeof(Aktivity)*(++velkost)); 
     } 

     poleAktivit[cisloZaznamu].ID=atoi(kopieRretezec.c_str()); 
     getline(vstup,kopieRretezec,';'); 

     poleAktivit[cisloZaznamu].mesiac=atoi(kopieRretezec.c_str()); 
     getline(vstup,kopieRretezec,';'); 

     strcpy(poleAktivit[cisloZaznamu].typ,kopieRretezec.c_str()); 
     getline(vstup,kopieRretezec,';'); 

     poleAktivit[cisloZaznamu].doba=atoi(kopieRretezec.c_str()); 
     getline(vstup,kopieRretezec,';'); 

     poleAktivit[cisloZaznamu].spalene_kj=atoi(kopieRretezec.c_str()); 
     getline(vstup,kopieRretezec,'\n'); 

     kopieRretezec=""; 
     cisloZaznamu++; 
    } 

    if(velkost==0) 
    { 
     cout<<"Soubor je prazdny."<<endl; 
     vstup.close(); 
     return poleAktivit; 
    } 
    cout<<"Nacteni ze souboru probehlo uspesne."<<endl; 
    vstup.close(); 
    return poleAktivit; 
} 

int exportDoCsv(Aktivity *poleAktivit,int velkost) 
{ 
    string nazevSouboru; 
    string cesta="../../vstupnidata/"; 
    string pripona=".csv"; 
    int i=0; 
    system("cls"); 

    cout<<"Zadej nazev souboru pro ulozeni bez pripony: "; 
    cin>>nazevSouboru; 

    while(nazevSouboru.c_str()[i]!='\0') 
    { 
     if(nazevSouboru.c_str()[i]=='.' || nazevSouboru.c_str()[i]=='/' || nazevSouboru.c_str()[i]=='\\' || nazevSouboru.c_str()[i]==':' || nazevSouboru.c_str()[i]=='*' || nazevSouboru.c_str()[i]=='?' || nazevSouboru.c_str()[i]=='"' || nazevSouboru.c_str()[i]=='<' || nazevSouboru.c_str()[i]=='>' || nazevSouboru.c_str()[i]=='|') 
     { 
      cout<<"Spatne zadan nazev souboru."<<endl; 
      cout<<"Nazev souboru nesmi obsahovat znaky: \"\\/: . * ? \" < > |\""<<endl; 
      return 1; 
     } 
     i++; 
    } 
    nazevSouboru=cesta+nazevSouboru+pripona; 

    ofstream vystup; 
    vystup.open((const char *) nazevSouboru.c_str()); 

    if(!vystup.is_open()) 
    { 
     cout<<"Soubor se neotevrel."<<endl; 
     return 1; 
    } 

    for(int i=0;i<velikostPole;i++) 
    { 
     vystup << poleAktivit[i].ID << ";" 
       << poleAktivit[i].mesiac << ";" 
       << poleAktivit[i].typ << ";" 
       << poleAktivit[i].doba << ";" 
       << poleAktivit[i].spalene_kj << ";" 
       << endl; 
    } 
    cout<<"Ulozeni do souboru CSV probehlo uspesne."<<endl; 
    vystup.close(); 
    return 0; 
} 
int exportDoHtml(Aktivity *poleAktivit,int velkost,string filter) 
{ 
    string nazevSouboru; 
    string cesta="../../vystupnidata/"; 
    string pripona=".html"; 
    int i=0; 
    system("cls"); 

    cout<<"Zadej nazev souboru pro ulozeni bez pripony: "; 
    cin>>nazevSouboru; 

    while(nazevSouboru.c_str()[i]!='\0') 
    { 
     if(nazevSouboru.c_str()[i]=='.' || nazevSouboru.c_str()[i]=='/' || nazevSouboru.c_str()[i]=='\\' || nazevSouboru.c_str()[i]==':' || nazevSouboru.c_str()[i]=='*' || nazevSouboru.c_str()[i]=='?' || nazevSouboru.c_str()[i]=='"' || nazevSouboru.c_str()[i]=='<' || nazevSouboru.c_str()[i]=='>' || nazevSouboru.c_str()[i]=='|') 
     { 
      cout<<"Spatne zadan nazev souboru."<<endl; 
      cout<<"Nazev souboru nesmi obsahovat znaky: \"\\/: . * ? \" < > |\""<<endl; 
      return 1; 
     } 
     i++; 
    } 
    nazevSouboru=cesta+nazevSouboru+pripona; 
    ofstream vystup; 
    vystup.open((const char *) nazevSouboru.c_str()); //.c_str() 

    if(!vystup.is_open()) 
    { 
     cout<<"Soubor se neotevrel."<<endl; 
     return 1; 
    } 

    vystup<<"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; 
    vystup<<endl<<"<html>"<<endl<<"<head>"; 
    vystup<<endl<<"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"; 
    vystup<<endl<<"<title>Knihovna</title>"; 
    vystup<<endl<<"</head>"<<endl<<"<body bgcolor=\"#7be1fb\">"; 
    vystup<<endl<<"<h1 align=\"center\"><b>Osobni knihovnicka</b></h1>"; 
    if(!filter.empty())vystup<<endl<<"<h2 align=\"center\">Filtrace zaznamu podle: "<<filter<<"</h2>"; 
    vystup<<endl<<"<table width=\"650\" border=\"2\" align=\"center\">"; 
    vystup<<endl<<"<tr><th width=\"99\"><font size=\"4\">ID</font></th><th width=\"99\"><font size=\"4\">Mesiac</font></th><th width=\"149\"><font size=\"4\">Typ</font></th><th width=\"99\"><font size=\"4\">Doba v min.</font></th><th width=\"99\"><font size=\"4\">Spalene kj</font></th></tr>"; 

    for(int i=0;i<velkost;i++) 
    { 
     vystup<<endl<<"<tr><td align=\"center\">"<<poleAktivit[i].ID<<"</td>"<<"</td >"<<"<td align=\"center\">"<<poleAktivit[i].mesiac<<"</td>"<<"<td align=\"center\">"<<poleAktivit[i].typ<<"</td>"<<"<td align=\"center\">"<<poleAktivit[i].doba<<"</td>"<<"<td align=\"center\">"<<poleAktivit[i].spalene_kj<<"</td></tr>"<<endl; 
    } 

    vystup<<endl<<"</table>"; 
    vystup<<endl<<"</body>"; 
    vystup<<endl<<"</html>"; 
    cout<<"Ulozeni do souboru HTML probehlo uspesne."<<endl; 
    vystup.close(); 
    return 0; 
} 

И main.cpp, как этот

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include "funkcie.h" 

using namespace std; 

int main(int argc, char * argv []) 
{ 
    Aktivity *poleAktivit=NULL; 
    string chyba,filter=""; 
    int velkost=0; 
    int volba; 

    while(1) 
    { 
     system("cls"); 
     cout.width(68); 
     cout<<right<<"***********************************************************"<<endl 
     <<"* Program pro nacteni, upravu a ulozeni zaznamu o knihach *"<<endl 
     <<"***********************************************************"<<endl<<endl; 

     cout<<"Menu:"<<endl 
     <<"1. Nacteni zaznamu"<<endl 
     <<"3. Filtrace zaznamu"<<endl 
     <<"5. Zobrazeni zaznamu"<<endl 
     <<"6. Export zaznamu do csv souboru"<<endl 
     <<"7. Export zaznamu do html souboru"<<endl 
     <<"8. Konec programu"<<endl; 

     while (1) 
     { 
      cout<<"Zadej volbu: "; 
      cin >> volba; 

      if (cin.fail()) 
      { 
       cin.clear(); 
       cin >> chyba; //ulozi chybny vystup 
      } 
      else break; 
     } 

     switch(volba) 
     { 
      case 1: poleAktivit=nacitanieAktivitDoStruct(poleAktivit,velkost,filter); 
        break; 

      case 5: tlac(poleAktivit,velkost); 
        break; 

      case 6: 
       { 
        if(velkost==0) 
        { 
         system("cls"); 
         cout<<"Zoznam aktivit je prazdny."<<endl; 
        } 
        else exportDoCsv(poleAktivit,velkost); 
       } 
       break; 
      case 7: 
       { 
        if(velkost==0) 
        { 
         system("cls"); 
         cout<<"Zoznam knih je prazdny."<<endl; 
        } 
        else exportDoHtml(poleAktivit,velkost,filter); 
       } 
       break; 
      case 8: 
       { 
        free(poleAktivit); 
        return 0; 
       } 
       break; 
      default: cout<<"Nevybrali ste ani jednu z moznosti."<<endl; 
     } 
     cout<<"Pre pokracovanie stlac Enter..."; 
     getchar(); 
    } 
    return 0; 
} 

, когда я Скомпилировано это я получил эту ошибку: enter image description here

У меня была эта проблема раньше ... Проблема была в том, что у меня была ";" после определения функций в funstion.cpp, например Aktivity *nacitanieAktivitDoStruct(Aktivity *poleAktivit,int &velkost,string &filter);, но затем я удалил точки с запятой, и эта проблема была решена. Я сохранил его, а затем, когда я снова открыл его, снова появилась эта ошибка, и я не знаю, почему.

+0

Пожалуйста, отредактируйте ваше сообщение с * текстом * сообщения об ошибке, а не его изображением. Размеры текста будут корректироваться с помощью браузера, но изображения могут не отображаться. Ваше изображение может не отображаться для многих читателей, в то время как текст есть. –

+0

Возможный дубликат: [Что такое неопределенная ссылка и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and- how-do-i-fix) –

+0

Откройте терминал и введите 'g ++ main.cpp funckcie.cpp -o main &&./main'. Какую бы ошибку вы не получили от этой пасты здесь – smac89

ответ

1

Ваша сборка не связана с выходом funckcie.cpp (funckcie.o). Вот где определены 4 недостающих символа.