Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220

    [C] allocazione statica di array

    Ciao amici, ho bisogno di spiegazione nel caso di allocazione rigorosamente statica (quella dinamica CREDO di conoscerla piuttosto bene)

    dunque...

    nella dichiarazione di un array (anche multidimensionale) devo specificare la dimensione

    int array[2][3];

    oppure posso ometterla, a condizione di elencare i valori

    int array[][] = {{3,4},{5,6},{7,8}};

    ma NON posso fare una cosa così

    int array[][3]; oppure
    int array[2][]; o ancora
    int array[][];

    fin qua giusto?

    Domanda 1: come mai quando passo un array multidimensionale a una funzione posso omettere la prima dimensione?

    void funz(int b[][3]) {.....}

    In paratica, come funziona la memoria nel caso di array statici?

    Domanda 2: posso scrivere una funzione che ritorna un array, questo SENZA usare i puntatori? Quindi non

    int* funz(...) {...}

    ma

    int[] funz(..) che però così come è scritto NON compila? C'è un modo?

    Grazzzie!

  2. #2
    1. Gli array monodimensionali vengono passati come puntatori al primo elemento, per cui il compilatore sa che per accedere all'n-esimo elemento deve andare a guardare n elementi dopo il primo; nel caso degli array multidimensionali la questione è più complicata, visto che, per accedere all'elemento m,n il compilatore deve identificare l'inizio della riga m, e poi aggiungere n per raggiungere l'elemento desiderato. Il punto è che per raggiungere l'inizio della riga m è necessario conoscere la lunghezza di ciascuna riga, in maniera da saltare avanti, rispetto al primo elemento, di m*lunghezzariga elementi. Un discorso analogo vale per gli array a più dimensioni. È per questo, quindi, che si può omettere solo la prima dimensione: perché le altre servono per calcolare la posizione della riga dell'elemento.
    2. Di sicuro non puoi restituire un array non dimensionato (come farebbe il chiamante a sapere quanto è grande effettivamente e quindi a recuperarlo dallo stack dopo la chiamata a funzione?). Non ricordo se si possa restituire un array dimensionato, ma comunque in questo caso non sussisterebbero problemi tecnici.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    OK allora la prima risposta l'ho capita! Grazie!

    Per quanto riguarda la seconda, pensandoci meglio,non è possibile ritornare neanche un array dimensionato: un array statico è definito a tempo di compilazione, quindi scrivere, tipo nel main una cosa così:

    int a[] = funz();

    con funz() che ritornerebbe un array è impossibile!! Sarebbe come definire un array statico con le dimensioni non costanti (variabili)!



  4. #4
    Sarebbe possibile farlo se le dimensioni dell'array restituito fossero dichiarate nel prototipo della funzione, ma, ribadisco, non so se il C supporta effettivamente questa caratteristica (uso di rado gli array C come valori restituiti, lavorando in C++ ci sono alternative migliori).
    Amaro C++, il gusto pieno dell'undefined behavior.

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.