Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-07-2007, 15:07   #1
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
[C] problema strcpy ??

sto scrivendo una libreria per un progetto. Questa libreria, sostanzialmente, è composta da un set di funzioni che servono a gestire una lista ordinata.
Ho una funzione, lmake, che crea un nodo di questa lista riempiendo opportunamente i vari campi. Andando a provare, con un banale programma, queste funzioni mi sono accorto che proprio la più insospettabile, lmake appunto, non funziona. O meglio non inizializza alcuni campi come dovrebbe.

DEFINIZIONE NODO:

struct lnode{
char name[MAXB];
char pass[MAXB];
char pid[MAXB];
int stat;
struct pnode *pends;
struct lnode *next;
};
typedef struct lnode LNODE;

LMAKE:

LNODE *lmake(char *name,char *pass){
printf("%s %s\n",name,pass);
LNODE *x=(LNODE *)malloc(sizeof(LNODE));

strcpy(x->name,name);
strcpy(x->pass,name);
strcpy(x->pid,"");
x->stat=disconnesso;

x->pends=NULL;
x->next=NULL;
printf("%s %s\n",x->name,x->pass);
return x;
}

PROGRAMMA DI PROVA:

int main(){
LNODE *n1,*n2,*n3;
PNODE *t;
char buff[MAXB];

n1=lmake("nino","123");
n2=lmake("mara","456");
n3=lmake("poppy","789");


scanf("%s",buff);
return 0;
}

come si può vedere io mi faccio stampare, appena entra in lmake, i parametri che riceve (username e password). Mi faccio poi stampare i campi immediatamente prima che la funzione termini. L'output è assai strano:

nino 123
nn n
mara 456
mm m
poppy 789
pp p

in sostanza l'input è coerente, ma nel campo viene copiato qualcosa di diverso...e sono due ore che sbatto la testa su questo codice di 3 righe. Dopo un pò mi sono deciso a chiedere a chiunque abbia esperienza col C, perchè sicuro è una di quelle cazzate inumane che ignoro totalmente, e senza scusanti.

Vi ringrazio comunque per l'attenzione, anche se avrete letto solo le prime 3 righe

Ultima modifica di magagna : 12-07-2007 alle 15:38.
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:16   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da magagna Guarda i messaggi
in sostanza l'input è coerente, ma nel campo viene copiato qualcosa di diverso
A parte il fatto che copi il name nel campo pass. Ma per il resto quel pezzo di codice mi sembra corretto. Quanto vale MAXB?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:20   #3
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
i due parametri di input della funzione, name e pass, vengono copiati rispettivamente in x->name e x->pass, o almeno questa sarebbe l'intenzione.

MAXB vale 15
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:26   #4
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
ho compilato e provato sia con gcc sotto Ubuntu, che con Dev-C++ sotto Windows e l'output è lo stesso...
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:50   #5
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
purtroppo sono una gran testa di C

avevi ragione a chiedermelo andbin, perchè ho sbagliato a scrivere MAXB. Io credevo fosse 15, in realtà avevo battuto solo 1.

Mea Culpa!

Ultima modifica di magagna : 12-07-2007 alle 15:53.
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:06   #6
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
un consiglio: butta via la strcpy e usa la strncpy:
strcnpy(x->name,name, sizeof(x->name));
strcpy(x->pass,pass, sizeof(x->pass));
/*strcnpy(x->pid,""); */ memset((void *) x->pid, 0, sizeof(x->pid))

il 3° parametro indica quanti caratteri al massimo copiare nel primo parametro

se usi la strcpy e MAXDB è definito = 15, se io faccio una cosa del genere
strcpy(x->name, "123456789123456789123456789")
vai pure tranquillo che sporchi memoria col rischio di segmentation fault o bachi semi-impossibili da trovare

__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:32   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da maulattu Guarda i messaggi
un consiglio: butta via la strcpy e usa la strncpy
Il consiglio è più che giusto ... però si dovrebbe copiare un carattere in meno e assicurarsi che ci sia sempre il nullo finale. malloc non azzera la memoria e facendo come hai detto tu è possibile che la stringa non sia null terminated.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:37   #8
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da andbin Guarda i messaggi
Il consiglio è più che giusto ... però si dovrebbe copiare un carattere in meno e assicurarsi che ci sia sempre il nullo finale. malloc non azzera la memoria e facendo come hai detto tu è possibile che la stringa non sia null terminated.
Codice:
Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.
hai ragione
al più si fa un bel memset della stringa e poi ci si copia dentro l'altra, mettendo sempre lo 0 alla fine:
string[sizeof(string) - 1] = 0;

ps: io non ho parlato di malloc
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:50   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da maulattu Guarda i messaggi
ps: io non ho parlato di malloc
Io mi riferivo al codice di magagna che usa malloc per allocare la struttura. Se avesse usato calloc, ad esempio, il blocco sarebbe azzerato e quindi basterebbe fare
strncpy(x->name, name, sizeof(x->name)-1);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2007, 19:39   #10
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da andbin Guarda i messaggi
Io mi riferivo al codice di magagna che usa malloc per allocare la struttura. Se avesse usato calloc, ad esempio, il blocco sarebbe azzerato e quindi basterebbe fare
strncpy(x->name, name, sizeof(x->name)-1);
ok
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 23:48   #11
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
vi ringrazio per i suggerimenti, ragazzi
magagna è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
I coupon nascosti di Amazon si rinnovano...
Disponibili i video e le immagini in alt...
La NASA ha rilasciato le prime fotografi...
Cometa interstellare 3I/ATLAS: l'ESA dif...
Kodak PIXPRO AZ653: la fotocamera bridge...
Monitor da gaming: Samsung si conferma l...
The Duskbloods potrebbe arrivare a fine ...
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: 09:41.


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