PDA

View Full Version : [C] Errore di segmentation fault


deggial
25-01-2007, 17:30
Ciao a tutti. Ho un piccolo (spero) problema con il C.

Ammetto di essere un pelo ignorante con stringhe e puntatori (e ho pure la presunzione di usare il C senza conoscere a fondo il magico mondo dei puntatori!), comunque nella porzione di codice sotto mi da un errore di segmentation fault:


#include <iostream>

int main()
{
const char *testo;
int lun;
int valore=13;

testo=(char *) valore;
lun=strlen (testo);
}


Qualcuno mi può aiutare e spiegare il perchè? Intuisco che c'è qualcosa che non va nella stringa testo, ma non capisco come mettere a posto.

Grazie a tutti!

yorkeiser
25-01-2007, 18:19
int valore=13;
testo=(char *) valore;

non ha senso in c, per quel che mi risulta.

Dallo strlen mi sembra di capire che tu stia cercando di convertire l'intero 13 in una stringa e salvarla nella variabile testo, per cui il codice corretto con i puntatori sarebbe:

#include <stdlib.h>
#include <string.h>

main()
{
char* testo;
int lun;
testo=(char*)malloc(MAX_LUNGH_STRINGA*sizeof(char)); //ricordate sempre di allocare memoria coi puntatori a stringhe !
itoa(13,testo,10); //conversione intero->stringa
printf("%s",testo);
lun=strlen (testo);
}

andbin
25-01-2007, 18:20
#include <iostream>

int main()
{
const char *testo;
int lun;
int valore=13;

testo=(char *) valore;
lun=strlen (testo);
}
Non puoi fare una conversione da un valore numerico ad una stringa con un cast (e nemmeno il contrario, ovviamente)!

Puoi usare sprintf() oppure itoa() (che però non è standard).

char testo[20];
int valore=13;
sprintf (testo, "%d", valore);

Gandalf_BD
25-01-2007, 18:22
EDIT: ti hanno appena risposto già gli altri :)

infatti... la stringa testo va allocata... come hai fatto tu, qualche volta fuonziona e qualche volta no, ma se funziona lo fa per puro caso...
puoi dichiarare testo così:char testo[255]
oppure allocarlo in seguito così:testo = (char *) malloc(255*sizeof(char))

e poi, ma di questo non sono sicuro al 100%, non penso che la tua conversione da int a char con un semplice cast vada bene, ma di questo al momento non sono proprio sicuro...
:)

deggial
25-01-2007, 18:52
Grazie, da quel che ho capito da voi (e dagli sbattimenti di oggi pomeriggio) ho capito che l'errore dovrebbe stare nel non aver allocato la memoria per la variabile testo.
Ora non sono in ufficio, e devo convincermi che NON voglio lavorare stasera, quindi proverò domattina a sistemare.

Sul fatto che non si possa convertire con un semplice cast, l'ho letto (o almeno immagino di averlo letto) su un libro (anche abbastanza autorevole che io sappia: Bellini, Guidi - Linguaggio C. Guida alla programmazione)...
Domani controllerò, magari sono io che ho interpretato in modo fantasioso qualche frase ambigua che era presente.

deggial
26-01-2007, 10:33
Grazie per le risposte, ma non si risolve comunque il problema...
A me serve che testo sia definito come const char, perchè poi devo utilizzarlo in una PQexecParam.

L'esempio che vi ho postato è molto semplificato, in realtà testo è un array di 11 stringhe, e PQexecParam è definita come segue:


PGresult *PQexecParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);

If parameters are used, they are referred to in the command string as $1, $2, etc. nParams is the number of parameters supplied; it is the length of the arrays paramTypes[], paramValues[], paramLengths[], and paramFormats[]. (The array pointers may be NULL when nParams is zero.) paramTypes[] specifies, by OID, the data types to be assigned to the parameter symbols. If paramTypes is NULL, or any particular element in the array is zero, the server assigns a data type to the parameter symbol in the same way it would do for an untyped literal string. paramValues[] specifies the actual values of the parameters. A null pointer in this array means the corresponding parameter is null; otherwise the pointer points to a zero-terminated text string (for text format) or binary data in the format expected by the server (for binary format). paramLengths[] specifies the actual data lengths of binary-format parameters. It is ignored for null parameters and text-format parameters. The array pointer may be null when there are no binary parameters. paramFormats[] specifies whether parameters are text (put a zero in the array) or binary (put a one in the array). If the array pointer is null then all parameters are presumed to be text. resultFormat is zero to obtain results in text format, or one to obtain results in binary format. (There is not currently a provision to obtain different result columns in different formats, although that is possible in the underlying protocol.)


Mi serve calcolare la lunghezza dei vari elementi di testo per specificarli in paramLengths[]

Qualcuno ha idee in merito???

yorkeiser
26-01-2007, 11:46
Cosa devi passare a quella funzione, solo le lunghezze o anche le singole stringhe di testo? Te lo chiedo perchè la funzione non accetta array di stringhe in input, solo semplici stringhe. Probabilmente usi qualche accrocchio per spezzettare una stringa in più stringhe (e probabilmente per far questo usi proprio l'array delle lunghezze delle singole stringhe)

deggial
26-01-2007, 14:03
Cosa devi passare a quella funzione, solo le lunghezze o anche le singole stringhe di testo? Te lo chiedo perchè la funzione non accetta array di stringhe in input, solo semplici stringhe. Probabilmente usi qualche accrocchio per spezzettare una stringa in più stringhe (e probabilmente per far questo usi proprio l'array delle lunghezze delle singole stringhe)

Alla funzione passo questo:

ris_insert = PQexecParams(conn,
"INSERT INTO tab1 VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
11,
NULL,
param,
param_length,
param_formats,
0);


param è un array di 11 stringhe
param_length DOVREBBE essere un array di 11 lunghezze (le lunghezze delle stringhe appunto)
param_formats è un array di 11 "1" che indica che i dati che inserisco sono binari