Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    49

    C - Passaggio di una matrice ad una funzione

    Ciao a tutti
    Devo passare una matrice ad una funzione, ma ottengo un errore che non capisco.. ecco il codice:

    chiamata nel main : unsigned char ImageDataMatrice[480][640];
    VettoreMatrice(ImageDataVettore,ImageDataMatrice);

    prototipo funzione: void VettoreMatrice(unsigned char *Vettore, unsigned char **Matrice)

    L'errore che ottengo (Che in realtà è un warning, ma se faccio partire il programma questo non viene eseguito e viene chiuso in maniera anormale) è sul passaggio del secondo argomento:

    [Warning] passing arg 2 of `VettoreMatrice' from incompatible pointer type

    Quale è il problema????

  2. #2
    Anche se la matrice è a due dimensioni è comunque un puntatore, il prototipo corretto è:
    codice:
    void VettoreMatrice(unsigned char *Vettore, unsigned char *Matrice)
    “Guardo in alto mentre cammino, così le lacrime non scenderanno...”
    Kyu Sakamoto

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    49
    Fatto
    Mi fa passare l'argomento ma ora mi da questo errore quando uso la matrice nella funzione:

    Matrice[i][j]=Vettore[k];

    subscripted value is neither array nor pointer

    Perchè?

  4. #4
    Prova ad usare il typedef:
    codice:
    typedef unsigned char matrice_t[480][640];
    
    matrice_t ImageDataMatrice;
    
    void VettoreMatrice(unsigned char *Vettore, matrice_t Matrice);
    “Guardo in alto mentre cammino, così le lacrime non scenderanno...”
    Kyu Sakamoto

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    49
    adesso funziona grazie mille

  6. #6
    Il doppio puntatore è corretto ( vettore di vettori di carattere ).
    cmq puoi anche passarla così :

    char matrice[][max_dim]

    specificando quindi la seconda grandezza.
    eccoti uno stupido esempio

    codice:
    #include <iostream>
    #include <cstdlib>
    #define DIM_MAX 10
    using namespace std;
    
    
    void stampa (char matrice[][DIM_MAX], int n);
    
    int main()
    {
          char matrix[DIM_MAX][DIM_MAX];
          {
          for (int x = 0; x < DIM_MAX; x++)
             for (int y = 0; y < DIM_MAX; y++)
                matrix[x][y] = 'A';
          }
    
          cout << "\n Matrice\n";
          
          stampa (matrix, DIM_MAX);
    
          cout << endl << endl;
          system("PAUSE");
          return 0;
    }
    
    void stampa (char matrice[][DIM_MAX], int n)
    {
       for (unsigned int i = 0; i < n; i++)
          {
          for (unsigned int j = 0; j < n; j++)
             cout << matrice[i][j] << '\t';
          
          cout << endl;
          }
    }
    ma cmq con un casting dovresti cavartela, anche, con il puntatore doppio
    Experience is what you get when you don’t get what you want

  7. #7
    Originariamente inviato da Xaratroom
    Il doppio puntatore è corretto ( vettore di vettori di carattere ).
    Sei sicuro?
    Se io dichiaro la matrice:

    unsigned char ImageDataMatrice[480][640];

    la variabile ImageDataMatrice contiene l'indirizzo del primo valore ed è un puntatore ad unsigned char, non un puntatore ad un puntatore
    “Guardo in alto mentre cammino, così le lacrime non scenderanno...”
    Kyu Sakamoto

  8. #8
    :master: Avevo visto un esempietto, tempo fa, sul passaggio di una matrice con doppio puntatore. Però non riesco a ricordarmi come si fa ( ho provato e non ho ottenuto risultati ).
    Cmq, sempre considerando un passaggio più generale possibile, per favorire il riutilizzo del software, eccoti un esempio sul passaggio di una matrice per riferimento, utilizzando un semplice puntatore:

    codice:
    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void inizializza (char *Matrix, unsigned int n, char carattere);
    void stampa (char *Matrix, unsigned int n);
    
    int main()
    {
          clrscr ();
          char matrice [10][10];
          inizializza ((char *)matrice, 10, 'A');
    
    
          for (unsigned int i = 0; i < 10; i ++)
    	 {
    	 for (unsigned int j = 0; j < 10; j++)
    	   cout << matrice[i][j] << '\t';
    	 cout << endl;
    	 }
    
          cout << "\n Stampo : \n\n";
          stampa ((char *)matrice, 10);
    
          getch ();
          return 0;
    }
    
    void inizializza (char *Matrix, unsigned int n, char carattere)
    {
       for (unsigned int i = 0; i < n; i ++)
          {
          for (unsigned int j = 0; j < n; j++)
    	 {
    	 *Matrix = carattere;
    	 Matrix ++;
    	 }
          carattere ++;
          }
    }
    
    void stampa (char *Matrix, unsigned int n)
    {
       for (unsigned int i = 0; i < n*n; i+=n)
          {
          for (unsigned int j = 0; j < n; j++)
    	 cout << Matrix[i+j] << '\t';
          cout << endl;
          }
    }
    E' in Cpp, ma non credo sia un problema, visto che quello che ci interessa è valido sia in cpp che in c.

    PS: La matrice è quadra, quindi molto semplice il suo utilizzo. Per una matrice non quadra dovresti passare indice di riga e di colonna anche
    Experience is what you get when you don’t get what you want

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 © 2025 vBulletin Solutions, Inc. All rights reserved.