IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Stanislav Švec:18.8.2021 17:26

Ahoj
mohl by mi někdo poradit jak na to?
mám několik proměnných a chtěl bych je v cyklu nastavovat. Ale nevím jak pracovat s názvem proměnné.
část kodu:

// proměné jsou už definovány v tvaru bool "Promenna-01" = 0; ...

for (int i = 1; i < 99; i++)
{
if(parametr == i) // do parametru vkládám int hodnoty a chci nastavit příslušnou proměnnou na 1
{ Promenna-01 = 1;
// zde bych chtěl použít proměnnou závislou na "i"
// když "i" je 1 proměnná  Promenna-01 se nastaví na 1
// když "i" je 5 proměnná  Promenna-05 se nastaví na 1 .. atd
}}

chtěl bych nějak jednoduše složit proměnnou "Promenna-" + "(int) i"

Zkusil jsem: nevím vůbec jak začít, a chtěl bych se vyhnout proměnným typu string

Chci docílit: chtěl bych nějak jednoduše složit proměnnou "Promenna-" + "(int) i"

 
Odpovědět
18.8.2021 17:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Stanislav Švec
DarkCoder:18.8.2021 18:53

V názvu proměnné nemůže být znak pomlčky. Tedy identifikátor Promenna-01 není validní. Ale k věci..

Pro skládání názvů proměnných ze dvou různých názvů lze použít operátor preprocesoru ##.

Ukázkový příklad:

#include <stdio.h>
#define concat(a, b) a##b
int main(void){
        int Promenna_1 = 100;
        printf("%d", concat(Promenna_, 1));
        return 0;
}

Program vypíše hodnotu 100, neboť dojde ke spojeni dvou hodnot, čímž vznikne název pro existující identifikátor.

Je to však nutné mít takovéto názvy proměnných a také mít je oddělené hodnotou v názvu?
Nestačilo by Ti prosté pole? Viz následující příklad:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdbool.h>

#define LRANGE 1
#define RRANGE 98
#define MAX RRANGE+1

int main(void) {

        bool bVal[100] = { false };
        unsigned param;

        do {
                scanf("%u", &param);
                if (param >= LRANGE && param <= RRANGE) bVal[param] = true;
                else break;
        } while (true);

        for (int i = LRANGE; i <= RRANGE; i++) printf("bVal[%d] = %d\n", i, bVal[i]);

        return 0;
}

Program zapisuje hodnotu 1 do indexu určeným proměnnou param. Pro kontrolu jsou hodnoty vypisovány na obrazovku.

Nahoru Odpovědět
18.8.2021 18:53
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Stanislav Švec:18.8.2021 19:53

myslíš to použít tedy takto?:

for (int i = 1; i < 99; i++)
{
if(parametr == i)
{ concat(Promenna_, i) = (TRUE);
}}

potřeboval bych aby to ten cyklus při "i=1" vnímal takto: "Promenna_001 = (TRUE);" pokud by to takto fungovalo (nuly už bych si asi adekvátně doplnil)

 
Nahoru Odpovědět
18.8.2021 19:53
Avatar
Odpovídá na Stanislav Švec
Stanislav Švec:18.8.2021 20:58

zkoušim to na tomto kodu

#include <iostream>
#define concat(a, b) a##b
using namespace std;

int main() {
    bool Prom_i=0;    bool Prom_;       bool Prom_0;      bool Prom_1=1;
    bool Prom_2=1;    bool Prom_3=0;    bool Prom_4=1;    bool Prom_5=1;
    bool Prom_6=1;    bool Prom_7=0;    bool Prom_8=0;    bool Prom_9=0;
unsigned int d = 10;

    for(int i=0; i<d; i++)
   {
       cout  << "\n" << i << ". vypis: " << concat(Prom_, i) << " - Prom_i";
   }
        return 0 ;
}

spojí to Promnou a "i" takto: Prom_i ale potreboval bych místo "i" číslo : Prom_1
Jak to upravit, aby se připojila hodnota "i"
vypis:

0. vypis: 0 - Prom_i
1. vypis: 0 - Prom_i
2. vypis: 0 - Prom_i
3. vypis: 0 - Prom_i
4. vypis: 0 - Prom_i
5. vypis: 0 - Prom_i
6. vypis: 0 - Prom_i
7. vypis: 0 - Prom_i
8. vypis: 0 - Prom_i
9. vypis: 0 - Prom_i
 
Nahoru Odpovědět
18.8.2021 20:58
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Stanislav Švec
DarkCoder:18.8.2021 23:31

## je operátor preprocesoru, tudíž k vyhodnocení dochází při překladu nikoli za běhu programu. Nelze použít obsah proměnné pro vytvoření názvu identifikátoru. Navíc sám uznej, že deklarace proměnných tímto způsobem je ohavnost. Od toho slouží pole, aby se vícero proměnných zabalilo pod jeden identifikátor, rozlišující se od sebe indexem. Výše jsem Ti poslal kompletní kód, na kterém je vidět jak to funguje.. Podívej se zejména na následující části

bool bVal[RRANGE + 1] = { false }; // pole inicializované na 0 pokrývající požadované proměnné

a

if (param >= LRANGE && param <= RRANGE) bVal[param] = true; // nastavení proměnné na daném indexu dle hodnoty - param

Použij tedy tento způsob s polem..

Nahoru Odpovědět
18.8.2021 23:31
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.