Linker command failed with exit code 1

Can’t seem to figure out where it went wrong

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CONTAS 5

typedef enum { ATIVO, PASSIVO, PAT_LIQ } Categoria;

typedef struct {
    char nome[50];
    float valor;
    Categoria categoria;
} Conta;

void cadastrar_contas(Conta *contas, int *n_contas);
void cadastrar_contas(Conta *contas, int *n_contas);
void classifica_contas(char** balanco, int tamanho);
void imprimi_balanco(char* nome_arquivo, char* conta_desejada);
void salvar_contas(Conta *contas, int n_contas);
void carregar_contas(Conta *contas, int *n_contas);
void salvar_balanco(char* nome_arquivo, char** balanco, int tamanho);
//void classificar_contas(Conta *contas, int n_contas);
//void imprimir_balanco(Conta *contas, int n_contas);

int main() {
    Conta contas[MAX_CONTAS];
    int n_contas = 0;
    char opcao;

    carregar_contas(contas, &n_contas);

    do {
        printf("Digite a opcao desejada:\n");
        printf("1 - Cadastrar contas\n");
        printf("2 - Classificar contas\n");
        printf("3 - Imprimir balanco\n");
        printf("0 - Sair\n");
        scanf(" %c", &opcao);

        switch (opcao) {
            case '1':
                cadastrar_contas(contas, &n_contas);
                salvar_contas(contas, n_contas);
                break;
            case '2':
                classifica_contas(contas, n_contas);
                salvar_contas(contas, n_contas);
                break;
            case '3':
                imprimi_balanco("conta.txt", contas);
                break;
            case '0':
                printf("Encerrando programa.\n");
                break;
            default:
                printf("Opcao invalida! Tente novamente.\n");
        }
    } while (opcao != '0');

    return 0;
}

void cadastrar_contas(Conta *contas, int *n_contas) {
    char opcao;

    do {
        printf("Digite o nome da conta: ");
        scanf("%s", contas[*n_contas].nome);
        printf("Digite o valor da conta: ");
        scanf("%f", &contas[*n_contas].valor);
        printf("Digite a categoria da conta: A - Ativo\t, P - Passivo\tL - Patrimonio Liquido\n ");
        scanf(" %c", &opcao);
        switch (opcao) {
            case 'A':
            case 'a':
                contas[*n_contas].categoria = ATIVO;
                break;
            case 'P':
            case 'p':
                contas[*n_contas].categoria = PASSIVO;
                break;
            case 'L':
            case 'l':
                contas[*n_contas].categoria = PAT_LIQ;
                break;
            default:
                printf("Opcao invalida! A conta sera classificada como 'Outros'.\n");
                contas[*n_contas].categoria = PAT_LIQ + 1; // Outros
        }
        (*n_contas)++;
        printf("Deseja cadastrar outra conta? (S/N) ");
        scanf(" %c", &opcao);
    } while (opcao == 'S' || opcao == 's');
}

void classifica_contas(char** balanco, int tamanho) {
    printf("Classificação das contas do balanço patrimonial:\n");

    for (int i = 0; i < tamanho; i++) {
        if (strncmp(balanco[i], "Ativo", 5) == 0) {
            printf("%s: Ativo\n", balanco[i]);
        } else if (strncmp(balanco[i], "Passivo", 7) == 0) {
            printf("%s: Passivo\n", balanco[i]);
        } else if (strncmp(balanco[i], "Receita", 7) == 0) {
            printf("%s: Receita\n", balanco[i]);
        } else if (strncmp(balanco[i], "Despesa", 7) == 0) {
            printf("%s: Despesa\n", balanco[i]);
        } else {
            printf("%s: Não classificado\n", balanco[i]);
        }
    }
}

void imprimi_balanco(char* nome_arquivo, char* conta_desejada) {
    FILE* arquivo = fopen(nome_arquivo, "r");
    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo.\n");
        return;
    }

    char linha[100];
    int encontrou_conta = 0;
    while (fgets(linha, 100, arquivo)) {
        if (strstr(linha, conta_desejada) != NULL) {
            encontrou_conta = 1;
            printf("%s", linha);
            while (fgets(linha, 100, arquivo)) {
                if (linha[0] == '\n') {
                    break;
                }
                printf("%s", linha);
            }
            break;
        }
    }

    if (!encontrou_conta) {
        printf("A conta desejada não foi encontrada.\n");
    }

    fclose(arquivo);
}

void salvar_balanco(char* nome_arquivo, char** balanco, int tamanho) {
    FILE* arquivo = fopen("contas.txt", "w");
    if (arquivo == NULL) {
        printf("Erro ao abrir arquivo!\n");
        return;
    }

    for (int i = 0; i < tamanho; i++) {
        fprintf(arquivo, "%s\n", balanco[i]);
    }

    fclose(arquivo);
    printf("Balanço patrimonial salvo no arquivo %s!\n", nome_arquivo);
}

/*void salvar_contas(Conta *contas, int n_contas) {
    FILE *arquivo;
    int i;

    arquivo = fopen("contas.dat", "wb");*/

I would guess that this is because you have another file in the repl which also has a main function. Use a separate repl for each project.

this is a single replit, how can it have more than a main? i dont really know c, this is my friends code

main function in other files are used as well. If this isn’t the problem, could you link the repl (not invite)?

https://replit.com/@Arthursinja/Patrimonial2#main.c

Hey! This is the same issue I’m facing with my code. Would you care to elaborate on your point??

#include<stdio.h>
  int search(int a[10], int f, int l, int k){
    int mid;
    while(f<=l){
      mid = (f+l)/2;
      if(a[mid]==k)
        return mid;
      else if (a[mid]>k)
        return search(a, f, mid-1, k);
      else
        return search(a, mid+1, l, k);
    }
     return -1; 
  }
  int main(){
    int n, i, a[10], key;
    printf("Enter n");
    scanf("%d",&n);
    for(i = 0;i<n;i++)
      scanf("%d",&a[i]);
    scanf("%d",&key);
    int result = search(a, 0, n-1, key);
    if(result == -1)
      printf("Not found");
    else printf("%d found at %d",key, result+1);
    return 0;
  }
this is my code. The error:
#include<stdio.h>
  int search(int a[10], int f, int l, int k){
    int mid;
    while(f<=l){
      mid = (f+l)/2;
      if(a[mid]==k)
        return mid;
      else if (a[mid]>k)
        return search(a, f, mid-1, k);
      else
        return search(a, mid+1, l, k);
    }
     return -1; 
  }
  int main(){
    int n, i, a[10], key;
    printf("Enter n");
    scanf("%d",&n);
    for(i = 0;i<n;i++)
      scanf("%d",&a[i]);
    scanf("%d",&key);
    int result = search(a, 0, n-1, key);
    if(result == -1)
      printf("Not found");
    else printf("%d found at %d",key, result+1);
    return 0;
  }

Thanks but how do we do that?

just create a new repl for each program. You can only have one file in each repl which has a main function. Or, if needed you could actually make it change based on which file you edited:

  1. Files ⋮ > Show hidden files
  2. Change the starting lines of the Makefile as such:
all: main

CC = clang
override CFLAGS += -g -Wmost -Ofast -pthread -lm -std=c2x

SRCS = foo/foo.cc
HEADERS = $(shell shopt -s globstar nullglob;echo **/*.h)
  1. Run this command in Shell
/nix/store/fbi9r30p3lqk96lmw5b1v1bpbj62cr2l-inotify-tools-3.20.11.0/bin/inotifywait -rqme create --format %f%w --include='\..+\.c(pp|c|).[0-9]+~' .|while read f
do f=${f#.}
d=${f#*~./}
f=${f%.*~*}
sed -i "/^SRCS/s|= .\+|= $d$f|
s/\\.h.*)/.h$(case $f in
*cc|*p)echo -n '{pp,h})/
/clang$/s/$/++/
/override CFLAGS/s/-std=\S*/-std=c++2b';;*)echo -n ')/
/clang++$/s/++$//
/override CFLAGS/s/-std=\S*/-std=c2x'
esac)/" Makefile
done
  1. Add that command to onBoot at the start of the .replit file, e.g.
onBoot = "command"
1 Like