Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] funzione che ritorna una matrice

    come faccio a scrivere una funzione che ritorna una matrice? Mi fate un piccolo esempio.
    Grazie mille

  2. #2

    Re: [C] funzione che ritorna una matrice

    Originariamente inviato da yagorossi
    come faccio a scrivere una funzione che ritorna una matrice? Mi fate un piccolo esempio.
    Grazie mille
    ke matrice?

  3. #3
    per esempio una matrice 10*10 della tavola pitagorica delle tabelline.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Vi propongo un'esempio in C++, credo vada bene lo stesso.
    codice:
    // file Matrice.cpp
    
    #include <iostream>
    
    using namespace std;
    
    int** tabellina(int righe, int colonne);
    
    int** tabellina(int righe, int colonne) {
    	int** matrice = new int*[righe];
    	for (int i = 0; i < righe; i++) {
    		matrice[i] = new int[colonne];	
    		for (int j = 0; j < colonne; j++) {
    			matrice[i][j] = (i + 1) * (j + 1);
    		}
    	}
    	return matrice;	
    }
    
    int main() {
    	cout << "Tabellina Automatica" << endl;
    	int righe, colonne;
    	// raccolta dati
    	cout << "Numero di righe: ";
    	cin >> righe;
    	cout << "Numero di colonne: ";
    	cin >> colonne;
    	// mostra risultato
    	int** matrice = tabellina(righe, colonne);
    	for (int i = 0; i < righe; i++) {
    		for (int j = 0; j < colonne; j++) {
    			cout << matrice[i][j] << "  ";
    		}
    		cout << endl;
    	}
    	// dealloca memoria
    	for (int i = 0; i < righe; i++) {
    		delete[] matrice[righe];
    	}
    	delete[] matrice;
    	return 0;
    }
    Visto che sto studiando da poco il C++, vi faccio notare
    che alcune volte restituisce un Segmentation Fault;
    SEG_FAULT matrice(3,3)
    SEG_FAULT matrice(3,4)
    OK matrice(4,3);
    Non ho capito ancora perchè. Potete chiarirmelo?
    Il programma è stato compilato con g++-3.3.3 su Linux.

    Ciao.
    Slack? Smack!

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    qualcuno mi corregga se ho sbagliato...........
    ma basta fare questo per non avere quell'errore.........

    // dealloca memoria
    for (i = 0; i < righe; i++) {
    delete[] matrice[i]; //NO matrice[righe]
    }
    delete[] matrice;

  6. #6
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Indipendentemente che tu la costruisca come int *matrix o int **matrix basta che prima le allochi lo spazio dinamicamente (cosi sopravvive alla funzione) e che ritorni matrix
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    No scancode, perchè righe in matrice[righe]
    va fuori dei limiti dell'array/spazio allocato.
    Per dirla alla java verrebbe sollevata
    un'ArrayIndexOutOfBoundException.

    Sempre che non stia sbagliando io, adesso. :tongue:
    Slack? Smack!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Ciao infinitejustice, a chi è riferita la tua risposta?
    Slack? Smack!

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    E' giusto come ho postato ovvero la riga dell'errore è:
    matrice[righe] ........ infatti
    questo codice è giusto gira bene sotto win con vc6 in console:
    // dealloca memoria
    for (i = 0; i < righe; i++) {
    delete[] matrice[i]; //NO matrice[righe]
    }
    delete[] matrice;
    ..... non dà errori

    l'errore è nel ciclo for dove righe è il numero delle righe (se per esempio righe=4), che hai digitato per allocare new int*[righe]; e
    delete[] matrice[i];
    ti dealloca le 4 righe allocate per new
    ......non puoi fare
    delete[] matrice[righe]; questo ti deallocherebbe solo la quarta allocazione di memoria, infatti perchè adoperare un for se solo bastasse fare delete[] matrice[righe]; ????????

    ti è chiaro??

    forse sbaglio io, ma in programmazione basta fare la verifica non solo l'ipotesi..... e a me la verifica funziona in quanto non ho errori.

  10. #10
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Originariamente inviato da Sergio Pedone
    Ciao infinitejustice, a chi è riferita la tua risposta?
    a chi ha iniziato il thread. Se allocata dinamicamente la memoria sopravvive alla funzione e quindi basta ritornare il puntatore.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int **miaFunz(int, int);
    
    
    void main(int argc, char **argv){
    
    	int **myMatrix = miaFunz(5, 3);
    }
    
    int **miaFunz(int m, int n){
    
    	int i, j, **matrix;
    
    	if(!(matrix = (int **)malloc(m*sizeof(int *))))
    		abort();
    
    	for(i = 0, srand(time(NULL)); i < m; i++){
    		*(matrix+i) = (int *)malloc(n*sizeof(int));
    		for(j = 0; j < n; j++)
    			*((*(matrix+i))+j) = rand()%100;
    	}
    
    return matrix;
    }
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.