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

nata79

Passagem de uma matriz como argumento

8 mensagens neste tópico

Boas

tenho esta função que passa para a função menu uma matriz de caracteres

int inicio(){

char opcoes[2][30] = {"Login", "Registar novo utilizador"};
return menu(2, opcoes);
}

o tipo da funçao menu é

int menu(int nitens, char *itens[])

ao compilar dá-me um warning

passing argument 2 of ‘menu’ from incompatible pointer type

e ao executar dá segmentation fault

alguem sabe como corrigir isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao tenho 100% de certeza, mas ja experimentaste:

int menu(int nitens, char *(itens)[30])

ou ate mesmo

int menu(int nitens, char *itens[][30])

e' chato, mas acho que tens de passar o tamanho do array quando falamos de array de arrays.

isto por exemplo:

int menu(int nitens, char *itens[][])

e' invalido

-edit-

nao e' [1] mas sim [30]

se nao viste quando estava [1] antes, entao ignora

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

era mesmo o probelema de não ter posto nada no tamanho do array.

resolvi pondo

int menu(int nitens, char itens[2][30])

obirgado pela ajuda! :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em C tens de passar um array multidimensional por valor para uma funcao. No inicio estavas a tentar passar por referencia que acaba por ser inválido, nesta linguagem.

Abraço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por referência? Era um array bidimensional a ser passado a uma função que recebe um array de apontadores. Daí o erro, estava a tentar interpretar o conteúdo como apontadores.

As únicas maneiras válidas de declarar a função eram ou a utilizada (char itens[2][30]), ou sem a 1ª dimensão (char itens[][30]), ou receber um apontador para caracter e fazer as contas manualmente (char *itens).

De qualquer maneira, nunca é passada uma cópia do array, só o seu endereço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Corrige-me se estiver errado então, por favor.

int menu(int nitens, char *itens[])

estas a passar o endereço de memoria onde o array esta localizado. Ou seja, isto é uma passagem por referencia não?

No caso de um array multidimensional, ou array de arrays, tens de especificar o tamanho, neste caso entao passas o valor do array.

Mas por favor, se eu estiver errado diz-me, que é o mais provável visto que já não pego em C faz mais de 5 anos. Já me esqueci como funcionam os apontadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No caso de um array multidimensional, ou array de arrays, tens de especificar o tamanho, neste caso entao passas o valor do array.

Quando declaras uma função como recebendo um array, é o endereço do array (ou o endereço do 1º elemento do array) que é passado. O array não é copiado para o stack, só o seu endereço é que é. Se vires o endereço do parâmetro dentro da função, é o mesmo do array que foi passado como argumento.

A diferença entre um char *c[] e um char d[][30] é que c é um array de apontadores para char, e d é um array de arrays de char, cada um com 30 chars. Estes dois tipos não são compatíveis.

Quanto à passagem por referência já vai depender do que entenderes por esse termo. Acho que já foi discutido anteriormente no fórum, e penso que é um ponto de controvérsia entre programadores por esse mundo fora.

Pessoalmente, só chamo passagem por referência em C++, quando um parâmetro é declarado por exemplo como int &i, porque o conceito é diferente, embora uma referência não seja mais que um apontador disfarçado.

Já no exemplo que deste, considero que é passagem por valor. Mas nesse caso o valor passado é o endereço da variável, e não o seu conteúdo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Perfeitamente esclarecido ;-)

E sim... tens razão quando dizes que é um tanto ou quanto controverso. Já quando aprendi C pela primeira vez era coçar na cabeça até dizer chega para entender o que é passagem por valor e/ou referência.

Seja como for, quem pediu ajuda conseguiu fazer o que quis. Mas sim, concordo plenamente com o teu ponto de vista e eu estava errado no que disse.

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