PDA

Visualizza la versione completa : [C] Passaggio di una matrice ad una funzione


wozzek
29-01-2007, 17:40
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????

Dr. Fiemost
29-01-2007, 17:53
Anche se la matrice a due dimensioni comunque un puntatore, il prototipo corretto :

void VettoreMatrice(unsigned char *Vettore, unsigned char *Matrice)

wozzek
29-01-2007, 18:03
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?

Dr. Fiemost
29-01-2007, 18:49
Prova ad usare il typedef:

typedef unsigned char matrice_t[480][640];

matrice_t ImageDataMatrice;

void VettoreMatrice(unsigned char *Vettore, matrice_t Matrice);

wozzek
29-01-2007, 18:59
adesso funziona grazie mille

Xaratroom
29-01-2007, 21:46
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


#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

Dr. Fiemost
30-01-2007, 11:57
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

Xaratroom
30-01-2007, 19:44
: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:



#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

Loading