DOMANDA Qualcuno che mi aiuta capire un codice scritto in c?

Andretti60

Utente Èlite
6,440
5,091
Complimenti a tutti coloro che hanno spiegato il codice.
Ora permettetemi un commento.

Internet è un grande strumento per imparare, purtroppo si trova anche un sacco di spazzatura, più il tempo passa più la spazzatura aumenta. Come professionista del settore iniziai a usare internet (e I newsgroup prima di essa) al suo inizio, la maggior parte di chi pubblicava sapeva il fatto suo, ma ovviamente pure alcuni di loro sbagliavano, per cui occorreva leggere con cautela. Proprio ieri mi è capitato, per lavoro, di dovere fare una cosa di cui non sapevo nulla in un linguaggio di programmazione nuovo per me, una ricerca Google mi ha dato più domande (situazioni simili alla mia) che risposte, le risposte o erano molto diverse o riferivano agli altri articoli; alla fine ho dovuto risolvere da me.

Il codice in questione fa parte del gruppo “spazzatura”. Cerca di implementare il metodo descritto dalla pagina wiki (infatti l’articolo è una traduzione dalla pagina wiki inglese, pure gli esempi sono gli stessi), ma fa un sacco di errori, primo di tutti l’allocazione della tabella degli alfabeti che è perfettamente inutile in quanto (come viene descritto nell’articolo) il metodo si può implementare banalmente.
L’errore che salta subito agli occhi è un bel stack overflow fatto notare dal nostro esperto @DispatchCode, ossia aggiungendo caratteri oltre il limite della lunghezza di una stringa.
Altro errore che mostra la poca conoscenza di programmazione dell’autore sono le istruzioni exit() all’interno di un metodo, che sono una delle tecniche “no no no” di programmazione. E ci sarebbe da continuare (ma ho già scritto troppo e ora devo andare). Scrivete qualcosa del genere in un colloquio di lavoro e vi trovate subito fuori dalla porta. Anzi, tale codice può essere usato in un colloquio come esempio di “trovare i dieci errori” (è capitato a me molte volte)

In altre parole, questo è una delle situazioni in cui il codice trovato è un classico esempio delle cose “da non fare”.
 
  • Mi piace
Reazioni: ilfe98 e BAT

Xeno_01

Nuovo Utente
16
1
Che ambiente stai utilizzando per compilare? Che IDE?


Il decrypt è l'opposto dell'altro algoritmo. Ma qui dovresti capire il funzionamento di Vigenere, per capire il codice.
Comunque: prendiamo il caso di prima, il primo carattere cifrato è 'M'. La key è sempre 'T'. Viene fatta una ricerca usando il for da 0 a 26 per identificare la colonna che ha come valore ch-65 ovvero M - 65 che è uguale a 77 - 65.
Quando questo valore viene trovato in table, significa che nella colonna attuale (identificata da i), troverai il valore 12. Visto che la matrice è identica a prima, la colonna in questione è la 19 (i = 19): quindi viene inserito come carattere decifrato 19 + 65 = 84, che è la T.
Sto usando DevC++.
Nei metodi ecrypt e decrypt vengono passati le variabili ma con il puntatore..come mai?
Post unito automaticamente:

Complimenti a tutti coloro che hanno spiegato il codice.
Ora permettetemi un commento.

Internet è un grande strumento per imparare, purtroppo si trova anche un sacco di spazzatura, più il tempo passa più la spazzatura aumenta. Come professionista del settore iniziai a usare internet (e I newsgroup prima di essa) al suo inizio, la maggior parte di chi pubblicava sapeva il fatto suo, ma ovviamente pure alcuni di loro sbagliavano, per cui occorreva leggere con cautela. Proprio ieri mi è capitato, per lavoro, di dovere fare una cosa di cui non sapevo nulla in un linguaggio di programmazione nuovo per me, una ricerca Google mi ha dato più domande (situazioni simili alla mia) che risposte, le risposte o erano molto diverse o riferivano agli altri articoli; alla fine ho dovuto risolvere da me.

Il codice in questione fa parte del gruppo “spazzatura”. Cerca di implementare il metodo descritto dalla pagina wiki (infatti l’articolo è una traduzione dalla pagina wiki inglese, pure gli esempi sono gli stessi), ma fa un sacco di errori, primo di tutti l’allocazione della tabella degli alfabeti che è perfettamente inutile in quanto (come viene descritto nell’articolo) il metodo si può implementare banalmente.
L’errore che salta subito agli occhi è un bel stack overflow fatto notare dal nostro esperto @DispatchCode, ossia aggiungendo caratteri oltre il limite della lunghezza di una stringa.
Altro errore che mostra la poca conoscenza di programmazione dell’autore sono le istruzioni exit() all’interno di un metodo, che sono una delle tecniche “no no no” di programmazione. E ci sarebbe da continuare (ma ho già scritto troppo e ora devo andare). Scrivete qualcosa del genere in un colloquio di lavoro e vi trovate subito fuori dalla porta. Anzi, tale codice può essere usato in un colloquio come esempio di “trovare i dieci errori” (è capitato a me molte volte)

In altre parole, questo è una delle situazioni in cui il codice trovato è un classico esempio delle cose “da non fare”.
Si, me l'hanno fatto notare subito che è un codice di base sbagliato, ma l'obiettivo mio non è usarlo o robe simili, ma capire da esso per migliorarmi ed evitare errori futuri. Purtroppo non sono ancora in grado di creare un codice in modo autonomo in base al problema che mi si pone davanti.
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
… Purtroppo non sono ancora in grado di creare un codice in modo autonomo in base al problema che mi si pone davanti.
Nessun “purtroppo”, tutti noi siamo stati agli inizi e abbiamo dovuto imparare e questo è un settore dove non si smette mai di studiare.
Permettimi una domanda, sto cercando di aiutarti. Le tue difficoltà sono dovute al fatto che non conosci le basi della programmazione o non conosci i linguaggi di programmazione (il C in questo caso). Sono due cose molto diverse e molti agli inizi non lo comprendono.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Sto usando DevC++.

Non so che versione stai usando, verifica che sia l'ultima https://www.embarcadero.com/free-tools/dev-cpp
L'ultima supporta anche la versione 17. Devi guardare il manuale del software, non ho mai usato quell'ambiente. Oppure semplicemente guardi i vari menu e trovi le impostazioni.

Nei metodi ecrypt e decrypt vengono passati le variabili ma con il puntatore..come mai?

Perchè vengono passati due parametri che sono array di caratteri. Facendo in quel modo viene passato l'indirizzo al primo elemento dell'array e viene memorizzato nella variabile di tipo puntatore a char.

Con il passaggio dell'array alla funzione, le dichiarazioni char *s e char s[] sono equivalenti, in quanto il compilatore traduce comunque il passaggio dell'array in un puntatore.

Ad ogni modo non mi è chiaro se hai nemmeno provato i codici delle pagine precedenti, se hai provato a fare modifiche, e se soprattutto stai anche studiando C oppure no.
Sappi che guardando/leggendo codici in giro per la rete senza studiare e soprattutto fare tanta pratica, non riuscirai mai a produrre del codice, nè in C nè in altro. ?
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Complimenti a @DispatchCode per le delucidazioni, come sempre un punto di riferimento.
Non c'è nient' altro da aggiungere, grazie anche a @GraveKeeper.
Mi permetto di aggiungere una piccola nota riguardo l'IDE. Devc++ è un ide stabile, ma ha molti limiti ed un interfaccia retrò se possiamo così definirla. So che molti mi diranno io programmo su vim e compilo con gcc, ma nel 2022 credo che avere la padronanza di un ide sia fondamentale. Mi sento di consigliarti in tal proposito vscode. È un ide molto leggero, all' inizio è un po' ostico specie se alle prime armi, ma dopo poco diventa un utile strumento per evitare di incorrere in errori banali. Ci sono molte guide online, che con calma puoi leggere, ti aiuteranno a settare per bene l'ide.
Spero che il consiglio ti sia utile.
@Xeno_01 io metterei un like a tutti i messaggi di Dispatch e Grave, in questa discussione,poichè credo siano stati davvero disponibili, poi sei libero?
 

Xeno_01

Nuovo Utente
16
1
Nessun “purtroppo”, tutti noi siamo stati agli inizi e abbiamo dovuto imparare e questo è un settore dove non si smette mai di studiare.
Permettimi una domanda, sto cercando di aiutarti. Le tue difficoltà sono dovute al fatto che non conosci le basi della programmazione o non conosci i linguaggi di programmazione (il C in questo caso). Sono due cose molto diverse e molti agli inizi non lo comprendono.
Le basi le conosco..è che appena vedo qualcosa che non so fare vado in crisi
Post unito automaticamente:

Non so che versione stai usando, verifica che sia l'ultima https://www.embarcadero.com/free-tools/dev-cpp
L'ultima supporta anche la versione 17. Devi guardare il manuale del software, non ho mai usato quell'ambiente. Oppure semplicemente guardi i vari menu e trovi le impostazioni.



Perchè vengono passati due parametri che sono array di caratteri. Facendo in quel modo viene passato l'indirizzo al primo elemento dell'array e viene memorizzato nella variabile di tipo puntatore a char.

Con il passaggio dell'array alla funzione, le dichiarazioni char *s e char s[] sono equivalenti, in quanto il compilatore traduce comunque il passaggio dell'array in un puntatore.

Ad ogni modo non mi è chiaro se hai nemmeno provato i codici delle pagine precedenti, se hai provato a fare modifiche, e se soprattutto stai anche studiando C oppure no.
Sappi che guardando/leggendo codici in giro per la rete senza studiare e soprattutto fare tanta pratica, non riuscirai mai a produrre del codice, nè in C nè in altro. ?
Grazie infinite per tutto?.
Sei stato molto disponibile.
Il fatto è che guardo in giro sperando proprio di capire come funziona il c..
Post unito automaticamente:

Complimenti a @DispatchCode per le delucidazioni, come sempre un punto di riferimento.
Non c'è nient' altro da aggiungere, grazie anche a @GraveKeeper.
Mi permetto di aggiungere una piccola nota riguardo l'IDE. Devc++ è un ide stabile, ma ha molti limiti ed un interfaccia retrò se possiamo così definirla. So che molti mi diranno io programmo su vim e compilo con gcc, ma nel 2022 credo che avere la padronanza di un ide sia fondamentale. Mi sento di consigliarti in tal proposito vscode. È un ide molto leggero, all' inizio è un po' ostico specie se alle prime armi, ma dopo poco diventa un utile strumento per evitare di incorrere in errori banali. Ci sono molte guide online, che con calma puoi leggere, ti aiuteranno a settare per bene l'ide.
Spero che il consiglio ti sia utile.
@Xeno_01 io metterei un like a tutti i messaggi di Dispatch e Grave, in questa discussione,poichè credo siano stati davvero disponibili, poi sei libero?
ho usato devc++ perché è l'unico ide che usavo alle superiori e quindi già sapevo come funziona.
Si infatti non smetterei mai di ringraziarli?
 

Andretti60

Utente Èlite
6,440
5,091
Avere le basi di programmazione è basilare, ma poi occorre saperle applicare e quello si impara solo facendo esercizi o guardando codice scritto bene. Cercare a caso in internet non aiuta, finisci con il trovare esempi come quello da te citato in questa conversazione, che è inutile (se non come esempio di codice scritto male).
Forse ti conviene comprare un testo di esercizi di programmazione, un vero testo cartaceo che ti costringe a scrivere il codice da te stesso, svitando il taglia e cuci che io dico sempre di non fare, mai, mai fare girare del codice se non si sa cosa faccia ogni singola istruzione.

Comunque non ti scoraggiare, in questo settore non si potrà mai sapere tutto, è infinito e ci saranno sempre cose che non si sono fatte prima, per cui occorre studiare, imparare e fare esercizi, te lo dice uno che fa questo lavoro per professione da più di trenta anni.
 
  • Mi piace
Reazioni: Xeno_01

Xeno_01

Nuovo Utente
16
1
@DispatchCode,@GraveKeeper ho provato a compilare lo stesso codice su linux (con gcc e codeblocks) solo che mi da risultati diversi rispetto a windows..per esempio su "TestoCifrato.txt" mi ritrovo con una lettera in più cifrata (se la parola da cifrare contiene 4 lettere, quella cifrata ne contiene 5). Qualcuno di voi conosce il motivo?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Hai compilato questo?

Verifica di non aver lasciato spazi o un invio al termine del testo in chiaro (nel file PlainText). Io ottengo gli stessi risultati sia su Windows che su Linux.
 

Xeno_01

Nuovo Utente
16
1
Hai compilato questo?

Verifica di non aver lasciato spazi o un invio al termine del testo in chiaro (nel file PlainText). Io ottengo gli stessi risultati sia su Windows che su Linux.
Ho provato anche con il codice tuo ma niente, controllando anche gli spazi ed invio.
Però con il tuo almeno la parte di decriptazione va bene, cioè non ci sono caratteri aggiuntivi, mentre nel txt del testo cifrato ho il carattere in più
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ho provato anche con il codice tuo ma niente, controllando anche gli spazi ed invio.
Però con il tuo almeno la parte di decriptazione va bene, cioè non ci sono caratteri aggiuntivi, mentre nel txt del testo cifrato ho il carattere in più

Fai uno zip del file di testo di input, e allegalo qui. ?

Il codice originale e quelli precedenti a quello che ti ho linkato hanno quel problema perché ciclano un numero di volte superiore (quello originale è anche molto peggio).
 

Xeno_01

Nuovo Utente
16
1
Fai uno zip del file di testo di input, e allegalo qui. ?

Il codice originale e quelli precedenti a quello che ti ho linkato hanno quel problema perché ciclano un numero di volte superiore (quello originale è anche molto peggio).
Come si allega qui??
Però perché Linux e windows mi danno risultati diversi?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
C'è il pulsante nel lato opposto a quello di invio post.
Altrimenti uppa pure lo zip dove preferisci (mega etc), e poi linka qui.

Non ha molto senso in questo caso. I problemi analoghi di solito sono dovuti a un "invio", che viene codificato in modi diversi tra i due OS. Nel caso di questo algoritmo anche uno spazio nel testo, in quanto non è mappato nella codifica di Vigenere.
 

Andretti60

Utente Èlite
6,440
5,091
Una differenza fondamentale tra Windows a Unix per i documenti di testo e' la fine di linea, Windows mette due caratteri (sia \r che \n, ossia return e newline) mentre Unix ne mette uno solo (\n). Io ci divento sempre matto.
Guarda se quello e' il tuo motivo.
Una cosa che dovresti fare e' modificare il codice originale, prima di processare un carattere letto dal file accertati che sia uno accettabile (ossia lettere maiuscole e minuscole) e scarta tutto il resto.
 

Xeno_01

Nuovo Utente
16
1
C'è il pulsante nel lato opposto a quello di invio post.
Altrimenti uppa pure lo zip dove preferisci (mega etc), e poi linka qui.

Non ha molto senso in questo caso. I problemi analoghi di solito sono dovuti a un "invio", che viene codificato in modi diversi tra i due OS. Nel caso di questo algoritmo anche uno spazio nel testo, in quanto non è mappato nella codifica di Vigenere.
lascia perde sono ciecato?
Post unito automaticamente:

Una differenza fondamentale tra Windows a Unix per i documenti di testo e' la fine di linea, Windows mette due caratteri (sia \r che \n, ossia return e newline) mentre Unix ne mette uno solo (\n). Io ci divento sempre matto.
Come dovrei fare quindi? Cioè dovrei agire a livello di codice?
 

Allegati

  • Input.zip
    77 bytes · Visualizzazioni: 25

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!