Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    26

    [C] Stessa function, in due procedure diverse,ma in una funziona e l'altra no.

    Ciao a tutti.

    Come da titolo, ho una function che funziona in una procedure ma in un'altra no.
    Passando ai dettagli:
    - La procedure in cui funziona ritorna un valore mentre l'altra passa lo stesso valore ma senza ritornarlo al main;
    - La function in questione prende in input variabili locali di tipo short e ritorna una short.

    Descrizione del programma:
    il main invece di costruire una matrice nxn costruisce un vettore pari a (n*n)/2.
    La procedure init inizializza tutti gli elementi del vettore a 0;
    Ins assegna 1 a una determinata posizione del vettore;
    Vis visualizza quali posizioni da una certa posizione a un'altra contengono il valore 1.

    Piccola curiosità:
    Rendendola di output la variabile passata alla procedure dove la function non funziona, il compilatore va in segmentation fault dopo il calcolo della function(ma con un valore errato).

    In attesa di vostre illuminazioni.

    Grazie.

    Codici:

    -Main.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void main()
    {
        short n,*mat,k,x;
    
        puts("Inserire il numero di nodi:");
        scanf("%hd",&n);
        while(getchar()!='\n');
    
        k=(pow(n,2)-n)/2;
        mat=calloc(k,sizeof(short));
        init(&mat,k);
    
        while(x!=3)
        {
            puts("");
            puts("1.Aggiungere collegamento.");
            puts("2.Visualizzare il grado di un nodo.");
            puts("3.Uscita.");
            puts("Inserire scelta:");
            scanf("%hd",&x);
            while(getchar()!='\n');
    
            switch(x)
            {
                case 1:
                puts("Aggiunta di un collegamento.");
                ins(&mat,n);
                break;
    
                case 2:
                vis(mat,n);
                break;
    
                case 3:
                puts("Uscita");
                break;
    
                default:
                puts("Inserire un valore tra 1 e 3.");
                break;
            }
        }
    }
    - ins.c (In questa procedure la function funziona):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void ins(short **mat,short n)
    {
        short i=0,j=0,x,temp;
    
        while(i==j)
        {
            puts("Inserire 1^ nodo:");
            scanf("%hd",&i);
            while(getchar()!='\n');
    
            printf("Inserire 2^ nodo (diverso dal 1^=%hd):",i);
            scanf("%hd",&j);
            while(getchar()!='\n');
        }
    
        if(j<i)
        {
            temp=j;
            j=i;
            i=temp;
        }
    
        x=(n*i)+j-form(i);
    
        if(mat[x]!=1)
        {
            mat[x]=1;
        }
        else
        {
            puts("Collegamento già esistente.");
        }
    }
    -vis.c (In questa procedure la function non funziona):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void vis(short *mat,short n)
    {
        short i=0,j=0,grado=0,z,x,k;
    
        puts("Inserire il nodo:");
        scanf("%hd",&z);
        while(getchar()!='\n');
    
        puts("Collegato con:\n");
    
        for(i=0;i<z;i++)
        {
    
            x=(n*i)+z-form(i);
            printf("\nx=%hd\n",x);
            if(mat[x]==1)
            {
                grado++;
                printf("- Nodo %hd;\n",i);
            }
    
        }
    
        for(j=z+1;j<n;j++)
        {
            x=(n*z)+j-form(z);
            printf("\nx=%hd\n",x);
            if(mat[x]==1)
            {
                grado++;
                printf("- Nodo %hd;\n",j);
            }
        }
    
        printf("Il grado del Nodo %hd e':%hd",z,grado);
    }
    - form.c (Function in questione):
    codice:
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    short form(short q)
    {
        q=((pow(q+1,2)-(q+1))/2);
        return q;
    }
    - init.c (Serve a compilare la matrice):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void init(short **mat,short k)
    {
        short i;
    
        for(i=0;i<k;i++)
        mat[i]=0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    La spiegazione è veramente confusa ... non ho capito molto ...

    Prima di tutto ... cosa vuol dire "non funziona"?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    26
    Al momento della chiamata di form(z) in vis.c il programma va in segmentation fault (me ne sono assicurato con un printf prima e dopo la chiamata).

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non è possibile, quella funzione non può causare un seg fault.

    Probabilmente è il valore restituito ad x che, dopo, nella riga mat[x] causa il seg fault.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    26
    Oregon scusami mi sono sbagliato, il programma va in seg fault dopo la chiamata ma stampa un valore di x errato.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    "Errato" non vuol dire nulla ... in base a che dici che è errato ... forza ... un po' di spiegazioni chiare e si risolve ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    26
    Ok, ti spiego un po' cosa calcola x:
    - i, indica l'indice di riga degli elementi da stampare e va da 0 a z;
    - z, è il valore ricevuto in input e indica l'indice di colonna da visitare;
    - n, è il numero di righe/colonne della matrice;
    - form(i), invece calcola ((i+1)^2+(i+1))/2;

    Ecco una stampa dei valori:
    - il valore di i è esatto;
    - n dovrebbe essere 5(il numero di righe/colonne);
    - il valore di z è esatto;
    - form1 è il valore di form(i) stampato nella form.c è 0 ma dovrebbe essere (i=0 => ((0+1)^2+(0+1))/2 = 1;
    - form2 + il valore di form(i) stampato in vis.c

    Schermata del 2014-02-27 21:46:06.jpg

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Guarda che nella formula c'è una sottrazione

    pow(q+1,2)-(q+1)

    non un'addizione come dici tu





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

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    26
    Si, devo aver cambiato qualche parametro per verificare il reale valore della formula. Ad ogni modo, effettuando delle stampe anche in ins.c, ho verificato che anche in questa procedure il valore di n risulta 0 e il valore di x è totalmente sballato.
    Nella stampa i valori inseriti sono:
    - i=2, corretto;
    - j=3, corretto;
    - n=0, errato, dovrebbe essere 4;
    - x=12288, errato, dovrebbe essere x=(n*i)+j-((pow(i+1,2)+(i+1))/2)=11-6=5.

    Schermata del 2014-02-28 14:32:26.jpg

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    C'è un bel po' di confusione ...

    Quando dici "n=0, errato dovrebbe essere 4" a qual riga esatta di codice ti riferisci? Dove sono le printf?

    n arriva dall'esterno delle due funzioni ... quando le chiami il suo valore è corretto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.