Автор Тема: Как се прави С таблица  (Прочетена 1980 пъти)

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Как се прави С таблица
« -: Jan 23, 2011, 02:05 »
Здравейте,
    Трябва да направя една таблица - нещо подобно на system calls таблицата в линукс. В този случай ми трябва проста таблица с две колони в която да се слагат pointers и да се обхождат с C функция (предполагам). Някой правил ли е нещо подобно - това си е доста сложно и определено малко опит няма да е излишен. Как по принцип се прави подобно нещо?

Поздрави
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Re: Как се прави С таблица
« Отговор #1 -: 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 } };



Така горе долу изглежда ако знаеш всички указатели предварително и няма да има възмност за динамично добавяне в таблицата. Ако ще има динамично то най-добрее да я реализираш като списък или хеш таблица, вместо като масив :)
« Последна редакция: Jan 23, 2011, 02:41 от task_struct »
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #2 -: Jan 24, 2011, 19:31 »
Да не отварям нова тема

Ползвали ли сте JSON парсер за C?
От кой имате добри впечатления?
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Как се прави С таблица
« Отговор #3 -: Jan 24, 2011, 19:32 »
Как така за С?
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #4 -: Jan 24, 2011, 19:54 »
Виж в http://www.json.org/ има 11 парсера за JSON са за C.
Някой ползвал ли ги е?
Активен

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #5 -: Jan 29, 2011, 19:04 »
Имам един проблем

слезния код не става

Код:
#include <sys/types.h>

#include <stdio.h>

/* Declare functions */
int Address_Search (char Searched_Module);

/* Declare table structure */
struct Modules_Addresses {
char name[30];
unsigned int number;
};


/* Insert data into table structure */
struct Modules_Addresses record[]= {
    {"Module_1", 100},
    {"Module_2", 200},
    {"Module_3", 300},
    {"Module_4", 400},
    {"Module_5", 500}
};

/* Function for searching for module number into address table */
int Address_Search (char Searched_Module) {
        unsigned int Mod_Number;
unsigned int count = 0;

while(record[count].name == Searched_Module) {
    Mod_Number = record[count].number;
break;   
  }
return(Mod_Number);
}

Идеята е извиква се функцията Address_Search като и се дава аргумент "Module_3".
Функцията трябва да намери в таблицата съответстващото число и да го върне.
Обаче при компилация се връща
test.c: In function ‘Address_Search’:
test.c:57: warning: comparison between pointer and integer

Има проблем който не мога да реша.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Как се прави С таблица
« Отговор #6 -: Jan 29, 2011, 19:50 »
WTF!

Да не би да идваш от прекрасния свят на javascript ехех :)  Низове не се сравняват така. Също така, char не е низ, а е 8-битова стойност.
Активен

"Knowledge is power" - France is Bacon

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #7 -: Jan 29, 2011, 20:16 »
За съжаление се занимавам от няма и седмица с програмиране на С а преди това знаех съвсем малко php.
Ако не те затруднявам би ли ми помогнал да напиша както трябва кода.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Как се прави С таблица
« Отговор #8 -: Jan 29, 2011, 20:24 »
Не, това е лоша идея. Някой ден ще трябва да го промениш и тогава пак ли ще ходиш из форумите за помощ. Не мисля че е добра идея да пишеш нещо на език, на които не си разбрал основни неща. Така че по-добре имай търпение, изчети някоя книжка, поиграй си и така.
Активен

"Knowledge is power" - France is Bacon

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #9 -: Jan 29, 2011, 20:35 »
поне къде ми е грешката?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Как се прави С таблица
« Отговор #10 -: Jan 30, 2011, 00:04 »
Нали ти казах - char не е низ, а 8 битова стойност. Гледай на него като на int само дето може да приема стойности от 0 до 255. *char е друго нещо.

char* променливи не се сравняват с ==. Не можеш да ги сравняваш така, реално сравняваш адресите в паметта от които започват двата низа и те няма как да са еднакви.
Активен

"Knowledge is power" - France is Bacon

bvbfan

  • Напреднали
  • *****
  • Публикации: 1056
  • Distribution: KaOS
  • Window Manager: Plasma 5
    • Профил
Re: Как се прави С таблица
« Отговор #11 -: Jan 30, 2011, 00:13 »
Код
GeSHi (C):
  1. #include <sys/types.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. /* Declare functions */
  6. int Address_Search (char *Searched_Module);
  7.  
  8. /* Declare table structure */
  9. typedef
  10. struct Modules_Addresses {
  11. char name[30];
  12. unsigned int number;
  13. };
  14.  
  15. /* Insert data into table structure */
  16. Modules_Addresses record[]= {
  17. {"Module_1", 100},
  18. {"Module_2", 200},
  19. {"Module_3", 300},
  20. {"Module_4", 400},
  21. {"Module_5", 500},
  22. { 0, 0 },
  23. };
  24.  
  25. /* Function for searching for module number into address table */
  26. int Address_Search (char *Searched_Module) {
  27. Modules_Addresses *p_record;
  28.  
  29. if( Searched_Module == NULL ) return 0;
  30.  
  31. for( p_record = record; p_record->name; p_record++) {
  32. if( !strcmp(p_record->name, Searched_Module) )
  33. return p_record->number;
  34. }
  35. return 0;
  36. }
  37.  
Когато обхождаш таблица трябва да знаеш големината й, за да не излезеш от обсега й, за това си слагай нулеви елементи за край или си дефинирай макрос с размера на масива. Цикълът е напълно безсмислен, индексът не се инкрементира, а дори и да се правеше пак никога няма да обходи масива.
« Последна редакция: Jan 30, 2011, 00:16 от bvbfan »
Активен

victim70

  • Напреднали
  • *****
  • Публикации: 454
  • Distribution: Gentoo, Ubuntu
  • Window Manager: Kde Xfce
    • Профил
Re: Как се прави С таблица
« Отговор #12 -: 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;          
        }

Успех
Активен

"Господи, дай ми сила да променя нещата които немога да приема,
дай ми търпение да приема нещата които не мога да променя,
и ми дай мъдрост, да правя разликата между двете"

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Как се прави С таблица
« Отговор #13 -: Jan 30, 2011, 00:22 »
много благодаря
Активен