使用具有语法错误的指针,数组和冒泡排序的数据排序程序

时间:2013-10-06 04:59:52

标签: c arrays sorting pointers bubble-sort

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

这具有正确的结构,但这些错误阻止我测试它。

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

  }

2 个答案:

答案 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上进行索引 - 而是使用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];

您正在为&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);

}