I am using the following approach to print the binary of an ascii character:
unsigned char bitmask = 0b10000000;
char _my_char = 'a';
for (int i=0; i<8; i++) {
if (i==4) putchar(' '); // separate every four characters
printf("%d", (_my_char & bitmask) != 0);
bitmask = bitmask >> 1;
}
putchar('\n');
return 0;
How could I generalize this so that, for example, I could print the binary of any data type/structure? One byte per row?
There are numerous ways to do this. The following outputs a nice chart of printable characters giving the value for each character in ASCII, decimal, hex and binary, e.g.
#include <stdio.h>
#include <limits.h>
/* CHAR_BIT */
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
int main (void) {
char c = 0; /* character */
int i = 0; /* int loop counter */
printf ("\nchar | int | hex | binary\n");
printf ("-----+-------+--------+---------\n");
for (c = 32; c <= 126; c++) { /* for each char in printable range */
/* output the character, decimal, hex and binary */
printf (" %c | %3d | 0x%02x | ", c, c, c);
for (i = sizeof (c) * CHAR_BIT - 1; i >= 0; i--) /* for each bit */
printf ("%d", ((c >> i) & 0x1) ? 1 : 0); /* output 0/1 */
putchar ('\n'); /* output \n */
}
putchar ('\n');
}
Example Use/Output
$ ./bin/bin_ascii
char | int | hex | binary
-----+-------+--------+---------
| 32 | 0x20 | 00100000
! | 33 | 0x21 | 00100001
" | 34 | 0x22 | 00100010
# | 35 | 0x23 | 00100011
$ | 36 | 0x24 | 00100100
% | 37 | 0x25 | 00100101
& | 38 | 0x26 | 00100110
' | 39 | 0x27 | 00100111
( | 40 | 0x28 | 00101000
) | 41 | 0x29 | 00101001
* | 42 | 0x2a | 00101010
+ | 43 | 0x2b | 00101011
, | 44 | 0x2c | 00101100
- | 45 | 0x2d | 00101101
. | 46 | 0x2e | 00101110
/ | 47 | 0x2f | 00101111
0 | 48 | 0x30 | 00110000
1 | 49 | 0x31 | 00110001
2 | 50 | 0x32 | 00110010
3 | 51 | 0x33 | 00110011
4 | 52 | 0x34 | 00110100
5 | 53 | 0x35 | 00110101
6 | 54 | 0x36 | 00110110
7 | 55 | 0x37 | 00110111
8 | 56 | 0x38 | 00111000
9 | 57 | 0x39 | 00111001
<snip>
p | 112 | 0x70 | 01110000
q | 113 | 0x71 | 01110001
r | 114 | 0x72 | 01110010
s | 115 | 0x73 | 01110011
t | 116 | 0x74 | 01110100
u | 117 | 0x75 | 01110101
v | 118 | 0x76 | 01110110
w | 119 | 0x77 | 01110111
x | 120 | 0x78 | 01111000
y | 121 | 0x79 | 01111001
z | 122 | 0x7a | 01111010
{ | 123 | 0x7b | 01111011
| | 124 | 0x7c | 01111100
} | 125 | 0x7d | 01111101
~ | 126 | 0x7e | 01111110
Let me know if you have any questions about the logic.
You could create a function which takes a void pointer and the size of the structure as input.
void printdata(void *data, size_t len)
{
char my_char;
for (size_t m = 0; m < len; m++)
{
my_char = *(((char*) data) + m);
for (size_t i=0; i<8; i++)
{
if (i==4) printf(" "); // separate every four characters
printf("%d", (my_char & bitmask) != 0);
bitmask = bitmask >> 1;
}
printf("\n");
}
}
Then you can call this function for each element of your struct.
e.g.
typedef struct
{
int a;
char b;
int c[20];
}my_struct_t;
my_struct_t mystruct;
..
printdata(mystruct.a,sizeof(int));
printdata(mystruct.b,sizeof(char));
printdata(mystruct.c, 20*sizeof(int));
You can also pass the entire struct to the above function, but it will also print the padding bytes which is not what is needed.
This fit types what you want
#include <stdio.h>
#include <stdlib.h>
#define bitmask 0b1
void F1(void *a,int Len){
int i,j;
unsigned char*b=(unsigned char*)a;
b+=Len-1;
for(i=0;i<Len;i++,b--){
for(j=7;j>-1;j--){
printf("%d",((*b)&bitmask<<j)>>j);
}
}
printf("\n");
}
int main(){
unsigned int Q=10;
F1(&Q,sizeof(unsigned int));
unsigned short QQ=10;
F1(&QQ,sizeof(unsigned short));
unsigned char QQQ=10;
F1(&QQQ,sizeof(unsigned char));
return 0;
}
Related
In C language, I want to fill two 8-bit variables "a" and "b" with bits coming from a 16-bit variable "c".
The bits in the 16 bits variable are shuffled without any logical order, which can be for example :
a.4 | b.2 | b.6 | b.0 | a.0 | a.7 | a.6 | b.1 | b.2 | b.7 | b.4 | a.5 | a.1 | a.2 | b.3 | b.5
Is there a way to do that?
The goal is to have a quite lisible look-up table.
This code randomizes and shuffles bits in c after copying initial, you stated it is intended to be used in a embedded system but you didn't provide any information about which embedded system it is, it could be an arduino, it could be a obscure system from 80s, it could be a diy pcb with a random stm32 attached to it, we can't know :)
// Code is under public domain, use it like what you want
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <time.h>
int main() {
srand(time(NULL));
uint16_t initial = 4040; /* 24 will be shuffled */
uint16_t c = 0;
/* shuffle bits */
for(unsigned i = 0; i < sizeof(uint16_t) * 8; ++i) {
c ^= initial & (1 << (rand() % 16));
}
uint8_t a = 0;
uint8_t b = 0;
a = ((unsigned char*)&c)[0];
b = ((unsigned char*)&c)[1];
for(unsigned char i = 0; i < sizeof(uint16_t) * 8; ++i) {
printf("%c.%d = %d | ", ('a' * ((i < 8))) + ('b' * ((i >= 8))), ((i + 1) * (i < 8)) + ((i + 1 - 8) * (i >= 8)), ((a >> i)) & 1);
}
return 0;
}
This code will print this (obviously yours going to be random):
a.1 = 1 | a.2 = 0 | a.3 = 1 | a.4 = 1 | a.5 = 0 | a.6 = 1 | a.7 = 1 | a.8 = 1 | b.1 = 0 | b.2 = 0 | b.3 = 0 | b.4 = 1 | b.5 = 0 | b.6 = 1 | b.7 = 0 | b.8 = 0 |
This question already has answers here:
Endianness -- why do chars put in an Int16 print backwards?
(4 answers)
Closed 3 years ago.
I have following code:
int main ( void ) {
unsigned int array [] = { 298 , 0 x1A2A3A4A };
unsigned char *p = ( unsigned char *) array ;
for (int i = 4; i < 8; i ++) {
printf ("% hhX ", p[i]) ;
}
printf ("\ nThe Answer is %d or %d!\n", p[0] , p [6]) ;
return EXIT_SUCCESS ;
}
I dont understand the output:
4A 3A 2A 1A
The Answer is 42 or 42
On a little endian system, the layout of the 8 byte array is
Position: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
Value (Hex): 2A | 01 | 00 | 00 | 4A | 3A | 2A | 1A
Your loop prints the last 4 bytes in the order they appear in the array. Your final printf prints the values at the 0 and 6 position, which are both 0x2A, or 42 in decimal.
I am trying to pass a structure's array to a function, but it gives me an error when i becomes 1, acces violation.
Here is my code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
typedef struct {
int locuri;
int putere;
char marca[50];
char culoare[50];
int an_fabricatie;
}automob;
void aloca(automob **autos, int n)
{
*autos = (automob*)malloc(sizeof(automob)*n);
if (autos == NULL) {
exit(1);
}
}
void read_autos(const char* filename, automob **A, int *n)
{
FILE *f_in = fopen(filename, "r");
int i = 0, aux;
if (f_in == NULL) {
printf("Nu s-a gasit fisierul!");
_getch();
exit(0);
}
fscanf(f_in, "%d", n);
aloca(A, *n);
while (i < (*n)) {
fscanf(f_in, "%d", &A[i]->locuri);
fscanf(f_in, "%d", &A[i]->putere);
fscanf(f_in, "%s", &A[i]->marca);
fscanf(f_in, "%s", &A[i]->culoare);
fscanf(f_in, "%d", &A[i]->an_fabricatie);
i++;
}
}
void main()
{
int n;
automob *A;
read_autos("autos.in", &A, &n);
_getch();
}
I think the pointer A is not allocated properly but I really don't know. Do you have any ideas? Because this works when I write it in the main function but does not work if I right it in another function like read_autos.
A[i] -> locuri means (* A[i]).locuri; this would make sense if A was an array of pointers to automob; but it isn't. You want (* A)[i].locuri. And so on for the other fields.
fscanf(f_in, "%d", &(* A)[i].locuri);
fscanf(f_in, "%d", &(* A)[i].putere);
fscanf(f_in, "%s", (* A)[i].marca);
fscanf(f_in, "%s", (* A)[i].culoare);
fscanf(f_in, "%d", &(* A)[i].an_fabricatie);
What you wrote:
+------+ +-------+ +--------------------------------------------+
| A -----> | A[0] -----> | locuri | putere | marca | culoare | an_fab |
+------+ | | +--------------------------------------------+
+-------+ +--------------------------------------------+
| A[1] -----> | locuri | putere | marca | culoare | an_fab |
| | +--------------------------------------------+
+-------+ +--------------------------------------------+
| A[2] -----> | locuri | putere | marca | culoare | an_fab |
| | +--------------------------------------------+
+-------+ +--------------------------------------------+
| A[3] -----> | locuri | putere | marca | culoare | an_fab |
| | +--------------------------------------------+
+-------+
What you want:
+------+ +-------+ +--------------------------------------------+
| A -----> | * A -----> [0] | locuri | putere | marca | culoare | an_fab |
+------+ +-------+ +--------------------------------------------+
[1] | locuri | putere | marca | culoare | an_fab |
+--------------------------------------------+
[2] | locuri | putere | marca | culoare | an_fab |
+--------------------------------------------+
[3] | locuri | putere | marca | culoare | an_fab |
+--------------------------------------------+
(It is a comment but I do not have 50 reputation, so I answer and you could convert it as a comment)
When I have such problem and it happens, I do not hesitate to simply print pointer value.
For example, in your case :
printf("sizeof %I64u\n",sizeof(automob));
printf("Global Addr %I64u\n",*A);
printf("1st elt Addr %I64u\n",&(*A)[0]);
printf("2nd elt Addr %I64u\n",&(*A)[1]);
printf("1st elt / 1st field Addr %I64u\n",&(*A)[0].locuri);
printf("2nd elt / 2nd field Addr %I64u\n",&(*A)[1].locuri);
Question :
I know I should be using a character array but character data are stored in as their corresponding numerical value; So we can say both int array and character array are same the only difference is; generally character uses 1 byte and int uses 4 bytes.
My Problem :
I have an int array; I am storing data into that array but when I tried to print that array using printf and %s its only printing first character from that array
When %s is used with printf it searches for null character i.e. \0, to know where to stop. In my code I am putting /0 explicitly to the end of string.
Code(Edited) :
/* Write a program to print all input lines that are longer than 80
characters. */
#include <stdio.h>
#define MAXCHAR 80
#define LINES 1000
int main() {
int i, c = 0;
int data[LINES];
while(c != EOF) {
for(i = 0; i < LINES - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
data[i] = c;
printf("Value of i after for = %d\n",i );
if(c == '\n') {
data[i] = c;
++i;
}
data[i] = '\0';
if(i >= MAXCHAR + 2)
printf("%s\n",data);
printf("Value of i = %d\n",i );
}
}
If you have a char array containing the string "Hello\0" it will look like this:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
Or if we show the integer value of those characters it looks like this:
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
So if we have an array of int containing the same values it looks like this:
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
Or in hexadecimal, and assuming 16-bit ints, it looks like this:
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
Or looking at the individual bytes, and assuming little-endian byte order, it looks like this:
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
So if we have an int array containing the integers corresponding to the characters in a string, and if (despite the gross type incompatibility) we try to print them using printf and %s, it will look at the first byte which is 48 which is an H, and print it, but then right after that it will see a 0 byte, which it will interpret as the end of the string, and stop.
In the below you can see whole of my program that is written in Codevision (C language.). When I want to compile it, I receive some errors for Switch blocks! I am pretty sure my block's form are correct! would you please take a look?
*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 12/17/2014
Author :
Company :
Comments:
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*******************************************************/
#include <mega32.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
#include <stdint.h>
// Declare your global variables here
#define SCANS;
void sendNum(int);
void resetWrongTryCounter();
void sendSpecialChars(char);
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
}
void main(void)
{
// Declare your local variables here
int num=9999;
OSCCAL=0xA0;
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=1 Bit6=1 Bit5=1 Bit4=1 Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(1<<PORTA7) | (1<<PORTA6) | (1<<PORTA5) | (1<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
// INT2: Off
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Global enable interrupts
#asm("sei")
while (num>-1)
{
resetWrongTryCounter();
delay_ms(100);
sendNum(num/1000);
delay_ms(25);
sendNum((num%1000)/100);
delay_ms(25);
sendNum((num%100)/10);
delay_ms(25);
sendNum(num%10);
delay_ms(500);
--num;
}
}
void sendNum(int num)
{
uint8_t count;
switch(num){
case 0 :
for (count=0; count<SCANS; count++){
while (PINA.0 != 0);
PORTA.5 = 0;
while (PINA.0 != 1);
PORTA.5 = 1;
}
break;
case 1 :
for(count=0;count<SCANS;count++){
while (PINA.1 != 0);
PORTA.4 = 0;
while (PINA.1 != 1);
PORTA.4 = 1;
}
break;
case 2 :
for (count=0; count<SCANS; count++){
while (PINA.2 != 0);
PORTA.4 = 0;
while (PINA.2 != 1);
PORTA.4 = 1;
}
break;
case 3 :
for (count=0; count<SCANS; count++){
while (PINA.3 != 0);
PORTA.4 = 0;
while (PINA.3 != 1);
PORTA.4 = 1;
}
break;
case 4 :
for (count=0; count<SCANS; count++){
while (PINA.1 != 0);
PORTA.5 = 0;
while (PINA.1 != 1);
PORTA.5 = 1;
}
break;
case 5 :
for (count=0; count<SCANS; count++){
while (PINA.2 != 0);
PORTA.5 = 0;
while (PINA.2 != 1);
PORTA.5 = 1;
}
break;
case 6 :
for (count=0; count<SCANS; count++){
while (PINA.3 != 0);
PORTA.5 = 0;
while (PINA.3 != 1);
PORTA.5 = 1;
}
break;
case 7 :
for (count=0; count<SCANS; count++){
while (PINA.1 != 0);
PORTA.6 = 0;
while (PINA.1 != 1);
PORTA.6 = 1;
}
break;
case 8 :
for (count=0; count<SCANS; count++){
while (PINA.2 != 0);
PORTA.6 = 0;
while (PINA.2 != 1);
PORTA.6 = 1;
}
break;
case 9 :
for (count=0; count<SCANS; count++){
while (PINA.3 != 0);
PORTA.6 = 0;
while (PINA.3 != 1);
PORTA.6 = 1;
}
break;
}
}
void sendSpecialChars(char ch)
{
uint8_t count;
switch(ch){
case '*' :
for (count=0; count<SCANS; count++){
while (PINA.0 != 0);
PORTA.4 = 0;
while (PINA.0 != 1);
PORTA.4 = 1;
}
break;
case '#' :
for (count=0; count<SCANS; count++){
while (PINA.0 != 0);
PORTA.6 = 0;
while (PINA.0 != 1);
PORTA.6 = 1;
}
break;
}
}
void resetWrongTryCounter()
{
PORTA.7=0;
delay_ms(50);
PORTA.7=1;
delay_ms(50);
sendNum(4);
sendNum(3);
sendNum(2);
sendNum(1);
sendSpecialChars('#');
}
This is errors that I receive on compile :
Update:
Base on Dear Wintermute's answer, I change the code.
That was right. I change that line to
define SCANS 8;
Most of errors disappear, But these below errors remain :
With
#define SCANS;
I am not surprised that
for (count=0; count<SCANS; count++){
breaks. It expands to
for (count=0; count<;; count++){
which is an invalid expression. You probably want to #define SCANS 100 or some other number.
Addendum: Do not use a semicolon in the macro. It will make SCANS expand to 8;, and you'll be left with
for (count=0; count<8;; count++){
which is also invalid.