C程序语法(不编译)

时间:2014-03-16 21:11:25

标签: c pointers syntax

bst.c

//my bst.c
#include <stdio.h>
#include <stdlib.h>
#include "bst.h"
// Input: 뭩ize? size of an array
// Output: a pointer to an allocated array
// Effect: dynamically allocate an array of size+1 float-point numbers
//         the first slot of the array contains size+0.5
//         all the other slots contain -1;
BStree bstree_ini(int size) {
     int * BStree;
     BStree = (int *) malloc ((size+1)*sizeof(float)); //?
     BStree[0]=size+0.5; //?????
     int i;
     for (i=0; i<size; i++){
         BStree[i]=-1;
     }
     return *BStree;
}

bst.h

此标题由教授提供,无法更改。

typedef float* BStree;
const float my_epsilon = 0.0001;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, float key);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst);

问题

当我编译时,它给了我这个错误:http://puu.sh/7y0Lp.png(错误在我的第一个函数的return语句中)。有谁知道如何解决这一问题?我为发布一个非常简单的问题而道歉,哈哈,我对C和指针来说还是一个新手!

其余代码

这是{尚未完成的bst.c的剩余部分。

// Input: 뭕st? a binary search tree
// 뭟ey? a non-negative floating-point number
// Effect: key is inserted into bst if it is not already in bst
void bstree_insert(BStree bst, float key) {

}
// Input: 뭕st? a binary search tree
// Effect: print all the numbers in bst using in order traversal
void bstree_traversal(BStree bst) {

}
// Input: 뭕st? a binary search tree
// Effect: memory pointed to by bst is freed
void bstree_free(BStree bst) {

}

3 个答案:

答案 0 :(得分:1)

你的函数原型说它返回TYPE BStree的东西,它是指向float的指针,但是你试图返回一个VARIABLE BStree指向的整数。

所以你返回一个int而不是指向float的指针。

BStree bstree_ini(int size) {
    ...
    return *BStree;
}

您既可以调用类型,也可以调用变量BStree。这非常令人困惑。先解决这个问题。

答案 1 :(得分:1)

你说typedef float* BStree;这意味着BStree'对象'实际上是指针。 警告是由于您在编译器期望int指针(== BSTree)

时返回float指针的事实
BStree bstree_ini(int size) {
  BStree tree;
  tree = (BStree) malloc ((size+1)*sizeof(float)); /* Make size +1 places to store a float */ 
  tree[0]=0.5 + (float)size; /* cast size to float */
  int i;
  for (i=1; i<=size; i++){ /*you need to start at 1 or you'll overwrite size+0.5*/
      tree[i]=-1.0; 
  }
  return tree; /* returning a pointer to a float* (or a BSTree)*/
}

请注意,我没有取消引用tree;它已经是一个指针

答案 2 :(得分:0)

第一个可见的定义是混淆的,如果不是混淆:

BStree bstree_ini(int size) {
     int * BStree;

第一行说bstree_ini()是一个接受int参数并返回BStree的函数。

第二行表示BStreeint *类型的局部变量。

你不能同时拥有这两个。由于您返回*BStree,因此局部变量的类型错误。

第二次尝试

由于bstree_ini()需要返回指向浮点数组的指针,因此可以写:

BStree bstree_ini(int size)
{
     BStree;
     BStree data = malloc ((size + 1) * sizeof(*data));
     data[0] = size + 0.5;
     for (int i = 1; i <= size; i++)
         data[i] = -1.0;
     return data;
}

我仍然对设计深信不疑,但鉴于你无法改变标题,这应该可以解决这个问题。

首次尝试

在承认标题无法更改之前,这是一个可能的答案。

标题定义:

typedef float *BStree;

这是我不希望你使用的类型。您通常会使用结构类型:

typedef struct BStree
{
    float      value;
    struct BStree *l_child;
    struct BStree *r_child;
} BStree;

在您的功能中,您将拥有:

BStree *bstree_ini(int size)
{
    BStree *bp = …;
    …
    return bp;
}
相关问题