Jump to content

Problemas com o visual studio


ricardo_1977
 Share

Recommended Posts

Boas, estou a desenvolver 1 projecto academico em c.

todo o codigo esta feito e foi realizado com o GCC para windows.

tenho de por o codigo a funcionar com o Visual Studio ja que a apresentação tem de ser feita com ele.

Mas esta-me a dar erro:

se fizer start debugging abre uma janela k diz

Run-Time Check Failure #3 - The variable 'd' is being used without being initialized.

a variavel em causa (d) esta a ser passada como parametros em funcoes auxiliares como por ex:

void menu(Dados d);

void initializeData(Dados d);

void imprimeDados(Dados d);

void correnteToTensao(Dados d);

Dados é uma estrutura.

alguem me pode ajudar?

Link to comment
Share on other sites

someone please....

deixo aqui todo o codigo.

repito com o GCC funciona lindamente.

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


#define MAX 10
typedef struct data{
int position;
int valor;
char desig[3];
int resistor;
} Data;

typedef struct dados {
int tam;
Data da[MAX];
} *Dados;


//declaracoes das funcoes
void menu(Dados d);
void initializeData(Dados d);
void imprimeDados(Dados d);
void correnteToTensao(Dados d);
void insertDados(Dados d,int t,int te,int re, char c[]);
float calculaUA(Dados d);
void calculaCorrente(Dados d);
void calculaResistor(Dados d);
void carregaDados(Dados d, FILE *fp);

//----------------------------------inicializar a estrutura(para lhe dar memoria)


int main() {
Dados d;
int i;
for(i=0;i<MAX;i++) {
d->da[i].position = 0;
d->da[i].valor = 0;
strncpy(d->da[i].desig,"RR",3);
printf("0\n");
getchar();
}
d->tam = 0;
menu(d);
}

void initializeData(Dados d) {
int i;
d->tam = 0;
for(i=0;i<MAX;i++) {
d->da[i].position = 0;
d->da[i].valor = 0;
d->da[i].resistor = 0;
strncpy(d->da[i].desig,"_",3);
}
}
//---------------------------------------Imprimir os dados
void imprimeDados(Dados d) {
int i;
//system("cls");
char c[3] = "UR";
char cc[3] = "IR";
printf("\n\n\n\t\tPos\tTipo\tI/U\tResistor\n\n");
for(i=0;i<d->tam;i++) {
int resistor;
printf("\t\t%d\t%s",d->da[i].position,d->da[i].desig);
toupper(d->da[i].desig);
if(!strncmp(d->da[i].desig,c,3)) {
printf("\t%dV",d->da[i].valor);
}
else {
printf("\t%dA",d->da[i].valor);
}
printf("\t%dohms\n",d->da[i].resistor);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
}

//---------------------------------------Passo 2 - transformar a corrente em tensao
void correnteToTensao(Dados d) {
FILE *fp;
carregaDados(d,fp); 
char c[3] = "UR";
char cc[3] = "IR";
int i;
for(i=0;i<d->tam;i++) {
if(!strncmp(d->da[i].desig,cc,3)) {
strncpy(d->da[i].desig,c,3);
d->da[i].valor = d->da[i].valor * d->da[i].resistor;
}
}
}

//---------------------------Passo 1 - ler do ficheiro e passar para a estrutura
void insertDados(Dados d,int t,int te,int re, char c[]) {
d->da[t-1].position = t;
d->da[t-1].valor = te;
d->da[t-1].resistor = re;
strncpy(d->da[t-1].desig,c,3);
d->tam ++;
}


//-----------------------------Passo 3 - calcular a fonte de tensao principal do circuito

float calculaUA(Dados d) {
FILE *fp;
carregaDados(d,fp);
correnteToTensao(d);
float ua= 0.0;
float numerador = 0.0;
float denominador = 0.0;
int i;
for(i=0;i<d->tam;i++) {
numerador += (((float)d->da[i].valor)/((float)d->da[i].resistor));
denominador += ((1.0)/((float)d->da[i].resistor));
}
ua = (float)(numerador/denominador);
return ua;
}

//----------------Passo 4 - calcular todas as correntes do circuito

void calculaCorrente(Dados d) {
float ua = calculaUA(d);
correnteToTensao(d);
float tabela[MAX];
int i;
float valor = 0.0;
for(i=0;i<d->tam;i++) {
valor = ua - (((float)d->da[i].valor)/((float)d->da[i].resistor));
tabela[i] = valor;
}
printf("\n\n\n\t\t\tEnt\tCorrente\n\n");
for(i=0;i<d->tam;i++) {
printf("\t\t\t%d\t%.2fA\n",(i+1),tabela[i]);
}
printf("\n\n\n\t\t\tPrima enter para continuar...");
getchar();
}

//------------------Passo 5 ----------------calcular potencia, corrente e tensao em cada resistencia

void calculaResistor(Dados d) {
float potencia[MAX];
float corrente[MAX];
float tensao[MAX];
int i;
correnteToTensao(d);
for(i=0;i<d->tam;i++) {
corrente[i] = ((float)d->da[i].valor)/((float)d->da[i].resistor);
tensao[i] = corrente[i]*((float)d->da[i].resistor);
potencia[i] = corrente[i]*tensao[i];
}
printf("\n\n\n\tR\t\tU\t\tI\t\tP\n\n");
for(i=0;i<d->tam;i++) {
printf("\t%d\t\t%.0fV\t\t%.2fA\t\t%.2fW\n",d->da[i].resistor,tensao[i],corrente[i],potencia[i]);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
}
//--------------------carregar os dados do ficheiro para memoria
void carregaDados(Dados d, FILE *fp) {
initializeData(d);
char ch[3];
int position;
int valor;
int resistor;
fp = fopen("netlist.txt","r");
if(fp==NULL) {
printf("Impossivel abrir o ficheiro!!!");
exit(0);
}
while (fscanf(fp,"%s\t%d\t%d\t%d\n",ch,&position,&valor,&resistor)==4) {
insertDados(d,position,valor,resistor,ch);
}
fclose(fp);

}


void menu(Dados d) {
int op = -1;
FILE *fp;
float result = calculaUA(d);
system("cls");
printf("\n\n\n\t\tPasso 1 - Ler e mostrar dados do ficheiro");
carregaDados(d,fp);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 2 - Passar as fontes de corrente para fontes de tensao");
correnteToTensao(d);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 3 - Calcular a tensao UA\n\n");
printf("\n\n\n\t\tTensao UA = %.0fV\n\n",result);
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
system("cls");
printf("\n\n\n\t\tPasso 4 - Calcular as correntes para cada resistencia");
calculaCorrente(d);
system("cls");
printf("\n\n\n\t\tPasso 5 - Corrente Potencia e Tensao em cada resistencia");
calculaResistor(d); 
}
Link to comment
Share on other sites

sim nisso tens razao mas mesmo que lhe faça alocaçao de memoria da me o mesmo erro.

aqui vai o novo codigo.

n percebo o que se passa

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


#define MAX 10
typedef struct data{
int position;
int valor;
char desig[3];
int resistor;
} Data;

typedef struct dad{
int tam;
Data da[MAX];
} dados;

typedef dados *Dados;

//declaracoes das funcoes
int menu(Dados d);
int initializeData(Dados d);
int imprimeDados(Dados d);
int correnteToTensao(Dados d);
int insertDados(Dados d,int t,int te,int re, char c[]);
float calculaUA(Dados d);
int calculaCorrente(Dados d);
int calculaResistor(Dados d);
int carregaDados(Dados d, FILE *fp);

//----------------------------------inicializar a estrutura(para lhe dar memoria)
int initializeData(Dados d) {
int i;
d = (Dados)malloc(sizeof(dados));
d->tam = 0;
/*for(i=0;i<MAX;i++) {
d->da[i].position = 0;
d->da[i].valor = 0;
d->da[i].resistor = 0;
strncpy(d->da[i].desig,"_",3);
}*/
return 0;
}
//---------------------------------------Imprimir os dados
int imprimeDados(Dados d) {
int i;
//system("cls");
char c[3] = "UR";
char cc[3] = "IR";
printf("\n\n\n\t\tPos\tTipo\tI/U\tResistor\n\n");
for(i=0;i<d->tam;i++) {
int resistor;
printf("\t\t%d\t%s",d->da[i].position,d->da[i].desig);
//toupper(d->da[i].desig);
if(!strncmp(d->da[i].desig,c,3)) {
printf("\t%dV",d->da[i].valor);
}
else {
printf("\t%dA",d->da[i].valor);
}
printf("\t%dohms\n",d->da[i].resistor);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
//menu(d);
return 0;
}

//---------------------------------------Passo 2 - transformar a corrente em tensao
int correnteToTensao(Dados d) {
FILE *fp;
carregaDados(d,fp); 
char c[3] = "UR";
char cc[3] = "IR";
int i;
for(i=0;i<d->tam;i++) {
if(!strncmp(d->da[i].desig,cc,3)) {
strncpy(d->da[i].desig,c,3);
d->da[i].valor = d->da[i].valor * d->da[i].resistor;
}
}
return 0;
}

//---------------------------Passo 1 - ler do ficheiro e passar para a estrutura
int insertDados(Dados d,int t,int te,int re, char c[]) {
d->da[t-1].position = t;
d->da[t-1].valor = te;
d->da[t-1].resistor = re;
strncpy(d->da[t-1].desig,c,3);
d->tam ++;
return 0;
}


//-----------------------------Passo 3 - calcular a fonte de tensao principal do circuito

float calculaUA(Dados d) {
FILE *fp;
carregaDados(d,fp);
correnteToTensao(d);
float ua= 0.0;
float numerador = 0.0;
float denominador = 0.0;
int i;
for(i=0;i<d->tam;i++) {
numerador += (((float)d->da[i].valor)/((float)d->da[i].resistor));
denominador += ((1.0)/((float)d->da[i].resistor));
}
ua = (float)(numerador/denominador);
return ua;
}

//----------------Passo 4 - calcular todas as correntes do circuito

int calculaCorrente(Dados d) {
float ua = calculaUA(d);
correnteToTensao(d);
float tabela[MAX];
int i;
float valor = 0.0;
for(i=0;i<d->tam;i++) {
valor = ua - (((float)d->da[i].valor)/((float)d->da[i].resistor));
tabela[i] = valor;
}
printf("\n\n\n\t\t\tEnt\tCorrente\n\n");
for(i=0;i<d->tam;i++) {
printf("\t\t\t%d\t%.2fA\n",(i+1),tabela[i]);
}
printf("\n\n\n\t\t\tPrima enter para continuar...");
getchar();
return 0;
}

//------------------Passo 5 ----------------calcular potencia, corrente e tensao em cada resistencia

int calculaResistor(Dados d) {
float potencia[MAX];
float corrente[MAX];
float tensao[MAX];
int i;
correnteToTensao(d);
for(i=0;i<d->tam;i++) {
corrente[i] = ((float)d->da[i].valor)/((float)d->da[i].resistor);
tensao[i] = corrente[i]*((float)d->da[i].resistor);
potencia[i] = corrente[i]*tensao[i];
}
printf("\n\n\n\tR\t\tU\t\tI\t\tP\n\n");
for(i=0;i<d->tam;i++) {
printf("\t%d\t\t%.0fV\t\t%.2fA\t\t%.2fW\n",d->da[i].resistor,tensao[i],corrente[i],potencia[i]);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
return 0;
}
//--------------------carregar os dados do ficheiro para memoria
int carregaDados(Dados d, FILE *fp) {
initializeData(d);
d->tam = 0;
char ch[3];
int position;
int valor;
int resistor;
fp = fopen("netlist.txt","r");
while (fscanf(fp,"%s\t%d\t%d\t%d\n",ch,&position,&valor,&resistor)==4) {
insertDados(d,position,valor,resistor,ch);
}
fclose(fp);
return 0;
}


int menu(Dados d) {
int op = -1;
FILE *fp;
float result = calculaUA(d);
system("cls");
printf("\n\n\n\t\tPasso 1 - Ler e mostrar dados do ficheiro");
carregaDados(d,fp);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 2 - Passar as fontes de corrente para fontes de tensao");
correnteToTensao(d);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 3 - Calcular a tensao UA\n\n");
printf("\n\n\n\t\tTensao UA = %.0fV\n\n",result);
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
system("cls");
printf("\n\n\n\t\tPasso 4 - Calcular as correntes para cada resistencia");
calculaCorrente(d);
system("cls");
printf("\n\n\n\t\tPasso 5 - Corrente Potencia e Tensao em cada resistencia");
calculaResistor(d); 
return 0;
}

int main() {
Dados d;
initializeData(d);
menu(d);
return 0;
}
Link to comment
Share on other sites

mais uma vez tinhas razao mas agora da-me este erro:

Unhandled exception at 0x00411f0d in Project.exe: 0xC0000005: Access violation writing location 0x00000000.

é na funcao int carregaDados(Dados d, FILE *fp)

e na linha: d->tam = 0;

penso que tem algo a ver com includes mas nao consigo perceber o que.

deixo ai o codigo de novo

#include "stdafx.h"



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


#define MAX 10
typedef struct data{
int position;
int valor;
char desig[3];
int resistor;
} Data;

typedef struct dad{
int tam;
Data da[MAX];
} dados;

typedef dados *Dados;

//declaracoes das funcoes
int menu(Dados d);
int initializeData(Dados d);
int imprimeDados(Dados d);
int correnteToTensao(Dados d);
int insertDados(Dados d,int t,int te,int re, char c[]);
float calculaUA(Dados d);
int calculaCorrente(Dados d);
int calculaResistor(Dados d);
int carregaDados(Dados d, FILE *fp);

//----------------------------------inicializar a estrutura(para lhe dar memoria)
int initializeData(Dados d) {
int i;
d = (Dados)malloc(sizeof(dados));
d->tam = 0;
/*for(i=0;i<MAX;i++) {
d->da[i].position = 0;
d->da[i].valor = 0;
d->da[i].resistor = 0;
strncpy(d->da[i].desig,"_",3);
}*/
return 0;
}
//---------------------------------------Imprimir os dados
int imprimeDados(Dados d) {
int i;
//system("cls");
char c[3] = "UR";
char cc[3] = "IR";
printf("\n\n\n\t\tPos\tTipo\tI/U\tResistor\n\n");
for(i=0;i<d->tam;i++) {
int resistor;
printf("\t\t%d\t%s",d->da[i].position,d->da[i].desig);
//toupper(d->da[i].desig);
if(!strncmp(d->da[i].desig,c,3)) {
printf("\t%dV",d->da[i].valor);
}
else {
printf("\t%dA",d->da[i].valor);
}
printf("\t%dohms\n",d->da[i].resistor);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
//menu(d);
return 0;
}

//---------------------------------------Passo 2 - transformar a corrente em tensao
int correnteToTensao(Dados d) {
FILE *fp;
carregaDados(d,fp); 
char c[3] = "UR";
char cc[3] = "IR";
int i;
for(i=0;i<d->tam;i++) {
if(!strncmp(d->da[i].desig,cc,3)) {
strncpy(d->da[i].desig,c,3);
d->da[i].valor = d->da[i].valor * d->da[i].resistor;
}
}
return 0;
}

//---------------------------Passo 1 - ler do ficheiro e passar para a estrutura
int insertDados(Dados d,int t,int te,int re, char c[]) {
d->da[t-1].position = t;
d->da[t-1].valor = te;
d->da[t-1].resistor = re;
strncpy(d->da[t-1].desig,c,3);
d->tam ++;
return 0;
}


//-----------------------------Passo 3 - calcular a fonte de tensao principal do circuito

float calculaUA(Dados d) {
FILE *fp;
carregaDados(d,fp);
correnteToTensao(d);
float ua= 0.0;
float numerador = 0.0;
float denominador = 0.0;
int i;
for(i=0;i<d->tam;i++) {
numerador += (((float)d->da[i].valor)/((float)d->da[i].resistor));
denominador += ((1.0)/((float)d->da[i].resistor));
}
ua = (float)(numerador/denominador);
return ua;
}

//----------------Passo 4 - calcular todas as correntes do circuito

int calculaCorrente(Dados d) {
float ua = calculaUA(d);
correnteToTensao(d);
float tabela[MAX];
int i;
float valor = 0.0;
for(i=0;i<d->tam;i++) {
valor = ua - (((float)d->da[i].valor)/((float)d->da[i].resistor));
tabela[i] = valor;
}
printf("\n\n\n\t\t\tEnt\tCorrente\n\n");
for(i=0;i<d->tam;i++) {
printf("\t\t\t%d\t%.2fA\n",(i+1),tabela[i]);
}
printf("\n\n\n\t\t\tPrima enter para continuar...");
getchar();
return 0;
}

//------------------Passo 5 ----------------calcular potencia, corrente e tensao em cada resistencia

int calculaResistor(Dados d) {
float potencia[MAX];
float corrente[MAX];
float tensao[MAX];
int i;
correnteToTensao(d);
for(i=0;i<d->tam;i++) {
corrente[i] = ((float)d->da[i].valor)/((float)d->da[i].resistor);
tensao[i] = corrente[i]*((float)d->da[i].resistor);
potencia[i] = corrente[i]*tensao[i];
}
printf("\n\n\n\tR\t\tU\t\tI\t\tP\n\n");
for(i=0;i<d->tam;i++) {
printf("\t%d\t\t%.0fV\t\t%.2fA\t\t%.2fW\n",d->da[i].resistor,tensao[i],corrente[i],potencia[i]);
}
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
return 0;
}
//--------------------carregar os dados do ficheiro para memoria
int carregaDados(Dados d, FILE *fp) {
initializeData(d);
d->tam = 0;
char ch[3];
int position;
int valor;
int resistor;
fp = fopen("netlist.txt","r");
while (fscanf(fp,"%s\t%d\t%d\t%d\n",ch,&position,&valor,&resistor)==4) {
insertDados(d,position,valor,resistor,ch);
}
fclose(fp);
return 0;
}


int menu(Dados d) {
int op = -1;
FILE *fp;
float result = calculaUA(d);
system("cls");
printf("\n\n\n\t\tPasso 1 - Ler e mostrar dados do ficheiro");
carregaDados(d,fp);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 2 - Passar as fontes de corrente para fontes de tensao");
correnteToTensao(d);
imprimeDados(d);
system("cls");
printf("\n\n\n\t\tPasso 3 - Calcular a tensao UA\n\n");
printf("\n\n\n\t\tTensao UA = %.0fV\n\n",result);
printf("\n\n\t\t\tPrima enter para continuar...");
getchar();
system("cls");
printf("\n\n\n\t\tPasso 4 - Calcular as correntes para cada resistencia");
calculaCorrente(d);
system("cls");
printf("\n\n\n\t\tPasso 5 - Corrente Potencia e Tensao em cada resistencia");
calculaResistor(d); 
return 0;
}

int main() {
Dados d = NULL;
initializeData(d);
menu(d);
return 0;
}

Link to comment
Share on other sites

Acho que nao tem nada a ver com isso.

o problema esta certamente no Visual Studio mas nao consigo é perceber porque.

eu ja fiz um exemplo simples e tentei inicializar a estrutura e depois imprimir e nao faz nada.

o problema é sempre o mesmo, nao me deixa aceder ao campo da estrutura.

nao sem se tem a ver com includes ou outra coisa qualquer.

nao entendo nada de VS e nao encontro nada sobre isto na net.

Link to comment
Share on other sites

O erro diz que estás a tentar aceder a NULL. Visto que estás a usar memória dinâmica, a variável d deveria ser um apontador: *d.

O erro parece-me ser porque estás a passar as coisas por valor para dentro das funções, em vez de as passar por referência. Assim, se alterares d dentro de uma função que não criou essa variável, apenas vai criar uma cópia para usar apenas naquela função, sem alterar a variável que lhe passaste.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

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.