Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cipla

[Resolvido] Problema com retorno de struct de matrizes para funções

Recommended Posts

Pessoal, sou novo no forum, e programo há 1 ano mais ou menos.

Estou tentando fazer um programa que toque musicas através da função Beep(nota,tempo) que encontrei há pouco na internet. Só que quando tento implementar uma função que importa uma musica de um arquivo, na hora do retorno dessa função dá um erro. O código a seguir:

 

// principal.c
#include "funcoes.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
	notas music[MAX];
	int esc;
	for (;; )
	{
		printf("TOCAR MUSICA (1)\n");
		printf("IMPORTAR MUSICA DE ARQUIVO (2)\n");
		printf("EXPORTAR MUSICA PARA ARQUIVO (3)\n");
		printf("SAIR (4)\n");
		printf("Digite sua escolha: ");
		scanf("%d",&esc);
		switch(esc)
		{
				   case 1:
						tocamus(music);
						break;
				   case 2:
						music = importamus();
						break;
				   case 3:
						exportamus(music);
						break;
				   case 4:
						exit(1);
						break;
				   default:
						   printf("Valor invalido.");
						   break;
		}
	}
}

//funcoes.h
#define MAX 100

typedef struct
{
	   int hertz;
	   int tempo;
}notas;

notas *importamus(void);
void tocamus(notas musica[]);
void exportamus(notas musica[]);

//funcoes.c
#include "funcoes.h"
#include <stdio.h>
#include <stdlib.h>

notas *importamus(void)
{
	int i=0;
	notas musica[MAX];   
	char arq[MAX];
	char nota[MAX];
	char temp[MAX];
	FILE *fp;
	printf("Digite o nome do arquivo: ");
	scanf("%s",&arq);
	if((fp=fopen(arq, "r")) == NULL)
	{
		printf("Erro ao acessar o arquivo %s\n",arq);
		system("PAUSE");
	}
	while (!feof(fp))
	{
		  fgets(nota, MAX, fp);
		  musica[i].hertz=atoi(nota);
		  fgets(temp, MAX, fp);
		  musica[i].tempo=atoi(temp);
		  i++;
	}
	fclose(fp);
	return musica;
}

void tocamus(notas musica[])
{
}

void exportamus(notas musica[])
{
}

O erro que dá aqui é o seguinte:

in function "int main":

23 - incompatible types in assignment of 'notas' to 'notas[100]'

Já tentei mudar parametros, adicionar ponteiro, tirar ponteiro, tudo mais, alguem poderia me ajudar?

desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou sugerir uma gambiarrazinha que pode funcionar:

Porque não passa um ponteiro para o music para a função e define o objeto por lá mesmo utilizando o ponteiro que foi passado por parâmetro?

 

void *importamus(notas musica[])
{
	int i=0; 
	char arq[MAX];
	char nota[MAX];
	char temp[MAX];
	FILE *fp;
	printf("Digite o nome do arquivo: ");
	scanf("%s",&arq);
	if((fp=fopen(arq, "r")) == NULL)
	{
		printf("Erro ao acessar o arquivo %s\n",arq);
		system("PAUSE");
	}
	while (!feof(fp))
	{
		  fgets(nota, MAX, fp);
		  musica[i].hertz=atoi(nota);
		  fgets(temp, MAX, fp);
		  musica[i].tempo=atoi(temp);
		  i++;
	}
	fclose(fp);
}

case 2:
importamus(&music);
break;

Compartilhar este post


Link para o post
Compartilhar em outros sites

José, fiz o que você falou, passei a matriz como argumento para a função importamus, e modifiquei a importamus como você falou, mas alí no "case 2: importamus(&music)" tive que tirar o "&" para funcionar

agora parece estar funcionando direito.

essas passagens de parâmetros me deixam nervoso heauheauheauheau

prq será que o meu "music = importamus()" não funciona ali?

 

Obrigado pela ajuda =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Terminei as funções exportamus e tocamus sem problema, estou postando o resultado final do meu programa com um exemplo de música (nirvana-come as you are =p) para acrescentar ao fórum. quem estiver aprendendo programa que manipula structs, arquivos e sons em C pode baixar pra dar uma olhada no link:

 

http://rapidshare.com/files/131951660/notasmusicais.rar.html

são apenas códigos fonte e um .txt

obs: desculpa se não é permitido postar arquivos externos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não não são permitidos arquivos externos e você será visitado pelo FBI dentro de algumas horas e deverá dar algumas explicações e ficará sendo vigiado por 20 anos.

 

Tô brincando, claro que pode, acho até jóia isso porque ajuda as pessoas que tão tentando aprender sobre o bagulho e não sabem por onde começar :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.