私には2つの大きな問題があります。 マイコードはように構造体で作られた「要素」のスタック(積み重ね)、である。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
----編集:
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