Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在主代码中弹出链表的第一个元素(char),但我不能将该部分代码放入函数中_C_Atmega - Fatal编程技术网

我可以在主代码中弹出链表的第一个元素(char),但我不能将该部分代码放入函数中

我可以在主代码中弹出链表的第一个元素(char),但我不能将该部分代码放入函数中,c,atmega,C,Atmega,我正在处理字符的链表,我需要创建一个函数来弹出链表的第一个元素,即:删除第一个节点,释放空间并返回保存在第一个节点中的字符 我在程序的主函数中创建了一个完美的代码,但当我将这部分代码放入函数中时,它就停止工作了,我不知道为什么 我正在使用ATmega328p,想法是将字符发送到计算机(我使用minicom作为终端仿真器),因此函数USART_Transmit_char()将字符发送到计算机 与主函数中的pop完美配合的主函数中的代码如下: int main(void) { //U

我正在处理字符的链表,我需要创建一个函数来弹出链表的第一个元素,即:删除第一个节点,释放空间并返回保存在第一个节点中的字符

我在程序的主函数中创建了一个完美的代码,但当我将这部分代码放入函数中时,它就停止工作了,我不知道为什么

我正在使用ATmega328p,想法是将字符发送到计算机(我使用minicom作为终端仿真器),因此函数USART_Transmit_char()将字符发送到计算机

与主函数中的pop完美配合的主函数中的代码如下:

int main(void)
{
        //USART CONFIGURATION
        struct USART_configuration config_57600_8N1 = {57600, 8,1,'n'};
        USART_Init(config_57600_8N1);
        //END USART CONFIGURATION

        //CEATES THE FIRST NODE OF LINKED LIST
        node_char * string = NULL;
        string = malloc(sizeof(node_char));
        string->val = 'H';
        string->next = NULL;

        //ADD ELEMENTS TO LINKED LIST
        push(string,'O');
        push(string,'L');
        push(string,'A');

        //COMMUNICATION WITH COMPUTER
        USART_Transmit_String("I received this line: ");
        USART_Transmit_char(string->val);
        USART_Transmit_char(string->next->val);
        USART_Transmit_char(string->next->next->val);
        USART_Transmit_char(string->next->next->next->val);
        USART_Transmit_String(".\r\n\r\n");

        //HERE I POP THE FIRST ELEMENT
        node_char * next_node = NULL;
        char popped = string->val;
        next_node = string->next;
        free(string);
        string = next_node;
        //HERE THE FIRST ELEMENT HAS BEEN POPPED

        //COMMUNICATION WITH COMPUTER        
        USART_Transmit_String("I popped this char: ");
        USART_Transmit_char(popped);
        USART_Transmit_String(".\r\n\r\n");
        USART_Transmit_String("I am left with this: ");
        USART_Transmit_char(string->val);
        USART_Transmit_char(string->next->val);
        USART_Transmit_char(string->next->next->val);
        USART_Transmit_String(".\r\n\r\n");        
}


节点的结构和推送功能是:

typedef struct node {
        char val;
        struct node * next;
    } node_char;

void push(node_char * string, char val) {
    node_char * current = string;
    while (current->next != NULL) {
        current = current->next;
    }
    current->next = malloc(sizeof(node_char));
    current->next->val = val;
    current->next->next = NULL;
}
结果是:

I recived this line: HOLA.

I popped this char: H.

I am left whit this: OLA.
I recived this line: HOLA.

I popped this char: H.

I am left whit this: 
                      .
当我为一个具有完全相同代码的函数定义的appart更改弹出craracter的代码部分时,问题就出现了

新的主要代码是:

int main(void)
{
        //USART CONFIGURATION
        struct USART_configuration config_57600_8N1 = {57600, 8,1,'n'};
        USART_Init(config_57600_8N1);
        //END USART CONFIGURATION

        //CEATES THE FIRST NODE OF LINKED LIST
        node_char * string = NULL;
        string = malloc(sizeof(node_char));
        string->val = 'H';
        string->next = NULL;

        //ADD ELEMENTS TO LINKED LIST
        push(string,'O');
        push(string,'L');
        push(string,'A');

        //COMMUNICATION WITH COMPUTER
        USART_Transmit_String("I received this line: ");
        USART_Transmit_char(string->val);
        USART_Transmit_char(string->next->val);
        USART_Transmit_char(string->next->next->val);
        USART_Transmit_char(string->next->next->next->val);
        USART_Transmit_String(".\r\n\r\n");

        //HERE I POP THE FIRST ELEMENT

        char popped = pop(string);

        //HERE THE FIRST ELEMENT HAS BEEN POPPED

        //COMMUNICATION WITH COMPUTER
        USART_Transmit_String("I popped this char: ");
        USART_Transmit_char(popped);
        USART_Transmit_String(".\r\n\r\n");
        USART_Transmit_String("I am left with this: ");
        USART_Transmit_char(string->val);
        USART_Transmit_char(string->next->val);
        USART_Transmit_char(string->next->next->val);
        USART_Transmit_String(".\r\n\r\n");        
}
pop函数定义如下:

char pop(node_char * string) {
    node_char * next_node = NULL;
    char popped = string->val;
    next_node = string->next;
    free(string);
    string = next_node;
    return popped;
}
结果是:

I recived this line: HOLA.

I popped this char: H.

I am left whit this: OLA.
I recived this line: HOLA.

I popped this char: H.

I am left whit this: 
                      .
(请注意,(.)打印在下一行)

我不明白为什么它在函数中定义了相同的代码时不起作用

有人知道为什么会这样吗?我尝试了许多不同的方法来解决这个问题,结果不同,但从来没有达到预期的效果。

在函数
pop()
中,您分配
local
参数
string

string = next_node;
但是这里的
string
是一个局部变量,与
main()
中的
string
没有关联-它只是
main()
string
的值的副本-或者在您修改它之前一直存在

您需要一个额外的间接级别,以便从
main()
传递指向
string
对象的指针:

然后打电话:

char popped = pop( &string ) ;

此赋值
string=next\u节点在返回
pop
函数后失效。