Tengo problemas para ejecutar una función y para guardar los resultados de una consulta MySQL como una variable que otras funciones pueden usar y llamar. Sé que los resultados se leen de la tabla como una cadena. Pude hacer esto bien al obtener los resultados y convertirlos en un flotador y luego pasar los resultados a un puntero. Pero parece que no puedo averiguar cómo obtener los resultados como una cadena y compararlos con otra cadena para ver si coinciden o no. No importa lo que haya intentado hacer, parece que no puedo obtener un valor para guardarlo como una cadena en una variable fuera de la función.

Aquí está el código de cómo lo hice funcionar como flotante:

(Fuera de la función principal)

float temperature_reading;
float *p_temperature_reading= &temperature_reading;
float humidity_reading;
float *p_humidity_reading= &humidity_reading;

La función que tengo trabajando con el flotador, que puedo guardar en una variable global

void MIA_get_current_temperature()
{

    const char *query = "SELECT Temperature, Humidity FROM `temperature` WHERE Type='Current_Temperature'";

    if (mysql_query(conn, query) != 0)
    {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(-1);
    } else {
        MYSQL_RES *query_results = mysql_store_result(conn);
        if (query_results) 
        { // make sure there *are* results..
            MYSQL_ROW row;

            while((row = mysql_fetch_row(query_results)) !=0)
            {

                float f = row[0] ? atof(row[0]) : 0.0f;
                float h = row[1] ? atof(row[1]) : 0.0f;

                *p_temperature_reading = f;
                *p_humidity_reading = h;

                printf("The Temp & Hum from DB is: %.1f & %.1f\n", *p_temperature_reading,*p_humidity_reading);    
            }

        /* Free results when done */
        mysql_free_result(query_results);
        }
    }
}

Esta es la función que no puedo ponerme a trabajar:

(Función principal externa)

 char ac_mode[256];
 char *p_ac_mode = &ac_mode[256];

Función:

void MIA_get_desired_temperature()
 {

    const char *query = "SELECT Mode, Desired_Temperature, Threshold FROM `ac_mode` WHERE Status='ON'";

    if (mysql_query(conn, query) != 0)
    {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(-1);
    } else {
        MYSQL_RES *query_results = mysql_store_result(conn);
        if (query_results) 
        { // make sure there *are* results..
            MYSQL_ROW row;

            while((row = mysql_fetch_row(query_results)) !=0)
            {

                char *ac = row[0] ? row[0] : "NULL";
                float desired_temperature = row[1] ? atof(row[1]) : 0.0f;
                int threshold = row[2] ? atof(row[2]) : 0.0f;

                *p_ac_mode = *ac;
                *p_desired_temperature = desired_temperature;  
                *p_threshold=threshold;

            }

        /* Free results when done */
        mysql_free_result(query_results);
        }
    }
}

Char * ac es donde quiero que se almacene la cadena.

0
Vlad 29 ene. 2016 a las 02:22

2 respuestas

La mejor respuesta

Esta línea:

char *p_ac_mode = &ac_mode[256];

..Es incorrecto. Probablemente esté intentando declarar un puntero a la matriz (o tal vez a su contenido) ... lo que está haciendo en realidad es declarar un char * que apunta al primer byte después de la matriz ac_mode. El [256] aquí no indica que ac_mode tiene 256 elementos, está indexando la matriz para obtener el elemento 256 (que sería el carácter 257 de la matriz si fuera lo suficientemente grande, pero no lo es, por lo que está fuera de la matriz). Luego, toma la dirección de ese char fuera de los límites y lo asigna a p_ac_mode, de modo que p_ac_mode apunte a él.

Para apuntar p_ac_mode al contenido de la matriz, solo usaría char *p_ac_mode = ac_mode; (lo que lo convierte en una char * que apunta al primer char de la matriz). Para obtener un puntero a la matriz en sí, usaría char (*p_ac_mode)[256] = &ac_mode;, lo que lo convierte en un puntero a una matriz de 256 elementos de char. En cualquier caso, no hay necesidad de p_ac_mode en absoluto, porque puede acceder a la matriz a través de ac_mode directamente en los mismos lugares, y el nombre de la matriz ac_mode normalmente se convertirá en un puntero a su primer char de todos modos.


Con esta línea:

                *p_ac_mode = *ac;

... estás copiando el primer char de la cadena ac al primer char después de ac_mode (porque eso es lo que p_ac_mode apunta, como se explicó anteriormente). Sospecho que en realidad estás intentando asignar el contenido completo de la cadena ac a ac_mode a través de p_ac_mode, pero eso no funcionará por algunas razones.

Una matriz es en realidad un bloque de memoria que contiene una serie de valores del mismo tipo. Aunque en muchas situaciones el nombre de la matriz se convertirá en un puntero (la dirección del primer elemento de la matriz), la matriz en sí es el bloque de memoria y no el puntero. No puede simplemente asignar un puntero (nueva dirección) a la matriz, y el contenido de la matriz tampoco se copia automáticamente de esta manera. Los contenidos deben copiarse elemento por elemento o utilizando una función que los copie.

Lo que debe hacer es copiar el contenido de la cadena de los resultados de su consulta en la matriz ac_mode con strcpy() o similar. Solo cambiando esta línea:

                *p_ac_mode = *ac;

A esto:

                strcpy(ac_mode, ac);

... haría eso.

1
Dmitri 29 ene. 2016 a las 16:49

Necesita usar strcpy en su función MIA_get_desired_temperature. Además, no necesita el puntero p_ac_mode. Simplemente copie en ac_mode directamente.

strcpy(ac_mode, ac);
1
Eddie 29 ene. 2016 a las 02:58