二进制条码扫描是一种只包含1和0的位模式。编写一个函数,查找二进制代码的明暗区域的边缘。按以下方式处理输入位模式:
•当两个连续的比特(一个比特和它的前一个比特)不同时,给输出位模式赋1
•当两个连续的位(一个位和前一个位)相同时,给输出位模式赋一个0
•第一个输出位赋值为0,因为第一个位没有前一个位
例如,检测边缘的程序的输入和输出位模式可能如下:
输入:00101101
输出:00111011
用下面的原型编写函数edge()来执行边缘检测。函数edge()的参数包含相同大小的输入和输出数组的长度,输入数组a1和输出数组a2。使用指针算术(而不是下标)访问数组元素。换句话说,消除循环索引变量和函数中所有[]操作符的使用。Void edge(int *a1, int *a2, int){}
//my attempt
#include <stdio.h>
#include <stdlib.h>
void edge(int *a1, int *a2, int n);
int main() {
int i;
int n = 8;
int arr[] = {0,0,1,0,1,1,0,1};
int arr2[n];
for(i = 0; i < 8; i++) {
printf("%d", arr[i]);
}
edge(arr, arr2, n);
printf("n");
for(i = 0; i < 8; i++) {
printf("%d", arr2[i]);
}
}
void edge(int *a1, int *a2, int n) {
int *p;
int *q;
for(p = a1, q = a2; p < n, q < n; p++) {
if(*p != *p++) {
*q = 1;
q++;
} else if(*p == *p++) {
*q = 0;
q++;
}
}
}
我认为你代码中的问题是关于++操作符的使用。只需使用大括号和长形式的自增运算符,以避免在处理指针算术时出现任何错误。检查下面的代码:
void edge(int *a1, int *a2, int n) {
int *cur = a1+1;
int *prev = a1;
int *y = a2;
int i;
(*y) = 0;
y = y + 1;
while(prev != a1 + 7){
if((*cur) == (*prev)){
(*y) = 0;
}
else{
(*y) = 1;
}
prev = prev + 1;
cur = cur + 1;
y = y + 1;
}
}