Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    31

    [C++] Problemi Matrici/Array

    Salve a tutti. Ho dei problemi con dichiarazioni di array e passaggio alle funzioni. Ho visto altri esempi qui nel forum, e con questi ho già modificato e aggiustato il codice, ma non mi torna lo stesso.


    Il programma deve, in pratica, prendere dei valori da una matrice multidimensionale e riportarli in un'altra.

    Per fare questo ho creato una funzione alla quale viene passata la matrice e due interi (che sono la dimensione delle righe e delle colonne)


    Volevo sapere se qualcuno di voi mi può spiegare o far notare gli errori che ho fatto in questi passaggi.

    //dichiarazione funzione: il primo parametro passato è un array

    int func ( int* , int, int );

    main()
    {...

    int matrice[200][2];
    ...

    matrix[a][b]= func (matrice,c,d); //warning 1 e 2
    };


    int func (matrice[][],c,d) //errore 3 e warning 4
    {...
    return value;
    };

    La funzione qui sopra, non la devo dichiarare così? Matrice è un array multidimensionale.


    Mi da questi warning e errori, ma non capisco cosa posso aver sbagliato. Vi lascio anche quello che io comprendo dagli errori

    1- warning C4047: 'function' : 'int *' differs in levels of indirection from 'int [200][2]'
    2- warning C4024: 'mas_cancella' : different types for formal and actual parameter 1
    3- error C2087: '<Unknown>' : missing subscript
    4- warning C4028: formal parameter 1 different from declaration



    Grazie tante per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Per esempio

    codice:
    int func (int *, int c, int d)
    {
    	int value = 5;
    
    	return value;
    };
    
    int main() 
    {
    	int matrice[200][2];
    	int matrix[200][2];
    
    	int a, b, c, d;
    
    	c=200;
    	d=2;
    	a=0;
    	b=0;
    
    	matrix[a][b]=func((int *)matrice, c, d); 
    
    	return 0;
    };

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    31
    Prima di tutto grazie tante per il tuo aiuto. La soluzione (int *) a cui non avevo pensato mi ha già eliminato due errori.

    Seconda cosa: ma sulla definizione della funzione non ci devo scrivere qualche nome in più?

    Nel senso, nella dichiarazione posso scrivere

    int func (int *, int, int); //tutto rigorosamente senza nomi

    poi c'è il main();

    e poi la funzione vera e propria:

    int func (int matrice[],int c,int d) //tutto con i nomi dei parametri passati
    {...}

    no?

    Così posso usare i parametri passati, giusto?


    Intanto grazie ancora per l'aiuto che mi hai dato.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Teoden44
    Prima di tutto grazie tante per il tuo aiuto. La soluzione (int *) a cui non avevo pensato mi ha già eliminato due errori.

    Seconda cosa: ma sulla dichiarazione della funzione non ci devo scrivere qualche nome in più?

    Nel senso, nella dichiarazione posso scrivere

    int func (int *, int, int); //tutto rigorosamente senza nomi

    poi c'è il main();

    e poi la funzione vera e propria:

    int func (int matrice[],int c,int d) //tutto con i nomi dei parametri passati
    {...}

    no?

    Così posso usare i parametri passati, giusto?


    Intanto grazie ancora per l'aiuto che mi hai dato.
    Non ho capito bene il problema che hai ... comunque, la dichiarazione e la testata della funzione, almeno nei tipi dei parametri, deve essere uguale. Quindi devi scrivere

    int func(int *, int, int);

    e poi

    int func(int *matrice, int c, int d)

    Ma la dichiarazione puo' essere evitata se la funzione e' posta nel sorgente prima del codice, quindi puoi scrivere

    int func(int *matrice, int c, int d)

    e poi il

    main

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    31
    Prima di tutto ti dico che hai risolto il problema superiore.

    Ti riporto però la funzione, che mi da errori a gogo e forse così ti farò sprecare meno tempo.


    Compito di questa funzione è scorrere una matrice di tante colonne per 2 righe, trovare il massimo, e cancellare i corrispondenti 2 valori, restituendo in uscita il massimo*(spiegazione in fondo).


    int mas_cancella (int *array, int dimensione, int z)
    //dimensione è il numero delle righe, int z è il numero della colonna da considerare

    {

    //ho creato una struttura per tenere conto del valore massimo, e ovviamente della sua posizione

    struct massimo {
    int valore=0;
    int posizione;

    }maximo;

    int i,j;

    //inizializzo la struttura maximo

    maximo.valore=0;
    maximo.posizione=0;

    // prima trovo il massimo, e ricordo la posizione dello stesso

    for (i=0; i<dimensione; i++)
    if ( maximo.valore > array[i][z] )
    { maximo.valore = array[i][z];
    maximo.posizione = i;
    }

    //adesso cancello

    for (j=0; j<2 ; j++) {
    array[maximo.posizione][j] = 0;};

    //uscita
    return maximo.valore;
    }

    Gli errori che mi da sono in ogni riga in cui utilizzo array.

    error C2109: subscript requires array or pointer type


    *Per spiegare meglio cosa dovrebbe fare la funzione faccio un brevissimo esempio

    array =
    1 4
    3 6
    2 3
    8 1

    Alla funziona passo la matrice, la dimensione (in questo caso 4) e la colonna da considerare (esempio la prima)

    Questa mi deve restituire 8, e la matrice deve risultare modificato per qualsiasi altro suo utilizzo in
    1 4
    3 6
    2 3
    0 0

    cioè è stato cancellato anche il valore nella seconda colonna.



    Cosa sbaglia la mia funzione? Grazie ancora! Sei già stato gentilissimo e utilissimo.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Prima di passare al codice, chiarisci perche' indichi che il compito della funzione e'

    "scorrere una matrice di tante colonne per 2 righe"

    e poi l'esempio lo fai con 4 righe e 2 colonne


  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    31
    Originariamente inviato da oregon
    Prima di passare al codice, chiarisci perche' indichi che il compito della funzione e'

    "scorrere una matrice di tante colonne per 2 righe"

    e poi l'esempio lo fai con 4 righe e 2 colonne

    Hai pienamente ragione. Ho invertito! e ora non posso più modificare! Meno male che ho messo l'esempio!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Teoden44
    Hai pienamente ragione. Ho invertito! e ora non posso più modificare! Meno male che ho messo l'esempio!
    E quindi?

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    31
    Quindi sono 2 colonne e tante righe. Quello che dovrebbe fare si vede cioè nell'esempio, la spiegazione iniziale è sbagliata!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Allora la funzione puo' essere scritta cosi'

    codice:
    int mas_cancella(int a[][2], int dimensione, int z)
    {
    	int valore = 0;
    	int posizione = 0;
    	int i, j;
    
    	for(i=0; i<dimensione; i++)
    		if(a[i][z] > valore)
    		{
    			valore = a[i][z];
    			posizione = i;
    		}
    
    		for (j=0; j<2 ; j++)
    			a[posizione][j] = 0;
    
    	return valore;
    }
    e la sua chiamata diventa

    codice:
    mas_cancella(matrice, 200, 0);
    in cui 200 sono le righe e 0 la prima colonna

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.