-1

我将如何摆脱这些不允许我编译的语法错误?

这对于正在做的事情具有正确的结构,但是这些错误使我无法对其进行测试。

我非常接近测试这个。我做了 int array 和 int pointer 来修复其中一些错误,但是在下一个错误的行中执行它们并不能修复它们。

这都是相同类型的错误。

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);

  }
4

2 回答 2

0

这个程序有很多语法错误,而且你的代码格式并不完全使它易于阅读(例如,缩进非常不一致)。

语法错误为您提供失败的行号。你应该看看那条线,也许是那条线周围的线,以确定哪里出了问题。

例如:

Pointers.c:32:错误:“数组”之前的预期“)”</p>

第 32 行:

void ArrayPrint(ArrayInt array){

该错误为您提供了一个线索,即之前出现了问题array。这里的问题ArrayInt是用作类型。您尚未在任何地方定义此类型。

接下来,您的 for 循环的语法不正确。正确的语法是for (initial condition; condition; increment). 仔细查看,并将其与您使用的语法进行比较 - 注意使用;s 而不是,s,以及它们的位置(如果您有兴趣,请参阅这个问题。

我建议你修复这些,然后仔细检查每个错误,并查阅一本书、网络资源和/或谷歌,看看你应该如何实现你在那里写的内容(例如搜索“c for loop syntax”。 . 或“c 数组教程”)。

现在,如果您正在为这些问题苦苦挣扎,您可能想尝试使用LLVMclang编译器,但如果您找不到它的 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);

}
于 2013-10-06T06:11:00.137 回答
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- 使用iand 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]) 分配给 an int(因为int *pointer意味着 thatpointer是指向intso的指针pointer[i],相当于*(pointer + i), is an 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毕竟把它们变成了 s,那么就始终如一地使用它们。如果您不打算将它们变成typedefs,那么请摆脱它们并修复函数定义。

您交换的排序函数中有不匹配的括号:

     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 : %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);
}

修改后的输出

---- 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
于 2013-10-06T06:06:38.093 回答