2009-06-09 32 views
5

साथ चर नाम बदल वहाँ एक पाश के साथ निम्नलिखित लिखने के लिए सरणियों का उपयोग किए बिना एक रास्ता है:एक पाश

cout<<"This variable c1 ="c1 
cout<<"This variable c2 ="c2 
cout<<"This variable c3 ="c3 

for(i=1,i<8,i++) 
cout<<"This variable c%d =",i<<**????**<< 

यह स्पष्ट रूप से मैं क्या नहीं किया जा करने की आवश्यकता है, लेकिन सबसे आसान उदाहरण मैं के बारे में सोच सकता है एक ही समस्या के साथ ... तो मैं क्या करना चाहता हूं लूप में चर बदलता है, आउटपुट नहीं!

संपादित करें: धन्यवाद सभी इनपुट के लिए बहुत कुछ, यहां मेरी समस्या का वर्णन करने में मदद करने के लिए कोड का एक और अधिक है ... मैं सी ++ के साथ क्लिप्क्स का उपयोग कर रहा हूं। पाश सात पर अंत नहीं होगा, लेकिन जब एक को रोकने मापदंड

static void populatebyrow (IloModel model, IloNumVarArray x, IloRangeArray c) 
{ 
    IloExpr c1(env); 
    IloExpr c2(env); 
    IloExpr c3(env); 
    IloExpr c4(env); 

    c.add(c1>=n); 
    c.add(c2>=n); ... 

    model.add(c); 
} 

मैं किसी सरणी बुलाया ग कि cplex में एक मॉडल के लिए एक इनपुट किया जाएगा करने के लिए इन भाव जोड़ना चाहते हैं पूरा किया जाता है। फिर मुझे क्लिप्क्स से परिणाम मिलने के बाद मैं एक अभिव्यक्ति सी (i) जोड़ना चाहता हूं और इसे फिर से हल करना चाहता हूं ... जब तक मुझे वह मान प्राप्त न हो जाए जो मुझे चाहिए ... IloExprArray का भी किसी भी तरह उपयोग किया जा सकता है, लेकिन तब मैं नहीं इस पद्धति का उपयोग भाव जोड़ने के बारे में जानते हैं:

for(i= 0,...) 
{ 
    c7 +=x[i]; 
} 
+1

आप एक सरणी का उपयोग क्यों नहीं करेंगे? यदि चर सेट एक सरणी (या अन्य गणनीय संग्रह) सेट करता है तो सही समाधान की तरह लगता है। – annakata

+0

सी ++ में "एक चर नाम बदलने" की आवश्यकता नहीं है, क्योंकि आप बस अपनी पसंद के किसी अन्य चर के लिए सूचक बना सकते हैं। – Wedge

+0

आप टेक्स्ट प्रोसेसर या 'perl' के साथ अपना स्रोत कोड क्यों नहीं बनाते? – mbx

उत्तर

10

अगर मैं सही ढंग से समझ, आप गतिशील रूप से चर नाम बनाने के लिए कोशिश कर रहे हैं। AFAIK यह C++ के साथ संभव नहीं है।

+0

मैं इसके लिए डर गया था ... वैसे भी –

+0

वैसे वह लूप में एक बड़ा स्विच स्टेटमेंट डाल सकता है लेकिन यह हास्यास्पद है – annakata

6
int* varArray[] = {&c1, &c2, &c3}; 
int size = sizeof(varArray)/sizeof(int*); 

for(int i = 0; i < size; ++i) 
{ 
    std::cout << "This variable c"<< i+1 << " = " << *varArray[i] << std::endl; 
} 
+1

शायद मुझे कुछ याद आ रहा है, लेकिन क्यों लूप 7 तक? –

+0

मेरी गलती। यह सरणी की लंबाई होना चाहिए। –

+1

तदनुसार कोड बदल दिया। –

9

मैं इसके लिए एक सरणी का उपयोग करने की सिफारिश करता हूं। आपको एक संकलित भाषा में गतिशील परिवर्तनीय नामों के साथ नहीं खेलना चाहिए।

int c[] = {2, 5, 7, 9, 3, 4, 6, 5}; 
for (int i = 0; i < 8; i++) cout // and so on... 
0

ठीक है अगर आप वास्तव में किसी सरणी के साथ नहीं जा सकते हैं, तो पॉइंटर के साथ प्रयास क्यों न करें। मुझे पता है कि निम्नलिखित उदाहरण अनिवार्य रूप से एक सरणी है, हालांकि यह थोड़ा अलग है इसलिए यह एक शॉट के लायक हो सकता है।

#include <iostream> 
#include <conio.h> 

#define N 10 

using namespace std; 

int main() { 

    int * a = new int[N]; 

    for (int i = 0, * b = a; i < N; i++, b++) { 
     *b = i;  
    } 


    for (int i = 0, * b = a; i < N; i++, b++) { 
     cout << *b << endl; 
    } 

    getch(); 
} 

यह अभी भी एक सरणी है, हालांकि इसका उपयोग थोड़ा अलग होता है और बस आप जो खोज रहे हैं वह हो सकता है। यदि ऐसा नहीं है, तो कृपया अपने प्रश्न को स्पष्ट करें ताकि हम आपकी मदद कर सकें। यहां तक ​​कि यदि यह सबसे सरल उदाहरण है जिसे आप सोच सकते हैं, तो कुछ और विवरण जोड़ने का प्रयास करें।

संपादित करें मैंने अभी देखा (एक टिप्पणी में) आप गतिशील रूप से परिवर्तनीय नाम बनाने की कोशिश कर रहे थे। जहां तक ​​मुझे पता है कि यह संभव नहीं है, हालांकि आप HashMap पर लागू करने का प्रयास कर सकते हैं (या लाइब्रेरी का उपयोग कर सकते हैं, मुझे यकीन है कि वहां बहुत कुछ है)। हैशैप का उपयोग करके आप किसी आइटम को स्ट्रिंग (कुंजी) से लिंक कर सकते हैं ताकि आप किसी आइटम को कस्टम स्ट्रिंग में लिंक कर सकें, जो उपयोगकर्ता द्वारा दर्ज किया गया है (मान लीजिए कि आपको इसके लिए क्या चाहिए)।

0

मैंने हमेशा सीखा है कि यदि "परिवर्तनीय variablenames" गलत सवाल पूछने के लिए है। इसे अलग हल किया जा सकता है।

1

यदि आप कुछ भी करना चाहते हैं, तो आप एक मैक्रो से फंस गए हैं। कृपया समझते हैं कि इस भयानक और unmaintainable है, लेकिन अगर आप जोर देते हैं, तो आप इस तरह कुछ कर सकता है:

#define Q(a) a 
#define DO_THING(a, expr) do { Q(a)1 expr; Q(a)2 expr; Q(a)3 expr; Q(a)4 expr } while (0) 

DO_THING(b, [i] = i); 

इस कोड में जो परिणाम:

do { b1 [i] = i; b2 [i] = i; b3 [i] = i; b4 [i] = i } while (0); 

कृपया यह सब लिखा है, कृपया कृपया ऐसा मत करो।भले ही आप इसे अधिक मैक्रो में लपेटें ताकि इसे अर्ध-पठनीय बनाने के लिए, कृपया सामान्य ज्ञान को इस योजना को जीतने और त्यागने दें।

0

शोषण या मेटाप्रोग्रामिंग गिनती करता है?

#include <iostream> 
template<unsigned U> 
struct Fac{ enum { value = U * Fac<U-1>::value};}; 
template<> 
struct Fac<0>{ enum { value = 1};}; 
template<unsigned U> 
struct Fib{ enum {value = (Fib<U-1>::value + Fib<U-2>::value)};}; 
template<> 
struct Fib<0>{ enum {value = 0};}; 
template<> 
struct Fib<1>{ enum {value = 1};}; 
template<unsigned U> 
void show(){ 
    show<U-1>(); 
    std::cout << "Fib(" << U << ")=" << Fib<U>::value << "\t" << "Fac(" << U << ")=" << Fac<U>::value << std::endl; 
} 
template<> 
void show<0>(){} 

int main(int argc, char** argv){ 
    show<12>(); 
} 

वहाँ भी बढ़ावा पूर्वप्रक्रमक एक्सटेंशन का उपयोग करने के संभावना है, तो आप पाश एक मैक्रो पहचानकर्ता उत्पन्न करने के लिए कर सकते हैं।

0

मैं इस समारोह का इस्तेमाल किया है पर इस्तेमाल के उदाहरण हैं करने के लिए है और यह ठीक काम करता है:

IloNumVarArray x(env, 10); 

for(i=0; i<10; i++){ 
    x[i] = IloNumVar(env, 0, IloInfinity); 

    // Code for change the name of each variable 
    char index[2]; 
    sprintf(index, "%d", i); 
    char variable_name[6] = "x"; 
    strcat(variable_name, index); 
    x[i].setName(variable_name); 
}