ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
Salve a tutti, nuovo utente qui per rompervi
Oggi ho voluto provare a realizzare un semplice programma in C;
ammetto di non averlo mai fatto prima, ed ho provato a scriverlo avendo letto documentazione sul c per appena un'ora, quindi mi pare logico che vi siano dei bug...
sostanzialmente dovrebbe effettuare una conversione di base da binario a decimale
http://pastebin.com/YZj2k3RF
ho due problemi, entrambi gravi:
for (counter = 0; counter == length; counter++) {
if ((binarystring[counter] != "0") && (binarystring[counter] != "1")) {
printf("You must enter only the 1 and 0 chars; exiting with errorcode 1\n");
return 1;
}
}
il seguente codice quando è dentro al for non funziona. a dire il vero il compilatore mi ritorna un errore:
warning: comparison between pointer and integer [enabled by default]
ma ho provato anche con il seguente codice, che dovrebbe farmi uscire sempre dal programma con errore
for (counter = 0; counter == length; counter++) {
if (0 == 0) {
printf("You must enter only the 1 and 0 chars; exiting with errorcode 1\n");
return 1;
}
}
ma il programma si ripete bellamente...
il secondo problema è che il risultato del calcolo è totalmente sbagliato...
|
|
ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
dunque, capito, nel for non devo mettere == ma <=;
rimane il problema di compe comparare due stringhe
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Allora ...
1) elimina il vettore bit e tutta il secondo ciclo for perché non servono
2) il primo for deve essere scritto così
Codice sorgente - presumibilmente VB.NET |
for (counter = 0; counter < length; counter++) { if ((binarystring[counter] != '0') && (binarystring[counter] != '1')) { printf("You must enter only the 1 and 0 chars; exiting with errorcode 1\n"); return 1; } }
|
3) l'ultimo for deve essere
Codice sorgente - presumibilmente C/C++ |
decimal=0;
for (counter = 0; counter < length; counter++) {
decimal *= 2;
decimal += (binarystring[counter] - '0');
}
|
4) la funzione pow e math.h non servono
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
grazie!
|
|
ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
allora, ho aggiunto alcune funzionalità al programma, inclusa la conversione da decimale a binario
http://pastebin.com/0RCvewip
./a.out
Program for converting binary numbers in decimal ones, and vice versa. Specify the max length at the command line. Defaults to 1024 bits
Insert 'bin' in order to convert from binary to decimal, 'dec' to convert from decimal to binary and 'exit' to exit: dec
Insert the number to convert, -1 to exit: 4536
The binary for the decimal 4536 is
esatto, vuoto. che ho sbagliato?
altra cosa, se passo come argomento da cli un intero troppo lungo il programma va in segfault
Ultima modifica effettuata da ikim il 25/05/2012 alle 13:17 |
|
ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
oppure stampa caratteri non stampabili
ma comunque stampa, invece di una stringa di 0 ed 1, caratteri sconosciuti
Ultima modifica effettuata da ikim il 25/05/2012 alle 13:17 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Hai sbagliato l'algoritmo di conversione.
In particolare, il numero di cifre del valore in decimale non deve essere usato nella for. Ad esempio, un valore a 3 cifre come
160
non equivale a 3 cifre binarie ma ad 8 ...
Non devi usare una for ma while e convertire finchè il valore iniziale non si azzera.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ikim (Normal User)
Newbie
Messaggi: 8
Iscritto: 25/05/2012
|
Fatto così
counter = 0;
while(decimal != 0) {
binarystring[counter] = (char)((decimal % 2) - '0');
decimal = decimal / 2;
counter++;
}
binarystring[counter] = '\0';
Ora il numero di caratteri è giusto ma sono ancora caratteri non visualizzabili
Inoltre ho notato che l'if che controlla se la stringa contiene solo
Numeri da risultati random, quando il numeto è lungo ritorna l'errore
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Deve essere
+ '0'
e il counter non deve partire da 0 e aumentare altrimenti avrai il numero scritto al contrario. Dovrà partire dalla cifra più a destra e diminuire.
Dato che converti un intero a 32 bit, potrai preparare una stringa di 32 spazi (+ il terminatore NULL) e riempire a partire da counter = 32 decrementandolo
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|