CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Rodzaj String/AnsiString w pętli

Rodzaj String/AnsiString w pętli

dział ogólny

Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » środa, 25 marca 2020, 16:51

Robiłem sobie prostą szachownicę w komponencie StringGrid, czyli 64 pól o indeksach od A1 do H8. Sprawa trywialna. Założyłem, że zrobię tablicę podwójną tablicę stringów 8 na 8, i wartość będzie generowana z połączenia tablicy char o wartościach od 'A' do 'Z', lub String o wartościach od "A" do "Z" do tego połączenie wartości int z zakresu: 1-8, połączone funkcją IntToStr(tab[8 elementow])

Czyli wyszło coś takiego:
KOD cpp:     UKRYJ  
int main_Int[8],i,k;
 AnsiString main_Char[8]={"A","B","C","D","E","F","G","H"},j;
 AnsiString chess_Table[8][8];
 for(i=0;i<8;i++)
    main_Int [ i] = i+1;
 for(i=0;i<8;i++)
 {
  for(k=0;k<8;k++)
  {
   chess_Table[ i ][ k ]=(main_Char[ i ]+" "+IntToStr(main_Int[ k ]));
   StringGrid1->Cells[ k ] [ i ]=chess_Table[ i ][ k ];
  }
 }

 

Chodzi i kompiluję się jak najbardziej. Tyle, że zapis:
KOD cpp:     UKRYJ  
AnsiString main_Char[8]={"A","B","C","D","E","F","G","H"},j;

został wymuszony, pierwotnie chciałem wykorzystywać pętle dla Stringa, czyli coś takiego:
KOD cpp:     UKRYJ  
 String main_St[8],k;
  char main_Ch[8],j;
  int main_Int[8];
   for(k="A",i=0;k<"I";k++,i++)
  {
          main_St[ i ]=k;
          main_Int[ i ]=i+1;
  }
 

Jednak kompilator pokazuje błąd jako - bcc32 Error mCh2.cpp(29): E2096 Illegal structure operation

zrobienie analogicznej operacji, dla typu char

KOD cpp:     UKRYJ  
 for(j='A',i=0;j<'I';j++,i++)
  {
          main_Ch[ i ]=j;
          main_Int[ i ]=i+1;
  }
 

już błędem nie jest. Dlatego mam pytanie, czy istnieje jakiś mechanizm dla typów String/AnsiString/UnicodeString, który pozwoli zliczać wartości "a..z A..Z" np za pomocą pętli for?
Spację przy tablicach, robiłem celowo z powodu formatowania (znaczniki html się włączały)
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez Mironas » środa, 25 marca 2020, 17:52

KOD cpp:     UKRYJ  
  String znaki = "ABCDEFGH";
  char z;
  for (int i=1 ; i<=znaki.Length() ; i++)
  {
    z = znaki[i];
    /* ... */
  }
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » środa, 25 marca 2020, 18:14

Dzięki, zawsze to jakieś ułatwienie. Próbowałem, to jeszcze zrobić tak dla treningu za pomocą funkcji w C z użyciem odrzucanej itoa, ale tutaj już stanąłem w miejscu (co Stringi to Stringi)
KOD cpp:     UKRYJ  
  char chess_Table[64][64];
    int tab_Int[8];
    char tab_Char[8];
    char buf_Itoa[8][8];
    int i,k,l;
    char j;
    for(j='A',i=0;j<'I';j++,i++)
    {
        tab_Char[i]=j;
        tab_Int[i]=i+1;
        itoa(tab_Int[i],buf_Itoa[i],10);
    }
    l=0;
    for(i=0;i<8;i++)
    {
        for(k=0;k<8;k++)
        {
         chess_Table[l][0]=tab_Char[i];
         strcat(chess_Table[l],buf_Itoa[k]);
         l++;
        }
    }
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez Mironas » środa, 25 marca 2020, 19:00

A co tutaj chcesz zrobić i co Ci nie działa?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » środa, 25 marca 2020, 19:23

chess_Table ma dostać 64 zmiennych char[] od A1 do H8. Dostaje coś innego, tj same cyfry, które po pzekształceniu itoa są naturalnie łańcuchami char. Czyli zamiast A1,A2 etc... 1,2,3.. W sumie nie wiem, gdzie leży błąd.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez Mironas » środa, 25 marca 2020, 21:23

Nie analizowałem całości, ale taka pętla:
KOD cpp:     UKRYJ  
for(j='A',i=0;j<'I';j++,i++)

nie wykona się dla wszystkich pól.
Zrób dwie oddzielne pętla dla i oraz j, jedna zagnieżdżona w drugiej.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez polymorphism » środa, 25 marca 2020, 22:19

KOD cpp:     UKRYJ  
        tab_Int[i]=i+1;
        itoa(tab_Int[i],buf_Itoa[i],10);

Po co tablica tab_Int? Nie wystarczy tak:
KOD cpp:     UKRYJ  
itoa(i + 1, buf_Itoa[i], 10);

?

Chociaż całość można uprościć do:
KOD cpp:     UKRYJ  
for (int i = 0, j = 0; j < 8; ++j) {
    for (int k = 0; k < 8; ++k, ++i) {
        chess_Table[i][0] = "ABCDEFGH"[j];
        chess_Table[i][1] = "12345678"[k];
        chess_Table[i][2] = 0;
    }
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lukagrom
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » czwartek, 26 marca 2020, 09:39

Tu jeszcze wariant, gdzie String zlicza sobie wartosci dzieki petli for, a nie przypisaniu szeregow wartosci. W sumie najprostrzy i najwygodniejszy.

KOD cpp:     UKRYJ  
UnicodeString string_Board[8],chess_Table[8][8];
 int int_Board[8];
 wchar_t f_Char='A';
 for(int i=0;i<8;i++)
 {
         string_Board[i]=UnicodeString(f_Char);
         int_Board[i]=i+1;
         ++f_Char;
 }
 for(int i=0;i<8;i++)
 {
         for(int j=0;j<8;j++)
         {
                 chess_Table[i][j]=string_Board[i]+" "+IntToStr(int_Board[j]);
                 StringGrid1->Cells[j][i]=chess_Table[i][j];

         }
 }
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows 7Chrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez polymorphism » czwartek, 26 marca 2020, 11:13

W sumie najprostrzy i najwygodniejszy.

Polemizowałbym mocno.

a nie przypisaniu szeregow wartosci.

Jeśli wartości jest niewiele, to tablice z gotowymi wartościami są lepsze, bo zwiększają czytelność kodu (redukując go do niezbędnego minimum).

Jeszcze raz zadam to pytanie: po co ta tablica intów int_Board?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » czwartek, 26 marca 2020, 12:42

Rzeczywiscie tablica int-ow w tej sytuacji calkowicie zbedna. No to jeszcze mozna to zmniejszyc, wszystko "tablicujac" i przypisujac cyfry do string-ow.
KOD cpp:     UKRYJ  
 UnicodeString chess_Table[8][8],string_Board[8]={"A","B","C","D",
  "E","F","G","H"},int_Board[8]={"1","2","3","5","5","6","7","8"};
  for(int i=0;i<8;i++)
  {
          for(int j=0;j<8;j++)
          {
                  chess_Table[i][j]=string_Board[i]+int_Board[j];
                  StringGrid1->Cells[j][i]=chess_Table[i][j];

          }
  }
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows 7Chrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez polymorphism » czwartek, 26 marca 2020, 13:47

chess_Table też wygląda na zbędną ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » czwartek, 26 marca 2020, 20:15

Przy okazji prosta funkcja zwracajaca ciag String na podstawie zakresu ograniczonego dwoma wartosciami char/wchar_t. (przewaga nad wypisywaniem danych z deklarowanych tablic)
KOD cpp:     UKRYJ  
UnicodeString __fastcall TForm1::write_Text(wchar_t a, wchar_t b)
{
        UnicodeString result;
        result="";
        if(a<b)
         for(char i=a;i<b+1;i++)
          result+=UnicodeString(i);
        else
        for(char i=b;i<a+1;i++)
         result+=UnicodeString(i);
        return result;
}
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows 7Chrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez polymorphism » czwartek, 26 marca 2020, 20:51

Dlaczego w pętli masz char, skoro parametry są wchar_t?

Trzymaj się zasady DRY:
KOD cpp:     UKRYJ  
UnicodeString __fastcall TForm1::write_Text(wchar_t a, wchar_t b)
{
    UnicodeString result;

    if (a > b) std::swap(a, b);
    for (wchar_t i = a; i <= b; ++i) result += i;
    return result;
}


przewaga nad wypisywaniem danych z deklarowanych tablic

IMO ta funkcja może mieć praktyczne zastosowanie jedynie w przedziałach ASCII [a-z], [A-Z] i [0-9], ale czy do tego trzeba aż oddzielnej funkcji..?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez lukagrom » piątek, 27 marca 2020, 21:18

ale czy do tego trzeba aż oddzielnej funkcji..?

Zawsze tam jakaś funkcja ze skromnego "dorobku" w tych czasach końca na chwilę pozostanie. Akurat mój stary podręcznik miał zgięcie kartki na rozdziale z tablicami "Variantowymi", to takową do tego wątku postanowiłem dołączyć.
KOD cpp:     UKRYJ  
 String St[8]={"A","B","C","D","E","F","G","H"};
 String In[8]={"1","2","3","4","5","6","7","8"};
 typedef String sum_Array[8][8];
 int min,max;
 Variant SUM=VarArrayCreate(OPENARRAY(int,(1,8,1,8)),varString);
 sum_Array *chess_Board=(sum_Array *)VarArrayLock(SUM);
 try
 {
         min=VarArrayLowBound(SUM,VarArrayDimCount(SUM));
         max=VarArrayHighBound(SUM,VarArrayDimCount(SUM));
         for(int i=min;i<max;i++)
         {
                 for(int j=min;j<max;j++)
                 {
                         (*chess_Board)  [i ] [j]=St[ i] +In[j];
                         StringGrid1->Cells[ i ] [j ]=VarToStr((*chess_Board)[ j ][ i ]);
                 }
         }
 }
 catch(...)
 {
         VarArrayUnlock(SUM);
         throw;
 }
 VarArrayUnlock(SUM);
 

Chyba jest dobrze, bo to przerobiony programik książkowy z typu obliczania macierzy. Kompilacja bez warningów, przy czym jako, że testowane na dwóch kompilatorach, to na jednym wysypuje się z powodu błędów z .dll, na drugim dostaje zawiechy i pojawia się komunikat - Error creating variant array.
Prawdopodobnie nie chce pracować ze "Stringami" (z każdym innym typem jak varByte,varWord,varDate etc współpracuje bez zawiechy).
W podręczniku jest nawet adnotacja - varString - niekompatybilny z COM
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Rodzaj String/AnsiString w pętli

Nowy postprzez polymorphism » piątek, 27 marca 2020, 21:49

Dajże spokój, komplikujesz prostą rzecz.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron