Repository 32bit  Forum
Repository 64bit  Wiki

[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.

Re: [C] Errori e dubbi vari

Messaggioda 414N » lun lug 21, 2008 17:30

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
414N
Iper Master
Iper Master
 
Messaggi: 2877
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: [C] Errori e dubbi vari

Messaggioda Blizzard » lun lug 21, 2008 17:43

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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] Errori e dubbi vari

Messaggioda anycolouryoulike » lun lug 21, 2008 19:24

Me lo spieghi questo?
Codice: Seleziona tutto
p[i/8] = p[i/8] | ( (bstr[i]-'0') << (7-(i%8)));
Avatar utente
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggioda Blizzard » lun lug 21, 2008 19:43

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
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] Errori e dubbi vari

Messaggioda Mario Vanoni » lun lug 21, 2008 20:20

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] Errori e dubbi vari

Messaggioda Blizzard » lun lug 21, 2008 20:26

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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] Errori e dubbi vari

Messaggioda anycolouryoulike » lun lug 21, 2008 20:57

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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggioda Blizzard » lun lug 21, 2008 22:08

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 lug 22, 2008 20:56, modificato 1 volta in totale.
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] Errori e dubbi vari

Messaggioda anycolouryoulike » mar lug 22, 2008 19:29

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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: [C] Errori e dubbi vari

Messaggioda Blizzard » mar lug 22, 2008 20:47

#-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]
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Precedente

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite