Problema chiamata e funzione

di il
6 risposte

Problema chiamata e funzione

Ragazzi ho necessariamente bisogno di capire perchè sto avendo problemi nella chiamata della funzione, ma in questo caso ho problemi nel restituire questa matrice mi dice: cannot convert int*[3] a int** nel return....questo per quale motivo?
#include<iostream>
using namespace std;

const int M=3;
int ** es1(int A[][M],int N)
{
    int z,i,k=0,j=0,S1=0,S2=0;
    int R[N][M];

    for(int z=0;z<N;z++)
    {
        for(int i=0;i<M;i++)
        {
            while(k<N)
            {
                S1 +=A[k][i];
                k++;
            }

             while(j<M)
            {
                S2 +=A[z][j];
                k++;
            }
            R[z][i] = S1 - S2;
        }
        k=z; j=i; S1=0; S2=0;
    }
    return R;
}



int main()
{
    int n = 3;
    int a[n][M] = {{1,2,4},{3,5,4},{3,5,4}};

    int **r = es1(a,n);

    return 0;
}
in questo caso invece non capisco perchè la chiamata non funge...
#include<iostream>
using namespace std;

float* es1(int **a, int c, int r)
{
    float *A = new float[c];
    int max = a[0][0];
    int min = a[0][0];
    int somma = 0;


    for(int i = 0; i<c; i++)
    {
        for(int j = 0; j<r; j++)
        {
            if(i%2 == 0)
            {
                if(a[j][i] > max)
                    max = a[j][i];
                if(a[j][i] < min)
                    min = a[j][i];
            }
            else
            {
                somma += a[j][i];
            }
        }
        if(i%2 == 0)
            A[i] = (float)(max + min) / 2;
        else
            A[i] = (float) somma/r;

        somma = 0; max = 0; min = 1000;
    }

    return A;
}

int main()
{
    int j = 3, i = 3;

    int M[j][i] = {1,2,3,4,5,6,7,8,9};

    float *A= es1(M,j,i);

    cout<< "1 -"<<A[0]<<endl;
    cout<< "2 -"<<A[1]<<endl;
    cout<< "3 -"<<A[2]<<endl;
    return 0;
}
Gentili comunque sia la risposta

6 Risposte

  • Re: Problema chiamata e funzione

    Perché R non è un doppio puntatore e comunque è sbagliatissimo restituire puntatori a variabili locali che verranno distrutte. Devi allocare dinamicamente l'array con doppio puntatore e restituirlo.
  • Re: Problema chiamata e funzione

    Giuro che non capisco qual'è sia l'errore...mi hai detto questa cosa è mi sto complessando ancora di più.
    l'ho inzializzata R dinamicamente e dopo tramite i calcoli ho riempito le celle di memoria....ma sempre lo stesso errore da...
    #include<iostream>
    using namespace std;
    
    float **tipo(int **K, int N)
    {
        int var_medio = 0;
        int max2 = 0;
        int min2 = 0;
        float **S = new float *[N];
    
        for(int z = 0;z<N;z++)
            S[z] = new float [3];
    
        for(int i = 0; i < N ; i++)
        {
            max2 = min2 = K[i][0];
    
            for(int j = 0; j<3; j++)
            {
                if(min2 > K[i][j])
                    min2 = K[i][j];
                if (max2 < K[i][j])
                    max2 = K[i][j];
    
                var_medio += K[i][j];
            }
    
            S[i][0] = min2;
            S[i][1] = max2;
            S[i][2] = (float) var_medio / 3;
    
            var_medio = 0;
        }
    
        return S;
    }
    
    
    int main()
    {
        int n = 3;
        int s[n][3];
    
        int **K = new int *[n];
    
        for(int i=0; i<3;i++)
            K[i] = new int[3];
            
          K[0][0] =1; K[1][0] =0; K[2][0] =4;
        K[0][1] =5; K[1][1] =2; K[2][1] =3;
        K[0][2] =4; K[1][2] =6; K[2][2] =8;
    
        s = tipo(K,n);
    
        return 0;
    }
    
    i miei prof, non mi hanno risposto quindi cerco comunque di sbatterci la testa... @oregon
  • Re: Problema chiamata e funzione

    Nel main devi eliminare

    int s[n][3];

    dato che lo restituisce la funzione, quindi sarà

    float **s = tipo(K, n);
  • Re: Problema chiamata e funzione

    Si, l'ho appena corretto senza vedere che mi avevi risposto, peccato volevo evitare la figuraccia.
    Grazie mille, oregon comuque.
    un'altra domanda, in ogni caso è più corretto fare il tutto con l'heap invece che con lo stack, perchè di fatto stiamo lavorando con i puntatori, no?
    @oregon
  • Re: Problema chiamata e funzione

    Se allochi nella funzione e restituisci il puntatore devi lavorare con l'heap.
  • Re: Problema chiamata e funzione

    Perfetto chiaro. grazie mille
Devi accedere o registrarti per scrivere nel forum
6 risposte