Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
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: 2688
[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: 2688
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: 2688
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: 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, 17:36   #8
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
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: 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, 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: 9571
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: 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, 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: 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


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Attenti a questo update fake di Windows ...
NIO chiede la standardizzazione di batte...
Da 80 mesi-uomo a poche ore: l'AI cambia...
In 2 settimane senza social il cervello ...
Amazon top 7 di oggi: 2 portatili intere...
SteamGPT trapela dal client Steam: ecco ...
Boom clamoroso per questo piccolo produt...
Amazon Luna saluta gli store di terze pa...
Windows Update non sarà più un incubo: M...
Stampante HP con Wi-Fi e 3 mesi di inchi...
Metro 2039 potrebbe essere il nuovo capi...
Call of Duty: Modern Warfare 4 l'uscita ...
Mega risparmi su Amazon Haul fino a mezz...
Il Blu-ray è davvero morto? Due a...
OpenAI punta sulla pubblicità in ...
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: 13:54.


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