Титла: Как се прави С таблица Публикувано от: rcbandit в Jan 23, 2011, 02:05 Здравейте,
Трябва да направя една таблица - нещо подобно на system calls таблицата в линукс. В този случай ми трябва проста таблица с две колони в която да се слагат pointers и да се обхождат с C функция (предполагам). Някой правил ли е нещо подобно - това си е доста сложно и определено малко опит няма да е излишен. Как по принцип се прави подобно нещо? Поздрави Титла: Re: Как се прави С таблица Публикувано от: task_struct в Jan 23, 2011, 02:32 В едната колона са указателите, а в другата какво искаш да има?
В общи линии ти трябва нещо такова: struct table_row { return_type (*function_name)(arguments...); type second_column; } Някъде си декларираш таблицата( най-често глобална и константна ): static const struct table_row table_name[SIZE]; П.П. За по-четим код, може да изпозлваш typedef :) П.П.П Пример: struct table_row { void (*system_call)( int a, int b ); unsigned int uid; } и имаш функции от типа: void func_name1( int a, int b ); void func_name2( int a, int b ); .... void func_name3( int a, int b ); static const struct table_row table_name[SIZE] = { { &func_nam1, 0 }, { &func_name2, 1 }, ..., { &func_nameN, N } }; Така горе долу изглежда ако знаеш всички указатели предварително и няма да има възмност за динамично добавяне в таблицата. Ако ще има динамично то най-добрее да я реализираш като списък или хеш таблица, вместо като масив :) Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 24, 2011, 19:31 Да не отварям нова тема
Ползвали ли сте JSON парсер за C? От кой имате добри впечатления? Титла: Re: Как се прави С таблица Публикувано от: b2l в Jan 24, 2011, 19:32 Как така за С?
Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 24, 2011, 19:54 Виж в http://www.json.org/ има 11 парсера за JSON са за C.
Някой ползвал ли ги е? Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 29, 2011, 19:04 Имам един проблем
слезния код не става Код: #include <sys/types.h> Идеята е извиква се функцията Address_Search като и се дава аргумент "Module_3". Функцията трябва да намери в таблицата съответстващото число и да го върне. Обаче при компилация се връща test.c: In function ‘Address_Search’: test.c:57: warning: comparison between pointer and integer Има проблем който не мога да реша. Титла: Re: Как се прави С таблица Публикувано от: gat3way в Jan 29, 2011, 19:50 WTF!
Да не би да идваш от прекрасния свят на javascript ехех :) Низове не се сравняват така. Също така, char не е низ, а е 8-битова стойност. Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 29, 2011, 20:16 За съжаление се занимавам от няма и седмица с програмиране на С а преди това знаех съвсем малко php.
Ако не те затруднявам би ли ми помогнал да напиша както трябва кода. Титла: Re: Как се прави С таблица Публикувано от: gat3way в Jan 29, 2011, 20:24 Не, това е лоша идея. Някой ден ще трябва да го промениш и тогава пак ли ще ходиш из форумите за помощ. Не мисля че е добра идея да пишеш нещо на език, на които не си разбрал основни неща. Така че по-добре имай търпение, изчети някоя книжка, поиграй си и така.
Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 29, 2011, 20:35 поне къде ми е грешката?
Титла: Re: Как се прави С таблица Публикувано от: gat3way в Jan 30, 2011, 00:04 Нали ти казах - char не е низ, а 8 битова стойност. Гледай на него като на int само дето може да приема стойности от 0 до 255. *char е друго нещо.
char* променливи не се сравняват с ==. Не можеш да ги сравняваш така, реално сравняваш адресите в паметта от които започват двата низа и те няма как да са еднакви. Титла: Re: Как се прави С таблица Публикувано от: bvbfan в Jan 30, 2011, 00:13 Код Когато обхождаш таблица трябва да знаеш големината й, за да не излезеш от обсега й, за това си слагай нулеви елементи за край или си дефинирай макрос с размера на масива. Цикълът е напълно безсмислен, индексът не се инкрементира, а дори и да се правеше пак никога няма да обходи масива. Титла: Re: Как се прави С таблица Публикувано от: victim70 в Jan 30, 2011, 00:21 Пробвай да сравняваш с strcmp функцията двата низа.
Друга грешка е че последната стойност на низа в записите трябва да е NULL ..... {"Module_4", 400}, {"Module_5", 500}, {NULL,0} ..... Проверявай я и давай изход ако си стигнал до нея че при грешен вход ще ти дъмпне програмата. увеличявай с единица в цикъла count while(!strcmp(record[count].name ,Searched_Module) { ..... проверка за NULL с изход ..... Mod_Number = record[count].number; count++; break; } Успех Титла: Re: Как се прави С таблица Публикувано от: rcbandit в Jan 30, 2011, 00:22 много благодаря
|