|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
[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: Codice:
typedef struct tagMatrixType
{
int number;
int status;
}Intero;
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: Codice:
clearArray ( matrix.number ); Così? Codice:
void clearArray ( Intero matrix.number[N][M] );
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Anche io avevo un problema del genere, all'epoca.
http://www.hwupgrade.it/forum/showthread.php?t=2187668 Alla fine il ciclo è ancora lì
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
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 Codice:
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 .... EDIT: ecco un esempio.. ovviamente ribadisco che è una porcata Codice:
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;
}
}
}
Codice:
f(m, N, M, sizeof(Intero), x); Per strutture più complesse dovresti passare qualcosa tipo Codice:
&m[0][0].elementoCheTiInteressa - &m[0][0].primoElemento Ultima modifica di AngeL) : 04-01-2011 alle 11:43. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
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...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Codice:
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;
}
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Io invece volevo passare la singola parte della matrice che conteneva o solo gli interi o solo i caratteri
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
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?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
quando tu gli passi
Codice:
struttura uno[][] Quando tu passi una stringa gli passi Codice:
char tmp[] Codice:
char *tmp matrici e array non sono valori ma sono indirizzi di memoria consecutivi di elementi dello stesso tipo! |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
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...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
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.
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Per programmare in c bisogna essere molto più che pignoli.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:25.




















