Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    3

    [C] passaggio di matrici per funzioni

    Salve, premetto che sono alle primissime armi con la programmazione, quindi in modo da imparare qualcosa vorrei chiedervi perché questo programma mi da segmentation fault

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int prodottoScalare(int*,int,);
    
    int main()
        {
        int i=0,t=0,j,N=0,*arr,**matrix;
        do
        {scanf("%d",&t);
        if (t==0||t==1)    
        {arr[i]=t;i++;N+=1;}}
        while(t!=-1); //inserisco i valori dell'array che devono essere o 0 o 1, -1 interrompe l'inserimento.
        **matrix=prodottoScalare(arr,N,); //passo la matrice creata
        for(i=0;i<N;i++)
           {for(j=0;j<N;j++)
               {printf("%d ",matrix[i][j]);}
            printf("\n");} //scorro la matrice per stamparla riga per riga
        return 0;
        }
    
    
    int prodottoScalare(int *arrx,int M)
        {
        int **matrixx,i,j;
        matrixx=malloc(M*sizeof(int*));
        for(i=0;i<M;i++) matrixx[i]=malloc(M*sizeof(int));
        for(i=0;i<M;i++)
           for(j=0;j<M;j++)
           matrixx[i][j]=arrx[i]*arrx[j]; 
    //inserisco nella matrice creata per ogni elemento il prodotto dell'array per sé stesso
        
        return **matrixx;
        free(matrixx);
        }
    dunque, io devo creare, dato un array riempito da imput con 0 o 1, una matrice i cui elementi sono la moltiplicazione di ogni elemento dell'array per tutti gli elementi dello stesso. Comunque a parte questo, cancellando pezzi e spostando il printf all'interno della funzione ho visto che fa tutto quello che deve, ma se come nel codice sopra citato voglio passare la matrice al main e dopo scorrerla con il printf ottengo segmentation fault.
    Lo stesso se cancello solo la chiamata di funzione. Ho cercato su internet ma niente che aiuti. Qual'è il mio errore?

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Salve, premetto che sono alle primissime armi con la programmazione
    Credo, che non hai compreso bene l'argomento puntatori, già usare un puntatore per passare una variabile per riferimento ad una funzione, potrebbe essere un buon traguardo per uno "alle primissime armi", nessuno ti dirà l'errore nel tuo programma, perché è completamente sbagliato l'uso che fai dei puntatori, nel main non allochi memoria a nessun puntatore, ma li usi come se fossero allocati, la funzione che richiami restituisce un intero, e tu vorresti assegnarlo a un puntatore , METTI IN PAUSA, il programma, ripassa i puntatori, leggi qualcosa su array allocati dinamicamente e come restituire un array e o matrice da una funzione, andare per tentativi non ti porterà da nessuna parte, e un forum non è un posto per fare lezioni, visto che nel linguaggio C i puntatori sono essenziali, ti consiglio di rivederli dall'inizio facendo esercizi di livello di difficoltà via via crescenti, e tra qualche tempo, cimentarti in quello che vorresti fare adesso
    Ultima modifica di torn24; 17-12-2015 a 12:01
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    3
    D'accordo, capisco che ho bisogno di una ripassata su puntatori ecc. Ma tutti gli esercizi in precedenza mi sono riusciti senza problemi e il problema di questo esercizio non sta certo nel fatto che non allocchi *arr visto che mi pare l'unico modo per riempire un array da input tastiera senza saperne l'estensione. E infatti passandolo poi in funzione tutto va bene: se stampo la matrice direttamente da funzione non c'è problema. Il problema viene quando passo la matrice.
    Non so bene cosa sbagli ma non riesco a trovare una guida con cui passare una matrice da funzione (ed è questo che chiede l'esercizio:una funzione che crea una matrice dato un array, con tutte quelle piccolezze del caso).

    Edit
    Sto pensando ora che potrei non lasciare questo array '' indefinto'' creando lo dinamicamente e riallocandolo ogni volta che aggiungo da tastiera un elemento... Ma questo non risolve il problema...
    Ultima modifica di Nordeer; 17-12-2015 a 12:22

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Intanto nella funzione non ha senso eseguire qualcosa dopo il return (tanto più che la free non devi proprio farla ... altrimenti che hai fatto a fare l'allocazione della matrice?)

    In secondo luogo devi restituire un puntatore doppio ... quindi la funzione dovrà essere

    int ** prodottoScalare(...

    dovrai fare una

    return matrixx;

    e scrivere

    matrix=prodottoScalare(...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    3
    Grazie, per i return al corso danno per scontato... E anche su internet è molto stretta la spiegazione. E... Accidenti io avevo messo return matrixx e matrix= solo che non mi ero accorto di aver dichiarato una funzione con puntatore singolo. grazie dell'aiuto!
    E grazie @tom24, mi darò una bella ripassata!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.