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;
}