Repository 32bit  Forum
Repository 64bit  Wiki

[C] Errori e dubbi vari

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 18: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: 2847
Iscritto il: mer feb 13, 2008 17: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 18: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 23: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: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: ven ago 10, 2007 0: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 20: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 23: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 21: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 21: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 21: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 23: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 21: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: ven ago 10, 2007 0: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 23: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 21:56, modificato 1 volta in totale.
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 23: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 20: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: ven ago 10, 2007 0: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 21: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 23: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 2 ospiti