variable usar resueltos leer funciones ejercicios ejemplos como caracteres cadenas cadena arreglo c++ string variables map std-pair

usar - convirtiendo un nombre de variable en una cadena en C++



leer cadena de caracteres en c (7)

Me gustaría enviar algunos datos a un archivo. Por ejemplo, supongamos que tengo dos vectores de dobles:

vector<double> data1(10); vector<double> data2(10);

¿Hay alguna manera fácil de mostrar esto en un archivo para que la primera fila contenga los títulos "data1" y "data2" seguidos de los contenidos reales? La función que genera los datos se pasará por varias matrices diferentes, por lo que no es posible codificar el nombre del encabezado. Idealmente, me gustaría convertir el nombre de la variable en una cadena y luego sacar esa cadena seguida de los contenidos de la matriz vectorial. Sin embargo, no estoy seguro de cómo convertir el nombre de la variable ''data1'' a una cadena, o de hecho si se puede hacer fácilmente (leyendo los foros, creo que no se puede) Si esto no es posible, una alternativa podría ser usar un contenedor asociativo como un mapa o quizás más simplemente un contenedor ''par''.

pair<vector<double>,string> data1(10,''data1'');

¡Cualquier sugerencia será bienvenida!


Hubiera pensado que la respuesta obvia es hacer que la función que realiza la salida tome el texto del encabezado como un parámetro de cadena.


Ligeramente adaptado de la respuesta de @ sarnold, para C ++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl;

Un programa de ejemplo que usa esto:

int main() { int foo = 1; DEBUG(foo); return 0; }


Puede usar el preprocesador "stringify" # para hacer lo que desee:

#include <stdio.h> #define PRINTER(name) printer(#name, (name)) void printer(char *name, int value) { printf("name: %s/tvalue: %d/n", name, value); } int main (int argc, char* argv[]) { int foo = 0; int bar = 1; PRINTER(foo); PRINTER(bar); return 0; } name: foo value: 0 name: bar value: 1

(Lo siento por printf , nunca <iostream> . Pero esto debería ser suficiente).


Puedes usar el preprocesador, hay un token de stringify, pero solo está disponible desde la fuente, no a una función (obtendrías el nombre del argumento).


Wow, esto es un poco trickey, una cosa que podrías intentar hacer es hacer clases o estructuras, que tienen un elemento que es la cadena ''name''.


Yo tuve el mismo problema. Después de un poco de experimentación, creé las siguientes macros que convierten los nombres de variables, campos, funciones, métodos y tipos en cadenas.

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable) #define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function) #define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method) #define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type)

El código usa el operador de coma y la conversión de vacío para forzar al compilador a verificar si la variable, función, etc. realmente existe. Lo bueno es que también funciona bien con variables no inicializadas. Lo probé tanto en VC como en GCC con todas las opciones pedantes que descubrí sin ningún mensaje de advertencia.

int GetAndPrintValue(const char* VariableName) { std::cout << VariableName << std::endl; return 10; } int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));

Utilizo dicho código cuando escribo analizadores que leen datos del flujo de entrada y si la variable analizada está fuera de límites arroja una excepción con el nombre de la variable que falló mis verificaciones de validez.


prueba esto:

#define GET_VARIABLE_NAME(Variable) (#Variable)

// en funciones

int var=0; char* var_name= GET_VARIABLE_NAME(var);