GTA-Expert Forum: problema array C - GTA-Expert Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

problema array C

#1 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 10 marzo 2013 - 12:12

nel seguente convertitore decimale binario:
Spoiler

riscontro dei problemi nel stampare correttamente la cifra convertita. ad esempio il numero 2410=110002, ma il programma mi stampa 198001459211000. come compilatore utilizzo code::blocks. Soluzioni? Grazie!

PS: piu tardi aggiungo informazioni, ora non ho tempo.
0

#2 L'utente è offline   Wesser 

  • Sicario
  • Gruppo: Utenti
  • Messaggi: 1620
  • Iscritto il: 24/11/07
  • ID PSN:Wesser92
  • ID Social Club:Temutocle
  • Provenienza:Matera, Basilicata, Sud Italia, Europa Occidentale, Terra, Sistema Solare, Via Lattea, Universo?
  • GTA Preferito:GTA: San Andreas

Inviato il 10 marzo 2013 - 21:00

L'intervallo valido per l'indice di un array parte da 0 e termina alla dimensione dell'array stesso meno 1. Nel tuo caso, la variabile i assume un valore superiore a 31 (n - 1) per cui sfori tale intervallo, con conseguente compromissione del valore della variabile dichiarata successivamente all'array num, ovvero dec. Inoltre, devi considerare il fatto che dichiari la variabile di input come signed (ossia con segno) e ciò implica una mancata ricezione dell'ultimo bit del valore di essa, il quale decreta la sua negatività o meno. Il programma corretto è il seguente:

#include <stdio.h>
#include <stdlib.h>

#define BINARY_MAX_DIGITS	32

int main() {
	unsigned int dec;
	char i, bits[BINARY_MAX_DIGITS];

	puts("Questo programma converte un numero decimale in binario.");
	printf("%s", "Inserisci un numero intero da convertire: ");

	scanf("%d", &dec);

	for(i = 0; dec != 0; i++) {
		if(!(dec % 2)) {
			bits[i] = 0;
		} else {
			bits[i] = 1;
		}

		dec /= 2;
	}

	printf("%s", "Il numero inserito convertito in binario e': ");

	for(i--; i >= 0; i--) {
		printf("%d", bits[i]);
	}

	puts("\n");

	system("pause");

	return 0;
}

E' inutile dire che il codice è tutt'altro che efficiente, infatti si possono apportare anche piccole modifiche per velocizzarlo maggiormente. In alcuni casi, quando l'efficienza serve ben poco rispetto alla chiarezza del codice o al guadagno del tempo utile in quanto minimo, la si può anche tralasciare.

Paradossalmente, l'intero codice può essere ridotto a poche righe (ottimizzato):

#include <stdio.h>
#include <stdlib.h>

#define DECIMAL_DATA_TYPE	unsigned int
#define BINARY_MAX_DIGITS	(sizeof(DECIMAL_DATA_TYPE) << 3) // n * (2 ^ 3) => n * 8

char cbits[BINARY_MAX_DIGITS + 1];

int main() {
	DECIMAL_DATA_TYPE dec;
	char *clastptr;

	clastptr = &cbits[BINARY_MAX_DIGITS];

	puts("Questo programma converte un numero decimale in binario.");
	printf("%s", "Inserisci un numero intero da convertire: ");

	scanf("%d", &dec);

	while(dec) *--clastptr = (dec & 1) | '0', dec >>= 1;

	printf("Il numero inserito convertito in binario e': %s\n\n", clastptr);

	system("pause");

	return 0;
}

Nel caso specifico, gli operatori binari rendono il codice ancora più chiaro, poiché dec & 1 verifica se il primo bit è settato, dec >>= 1 shifta (sposta) tutti i bit verso destra (in pratica elimina il primo), mentre bit | '0' setta i bit del carattere 0 (avente come codice ASCII 0x30, il quale non ha il primo bit settato ed in tal caso viene semplicemente effettuata un'addizione).

Messaggio modificato da Wesser il 11 marzo 2013 - 17:14

Tutorial: || Guida SCM || Richieste/Aiuti script || BB Code || Guida IFP

"Meglio una vita da noob dichiarato, che una vita da saputello inventato."

Mio contributo altrove
(non posso fornire link a siti non affiliati, "Google-are"):

GTA3script (III/VC definitions)
GTA Animation XML IO
Full Nitro Control ~ Script Dependent Drawings (SDDWG) ~ Widescreen HOR+ Support (WSHPS) ~ Dithered Sky Gradient (SkyGrad)
0

#3 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 12 marzo 2013 - 15:36

grazie per la risposta! alla fine ho ricominciato da 0, ho sostituito il FOR con un WHILE e ho modificato le variabili:
Spoiler

0

#4 L'utente è offline   Wesser 

  • Sicario
  • Gruppo: Utenti
  • Messaggi: 1620
  • Iscritto il: 24/11/07
  • ID PSN:Wesser92
  • ID Social Club:Temutocle
  • Provenienza:Matera, Basilicata, Sud Italia, Europa Occidentale, Terra, Sistema Solare, Via Lattea, Universo?
  • GTA Preferito:GTA: San Andreas

Inviato il 14 marzo 2013 - 18:24

Ho parlato giusto per. :dsa: Devi dichiarare la variabile dec come unsigned, altrimenti i numeri negativi produrranno lo stesso risultato del loro valore assoluto. E ancora, non utilizzare una variabile per specificare la grandezza di un array, altrimenti vai contro gli standard e così facendo riduci la portabilità del codice.
Tutorial: || Guida SCM || Richieste/Aiuti script || BB Code || Guida IFP

"Meglio una vita da noob dichiarato, che una vita da saputello inventato."

Mio contributo altrove
(non posso fornire link a siti non affiliati, "Google-are"):

GTA3script (III/VC definitions)
GTA Animation XML IO
Full Nitro Control ~ Script Dependent Drawings (SDDWG) ~ Widescreen HOR+ Support (WSHPS) ~ Dithered Sky Gradient (SkyGrad)
0

#5 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 16 marzo 2013 - 21:08

Visualizza MessaggiWesser, il 14 marzo 2013 - 18:24 ha detto:

Ho parlato giusto per. :dsa: Devi dichiarare la variabile dec come unsigned, altrimenti i numeri negativi produrranno lo stesso risultato del loro valore assoluto. E ancora, non utilizzare una variabile per specificare la grandezza di un array, altrimenti vai contro gli standard e così facendo riduci la portabilità del codice.


Ok modificato! grazie! cercherò di farci piu attenzione piu avanti
0

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

1 utenti stanno leggendo questa discussione
0 utenti, 1 ospiti, 0 utenti anonimi