【问题标题】:Data Sorting Program using Pointers, Arrays, and Bubble Sorting having Syntax Errors使用指针、数组和冒泡排序的数据排序程序有语法错误
【发布时间】:2013-10-06 04:59:51
【问题描述】:

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

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

我非常接近测试这个。我做了 int array 和 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);

  }

【问题讨论】:

    标签: c arrays sorting pointers bubble-sort


    【解决方案1】:

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

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

    例如:

    Pointers.c:32: 错误:“数组”之前应为“)”

    第 32 行:

    void ArrayPrint(ArrayInt array){
    

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

    接下来,你的 for 循环的语法不正确。正确的语法是for (initial condition; condition; increment)。仔细查看,并将其与您使用的语法进行比较 - 注意使用 ;s 而不是 ,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++;){
    

    你只是将int 随机放在i 应该放在哪里,一旦你修复了你的for循环语法。

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

    【讨论】:

    • 当我覆盖我的代码时,您上面提供的代码无法编译。在函数变量声明中键入 int* 数组会出错。我不确定如何纠正这个错误。
    • cs.miami.edu/~wuchtys/CSC322-13F/Assessment/LT5.html 输出应该是底部的内容。
    • 我刚刚用 gcc 4.2.1 和 clang 3.2 编译了代码,没有错误,所以我需要编译器错误才能帮助你。看起来 Jonathan Leffler 已经为你解决了这个问题..
    • 现在你的程序因为一些奇怪的原因而工作:这是输出:pastebin.com/Mcpjz8F4
    【解决方案2】:

    你的两个问题是:

    for (i =0, i < SIZE_OF_ARRAY; i++;){
    
        array[i] = (int)rand();
    
    for (i =0, i < SIZE_OF_ARRAY; i++;){
    

    在两个循环中,逗号都应该是分号,最后的分号应该没有。实际上,您有一个赋值(i = 0 后跟一个未使用的比较 i &lt; SIZE_OF_ARRAY)并且循环条件是 i++ != 0(这需要很长时间才能变为假;您可能在它变为假之前很久就崩溃了),并且没有重新初始化步骤。您也并不真正想要两个嵌套循环都在i 上进行索引——而是使用ij。因此,如果您需要嵌套循环,请编写:

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

    您将指针 (&amp;array[i]) 分配给 int(因为 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++){
    

    在其他函数中,您使用名称 ArrayIntArrayPtr 就好像它们是 typedef 名称一样,但它们实际上是(未使用的)全局变量。如果您毕竟将它们变成typedefs,请始终如一地使用它们。如果你不打算把它们变成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 
    

    修改代码

    对代码进行小幅调整以符合assignment 的字母。特别是,它使用“指向整数的指针”的其他未使用的类型定义来构建“指向整数的五个指针的数组”。它试图让输出格式与问题的输出精确匹配。尽量避免在输出行(和源代码行)出现尾随空格。

    #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
    

    【讨论】:

    • 这帮助我解决了使用 & 符号进行转换的第一个问题。在我开始之前,我宁愿在“变量”之前修复这些预期的“)”错误。这个问题一直困扰着我。
    • 可以编译,但由于某种原因它没有在终端上运行
    • 好吧,在带有 GCC 4.8.1 的 Mac OS X 10.8.5 上,它在 gcc -std=c11 -O3 -g -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition 下编译时没有任何警告,并且运行如图所示。我不知道使用任何 C11 特性本身;我希望它可以在-std=c99 下编译而无需任何更改。事实上,我没有看到任何 C99 功能。在C89下也应该没问题。 (事实上​​,GCC 4.6.0 在 C99 和 C89 下编译它,即使添加了-pedantic)。您可能必须确保启用 POSIX 定义,但这就是我能想到的会影响它的所有内容。
    • 这有什么不妥之处?我可以颠倒第二次排序的排序标准,以便数据被第二次排序颠倒,或者在排序之间重新生成数据,但是......好吧,我看不出pastebin中的数据有什么问题。是升序排列的吧?
    • cs.miami.edu/~wuchtys/CSC322-13F/Assessment/LT5.html 这是它应该打印出来的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多