• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

PuPax

Array Multidimensional dinâmico

20 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

cria listas de listas depois crias algumas funçoes para eliminar, apagar e editar e ta feito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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]);
        }
        }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa um debugger como o GDB para ver o que se passa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

                                }

                    }

        }
}

0

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