2016-04-07 31 views
-1

Bu çok aptalca bir soru, bunun için üzgünüm, ama hiçbir şey için çok fazla zaman kaybettim :(. Dinamik diziyle ilgili bir sorun olduğunu biliyorum, ancak bir neden göremiyorum. çalışması. Thats hata biliyorumDinamik dizilerle ilgili sorun

#include <stdio.h> 
#include "Header.h" 
#include <stdlib.h> 
#include <iostream> 


typedef struct Stack{ 
    T* arr; 
    int num; 
    int size; 
}Stack; 

typedef struct Iterator { 
    Stack* stack; 
}Iterator; 

void initStackBitch(Stack* S) { 
    S->size = 25; 
    S->arr = (T*)(S->size * sizeof(*(S->arr))); 
    S->num = 0; 
} 

void ReinitStack(Stack* S) { 
    S->size = S->size * 2; 
    S->arr = (T*)realloc(S->arr, S->size * sizeof(*(S->arr))); 
} 

void push(Stack* S, T Element) { 
    if (IsStackFull(S)) { 
     ReinitStack(S); 
     cout << "Stack is remade"; 
    } 
    else { 
     S->arr[S->num] = Element; 
     S->num++; 
    } 
} 

T pop(Stack* S) { 
    if (IsStackEmpty(S)) { 
     printf("Stack is Empty"); 
     exit(2); 
    } 
    else { 
     S->num--; 
     return S->arr[S->num + 1]; 
    } 
} 

int IsStackFull(Stack* S) { 
    if (S->num == S->size) { 
     return 1; 
    } 
    else return 0; 
} 

int IsStackEmpty(Stack* S) { 
    if (S->num == 0) { 
     return 1; 
    } 
    else return 0; 
} 

Iterator* CreateIterator(Stack* S) { 
    Iterator* iterator = (Iterator*)malloc(sizeof(Iterator)); 
    iterator->stack = S; 
    return iterator; 
} 

bool HaveNext(Iterator* iterator) { 
    return iterator->stack->num != iterator->stack->size; 
} 

void GoNext(Iterator* iterator) { 
    if (HaveNext(iterator)) { 
     iterator->stack->arr = iterator->stack->arr + 1; 
    } 
    return; 
} 

void* GetValue(Iterator* iterator) { 
    if (HaveNext(iterator)) { 
     return iterator->stack->arr; 
    } 
    else exit(-1); 
} 

void PrintStack(Stack* stack) { 
    for (Iterator* iterator = CreateIterator(stack); HaveNext(iterator); GoNext(iterator)) { 
     cout << GetValue(iterator) << endl; 
    } 
} 

int main() { 
    Stack S; 
    initStackBitch(&S); 
    push(&S, 1); 
    push(&S, 2); 
    push(&S, 3); 
    pop(&S); 
    PrintStack(&S); 
    _fgetchar(); 
} 

Sen initialize içinde arr için bellek ayrılamadı gerekir

+1

Peki, bir soru sormadınız ... Sorununuzu açıklar mısınız? – jhamon

+0

Maalesef, Nedeni istisna: Kayıt için erişim ihlali. C-> uygulama 0x1110176 idi. – JediCoder

+0

Başlatmada yığın için bellek ayırmanız gerekmiyor mu? –

cevap

0

itme içindedir. sonra itin çökmesine neden ayrılmamış (tanımsız) belleğe itmek için çalışacağız, initialize. Yani hata basılmadı:

void initStackBitch(Stack* S) { 
    S->size = 25; 
    S->arr = (T*)malloc(S->size * sizeof(*(S->arr))); 
    S->num = 0; 
} 
+0

Aslında orijinal kodda garip bir yazım hatası gibi görünüyor, sanki metin editöründe "malloc" sözcüğü vardı ve yanlışlıkla bir anahtara çarpmış gibi. – Lundin

+0

: Sanırım ikiniz de haklısınız. Bunu nasıl görmedim, bilmiyorum – JediCoder

+0

@Lundin, ben de çözüm girdiğimde ve sadece "malloc" kelimesini eklemek zorunda kaldım diye düşündüm. Ve sonra döküm, derleyiciden gelen tüm hata mesajlarını bastırır –