Lenne egy C vagy C++ kód ami fogad infót, ez lehet tcp-ről, file-ből, stb...
Ott beolvas egy string-et, amiben különböző értékadások vannak, pl.: alma=piros;korte=sarga;szilva=lila; ....
hogy tudnám e értékadásokat legegyszerűbben változóknak adni, tehát a char korte[50] változó felvenné a sarga értéket. Azaz hogy tudnam a stinget azonosítani a változóval. Olyan egysezrű megoldás triviális, mint végigkeresni az összes lehetőséget, és egyezés esetén kiválasztani, de gondolom van komplexebb megoldás is.
- 2764 megtekintés
Hozzászólások
Esetleg hasznalhatsz map-ot vagy Qt eseten QMap-ot. A C++ -ban nincs evaluacios lehetoseg, mert sem nem interpretalt sem nem JIT-forditott rendszer. Vagy matchelsz. Nem veletlen dolog, hogy a getopt-os kodok is vegigmennek a lehetosegeken switch()-el, ez az egyetlen megoldas.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
köszi, akkor marad a felsorolás, mert az eval()-t nem akarom használni...
- A hozzászóláshoz be kell jelentkezni
Hiába akarnád, nem tudod... C/C++-ban nincs ilyen.
Ha C++, akkor a legegyszerűbb, ha csinálsz egy map-et a változóknak:
map<string,string> data;
Értékadás:
string name;
string value;
// beolvasod és értelmezed az értékadást az inputból, majd
data[name]=value;
Ekkor ha kell a korte értéke, akkor ezt írod:
string temp=data["korte"];
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Esetleg map data (vagy ugyanez referenciaval) es akkor a mapbe kozvetlenul lehetne a valtozokat belerakni.
- A hozzászóláshoz be kell jelentkezni
Van a
-ldl
konyvtar, azon belul a dlopen() es a dlsym() a bara'tod:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
char korte[64];
int funct(int a,int b)
{
return(a+b);
}
int main(void)
{
char *korte_ptr;
void *handle;
handle=dlopen(NULL,RTLD_NOW);
fprintf(stderr,"handle=%p\n",handle);
korte_ptr=(char *)dlsym(handle,"korte");
fprintf(stderr,"korte_ptr=%p\n",(void *)korte_ptr);
fprintf(stderr,"korte=%p\n",(void *)korte);
return(0);
}
Forditani pedig:
gcc -Wall -pedantic -ansi -O3 -D_GNU_SOURCE -rdynamic -o korte korte.c -ldl
(lenyeg a -rdynamic es a -ldl).
Ha ezek az objektumok (
char korte[50]; ...
) kulso globalisok, akkor mennie kell. Belso valtozokra es/vagy kulso statikusokra nyilvan nem, pontosabban belsokre nyilvan, a kulso stat-ra gondolom nem.
De szvsz ez az egesz az alap-problemadra nem a legelegansabb megoldas. Lookup-tablak (hash-tree), dinamikusan allokalt tombok a valtozoknak/valtozoertekeknek, esatobbi. Persze fugg a tenyleges gyakorlati problematol is...
A.
- A hozzászóláshoz be kell jelentkezni
Szerintem ez a valasz a kerdesre, de nem javaslom. Foleg, ha nem megbizhato helyrol szarmazik az input, eleg sok gonosz dolgot muvelhet egy gonosz input.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
C-ben szerintem a keresést gyorsíthatod, nem kell mindet végig nézni, ha abc sorrendben vannak a kulcsok.
Van két tömböd az egyikben a kulcsok, a másikban az értékek, az összetartozó kulcs-érték párnak azonos az indexe a két tömbben.
A kulcs index kikeresését gyorsíthatod.
/* MAX_PAIRS: maximal number of key-value pairs
* MAX_KEY_LEN: maximal length of the key string (in characters)
* MAX_VALUE_LEN: maximal length of the value string
*/
char keys_array[MAX_PAIRS][MAX_KEY_LEN+1];
char values_array[MAX_PAIRS][MAX_VALUE_LEN+1];
int get_key_index(char* key_string) {
char* cp;
in key_index;
/* get a pointer to te key string in the key array */
cp=bsearch(key_string,keys_array,MAX_PAIRS,MAX_KEY_LEN+1,(int(*)(const void*,const void*))&strcmp);
if(cp==NULL)
{
return -1; /* no match */
}
/* calculate index from the pointer */
key_index=(cp-words)/(MAX_KEY_LEN+1);
return key_index;
}
int set_value(char* key_string,char* value_string) {
int key_index;
if((key_index=get_key_index(key_string))<0)
return -1;
strcmp(key_values[key_index],value_string);
return 0;
}
Ha tisztán C-ben szeretnéd megírni...
Persze nem próbáltam ki :)
Kimaradt némi range ellenőrzés (pl. value_string hossza).
A keys_array-t abc sorrendben kell inicializálni.
- A hozzászóláshoz be kell jelentkezni