[C++] wielowymiarowa tablica - problem ze startem programu

iksigrek123
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 30 sie 2011, o 19:08
Płeć: Mężczyzna
Lokalizacja: ŁDZ

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: iksigrek123 »

Witam!

Mam problem z programem napisanym w C++ który przyporządkowuje wartości wierszom i kolumnom podawanym przez użytkownika.
Oto on:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a,b,i,j,n;
    int tab[i][j];
    cout << "Ile wierszy ma miec tablica? " << endl;
    cin >> a;
    cout << "Ile kolumn ma miec tablica? " << endl;
    cin >> b;
    cout << endl;
         for(i=0;i<a;i++){
                          for(j=0;j<b;j++){
                                           cout << "Zgodnie z zalozeniem 'tab[i][j]=n' podaj wartosc n dla ";
                                           cout << "wiersza i=";
                                           cout << i;
                                           cout << " oraz kolumny j=";
                                           cout << j << endl;
                                           cout << "n=";
                                           cin >>n;
                                           tab[i][j] = n;
                                           n=0;}
                          }
         for(i=0;i<a;i++){
                          for(j=0;j<b;j++){
                          cout << "Wartosc w tablicy dla wiersza i=";
                          cout << i;
                          cout << "oraz kolumny j=";
                          cout << j;
                          cout << " wynosi: ";
                          cout << tab[i][j];
                          cout << endl;
                          }
         }
                                               
    system("PAUSE");
    return EXIT_SUCCESS;
}
Powyższy program kompiluje się bez problemu jednak wyrzuca mi błąd i praktycznie nie startuje. Jest napisany tak aby odpalał się poprzez wiersz poleceń. Kiedy pisałem ten post pomyślałem, że może chodzi o typ zmiennej który zastosowałem i nie powienien być to integer. Czy możliwe byłoby uproszczenie kodu tak aby zajmował mniej miejsca (tj. pozbycie się ewentualnie jednej z pętli for)?

Inny program, który przyporządkowuje wartości do indeksu w tablicy jednowymiarowej działa bez problemu. Wygląda tak:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a,i,n;
    int tab[i];
    cout << "Ile indeksow ma miec tablica? " << endl;
    cin >> a;
    cout << endl;
         for(i=0;i<a;i++){
                                           cout << "Zgodnie z zalozeniem 'tab[i]=n' podaj wartosc n dla ";
                                           cout << "indeksu i=";
                                           cout << i << endl;
                                           cout << "n=";
                                           cin >>n;
                                           tab[i]=n;
                                           n=0;}
         for(i=0;i<a;i++){
                          cout << "Wartosc dla indeksu i=";
                          cout << i;
                          cout << " wynosi: ";
                          cout << tab[i];
                          cout << endl<< endl;
                          }
                                               
    system("PAUSE");
    return EXIT_SUCCESS;
}
Program napisany jest w Devc++ ver. 4.9.9.2

Z góry dziękuję za pomoc.

Pozdrawiam
Ostatnio zmieniony 23 lis 2011, o 23:40 przez Afish, łącznie zmieniany 3 razy.
Powód: Kod w [code][\code]!
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: wawek91 »

1) za system("pause") powinni Cię powiesić
2) wydaję mi się, że piszemy jeszcze w standardzie gdzie tablice dynamiczną należy stworzyć przez użycie słowa kluczowego 'new' (nie możesz sobie stworzyć tab[j] gdzie 'i' i 'j' są podawane przez użytkownika
3) nie mozesz zrezygnowac z jednej pętli poniewaz wtedy to nie jest tablica dwuwymiarowa

Edit:
Podpowiedź do 'new'

Kod: Zaznacz cały

int **tab = new int *tab[a]
for(int i = 0; i < a; i++)
   tab[i] = new int[b]
abc666

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: abc666 »

1) za system("pause") powinni Cię powiesić
Bez przesady, po prostu wywołał polecenie systemowe, co w tym złego?
iksigrek123
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 30 sie 2011, o 19:08
Płeć: Mężczyzna
Lokalizacja: ŁDZ

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: iksigrek123 »

wawek91 pisze:1) za system("pause") powinni Cię powiesić
2) wydaję mi się, że piszemy jeszcze w standardzie gdzie tablice dynamiczną należy stworzyć przez użycie słowa kluczowego 'new' (nie możesz sobie stworzyć tab[j] gdzie 'i' i 'j' są podawane przez użytkownika
3) nie mozesz zrezygnowac z jednej pętli poniewaz wtedy to nie jest tablica dwuwymiarowa

Edit:
Podpowiedź do 'new'

Kod: Zaznacz cały

int **tab = new int *tab[a]
for(int i = 0; i < a; i++)
   tab[i] = new int[b]

No tak, masz rację.
A co do wieszania, no to faktycznie programik mi się zwiesił :(

Dzięki.
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: wawek91 »

abc666 pisze:Bez przesady, po prostu wywołał polecenie systemowe, co w tym złego?


A konkretniej:
1)It's not portable. This works only on systems that have the PAUSE command at the system level, like DOS or Windows. But not Linux and most others...

2)It's a very expensive and resource heavy function call. It's like using a bulldozer to open your front door. It works, but the key is cleaner, easier, cheaper. What system() does is:

*suspend your program

*call the operating system

*open an operating system shell (relaunches the O/S in a sub-process)

*the O/S must now find the PAUSE command

*allocate the memory to execute the command

*execute the command and wait for a keystroke

*deallocate the memory

*exit the OS

*resume your program

There are much cleaner ways included in the language itself that make all this unnessesary.

3)You must include a header you probably don't need: stdlib.h or cstdlib
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: Afish »

Co nie zmienia faktu, że za to wieszać nie powinni. Pomijam już fakt, że tak naprawdę jedynym sensownym argumentem jest brak przenośności, reszta jest bardzo naciągana.
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: wawek91 »

Afish, naprawdę jeszcze do tej pory nie spotkałem się z kimś kto by mi powiedział 'tak używaj system("pause") to jest dobry nawyk' tylko wszędzie, gdzie czytam czy to na forach, czy gdziekolwiek indziej to zawsze osoby mądrzejsze ode mnie i z większym doświadczeniem krytykują kod, w którym ktoś zawiera tą instrukcję. A skoro są lepsze rozwiązania to dlaczego ich nie uczyć tylko przyzwyczajać do czegoś co jednak w dużym stopniu jest złe. Poza tym nie rozumiem tego:
Afish pisze:reszta jest bardzo naciągana
Tzn, co jest naciagane? Uważasz, że wywołując to polecenie nie odpalamy zewnętrznego programu (tylko po to aby nacisnąć klawisz)?
Xitami

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: Xitami »

Dev-C++ Status
"Program od 2005 roku nie jest już rozwijany."

to dobry powód by go porzucić, np. na rzecz

Kod: Zaznacz cały

http://www.codeblocks.org


do takich wprawek całkiem dobre "ide" to www.ideone.com albo www.codepad.org
A plik z kodem wynikowym można uzyskać np. tu: www.onlinecompiler.net
gwarancja przenośności, tak samo działa w domu i w szkole.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: Afish »

wawek91 pisze:Afish, naprawdę jeszcze do tej pory nie spotkałem się z kimś kto by mi powiedział 'tak używaj system("pause") to jest dobry nawyk' tylko wszędzie, gdzie czytam czy to na forach, czy gdziekolwiek indziej to zawsze osoby mądrzejsze ode mnie i z większym doświadczeniem krytykują kod, w którym ktoś zawiera tą instrukcję. A skoro są lepsze rozwiązania to dlaczego ich nie uczyć tylko przyzwyczajać do czegoś co jednak w dużym stopniu jest złe.
W żadnym momencie nie powiedziałem "Tak, używaj system("pause")".
wawek91 pisze:Poza tym nie rozumiem tego:
Afish pisze:reszta jest bardzo naciągana
Tzn, co jest naciagane? Uważasz, że wywołując to polecenie nie odpalamy zewnętrznego programu (tylko po to aby nacisnąć klawisz)?
Naciągane jest odradzanie wywoływania system("pause") dlatego, że to jest wolne. Jednokrotne wywołanie zewnętrznego programu będzie tak niemierzalnie wolne, że nie ma najmniejszej potrzeby zwracać na to uwagi. Jedynym argumentem przeciwko system("pause") jest fakt, że jest to nieprzenośne. Pomijam już trzeci argument (czyli być może niepotrzebne dołączenie cstdlib), bo to jest takie gdybanie, że szkoda komentować.
abc666

[C++] wielowymiarowa tablica - problem ze startem programu

Post autor: abc666 »

gdzie czytam czy to na forach, czy gdziekolwiek indziej to zawsze osoby mądrzejsze ode mnie i z większym doświadczeniem krytykują kod, w którym ktoś zawiera tą instrukcję.
Przecież tutaj chodzi o to, że zastosowanie tej instrukcji ma tak pomijalny wpływ na działanie programu, że nie wiem o co się czepiać. Umieszczana jest tylko i wyłącznie po to aby, okienko wiersza poleceń się nie zamknęło. Przecież tutaj nikt nie używa go w pętli, ani dowolny inny sposób. Dlatego argumenty o tym jak wielką pracę trzeba wywołać są raczej śmieszne. Poza tym ta instrukcja jest używana praktycznie tylko przez osoby, które uczą się języka, a nie w jakiś użytkowych programach. No i znowu argument o wielkiej pracy do wykonania jest raczej bez sensu w programie, który opiera się na dwóch for-ach.
ODPOWIEDZ