Raz program działa, raz nie. Nieznany błąd
Ostatnio zmodyfikowano 2014-05-04 17:42
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.
#include <iostream> #include <string> #include <cstdlib> #include <cstdarg> #include <stdarg.h>
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() { ; } int getInputs() { return this->n; } void setInputStatus( int a,...) { va_list arguments; va_start( arguments, a ); 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 ); inst0->setInputStatus( 2, 1, 1 ); cout << "\nINST0 OR "; inst0->getInputStatus(); cout << "Wyniki bramki OR: " << inst0->getOutput() << endl; delete inst0; return 0; system( "pause" ); }
|
|
pekfos |
» 2014-05-04 16:49:19 Co to..? I to..? A to..? Itd.. Tu chyba nie ma ani jednej poprawnie użytej tablicy. |
|
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. |
|
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. |
|
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. |
|
« 1 » |