为了完成这个问题,我应该如何修改函数中的指针算术?



二进制条码扫描是一种只包含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;
}

}