Go Down

Topic: STRUCT (Read 4699 times) previous topic - next topic

pincho41700

Hola a todos. tengo un struct como el de abajo  en un .h
cuando quiero iniocializar un objeto  ( este en concreto);

struct udtTime fechaHora = {2010, 3, 26, 12, 00, 00}; //creo un objeto
esto lo escribo antes del setup.
porque me sale el siguiente error compilando? cual seria la solucion?
has initializader but imcomplete type

Un saludo.



struct cTime
{
 
        int iYear;
   int iMonth;
   int iDay;
   double dHours;
   double dMinutes;
   double dSeconds;
};

surbyte

#1
Aug 27, 2014, 01:25 pm Last Edit: Aug 27, 2014, 01:36 pm by surbyte Reason: 1
Lo primero que veo mal es que tu estructura la definiste como cTime
y luego asignas con  udtTime
Entonces uniformiza a uno u otro nombre.

Lo segundo que veo es que defines hora, min, seg como double pero luego asignas como entero.
debes poner

struct cTime fechaHora = {2010, 3, 26, 12.0, 0.0, 0.0}; //creo un objeto
con los puntos decimales.
a ver si funciona tal como tu lo planteaste.

Ahora mi consejo es que no uses double en hora, min, seg sino sigue con entero a menos que trabajes con un GPS y sean datos que vengan de ahi, entonces es posible que si los necesites.


pincho41700

gracias surbyte por contestar.
Lo he hecho como tu dices y  el compilador dice lo mismo.
tabien tengo en el .h la siguiente funcion :
void sunpos(cTime udtTime,cLocation udtLocation, cSunCoordinates *udtSunCoordinates)
en la cual creo un objeto en la misma funcion, no se si valdra asi, pero creo que si,
porque en dev c++ funciona a la perfeccion
un saludo

surbyte

Porque no subes las librerías que estas usando asi podemos reproducir el problema.
haz un pequeño ejemplo asignando que repita el error si no quieres mostrar tu código.

pincho41700

ok no tengo problema por enseñar el codigo.

.h

// This file is available in electronic form at http://www.psa.es/sdg/sunpos.htm

#ifndef __SUN_H
#define __SUN_H
#include "Arduino.h"

// Declaration of some constants
#define pi    3.14159265358979323846
#define twopi (2*pi)
#define rad   (pi/180)
#define dEarthMeanRadius     6371.01   // In km
#define dAstronomicalUnit    149597890   // In km

struct cTime
{
 
        int iYear;
   int iMonth;
   int iDay;
   double dHours;
   double dMinutes;
   double dSeconds;
};

struct cLocation
{
   double dLongitude;
   double dLatitude;
};

struct cSunCoordinates
{
   double dZenithAngle;
   double dAzimuth;
};

void sunpos(cTime udtTime, cLocation udtLocation, cSunCoordinates *udtSunCoordinates);

#endif


.cpp

// This file is available in electronic form at http://www.psa.es/sdg/sunpos.htm
// Algorytm opisany i zaimplementowany przez:
// MANUEL BLANCO-MURIEL, DIEGO C. ALARCON-PADILLA, TEODORO LOPEZ-MORATALLA i MARTIN LARACOIRA
#include "sun.h"
#include <stdio.h>
#include <math.h>
#include "Arduino.h"


void sunpos(cTime udtTime,cLocation udtLocation, cSunCoordinates *udtSunCoordinates)
{
   // Main variables
   double dElapsedJulianDays;
   double dDecimalHours;
   double dEclipticLongitude;
   double dEclipticObliquity;
   double dRightAscension;
   double dDeclination;

   // Auxiliary variables
   double dY;
   double dX;

   // Calculate difference in days between the current Julian Day
   // and JD 2451545.0, which is noon 1 January 2000 Universal Time
   {
      double dJulianDate;
      long int liAux1;
      long int liAux2;
      // Calculate time of the day in UT decimal hours
      dDecimalHours = udtTime.dHours + (udtTime.dMinutes
         + udtTime.dSeconds / 60.0 ) / 60.0;
      // Calculate current Julian Day
      liAux1 =(udtTime.iMonth-14)/12;
      liAux2=(1461*(udtTime.iYear + 4800 + liAux1))/4 + (367*(udtTime.iMonth
         - 2-12*liAux1))/12- (3*((udtTime.iYear + 4900
      + liAux1)/100))/4+udtTime.iDay-32075;
      dJulianDate=(double)(liAux2)-0.5+dDecimalHours/24.0;
      // Calculate difference between current Julian Day and JD 2451545.0
      dElapsedJulianDays = dJulianDate-2451545.0;
   }

   // Calculate ecliptic coordinates (ecliptic longitude and obliquity of the
   // ecliptic in radians but without limiting the angle to be less than 2*Pi
   // (i.e., the result may be greater than 2*Pi)
   {
      double dMeanLongitude;
      double dMeanAnomaly;
      double dOmega;
      dOmega=2.1429-0.0010394594*dElapsedJulianDays;
      dMeanLongitude = 4.8950630+ 0.017202791698*dElapsedJulianDays; // Radians
      dMeanAnomaly = 6.2400600+ 0.0172019699*dElapsedJulianDays;
      dEclipticLongitude = dMeanLongitude + 0.03341607*sin( dMeanAnomaly )
         + 0.00034894*sin( 2*dMeanAnomaly )-0.0001134
         -0.0000203*sin(dOmega);
      dEclipticObliquity = 0.4090928 - 6.2140e-9*dElapsedJulianDays
         +0.0000396*cos(dOmega);
   }

   // Calculate celestial coordinates ( right ascension and declination ) in radians
   // but without limiting the angle to be less than 2*Pi (i.e., the result may be
   // greater than 2*Pi)
   {
      double dSin_EclipticLongitude;
      dSin_EclipticLongitude= sin( dEclipticLongitude );
      dY = cos( dEclipticObliquity ) * dSin_EclipticLongitude;
      dX = cos( dEclipticLongitude );
      dRightAscension = atan2( dY,dX );
      if( dRightAscension < 0.0 ) dRightAscension = dRightAscension + twopi;
      dDeclination = asin( sin( dEclipticObliquity )*dSin_EclipticLongitude );
   }

   // Calculate local coordinates ( azimuth and zenith angle ) in degrees
   {
      double dGreenwichMeanSiderealTime;
      double dLocalMeanSiderealTime;
      double dLatitudeInRadians;
      double dHourAngle;
      double dCos_Latitude;
      double dSin_Latitude;
      double dCos_HourAngle;
      double dParallax;
      
      dGreenwichMeanSiderealTime = 6.6974243242 +
         0.0657098283*dElapsedJulianDays
         + dDecimalHours;
      dLocalMeanSiderealTime = (dGreenwichMeanSiderealTime*15
         + udtLocation.dLongitude)*rad;
      dHourAngle = dLocalMeanSiderealTime - dRightAscension;
      dLatitudeInRadians = udtLocation.dLatitude*rad;
      dCos_Latitude = cos( dLatitudeInRadians );
      dSin_Latitude = sin( dLatitudeInRadians );
      dCos_HourAngle= cos( dHourAngle );
      udtSunCoordinates->dZenithAngle = (acos( dCos_Latitude*dCos_HourAngle
         *cos(dDeclination) + sin( dDeclination )*dSin_Latitude));
      dY = -sin( dHourAngle );
      dX = tan( dDeclination )*dCos_Latitude - dSin_Latitude*dCos_HourAngle;
      udtSunCoordinates->dAzimuth = atan2( dY, dX );
      if ( udtSunCoordinates->dAzimuth < 0.0 )
         udtSunCoordinates->dAzimuth = udtSunCoordinates->dAzimuth + twopi;
      udtSunCoordinates->dAzimuth = udtSunCoordinates->dAzimuth/rad;
      // Parallax Correction
      dParallax=(dEarthMeanRadius/dAstronomicalUnit)
         *sin(udtSunCoordinates->dZenithAngle);
      udtSunCoordinates->dZenithAngle=(udtSunCoordinates->dZenithAngle
         + dParallax)/rad;
   }
}


arduino

//GIRASOL SOLAR

//#include <sunpos.h>

  struct udtTime fechaHora = {2010, 3, 26, 12.0, 0.0, 0.0}; //creo un objeto
struct cLocation Coordenadas;//  creo un objeto    = {51.109308,17.058477};
struct cSunCoordinates coordenadasSol;  //creo un objeto

void setup()
{
 
Serial.begin(9600);
//inicializo los objetos
fechaHora = {2010, 3, 26, 12, 00, 00}; //Aqui se cambia la fecha y hora

Coordenadas = {51.109308,17.058477};  //Aqui la longuitud y latitud

sunpos(fechaHora, Coordenadas, &coordenadasSol); //mando los objetos a la libreria

//printf("Azymut: %lf\nKat wzgledem zenitu: %lf", pozycjaSlonca.dAzimuth, pozycjaSlonca.dZenithAngle);
   
}

void loop()

// printf("Polozenie Slonca dla:\n1. Pozycja geograficzna:\n- szerokosc %lf\n- dlugosc %lf\n2. Aktualny czas:\n%d:%d:%d %d.%d.%dr.\n\n",
//   polozenie.dLatitude, polozenie.dLongitude, (int)aktualnyCzas.dHours, (int)aktualnyCzas.dMinutes, (int)aktualnyCzas.dSeconds, aktualnyCzas.iDay,
//   aktualnyCzas.iMonth, aktualnyCzas.iYear);

  Serial.print("Azimuth: ");
  Serial.println( coordenadasSol.dAzimuth);
  delay (1000);
 
}

a ver si podemos hacer que esto funcione!

surbyte

#5
Aug 27, 2014, 06:42 pm Last Edit: Aug 27, 2014, 08:10 pm by surbyte Reason: 1
Mirá logre llegar hasta una situación bastante cercana

AyudaGPS.ino: In function 'void setup()':
AyudaGPS:16: error: expected primary-expression before '{' token
AyudaGPS:16: error: expected `;' before '{' token
AyudaGPS:18: error: expected primary-expression before '{' token
AyudaGPS:18: error: expected `;' before '{' token

pero x hoy no puedo seguir. Debo atender otras cosas.
Te paso lo que hice en los adjuntos.

surbyte

Aparentemente quedó funcionando.

Adjunto los dos files

pincho41700

Maquina , ya funciona perfectamente.
Voy a a analizar lo que has hecho y te preguntare lo que no comprendo

surbyte

Lo primero es que siempre los compiladores C o C++ guardan algunas peculiaridades.
En este caso la librería de sunpos venía definiendo la estructura como tu bien indicaste.

struct cTime
{
   int iYear;
   int iMonth;
   int iDay;
   double dHours;
   double dMinutes;
   double dSeconds;
};

como no conocía el código pensé que no hacia falta poner como double a horas, min, seg pero claro, son datos geodésicos entonces arrastran información de precisión.
Bueno visto eso, y el error busqué si estaba bien definida la estructura, en principio si, y esto me confundió mas
http://playground.arduino.cc/Code/Struct

según esto el código debería funcionar bien, pero ambos sabemos que no. De todas formas si le sigues buscando la vuelta estoy seguro que funcionaría sin typedef.
Por ultimo buscando respuesta a los errores, la sugerencia fue de usar typedef y asi hice pero no sin antes luchar con la asignación de la estructura.
Si por ejemplo retiras la asignación que haces Arduino Solar, el programa da errores.

Te comento que encontré un programa espectacular que hace lo mismo que este pero con un plus viene con toda una electronica que permite ubicar al sol al igual que tu programa pero con el control de los servos para posicionarlo.
Te interesa?

pincho41700

claro que me interesa surbayte, mandamelo cuando puedas a ver como es el codigo.

una pregunta
si se le pasa a struct por punteros se debe trabajar con -> y tu has puesto     coordenadasSol.dAzimuth
y funciona a la perfeccion , como es eso?

surbyte

Mira porque esta GENIALLLLLLLLL tremendo proyecto, con punto y coma.
videos, explicación, TODO EN INGLES pero muy bien explicado. Hay foro por si tienes dudas.
http://cerebralmeltdown.com/Sun_Tracking_and_Heliostats/


pincho41700

vaya pedazo de proyecto, si señor.
gracias surbyte por la direccion.

surbyte

Es maravilloso no te parece? Mira que tu idea de trabajo me gustó pero esta me encantó.
Estoy pensando seriamente construirlo para mantener unos colectores solares que calienten agua.
Pero ya veremos porque la magnitud de lo que quiero hacer me supera presupuestarmiente hoy, y mi pais no esta para hacer gastos innecesarios.

pincho41700

Haz como yo , casi todo lo cojo de las chatarrerias industriales, tengo todos los motores que quieros por cantidades ridiculas ylos tubos los compro tambien en los desguace y los corto a las medidas y despues se pintan y quedan como nuevo.

surbyte

Buen consejo pero vivo en la Patagonia Argentina y no hay chatarrerias industriales. De todas maneras voy a programarme para hacerlo cuando este en buenos aires o córdoba de Argentina.

Go Up