LINUX.ORG.RU

Не работает push() в стеке

 ,


1

1

Привет. Стек через массив. Не работает push(), скорее я где-то накосячил.
Должно в стеке в итоге быть 0 .. 9, а там фигня.

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

void push(int *stack, int *sp, int x);
int pop(int *stack, int *sp);

int main() {
	int *stack = malloc(sizeof(int) * SIZE);
	int *sp = stack;


	for (int i = 0; i < SIZE; i++)
		push(stack, sp, i);

	for (int i = 0; i < SIZE; i++)
		printf("%i\n", stack[i]);

	free(stack);

	return 0;
}


int pop(int *stack, int *sp) {
	return stack[*sp--];
}


void push(int *stack, int *sp, int x) {
	stack[*sp++] = x;
}

В чем ошибка?



Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от alexku

Избавь людей от глупости. Создай единый API для всего.

Я не говорил об едином API. Я говорил об едином подходе. И он есть.

То, что ты про них только слышал, это я уже понял.

Я их активно использую. Проверка предусловий лежит на вызывающей стороне. Можно проверить, да. Но это зависит уже от особенностей проекта.

anonymous
()
Ответ на: комментарий от alexku

да что-ж такое то...теперь вот и вас :-) наверное это заразно

  if(!val || stack.current == stack.begin)
    return 0;
теперь верхушку стека нельзя просто взять и выкинуть, хотя это частая операция со стеками. Обязательно придётся подсовывать валидный указатель.

ps/ критично посмотрите на эту реализацию с точки зрения «потребителя». Где и как её можно использовать и какой от этого профит.

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Я не говорил об едином API. Я говорил об едином подходе. И он есть.

Только куцый он какой-то. Какие-то функции возвращают код ошибки, какие-то значение, какие-то указатели, причём разных типов, а какие-то вообще ничего. Какие-то ещё errno выставляют, а какие-то нет. Единым подход был бы, если бы все функции возвращали однотипные значения, например код ошибки. И ни каких тебе errno. А все значения возвращались бы через параметры-указатели. А так просто зоопарк какой-то.

В общем, API, в первую очередь, должен быть понятен. Собственно, мои push() и pop() кроме да/нет никаких дополнительных кодов в errno, например, не выставляют. От того и код возврата такой: 1(true)/0(false). Логично? По-моему, да. И код легко читается.

Я их активно использую. Проверка предусловий лежит на вызывающей стороне. Можно проверить, да. Но это зависит уже от особенностей проекта.

Молодец. Только эксплоиты к дырам в ПО строятся и на передаче некорректных параметров. То есть, нет гарантии, что код, который ты пишешь, защищён от атак извне. И, следовательно, создание кода для работы с конфиденциальной информацией или отказоустойчивый 24/7 код тебе доверять нельзя.

alexku
()
Ответ на: комментарий от alexku

То есть, нет гарантии, что код, который ты пишешь, защищён от атак извне.

Этот код демонстрирует способ реализации стека на массивах. О каких атаках речь?

И, следовательно, создание кода для работы с конфиденциальной информацией или отказоустойчивый 24/7 код тебе доверять нельзя.

Я же написал, что все зависит от проекта. В некоторых случаях проверки нужны.

anonymous
()
Ответ на: комментарий от anonymous

Этот код демонстрирует способ реализации стека на массивах. О каких атаках речь?

Я не об этом конкретном коде, который не без проблем по этой же причине, я об общем подходе, обозначенном здесь

Проверка предусловий лежит на вызывающей стороне. Можно проверить, да. Но это зависит уже от особенностей проекта.

--

Я же написал, что все зависит от проекта. В некоторых случаях проверки нужны.

То есть, написанный однажды код для одного проекта без проверок, в случае использования в другом, где проверки нужны, придётся переписать. Не проще сразу нормально сделать? Чтобы потом геморроя меньше было?

alexku
()
Ответ на: комментарий от alexku

Развели тут... Оба накосячили немного и придираетесь.

А ТСу уже пофиг, как я понимаю=)

forCe
()
Ответ на: комментарий от alexku

Так лучше?

немного..

скажи, много ли алгоритмов/use-case где бывает stack underflow (stack.current == stack.begin),чем она вызывается, кто может это предусмотреть и как-то исправить? Зачем там вкомпилённое, неоптимизирующееся условие.

ps/ прототип bool pop(stack *,ret *) ужасен.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.