Nippolo ha scritto:
Ho fatto la modifica da te indicata e l'output è ancora accettabile, posto anche il codice qui sotto.
Ok, c'è qualcosa che non va nel codice che ho postato, va benissimo, sto ancora imparando (il nickname non è stato scelto a caso) e penso sia normale commettere degli errori.
Codice funzionante con aggiunta suggerita da Nippolo
...
Output senza l'aggiunta di quella riga di codice:
come avevo già detto l'output è accettabile (tutti i 100 valori sono compresi tra 0 e 99).
Output con l'aggiunta di quella riga di codice:
come vedi l'output non è accettabile.
Il motivo è proprio legato al concetto di tempo di vita di una variabile. Cito le tue parole:
... il tempo di vita di una variabile indica dove la variabile esiste, ad esempio se la dichiariamo nel main esisterà solo nel main, mentre se la dichiariamo nel sottoprogramma esisterà solo all'interno del sottoprogramma.
Consideriamo la funzione generamatrice(), la variabile matrice che vai a riempire nasce e muore all'interno di quel sottoprogramma! Di ritorno nel main non ci sarà più alcuna traccia di quella matrice. Quindi ti chiedi "come mai allora il codice ritorna un output accettabile?" Evidentemente quando nella funzione stampa() dichiari la nuova variabile matrice, essa va ad occupare le stesse porzioni di memoria in cui si trovava la matrice dichiarata nell'altro sottoprogramma e quindi, visto che quella porzione di memoria non è stata modificata, ti restituirà un output accettabile coincidente con la matrice generata dalla funzione generamatrice().
Piccola precisazione, nel momento in cui una variabile smette di esistere si intende che la porzione di memoria che essa occupava si è resa disponibile e può quindi essere sovrascritta, ma se ciò non avviene ovviamente quelle locazioni di memoria conterranno dati che coincidono con l'ultima configurazione assunta dalla suddetta variabile.
In questo discorso si inserisce la riga che ti avevo chiesto di aggiungere... nel momento in cui vai a dichiarare delle nuove variabili ci sarà una certa probabilità di andare a modificare lo stato attuale della memoria.
Ah chiaro, grazie gentilissimo.
Comunque anche aggiungendo quella linea di codice, mi funzionava il tutto dandomi valori accettabili (cioè compresi tra 0 e 99).
Nippolo ha scritto:
- nei prototipi delle funzioni basta inserire il tipo delle variabili, l'identificativo è superfluo;
Fatto, grazie per la precisazione.
Nippolo ha scritto:
- nella definizione delle funzioni i tipi degli argomenti vanno specificati;
Ok, vediamo se ho capito bene questa frase.
Con definizione di funzione si intende:
"La definizione di una funzione corrisponde all’elenco di istruzioni che vengono eseguite ogni volta che essa viene invocata".
Quindi tutto quello compreso tra le parentesi graffe {}.
I tipi sono ad esempio int, void, bool, char eccetera.
Quindi dovrei fare una cosa del genere?
void generamatrice(){
int matrice [r][c];
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
Però non avrebbe senso per quanto detto sopra, quindi penso che intendi questo:
void generamatrice(int matrice){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
Nippolo ha scritto:
- i punti e virgola che metti alla fine delle definizioni delle funzioni non devono esserci;
Ok chiaro, li rimuovo, grazie per la precisazione.
Nippolo ha scritto:
- e adesso il problema fondamentale del suddetto codice: se dichiari la funzione stampa(int matrice[r][c]), nel momento in cui richiami tale funzione dal main, essa si aspetta come parametro una variabile di tipo int[r][c] e non un int (infatti il valore che tu gli passi, ossia matrice[r][c] è un int). Se vuoi approfondire la questione relativa al passaggio di array a funzioni ti suggerisco di andarti a leggere uno dei precedenti topic intitolato "Array bidimensionali (multidimensionali)". Detto questo, il modo corretto di invocare la funzione stampa dal main è quindi:
stampa(matrice);
Chiaro, ora me lo vado a leggere.
Ho fatto come su tua indicazione ma mi da errore.
Posto i vari codici non funzionanti con relativi errori.
Codice NON funzionante 1:
/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//variabili globali
const int r=10;
const int c=10; //le ho rese variabili globali poiché sono costanti
//prototipi
void generamatrice(int x);
void stampa (int x);
//programma principale
int main(){
int matrice[r][c];
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
srand(time(0)); //inizializzazione seme
//generazione matrice
generamatrice(matrice[r][c]);
//stampa a schermo della matrice
stampa(matrice); //corretto come su indicazione di Nippolo
cout<<"\n\n\n";
}
//sottoprogrammi
//generazione matrice
void generamatrice(int matrice[r][c]){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
//stampa a schermo matrice
void stampa(int matrice[r][c]){
int i,j;
for (i=0; i<r; i++){
cout<<"\n";
for (int j=0; j<c; j++){
cout<<matrice[i][j]<<" ";
}
}
}
Errori del codice 1:
Codice 2 NON funzionante:
/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//variabili globali
const int r=10;
const int c=10; //le ho rese variabili globali poiché sono costanti
//prototipi
void generamatrice(int x);
void stampa (int x);
//programma principale
int main(){
int matrice[r][c];
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
srand(time(0)); //inizializzazione seme
//generazione matrice
generamatrice(matrice[r][c]);
//stampa a schermo della matrice
stampa(matrice);
cout<<"\n\n\n";
}
//sottoprogrammi
//generazione matrice
void generamatrice(int matrice){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
//stampa a schermo matrice
void stampa(int matrice){
int i,j;
for (i=0; i<r; i++){
cout<<"\n";
for (int j=0; j<c; j++){
cout<<matrice[i][j]<<" ";
}
}
}
Errori del codice 2:
Codice 3 NON funzionante:
/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//variabili globali
const int r=10;
const int c=10; //le ho rese variabili globali poiché sono costanti
//prototipi
void generamatrice(int x);
void stampa (int x);
//programma principale
int main(){
int matrice[r][c];
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
srand(time(0)); //inizializzazione seme
//generazione matrice
generamatrice(matrice);
//stampa a schermo della matrice
stampa(matrice);
cout<<"\n\n\n";
}
//sottoprogrammi
//generazione matrice
void generamatrice(int matrice){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
//stampa a schermo matrice
void stampa(int matrice){
int i,j;
for (i=0; i<r; i++){
cout<<"\n";
for (int j=0; j<c; j++){
cout<<matrice[i][j]<<" ";
}
}
}
Errori del codice 3:
Codice 4 non funzionante (corretto come su suggerimento del DEV):
/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//variabili globali
const int r=10;
const int c=10; //le ho rese variabili globali poiché sono costanti
//prototipi
void generamatrice(int x);
void stampa (int x);
//programma principale
int main(){
int matrice[r][c];
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
srand(time(0)); //inizializzazione seme
//generazione matrice
void generamatrice(int matrice);
//stampa a schermo della matrice
void stampa(int matrice);
cout<<"\n\n\n";
}
//sottoprogrammi
//generazione matrice
void generamatrice(int matrice){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
//stampa a schermo matrice
void stampa(int matrice){
int i,j;
for (i=0; i<r; i++){
cout<<"\n";
for (int j=0; j<c; j++){
cout<<matrice[i][j]<<" ";
}
}
}
Errori del codice 4:
Codice 5 NON funzionante:
/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//variabili globali
const int r=10;
const int c=10; //le ho rese variabili globali poiché sono costanti
//prototipi
void generamatrice(int x);
void stampa (int x);
//programma principale
int main(){
int matrice[r][c];
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
srand(time(0)); //inizializzazione seme
//generazione matrice
void generamatrice(int matrice[r][c]);
//stampa a schermo della matrice
void stampa(int matrice);
cout<<"\n\n\n";
}
//sottoprogrammi
//generazione matrice
void generamatrice(int matrice[r][c]){
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
matrice[i][j]=rand()%100;
}
}
}
//stampa a schermo matrice
void stampa(int matrice[r][c]){
int i,j;
for (i=0; i<r; i++){
cout<<"\n";
for (int j=0; j<c; j++){
cout<<matrice[i][j]<<" ";
}
}
}
Non mi da errori nella compilazione, ma mi appare questo:
Dire che sto impazzendo è riduttivo, per una cosa che dovrebbe essere anche molto semplice...