Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
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.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-05-2005, 17:04   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
[C] problema con i file

Stavo provando a fare un programma preso dal manuale...però apparte non funzionare (compila ma non funziona bene) non capisco il perchè di alcune cose che mi sembrano strane...

Il programma dovrebbe chiedere in input il nome di un file,crearlo e scriverci dentro quello che viene immesso da tastiera finchè non si preme il tasto ? a questo punto chiude il file e termina l'esecuzione...

Il codice è questo:

/* KTOD Un programma di copia dalla tastiera a disco */

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

int main(int argc, char *argv[]){

FILE *fp; // Puntatore a file
char ch; // Carattere

if(argc != 2){
printf("Hai dimenticato di scrivere il nome del file.\n");
exit(1);
}

if((fp=fopen(argv[1], "w")) == NULL){
printf("Impossibile aprire il file.\n");
exit(1);
}

do{
ch = getchar(); // Prendi un carattere da tastiera e mettilo in ch
putch(ch, fp);
}while(ch != '$');

fclose(fp);
return 0;
}

Non capisco perchè in questa riga:

int main(int argc, char *argv[]){

vengono passati degli argomenti al main...che sono?che significano? e prechè non funziona ? copiato pari pari dal manuale....

Grazie
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:25   #2
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da D4rkAng3l
Stavo provando a fare un programma preso dal manuale...però apparte non funzionare (compila ma non funziona bene) non capisco il perchè di alcune cose che mi sembrano strane...

Il programma dovrebbe chiedere in input il nome di un file,crearlo e scriverci dentro quello che viene immesso da tastiera finchè non si preme il tasto ? a questo punto chiude il file e termina l'esecuzione...

Il codice è questo:

/* KTOD Un programma di copia dalla tastiera a disco */

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

int main(int argc, char *argv[]){

FILE *fp; // Puntatore a file
char ch; // Carattere

if(argc != 2){
printf("Hai dimenticato di scrivere il nome del file.\n");
exit(1);
}

if((fp=fopen(argv[1], "w")) == NULL){
printf("Impossibile aprire il file.\n");
exit(1);
}

do{
ch = getchar(); // Prendi un carattere da tastiera e mettilo in ch
putch(ch, fp);
}while(ch != '$');

fclose(fp);
return 0;
}

Non capisco perchè in questa riga:

int main(int argc, char *argv[]){

vengono passati degli argomenti al main...che sono?che significano? e prechè non funziona ? copiato pari pari dal manuale....

Grazie
Sbagli concettualmente.
Il programma non chiede in input il nome di un file ma VUOLE in input il nome del file. Non ho compilato e eseguito, ma noto che questa potrebbe essere la prima causa del tuo problema.

Nella riga del main(), argc identifica il numero di argomenti passati al programma mentre argv e' un array di stringhe, che contiene appunto i parametri passati al programma.
Inoltre la funzione putch() non so da dove provenga, ma non e' affatto standard. Sostituiscila con putc(). In ultimo, il programma termina la sua esecuzione una volta digitato il carattere '$' e non '?'.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:27   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
ok..ma allora come glielo dò in input il nome del file..dove glielo devo mettere?
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:29   #4
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da D4rkAng3l
ok..ma allora come glielo dò in input il nome del file..dove glielo devo mettere?
glielo passi come argomento quando lo lanci ./programma nome_del_file.txt
nei sorgenti poi lo leggi accedendo ad argv[1]

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:31   #5
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
Quote:
Originariamente inviato da VICIUS
glielo passi come argomento quando lo lanci ./programma nome_del_file.txt
nei sorgenti poi lo leggi accedendo ad argv[1]

ciao
ahhhh ora ho capito, quindi gli argomenti del main vengono passato lanciando al lancio del programma...questo non c'era scritto...fico...buono a sapersi
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:32   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da mjordan
Sbagli concettualmente.

Inoltre la funzione putch() non so da dove provenga, ma non e' affatto standard. Sostituiscila con putc(). In ultimo, il programma termina la sua esecuzione una volta digitato il carattere '$' e non '?'.
Difatti, è definita in <conio.h> e tra l'altro, prende un solo argomento e non due.

Con "difatti" intendo che non è standard
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:32   #7
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
la funzione main ha dei parametri impliciti. questi parametri sono i parametri che tu passi da riga di comando al programma. ad esempio quando compili un programma (con il compilatore gcc) scrivi una cosa del tipo:

gcc nomeprogramma.c

oppure

gcc nomeprogramma.c -o programma

come fa il compilatore gcc a sapere quali dati gli hai passato come parametro? i parametri passati da linea di comando al programma sono i parametri del main. il main ha 2 parametri (veramente non sono sempre 2, cmq assumiamone 2) di cui:
- il primo è un intero (che puoi chiamare come ti pare, basta che la dichiari come intero) che indica il numero di parametri che hai passato. questo numero è sempre maggiore o uguale a 1 perchèconta anche il nome del programma (es: gcc nome.c -o ciao, qui la variabile conterrà il valore 4)
- il secondo è un array di stringhe (cioè un array di array di char) dove ogni stringa è un parametro che hai passato al programma
es: gcc nome.c -o ciao

argc --> 4

argv[0] --> gcc
argv[1] --> nome.c
argv[2] --> -o
argv[3] --> ciao


P.S.
quando ho premuto Rispondi ancora non erano state date risposte...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:36   #8
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
Quote:
Originariamente inviato da VegetaSSJ5
la funzione main ha dei parametri impliciti. questi parametri sono i parametri che tu passi da riga di comando al programma. ad esempio quando compili un programma (con il compilatore gcc) scrivi una cosa del tipo:

gcc nomeprogramma.c

oppure

gcc nomeprogramma.c -o programma

come fa il compilatore gcc a sapere quali dati gli hai passato come parametro? i parametri passati da linea di comando al programma sono i parametri del main. il main ha 2 parametri (veramente non sono sempre 2, cmq assumiamone 2) di cui:
- il primo è un intero (che puoi chiamare come ti pare, basta che la dichiari come intero) che indica il numero di parametri che hai passato. questo numero è sempre maggiore o uguale a 1 perchèconta anche il nome del programma (es: gcc nome.c -o ciao, qui la variabile conterrà il valore 4)
- il secondo è un array di stringhe (cioè un array di array di char) dove ogni stringa è un parametro che hai passato al programma
es: gcc nome.c -o ciao

argc --> 4

argv[0] --> gcc
argv[1] --> nome.c
argv[2] --> -o
argv[3] --> ciao


P.S.
quando ho premuto Rispondi ancora non erano state date risposte...
ah sei stato chiarissimo, grazie mille...quindi quà scrivo:
char *argv[]

perchè tanto argv è un puntatore al primo elemento dell'array, mettendoci un * è puntatore a puntatore perchè punta ad un array di array...giusto?
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:39   #9
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
Quote:
Originariamente inviato da D4rkAng3l
ah sei stato chiarissimo, grazie mille...quindi quà scrivo:
char *argv[]

perchè tanto argv è un puntatore al primo elemento dell'array, mettendoci un * è puntatore a puntatore perchè punta ad un array di array...giusto?
le stringhe in c si realizzano con gli array (o con i puntatori) di char. quindi se tu scrivi char argv[] oppure char *argv stai implicitamente dichiarando una stringa. se scrivi char argv[][] oppure char *argv[] oppure char **argv stai dichiarando un array di stringhe.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:46   #10
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Che poi scusa, quale manuale?
Esiste sul pianeta un manuale che presenti come esempio uno schifo di codice del genere? Addirittura include nel file da scrivere il carattere terminatore, che invece non dovrebbe essere scritto.

Questa versione, invece, conclude senza includere il carattere terminatore:

Codice:
#include <stdio.h>
#include <stdlib.h>

int 
main(int argc, char ** argv)
{
        FILE *fp;
        char ch;

        if (argc != 2) {
                printf("Hai dimenticato di scrivere il nome del file.\n");
                exit(1);
        }

        if ((fp=fopen(argv[1], "w")) == NULL) {
                printf("Impossibile aprire il file.\n");
                exit(1);
        }

        while (ch != '$') {
                putc(ch, fp);
                ch = getchar();
        };

        fclose(fp);
 
        return 0;
}
Sarei proprio curioso di sapere il titolo di tale scempio.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:53   #11
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da RaouL_BennetH
Difatti, è definita in <conio.h> e tra l'altro, prende un solo argomento e non due.

Con "difatti" intendo che non è standard
Non la conosco, saresti cosi' gentile da darmi il prototipo e il funzionamento?
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:56   #12
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da mjordan
Che poi scusa, quale manuale?
Codice:
int 
main(int argc, char ** argv)
{
        FILE *fp;
        char ch;
[...]
        while (ch != '$') {
                putc(ch, fp);
                ch = getchar();
        };
[...]
}
Ma in questo modo ch non è inizializato. C'è la possibilità che sia == a '$' e quindi il ciclo non partirebbe neanche. E' meglio porre ch = 0; quando viene dichiarata. oppure fare
Codice:
while ((ch = getchar ()) != '$')
    putc (ch, fp);
ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 17:57   #13
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
int putch(int c)

scrive un carattere su stdout

Ultima modifica di VegetaSSJ5 : 04-05-2005 alle 17:59.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 18:14   #14
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da VICIUS
Ma in questo modo ch non è inizializato. C'è la possibilità che sia == a '$' e quindi il ciclo non partirebbe neanche. E' meglio porre ch = 0; quando viene dichiarata. oppure fare
Codice:
while ((ch = getchar ()) != '$')
    putc (ch, fp);
ciao
Sono 5 anni che lo standard C impone che le variabili siano automaticamente poste a 0 e i puntatori a NULL dal compilatore in fase di dichiarazione. Se ispezioni con un debugger, vedi che fp punta automaticamente a NULL e ch a 0.
Anche il C ogni tanto si aggiorna, eh!
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 18:18   #15
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da VegetaSSJ5
int putch(int c)

scrive un carattere su stdout
Ecco, non ne avevo dubbi la classica estensione Microsoft della min[k]ia.
Praticamente la copia della funzione standard putchar() che gia' e' ridondante perche' ha il comportamento di putc(ch, stdout).

Come aumentare il footprint delle librerie in modo inutile e controverso.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 18:21   #16
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da mjordan
Sono 5 anni che lo standard C impone che le variabili siano automaticamente poste a 0 e i puntatori a NULL dal compilatore in fase di dichiarazione. Se ispezioni con un debugger, vedi che fp punta automaticamente a NULL e ch a 0.
Anche il C ogni tanto si aggiorna, eh!
Sei sicuro ? in gcc anche impostando -std=c99 non vengono inizializzate a 0.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 18:42   #17
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da VICIUS
Sei sicuro ? in gcc anche impostando -std=c99 non vengono inizializzate a 0.

ciao
Sul mio sistema, compilando con:
gcc -Wall -g -o prova prova.c

e avviando il debugger con:
gdb --readnow prova

Quote:
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) set args file_di_esempio
(gdb) break main
Breakpoint 1 at 0x80484b0: file prova.c, line 9.
(gdb) run
Starting program: /home/mjordan/prova file_di_esempio

Breakpoint 1, main (argc=2, argv=0xbffff664) at prova.c:9
11 if (argc != 2) {
(gdb) p ch
$1 = 0 '\0'
(gdb) p fp
$2 = (FILE *) 0x0
(gdb) quit
The program is running. Exit anyway? (y or n) y
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 19:05   #18
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
Quote:
Originariamente inviato da mjordan
Ecco, non ne avevo dubbi la classica estensione Microsoft della min[k]ia.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 19:11   #19
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da mjordan
Sul mio sistema, compilando con:
gcc -Wall -g -o prova prova.c

e avviando il debugger con:
gdb --readnow prova[...]
strano da me ch è -73 e fp è 0x8qualcosa.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 19:16   #20
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
mi autonomino giudice della situazione...

vicius e mjordan che compilatori usate?? (compilatore, versione, sistema operativo)
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
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...
La Cina ha sviluppato una macchina in gr...
Lanciati cinque nuovi satelliti cinesi G...
Meta avrebbe scaricato illegalmente migl...
QNAP annuncia la funzionalità di ...
Fino a 96 core per chip: la nuova CPU se...
Robot che crescono mangiando i loro simi...
Star Wars Outlaws 2 cancellato: per Ubis...
F1 senza freni: il film supera i 500 mil...
Una supersportiva elettrica da 429 CV a ...
Denodo DeepQuery: ricerche complesse in ...
Pluribus è la nuova ambiziosa ser...
IA come persone: avranno una personalit&...
Scoppia la bufera NSFW: la mano di Colle...
Philips porta OneBlade su Fortnite: arri...
Il consumo dei data center AI esplode: r...
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: 22:39.


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