我将如何摆脱这些不允许我编译的语法错误?
这具有正在执行的操作的正确结构,但是这些错误使我无法对其进行测试。
我非常接近测试这个。我做了 int 数组和 int 指针来修复其中一些错误,但在下一个错误的行中执行它们并不能修复它们。
这都是相同类型的错误。
Pointers.c: In function ‘ArrayInitialize’:
Pointers.c:19: error: expected ‘;’ before ‘)’ token
Pointers.c:23: error: expected ‘;’ before ‘)’ token
Pointers.c:25: warning: assignment makes integer from pointer without a cast
Pointers.c: At top level:
Pointers.c:32: error: expected ‘)’ before ‘array’
Pointers.c:44: error: expected ‘)’ before ‘array’
Pointers.c:56: error: expected ‘)’ before ‘array’
Pointers.c:78: error: expected ‘)’ before ‘pointer’
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_ARRAY 5
//=============================================================================
int *IntegerPtr;
int ArrayInt[SIZE_OF_ARRAY];
int *ArrayPtr[SIZE_OF_ARRAY];
//-----------------------------------------------------------------------------
void ArrayInitialize(int *array,int *pointer){
int i;
srand(getpid());
for (i =0, i < SIZE_OF_ARRAY; i++;){
array[i] = (int)rand();
for (i =0, i < SIZE_OF_ARRAY; i++;){
pointer[i] = &array[i];
}
}
}
//-----------------------------------------------------------------------------
void ArrayPrint(ArrayInt array){
int i;
for (i =0, int < SIZE_OF_ARRAY; i++;){
printf("%d : %10d n",i,array[i]);
}
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayPointerPrint(ArrayInt array){
int i;
for (i =0, i < SIZE_OF_ARRAY; i++){
printf("%d : %10d n",i,pointer[i]);
}
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayBubbleSort(ArrayInt array){
int i;
int j;
int temp;
for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
{
for( j = 1; j <= i; j++ )
{
if( *(array+(j-1)) > *(array+j))
{
temp = *array+(j-1));
*array+(j-1)) = array+(j));
*array+(j) = temp;
}
}
}
}
//-----------------------------------------------------------------------------
void PointerBubbleSort(ArrayPtr pointer){
int i;
int j;
int temp;
for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
{
for( j = 1; j <= i; j++ )
{
if( *(pointer+(j-1)) > *(pointer+j))
{
temp = *pointer+(j-1));
*pointer+(j-1)) = pointer+(j));
*pointer+(j) = temp;
}
}
}
}
//-----------------------------------------------------------------------------
int main(void) {
int array[SIZE_OF_ARRAY];
int pointer[SIZE_OF_ARRAY];
ArrayInitialize(array,pointer);
ArrayPrint(array);
PointerBubbleSort(pointer);
ArrayPointerPrint(pointer);
ArrayBubbleSort(array);
ArrayPrint(array);
ArrayPointerPrint(pointer);
return(EXIT_SUCCESS);
}
这个程序中有很多语法错误,你的代码格式并不完全使它易于阅读(例如,缩进非常不一致(。
语法错误为您提供失败的行号。你应该看看那条线,也许还有紧挨着那条线的线,以确定出了什么问题。
例如:
Pointers.c:32:错误:在"数组"之前预期为"(">
第 32 行:
void ArrayPrint(ArrayInt array){
该错误为您提供了一个线索,即在array
之前出了点问题。这里的问题是ArrayInt
被用作类型。您尚未在任何地方定义此类型。
接下来,你的 for 循环的语法不正确。正确的语法是 for (initial condition; condition; increment)
.仔细查看,并将其与您使用的语法进行比较 - 注意使用 ;
s 而不是 ,
s,以及它们的位置(如果您有兴趣,请参阅此问题。
我建议你修复这些错误,然后仔细查看每个错误,并查阅书籍,网络资源和/或Google,看看你应该如何实现你在那里写的内容(例如,搜索"c for loop语法"......或"c数组教程"(。
现在,如果您正在努力解决这些问题,您可能需要尝试使用 LLVM clang
编译器,尽管如果您找不到它的 linux 软件包和/或您没有使用最新的 Mac OS X 版本,则可能很难安装。它输出一些更好的错误:
% clang -o foo foo.c
foo.c:17:9: warning: implicit declaration of function 'getpid' is invalid in C99
[-Wimplicit-function-declaration]
srand(getpid());
^
foo.c:25:18: warning: incompatible pointer to integer conversion assigning to
'int' from 'int *'; remove & [-Wint-conversion]
pointer[i] = &array[i];
^ ~~~~~~~~~
foo.c:23:18: warning: expression result unused [-Wunused-value]
for (i =0, i < SIZE_OF_ARRAY; i++;){
~ ^ ~~~~~~~~~~~~~
foo.c:19:16: warning: expression result unused [-Wunused-value]
for (i =0, i < SIZE_OF_ARRAY; i++;){
~ ^ ~~~~~~~~~~~~~
foo.c:32:17: error: unknown type name 'ArrayInt'
void ArrayPrint(ArrayInt array){
^
foo.c:35:12: error: expected ';' in 'for' statement specifier
for (i =0, int < SIZE_OF_ARRAY; i++;){
^
foo.c:35:12: error: expected expression
foo.c:35:38: error: expected ')'
for (i =0, int < SIZE_OF_ARRAY; i++;){
^
foo.c:35:7: note: to match this '('
for (i =0, int < SIZE_OF_ARRAY; i++;){
^
foo.c:35:39: error: expected expression
for (i =0, int < SIZE_OF_ARRAY; i++;){
^
foo.c:44:24: error: unknown type name 'ArrayInt'
void ArrayPointerPrint(ArrayInt array){
^
foo.c:47:36: error: expected ';' in 'for' statement specifier
for (i =0, i < SIZE_OF_ARRAY; i++){
^
foo.c:48:29: error: use of undeclared identifier 'pointer'
printf("%d : %10d n",i,pointer[i]);
^
foo.c:47:16: warning: expression result unused [-Wunused-value]
for (i =0, i < SIZE_OF_ARRAY; i++){
~ ^ ~~~~~~~~~~~~~
foo.c:56:22: error: unknown type name 'ArrayInt'
void ArrayBubbleSort(ArrayInt array){
^
foo.c:78:24: error: unknown type name 'ArrayPtr'
void PointerBubbleSort(ArrayPtr pointer){
^
5 warnings and 10 errors generated.
尝试解决这些问题,然后继续阅读。我会将其余部分标记为剧透,以便您可以先试一试。
...
这里:
for (i =0, int < SIZE_OF_ARRAY; i++;){
<块引用类> 一旦你修复了 for 循环语法,你只需随机地int
i
应该去的地方。
void ArrayPointerPrint(int* array){
int i;
for (i =0; i < SIZE_OF_ARRAY; i++){
printf("%d : %10d n",i,pointer[i]);
<块引用类> 在这里:编译器问pointer
应该是什么?它既不存在于函数的作用域中,也不存在于全局作用域中。我猜你的意思是array
.
temp = *array+(j-1);
<块引用类> 你为什么不在这里只使用array[j-1]
?虽然它可能在这个特定的行中工作,但当您尝试在作业的左侧使用相同的行时,它肯定不会。你在这个区域也有一些额外的括号。
下面的代码为我编译。不过,仍然有一些警告。你应该谷歌他们。
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_ARRAY 5
//=============================================================================
int *IntegerPtr;
int ArrayInt[SIZE_OF_ARRAY];
int *ArrayPtr[SIZE_OF_ARRAY];
//-----------------------------------------------------------------------------
void ArrayInitialize(int *array,int *pointer){
int i;
srand(getpid());
for (i =0; i < SIZE_OF_ARRAY; i++){
array[i] = (int)rand();
for (i =0; i < SIZE_OF_ARRAY; i++){
pointer[i] = &array[i];
}
}
}
//-----------------------------------------------------------------------------
void ArrayPrint(int* array){
int i;
for (i =0; i < SIZE_OF_ARRAY; i++){
printf("%d : %10d n",i,array[i]);
}
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayPointerPrint(int* array){
int i;
for (i =0; i < SIZE_OF_ARRAY; i++){
printf("%d : %10d n",i,array[i]);
}
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayBubbleSort(int* array){
int i;
int j;
int temp;
for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
{
for( j = 1; j <= i; j++ )
{
if( *(array+(j-1)) > *(array+j))
{
temp = *array+(j-1);
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
//-----------------------------------------------------------------------------
void PointerBubbleSort(int* pointer){
int i;
int j;
int temp;
for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
{
for( j = 1; j <= i; j++ )
{
if( *(pointer+(j-1)) > *(pointer+j))
{
temp = *pointer+(j-1);
pointer[j-1] = pointer+(j);
pointer[j] = temp;
}
}
}
}
//-----------------------------------------------------------------------------
int main(void) {
int array[SIZE_OF_ARRAY];
int pointer[SIZE_OF_ARRAY];
ArrayInitialize(array,pointer);
ArrayPrint(array);
PointerBubbleSort(pointer);
ArrayPointerPrint(pointer);
ArrayBubbleSort(array);
ArrayPrint(array);
ArrayPointerPrint(pointer);
return(EXIT_SUCCESS);
}
块引用类>块引用类>块引用类>你的两个问题是:
for (i =0, i < SIZE_OF_ARRAY; i++;){
array[i] = (int)rand();
for (i =0, i < SIZE_OF_ARRAY; i++;){
在这两个循环中,逗号应该是分号,最后一个分号应该丢失。 事实上,你有一个赋值(i = 0
后跟一个未使用的比较i < SIZE_OF_ARRAY
(,循环条件是i++ != 0
(这需要很长时间才能变成假;你可能在它变成假之前很久就崩溃了(,并且没有重新初始化步骤。你也不真的希望两个嵌套循环都索引i
- 改用i
和j
。 因此,如果你需要嵌套循环,你可以写:
for (i = 0; i < SIZE_OF_ARRAY; i++)
{
array[i] = (int)rand();
for (i = 0; j < SIZE_OF_ARRAY; j++)
{
但是,在我看来根本不需要嵌套循环:
for (i = 0; i < SIZE_OF_ARRAY; i++)
{
array[i] = rand();
pointer[i] = &array[i]; // More on this in a moment
}
编译器还诊断了赋值的问题:
pointer[i] = &array[i];
你正在分配一个指向int
的指针(&array[i]
((因为int *pointer
意味着pointer
是指向int
的指针,所以pointer[i]
,相当于*(pointer + i)
,是一个int
(。 从代码来看,看起来您应该在main()
声明:
int *pointer[SIZE_OF_ARRAY];
并且功能接口应为:
void ArrayInitialize(int *array, int **pointer)
但是代码的所有其他部分都与此不一致。 我相信它可以保持一致;问题是哪种方式使其保持一致。 根本没有理由使用pointer
(我可以看到(,除非它在函数中int **pointer
。
您有循环语法问题的另一种变体:
for (i =0, int < SIZE_OF_ARRAY; i++;){
这也应该是:
for (i = 0; i < SIZE_OF_ARRAY; i++){
在其他函数中,您使用名称ArrayInt
和ArrayPtr
,就好像它们是typedef
名称一样,但它们实际上是(未使用的(全局变量。 如果您将它们制作成typedef
毕竟,请始终如一地使用它们。 如果你不打算把它们变成typedef
,那么去掉它们并修复函数定义。
在交换的排序函数中,您有不匹配的括号:
temp = *array+(j-1));
*array+(j-1)) = array+(j));
*array+(j) = temp;
你使用的符号很奇怪;为什么不只使用数组索引呢?
temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
工作代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE_OF_ARRAY 5
typedef int *IntegerPtr;
typedef int ArrayInt[SIZE_OF_ARRAY];
typedef int *ArrayPtr[SIZE_OF_ARRAY];
void PointerBubbleSort(ArrayPtr pointer);
void ArrayBubbleSort(ArrayInt array);
void ArrayPointerPrint(ArrayPtr pointer);
void ArrayPrint(ArrayInt array);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer)
{
int i;
srand(getpid());
for (i = 0; i < SIZE_OF_ARRAY; i++)
{
array[i] = (int)rand();
pointer[i] = &array[i];
}
}
void ArrayPrint(ArrayInt array)
{
int i;
for (i = 0; i < SIZE_OF_ARRAY; i++)
{
printf("%d : %10d n", i, array[i]);
}
printf("n");
}
void ArrayPointerPrint(ArrayPtr pointer)
{
int i;
for (i = 0; i < SIZE_OF_ARRAY; i++)
{
printf("%d : %10d n", i, *pointer[i]);
}
printf("n");
}
void ArrayBubbleSort(ArrayInt array)
{
int i;
int j;
int temp;
for (i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
if (array[j-1] > array[j])
{
temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
void PointerBubbleSort(ArrayPtr pointer)
{
int i;
int j;
int *temp;
for (i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
if (*pointer[j-1] > *pointer[j])
{
temp = pointer[j-1];
pointer[j-1] = pointer[j];
pointer[j] = temp;
}
}
}
}
int main(void)
{
ArrayInt array;
ArrayPtr pointer;
ArrayInitialize(array, pointer);
ArrayPrint(array);
PointerBubbleSort(pointer);
ArrayPointerPrint(pointer);
ArrayBubbleSort(array);
ArrayPrint(array);
return(EXIT_SUCCESS);
}
示例输出
0 : 881325466
1 : 1242393703
2 : 927466540
3 : 1493827854
4 : 533425101
0 : 533425101
1 : 881325466
2 : 927466540
3 : 1242393703
4 : 1493827854
0 : 533425101
1 : 881325466
2 : 927466540
3 : 1242393703
4 : 1493827854
修订后的代码
对代码进行细微调整以符合赋值的字母。 特别是,它使用"指向整数的指针"的未使用类型定义来构建"指向整数的五个指针数组"。 它尝试使输出格式与问题的输出精确匹配。尽量避免在输出行(和源代码行(上尾随空格。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
enum { SIZE_OF_ARRAY = 5 };
typedef int *IntPtr;
typedef int ArrayInt[SIZE_OF_ARRAY];
typedef IntPtr ArrayPtr[SIZE_OF_ARRAY];
void PointerBubbleSort(ArrayPtr pointer);
void ArrayBubbleSort(ArrayInt array);
void ArrayPointerPrint(ArrayPtr pointer);
void ArrayPrint(ArrayInt array);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer)
{
srand(getpid());
for (int i = 0; i < SIZE_OF_ARRAY; i++)
{
array[i] = rand();
pointer[i] = &array[i];
}
}
void ArrayPrint(ArrayInt array)
{
for (int i = 0; i < SIZE_OF_ARRAY; i++)
printf("%2d : %10dn", i, array[i]);
}
void ArrayPointerPrint(ArrayPtr pointer)
{
for (int i = 0; i < SIZE_OF_ARRAY; i++)
printf("%2d : %10dn", i, *pointer[i]);
}
void ArrayBubbleSort(ArrayInt array)
{
for (int i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
{
for (int j = 1; j <= i; j++)
{
if (*(array + j-1) > *(array + j))
{
int temp = *(array + j-1);
*(array + j-1) = *(array + j);
*(array + j) = temp;
}
}
}
}
void PointerBubbleSort(ArrayPtr pointer)
{
for (int i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
{
for (int j = 1; j <= i; j++)
{
if (*pointer[j-1] > *pointer[j])
{
int *temp = pointer[j-1];
pointer[j-1] = pointer[j];
pointer[j] = temp;
}
}
}
}
int main(void)
{
ArrayInt array;
ArrayPtr pointer;
ArrayInitialize(array, pointer);
puts("---- Initialized array of integers ----");
ArrayPrint(array);
PointerBubbleSort(pointer);
puts("---- Sorted array of pointers ----");
ArrayPointerPrint(pointer);
ArrayBubbleSort(array);
puts("---- Sorted array of integers ----");
ArrayPrint(array);
puts("---- Array of pointers ----");
ArrayPointerPrint(pointer);
return(EXIT_SUCCESS);
}
修订后的输出
---- Initialized array of integers ----
0 : 974520281
1 : 2052070745
2 : 565640395
3 : 1955497143
4 : 950748713
---- Sorted array of pointers ----
0 : 565640395
1 : 950748713
2 : 974520281
3 : 1955497143
4 : 2052070745
---- Sorted array of integers ----
0 : 565640395
1 : 950748713
2 : 974520281
3 : 1955497143
4 : 2052070745
---- Array of pointers ----
0 : 974520281
1 : 2052070745
2 : 565640395
3 : 1955497143
4 : 950748713