Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Forte della piattaforma Qualcomm Snapdragon X, il notebook Lenovo IdeaPad Slim 3 riesce a coniugare caratteristiche tecniche interessanti ad uno chassis robusto, con autonomia di funzionamento a batteria che va ben oltre la tipica giornata di lavoro. Un notebook dal costo accessibile pensato per l'utilizzo domestico o in ufficio, soprattutto con applicazioni native per architettura ARM
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli
OnePlus risponde alle esigenze di chi cerca un dispositivo indossabile dalle dimensioni contenute con OnePlus Watch 3 43mm. La versione ridotta del flagship mantiene gran parte delle caratteristiche del modello maggiore, offrendo un'esperienza completa in un formato compatto. Il suo limite più grande è abbastanza ovvio: l'autonomia non è il punto di forza di questo modello, ma si raggiungono comodamente le due giornate piene con un uso normale.
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura
BOOX Note Air4 C rappresenta l'ultima incarnazione della categoria dei tablet E Ink a colori di Onyx, e combina le prestazioni di un dispositivo Android con l'ottima tecnologia Kaleido 3 per il display. Con schermo da 10,3 pollici, un processore Qualcomm Snapdragon 750G e 6 GB di RAM, promette un'esperienza completa per lettura, scrittura e produttività. Il prezzo lo posiziona nel segmento premium, ma questo dispositivo è un vero spettacolo!
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 IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli Recensione OnePlus Watch 3 43mm: lo smartwatch c...
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura BOOX Note Air4 C è uno spettacolo: il tab...
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia Recensione Sony Xperia 1 VII: lo smartphone per ...
Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
A 369€ è il migliore di tutti: mi...
Xbox Cloud Gaming costa troppo? Microsof...
Fai da te: 2 trapani avvitatori a doppia...
Apple definisce la sua strategia anti-da...
Il Samsung Galaxy Tab S10 Lite non ha pi...
Cosa sappiamo sul decimo tentativo di la...
EHA Reader Awards 2025: i migliori prodo...
Il telescopio spaziale James Webb ha sco...
Gli astronauti cinesi in futuro utilizze...
Tesla cede alla pressione dei clienti: d...
I Vigili del Fuoco dell'Arizona ora usan...
Il fondatore di Waymo sfotte Tesla: &quo...
Robot che corrono, ballano e cadono: la ...
Perché acquistare costosi bus ele...
Google Pixel 10 Pro XL: il Tensor G5 se ...
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: 07:33.


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