Ir ao conteúdo
  • Cadastre-se

C++ Posso usar uma matriz com 4 dimensões em c/c++?


heliocleg2

Posts recomendados

Boa tarde pessoal, estou precisando usar uma matriz com 4 dimensões em c/c++.

Uso o Code Blocks como GUI, ele aceita a tal matriz e tenho memória o suficiente para isso, mas na execução do programa as posições não são acessadas direito.

Já verifiquei TODAS as variáveis usadas e todas estão dimensionadas corretamente, não tem nenhum problema de "invasão" de um vetor/matriz em outro!

 

Onde DEF_EST = 501 e DEF_GR = 103 e MAX_EST = 500 e MAX_GR = 102.

#define MAXIMO_GR 102

#define MAXIMO_EST 500

const int DEF_EST=MAXIMO_EST+1, MAX_EST=MAXIMO_EST, DEF_GR=MAXIMO_GR+1, MAX_GR=MAXIMO_GR;

 

São 4 matrizes :

 

short int

ESTAT_ACRT_ANT_SOZ[DEF_EST][DEF_GR][DEF_GR][DEF_GR],

ESTAT_ACRT_PEN_SOZ[DEF_EST][DEF_GR][DEF_GR][DEF_GR],

ESTAT_ACRT_FUT_SOZ[DEF_EST][DEF_GR][DEF_GR][DEF_GR],

ESTAT_ACRT_FUT2_SOZ[DEF_EST][DEF_GR][DEF_GR][DEF_GR],

 

Quando mudo esses valores (de 501 para 301 ou 201 ou 101) dá erro também !

 

Então me pergunto se há uma limitação no número de dimensões ou qual será o problema.

 

Quando inicializo as matrizes (deixo todas = 0), já dá confusão, dá erro :

 

/* PARA ESTATISTICA */

for (I=0; I<=MAX_EST; I++)

   { for (II=0; II<=MAX_GR; II++)

       { cout<<"\n AQUI 8 D1 I "<<I<<" II "<<II;

         for (III=0; III<=MAX_GR; III++)

           { cout<<"\n AQUI 7 C1 I "<<I<<" II "<<II<<" III "<<III;

             for (MMM=0; MMM<=MAX_GR; MMM++)

                { cout<<"\n AQUI 3 A1 I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

                  ESTAT_ACRT_ANT_SOZ[I][II][III][MMM]=0;

                  cout<<"\n AQUI 3 A2 I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

                  ESTAT_ACRT_PEN_SOZ[I][II][III][MMM]=0;

                  cout<<"\n AQUI 3 A3 I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

                  ESTAT_ACRT_FUT_SOZ[I][II][III][MMM]=0;

                  cout<<"\n AQUI 3 A4 I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

                  ESTAT_ACRT_FUT2_SOZ[I][II][III][MMM]=0;

                  cout<<"\n AQUI 3 A5 I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

                  }

              cout<<"\n AQUI 7 C2 I "<<I<<" II "<<II<<" III "<<III;

              }

         cout<<"\n AQUI 8 D2 I "<<I<<" II "<<II;

         }

     cout<<"\n AQUI 3 B I "<<I<<" II "<<II<<" III "<<III<<" MMM "<<MMM;

     }

cout<<"\n AQUI 3 C "; cout<<"\n PARADA ! \n"; system("PAUSE > null");

 

Então eu pergunto :

 

Posso usar uma matriz com 4 dimensões no compilador MinGW/GCC?

 

Qual é o limite de dimensões de uma matriz em c/c++ no MinGW/GCC?

 

O MinGW/GCC aceita a matriz com 4 dimensões, mas na execução fica tudo bagunçado.

 

Será que alguém pode me ajudar ?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

52 minutos atrás, heliocleg2 disse:

Então eu pergunto :

 

Posso usar uma matriz com 4 dimensões no compilador MinGW/GCC?

 

Qual é o limite de dimensões de uma matriz em c/c++ no MinGW/GCC?

 

O MinGW/GCC aceita a matriz com 4 dimensões, mas na execução fica tudo bagunçado.

 

Será que alguém pode me ajudar ?

 

Não existe de fato esse lance de matriz multidimensional em C ou C++, como tem em FORTRAN. Só existe escalar e vetor. Mas tem vetor de vetor, vetor de vetor de vetor e tal...

 

Na prática quer dizer que [1] Sim, pode usar quantas "dimensões" quiser, e estarão lá alinhadas por linha  a partir do endereço de início.

 

        char vetor[3][4] = {0};

 

declara vetor como um vetor com tres vetores de 4 char, por exemplo.

 

[2] O limite vai depender de como cria isso. Se usa isso estático vai depender do tamanho de stack que seu programa está configurado para aceitar. Se vai alocar dinâmicamente o limite é a memória disponível em tempo de execução.

 

MinGW não é um compilador. Nada tem a ver com isso. Seu compilador deve ser o gcc em Windows.

 

Poste o código completo. Seu problema não está em nenhuma limitação do compilador ou da linguagem. Apenas acompanhe o tamanho de fato que está alocando.

 

POSTE o código completo ou não há muito em que ajudar...

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, heliocleg2 disse:

Posso usar uma matriz com 4 dimensões no compilador MinGW/GCC?

Suponho que sim, sendo MinGW um importante 'software' do gênero compilador, ele incluirá certamente essa especificação. E o GCC, sendo o seu conjunto de compiladores, também é capaz!

 

Logo “MinGW o seu GCC para Microsoft Windows”.

— Seja Um Windows ou Um sistema operacional do tipo Unix, o GCC seguramente suporta 4 subscritos.

 

 

2 horas atrás, heliocleg2 disse:

Qual é o limite de dimensões de uma matriz em c/c++ no MinGW/GCC?

Boa pergunta, suponho haver uma formalização. Sendo, talvez, mais divertido observar.

 

— Então, experimenta!

#include <stdio.h>
int main() {

    /* escreva mais subscritos [2] em sx até o limite do suporte */
    static char sx[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // ok
    unsigned sx_meu_tamanho_e = sizeof sx;
    printf("O tam de sx e: %u byte.\n", sx_meu_tamanho_e);
    return 0;

} 

* Não há perigo, adicione mais dimensões até o insuportável.

— Meu palpite é que não passa de +126.

 

 

2 horas atrás, heliocleg2 disse:

Será que alguém pode me ajudar ?

— Espero que sim.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, arfneto disse:

 

Não existe de fato esse lance de matriz multidimensional em C ou C++, como tem em FORTRAN. Só existe escalar e vetor. Mas tem vetor de vetor, vetor de vetor de vetor e tal...

 

Na prática quer dizer que [1] Sim, pode usar quantas "dimensões" quiser, e estarão lá alinhadas por linha  a partir do endereço de início.

 

        char vetor[3][4] = {0};

 

declara vetor como um vetor com tres vetores de 4 char, por exemplo.

 

[2] O limite vai depender de como cria isso. Se usa isso estático vai depender do tamanho de stack que seu programa está configurado para aceitar. Se vai alocar dinâmicamente o limite é a memória disponível em tempo de execução.

 

MinGW não é um compilador. Nada tem a ver com isso. Seu compilador deve ser o gcc em Windows.

 

Poste o código completo. Seu problema não está em nenhuma limitação do compilador ou da linguagem. Apenas acompanhe o tamanho de fato que está alocando.

 

POSTE o código completo ou não há muito em que ajudar...

 

 

1 hora atrás, mauro_b disse:

Suponho que sim, sendo MinGW um importante 'software' do gênero compilador, ele incluirá certamente essa especificação. E o GCC, sendo o seu conjunto de compiladores, também é capaz!

 

Logo “MinGW o seu GCC para Microsoft Windows”.

— Seja Um Windows ou Um sistema operacional do tipo Unix, o GCC seguramente suporta 4 subscritos.

 

 

Boa pergunta, suponho haver uma formalização. Sendo, talvez, mais divertido observar.

 

— Então, experimenta!

#include <stdio.h>
int main() {

    /* escreva mais subscritos [2] em sx até o limite do suporte */
    static char sx[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // ok
    unsigned sx_meu_tamanho_e = sizeof sx;
    printf("O tam de sx e: %u byte.\n", sx_meu_tamanho_e);
    return 0;

} 

* Não há perigo, adicione mais dimensões até o insuportável.

— Meu palpite é que não passa de +126.

 

 

— Espero que sim.

 

ArfNeto & Mauro_B, muito obrigado pela explicação !

Achei o problema (se não roda.... sempre tem algum problema !), tenho (tinha!) vários outros vetores e matrizes que eram muito grandes. Elas estavam ocupando muita memória e muito stack.

Resolvi isso diminuindo o tamanho deles, deixei mais próximo do máximo que irei precisar, eu sempre (por medo de invadir outros vetores/matrizes) dimensiono a quantidade de elementos maior do que o necessário.   

 

Obrigado ArfNeto & Mauro_B !

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, mauro_b disse:

Suponho que sim, sendo MinGW um importante 'software' do gênero compilador, ele incluirá certamente essa especificação. E o GCC, sendo o seu conjunto de compiladores, também é capaz!

 

Não, MinGW não é um compilador. A distribuição inclui entre outras coisas um compilador gcc, mas pode usar MinGw e ter várias versões de gcc coexistindo na mesma máquina.

 

E também pode instalar o MinGW sem o compilador, caso tenha um ou vários gcc já rodando em sua máquina.

 

Considere:

 

Citação

What is it?

In short: it's a free C and C++ compiler for Microsoft Windows.

GCC (GNU Compiler Collection) is a free and open source compiler for C and C++ (and other languages like Objective-C, Fortran, D).
MinGW-w64 is a free and open source C library for targetting Windows 32-bit and 64-bit platforms.
The combination of these results in a free C/C++ compiler for Windows.
Even though GCC and MinGW-w64 can be used on other platforms (e.g. Linux) to generate Windows executables, the WinLibs project only focusses on building versions that run natively on Windows.

Also some additional tools are added, including:

GDB - the GNU Project debugger

GNU Binutils - a collection of binary tools

GNU Make - a tool which controls the generation of executables and other non-source files

Yasm - The Yasm Modular Assembler Project

NASM - The Netwide Assembler

JWasm - A free MASM-compatible assembler

LLVM/Clang/LLD/LLDB - The LLVM Compiler Infrastructure

 

Direto de https://winlibs.com/ o lar do MinGW

 

3 horas atrás, mauro_b disse:

Boa pergunta, suponho haver uma formalização. Sendo, talvez, mais divertido observar.

 

 

Não há formalização disso. Pode usar mais e mais "dimensões" enquanto houver memória, se tiver algum sentido em milhares de dimensões. E para testar pode usar, mesmo no Windows, binutils e make e um programa C para ir aumentando as dimensões.

 

1 hora atrás, heliocleg2 disse:

Resolvi isso diminuindo o tamanho deles, deixei mais próximo do máximo que irei precisar, eu sempre (por medo de invadir outros vetores/matrizes) dimensiono a quantidade de elementos maior do que o necessário

 

Use alocação dinâmica e crie do exato tamanho que precisa... É o simples e versátil.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, heliocleg2 disse:

Mauro_B, muito obrigado pela explicação !

Achei o problema (se não roda.... sempre tem algum problema !), tenho (tinha!) vários outros vetores e matrizes que eram muito grandes. Elas estavam ocupando muita memória e muito stack.

Resolvi isso diminuindo o tamanho deles, deixei mais próximo do máximo que irei precisar, eu sempre (por medo de invadir outros vetores/matrizes) dimensiono a quantidade de elementos maior do que o necessário.

Ah! Agradeço pela oportunidade de responder tuas perguntas sobre os compiladores:

 

MinGW (definido para suporte ao GCC)

GCC (sendo um conjunto (coleção) de compiladores da GNU).

 

 

Os programas do gênero compilador (MinGW/GCC) são, para mim, seguramente bons.

— Sinta-se a vontade para experimentar e perguntar.

 

  • Obrigado 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!