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

    [C] restituire stringhe

    Ciao ragazzi, ho una funzione che mi fa vari controlli sui parametri passati al programma da riga di comando.. il prototipo è questo:

    int controllaParametri(int argc, char *argv[], char* corpus, char* query, char * stopwords)

    dove le ultime variabili sono dichiarate così nel main..

    char *corpus, *stopwords, *query;

    e questa e la chiamata:

    controllaParametri(argc, argv, corpus, query, stopwords)

    Dopo la chiamata di funzione corpus query e stopwords dovrebbero contenere alcune stringhe passate da riga di comando di cui non conosco a priori lìordine.... quello che fa la funzione è appunto individuare l'ordine dei parametri (che sono del tipo "-x parametro") e controllare che i parametri siano corretti...

    All'interno della funzione, una volta individuata la posizione dei vari parametri la uso per restituirli nelle giuste variabili.....

    quindi faccio:

    corpus = argv[c+1];
    query = argv[q+1];
    if(s != 0) stopwords = argv[s+1];

    (dove argv[X+1] punta al parametro che voglio memorizzare)

    Il problema è che se stampo le variabili (corpus etc etc), dentro la funzione, ottengo quello che mi aspetto.. ma se le stampo nel main per la prima non stampa nulla, per le altre due stampa <null>...

    sarà l'ora, o sarò ancora troppo poco pratico di stringhe puntatori e casini vari... ma cosa sbaglio?



  2. #2
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Quando chiami la funzione controllaParametri crei una copia dei puntatori che passi...

    I cambiamenti che fai all'interno della funzione non vengono mantenuti, perchè non stai lavorando sui puntatori originali...

    Gli unici effetti permanenti che potresti ottenere sarebbero quelli sugli oggetti a cui i puntatori puntano. Per risolvere il tuo problema devi utilizzare i doppi puntatori (char**, int**, ecc), che ti permettono di modificare sia il puntatore che il contenuto)

    Ad esempio:

    codice:
    char x
    char* pX;        // puntatore a carattere
    char** ppX;      // puntatore a puntatore a carattere
    
    pX = &x;
    ppX = &x;
    
    *ppX = ...         // accedi a pX
    **ppX = ...        // accedi a X
    Linux user number 403381

    Stop TCPA!

  3. #3
    hum... non sei riuscito a convincermi...

    visto anche che non ci riesco

    Ho dovuto restituire stringhe altre volte.. ed è questo che mi stranisce... solitamente non è un problema... ad esempio nello stesso sorgente ho una funzione

    int getWord(FILE *fp, char *word)

    che preso un file mi retituisce in "word" la prima parola letta [è una funzione richiesta da un progettino che sto facendo per l'uni]

    la chiamo così: getWord(nomefile,parola);
    la funzione mi valorizza "parola" che è dichiarato come vettore di char... e poi la stampo...

    non capisco.. in questo caso coosa cambia?

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il problema è quelo che ti ha indicato Fox82: in c tutti i parametri sono passati per valore: se vuoi modificare un parametro devi passare non il parametro stesso, ma il puntatore al parametro, il quale puntatore sarà immodificabile perchè passato per valore come sempre, ma potrai modificare la variabile da esso puntata. Nel tuo esempio tu vuoi modifiare una stringa, o meglio un puntatore a char, e passi il puntatore stesso, di cui la funzione avrà semplicemente una copia; se lo vuoi modificare in quel modo devi passare il puntatore a puntatore. Oppure puoi copiare a mano la stringa nelle locazioni puntate dal parametro, ma in questo caso devi allocare lo spazio per la stringa prima della chiamata della funzione, e poi copiare carattere per carattere la stringa nelle locazioni puntate dal parametro: in questo caso il parametro (cioè il puntatore a char) non è modificato ma sono modificate le locazioni a cui punta, come al solito. In questo caso mi pare che puoi utilizzare una funzione di libreria per la copia di stringhe.


  5. #5
    hum.. sì capito.. mo' provo con strcpy allora, senza sclerare coi doppi puntatori

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.