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

    C: ritornare una stringa

    Ho una funzione che non riceve parametri , all'interno attraverso un processo genera una stringa che deve essere restituita al main che chiama la funzione.
    Non riesco a fargli restituire la funzione, come devo fare???
    return stringa non me lo accetta e poi,
    nella funzione chiamante che devo scrivere:
    stringa = lancio_funzione();????
    GRazie
    http://www.perungiorno.it

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Non puoi creare la stringa dentro alla funzione, una volta terminata la funzione essa cessera' di esistere. Puoi allocare lo spazio necessario per contenere la stringa con calloc(), poi ti devi ricordare di liberare la memoria.

    codice:
    //puntatore a char per la stringa
    char *str;
    //la funzione restituisce in n la lunghezza della stringa
    int n = funzione(str);
    //ora str e' un puntatore alla stringa
    .
    .
    .
    //una volta finito di utilizzare la stringa libero la memoria
    free(str);
    
    int funzione(char *s)
    {
      int num_car = 0;
      if(calloc(20, sizeof(char)))
      {
        //alloca lo spazio per 20 caratteri
        //num_car = lunghezza stringa
      }
      return num_car;
    }
    In questo modo la stringa allocata dinamicamente rimane disponibile anche dopo la fine della funzione.
    Se per qualche motivo l'allocazione non va a buon fine num_car rimane a 0, altrimenti va impostato alla lunghezza della stringa
    Ciao,
    Lorenzo

  3. #3
    non puoi restituire una stringa allocata staticamente poichè viene allocata nello stack e ogni volta che si ritorna da una funzione il registro esp viene spostato per riferirsi di nuovo alla zona di memoria della funzione chiamante. Per dirla 'alla C' se una variabile è automatic non puoi restituirne l'indirizzo (e mi pare anche ovvio, non puoi usare una var automatic fuori il proprio scope, no?). Cmq le strade sono due: o allochi nell'heap (usando calloc/malloc e questa è la soluzione più giusta) o sennò usi un piccolo trucchetto, che ti parrà lecito facendo un po di considerazioni. Ti mostro del code in modo tale che tu possa capire:

    Codice PHP:

    char 
    *func(void);

    char *func() 
    {
       
    char array[10] = { };
       
    unsigned long i;

       for (
    09; ++i)
          array[
    i] = 'A';

       return array;
    }


    e nella funzione chiamante puoi fare cosi:

    void f()
    {
       
    char *mdlrlarray[10] = { };
       
    unsigned long i;

       
    mdl func();
       for (
    010; ++i)
          
    rlarray[i] = *(mdl i);

       
    /* la stringa che contiene il valore ritornato ora e' rlarray e usi quella */


    Ecco tutto. Questo è possibile perchè esp viene solo incrementato di un tot e non viene pulito, quindi la stringa e' ancora in memoria e quindi una copia è sufficiente a memorizzare in una zona di memoria usabile la stringa. Spero di essere stato chiaro.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  4. #4
    Siete stati molto chiari entrambi
    Grazie molte
    http://www.perungiorno.it

  5. #5
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Un anltro modo è creare una stuttura contenente una stringa, così la puoi restituire da funzione...

    Codice PHP:
    typedef struct{
                     
    char testo[30];
                  }
    struttura;

    struttura nomeFunzione(Parametri); 
    In questo caso per accedere alla stringa devi sempre mettere davanti il nome della struttura: nomeStruttura.testo.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.