我有以下数组:
int A[] = {0,1,1,1,1, 1,0,1,0,0, 0,1,1,1,1};
int B[] = {1,1,1,1,1, 1,0,1,0,1, 0,1,0,1,0};
int C[] = {0,1,1,1,0, 1,0,0,0,1, 1,0,0,0,1};
//etc... for all letters of the alphabet
一个在5x3 LED矩阵上打印字母的功能:
void printLetter(int letter[])
我有一串信件:
char word[] = "STACKOVERFLOW";
我希望将字符串的每个字符传递给printLetter函数。
我试过了:
int n = sizeof(word);
for (int i = 0; i < n-1; i++) {
printLetter(word[i]);
}
但是我收到以下错误:从'char'无效转换为'int *'
我该怎么办?
谢谢!
答案 0 :(得分:5)
在参数类型错误的后面有一个更深层次的问题:缺少char和相应的int[]
之间的映射。
将printLetter
重新定义为
void printLetter(char letter)
满足编译器,但本身并不能解决您的问题。无论是在printLetter
内部还是外部,您都需要为给定的int[]
获取相应的char
。
实现这一目标的一种简单的暴力方法是使用switch
,但更好的方法是使用第二个数组,例如:
void printLetter(char letter) {
static int* charToMatrix[] = { A, B, C, ... };
int* matrixToPrint = charToMatrix[letter - 'A'];
// print the matrix
}
请注意,这是一个示例 - 我现在无法访问C编译器,所以我不能保证它可以直接使用,但希望它能很好地说明这一点。它还缺少边界检查,因此如果您尝试打印“未知”字符,它会在奇怪的随机位置访问内存,可能导致崩溃。
这个解决方案适用于大写字母;如果你还需要打印小写字母或其他字符,你可能更喜欢使用256个元素的数组,其中只填充对应于“已知”矩阵的索引处的元素,其余的设置为NULL。
答案 1 :(得分:2)
你不能轻易地将'a'从“stackoverflow”转换为A - int的数组。您可以在一个字母中定义代表字母的所有数组,并通过将字母转换为int来获取它们。
答案 2 :(得分:2)
您需要做的是从一个字符转换为一个数组。所以当你有字母'A'时,你会想要使用数组A
。最简单的方法是通过查找表。
int *lookup[256]; // assuming ASCII
memset(lookup, 0, sizeof(lookup));
lookup['A'] = A;
lookup['B'] = B;
...
然后当你有一个角色时,你可以获得正确的数组:
void printletter(char c);
{
int *data = lookup((unsigned char)c);
// In case you get a letter that you don't know how to display
if (data != NULL)
{
// display with data
}
}
不是在运行时构建数组,而是可以在编译时构建数组,尽管由于需要手动输入NULL指针会有点困难。
int *lookup[256] = {
NULL, // you need a total of 65 NULL's
NULL,
...
A, // so this is at the correct position
B,
C,
...
};
答案 3 :(得分:1)
该函数声明为void printLetter(int letter[])
,这意味着它需要一个指向int数组的指针。另一方面,word
是一个字符数组,word[i]
是一个字符,它根本不是正确的类型。如果printLetter()
真的只是打印一个字符,你应该将它的参数改为char。
答案 4 :(得分:0)
void printLetter(int letter[])
应该是
void printLetter(char letter)
因为:word
是char [] word[i]
是一个字符。