Нарушение сегмента, согласившись, я выделяюсь

Хорошие. Моя цель состоит в том, чтобы строить array структур, которые связывают мне команду с указателем с функцией, для чего я определил структуру следующего способа:

typedef struct function_pointers_array
{
    unsigned char * command_code;
    unsigned char * (*function_pointer)(unsigned char *, int);
} function_pointers_array_t;

И я инициализирую array, как останься:

function_pointers_array_t f_ptr_array[] = {
    { "0601", cpuUnitStatusRead },
    /*{...},
    {...},
    ...*/
};

Мое сомнение и проблема, которые у меня есть, - porqué, когда я делаю следующее, я получаю нарушение сегмента:

if (strcmp (f_ptr_array[i].command_code, cmd_code) == 0) //segmentation fault

Будучи cmd_code типа static unsigned char. Проблема, как я подтвердил, будь в f_ptr_array[i].command_code, что есть проблематичного в этом?

Большое спасибо заранее.


В ответе в @eferion:

#include <stdio.h>

unsigned char * cpuUnitStatusRead();
unsigned char * memoryAreaRead();

typedef struct function_pointers_array
{
    unsigned char * command_code;
    unsigned char * (*function_pointer)(unsigned char *, int);
} function_pointers_array_t;

function_pointers_array_t f_ptr_array[] = {
    { "0601", cpuUnitStatusRead },
    { "0101", memoryAreaRead },
};

int main()
{
    int i;
    char cmd_code[]="0601";

    for (i=0; i<2; i++)
    {
        if (strcmp (f_ptr_array[i].command_code, cmd_code) == 0)
        {
            printf("\nOk");
        }
    }

}

unsigned char * cpuUnitStatusRead()
{
    //
}

unsigned char * memoryAreaRead()
{
    //
}
0
задан 28.12.2016, 10:48
0 ответов

Это должен бы быть комментарий, но он не является реальным делать это как таковым из-за Вашего расширения и контента.

memcpy(cmd_code, command+offset, 2);

Здесь у нас есть проблема, который мы не знаем, что он содержит command ни offset. Все же мы поймем, что - все добро.

Ощутись конечно, что ты копируешь два байт, что, конечно, не включает байт завершения цепи. Эта деталь важна, потому что здесь:

strcmp (f_ptr_array[i].command_code, cmd_code)

Ты сравниваешь две цепи с strcmp. Эта функция сравнивает байт до тех пор, пока он не находит различие или недействительный символ. В твоем случае у одной из двух цепей только есть 2 распределенных байт и испытай недостаток завершающего в цепи.

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

2
ответ дан 03.12.2019, 17:58
  • 1
    Согласен. Я реализовал pequeñ или программа, готовая выполнять (доступный в изданном вопросе), что кажется, что он не дает ningú n проблема, однако мой có я говорю, что он не отличается в é ste и проблема сохраняется из-за má s, что ты удалил цикл или согласился на элемент 0 из array. Seguiré пытаясь, большое спасибо из-за помощи –  28.12.2016, 10:52
  • 2
    С другой стороны tambié n комментировать, что я распределил стоимость cmd_code вручную в этом случае, так как в моем có я говорю, что он это получает от цепи, полученной socket. Однако, я подтвердил, что правильна Ваша стоимость и не влияет на проблему –  28.12.2016, 11:05
  • 3
    Если проблема сохраняется возможно, проистеките, в который ошибка не está где tú ты веришь. Ahí está изящество помещения примера mí nimo, что воспроизвел проблему . Вещь - dó nde разбей aplicació n и другая источник проблемы... Они не имеют из-за qué быть той же вещью –  28.12.2016, 13:55
  • 4
    Это - то, что кажется... Записывается recomendació n для будущего –  28.12.2016, 19:53

Здесь ты можешь подтверждать это: http://rextester.com/PIF91009

Независимо от типа параметров единственным, что ты должен показывать с указателя до функции, является тип возвращенной стоимости, в твоем случае:

unsigned char * (*funcion)();

Хотя я не вижу, что твоя функция не возвратила никакого указателя.

#include  <stdio.h>

unsigned char a = 'A';
unsigned char b = 'B';

static unsigned char *foo1()
{
    return &a;
}

static unsigned char *foo2(int p1, int p2)
{
    return &b;
}


typedef struct mystruct
{
    int id;
    unsigned char * (*funcion)(); 
} pfunction;    

int main(void)
{    
    pfunction s []  = {{12, &foo1, "n1"},{13, &foo2, "n2"}};

    printf ("El array s tiene %d elementos\n", sizeof(s) / sizeof(pfunction));

    unsigned char *a1 = s[0].funcion();
    printf ("foo1() = %c   nombre = %s\n", *a1, s[0].nombre);

    unsigned char *b1 = s[1].funcion(10,20);
    printf ("foo2() = %c   nombre = %s\n", *b1, s[1].nombre);
}

Результат:

El array s tiene 2 elementos 
foo1() = A   nombre = n1 
foo2() = B   nombre = n2

Если ты сосредотачиваешься на этом примере, foo1 и foo2 у них есть различные параметры, но в твой указатель это не имеет значения для него. Ему достаточно знать, что это указатель в функцию, которую возвращает один unsigned char*

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

pfunction s []  = {{12, &foo1},{13, &foo2}};

Я надеюсь, что это подает тебя.

И, если он служит тебе помощью, я оставляю тебе ссылку в класс в c#, чтобы присоединять с PLC, который я считаю напечатанным в CodeProject.

0
ответ дан 03.12.2019, 17:58
  • 1
    Спасибо за вклад. Имея этот có я говорю в счете, что он кажется, что ничего нет erró neo в моем có я говорю. Моя проблема действительно está когда я пробую соглашаться, в которое в этом случае serí в (используя í ndice любой) s[0].id –  28.12.2016, 11:13
  • 2
    Ты используешь этот цикл for (i=0; i<2; i++)? Или только он для примера? –  28.12.2016, 11:57
  • 3
    Из-за которого, если ты прикрепляешь твой код в rextester, функционируй правильно. –  28.12.2016, 11:59
  • 4
    Я думаю, что ты был бы должен печатать реальный код, assignacion указателей и цикл, что ты используешь pafa сравнение. –  28.12.2016, 19:51
  • 5
    Я только что встретил проблемы, vení в другого места несмотря на то, что ejecució n detení в ahí. Действительно có я говорю о примере, что он правилен –  28.12.2016, 19:58

Теги

Похожие вопросы