K.SMW 发表于 2023-6-13 17:36:45

VScode无法使用Code Runner插件运行代码

本帖最后由 K.SMW 于 2023-6-13 17:36 编辑

本人新手,刚刚根据站内教程贴配置c语言运行环境,但一直无法实现使用Code Runner插件运行代码
环境配置参考链接为:https://fishc.com.cn/thread-203417-1-1.html 和 https://fishc.com.cn/thread-224194-1-1.html


在VScode中点击右上角运行,终端显示如下:
(base) PS D:\Code\C\C-Traps and Pitfalls> cd "d:\Code\C\C-Traps and Pitfalls\chapter1\" ; if ($?) { gcc *.c -o test } ; if ($?) .c -o test } ; if ($?) { .\test } ; if ($?) { del .\test.exe }
C:\Users\MWan\AppData\Local\Temp\cclEUuQi.o:test.c:(.text+0x0): multiple definition of `main'      
C:\Users\MWan\AppData\Local\Temp\cco2wEvO.o:1.1.c:(.text+0x0): first defined here
C:\Users\MWan\AppData\Local\Temp\cc6n10yT.o:test1_4.c:(.text+0x0): multiple definition of `main'   
C:\Users\MWan\AppData\Local\Temp\cco2wEvO.o:1.1.c:(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

isdkz 发表于 2023-6-13 17:41:16

看起来像是你定义了多个main函数

sfqxx 发表于 2023-6-13 18:09:49

这段代码的问题可能不在于malloc申请的空间不连续,而是在输入链表时并没有把头结点传入函数中,而是直接将其赋值为NULL。

当输入第一个节点时,虽然会动态地分配了一个空间给a或者b,但因为它们本身都是NULL,所以新的节点并没有与之前的节点相连。因此在输出链表时,只输出了输入最后一个有效节点,而在判断回文时,则会出现访问NULL指针的错误。

要解决此问题,可以在main函数中分别给a和b设置一个头结点,并将其传入input函数中。在input函数中,首先通过头指针找到链表的末尾,再插入新的节点。

修改后的代码如下:#include<stdio.h>
#include<stdlib.h>

struct List
{
      int i;
      struct List *next;
};

void input(struct List a,struct List b,int i)
{
      struct List *xin_a;
      struct List *temp1;
      struct List *xin_b;
      struct List *temp2;
      
      xin_a=(struct List *)malloc(sizeof(struct List));
      xin_b=(struct List *)malloc(sizeof(struct List));
      
      if(xin_a==NULL&&xin_b==NULL)
      {
                printf("内存分配失败:\n");
                exit(1);
      }
      xin_a->i =i;
      xin_b->i =i;      
      
      if(*a==NULL)
      {
                *a=xin_a;
                xin_a->next =NULL;
      }
      else
      {
                temp1=*a;
                while(temp1->next !=NULL)
                {
                        temp1=temp1->next ;
                }
                temp1->next=xin_a;
                xin_a->next =NULL;
      }
      
      
      if(*b==NULL)
      {
                *b=xin_b;
                xin_b->next =NULL;
      }
      else
      {
                temp2=*b;
                *b=xin_b;
                xin_b->next =temp2;
      }
}

int determine(struct List *a,struct List *b)
{
      while(a!=NULL&&b!=NULL)
      {
                if(a->i !=b->i)
                {
                        return 0;
                        break;
                }
                a = a->next;
                b = b->next;
      }
      if(a!=NULL || b!=NULL)
            return 0;
      return 1;
}

void print(struct List *a)
{
      struct List *cur;
      cur=a;
      
      while(cur!=NULL)
      {
                printf("%d ",cur->i );
                cur=cur->next ;
      }
}

int main(void)
{
      struct List *a=NULL;
      struct List *temp1=NULL;
      struct List *b=NULL;
      struct List *temp2=NULL;
      
      int i;
      while(1)
      {
                printf("请输入一个整数(输入-1表示结束):");
                scanf("%d",&i);
                if(i==-1)
                {
                        break;
                }
                else
                {
                        input(&a,&b,i);
                }
      }
      
      printf("你输入的单链表是: ");
      print(a);
      putchar('\n');
      if(determine(a,b))
      {
                printf("录入的单链表是回文数列!\n");
      }
      else
      {
                printf("录入的单链表不是回文数列!\n");
      }
      while(a!=NULL)
      {
                temp1=a->next ;
                free(a);
                a=temp1;
      }
      while(b!=NULL)
      {
                temp2=b->next ;
                free(b);
                b=temp2;
      }
      return 0;
}


求最佳答案{:10_254:}

isdkz 发表于 2023-6-13 19:21:35

你在运行Code Runner时遇到的问题是由于你试图使用GCC编译器编译当前目录下的所有C源代码文件( *.c )。然而,你的项目里有多个文件都定义了一个 main 函数,这造成了编译错误。

一个C程序只能有一个 main 函数作为程序的入口点。多个 main 函数在同一个项目中会导致编译器不知道应该从哪个 main 函数开始执行程序。

为了解决这个问题,你有几个选择:

1. 修改Code Runner的配置,让它只编译和运行当前打开的文件。打开VS Code的设置(File -> Preferences -> Settings),然后在搜索框中输入 code-runner.runInTerminal 。把这个设置的勾选取消,这样Code Runner就会在一个新的终端窗口中运行代码,而不是试图编译整个目录的代码。

2. 改变你的源文件的结构,确保只有一个文件定义了 main 函数。其它的C源文件可以定义你的函数和数据结构,然后你可以在主程序文件中包含这些文件并调用它们定义的函数。这是一个更标准的方式来组织你的C代码,也可以避免你遇到的这个问题。

3. 手动编译和运行你的代码,而不是使用Code Runner插件。在终端中,你可以使用 gcc your_file_name.c -o output_name 来编译单个的C源文件,然后用 ./output_name 来运行编译好的程序。

希望以上的建议能帮助你解决问题!

高山 发表于 2023-6-29 07:10:31

根据你提供的信息,可能是由于多个源文件中存在重复定义的 `main` 函数导致的编译错误。在 C 语言中,每个程序只能有一个 `main` 函数作为入口。

解决该问题的方法是确保在你的项目中只有一个源文件包含了 `main` 函数。请检查你的项目中是否有多个源文件同时包含了 `main` 函数并进行相应的修改。

另外,还需要确认你是否正确安装了 Code Runner 插件,并且已经按照教程中的步骤配置了 C 语言的运行环境。

如果问题仍然存在,请提供你的代码和项目结构,以便更详细地分析和帮助你解决问题。

如果您满意,请点击右下角设置最佳答案
页: [1]
查看完整版本: VScode无法使用Code Runner插件运行代码