Prototipi funzione c++

di il
5 risposte

Prototipi funzione c++

Vi propongo due codici dello stesso problema (specificato ma non penso sia utile come info perchè tale problema mi si presenta in ogni esercizio) :il primo codice è senza l'uso di prototipi e compila ed esegue in modo ottimale,il secondo tramite l'uso dei prototipi delle funzioni genera i seguenti errori
In function 'int main()':
17 10 [Error] invalid conversion from 'int (*)[3]' to 'int' [-fpermissive]
10 6 [Note] initializing argument 1 of 'void input(int)'
18 23 Error] invalid conversion from 'int (*)[3]' to 'int' [-fpermissive]
11 5 [Note] initializing argument 1 of 'int sommadiagprinc(int, int)'
19 22 [Error] invalid conversion from 'int (*)[3]' to 'int' [-fpermissive]
12 [Note] initializing argument 1 of 'int sommadiagsec(int, int)'
21 11 [Error] invalid conversion from 'int (*)[3]' to 'int' [-fpermissive]
13 6 [Note] initializing argument 1 of 'void stampa(int)'
ahimè l'uso dei prototipi di funzione mi è assegnato da traccia e quindi non posso esimermi dall'usarli: come posso risolvere?


codice senza prototipi:
//data una matrice quadrata acquisita da input scrivere un programma che stampi a video la somma degli elementi sulla diagonale principale e quello della diagonale secondaria
#include<iostream>
#include<math.h>
#define Q 3
using std::cin;
using std::cout;


void input (int A[Q][Q])
{ int i,j;
  cout<<"\n inserire gli elementi della matrice: \n";
  for(i=0;i<Q;i++)
     { for(j=0;j<Q;j++)
        { cout<<"\n elemento riga  "<<i+1<<"   colonna  "<<j+1<<"     ";
          cin>>A[i][j];
		}
	 }
}


int sommadiagprinc (int A[Q][Q], int &max)
{ int x,y;
  max=0;
for(x=0;x<Q;x++)
  { for(y=0;y<Q;y++)
     { if(x==y)
         { max+=A[x][y];
		 }
	 }
  }
  return max;
}


 int sommadiagsec(int A[Q][Q],int &max2)
 { int h,k;
   max2=0;
   for(h=0;h<Q;h++)
     { for(k=0;k<Q;k++)
        { if(h+k==Q-1)
           { max2+=A[h][k];
		   }
		}
	 }
	 return max2;
 }
 
 
  void stampa(int A[Q][Q])
  { int v,t;
    for(v=0;v<Q;v++)
      { cout<<"\n";
	      for(t=0;t<Q;t++)
         { cout<<"  "<<A[v][t]<<"  ";
		 }
		 cout<<"\n";
	  }
  }



int main()
{ int A[Q][Q],max,max2;
  input(A);
  sommadiagprinc(A,max);
  sommadiagsec(A,max2);
  cout<<"\n la matrice inserita è: \n";
  stampa(A);
  cout<<"\n la somma degli elementi sulla diagonale principale è :  "<<max;
  cout<<"\n la somma degli elementi sulla diagonale secondaria è :  "<<max2;
}


codice con prototipi:
//dtata una matrice quadrata acquisita da input scrivere un programma che stampi a video la somma degli elementi sulla diagonale principale e quello della diagonale secondaria
#include<iostream>
#include<math.h>
#define Q 3
using std::cin;
using std::cout;



void input (int);
int sommadiagprinc (int,int);
int sommadiagsec(int,int);
void stampa(int);

int main()
{ int A[Q][Q],max,max2;
  input(A);
  sommadiagprinc(A,max);
  sommadiagsec(A,max2);
  cout<<"\n la matrice inserita è: \n";
  stampa(A);
  cout<<"\n la somma degli elementi sulla diagonale principale è :  "<<max;
  cout<<"\n la somma degli elementi sulla diagonale secondaria è :  "<<max2;
}


void input (int A[Q][Q])
{ int i,j;
  cout<<"\n inserire gli elementi della matrice: \n";
  for(i=0;i<Q;i++)
     { for(j=0;j<Q;j++)
        { cout<<"\n elemento riga  "<<i+1<<"   colonna  "<<j+1;
          cin>>A[i][j];
		}
	 }
}


int sommadiagprinc (int A[Q][Q], int &max)
{ int x,y;
  max=0;
for(x=0;x<Q;x++)
  { for(y=0;y<Q;y++)
     { if(x==y)
         { max+=A[x][y];
		 }
	 }
  }
  return max;
}


 int sommadiagsec(int A[Q][Q],int &max2)
 { int h,k;
   max2=0;
   for(h=0;h<Q;h++)
     { for(k=0;k<Q;k++)
        { if(h+k==Q-1)
           { max2+=A[h][k];
		   }
		}
	 }
	 return max2;
 }
 
 
  void stampa(int A[Q][Q])
  { int v,t;
    for(v=0;v<Q;v++)
      { cout<<"\n";
	      for(t=0;t<Q;t++)
         { cout<<"  "<<A[v][t]<<"  ";
		 }
		 cout<<"\n";
	  }
  }   

5 Risposte

  • Re: Prototipi funzione c++

    Ma scusa ... non ti viene un dubbio ?

    Questa

    void input(int);

    e questa

    void input(int A[Q][Q])

    sono uguali per te?

    E così per tutto il resto ...

    Hai compreso a cosa serve il prototipo?
  • Re: Prototipi funzione c++

    Ma soprattutto... quello è C al 100%, davvero si continua a insegnare C, invece del C++ ?
    Mah... tempi moderni...
  • Re: Prototipi funzione c++

    Allora penso di non aver capito come definire il prototipo di una funzione: mi è stato detto a lezione che era una linea di codice da anteporre al main dove era dichiarato il tipo della funzione e ml'elenco DEI TIPI dei parametri (non pensavo si dovessero dichiarare anche i nomi dei parametri)
    [url]C:\Users\marco\Desktop\Immagine.jpg[/url]
    dunque vorrei chiedere ancora una cosa: nel prototipo della funzione debbo specificare anche il tipo di passaggio di quel dato parametro (ad esempio tramite puntatore) alla funzione di cui definisco il prototipo?
  • Re: Prototipi funzione c++

    Inserire anche il nome dei parametri non è obbligatorio ma contribuisce a rendere tutto più leggibile.
    Al minimo, puoi anche scrivere
    
    void input(int [][Q]);
    int sommadiagprinc(int [][Q], int &);
    int sommadiagsec(int [][Q], int &);
    void stampa(int [][Q]);
    
    ma devi capire che per indicare un array bidimensionale di interi non puoi scrivere

    int

    ma

    int [][Q]

    E sì, è necessario indicare se è un puntatore o no, perché un puntatore non è un intero, sono cose diverse.
  • Re: Prototipi funzione c++

    (non pensavo si dovessero dichiarare anche i nomi dei parametri)
    Non mi sembra che qualcuno abbia detto il contrario... e in effetti i nomi possono essere omessi.
    mi è stato detto a lezione che era una linea di codice da anteporre al main...
    Hai capito qual è l'utilità dei prototipi?
    ...dove era dichiarato il tipo della funzione e ml'elenco DEI TIPI dei parametri
    Esattamente, il problema è che int e int[][] sono due tipi diversi.
    dunque vorrei chiedere ancora una cosa: nel prototipo della funzione debbo specificare anche il tipo di passaggio di quel dato parametro (ad esempio tramite puntatore) alla funzione di cui definisco il prototipo?
    Il tipo di passaggio dipende dal tipo dei parametri, in pratica float e float* sono due tipi diversi.
Devi accedere o registrarti per scrivere nel forum
5 risposte