Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-11-2007, 14:37   #1
drobot
Junior Member
 
Iscritto dal: Nov 2007
Messaggi: 2
[C] funzioni con numero di parametri variabile

Ciao a tutti,
questo è il mio primo messaggio (di richiesta aiuto).

Ho un problema con le funzioni con numero di parametri variabile. Non sono molto pratico di C, e l'argomento non è dei più comuni...

Il programma sotto non funziona, nel senso che l'output è

Sono una Stringa
Sono una <caratteri a caso>
L'intero è 13
L'intero è -1079797532

invece di quello atteso...

Sicuramente sbaglio qualcosa, ma non so cosa.

Grazie!


#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


void myPrintfCore(const char* format, ...) {
char buff[256];
va_list ap;

va_start(ap, format);
vsprintf(buff, format, ap);
printf("%s", buff);
va_end(ap);
}

void myPrintf(const char* format, ...) {
va_list ap;

va_start(ap, format);
myPrintfCore(format, ap);
va_end(ap);
}

int main() {
char s[128];
int i = 13;

strcpy(s, "Stringa");

printf("Sono una %s\n", s);
myPrintf("Sono una %s\n", s);

printf("L'intero è %d\n", i);
myPrintf("L'intero è %d\n", i);

return 0;
}
drobot è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2007, 14:47   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da drobot Guarda i messaggi
Ciao a tutti,
Sicuramente sbaglio qualcosa, ma non so cosa.

myPrintfCore(format, ap);
Perché non ha senso che tu passi quel 'ap' come argomento dell'altra funzione.

Perché poi hai fatto 2 funzioni?? Ne basta una:

void myPrintf(const char* format, ...) {
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2007, 14:51   #3
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
vabbè, mi han preceduto

stesso consiglio, fai una funzione sola
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2007, 14:53   #4
drobot
Junior Member
 
Iscritto dal: Nov 2007
Messaggi: 2
Quote:
Originariamente inviato da andbin Guarda i messaggi
Perché non ha senso che tu passi quel 'ap' come argomento dell'altra funzione.

Perché poi hai fatto 2 funzioni?? Ne basta una:

void myPrintf(const char* format, ...) {
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
Perchè in realtà l'esempio è tratto da un caso molto più complesso: sono 2 metodi di 2 classi diverse... Uno fa parte di un buffer, l'altra di un logger (che scrive nel buffer). La prima è general purpose, la uso anche in altri contesti (senza il doppio passaggio di parametri) e funziona...

Cioè:

BufferElement::fappend(const char* format, ...)

e

TextLogger::message(const char* format, ...) {
...
this->buffer->fappend(format, ap);
...
}
drobot è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2007, 15:20   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da drobot Guarda i messaggi
Perchè in realtà l'esempio è tratto da un caso molto più complesso: sono 2 metodi di 2 classi diverse... Uno fa parte di un buffer, l'altra di un logger (che scrive nel buffer). La prima è general purpose, la uso anche in altri contesti (senza il doppio passaggio di parametri) e funziona...
Resta il fatto che quella chiamata che hai fatto non va bene e non ha senso.

Una funzione che riceve un numero variabile di argomenti non può nemmeno passare pari pari gli N argomenti che ha ricevuto ad un'altra funzione con numero variabile di argomenti.
Per un motivo molto semplice. Nella funzione non sai a priori quanti/quali argomenti vengono passati. Nelle funzioni con numero variabile di argomenti, in genere la elaborazione degli argomenti è "pilotata" da una qualche stringa di formato (o in base ad altre convenzioni). Motivo per cui solo esaminando la stringa di formato si potrebbe capire quanti sono gli argomenti e di che tipo.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Finiscono gli incentivi, crollano le ven...
Lo specchio M4 dell'Extremely Large Tele...
Un PC ricondizonato a prezzo super, perf...
TP-Link annuncia la prima gamma di dispo...
Google Pics sfida Canva con l'intelligen...
Blue Origin si aggiudica il contratto de...
Astra hackera meglio di un esperto umano...
Memorie 3D, AMD vede un possibile futuro...
Sparkle e Hellas Sat sperimentano con su...
Toyota propone un approccio 'ibrido' anc...
Huawei annuncia la serie Watch GT 7: sci...
Sonos 27 porta l'IA nel sistema audio di...
Quella solare è ufficialmente la ...
Sony WH-1000XM6 in offerta a 349€ in tut...
Sony introduce una nuova politica contro...
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: 02:24.


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