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

Raz program działa, raz nie. Nieznany błąd

Ostatnio zmodyfikowano 2014-05-04 17:42
Autor Wiadomość
ernic
Temat założony przez niniejszego użytkownika
Raz program działa, raz nie. Nieznany błąd
» 2014-05-04 16:10:12
Witam. Postawiłem sobie za zadanie napisanie klas obsługujących bramki logiczne.
Wstępna koncepcja to możliwośc tworzenia obiektów na podstawie klas pochodnych (OR, NOR, AND itp.), i stworzeniu metody wprowadzania danych do obiektu i metody pobierającej dane wynikowe, co mniej więcej zrealizowałem.
Jest to mój początek w programowaniu. Dziwi mnie to że program raz działa, a raz nie.
Program wykonuje się w pełni średnio co 3-4 raz, a przeważnie zwraca niezidnetyfikowaną wartość, przy tych samych danych wejściowych. Nie mam pojęcia w czym szukać problemu.
Proszę chociaż o jakieś wskazówki które pomogłyby mi znaleźć w czym problem.

Edit:

Między czasie pisania programu stwierdziłem że program wykrzaczał się zawsze gdy nie miałem dodanych obu bibliotek cstdarg i stdarg_h. Użyłem ich do celu ustalania ilości wejść do konkretnej bramki w trakcie pracy programu.




C/C++
////Bramki.cpp

#include <iostream> // cin, cout
#include <string> // klasa string
#include <cstdlib> //standardowa biblioteka C
#include <cstdarg> //funkcja ze zmienna liczba argumentow
#include <stdarg.h> //funkcja ze zmienna liczba argumentow, dla zachowania stabilnosci programu zalaczona;

using namespace std;

class Bramka
{
public:
    int n;
    int input[];
   
   
   
    Bramka()
    {
        int input[ 0 ];
        cout << "Tworzenie obiektu o liczbie wejsc: 1" << endl;
        this->input[ 0 ] = 0;
        cout << endl;
    }
   
    Bramka( int inputs )
    {
        this->n = inputs;
        int input[ n ];
        cout << "Tworzenie obiektu o liczbie wejsc: " << inputs << endl;
        for( int i = 0; i < inputs; i++ ) { this->input[ i ] = 0; };
        cout << endl;
    }
   
    ~Bramka()
    {
        ;
    }
   
   
    //virtual bool getOutput();
   
    int getInputs() { return this->n; }
   
    void setInputStatus( int a,...)
    {
        va_list arguments;
        va_start( arguments, a );
        //cout << a << endl;
        for( int x = 1; x <= a; x++ )
        {
            this->input[ x - 1 ] = va_arg( arguments, int );
        }
        va_end( arguments );
    }
   
    int getInputStatus()
    {
        cout << " Status wejsc bramki: ";
        for( int i = 0; i < n; i++ )
        {
            cout << bool( this->input[ i ] );
        }
        cout << endl;
    }
   
};

class NOT
    : public Bramka
{
public:
    NOT()
    {
        int input[ 0 ];
        n = 1;
        cout << "Tworzenie obiektu NOT o liczbie wejsc: 1" << endl;
        this->input[ 0 ] = 0;
        cout << endl;
    }
    ~NOT()
    {
        ;
    }
    bool getOutput()
    {
        int out =!( input[ 0 ] );
        return out;
    }
   
};

class AND
    : public Bramka
{
public:
    AND( int inputs )
    {
        this->n = inputs;
        int input[ n ];
        cout << "Tworzenie obiektu AND o liczbie wejsc: " << inputs << endl;
        for( int i = 0; i < inputs; i++ ) { this->input[ i ] = 0; };
        cout << endl;
    }
    ~AND()
    {
        ;
    }
   
    bool getOutput()
    {
        int out;
        for( int i = 0; i < n; i++ )
        {
            if( input[ i ] == 1 )
            {
                out = 1;
            }
            else
            {
                return 0;
                break;
            }
        }
        return out;
    }
   
};


class NAND
    : public Bramka
{
public:
    NAND( int inputs )
    {
        this->n = inputs;
        int input[ n ];
        cout << "Tworzenie obiektu NAND o liczbie wejsc: " << inputs << endl;
        for( int i = 0; i < inputs; i++ ) { this->input[ i ] = 0; };
        cout << endl;
    }
    ~NAND()
    {
        ;
    }
   
    bool getOutput()
    {
        int out;
        for( int i = 0; i < n; i++ )
        {
            if( input[ i ] == 1 )
            {
                out = 0;
            }
            else
            {
                return 1;
                break;
            }
        }
        return out;
    }
   
};

class OR
    : public Bramka
{
public:
    OR( int inputs )
    {
        this->n = inputs;
        int input[ n ];
        cout << "Tworzenie obiektu OR o liczbie wejsc: " << inputs << endl;
        for( int i = 0; i < inputs; i++ ) { this->input[ i ] = 0; };
        cout << endl;
    }
    ~OR()
    {
        ;
    }
   
    bool getOutput()
    {
        int out;
        for( int i = 0; i < n; i++ )
        {
            if( input[ i ] == 1 )
            {
                return 1;
                break;
            }
            else
            {
                out = 0;
            }
        }
        return out;
    }
   
};

class NOR
    : public Bramka
{
public:
    NOR( int inputs )
    {
        this->n = inputs;
        int input[ n ];
        cout << "Tworzenie obiektu NOR o liczbie wejsc: " << inputs << endl;
        for( int i = 0; i < inputs; i++ ) { this->input[ i ] = 0; };
        cout << endl;
    }
    ~NOR()
    {
        ;
    }
   
    bool getOutput()
    {
        int out;
        for( int i = 0; i < n; i++ )
        {
            if( input[ i ] == 1 )
            {
                return 0;
                break;
            }
            else
            {
                out = 1;
            }
        }
        return out;
    }
   
};



int main()
{
   
    OR * inst0 = new OR( 2 ); //tworzenie obiektu bramka OR o 2 wejsciach
    // NOR *inst1 = new NOR(2);
    // AND *inst3 = new AND(2);
    // NAND *inst4 = new NAND(2);
    inst0->setInputStatus( 2, 1, 1 ); //inicjalizacja wejsc bramki (<liczba_wejsc.koniecznie identyczna!!>,<wejscie0>,<wejscie1>... itp.)
    // inst1->setInputStatus(2,1,1);
    // inst3->setInputStatus(2,1,1);
    // inst4->setInputStatus(2,1,1);
    //AND *inst5 = new AND(5);
    // inst4->setInputStatus(5,1,1,1,1,0);
   
   
   
   
    cout << "\nINST0 OR ";
    inst0->getInputStatus();
    // cout << "\nINST1 NOR";
    // inst1->getInputStatus();
    // cout << "\nINST3 AND";
    // inst3->getInputStatus();
    // cout << "\nINST4 NAND";
    // inst4->getInputStatus();
    // cout << "\nINST5 NAND";
    // inst5->getInputStatus();
   
   
    cout << "Wyniki bramki OR: " << inst0->getOutput() << endl;
    // cout <<"Wyniki bramki NOR: " <<inst1->getOutput() << endl;
    // cout <<"Wyniki bramki AND: " <<inst3->getOutput() << endl;
    // cout <<"Wyniki bramki NAND: " <<inst4->getOutput() << endl;
    // cout <<"Wyniki bramki AND5: " <<inst5->getOutput() << endl;
   
   
   
   
    delete inst0;
    // delete inst1;
    // delete inst3;
    // delete inst4;
    return 0;
    system( "pause" );
}
P-109277
pekfos
» 2014-05-04 16:49:19
C/C++
int input[];
Co to..?

C/C++
int input[ 0 ];
I to..?

C/C++
int input[ n ];
A to..?

Itd.. Tu chyba nie ma ani jednej poprawnie użytej tablicy.
P-109280
ernic
Temat założony przez niniejszego użytkownika
» 2014-05-04 17:02:17
Racja, te linijki sa zbedne, oprócz
int input[];
 co natomiast można było zrealizować w mądrzejszy sposób, czyli utworzenie w konstruktorze.
P-109282
Chlorek
» 2014-05-04 17:31:19
Tablice o nieznanej wielkości w czasie kompilacji można tworzyć jedynie dynamicznie czyli np
int * x = new int[ n ];
Nie wczytałem się dokładnie w kod, ale teoretycznie kompilator w twoim przypadku nie powinien w ogóle pozwolić na kompilację takiego kodu.

A tablica o wymiarze 0 ma wielkość 0, nie 1. Jeśli chcesz mieć 1 to wpisujesz [1], gdzie użyteczną przestrzenią jest miejsce o indeksie [0] (liczymy od zera).

#Edit
A co do int nazwa[]. Takie coś w większości przypadków nie może mieć miejsca. W klasie taka definicja ci przejdzie (ale wielkość będzie 0). Ogólnie takiej definicji używa się razem z inicjalizacją, gdy chcesz by kompilator w CZASIE KOMPILACJI określił wymaganą ilość miejsca.
P-109286
ernic
Temat założony przez niniejszego użytkownika
» 2014-05-04 17:42:03
Dziękuję za odpowiedzi, jeszcze jestem niedoświadczony i idiotyzmy popełniam.
Zauważyłem że jeśli nie użyję delete w stosunku do obiektu program chodzi już bez zarzutu. Ale chyba tak być nie powinno.
P-109287
« 1 »
  Strona 1 z 1