Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-01-2007, 17:30   #1
deggial
Senior Member
 
L'Avatar di deggial
 
Iscritto dal: Mar 2003
Città: tra Borgo Ticino e Milano
Messaggi: 6047
[C] Errore di segmentation fault

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:

Codice:
#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!
__________________
firma in progress
deggial è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 18:19   #2
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
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);
}
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 18:20   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da deggial
Codice:
#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);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 18:22   #4
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
Iscritto dal: Jun 2004
Messaggi: 760
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ì:
Codice:
char testo[255]
oppure allocarlo in seguito così:
Codice:
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...
__________________
Gandalf_BD
--------------------------------------------
"When you aim at perfection, you discover it's a moving target"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 18:52   #5
deggial
Senior Member
 
L'Avatar di deggial
 
Iscritto dal: Mar 2003
Città: tra Borgo Ticino e Milano
Messaggi: 6047
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.
__________________
firma in progress
deggial è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2007, 10:33   #6
deggial
Senior Member
 
L'Avatar di deggial
 
Iscritto dal: Mar 2003
Città: tra Borgo Ticino e Milano
Messaggi: 6047
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:

Quote:
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???
__________________
firma in progress
deggial è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2007, 11:46   #7
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
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)
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2007, 14:03   #8
deggial
Senior Member
 
L'Avatar di deggial
 
Iscritto dal: Mar 2003
Città: tra Borgo Ticino e Milano
Messaggi: 6047
Quote:
Originariamente inviato da yorkeiser
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:
Codice:
    
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
__________________
firma in progress
deggial è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Sembra ormai certo: la prossima Xbox sar...
“Solutions Beyond Displays”: la strategi...
La società europea The Exploratio...
Dalle auto ai robot umanoidi: Faraday Fu...
Vodafone annuncia la dismissione di un s...
Stiga lancia i nuovi robot tagliaerba co...
Bullismo e cyberbullismo, Keenetic lanci...
Con AI Skills Checker Bitdefender mette ...
E-bike giapponese con 1.000 km di autono...
Un eVTOL con cui basta saper andare in b...
Dal mercato cinese al mondo: HONOR firma...
Sovranità digitale: l'UE sperimen...
Accesso alla memoria su Windows 11 solo ...
iPhone 18 Pro Max con batteria da oltre ...
Windows 11, cali di prestazioni sulle GP...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v