Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-05-2005, 18:04   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
[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, 18: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, 18:27   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
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, 18: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, 18:31   #5
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
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, 18: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, 18: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: 9571
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, 18:36   #8
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
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, 18: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: 9571
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, 18: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, 18: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, 18: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, 18: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: 9571
int putch(int c)

scrive un carattere su stdout

Ultima modifica di VegetaSSJ5 : 04-05-2005 alle 18:59.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 19: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, 19: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, 19: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, 19: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, 20: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: 9571
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, 20: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, 20: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: 9571
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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
DAZN lancia la sua offerta di Natale: My...
Gigabyte fa marcia indietro? Sparito il ...
Alcuni rivenditori giapponesi bloccano l...
Le feste non placano Amazon, anzi: aggio...
Roborock Q10 S5+ a un super prezzo: robo...
Formula sceglie WINDTRE BUSINESS per gar...
EXPO 1.20: AMD migliora il supporto all'...
MacBook Pro con chip M4, 24GB di RAM e 1...
Lefant M330 da 6.000Pa a 139€ o ECOVACS ...
Tornano gli sconti anche sulle scope ele...
Le scope elettriche Dreame H12, H14 e H1...
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: 16:42.


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