Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-04-2006, 19:27   #1
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
[C] caratteri accentati con PRINTF

Ciao a tutti!! premettendo che sn neofita di programmazione, sto iniziando ad imparare dal linguaggio C per farmi un po' le ossa..

Chiedo a tutti voi .. come si fa a passare alla funzione printf caratteri accentati da stampare a video?

Non ne vengo fuori neanche con Mr Google..

Grazie in anticipo!!
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 20:17   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
Ciao a tutti!! premettendo che sn neofita di programmazione, sto iniziando ad imparare dal linguaggio C per farmi un po' le ossa..

Chiedo a tutti voi .. come si fa a passare alla funzione printf caratteri accentati da stampare a video?

Non ne vengo fuori neanche con Mr Google..

Grazie in anticipo!!
Il problema non è tanto quello di inserire un carattere "speciale" all'interno di una stringa "C". Il problema è comprendere la questione dei set di caratteri.

Faccio un esempio pratico:

tramite un editor in Windows (quello interno del VC++, se usi questo IDE, oppure il blocco note, o altro) scrivi questo codice:
Codice:
#include <stdio.h>

int main (void)
{
    printf ("à\n");
    return 0;
}
Poi compilalo (come eseguibile Win32 per console) e lancialo da un prompt dei comandi.

Ecco l'output (io ho creato un prova.exe):

Stampa la lettera "ó" ... perché???

Semplice. Windows, almeno nel nostro paese, usa il set di caratteri WIN-1252 (detto anche CP-1252). La console del prompt dei comandi usa invece il set di caratteri CP-437 (anche chiamato OEM o IBM-PC).
I due set di caratteri sono diversi. La lettera "a" con accento grave è il codice 0xE0 per il WIN-1252 mentre è il codice 0x85 per il CP-437.

Il set di caratteri della console si può modificare ma supponendo, come è tipico, che usi il set CP-437, per stampare una "a" con accento grave si può fare:
Codice:
#include <stdio.h>

int main (void)
{
    printf ("\x85\n");
    return 0;
}
Purtroppo la problematica dei set di caratteri è una problematica abbastanza grossa. L'unica cosa da fare, in questi casi, è capire/sapere dove un carattere dovrà essere stampato e con quale set di caratteri.

Di set di caratteri ce ne sono davvero tanti (troppi ). Dai una occhiata qui solo per avere una idea!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:07   #3
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
Grazie mille per la pazienza.. quindi è un discorso di seti di caratteri..
Asci centra qualcosa o sono fuori strada?
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:11   #4
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
ho provato a modificare la stringa ed al posto di è ho digitato \x85 ma mi stampa à..

Vado su wiki a vedere se combino..che rompimento però questo problema..
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:29   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
Grazie mille per la pazienza.. quindi è un discorso di seti di caratteri..
Asci centra qualcosa o sono fuori strada?
Il set di caratteri ASCII rappresenta solo i primi 128 caratteri (da 0 a 127) ed è praticamente la "base" per ogni sistema informatico. In pratica, detto in altre parole, non esiste alcuna confusione sul significato dei caratteri da 0 a 127. È il codice ASCII e basta.

Il problema sono tutti gli altri set di caratteri, che danno un significato diverso ai caratteri da 128 a 255.
Se tu imposti la console di Windows in CP-437 oppure in CP-850, i primi 128 caratteri sono e restano uguali, quello che cambia sono i 128 caratteri speciali appunto da 128 a 255.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:36   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
ho provato a modificare la stringa ed al posto di è ho digitato \x85 ma mi stampa à..
Certo ... ho anche fatto l'esempio.

Se sei nelle seguenti condizioni:
a) Devi stampare sulla console
b) La console usa il CP-437

Per stampare la "è" devi usare \x8A.

Comunque basta che vai su Wikipedia oppure cerchi "CP-437" con google e trovi subito la mappa dei caratteri.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:38   #7
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
Ti ripeto il grazie per la pazienza..
OK ho combinato, prima ero stato disattento..
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:46   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
C'è anche una cosa che puoi fare: vedere quale code-page è in uso nella console.
Basta usare il comando:

mode con: cp /status

Sul mio sistema in effetti mi segnala che ho il CP-850.
CP-437 e CP-850, non vorrei sbagliare, sono abbastanza simili. Dovrei vedere bene le due mappe, comunque per quanto riguarda le lettere accentate (àèìòù áéíóú) dovrebbero essere uguali.
Diciamo che il CP-437 è valido in america, mentre in Europa il CP-850 è forse più appropriato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:49   #9
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
mi dice 850
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 21:56   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
mi dice 850
Infatti ... Windows versione italiana imposta il CP-850 per default nella console.
Comunque ho verificato le mappe della 437 e 850: le 10 lettere accentate sono nello stesso posto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2006, 22:02   #11
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
Inizio a pensare che programmare in c sia abbastanza uno sbattimento se devi stare sempre attento anche a queste cosette..
Sto facendo un corso di sviluppo software e iniziamo dal c per proseguire poi sulla piattaforma dot net con c#...
Speriamo di nn fare casino..
Per adesso siamo arrivati ai cicli while e for..siamo proprio all'inizio..
Io lavoro e sono da sempre sistemista windows e tecnico di rete.
Sono certificato Cisco.
Questa è la mia prima esperienza di programmazione percui accetto aiuti e consigli a valanga..

Tu programmi per lavoro?
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 08:31   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
Inizio a pensare che programmare in c sia abbastanza uno sbattimento se devi stare sempre attento anche a queste cosette..
Beh ... no dai ... sbattimento non proprio.
Tieni presente che la questione dei set di caratteri è una cosa che non centra direttamente con i vari linguaggi di programmazione in sé.
È un problema strettamente legato ai vari dispositivi di output e alle loro limitazioni per quanto riguarda la rappresentazione dei caratteri ed è una cosa generale. Hai gli stessi problemi nella console di Linux, ad esempio.

Il linguaggio Java, per fare un altro esempio, supporta in modo nativo i caratteri Unicode (caratteri a 16 bit) ma se provi questo programma:
Codice:
public class Prova {
    public static void main (String[] args) {
        System.out.println ("àèìòù áéíóú");
    }
}
e lo lanci dal prompt dei comandi, hai lo stesso identico problema: l'output è questo:
ÓÞý‗¨ ßÚݾ·

Se invece provi questo programma Java:
Codice:
import java.awt.*;
import javax.swing.*;

public class FrameTest extends JFrame {
    public FrameTest () {
        super ("Prova caratteri");

        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setSize (150, 60);

        JLabel label = new JLabel ("àèìòù áéíóú");
        getContentPane ().add (label);
    }

    public static void main (String[] args) {
        FrameTest f = new FrameTest ();
        f.setVisible (true);
    }
}
ottieni come output questa finestra:

e come vedi i caratteri sono ok.

Quote:
Originariamente inviato da alengy
Sto facendo un corso di sviluppo software e iniziamo dal c per proseguire poi sulla piattaforma dot net con c#...
Speriamo di nn fare casino..
Per adesso siamo arrivati ai cicli while e for..siamo proprio all'inizio..
Io lavoro e sono da sempre sistemista windows e tecnico di rete.
Sono certificato Cisco.
Questa è la mia prima esperienza di programmazione percui accetto aiuti e consigli a valanga..
Guarda, anche in base alle mie esperienze personali, posso dirti che se impari bene (ma dico proprio bene) il linguaggio "C", hai poi sicuramente una buona base.
Ma questa è una mia opinione personale. Altri potrebbero dirti che per iniziare a programmare bisogna partire da Java o da altro ancora.

Quote:
Originariamente inviato da alengy
Tu programmi per lavoro?
Sì.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 08:46   #13
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
Sapresti quando hai voglia spiegarmi che differenza c'è nel passaggio per riferimento e per valore ad una funzione in C?
Non l'ho capito completamente.
Grazie
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 09:12   #14
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
Sapresti quando hai voglia spiegarmi che differenza c'è nel passaggio per riferimento e per valore ad una funzione in C?
Non l'ho capito completamente.
Grazie
Prova questo programma:
Codice:
#include <stdio.h>

void prova_valore (int valore)
{
    printf ("%d\n", valore);
    valore = 20;
}

void prova_riferimento (int *riferimento)
{
    printf ("%d\n", *riferimento);
    *riferimento = 20;
}

int main (void)
{
    int val = 10;
    
    prova_valore (val);
    printf ("Adesso val = %d\n", val);

    prova_riferimento (&val);
    printf ("Adesso val = %d\n", val);

    return 0;
}
La funzione prova_valore riceve il parametro int per valore. Questo vuol dire che alla funzione viene passata una copia esatta del valore e qualunque modifica tu faccia su questa copia, non altera minimamente il valore della variabile originale nel main.

La funzione prova_riferimento riceve il parametro int per riferimento (indirizzo). Nota che nel parametro c'è l'asterisco * che indica un "puntatore".
In questo caso alla funzione viene passato l'indirizzo (la locazione di memoria) dove risiede la variabile val del main. Essendo un indirizzo quello ricevuto dalla funzione, è in grado di alterare il valore della variabile originale usando l'operatore di dereferenziazione che è l'asterisco *.

L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20


Come vedi l'ultima printf stampa 20 perché la funzione prova_riferimento è stata in grado, grazie all'indirizzo, di alterare il valore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 10:00   #15
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
ok sei stato molto chiaro, quindi è più pratico usare il metodo per valore..giusto?
Anche se ot mi potresti dare un consiglio sulla marca di notebook da acquistare per fare esercizi di programmazione e studio in ottica dot.net? Io vedo bene Toshiba e Dell. Tu che ne pensi?
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 10:38   #16
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
ok sei stato molto chiaro, quindi è più pratico usare il metodo per valore..giusto?
Beh ... come sempre ... dipende! Se devi passare un semplice valore (es. 1 int, double, char) e sai che la funzione non altera/non deve alterare il valore, è sufficiente il passaggio per valore.
Ci sono altri tipi di dato che non puoi passare per valore. Sono ad esempio gli array. Vengono sempre passati per riferimento (l'indirizzo del primo elemento dell'array).
Le strutture invece possono essere passate sia per valore che per riferimento. Se la struttura è piccola anche qui va bene il passaggio per valore mentre se la struttura è grande o deve essere alterato il contenuto allora si deve usare il passaggio per riferimento.

Quote:
Originariamente inviato da alengy
Anche se ot mi potresti dare un consiglio sulla marca di notebook da acquistare per fare esercizi di programmazione e studio in ottica dot.net? Io vedo bene Toshiba e Dell. Tu che ne pensi?
Ehh ... questo non lo so. Di notebook in commercio ce ne sono una barca!! E io non sono molto esperto di notebook.

Ma di una cosa sono sicuro. Se il tuo obiettivo è quello di usare dot.net specialmente a livello di sviluppo con strumenti come ad esempio Visual C# e simili, ti conviene prendere un notebook con un processore abbastanza "prestante" (non una ciofeca ma neanche una bestia, anche per motivi di consumi/costi) e sicuramente almeno 1GB di RAM.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 11:10   #17
alengy
Member
 
Iscritto dal: Nov 2004
Messaggi: 235
L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20


Non capisco i due 10 da dove li prende..
Scusami.. ma sono all'inizio..oggi facciamo i cicli for
alengy è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 11:27   #18
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da alengy
L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20


Non capisco i due 10 da dove li prende..
Dalle 2 printf all'interno delle funzioni prova_valore/prova_riferimento.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Le 18 offerte Amazon del weekend, senza ...
Galaxy S25 Ultra 512GB sotto i 1.000€ su...
Vi piace l'iPhone nero? Su Amazon sono s...
MacBook Air M4 16GB/256GB e 16GB/512GB s...
4 portatili per risparmiare tanto ed ess...
San Marino multa TikTok: non controllano...
Dreame e Roborock in saldo su Amazon: ro...
Pazzesco su Amazon: crollano i prezzi de...
La Corea del Sud vorrebbe costruire una ...
Rilasciati i primi risultati delle anali...
Robot umanoidi low cost? Unitree ci prov...
Non solo Rocket Lab, anche Avio potrebbe...
Chips Act UE: 41,5 milioni di euro a Eph...
Ryzen Threadripper 9000 al debutto il 31...
Nuovi coupon nascosti Amazon (aggiorname...
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: 11:51.


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