• 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

VPS Starter Arubacloud
0 głosów
207 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,340 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,146 wizyt
+1 głos
1 odpowiedź 250 wizyt
pytanie zadane 13 marca 2021 w C i C++ przez bultok0 Nowicjusz (130 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 5 listopada 2019 w C i C++ przez Seweryn_Sawicki Nowicjusz (180 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...