Stringa come nome variabile

di il
6 risposte

Stringa come nome variabile

Salve a tutti! Sono nuovo nel forum e volevo porvi questo problema.
Vorrei una funzione che inizializzi un array e un puntatore a questo, solo che come argomenti vorrei dare il nome del puntatore e dell array e la lunghezza dell'array...una cosa di questo tipo (nel caso di interi!)

#include<...>
...
void initialize(char name, int length)
{
  int *name, init_name[length];
  name=&ini_name[0];
}
è possibile farla?( a parte il fatto che molto probabilmente (ditemi che non è così!) al di fuori della funzione initialize non potrò usare il puntatore creato)
Grazie a tutti!

6 Risposte

  • Re: Stringa come nome variabile

    (ditemi che non è così!)
    Invece è così: le variabili locali a una funzione vivono solo all'interno della funzione.
    Tra l'altro quel tipo di dichiarazione dell'array è consentita solo in C99 (che a quanto ne so l'implementa solo gcc), ma tutta la funzione mi pare shangerata: hai collisioni di nomi delle variabili (int *name e char name dell'argomento), assegni un puntatore int a un char.

    Non è più semplice:
    
    int *initialize(int length) {
       return malloc(sizeof(int)* length);
    }
    
    ?
  • Re: Stringa come nome variabile

    shodan ha scritto:


    (ditemi che non è così!)
    Invece è così: le variabili locali a una funzione vivono solo all'interno della funzione.
    Tra l'altro quel tipo di dichiarazione dell'array è consentita solo in C99 (che a quanto ne so l'implementa solo gcc), ma tutta la funzione mi pare shangerata: hai collisioni di nomi delle variabili (int *name e char name dell'argomento), assegni un puntatore int a un char.

    Non è più semplice:
    
    int *initialize(int length) {
       return malloc(sizeof(int)* length);
    }
    
    ?
    in effetti per la dichiarazione dell'array è così (compilo in gcc). Scusa per le sciocchezze che potrei dire ma ho imparato da me (con l'aiuto di alcune guide) e uso il C in connessione con R (lo so che non è una buona scusa per non saperne molto in materia e per essere un barbaro del C ). In effetti volevo che la stringa immessa diventasse il nome del puntatore e parte del nome della variabile...
    comunque la tua proposta mi sembra molto interessante: in pratica la funzione mi torna un puntatore a un vettore di interi di lunghezza lenght?
    quindi volendo un puntatore di nome res (a un array di 10 elementi) è questa la sintassi:
    
    int *res;
    res=initialize(10);
    
    ?
    poi, chiaramente faccio una funzione analoga per puntatore a double...
    molte grazie!
  • Re: Stringa come nome variabile

    Tieni sempre presente che quella è un'estensione del gcc; se un giorno decidi di usare un altro compilatore quella dichiarazione non sarà accettata.
    Se vuoi studiare il C, ti consiglio di farlo su un libro. Le guide online in genere sono scritte male o poco aggiornate.
    e parte del nome della variabile...
    No, in C questo non si può fare.
    in pratica la funzione mi torna un puntatore a un vettore di interi di lunghezza lenght?
    Si, ma a questo punto tanto vale usare direttamente malloc o realloc o calloc.
    Ad esempio:
    
    int *res = malloc(sizeof(int)*length);
    
  • Re: Stringa come nome variabile

    Scusa, quale è una estensione di gcc? la dichiarazione dell'array?
    Vedo se trovo un libro decente nel mio dipartimento, che non sia datato (quelli che ho avuto sotto mano erano così...)
    Grazie ancora!
  • Re: Stringa come nome variabile

    Questa:
    
    int length=10;
    init_name[length];
    
    una dichiarazione simile è consentita in C99, non in C89 o in C++ (qualsiasi revisione. Con Cxx si intende l'anno di revisione dello standard). E come ho già detto, mi risulta essere supportata solo in gcc (a dirla tutta è lo standard C che ha deciso di supportare le estensioni del gcc).
    Quindi se un giorno decidi di cambiare compilatore oppure devi scrivere un programma in ANSI C puro, quella dichiarazione non è consentita. L'unico modo standard per creare array a lunghezza variabile è tramite allocazione dinamica.
  • Re: Stringa come nome variabile

    shodan ha scritto:


    Questa:
    
    int length=10;
    init_name[length];
    
    una dichiarazione simile è consentita in C99, non in C89 o in C++ (qualsiasi revisione. Con Cxx si intende l'anno di revisione dello standard). E come ho già detto, mi risulta essere supportata solo in gcc (a dirla tutta è lo standard C che ha deciso di supportare le estensioni del gcc).
    Quindi se un giorno decidi di cambiare compilatore oppure devi scrivere un programma in ANSI C puro, quella dichiarazione non è consentita. L'unico modo standard per creare array a lunghezza variabile è tramite allocazione dinamica.
    ok, ho capito...io uso solo gcc perchè compilo librerie dinamiche da caricare in R (quindi userò certamente il tuo consiglio e spero che i codici che ho già scritto non mi diano problemi in futuro).
    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
6 risposte