Newsgroup: it.comp.lang.c
Titolo: Restituire una stringa

Ciao a tutti, ho un problema con una funzione che dovrebbe restituirmi 
una stringa, ma che invece mi da caratteri strani. posto il codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *CreateQuery(const char *str1, char *str2, char *str3)
{
    char *FinalQuery = NULL;
    fprintf(stdout, "%d \n", strlen(str1));
    fprintf(stdout, "%d \n", strlen(str2));
    if(str3 != NULL) fprintf(stdout, "%d \n", strlen(str3));
    FinalQuery = alloca((strlen(str1) + strlen(str2) + strlen(str3) + 3) 
* sizeof(char));
    if(FinalQuery == NULL)
    {
       fprintf(stdout, "Cannot allocate FinalQuery");
       exit(EXIT_FAILURE);
    }
    strcpy(FinalQuery, str1);
    fprintf(stdout, "%s \n", FinalQuery);
    strcat(FinalQuery, str2);
    fprintf(stdout, "%s \n", FinalQuery);
    if(str3 != NULL) strcat(FinalQuery, str3);
    fprintf(stdout, "%s \n", FinalQuery);
    return(FinalQuery);
}
int main()
{
    char *pippo;
    const char pluto[] = "Ciao a tutti";
    char *bibo = "brutti";
    char *bebo = "culoni";
    pippo = CreateQuery(pluto, bibo, bebo);
    if(pippo == NULL)
       fprintf(stdout, "Errore");
    fprintf(stdout, "%s \n", pippo);
    return 0;
}
Qualcuno puņ aiutarmi?
Grazie a tutti

 Grazie a tutti
prego
Ciao
Matic

 * sizeof(char));
Supponendo  che  il  resto  del  codice sia  corretto  (non  ho  guadato
approfonditamente)  l'uso  di  alloca  (che   non  e`  standard  tra  le
altre  cose)  in  questo  contesto  e`  sbagliato. La  memoria  allocata
viene  liberata in  automatico  all'uscita dalla  funzione.  Usa  malloc
(ricordandoti di usare free quando la stringa non ti serve piu`).
Luca
-- 
Home: 
http://kronoz.cjb.net
E' stato a causa di una donna che ho cominciato a bere e non ho mai
avuto la cortesia di ringraziarla.

 Matic
Grazie, Ciao
mugghy

 un ciclo for che deve fare circa 100000 giri.
Beh, non vedo dove sia il problema:
int main()
{
    ...
    for(int i=0; i<100000;++i){
         pippo = CreateQuery(pluto, bibo, bebo);
         // uso pippo in qualche modo....
         free(pippo);
    }
}
In altre parole non e' necessario liberare la memoria in CreateQuery(), ma
puoi farlo in main().
Tommy


Granzie.
Ciao, Mugghy

 termine della funzione. 
Wow, cè sempre da imparare :D non ne ero proprio a conoscenza e mi
sembrava il tipico nome di una funzione scritta in proprio :) cmq, come
dice il manuale, la memoria allocata è liberata al momento del ritorno
della funzione, quindi non puoi ritornare il puntatore a tale zona
liberata, l'errore dunque era là.
Ciao
Matic

 ritornasse la funzione.
Se sei in un ciclo for da ripetere 100000 volte cerca di portare
malloc e free fuori dal ciclo for!


Perchè? Te lo chiedo perchè mi sono spinto fino a circa 20000000 giri 
senza che succedesse nulla di strano.
Il problema è arrivato quando ho inserito un paio di righe per usare la 
stringa composta da pluto+bibo+bebo come query per mySQL: i giri si sono 
drasticamente ridotti a circa 7000. Se provo, ad esempio, con 8000 dopo 
un po il Sistema Operatovo mi chiude l'applicazione scrivendo "killed".
Il fatto è che devo usare continuamente un DB di max 10 tabelle 
generando ad ogni giro delle query per interrogarlo.
Il problema è ancora sulla funzione di generazione query o con mySQL ci 
sono dei limiti?
Se apro il DB quando parte il programma e lo chiudo solo alla 
conclusione dei N-mila giri, faccio un erroraccio?
Per concludere: Come faccio, o meglio, cosa devo imparare bene per 
scrivere codice stabile e affidabile? Cosa devo sapere per non far 
piantare un programma e per non fargli piantare anche il Sistema Operativo?
Vi ringrazio molto
Ciao, Mugghy

 senza che succedesse nulla di strano.
non e' che debba succedere qualche cosa di strano.....  e' che le
prestazioni sono molto inferiori.
Allocare e deallocare richiede tempo....
Se riesci sarebbe opportuno farlo una volta sola, prima del ciclo e poi
dellocare tale spazio dopo il ciclo.
Poi mi devi spiegare cosa serve fare quella cosa 20 miliardi di volte ;-)
Tutta la parte sui database e' OT su questo NG... (ad ogni modo dubito che
ti servano tante query cosi' in un loop stretto in un database...., mah....)
Tommy

 
Ciao, mugghy