LINUX.ORG.RU

Наилучшая стратегия обработки ошибок в Си

 


1

4

Нагуглил, что рекомендуют сделать enum и какое-то текстовое представление, которое можно будет получить через коды. В общем, на сколько я понял что-то вроде errno. Но вот в чём вопрос: как лучше сделать, чтобы функция возвращала код ошибки

 MYERROR create_some_thing (SOME_THING **ptr/*other parameters*/);
глобальная переменная
 SOME_THING *create_some_thing (/*other parameters*/);
или указатель в списке параметров функций?
 SOME_THING *create_some_thing (/*other parameters*/, MYERROR* ptr);

Deleted

Последнее исправление: av0r (всего исправлений: 2)

Ответ на: комментарий от monk

Напиши мне не такой жирный вариант такой программы на Си. Обязательно с хранением. Вывод на экран — просто частный случай.

А в чём проблема?

Ну так напиши, если проблемы нет.

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

лет через пять успокоятся, забросят эту поделку, напишут другую. я просто уже дохрена таких «убийц С» видела

Я знаю ты специалист. Пожалуста скажи что думаешь, о языке Vala? В контексте разработки приложений для десктопа. Он ведь транслируется сначала в сишный код, а потом компилируется. Можно ли его считать «удобным» или еще каким С?

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

То есть указатель всегда больше maxerr? В сорцах указан именно kernel pointer, а не просто pointer.

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

Пишут на нём вчершние питонщики, которым надоели тормоза и gil.

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

Для ядра, это кроссплатформенное решение. А для остальных - реализация макросов не кроссплатформенна, сами макросы как APi - вполне.

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

Я знаю ты специалист.

Судя в том что в любой проблеме видит гвоздь, в именно свои конкретные программы со своих конкретных микроконтроллеров, то специалист узкий

vertexua ★★★★★
()
Ответ на: комментарий от Deleted
#include <dirent.h>
#include <stdio.h>

#include <glib.h>

void g_string_free_default(GString* data) {
        g_string_free(data, TRUE);
}

void print_g_string(GString* gstr, gpointer userdata) {
        printf("%s\n", gstr->str);
}

int main(int argc, char* argv[]) {
        if (argc != 2) {
                fprintf(stderr, "Usage %s DIR\n", argv[0]);
                return 1;
        }
        DIR* dir = opendir(argv[1]);
        if (dir==NULL) {
                perror("opendir");
                return 1;
        }

        GPtrArray* array = g_ptr_array_new_with_free_func(
                (GDestroyNotify)g_string_free_default);

        for (struct dirent* ent = readdir(dir); ent != NULL; ent = readdir(dir)) {
                g_ptr_array_add(array, g_string_new(ent->d_name));
        }
        closedir(dir);

        g_ptr_array_foreach(array, (GFunc)print_g_string, NULL);

        g_ptr_array_free(array, TRUE);
        return 0;


}

;) Вот он код на С, в стиле функционального программирования. Шутка конечно.

Но тебе незачет за такой банальный подход, мол вот фичи в языке нету сейчас заставлю кого-то написать короткий код который в это упирается.

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

Что тебя не устраивает в русте? Меня не устраивает то что он переплюнул все вебкиты с хромами и llvm вместе взятые, на бутстрапинг уходит 20+ гигов места на диске что ли. Чем он хуже го, по-твоему? Только лучше.

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

Что тебя не устраивает в русте? Меня не устраивает то что он переплюнул все вебкиты с хромами и llvm вместе взятые, на бутстрапинг уходит 20+ гигов места на диске что ли.

Я совсем не сварщик. Объясни, пожалуйста, подробнее, что ты имеешь в виду?

anonymous
()

Понять и простить.

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

сорри но у вас вектор головного мозга..

пихаете его не думая ни о задаче ни о будущих хотелках, сортировка хотябы.

я к тому что там с файлами должен быть list :D :D :D

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 4)
Ответ на: комментарий от anonymous

То что его бутстрапить накладно и новые версии зачастили. Сыровато всё как-то.

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

сортировка хотябы
я к тому что там с файлами должен быть list

Сортировка vector'а быстрее будет

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

Возвращай структуру с двумя полями: значение и код возврата/ошибки.

Или селектор (есть/нет ошибка) и union (данные; код ошибки). Тогда можно не только код ошибки, но и дополнительные данные возвращать.

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

я к тому что там с файлами должен быть list :D :D :D

Я ожидал такого аргумента. Да, конкретно в этом случае можно было обойтись и листом. Но я могу и натянуть такую задачу, где random-access будет важен.

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

пихаете его не думая ни о задаче ни о будущих хотелках, сортировка хотябы.

Ага, большинство быстрых алгоритмов требуют случайного доступа, именно поэтому мы будем использовать структуру, которая не поддерживает случайный доступ. Да и вообще, вектор эффективнее во многих случаях.

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

Но тебе незачет за такой банальный подход, мол вот фичи в языке нету сейчас заставлю кого-то написать короткий код который в это упирается.

Мне было лениво :)

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

Думаешь, push_back делает какую-то магию?

Разумеется, нет. Просто он делает то, что придётся писать на Си в стиле «закат солнца вручную», если не использовать сторонние библиотеки.

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

Я олдфаг, последний раз писал что-то на glib лет 7 назад. За всем не уследишь. Хорошо что auto добавили

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

Вы не поняли. Ответ был на это:

незачет за такой банальный подход

В силу того, что я понимал, кому отвечаю, мне было лень запариваться с хорошей задачкой. Поэтому я и написал в качестве примера первое, что пришло в голову.

Deleted
()

А char * my_strerror(MYERROR err) сделать не судьба? Тебе же всё равно где-то текст писать надо, вот и напиши

char * my_strerror(MYERROR err)
{
    switch(err)
    {
         case ERR_OK: return "Everything is OK";
         case ERRNO_1: return "Error 1, something wrong";
         case ERRNO_2: return "Error 2, another thing broken";
...
         case ERRNO_N: return "Everything wrong! We all die!!!!1111";
         default: break;
    }
    return "Unknown error!";
}

Ваще thread-safe, никаких побочных эффектов и т.д. Можно printf(«Error %d: %s», err, my_strerr(err)) и т.п.

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

Напиши мне не такой жирный вариант такой программы на Си. Обязательно с хранением.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

#include "list.h"

struct dnode
{
	struct list_head list;
	char *name;
};

int main(int argc, char* argv[])
{
	struct list_head dnlist;
	struct dnode *dn, *n;
	struct dirent *entry;

	if (argc != 2) {
		fprintf(stderr, "Usage: %s DIR\n", argv[0]);
		return 1;
	}

	DIR *dir = opendir(argv[1]);
	if (dir == NULL) {
		perror("opendir");
		return 1;
	}

	INIT_LIST_HEAD(&dnlist);
	while ((entry = readdir(dir)) != NULL) {
		dn = (struct dnode*)malloc(sizeof(struct dnode));
		if (!dn)
			break;
		dn->name = strdup(entry->d_name);
		if (!dn->name)
			break;
		list_add_tail(&dn->list, &dnlist);
	}

	list_for_each_entry_safe(dn, n, &dnlist, list) {
		printf("%s\n", dn->name);

		list_del(&dn->list);
		free(dn->name);
		free(dn);
	}

	closedir(dir);
	return 0;
}

http://www.mcs.anl.gov/~kazutomo/list/list.h

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

1. linked list вместо вектора — незачёт. Что там с random-access?

2. Да, действительно, мой код на плюсах выглядит жирнее, чем вот это вот

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

linked list вместо вектора — незачёт. Что там с random-access?

Где в твоём варианте random-access? Ты просил аналог своего кода — тебе дали аналоги твоего кода.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Согласен, я сам протупил с постановкой задачи.

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

1.2.

код на С понятней, помесь С и С++ - нечитаемый кал - даже в твоем коротком примере ты забыл dir закрыть. Qt используй.

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

даже в твоем коротком примере ты забыл dir закрыть

А что, его нужно как-то ещё закрывать, кроме closedir, который у меня сразу после цикла?

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

closedir, который у меня сразу после цикла?

да-да, я не заметил, что в общем и подтверждает - код нечитаемый даже из 20 строк.

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

Посмотри, какие там зарплаты и тулы у тех же гошников, и опечалься. У сишников до CLion вообще нормальной IDE не было, писали в блокноте^W^W виме, а многие так и до сих пор.

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

Просто он делает то, что придётся писать на Си в стиле «закат солнца вручную», если не использовать сторонние библиотеки.

То есть язык тем лучше, чем больше библиотек перечислено в стандарте? От того, что STL описана в стандарте, она не перестала быть сторонней библиотекой. Более того, наличие STL в стандарте затрудняет взаимодействие с Qt, VTK и прочими библиотеками (ну как быстро преобразовать vector<string> в vtkStringArray?).

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

Читайте ветку, в которую влезаете.

на плюсах аналогичный код просто станет жирнее и немного медленнее
да напиши два варианта любой программы: на чистом С и на плюсах - и сравнивай

snippet

Где здесь хоть слово о «хороший язык»/«плохой язык»?

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

Эта считалочка натурально заставляет мою систему течь

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

где - «там»? и да, я не публикую зарплату, я не хочу вас опечаливать.

я действительно могу код писать хоть в nano. мне особо и не нужна IDE, хотя обычно юзаю CodeBlocks: он лёгкий и в нём есть всё необходимое, плюс можно ещё плагины писать. CLion - какое-то проприетарное ненужно.

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