@namberden

Как решить проблему несовместимости const char* c параметром типа char* в VS?

В коде хеш таблицы у меня почему то выдается ошибка в мейне, а конкретно
int main()
{
		struct listnode *node;
	hashtab_init(hashtab);
	hashtab_add(hashtab, "Tigr", 190); // ошибка на "Tigr"
	hashtab_add(hashtab, "Slon", 2300); // ошибка на "Slon"
	hashtab_add(hashtab, "Volk", 60); // ошибка на "Volk"

	node = hashtab_lookup(hashtab, "Slon"); // ошибка на "Slon"
	printf("Node: %s, %d\n", node->key, node->value);

	return 0;
}


В код блоксе все работает.

Ошибка (активно) E0167 аргумент типа "const char *" несовместим с параметром типа "char *"

сам код.
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "stdafx.h"
#include <math.h>
#include <tchar.h>


#define HASHTAB_SIZE 71 
#define HASHTAB_MUL 31 

struct listnode {
	char *key;
	int value;

	struct listnode *next;
};

struct listnode *hashtab[HASHTAB_SIZE];

int hashtab_hash(char *key) {
	int h = 0;
	char *p;

	for (p = key; *p != '\0'; p++) {
		h = h * HASHTAB_MUL + (int)*p;
	}
	return h % HASHTAB_SIZE;
}

void hashtab_init(struct listnode **hashtab) {
	int i;

	for (i = 0; i < HASHTAB_SIZE; i++) {
		hashtab[i] = NULL;
	}
}

int hashtab_add(struct listnode **hashtab, char *key, int value) {
	struct listnode *node;

	int index = hashtab_hash(key);

	node = (struct listnode *) malloc(sizeof(*node));
	if (node != NULL) {
		node->key = key;
		node->value = value;
		node->next = hashtab[index];
		hashtab[index] = node;
	}
	return NULL;
}

struct listnode *hashtab_lookup(
	struct listnode **hashtab, char *key)
{
	int index;
	struct listnode *node;

	index = hashtab_hash(key);
	for (node = hashtab[index]; node != NULL; node = node->next)

	{
		if (strcmp(node->key, key) == 0) {
			return node;
		}
	}
	return NULL;
}

int main()
{
		struct listnode *node;
	hashtab_init(hashtab);
	hashtab_add(hashtab, "Tigr", 190);
	hashtab_add(hashtab, "Slon", 2300);
	hashtab_add(hashtab, "Volk", 60);

	node = hashtab_lookup(hashtab, "Slon");
	printf("Node: %s, %d\n", node->key, node->value);

	return 0;
}

void hashtab_delete(struct listnode **hashtab, char *key) {
	int index;
	struct listnode *p, *prev = NULL;

	index = hashtab_hash(key);
	for (p = hashtab[index]; p != NULL; p = p->next) {
		if (strcmp(p->key, key) == 0) {
			if (prev == NULL) hashtab[index] = p->next;
			else
				prev->next = p->next;
			free(p);
			return;
		}
		prev = p;
	}
}
  • Вопрос задан
  • 11743 просмотра
Пригласить эксперта
Ответы на вопрос 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Поменять в сигнатуре функции char * на const char *. Если я правильно понимаю, hashtab_lookup ищет значение по ключу и соответственно менять его незачем. Да и даже если приведённый код скомпилируется и вы попытаетесь поменять строку по указателю, будет UB.
А ещё хорошо бы оформлять код в блоки и ставить правильные теги вопросу(C).
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Есть три способа.
1. Компилировать компилятором Си, а не Си++. Это отлично работает и даёт предупреждение в return NULL (который, впрочем, явно излишний).

2. Проставить const-корректность. Поскольку наши структуры не управляют строками, а берут чужие, везде, где используются ключи, делать const.
struct listnode {
  const char *key;
  int value;

  struct listnode *next;
};
И так далее, мест пять на всю программу.

3. const_cast<char*>(someString). Иногда нужно (например, чтобы подружить std::string Си++03 и некоторые функции WinApi), но тут не наше дело.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы