Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] ritorno di valore ed indirizzo da singolo sotto programma

    Ciao a tutti, ho il seguente problema: ho un sottoprogramma che deve fornire in ritorno sia la dimensione, che un array allocato dinamicamente:

    -Scrivere un sottoprogramma arrayMaggiori() che riceve come parametro un array di numeri interi e la sua dimensione. Il sottoprogramma calcola la media dei numeri e poi salva in un secondo array (da allocare dinamicamente) i numeri maggiori o uguali alla media. Infine il sottoprogramma restituisce al chiamante il nuovo array e la sua dimensione. Prestare attenzione al caso particolare in cui l'array in ingresso sia vuoto. Scrivere un programma che chiede all'utente di specificare la dimensione della serie di numeri interi da acquisire (massimo 30 numeri) e poi i dati. Il programma chiama il sottoprogramma arrayMaggiori() e visualizza il risultato su due righe (la prima riga contiene la dimensione del nuovo array, la seconda riga i suoi dati.

    Detto questo, mettendo le printf nel sottoprogramma esso funziona correttamente, quindi il ciclo logico è corretto, ma venendomi chiesto di restituire "il nuovo array e la sua dimensione" non so come muovermi.

    MIO CODICE
    codice:
    #include <stdio.h>#include <stdlib.h>
    #define MAX 30
    
    
    int arrayMaggiori(int big[], int *small, int n);
    
    
    int main (int argc, char*argv[])
    {
        int big[MAX], i, n, dim, *small, z;
    
    
        do{
            printf("dim array: ");
            scanf("%d", &n); /*dimensione array*/
        }while(n>30 || n<0);
    
    
        for(i=0; i<n; i++)
            scanf("%d", &big[i]);
    
    
        dim=arrayMaggiori(big, (int*)small, n);
    
    
        printf("la dimensione del secondo array è %d\n", dim);
    
    
        for(z=0; z<dim; z++)
            printf("%d ", *(small+z));
        
        
    
    
        return(0);
    }
    
    
    int arrayMaggiori(int big[], int *small, int n)
    {
        int acc, i, j;
        float media;
    
    
        for(i=0, media=0; i<n; i++)
            media+=big[i];
            
        media=(media/n);
    
    
        for(i=0, acc=0; i<n; i++) {
            if(big[i]>=media)
                acc++;
        }
    
    
        small=(int*)malloc(sizeof(int)*acc);
    
    
        if (small==NULL) 
        printf("errore di allocazione");
        else{
            printf("allocazione riuscita\n");
            for(i=0, j=0; i<n; i++) {
                if(big[i]>=media) {
                    *(small+j)=big[i];
                    j++;
                 }
            }
        }
        
    
    
        return acc;
    
    }


    il terminale compila in questo modo:
    fi-user@fiuser-VirtualBox:~/Scrivania/Esercizi$ gcc arraymaggiori.c -Wall -o arraymaggiori
    arraymaggiori.c: In function ‘main’:
    arraymaggiori.c:19:5: warning: ‘small’ is used uninitialized in this function [-Wuninitialized]
    fi-user@fiuser-VirtualBox:~/Scrivania/Esercizi$ ./arraymaggiori
    dim array: 3
    7
    6
    2
    allocazione riuscita
    la dimensione del secondo array è 2
    421249921 -326959104 (ovviamente sono questi i valori errati)

    Grazie a tutti e buone feste

  2. #2
    Stai passando il puntatore a small per valore... Dentro alla funzione ci assegni il valore restituito dalla malloc, ma fuori è rimasto non inizializzato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ok grazie, ma quindi come posso fare per inizializzarlo?

  4. #4
    Devi passare un puntatore al puntatore (un doppio puntatore).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    scusami, non riesco proprio a capire come.. non è che riusciresti a scrivermi come scrivere small nel codice?

    grazie davvero

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.