2

スタックのプッシュ関数に int または文字列を渡す必要があります。通常、私は関数をオーバーロードし、文字列パラメーターを受け取るものとintパラメーターを受け取るものを用意して、パラメーターに基づいて適切な関数が呼び出されるようにします。私は通常タイプを含めるコメントにスポットを書きました。私はちょうどそこで立ち往生しました。

void push(Stack *S, /* int or a string */ element)
{        
    /* If the stack is full, we cannot push an element into it as there is no space for it.*/        
    if(S->size == S->capacity)        
    {                
        printf("Stack is Full\n");        
    }        
    else        
    {                
        /* Push an element on the top of it and increase its size by one*/ 

        if (/* element is an int*/)
            S->elements[S->size++] = element; 
        else if (/* element is a string */)
            S->charElements[S->size++] = element;
    }        
    return;
}
4

5 に答える 5

3

これは、union自動的に物事を管理する and を使用できる状況です。

typedef union {
   int integer; 
   char* string;
} Item;

とにかく型チェックが必要な場合はstruct、型とunion内部で a を使用できます。

typedef enum { INTEGER, STRING } Type;

typedef struct
{
  Type type;
  union {
  int integer;
  char *string;
  } value;
} Item;
于 2012-10-25T06:05:29.610 に答える
1

C11 のその部分を既に実装しているコンパイラがある場合は、新しい機能を使用できます_Generic。たとえば、clang はすでにこれを実装しており、gcc といとこにはその機能をエミュレートする方法があります: P99

通常、このようなマクロを介して機能します

#define STRING_OR_INT(X) _Generic((X), int: my_int_function, char const*: my_str_function)(X)
于 2012-10-25T07:03:34.767 に答える
0

cには関数のオーバーロードはありません。

タイプを引数として渡し、要素パラメーターをポインターにしてから、ポインターを適切なタイプに再キャストすることができます。

于 2012-10-25T06:01:31.323 に答える
0

その言語で提供されている機能のみを使用する必要があります。Cで変数がstringかintかをチェックする方法はないと思います。また、要素はstringとintの両方を保存できません。ここで注意してください。したがって、関数のオーバーロードに進みます。幸運を

于 2012-10-25T06:09:07.233 に答える
0

この方法で試すことができます

void push (Stack *S,void *element)
    {
     (*element) //access using dereferencing of pointer by converting it to int
     element // incase of char array
    }

    //from calling enviroment
    int i =10;
    char *str="hello world"
    push(S,&i) //in case of int pass address of int
    push(S,str) // in case of char array
于 2012-10-25T06:10:50.387 に答える