Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con matrice
Forum - C/C++ - Problema con matrice

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
matteo88roma (Normal User)
Rookie


Messaggi: 25
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 11:33
Lunedì, 07/03/2011
Ciao a tutti! :k:

Ho questa definizione di funzione:

Codice sorgente - presumibilmente C++

  1. int ricerca(int rows , int columns , int matrix[rows][columns], int x) {
  2.         int i=0,j=0;
  3.         for(;i<rows;i++){
  4.                 for(;j<columns;j++){
  5.                         if(matrix[i][j] == x)
  6.                                 return 1;
  7.                 }              
  8.         }
  9.         return 0;
  10. }



In pratica, data una matrice di "rows" righe e "columns" colonne, la funzione ritorna 1 appena incontra il valore "x". Se non trova nulla, ritorna 0.

Nel "main", per il test, ho scritto:

Codice sorgente - presumibilmente C/C++

  1. int matrice[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},
  2.         {16,17,18,19,20},{21,22,23,24,25}};
  3.  
  4. int x = ricerca(5,5,matrice,6);



Mi ritorna 0! :-|

Mettendo qualche printf  (e usando il debugger) nella funzione, mi son accorto che scorre solamente la prima riga!
E mi son anche accorto che posso eliminare il problema utilizzando una matrice allocata dinamicamente (cambiando ovviamente il prototipo di funzione!).

Come posso sistemare questo problema con la matrice statica?

Grazie in anticipo della risposta :D




Ultima modifica effettuata da matteo88roma il 07/03/2011 alle 11:35


IT Developer/Network Architect /Consultant
Studente di Informatica presso l'Università La Sapienza di Roma
Linguaggi conosciuti: C,C++,Java,Python,VB .NET,C#,Managed C++,*NIX Scripting,Assembly(mips & intel)
E-mail: matteopacini.knopfler@gmail.com
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 11:43
Lunedì, 07/03/2011
Testo quotato

Postato originariamente da matteo88roma:

Ciao a tutti! :k:

Ho questa definizione di funzione:

Codice sorgente - presumibilmente C++

  1. int ricerca(int rows , int columns , int matrix[rows][columns], int x) {
  2.         int i=0,j=0;
  3.         for(;i<rows;i++){
  4.                 for(;j<columns;j++){
  5.                         if(matrix[i][j] == x)
  6.                                 return 1;
  7.                 }              
  8.         }
  9.         return 0;
  10. }






ma perchè devi cambiare le cose standard?


Codice sorgente - presumibilmente C++

  1. int ricerca(int rows , int columns , int matrix[rows][columns], int x) {
  2.         int i, j;
  3.         for(i = 0;i<rows;i++){
  4.                 for(j = 0;j<columns;j++){
  5.                         if(matrix[i][j] == x)
  6.                                 return 1;
  7.                 }              
  8.         }
  9.         return 0;
  10. }



la parte di inizializzazione del for va assolutamente specificata, altrimenti alla seconda iterazione j NON viene resettato per ricominciare a contare e così facendo esce subito :)


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
andrea993 (Member)
Rookie


Messaggi: 21
Iscritto: 19/01/2011

Segnala al moderatore
Postato alle 11:45
Lunedì, 07/03/2011
In C le matrici non si passano comehai fatto tu alle funzioni, la stessa cosa vale per i vettori!.

Devi passarli per indirizzo (usando il puntatore al primo elemetno)

Codice sorgente - presumibilmente C/C++

  1. 1.
  2.       int ricerca(int rows , int columns , int* matrix, int x) {
  3.  
  4.       }



Per passarlo quindi fai ad esempio:

Codice sorgente - presumibilmente C/C++

  1. int a=ricerca(5,5,&matrice[0][0],1);



Il problema è che adesso la matrice la vedrai linearmente, come se fosse un vettore quindi devi farti tu un algoritmo per trattare il vettore creatosi come la tua matrice iniziale, non è difficile ;)
Buon Lavoro

Ultima modifica effettuata da andrea993 il 07/03/2011 alle 14:06
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:00
Lunedì, 07/03/2011
Testo quotato

Postato originariamente da andrea993:

In C le matrici non si passano comehai fatto tu alle funzioni, la stessa cosa vale per i vettori!.

Devi passarli per indirizzo (usando il puntatore al primo elemetno)

Codice sorgente - presumibilmente C/C++

  1. 1.
  2.       int ricerca(int rows , int columns , int* matrix, int x) {
  3.  
  4.       }



Per passarlo quindi fai ad esempio:

Codice sorgente - presumibilmente C/C++

  1. int a=ricerca(5,5,&matrice[0][0],1);



Il problema è che adesso la matrice la vedrai linearmente, come se fosse un vettore quindi devi farti tu un algoritmo per trattare il vettore creatosi come la tua matrice iniziale, non è difficile ;)
Buon Lavoro



Non è vero. In C puoi passare le matrici come cacchio ti pare. :_doubt:


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:17
Lunedì, 07/03/2011
Testo quotato

Postato originariamente da andrea993:

In C le matrici non si passano comehai fatto tu alle funzioni, la stessa cosa vale per i vettori!.

Devi passarli per indirizzo (usando il puntatore al primo elemetno)

Codice sorgente - presumibilmente C/C++

  1. 1.
  2.       int ricerca(int rows , int columns , int* matrix, int x) {
  3.  
  4.       }



Per passarlo quindi fai ad esempio:

Codice sorgente - presumibilmente C/C++

  1. int a=ricerca(5,5,&matrice[0][0],1);



Il problema è che adesso la matrice la vedrai linearmente, come se fosse un vettore quindi devi farti tu un algoritmo per trattare il vettore creatosi come la tua matrice iniziale, non è difficile ;)
Buon Lavoro



ma in quale film?


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 17:23
Lunedì, 07/03/2011
:om::om::om:


Alex=)
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 0:20
Venerdì, 18/03/2011
Guarda conviene come gia' ti ha suggerito qualcuno di mettere le variabili i,j dentro ogni ciclo per evitare errori ciclici, per quanto riguarda il passagio della matrice nella funzione ti suggerisco di usare i puntatori, oppure come hai fatto tu dichiarare un altra matrice(passaggio per copia!) ma questa soluzione è troppo dispersiva in fase stack! Ciao

PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 15:28
Venerdì, 18/03/2011
Testo quotato

Postato originariamente da R1C:

Guarda conviene come gia' ti ha suggerito qualcuno di mettere le variabili i,j dentro ogni ciclo per evitare errori ciclici, per quanto riguarda il passagio della matrice nella funzione ti suggerisco di usare i puntatori, oppure come hai fatto tu dichiarare un altra matrice(passaggio per copia!) ma questa soluzione è troppo dispersiva in fase stack! Ciao


guarda che in C in qualunque maniera passi un array (con la scrittura int *a o int a[]) passi sempre IL PUNTATORE al primo elemento!


Alex=)
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:22
Venerdì, 18/03/2011
forse mi hai frainteso, io intendevo dire NON IL PASSAGGIO di parametri dalla funzione chiamante alla funzione chiamata, ma inizializzare un puntatore nella funzione chiamante "che punta" all'indirizzo del primo elemento dell'array (passato per indirizzo logicamente)! Invece lui nella funzione chiamata inizializzava un altro array, per questo ho detto ke è una soluzione troppo dispersiva memoricamente.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo