Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

PuPax

Array Multidimensional dinâmico

Mensagens Recomendadas

PuPax    0
PuPax

Boa tarde,

Alguem pode deixar aqui como criar um array multidimensional dinamico. Por exemplo as linhas têm de ter 100 caracteres, e as colunas sao criadas dinamicamente conforme os nomes, isto é, a medida que o programa corre adiciono um nome ao array.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Tens de criar um array de apontadores (para o tipo que queres) e depois fazes a alocação dinâmica de memória.

char *array[100];
array[i] = (char*)malloc(sizeof(char)*dim);

onde dim é a dimensão de cada string que vais ter no array.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Ou crias um array de arrays (que foi o que o Baderous sugeriu), ou vais ter que andar com conversões de índices e inverter a organização habitual dos elementos (em vez de uma linha estar em posições consecutivas, estão os elementos de uma coluna), pois para a posição de memória de um elemento não mudar, precisas de ter o número de colunas fixo (é claro que aquilo a que chama linha e coluna é apenas uma convenção, que podes trocar sem qualquer problema).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Estás a alocar o espaço, mas não estás a copiar os dados. E podes usar o strdup.

Ya, apaguei o post porque reparei na estupidez que tinha feito.

EDIT: Aqui fica o código já correcto.

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

#define MAX 100
#define SU 200

int main() {
    char* array[MAX]; char nome[sU];
    int i;
    for (i=0;i<MAX;i++) {
        printf("Introduza a string: ");
        fgets(nome,SU,stdin);
        nome[strlen(nome)-1]='\0'; 
        array[i]=strdup(nome);
        }
    for (i=0;i<MAX;i++)
        printf("%s\n",array[i]);
    return 0;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Com o strdup deixas de precisar de alocar o espaço para a string.

Não sabia dessa. Então strdup é quase que um malloc + strcpy.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Depois do strdup, no fim do programa, convém libertar a memória alocada com o free.

No caso do código do Baderous não há qualquer necessidade de o fazer pois o programa termina de seguida.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Sim, é uma boa prática.

Lembro-me que nos trabalhos da univ tinha que o fazer mesmo quando encerrava o programa a seguir. E normalmente eram estruturas de dados bem mais complexa. Mas nestes casos, numa aplicação real, provavelmente não o faria. Aqui é apenas uma questão de incutir um hábito necessário em muitas situações.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
i307    0
i307

Precisava de alocar memória para um vector multi dimensional mas recebendo as 2 variáveis in run time. Qual a melhor maneira de o fazer?

    int l , c ;
    int *v;
    int i=0,j=0;

    printf("Linhas:");
    scanf("%i",&l);
    printf("Colunas:");
    scanf("%i",&c);

    v[l] = (int**) malloc(sizeof(int*)* l );
    v[c] = (int**) malloc(sizeof(int*)* c );

    printf("Preencha as colunas %ix%i\n",l,c);
    for(i=0;i<l;i++){
        for(j=0;j<c;j++){
            scanf("%i",v[i][j]);
        }
        }

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
i307    0
i307

Como passar um vector bidimensional para dentro duma função?

No livro do Luís Damas está "A passagem de vectores com mais dimensão (...) obrigatoriamente , o nº de elementos de cada uma das n-1 dimensões à direita (...)"

Só que eu quero passar o vector para dentro da função e só em run time é que o programa sabe as dimensões.

Não está a funcionar (e enquanto estava com memória estática funcionava):

    printf("Linhas:");
    scanf("%i",&l);
    printf("Colunas:");
    scanf("%i",&c);

    v = (int**) malloc(sizeof(int*)* l );
    for (i=0; i<l; i++)
    {
        v[i] = (int *) malloc(sizeof(int*)* c );

    for (j = 0; j < c; j++){
        v[i][j] = j + 1;
        }

    }

Até aqui recebe os valores e mostra sem problema. Mas depois:

troca(v,l,c);

(...)

void troca (int **vect, int linhas , int colunas)
{
int temp, k, pass;
int trocou = 1;
int l=0;
int i=0,j=0;



while(l<linhas){
for (pass=0; pass<linhas-1 && trocou; pass++)
    {
    trocou = 0;
for (k = 0; k < linhas-pass-1; k++)              /* bubble sort */
    if (vect[l][k] > vect[l][k+1])
            {
        trocou = 1; ;
        temp = vect[l][k];
        vect[l][k] = vect[l][k+1];
        vect[l][k+1] = temp;
            }
    l++;
    }
}

Dá segmentation fault.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Testei isso e correu bem, a única coisa que detectei é que o bubble sort não está a ordenar o último valor das linhas:

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

void troca (int **vect, int linhas , int colunas)
{
        int temp, k, pass;
        int trocou = 1, l;
        for (l=0;l<linhas;l++) {
                for (pass=0; pass<linhas-1 && trocou; pass++) {
                        trocou = 0;
                        for (k = 0; k < linhas-pass-1; k++)              /* bubble sort */
                                if (vect[l][k] > vect[l][k+1]) {
                                        trocou = 1; ;
                                        temp = vect[l][k];
                                        vect[l][k] = vect[l][k+1];
                                        vect[l][k+1] = temp;
                                }
                }
        }
}

void print(int **v, int l, int c) {
        int i,j;
        for (i=0;i<l;i++) {
                for (j=0;j<c;j++)
                        printf("%d ",v[i][j]);
                putchar('\n');
        }
}

int main(void) {
        int l,c,i,j;
        int **v;
        printf("Linhas:");
        scanf("%d",&l);
        scanf("%*c");
        printf("Colunas:");
        scanf("%d",&c);
        v = (int**) malloc(sizeof(int*)* l );
        for (i=0; i<l; i++) {
                v[i] = (int *) malloc(sizeof(int*)* c );
                for (j = 0; j < c; j++) {
                        v[i][j] = 20 - j + 1;
                }
        }
        print(v,l,c);
        troca(v,l,c);
        print(v,l,c);
        return 0;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
i307    0
i307

Mas isso é secundário.

É que dá-me Segmentation Fault.

Diz que é nesta linha

if (vect[l][k] > vect[l][k+1])

EDIT: criei projecto novo e já deu bem. Só está é a ordenar a 1ª linha. Mas isto agora tenho de ver.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
i307    0
i307

Não estou a ver o problema . Estive a verificar e supostamente havia de fazer as trocas mas apenas troca a 1ª linha. Apesar de dar para ver a var temp os outros valores.

ocou = 1, l;


        for (l=0;l<linhas;l++) {
                for (pass=0; pass<linhas-1 && trocou; pass++) {
                        trocou = 0;
                        for (k = 0; k < linhas-pass-1; k++)              /* bubble sort */
                                if (vect[l][k] > vect[l][k+1]) {
                                        trocou = 1; ;
                                        temp = vect[l][k];
                                        vect[l][k] = vect[l][k+1];
                                        vect[l][k+1] = temp;

                                }

                    }

        }
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade