サンプルコードを写しただけなのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
n!

サンプルコードを写しただけなのですが・・・

#1

投稿記事 by n! » 14年前

if ((s->stk = calloc(max, sizeof(int))) == NULL) { の行で
「"void*"の値を型"int*"のエンティティに割り当てることはできません」というエラーがでてしまうのですが何故でしょうか
開発環境はmicrosoft visual C++ 2010 express です

コード:

/*
	スタックの実現例
*/

#include  <stdio.h>
#include  <stdlib.h>

/*--- スタックを実現する構造体 ---*/
typedef struct {
	int	 max;		/* スタックのサイズ */
	int	 ptr;		/* スタックポインタ */
	int	 *stk;		/* スタック(の先頭要素へのポインタ) */
} Stack;

/*--- スタックの初期化 ---*/
int StackAlloc(Stack *s, int max)
{
	s->ptr = 0;
	if ((s->stk = calloc(max, sizeof(int))) == NULL) {
		s->max = 0;								/* 配列の確保に失敗 */
		return (-1);
	}
	s->max = max;
	return (0);
}

/*--- スタックの後始末 ---*/
void StackFree(Stack *s)
{
	if (s->stk != NULL) {
		free(s->stk);
		s->max = s->ptr = 0;
	}
}

/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, int x)
{
	if (s->ptr >= s->max)
		 return (-1);
	s->stk[s->ptr++] = x;
	return (0);
}

/*--- スタックからデータをポップ ---*/
int StackPop(Stack *s, int *x)
{
	if (s->ptr <= 0)							/* スタックは空 */
		return (-1);
	*x = s->stk[--s->ptr];
	return (0);
}

/*--- スタックからデータをピーク ---*/
int StackPeek(const Stack *s, int *x)
{
	if (s->ptr <= 0)							/* スタックは空 */
		return (-1);
	*x = s->stk[s->ptr - 1];
	return (0);
}

/*--- スタックの大きさ ---*/
int StackSize(const Stack *s)
{
	return (s->max);
}

/*--- スタックに積まれているデータ数 ---*/
int StackNo(const Stack *s)
{
	return (s->ptr);
}

/*--- スタックは空か ---*/
int StackIsEmpty(const Stack *s)
{
	return (s->ptr <= 0);
}

/*--- スタックは満杯か ---*/
int StackIsFull(const Stack *s)
{
	return (s->ptr >= s->max);
}

/*--- スタックを空にする ---*/
void StackClear(Stack *s)
{
	s->ptr = 0;
}

int main(void)
{
	Stack  s;

	if (StackAlloc(&s, 100) == -1) {
		puts("スタックの確保に失敗しました。");
		return (1);
	}
	while (1) {
		int  m, x;

		printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s));
		printf("(1) プッシュ  (2) ポップ (0) 終了:");
		scanf("%d", &m);

		if (m == 0) break;

		switch (m) {
		 case 1: printf("データ:");   scanf("%d", &x);
				 if (StackPush(&s, x) == -1)
					puts("スタックへのプッシュに失敗しました。");	break;

		 case 2: if (StackPop(&s, &x) == -1)
					puts("ポップできません。");
				 else
					printf("ポップしたデータは%dです。\n", x);		break;
		}
	}
	StackFree(&s);

	return (0);
}


アバター
toyo
記事: 35
登録日時: 14年前
住所: 宮崎県

Re: サンプルコードを写しただけなのですが・・・

#2

投稿記事 by toyo » 14年前

CとC++の違いですね
Cだとvoid*型から自動的に変換されますがC++だと自動変換されないためキャストしてポインタ型の変換を明示しないといけません

コード:

if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL) { 
のように(int*)を付け加えるかファイルの拡張子を.cにしてCでコンパイルするとエラーは消えると思います

n!

Re: サンプルコードを写しただけなのですが・・・

#3

投稿記事 by n! » 14年前

解決しました!
ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る