Obtener una consulta de MySQL para guardar como una variable global es C

Tengo problemas para ejecutar una función y los resultados de una consulta de MySQL se guardan como una variable que otras funciones pueden usar y llamar. Sé que los resultados se leen de la tabla como una cadena. Pude hacerlo 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 compararla 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 a una variable fuera de la función.

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

(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:

(Fuera de la función principal)

  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 guarde la cadena.

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 realmente está haciendo es declarar un char * que apunta al primer byte después de la matriz ac_mode . El [256] aquí no indica que ac_mode tenga 256 elementos, está indexando la matriz para obtener el elemento 256 (que sería el 257º carácter de la matriz si fuera lo suficientemente grande, pero no lo es, por lo que está fuera de la matriz) . A continuación, está tomando la dirección de ese char fuera de límites y asignándola a p_ac_mode , de modo que p_ac_mode apunte a ella.

Para apuntar p_ac_mode al contenido de la matriz, solo deberías usar char *p_ac_mode = ac_mode; (lo que lo convierte en un char * apunta al primer char de la matriz). Para obtener un puntero a la matriz en sí, debe usar char (*p_ac_mode)[256] = &ac_mode; , lo que lo convierte en un puntero a una matriz de caracteres de 256 elementos. 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 todos los mismos lugares, y el nombre de la matriz ac_mode generalmente decae en un puntero a su primer char 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 a lo que apunta p_ac_mode , como se explicó anteriormente). Sospecho que en realidad estás intentando asignar el contenido de toda la cadena de ac a ac_mode través de p_ac_mode , pero eso no funcionará por varias 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 descompondrá en un puntero (la dirección del primer elemento de la matriz), la matriz en sí misma 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. El contenido debe copiarse sobre elemento por elemento, o mediante una función que copia el contenido.

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

  *p_ac_mode = *ac; 

a esto:

  strcpy(ac_mode, ac); 

… haría eso.

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

 strcpy(ac_mode, ac);