Jena
Jena

Reputation: 11

undefined reference to function after solving issue

I have 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

Then I have 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;
}

And main.cpp like this

#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;
}

when I compiled this I got this error: enter image description here

I had this problem before...The problem was, that I had ";" after definition of functions in funstion.cpp, for example Aktivity *nacitanieAktivitDoStruct(Aktivity *poleAktivit,int &velkost,string &filter);, but then, I removed semicolons and this problem was solved. I saved it and then, when I opened it again, there was this error again and I do not know why.

Upvotes: 0

Views: 291

Answers (1)

donjuedo
donjuedo

Reputation: 2505

Your build is not linking the output of funckcie.cpp (funckcie.o). That's where the 4 missing symbols are defined.

Upvotes: 1

Related Questions