main() nao imprime

1. main() nao imprime

LAB ENG
lab_eng

(usa Linux Mint)

Enviado em 30/09/2014 - 11:00h

Pessoal,

Estou implementando um codigo e nao consigo identificar o problema dele (main nao imprime diretamente, nem chamando uma funcao que faca isto).
Segue abaixo a lista dos passos da implementacao.

1 - abrir arquivo "taxis.csv"
2 - ler linha por linha transformando em uma string
3 - separar esta string em partes de strings
4 - transformar partes de strings para um valor DOUBLE
5 - salvar estes valores DOUBLE em um array global
6 - acessar este array dentro da main() (PROBLEMA PRINCIPAL)

A questao eh que dentro da main() nao esta sendo permitido imprimir (acessar) nenhuma variavel, seja ela global ou local. Acredito que esteja ocorrendo algum conflito mas nao consigo identificar.

Eu sei que o codigo esta confuso e um pouco abstrato e ate mesmo ilegivel e com coisas desnecessarias pois esta sendo implementado, porem estou iniciando em C++ e gostaria da compreensao.

Obrigado!

Segue abaixo o codigo


#include <string.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <stdio.h>
//#include <taxi.h>

using std::stringstream;
using namespace std;

#define N_LOC 370

double loc[N_LOC][2];
double lati;
double longi;
int *ptrk;

int mostra(void){
int control;
control = *ptrk;
printf("id = %.0lf, longitude = %.14lf, latitude = %.14lf \n", loc[control][0], loc[control][1], loc[control][2]);
return 0;
}

int cria(double id, double longitude, double latitude){
int control;
control = *ptrk;
loc[control][0] = id;
loc[control][1] = latitude;
loc[control][2] = longitude;
return 0;
}

int ler(){
vector<std::string> split(string str, string sep);

double longitude;
double latitude;
double id;

vector<std::string> line_parts;
string line = "";
int k = 0;
ptrk = &k;
int lines = 0;
ifstream arq;
arq.open("taxis.csv", ios::in);

if(arq.is_open())
{
while(!arq.eof())
{
getline(arq, line);
line_parts = split(line, ";");
for(int i = 0; i < 5; i++){
//cout << line_parts.at(i) << endl;
stringstream s3(line_parts.at(0));
stringstream s1(line_parts.at(3));
stringstream s2(line_parts.at(4));
s3 >> id;
s1 >> longitude;
s2 >> latitude;
cria(id, longitude, latitude);
}
k++;
}lines++;

if(lines == 1)
return 0;
arq.close();
}
}

vector<std::string> split(string str, string sep){
char* cstr=const_cast<char*>(str.c_str());
char* current;
vector<std::string> arr;
current=strtok(cstr,sep.c_str());
while(current != NULL){
arr.push_back(current);
current=strtok(NULL, sep.c_str());
}
return arr;
}



int main(void){
ler();
mostra(); //(ERRO)esta funcao aqui nao nao imprime o array global!!!
return 0;
}



  


2. Re: main() nao imprime

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/10/2014 - 09:51h

ptrk é definida com o endereço de uma variável temporária k, que se torna inválido assim que a função ler() termina de executar. E mesmo que não fosse válido, parece-me que você estaria tentando acesso de leitura uma posição após a última posição que teve um valor devidamente definido.

Eu não fiquei muito tempo tentando entender seu programa nem o sentido de cada variável. De todo modo, por que usar esse ponteiro, em vez de uma variável global comum (por exemplo, tornar o seu k global, de preferência com um nome mais descritivo)? Mas mais e melhor do que isso: por que misturar arrays nativos do C com std::vector? Não seria muito melhor se você declarasse loc como std::vector<double>?


3. Re: main() nao imprime

LAB ENG
lab_eng

(usa Linux Mint)

Enviado em 01/10/2014 - 10:38h

paulo1205 escreveu:

ptrk é definida com o endereço de uma variável temporária k, que se torna inválido assim que a função ler() termina de executar. E mesmo que não fosse válido, parece-me que você estaria tentando acesso de leitura uma posição após a última posição que teve um valor devidamente definido.

Eu não fiquei muito tempo tentando entender seu programa nem o sentido de cada variável. De todo modo, por que usar esse ponteiro, em vez de uma variável global comum (por exemplo, tornar o seu k global, de preferência com um nome mais descritivo)? Mas mais e melhor do que isso: por que misturar arrays nativos do C com std::vector? Não seria muito melhor se você declarasse loc como std::vector<double>?


Paulo,

Como eu disse estou iniciando em c++ e utilizei apenas o conhecimento que tenho, o ponteiro *ptrk serve apenas como controle da funcao cria(), ele sera o valor da linha onde as informacoes serao armazenadas. O meu objetivo eh criar um arranjo global com informacoes de latitude e longitude (valores double) que estavam em um arquivo de texto e foram lidos como uma string e apos separados e convertidos para double. Preciso armazenar em um array global para acessar estas informacoes em uma futura classe.

Desde ja obrigado pelas dicas, vou buscar resolver o problema em cima do seu questionamento.

Obrigado






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts