У меня две основные проблемы. Мой код стека (сваи) из «элементов», сделанных с помощью структуры, как так:назначение из проблем несовместимого типа указателя с динамическим стеком в C
typedef struct etCel{
element *ele;
struct cel *suiv;
} cel;
typedef cel* pile;
Первая проблема является функцией «IsEmpty», который генерирует ошибку сегментации:
int isEmpty(stack p){
if(p->ele){
return 0;
}else{
return 1;
}
}
int affiche_pile(pile p){
printf("Valeurs de la pile:\n");
while(p->ele){
affiche_element(p->ele);
printf("\n");
p=p->suiv;
}
return 1;
}
int pile_est_vide(pile p){
if(p->ele){
return 0;
}else{
return 1;
}
}
pile push(stack p, element e){
element *nvoele;
nvoele = (element*)malloc(sizeof(element));
stack ptmp = (stack)malloc(sizeof(cel));
assert(ptmp);
nvoele = &e;
ptmp->ele = nvoele;
ptmp->suiv = p; //ERROR HERE
return ptmp;
}
element pop(stack p){
stack ptmp = init_stack();
if(isEmpty(p) != 1){
ptmp = p->suiv; //ERROR HERE
free(p);
return *(ptmp->ele);
}else{
printf("Erreur! La pile est vide!\n");
}
}
int fill_stack(stack p, int q){
element tmp = init_element();
element *ptmp = &tmp;
for(int i = 0; i < q; i++){
input_element(ptmp);
push(p, tmp);
}
return 1;
}
Вторая проблема является проблема присваивания, которое происходит в других функций, таких как функция этой «поп»:
element pop(stack p){
stack ptmp = init_stack();
if(isEmpty(p) != 1){
ptmp = p->suiv;
free(p);
return *(ptmp->ele);
}else{
printf("Erreur! La pile est vide!\n");
}
}
он генерирует эту ошибку:
warning: assignment from incompatible pointer type [enabled by default] ptmp = p->suiv; I'm sure it's just some kind of syntax error, any help is appreciated, thanks
---- Edit: Вот что элемент выглядит следующим образом:
typedef struct etElement{
float num;
} element;
element init_element(){
element p;
p.num=0.0;
return p;
}
int affiche_element(element *p){
printf("Valeur de l\'element:\n");
printf("%f, ", p->num);
printf("\n");
return 1;
}
int affecte_element(element *p, float x){
p->num = x;
return 1;
}
int saisir_element(element *p){
float x = 0;
scanf("%f", &x);
if(affecte_element(p, x)){
return 1;
} else {
return 0;
}
}
int compare_element(element *p, element *e){
if(p->num > e->num){
printf("%f > %f\n", p->num, e->num);
return 3;
}
if(p->num == e->num){
printf("%f = %f\n", p->num, e->num);
return 2;
}
if(p->num < e->num) {
printf("%f < %f\n", p->num, e->num);
return 1;
} else {
return 0;
}
}
и минимальный пример кода:
int main(){
//Initialisation
stack p = init_stack();
if(isEmpty(p)==1){
printf("Empty.\n");
}else{
printf("Not empty.\n");
}
element e = init_element();
element *pele = &e;
assign_element(pele,3.0);
//Empilation
if(push(p,e)){
p=push(p,e);
}else{
printf("Echec de l\'empilation.\n");
}
show_stack(p);
}
это буквально то, что я компиляции минус некоторые printfs
пока я здесь, вот элемент:
typedef struct etElement{
float num;
} element;
Что касается первой проблемы. Вы должны инициализировать указатели, иначе они указывают на мусор. 'p-> elem', вероятно, не был инициализирован. Более того, я предполагаю, что вы инициализировали свой указатель 'typedef cel * pile'. Также обратите внимание, что вы объявили функцию 'pile_est_vide' для получения в качестве параметра значения. Это намеренно? – nbro
@nbro Свал инициализируется в моей основной функции, но зачем мне инициализировать p-> elem для первой проблемы? Поскольку я проверяю, является ли это 'NULL' или нет –
В C вам нужно делать« все »вручную. Если структура содержит указатель, когда вы создаете переменную этой структуры, ее указатель не инициализируется «NULL», а указывает на некоторую область памяти, которую вы не «владеете». Обычный способ программирования, по крайней мере, то, что я делаю в этих случаях, - это функция, которая инициализирует мою структуру в четко определенном состоянии. – nbro