Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Прошу помочь исправить ошибу типов


Автор: AlexeySheglov 3.6.2009, 18:11
Код

#include "module1.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int StkErr;
int CreateStack(struct StrStack* stk, int n)
{
    char ** p;
     p=calloc(n, sizeof (char **)); // ТУТ РУГАЕТСЯ КОМПИЛЯТОР
     if (p==NULL){
          StkErr=STACK_NOSTACK;
          return -1;
     }
     stk->ps=p;
     stk->size=n;
     stk->top=0;
     StkErr=STACK_NOERROR;
     return 0;
}
void DeleteStack(struct StrStack* stk)
{
     free(stk->ps);
     stk->size=0;
     stk->top=0;
}
int PushStack(char * s, struct StrStack* stk)
{
     if (stk->size==0){
          StkErr=STACK_NOSTACK;
          return -1;
     }
     if (stk->top == stk->size){
          StkErr=STACK_OVERFLOW;
          return -1;
     }
     stk->ps[stk->top]=s;
     stk->top++;
     return 0;
}

char* PopStack(struct StrStack* stk)
{
     if (stk->size==0)
          {
          StkErr=STACK_NOSTACK;
          return NULL;
     }
     if (stk->top == 0)
          {
          StkErr=STACK_UNDERFLOW;
          return NULL;
     }
     stk->top--;
     return stk->ps[stk->top];
}



Помогите исправить выдает
ошибку error C2440: '=' : cannot convert from 'void *' to 'char **'.

Автор: jonie 3.6.2009, 19:15
Код
p=(char**)calloc(n, sizeof (char **)); // ТУТ РУГАЕТСЯ КОМПИЛЯТОР

делай

Автор: fry 3.6.2009, 19:58
Код

char ** p;
     p=calloc(n, sizeof (char **)); // ТУТ РУГАЕТСЯ КОМПИЛЯТОР


Может так будет понятнее:

Код

#define char_ptr char*

char_ptr  *p; //Обрати внимание на "char_ptr*"
p=calloc(n, sizeof (char_ptr*)); //calloc возвращает void*


Необходимо:
 - привести void* к char_ptr   и
 - убрать лишнее обозначение указателя, т.е. "char_ptr  *p" исправить на "char_ptr  p"  или
 - выбрать элемент твоего массива из char_ptr (перед этим выделив под него память), например так: p[n]

При этом
Код

сalloc(n, sizeof (char **)); 

sizeof (char **) помоему попахивает косяком. Не находишь?

Автор: jonie 3.6.2009, 20:02
Цитата
sizeof (char **) помоему попахивает косяком. Не находишь?

я не нахожу. Где тут косяк? Указатель на указатель - аля "2Д динамический массив". Что там такого?

Автор: fry 3.6.2009, 20:05
Ну если выделяется место под двумерный массив типа char, то все ОК.
Именно потому, что не в курсе намерений автора я не стал утверждать.

Однако:
Код

p=(char**)calloc(n, sizeof (char **)); // ТУТ РУГАЕТСЯ КОМПИЛЯТОР

явно не гуд.

Добавлено через 4 минуты и 58 секунд
Если по нормальному судить:
Функция возвращяет указатель на область памяти, а автору нужен массив на указатели на эту самую область

Автор: math64 4.6.2009, 10:21
В большинстве случаев (если не во всех) sizeof(char**) == sizeof(char*), но вообще-то нужно писать
Код

p=(char**)calloc(n, sizeof (char *));

Автор: AlexeySheglov 4.6.2009, 13:02
Спасибо большое. норм все. работает.

Автор: fry 4.6.2009, 13:57
Помогло
Код

p=(char**)calloc(n, sizeof (char *));


вместо

Код

p=(char**)calloc(n, sizeof (char **));

????

Проблема была ведь с
Код

p=calloc(

Цитата

error C2440: '=' : cannot convert from 'void *' to 'char **'.


Или явное задание компиллятору преобразования исправило ситуацию?

Автор: AlexeySheglov 4.6.2009, 18:18
нет, помогло именно 1: p=calloc(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)