Aritmetica dei puntatori C++

di il
15 risposte

Aritmetica dei puntatori C++

Salve a tutti.

Ho un problema nell'utilizzo dell'aritmetica dei puntatori. Supponiamo di avere la seguente la matrice:

65 17 68 86 79
17 68 86 79 17
68 86 79 17 92
86 79 17 92 50

e di voler moltiplicare gli elemtenti della prima colonna con quelli della seconda.
Ho scritto la seguente funzione:
void moltiplica(int mat[][5], int colonna)
{
	int somma = 0;
	for (int i = 0; i < 4; i++)
	somma += *(*(mat + i))* *((*(mat + i)) + colonna - 1);
	cout << "Somma = " << somma;
}
ottenendo il il seguente risultato:

65*17 + 17*50 + 0*0+ 0*0

Praticamente è giusta soltanto la prima iterazione.
Cosa sbaglio?

15 Risposte

  • Re: Aritmetica dei puntatori C++

    Ciao! Al di là di qualche parentesi superflua non vedo alcun errore... posta il codice completo e potrò essere più preciso.
  • Re: Aritmetica dei puntatori C++

    Ho fatto così:
    #include <iostream>
    #include<ctime>
    using namespace std;
    int matrice[4][5];
    
    void genera_matrice(int mat[][5], int righe, int colonne)
    {
    	srand((unsigned)time(NULL));
    	for (int i = 0; i < righe; i++)
    	{
    		for (int j = 0; j < colonne; j++)
    		{
    		  *((*matrice + i) + j) = rand() % 101;
    		}
    	}
    	for (int i = 0; i < righe; i++)
    	{
             	for (int j = 0; j < colonne; j++)
    		{
    	          cout << *((*matrice + i) + j) << "   ";
                      if (j == 4) cout << "\n\n" << endl;
    		}
    	}
    }
    
    void moltiplica(int mat[][5], int colonna)
    {
    	int somma = 0;
    	for (int i = 0; i < 4; i++)
              somma += *(*(mat + i))* *((*(mat + i)) + colonna - 1);
            cout << "Somma = " << somma;
    }
    
    int main()
    {
    	genera_matrice(matrice, 4, 5);
            moltiplica(matrice, 3);
    }
  • Re: Aritmetica dei puntatori C++

    Alcune considerazioni:
    - perchè dichiari la la matrice come variabile globale? Evita, come in questo caso, se puoi...
    - la funzione genera_matrice() presenta tra gli argomenti la variabile mat, ma non la usi mai all'interno della funzione...
    - nella funzione genera_matrice() due cicli sono più che sufficienti, non ne servono 4;
    - nel post iniziale dici di voler moltiplicare gli elementi delle prime due colonne, ma la chiamata
    moltiplica(matrice, 3);
    non è coerente con quello che ti sei prefissato di fare... secondo te cosa fa la funzione moltiplica()?
    - in ogni caso il problema vero e proprio è nell'aritmetica dei puntatori all'interno della funzione genera_matrice()... occhio alle parentesi!
  • Re: Aritmetica dei puntatori C++

    Dato che
    
    (*m + i)
    
    e' PERFETTAMENTE EQUIVALENTE a
    
    m[i]
    
    PERCHE' ti devi intestardire su quella strampalata sintassi?
  • Re: Aritmetica dei puntatori C++

    Buongiorno e grazie a tutti.

    -
    nel post iniziale dici di voler moltiplicare gli elementi delle prime due colonne, ma la chiamata

    Codice: Seleziona tutto
    moltiplica(matrice, 3);

    non è coerente con quello che ti sei prefissato di fare... secondo te cosa fa la funzione moltiplica()?
    Diciamo che l'importanza della colonna da moltiplicare non è fondamentale.La mia intenzione è moltiplicare la prima colonna per un'altra qualsiasi. Quindi facendo varie prove era rimasto memorizzato il 3.
    Come si vede dal primo posto funziona soltanto per la prima iterazione del ciclo for....il resto no.
    - in ogni caso il problema vero e proprio è nell'aritmetica dei puntatori all'interno della funzione genera_matrice()... occhio alle parentesi!
    Sapevo che era un problema di aritmetica dei puntatori....è il titolo dell'argomento....
    PERCHE' ti devi intestardire su quella strampalata sintassi?
    Perchè da tutto il materiale che ho a dispozione per lo studio, l'unico metodo che vedo per fare accesso agli elementi di una matrice è:
    mattrice[j]=*((*(matrice+i)+j)
    Più tardi vi farò sapere se ho risolto...
  • Re: Aritmetica dei puntatori C++

    Provando a mettere le parentesi in modo differente ottengo risultati peggiori e in ogni caso non capisco perche la prima iterazione è corretta,la seconda iterazione moltiplica 17*92,terza e quarta iterazione 0*0.
    Nessuno mi sa dire come fare?
  • Re: Aritmetica dei puntatori C++

    trixy ha scritto:


    Sapevo che era un problema di aritmetica dei puntatori....è il titolo dell'argomento....
    Mi sembra di cogliere del sarcasmo qui!
    Mi tocca quindi risponderti a tono dimostrandoti che con gli elementi a disposizione dovresti essere in grado di risolvere il problema in modo autonomo... se ho detto che la funzione moltiplica() è corretta, e di conseguenza è corretta anche l'espressione utilizzata per accedere agli elementi della matrice attraverso l'aritmetica dei puntatori (al massimo
    *((*(matrice+i))+j)
    può essere semplificato in *(*(matrice+i)+j)), allora basta utilizzare la stessa espressione anche nella funzione genera_matrice() dove ti ho fatto notare esserci l'errore.
  • Re: Aritmetica dei puntatori C++

    Provato anche come dici tu e il risultato è:

    somma = 65*17+ 17*68+0*86+0*79
  • Re: Aritmetica dei puntatori C++

    Posta il codice completo.
  • Re: Aritmetica dei puntatori C++

    Allora io l'errore l'ho trovato e adesso funziona perfettamente con qualsiasi colonna e non mi pare che c'entra con quello che dici tu.
  • Re: Aritmetica dei puntatori C++

    Posta il codice completo e lo scopriamo! =)
  • Re: Aritmetica dei puntatori C++

    Io già l'ho scoperto e non c'è bisogno di codice....bastava notare un errore nel primo termine della somma.
  • Re: Aritmetica dei puntatori C++

    Mettila come vuoi, ma l'errore è quello che ti ho detto in precedenza... ossia
    *((*matrice + i) + j)
    andava sostituito con
    *(*(matrice + i) + j)
    Fatto ciò, il codice è perfettamente funzionante.

    Se poi mi è sfuggito qualcosa sarei lieto che me lo facessi notare!
  • Re: Aritmetica dei puntatori C++

    Visto che sono molto curioso ho provato a sostituire quell'espressione che dici tu in tutte le funzioni del programma e funziona. Però nel codice che ho scritto inizialmente bastava cambaire una cosina alla riga somma per farlo funzionare bene.
    Ma sono contento del confronto...
Devi accedere o registrarti per scrivere nel forum
15 risposte