[C] Errori e dubbi vari

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2924
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da 414N »

Blizzard ha scritto:scusate... non ho letto i codici :D
ma qui si parla di programmi che prendono in input una stringa di char 01 e ne restituiscono il corrispettivo ascii???
Se non ho male interpretato pure io, direi di sì.
Prima si era anche discussa la riga

Codice: Seleziona tutto

if(c=getchar()&&(c='0'||c='1'))
dalla quale deduco che i caratteri vengano letti da stdin uno alla volta.

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da Blizzard »

se ho capito bene ed è come detto sopra beccatevi sto codice scritto con i piedi

BIN2ASCII secondo me :D

Codice: Seleziona tutto

/* bin2ascii by Giovanni "Blizzard" Santostefano*/

#include <stdio.h>
#include <stdlib.h>
 
 /*convert binary string to ascii string*/
char* ConvertBinToAscii(char *bstr)
{
	int count=0;
	char *astr=NULL;
	char *p=NULL;
	int i=0;
	
	count=(int)(strlen(bstr)/8);
	astr=malloc(count+1);
	memset(astr,0,count+1);
	
	p=astr;
	for(i=0; i<strlen(bstr); ++i) p[i/8] = p[i/8] | ( (bstr[i]-'0') << (7-(i%8)));
	
	return astr;
}

int main()
{
	char *t=ConvertBinToAscii("011000010110001001100011");
	printf("ascii: %s\n",t);
	free(t);
	
	return 0;
}
lo facciamo diventare un contest?? :lol:

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggio da anycolouryoulike »

Me lo spieghi questo?

Codice: Seleziona tutto

p[i/8] = p[i/8] | ( (bstr[i]-'0') << (7-(i%8)));

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da Blizzard »

i cicla le cifre binarie.
dato che la stringa è fatta di char (8 bit)
p[i/8] ti dice il byte che stai calcolando in quel momento
(i%8) ti dice il bit che stai calcolando relativamente a quel byte
quindi piazzo quel bit con un or logico nella giusta posizione shiftandolo di (7-(i%8)) a sinistra.
Ovviamente dato che tu passi un carattere '0' o '1' basta che a questi caratteri sottrai il carattere '0' e avrai
'0'-'0'=0
'1'-'0'=1

molto uovo di colombo... scritta strana ma semplicissima :lol:

ciao
Gio

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C] Errori e dubbi vari

Messaggio da Mario Vanoni »

Scusate, reinventare la ruota?

Nella thread Convertire ASCII
avevo citato un link con un programma in C

bin2dec di Mike Golvach
bin2dec.c
a me funziona ed e` semplice.

gcc -o bin2dec bin2dec.c

PS Nel frattempo Mike ha pubblicato le versioni perl e bash.

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da Blizzard »

ma no Mario!
penso che l'autore [edit]autore del post (anycoloryoulike)[/edit] lo abbia fatto per esercitarsi e a seguire era così per giocare un po col codice :P

bambini dentro :lol:

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggio da anycolouryoulike »

Blizzard ha scritto:ma no Mario!
penso che l'autore [edit]autore del post (anycoloryoulike)[/edit] lo abbia fatto per esercitarsi e a seguire era così per giocare un po col codice :P

bambini dentro :lol:
Si infatti.
E poi quell'articolo sono riuscito a trovarlo solo ora, non è nella pagina che hai linkato...
E comunque la versione di Blizzard è migliore, perché non effettua la conversione da binario a decimale.

Ma perché hai usato quel cast con l'strlen e anche un puntatore apparentemente inutile (astr è uguale a p)?
Come mai li hai subito inizializzati i puntatori e le variabili?

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da Blizzard »

ciao
Ma perché hai usato quel cast con l'strlen
si in quel caso il cast è inutile sorry :(
e anche un puntatore apparentemente inutile (astr è uguale a p)?
p si muove, invece astr punta sempre al primo char così posso restituirlo correttamente.
Comunque quello che dici è vero e p è effettivametne inutile.
Cambia così

[dato che non mi ERO capito bene :lol: ho cambiato la return che era sbagliata]

Codice: Seleziona tutto

char* ConvertBinToAscii(char *bstr)
{
   int count=0;
   char *astr=NULL;
   int i=0;
   
   count=(int)(strlen(bstr)/8);
   astr=malloc(count+1);
   memset(astr,0,count+1);
   
   for(i=0; i<strlen(bstr); ++i) astr[i/8] |= ( (bstr[i]-'0') << (7-(i%8)));
   
   return astr;
}
non l'ho provato ma forse funge.
Come mai li hai subito inizializzati i puntatori e le variabili?
per non rischiare di perdere i capelli in ore e ore di debugging \:D/
A parte gli scherzi è sempre meglio inizializzare tutto dopo la dichiarazione.
Ti ho scritto un piccolo esempio per farti venire la voglia di inizializzazione

Codice: Seleziona tutto

#include <stdio.h>

void cattivo()
{
	int a;
	
	if(a==5)
	{
		printf("smuahuahauahua\n");
	}
	else
	{
		printf("hello!\n");
		a=5;
	}
}

int main()
{
	printf("chiamo cattivo la prima volta\n");
	cattivo();
	printf("chiamo cattivo la seconda volta\n");
	cattivo();
	
	return 0;
}
vai col liscio :P

ciao
Gio
Ultima modifica di Blizzard il mar 22 lug 2008, 21:56, modificato 1 volta in totale.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggio da anycolouryoulike »

Grazie a tutti!
I miei dubbi si sono temporaneamente esauriti.

PS: comunque astr e p non vanno da nessuna parte, è i che si muove :)

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Errori e dubbi vari

Messaggio da Blizzard »

#-o la prima volta facevo scorrere p #-o poi l'ho ottimizzato maledetto me che mi distraggo! e mi è rimasta la convinzione che p si muoveva nonostante poi avevo fatto il giochetto p[i/8]

sorry ma ste cose le faccio in media :evil: :evil: :evil: :evil: :evil: :evil: :evil:

[edit]ho modificato la return del codice sopra[/edit]

Rispondi