View Full Version : [C] Azzerare parti di struttura
Ciao a tutti.
Ho un programma in cui ho creato un tipo di dato, tramite struttura, che comprende un char e un int, come segue:
typedef struct tagMatrixType
{
int number;
int status;
}Intero;
Con questo nuovo tipo di dato ho definito una matrice NxM.
Così facendo è come se avessi un doppio dato ( number e status ) per ogni cella della mia matrice.
Mi domandavo se fosse possibile, passando come parametro la matrice, azzerare solo uno dei dei due interi.
So bene che posso passare l'intera matrice e azzearne solo uno, ma io invece vorrei poter passare solo la matrice con quella parte di interi che voglio azzerare ( number o status ).
Una chiamata a funzione del genere:
clearArray ( matrix.number );
È possibile farlo? Se si, il prototipo della funzione come deve essere?
Così?
void clearArray ( Intero matrix.number[N][M] );
Anche io avevo un problema del genere, all'epoca. :D
http://www.hwupgrade.it/forum/showthread.php?t=2187668
Alla fine il ciclo è ancora lì :fagiano:
vorrei poter passare solo la matrice con quella parte di interi che voglio azzerare ( number o status )
Se ho capito bene, vorresti in qualche modo "separare" la matrice di Interi nelle due matrici di int number e status?
Dichiarando l'elemento base della matrice come hai fatto, crei in memoria tanti blocchetti fatti da due int adiacenti, e la matrice è un gruppo consecutivo di questi blocchetti.
In memoria, cioè, il tutto dovrebbe assomigliare a
m[0][0].number | m[0][0].status | m[0][1].number | m[0][1].status ... m[0][n].number | m[0][n].status | m[1][0].number ....
Quindi, come già detto nell'altro thread, bisognerebbe fare "porcate" con la memoria, tipo creare una funzione che azzera un int ogni due, e poi passarle &matrice[0][0] per azzerare tutti i primi campi, oppure &matrice[0][0].status per i secondi.
EDIT: ecco un esempio.. ovviamente ribadisco che è una porcata :D
void f(void *m, int R, int C, int sSize, int elemOff) {
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
cout << "Setting " << (m+elemOff+sSize*(j+i*C)) << " to 0...\n";
*(int*)(m+elemOff+sSize*(j+i*C)) = 0;
}
}
}
da chiamare così:
f(m, N, M, sizeof(Intero), x);
con x = 0 per il primo elemento oppure sizeof(int) per il secondo.
Per strutture più complesse dovresti passare qualcosa tipo &m[0][0].elementoCheTiInteressa - &m[0][0].primoElemento
Maledizione...
Peccato, perchè sarebbe stato bello poter avere una funzione unica e universale che mi abbia azzerato a piacimento i char o gl'int...
Siccome ho la necessità che il programma sia perfettamente portabile, non posso permettermi di giocherellare con la memoria... :muro:
Maledizione...
Peccato, perchè sarebbe stato bello poter avere una funzione unica e universale che mi abbia azzerato a piacimento i char o gl'int...
Siccome ho la necessità che il programma sia perfettamente portabile, non posso permettermi di giocherellare con la memoria... :muro:
void f(Intero mat[N][M], bool primo) {
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
primo ? mat[i][j].x = 0 : mat[i][j].y = 0;
}
quick and dirty :D
void f(Intero mat[N][M], bool primo) {
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
primo ? mat[i][j].x = 0 : mat[i][j].y = 0;
}
quick and dirty :D
Eh ma così passo l'intera matrice...
Io invece volevo passare la singola parte della matrice che conteneva o solo gli interi o solo i caratteri :O
Eh ma così passo l'intera matrice...
Io invece volevo passare la singola parte della matrice che conteneva o solo gli interi o solo i caratteri :Ono, non si passano intere matrici come argomenti! In ogni caso passi solo l'indirizzo del primo elemento ;)
no, non si passano intere matrici come argomenti! In ogni caso passi solo l'indirizzo del primo elemento ;)
Ma scusa eh xD ...
Passare l'indirizzo del primo elemento ( &matrix[0][0] ) è come passare l'intera matrice...
Poi perchè non si dovrebbero passare intere matrici??
E poi, come puoi passare una matrice per valore e non riferimento?
clockover
04-01-2011, 17:42
quando tu gli passi
struttura uno[][]
Quelle parentesi quadre indicano che tu stai passando come parametro alla funzione un indirizzo di memoria! Non puoi fare altrimenti!
Quando tu passi una stringa gli passi
char tmp[]
oppure
char *tmp
è la stessa cosa
matrici e array non sono valori ma sono indirizzi di memoria consecutivi di elementi dello stesso tipo!
quando tu gli passi
struttura uno[][]
Quelle parentesi quadre indicano che tu stai passando come parametro alla funzione un indirizzo di memoria! Non puoi fare altrimenti!
Quando tu passi una stringa gli passi
char tmp[]
oppure
char *tmp
è la stessa cosa
matrici e array non sono valori ma sono indirizzi di memoria consecutivi di elementi dello stesso tipo!
Lo so perfettamente! :)
Quindi, ripeto, passare la matrice o l'indirizzo del primo elemento della matrice sono la stessa cosa.
Quello che volevo capire era perchè AngeL) diceva che non si devono passare matrici intere...
Lo so perfettamente! :)
Quindi, ripeto, passare la matrice o l'indirizzo del primo elemento della matrice sono la stessa cosa.
Quello che volevo capire era perchè AngeL) diceva che non si devono passare matrici intere...
Non ho detto che non si devono passare, ho detto che non si possono passare matrici intere.. è tutta un'astrazione, puoi solo passare puntatori. Quando chiami una funzione e passi una matrice, non la mette mica tutta sullo stack! Basta l'indirizzo del primo elemento.
Non ho detto che non si devono passare, ho detto che non si possono passare matrici intere.. è tutta un'astrazione, puoi solo passare puntatori. Quando chiami una funzione e passi una matrice, non la mette mica tutta sullo stack! Basta l'indirizzo del primo elemento.
Ah vabbè si! Qua siam pignoli però :D
Ah vabbè si! Qua siam pignoli però :D
Per programmare in c bisogna essere molto più che pignoli. :asd:
Per programmare in c bisogna essere molto più che pignoli. :asd:
Tra il dire e il programmare c'è di mezzo, non il mare, ma il compilatore :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.