0

私は RPN 電卓のコードを作成しました。基本的な演算子 (+、*、/、^) だけでなく、浮動小数点数と負数でも問題なく動作します。また、 (x^2 + x*4/-2) : 1 -> 5 :0.5 のような式も評価します (x は 1 から 5 まで、0.5 のステップで評価されます)。

char スタックを使用しました。

ここで、cos(x)、tan(x) などの関数のサポートを追加したいと考えています。その目的を達成するには、解析後に sin、cos、sqrt などの単語を格納するchar* スタックを構築する必要があります。

問題は、スタックを初期化するときに、「アクセス違反: アドレス 0x01 の書き込み」エラーが発生することです。

正確な理由はわかりません。malloc() の使用でしょうか?

これらは、スタックを使用するための関数です。

typedef struct nodo{
    char *operador;
    struct nodo *next;
}tipo;

typedef tipo *elemento;
typedef tipo *top;

int push(top*,char*) ;
void init(top *);
void libera(top*);
char* pop(top*);


int main(){
    (...)
    top op;
    init(&op);
    (...)
}


void init(top *pila) {
    *pila = malloc(sizeof(**pila));
    (*pila)->operador = NULL;
    (*pila)->next = NULL;
}

void libera(top *pila) {
    free(*pila);
    *pila = NULL;
}


int push (top *last,char *dato){
    elemento new1;
    int j=strlen(dato);
    new1 = (elemento)malloc(sizeof(tipo));
    strncpy(new1->operador, dato,j);
    new1->next=*last;
    *last=new1;
;}


char* pop(top *last){
    elemento aux;
    char* caract;
    aux = (elemento)malloc(sizeof(tipo));
    aux=*last;
    if (!aux)
        return 0;
    *last=aux->next;
    strcpy(caract,aux->operador);
    free(aux);
    return caract;
}
4

2 に答える 2

0

変化する...

*pila = malloc(sizeof(**pila));

に...

*pila = malloc(sizeof(tipo));
于 2014-07-24T03:06:21.143 に答える
0

これはバグです (2 つの異なる点で):

new1 = (elemento)malloc(sizeof(tipo));
strncpy(new1->operador, dato,j);

指定したstrncpyバッファ サイズが十分に大きくないため、 は文字列を生成しません (つまり、ヌル ターミネータを配置しません)。3 番目の引数は、入力の長さではなく、出力バッファーのサイズです。

さらに、new1->operador初期化されていないポインタです。そのためのスペースを割り当てませんでした。

これを修正するには、おそらく次のようにします。

init(&new1);
new1->operador = malloc( strlen(dato) + 1 );
strcpy(new1->operador, dato);

ここに別のバグがあります:

aux = (elemento)malloc(sizeof(tipo));
aux=*last;

auxここではポインタです(ポインタ型定義を使用したため、変装しています)。2行目は、が指している場所*lastを指すようにし、メモリをリークします。おそらく、 が指すデータを が指す*lastスペースにコピーしたいと思うでしょうaux

*aux = **last;

しかし、別のバグがあります:

strcpy(caract,aux->operador);

あなたはcaractまだどこにも主張していません。


コードの他の場所にバグがある可能性があります。今のところこれらに気づきました。すべてのポインター typedef のために、コードを読むのは非常に困難です。ポインターの型定義を取り除くと役立ちます。

一度に多くのコードを書かないことをお勧めします。1 つの関数を作成し、それを徹底的にテストして、それが機能していることを確認したら、次の関数に進みます。

于 2014-07-24T03:22:16.643 に答える