Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: rcbandit в Jan 23, 2011, 02:05



Титла: Как се прави С таблица
Публикувано от: 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>

#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

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


Титла: 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
Код
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.  
Когато обхождаш таблица трябва да знаеш големината й, за да не излезеш от обсега й, за това си слагай нулеви елементи за край или си дефинирай макрос с размера на масива. Цикълът е напълно безсмислен, индексът не се инкрементира, а дори и да се правеше пак никога няма да обходи масива.


Титла: 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
много благодаря