【问题标题】:answers getting error while 3D array declare in C答案在 C 中声明 3D 数组时出错
【发布时间】:2021-04-22 04:55:00
【问题描述】:

我遇到了一个错误,因为我需要将 2d 数组转换为 3d 数组。我理解这一点,因为如果我将数组赋值放在注释中,我就不再有问题了。我还将分配 3d 数组的代码部分发送到这里。

    consulta agendaMedicos[50][50][50]; 
    consulta agendaEnfermeiros[50][50][50];

我认为这无关紧要,但我使用的结构是这样的:

typedef struct Consulta {

    char nomeUtente[70];
    int numSNS;
    int dia;
    int mes;
    int ano;
    int horasInicio;
    int minutosInicio;
    int horasFim;
    int minutosFim;

} consulta;

这是我如何将数组发送到新函数的示例

void novaConsulta(int *nAgendasMedico, consulta agendaMedicos[][50][50], int membroEscolhido, int clinicaSelecionada)

这是我唯一的功能:

void novaConsulta(int *nAgendasMedico, consulta agendaMedicos[][50][50], int membroEscolhido, int clinicaSelecionada)
{
    
    do 
    {
                
        puts("Insira o dia:");
        scanf("%d", &agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);
        system("cls");
                
    }while (agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia < 0 || agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia > 31);
    
    printf("%d", agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);
    
}

这是我的主要代码:


int main(int argc, char *argv[]) {
    
    int membroEscolhido = 1, clinicaSelecionada = 0;
    
    int nAgendasMedico[50];
    
    consulta agendaMedicos[50][50][50]; 
    consulta agendaEnfermeiros[50][50][50];
    
    nAgendasMedico[membroEscolhido] = 0;
    
    novaConsulta(nAgendasMedico, agendaMedicos, membroEscolhido, clinicaSelecionada);
    
    nAgendasMedico[membroEscolhido]++;
    
    return 0;
}

当我编译程序时,没有出现错误,发生的是程序在一段时间后关闭,如图:

enter image description here

这是我最小的可重现示例:


#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */



typedef struct Consulta {

    char nomeUtente[70];
    int numSNS;
    int dia;
    int mes;
    int ano;
    int horasInicio;
    int minutosInicio;
    int horasFim;
    int minutosFim;

} consulta;

void novaConsulta(int *nAgendasMedico, consulta agendaMedicos[][50][50], int membroEscolhido, int clinicaSelecionada);

int main(int argc, char *argv[]) {
    
    int membroEscolhido = 1, clinicaSelecionada = 0;
    
    int nAgendasMedico[50];
    
    consulta agendaMedicos[50][50][50]; 
    consulta agendaEnfermeiros[50][50][50];
    
    nAgendasMedico[membroEscolhido] = 0;
    
    novaConsulta(nAgendasMedico, agendaMedicos, membroEscolhido, clinicaSelecionada);
    
    nAgendasMedico[membroEscolhido]++;
    
    return 0;
}

void novaConsulta(int *nAgendasMedico, consulta agendaMedicos[][50][50], int membroEscolhido, int clinicaSelecionada)
{
    
    do 
    {
                
        puts("Insira o dia:");
        scanf("%d", &agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);
        system("cls");
                
    }while (agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia < 0 || agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia > 31);
    
    printf("%d", agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);
    
}

我的开发程序是 DevC++ 一种 C 语言。 谢谢大家

【问题讨论】:

  • 对不起,我设法创建了这个新示例,但遇到了同样的问题。我希望它现在变得更加可敬。提前致谢
  • 你给它什么输入?
  • 我什么都没写,程序需要一些时间思考,我没有按任何东西就崩溃了
  • 您的数组有 125k 个元素,每个元素大约 90 个字节,您可能会溢出堆栈。再次,请先提取minimal reproducible example,这是一个无需任何更改即可编译和执行的文件。 edit您的问题是包含该信息,而不是单独的 sn-ps。另外,我没有看过那张图片,但通常引用文字更好。

标签: arrays c dev-c++


【解决方案1】:

将 3d 数组从堆栈(每个大约 1120 万字节)移动到文件全局空间会产生以下代码:

#include <stdio.h>
#include <stdlib.h>

// much more flexible to separate definition of the struct
// from a 'typedef' for that struct

struct Consulta 
{
    char nomeUtente[70];
    int numSNS;
    int dia;
    int mes;
    int ano;
    int horasInicio;
    int minutosInicio;
    int horasFim;
    int minutosFim;
};

typedef struct Consulta consulta;


consulta agendaMedicos[50][50][50]; // <- in file global space


void novaConsulta(int *nAgendasMedico, consulta agendaMedicos[][50][50], int membroEscolhido, int clinicaSelecionada)
{  
    do 
    {                
        puts("Insira o dia:");
        scanf("%d", &agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);
        //system("cls");             
    }while (agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia < 0 || agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia > 31);
    
    printf("%d", agendaMedicos[nAgendasMedico[membroEscolhido]][membroEscolhido][clinicaSelecionada].dia);    
}

// notice the correction to the `main()` signature
// so compiler does not output 2 warning messages
// about unused parameters

int main( void )   
{
    int membroEscolhido = 1;
    int clinicaSelecionada = 0;
    
    int nAgendasMedico[50];
    

    //consulta agendaEnfermeiros[50][50][50]; // moved to file global space
    
    nAgendasMedico[membroEscolhido] = 0;
    
    novaConsulta(nAgendasMedico, agendaMedicos, membroEscolhido, clinicaSelecionada);
    
    nAgendasMedico[membroEscolhido]++;
    
    return 0;
}

【讨论】:

  • 尼特,我每个都有12.75M(忽略填充) 102 * 50 * 50 * 50。分配或static 应在选项列表中排在全局之前。
  • @DavidC.Rankin,当每个数据结构(3d 数组)超过 1000 万字节时,+/- 100 万字节并不重要我的目标是指出问题和可能的解决方法,而不是每个可能的问题和相关的修复以及具体大小取决于底层硬件架构。 (例如,我的 x86-64 架构实际上将使用几乎两倍于 x86 的内存
  • 别担心,这就是为什么我将评论标记为“Nit”(de minimis)
  • 谢谢大家,我把变量放在了in file全局空间里。这解决了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多