Pereiti prie turinio

C++ klaida funkcijoje


Rekomenduojami pranešimai

Klaida funkcijoje print.

65 C:\a1.cpp no match for 'operator[]' in 'movies'
Gal kas galite padėti surasti kur bėda?

#include <iostream>
#include <iomanip>
#include <vector>
#include <climits>
#include <fstream>
using namespace std;

struct Movie {
   int      year;
   double   dayPrice;
   bool     fresh;
   char     format;
   string   name;
};

typedef Movie Movies;

void printMenu      ();/*
void push           (      Movies&     movies);
void pop            (      Movies&     movies);
void top            (      Movies&     movies);
void kill           (      Movies&     movies);*/
void print          (const Movies&     movies); 
void load           (      Movies&     movies);

int main () {
   int size;
   cout << "Stack size: ";  cin >> size; // initialize 
   Movies     movies[size];

   for (;;) {
       cout << "\n----------------------------------------\n";
       cout << "(m - rodyti meniu) > ";
       string command;
       cin >> command;
            if (command == "0") return 0;
       else if (command == "m") printMenu      ();
       /*else if (command == "1") push           (movies[size]);
       else if (command == "2") pop            (movies[size]);
       else if (command == "3") top            (movies[size]);
       else if (command == "4") kill           (movies[size]);*/
       else if (command == "5") print          (movies[5]);
       else if (command == "l") load           (movies[5]);
       else cout << endl << "Neteisinga komanda..." << endl;   
   }
}

void printMenu () {
   cout << endl
        << "Video nuoma:"   << endl
        << "  1 - PUSH"     << endl
        << "  2 - POP"      << endl
        << "  3 - TOP"      << endl
        << "  4 - KILL"     << endl
        << endl
        << "  5 - PRINT"    << endl
        << "  l - LOAD"     << endl
        << endl
        << "  0 - baigti darba"   << endl;
}

void print    (const Movies&    movies) {
   for (int i = 0;  i < 5;  i++) {
       cout << (i+1) 
            << ". "  << movies[i].name
            << "\t"  << movies[i].year
            << "\t " << movies[i].dayPrice 
            << "\t " << movies[i].fresh 
            << "\t"  << movies[i].format
            << endl;
   }
}

void load (Movies& movies) {
   ifstream file ("duom.txt");
   int moviesCount;
   file >> moviesCount >> moviesCount;
   if (moviesCount != 0) {
       for (int i = 0; i < moviesCount; i++) {
           file >> movies[i].name;
           file >> movies[i].year;
           file >> movies[i].dayPrice;
           file >> movies[i].fresh;
           file >> movies[i].format;
       }
   }
   file.close();
   return;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kiek suprantu, tai tas const viską gadina:

void print(const Movies& movies); 

Jis neleidžia prieiti prie struktūros laukų.

Const pointer vs const data

 

O ir šiaip nėra prasmės į print funkciją paduoti reference'o, nes vis tiek objekto nekeiti, o ir struktūra ne tokia didelė, kad reikėtų vengti duomenų perkopijavimo. Tiesiog

void print(Movie movie); 

 

 

Dar keli patarimai:

  • Nekurk atskiro typedef'o tik tam, kad pakeistum duomenų tipo vardą į daugiskaitą. Pats "Movie m[]" jau savaime ir reiškia, kad daug "Movie" objektų.
  • Nelygiuok if'o su else if'u. Be to, funcijų deklaracijų toks lygiavimas bei skliaustų atitraukimas per kelis tab'us nuo funkcijos pavadinimo tik pasunkina kodo skaitymą.
  • Jeigu reikia begalinio ciklo, tai naudok while(true). for ciklas naudojamas, kai žinai pradinę reikšmę ir iki kiek ta reikšmė kinta.
  • Nėra main'e return'o.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

  • Jeigu reikia begalinio ciklo, tai naudok while(true). for ciklas naudojamas, kai žinai pradinę reikšmę ir iki kiek ta reikšmė kinta.

Patarimai geri, bet dėl šio... for(;; ) tikrai neretai naudojamas net ir patyrusių programuotojų ir tam yra viena kita priežastis („loop condition is constant“) :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Patarimai geri, bet dėl šio... for(;; ) tikrai neretai naudojamas net ir patyrusių programuotojų ir tam yra viena kita priežastis („loop condition is constant“) :)

 

Na, gal ir nereikėjo taip kategoriškai teigti, kad vienas būdas teisingesnis už kitą :)

 

Mano manymu geriausia iš vis vengti tokių neapibrėžtų ciklų. Dažniausiai įsivedu kintamąjį, kuris signalizuoja ciklo pabaigą, kad paskui nereikėtų vidui ciklo break dėlioti (nors kartais to neišvengsi). Ir bet kokiu atveju, ši programa tikrai ne begalinė, anksčiau ar vėliau vis tiek turėtų būti programa užbaigiama, kas šiuo atveju atliekama per jėgą, paspaudžiant X.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

s++; - nelabai suprantu kam sitas reikalingas?

Tarkim turi 100 vietų masyvą, yra užpildyta 10 vietų (s == 10). Jei viską perstumi į dešinę per vieną vietą, tada būna užimtos nebe 0-9 vietos, bet 1-10, o 0 - laisva. Iš viso 11 vietų, tad s++ ir tada turim s == 11 :)

 

Bent aš taip supratau. Bet tada jis turi už ciklo būti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandysiu paaiškinti buitiškai.

 

turim į eilę vienas paskui kito sudėtus objekus ir eilės gale dar yra laisvos vietos: [a|b|c|d| | | ].

Jeigu reikia įterpti naują objektą kur nors eilės viduje (kad ir pirmoje vietoje), tai pirmiausia jam reikia atlaisvinti vietą:

[a|b|c|d| | | ] → [a|b|c| |d| | ] → [a|b| |c|d| | ] → [a| |b|c|d| | ] → [ |a|b|c|d| | ].

Kadangi pirma vieta laisva, tai į ją ir įdedame norimą objektą: [x|a|b|c|d| | ].

 

Kadangi kompiuteryje kopijavimas yra trumpesnė operacija, negu perkėlimas (perkėlimas ≡ kopijavimas + pradinio pašalinimas), tai viską atliekame kopijuodami ant viršaus:

[a|b|c|d| | | ] → [a|b|c|d|d| | ] → [a|b|c|c|d| | ] → [a|b|b|c|d| | ] → [a|a|b|c|d| | ] → [x|a|b|c|d| | ].

 

Tą pavertus kodu:

int m[]; //masyvas
int n;   //elementų skaičius masyve
int k;   //kur įterpti
int x;   //ką įterpti
for(int i = n - 1; i >= k; i--)  //pradedam nuo paskutinio elemento m[n - 1] ir baigiam k-tuoju
{
   m[i + 1] = m[i];  //paslenkam per vieną tolyn, taip atlaisvindami i-tąją vietą
}
m[k] = x;
n++;

Nuoroda į pranešimą
Dalintis kituose puslapiuose

dar vienas klausimas. Yra tokia funkcija:

 

void kill (int size, int moviesCount) {
    moviesCount = 0;
    size = 0;
}

 

Kaip į mainą grąžinti priskirtas reikšmes? be return (size); yra kokių nors būdų?

Redagavo sliekas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

dar vienas klausimas. Yra tokia funkcija:

[...]

Kaip į mainą grąžinti priskirtas reikšmes? be return (size); yra kokių nors būdų?

void kill (int &size, int &moviesCount) 
{
    moviesCount = 0;
    size = 0;
}

 

Pridėjus prie parametrų & ženklą juos perduos tiesiogiai (reference), be jo į funkciją perduodamos parametrų kopijos. Tai leis redaguoti jų reikšmes ir visi pakitimai matysis už funkcijos ribų.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

void kill (int &size, int &moviesCount) 
{
    moviesCount = 0;
    size = 0;
}

 

Pridėjus prie parametrų & ženklą juos perduos tiesiogiai (reference), be jo į funkciją perduodamos parametrų kopijos. Tai leis redaguoti jų reikšmes ir visi pakitimai matysis už funkcijos ribų.

 

using namespace std;

struct Movie {
   int      year;
   double   dayPrice;
   bool     fresh;
   char     format;
   string   name;
};

void printMenu      ();
void kill         (int size);

int main () {
   unsigned int size;
   cout << "Stack size: ";  cin >> size; // initialize 
   Movie movies[size];

   ifstream file ("duom.txt");
   int moviesCount;
   file >> moviesCount;
   if (moviesCount != 0) {
       for (int i = 0; i < moviesCount; i++) {
           file >> movies[i].name;
           file >> movies[i].year;
           file >> movies[i].dayPrice;
           file >> movies[i].fresh;
           file >> movies[i].format;
       }
   }
   file.close();

   for (;;) {
       cout << "\n----------------------------------------\n";
       cout << "(m - rodyti meniu) > ";
       string command;
       cin >> command;
            if (command == "0") return 0;
       else if (command == "m") printMenu      ();
       else if (command == "4") kill           (size);
       else cout << endl << "Neteisinga komanda..." << endl;  
   }
}

void printMenu () {
   cout << endl
        << "Video nuoma:"   << endl
        << "  4 - KILL"     << endl 
        << "  0 - baigti darba"   << endl;

}

void kill (int &size) {
    size = 0;
}

Toks būdas nelabai veikia, gal ką ne taip darau?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip minėjo hafnis1324, funkcijos deklaracija ir definicija neatitinka, vienur void kill(int size);, kitur void kill(int &size){...}. Matyt čia ir bus problema.

 

Tik rekomenduočiau tau šitą veiksmą rašyti tiesiogiai if'e, nes neverta kurti funkcijos dėl vieno kintamojo nunulinimo. O ir struktūrinio ar semantinio aiškumo ta funkcija neprideda.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...