Crash Console Code Blocks

di il
10 risposte

Crash Console Code Blocks

Salve a tutti, quando chiamo questa funzione la console si apre e smette di funzionare ma non capisco perché:


typedef struct insieme
 {
	double *arr;     /*array che andrà a contenere gli elementi dell'insieme*/
	int dim;	 /*variabile per il numero di elementi dell'insieme*/
	int ind;	 /*variabile indice per muoversi all'interno dell'array*/
 } insieme_t;


insieme_t * intersezione ( insieme_t ins1,       /*variabile per rappresentare il primo insieme*/
				           insieme_t ins2)      /*variabile per rappresentare il secondo insieme*/
{
	insieme_t * ins_int;     /*variabile per restituire alla main l'insieme intersezione*/

	if( (ins1.ind) < (ins1.dim) )
	{
		for (ins2.ind = 0; (ins2.ind) < (ins2.dim); ins2.ind ++)
			if((ins1.arr[ins1.ind]) == (ins2.arr[ins2.ind]))
			{
				if((ins_int -> dim) == 0)
				{
				    ins_int->arr = (double *) calloc( 1, sizeof(double));
					ins_int->dim = 1;
					ins_int->ind = ins_int->dim --;

					ins_int -> arr[ins_int -> ind] = ins1.arr[ins1.ind];
				}
				else
				{
				    ins_int->arr = (double *) realloc( ins_int->arr, ins_int->dim * sizeof(double));
                	ins_int->dim ++;
                	ins_int->ind ++;

                	ins_int->arr[ins_int->ind] = ins1.arr[ins1.ind];
                }
			}
		ins1.ind ++;
		ins_int=intersezione (ins1, ins2);
	}
	ins1.ind = 0;
	ins2.ind = 0;
	ins_int->ind = 0;
	return(ins_int);
}




Int main(void){

insieme_t * ins_int;

    ins_int =  intersezione(ins1, ins2);
	printf("L'insieme intersezione ha i seguneti elementi:\n");


	for(ins_int->ind = 0; ins_int->ind < ins_int->dim; ins_int->ind ++)
	{
		printf("%lf \t", ins_int->arr[ins_int->ind]);
		if(ins_int->dim -- == ins_int->ind)
			printf("\n");
	}

return(0);
}

10 Risposte

  • Re: Crash Console Code Blocks

    Perchè non posti il codice intero?
  • Re: Crash Console Code Blocks

    Succede perché la struttura puntata da ins_int non è mai stata allocata
  • Re: Crash Console Code Blocks

    oregon ha scritto:


    Succede perché la struttura puntata da ins_int non è mai stata allocata
    Se intendi la typedef scusa ma non l'avevo messa nel post, ora c'è.
  • Re: Crash Console Code Blocks

    Nippolo ha scritto:


    Perchè non posti il codice intero?
    Ora è intero tranne la parte dove riempe gli array(che funziona e non da problemi)
  • Re: Crash Console Code Blocks

    Zack909 ha scritto:


    oregon ha scritto:


    Succede perché la struttura puntata da ins_int non è mai stata allocata
    Se intendi la typedef scusa ma non l'avevo messa nel post, ora c'è.
    Che c'entra la typedef? Ti ho detto che manca l'allocazione di memoria, la malloc o la calloc della struttura puntata da ins_int !
  • Re: Crash Console Code Blocks

    oregon ha scritto:


    Zack909 ha scritto:


    oregon ha scritto:


    Succede perché la struttura puntata da ins_int non è mai stata allocata
    Se intendi la typedef scusa ma non l'avevo messa nel post, ora c'è.
    Che c'entra la typedef? Ti ho detto che manca l'allocazione di memoria, la malloc o la calloc della struttura puntata da ins_int !
    C'è una calloc per l'array dentro la struttura, ne servono altri??
  • Re: Crash Console Code Blocks

    Quello alloca l'array.

    Ma tu hai solo un puntatore alla struttura ... quindi non hai lo spazio per la struttura e lo devi allocare.

    Ovvero, dato che mi pare tu non abbia idea
    
    insieme_t *ins_int = (insieme_t *) calloc(1, sizeof(insieme_t));
    
  • Re: Crash Console Code Blocks

    oregon ha scritto:


    Quello alloca l'array.

    Ma tu hai solo un puntatore alla struttura ... quindi non hai lo spazio per la struttura e lo devi allocare.

    Ovvero, dato che mi pare tu non abbia idea
    
    insieme_t *ins_int = (insieme_t *) calloc(1, sizeof(insieme_t));
    
    Grazie mille! Così non mi va in crash, però anche in questo modo quando provo a stampare l'array non stampa niente
  • Re: Crash Console Code Blocks

    Ora è intero tranne la parte dove riempe gli array(che funziona e non da problemi)
    Se posti un codice completo e compilabile ci agevoli molto nell'aiutarti!

    In ogni caso il membro ind della struct è inutile, ti consiglierei di toglierlo (ne guadagnerebbe parecchio anche la leggibilità del codice).
  • Re: Crash Console Code Blocks

    Guarda che l'intersezione la stai facendo più complicata di quella che è: non hai bisogno di allocare niente una volta che hai i due insiemi di partenza, li riordini e basta
    
    #include <stdio.h>
    
    struct insieme
    {
      double *  a;
      int       l;
    };
    
    int intersezione(insieme i1, insieme i2, unsigned int step)
    {
        int k, j;
        double temp;
    
        for(k = step; k < i1.l; k++)
            for(j = step; j < i2.l; j++)
                if(i1.a[k] == i2.a[j])
                {
                    temp = i1.a[step];
                    i1.a[step] = i1.a[k];
                    i1.a[k] = temp;
                    temp = i2.a[step];
                    i2.a[step] = i2.a[j];
                    i2.a[j] = temp;
                    return intersezione(i1, i2, step + 1);
                }
    
        return step;    
    }
    
    int main(void)
    {
        int n1, n2;
        insieme insieme1, insieme2;
        
        printf ("Inserisci il numero di elementi del primo insieme: ");
        scanf (" %d", &n1);
        if(n1 < 0){
            printf ("Valore immesso non valido\n");
            getchar();
            return -1;
        }
        else if(n1 > 0){
            insieme1.a = (double *)malloc(n1*sizeof(double));
            if(insieme1.a == NULL){
                printf ("Memoria insufficiente\n");
                getchar();
                return -1;          
            }
        }   
        insieme1.l = n1;
        while(n1--){
            printf ("Inserisci elemento: ");    
            scanf(" %lf", &insieme1.a[n1]);
        }
        
        printf ("Inserisci il numero di elementi del secondo insieme: ");
        scanf (" %d", &n2);
        if(n2 < 0){
            printf ("Valore immesso non valido\n");
            getchar();
            return -1;
        }
        else if(n2 > 0){
            insieme2.a = (double *)malloc(n2*sizeof(double));
            if(insieme2.a == NULL){
                printf ("Memoria insufficiente\n");
                getchar();
                return -1;          
            }
        }   
        insieme2.l = n2;
        while(n2--){
            printf ("Inserisci elemento: ");    
            scanf(" %lf", &insieme2.a[n2]);
        }
        
        n2 = intersezione(insieme1, insieme2, 0);
        if(n2 > 0){
    	printf("L'intersezione dei due insiemi ha dimensione %d ", n2);
            printf("ed e' composta dagli elementi:\n");
            for(n1 = n2 - 1; n1 >= 0; n1--)
                printf("%lf\n", insieme1.a[n1]);
        }
        else
    	printf("L'intersezione dei due insiemi e' vuota\n");
    
        getchar();
        return 0;
    }
    
    
Devi accedere o registrarti per scrivere nel forum
10 risposte