• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stos dynamiczny.

Object Storage Arubacloud
0 głosów
483 wizyt
pytanie zadane 6 listopada 2015 w Inne języki przez Mateep Użytkownik (850 p.)

Mam dynamiczny stos i nie mam pojęcia czemu on nie działa :( siedziałem nad nim już trochę i nie mogę znaleźć błędu. Proszę o pomoc. z góry bardzo dziękuję :)

Stack.c

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

static int top; /* pierwsze wolne miejsce na stosie */
static int size;

void init(int *s)
{
	top=0;
	size=0;
	s=0;
}

void finalize(int *s)
{
  free(s);
}

void clear(int *s)
{
	top=0;
}

void push(int *s,int a)
{
	if(top>=size)
	{
	  int newsize=(size+1)*2;
	  int* ns=(int*)realloc(s,newsize*sizeof(int));
	  if(ns)
	    s=ns;
	  else
	  {
	    free(s);
	    abort();
	  }
	  fprintf(stderr,"Rozmiar stosu %d -> %d\n",size,newsize);
	  size=newsize;
	}
	s[top++]=a;
}

int pop(int *s)
{
	assert(top>0);
	return s[--top];
}

stack.h

void push(int *s,int a);
int pop(int *s);
void clear(int *s);
void init(int *s);
void finalize(int *s);

teststack.c

#include <stdio.h>
#include "stack.h"

int main()
{

int *s1;
        init(s1);
	push(s1,1);
	push(s1,2);
	push(s1,3);
	printf("%d %d\n",pop(s1),pop(s1));
	printf("%d\n",pop(s1));
	finalize(s1);
	return 0;
}

Makefile:

teststack: teststack.o stack.o
    gcc -Wall $^ -o $@

stack.o: stack.c stack.h
    gcc -c -Wall $< -o $@

teststack.o: teststack.c stack.h
    gcc -c -Wall $< -o $@

.PHONY: clean

clean:
    -rm stack.o teststack.o teststack

1 odpowiedź

0 głosów
odpowiedź 6 listopada 2015 przez furas Maniak (53,800 p.)
wybrane 6 listopada 2015 przez Mateep
 
Najlepsza
Co znaczy "nie działa" ? Czym to się objawia ? Nie kompiluje się ? To podaj komunikaty o błędach podane podczas kompilacji. Nie wykonuje tego co trzeba ?  To podaj danej jakie wprowadzasz, jakie dane powinny być na końcu oraz jakie ty otrzymujesz.

---

Jeśli jest problem to można użyc debugera. A jak nie potrafisz korzystać z debugera to przynajmniej powstawiaj w wielu miejscach wypisywanie zawartości zmiennych oraz co właśnie się wykonuje aby móc zaobserwować co się dzieje podczas wykonywania programu. Wten sposób może dojdziesz gdzie i kiedy kod wykonuje nie to co powinien.
komentarz 6 listopada 2015 przez Mateep Użytkownik (850 p.)
wyskakuje problem z pamięcią. a właściwie jej naruszenie. kwestia jest taka , że zrobiłem ten program ze zmienną globalną i działało pięknie. ale jak chce , żeby do funkcji był przekazywany wskźnik na moją tablicę to już nie wiem czemu jest naruszenie pamići
komentarz 6 listopada 2015 przez furas Maniak (53,800 p.)
U mnie pojawiają się dwa problemy

1. realloc nie chce mi działać gdy niezaalokowałem pamięci przez malloc (choć według dokumentacji powinno to działać)

2. w init() jest złe przekazywaniem wskaźnika na stos.
Aby było dobrze to albo muszę przez return zwracaj int* albo muszę przekazuj do funkcji wskaźnik na wskaźnik czyli int** aby zapisywał w poprawnej lokacji (bo inaczej nie zapisuje w zmiennej `s1` ale w miejscu wskazywanym przez adres w `s1`
komentarz 6 listopada 2015 przez furas Maniak (53,800 p.)

Wersja jeden - return

 

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h> 

static int top; /* pierwsze wolne miejsce na stosie */
static int size;
 
int* init()
{
    top = 0;
    size = 2;
    return (int*)malloc(size*sizeof(int));
}
 
void finalize(int *s)
{
    free(s);
}
 
void clear(int *s)
{
    top = 0;
}
 
void push(int *s,int a)
{
    if(top>=size)
    {
      int newsize = (size+1)*2;
      int* ns = (int*)realloc(s, newsize*sizeof(int));
      if(ns)
        s = ns;
      else
      {
        free(s);
        abort();
      }
      fprintf(stderr,"Rozmiar stosu %d -> %d\n",size,newsize);
      size=newsize;
    }
    s[top++]=a;
}
 
int pop(int *s)
{
    assert(top>0);
    return s[--top];
}

int main()
{
    int *s1;
    s1 = init();

    push(s1,1);
    push(s1,2);
    push(s1,3);
    
    //~ printf("%d %d\n",pop(s1));//,pop(s1));
    printf("%d\n",pop(s1));
    printf("%d\n",pop(s1));
    printf("%d\n",pop(s1));
    
    finalize(s1);
    
    return 0;
}

Wersja dwa - int**

 

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h> 

static int top; /* pierwsze wolne miejsce na stosie */
static int size;
 
void init(int** s)
{
    top = 0;
    size = 2;
    *s = (int*)malloc(size*sizeof(int));
}
 
void finalize(int *s)
{
    free(s);
}
 
void clear(int *s)
{
    top = 0;
}
 
void push(int *s,int a)
{
    if(top>=size)
    {
      int newsize = (size+1)*2;
      int* ns = (int*)realloc(s, newsize*sizeof(int));
      if(ns)
        s = ns;
      else
      {
        free(s);
        abort();
      }
      fprintf(stderr,"Rozmiar stosu %d -> %d\n",size,newsize);
      size=newsize;
    }
    s[top++]=a;
}
 
int pop(int *s)
{
    assert(top>0);
    return s[--top];
}

int main()
{
    int* s1;
    init(&s1);
    
    push(s1,1);
    push(s1,2);
    push(s1,3);
    
    //~ printf("%d %d\n",pop(s1));//,pop(s1));
    printf("%d\n",pop(s1));
    printf("%d\n",pop(s1));
    printf("%d\n",pop(s1));
    
    finalize(s1);
    
    return 0;
}

 

komentarz 6 listopada 2015 przez Mateep Użytkownik (850 p.)
Dzięki wielkie :) ale tego z tym, że nie działa realloc bez malloca nie rozumiem , bo ten sam program na zmiennej globalnej działał bez malloca :) no ni ale bede na przyszłość pamiętał o tym mallocu :) Wielkie dzięki!
komentarz 6 listopada 2015 przez furas Maniak (53,800 p.)
Wyczytałem w dokumentacji, że realloc powinien działać bez malloc - ale może to tylko sprawa innego kompilatora lub innego standardu C/C++.

Z drugiej jednak strony nazwę `realloc` właściwie można by rozumieć "zmień zarezerwację pamięci czyli wcześniej ta rzecz musiała być zarezerwowana".

Podobne pytania

0 głosów
2 odpowiedzi 617 wizyt
pytanie zadane 25 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)
0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (700 p.)
0 głosów
2 odpowiedzi 1,306 wizyt
pytanie zadane 20 maja 2019 w SPOJ przez kodowiec Początkujący (410 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...