Jump to content

Array Multidimensional dinâmico


PuPax
 Share

Recommended Posts

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

Link to comment
Share on other 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;
}
Link to comment
Share on other 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.

Link to comment
Share on other 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]);
        }
        }
Link to comment
Share on other 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.

Link to comment
Share on other 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;
}
Link to comment
Share on other 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;

                                }

                    }

        }
}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.