如何摆脱不允许我编译的语法错误?
这具有正确的结构,但这些错误阻止我测试它。
我非常接近测试这个。我做了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);
}
答案 0 :(得分:0)
你的两个问题是:
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];
您正在为&array[i]
分配指针(int
)(因为int *pointer
表示pointer
是指向int
的指针所以{{ 1}},相当于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);
}
对代码进行微调,以遵守assignment的字母。特别是,它使用“指向整数的指针”的其他未使用的类型定义来构建“指向整数的五个指针的数组”。它试图让输出格式精确匹配问题的输出。尽量避免输出行(和源代码行)上的尾随空格。
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 : %10d\n", i, array[i]);
}
void ArrayPointerPrint(ArrayPtr pointer)
{
for (int i = 0; i < SIZE_OF_ARRAY; i++)
printf("%2d : %10d\n", 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);
}
答案 1 :(得分:0)
此程序中存在大量语法错误,并且您的代码格式化并不能使其易于阅读(例如,缩进非常不一致)。
语法错误为您提供失败的行号。你应该看看那条线,也许是那条线周围的线,以确定出了什么问题。
例如:
Pointers.c:32:错误:预期')'在'array'之前
第32行:
void ArrayPrint(ArrayInt array){
该错误为您提供了线索,即array
之前出现问题。这里的问题是ArrayInt
被用作类型。您尚未在任何地方定义此类型。
接下来,for循环的语法不正确。正确的语法是for (initial condition; condition; increment)
。仔细查看,并将其与您使用的语法进行比较 - 注意使用;
而不是,
s,以及它们的位置(如果您感兴趣,请参阅this question
我建议你修复这些问题,然后仔细查看每个错误,并查阅书籍,网络资源和/或Google,看看你应该如何实现你在那里写下的内容(例如搜索“c for loop”语法“..或”c数组教程“)。
现在,如果您正在使用这些,您可能想尝试使用LLVM clang
compiler,但如果您找不到它并且/或者您找不到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);
}