Linguaggio C, array e puntatori

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Linguaggio C, array e puntatori

    Non ho il warning di cui parli.

    Sicuro che stai compilando il codice che hai mostrato?

    Qual è il contenuto del file .h ?
  • Re: Linguaggio C, array e puntatori

    Sìsì, è quello. Ri-posto tutto nuovamente:

    main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #include "unione.h"
    #include "allocazione.h"
    int main()
    {
    	allocazione_dinamica();
    	
    	return 0;
    }
    allocazione.h
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void allocazione_dinamica();
    allocazione.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #include "allocazione.h"
    void allocazione_dinamica()
    {
    	int a, b, a_piu_b, i, j, *A, *B, *U;				
    	
    	printf("a: "); scanf("%d", &a);
    	printf("b: "); scanf("%d", &b);
    	
    	a_piu_b = a + b;
    	
    	//Allocazione dinamica della memoria
    	A = (int *) malloc (a * sizeof(int));
    	B = (int *) malloc (b * sizeof(int));
    	
    	//Caricamento dei vettori, modalità RANDOM
    	for(i = 0; i < a; i++)
    		A[i] = rand()%10;
    	for(j = 0; j < b;  j++)
    		B[i] = rand()%10;
    	
    	//Stampa dei vettori prima dell'unione
    	printf("Array prima di essere uniti: \n");
    	for(i = 0; i < a; i++)
    		printf("A[%d] = %d\n", i, A[i]);
    		
    	printf("\n");
    		
    	for(j = 0; j < b;  j++)
    		printf("B[%d] = %d\n", j, B[j]);
    	
    	//Invocazione della funzione unione
    	U = unione(A, a, B, b, &a_piu_b);
    	
    	printf("Array unito: \n");
    	
    	for(i = 0; i < a_piu_b; i++)
    		printf("U[%d] = %d\n", i, U[i]);
    	
    }
    unione.h
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int* unione(int A[], int nA, int B[], int nB, int* sizeResult);
    unione.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #include "unione.h"
    
    int* unione(int A[], int nA, int B[], int nB, int* sizeResult)
    {
    	int i, j, riempito = 0, *U; //array di unione 
    	
    	//Allocazione dinamica del vettore unione U
    	U = (int*) malloc (*sizeResult * sizeof(int));
    	
    	//Caricamento del vettore
    	for(i = 0; i < nA; i++)
    	{
    		U[i] = A[i];
    		riempito++;
    	}
    	for(i = 0; i < nB; i++)
    	{
    		U[riempito] = B[i];
    		riempito++;
    	}
    	printf("\n");
    	
    	return U;
    }
    makefile.txt
    main.o:
    	gcc -c main.c
    
    allocazione:
    	gcc -c allocazione.c
    
    unione.o:
    	gcc -c unione.c
    
    eseguibile: main.o unione.o
    	gcc -o main.o unione.o
    
    exe:
    	gcc -o exe main.c unione.c allocazione.c
    
    clean:
    	rm -fr exe
    davide@...:~/Scrivania/Esercizio 8$ make -f makefile.txt exe
    gcc -o exe main.c unione.c allocazione.c
    allocazione.c: In function ‘allocazione_dinamica’:
    allocazione.c:37:4: warning: assignment makes pointer from integer without a cast [enabled by default]
    U = unione(A, a, B, b, &a_piu_b);
    ^
  • Re: Linguaggio C, array e puntatori

    Non ho il problema ...

    E' come se avessi scritto

    int ... U;

    e non

    int ... *U;

    Prova a dichiarare separatamente

    int *U;
  • Re: Linguaggio C, array e puntatori

    Può essere che sia un problema del compilatore?
    Tante volte, mi capita che i programmi che provo al pc all'università funzionino perfettamente. Quando poi arrivo a casa, il mio pc mi da warning che l'altro pc non dava.
  • Re: Linguaggio C, array e puntatori

    Questo è il concetto:
    
    char* my_gets(char* d,int max)
    {
        char* st = d;
        int c;
        while ( (c = getchar()) != EOF && c != '\n' && --max > 0 ) *d++ = c;
        *d = '\0';
        return st;
    }
    
    
    void* my_union(unsigned int* sz,void* a,unsigned int sza, void* b,unsigned int szb)
    {
        char* ra = (char*) a;
        char* rb = (char*) b;
    
        *sz = sza + szb;
        char* ret = malloc( *sz );
        char* mem = ret;
    
        while ( sza-- )
            *ret++ = *ra++;
    
        while ( szb-- )
            *ret++ = *rb++;
    
        return mem;
    }
    
    
    int main()
    {
    
        char buffer1[80];
        printf("write string1:");
        my_gets(buffer1,80);
    
        char buffer2[80];
        printf("write string2:");
        my_gets(buffer2,80);
    
        unsigned int sz;
        char* un = my_union(&sz,buffer1,strlen(buffer1),buffer2,strlen(buffer2) + 1);
        printf("union:%s\n\n",un);
        free(un);
    
        const int SZB = 10;
        int n;
        int ibuf1[SZB];
        int ibuf2[SZB];
        for ( n = 0 ; n < SZB ; n++)
        {
            printf("write integer1(%d/10):", n + 1 );
            my_gets(buffer1,80);
            ibuf1[n] = atoi(buffer1);
            printf("write integer2(%d/10):", n + 1 );
            my_gets(buffer1,80);
            ibuf2[n] = atoi(buffer1);
        }
    
        int* iun = my_union(&sz,ibuf1,sizeof(int) * SZB,ibuf2,sizeof(int) * SZB);
    
        printf("union:\n");
        for ( n = 0 ; n < sz / sizeof(int) ; n++)
            printf("u[%d]=%d\n", n, iun[n] );
    
        free(iun);
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
19 risposte