• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wywołanie funkcji void w innej funkcji

Object Storage Arubacloud
0 głosów
1,446 wizyt
pytanie zadane 14 grudnia 2016 w C i C++ przez mibdbz Gaduła (4,300 p.)

Witam. Mój problem polega na tym, że kompilator wyrzuca mi błąd : invalid use of code expression. Jestem początkujący więc w kodzie może być więcej błędów. Błąd tkwi w 44 linijce. Kiedy wykreślam funkcję "funkcja" to funkcja "tytul" działa, a jeśli "funkcja" jest aktywna choć nawet nie wywoływana to wyskakuje błąd. Funkcja "tytul" ma wywoływać nazwę pliku, którego będzie używać funkcja "funkcja".

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

int wybor;

void funkcja(); void tytul();

int main()
{
    cout<<"wybor: ";
    cin>> wybor;

tytul();

    return 0;
}

void tytul()
{
   switch(wybor)
   {
       case 1: cout<<"\"produkty_zbozowe.txt\"";        break;
       case 2: cout<<"\"produkty_miesne.txt\"";         break;
       case 3: cout<<"\"produkty_mleczne.txt\"";        break;
       case 4: cout<<"\"warzywa.txt\"";                 break;
       case 5: cout<<"\"owoce.txt\"";                   break;
       case 6: cout<<"\"pieczywo.txt\"";                break;
       case 7: cout<<"\"cukier i slodycze.txt\"";       break;
       case 8: cout<<"\"ryby i owoce morza.txt\"";      break;
       case 9: cout<<"\"inne tluszcze.txt\"";           break;
   }
}
void funkcja()
    {
        cout << "************MENU************"<<endl;
        cout << endl;

    fstream plik;

    plik.open(tytul() , ios::in);
    if (plik.good()==false)
    {
        cout<<"Plik nie istnieje!";
        exit(0);
    }
    string linia; int nr_linii = 1; int nr_wtablicy = 0;
    string *nazwa_produktu; float *WW; float *WBT;
    nazwa_produktu = new string[nr_wtablicy];
    WW = new float[nr_wtablicy];
    WBT = new float[nr_wtablicy];

    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: nazwa_produktu[nr_wtablicy] = linia;               break;
            case 2: WW[nr_wtablicy]             = atof(linia.c_str()); break;
            case 3: WBT[nr_wtablicy]            = atof(linia.c_str()); break;
        }
        if(nr_linii == 3) {nr_linii=0; nr_wtablicy++;}
        nr_linii++;

    }
        plik.close();

for (int i=0; i<=nr_linii; i++)
{
    cout<<*nazwa_produktu<<endl;
    cout<<*WW<<endl;
    cout<<*WBT<<endl;
}
delete [] nazwa_produktu; delete [] WW; delete [] WBT;
}

Patrzę już na to dwa dni i nie wiem co to może być. Bardzo proszę choćby o małą podpowiedź.

3 odpowiedzi

+1 głos
odpowiedź 14 grudnia 2016 przez Patrix354 Bywalec (2,030 p.)
wybrane 15 grudnia 2016 przez mibdbz
 
Najlepsza

Zamiast tak.

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
 
using namespace std;
 
int wybor;
 
void funkcja(); void tytul();
 
int main()
{
    cout<<"wybor: ";
    cin>> wybor;
 
tytul();
 
    return 0;
}
 
void tytul()
{
   switch(wybor)
   {
       case 1: cout<<"\"produkty_zbozowe.txt\"";        break;
       case 2: cout<<"\"produkty_miesne.txt\"";         break;
       case 3: cout<<"\"produkty_mleczne.txt\"";        break;
       case 4: cout<<"\"warzywa.txt\"";                 break;
       case 5: cout<<"\"owoce.txt\"";                   break;
       case 6: cout<<"\"pieczywo.txt\"";                break;
       case 7: cout<<"\"cukier i slodycze.txt\"";       break;
       case 8: cout<<"\"ryby i owoce morza.txt\"";      break;
       case 9: cout<<"\"inne tluszcze.txt\"";           break;
   }
}
void funkcja()
    {
        cout << "************MENU************"<<endl;
        cout << endl;
 
    fstream plik;
 
    plik.open(tytul() , ios::in);
    if (plik.good()==false)
    {
        cout<<"Plik nie istnieje!";
        exit(0);
    }
    string linia; int nr_linii = 1; int nr_wtablicy = 0;
    string *nazwa_produktu; float *WW; float *WBT;
    nazwa_produktu = new string[nr_wtablicy];
    WW = new float[nr_wtablicy];
    WBT = new float[nr_wtablicy];
 
    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: nazwa_produktu[nr_wtablicy] = linia;               break;
            case 2: WW[nr_wtablicy]             = atof(linia.c_str()); break;
            case 3: WBT[nr_wtablicy]            = atof(linia.c_str()); break;
        }
        if(nr_linii == 3) {nr_linii=0; nr_wtablicy++;}
        nr_linii++;
 
    }
        plik.close();
 
for (int i=0; i<=nr_linii; i++)
{
    cout<<*nazwa_produktu<<endl;
    cout<<*WW<<endl;
    cout<<*WBT<<endl;
}
delete [] nazwa_produktu; delete [] WW; delete [] WBT;
}

Lepiej zrób tak.

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
 
using namespace std;
 
int wybor;
 
void funkcja();
string tytul();
 
int main()
{
    cout<<"wybor: ";
    cin>> wybor;
 
    cout << tytul();
 
    return 0;
}
 
string tytul()
{
   switch(wybor)
   {
       case 1: return "\"produkty_zbozowe.txt\"";        break;
       case 2: return "\"produkty_miesne.txt\"";         break;
       case 3: return "\"produkty_mleczne.txt\"";        break;
       case 4: return "\"warzywa.txt\"";                 break;
       case 5: return "\"owoce.txt\"";                   break;
       case 6: return "\"pieczywo.txt\"";                break;
       case 7: return "\"cukier i slodycze.txt\"";       break;
       case 8: return "\"ryby i owoce morza.txt\"";      break;
       case 9: return "\"inne tluszcze.txt\"";           break;
   }
}
void funkcja()
{
    cout << "************MENU************"<<endl;
    cout << endl;
 
    fstream plik;
 
    plik.open(tytul().c_str() , ios::in);

    if (plik.good()==false)
    {
        cout<<"Plik nie istnieje!";
        exit(0);
    }

    string linia;
    int nr_linii = 1;
    int nr_wtablicy = 0;
    string *nazwa_produktu;
    float *WW;
    float *WBT;

    nazwa_produktu = new string[nr_wtablicy];
    WW = new float[nr_wtablicy];
    WBT = new float[nr_wtablicy];
 
    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: nazwa_produktu[nr_wtablicy] = linia;               break;
            case 2: WW[nr_wtablicy]             = atof(linia.c_str()); break;
            case 3: WBT[nr_wtablicy]            = atof(linia.c_str()); break;
        }

        if(nr_linii == 3)
        {
            nr_linii=0; nr_wtablicy++;
        }
        nr_linii++;
 
    }
        plik.close();
 
    for (int i=0; i<=nr_linii; i++)
    {
        cout<<*nazwa_produktu<<endl;
        cout<<*WW<<endl;
        cout<<*WBT<<endl;
    }

   delete [] nazwa_produktu;
   delete [] WW;
   delete [] WBT;
}

Ponieważ funkcja "tytul" nie zwraca wartości, tylko je wypisuje w konsoli. Po drugie funkcja "plik.open" nie przyjmuje argumentu (znaczy ścieżki) jako string tylko jako char* więc trzeba zamienić string na char*. Czyli zamiast

plik.open(tytul() , ios::in);

to wpisz

plik.open(tytul().c_str() , ios::in);

PS. Dlatego, że funkcja była wywołana w main wywnioskowałem, że chcesz ją wypisać, stąd dodatkowy cout. Poprzestawiałem ci troszeczkę kod, aby był bardziej czytelny.

 

komentarz 15 grudnia 2016 przez mibdbz Gaduła (4,300 p.)
Bardzo dziękuję za odpowiedź. Po tym jak wpisałem te zmiany działa to o co prosiłem w pytaniu. Nie działa niestety otwarcie danego pliku, których nazwy zawarte są w funkcji "tytul", a które powinny się wpisywać w funkcję "plik.open()" zawartą w "funkcja". Wypisuje mi zgodnie z zabezpieczeniem, że plik nie istnieje choć istnieje i nazywa się poprawnie. Poprawiłem oczywiście podkreślnik w nazwach plików w funkcji "tytul".
komentarz 15 grudnia 2016 przez maly Nałogowiec (37,190 p.)
int nr_wtablicy = 0;
nazwa_produktu = new string[nr_wtablicy];
WW = new float[nr_wtablicy];
WBT = new float[nr_wtablicy];

Tak zalokowane tablice mają rozmiar zerowy.

Po drugie funkcja "plik.open" nie przyjmuje argumentu (znaczy ścieżki) jako string tylko jako char* więc trzeba zamienić string na char*.

Nie prawda.

Nie działa niestety otwarcie danego pliku...

Bo nazwy plików to np. produkty_zbozowe.txt a nie "produkty_zbozowe.txt"

komentarz 15 grudnia 2016 przez Patrix354 Bywalec (2,030 p.)
Sprawdziłem, że przekazanie ścieżki jako argumentu string jest możliwe w C++11(miałem trochę nieaktualne informacje). To, że tablice mają zerowy rozmiar to nie zauważyłem.
komentarz 16 grudnia 2016 przez mibdbz Gaduła (4,300 p.)
Bardzo dziękuję za zainteresowanie moimi błędami! to co napisaliście bardzo mi pomaga. Jeszcze wszystkiego nie rozwiązałem, ale jestem na dobrej drodze. Nie wiedziałem, że ktoś tak początkujący spotka się tu ze zrozumieniem. Program jeszcze nie działa tak jak bym chciał, ale nie będę się o wszystko pytał bo niczego nie nauczę się sam. Jeszcze raz wszystkim bardzo dziękuję.
+1 głos
odpowiedź 14 grudnia 2016 przez playerony Pasjonat (15,240 p.)

Daj znać czy teraz jest dobrze:

int main()
{
    cout<<"wybor: ";
    cin>> wybor;

    funkcja();

    return 0;
}

string tytul()
{
   switch(wybor)
   {
       case 1: return "\"produkty_zbozowe.txt\"";        break;
       case 2: return "\"produkty_miesne.txt\"";         break;
       case 3: return "\"produkty_mleczne.txt\"";        break;
       case 4: return "\"warzywa.txt\"";                 break;
       case 5: return "\"owoce.txt\"";                   break;
       case 6: return "\"pieczywo.txt\"";                break;
       case 7: return "\"cukier i slodycze.txt\"";       break;
       case 8: return "\"ryby i owoce morza.txt\"";      break;
       default: return "\"inne tluszcze.txt\"";           break;
   }
}

 

–1 głos
odpowiedź 14 grudnia 2016 przez surfeliza Stary wyjadacz (11,260 p.)
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

int wybor;
void funkcja(); string tytul();

int main()
{
    cout<<"wybor: ";
    cin>> wybor;

    funkcja();
    return 0;
}

string tytul()
{
   switch(wybor)
   {
       case 1: return "\"produkty_zbozowe.txt\"";        break;
       case 2: return "\"produkty_miesne.txt\"";         break;
       case 3: return "\"produkty_mleczne.txt\"";        break;
       case 4: return "\"warzywa.txt\"";                 break;
       case 5: return "\"owoce.txt\"";                   break;
       case 6: return "\"pieczywo.txt\"";                break;
       case 7: return "\"cukier i slodycze.txt\"";       break;
       case 8: return "\"ryby i owoce morza.txt\"";      break;
       default: return "\"inne tluszcze.txt\"";           break;
   }
}
void funkcja()
    {
        cout << "************MENU************"<<endl;
        cout << endl;

    fstream plik;

    plik.open(tytul().c_str() , ios::in);
    if (plik.good()==false)
    {
        cout<<"Plik nie istnieje!";
        exit(0);
    }
    string linia; int nr_linii = 1; int nr_wtablicy = 0;
    string *nazwa_produktu; float *WW; float *WBT;
    nazwa_produktu = new string[nr_wtablicy];
    WW = new float[nr_wtablicy];
    WBT = new float[nr_wtablicy];

    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: nazwa_produktu[nr_wtablicy] = linia;               break;
            case 2: WW[nr_wtablicy]             = atof(linia.c_str()); break;
            case 3: WBT[nr_wtablicy]            = atof(linia.c_str()); break;
        }
        if(nr_linii == 3) {nr_linii=0; nr_wtablicy++;}
        nr_linii++;

    }
        plik.close();

for (int i=0; i<=nr_linii; i++)
{
    cout<<*nazwa_produktu<<endl;
    cout<<*WW<<endl;
    cout<<*WBT<<endl;
}
delete [] nazwa_produktu; delete [] WW; delete [] WBT;
}

 

Podobne pytania

0 głosów
4 odpowiedzi 286 wizyt
pytanie zadane 28 lutego 2017 w C i C++ przez Florek Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 141 wizyt
0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 4 listopada 2018 w C i C++ przez amited Początkujący (470 p.)

92,690 zapytań

141,603 odpowiedzi

320,102 komentarzy

62,051 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...