• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program wysypuje się przy generowaniu liczb - tablice dwuwymiarowe

Aruba Cloud - Virtual Private Server VPS
0 głosów
303 wizyt
pytanie zadane 16 października 2015 w C i C++ przez Armando Obywatel (1,870 p.)

Cześć!

Udało mi się naprawić kod napisany przez mojego nauczyciela (specjalnie błędnie) ale program po uruchomieniu i próbie wygenerowania liczb do tablicy dwuwymiarowej zwyczajnie się wysypuje i nie mam pojęcia dlaczego. Bardzo proszę o wskazanie błędu i wytłumaczenia co jest źle. Z góry dziękuję :)

 

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wpisz_oceny(float **a,int n, int k) //n-ilosc uczniow, k-ilosc ocen
{
	int i,j,ilo;

	for (i=0;i<n;i++)
		for (j=0;j<k;j++) //zerowanie tablicy
			a[i][j]=0;
	srand(time(NULL));
	for (i=0;i<n;i++)
	{
		ilo=rand()%11;
		for (j=0;j<ilo;j++)
			a[i][j]=rand()%6+1;
	}
}

void wyswietl_oceny(float **a,int n, int k)
{
	int i,j;
	system("cls");
	cout<<"nr ucznia     oceny\n";
	for(i=0;i<n;i++)
	{
		cout<<i<<"     ";
		for(j=0;j<k;j++)
			if (a[i][j]!=0) cout<<a[i][j]<<" ";
		cout<<"\n";
	}
	system("pause");
}

int main()
{
	char w;
	float *oceny[10][10];
	do
	{
	system("cls");
	cout<<"Wybierz co chcesz zrobic:";
	cout<<"\n1. Wpisywanie liczb do tablicy";
	cout<<"\n2. Wyswietlanie liczb z tablicy";
	cout<<"\n3. Obiczenie sredniej";
	cout<<"\n4. Koniec\n";
	cin>>w;

	switch(w)
	{
		case '1': wpisz_oceny(*oceny,10,10);break;
		case '2': wyswietl_oceny(*oceny,10,10);break;
		//case '3': srednia_ocen(*oceny,10,10);break;
	}
	} while (w!='4');
	return 0;
}

 

4 odpowiedzi

+1 głos
odpowiedź 16 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 16 października 2015 przez Armando
 
Najlepsza

To chyba powinno wyglądać tak:

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void wpisz_oceny(float a[][10],int n, int k) //n-ilosc uczniow, k-ilosc ocen
{
    int i,j,ilo;
 
    for (i=0;i<n;i++)
        for (j=0;j<k;j++) //zerowanie tablicy
            a[i][j]=0;
    srand(time(NULL));
    for (i=0;i<n;i++)
    {
        ilo=rand()%11;
        for (j=0;j<ilo;j++)
            a[i][j]=rand()%6+1;
    }
}
 
void wyswietl_oceny(float a[][10],int n, int k)
{
    int i,j;
    system("cls");
    cout<<"nr ucznia     oceny\n";
    for(i=0;i<n;i++)
    {
        cout<<i<<"     ";
        for(j=0;j<k;j++)
            if (a[i][j]!=0) cout<<a[i][j]<<" ";
        cout<<"\n";
    }
    system("pause");
}
 
int main()
{
    char w;
    float oceny[10][10];
    do
    {
    system("cls");
    cout<<"Wybierz co chcesz zrobic:";
    cout<<"\n1. Wpisywanie liczb do tablicy";
    cout<<"\n2. Wyswietlanie liczb z tablicy";
    cout<<"\n3. Obiczenie sredniej";
    cout<<"\n4. Koniec\n";
    cin>>w;
 
    switch(w)
    {
        case '1': wpisz_oceny(oceny,10,10);break;
        case '2': wyswietl_oceny(oceny,10,10);break;
        //case '3': srednia_ocen(oceny,10,10);break;
    }
    } while (w!='4');
    return 0;
}

 

komentarz 16 października 2015 przez Armando Obywatel (1,870 p.)
A więc mój błąd leżał w błędnym przekazaniu tablicy do funkcji. Wielkie dzięki ! Teraz już będę wiedział jak to powinno wyglądać ;)
+2 głosów
odpowiedź 16 października 2015 przez niezalogowany
Błąd powoduje to, że się odwołujesz do miejsca pamięci, które nie jest zarezerwowane. Btw nie udało ci się poprawić kodu, a błąd jest dość trywialny.
komentarz 16 października 2015 przez draghan VIP (106,230 p.)

...nie dla kogoś, kto nie zna niuansów przekazywania tablic do funkcji lub dynamicznej alokacji... ;) Ale ode mnie i tak yes, bo powiedziałeś autorowi, w czym tkwi błąd. :)

komentarz 16 października 2015 przez niezalogowany
Błąd leży nawet jeszcze przed przekazaniem tablicy, więc żadnych niuansów znać nie musi.
komentarz 16 października 2015 przez draghan VIP (106,230 p.)
...oświecisz mnie w takim razie? Bo uważałem, że autor błędnie zrobił 2 rzeczy:

a) zadeklarował tablicę,

b) przekazał ją do funkcji.

Jeśli obecna postać nagłówków funkcji miałaby pozostać, należałoby utworzyć tablicę na stercie (no i lekko zmodyfikować wywołania).
Jeśli zaś tablica miałaby pozostać na stosie, w takim razie rozwiązanie obejmowało zmianę nagłówków funkcji (+ lekka modyfikacja wywołań) - ten wariant podał Patrycjerz.
komentarz 17 października 2015 przez niezalogowany
mówię właśnie o punkcie a), myślę że b) zrobiłby dobrze, bo widać że testował różne warianty przekazania tablicy tak aby przepchnąć to przez kompilator, także błąd w b) wynika z błędu w a)
+1 głos
odpowiedź 16 października 2015 przez furas Maniak (53,800 p.)
Przypuszczam, że mówiąć "wysypuje" masz na myśli, że wyświetla jakiś komunikat o błędzie.

Jeśli pojawia się błąd to podawaj jego całą treść abyśmy nie musieli się domyślać co tam było i aby nie trzeba było uruchamiać kodu lub go dokładnie analizować aby poznać problem.

Najłatwiejszym (najprymitywniejszym) sposobem radzenia sobie z problemem jest wypisywanie w wielu miejscach zawartości zmiennych oraz komunikatów typu "jestem w while" aby zaobserwować jak przebiega wykonywanie kodu, czy robi dokładnie co nam się wydaje, że powinien robić i czy zmienne zawierają takie wartości jak powinny.
komentarz 16 października 2015 przez Armando Obywatel (1,870 p.)
Mówiąc "wysypuje" mam na myśli to, że po udanej kompilacji i uruchomieniu oraz wywołaniu pierwszej funkcji do generowania liczb "program.exe przestał działać". Dzięki za wskazówkę z tymi komunikatami. Jestem totalnie początkujący, stąd moja niewiedza ;)
0 głosów
odpowiedź 16 października 2015 przez Armando Obywatel (1,870 p.)
Dziękuję wam wszystkim za pomoc, gdyż każdy z was nauczył mnie tutaj czegoś innego :)

Podobne pytania

+2 głosów
3 odpowiedzi 1,502 wizyt
+1 głos
1 odpowiedź 450 wizyt
pytanie zadane 13 marca 2021 w C i C++ przez bultok0 Nowicjusz (130 p.)
0 głosów
1 odpowiedź 564 wizyt
pytanie zadane 5 listopada 2019 w C i C++ przez Seweryn_Sawicki Nowicjusz (180 p.)

93,331 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,667 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...