Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Klasa ze skladnikami : tablica wskaznikow do funkcji oraz tablica string.

Ostatnio zmodyfikowano 2013-10-18 12:35
Autor Wiadomość
Haker123
Temat założony przez niniejszego użytkownika
Klasa ze skladnikami : tablica wskaznikow do funkcji oraz tablica string.
» 2013-10-17 17:44:27
Witam.

Chcialem napisac sobie uniwersalna klase wypisujaca menu i uruchamiajaca odpowiednie funkcje ale mam problemy z tablica string[] ktora ma przechowywac wyslane napisy i wypisywac je w na liscie menu oraz tablica wskaznikow do funkcji zwracajacych typ void i nie przyjmujacych zadnych argumentow.

Chcialem przez konstruktor wyslac dane do stringa oraz wielkosc tablicy w klacie cMenu, ta sama wielkosc miala wyb wykozystana do tablicy wskaznikow do funkcji. Kod jest narazie prowizorycznie bo nie moge przypisac danych do string a jak wybiore z menu wyjscie to wyskakuje blad :
Run-Time Check Failure #2 - Stack around the variable 'menu' was corrupted.
Z tego co sie orientuje to ten blad powinien wyskoczyc jak chce cos przypisac poza tablica, tylko ze po wcisnieciu entera na pozycji "Wyjscie" program powinien sie zakonczyc bez uruchamiania funkcji (tablica wskaznikow do funkcji) a tam nic przeciez nie przypisuje.
C/C++
#include <iostream>
#include <conio.h>
#include <string>
#include "kolko_i_krzyzyk\kolko_i_krzyzyk.h"


using namespace std;
//KLASA MENU.   WYPISUJE MENU I URUCHAMIA ODPOWIEDZNIA KLASE
class cMenu
{
    //string *Tablica_nazw ;
    const int wielkosc_tablic;
    int pozycja; //ZMIENNA DO WYBRANIA ODPOWIEDNIEJ FUNKCJI
    bool prawda; //ZMIENNA DO WYJSCIA Z PETLI WYPISUJACEJ
    void( * wFunkcja_menu[] )( void ); //TABLICA FUNKCJI DO WYPISANIA/WYBRANIA
   
public:
    void wypisz(); //FUNKCJA WYPISUJACA MENU
   
    //KONSTRUKTOR
    cMenu( void( * wFunkcja[] )( void ), int const wielkosc )
        : wielkosc_tablic( wielkosc )
        , pozycja( 0 )
        , prawda( true )
    {
        wFunkcja_menu[ wielkosc_tablic ];
        for( int i = 0; i < wielkosc_tablic; i++ )
        {
            //Tablica_nazw[i] = nazwy[i] ;
            wFunkcja_menu[ i ] = wFunkcja[ i ];
        }
    }
   
    //DESTRUKTOR
    /*~cMenu()
    {
    for(int i = 0 ; i < wielkosc_tablic ; i++)
    delete wFunkcja_menu[i] ;
    }*/
};

void cMenu::wypisz()
{
    while( prawda )
    {
        cout << string( 26, '*' )
        << "\n****Program treningowy****\n"
        << "*Poruszamy sie strzalkami*\n"
        << "**A zatwierdzamy ENTEREM**\n"
        << string( 26, '*' ) << "\n\n";
       
        //WYBIERANIE POZYCJI
        switch( pozycja )
        {
        case 0:
            cout << "Kolko i krzyzyk        <====\n"
            << "Labirynt                    \n"
            << "Wyjscie                     \n";
            break;
           
        case 1:
            cout << "Kolko i krzyzyk             \n"
            << "Labirynt               <====\n"
            << "Wyjscie                     \n";
            break;
           
        case 2:
            cout << "Kolko i krzyzyk             \n"
            << "Labirynt                    \n"
            << "Wyjscie                <====\n";
            break;
        } //SWITCH POZYCJA
       
        //POBIERANIE ZNAKU Z KLAWIATURY
        int znak = getch();
       
        //WYBIERANIE ODPOWIEDNIEJ STRZALKI
        switch( znak )
        {
        case 224: //ZNAK SPECJALNY
            if( kbhit() ) //FUNKCJA SPRAWDZAJACA CZY JEST ZNAK SPECJALNY
            {
                znak = getch();
                switch( znak )
                {
                case 72: //STRZALKA W GORE
                    pozycja--;
                    if( pozycja < 0 ) pozycja = 0;
                   
                    break;
                case 80: //STRZALKA W DOL
                    pozycja++;
                    if( pozycja > 2 ) pozycja = 2;
                   
                    break;
                    default:
                    break;
                }
            }
            break;
        case 13:
            //JESLI POZYCJA = 2 (WYJSCIE) TO KONCZYMY
            if( pozycja == 2 ) { prawda = false; return; }
           
            //JESLI POZYCJA = 0 LUB 1 TO URUCHAMIAMY ODPOWIEDZNIA FUNKCJE
            if( pozycja < 2 && pozycja >= 0 ) { system( "cls" ); wFunkcja_menu[ pozycja ](); }
            break;
            default:
            break;
        } //SWITCH ZNAK
        system( "cls" ); //CZYSZCZENIE EKRANU
    } //WHILE
}


int main()
{
    int const wielkosc = 5;
    string nazwy[ 5 ];
   
    void( * wFunkcja_menu[ wielkosc ] )( void );
    wFunkcja_menu[ 0 ] = Gra;
    cMenu menu( wFunkcja_menu, wielkosc );
    menu.wypisz();
    return 0;
}
Bede wdzieczny za pomoc.
P-93884
pekfos
» 2013-10-17 18:06:42
C/C++
wFunkcja_menu[ wielkosc_tablic ];
Co to?
P-93888
Haker123
Temat założony przez niniejszego użytkownika
» 2013-10-17 18:10:12
Kombinowalem jak nadac wielkosc tej tablicy wskaznikow do funkcji, i dopiero po takim zapisie normalnie mi wyswietlalo funkcje.


Edit:

A tablice string to probowalem przez wskaznik , przez wartosc , przez new i nie wychodzilo mi to. Cos robie zle ale nie wiem co.
P-93889
pekfos
» 2013-10-17 18:12:15
Dynamicznie zaalokuj tyle wskaźników, ile potrzebujesz.
P-93890
Haker123
Temat założony przez niniejszego użytkownika
» 2013-10-17 18:17:26
Jak robilem przez new przy tablicy wskaznikow to wyskakiwal mi blad, niestety nie pamietam dokladnie ale znak = byl podkreslony na czerwono i pisalo cos ze on niepasuje binarnie czy jakos tak.
P-93891
Monika90
» 2013-10-17 19:26:10
Jakiego kompilatora używasz?

C/C++
class cMenu {
    void( * wFunkcja_menu[] )( void ); //TABLICA FUNKCJI DO WYPISANIA/W
};
Powyższa deklaracja tablicy jest nieprawidłowa. Niestatyczna tablica w klasie nie może nie mieć podanego rozmiaru.
P-93895
Haker123
Temat założony przez niniejszego użytkownika
» 2013-10-17 19:51:19
Kozystam z Microsoft Visual C++ 2010 Express.
Jak narazie to nie wiem jak mam rozwiazac ten problem bo nie umiem narazie dobrze kozystac ze wskaznikow na funkcje, a przy tym problemie wydaly mi sie najlepszym wyjsciem.
Wiem ze prosze o wiele ale czy moze ktos napisac mi jak powinna wygladac ta klasa?? Bo juz 2 dzien siedze i staram sie cos wymyslec z pomoca internetu.
P-93900
Monika90
» 2013-10-17 20:10:55
Może tak:
C/C++
class Menu
{
    struct Pozycja
    {
        std::string nazwa;
        std::function < void() > akcja;
    };
   
    std::vector < Pozycja > pozycje;
};
Jak kompilator nie ma std::function, to zastąp ją przez boost::function, albo std::tr1::function.
P-93904
« 1 » 2
  Strona 1 z 2 Następna strona